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,611 @@
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: 'Range' }
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">Range</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
+ Range slider allows the user to select a value from a range.
61
+ Supports labels, value display, and reactive state binding.
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 Examples</h2>
68
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Range sliders with various
69
+ configurations
70
+ </p>
71
+
72
+ <!-- Tabs -->
73
+ <script>
74
+ window.switchSyntaxTab = (tabId) => {
75
+ const tabs = ['tagged', 'vdom', 'object'];
76
+ tabs.forEach(t => {
77
+ const tabEl = document.getElementById(`tab-btn-${t}`);
78
+ const contentEl = document.getElementById(`syntax-${t}`);
79
+ if (t === tabId) {
80
+ tabEl.classList.add('syntax-tab-active');
81
+ contentEl.style.display = 'block';
82
+ } else {
83
+ tabEl.classList.remove('syntax-tab-active');
84
+ contentEl.style.display = 'none';
85
+ }
86
+ });
87
+ };
88
+ </script>
89
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
90
+ <button id="tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
91
+ onclick="switchSyntaxTab('tagged')">Tagged</button>
92
+ <button id="tab-btn-vdom" role="tab" class="syntax-tab"
93
+ onclick="switchSyntaxTab('vdom')">vDOM</button>
94
+ <button id="tab-btn-object" role="tab" class="syntax-tab"
95
+ onclick="switchSyntaxTab('object')">Object
96
+ DOM</button>
97
+ </div>
98
+
99
+ <!-- Tagged Syntax -->
100
+ <div id="syntax-tagged">
101
+ <pre><script>
102
+ examplify(document.currentScript.nextElementSibling, {
103
+ at: document.currentScript.parentElement,
104
+ scripts: ['/lightview.js', '/lightview-x.js'],
105
+ type: 'module',
106
+ minHeight: 220,
107
+ autoRun: true
108
+ });
109
+ </script><code contenteditable="true">const { default: Range } = await import('/components/data-input/range.js');
110
+ const { tags, $ } = Lightview;
111
+ const { div } = tags;
112
+
113
+ // 1. Basic range
114
+ const basic = Range({
115
+ min: 0,
116
+ max: 100,
117
+ defaultValue: 50
118
+ });
119
+
120
+ // 2. Range with label and value display
121
+ const withLabel = Range({
122
+ label: 'Volume',
123
+ min: 0,
124
+ max: 100,
125
+ defaultValue: 75,
126
+ showValue: true,
127
+ color: 'primary'
128
+ });
129
+
130
+ // 3. Range with custom formatting
131
+ const formatted = Range({
132
+ label: 'Price Range',
133
+ min: 0,
134
+ max: 1000,
135
+ step: 50,
136
+ defaultValue: 500,
137
+ showValue: true,
138
+ formatValue: (v) => `$${v}`,
139
+ color: 'accent'
140
+ });
141
+
142
+ // Insert all examples
143
+ $('#example').content(
144
+ div({ style: 'display: flex; flex-direction: column; gap: 1.5rem; max-width: 28rem' }, basic, withLabel, formatted)
145
+ );</code></pre>
146
+ </div>
147
+
148
+ <!-- vDOM Syntax -->
149
+ <div id="syntax-vdom" style="display: none;">
150
+ <pre><script>
151
+ examplify(document.currentScript.nextElementSibling, {
152
+ at: document.currentScript.parentElement,
153
+ scripts: ['/lightview.js', '/lightview-x.js'],
154
+ type: 'module',
155
+ minHeight: 220
156
+ });
157
+ </script><code contenteditable="true">const { default: Range } = await import('/components/data-input/range.js');
158
+ const { $ } = Lightview;
159
+
160
+ const basic = {
161
+ tag: Range,
162
+ attributes: {
163
+ min: 0,
164
+ max: 100,
165
+ defaultValue: 50
166
+ }
167
+ };
168
+
169
+ const withLabel = {
170
+ tag: Range,
171
+ attributes: {
172
+ label: 'Volume',
173
+ min: 0,
174
+ max: 100,
175
+ defaultValue: 75,
176
+ showValue: true,
177
+ color: 'primary'
178
+ }
179
+ };
180
+
181
+ const formatted = {
182
+ tag: Range,
183
+ attributes: {
184
+ label: 'Price Range',
185
+ min: 0,
186
+ max: 1000,
187
+ step: 50,
188
+ defaultValue: 500,
189
+ showValue: true,
190
+ formatValue: (v) => `$${v}`,
191
+ color: 'accent'
192
+ }
193
+ };
194
+
195
+ $('#example').content({
196
+ tag: 'div',
197
+ attributes: { style: 'display: flex; flex-direction: column; gap: 1.5rem; max-width: 28rem' },
198
+ children: [basic, withLabel, formatted]
199
+ });</code></pre>
200
+ </div>
201
+
202
+ <!-- Object DOM Syntax -->
203
+ <div id="syntax-object" style="display: none;">
204
+ <pre><script>
205
+ examplify(document.currentScript.nextElementSibling, {
206
+ at: document.currentScript.parentElement,
207
+ scripts: ['/lightview.js', '/lightview-x.js'],
208
+ type: 'module',
209
+ minHeight: 220
210
+ });
211
+ </script><code contenteditable="true">const { default: Range } = await import('/components/data-input/range.js');
212
+ const { tags, $ } = Lightview;
213
+ tags.Range = Range;
214
+
215
+ $('#example').content({
216
+ div: {
217
+ style: 'display: flex; flex-direction: column; gap: 1.5rem; max-width: 28rem',
218
+ children: [
219
+ {
220
+ Range: {
221
+ min: 0,
222
+ max: 100,
223
+ defaultValue: 50
224
+ }
225
+ },
226
+ {
227
+ Range: {
228
+ label: 'Volume',
229
+ min: 0,
230
+ max: 100,
231
+ defaultValue: 75,
232
+ showValue: true,
233
+ color: 'primary'
234
+ }
235
+ },
236
+ {
237
+ Range: {
238
+ label: 'Price Range',
239
+ min: 0,
240
+ max: 1000,
241
+ step: 50,
242
+ defaultValue: 500,
243
+ showValue: true,
244
+ formatValue: (v) => `$${v}`,
245
+ color: 'accent'
246
+ }
247
+ }
248
+ ]
249
+ }
250
+ });</code></pre>
251
+ </div>
252
+ </div>
253
+ </div>
254
+
255
+ <!-- Reactive Example with Examplify -->
256
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
257
+ <div class="card-body">
258
+ <h2 class="card-title">Reactive Example</h2>
259
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Two-way binding with signals
260
+ </p>
261
+
262
+ <!-- Tabs -->
263
+ <script>
264
+ window.switchReactiveSyntaxTab = (tabId) => {
265
+ const tabs = ['tagged', 'vdom', 'object'];
266
+ tabs.forEach(t => {
267
+ const tabEl = document.getElementById(`reactive-tab-btn-${t}`);
268
+ const contentEl = document.getElementById(`reactive-syntax-${t}`);
269
+ if (t === tabId) {
270
+ tabEl.classList.add('syntax-tab-active');
271
+ contentEl.style.display = 'block';
272
+ } else {
273
+ tabEl.classList.remove('syntax-tab-active');
274
+ contentEl.style.display = 'none';
275
+ }
276
+ });
277
+ };
278
+ </script>
279
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
280
+ <button id="reactive-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
281
+ onclick="switchReactiveSyntaxTab('tagged')">Tagged</button>
282
+ <button id="reactive-tab-btn-vdom" role="tab" class="syntax-tab"
283
+ onclick="switchReactiveSyntaxTab('vdom')">vDOM</button>
284
+ <button id="reactive-tab-btn-object" role="tab" class="syntax-tab"
285
+ onclick="switchReactiveSyntaxTab('object')">Object DOM</button>
286
+ </div>
287
+
288
+ <!-- Tagged Syntax -->
289
+ <div id="reactive-syntax-tagged">
290
+ <pre><script>
291
+ examplify(document.currentScript.nextElementSibling, {
292
+ at: document.currentScript.parentElement,
293
+ scripts: ['/lightview.js', '/lightview-x.js'],
294
+ type: 'module',
295
+ minHeight: 280
296
+ });
297
+ </script><code contenteditable="true">const { default: Range } = await import('/components/data-input/range.js');
298
+ const { signal, tags, $ } = Lightview;
299
+ const { div, p } = tags;
300
+
301
+ // Signals for values
302
+ const brightness = signal(70);
303
+ const contrast = signal(50);
304
+ const saturation = signal(100);
305
+
306
+ // Reactive range sliders
307
+ const reactiveDemo = div({ style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 28rem' },
308
+ Range({
309
+ label: 'Brightness',
310
+ min: 0, max: 100,
311
+ value: brightness,
312
+ showValue: true,
313
+ formatValue: (v) => `${v}%`,
314
+ color: 'warning'
315
+ }),
316
+ Range({
317
+ label: 'Contrast',
318
+ min: 0, max: 100,
319
+ value: contrast,
320
+ showValue: true,
321
+ formatValue: (v) => `${v}%`,
322
+ color: 'info'
323
+ }),
324
+ Range({
325
+ label: 'Saturation',
326
+ min: 0, max: 200,
327
+ value: saturation,
328
+ showValue: true,
329
+ formatValue: (v) => `${v}%`,
330
+ color: 'success'
331
+ }),
332
+ div({ class: 'divider' }),
333
+ p({ class: 'text-sm font-mono opacity-70' },
334
+ () => `B: ${brightness.value}% | C: ${contrast.value}% | S: ${saturation.value}%`
335
+ )
336
+ );
337
+
338
+ $('#example').content(reactiveDemo);</code></pre>
339
+ </div>
340
+
341
+ <!-- vDOM Syntax -->
342
+ <div id="reactive-syntax-vdom" style="display: none;">
343
+ <pre><script>
344
+ examplify(document.currentScript.nextElementSibling, {
345
+ at: document.currentScript.parentElement,
346
+ scripts: ['/lightview.js', '/lightview-x.js'],
347
+ type: 'module',
348
+ minHeight: 280
349
+ });
350
+ </script><code contenteditable="true">const { default: Range } = await import('/components/data-input/range.js');
351
+ const { signal, $ } = Lightview;
352
+
353
+ const brightness = signal(70);
354
+ const contrast = signal(50);
355
+ const saturation = signal(100);
356
+
357
+ const reactiveDemo = {
358
+ tag: 'div',
359
+ attributes: { style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 28rem' },
360
+ children: [
361
+ {
362
+ tag: Range,
363
+ attributes: {
364
+ label: 'Brightness',
365
+ min: 0, max: 100,
366
+ value: brightness,
367
+ showValue: true,
368
+ formatValue: (v) => `${v}%`,
369
+ color: 'warning'
370
+ }
371
+ },
372
+ {
373
+ tag: Range,
374
+ attributes: {
375
+ label: 'Contrast',
376
+ min: 0, max: 100,
377
+ value: contrast,
378
+ showValue: true,
379
+ formatValue: (v) => `${v}%`,
380
+ color: 'info'
381
+ }
382
+ },
383
+ {
384
+ tag: Range,
385
+ attributes: {
386
+ label: 'Saturation',
387
+ min: 0, max: 200,
388
+ value: saturation,
389
+ showValue: true,
390
+ formatValue: (v) => `${v}%`,
391
+ color: 'success'
392
+ }
393
+ },
394
+ { tag: 'div', attributes: { class: 'divider' } },
395
+ {
396
+ tag: 'p',
397
+ attributes: { class: 'text-sm font-mono opacity-70' },
398
+ children: [
399
+ () => `B: ${brightness.value}% | C: ${contrast.value}% | S: ${saturation.value}%`
400
+ ]
401
+ }
402
+ ]
403
+ };
404
+
405
+ $('#example').content(reactiveDemo);</code></pre>
406
+ </div>
407
+
408
+ <!-- Object DOM Syntax -->
409
+ <div id="reactive-syntax-object" style="display: none;">
410
+ <pre><script>
411
+ examplify(document.currentScript.nextElementSibling, {
412
+ at: document.currentScript.parentElement,
413
+ scripts: ['/lightview.js', '/lightview-x.js'],
414
+ type: 'module',
415
+ minHeight: 280
416
+ });
417
+ </script><code contenteditable="true">const { default: Range } = await import('/components/data-input/range.js');
418
+ const { signal, tags, $ } = Lightview;
419
+ tags.Range = Range;
420
+
421
+ const brightness = signal(70);
422
+ const contrast = signal(50);
423
+ const saturation = signal(100);
424
+
425
+ const reactiveDemo = {
426
+ div: {
427
+ style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 28rem',
428
+ children: [
429
+ {
430
+ Range: {
431
+ label: 'Brightness',
432
+ min: 0, max: 100,
433
+ value: brightness,
434
+ showValue: true,
435
+ formatValue: (v) => `${v}%`,
436
+ color: 'warning'
437
+ }
438
+ },
439
+ {
440
+ Range: {
441
+ label: 'Contrast',
442
+ min: 0, max: 100,
443
+ value: contrast,
444
+ showValue: true,
445
+ formatValue: (v) => `${v}%`,
446
+ color: 'info'
447
+ }
448
+ },
449
+ {
450
+ Range: {
451
+ label: 'Saturation',
452
+ min: 0, max: 200,
453
+ value: saturation,
454
+ showValue: true,
455
+ formatValue: (v) => `${v}%`,
456
+ color: 'success'
457
+ }
458
+ },
459
+ { div: { class: 'divider' } },
460
+ {
461
+ p: {
462
+ class: 'text-sm font-mono opacity-70',
463
+ children: [
464
+ () => `B: ${brightness.value}% | C: ${contrast.value}% | S: ${saturation.value}%`
465
+ ]
466
+ }
467
+ }
468
+ ]
469
+ }
470
+ };
471
+
472
+ $('#example').content(reactiveDemo);</code></pre>
473
+ </div>
474
+ </div>
475
+ </div>
476
+
477
+ <!-- Props Table -->
478
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Props</h2>
479
+ <div style="overflow-x: auto; margin-bottom: 2rem;">
480
+ <table class="table table-zebra">
481
+ <thead>
482
+ <tr>
483
+ <th>Prop</th>
484
+ <th>Type</th>
485
+ <th>Default</th>
486
+ <th>Description</th>
487
+ </tr>
488
+ </thead>
489
+ <tbody>
490
+ <tr>
491
+ <td><code>value</code></td>
492
+ <td>number | signal</td>
493
+ <td>-</td>
494
+ <td>Current value (reactive with signals)</td>
495
+ </tr>
496
+ <tr>
497
+ <td><code>defaultValue</code></td>
498
+ <td>number</td>
499
+ <td>0</td>
500
+ <td>Default value for uncontrolled mode</td>
501
+ </tr>
502
+ <tr>
503
+ <td><code>min</code></td>
504
+ <td>number</td>
505
+ <td>0</td>
506
+ <td>Minimum value</td>
507
+ </tr>
508
+ <tr>
509
+ <td><code>max</code></td>
510
+ <td>number</td>
511
+ <td>100</td>
512
+ <td>Maximum value</td>
513
+ </tr>
514
+ <tr>
515
+ <td><code>step</code></td>
516
+ <td>number</td>
517
+ <td>1</td>
518
+ <td>Step increment</td>
519
+ </tr>
520
+ <tr>
521
+ <td><code>label</code></td>
522
+ <td>string</td>
523
+ <td>-</td>
524
+ <td>Label text displayed above the range</td>
525
+ </tr>
526
+ <tr>
527
+ <td><code>helper</code></td>
528
+ <td>string</td>
529
+ <td>-</td>
530
+ <td>Helper text displayed below the range</td>
531
+ </tr>
532
+ <tr>
533
+ <td><code>showValue</code></td>
534
+ <td>boolean</td>
535
+ <td>false</td>
536
+ <td>Display current value</td>
537
+ </tr>
538
+ <tr>
539
+ <td><code>formatValue</code></td>
540
+ <td>function</td>
541
+ <td>(v) => v</td>
542
+ <td>Format function for displayed value</td>
543
+ </tr>
544
+ <tr>
545
+ <td><code>color</code></td>
546
+ <td>string</td>
547
+ <td>-</td>
548
+ <td>'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'
549
+ </td>
550
+ </tr>
551
+ <tr>
552
+ <td><code>size</code></td>
553
+ <td>string</td>
554
+ <td>'md'</td>
555
+ <td>'xs' | 'sm' | 'md' | 'lg'</td>
556
+ </tr>
557
+ <tr>
558
+ <td><code>disabled</code></td>
559
+ <td>boolean</td>
560
+ <td>false</td>
561
+ <td>Disable the range slider</td>
562
+ </tr>
563
+ <tr>
564
+ <td><code>onChange</code></td>
565
+ <td>function</td>
566
+ <td>-</td>
567
+ <td>Callback when value changes: <code>(value, event) => void</code></td>
568
+ </tr>
569
+ <tr>
570
+ <td><code>useShadow</code></td>
571
+ <td>boolean</td>
572
+ <td>*</td>
573
+ <td>Render in Shadow DOM</td>
574
+ </tr>
575
+ </tbody>
576
+ </table>
577
+ </div>
578
+
579
+ <!-- Colors Example -->
580
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Colors</h2>
581
+ <div class="example-stack" style="max-width: 28rem; margin-bottom: 2rem;">
582
+ <input type="range" min="0" max="100" value="40" class="range range-primary" />
583
+ <input type="range" min="0" max="100" value="50" class="range range-secondary" />
584
+ <input type="range" min="0" max="100" value="60" class="range range-accent" />
585
+ <input type="range" min="0" max="100" value="70" class="range range-success" />
586
+ <input type="range" min="0" max="100" value="80" class="range range-warning" />
587
+ <input type="range" min="0" max="100" value="90" class="range range-info" />
588
+ <input type="range" min="0" max="100" value="100" class="range range-error" />
589
+ </div>
590
+
591
+ <!-- Sizes Example -->
592
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Sizes</h2>
593
+ <div class="example-stack" style="max-width: 28rem; margin-bottom: 2rem;">
594
+ <input type="range" min="0" max="100" value="40" class="range range-xs" />
595
+ <input type="range" min="0" max="100" value="50" class="range range-sm" />
596
+ <input type="range" min="0" max="100" value="60" class="range range-md" />
597
+ <input type="range" min="0" max="100" value="70" class="range range-lg" />
598
+ </div>
599
+
600
+ <!-- With Steps -->
601
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">With Steps</h2>
602
+ <div style="max-width: 28rem; margin-bottom: 2rem;">
603
+ <input type="range" min="0" max="100" value="25" class="range" step="25" />
604
+ <div class="w-full flex justify-between text-xs px-2 mt-2">
605
+ <span>|</span><span>|</span><span>|</span><span>|</span><span>|</span>
606
+ </div>
607
+ </div>
608
+ </div>
609
+ </div>
610
+ </div>
611
+ </div>