lightview 1.8.1-b → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agent/workflows/daisyui-component-migration.md +155 -0
- package/.codacy/cli.sh +149 -0
- package/.codacy/codacy.yaml +15 -0
- package/.github/instructions/codacy.instructions.md +72 -0
- package/.wranglerignore +21 -0
- package/README.md +1331 -21
- package/_headers +4 -0
- package/build.js +70 -0
- package/components/actions/button.js +151 -0
- package/components/actions/dropdown.js +120 -0
- package/components/actions/modal.js +146 -0
- package/components/actions/swap.js +118 -0
- package/components/daisyui.js +288 -0
- package/components/data-display/accordion.js +128 -0
- package/components/data-display/alert.js +112 -0
- package/components/data-display/avatar.js +170 -0
- package/components/data-display/badge.js +82 -0
- package/components/data-display/card.js +151 -0
- package/components/data-display/carousel.js +94 -0
- package/components/data-display/chart.js +220 -0
- package/components/data-display/chat.js +128 -0
- package/components/data-display/collapse.js +103 -0
- package/components/data-display/countdown.js +69 -0
- package/components/data-display/diff.js +111 -0
- package/components/data-display/kbd.js +65 -0
- package/components/data-display/loading.js +75 -0
- package/components/data-display/progress.js +79 -0
- package/components/data-display/radial-progress.js +88 -0
- package/components/data-display/skeleton.js +66 -0
- package/components/data-display/stats.js +159 -0
- package/components/data-display/table.js +146 -0
- package/components/data-display/timeline.js +146 -0
- package/components/data-display/toast.js +72 -0
- package/components/data-display/tooltip.js +74 -0
- package/components/data-input/checkbox.js +253 -0
- package/components/data-input/file-input.js +224 -0
- package/components/data-input/input.js +264 -0
- package/components/data-input/radio.js +338 -0
- package/components/data-input/range.js +204 -0
- package/components/data-input/rating.js +219 -0
- package/components/data-input/select.js +287 -0
- package/components/data-input/textarea.js +287 -0
- package/components/data-input/toggle.js +201 -0
- package/components/index.js +137 -0
- package/components/layout/divider.js +72 -0
- package/components/layout/drawer.js +142 -0
- package/components/layout/footer.js +100 -0
- package/components/layout/hero.js +109 -0
- package/components/layout/indicator.js +90 -0
- package/components/layout/join.js +78 -0
- package/components/layout/navbar.js +110 -0
- package/components/navigation/breadcrumbs.js +91 -0
- package/components/navigation/dock.js +103 -0
- package/components/navigation/menu.js +126 -0
- package/components/navigation/pagination.js +105 -0
- package/components/navigation/steps.js +89 -0
- package/components/navigation/tabs.css +177 -0
- package/components/navigation/tabs.js +123 -0
- package/components/theme/theme-switch.css +65 -0
- package/components/theme/theme-switch.js +177 -0
- package/docs/about.html +164 -0
- package/docs/api/computed.html +184 -0
- package/docs/api/effects.html +173 -0
- package/docs/api/elements.html +180 -0
- package/docs/api/enhance.html +225 -0
- package/docs/api/hypermedia.html +165 -0
- package/docs/api/index.html +178 -0
- package/docs/api/nav.html +18 -0
- package/docs/api/signals.html +136 -0
- package/docs/api/state.html +217 -0
- package/docs/assets/images/logo-favicon.svg +42 -0
- package/docs/assets/images/logo-static.svg +40 -0
- package/docs/assets/images/logo.svg +66 -0
- package/docs/assets/js/examplify.js +395 -0
- package/docs/assets/styles/site.css +1102 -0
- package/docs/assets/styles/themes.css +236 -0
- package/docs/components/accordion.html +439 -0
- package/docs/components/alert.html +528 -0
- package/docs/components/avatar.html +586 -0
- package/docs/components/badge.html +531 -0
- package/docs/components/breadcrumbs.html +278 -0
- package/docs/components/button.html +579 -0
- package/docs/components/card.html +561 -0
- package/docs/components/carousel.html +286 -0
- package/docs/components/chart-area.html +702 -0
- package/docs/components/chart-bar.html +782 -0
- package/docs/components/chart-column.html +735 -0
- package/docs/components/chart-line.html +794 -0
- package/docs/components/chart-pie.html +823 -0
- package/docs/components/chart.html +612 -0
- package/docs/components/chat.html +547 -0
- package/docs/components/checkbox.html +641 -0
- package/docs/components/collapse.html +536 -0
- package/docs/components/component-nav.html +53 -0
- package/docs/components/countdown.html +470 -0
- package/docs/components/diff.html +245 -0
- package/docs/components/divider.html +240 -0
- package/docs/components/dock.html +277 -0
- package/docs/components/drawer.html +515 -0
- package/docs/components/dropdown.html +479 -0
- package/docs/components/file-input.html +591 -0
- package/docs/components/footer.html +301 -0
- package/docs/components/gallery.html +504 -0
- package/docs/components/hero.html +264 -0
- package/docs/components/index.css +840 -0
- package/docs/components/index.html +735 -0
- package/docs/components/indicator.html +342 -0
- package/docs/components/input.html +644 -0
- package/docs/components/join.html +285 -0
- package/docs/components/kbd.html +322 -0
- package/docs/components/loading.html +521 -0
- package/docs/components/menu.html +461 -0
- package/docs/components/modal.html +639 -0
- package/docs/components/navbar.html +321 -0
- package/docs/components/pagination.html +279 -0
- package/docs/components/progress.html +514 -0
- package/docs/components/radial-progress.html +434 -0
- package/docs/components/radio.html +655 -0
- package/docs/components/range.html +611 -0
- package/docs/components/rating.html +642 -0
- package/docs/components/select.html +696 -0
- package/docs/components/sidebar-setup.js +93 -0
- package/docs/components/skeleton.html +447 -0
- package/docs/components/spinner.html +68 -0
- package/docs/components/stats.html +486 -0
- package/docs/components/steps.html +356 -0
- package/docs/components/swap.html +517 -0
- package/docs/components/switch.html +68 -0
- package/docs/components/table.html +668 -0
- package/docs/components/tabs.html +506 -0
- package/docs/components/text-input.html +68 -0
- package/docs/components/textarea.html +603 -0
- package/docs/components/timeline.html +487 -0
- package/docs/components/toast.html +474 -0
- package/docs/components/toggle.html +564 -0
- package/docs/components/tooltip.html +423 -0
- package/docs/examples/getting-started-example.html +40 -0
- package/docs/examples/index.html +93 -0
- package/docs/getting-started/index.html +739 -0
- package/docs/getting-started/reviews.html +23 -0
- package/docs/getting-started/reviews.odom +108 -0
- package/docs/getting-started/reviews.vdom +84 -0
- package/docs/index.html +134 -0
- package/docs/playground.html +416 -0
- package/docs/router.html +285 -0
- package/docs/styles/index.html +190 -0
- package/functions/_middleware.js +32 -0
- package/index.html +309 -0
- package/lightview-router.js +364 -0
- package/lightview-x.js +1577 -0
- package/lightview.js +658 -1109
- package/lightview.js.backup +793 -0
- package/middleware/locale.js +25 -0
- package/middleware/markdown.js +44 -0
- package/middleware/notFound.js +37 -0
- package/package.json +27 -41
- package/watch.js +92 -0
- package/wrangler.toml +12 -0
- package/.idea/lightview.iml +0 -12
- package/.idea/modules.xml +0 -8
- package/.idea/vcs.xml +0 -6
- package/LICENSE +0 -21
- package/codepen-no-tabs-embed.css +0 -2
- package/components/chart/chart.html +0 -17
- package/components/chart/example.html +0 -32
- package/components/chart.html +0 -83
- package/components/components.js +0 -113
- package/components/gantt/example.html +0 -22
- package/components/gantt/gantt.html +0 -42
- package/components/gauge/example.html +0 -28
- package/components/gauge/gauge.html +0 -20
- package/components/gauge.html +0 -60
- package/components/orgchart/example.html +0 -25
- package/components/orgchart/orgchart.html +0 -41
- package/components/repl/code-editor.html +0 -64
- package/components/repl/editor.html +0 -37
- package/components/repl/editorjs-inline-tool/index.js +0 -3
- package/components/repl/editorjs-inline-tool/inline-tools.js +0 -28
- package/components/repl/editorjs-inline-tool/tool.js +0 -175
- package/components/repl/repl-with-wysiwyg.html +0 -355
- package/components/repl/repl.html +0 -345
- package/components/repl/sup.js +0 -44
- package/components/repl/wysiwyg-repl.html +0 -258
- package/components/timeline/example.html +0 -33
- package/components/timeline/timeline.html +0 -44
- package/components/timeline.html +0 -81
- package/examples/anchor.html +0 -11
- package/examples/chart.html +0 -34
- package/examples/counter.html +0 -26
- package/examples/counter.test.mjs +0 -47
- package/examples/counter2.html +0 -26
- package/examples/directives.html +0 -79
- package/examples/foreign.html +0 -50
- package/examples/forgeinform.html +0 -98
- package/examples/form.html +0 -61
- package/examples/gauge.html +0 -18
- package/examples/invalid-template-literals.html +0 -44
- package/examples/medium/remote.html +0 -60
- package/examples/message.html +0 -18
- package/examples/nested.html +0 -11
- package/examples/object-bound-form.html +0 -34
- package/examples/remote-server.js +0 -51
- package/examples/remote.html +0 -34
- package/examples/remote.json +0 -1
- package/examples/scratch.html +0 -69
- package/examples/sensors/index.html +0 -30
- package/examples/sensors/sensor-server.js +0 -30
- package/examples/shared.html +0 -41
- package/examples/template.html +0 -33
- package/examples/timeline.html +0 -21
- package/examples/todo.html +0 -38
- package/examples/top.html +0 -10
- package/examples/types.html +0 -94
- package/examples/xor.html +0 -62
- package/jest-puppeteer.config.js +0 -5
- package/jest.config.json +0 -12
- package/sites/client.html +0 -48
- package/sites/index.html +0 -247
- package/test/basic.html +0 -93
- package/test/basic.test.mjs +0 -315
- package/test/extended.html +0 -29
- package/test/extended.test.mjs +0 -448
- package/types.js +0 -534
- package/unsplash.key +0 -1
|
@@ -0,0 +1,564 @@
|
|
|
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: 'Toggle' }
|
|
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">Toggle</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
|
+
Toggle is a checkbox styled as a switch.
|
|
61
|
+
Used for binary choices or switching settings on/off.
|
|
62
|
+
</p>
|
|
63
|
+
|
|
64
|
+
<!-- Basic Example with Examplify -->
|
|
65
|
+
<div class="card bg-base-200" style="margin-bottom: 2rem;">
|
|
66
|
+
<div class="card-body">
|
|
67
|
+
<h2 class="card-title">Basic Examples</h2>
|
|
68
|
+
<p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Toggle switches with various
|
|
69
|
+
configurations</p>
|
|
70
|
+
|
|
71
|
+
<!-- Tabs -->
|
|
72
|
+
<script>
|
|
73
|
+
window.switchSyntaxTab = (tabId) => {
|
|
74
|
+
const tabs = ['tagged', 'vdom', 'object', 'html'];
|
|
75
|
+
tabs.forEach(t => {
|
|
76
|
+
const tabEl = document.getElementById(`tab-btn-${t}`);
|
|
77
|
+
const contentEl = document.getElementById(`syntax-${t}`);
|
|
78
|
+
if (t === tabId) {
|
|
79
|
+
tabEl.classList.add('syntax-tab-active');
|
|
80
|
+
contentEl.style.display = 'block';
|
|
81
|
+
} else {
|
|
82
|
+
tabEl.classList.remove('syntax-tab-active');
|
|
83
|
+
contentEl.style.display = 'none';
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
</script>
|
|
88
|
+
<div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
|
|
89
|
+
<button id="tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
|
|
90
|
+
onclick="switchSyntaxTab('tagged')">Tagged</button>
|
|
91
|
+
<button id="tab-btn-vdom" role="tab" class="syntax-tab"
|
|
92
|
+
onclick="switchSyntaxTab('vdom')">vDOM</button>
|
|
93
|
+
<button id="tab-btn-object" role="tab" class="syntax-tab"
|
|
94
|
+
onclick="switchSyntaxTab('object')">Object
|
|
95
|
+
DOM</button>
|
|
96
|
+
<button id="tab-btn-html" role="tab" class="syntax-tab"
|
|
97
|
+
onclick="switchSyntaxTab('html')">HTML</button>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<!-- Tagged Syntax -->
|
|
101
|
+
<div id="syntax-tagged">
|
|
102
|
+
<pre><script>
|
|
103
|
+
examplify(document.currentScript.nextElementSibling, {
|
|
104
|
+
at: document.currentScript.parentElement,
|
|
105
|
+
scripts: ['/lightview.js', '/lightview-x.js'],
|
|
106
|
+
styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
|
|
107
|
+
type: 'module',
|
|
108
|
+
minHeight: 280,
|
|
109
|
+
autoRun: true
|
|
110
|
+
});
|
|
111
|
+
</script><code contenteditable="true">await import('/components/data-input/toggle.js');
|
|
112
|
+
const { tags, $ } = Lightview;
|
|
113
|
+
const { div, Toggle } = tags;
|
|
114
|
+
|
|
115
|
+
// 1. Basic toggle
|
|
116
|
+
const basic = Toggle({
|
|
117
|
+
label: 'Wi-Fi',
|
|
118
|
+
defaultChecked: true,
|
|
119
|
+
color: 'primary'
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// 2. Toggle with description
|
|
123
|
+
const withDesc = Toggle({
|
|
124
|
+
label: 'Dark Mode',
|
|
125
|
+
description: 'Switch between light and dark themes',
|
|
126
|
+
color: 'secondary'
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// 3. Toggle with label on right
|
|
130
|
+
const labelRight = Toggle({
|
|
131
|
+
label: 'Notifications',
|
|
132
|
+
labelPosition: 'right',
|
|
133
|
+
color: 'accent'
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
// 4. Disabled toggle
|
|
137
|
+
const disabled = Toggle({
|
|
138
|
+
label: 'Maintenance Mode',
|
|
139
|
+
defaultChecked: true,
|
|
140
|
+
disabled: true
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// Insert all examples
|
|
144
|
+
$('#example').content(
|
|
145
|
+
div({ style: 'display: flex; flex-direction: column; gap: 1rem' }, basic, withDesc, labelRight, disabled)
|
|
146
|
+
);</code></pre>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<!-- vDOM Syntax -->
|
|
150
|
+
<div id="syntax-vdom" style="display: none;">
|
|
151
|
+
<pre><script>
|
|
152
|
+
examplify(document.currentScript.nextElementSibling, {
|
|
153
|
+
at: document.currentScript.parentElement,
|
|
154
|
+
scripts: ['/lightview.js', '/lightview-x.js'],
|
|
155
|
+
styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
|
|
156
|
+
type: 'module',
|
|
157
|
+
minHeight: 280
|
|
158
|
+
});
|
|
159
|
+
</script><code contenteditable="true">await import('/components/data-input/toggle.js');
|
|
160
|
+
const { $, tags } = Lightview;
|
|
161
|
+
const { Toggle } = tags;
|
|
162
|
+
|
|
163
|
+
const demo = {
|
|
164
|
+
tag: 'div',
|
|
165
|
+
attributes: { style: 'display: flex; flex-direction: column; gap: 1rem' },
|
|
166
|
+
children: [
|
|
167
|
+
{
|
|
168
|
+
tag: Toggle,
|
|
169
|
+
attributes: { label: 'Wi-Fi', defaultChecked: true, color: 'primary' }
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
tag: Toggle,
|
|
173
|
+
attributes: { label: 'Dark Mode', description: 'Switch between light and dark themes', color: 'secondary' }
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
tag: Toggle,
|
|
177
|
+
attributes: { label: 'Notifications', labelPosition: 'right', color: 'accent' }
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
tag: Toggle,
|
|
181
|
+
attributes: { label: 'Maintenance Mode', defaultChecked: true, disabled: true }
|
|
182
|
+
}
|
|
183
|
+
]
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
$('#example').content(demo);</code></pre>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
<!-- Object DOM Syntax -->
|
|
190
|
+
<div id="syntax-object" style="display: none;">
|
|
191
|
+
<pre><script>
|
|
192
|
+
examplify(document.currentScript.nextElementSibling, {
|
|
193
|
+
at: document.currentScript.parentElement,
|
|
194
|
+
scripts: ['/lightview.js', '/lightview-x.js'],
|
|
195
|
+
styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
|
|
196
|
+
type: 'module',
|
|
197
|
+
minHeight: 280
|
|
198
|
+
});
|
|
199
|
+
</script><code contenteditable="true">await import('/components/data-input/toggle.js');
|
|
200
|
+
const { $ } = Lightview;
|
|
201
|
+
|
|
202
|
+
const demo = {
|
|
203
|
+
div: {
|
|
204
|
+
style: 'display: flex; flex-direction: column; gap: 1rem',
|
|
205
|
+
children: [
|
|
206
|
+
{
|
|
207
|
+
Toggle: { label: 'Wi-Fi', defaultChecked: true, color: 'primary' }
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
Toggle: { label: 'Dark Mode', description: 'Switch between light and dark themes', color: 'secondary' }
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
Toggle: { label: 'Notifications', labelPosition: 'right', color: 'accent' }
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
Toggle: { label: 'Maintenance Mode', defaultChecked: true, disabled: true }
|
|
217
|
+
}
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
$('#example').content(demo);</code></pre>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
<!-- HTML Syntax -->
|
|
226
|
+
<div id="syntax-html" style="display: none;">
|
|
227
|
+
<pre><script>
|
|
228
|
+
examplify(document.currentScript.nextElementSibling, {
|
|
229
|
+
at: document.currentScript.parentElement,
|
|
230
|
+
scripts: ['/lightview.js', '/lightview-x.js'],
|
|
231
|
+
styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
|
|
232
|
+
type: 'module',
|
|
233
|
+
language: 'html',
|
|
234
|
+
minHeight: 280
|
|
235
|
+
});
|
|
236
|
+
</script><code contenteditable="true" class="language-html"><!-- Import the component (registers lv-toggle) -->
|
|
237
|
+
<script type="module" src="/components/data-input/toggle.js"></script>
|
|
238
|
+
|
|
239
|
+
<div style="display: flex; flex-direction: column; gap: 1rem;">
|
|
240
|
+
<lv-toggle label="Wi-Fi" default-checked color="primary"></lv-toggle>
|
|
241
|
+
<lv-toggle label="Dark Mode" description="Switch between light and dark themes" color="secondary"></lv-toggle>
|
|
242
|
+
<lv-toggle label="Notifications" label-position="right" color="accent"></lv-toggle>
|
|
243
|
+
<lv-toggle label="Maintenance Mode" default-checked disabled></lv-toggle>
|
|
244
|
+
</div></code></pre>
|
|
245
|
+
</div>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
<!-- Reactive Example with Examplify -->
|
|
251
|
+
<div class="card bg-base-200" style="margin-bottom: 2rem;">
|
|
252
|
+
<div class="card-body">
|
|
253
|
+
<h2 class="card-title">Reactive Example</h2>
|
|
254
|
+
<p class="text-sm" style="opacity: 0.7; margin-bottom: 1rem;">Two-way binding with signals
|
|
255
|
+
</p>
|
|
256
|
+
|
|
257
|
+
<!-- Tabs -->
|
|
258
|
+
<script>
|
|
259
|
+
window.switchReactiveSyntaxTab = (tabId) => {
|
|
260
|
+
const tabs = ['tagged', 'vdom', 'object'];
|
|
261
|
+
tabs.forEach(t => {
|
|
262
|
+
const tabEl = document.getElementById(`reactive-tab-btn-${t}`);
|
|
263
|
+
const contentEl = document.getElementById(`reactive-syntax-${t}`);
|
|
264
|
+
if (t === tabId) {
|
|
265
|
+
tabEl.classList.add('syntax-tab-active');
|
|
266
|
+
contentEl.style.display = 'block';
|
|
267
|
+
} else {
|
|
268
|
+
tabEl.classList.remove('syntax-tab-active');
|
|
269
|
+
contentEl.style.display = 'none';
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
};
|
|
273
|
+
</script>
|
|
274
|
+
<div role="tablist" class="syntax-tabs" style="margin-bottom: 1rem;">
|
|
275
|
+
<button id="reactive-tab-btn-tagged" role="tab" class="syntax-tab syntax-tab-active"
|
|
276
|
+
onclick="switchReactiveSyntaxTab('tagged')">Tagged</button>
|
|
277
|
+
<button id="reactive-tab-btn-vdom" role="tab" class="syntax-tab"
|
|
278
|
+
onclick="switchReactiveSyntaxTab('vdom')">vDOM</button>
|
|
279
|
+
<button id="reactive-tab-btn-object" role="tab" class="syntax-tab"
|
|
280
|
+
onclick="switchReactiveSyntaxTab('object')">Object DOM</button>
|
|
281
|
+
</div>
|
|
282
|
+
|
|
283
|
+
<!-- Tagged Syntax -->
|
|
284
|
+
<div id="reactive-syntax-tagged">
|
|
285
|
+
<pre><script>
|
|
286
|
+
examplify(document.currentScript.nextElementSibling, {
|
|
287
|
+
at: document.currentScript.parentElement,
|
|
288
|
+
scripts: ['/lightview.js', '/lightview-x.js'],
|
|
289
|
+
styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
|
|
290
|
+
type: 'module',
|
|
291
|
+
minHeight: 300
|
|
292
|
+
});
|
|
293
|
+
</script><code contenteditable="true">await import('/components/data-input/toggle.js');
|
|
294
|
+
const { signal, tags, $ } = Lightview;
|
|
295
|
+
const { div, p, Toggle } = tags;
|
|
296
|
+
|
|
297
|
+
// Signals for settings
|
|
298
|
+
const wifi = signal(true);
|
|
299
|
+
const bluetooth = signal(false);
|
|
300
|
+
const airplane = signal(false);
|
|
301
|
+
|
|
302
|
+
// Reactive toggles
|
|
303
|
+
const reactiveDemo = div({ style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 24rem' },
|
|
304
|
+
Toggle({
|
|
305
|
+
label: 'Wi-Fi',
|
|
306
|
+
description: () => wifi.value ? 'Connected to HomeNetwork' : 'Disconnected',
|
|
307
|
+
checked: wifi,
|
|
308
|
+
color: 'primary'
|
|
309
|
+
}),
|
|
310
|
+
Toggle({
|
|
311
|
+
label: 'Bluetooth',
|
|
312
|
+
description: () => bluetooth.value ? 'Discoverable' : 'Off',
|
|
313
|
+
checked: bluetooth,
|
|
314
|
+
color: 'info'
|
|
315
|
+
}),
|
|
316
|
+
Toggle({
|
|
317
|
+
label: 'Airplane Mode',
|
|
318
|
+
description: 'Disables all wireless connections',
|
|
319
|
+
checked: airplane,
|
|
320
|
+
color: 'warning'
|
|
321
|
+
}),
|
|
322
|
+
div({ class: 'divider' }),
|
|
323
|
+
p({ class: 'text-sm font-mono opacity-70' },
|
|
324
|
+
() => `WiFi: ${wifi.value}, BT: ${bluetooth.value}, Airplane: ${airplane.value}`
|
|
325
|
+
)
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
$('#example').content(reactiveDemo);</code></pre>
|
|
329
|
+
</div>
|
|
330
|
+
|
|
331
|
+
<!-- vDOM Syntax -->
|
|
332
|
+
<div id="reactive-syntax-vdom" style="display: none;">
|
|
333
|
+
<pre><script>
|
|
334
|
+
examplify(document.currentScript.nextElementSibling, {
|
|
335
|
+
at: document.currentScript.parentElement,
|
|
336
|
+
scripts: ['/lightview.js', '/lightview-x.js'],
|
|
337
|
+
styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
|
|
338
|
+
type: 'module',
|
|
339
|
+
minHeight: 300
|
|
340
|
+
});
|
|
341
|
+
</script><code contenteditable="true">await import('/components/data-input/toggle.js');
|
|
342
|
+
const { signal, $, tags } = Lightview;
|
|
343
|
+
const { Toggle } = tags;
|
|
344
|
+
|
|
345
|
+
const wifi = signal(true);
|
|
346
|
+
const bluetooth = signal(false);
|
|
347
|
+
const airplane = signal(false);
|
|
348
|
+
|
|
349
|
+
const demo = {
|
|
350
|
+
tag: 'div',
|
|
351
|
+
attributes: { style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 24rem' },
|
|
352
|
+
children: [
|
|
353
|
+
{
|
|
354
|
+
tag: Toggle,
|
|
355
|
+
attributes: {
|
|
356
|
+
label: 'Wi-Fi',
|
|
357
|
+
description: () => wifi.value ? 'Connected to HomeNetwork' : 'Disconnected',
|
|
358
|
+
checked: wifi,
|
|
359
|
+
color: 'primary'
|
|
360
|
+
}
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
tag: Toggle,
|
|
364
|
+
attributes: {
|
|
365
|
+
label: 'Bluetooth',
|
|
366
|
+
description: () => bluetooth.value ? 'Discoverable' : 'Off',
|
|
367
|
+
checked: bluetooth,
|
|
368
|
+
color: 'info'
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
{
|
|
372
|
+
tag: Toggle,
|
|
373
|
+
attributes: {
|
|
374
|
+
label: 'Airplane Mode',
|
|
375
|
+
description: 'Disables all wireless connections',
|
|
376
|
+
checked: airplane,
|
|
377
|
+
color: 'warning'
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
{ tag: 'div', attributes: { class: 'divider' } },
|
|
381
|
+
{
|
|
382
|
+
tag: 'p',
|
|
383
|
+
attributes: { class: 'text-sm font-mono opacity-70' },
|
|
384
|
+
children: [() => `WiFi: ${wifi.value}, BT: ${bluetooth.value}, Airplane: ${airplane.value}`]
|
|
385
|
+
}
|
|
386
|
+
]
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
$('#example').content(demo);</code></pre>
|
|
390
|
+
</div>
|
|
391
|
+
|
|
392
|
+
<!-- Object DOM Syntax -->
|
|
393
|
+
<div id="reactive-syntax-object" style="display: none;">
|
|
394
|
+
<pre><script>
|
|
395
|
+
examplify(document.currentScript.nextElementSibling, {
|
|
396
|
+
at: document.currentScript.parentElement,
|
|
397
|
+
scripts: ['/lightview.js', '/lightview-x.js'],
|
|
398
|
+
styles: ['https://cdn.jsdelivr.net/npm/daisyui@3.9.4/dist/full.min.css'],
|
|
399
|
+
type: 'module',
|
|
400
|
+
minHeight: 300
|
|
401
|
+
});
|
|
402
|
+
</script><code contenteditable="true">await import('/components/data-input/toggle.js');
|
|
403
|
+
const { signal, $ } = Lightview;
|
|
404
|
+
|
|
405
|
+
const wifi = signal(true);
|
|
406
|
+
const bluetooth = signal(false);
|
|
407
|
+
const airplane = signal(false);
|
|
408
|
+
|
|
409
|
+
const demo = {
|
|
410
|
+
div: {
|
|
411
|
+
style: 'display: flex; flex-direction: column; gap: 1rem; max-width: 24rem',
|
|
412
|
+
children: [
|
|
413
|
+
{
|
|
414
|
+
Toggle: {
|
|
415
|
+
label: 'Wi-Fi',
|
|
416
|
+
description: () => wifi.value ? 'Connected to HomeNetwork' : 'Disconnected',
|
|
417
|
+
checked: wifi,
|
|
418
|
+
color: 'primary'
|
|
419
|
+
}
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
Toggle: {
|
|
423
|
+
label: 'Bluetooth',
|
|
424
|
+
description: () => bluetooth.value ? 'Discoverable' : 'Off',
|
|
425
|
+
checked: bluetooth,
|
|
426
|
+
color: 'info'
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
Toggle: {
|
|
431
|
+
label: 'Airplane Mode',
|
|
432
|
+
description: 'Disables all wireless connections',
|
|
433
|
+
checked: airplane,
|
|
434
|
+
color: 'warning'
|
|
435
|
+
}
|
|
436
|
+
},
|
|
437
|
+
{ div: { class: 'divider' } },
|
|
438
|
+
{
|
|
439
|
+
p: {
|
|
440
|
+
class: 'text-sm font-mono opacity-70',
|
|
441
|
+
children: [() => `WiFi: ${wifi.value}, BT: ${bluetooth.value}, Airplane: ${airplane.value}`]
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
]
|
|
445
|
+
}
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
$('#example').content(demo);</code></pre>
|
|
449
|
+
</div>
|
|
450
|
+
</div>
|
|
451
|
+
</div>
|
|
452
|
+
|
|
453
|
+
<!-- Props Table -->
|
|
454
|
+
<h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Props</h2>
|
|
455
|
+
<div style="overflow-x: auto; margin-bottom: 2rem;">
|
|
456
|
+
<table class="table table-zebra">
|
|
457
|
+
<thead>
|
|
458
|
+
<tr>
|
|
459
|
+
<th>Prop</th>
|
|
460
|
+
<th>Type</th>
|
|
461
|
+
<th>Default</th>
|
|
462
|
+
<th>Description</th>
|
|
463
|
+
</tr>
|
|
464
|
+
</thead>
|
|
465
|
+
<tbody>
|
|
466
|
+
<tr>
|
|
467
|
+
<td><code>checked</code></td>
|
|
468
|
+
<td>boolean | signal</td>
|
|
469
|
+
<td>-</td>
|
|
470
|
+
<td>Checked state (reactive with signals)</td>
|
|
471
|
+
</tr>
|
|
472
|
+
<tr>
|
|
473
|
+
<td><code>defaultChecked</code></td>
|
|
474
|
+
<td>boolean</td>
|
|
475
|
+
<td>false</td>
|
|
476
|
+
<td>Default checked state for uncontrolled mode</td>
|
|
477
|
+
</tr>
|
|
478
|
+
<tr>
|
|
479
|
+
<td><code>label</code></td>
|
|
480
|
+
<td>string</td>
|
|
481
|
+
<td>-</td>
|
|
482
|
+
<td>Label text displayed next to toggle</td>
|
|
483
|
+
</tr>
|
|
484
|
+
<tr>
|
|
485
|
+
<td><code>labelPosition</code></td>
|
|
486
|
+
<td>string</td>
|
|
487
|
+
<td>'left'</td>
|
|
488
|
+
<td>'left' | 'right' - Position of label relative to toggle</td>
|
|
489
|
+
</tr>
|
|
490
|
+
<tr>
|
|
491
|
+
<td><code>description</code></td>
|
|
492
|
+
<td>string | function</td>
|
|
493
|
+
<td>-</td>
|
|
494
|
+
<td>Description text below the label (can be reactive)</td>
|
|
495
|
+
</tr>
|
|
496
|
+
<tr>
|
|
497
|
+
<td><code>color</code></td>
|
|
498
|
+
<td>string</td>
|
|
499
|
+
<td>-</td>
|
|
500
|
+
<td>'primary' | 'secondary' | 'accent' | 'info' | 'success' | 'warning' | 'error'
|
|
501
|
+
</td>
|
|
502
|
+
</tr>
|
|
503
|
+
<tr>
|
|
504
|
+
<td><code>size</code></td>
|
|
505
|
+
<td>string</td>
|
|
506
|
+
<td>'md'</td>
|
|
507
|
+
<td>'xs' | 'sm' | 'md' | 'lg'</td>
|
|
508
|
+
</tr>
|
|
509
|
+
<tr>
|
|
510
|
+
<td><code>disabled</code></td>
|
|
511
|
+
<td>boolean</td>
|
|
512
|
+
<td>false</td>
|
|
513
|
+
<td>Disable the toggle</td>
|
|
514
|
+
</tr>
|
|
515
|
+
<tr>
|
|
516
|
+
<td><code>onChange</code></td>
|
|
517
|
+
<td>function</td>
|
|
518
|
+
<td>-</td>
|
|
519
|
+
<td>Callback when value changes: <code>(checked, event) => void</code></td>
|
|
520
|
+
</tr>
|
|
521
|
+
<tr>
|
|
522
|
+
<td><code>useShadow</code></td>
|
|
523
|
+
<td>boolean</td>
|
|
524
|
+
<td>*</td>
|
|
525
|
+
<td>Render in Shadow DOM. *Follows global <code>initComponents()</code> setting</td>
|
|
526
|
+
</tr>
|
|
527
|
+
</tbody>
|
|
528
|
+
</table>
|
|
529
|
+
</div>
|
|
530
|
+
|
|
531
|
+
<!-- Colors Example -->
|
|
532
|
+
<h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Colors</h2>
|
|
533
|
+
<div class="example-flex" style="margin-bottom: 2rem;">
|
|
534
|
+
<input type="checkbox" class="toggle" checked />
|
|
535
|
+
<input type="checkbox" class="toggle toggle-primary" checked />
|
|
536
|
+
<input type="checkbox" class="toggle toggle-secondary" checked />
|
|
537
|
+
<input type="checkbox" class="toggle toggle-accent" checked />
|
|
538
|
+
<input type="checkbox" class="toggle toggle-success" checked />
|
|
539
|
+
<input type="checkbox" class="toggle toggle-warning" checked />
|
|
540
|
+
<input type="checkbox" class="toggle toggle-info" checked />
|
|
541
|
+
<input type="checkbox" class="toggle toggle-error" checked />
|
|
542
|
+
</div>
|
|
543
|
+
|
|
544
|
+
<!-- Sizes Example -->
|
|
545
|
+
<h2 class="text-xl font-bold" style="margin-bottom: 1rem;">Sizes</h2>
|
|
546
|
+
<div class="example-flex" style="margin-bottom: 2rem;">
|
|
547
|
+
<input type="checkbox" class="toggle toggle-xs" checked />
|
|
548
|
+
<input type="checkbox" class="toggle toggle-sm" checked />
|
|
549
|
+
<input type="checkbox" class="toggle toggle-md" checked />
|
|
550
|
+
<input type="checkbox" class="toggle toggle-lg" checked />
|
|
551
|
+
</div>
|
|
552
|
+
|
|
553
|
+
<!-- With Label -->
|
|
554
|
+
<h2 class="text-xl font-bold" style="margin-bottom: 1rem;">With Label</h2>
|
|
555
|
+
<div class="form-control w-52" style="margin-bottom: 2rem;">
|
|
556
|
+
<label class="label cursor-pointer">
|
|
557
|
+
<span class="label-text">Remember me</span>
|
|
558
|
+
<input type="checkbox" class="toggle toggle-primary" checked />
|
|
559
|
+
</label>
|
|
560
|
+
</div>
|
|
561
|
+
</div>
|
|
562
|
+
</div>
|
|
563
|
+
</div>
|
|
564
|
+
</div>
|