# Getting Started with SigPro π
Welcome to SigPro! This guide will help you get up and running with the library in minutes. SigPro is a minimalist reactive library that embraces the web platform - no compilation, no virtual DOM, just pure JavaScript and intelligent reactivity.
## π¦ Installation
Choose your preferred installation method:
```bash
# Using npm
npm install sigpro
# Using bun
bun add sigpro
# Or simply copy sigpro.js to your project
# (yes, it's that simple!)
```
## π― Core Imports
```javascript
import { $, html } from 'sigpro';
```
That's it! Just two imports to unlock the entire reactive system:
- **`$`** - Creates reactive signals (the heart of reactivity)
- **`html`** - Template literal tag for reactive DOM rendering
## π§ Understanding the Basics
### Signals - The Reactive Heart
Signals are reactive values that automatically track dependencies and update when changed:
```javascript
// Create a signal with initial value
const count = $(0);
// Read value (with auto dependency tracking)
console.log(count()); // 0
// Set new value
count(5);
// Update using previous value
count(prev => prev + 1); // 6
// Create computed signals (auto-updating)
const firstName = $('John');
const lastName = $('Doe');
const fullName = $(() => `${firstName()} ${lastName()}`);
console.log(fullName()); // "John Doe"
firstName('Jane'); // fullName() now returns "Jane Doe"
```
### Effects - Automatic Reactions
Effects automatically run and re-run when their signal dependencies change:
```javascript
const count = $(0);
$.effect(() => {
console.log(`Count is: ${count()}`);
});
// Logs: "Count is: 0"
count(1);
// Logs: "Count is: 1"
// Effects can return cleanup functions
$.effect(() => {
const id = count();
const timer = setInterval(() => {
console.log(`Polling with count: ${id}`);
}, 1000);
// Cleanup runs before next effect execution
return () => clearInterval(timer);
});
```
### Rendering with `html`
The `html` tag creates reactive DOM fragments:
```javascript
const count = $(0);
const isActive = $(true);
const fragment = html`
Count: ${count}
`;
document.body.appendChild(fragment);
```
## π¨ Your First Reactive App
Let's build a simple todo app to see SigPro in action:
```javascript
import { $, html } from 'sigpro';
// Create a simple todo app
function TodoApp() {
// Reactive state
const todos = $(['Learn SigPro', 'Build something awesome']);
const newTodo = $('');
// Computed value
const todoCount = $(() => todos().length);
// Add todo function
const addTodo = () => {
if (newTodo().trim()) {
todos([...todos(), newTodo()]);
newTodo('');
}
};
// Remove todo function
const removeTodo = (index) => {
todos(todos().filter((_, i) => i !== index));
};
// Return reactive template
return html`
π Todo App
Total todos: ${todoCount}
${() => todos().map((todo, index) => html`
${todo}
`)}
`;
}
// Mount the app
document.body.appendChild(TodoApp());
```
## π― Key Concepts
### 1. **Signal Patterns**
| Pattern | Example | Use Case |
|---------|---------|----------|
| Basic signal | `const count = $(0)` | Simple values |
| Computed | `$( () => first() + last() )` | Derived values |
| Signal update | `count(5)` | Direct set |
| Functional update | `count(prev => prev + 1)` | Based on previous |
### 2. **Effect Patterns**
```javascript
// Basic effect
$.effect(() => console.log(count()));
// Effect with cleanup
$.effect(() => {
const timer = setInterval(() => {}, 1000);
return () => clearInterval(timer);
});
// Stopping an effect
const stop = $.effect(() => {});
stop(); // Effect won't run again
```
### 3. **HTML Directives**
| Directive | Example | Description |
|-----------|---------|-------------|
| `@event` | `@click=${handler}` | Event listeners |
| `:property` | `:value=${signal}` | Two-way binding |
| `?attribute` | `?disabled=${signal}` | Boolean attributes |
| `.property` | `.scrollTop=${value}` | DOM properties |
## π‘ Pro Tips for Beginners
### 1. **Start Simple**
```javascript
// Begin with basic signals
const name = $('World');
html`
Hello, ${name}!
`;
```
### 2. **Use Computed Signals for Derived State**
```javascript
// β Don't compute in template
html`
Total: ${items().length * price()}
`;
// β Compute with signals
const total = $(() => items().length * price());
html`
Total: ${total}
`;
```
### 3. **Leverage Effects for Side Effects**
```javascript
// Auto-save to localStorage
$.effect(() => {
localStorage.setItem('draft', JSON.stringify(draft()));
});
```
## π§ VS Code Setup
For the best development experience, install these VS Code extensions:
- **lit-html** - Adds syntax highlighting for `html` tagged templates
- **Prettier** - Automatically formats your template literals
```javascript
// With lit-html extension, you get full syntax highlighting!
html`
Beautiful highlighted template
`
```
## π Project Structure
Here's a recommended structure for larger apps:
```
my-sigpro-app/
βββ index.html
βββ main.js
βββ components/
β βββ Button.js
β βββ TodoList.js
β βββ TodoItem.js
βββ pages/
β βββ HomePage.js
β βββ AboutPage.js
βββ utils/
βββ helpers.js
```
Example `main.js`:
```javascript
import { $, html } from 'sigpro';
import HomePage from './pages/HomePage.js';
// Mount your app
document.body.appendChild(HomePage());
```
## π Summary
You've learned:
- β How to install SigPro
- β Core concepts: signals, effects, and reactive rendering
- β Built a complete todo app
- β Key patterns and best practices
- β How to structure larger applications
**Remember:** SigPro embraces the web platform. You're writing vanilla JavaScript with superpowersβno compilation, no lock-in, just clean, maintainable code that will work for years to come.
> "Stop fighting the platform. Start building with it."
Happy coding! π