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,236 @@
1
+ /* DaisyUI Themes - Variables Only */
2
+
3
+ /* LIGHT */
4
+ [data-theme="light"] {
5
+ color-scheme: light;
6
+ --p: 261 80% 60%;
7
+ --pf: 262 80% 50%;
8
+ --sf: 316 70% 50%;
9
+ --af: 175 70% 41%;
10
+ --nf: 216 28% 25%;
11
+ --in: 198 93% 60%;
12
+ --su: 158 64% 52%;
13
+ --wa: 43 96% 56%;
14
+ --er: 0 91% 71%;
15
+ --inc: 198 100% 12%;
16
+ --suc: 158 100% 10%;
17
+ --wac: 43 100% 11%;
18
+ --erc: 0 100% 14%;
19
+ --rounded-box: 1rem;
20
+ --rounded-btn: 0.5rem;
21
+ --rounded-badge: 1.9rem;
22
+ --animation-btn: 0.25s;
23
+ --animation-input: .2s;
24
+ --btn-text-case: uppercase;
25
+ --btn-focus-scale: 0.95;
26
+ --border-btn: 1px;
27
+ --tab-border: 1px;
28
+ --tab-radius: 0.5rem;
29
+ --s: 316 70% 60%;
30
+ --a: 175 70% 51%;
31
+ --n: 217 28% 25%;
32
+ --b1: 29 10% 100%;
33
+ --b2: 29 10% 96%;
34
+ --b3: 29 10% 92%;
35
+ --bc: 215 28% 17%;
36
+ --pc: 265 98% 16%;
37
+ --sc: 312 91% 16%;
38
+ --ac: 175 42% 14%;
39
+ --nc: 218 19% 82%;
40
+ }
41
+
42
+ /* DARK */
43
+ [data-theme="dark"] {
44
+ color-scheme: dark;
45
+ --p: 261 80% 70%;
46
+ --pf: 262 80% 60%;
47
+ --sf: 316 70% 60%;
48
+ --af: 175 70% 51%;
49
+ --nf: 216 28% 25%;
50
+ --in: 198 93% 60%;
51
+ --su: 158 64% 52%;
52
+ --wa: 43 96% 56%;
53
+ --er: 0 91% 71%;
54
+ --inc: 198 100% 12%;
55
+ --suc: 158 100% 10%;
56
+ --wac: 43 100% 11%;
57
+ --erc: 0 100% 14%;
58
+ --rounded-box: 1rem;
59
+ --rounded-btn: 0.5rem;
60
+ --rounded-badge: 1.9rem;
61
+ --animation-btn: 0.25s;
62
+ --animation-input: .2s;
63
+ --btn-text-case: uppercase;
64
+ --btn-focus-scale: 0.95;
65
+ --border-btn: 1px;
66
+ --tab-border: 1px;
67
+ --tab-radius: 0.5rem;
68
+ --s: 316 70% 70%;
69
+ --a: 175 70% 61%;
70
+ --n: 218 12% 16%;
71
+ --b1: 220 18% 20%;
72
+ --b2: 219 20% 17%;
73
+ --b3: 219 21% 15%;
74
+ --bc: 220 13% 69%;
75
+ --pc: 265 98% 16%;
76
+ --sc: 312 91% 16%;
77
+ --ac: 175 42% 14%;
78
+ --nc: 218 19% 82%;
79
+ }
80
+
81
+ /* CUPCAKE */
82
+ [data-theme="cupcake"] {
83
+ color-scheme: light;
84
+ --p: 183 47% 59%;
85
+ --pf: 183 47% 49%;
86
+ --sf: 338 71% 68%;
87
+ --af: 37 92% 40%;
88
+ --nf: 216 26% 16%;
89
+ --in: 198 93% 60%;
90
+ --su: 158 64% 52%;
91
+ --wa: 43 96% 56%;
92
+ --er: 0 91% 71%;
93
+ --inc: 198 100% 12%;
94
+ --suc: 158 100% 10%;
95
+ --wac: 43 100% 11%;
96
+ --erc: 0 100% 14%;
97
+ --rounded-box: 1rem;
98
+ --rounded-btn: 1.9rem;
99
+ --rounded-badge: 1.9rem;
100
+ --animation-btn: 0.25s;
101
+ --animation-input: .2s;
102
+ --btn-text-case: uppercase;
103
+ --btn-focus-scale: 0.95;
104
+ --border-btn: 1px;
105
+ --tab-border: 1px;
106
+ --tab-radius: 0.5rem;
107
+ --s: 338 71% 78%;
108
+ --a: 37 92% 50%;
109
+ --n: 217 26% 26%;
110
+ --b1: 24 33% 97%;
111
+ --b2: 27 23% 94%;
112
+ --b3: 20 20% 91%;
113
+ --bc: 215 28% 17%;
114
+ --pc: 183 89% 15%;
115
+ --sc: 338 94% 17%;
116
+ --ac: 37 68% 13%;
117
+ --nc: 213 14% 83%;
118
+ }
119
+
120
+ /* CYBERPUNK */
121
+ [data-theme="cyberpunk"] {
122
+ color-scheme: light;
123
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace;
124
+ --p: 345 100% 73%;
125
+ --pf: 345 100% 63%;
126
+ --sf: 197 94% 63%;
127
+ --af: 58 100% 59%;
128
+ --nf: 56 100% 8%;
129
+ --in: 198 93% 60%;
130
+ --su: 158 64% 52%;
131
+ --wa: 43 96% 56%;
132
+ --er: 0 91% 71%;
133
+ --inc: 198 100% 12%;
134
+ --suc: 158 100% 10%;
135
+ --wac: 43 100% 11%;
136
+ --erc: 0 100% 14%;
137
+ --rounded-box: 0;
138
+ --rounded-btn: 0;
139
+ --rounded-badge: 0;
140
+ --animation-btn: 0.25s;
141
+ --animation-input: .2s;
142
+ --btn-text-case: uppercase;
143
+ --btn-focus-scale: 0.95;
144
+ --border-btn: 1px;
145
+ --tab-border: 1px;
146
+ --tab-radius: 0.5rem;
147
+ --s: 197 94% 73%;
148
+ --a: 58 100% 69%;
149
+ --n: 56 100% 18%;
150
+ --b1: 56 100% 58%;
151
+ --b2: 56 100% 48%;
152
+ --b3: 56 100% 38%;
153
+ --bc: 56 100% 11%;
154
+ --pc: 345 100% 14%;
155
+ --sc: 197 100% 14%;
156
+ --ac: 58 100% 13%;
157
+ --nc: 56 100% 84%;
158
+ }
159
+
160
+ /* VALENTINE */
161
+ [data-theme="valentine"] {
162
+ color-scheme: light;
163
+ --p: 353 74% 67%;
164
+ --pf: 353 74% 57%;
165
+ --sf: 319 46% 54%;
166
+ --af: 175 22% 58%;
167
+ --nf: 322 34% 54%;
168
+ --in: 198 93% 60%;
169
+ --su: 158 64% 52%;
170
+ --wa: 43 96% 56%;
171
+ --er: 0 91% 71%;
172
+ --inc: 198 100% 12%;
173
+ --suc: 158 100% 10%;
174
+ --wac: 43 100% 11%;
175
+ --erc: 0 100% 14%;
176
+ --rounded-box: 1rem;
177
+ --rounded-btn: 1.9rem;
178
+ --rounded-badge: 1.9rem;
179
+ --animation-btn: 0.25s;
180
+ --animation-input: .2s;
181
+ --btn-text-case: uppercase;
182
+ --btn-focus-scale: 0.95;
183
+ --border-btn: 1px;
184
+ --tab-border: 1px;
185
+ --tab-radius: 0.5rem;
186
+ --s: 319 46% 64%;
187
+ --a: 175 22% 68%;
188
+ --n: 322 34% 64%;
189
+ --b1: 337 45% 96%;
190
+ --b2: 332 45% 91%;
191
+ --b3: 332 46% 86%;
192
+ --bc: 343 36% 37%;
193
+ --pc: 353 100% 14%;
194
+ --sc: 319 50% 14%;
195
+ --ac: 175 24% 15%;
196
+ --nc: 322 55% 15%;
197
+ }
198
+
199
+ /* AQUA */
200
+ [data-theme="aqua"] {
201
+ color-scheme: dark;
202
+ --p: 188 78% 69%;
203
+ --pf: 188 78% 59%;
204
+ --sf: 268 37% 55%;
205
+ --af: 45 92% 51%;
206
+ --nf: 216 28% 25%;
207
+ --in: 198 93% 60%;
208
+ --su: 158 64% 52%;
209
+ --wa: 43 96% 56%;
210
+ --er: 0 91% 71%;
211
+ --inc: 198 100% 12%;
212
+ --suc: 158 100% 10%;
213
+ --wac: 43 100% 11%;
214
+ --erc: 0 100% 14%;
215
+ --rounded-box: 1rem;
216
+ --rounded-btn: 0.5rem;
217
+ --rounded-badge: 1.9rem;
218
+ --animation-btn: 0.25s;
219
+ --animation-input: 0.2s;
220
+ --btn-text-case: uppercase;
221
+ --btn-focus-scale: 0.95;
222
+ --border-btn: 1px;
223
+ --tab-border: 1px;
224
+ --tab-radius: 0.5rem;
225
+ --s: 268 37% 65%;
226
+ --a: 45 92% 61%;
227
+ --n: 217 28% 25%;
228
+ --b1: 222 51% 18%;
229
+ --b2: 221 44% 15%;
230
+ --b3: 222 46% 12%;
231
+ --bc: 221 34% 69%;
232
+ --pc: 188 98% 16%;
233
+ --sc: 268 45% 16%;
234
+ --ac: 45 98% 15%;
235
+ --nc: 218 19% 82%;
236
+ }
@@ -0,0 +1,439 @@
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: 'Accordion' }
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">Accordion</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
+ Accordion is used for showing and hiding content in collapsible sections.
61
+ Only one section can be open at a time.
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;">FAQ-style accordion</p>
69
+
70
+ <!-- Tabs -->
71
+ <script>
72
+ window.switchSyntaxTab = (tabId) => {
73
+ const tabs = ['tagged', 'vdom', 'object'];
74
+ tabs.forEach(t => {
75
+ const tabEl = document.getElementById(`tab-btn-${t}`);
76
+ const contentEl = document.getElementById(`syntax-${t}`);
77
+ if (t === tabId) {
78
+ tabEl.classList.add('syntax-tab-active');
79
+ contentEl.style.display = 'block';
80
+ } else {
81
+ tabEl.classList.remove('syntax-tab-active');
82
+ contentEl.style.display = 'none';
83
+ }
84
+ });
85
+ };
86
+ </script>
87
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
88
+ <button id="tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
89
+ onclick="switchSyntaxTab('tagged')">Tagged</button>
90
+ <button id="tab-btn-vdom" role="tab" class="syntax-tab"
91
+ onclick="switchSyntaxTab('vdom')">vDOM</button>
92
+ <button id="tab-btn-object" role="tab" class="syntax-tab"
93
+ onclick="switchSyntaxTab('object')">Object
94
+ DOM</button>
95
+ </div>
96
+
97
+ <!-- Tagged Syntax -->
98
+ <div id="syntax-tagged">
99
+ <pre><script>
100
+ examplify(document.currentScript.nextElementSibling, {
101
+ at: document.currentScript.parentElement,
102
+ scripts: ['/lightview.js', '/lightview-x.js'],
103
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
104
+ type: 'module',
105
+ minHeight: 180,
106
+ autoRun: true
107
+ });
108
+ </script><code contenteditable="true">await import('/components/data-display/accordion.js');
109
+ const { tags, $ } = Lightview;
110
+ const { Accordion } = tags;
111
+
112
+ const faq = [
113
+ { q: 'What is Lightview?', a: 'A lightweight reactive UI library.' },
114
+ { q: 'Does it support TypeScript?', a: 'Yes! Full TypeScript support.' },
115
+ { q: 'How do I get started?', a: 'Check out our Getting Started guide!' }
116
+ ];
117
+
118
+ const accordion = Accordion({},
119
+ ...faq.map((item, i) =>
120
+ Accordion.Item({ name: 'faq', checked: i === 0 },
121
+ Accordion.Title({}, item.q),
122
+ Accordion.Content({}, item.a)
123
+ )
124
+ )
125
+ );
126
+
127
+ $('#example').content(accordion);</code></pre>
128
+ </div>
129
+
130
+ <!-- vDOM Syntax -->
131
+ <div id="syntax-vdom" style="display: none;">
132
+ <pre><script>
133
+ examplify(document.currentScript.nextElementSibling, {
134
+ at: document.currentScript.parentElement,
135
+ scripts: ['/lightview.js', '/lightview-x.js'],
136
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
137
+ type: 'module',
138
+ minHeight: 180
139
+ });
140
+ </script><code contenteditable="true">await import('/components/data-display/accordion.js');
141
+ const { $, tags } = Lightview;
142
+ const { Accordion } = tags;
143
+
144
+ const faq = [
145
+ { q: 'What is Lightview?', a: 'A lightweight reactive UI library.' },
146
+ { q: 'Does it support TypeScript?', a: 'Yes! Full TypeScript support.' },
147
+ { q: 'How do I get started?', a: 'Check out our Getting Started guide!' }
148
+ ];
149
+
150
+ const accordion = {
151
+ tag: Accordion,
152
+ children: faq.map((item, i) => ({
153
+ tag: Accordion.Item,
154
+ attributes: { name: 'faq', checked: i === 0 },
155
+ children: [
156
+ { tag: Accordion.Title, children: [item.q] },
157
+ { tag: Accordion.Content, children: [item.a] }
158
+ ]
159
+ }))
160
+ };
161
+
162
+ $('#example').content(accordion);</code></pre>
163
+ </div>
164
+
165
+ <!-- Object DOM Syntax -->
166
+ <div id="syntax-object" style="display: none;">
167
+ <pre><script>
168
+ examplify(document.currentScript.nextElementSibling, {
169
+ at: document.currentScript.parentElement,
170
+ scripts: ['/lightview.js', '/lightview-x.js'],
171
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
172
+ type: 'module',
173
+ minHeight: 180
174
+ });
175
+ </script><code contenteditable="true">await import('/components/data-display/accordion.js');
176
+ const { $ } = Lightview;
177
+
178
+ const faq = [
179
+ { q: 'What is Lightview?', a: 'A lightweight reactive UI library.' },
180
+ { q: 'Does it support TypeScript?', a: 'Yes! Full TypeScript support.' },
181
+ { q: 'How do I get started?', a: 'Check out our Getting Started guide!' }
182
+ ];
183
+
184
+ const accordion = {
185
+ Accordion: {
186
+ children: faq.map((item, i) => ({
187
+ 'Accordion.Item': {
188
+ name: 'faq',
189
+ checked: i === 0,
190
+ children: [
191
+ { 'Accordion.Title': { children: [item.q] } },
192
+ { 'Accordion.Content': { children: [item.a] } }
193
+ ]
194
+ }
195
+ }))
196
+ }
197
+ };
198
+
199
+ $('#example').content(accordion);</code></pre>
200
+ </div>
201
+ </div>
202
+ </div>
203
+
204
+ <!-- Reactive Example with Examplify -->
205
+ <div class="card bg-base-200" style="margin-bottom: 2rem;">
206
+ <div class="card-body">
207
+ <h2 class="card-title">Plus/Minus Icon</h2>
208
+ <p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Accordion with plus/minus
209
+ toggle icon</p>
210
+
211
+ <!-- Tabs -->
212
+ <script>
213
+ window.switchReactiveSyntaxTab = (tabId) => {
214
+ const tabs = ['tagged', 'vdom', 'object'];
215
+ tabs.forEach(t => {
216
+ const tabEl = document.getElementById(`reactive-tab-btn-${t}`);
217
+ const contentEl = document.getElementById(`reactive-syntax-${t}`);
218
+ if (t === tabId) {
219
+ tabEl.classList.add('syntax-tab-active');
220
+ contentEl.style.display = 'block';
221
+ } else {
222
+ tabEl.classList.remove('syntax-tab-active');
223
+ contentEl.style.display = 'none';
224
+ }
225
+ });
226
+ };
227
+ </script>
228
+ <div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
229
+ <button id="reactive-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
230
+ onclick="switchReactiveSyntaxTab('tagged')">Tagged</button>
231
+ <button id="reactive-tab-btn-vdom" role="tab" class="syntax-tab"
232
+ onclick="switchReactiveSyntaxTab('vdom')">vDOM</button>
233
+ <button id="reactive-tab-btn-object" role="tab" class="syntax-tab"
234
+ onclick="switchReactiveSyntaxTab('object')">Object DOM</button>
235
+ </div>
236
+
237
+ <!-- Tagged Syntax -->
238
+ <div id="reactive-syntax-tagged">
239
+ <pre><script>
240
+ examplify(document.currentScript.nextElementSibling, {
241
+ at: document.currentScript.parentElement,
242
+ scripts: ['/lightview.js', '/lightview-x.js'],
243
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
244
+ type: 'module',
245
+ minHeight: 180
246
+ });
247
+ </script><code contenteditable="true">await import('/components/data-display/accordion.js');
248
+ const { tags, $ } = Lightview;
249
+ const { Accordion } = tags;
250
+
251
+ const sections = [
252
+ { title: '📦 Shipping', content: 'Free shipping on orders over $50.' },
253
+ { title: '🔄 Returns', content: '30-day return policy for unused items.' },
254
+ { title: '💳 Payment', content: 'We accept all major credit cards.' }
255
+ ];
256
+
257
+ const accordion = Accordion({ join: true },
258
+ ...sections.map((item, i) =>
259
+ Accordion.Item({ name: 'info', icon: 'plus', join: true, checked: i === 0 },
260
+ Accordion.Title({}, item.title),
261
+ Accordion.Content({}, item.content)
262
+ )
263
+ )
264
+ );
265
+
266
+ $('#example').content(accordion);</code></pre>
267
+ </div>
268
+
269
+ <!-- vDOM Syntax -->
270
+ <div id="reactive-syntax-vdom" style="display: none;">
271
+ <pre><script>
272
+ examplify(document.currentScript.nextElementSibling, {
273
+ at: document.currentScript.parentElement,
274
+ scripts: ['/lightview.js', '/lightview-x.js'],
275
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
276
+ type: 'module',
277
+ minHeight: 180
278
+ });
279
+ </script><code contenteditable="true">await import('/components/data-display/accordion.js');
280
+ const { $, tags } = Lightview;
281
+ const { Accordion } = tags;
282
+
283
+ const sections = [
284
+ { title: '📦 Shipping', content: 'Free shipping on orders over $50.' },
285
+ { title: '🔄 Returns', content: '30-day return policy for unused items.' },
286
+ { title: '💳 Payment', content: 'We accept all major credit cards.' }
287
+ ];
288
+
289
+ const accordion = {
290
+ tag: Accordion,
291
+ attributes: { join: true },
292
+ children: sections.map((item, i) => ({
293
+ tag: Accordion.Item,
294
+ attributes: { name: 'info', icon: 'plus', join: true, checked: i === 0 },
295
+ children: [
296
+ { tag: Accordion.Title, children: [item.title] },
297
+ { tag: Accordion.Content, children: [item.content] }
298
+ ]
299
+ }))
300
+ };
301
+
302
+ $('#example').content(accordion);</code></pre>
303
+ </div>
304
+
305
+ <!-- Object DOM Syntax -->
306
+ <div id="reactive-syntax-object" style="display: none;">
307
+ <pre><script>
308
+ examplify(document.currentScript.nextElementSibling, {
309
+ at: document.currentScript.parentElement,
310
+ scripts: ['/lightview.js', '/lightview-x.js'],
311
+ styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
312
+ type: 'module',
313
+ minHeight: 180
314
+ });
315
+ </script><code contenteditable="true">await import('/components/data-display/accordion.js');
316
+ const { $ } = Lightview;
317
+
318
+ const sections = [
319
+ { title: '📦 Shipping', content: 'Free shipping on orders over $50.' },
320
+ { title: '🔄 Returns', content: '30-day return policy for unused items.' },
321
+ { title: '💳 Payment', content: 'We accept all major credit cards.' }
322
+ ];
323
+
324
+ const accordion = {
325
+ Accordion: {
326
+ join: true,
327
+ children: sections.map((item, i) => ({
328
+ 'Accordion.Item': {
329
+ name: 'info',
330
+ icon: 'plus',
331
+ join: true,
332
+ checked: i === 0,
333
+ children: [
334
+ { 'Accordion.Title': { children: [item.title] } },
335
+ { 'Accordion.Content': { children: [item.content] } }
336
+ ]
337
+ }
338
+ }))
339
+ }
340
+ };
341
+
342
+ $('#example').content(accordion);</code></pre>
343
+ </div>
344
+ </div>
345
+ </div>
346
+
347
+ <!-- Props Table -->
348
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Props</h2>
349
+ <div style="overflow-x: auto; margin-bottom: 2rem;">
350
+ <table class="table table-zebra">
351
+ <thead>
352
+ <tr>
353
+ <th>Prop</th>
354
+ <th>Type</th>
355
+ <th>Default</th>
356
+ <th>Description</th>
357
+ </tr>
358
+ </thead>
359
+ <tbody>
360
+ <tr>
361
+ <td><code>join</code></td>
362
+ <td>boolean</td>
363
+ <td>false</td>
364
+ <td>Use connected/joined style</td>
365
+ </tr>
366
+ </tbody>
367
+ </table>
368
+ </div>
369
+
370
+ <!-- Accordion.Item Props -->
371
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Accordion.Item Props</h2>
372
+ <div style="overflow-x: auto; margin-bottom: 2rem;">
373
+ <table class="table table-zebra">
374
+ <thead>
375
+ <tr>
376
+ <th>Prop</th>
377
+ <th>Type</th>
378
+ <th>Default</th>
379
+ <th>Description</th>
380
+ </tr>
381
+ </thead>
382
+ <tbody>
383
+ <tr>
384
+ <td><code>name</code></td>
385
+ <td>string</td>
386
+ <td>'accordion'</td>
387
+ <td>Radio group name (only one opens at a time)</td>
388
+ </tr>
389
+ <tr>
390
+ <td><code>icon</code></td>
391
+ <td>string</td>
392
+ <td>'arrow'</td>
393
+ <td>'arrow' | 'plus'</td>
394
+ </tr>
395
+ <tr>
396
+ <td><code>checked</code></td>
397
+ <td>boolean</td>
398
+ <td>false</td>
399
+ <td>Initially open</td>
400
+ </tr>
401
+ <tr>
402
+ <td><code>join</code></td>
403
+ <td>boolean</td>
404
+ <td>false</td>
405
+ <td>Use joined styling</td>
406
+ </tr>
407
+ </tbody>
408
+ </table>
409
+ </div>
410
+
411
+ <!-- Static Examples -->
412
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Arrow Icon (Default)</h2>
413
+ <div style="display: flex; flex-direction: column; gap: 0.5rem; margin-bottom: 2rem;">
414
+ <div class="collapse collapse-arrow"
415
+ style="background-color: oklch(var(--b1)); border: 1px solid oklch(var(--b3));">
416
+ <input type="radio" name="accordion-demo" checked="checked" />
417
+ <div class="collapse-title font-semibold">Click to open this one</div>
418
+ <div class="collapse-content text-sm">Content for section one.</div>
419
+ </div>
420
+ <div class="collapse collapse-arrow"
421
+ style="background-color: oklch(var(--b1)); border: 1px solid oklch(var(--b3));">
422
+ <input type="radio" name="accordion-demo" />
423
+ <div class="collapse-title font-semibold">Click to open this one</div>
424
+ <div class="collapse-content text-sm">Content for section two.</div>
425
+ </div>
426
+ </div>
427
+
428
+ <!-- Plus/Minus Icon -->
429
+ <h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Plus/Minus Icon</h2>
430
+ <div class="collapse collapse-plus"
431
+ style="background-color: oklch(var(--b1)); border: 1px solid oklch(var(--b3)); margin-bottom: 2rem;">
432
+ <input type="checkbox" />
433
+ <div class="collapse-title font-semibold">Click me to show/hide</div>
434
+ <div class="collapse-content text-sm">Hidden content revealed!</div>
435
+ </div>
436
+ </div>
437
+ </div>
438
+ </div>
439
+ </div>