lego-dom 0.0.9 → 1.0.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.
Files changed (166) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +1 -0
  3. package/{go.html → cdn.html} +33 -26
  4. package/docs/.vitepress/config.js +39 -1
  5. package/docs/api/directives.md +3 -3
  6. package/docs/api/index.md +1 -1
  7. package/docs/contributing/01-welcome.md +36 -0
  8. package/docs/contributing/02-registry.md +99 -0
  9. package/docs/contributing/03-batcher.md +110 -0
  10. package/docs/contributing/04-reactivity.md +87 -0
  11. package/docs/contributing/05-caching.md +59 -0
  12. package/docs/contributing/06-init.md +125 -0
  13. package/docs/contributing/07-observer.md +69 -0
  14. package/docs/contributing/08-snap.md +126 -0
  15. package/docs/contributing/09-diffing.md +69 -0
  16. package/docs/contributing/10-studs.md +76 -0
  17. package/docs/contributing/11-scanner.md +104 -0
  18. package/docs/contributing/12-render.md +116 -0
  19. package/docs/contributing/13-directives.md +225 -0
  20. package/docs/contributing/14-events.md +57 -0
  21. package/docs/contributing/15-router.md +9 -0
  22. package/docs/contributing/16-state.md +48 -0
  23. package/docs/contributing/17-legodom.md +55 -0
  24. package/docs/contributing/index.md +5 -0
  25. package/docs/examples/form.md +1 -1
  26. package/docs/examples/index.md +1 -1
  27. package/docs/examples/routing.md +4 -4
  28. package/docs/examples/todo-app.md +1 -1
  29. package/docs/guide/cdn-usage.md +8 -0
  30. package/docs/guide/components.md +33 -15
  31. package/docs/guide/directives.md +22 -22
  32. package/docs/guide/getting-started.md +35 -10
  33. package/docs/guide/index.md +3 -3
  34. package/docs/guide/quick-start.md +4 -1
  35. package/docs/guide/reactivity.md +22 -1
  36. package/docs/guide/routing.md +189 -289
  37. package/docs/guide/sfc.md +1 -1
  38. package/docs/guide/templating.md +2 -2
  39. package/docs/index.md +41 -7
  40. package/docs/router/basic-routing.md +103 -0
  41. package/docs/router/cold-entry.md +91 -0
  42. package/docs/router/history.md +69 -0
  43. package/docs/router/index.md +73 -0
  44. package/docs/router/resolver.md +74 -0
  45. package/docs/router/surgical-swaps.md +134 -0
  46. package/examples/vite-app/index.html +4 -12
  47. package/examples/vite-app/package.json +4 -2
  48. package/examples/vite-app/src/app.css +3 -0
  49. package/examples/vite-app/src/app.js +29 -0
  50. package/examples/vite-app/src/components/app-navbar.lego +34 -0
  51. package/examples/vite-app/src/components/customers/customer-details.lego +24 -0
  52. package/examples/vite-app/src/components/customers/customer-orders.lego +21 -0
  53. package/examples/vite-app/src/components/customers/order-list.lego +55 -0
  54. package/examples/vite-app/src/components/greeting-card.lego +1 -1
  55. package/examples/vite-app/src/components/sample-component.lego +15 -15
  56. package/examples/vite-app/src/components/shells/customers-shell.lego +21 -0
  57. package/examples/vite-app/src/components/todo-list.lego +12 -15
  58. package/examples/vite-app/src/components/widgets/user-card.lego +27 -0
  59. package/examples/vite-app/vite.config.js +5 -1
  60. package/main.js +247 -56
  61. package/package.json +1 -1
  62. package/parse-lego.js +17 -8
  63. package/{main.test.js → tests/main.test.js} +34 -17
  64. package/tests/parse-lego.test.js +65 -0
  65. package/vite-plugin.js +60 -22
  66. package/docs/.vitepress/dist/404.html +0 -22
  67. package/docs/.vitepress/dist/api/define.html +0 -35
  68. package/docs/.vitepress/dist/api/directives.html +0 -32
  69. package/docs/.vitepress/dist/api/globals.html +0 -27
  70. package/docs/.vitepress/dist/api/index.html +0 -25
  71. package/docs/.vitepress/dist/api/lifecycle.html +0 -38
  72. package/docs/.vitepress/dist/api/route.html +0 -34
  73. package/docs/.vitepress/dist/api/vite-plugin.html +0 -37
  74. package/docs/.vitepress/dist/assets/api_define.md.UA-ygUnQ.js +0 -11
  75. package/docs/.vitepress/dist/assets/api_define.md.UA-ygUnQ.lean.js +0 -1
  76. package/docs/.vitepress/dist/assets/api_directives.md.BV-D251p.js +0 -8
  77. package/docs/.vitepress/dist/assets/api_directives.md.BV-D251p.lean.js +0 -1
  78. package/docs/.vitepress/dist/assets/api_globals.md.CEznyRAY.js +0 -3
  79. package/docs/.vitepress/dist/assets/api_globals.md.CEznyRAY.lean.js +0 -1
  80. package/docs/.vitepress/dist/assets/api_index.md.IEYUxUIr.js +0 -1
  81. package/docs/.vitepress/dist/assets/api_index.md.IEYUxUIr.lean.js +0 -1
  82. package/docs/.vitepress/dist/assets/api_lifecycle.md.Ccm5xw6-.js +0 -14
  83. package/docs/.vitepress/dist/assets/api_lifecycle.md.Ccm5xw6-.lean.js +0 -1
  84. package/docs/.vitepress/dist/assets/api_route.md.CAHf_KNp.js +0 -10
  85. package/docs/.vitepress/dist/assets/api_route.md.CAHf_KNp.lean.js +0 -1
  86. package/docs/.vitepress/dist/assets/api_vite-plugin.md.DC8Li09k.js +0 -13
  87. package/docs/.vitepress/dist/assets/api_vite-plugin.md.DC8Li09k.lean.js +0 -1
  88. package/docs/.vitepress/dist/assets/app.BfblNDJy.js +0 -1
  89. package/docs/.vitepress/dist/assets/chunks/@localSearchIndexroot.Crdp7-Zp.js +0 -1
  90. package/docs/.vitepress/dist/assets/chunks/VPLocalSearchBox.C18E44rY.js +0 -9
  91. package/docs/.vitepress/dist/assets/chunks/framework.B7OFBR9X.js +0 -19
  92. package/docs/.vitepress/dist/assets/chunks/theme.VX3itTW6.js +0 -2
  93. package/docs/.vitepress/dist/assets/examples_form.md.DQoAgbLR.js +0 -34
  94. package/docs/.vitepress/dist/assets/examples_form.md.DQoAgbLR.lean.js +0 -1
  95. package/docs/.vitepress/dist/assets/examples_index.md.CVJJjXXE.js +0 -28
  96. package/docs/.vitepress/dist/assets/examples_index.md.CVJJjXXE.lean.js +0 -1
  97. package/docs/.vitepress/dist/assets/examples_routing.md.sRnA5RXw.js +0 -338
  98. package/docs/.vitepress/dist/assets/examples_routing.md.sRnA5RXw.lean.js +0 -1
  99. package/docs/.vitepress/dist/assets/examples_sfc-showcase.md.DPf9Wm99.js +0 -13
  100. package/docs/.vitepress/dist/assets/examples_sfc-showcase.md.DPf9Wm99.lean.js +0 -1
  101. package/docs/.vitepress/dist/assets/examples_todo-app.md.CqF4JaWn.js +0 -297
  102. package/docs/.vitepress/dist/assets/examples_todo-app.md.CqF4JaWn.lean.js +0 -1
  103. package/docs/.vitepress/dist/assets/guide_cdn-usage.md.CjIjusre.js +0 -182
  104. package/docs/.vitepress/dist/assets/guide_cdn-usage.md.CjIjusre.lean.js +0 -1
  105. package/docs/.vitepress/dist/assets/guide_components.md.CMU3iM6R.js +0 -174
  106. package/docs/.vitepress/dist/assets/guide_components.md.CMU3iM6R.lean.js +0 -1
  107. package/docs/.vitepress/dist/assets/guide_contributing.md.Crrv3T_0.js +0 -1
  108. package/docs/.vitepress/dist/assets/guide_contributing.md.Crrv3T_0.lean.js +0 -1
  109. package/docs/.vitepress/dist/assets/guide_directives.md.DFwqvqOv.js +0 -140
  110. package/docs/.vitepress/dist/assets/guide_directives.md.DFwqvqOv.lean.js +0 -1
  111. package/docs/.vitepress/dist/assets/guide_getting-started.md.DtaJPe0i.js +0 -107
  112. package/docs/.vitepress/dist/assets/guide_getting-started.md.DtaJPe0i.lean.js +0 -1
  113. package/docs/.vitepress/dist/assets/guide_index.md.DtJVpLI9.js +0 -2
  114. package/docs/.vitepress/dist/assets/guide_index.md.DtJVpLI9.lean.js +0 -1
  115. package/docs/.vitepress/dist/assets/guide_lifecycle.md.CfY3jlU1.js +0 -304
  116. package/docs/.vitepress/dist/assets/guide_lifecycle.md.CfY3jlU1.lean.js +0 -1
  117. package/docs/.vitepress/dist/assets/guide_quick-start.md.CwdNNA21.js +0 -33
  118. package/docs/.vitepress/dist/assets/guide_quick-start.md.CwdNNA21.lean.js +0 -1
  119. package/docs/.vitepress/dist/assets/guide_reactivity.md.DgTH0MTn.js +0 -135
  120. package/docs/.vitepress/dist/assets/guide_reactivity.md.DgTH0MTn.lean.js +0 -1
  121. package/docs/.vitepress/dist/assets/guide_routing.md.nMB0QOBR.js +0 -193
  122. package/docs/.vitepress/dist/assets/guide_routing.md.nMB0QOBR.lean.js +0 -1
  123. package/docs/.vitepress/dist/assets/guide_sfc.md.BUkWma1z.js +0 -187
  124. package/docs/.vitepress/dist/assets/guide_sfc.md.BUkWma1z.lean.js +0 -1
  125. package/docs/.vitepress/dist/assets/guide_templating.md.XI3uUlYI.js +0 -119
  126. package/docs/.vitepress/dist/assets/guide_templating.md.XI3uUlYI.lean.js +0 -1
  127. package/docs/.vitepress/dist/assets/index.md.M4_o26kF.js +0 -23
  128. package/docs/.vitepress/dist/assets/index.md.M4_o26kF.lean.js +0 -1
  129. package/docs/.vitepress/dist/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 +0 -0
  130. package/docs/.vitepress/dist/assets/inter-italic-cyrillic.By2_1cv3.woff2 +0 -0
  131. package/docs/.vitepress/dist/assets/inter-italic-greek-ext.1u6EdAuj.woff2 +0 -0
  132. package/docs/.vitepress/dist/assets/inter-italic-greek.DJ8dCoTZ.woff2 +0 -0
  133. package/docs/.vitepress/dist/assets/inter-italic-latin-ext.CN1xVJS-.woff2 +0 -0
  134. package/docs/.vitepress/dist/assets/inter-italic-latin.C2AdPX0b.woff2 +0 -0
  135. package/docs/.vitepress/dist/assets/inter-italic-vietnamese.BSbpV94h.woff2 +0 -0
  136. package/docs/.vitepress/dist/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 +0 -0
  137. package/docs/.vitepress/dist/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 +0 -0
  138. package/docs/.vitepress/dist/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 +0 -0
  139. package/docs/.vitepress/dist/assets/inter-roman-greek.BBVDIX6e.woff2 +0 -0
  140. package/docs/.vitepress/dist/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 +0 -0
  141. package/docs/.vitepress/dist/assets/inter-roman-latin.Di8DUHzh.woff2 +0 -0
  142. package/docs/.vitepress/dist/assets/inter-roman-vietnamese.BjW4sHH5.woff2 +0 -0
  143. package/docs/.vitepress/dist/assets/style.eycE2Jhw.css +0 -1
  144. package/docs/.vitepress/dist/examples/form.html +0 -58
  145. package/docs/.vitepress/dist/examples/index.html +0 -52
  146. package/docs/.vitepress/dist/examples/routing.html +0 -362
  147. package/docs/.vitepress/dist/examples/sfc-showcase.html +0 -37
  148. package/docs/.vitepress/dist/examples/todo-app.html +0 -321
  149. package/docs/.vitepress/dist/guide/cdn-usage.html +0 -206
  150. package/docs/.vitepress/dist/guide/components.html +0 -198
  151. package/docs/.vitepress/dist/guide/contributing.html +0 -25
  152. package/docs/.vitepress/dist/guide/directives.html +0 -164
  153. package/docs/.vitepress/dist/guide/getting-started.html +0 -131
  154. package/docs/.vitepress/dist/guide/index.html +0 -26
  155. package/docs/.vitepress/dist/guide/lifecycle.html +0 -328
  156. package/docs/.vitepress/dist/guide/quick-start.html +0 -57
  157. package/docs/.vitepress/dist/guide/reactivity.html +0 -159
  158. package/docs/.vitepress/dist/guide/routing.html +0 -217
  159. package/docs/.vitepress/dist/guide/sfc.html +0 -211
  160. package/docs/.vitepress/dist/guide/templating.html +0 -143
  161. package/docs/.vitepress/dist/hashmap.json +0 -1
  162. package/docs/.vitepress/dist/index.html +0 -47
  163. package/docs/.vitepress/dist/logo.svg +0 -38
  164. package/docs/.vitepress/dist/vp-icons.css +0 -1
  165. package/examples/vite-app/src/main.js +0 -11
  166. package/examples.js +0 -99
@@ -0,0 +1,21 @@
1
+ <template>
2
+ <customers-shell>
3
+ <div style="padding: 1rem; border: 1px dashed #ccc;">
4
+ <h3>📦 Order History</h3>
5
+ <p>Viewing orders for Customer ID: <strong>{{ global.$route.params.id }}</strong></p>
6
+
7
+ <!-- Composition: Using another component inside -->
8
+ <order-list></order-list>
9
+
10
+ <div style="margin-top: 1rem;">
11
+ <a href="/customers/{{ global.$route.params.id }}/details" b-target="#todo-container">View Profile Info</a>
12
+ </div>
13
+ </div>
14
+ </customers-shell>
15
+ </template>
16
+
17
+ <script>
18
+ export default {
19
+ name: 'CustomerOrders'
20
+ }
21
+ </script>
@@ -0,0 +1,55 @@
1
+ <style>
2
+ ul {
3
+ list-style: none;
4
+ padding: 0;
5
+ }
6
+
7
+ li {
8
+ padding: 0.5rem;
9
+ border: 1px solid #eee;
10
+ margin-bottom: 0.5rem;
11
+ border-radius: 4px;
12
+ display: flex;
13
+ justify-content: space-between;
14
+ }
15
+
16
+ .status {
17
+ font-weight: bold;
18
+ color: #059669;
19
+ }
20
+ </style>
21
+
22
+ <template>
23
+ <div>
24
+ <h4>Recent Orders</h4>
25
+ <p b-show="loading">Loading orders for customer...</p>
26
+ <ul b-show="!loading">
27
+ <li b-for="order in orders">
28
+ <span>Order #{{ order.id }}</span>
29
+ <span class="status">{{ order.status }}</span>
30
+ </li>
31
+ </ul>
32
+ </div>
33
+ </template>
34
+
35
+ <script>
36
+ export default {
37
+ name: 'OrderList',
38
+ state: {
39
+ orders: [],
40
+ loading: true
41
+ },
42
+ async mounted() {
43
+ // Simulate API fetch using the customer ID from parent or global params
44
+ const customerId = Lego.globals.$route.params.id;
45
+ setTimeout(() => {
46
+ this.orders = [
47
+ { id: '101', status: 'Delivered' },
48
+ { id: '105', status: 'Shipped' },
49
+ { id: '110', status: 'Processing' }
50
+ ];
51
+ this.loading = false;
52
+ }, 800);
53
+ }
54
+ }
55
+ </script>
@@ -28,7 +28,7 @@
28
28
  <template>
29
29
  <div>
30
30
  <input b-sync="name" type="text" placeholder="Enter your name">
31
- <div class="greeting" b-if="name">
31
+ <div class="greeting" b-show="name">
32
32
  Hello, {{ name }}! 👋
33
33
  </div>
34
34
  </div>
@@ -49,27 +49,27 @@
49
49
  <template>
50
50
  <div class="header">{{ title }}</div>
51
51
  <div class="content">
52
- <p>This is a sample Lego component loaded from a .lego file!</p>
52
+ <p class="gobe">This is a sample Lego component loaded from a .lego file!</p>
53
53
  <p>Message: {{ message }}</p>
54
54
  </div>
55
55
  <button @click="incrementCount()">
56
- Click me!
56
+ Click me!
57
57
  <span class="count">{{ count }}</span>
58
58
  </button>
59
59
  </template>
60
60
 
61
61
  <script>
62
- export default {
63
- title: 'Sample Component',
64
- message: 'Hello from .lego file!',
65
- count: 0,
66
-
67
- incrementCount() {
68
- this.count++;
69
- },
70
-
71
- mounted() {
72
- console.log('Sample component mounted!');
62
+ export default {
63
+ title: 'Sample Component',
64
+ message: 'Hello from .lego file!',
65
+ count: 0,
66
+
67
+ incrementCount() {
68
+ this.count++;
69
+ },
70
+
71
+ mounted() {
72
+ console.log('Sample component mounted!');
73
+ }
73
74
  }
74
- }
75
- </script>
75
+ </script>
@@ -0,0 +1,21 @@
1
+ <style>
2
+ self {
3
+ display: block;
4
+ padding: 1rem;
5
+ background: #f9fafb;
6
+ border-bottom: 1px solid #e0e0e0;
7
+ }
8
+ </style>
9
+
10
+ <template>
11
+ <div>
12
+ <h2>Customers Shell</h2>
13
+ <slot></slot>
14
+ </div>
15
+ </template>
16
+
17
+ <script>
18
+ export default {
19
+ name: 'CustomersShell'
20
+ }
21
+ </script>
@@ -162,11 +162,11 @@
162
162
  </button>
163
163
  </div>
164
164
 
165
- <ul>
166
- <li b-for="todo in filteredTodos()">
165
+ <ul b-for="todo in filteredTodos()">
166
+ <li>
167
167
  <input type="checkbox" b-sync="todo.done">
168
168
  <span class="todo-text {{ todo.done ? 'done' : '' }}">
169
- {{ todo.text }} - first
169
+ {{ todo.text }}
170
170
  </span>
171
171
  <button class="delete-btn" @click="deleteTodo(todo)">Delete</button>
172
172
  </li>
@@ -176,7 +176,7 @@
176
176
  <span>{{ remaining() }} item{{ remaining() === 1 ? '' : 's' }} left</span>
177
177
  <button
178
178
  class="clear-completed"
179
- b-if="completedCount() > 0"
179
+ b-show="completedCount() > 0"
180
180
  @click="clearCompleted()">
181
181
  Clear completed ({{ completedCount() }})
182
182
  </button>
@@ -195,11 +195,11 @@ export default {
195
195
  this.todos = JSON.parse(saved);
196
196
  }
197
197
  },
198
-
198
+
199
199
  updated() {
200
200
  localStorage.setItem('legojs-todos', JSON.stringify(this.todos));
201
201
  },
202
-
202
+
203
203
  addTodo() {
204
204
  if (this.newTodo.trim()) {
205
205
  this.todos.push({
@@ -210,14 +210,11 @@ export default {
210
210
  this.newTodo = '';
211
211
  }
212
212
  },
213
-
213
+
214
214
  deleteTodo(todo) {
215
- const index = this.todos.indexOf(todo);
216
- if (index > -1) {
217
- this.todos.splice(index, 1);
218
- }
215
+ this.todos = this.todos.filter(t => t.id !== todo.id);
219
216
  },
220
-
217
+
221
218
  filteredTodos() {
222
219
  if (this.filter === 'active') {
223
220
  return this.todos.filter(t => !t.done);
@@ -226,15 +223,15 @@ export default {
226
223
  }
227
224
  return this.todos;
228
225
  },
229
-
226
+
230
227
  remaining() {
231
228
  return this.todos.filter(t => !t.done).length;
232
229
  },
233
-
230
+
234
231
  completedCount() {
235
232
  return this.todos.filter(t => t.done).length;
236
233
  },
237
-
234
+
238
235
  clearCompleted() {
239
236
  this.todos = this.todos.filter(t => !t.done);
240
237
  }
@@ -0,0 +1,27 @@
1
+ <style>
2
+ self {
3
+ display: block;
4
+ padding: 1rem;
5
+ background: #f9fafb;
6
+ border-bottom: 1px solid #e0e0e0;
7
+ }
8
+ </style>
9
+
10
+
11
+ <template>
12
+ <div>
13
+ <h2>User Card</h2>
14
+ <p>Name: {{ name }}</p>
15
+ <p>Age: {{ age }}</p>
16
+ </div>
17
+ </template>
18
+
19
+ <script>
20
+ export default {
21
+ name: 'UserCard',
22
+ props: {
23
+ name: String,
24
+ age: Number
25
+ }
26
+ }
27
+ </script>
@@ -1,13 +1,17 @@
1
1
  import { defineConfig } from 'vite';
2
2
  import path from 'path';
3
+
3
4
  import legoPlugin from 'lego-dom/vite-plugin';
5
+ import tailwindcss from '@tailwindcss/vite';
6
+
4
7
 
5
8
  export default defineConfig({
6
9
  plugins: [
7
10
  legoPlugin({
8
11
  componentsDir: './src/components',
9
12
  include: ['**/*.lego']
10
- })
13
+ }),
14
+ tailwindcss()
11
15
  ],
12
16
  resolve: {
13
17
  alias: {