Three examples to get you productive in minutes.
The minimal Courvux app — reactive state + event binding in a single object.
import { createApp } from 'courvux';
createApp({
template: `
<div>
<h1>{{ count }}</h1>
<button @click="count++">Increment</button>
<button @click="count = 0">Reset</button>
</div>
`,
data: { count: 0 }
}).mount('#app');
cv-model syncs input to state. cv-if/cv-else toggle DOM nodes.
createApp({
template: `
<div>
<input cv-model="name" placeholder="Your name" />
<p cv-if="name">Hello, {{ name }}!</p>
<p cv-else>Enter your name above.</p>
</div>
`,
data: { name: '' }
}).mount('#app');
cv-for with :key enables efficient DOM reuse —
only added/removed/reordered nodes are touched.
createApp({
template: `
<ul>
<li cv-for="item in items" :key="item.id">
{{ item.text }}
<button @click="remove(item.id)">×</button>
</li>
</ul>
<input cv-model="newItem" @keydown.enter="add()" placeholder="Add item..." />
`,
data: { items: [], newItem: '', _id: 0 },
methods: {
add() {
if (!this.newItem.trim()) return;
this.items = [...this.items, { id: ++this._id, text: this.newItem }];
this.newItem = '';
},
remove(id) {
this.items = this.items.filter(i => i.id !== id);
}
}
}).mount('#app');
Add a router for multi-page navigation and a store for global state:
import { createApp, createRouter, createStore } from 'courvux';
const store = createStore({
state: { user: 'guest' },
actions: {
login(name) { this.user = name; }
}
});
const router = createRouter([
{ path: '/', component: HomeComp },
{ path: '/about', component: AboutComp }
], { mode: 'hash' });
createApp({ store, router, template: '<router-view />' }).mount('#app');