import{_ as i,o as a,c as n,ae as t}from"./chunks/framework.C8AWLET_.js";const E=JSON.parse('{"title":"Getting Started with SigPro πŸš€","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md","filePath":"guide/getting-started.md"}'),l={name:"guide/getting-started.md"};function h(p,s,e,k,r,d){return a(),n("div",null,[...s[0]||(s[0]=[t(`

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:

🧠 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\`
  <div class="counter">
    <h2>Count: \${count}</h2>
    
    <!-- Event binding -->
    <button @click=\${() => count(c => c + 1)}>
      Increment
    </button>
    
    <!-- Boolean attributes -->
    <button ?disabled=\${() => !isActive()}>
      Submit
    </button>
  </div>
\`;

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\`
    <div style="max-width: 400px; margin: 2rem auto; font-family: system-ui;">
      <h1>πŸ“ Todo App</h1>
      
      <!-- Input form -->
      <div style="display: flex; gap: 8px; margin-bottom: 16px;">
        <input 
          type="text" 
          :value=\${newTodo}
          placeholder="Add a new todo..."
          style="flex: 1; padding: 8px; border: 1px solid #ddd; border-radius: 4px;"
          @keydown.enter=\${addTodo}
        />
        <button 
          @click=\${addTodo}
          style="padding: 8px 16px; background: #4CAF50; color: white; border: none; border-radius: 4px; cursor: pointer;"
        >
          Add
        </button>
      </div>
      
      <!-- Todo count -->
      <p>Total todos: \${todoCount}</p>
      
      <!-- Todo list -->
      <ul style="list-style: none; padding: 0;">
        \${() => todos().map((todo, index) => html\`
          <li style="display: flex; justify-content: space-between; align-items: center; padding: 8px; margin: 4px 0; background: #f5f5f5; border-radius: 4px;">
            <span>\${todo}</span>
            <button 
              @click=\${() => removeTodo(index)}
              style="padding: 4px 8px; background: #ff4444; color: white; border: none; border-radius: 4px; cursor: pointer;"
            >
              βœ•
            </button>
          </li>
        \`)}
      </ul>
    </div>
  \`;
}

// Mount the app
document.body.appendChild(TodoApp());

🎯 Key Concepts ​

1. Signal Patterns ​

PatternExampleUse Case
Basic signalconst count = $(0)Simple values
Computed$( () => first() + last() )Derived values
Signal updatecount(5)Direct set
Functional updatecount(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 ​

DirectiveExampleDescription
@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\`<h1>Hello, \${name}!</h1>\`;

2. Use Computed Signals for Derived State ​

javascript
// ❌ Don't compute in template
html\`<p>Total: \${items().length * price()}</p>\`;

// βœ… Compute with signals
const total = $(() => items().length * price());
html\`<p>Total: \${total}</p>\`;

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:

javascript
// With lit-html extension, you get full syntax highlighting!
html\`
  <div style="color: #ff4444; background: linear-gradient(45deg, blue, green)">
    <h1>Beautiful highlighted template</h1>
  </div>
\`

πŸ“ 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:

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! πŸŽ‰

`,51)])])}const o=i(l,[["render",h]]);export{E as __pageData,o as default};