lego-dom 0.0.5 → 0.0.8

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.
Files changed (143) hide show
  1. package/.github/workflows/deploy-docs.yml +56 -0
  2. package/LICENSE +21 -0
  3. package/README.md +298 -355
  4. package/docs/.vitepress/config.js +107 -0
  5. package/docs/.vitepress/dist/404.html +22 -0
  6. package/docs/.vitepress/dist/api/define.html +35 -0
  7. package/docs/.vitepress/dist/api/directives.html +32 -0
  8. package/docs/.vitepress/dist/api/globals.html +27 -0
  9. package/docs/.vitepress/dist/api/index.html +25 -0
  10. package/docs/.vitepress/dist/api/lifecycle.html +38 -0
  11. package/docs/.vitepress/dist/api/route.html +34 -0
  12. package/docs/.vitepress/dist/api/vite-plugin.html +37 -0
  13. package/docs/.vitepress/dist/assets/api_define.md.UA-ygUnQ.js +11 -0
  14. package/docs/.vitepress/dist/assets/api_define.md.UA-ygUnQ.lean.js +1 -0
  15. package/docs/.vitepress/dist/assets/api_directives.md.BV-D251p.js +8 -0
  16. package/docs/.vitepress/dist/assets/api_directives.md.BV-D251p.lean.js +1 -0
  17. package/docs/.vitepress/dist/assets/api_globals.md.DOjt7AV0.js +3 -0
  18. package/docs/.vitepress/dist/assets/api_globals.md.DOjt7AV0.lean.js +1 -0
  19. package/docs/.vitepress/dist/assets/api_index.md.OS6h01ct.js +1 -0
  20. package/docs/.vitepress/dist/assets/api_index.md.OS6h01ct.lean.js +1 -0
  21. package/docs/.vitepress/dist/assets/api_lifecycle.md.Ccm5xw6-.js +14 -0
  22. package/docs/.vitepress/dist/assets/api_lifecycle.md.Ccm5xw6-.lean.js +1 -0
  23. package/docs/.vitepress/dist/assets/api_route.md.CAHf_KNp.js +10 -0
  24. package/docs/.vitepress/dist/assets/api_route.md.CAHf_KNp.lean.js +1 -0
  25. package/docs/.vitepress/dist/assets/api_vite-plugin.md.DNn9VhL5.js +13 -0
  26. package/docs/.vitepress/dist/assets/api_vite-plugin.md.DNn9VhL5.lean.js +1 -0
  27. package/docs/.vitepress/dist/assets/app.BG5s3B0P.js +1 -0
  28. package/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.DQmuWC2Z.js +1 -0
  29. package/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.BO-PSxt1.js +9 -0
  30. package/docs/.vitepress/dist/assets/chunks/framework.B7OFBR9X.js +19 -0
  31. package/docs/.vitepress/dist/assets/chunks/theme.DA-iSa9B.js +2 -0
  32. package/docs/.vitepress/dist/assets/examples_form.md.B3stGKbu.js +34 -0
  33. package/docs/.vitepress/dist/assets/examples_form.md.B3stGKbu.lean.js +1 -0
  34. package/docs/.vitepress/dist/assets/examples_index.md.BDEG_D4J.js +30 -0
  35. package/docs/.vitepress/dist/assets/examples_index.md.BDEG_D4J.lean.js +1 -0
  36. package/docs/.vitepress/dist/assets/examples_routing.md.bqZ9DjDK.js +338 -0
  37. package/docs/.vitepress/dist/assets/examples_routing.md.bqZ9DjDK.lean.js +1 -0
  38. package/docs/.vitepress/dist/assets/examples_sfc-showcase.md.DLXaUiop.js +13 -0
  39. package/docs/.vitepress/dist/assets/examples_sfc-showcase.md.DLXaUiop.lean.js +1 -0
  40. package/docs/.vitepress/dist/assets/examples_todo-app.md.D5RhZoo5.js +297 -0
  41. package/docs/.vitepress/dist/assets/examples_todo-app.md.D5RhZoo5.lean.js +1 -0
  42. package/docs/.vitepress/dist/assets/guide_cdn-usage.md.CAjf03Lr.js +182 -0
  43. package/docs/.vitepress/dist/assets/guide_cdn-usage.md.CAjf03Lr.lean.js +1 -0
  44. package/docs/.vitepress/dist/assets/guide_components.md.BIFWF1Hc.js +174 -0
  45. package/docs/.vitepress/dist/assets/guide_components.md.BIFWF1Hc.lean.js +1 -0
  46. package/docs/.vitepress/dist/assets/guide_contributing.md.BgbUN-Mr.js +1 -0
  47. package/docs/.vitepress/dist/assets/guide_contributing.md.BgbUN-Mr.lean.js +1 -0
  48. package/docs/.vitepress/dist/assets/guide_directives.md.Bi3ynu1d.js +140 -0
  49. package/docs/.vitepress/dist/assets/guide_directives.md.Bi3ynu1d.lean.js +1 -0
  50. package/docs/.vitepress/dist/assets/guide_getting-started.md.2Nr1lp2z.js +107 -0
  51. package/docs/.vitepress/dist/assets/guide_getting-started.md.2Nr1lp2z.lean.js +1 -0
  52. package/docs/.vitepress/dist/assets/guide_index.md.GvZq_Yf2.js +2 -0
  53. package/docs/.vitepress/dist/assets/guide_index.md.GvZq_Yf2.lean.js +1 -0
  54. package/docs/.vitepress/dist/assets/guide_lifecycle.md.B28j1OzS.js +304 -0
  55. package/docs/.vitepress/dist/assets/guide_lifecycle.md.B28j1OzS.lean.js +1 -0
  56. package/docs/.vitepress/dist/assets/guide_quick-start.md.CNk3VGTF.js +33 -0
  57. package/docs/.vitepress/dist/assets/guide_quick-start.md.CNk3VGTF.lean.js +1 -0
  58. package/docs/.vitepress/dist/assets/guide_reactivity.md.CVsaMaPv.js +135 -0
  59. package/docs/.vitepress/dist/assets/guide_reactivity.md.CVsaMaPv.lean.js +1 -0
  60. package/docs/.vitepress/dist/assets/guide_routing.md.DSpDP25o.js +193 -0
  61. package/docs/.vitepress/dist/assets/guide_routing.md.DSpDP25o.lean.js +1 -0
  62. package/docs/.vitepress/dist/assets/guide_sfc.md.CVUP66tS.js +187 -0
  63. package/docs/.vitepress/dist/assets/guide_sfc.md.CVUP66tS.lean.js +1 -0
  64. package/docs/.vitepress/dist/assets/guide_templating.md.BgCGe4aa.js +119 -0
  65. package/docs/.vitepress/dist/assets/guide_templating.md.BgCGe4aa.lean.js +1 -0
  66. package/docs/.vitepress/dist/assets/index.md.xV1taCED.js +23 -0
  67. package/docs/.vitepress/dist/assets/index.md.xV1taCED.lean.js +1 -0
  68. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  69. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  70. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  71. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  72. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  73. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  74. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  75. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  76. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  77. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  78. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  79. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  80. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  81. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  82. package/docs/.vitepress/dist/assets/style.eycE2Jhw.css +1 -0
  83. package/docs/.vitepress/dist/examples/form.html +58 -0
  84. package/docs/.vitepress/dist/examples/index.html +368 -0
  85. package/docs/.vitepress/dist/examples/routing.html +362 -0
  86. package/docs/.vitepress/dist/examples/sfc-showcase.html +37 -0
  87. package/docs/.vitepress/dist/examples/todo-app.html +321 -0
  88. package/docs/.vitepress/dist/guide/cdn-usage.html +206 -0
  89. package/docs/.vitepress/dist/guide/components.html +198 -0
  90. package/docs/.vitepress/dist/guide/contributing.html +25 -0
  91. package/docs/.vitepress/dist/guide/directives.html +164 -0
  92. package/docs/.vitepress/dist/guide/getting-started.html +131 -0
  93. package/docs/.vitepress/dist/guide/index.html +26 -0
  94. package/docs/.vitepress/dist/guide/lifecycle.html +328 -0
  95. package/docs/.vitepress/dist/guide/quick-start.html +57 -0
  96. package/docs/.vitepress/dist/guide/reactivity.html +159 -0
  97. package/docs/.vitepress/dist/guide/routing.html +217 -0
  98. package/docs/.vitepress/dist/guide/sfc.html +211 -0
  99. package/docs/.vitepress/dist/guide/templating.html +143 -0
  100. package/docs/.vitepress/dist/hashmap.json +1 -0
  101. package/docs/.vitepress/dist/index.html +47 -0
  102. package/docs/.vitepress/dist/logo.svg +38 -0
  103. package/docs/.vitepress/dist/vp-icons.css +1 -0
  104. package/docs/api/define.md +31 -0
  105. package/docs/api/directives.md +42 -0
  106. package/docs/api/globals.md +29 -0
  107. package/docs/api/index.md +29 -0
  108. package/docs/api/lifecycle.md +40 -0
  109. package/docs/api/route.md +37 -0
  110. package/docs/api/vite-plugin.md +58 -0
  111. package/docs/examples/form.md +42 -0
  112. package/docs/examples/index.md +104 -0
  113. package/docs/examples/routing.md +409 -0
  114. package/docs/examples/sfc-showcase.md +34 -0
  115. package/docs/examples/todo-app.md +383 -0
  116. package/docs/guide/cdn-usage.md +320 -0
  117. package/docs/guide/components.md +394 -0
  118. package/docs/guide/contributing.md +32 -0
  119. package/docs/guide/directives.md +430 -0
  120. package/docs/guide/getting-started.md +233 -0
  121. package/docs/guide/index.md +88 -0
  122. package/docs/guide/lifecycle.md +493 -0
  123. package/docs/guide/quick-start.md +46 -0
  124. package/docs/guide/reactivity.md +394 -0
  125. package/docs/guide/routing.md +373 -0
  126. package/docs/guide/sfc.md +381 -0
  127. package/docs/guide/templating.md +383 -0
  128. package/docs/index.md +126 -0
  129. package/docs/public/logo.svg +38 -0
  130. package/examples/vite-app/README.md +71 -0
  131. package/examples/vite-app/index.html +45 -0
  132. package/examples/vite-app/package.json +16 -0
  133. package/examples/vite-app/src/components/greeting-card.lego +41 -0
  134. package/examples/vite-app/src/components/sample-component.lego +75 -0
  135. package/examples/vite-app/src/main.js +11 -0
  136. package/examples/vite-app/vite.config.js +16 -0
  137. package/examples.js +99 -0
  138. package/package.json +34 -7
  139. package/parse-lego.js +119 -0
  140. package/parse-lego.test.js +107 -0
  141. package/vite-plugin.js +133 -0
  142. package/.ignore/auto.html +0 -135
  143. package/.ignore/test.html +0 -73
@@ -0,0 +1,409 @@
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 - LegoJS</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 LegoJS 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 LegoJS</h1>
117
+ <p>LegoJS 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-if="loading" class="loading">
180
+ Loading user...
181
+ </div>
182
+
183
+ <div b-if="!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-if="!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-if="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)
@@ -0,0 +1,34 @@
1
+ # SFC Showcase
2
+
3
+ Using `.lego` files with Vite.
4
+
5
+ ## File Structure
6
+
7
+ **Counter.lego**
8
+ ```html
9
+ <template>
10
+ <style>
11
+ button { color: red; }
12
+ </style>
13
+
14
+ <button @click="count++">Count: {{ count }}</button>
15
+ </template>
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
+ ```