lightview 1.8.1-b → 2.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 (224) hide show
  1. package/.agent/workflows/daisyui-component-migration.md +155 -0
  2. package/.codacy/cli.sh +149 -0
  3. package/.codacy/codacy.yaml +15 -0
  4. package/.github/instructions/codacy.instructions.md +72 -0
  5. package/.wranglerignore +21 -0
  6. package/README.md +1331 -21
  7. package/_headers +4 -0
  8. package/build.js +70 -0
  9. package/components/actions/button.js +151 -0
  10. package/components/actions/dropdown.js +120 -0
  11. package/components/actions/modal.js +146 -0
  12. package/components/actions/swap.js +118 -0
  13. package/components/daisyui.js +288 -0
  14. package/components/data-display/accordion.js +128 -0
  15. package/components/data-display/alert.js +112 -0
  16. package/components/data-display/avatar.js +170 -0
  17. package/components/data-display/badge.js +82 -0
  18. package/components/data-display/card.js +151 -0
  19. package/components/data-display/carousel.js +94 -0
  20. package/components/data-display/chart.js +220 -0
  21. package/components/data-display/chat.js +128 -0
  22. package/components/data-display/collapse.js +103 -0
  23. package/components/data-display/countdown.js +69 -0
  24. package/components/data-display/diff.js +111 -0
  25. package/components/data-display/kbd.js +65 -0
  26. package/components/data-display/loading.js +75 -0
  27. package/components/data-display/progress.js +79 -0
  28. package/components/data-display/radial-progress.js +88 -0
  29. package/components/data-display/skeleton.js +66 -0
  30. package/components/data-display/stats.js +159 -0
  31. package/components/data-display/table.js +146 -0
  32. package/components/data-display/timeline.js +146 -0
  33. package/components/data-display/toast.js +72 -0
  34. package/components/data-display/tooltip.js +74 -0
  35. package/components/data-input/checkbox.js +253 -0
  36. package/components/data-input/file-input.js +224 -0
  37. package/components/data-input/input.js +264 -0
  38. package/components/data-input/radio.js +338 -0
  39. package/components/data-input/range.js +204 -0
  40. package/components/data-input/rating.js +219 -0
  41. package/components/data-input/select.js +287 -0
  42. package/components/data-input/textarea.js +287 -0
  43. package/components/data-input/toggle.js +201 -0
  44. package/components/index.js +137 -0
  45. package/components/layout/divider.js +72 -0
  46. package/components/layout/drawer.js +142 -0
  47. package/components/layout/footer.js +100 -0
  48. package/components/layout/hero.js +109 -0
  49. package/components/layout/indicator.js +90 -0
  50. package/components/layout/join.js +78 -0
  51. package/components/layout/navbar.js +110 -0
  52. package/components/navigation/breadcrumbs.js +91 -0
  53. package/components/navigation/dock.js +103 -0
  54. package/components/navigation/menu.js +126 -0
  55. package/components/navigation/pagination.js +105 -0
  56. package/components/navigation/steps.js +89 -0
  57. package/components/navigation/tabs.css +177 -0
  58. package/components/navigation/tabs.js +123 -0
  59. package/components/theme/theme-switch.css +65 -0
  60. package/components/theme/theme-switch.js +177 -0
  61. package/docs/about.html +164 -0
  62. package/docs/api/computed.html +184 -0
  63. package/docs/api/effects.html +173 -0
  64. package/docs/api/elements.html +180 -0
  65. package/docs/api/enhance.html +225 -0
  66. package/docs/api/hypermedia.html +165 -0
  67. package/docs/api/index.html +178 -0
  68. package/docs/api/nav.html +18 -0
  69. package/docs/api/signals.html +136 -0
  70. package/docs/api/state.html +217 -0
  71. package/docs/assets/images/logo-favicon.svg +42 -0
  72. package/docs/assets/images/logo-static.svg +40 -0
  73. package/docs/assets/images/logo.svg +66 -0
  74. package/docs/assets/js/examplify.js +395 -0
  75. package/docs/assets/styles/site.css +1102 -0
  76. package/docs/assets/styles/themes.css +236 -0
  77. package/docs/components/accordion.html +439 -0
  78. package/docs/components/alert.html +528 -0
  79. package/docs/components/avatar.html +586 -0
  80. package/docs/components/badge.html +531 -0
  81. package/docs/components/breadcrumbs.html +278 -0
  82. package/docs/components/button.html +579 -0
  83. package/docs/components/card.html +561 -0
  84. package/docs/components/carousel.html +286 -0
  85. package/docs/components/chart-area.html +702 -0
  86. package/docs/components/chart-bar.html +782 -0
  87. package/docs/components/chart-column.html +735 -0
  88. package/docs/components/chart-line.html +794 -0
  89. package/docs/components/chart-pie.html +823 -0
  90. package/docs/components/chart.html +612 -0
  91. package/docs/components/chat.html +547 -0
  92. package/docs/components/checkbox.html +641 -0
  93. package/docs/components/collapse.html +536 -0
  94. package/docs/components/component-nav.html +53 -0
  95. package/docs/components/countdown.html +470 -0
  96. package/docs/components/diff.html +245 -0
  97. package/docs/components/divider.html +240 -0
  98. package/docs/components/dock.html +277 -0
  99. package/docs/components/drawer.html +515 -0
  100. package/docs/components/dropdown.html +479 -0
  101. package/docs/components/file-input.html +591 -0
  102. package/docs/components/footer.html +301 -0
  103. package/docs/components/gallery.html +504 -0
  104. package/docs/components/hero.html +264 -0
  105. package/docs/components/index.css +840 -0
  106. package/docs/components/index.html +735 -0
  107. package/docs/components/indicator.html +342 -0
  108. package/docs/components/input.html +644 -0
  109. package/docs/components/join.html +285 -0
  110. package/docs/components/kbd.html +322 -0
  111. package/docs/components/loading.html +521 -0
  112. package/docs/components/menu.html +461 -0
  113. package/docs/components/modal.html +639 -0
  114. package/docs/components/navbar.html +321 -0
  115. package/docs/components/pagination.html +279 -0
  116. package/docs/components/progress.html +514 -0
  117. package/docs/components/radial-progress.html +434 -0
  118. package/docs/components/radio.html +655 -0
  119. package/docs/components/range.html +611 -0
  120. package/docs/components/rating.html +642 -0
  121. package/docs/components/select.html +696 -0
  122. package/docs/components/sidebar-setup.js +93 -0
  123. package/docs/components/skeleton.html +447 -0
  124. package/docs/components/spinner.html +68 -0
  125. package/docs/components/stats.html +486 -0
  126. package/docs/components/steps.html +356 -0
  127. package/docs/components/swap.html +517 -0
  128. package/docs/components/switch.html +68 -0
  129. package/docs/components/table.html +668 -0
  130. package/docs/components/tabs.html +506 -0
  131. package/docs/components/text-input.html +68 -0
  132. package/docs/components/textarea.html +603 -0
  133. package/docs/components/timeline.html +487 -0
  134. package/docs/components/toast.html +474 -0
  135. package/docs/components/toggle.html +564 -0
  136. package/docs/components/tooltip.html +423 -0
  137. package/docs/examples/getting-started-example.html +40 -0
  138. package/docs/examples/index.html +93 -0
  139. package/docs/getting-started/index.html +739 -0
  140. package/docs/getting-started/reviews.html +23 -0
  141. package/docs/getting-started/reviews.odom +108 -0
  142. package/docs/getting-started/reviews.vdom +84 -0
  143. package/docs/index.html +134 -0
  144. package/docs/playground.html +416 -0
  145. package/docs/router.html +285 -0
  146. package/docs/styles/index.html +190 -0
  147. package/functions/_middleware.js +32 -0
  148. package/index.html +309 -0
  149. package/lightview-router.js +364 -0
  150. package/lightview-x.js +1577 -0
  151. package/lightview.js +658 -1109
  152. package/lightview.js.backup +793 -0
  153. package/middleware/locale.js +25 -0
  154. package/middleware/markdown.js +44 -0
  155. package/middleware/notFound.js +37 -0
  156. package/package.json +27 -41
  157. package/watch.js +92 -0
  158. package/wrangler.toml +12 -0
  159. package/.idea/lightview.iml +0 -12
  160. package/.idea/modules.xml +0 -8
  161. package/.idea/vcs.xml +0 -6
  162. package/LICENSE +0 -21
  163. package/codepen-no-tabs-embed.css +0 -2
  164. package/components/chart/chart.html +0 -17
  165. package/components/chart/example.html +0 -32
  166. package/components/chart.html +0 -83
  167. package/components/components.js +0 -113
  168. package/components/gantt/example.html +0 -22
  169. package/components/gantt/gantt.html +0 -42
  170. package/components/gauge/example.html +0 -28
  171. package/components/gauge/gauge.html +0 -20
  172. package/components/gauge.html +0 -60
  173. package/components/orgchart/example.html +0 -25
  174. package/components/orgchart/orgchart.html +0 -41
  175. package/components/repl/code-editor.html +0 -64
  176. package/components/repl/editor.html +0 -37
  177. package/components/repl/editorjs-inline-tool/index.js +0 -3
  178. package/components/repl/editorjs-inline-tool/inline-tools.js +0 -28
  179. package/components/repl/editorjs-inline-tool/tool.js +0 -175
  180. package/components/repl/repl-with-wysiwyg.html +0 -355
  181. package/components/repl/repl.html +0 -345
  182. package/components/repl/sup.js +0 -44
  183. package/components/repl/wysiwyg-repl.html +0 -258
  184. package/components/timeline/example.html +0 -33
  185. package/components/timeline/timeline.html +0 -44
  186. package/components/timeline.html +0 -81
  187. package/examples/anchor.html +0 -11
  188. package/examples/chart.html +0 -34
  189. package/examples/counter.html +0 -26
  190. package/examples/counter.test.mjs +0 -47
  191. package/examples/counter2.html +0 -26
  192. package/examples/directives.html +0 -79
  193. package/examples/foreign.html +0 -50
  194. package/examples/forgeinform.html +0 -98
  195. package/examples/form.html +0 -61
  196. package/examples/gauge.html +0 -18
  197. package/examples/invalid-template-literals.html +0 -44
  198. package/examples/medium/remote.html +0 -60
  199. package/examples/message.html +0 -18
  200. package/examples/nested.html +0 -11
  201. package/examples/object-bound-form.html +0 -34
  202. package/examples/remote-server.js +0 -51
  203. package/examples/remote.html +0 -34
  204. package/examples/remote.json +0 -1
  205. package/examples/scratch.html +0 -69
  206. package/examples/sensors/index.html +0 -30
  207. package/examples/sensors/sensor-server.js +0 -30
  208. package/examples/shared.html +0 -41
  209. package/examples/template.html +0 -33
  210. package/examples/timeline.html +0 -21
  211. package/examples/todo.html +0 -38
  212. package/examples/top.html +0 -10
  213. package/examples/types.html +0 -94
  214. package/examples/xor.html +0 -62
  215. package/jest-puppeteer.config.js +0 -5
  216. package/jest.config.json +0 -12
  217. package/sites/client.html +0 -48
  218. package/sites/index.html +0 -247
  219. package/test/basic.html +0 -93
  220. package/test/basic.test.mjs +0 -315
  221. package/test/extended.html +0 -29
  222. package/test/extended.test.mjs +0 -448
  223. package/types.js +0 -534
  224. package/unsplash.key +0 -1
@@ -0,0 +1,515 @@
1
+ <!-- SEO-friendly SPA Shim -->
2
+ <script src="/lightview-router.js"></script>
3
+ <script>
4
+ if (window.LightviewRouter) {
5
+ LightviewRouter.base('/index.html');
6
+ }
7
+ </script>
8
+
9
+ <!-- Load the page-specific stylesheet -->
10
+ <link rel="stylesheet" href="./index.css">
11
+
12
+ <!-- Gallery Structure -->
13
+ <div class="gallery-page">
14
+ <div class="gallery-layout">
15
+ <!-- Sidebar Overlay -->
16
+ <div id="sidebar-overlay" class="sidebar-overlay"></div>
17
+
18
+ <!-- Sidebar -->
19
+ <div id="gallery-sidebar" class="gallery-sidebar" style="visibility: hidden" src="./component-nav.html"></div>
20
+
21
+ <!-- Main Content -->
22
+ <div id="gallery-main" class="gallery-main">
23
+ <!-- Header Container -->
24
+ <div
25
+ style="position: sticky; top: 0; z-index: 30; background: var(--gallery-surface); border-bottom: 1px solid var(--gallery-border); backdrop-filter: blur(8px);">
26
+ <!-- Breadcrumbs Row -->
27
+ <div style="padding: 0.75rem 1.5rem 0;">
28
+ <script>
29
+ (() => {
30
+ const { Breadcrumbs } = Lightview.tags;
31
+ const breadcrumbs = Breadcrumbs({
32
+ id: 'page-breadcrumbs',
33
+ items: [
34
+ { label: 'Components', href: '/docs/components' },
35
+ { label: 'Drawer' }
36
+ ]
37
+ });
38
+ document.currentScript.replaceWith(breadcrumbs.domEl);
39
+ })();
40
+ </script>
41
+ </div>
42
+ <!-- Title Row -->
43
+ <div class="gallery-header"
44
+ style="border-bottom: none; height: auto; padding-top: 0.5rem; padding-bottom: 0.75rem;">
45
+ <button id="toggle-btn" class="toggle-btn" aria-label="Toggle Sidebar">
46
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" class="toggle-icon"
47
+ style="stroke: currentColor; stroke-width: 2;">
48
+ <path stroke-linecap="round" stroke-linejoin="round" d="M15 19l-7-7 7-7" />
49
+ <path stroke-linecap="round" stroke-linejoin="round" d="M11 19l-7-7 7-7" />
50
+ </svg>
51
+ </button>
52
+ <h1 class="gallery-title">Drawer</h1>
53
+ </div>
54
+ </div>
55
+
56
+ <!-- Content -->
57
+ <div class="gallery-content">
58
+ <div class="section-content" style="max-width: 1000px;">
59
+ <p class="text-lg" style="opacity: 0.7; margin-bottom: 1.5rem;">
60
+ Drawer is a sidebar that can be opened from the left or right side.
61
+ Perfect for navigation menus and side panels.
62
+ </p>
63
+
64
+ <!-- Basic Example with Examplify -->
65
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
66
+ <div class="card-body">
67
+ <h2 class="card-title">Basic Example</h2>
68
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Drawer with toggle button and menu</p>
69
+
70
+ <!-- Tabs -->
71
+ <script>
72
+ window.switchSyntaxTab = (tabId) => {
73
+ const tabs = ['tagged', 'vdom', 'object'];
74
+ tabs.forEach(t => {
75
+ const tabEl = document.getElementById(`tab-btn-${t}`);
76
+ const contentEl = document.getElementById(`syntax-${t}`);
77
+ if (t === tabId) {
78
+ tabEl.classList.add('syntax-tab-active');
79
+ contentEl.style.display = 'block';
80
+ } else {
81
+ tabEl.classList.remove('syntax-tab-active');
82
+ contentEl.style.display = 'none';
83
+ }
84
+ });
85
+ };
86
+ </script>
87
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
88
+ <button id="tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
89
+ onclick="switchSyntaxTab('tagged')">Tagged</button>
90
+ <button id="tab-btn-vdom" role="tab" class="syntax-tab" onclick="switchSyntaxTab('vdom')">vDOM</button>
91
+ <button id="tab-btn-object" role="tab" class="syntax-tab" onclick="switchSyntaxTab('object')">Object
92
+ DOM</button>
93
+ </div>
94
+
95
+ <!-- Tagged Syntax -->
96
+ <div id="syntax-tagged">
97
+ <pre><script>
98
+ examplify(document.currentScript.nextElementSibling, {
99
+ at: document.currentScript.parentElement,
100
+ scripts: ['/lightview.js', '/lightview-x.js'],
101
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
102
+ type: 'module',
103
+ minHeight: 220,
104
+ autoRun: true,
105
+ html: '<div id="demo" style="height: 200px;"></div>'
106
+ });
107
+ </script><code contenteditable="true">await import('/components/layout/drawer.js');
108
+ const { tags, $ } = Lightview;
109
+ const { ul, li, a, p, Drawer } = tags;
110
+
111
+ const drawerId = 'my-drawer';
112
+
113
+ const drawer = Drawer({ id: drawerId },
114
+ Drawer.Content({},
115
+ Drawer.Button({ for: drawerId }, 'Open Drawer'),
116
+ p({ class: 'py-4' }, 'Main content area. Click the button to open the drawer.')
117
+ ),
118
+ Drawer.Side({ class: 'z-50' },
119
+ Drawer.Overlay({ for: drawerId }),
120
+ ul({ class: 'menu bg-base-200 text-base-content min-h-full w-64 p-4' },
121
+ li({}, a({}, '📁 Dashboard')),
122
+ li({}, a({}, '👤 Profile')),
123
+ li({}, a({}, '⚙️ Settings')),
124
+ li({}, a({}, '🚪 Logout'))
125
+ )
126
+ )
127
+ );
128
+
129
+ $('#demo').content(drawer);</code></pre>
130
+ </div>
131
+
132
+ <!-- vDOM Syntax -->
133
+ <div id="syntax-vdom" style="display: none;">
134
+ <pre><script>
135
+ examplify(document.currentScript.nextElementSibling, {
136
+ at: document.currentScript.parentElement,
137
+ scripts: ['/lightview.js', '/lightview-x.js'],
138
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
139
+ type: 'module',
140
+ minHeight: 220,
141
+ html: '<div id="demo" style="height: 200px;"></div>'
142
+ });
143
+ </script><code contenteditable="true">await import('/components/layout/drawer.js');
144
+ const { $, tags } = Lightview;
145
+ const { Drawer, ul, li, a, p } = tags;
146
+
147
+ const drawerId = 'my-drawer';
148
+
149
+ const drawer = {
150
+ tag: Drawer,
151
+ attributes: { id: drawerId },
152
+ children: [
153
+ {
154
+ tag: Drawer.Content,
155
+ children: [
156
+ { tag: Drawer.Button, attributes: { for: drawerId }, children: ['Open Drawer'] },
157
+ { tag: p, attributes: { class: 'py-4' }, children: ['Main content area. Click the button to open the drawer.'] }
158
+ ]
159
+ },
160
+ {
161
+ tag: Drawer.Side,
162
+ attributes: { class: 'z-50' },
163
+ children: [
164
+ { tag: Drawer.Overlay, attributes: { for: drawerId } },
165
+ {
166
+ tag: ul,
167
+ attributes: { class: 'menu bg-base-200 text-base-content min-h-full w-64 p-4' },
168
+ children: [
169
+ { tag: li, children: [{ tag: a, children: ['📁 Dashboard'] }] },
170
+ { tag: li, children: [{ tag: a, children: ['👤 Profile'] }] },
171
+ { tag: li, children: [{ tag: a, children: ['⚙️ Settings'] }] },
172
+ { tag: li, children: [{ tag: a, children: ['🚪 Logout'] }] }
173
+ ]
174
+ }
175
+ ]
176
+ }
177
+ ]
178
+ };
179
+
180
+ $('#demo').content(drawer);</code></pre>
181
+ </div>
182
+
183
+ <!-- Object DOM Syntax -->
184
+ <div id="syntax-object" style="display: none;">
185
+ <pre><script>
186
+ examplify(document.currentScript.nextElementSibling, {
187
+ at: document.currentScript.parentElement,
188
+ scripts: ['/lightview.js', '/lightview-x.js'],
189
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
190
+ type: 'module',
191
+ minHeight: 220,
192
+ html: '<div id="demo" style="height: 200px;"></div>'
193
+ });
194
+ </script><code contenteditable="true">await import('/components/layout/drawer.js');
195
+ const { $ } = Lightview;
196
+
197
+ const drawerId = 'my-drawer';
198
+
199
+ const drawer = {
200
+ Drawer: {
201
+ id: drawerId,
202
+ children: [
203
+ {
204
+ 'Drawer.Content': {
205
+ children: [
206
+ { 'Drawer.Button': { for: drawerId, children: ['Open Drawer'] } },
207
+ { p: { class: 'py-4', children: ['Main content area. Click the button to open the drawer.'] } }
208
+ ]
209
+ }
210
+ },
211
+ {
212
+ 'Drawer.Side': {
213
+ class: 'z-50',
214
+ children: [
215
+ { 'Drawer.Overlay': { for: drawerId } },
216
+ {
217
+ ul: {
218
+ class: 'menu bg-base-200 text-base-content min-h-full w-64 p-4',
219
+ children: [
220
+ { li: { children: [{ a: { children: ['📁 Dashboard'] } }] } },
221
+ { li: { children: [{ a: { children: ['👤 Profile'] } }] } },
222
+ { li: { children: [{ a: { children: ['⚙️ Settings'] } }] } },
223
+ { li: { children: [{ a: { children: ['🚪 Logout'] } }] } }
224
+ ]
225
+ }
226
+ }
227
+ ]
228
+ }
229
+ }
230
+ ]
231
+ }
232
+ };
233
+
234
+ $('#demo').content(drawer);</code></pre>
235
+ </div>
236
+ </div>
237
+ </div>
238
+
239
+ <!-- Reactive Example with Examplify -->
240
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
241
+ <div class="card-body">
242
+ <h2 class="card-title">Right Side Drawer</h2>
243
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Drawer opening from the right</p>
244
+
245
+ <!-- Tabs -->
246
+ <script>
247
+ window.switchReactiveSyntaxTab = (tabId) => {
248
+ const tabs = ['tagged', 'vdom', 'object'];
249
+ tabs.forEach(t => {
250
+ const tabEl = document.getElementById(`reactive-tab-btn-${t}`);
251
+ const contentEl = document.getElementById(`reactive-syntax-${t}`);
252
+ if (t === tabId) {
253
+ tabEl.classList.add('syntax-tab-active');
254
+ contentEl.style.display = 'block';
255
+ } else {
256
+ tabEl.classList.remove('syntax-tab-active');
257
+ contentEl.style.display = 'none';
258
+ }
259
+ });
260
+ };
261
+ </script>
262
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
263
+ <button id="reactive-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
264
+ onclick="switchReactiveSyntaxTab('tagged')">Tagged</button>
265
+ <button id="reactive-tab-btn-vdom" role="tab" class="syntax-tab"
266
+ onclick="switchReactiveSyntaxTab('vdom')">vDOM</button>
267
+ <button id="reactive-tab-btn-object" role="tab" class="syntax-tab"
268
+ onclick="switchReactiveSyntaxTab('object')">Object DOM</button>
269
+ </div>
270
+
271
+ <!-- Tagged Syntax -->
272
+ <div id="reactive-syntax-tagged">
273
+ <pre><script>
274
+ examplify(document.currentScript.nextElementSibling, {
275
+ at: document.currentScript.parentElement,
276
+ scripts: ['/lightview.js', '/lightview-x.js'],
277
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
278
+ type: 'module',
279
+ minHeight: 220,
280
+ html: '<div id="demo" style="height: 200px;"></div>'
281
+ });
282
+ </script><code contenteditable="true">await import('/components/layout/drawer.js');
283
+ await import('/components/actions/button.js');
284
+
285
+ const { tags, $ } = Lightview;
286
+ const { ul, li, a, div, p, h3, Drawer, Button } = tags;
287
+
288
+ const drawerId = 'cart-drawer';
289
+
290
+ const drawer = Drawer({ id: drawerId, end: true },
291
+ Drawer.Content({},
292
+ Drawer.Button({ for: drawerId, class: 'btn-accent' }, '🛒 View Cart')
293
+ ),
294
+ Drawer.Side({ class: 'z-50' },
295
+ Drawer.Overlay({ for: drawerId }),
296
+ div({ class: 'bg-base-200 text-base-content min-h-full w-80 p-4' },
297
+ h3({ class: 'text-lg font-bold mb-4' }, '🛒 Shopping Cart'),
298
+ div({ class: 'divider' }),
299
+ p({ class: 'opacity-70' }, 'Your cart is empty'),
300
+ div({ class: 'mt-4' },
301
+ Button({ color: 'primary', class: 'w-full' }, 'Checkout')
302
+ )
303
+ )
304
+ )
305
+ );
306
+
307
+ $('#demo').content(drawer);</code></pre>
308
+ </div>
309
+
310
+ <!-- vDOM Syntax -->
311
+ <div id="reactive-syntax-vdom" style="display: none;">
312
+ <pre><script>
313
+ examplify(document.currentScript.nextElementSibling, {
314
+ at: document.currentScript.parentElement,
315
+ scripts: ['/lightview.js', '/lightview-x.js'],
316
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
317
+ type: 'module',
318
+ minHeight: 220,
319
+ html: '<div id="demo" style="height: 200px;"></div>'
320
+ });
321
+ </script><code contenteditable="true">await import('/components/layout/drawer.js');
322
+ await import('/components/actions/button.js');
323
+ const { $, tags } = Lightview;
324
+ const { Drawer, Button, div, h3, p } = tags;
325
+
326
+ const drawerId = 'cart-drawer';
327
+
328
+ const drawer = {
329
+ tag: Drawer,
330
+ attributes: { id: drawerId, end: true },
331
+ children: [
332
+ {
333
+ tag: Drawer.Content,
334
+ children: [
335
+ { tag: Drawer.Button, attributes: { for: drawerId, class: 'btn-accent' }, children: ['🛒 View Cart'] }
336
+ ]
337
+ },
338
+ {
339
+ tag: Drawer.Side,
340
+ attributes: { class: 'z-50' },
341
+ children: [
342
+ { tag: Drawer.Overlay, attributes: { for: drawerId } },
343
+ {
344
+ tag: div,
345
+ attributes: { class: 'bg-base-200 text-base-content min-h-full w-80 p-4' },
346
+ children: [
347
+ { tag: h3, attributes: { class: 'text-lg font-bold mb-4' }, children: ['🛒 Shopping Cart'] },
348
+ { tag: div, attributes: { class: 'divider' } },
349
+ { tag: p, attributes: { class: 'opacity-70' }, children: ['Your cart is empty'] },
350
+ {
351
+ tag: div,
352
+ attributes: { class: 'mt-4' },
353
+ children: [
354
+ { tag: Button, attributes: { color: 'primary', class: 'w-full' }, children: ['Checkout'] }
355
+ ]
356
+ }
357
+ ]
358
+ }
359
+ ]
360
+ }
361
+ ]
362
+ };
363
+
364
+ $('#demo').content(drawer);</code></pre>
365
+ </div>
366
+
367
+ <!-- Object DOM Syntax -->
368
+ <div id="reactive-syntax-object" style="display: none;">
369
+ <pre><script>
370
+ examplify(document.currentScript.nextElementSibling, {
371
+ at: document.currentScript.parentElement,
372
+ scripts: ['/lightview.js', '/lightview-x.js'],
373
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
374
+ type: 'module',
375
+ minHeight: 220,
376
+ html: '<div id="demo" style="height: 200px;"></div>'
377
+ });
378
+ </script><code contenteditable="true">await import('/components/layout/drawer.js');
379
+ await import('/components/actions/button.js');
380
+ const { $ } = Lightview;
381
+
382
+ const drawerId = 'cart-drawer';
383
+
384
+ const drawer = {
385
+ Drawer: {
386
+ id: drawerId,
387
+ end: true,
388
+ children: [
389
+ {
390
+ 'Drawer.Content': {
391
+ children: [
392
+ { 'Drawer.Button': { for: drawerId, class: 'btn-accent', children: ['🛒 View Cart'] } }
393
+ ]
394
+ }
395
+ },
396
+ {
397
+ 'Drawer.Side': {
398
+ class: 'z-50',
399
+ children: [
400
+ { 'Drawer.Overlay': { for: drawerId } },
401
+ {
402
+ div: {
403
+ class: 'bg-base-200 text-base-content min-h-full w-80 p-4',
404
+ children: [
405
+ { h3: { class: 'text-lg font-bold mb-4', children: ['🛒 Shopping Cart'] } },
406
+ { div: { class: 'divider' } },
407
+ { p: { class: 'opacity-70', children: ['Your cart is empty'] } },
408
+ {
409
+ div: {
410
+ class: 'mt-4',
411
+ children: [{ Button: { color: 'primary', class: 'w-full', children: ['Checkout'] } }]
412
+ }
413
+ }
414
+ ]
415
+ }
416
+ }
417
+ ]
418
+ }
419
+ }
420
+ ]
421
+ }
422
+ };
423
+
424
+ $('#demo').content(drawer);</code></pre>
425
+ </div>
426
+ </div>
427
+ </div>
428
+
429
+ <!-- Props Table -->
430
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Props</h2>
431
+ <div style="overflow-x: auto; margin-bottom: 2rem;">
432
+ <table class="table table-zebra">
433
+ <thead>
434
+ <tr>
435
+ <th>Prop</th>
436
+ <th>Type</th>
437
+ <th>Default</th>
438
+ <th>Description</th>
439
+ </tr>
440
+ </thead>
441
+ <tbody>
442
+ <tr>
443
+ <td><code>id</code></td>
444
+ <td>string</td>
445
+ <td>auto</td>
446
+ <td>Unique ID for the drawer toggle</td>
447
+ </tr>
448
+ <tr>
449
+ <td><code>open</code></td>
450
+ <td>boolean | function</td>
451
+ <td>false</td>
452
+ <td>Control open state (reactive)</td>
453
+ </tr>
454
+ <tr>
455
+ <td><code>end</code></td>
456
+ <td>boolean</td>
457
+ <td>false</td>
458
+ <td>Open from right side</td>
459
+ </tr>
460
+ </tbody>
461
+ </table>
462
+ </div>
463
+
464
+ <!-- Sub-components -->
465
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Sub-components</h2>
466
+ <div style="overflow-x: auto; margin-bottom: 2rem;">
467
+ <table class="table table-zebra">
468
+ <thead>
469
+ <tr>
470
+ <th>Component</th>
471
+ <th>Description</th>
472
+ </tr>
473
+ </thead>
474
+ <tbody>
475
+ <tr>
476
+ <td><code>Drawer.Content</code></td>
477
+ <td>Main content area (visible when drawer is closed)</td>
478
+ </tr>
479
+ <tr>
480
+ <td><code>Drawer.Side</code></td>
481
+ <td>Sidebar content container</td>
482
+ </tr>
483
+ <tr>
484
+ <td><code>Drawer.Overlay</code></td>
485
+ <td>Click-to-close overlay backdrop</td>
486
+ </tr>
487
+ <tr>
488
+ <td><code>Drawer.Button</code></td>
489
+ <td>Toggle button to open drawer</td>
490
+ </tr>
491
+ </tbody>
492
+ </table>
493
+ </div>
494
+
495
+ <!-- Static Example -->
496
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Interactive Demo</h2>
497
+ <div class="drawer rounded-lg border border-base-300"
498
+ style="margin-bottom: 2rem; height: 12rem; overflow: hidden;">
499
+ <input id="demo-drawer" type="checkbox" class="drawer-toggle" />
500
+ <div class="drawer-content flex flex-col items-center justify-center">
501
+ <label for="demo-drawer" class="btn btn-primary drawer-button">Open drawer</label>
502
+ </div>
503
+ <div class="drawer-side z-50">
504
+ <label for="demo-drawer" aria-label="close sidebar" class="drawer-overlay"></label>
505
+ <ul class="menu bg-base-200 text-base-content min-h-full w-80 p-4">
506
+ <li><a>Sidebar Item 1</a></li>
507
+ <li><a>Sidebar Item 2</a></li>
508
+ <li><a>Sidebar Item 3</a></li>
509
+ </ul>
510
+ </div>
511
+ </div>
512
+ </div>
513
+ </div>
514
+ </div>
515
+ </div>