lightview 1.8.2 → 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 (264) 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 +1330 -19
  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 +610 -15
  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 +485 -42
  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 +132 -42
  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 +659 -1200
  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/docs/CNAME +0 -1
  165. package/docs/api.html +0 -674
  166. package/docs/blank.html +0 -10
  167. package/docs/comparedto.html +0 -89
  168. package/docs/components/chart-repl.html +0 -69
  169. package/docs/components/components.js +0 -113
  170. package/docs/components/contents.html +0 -17
  171. package/docs/components/gantt-repl.html +0 -61
  172. package/docs/components/gantt.html +0 -42
  173. package/docs/components/gauge-repl.html +0 -66
  174. package/docs/components/gauge.html +0 -20
  175. package/docs/components/orgchart-repl.html +0 -64
  176. package/docs/components/orgchart.html +0 -41
  177. package/docs/components/repl-as-src.html +0 -17
  178. package/docs/components/repl-repl.html +0 -95
  179. package/docs/components/repl.html +0 -527
  180. package/docs/components/timeline-repl.html +0 -72
  181. package/docs/components.html +0 -14
  182. package/docs/css/highlightjs.min.css +0 -9
  183. package/docs/css/tutorial.css +0 -35
  184. package/docs/examples/anchor.html +0 -11
  185. package/docs/examples/chart.html +0 -34
  186. package/docs/examples/counter.html +0 -26
  187. package/docs/examples/counter.test.mjs +0 -47
  188. package/docs/examples/counter2.html +0 -26
  189. package/docs/examples/directives.html +0 -79
  190. package/docs/examples/foreign.html +0 -50
  191. package/docs/examples/forgeinform.html +0 -98
  192. package/docs/examples/form.html +0 -61
  193. package/docs/examples/gauge.html +0 -18
  194. package/docs/examples/invalid-template-literals.html +0 -44
  195. package/docs/examples/medium/remote.html +0 -60
  196. package/docs/examples/message.html +0 -18
  197. package/docs/examples/nested.html +0 -11
  198. package/docs/examples/object-bound-form.html +0 -34
  199. package/docs/examples/remote-server.js +0 -51
  200. package/docs/examples/remote.html +0 -34
  201. package/docs/examples/remote.json +0 -1
  202. package/docs/examples/scratch.html +0 -69
  203. package/docs/examples/sensors/index.html +0 -44
  204. package/docs/examples/sensors/sensor-server.js +0 -30
  205. package/docs/examples/shared.html +0 -41
  206. package/docs/examples/template.html +0 -33
  207. package/docs/examples/timeline.html +0 -21
  208. package/docs/examples/todo.html +0 -40
  209. package/docs/examples/top.html +0 -10
  210. package/docs/examples/types.html +0 -94
  211. package/docs/examples/xor.html +0 -62
  212. package/docs/examples.html +0 -25
  213. package/docs/javascript/codejar.min.js +0 -8
  214. package/docs/javascript/highlightjs.min.js +0 -1173
  215. package/docs/javascript/isomorphic-git.js +0 -9
  216. package/docs/javascript/json5.min.js +0 -1
  217. package/docs/javascript/lightning-fs.js +0 -1
  218. package/docs/javascript/lightview.js +0 -1285
  219. package/docs/javascript/marked.min.js +0 -6
  220. package/docs/javascript/peerjs.min.js +0 -70
  221. package/docs/javascript/turndown.js +0 -973
  222. package/docs/javascript/types.js +0 -606
  223. package/docs/javascript/utils.js +0 -45
  224. package/docs/lightview.html +0 -63
  225. package/docs/old_index.html +0 -965
  226. package/docs/old_index.md +0 -1132
  227. package/docs/slidein.html +0 -51
  228. package/docs/tutorial/0-getting-started.html +0 -67
  229. package/docs/tutorial/1-intro-to-variables.html +0 -103
  230. package/docs/tutorial/10-template-components.html +0 -80
  231. package/docs/tutorial/11-linked-components.html +0 -76
  232. package/docs/tutorial/12-imported-components.html +0 -67
  233. package/docs/tutorial/13-input-binding.html +0 -94
  234. package/docs/tutorial/14-automatic-variable-creation.html +0 -74
  235. package/docs/tutorial/15-form-binding.html +0 -110
  236. package/docs/tutorial/16-if-directive.html +0 -60
  237. package/docs/tutorial/17-loop-directives.html +0 -83
  238. package/docs/tutorial/18-sanitizing-and-escaping-input.html +0 -79
  239. package/docs/tutorial/2-imported-and-exported-variables.html +0 -80
  240. package/docs/tutorial/3-data-types.html +0 -89
  241. package/docs/tutorial/4-extended-data-types.html +0 -83
  242. package/docs/tutorial/5-extended-functional-types.html +0 -96
  243. package/docs/tutorial/5.1-extended-functional-types.html +0 -79
  244. package/docs/tutorial/5.2-extended-functional-types.html +0 -70
  245. package/docs/tutorial/6-conventional-javascript.html +0 -75
  246. package/docs/tutorial/7-monitoring-with-observers.html +0 -107
  247. package/docs/tutorial/8-event-listeners.html +0 -65
  248. package/docs/tutorial/9-intro-to-components.html +0 -91
  249. package/docs/tutorial/contents.html +0 -32
  250. package/docs/tutorial/my-component.html +0 -29
  251. package/docs/tutorial/remote-value.json +0 -4
  252. package/docs/websiterepl.html +0 -46
  253. package/jest-puppeteer.config.js +0 -5
  254. package/jest.config.json +0 -12
  255. package/lightview.min.js +0 -1
  256. package/lightview_good.js +0 -1267
  257. package/lightview_optimized.js +0 -1274
  258. package/repl_hold.html +0 -320
  259. package/test/basic.html +0 -104
  260. package/test/basic.test.mjs +0 -315
  261. package/test/extended.html +0 -29
  262. package/test/extended.test.mjs +0 -448
  263. package/types.js +0 -607
  264. package/unsplash.key +0 -1
@@ -0,0 +1,521 @@
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: 'Loading' }
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">Loading</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
+ Loading shows an animated indicator for loading states.
61
+ Multiple types and sizes available.
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;">Different loading types and
69
+ sizes</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-display/loading.js');
112
+ const { tags, $ } = Lightview;
113
+ const { div, p, Loading } = tags;
114
+
115
+ const types = ['spinner', 'dots', 'ring', 'ball', 'bars', 'infinity'];
116
+
117
+ const loaders = div({ style: 'display: flex; flex-wrap: wrap; gap: 2rem;' },
118
+ ...types.map(type =>
119
+ div({ style: 'text-align: center;' },
120
+ Loading({ type, size: 'lg' }),
121
+ p({ style: 'font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;' }, type)
122
+ )
123
+ )
124
+ );
125
+
126
+ $('#example').content(loaders);</code></pre>
127
+ </div>
128
+
129
+ <!-- vDOM Syntax -->
130
+ <div id="syntax-vdom" style="display: none;">
131
+ <pre><script>
132
+ examplify(document.currentScript.nextElementSibling, {
133
+ at: document.currentScript.parentElement,
134
+ scripts: ['/lightview.js', '/lightview-x.js'],
135
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
136
+ type: 'module',
137
+ minHeight: 100
138
+ });
139
+ </script><code contenteditable="true">await import('/components/data-display/loading.js');
140
+ const { $, tags } = Lightview;
141
+ const { Loading, div, p } = tags;
142
+
143
+ const types = ['spinner', 'dots', 'ring', 'ball', 'bars', 'infinity'];
144
+
145
+ const loaders = {
146
+ tag: div,
147
+ attributes: { style: 'display: flex; flex-wrap: wrap; gap: 2rem;' },
148
+ children: types.map(type => ({
149
+ tag: div,
150
+ attributes: { style: 'text-align: center;' },
151
+ children: [
152
+ { tag: Loading, attributes: { type, size: 'lg' } },
153
+ { tag: p, attributes: { style: 'font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;' }, children: [type] }
154
+ ]
155
+ }))
156
+ };
157
+
158
+ $('#example').content(loaders);</code></pre>
159
+ </div>
160
+
161
+ <!-- Object DOM Syntax -->
162
+ <div id="syntax-object" style="display: none;">
163
+ <pre><script>
164
+ examplify(document.currentScript.nextElementSibling, {
165
+ at: document.currentScript.parentElement,
166
+ scripts: ['/lightview.js', '/lightview-x.js'],
167
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
168
+ type: 'module',
169
+ minHeight: 100
170
+ });
171
+ </script><code contenteditable="true">await import('/components/data-display/loading.js');
172
+ const { $ } = Lightview;
173
+
174
+ const types = ['spinner', 'dots', 'ring', 'ball', 'bars', 'infinity'];
175
+
176
+ const loaders = {
177
+ div: {
178
+ style: 'display: flex; flex-wrap: wrap; gap: 2rem;',
179
+ children: types.map(type => ({
180
+ div: {
181
+ style: 'text-align: center;',
182
+ children: [
183
+ { Loading: { type, size: 'lg' } },
184
+ { p: { style: 'font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;', text: type } }
185
+ ]
186
+ }
187
+ }))
188
+ }
189
+ };
190
+
191
+ $('#example').content(loaders);</code></pre>
192
+ </div>
193
+
194
+ <!-- HTML Syntax -->
195
+ <div id="syntax-html" style="display: none;">
196
+ <pre><script>
197
+ examplify(document.currentScript.nextElementSibling, {
198
+ at: document.currentScript.parentElement,
199
+ scripts: ['/lightview.js', '/lightview-x.js'],
200
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
201
+ type: 'module',
202
+ language: 'html',
203
+ minHeight: 100
204
+ });
205
+ </script><code contenteditable="true" class="language-html">&lt;!-- Import the component (registers lv-loading) --&gt;
206
+ &lt;script type="module" src="/components/data-display/loading.js"&gt;&lt;/script&gt;
207
+
208
+ &lt;div style="display: flex; flex-wrap: wrap; gap: 2rem;"&gt;
209
+ &lt;lv-loading type="spinner" size="lg"&gt;&lt;/lv-loading&gt;
210
+ &lt;lv-loading type="dots" size="lg"&gt;&lt;/lv-loading&gt;
211
+ &lt;lv-loading type="ring" size="lg"&gt;&lt;/lv-loading&gt;
212
+ &lt;lv-loading type="ball" size="lg"&gt;&lt;/lv-loading&gt;
213
+ &lt;/div&gt;</code></pre>
214
+ </div>
215
+ </div>
216
+ </div>
217
+
218
+ <!-- Reactive Example with Examplify -->
219
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
220
+ <div class="card-body">
221
+ <h2 class="card-title">Loading Button</h2>
222
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Button with reactive loading
223
+ state</p>
224
+
225
+ <!-- Tabs -->
226
+ <script>
227
+ window.switchReactiveSyntaxTab = (tabId) => {
228
+ const tabs = ['tagged', 'vdom', 'object'];
229
+ tabs.forEach(t => {
230
+ const tabEl = document.getElementById(`reactive-tab-btn-${t}`);
231
+ const contentEl = document.getElementById(`reactive-syntax-${t}`);
232
+ if (t === tabId) {
233
+ tabEl.classList.add('syntax-tab-active');
234
+ contentEl.style.display = 'block';
235
+ } else {
236
+ tabEl.classList.remove('syntax-tab-active');
237
+ contentEl.style.display = 'none';
238
+ }
239
+ });
240
+ };
241
+ </script>
242
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
243
+ <button id="reactive-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
244
+ onclick="switchReactiveSyntaxTab('tagged')">Tagged</button>
245
+ <button id="reactive-tab-btn-vdom" role="tab" class="syntax-tab"
246
+ onclick="switchReactiveSyntaxTab('vdom')">vDOM</button>
247
+ <button id="reactive-tab-btn-object" role="tab" class="syntax-tab"
248
+ onclick="switchReactiveSyntaxTab('object')">Object DOM</button>
249
+ </div>
250
+
251
+ <!-- Tagged Syntax -->
252
+ <div id="reactive-syntax-tagged">
253
+ <pre><script>
254
+ examplify(document.currentScript.nextElementSibling, {
255
+ at: document.currentScript.parentElement,
256
+ scripts: ['/lightview.js', '/lightview-x.js'],
257
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
258
+ type: 'module',
259
+ minHeight: 80
260
+ });
261
+ </script><code contenteditable="true">await import('/components/data-display/loading.js');
262
+ await import('/components/actions/button.js');
263
+
264
+ const { signal, tags, $ } = Lightview;
265
+ const { div, span, Loading, Button } = tags;
266
+
267
+ const isLoading = signal(false);
268
+
269
+ const handleClick = async () => {
270
+ </script><code contenteditable="true">import { signal, tags, $ } from '/lightview.js';
271
+ import { Loading } from '/components/data-display/loading.js';
272
+ import { Button } from '/components/actions/button.js';
273
+
274
+ const { div, span } = tags;
275
+
276
+ const isLoading = signal(false);
277
+
278
+ const handleClick = async () => {
279
+ isLoading.value = true;
280
+ await new Promise(r => setTimeout(r, 2000));
281
+ isLoading.value = false;
282
+ };
283
+
284
+ const demo = div({ style: 'display: flex; gap: 1rem; align-items: center;' },
285
+ () => isLoading.value
286
+ ? Button({ color: 'primary', disabled: true },
287
+ Loading({ type: 'spinner', size: 'sm' }),
288
+ span({}, ' Processing...')
289
+ )
290
+ : Button({ color: 'primary', onclick: handleClick }, 'Submit'),
291
+ span({ style: 'font-size: 0.875rem; opacity: 0.7;' },
292
+ () => isLoading.value ? 'Please wait...' : 'Click the button'
293
+ )
294
+ );
295
+
296
+ $('#example').content(demo);</code></pre>
297
+ </div>
298
+
299
+ <!-- vDOM Syntax -->
300
+ <div id="reactive-syntax-vdom" style="display: none;">
301
+ <pre><script>
302
+ examplify(document.currentScript.nextElementSibling, {
303
+ at: document.currentScript.parentElement,
304
+ scripts: ['/lightview.js', '/lightview-x.js'],
305
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
306
+ type: 'module',
307
+ minHeight: 80
308
+ });
309
+ </script><code contenteditable="true">import { signal, $, tags } from '/lightview.js';
310
+ import { Loading } from '/components/data-display/loading.js';
311
+ import { Button } from '/components/actions/button.js';
312
+ const { div, span } = tags;
313
+
314
+ const isLoading = signal(false);
315
+
316
+ const handleClick = async () => {
317
+ isLoading.value = true;
318
+ await new Promise(r => setTimeout(r, 2000));
319
+ isLoading.value = false;
320
+ };
321
+
322
+ const demo = {
323
+ tag: div,
324
+ attributes: { style: 'display: flex; gap: 1rem; align-items: center;' },
325
+ children: [
326
+ {
327
+ observable: isLoading,
328
+ callback: (loading) => loading
329
+ ? {
330
+ tag: Button,
331
+ attributes: { color: 'primary', disabled: true },
332
+ children: [
333
+ { tag: Loading, attributes: { type: 'spinner', size: 'sm' } },
334
+ { tag: span, children: [' Processing...'] }
335
+ ]
336
+ }
337
+ : {
338
+ tag: Button,
339
+ attributes: { color: 'primary', onclick: handleClick },
340
+ children: ['Submit']
341
+ }
342
+ },
343
+ {
344
+ tag: span,
345
+ attributes: { style: 'font-size: 0.875rem; opacity: 0.7;' },
346
+ children: [() => isLoading.value ? 'Please wait...' : 'Click the button']
347
+ }
348
+ ]
349
+ };
350
+
351
+ $('#example').content(demo);</code></pre>
352
+ </div>
353
+
354
+ <!-- Object DOM Syntax -->
355
+ <div id="reactive-syntax-object" style="display: none;">
356
+ <pre><script>
357
+ examplify(document.currentScript.nextElementSibling, {
358
+ at: document.currentScript.parentElement,
359
+ scripts: ['/lightview.js', '/lightview-x.js'],
360
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
361
+ type: 'module',
362
+ minHeight: 80
363
+ });
364
+ </script><code contenteditable="true">import { signal, $ } from '/lightview.js';
365
+ import { Loading } from '/components/data-display/loading.js';
366
+ import { Button } from '/components/actions/button.js';
367
+
368
+ const isLoading = signal(false);
369
+
370
+ const handleClick = async () => {
371
+ isLoading.value = true;
372
+ await new Promise(r => setTimeout(r, 2000));
373
+ isLoading.value = false;
374
+ };
375
+
376
+ const demo = {
377
+ div: {
378
+ style: 'display: flex; gap: 1rem; align-items: center',
379
+ children: [
380
+ {
381
+ observable: isLoading,
382
+ callback: (loading) => loading
383
+ ? {
384
+ Button: {
385
+ color: 'primary',
386
+ disabled: true,
387
+ children: [
388
+ { Loading: { type: 'spinner', size: 'sm' } },
389
+ { span: { text: ' Processing...' } }
390
+ ]
391
+ }
392
+ }
393
+ : {
394
+ Button: { color: 'primary', onclick: handleClick, text: 'Submit' }
395
+ }
396
+ },
397
+ {
398
+ span: {
399
+ style: 'font-size: 0.875rem; opacity: 0.7;',
400
+ text: () => isLoading.value ? 'Please wait...' : 'Click the button'
401
+ }
402
+ }
403
+ ]
404
+ }
405
+ };
406
+
407
+ $('#example').content(demo);</code></pre>
408
+ </div>
409
+ </div>
410
+ </div>
411
+
412
+ <!-- Props Table -->
413
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Props</h2>
414
+ <div style="overflow-x: auto; margin-bottom: 2rem;">
415
+ <table class="table table-zebra">
416
+ <thead>
417
+ <tr>
418
+ <th>Prop</th>
419
+ <th>Type</th>
420
+ <th>Default</th>
421
+ <th>Description</th>
422
+ </tr>
423
+ </thead>
424
+ <tbody>
425
+ <tr>
426
+ <td><code>type</code></td>
427
+ <td>string</td>
428
+ <td>'spinner'</td>
429
+ <td>'spinner' | 'dots' | 'ring' | 'ball' | 'bars' | 'infinity'</td>
430
+ </tr>
431
+ <tr>
432
+ <td><code>size</code></td>
433
+ <td>string</td>
434
+ <td>'md'</td>
435
+ <td>'xs' | 'sm' | 'md' | 'lg'</td>
436
+ </tr>
437
+ <tr>
438
+ <td><code>color</code></td>
439
+ <td>string</td>
440
+ <td>-</td>
441
+ <td>Color utility class e.g. 'text-primary'</td>
442
+ </tr>
443
+ </tbody>
444
+ </table>
445
+ </div>
446
+
447
+ <!-- Types -->
448
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Types</h2>
449
+ <div style="display: flex; flex-wrap: wrap; gap: 2rem; margin-bottom: 2rem;">
450
+ <div style="text-align: center;">
451
+ <span class="loading loading-spinner loading-lg"></span>
452
+ <p style="font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;">spinner</p>
453
+ </div>
454
+ <div style="text-align: center;">
455
+ <span class="loading loading-dots loading-lg"></span>
456
+ <p style="font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;">dots</p>
457
+ </div>
458
+ <div style="text-align: center;">
459
+ <span class="loading loading-ring loading-lg"></span>
460
+ <p style="font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;">ring</p>
461
+ </div>
462
+ <div style="text-align: center;">
463
+ <span class="loading loading-ball loading-lg"></span>
464
+ <p style="font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;">ball</p>
465
+ </div>
466
+ <div style="text-align: center;">
467
+ <span class="loading loading-bars loading-lg"></span>
468
+ <p style="font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;">bars</p>
469
+ </div>
470
+ <div style="text-align: center;">
471
+ <span class="loading loading-infinity loading-lg"></span>
472
+ <p style="font-size: 0.875rem; margin-top: 0.5rem; opacity: 0.5;">infinity</p>
473
+ </div>
474
+ </div>
475
+
476
+ <!-- Sizes -->
477
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Sizes</h2>
478
+ <div style="display: flex; align-items: center; gap: 1.5rem; margin-bottom: 2rem;">
479
+ <div style="text-align: center;">
480
+ <span class="loading loading-spinner loading-xs"></span>
481
+ <p style="font-size: 0.75rem; margin-top: 0.25rem; opacity: 0.5;">xs</p>
482
+ </div>
483
+ <div style="text-align: center;">
484
+ <span class="loading loading-spinner loading-sm"></span>
485
+ <p style="font-size: 0.75rem; margin-top: 0.25rem; opacity: 0.5;">sm</p>
486
+ </div>
487
+ <div style="text-align: center;">
488
+ <span class="loading loading-spinner loading-md"></span>
489
+ <p style="font-size: 0.75rem; margin-top: 0.25rem; opacity: 0.5;">md</p>
490
+ </div>
491
+ <div style="text-align: center;">
492
+ <span class="loading loading-spinner loading-lg"></span>
493
+ <p style="font-size: 0.75rem; margin-top: 0.25rem; opacity: 0.5;">lg</p>
494
+ </div>
495
+ </div>
496
+
497
+ <!-- Colors -->
498
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Colors</h2>
499
+ <div style="display: flex; gap: 1.5rem; margin-bottom: 2rem;">
500
+ <span class="loading loading-spinner loading-lg" style="color: oklch(var(--p));"></span>
501
+ <span class="loading loading-spinner loading-lg" style="color: oklch(var(--s));"></span>
502
+ <span class="loading loading-spinner loading-lg" style="color: oklch(var(--a));"></span>
503
+ <span class="loading loading-spinner loading-lg" style="color: oklch(var(--in));"></span>
504
+ <span class="loading loading-spinner loading-lg" style="color: oklch(var(--su));"></span>
505
+ <span class="loading loading-spinner loading-lg" style="color: oklch(var(--wa));"></span>
506
+ <span class="loading loading-spinner loading-lg" style="color: oklch(var(--er));"></span>
507
+ </div>
508
+
509
+ <!-- In Button -->
510
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">In Button</h2>
511
+ <div style="display: flex; gap: 1rem; margin-bottom: 2rem;">
512
+ <button class="btn btn-square">
513
+ <span class="loading loading-spinner"></span>
514
+ </button>
515
+ <button class="btn btn-primary">
516
+ <span class="loading loading-spinner"></span>
517
+ Loading
518
+ </button>
519
+ </div>
520
+ </div>
521
+ </div>