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,142 @@
1
+ /**
2
+ * Lightview Drawer Component (DaisyUI)
3
+ * @see https://daisyui.com/components/drawer/
4
+ */
5
+
6
+ import '../daisyui.js';
7
+
8
+ /**
9
+ * Drawer Component
10
+ * @param {Object} props
11
+ * @param {string} props.id - Unique ID for the drawer
12
+ * @param {boolean|function} props.open - Control open state
13
+ * @param {boolean} props.end - Drawer on right side
14
+ * @param {boolean} props.useShadow - Render in Shadow DOM with isolated DaisyUI styles
15
+ */
16
+ const Drawer = (props = {}, ...children) => {
17
+ const { tags } = window.Lightview || {};
18
+ const LVX = window.LightviewX || {};
19
+
20
+ if (!tags) return null;
21
+
22
+ const { div, input, label, shadowDOM } = tags;
23
+
24
+ const {
25
+ id = 'drawer-' + Math.random().toString(36).slice(2),
26
+ open = false,
27
+ end = false,
28
+ useShadow,
29
+ class: className = '',
30
+ ...rest
31
+ } = props;
32
+
33
+ const classes = ['drawer'];
34
+ if (end) classes.push('drawer-end');
35
+ if (className) classes.push(className);
36
+
37
+ const drawerEl = div({ class: classes.join(' '), ...rest },
38
+ input({
39
+ id,
40
+ type: 'checkbox',
41
+ class: 'drawer-toggle',
42
+ checked: typeof open === 'function' ? open : open
43
+ }),
44
+ ...children
45
+ );
46
+
47
+ // Check if we should use shadow DOM
48
+ let usesShadow = false;
49
+ if (LVX.shouldUseShadow) {
50
+ usesShadow = LVX.shouldUseShadow(useShadow);
51
+ } else {
52
+ usesShadow = useShadow === true;
53
+ }
54
+
55
+ if (usesShadow) {
56
+ const adoptedStyleSheets = LVX.getAdoptedStyleSheets ? LVX.getAdoptedStyleSheets() : [];
57
+
58
+ const themeValue = LVX.themeSignal ? () => LVX.themeSignal.value : 'light';
59
+
60
+ return div({ class: 'contents' },
61
+ shadowDOM({ mode: 'open', adoptedStyleSheets },
62
+ div({ 'data-theme': themeValue },
63
+ drawerEl
64
+ )
65
+ )
66
+ );
67
+ }
68
+
69
+ return drawerEl;
70
+ };
71
+
72
+ /**
73
+ * Drawer Content - main content area
74
+ */
75
+ Drawer.Content = (props = {}, ...children) => {
76
+ const { tags } = window.Lightview || {};
77
+ if (!tags) return null;
78
+
79
+ const { class: className = '', ...rest } = props;
80
+
81
+ return tags.div({
82
+ class: `drawer-content ${className}`.trim(),
83
+ ...rest
84
+ }, ...children);
85
+ };
86
+
87
+ /**
88
+ * Drawer Side - sidebar content
89
+ */
90
+ Drawer.Side = (props = {}, ...children) => {
91
+ const { tags } = window.Lightview || {};
92
+ if (!tags) return null;
93
+
94
+ const { class: className = '', ...rest } = props;
95
+
96
+ return tags.div({
97
+ class: `drawer-side ${className}`.trim(),
98
+ ...rest
99
+ }, ...children);
100
+ };
101
+
102
+ /**
103
+ * Drawer Overlay - click to close
104
+ */
105
+ Drawer.Overlay = (props = {}) => {
106
+ const { tags } = window.Lightview || {};
107
+ if (!tags) return null;
108
+
109
+ const { for: forId, class: className = '', ...rest } = props;
110
+
111
+ return tags.label({
112
+ for: forId,
113
+ 'aria-label': 'close sidebar',
114
+ class: `drawer-overlay ${className}`.trim(),
115
+ ...rest
116
+ });
117
+ };
118
+
119
+ /**
120
+ * Drawer Button - toggle button
121
+ */
122
+ Drawer.Button = (props = {}, ...children) => {
123
+ const { tags } = window.Lightview || {};
124
+ if (!tags) return null;
125
+
126
+ const { for: forId, class: className = '', ...rest } = props;
127
+
128
+ return tags.label({
129
+ for: forId,
130
+ class: `btn btn-primary drawer-button ${className}`.trim(),
131
+ ...rest
132
+ }, ...children);
133
+ };
134
+
135
+ const tags = window.Lightview.tags;
136
+ tags.Drawer = Drawer;
137
+ tags['Drawer.Content'] = Drawer.Content;
138
+ tags['Drawer.Side'] = Drawer.Side;
139
+ tags['Drawer.Overlay'] = Drawer.Overlay;
140
+ tags['Drawer.Button'] = Drawer.Button;
141
+
142
+ export default Drawer;
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Lightview Footer Component (DaisyUI)
3
+ * @see https://daisyui.com/components/footer/
4
+ */
5
+
6
+ import '../daisyui.js';
7
+
8
+ /**
9
+ * Footer Component
10
+ * @param {Object} props
11
+ * @param {boolean} props.center - Center content
12
+ * @param {boolean} props.useShadow - Render in Shadow DOM with isolated DaisyUI styles
13
+ */
14
+ const Footer = (props = {}, ...children) => {
15
+ const { tags } = window.Lightview || {};
16
+ const LVX = window.LightviewX || {};
17
+
18
+ if (!tags) return null;
19
+
20
+ const { footer, div, shadowDOM } = tags;
21
+
22
+ const {
23
+ center = false,
24
+ useShadow,
25
+ class: className = '',
26
+ ...rest
27
+ } = props;
28
+
29
+ const classes = ['footer', 'bg-neutral', 'text-neutral-content', 'p-10'];
30
+ if (center) classes.push('footer-center');
31
+ if (className) classes.push(className);
32
+
33
+ const footerEl = footer({ class: classes.join(' '), ...rest }, ...children);
34
+
35
+ // Check if we should use shadow DOM
36
+ let usesShadow = false;
37
+ if (LVX.shouldUseShadow) {
38
+ usesShadow = LVX.shouldUseShadow(useShadow);
39
+ } else {
40
+ usesShadow = useShadow === true;
41
+ }
42
+
43
+ if (usesShadow) {
44
+ const adoptedStyleSheets = LVX.getAdoptedStyleSheets ? LVX.getAdoptedStyleSheets() : [];
45
+
46
+ const themeValue = LVX.themeSignal ? () => LVX.themeSignal.value : 'light';
47
+
48
+ return div({ class: 'contents' },
49
+ shadowDOM({ mode: 'open', adoptedStyleSheets },
50
+ div({ 'data-theme': themeValue },
51
+ footerEl
52
+ )
53
+ )
54
+ );
55
+ }
56
+
57
+ return footerEl;
58
+ };
59
+
60
+ /**
61
+ * Footer Title
62
+ */
63
+ Footer.Title = (props = {}, ...children) => {
64
+ const { tags } = window.Lightview || {};
65
+ if (!tags) return null;
66
+
67
+ const { class: className = '', ...rest } = props;
68
+
69
+ return tags.h6({
70
+ class: `footer-title ${className}`.trim(),
71
+ ...rest
72
+ }, ...children);
73
+ };
74
+
75
+ /**
76
+ * Footer Nav - Navigation section within footer
77
+ */
78
+ Footer.Nav = (props = {}, ...children) => {
79
+ const { tags } = window.Lightview || {};
80
+ if (!tags) return null;
81
+
82
+ const { class: className = '', style = '', ...rest } = props;
83
+
84
+ // Use border radius variable for consistent padding
85
+ const defaultStyle = 'padding: var(--rounded-box, 1rem);';
86
+ const combinedStyle = style ? `${defaultStyle} ${style}` : defaultStyle;
87
+
88
+ return tags.nav({
89
+ class: className || undefined,
90
+ style: combinedStyle,
91
+ ...rest
92
+ }, ...children);
93
+ };
94
+
95
+ const tags = window.Lightview.tags;
96
+ tags.Footer = Footer;
97
+ tags['Footer.Title'] = Footer.Title;
98
+ tags['Footer.Nav'] = Footer.Nav;
99
+
100
+ export default Footer;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Lightview Hero Component (DaisyUI)
3
+ * @see https://daisyui.com/components/hero/
4
+ */
5
+
6
+ import '../daisyui.js';
7
+
8
+ /**
9
+ * Hero Component
10
+ * @param {Object} props
11
+ * @param {string} props.bgImage - Background image URL
12
+ * @param {boolean} props.overlay - Add overlay on background
13
+ * @param {boolean} props.useShadow - Render in Shadow DOM with isolated DaisyUI styles
14
+ */
15
+ const Hero = (props = {}, ...children) => {
16
+ const { tags } = window.Lightview || {};
17
+ const LVX = window.LightviewX || {};
18
+
19
+ if (!tags) return null;
20
+
21
+ const { div, shadowDOM } = tags;
22
+
23
+ const {
24
+ bgImage,
25
+ overlay = false,
26
+ useShadow,
27
+ class: className = '',
28
+ style = '',
29
+ ...rest
30
+ } = props;
31
+
32
+ const classes = ['hero', 'min-h-96'];
33
+ if (className) classes.push(className);
34
+
35
+ let styleStr = style;
36
+ if (bgImage) {
37
+ styleStr = `background-image: url("${bgImage}"); ${style}`;
38
+ }
39
+
40
+ const heroContent = [
41
+ overlay ? div({ class: 'hero-overlay bg-opacity-60' }) : null,
42
+ ...children
43
+ ].filter(Boolean);
44
+
45
+ const heroEl = div({
46
+ class: classes.join(' '),
47
+ style: styleStr || undefined,
48
+ ...rest
49
+ }, ...heroContent);
50
+
51
+ // Check if we should use shadow DOM
52
+ let usesShadow = false;
53
+ if (LVX.shouldUseShadow) {
54
+ usesShadow = LVX.shouldUseShadow(useShadow);
55
+ } else {
56
+ usesShadow = useShadow === true;
57
+ }
58
+
59
+ if (usesShadow) {
60
+ const adoptedStyleSheets = LVX.getAdoptedStyleSheets ? LVX.getAdoptedStyleSheets() : [];
61
+
62
+ const themeValue = LVX.themeSignal ? () => LVX.themeSignal.value : 'light';
63
+
64
+ return div({ class: 'contents' },
65
+ shadowDOM({ mode: 'open', adoptedStyleSheets },
66
+ div({ 'data-theme': themeValue },
67
+ heroEl
68
+ )
69
+ )
70
+ );
71
+ }
72
+
73
+ return heroEl;
74
+ };
75
+
76
+ /**
77
+ * Hero Content
78
+ */
79
+ Hero.Content = (props = {}, ...children) => {
80
+ const { tags } = window.Lightview || {};
81
+ if (!tags) return null;
82
+
83
+ const { position = 'center', center, class: className = '', ...rest } = props;
84
+
85
+ const classes = ['hero-content'];
86
+ if (position === 'center' || center === true) classes.push('text-center');
87
+ else if (position === 'start') classes.push('text-start');
88
+ if (className) classes.push(className);
89
+
90
+ return tags.div({ class: classes.join(' '), ...rest }, ...children);
91
+ };
92
+
93
+ /**
94
+ * Hero Overlay
95
+ */
96
+ Hero.Overlay = (props = {}) => {
97
+ const { tags } = window.Lightview || {};
98
+ if (!tags) return null;
99
+
100
+ const { class: className = '', ...rest } = props;
101
+ return tags.div({ class: `hero-overlay bg-opacity-60 ${className}`.trim(), ...rest });
102
+ };
103
+
104
+ const tags = window.Lightview.tags;
105
+ tags.Hero = Hero;
106
+ tags['Hero.Content'] = Hero.Content;
107
+ tags['Hero.Overlay'] = Hero.Overlay;
108
+
109
+ export default Hero;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Lightview Indicator Component (DaisyUI)
3
+ * @see https://daisyui.com/components/indicator/
4
+ */
5
+
6
+ import '../daisyui.js';
7
+
8
+ /**
9
+ * Indicator Component - positions a badge/element on corner of another element
10
+ * @param {Object} props
11
+ * @param {string} props.position - Combination of 'top'|'middle'|'bottom' and 'start'|'center'|'end'
12
+ * @param {boolean} props.useShadow - Render in Shadow DOM with isolated DaisyUI styles
13
+ */
14
+ const Indicator = (props = {}, ...children) => {
15
+ const { tags } = window.Lightview || {};
16
+ const LVX = window.LightviewX || {};
17
+
18
+ if (!tags) return null;
19
+
20
+ const { div, shadowDOM } = tags;
21
+
22
+ const { useShadow, class: className = '', ...rest } = props;
23
+
24
+ const indicatorEl = div({
25
+ class: `indicator ${className}`.trim(),
26
+ ...rest
27
+ }, ...children);
28
+
29
+ // Check if we should use shadow DOM
30
+ let usesShadow = false;
31
+ if (LVX.shouldUseShadow) {
32
+ usesShadow = LVX.shouldUseShadow(useShadow);
33
+ } else {
34
+ usesShadow = useShadow === true;
35
+ }
36
+
37
+ if (usesShadow) {
38
+ const adoptedStyleSheets = LVX.getAdoptedStyleSheets ? LVX.getAdoptedStyleSheets() : [];
39
+
40
+ const themeValue = LVX.themeSignal ? () => LVX.themeSignal.value : 'light';
41
+
42
+ return div({ class: 'contents' },
43
+ shadowDOM({ mode: 'open', adoptedStyleSheets },
44
+ div({ 'data-theme': themeValue },
45
+ indicatorEl
46
+ )
47
+ )
48
+ );
49
+ }
50
+
51
+ return indicatorEl;
52
+ };
53
+
54
+ /**
55
+ * Indicator Item - the positioned element
56
+ */
57
+ Indicator.Item = (props = {}, ...children) => {
58
+ const { tags } = window.Lightview || {};
59
+ if (!tags) return null;
60
+
61
+ const {
62
+ position,
63
+ class: className = '',
64
+ ...rest
65
+ } = props;
66
+
67
+ const classes = ['indicator-item'];
68
+
69
+ // Position classes
70
+ if (position) {
71
+ const [v, h] = position.split('-');
72
+ if (v === 'top') classes.push('indicator-top');
73
+ else if (v === 'middle') classes.push('indicator-middle');
74
+ else if (v === 'bottom') classes.push('indicator-bottom');
75
+
76
+ if (h === 'start') classes.push('indicator-start');
77
+ else if (h === 'center') classes.push('indicator-center');
78
+ else if (h === 'end') classes.push('indicator-end');
79
+ }
80
+
81
+ if (className) classes.push(className);
82
+
83
+ return tags.span({ class: classes.join(' '), ...rest }, ...children);
84
+ };
85
+
86
+ const tags = window.Lightview.tags;
87
+ tags.Indicator = Indicator;
88
+ tags['Indicator.Item'] = Indicator.Item;
89
+
90
+ export default Indicator;
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Lightview Join Component (DaisyUI)
3
+ * @see https://daisyui.com/components/join/
4
+ */
5
+
6
+ import '../daisyui.js';
7
+
8
+ /**
9
+ * Join Component - groups items with shared borders
10
+ * @param {Object} props
11
+ * @param {boolean} props.vertical - Vertical layout
12
+ * @param {boolean} props.useShadow - Render in Shadow DOM with isolated DaisyUI styles
13
+ */
14
+ const Join = (props = {}, ...children) => {
15
+ const { tags } = window.Lightview || {};
16
+ const LVX = window.LightviewX || {};
17
+
18
+ if (!tags) return null;
19
+
20
+ const { div, shadowDOM } = tags;
21
+
22
+ const {
23
+ vertical = false,
24
+ useShadow,
25
+ class: className = '',
26
+ ...rest
27
+ } = props;
28
+
29
+ const classes = ['join'];
30
+ if (vertical) classes.push('join-vertical');
31
+ if (className) classes.push(className);
32
+
33
+ const joinEl = div({ class: classes.join(' '), ...rest }, ...children);
34
+
35
+ // Check if we should use shadow DOM
36
+ let usesShadow = false;
37
+ if (LVX.shouldUseShadow) {
38
+ usesShadow = LVX.shouldUseShadow(useShadow);
39
+ } else {
40
+ usesShadow = useShadow === true;
41
+ }
42
+
43
+ if (usesShadow) {
44
+ const adoptedStyleSheets = LVX.getAdoptedStyleSheets ? LVX.getAdoptedStyleSheets() : [];
45
+
46
+ const themeValue = LVX.themeSignal ? () => LVX.themeSignal.value : 'light';
47
+
48
+ return div({ class: 'contents' },
49
+ shadowDOM({ mode: 'open', adoptedStyleSheets },
50
+ div({ 'data-theme': themeValue },
51
+ joinEl
52
+ )
53
+ )
54
+ );
55
+ }
56
+
57
+ return joinEl;
58
+ };
59
+
60
+ /**
61
+ * Join Item - each joined element should have this class
62
+ */
63
+ Join.Item = (props = {}, ...children) => {
64
+ const { tags } = window.Lightview || {};
65
+ if (!tags) return null;
66
+
67
+ const { as = 'button', class: className = '', ...rest } = props;
68
+ const el = tags[as] || tags.div;
69
+
70
+ return el({
71
+ class: `join-item ${className}`.trim(),
72
+ ...rest
73
+ }, ...children);
74
+ };
75
+
76
+ window.Lightview.tags.Join = Join;
77
+
78
+ export default Join;
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Lightview Navbar Component (DaisyUI)
3
+ * @see https://daisyui.com/components/navbar/
4
+ */
5
+
6
+ import '../daisyui.js';
7
+
8
+ /**
9
+ * Navbar Component
10
+ * @param {Object} props
11
+ * @param {string} props.bg - Background class (e.g., 'bg-base-100')
12
+ * @param {boolean} props.useShadow - Render in Shadow DOM with isolated DaisyUI styles
13
+ */
14
+ const Navbar = (props = {}, ...children) => {
15
+ const { tags } = window.Lightview || {};
16
+ const LVX = window.LightviewX || {};
17
+
18
+ if (!tags) return null;
19
+
20
+ const { div, shadowDOM } = tags;
21
+
22
+ const {
23
+ bg = 'bg-base-100',
24
+ useShadow,
25
+ class: className = '',
26
+ ...rest
27
+ } = props;
28
+
29
+ const classes = ['navbar', bg];
30
+ if (className) classes.push(className);
31
+
32
+ const navbarEl = div({ class: classes.join(' '), ...rest }, ...children);
33
+
34
+ // Check if we should use shadow DOM
35
+ let usesShadow = false;
36
+ if (LVX.shouldUseShadow) {
37
+ usesShadow = LVX.shouldUseShadow(useShadow);
38
+ } else {
39
+ usesShadow = useShadow === true;
40
+ }
41
+
42
+ if (usesShadow) {
43
+ const adoptedStyleSheets = LVX.getAdoptedStyleSheets ? LVX.getAdoptedStyleSheets() : [];
44
+
45
+ const themeValue = LVX.themeSignal ? () => LVX.themeSignal.value : 'light';
46
+
47
+ return div({ class: 'contents' },
48
+ shadowDOM({ mode: 'open', adoptedStyleSheets },
49
+ div({ 'data-theme': themeValue },
50
+ navbarEl
51
+ )
52
+ )
53
+ );
54
+ }
55
+
56
+ return navbarEl;
57
+ };
58
+
59
+ /**
60
+ * Navbar Start
61
+ */
62
+ Navbar.Start = (props = {}, ...children) => {
63
+ const { tags } = window.Lightview || {};
64
+ if (!tags) return null;
65
+
66
+ const { class: className = '', ...rest } = props;
67
+
68
+ return tags.div({
69
+ class: `navbar-start ${className}`.trim(),
70
+ ...rest
71
+ }, ...children);
72
+ };
73
+
74
+ /**
75
+ * Navbar Center
76
+ */
77
+ Navbar.Center = (props = {}, ...children) => {
78
+ const { tags } = window.Lightview || {};
79
+ if (!tags) return null;
80
+
81
+ const { class: className = '', ...rest } = props;
82
+
83
+ return tags.div({
84
+ class: `navbar-center ${className}`.trim(),
85
+ ...rest
86
+ }, ...children);
87
+ };
88
+
89
+ /**
90
+ * Navbar End
91
+ */
92
+ Navbar.End = (props = {}, ...children) => {
93
+ const { tags } = window.Lightview || {};
94
+ if (!tags) return null;
95
+
96
+ const { class: className = '', ...rest } = props;
97
+
98
+ return tags.div({
99
+ class: `navbar-end ${className}`.trim(),
100
+ ...rest
101
+ }, ...children);
102
+ };
103
+
104
+ const tags = window.Lightview.tags;
105
+ tags.Navbar = Navbar;
106
+ tags['Navbar.Start'] = Navbar.Start;
107
+ tags['Navbar.Center'] = Navbar.Center;
108
+ tags['Navbar.End'] = Navbar.End;
109
+
110
+ export default Navbar;