# SigPro Playground 🚀
An interactive online environment to experiment with **SigPro** - a minimalist reactive library for building reactive user interfaces directly in the browser.

## 🌟 Features
- **Zero Setup** - No installation required, works directly in the browser
- **Live Preview** - See your code results in real-time
- **Built-in SigPro** - Full library included with `$`, `$$`, `html`, `$component`, and `$router`
- **Error Console** - Instant feedback on syntax and runtime errors
- **Code Sharing** - Generate shareable URLs with your code
- **Auto-execution** - Runs automatically as you type (with debounce)
- **Keyboard Shortcuts** - Ctrl+Enter to manually execute
- **Clean Interface** - Modern dark-themed editor inspired by VS Code
## 🎮 Quick Start
### Online Version
Simply open the `play.html` file in your web browser and start coding!
### Write Your First Code
```javascript
// Create reactive signals
const name = $('World');
const count = $(0);
// Create an effect that reacts to changes
$$(() => {
document.body.innerHTML = `
Hello ${name()}!
Count: ${count()}
`;
});
// Update signals and watch the magic happen
setTimeout(() => name('SigPro'), 2000);
```
## 📖 Usage Guide
### The Editor Panel
- **Write Code** - The left panel contains the code editor with syntax highlighting
- **Auto-execute** - Code runs automatically 1 second after you stop typing
- **Manual Run** - Click the "Run" button or press `Ctrl+Enter`
- **Format** - Click "Format" to beautify your code (coming soon)
- **Share** - Generate a shareable link with your current code
- **Reset** - Restore the default example
### The Preview Panel
- **Live Results** - See your code output in real-time
- **Error Display** - Any errors appear in the console at the bottom
- **Clean Slate** - Each execution starts with a fresh environment
### Keyboard Shortcuts
| Shortcut | Action |
|----------|--------|
| `Ctrl + Enter` | Execute code manually |
| `Ctrl + S` | Save current code (coming soon) |
## 🎯 Example Code Snippets
### Basic Counter
```javascript
const counter = $(0);
setInterval(() => {
counter(c => c + 1);
}, 1000);
$$(() => {
document.body.innerHTML = `
Counter: ${counter()}
`;
});
```
### Two-way Binding with html Tag
```javascript
const text = $('Edit me');
document.body.appendChild(html`
`;
});
```
### Custom Component
```javascript
$component('my-button', (props, { emit }) => {
return html`
`;
}, ['count']);
document.body.appendChild(html`
`);
```
## 🔗 Sharing Code
1. Write your code in the editor
2. Click the **Share** button
3. Copy the generated URL
4. Share it with anyone - they'll see exactly your code!
The code is encoded in the URL, so no backend storage is needed.
## 🛠️ Advanced Features
### Using the Router
```javascript
const routes = [
{ path: '/', component: () => html`
`;
});
```
## 📦 SigPro API Reference
| Function | Description |
|----------|-------------|
| `$(value)` | Creates a reactive signal |
| `$$(effect)` | Creates a reactive effect |
| `html\`...\`` | Tagged template for reactive HTML |
| `$component(name, setup, attrs)` | Creates a web component |
| `$router(routes)` | Creates a hash-based router |
## 🤔 Troubleshooting
**Error: "Cannot read property..."**
- Make sure you're accessing signal values with `signal()`, not `signal`
**Nothing shows in preview**
- Check the error console for syntax errors
- Make sure you're appending to `document.body` or using `html` correctly
**Changes not updating**
- Verify you're using `$$()` to create effects
- Signals must be called as functions: `count()` not `count`
## 🌐 Browser Support
Works in all modern browsers (Chrome, Firefox, Safari, Edge) that support:
- JavaScript ES6+
- Custom Elements (for `$component`)
- iframe sandboxing
## 📝 License
MIT License - feel free to use, modify, and distribute!
## 🤝 Contributing
Found a bug or want to improve the playground? Feel free to:
- Report issues
- Suggest new features
- Submit improvements
---
**Happy Coding with SigPro!** ⚡