lego-dom 1.3.4 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/main.js +24 -3
- package/package.json +1 -1
- package/vite-plugin.js +0 -14
- package/.github/workflows/deploy-docs.yml +0 -56
- package/.legodom +0 -87
- package/docs/.vitepress/config.js +0 -161
- package/docs/api/config.md +0 -95
- package/docs/api/define.md +0 -58
- package/docs/api/directives.md +0 -50
- package/docs/api/globals.md +0 -29
- package/docs/api/index.md +0 -30
- package/docs/api/lifecycle.md +0 -40
- package/docs/api/route.md +0 -37
- package/docs/api/vite-plugin.md +0 -58
- package/docs/contributing/01-welcome.md +0 -38
- package/docs/contributing/02-registry.md +0 -133
- package/docs/contributing/03-batcher.md +0 -110
- package/docs/contributing/04-reactivity.md +0 -87
- package/docs/contributing/05-caching.md +0 -59
- package/docs/contributing/06-init.md +0 -136
- package/docs/contributing/07-observer.md +0 -72
- package/docs/contributing/08-snap.md +0 -140
- package/docs/contributing/09-diffing.md +0 -69
- package/docs/contributing/10-studs.md +0 -78
- package/docs/contributing/11-scanner.md +0 -117
- package/docs/contributing/12-render.md +0 -138
- package/docs/contributing/13-directives.md +0 -243
- package/docs/contributing/14-events.md +0 -57
- package/docs/contributing/15-router.md +0 -57
- package/docs/contributing/16-state.md +0 -47
- package/docs/contributing/17-legodom.md +0 -48
- package/docs/contributing/index.md +0 -24
- package/docs/examples/form.md +0 -42
- package/docs/examples/index.md +0 -104
- package/docs/examples/routing.md +0 -409
- package/docs/examples/sfc-showcase.md +0 -34
- package/docs/examples/todo-app.md +0 -383
- package/docs/guide/cdn-usage.md +0 -354
- package/docs/guide/components.md +0 -418
- package/docs/guide/directives.md +0 -539
- package/docs/guide/directory-structure.md +0 -248
- package/docs/guide/faq.md +0 -210
- package/docs/guide/getting-started.md +0 -262
- package/docs/guide/index.md +0 -88
- package/docs/guide/lifecycle.md +0 -525
- package/docs/guide/quick-start.md +0 -49
- package/docs/guide/reactivity.md +0 -415
- package/docs/guide/routing.md +0 -334
- package/docs/guide/server-side.md +0 -134
- package/docs/guide/sfc.md +0 -464
- package/docs/guide/templating.md +0 -388
- package/docs/index.md +0 -160
- package/docs/public/logo.svg +0 -17
- package/docs/router/basic-routing.md +0 -103
- package/docs/router/cold-entry.md +0 -91
- package/docs/router/history.md +0 -69
- package/docs/router/index.md +0 -73
- package/docs/router/resolver.md +0 -74
- package/docs/router/surgical-swaps.md +0 -134
- package/docs/tutorial/01-project-setup.md +0 -152
- package/docs/tutorial/02-your-first-component.md +0 -226
- package/docs/tutorial/03-adding-routes.md +0 -279
- package/docs/tutorial/04-multi-page-app.md +0 -329
- package/docs/tutorial/05-state-and-globals.md +0 -285
- package/docs/tutorial/index.md +0 -40
- package/examples/vite-app/README.md +0 -71
- package/examples/vite-app/index.html +0 -42
- package/examples/vite-app/package.json +0 -18
- package/examples/vite-app/src/app.css +0 -3
- package/examples/vite-app/src/app.js +0 -29
- package/examples/vite-app/src/components/app-navbar.lego +0 -34
- package/examples/vite-app/src/components/customers/customer-details.lego +0 -24
- package/examples/vite-app/src/components/customers/customer-orders.lego +0 -21
- package/examples/vite-app/src/components/customers/order-list.lego +0 -55
- package/examples/vite-app/src/components/greeting-card.lego +0 -41
- package/examples/vite-app/src/components/sample-component.lego +0 -75
- package/examples/vite-app/src/components/shells/customers-shell.lego +0 -21
- package/examples/vite-app/src/components/side-menu.lego +0 -46
- package/examples/vite-app/src/components/todo-list.lego +0 -239
- package/examples/vite-app/src/components/widgets/user-card.lego +0 -27
- package/examples/vite-app/vite.config.js +0 -22
- package/tests/error.test.js +0 -74
- package/tests/main.test.js +0 -103
- package/tests/memory.test.js +0 -68
- package/tests/monitoring.test.js +0 -74
- package/tests/naming.test.js +0 -74
- package/tests/parse-lego.test.js +0 -65
- package/tests/security.test.js +0 -67
- package/tests/server.test.js +0 -114
- package/tests/syntax.test.js +0 -67
package/docs/examples/index.md
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
# Examples
|
|
2
|
-
|
|
3
|
-
Explore these hands-on examples to learn Lego patterns and best practices.
|
|
4
|
-
|
|
5
|
-
## Quick Examples
|
|
6
|
-
|
|
7
|
-
### Counter
|
|
8
|
-
|
|
9
|
-
A simple reactive counter demonstrating basic state and events.
|
|
10
|
-
|
|
11
|
-
```html
|
|
12
|
-
<template b-id="click-counter">
|
|
13
|
-
<style>
|
|
14
|
-
button { font-size: 1.2rem; padding: 0.5rem 1rem; }
|
|
15
|
-
</style>
|
|
16
|
-
<p>Count: [[ count ]]</p>
|
|
17
|
-
<button @click="count++">Increment</button>
|
|
18
|
-
</template>
|
|
19
|
-
|
|
20
|
-
<click-counter b-data="{ count: 0 }"></click-counter>
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
### Input Binding
|
|
24
|
-
|
|
25
|
-
Two-way data binding with `b-sync`.
|
|
26
|
-
|
|
27
|
-
```html
|
|
28
|
-
<template b-id="name-input">
|
|
29
|
-
<input b-sync="name" placeholder="Enter your name">
|
|
30
|
-
<p b-show="name">Hello, [[ name ]]!</p>
|
|
31
|
-
</template>
|
|
32
|
-
|
|
33
|
-
<name-input b-data="{ name: '' }"></name-input>
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
### Todo List
|
|
37
|
-
|
|
38
|
-
Lists with `b-for`.
|
|
39
|
-
|
|
40
|
-
```html
|
|
41
|
-
<template b-id="todo-list">
|
|
42
|
-
<ul>
|
|
43
|
-
<li b-for="todo in todos">
|
|
44
|
-
<input type="checkbox" b-sync="todo.done">
|
|
45
|
-
<span class="[[ todo.done ? 'done' : '' ]]">[[ todo.text ]]</span>
|
|
46
|
-
</li>
|
|
47
|
-
</ul>
|
|
48
|
-
</template>
|
|
49
|
-
|
|
50
|
-
<todo-list b-data="{
|
|
51
|
-
todos: [
|
|
52
|
-
{ text: 'Learn Lego', done: true },
|
|
53
|
-
{ text: 'Build an app', done: false }
|
|
54
|
-
]
|
|
55
|
-
}"></todo-list>
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
## Full Applications
|
|
59
|
-
|
|
60
|
-
### [Todo App](/examples/todo-app)
|
|
61
|
-
|
|
62
|
-
A complete todo application with:
|
|
63
|
-
- Add/remove todos
|
|
64
|
-
- Mark as complete
|
|
65
|
-
- Filter by status
|
|
66
|
-
- Local storage persistence
|
|
67
|
-
|
|
68
|
-
### [Routing Demo](/examples/routing)
|
|
69
|
-
|
|
70
|
-
Single-page application with:
|
|
71
|
-
- Multiple pages
|
|
72
|
-
- Dynamic routes
|
|
73
|
-
- Navigation
|
|
74
|
-
- Route parameters
|
|
75
|
-
|
|
76
|
-
### [SFC Showcase](/examples/sfc-showcase)
|
|
77
|
-
|
|
78
|
-
Using Single File Components:
|
|
79
|
-
- User cards
|
|
80
|
-
- Product grid
|
|
81
|
-
- Modal dialogs
|
|
82
|
-
- Form validation
|
|
83
|
-
|
|
84
|
-
### [Form Validation](/examples/form)
|
|
85
|
-
|
|
86
|
-
Advanced form handling:
|
|
87
|
-
- Input validation
|
|
88
|
-
- Error messages
|
|
89
|
-
- Submit handling
|
|
90
|
-
- Reset functionality
|
|
91
|
-
|
|
92
|
-
## CodePen Examples
|
|
93
|
-
|
|
94
|
-
Try these examples directly in your browser:
|
|
95
|
-
|
|
96
|
-
- [Simple Counter](https://codepen.io/ortserga/pen/XJKdMJm)
|
|
97
|
-
- [Todo App](https://codepen.io/ortserga/pen/todo)
|
|
98
|
-
- [Dynamic Form](https://codepen.io/ortserga/pen/form)
|
|
99
|
-
|
|
100
|
-
## Next Steps
|
|
101
|
-
|
|
102
|
-
- Check the [API Reference](/api/)
|
|
103
|
-
- Read the [Guide](/guide/)
|
|
104
|
-
- View the [source code](https://github.com/rayattack/Lego)
|
package/docs/examples/routing.md
DELETED
|
@@ -1,409 +0,0 @@
|
|
|
1
|
-
# Routing Example
|
|
2
|
-
|
|
3
|
-
A multi-page application demonstrating client-side routing.
|
|
4
|
-
|
|
5
|
-
## Full Source Code
|
|
6
|
-
|
|
7
|
-
```html
|
|
8
|
-
<!DOCTYPE html>
|
|
9
|
-
<html lang="en">
|
|
10
|
-
<head>
|
|
11
|
-
<meta charset="UTF-8">
|
|
12
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
13
|
-
<title>Routing Demo - Lego</title>
|
|
14
|
-
<style>
|
|
15
|
-
body {
|
|
16
|
-
font-family: system-ui, sans-serif;
|
|
17
|
-
margin: 0;
|
|
18
|
-
padding: 0;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
nav {
|
|
22
|
-
background: #333;
|
|
23
|
-
padding: 1rem;
|
|
24
|
-
display: flex;
|
|
25
|
-
gap: 1rem;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
nav a {
|
|
29
|
-
color: white;
|
|
30
|
-
text-decoration: none;
|
|
31
|
-
padding: 0.5rem 1rem;
|
|
32
|
-
border-radius: 4px;
|
|
33
|
-
transition: background 0.2s;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
nav a:hover {
|
|
37
|
-
background: #555;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
nav a.active {
|
|
41
|
-
background: #4CAF50;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
main {
|
|
45
|
-
padding: 2rem;
|
|
46
|
-
max-width: 800px;
|
|
47
|
-
margin: 0 auto;
|
|
48
|
-
}
|
|
49
|
-
</style>
|
|
50
|
-
</head>
|
|
51
|
-
<body>
|
|
52
|
-
<nav>
|
|
53
|
-
<a href="/" b-link>Home</a>
|
|
54
|
-
<a href="/about" b-link>About</a>
|
|
55
|
-
<a href="/users" b-link>Users</a>
|
|
56
|
-
<a href="/contact" b-link>Contact</a>
|
|
57
|
-
</nav>
|
|
58
|
-
|
|
59
|
-
<main>
|
|
60
|
-
<lego-router></lego-router>
|
|
61
|
-
</main>
|
|
62
|
-
|
|
63
|
-
<script src="https://unpkg.com/lego-dom/main.js"></script>
|
|
64
|
-
|
|
65
|
-
<!-- Home Page -->
|
|
66
|
-
<template b-id="home-page">
|
|
67
|
-
<style>
|
|
68
|
-
self { display: block; }
|
|
69
|
-
.hero {
|
|
70
|
-
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
71
|
-
color: white;
|
|
72
|
-
padding: 3rem;
|
|
73
|
-
border-radius: 8px;
|
|
74
|
-
text-align: center;
|
|
75
|
-
}
|
|
76
|
-
.features {
|
|
77
|
-
display: grid;
|
|
78
|
-
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
|
79
|
-
gap: 1rem;
|
|
80
|
-
margin-top: 2rem;
|
|
81
|
-
}
|
|
82
|
-
.feature {
|
|
83
|
-
padding: 1.5rem;
|
|
84
|
-
background: #f5f5f5;
|
|
85
|
-
border-radius: 8px;
|
|
86
|
-
}
|
|
87
|
-
</style>
|
|
88
|
-
|
|
89
|
-
<div class="hero">
|
|
90
|
-
<h1>Welcome to Lego Routing Demo</h1>
|
|
91
|
-
<p>Navigate between pages using client-side routing</p>
|
|
92
|
-
</div>
|
|
93
|
-
|
|
94
|
-
<div class="features">
|
|
95
|
-
<div class="feature">
|
|
96
|
-
<h3>🚀 Fast</h3>
|
|
97
|
-
<p>No page reloads, instant navigation</p>
|
|
98
|
-
</div>
|
|
99
|
-
<div class="feature">
|
|
100
|
-
<h3>📦 Simple</h3>
|
|
101
|
-
<p>Built-in router, no dependencies</p>
|
|
102
|
-
</div>
|
|
103
|
-
<div class="feature">
|
|
104
|
-
<h3>🎨 Clean URLs</h3>
|
|
105
|
-
<p>No hash-based routing, real paths</p>
|
|
106
|
-
</div>
|
|
107
|
-
</div>
|
|
108
|
-
</template>
|
|
109
|
-
|
|
110
|
-
<!-- About Page -->
|
|
111
|
-
<template b-id="about-page">
|
|
112
|
-
<style>
|
|
113
|
-
self { display: block; }
|
|
114
|
-
</style>
|
|
115
|
-
|
|
116
|
-
<h1>About Lego</h1>
|
|
117
|
-
<p>Lego is a tiny, zero-dependency JavaScript library for building reactive Web Components.</p>
|
|
118
|
-
|
|
119
|
-
<h2>Features</h2>
|
|
120
|
-
<ul>
|
|
121
|
-
<li>Zero dependencies</li>
|
|
122
|
-
<li>Under 500 lines of code</li>
|
|
123
|
-
<li>True reactivity with Proxies</li>
|
|
124
|
-
<li>Shadow DOM encapsulation</li>
|
|
125
|
-
<li>Built-in routing</li>
|
|
126
|
-
</ul>
|
|
127
|
-
|
|
128
|
-
<p><a href="/users/1" b-link>View User #1</a></p>
|
|
129
|
-
</template>
|
|
130
|
-
|
|
131
|
-
<!-- Users List Page -->
|
|
132
|
-
<template b-id="users-page">
|
|
133
|
-
<style>
|
|
134
|
-
self { display: block; }
|
|
135
|
-
.user-card {
|
|
136
|
-
padding: 1rem;
|
|
137
|
-
margin: 0.5rem 0;
|
|
138
|
-
background: #f9f9f9;
|
|
139
|
-
border-radius: 4px;
|
|
140
|
-
display: flex;
|
|
141
|
-
justify-content: space-between;
|
|
142
|
-
align-items: center;
|
|
143
|
-
}
|
|
144
|
-
.user-card a {
|
|
145
|
-
color: #4CAF50;
|
|
146
|
-
text-decoration: none;
|
|
147
|
-
font-weight: 600;
|
|
148
|
-
}
|
|
149
|
-
</style>
|
|
150
|
-
|
|
151
|
-
<h1>Users</h1>
|
|
152
|
-
|
|
153
|
-
<div class="user-card" b-for="user in users">
|
|
154
|
-
<div>
|
|
155
|
-
<strong>[[ user.name ]]</strong>
|
|
156
|
-
<p style="margin:0;color:#666;">[[ user.email ]]</p>
|
|
157
|
-
</div>
|
|
158
|
-
<a href="/users/[[ user.id ]]" b-link>View Profile →</a>
|
|
159
|
-
</div>
|
|
160
|
-
</template>
|
|
161
|
-
|
|
162
|
-
<!-- User Profile Page (Dynamic Route) -->
|
|
163
|
-
<template b-id="user-profile">
|
|
164
|
-
<style>
|
|
165
|
-
self { display: block; }
|
|
166
|
-
.profile {
|
|
167
|
-
background: white;
|
|
168
|
-
padding: 2rem;
|
|
169
|
-
border-radius: 8px;
|
|
170
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
171
|
-
}
|
|
172
|
-
.loading {
|
|
173
|
-
text-align: center;
|
|
174
|
-
padding: 2rem;
|
|
175
|
-
color: #666;
|
|
176
|
-
}
|
|
177
|
-
</style>
|
|
178
|
-
|
|
179
|
-
<div b-show="loading" class="loading">
|
|
180
|
-
Loading user...
|
|
181
|
-
</div>
|
|
182
|
-
|
|
183
|
-
<div b-show="!loading && user" class="profile">
|
|
184
|
-
<h1>[[ user.name ]]</h1>
|
|
185
|
-
<p><strong>Email:</strong> [[ user.email ]]</p>
|
|
186
|
-
<p><strong>Phone:</strong> [[ user.phone ]]</p>
|
|
187
|
-
<p><strong>Website:</strong> [[ user.website ]]</p>
|
|
188
|
-
|
|
189
|
-
<hr>
|
|
190
|
-
|
|
191
|
-
<h3>Address</h3>
|
|
192
|
-
<p>
|
|
193
|
-
[[ user.address.street ]]<br>
|
|
194
|
-
[[ user.address.city ]], [[ user.address.zipcode ]]
|
|
195
|
-
</p>
|
|
196
|
-
|
|
197
|
-
<p><a href="/users" b-link>← Back to users</a></p>
|
|
198
|
-
</div>
|
|
199
|
-
</template>
|
|
200
|
-
|
|
201
|
-
<!-- Contact Page -->
|
|
202
|
-
<template b-id="contact-page">
|
|
203
|
-
<style>
|
|
204
|
-
self { display: block; }
|
|
205
|
-
form {
|
|
206
|
-
background: white;
|
|
207
|
-
padding: 2rem;
|
|
208
|
-
border-radius: 8px;
|
|
209
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
|
210
|
-
}
|
|
211
|
-
.form-group {
|
|
212
|
-
margin-bottom: 1rem;
|
|
213
|
-
}
|
|
214
|
-
label {
|
|
215
|
-
display: block;
|
|
216
|
-
margin-bottom: 0.5rem;
|
|
217
|
-
font-weight: 600;
|
|
218
|
-
}
|
|
219
|
-
input, textarea {
|
|
220
|
-
width: 100%;
|
|
221
|
-
padding: 0.75rem;
|
|
222
|
-
border: 1px solid #ddd;
|
|
223
|
-
border-radius: 4px;
|
|
224
|
-
font-size: 1rem;
|
|
225
|
-
}
|
|
226
|
-
button {
|
|
227
|
-
background: #4CAF50;
|
|
228
|
-
color: white;
|
|
229
|
-
padding: 0.75rem 1.5rem;
|
|
230
|
-
border: none;
|
|
231
|
-
border-radius: 4px;
|
|
232
|
-
cursor: pointer;
|
|
233
|
-
font-size: 1rem;
|
|
234
|
-
}
|
|
235
|
-
.success {
|
|
236
|
-
background: #d4edda;
|
|
237
|
-
color: #155724;
|
|
238
|
-
padding: 1rem;
|
|
239
|
-
border-radius: 4px;
|
|
240
|
-
margin-top: 1rem;
|
|
241
|
-
}
|
|
242
|
-
</style>
|
|
243
|
-
|
|
244
|
-
<h1>Contact Us</h1>
|
|
245
|
-
|
|
246
|
-
<form b-show="!submitted" @submit="handleSubmit(event)">
|
|
247
|
-
<div class="form-group">
|
|
248
|
-
<label>Name</label>
|
|
249
|
-
<input b-sync="form.name" required>
|
|
250
|
-
</div>
|
|
251
|
-
|
|
252
|
-
<div class="form-group">
|
|
253
|
-
<label>Email</label>
|
|
254
|
-
<input type="email" b-sync="form.email" required>
|
|
255
|
-
</div>
|
|
256
|
-
|
|
257
|
-
<div class="form-group">
|
|
258
|
-
<label>Message</label>
|
|
259
|
-
<textarea b-sync="form.message" rows="5" required></textarea>
|
|
260
|
-
</div>
|
|
261
|
-
|
|
262
|
-
<button type="submit">Send Message</button>
|
|
263
|
-
</form>
|
|
264
|
-
|
|
265
|
-
<div b-show="submitted" class="success">
|
|
266
|
-
<h3>✅ Message Sent!</h3>
|
|
267
|
-
<p>Thank you for contacting us, [[ form.name ]]. We'll respond to [[ form.email ]] soon.</p>
|
|
268
|
-
<button @click="submitted = false">Send Another</button>
|
|
269
|
-
</div>
|
|
270
|
-
</template>
|
|
271
|
-
|
|
272
|
-
<script>
|
|
273
|
-
// Define routes
|
|
274
|
-
Lego.route('/', 'home-page');
|
|
275
|
-
Lego.route('/about', 'about-page');
|
|
276
|
-
Lego.route('/users', 'users-page');
|
|
277
|
-
Lego.route('/users/:id', 'user-profile');
|
|
278
|
-
Lego.route('/contact', 'contact-page');
|
|
279
|
-
|
|
280
|
-
// Users page component
|
|
281
|
-
Lego.define('users-page',
|
|
282
|
-
document.querySelector('template[b-id="users-page"]').innerHTML, {
|
|
283
|
-
users: [],
|
|
284
|
-
|
|
285
|
-
async mounted() {
|
|
286
|
-
const response = await fetch('https://jsonplaceholder.typicode.com/users');
|
|
287
|
-
this.users = await response.json();
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
);
|
|
291
|
-
|
|
292
|
-
// User profile component (dynamic route)
|
|
293
|
-
Lego.define('user-profile',
|
|
294
|
-
document.querySelector('template[b-id="user-profile"]').innerHTML, {
|
|
295
|
-
loading: true,
|
|
296
|
-
user: null,
|
|
297
|
-
|
|
298
|
-
async mounted() {
|
|
299
|
-
const userId = Lego.globals.params.id;
|
|
300
|
-
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`);
|
|
301
|
-
this.user = await response.json();
|
|
302
|
-
this.loading = false;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
);
|
|
306
|
-
|
|
307
|
-
// Contact page component
|
|
308
|
-
Lego.define('contact-page',
|
|
309
|
-
document.querySelector('template[b-id="contact-page"]').innerHTML, {
|
|
310
|
-
form: {
|
|
311
|
-
name: '',
|
|
312
|
-
email: '',
|
|
313
|
-
message: ''
|
|
314
|
-
},
|
|
315
|
-
submitted: false,
|
|
316
|
-
|
|
317
|
-
handleSubmit(event) {
|
|
318
|
-
event.preventDefault();
|
|
319
|
-
this.submitted = true;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
);
|
|
323
|
-
|
|
324
|
-
// Update active nav link on route change
|
|
325
|
-
window.addEventListener('popstate', updateActiveLink);
|
|
326
|
-
updateActiveLink();
|
|
327
|
-
|
|
328
|
-
function updateActiveLink() {
|
|
329
|
-
document.querySelectorAll('nav a[b-link]').forEach(link => {
|
|
330
|
-
const isActive = link.getAttribute('href') === window.location.pathname;
|
|
331
|
-
link.classList.toggle('active', isActive);
|
|
332
|
-
});
|
|
333
|
-
}
|
|
334
|
-
</script>
|
|
335
|
-
</body>
|
|
336
|
-
</html>
|
|
337
|
-
```
|
|
338
|
-
|
|
339
|
-
## Features Demonstrated
|
|
340
|
-
|
|
341
|
-
### ✅ Multiple Routes
|
|
342
|
-
- `/` - Home page
|
|
343
|
-
- `/about` - About page
|
|
344
|
-
- `/users` - Users list
|
|
345
|
-
- `/users/:id` - Dynamic user profile
|
|
346
|
-
- `/contact` - Contact form
|
|
347
|
-
|
|
348
|
-
### ✅ Dynamic Routes
|
|
349
|
-
Access parameters via `Lego.globals.params`:
|
|
350
|
-
|
|
351
|
-
```js
|
|
352
|
-
const userId = Lego.globals.params.id;
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
### ✅ Data Fetching
|
|
356
|
-
Fetch data in `mounted()` hook:
|
|
357
|
-
|
|
358
|
-
```js
|
|
359
|
-
async mounted() {
|
|
360
|
-
const response = await fetch('https://api.example.com/users');
|
|
361
|
-
this.users = await response.json();
|
|
362
|
-
}
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
### ✅ Active Link Styling
|
|
366
|
-
Highlight current page in navigation.
|
|
367
|
-
|
|
368
|
-
### ✅ Loading States
|
|
369
|
-
Show spinner while fetching data.
|
|
370
|
-
|
|
371
|
-
## Key Concepts
|
|
372
|
-
|
|
373
|
-
### Route Definition
|
|
374
|
-
|
|
375
|
-
```js
|
|
376
|
-
Lego.route('/', 'home-page');
|
|
377
|
-
Lego.route('/users/:id', 'user-profile');
|
|
378
|
-
```
|
|
379
|
-
|
|
380
|
-
### Accessing Route Params
|
|
381
|
-
|
|
382
|
-
```js
|
|
383
|
-
{
|
|
384
|
-
mounted() {
|
|
385
|
-
const userId = Lego.globals.params.id;
|
|
386
|
-
this.fetchUser(userId);
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
```
|
|
390
|
-
|
|
391
|
-
### Navigation
|
|
392
|
-
|
|
393
|
-
```html
|
|
394
|
-
<a href="/about" b-link>About</a>
|
|
395
|
-
```
|
|
396
|
-
|
|
397
|
-
## Try It Yourself
|
|
398
|
-
|
|
399
|
-
1. Copy the code above
|
|
400
|
-
2. Save as `routing-demo.html`
|
|
401
|
-
3. Open in a browser
|
|
402
|
-
4. Click links—no page reload!
|
|
403
|
-
5. Use browser back/forward buttons
|
|
404
|
-
|
|
405
|
-
## Next Steps
|
|
406
|
-
|
|
407
|
-
- See [Todo App Example](/examples/todo-app)
|
|
408
|
-
- Learn about [Routing Guide](/guide/routing)
|
|
409
|
-
- Try [Form Validation Example](/examples/form)
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# SFC Showcase
|
|
2
|
-
|
|
3
|
-
Using `.lego` files with Vite.
|
|
4
|
-
|
|
5
|
-
## File Structure
|
|
6
|
-
|
|
7
|
-
**Counter.lego**
|
|
8
|
-
```html
|
|
9
|
-
<template>
|
|
10
|
-
<button @click="count++">Count: [[ count ]]</button>
|
|
11
|
-
</template>
|
|
12
|
-
|
|
13
|
-
<style>
|
|
14
|
-
button { color: red; }
|
|
15
|
-
</style>
|
|
16
|
-
|
|
17
|
-
<script>
|
|
18
|
-
export default {
|
|
19
|
-
count: 0
|
|
20
|
-
}
|
|
21
|
-
</script>
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Usage
|
|
25
|
-
|
|
26
|
-
**main.js**
|
|
27
|
-
```js
|
|
28
|
-
import './Counter.lego';
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**index.html**
|
|
32
|
-
```html
|
|
33
|
-
<counter-component></counter-component>
|
|
34
|
-
```
|