lightview 1.8.2 → 2.0.1

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 (262) hide show
  1. package/.codacy/cli.sh +149 -0
  2. package/.codacy/codacy.yaml +15 -0
  3. package/.github/instructions/codacy.instructions.md +72 -0
  4. package/.wranglerignore +21 -0
  5. package/README.md +1330 -19
  6. package/_headers +4 -0
  7. package/build.js +70 -0
  8. package/components/actions/button.js +151 -0
  9. package/components/actions/dropdown.js +120 -0
  10. package/components/actions/modal.js +146 -0
  11. package/components/actions/swap.js +118 -0
  12. package/components/daisyui.js +288 -0
  13. package/components/data-display/accordion.js +128 -0
  14. package/components/data-display/alert.js +112 -0
  15. package/components/data-display/avatar.js +170 -0
  16. package/components/data-display/badge.js +82 -0
  17. package/components/data-display/card.js +151 -0
  18. package/components/data-display/carousel.js +94 -0
  19. package/components/data-display/chart.js +220 -0
  20. package/components/data-display/chat.js +128 -0
  21. package/components/data-display/collapse.js +103 -0
  22. package/components/data-display/countdown.js +69 -0
  23. package/components/data-display/diff.js +111 -0
  24. package/components/data-display/kbd.js +65 -0
  25. package/components/data-display/loading.js +75 -0
  26. package/components/data-display/progress.js +79 -0
  27. package/components/data-display/radial-progress.js +88 -0
  28. package/components/data-display/skeleton.js +66 -0
  29. package/components/data-display/stats.js +159 -0
  30. package/components/data-display/table.js +146 -0
  31. package/components/data-display/timeline.js +146 -0
  32. package/components/data-display/toast.js +72 -0
  33. package/components/data-display/tooltip.js +74 -0
  34. package/components/data-input/checkbox.js +253 -0
  35. package/components/data-input/file-input.js +224 -0
  36. package/components/data-input/input.js +264 -0
  37. package/components/data-input/radio.js +338 -0
  38. package/components/data-input/range.js +204 -0
  39. package/components/data-input/rating.js +219 -0
  40. package/components/data-input/select.js +287 -0
  41. package/components/data-input/textarea.js +287 -0
  42. package/components/data-input/toggle.js +201 -0
  43. package/components/index.js +137 -0
  44. package/components/layout/divider.js +72 -0
  45. package/components/layout/drawer.js +142 -0
  46. package/components/layout/footer.js +100 -0
  47. package/components/layout/hero.js +109 -0
  48. package/components/layout/indicator.js +90 -0
  49. package/components/layout/join.js +78 -0
  50. package/components/layout/navbar.js +110 -0
  51. package/components/navigation/breadcrumbs.js +91 -0
  52. package/components/navigation/dock.js +103 -0
  53. package/components/navigation/menu.js +126 -0
  54. package/components/navigation/pagination.js +105 -0
  55. package/components/navigation/steps.js +89 -0
  56. package/components/navigation/tabs.css +177 -0
  57. package/components/navigation/tabs.js +123 -0
  58. package/components/theme/theme-switch.css +65 -0
  59. package/components/theme/theme-switch.js +177 -0
  60. package/docs/about.html +164 -0
  61. package/docs/api/computed.html +184 -0
  62. package/docs/api/effects.html +173 -0
  63. package/docs/api/elements.html +180 -0
  64. package/docs/api/enhance.html +225 -0
  65. package/docs/api/hypermedia.html +165 -0
  66. package/docs/api/index.html +178 -0
  67. package/docs/api/nav.html +18 -0
  68. package/docs/api/signals.html +136 -0
  69. package/docs/api/state.html +217 -0
  70. package/docs/assets/images/logo-favicon.svg +42 -0
  71. package/docs/assets/images/logo-static.svg +40 -0
  72. package/docs/assets/images/logo.svg +66 -0
  73. package/docs/assets/js/examplify.js +395 -0
  74. package/docs/assets/styles/site.css +1102 -0
  75. package/docs/assets/styles/themes.css +236 -0
  76. package/docs/components/accordion.html +439 -0
  77. package/docs/components/alert.html +528 -0
  78. package/docs/components/avatar.html +586 -0
  79. package/docs/components/badge.html +531 -0
  80. package/docs/components/breadcrumbs.html +278 -0
  81. package/docs/components/button.html +579 -0
  82. package/docs/components/card.html +561 -0
  83. package/docs/components/carousel.html +286 -0
  84. package/docs/components/chart-area.html +702 -0
  85. package/docs/components/chart-bar.html +782 -0
  86. package/docs/components/chart-column.html +735 -0
  87. package/docs/components/chart-line.html +794 -0
  88. package/docs/components/chart-pie.html +823 -0
  89. package/docs/components/chart.html +610 -15
  90. package/docs/components/chat.html +547 -0
  91. package/docs/components/checkbox.html +641 -0
  92. package/docs/components/collapse.html +536 -0
  93. package/docs/components/component-nav.html +53 -0
  94. package/docs/components/countdown.html +470 -0
  95. package/docs/components/diff.html +245 -0
  96. package/docs/components/divider.html +240 -0
  97. package/docs/components/dock.html +277 -0
  98. package/docs/components/drawer.html +515 -0
  99. package/docs/components/dropdown.html +479 -0
  100. package/docs/components/file-input.html +591 -0
  101. package/docs/components/footer.html +301 -0
  102. package/docs/components/gallery.html +504 -0
  103. package/docs/components/hero.html +264 -0
  104. package/docs/components/index.css +840 -0
  105. package/docs/components/index.html +735 -0
  106. package/docs/components/indicator.html +342 -0
  107. package/docs/components/input.html +644 -0
  108. package/docs/components/join.html +285 -0
  109. package/docs/components/kbd.html +322 -0
  110. package/docs/components/loading.html +521 -0
  111. package/docs/components/menu.html +461 -0
  112. package/docs/components/modal.html +639 -0
  113. package/docs/components/navbar.html +321 -0
  114. package/docs/components/pagination.html +279 -0
  115. package/docs/components/progress.html +514 -0
  116. package/docs/components/radial-progress.html +434 -0
  117. package/docs/components/radio.html +655 -0
  118. package/docs/components/range.html +611 -0
  119. package/docs/components/rating.html +642 -0
  120. package/docs/components/select.html +696 -0
  121. package/docs/components/sidebar-setup.js +93 -0
  122. package/docs/components/skeleton.html +447 -0
  123. package/docs/components/spinner.html +68 -0
  124. package/docs/components/stats.html +486 -0
  125. package/docs/components/steps.html +356 -0
  126. package/docs/components/swap.html +517 -0
  127. package/docs/components/switch.html +68 -0
  128. package/docs/components/table.html +668 -0
  129. package/docs/components/tabs.html +506 -0
  130. package/docs/components/text-input.html +68 -0
  131. package/docs/components/textarea.html +603 -0
  132. package/docs/components/timeline.html +485 -42
  133. package/docs/components/toast.html +474 -0
  134. package/docs/components/toggle.html +564 -0
  135. package/docs/components/tooltip.html +423 -0
  136. package/docs/examples/getting-started-example.html +40 -0
  137. package/docs/examples/index.html +93 -0
  138. package/docs/getting-started/index.html +739 -0
  139. package/docs/getting-started/reviews.html +23 -0
  140. package/docs/getting-started/reviews.odom +108 -0
  141. package/docs/getting-started/reviews.vdom +84 -0
  142. package/docs/index.html +132 -42
  143. package/docs/playground.html +416 -0
  144. package/docs/router.html +285 -0
  145. package/docs/styles/index.html +190 -0
  146. package/functions/_middleware.js +32 -0
  147. package/index.html +309 -0
  148. package/lightview-router.js +364 -0
  149. package/lightview-x.js +1577 -0
  150. package/lightview.js +659 -1200
  151. package/middleware/locale.js +25 -0
  152. package/middleware/markdown.js +44 -0
  153. package/middleware/notFound.js +37 -0
  154. package/package.json +27 -41
  155. package/watch.js +92 -0
  156. package/wrangler.toml +12 -0
  157. package/.idea/lightview.iml +0 -12
  158. package/.idea/modules.xml +0 -8
  159. package/.idea/vcs.xml +0 -6
  160. package/LICENSE +0 -21
  161. package/codepen-no-tabs-embed.css +0 -2
  162. package/docs/CNAME +0 -1
  163. package/docs/api.html +0 -674
  164. package/docs/blank.html +0 -10
  165. package/docs/comparedto.html +0 -89
  166. package/docs/components/chart-repl.html +0 -69
  167. package/docs/components/components.js +0 -113
  168. package/docs/components/contents.html +0 -17
  169. package/docs/components/gantt-repl.html +0 -61
  170. package/docs/components/gantt.html +0 -42
  171. package/docs/components/gauge-repl.html +0 -66
  172. package/docs/components/gauge.html +0 -20
  173. package/docs/components/orgchart-repl.html +0 -64
  174. package/docs/components/orgchart.html +0 -41
  175. package/docs/components/repl-as-src.html +0 -17
  176. package/docs/components/repl-repl.html +0 -95
  177. package/docs/components/repl.html +0 -527
  178. package/docs/components/timeline-repl.html +0 -72
  179. package/docs/components.html +0 -14
  180. package/docs/css/highlightjs.min.css +0 -9
  181. package/docs/css/tutorial.css +0 -35
  182. package/docs/examples/anchor.html +0 -11
  183. package/docs/examples/chart.html +0 -34
  184. package/docs/examples/counter.html +0 -26
  185. package/docs/examples/counter.test.mjs +0 -47
  186. package/docs/examples/counter2.html +0 -26
  187. package/docs/examples/directives.html +0 -79
  188. package/docs/examples/foreign.html +0 -50
  189. package/docs/examples/forgeinform.html +0 -98
  190. package/docs/examples/form.html +0 -61
  191. package/docs/examples/gauge.html +0 -18
  192. package/docs/examples/invalid-template-literals.html +0 -44
  193. package/docs/examples/medium/remote.html +0 -60
  194. package/docs/examples/message.html +0 -18
  195. package/docs/examples/nested.html +0 -11
  196. package/docs/examples/object-bound-form.html +0 -34
  197. package/docs/examples/remote-server.js +0 -51
  198. package/docs/examples/remote.html +0 -34
  199. package/docs/examples/remote.json +0 -1
  200. package/docs/examples/scratch.html +0 -69
  201. package/docs/examples/sensors/index.html +0 -44
  202. package/docs/examples/sensors/sensor-server.js +0 -30
  203. package/docs/examples/shared.html +0 -41
  204. package/docs/examples/template.html +0 -33
  205. package/docs/examples/timeline.html +0 -21
  206. package/docs/examples/todo.html +0 -40
  207. package/docs/examples/top.html +0 -10
  208. package/docs/examples/types.html +0 -94
  209. package/docs/examples/xor.html +0 -62
  210. package/docs/examples.html +0 -25
  211. package/docs/javascript/codejar.min.js +0 -8
  212. package/docs/javascript/highlightjs.min.js +0 -1173
  213. package/docs/javascript/isomorphic-git.js +0 -9
  214. package/docs/javascript/json5.min.js +0 -1
  215. package/docs/javascript/lightning-fs.js +0 -1
  216. package/docs/javascript/lightview.js +0 -1285
  217. package/docs/javascript/marked.min.js +0 -6
  218. package/docs/javascript/peerjs.min.js +0 -70
  219. package/docs/javascript/turndown.js +0 -973
  220. package/docs/javascript/types.js +0 -606
  221. package/docs/javascript/utils.js +0 -45
  222. package/docs/lightview.html +0 -63
  223. package/docs/old_index.html +0 -965
  224. package/docs/old_index.md +0 -1132
  225. package/docs/slidein.html +0 -51
  226. package/docs/tutorial/0-getting-started.html +0 -67
  227. package/docs/tutorial/1-intro-to-variables.html +0 -103
  228. package/docs/tutorial/10-template-components.html +0 -80
  229. package/docs/tutorial/11-linked-components.html +0 -76
  230. package/docs/tutorial/12-imported-components.html +0 -67
  231. package/docs/tutorial/13-input-binding.html +0 -94
  232. package/docs/tutorial/14-automatic-variable-creation.html +0 -74
  233. package/docs/tutorial/15-form-binding.html +0 -110
  234. package/docs/tutorial/16-if-directive.html +0 -60
  235. package/docs/tutorial/17-loop-directives.html +0 -83
  236. package/docs/tutorial/18-sanitizing-and-escaping-input.html +0 -79
  237. package/docs/tutorial/2-imported-and-exported-variables.html +0 -80
  238. package/docs/tutorial/3-data-types.html +0 -89
  239. package/docs/tutorial/4-extended-data-types.html +0 -83
  240. package/docs/tutorial/5-extended-functional-types.html +0 -96
  241. package/docs/tutorial/5.1-extended-functional-types.html +0 -79
  242. package/docs/tutorial/5.2-extended-functional-types.html +0 -70
  243. package/docs/tutorial/6-conventional-javascript.html +0 -75
  244. package/docs/tutorial/7-monitoring-with-observers.html +0 -107
  245. package/docs/tutorial/8-event-listeners.html +0 -65
  246. package/docs/tutorial/9-intro-to-components.html +0 -91
  247. package/docs/tutorial/contents.html +0 -32
  248. package/docs/tutorial/my-component.html +0 -29
  249. package/docs/tutorial/remote-value.json +0 -4
  250. package/docs/websiterepl.html +0 -46
  251. package/jest-puppeteer.config.js +0 -5
  252. package/jest.config.json +0 -12
  253. package/lightview.min.js +0 -1
  254. package/lightview_good.js +0 -1267
  255. package/lightview_optimized.js +0 -1274
  256. package/repl_hold.html +0 -320
  257. package/test/basic.html +0 -104
  258. package/test/basic.test.mjs +0 -315
  259. package/test/extended.html +0 -29
  260. package/test/extended.test.mjs +0 -448
  261. package/types.js +0 -607
  262. package/unsplash.key +0 -1
@@ -0,0 +1,641 @@
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: 'Checkbox' }
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">Checkbox</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
+ Checkbox allows the user to select one or multiple items from a set.
61
+ Supports labels, descriptions, validation, and reactive state binding.
62
+ </p>
63
+
64
+ <!-- Basic Examples -->
65
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
66
+ <div class="card-body">
67
+ <h2 class="card-title">Basic Examples</h2>
68
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Simple checkboxes with various
69
+ configurations</p>
70
+
71
+ <!-- Tabs -->
72
+ <script>
73
+ window.switchSyntaxTab = (tabId) => {
74
+ const tabs = ['tagged', 'vdom', 'object', 'html'];
75
+ tabs.forEach(t => {
76
+ const tabEl = document.getElementById(`tab-btn-${t}`);
77
+ const contentEl = document.getElementById(`syntax-${t}`);
78
+ if (t === tabId) {
79
+ tabEl.classList.add('syntax-tab-active');
80
+ contentEl.style.display = 'block';
81
+ } else {
82
+ tabEl.classList.remove('syntax-tab-active');
83
+ contentEl.style.display = 'none';
84
+ }
85
+ });
86
+ };
87
+ </script>
88
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
89
+ <button id="tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
90
+ onclick="switchSyntaxTab('tagged')">Tagged</button>
91
+ <button id="tab-btn-vdom" role="tab" class="syntax-tab"
92
+ onclick="switchSyntaxTab('vdom')">vDOM</button>
93
+ <button id="tab-btn-object" role="tab" class="syntax-tab"
94
+ onclick="switchSyntaxTab('object')">Object
95
+ DOM</button>
96
+ <button id="tab-btn-html" role="tab" class="syntax-tab"
97
+ onclick="switchSyntaxTab('html')">HTML</button>
98
+ </div>
99
+
100
+ <!-- Tagged Syntax -->
101
+ <div id="syntax-tagged">
102
+ <pre><script>
103
+ examplify(document.currentScript.nextElementSibling, {
104
+ at: document.currentScript.parentElement,
105
+ scripts: ['/lightview.js', '/lightview-x.js'],
106
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
107
+ type: 'module',
108
+ minHeight: 100,
109
+ autoRun: true
110
+ });
111
+ </script><code contenteditable="true">await import('/components/data-input/checkbox.js');
112
+ const { tags, $ } = Lightview;
113
+ const { div, Checkbox } = tags;
114
+
115
+ // 1. Basic checkbox
116
+ const basic = Checkbox({
117
+ label: 'Remember me'
118
+ });
119
+
120
+ // 2. Checkbox with description
121
+ const withDesc = Checkbox({
122
+ label: 'Subscribe to newsletter',
123
+ description: 'Get weekly updates on new features',
124
+ color: 'primary'
125
+ });
126
+
127
+ // 3. Required checkbox
128
+ const required = Checkbox({
129
+ label: 'I agree to the terms and conditions',
130
+ required: true
131
+ });
132
+
133
+ // 4. Pre-checked disabled checkbox
134
+ const disabled = Checkbox({
135
+ label: 'This option is locked',
136
+ defaultChecked: true,
137
+ disabled: true
138
+ });
139
+
140
+ // Insert all examples
141
+ $('#example').content(
142
+ div({ style: 'display: flex; flex-direction: column; gap: 1rem;' }, basic, withDesc, required, disabled)
143
+ );</code></pre>
144
+ </div>
145
+
146
+ <!-- vDOM Syntax -->
147
+ <div id="syntax-vdom" style="display: none;">
148
+ <pre><script>
149
+ examplify(document.currentScript.nextElementSibling, {
150
+ at: document.currentScript.parentElement,
151
+ scripts: ['/lightview.js', '/lightview-x.js'],
152
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
153
+ type: 'module',
154
+ minHeight: 100
155
+ });
156
+ </script><code contenteditable="true">await import('/components/data-input/checkbox.js');
157
+ const { $, tags } = Lightview;
158
+ const { Checkbox, div } = tags;
159
+
160
+ const basic = {
161
+ tag: Checkbox,
162
+ attributes: { label: 'Remember me' }
163
+ };
164
+
165
+ const withDesc = {
166
+ tag: Checkbox,
167
+ attributes: {
168
+ label: 'Subscribe to newsletter',
169
+ description: 'Get weekly updates on new features',
170
+ color: 'primary'
171
+ }
172
+ };
173
+
174
+ const required = {
175
+ tag: Checkbox,
176
+ attributes: {
177
+ label: 'I agree to the terms and conditions',
178
+ required: true
179
+ }
180
+ };
181
+
182
+ const disabled = {
183
+ tag: Checkbox,
184
+ attributes: {
185
+ label: 'This option is locked',
186
+ defaultChecked: true,
187
+ disabled: true
188
+ }
189
+ };
190
+
191
+ $('#example').content({
192
+ tag: div,
193
+ attributes: { style: 'display: flex; flex-direction: column; gap: 1rem;' },
194
+ children: [basic, withDesc, required, disabled]
195
+ });</code></pre>
196
+ </div>
197
+
198
+ <!-- Object DOM Syntax -->
199
+ <div id="syntax-object" style="display: none;">
200
+ <pre><script>
201
+ examplify(document.currentScript.nextElementSibling, {
202
+ at: document.currentScript.parentElement,
203
+ scripts: ['/lightview.js', '/lightview-x.js'],
204
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
205
+ type: 'module',
206
+ minHeight: 100
207
+ });
208
+ </script><code contenteditable="true">await import('/components/data-input/checkbox.js');
209
+ const { tags, $ } = Lightview;
210
+
211
+ $('#example').content({
212
+ div: {
213
+ style: 'display: flex; flex-direction: column; gap: 1rem;',
214
+ children: [
215
+ { Checkbox: { label: 'Remember me' } },
216
+ {
217
+ Checkbox: {
218
+ label: 'Subscribe to newsletter',
219
+ description: 'Get weekly updates on new features',
220
+ color: 'primary'
221
+ }
222
+ },
223
+ {
224
+ Checkbox: {
225
+ label: 'I agree to the terms and conditions',
226
+ required: true
227
+ }
228
+ },
229
+ {
230
+ Checkbox: {
231
+ label: 'This option is locked',
232
+ defaultChecked: true,
233
+ disabled: true
234
+ }
235
+ }
236
+ ]
237
+ }
238
+ });</code></pre>
239
+ </div>
240
+
241
+ <!-- HTML Syntax -->
242
+ <div id="syntax-html" style="display: none;">
243
+ <pre><script>
244
+ examplify(document.currentScript.nextElementSibling, {
245
+ at: document.currentScript.parentElement,
246
+ scripts: ['/lightview.js', '/lightview-x.js'],
247
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
248
+ type: 'module',
249
+ language: 'html',
250
+ minHeight: 100
251
+ });
252
+ </script><code contenteditable="true" class="language-html">&lt;!-- Import the component (registers lv-checkbox) --&gt;
253
+ &lt;script type="module" src="/components/data-input/checkbox.js"&gt;&lt;/script&gt;
254
+
255
+ &lt;div style="display: flex; flex-direction: column; gap: 1rem;"&gt;
256
+ &lt;lv-checkbox label="Remember me"&gt;&lt;/lv-checkbox&gt;
257
+ &lt;lv-checkbox label="Subscribe to newsletter" description="Get weekly updates on new features" color="primary"&gt;&lt;/lv-checkbox&gt;
258
+ &lt;lv-checkbox label="I agree to the terms and conditions" required&gt;&lt;/lv-checkbox&gt;
259
+ &lt;lv-checkbox label="This option is locked" default-checked disabled&gt;&lt;/lv-checkbox&gt;
260
+ &lt;/div&gt;</code></pre>
261
+ </div>
262
+ </div>
263
+ </div>
264
+
265
+ <!-- Reactive Example -->
266
+ <div
267
+ style="background-color: oklch(var(--b2)); border-radius: var(--rounded-box, 1rem); box-shadow: var(--shadow-2, 0 25px 50px -12px rgba(0,0,0,0.25)); margin-bottom: 2rem;">
268
+ <div style="padding: var(--padding-card, 2rem);">
269
+ <h2 style="font-size: 1.5rem; font-weight: 600; line-height: 2rem; margin-bottom: 0.5rem;">
270
+ Reactive Example</h2>
271
+ <p style="font-size: 0.875rem; opacity: 0.7; margin-bottom: 1rem;">Two-way binding with
272
+ signals
273
+ and live
274
+ validation</p>
275
+
276
+ <!-- Tabs -->
277
+ <script>
278
+ window.switchReactiveSyntaxTab = (tabId) => {
279
+ const tabs = ['tagged', 'vdom', 'object'];
280
+ tabs.forEach(t => {
281
+ const tabEl = document.getElementById(`reactive-tab-btn-${t}`);
282
+ const contentEl = document.getElementById(`reactive-syntax-${t}`);
283
+ if (t === tabId) {
284
+ tabEl.classList.add('syntax-tab-active');
285
+ contentEl.style.display = 'block';
286
+ } else {
287
+ tabEl.classList.remove('syntax-tab-active');
288
+ contentEl.style.display = 'none';
289
+ }
290
+ });
291
+ };
292
+ </script>
293
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
294
+ <button id="reactive-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
295
+ onclick="switchReactiveSyntaxTab('tagged')">Tagged</button>
296
+ <button id="reactive-tab-btn-vdom" role="tab" class="syntax-tab"
297
+ onclick="switchReactiveSyntaxTab('vdom')">vDOM</button>
298
+ <button id="reactive-tab-btn-object" role="tab" class="syntax-tab"
299
+ onclick="switchReactiveSyntaxTab('object')">Object DOM</button>
300
+ </div>
301
+
302
+ <!-- Tagged Syntax -->
303
+ <div id="reactive-syntax-tagged">
304
+ <pre><script>
305
+ examplify(document.currentScript.nextElementSibling, {
306
+ at: document.currentScript.parentElement,
307
+ scripts: ['/lightview.js', '/lightview-x.js'],
308
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
309
+ type: 'module',
310
+ minHeight: 320
311
+ });
312
+ </script><code contenteditable="true">await import('/components/data-input/checkbox.js');
313
+ const { signal, tags, $ } = Lightview;
314
+ const { div, p, span, button, Checkbox } = tags;
315
+
316
+ // Signals for checkboxes
317
+ const notifications = signal(true);
318
+ const marketing = signal(false);
319
+ const termsAccepted = signal(false);
320
+
321
+ // Reactive demo
322
+ const reactiveDemo = div({ style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 28rem;' },
323
+ Checkbox({
324
+ label: 'Email Notifications',
325
+ description: 'Receive important updates via email',
326
+ checked: notifications,
327
+ color: 'primary'
328
+ }),
329
+ Checkbox({
330
+ label: 'Marketing Emails',
331
+ description: 'Promotional content and offers',
332
+ checked: marketing,
333
+ color: 'secondary'
334
+ }),
335
+ Checkbox({
336
+ label: 'Accept Terms & Conditions',
337
+ checked: termsAccepted,
338
+ required: true,
339
+ color: 'accent',
340
+ validate: (checked) => !checked ? 'You must accept the terms' : null
341
+ }),
342
+ div({ style: 'padding-top: 1rem; border-top: 1px solid oklch(var(--b3));' },
343
+ p({ style: 'font-size: 0.875rem; font-family: monospace;' },
344
+ () => `Notifications: ${notifications.value}, Marketing: ${marketing.value}`
345
+ ),
346
+ button({
347
+ class: 'btn btn-primary',
348
+ style: () => `margin-top: 0.5rem; ${termsAccepted.value ? '' : 'opacity: 0.5; pointer-events: none;'}`,
349
+ disabled: () => !termsAccepted.value
350
+ }, 'Submit')
351
+ )
352
+ );
353
+
354
+ $('#example').content(reactiveDemo);</code></pre>
355
+ </div>
356
+
357
+ <!-- vDOM Syntax -->
358
+ <div id="reactive-syntax-vdom" style="display: none;">
359
+ <pre><script>
360
+ examplify(document.currentScript.nextElementSibling, {
361
+ at: document.currentScript.parentElement,
362
+ scripts: ['/lightview.js', '/lightview-x.js'],
363
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
364
+ type: 'module',
365
+ minHeight: 320
366
+ });
367
+ </script><code contenteditable="true">await import('/components/data-input/checkbox.js');
368
+ const { signal, $, tags } = Lightview;
369
+ const { Checkbox, div, p, button } = tags;
370
+
371
+ const notifications = signal(true);
372
+ const marketing = signal(false);
373
+ const termsAccepted = signal(false);
374
+
375
+ const reactiveDemo = {
376
+ tag: div,
377
+ attributes: { style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 28rem;' },
378
+ children: [
379
+ {
380
+ tag: Checkbox,
381
+ attributes: {
382
+ label: 'Email Notifications',
383
+ description: 'Receive important updates via email',
384
+ checked: notifications,
385
+ color: 'primary'
386
+ }
387
+ },
388
+ {
389
+ tag: Checkbox,
390
+ attributes: {
391
+ label: 'Marketing Emails',
392
+ description: 'Promotional content and offers',
393
+ checked: marketing,
394
+ color: 'secondary'
395
+ }
396
+ },
397
+ {
398
+ tag: Checkbox,
399
+ attributes: {
400
+ label: 'Accept Terms & Conditions',
401
+ checked: termsAccepted,
402
+ required: true,
403
+ color: 'accent',
404
+ validate: (checked) => !checked ? 'You must accept the terms' : null
405
+ }
406
+ },
407
+ {
408
+ tag: div,
409
+ attributes: { style: 'padding-top: 1rem; border-top: 1px solid oklch(var(--b3));' },
410
+ children: [
411
+ {
412
+ tag: p,
413
+ attributes: { style: 'font-size: 0.875rem; font-family: monospace;' },
414
+ children: [
415
+ () => `Notifications: ${notifications.value}, Marketing: ${marketing.value}`
416
+ ]
417
+ },
418
+ {
419
+ tag: button,
420
+ attributes: {
421
+ class: 'btn btn-primary',
422
+ style: () => `margin-top: 0.5rem; ${termsAccepted.value ? '' : 'opacity: 0.5; pointer-events: none;'}`,
423
+ disabled: () => !termsAccepted.value
424
+ },
425
+ children: ['Submit']
426
+ }
427
+ ]
428
+ }
429
+ ]
430
+ };
431
+
432
+ $('#example').content(reactiveDemo);</code></pre>
433
+ </div>
434
+
435
+ <!-- Object DOM Syntax -->
436
+ <div id="reactive-syntax-object" style="display: none;">
437
+ <pre><script>
438
+ examplify(document.currentScript.nextElementSibling, {
439
+ at: document.currentScript.parentElement,
440
+ scripts: ['/lightview.js', '/lightview-x.js'],
441
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
442
+ type: 'module',
443
+ minHeight: 320
444
+ });
445
+ </script><code contenteditable="true">await import('/components/data-input/checkbox.js');
446
+ const { signal, tags, $ } = Lightview;
447
+
448
+ const notifications = signal(true);
449
+ const marketing = signal(false);
450
+ const termsAccepted = signal(false);
451
+
452
+ const reactiveDemo = {
453
+ div: {
454
+ style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 28rem;',
455
+ children: [
456
+ {
457
+ Checkbox: {
458
+ label: 'Email Notifications',
459
+ description: 'Receive important updates via email',
460
+ checked: notifications,
461
+ color: 'primary'
462
+ }
463
+ },
464
+ {
465
+ Checkbox: {
466
+ label: 'Marketing Emails',
467
+ description: 'Promotional content and offers',
468
+ checked: marketing,
469
+ color: 'secondary'
470
+ }
471
+ },
472
+ {
473
+ Checkbox: {
474
+ label: 'Accept Terms & Conditions',
475
+ checked: termsAccepted,
476
+ required: true,
477
+ color: 'accent',
478
+ validate: (checked) => !checked ? 'You must accept the terms' : null
479
+ }
480
+ },
481
+ {
482
+ div: {
483
+ style: 'padding-top: 1rem; border-top: 1px solid oklch(var(--b3));',
484
+ children: [
485
+ {
486
+ p: {
487
+ style: 'font-size: 0.875rem; font-family: monospace;',
488
+ text: () => `Notifications: ${notifications.value}, Marketing: ${marketing.value}`
489
+ }
490
+ },
491
+ {
492
+ button: {
493
+ class: 'btn btn-primary',
494
+ style: () => `margin-top: 0.5rem; ${termsAccepted.value ? '' : 'opacity: 0.5; pointer-events: none;'}`,
495
+ disabled: () => !termsAccepted.value,
496
+ text: 'Submit'
497
+ }
498
+ }
499
+ ]
500
+ }
501
+ }
502
+ ]
503
+ }
504
+ };
505
+
506
+ $('#example').content(reactiveDemo);</code></pre>
507
+ </div>
508
+ </div>
509
+ </div>
510
+
511
+ <!-- Props Table -->
512
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Props</h2>
513
+ <div style="overflow-x: auto; margin-bottom: 2rem;">
514
+ <table class="table table-zebra">
515
+ <thead>
516
+ <tr>
517
+ <th>Prop</th>
518
+ <th>Type</th>
519
+ <th>Default</th>
520
+ <th>Description</th>
521
+ </tr>
522
+ </thead>
523
+ <tbody>
524
+ <tr>
525
+ <td><code>checked</code></td>
526
+ <td>boolean | signal</td>
527
+ <td>-</td>
528
+ <td>Checked state (reactive with signals)</td>
529
+ </tr>
530
+ <tr>
531
+ <td><code>defaultChecked</code></td>
532
+ <td>boolean</td>
533
+ <td>false</td>
534
+ <td>Default checked state for uncontrolled mode</td>
535
+ </tr>
536
+ <tr>
537
+ <td><code>indeterminate</code></td>
538
+ <td>boolean</td>
539
+ <td>false</td>
540
+ <td>Indeterminate (partial) state</td>
541
+ </tr>
542
+ <tr>
543
+ <td><code>label</code></td>
544
+ <td>string</td>
545
+ <td>-</td>
546
+ <td>Label text displayed next to checkbox</td>
547
+ </tr>
548
+ <tr>
549
+ <td><code>description</code></td>
550
+ <td>string</td>
551
+ <td>-</td>
552
+ <td>Description text below the label</td>
553
+ </tr>
554
+ <tr>
555
+ <td><code>error</code></td>
556
+ <td>string | function</td>
557
+ <td>-</td>
558
+ <td>Error message or reactive error function</td>
559
+ </tr>
560
+ <tr>
561
+ <td><code>validate</code></td>
562
+ <td>function</td>
563
+ <td>-</td>
564
+ <td>Validation function: <code>(checked) => errorMessage | null</code></td>
565
+ </tr>
566
+ <tr>
567
+ <td><code>color</code></td>
568
+ <td>string</td>
569
+ <td>-</td>
570
+ <td>'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'
571
+ </td>
572
+ </tr>
573
+ <tr>
574
+ <td><code>size</code></td>
575
+ <td>string</td>
576
+ <td>'md'</td>
577
+ <td>'xs' | 'sm' | 'md' | 'lg'</td>
578
+ </tr>
579
+ <tr>
580
+ <td><code>disabled</code></td>
581
+ <td>boolean</td>
582
+ <td>false</td>
583
+ <td>Disable the checkbox</td>
584
+ </tr>
585
+ <tr>
586
+ <td><code>required</code></td>
587
+ <td>boolean</td>
588
+ <td>false</td>
589
+ <td>Mark as required field (shows asterisk)</td>
590
+ </tr>
591
+ <tr>
592
+ <td><code>onChange</code></td>
593
+ <td>function</td>
594
+ <td>-</td>
595
+ <td>Callback when value changes: <code>(checked, event) => void</code></td>
596
+ </tr>
597
+ <tr>
598
+ <td><code>useShadow</code></td>
599
+ <td>boolean</td>
600
+ <td>*</td>
601
+ <td>Render in Shadow DOM. *Follows global <code>initComponents()</code> setting</td>
602
+ </tr>
603
+ </tbody>
604
+ </table>
605
+ </div>
606
+
607
+ <!-- Colors Example -->
608
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Colors</h2>
609
+ <div style="display: flex; gap: 0.5rem; margin-bottom: 2rem;">
610
+ <input type="checkbox" class="checkbox" checked />
611
+ <input type="checkbox" class="checkbox checkbox-primary" checked />
612
+ <input type="checkbox" class="checkbox checkbox-secondary" checked />
613
+ <input type="checkbox" class="checkbox checkbox-accent" checked />
614
+ <input type="checkbox" class="checkbox checkbox-success" checked />
615
+ <input type="checkbox" class="checkbox checkbox-warning" checked />
616
+ <input type="checkbox" class="checkbox checkbox-info" checked />
617
+ <input type="checkbox" class="checkbox checkbox-error" checked />
618
+ </div>
619
+
620
+ <!-- Sizes Example -->
621
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Sizes</h2>
622
+ <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 2rem;">
623
+ <input type="checkbox" class="checkbox checkbox-xs" checked />
624
+ <input type="checkbox" class="checkbox checkbox-sm" checked />
625
+ <input type="checkbox" class="checkbox checkbox-md" checked />
626
+ <input type="checkbox" class="checkbox checkbox-lg" checked />
627
+ </div>
628
+
629
+ <!-- With Label -->
630
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">With Label</h2>
631
+ <div style="display: flex; flex-direction: column; width: 13rem; margin-bottom: 2rem;">
632
+ <label
633
+ style="display: flex; align-items: center; justify-content: space-between; cursor: pointer; padding: 0.5rem 0;">
634
+ <span style="font-size: 0.875rem;">Remember me</span>
635
+ <input type="checkbox" class="checkbox checkbox-primary" />
636
+ </label>
637
+ </div>
638
+ </div>
639
+ </div>
640
+ </div>
641
+ </div>