@invisibleloop/pulse 0.20.11 → 0.20.20
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/package.json +6 -5
- package/public/.pulse-ui-version +1 -1
- package/scripts/build.js +26 -0
- package/scripts/release-version.js +17 -8
- package/scripts/strip-server.test.js +60 -0
- package/src/agent/checklist.md +8 -12
- package/src/agent/commands/pulse-start.md +2 -0
- package/src/agent/commands/verify.md +30 -8
- package/src/agent/guide-components.md +7 -25
- package/src/agent/guide-routing.md +0 -12
- package/src/agent/guide-server.md +102 -1
- package/src/agent/guide-spec.md +8 -1
- package/src/agent/guide-styles.md +23 -0
- package/src/agent/identity.md +9 -0
- package/src/agent/workflow.md +4 -23
- package/src/cli/check-bundles.js +113 -0
- package/src/cli/check-bundles.test.js +137 -0
- package/src/cli/cli.test.js +105 -0
- package/src/cli/dev.js +48 -3
- package/src/cli/diagnose.js +105 -0
- package/src/cli/diagnose.test.js +124 -0
- package/src/cli/discover.js +9 -2
- package/src/cli/index.js +171 -9
- package/src/cli/process-utils.js +57 -0
- package/src/cli/process-utils.test.js +114 -0
- package/src/cli/review.js +391 -0
- package/src/cli/review.test.js +143 -0
- package/src/cli/scaffold.js +9 -4
- package/src/cli/stamp.js +102 -0
- package/src/cli/stamp.test.js +149 -0
- package/src/cli/start.js +15 -2
- package/src/cli/validate.js +184 -0
- package/src/cli/validate.test.js +153 -0
- package/src/mcp/mcp.test.js +261 -30
- package/src/mcp/server.js +207 -515
- package/src/mcp/validate-worker.js +18 -1
- package/src/runtime/index.js +144 -11
- package/src/runtime/runtime.test.js +199 -0
- package/src/runtime/ssr.js +13 -6
- package/src/runtime/ssr.test.js +31 -0
- package/src/server/index.js +162 -9
- package/src/server/server.test.js +225 -2
- package/src/spec/schema.js +1 -1
- package/src/ui/index.js +0 -5
- package/src/ui/ui.test.js +0 -75
- package/types/ui.d.ts +0 -21
- package/.claude/commands/build-page.md +0 -63
- package/.claude/commands/new-doc-page.md +0 -45
- package/.claude/commands/pulse-start.md +0 -11
- package/.claude/commands/pulse-stop.md +0 -5
- package/.claude/commands/verify.md +0 -118
- package/.claude/pulse-checklist.md +0 -189
- package/.github/workflows/ci.yml +0 -25
- package/.github/workflows/publish.yml +0 -45
- package/.pulse/load-reports/home/1773432711417.json +0 -22
- package/.pulse-verified +0 -1
- package/AGENTS.md +0 -697
- package/CLAUDE.md +0 -697
- package/README.md +0 -95
- package/benchmark/public/dist/counter.boot-PO6SNSJZ.js +0 -8
- package/benchmark/public/dist/home.boot-YK6VAEQI.js +0 -6
- package/benchmark/public/dist/manifest.json +0 -5
- package/benchmark/public/dist/runtime-5Y7ESAIB.js +0 -2
- package/benchmark/public/dist/runtime-KO4BHUQ3.js +0 -49
- package/benchmark/results/2026-03-27-09-20.json +0 -188
- package/benchmark/results/2026-03-27-09-21.json +0 -188
- package/benchmark/results/2026-03-27-09-29.json +0 -188
- package/benchmark/results/2026-03-27-10-14.json +0 -188
- package/benchmark/results/2026-03-27-10-18.json +0 -232
- package/benchmark/src/pages/counter.js +0 -37
- package/benchmark/src/pages/home.js +0 -21
- package/docs/.claude/commands/pulse-build.md +0 -7
- package/docs/.claude/commands/pulse-dev.md +0 -7
- package/docs/.claude/commands/pulse-start.md +0 -9
- package/docs/.claude/commands/pulse-stop.md +0 -5
- package/docs/.claude/commands/verify.md +0 -84
- package/docs/.claude/coverage-check.js +0 -196
- package/docs/.claude/pulse-checklist.md +0 -189
- package/docs/public/.pulse-ui-version +0 -1
- package/docs/public/andypixel.css +0 -237
- package/docs/public/bookworms.css +0 -422
- package/docs/public/coutumes.css +0 -561
- package/docs/public/docs.css +0 -2388
- package/docs/public/favicon.svg +0 -4
- package/docs/public/home-brut.css +0 -982
- package/docs/public/images/bookworms/hero-books.jpg +0 -0
- package/docs/public/images/bookworms/how-we-read-now.jpg +0 -0
- package/docs/public/images/bookworms/lantern-keepers.jpg +0 -0
- package/docs/public/images/bookworms/provincial-bookseller.jpg +0 -0
- package/docs/public/images/journey/178.jpg +0 -0
- package/docs/public/images/journey/29.jpg +0 -0
- package/docs/public/images/retrowheels/hero.jpg +0 -0
- package/docs/public/images/shop/devbook-pro.jpg +0 -0
- package/docs/public/images/suzukibento/1015.jpg +0 -0
- package/docs/public/images/suzukibento/1025.jpg +0 -0
- package/docs/public/images/suzukibento/1043.jpg +0 -0
- package/docs/public/images/suzukibento/1059.jpg +0 -0
- package/docs/public/images/suzukibento/1062.jpg +0 -0
- package/docs/public/images/suzukibento/1084.jpg +0 -0
- package/docs/public/images/swish/1469334031218-e382a71b716b.jpg +0 -0
- package/docs/public/images/swish/1483985988355-763728e1935b.jpg +0 -0
- package/docs/public/images/swish/1485518882345-15568b007407.jpg +0 -0
- package/docs/public/images/swish/1490481651871-ab68de25d43d.jpg +0 -0
- package/docs/public/images/swish/1496747611176-843222e1e57c.jpg +0 -0
- package/docs/public/images/swish/1502716119720-b23a93e5fe1b.jpg +0 -0
- package/docs/public/images/swish/1539109136881-3be0616acf4b.jpg +0 -0
- package/docs/public/images/swish/1551803091-e20673f15770.jpg +0 -0
- package/docs/public/images/swish/1558769132-cb1aea458c5e.jpg +0 -0
- package/docs/public/images/swish/1572804013309-59a88b7e92f1.jpg +0 -0
- package/docs/public/img/heic1501a.jpg +0 -0
- package/docs/public/img/placeholder-landscape.svg +0 -18
- package/docs/public/img/placeholder-square.svg +0 -14
- package/docs/public/img/placeholder-tall.svg +0 -22
- package/docs/public/journey.css +0 -528
- package/docs/public/menu.js +0 -327
- package/docs/public/pulse-ui.css +0 -3028
- package/docs/public/pulse-ui.js +0 -257
- package/docs/public/retrowheels.css +0 -425
- package/docs/public/shop.css +0 -269
- package/docs/public/sparkys.css +0 -382
- package/docs/public/suzukibento.css +0 -517
- package/docs/public/swish.css +0 -394
- package/docs/public/theme.css +0 -52
- package/docs/public/themes/lumio.css +0 -50
- package/docs/public/themes/observatory.css +0 -104
- package/docs/server.js +0 -161
- package/docs/src/lib/component-page.js +0 -49
- package/docs/src/lib/highlight.js +0 -2
- package/docs/src/lib/layout.js +0 -190
- package/docs/src/lib/metrics-store.js +0 -6
- package/docs/src/lib/nav.js +0 -171
- package/docs/src/lib/stats.js +0 -81
- package/docs/src/pages/accessibility.js +0 -157
- package/docs/src/pages/actions.js +0 -194
- package/docs/src/pages/auth.js +0 -176
- package/docs/src/pages/caching.js +0 -95
- package/docs/src/pages/components/accordion.js +0 -48
- package/docs/src/pages/components/alert.js +0 -35
- package/docs/src/pages/components/app-badge.js +0 -41
- package/docs/src/pages/components/avatar.js +0 -35
- package/docs/src/pages/components/badge.js +0 -36
- package/docs/src/pages/components/breadcrumbs.js +0 -94
- package/docs/src/pages/components/button.js +0 -84
- package/docs/src/pages/components/card.js +0 -225
- package/docs/src/pages/components/charts.js +0 -283
- package/docs/src/pages/components/checkbox.js +0 -129
- package/docs/src/pages/components/cluster.js +0 -47
- package/docs/src/pages/components/container.js +0 -40
- package/docs/src/pages/components/cta.js +0 -54
- package/docs/src/pages/components/divider.js +0 -37
- package/docs/src/pages/components/empty.js +0 -36
- package/docs/src/pages/components/feature.js +0 -60
- package/docs/src/pages/components/fieldset.js +0 -65
- package/docs/src/pages/components/fileupload.js +0 -128
- package/docs/src/pages/components/footer.js +0 -58
- package/docs/src/pages/components/grid.js +0 -169
- package/docs/src/pages/components/heading.js +0 -107
- package/docs/src/pages/components/hero.js +0 -123
- package/docs/src/pages/components/icons.js +0 -410
- package/docs/src/pages/components/image.js +0 -71
- package/docs/src/pages/components/input.js +0 -51
- package/docs/src/pages/components/media.js +0 -51
- package/docs/src/pages/components/modal.js +0 -111
- package/docs/src/pages/components/nav.js +0 -136
- package/docs/src/pages/components/phone-frame.js +0 -74
- package/docs/src/pages/components/progress.js +0 -102
- package/docs/src/pages/components/prose.js +0 -111
- package/docs/src/pages/components/pullquote.js +0 -71
- package/docs/src/pages/components/radio.js +0 -194
- package/docs/src/pages/components/rating.js +0 -106
- package/docs/src/pages/components/search.js +0 -61
- package/docs/src/pages/components/section.js +0 -98
- package/docs/src/pages/components/segmented.js +0 -121
- package/docs/src/pages/components/select.js +0 -45
- package/docs/src/pages/components/slider.js +0 -115
- package/docs/src/pages/components/spinner.js +0 -73
- package/docs/src/pages/components/stack.js +0 -48
- package/docs/src/pages/components/stat.js +0 -55
- package/docs/src/pages/components/stepper.js +0 -66
- package/docs/src/pages/components/table.js +0 -45
- package/docs/src/pages/components/textarea.js +0 -31
- package/docs/src/pages/components/toggle.js +0 -84
- package/docs/src/pages/components/tooltip.js +0 -48
- package/docs/src/pages/components.js +0 -200
- package/docs/src/pages/config.js +0 -193
- package/docs/src/pages/constraints.js +0 -100
- package/docs/src/pages/deploy.js +0 -233
- package/docs/src/pages/error-pages.js +0 -99
- package/docs/src/pages/extending.js +0 -198
- package/docs/src/pages/faq.js +0 -99
- package/docs/src/pages/forms.js +0 -129
- package/docs/src/pages/getting-started.js +0 -147
- package/docs/src/pages/guard.js +0 -120
- package/docs/src/pages/home.js +0 -350
- package/docs/src/pages/how-it-works.js +0 -244
- package/docs/src/pages/hydration.js +0 -108
- package/docs/src/pages/images.js +0 -120
- package/docs/src/pages/markdown.js +0 -156
- package/docs/src/pages/meta.js +0 -193
- package/docs/src/pages/mutations.js +0 -107
- package/docs/src/pages/navigation.js +0 -85
- package/docs/src/pages/performance.js +0 -157
- package/docs/src/pages/persist.js +0 -89
- package/docs/src/pages/project-structure.js +0 -91
- package/docs/src/pages/prompt-examples.js +0 -186
- package/docs/src/pages/raw-responses.js +0 -122
- package/docs/src/pages/routing.js +0 -120
- package/docs/src/pages/server-api.js +0 -291
- package/docs/src/pages/server-data.js +0 -203
- package/docs/src/pages/slash-commands.js +0 -55
- package/docs/src/pages/spec.js +0 -207
- package/docs/src/pages/state.js +0 -102
- package/docs/src/pages/store.js +0 -203
- package/docs/src/pages/streaming.js +0 -107
- package/docs/src/pages/stripe.js +0 -194
- package/docs/src/pages/supabase.js +0 -324
- package/docs/src/pages/templates/andypixel.js +0 -260
- package/docs/src/pages/templates/blog-post.js +0 -226
- package/docs/src/pages/templates/bookworms.js +0 -227
- package/docs/src/pages/templates/coutumes.js +0 -237
- package/docs/src/pages/templates/journey.js +0 -186
- package/docs/src/pages/templates/mobile-app.js +0 -371
- package/docs/src/pages/templates/retrowheels.js +0 -355
- package/docs/src/pages/templates/shop.js +0 -268
- package/docs/src/pages/templates/sparkys.js +0 -264
- package/docs/src/pages/templates/suzukibento.js +0 -200
- package/docs/src/pages/templates/swish.js +0 -313
- package/docs/src/pages/templates.js +0 -534
- package/docs/src/pages/testing.js +0 -199
- package/docs/src/pages/validation.js +0 -138
- package/examples/.claude/commands/pulse-build.md +0 -7
- package/examples/.claude/commands/pulse-dev.md +0 -7
- package/examples/.claude/commands/pulse-start.md +0 -9
- package/examples/.claude/commands/pulse-stop.md +0 -5
- package/examples/.claude/commands/verify.md +0 -84
- package/examples/.claude/coverage-check.js +0 -196
- package/examples/.claude/pulse-checklist.md +0 -189
- package/examples/andypixel.css +0 -237
- package/examples/andypixel.js +0 -258
- package/examples/bookworms.css +0 -422
- package/examples/bookworms.js +0 -225
- package/examples/contact.js +0 -166
- package/examples/counter.js +0 -94
- package/examples/dev.server.js +0 -110
- package/examples/examples.test.js +0 -394
- package/examples/journey.css +0 -528
- package/examples/journey.js +0 -186
- package/examples/pricing.js +0 -262
- package/examples/products.js +0 -190
- package/examples/public/.pulse-ui-version +0 -1
- package/examples/public/pulse-ui.css +0 -3028
- package/examples/public/pulse-ui.js +0 -257
- package/examples/quiz.js +0 -208
- package/examples/retrowheels.css +0 -425
- package/examples/retrowheels.js +0 -353
- package/examples/shared.js +0 -84
- package/examples/suzukibento.css +0 -513
- package/examples/suzukibento.js +0 -200
- package/examples/swish.css +0 -394
- package/examples/swish.js +0 -311
- package/examples/todos.js +0 -162
- package/src/ui/fieldset.js +0 -37
- package/src/ui/phone-frame.js +0 -40
- package/src/ui/search.js +0 -78
- package/src/ui/segmented.js +0 -50
- package/src/ui/tooltip.js +0 -28
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { table, callout } from '../../lib/layout.js'
|
|
4
|
-
import { slider } from '../../../../src/ui/index.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/slider')
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
route: '/components/slider',
|
|
10
|
-
meta: {
|
|
11
|
-
theme: 'light',
|
|
12
|
-
title: 'Slider — Pulse Docs',
|
|
13
|
-
description: 'Styled range input slider component for Pulse UI.',
|
|
14
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
15
|
-
},
|
|
16
|
-
state: { brightness: 100 },
|
|
17
|
-
mutations: {
|
|
18
|
-
setBrightness: (state, e) => ({ brightness: Number(e.target.value) }),
|
|
19
|
-
},
|
|
20
|
-
view: (state) => renderComponentPage({
|
|
21
|
-
currentHref: '/components/slider',
|
|
22
|
-
prev,
|
|
23
|
-
next,
|
|
24
|
-
name: 'slider',
|
|
25
|
-
description: 'Styled range input with label, hint, and a CSS-driven fill gradient that tracks the thumb live as you drag.',
|
|
26
|
-
content: `
|
|
27
|
-
|
|
28
|
-
<h2 class="doc-h2" id="basic">Basic</h2>
|
|
29
|
-
${demo(
|
|
30
|
-
slider({ name: 'volume', label: 'Volume', showValue: true }),
|
|
31
|
-
`slider({ name: 'volume', label: 'Volume', showValue: true })`,
|
|
32
|
-
{ col: true }
|
|
33
|
-
)}
|
|
34
|
-
|
|
35
|
-
<h2 class="doc-h2" id="min-max-step">Min, max, step, and hint</h2>
|
|
36
|
-
${demo(
|
|
37
|
-
slider({
|
|
38
|
-
name: 'brightness',
|
|
39
|
-
label: 'Brightness',
|
|
40
|
-
min: 0,
|
|
41
|
-
max: 200,
|
|
42
|
-
step: 10,
|
|
43
|
-
value: 100,
|
|
44
|
-
showValue: true,
|
|
45
|
-
hint: 'Adjust display brightness (0–200)',
|
|
46
|
-
}),
|
|
47
|
-
`slider({
|
|
48
|
-
name: 'brightness',
|
|
49
|
-
label: 'Brightness',
|
|
50
|
-
min: 0,
|
|
51
|
-
max: 200,
|
|
52
|
-
step: 10,
|
|
53
|
-
value: 100,
|
|
54
|
-
showValue: true,
|
|
55
|
-
hint: 'Adjust display brightness (0–200)',
|
|
56
|
-
})`,
|
|
57
|
-
{ col: true }
|
|
58
|
-
)}
|
|
59
|
-
|
|
60
|
-
<h2 class="doc-h2" id="live-value">Live value in state</h2>
|
|
61
|
-
<p class="u-mb-4 u-text-sm u-color-muted">Use <code>data-event="change:mutationName"</code> to capture the value when the user releases the handle. The fill gradient always updates live — no mutation needed for that.</p>
|
|
62
|
-
${demo(
|
|
63
|
-
`<div>
|
|
64
|
-
${slider({ name: 'brightness', label: 'Brightness', value: state.brightness, min: 0, max: 200, step: 10, showValue: true, event: 'change:setBrightness' })}
|
|
65
|
-
</div>`,
|
|
66
|
-
`// state
|
|
67
|
-
{ brightness: 100 }
|
|
68
|
-
|
|
69
|
-
// mutation
|
|
70
|
-
setBrightness: (state, e) => ({ brightness: Number(e.target.value) })
|
|
71
|
-
|
|
72
|
-
// view
|
|
73
|
-
slider({
|
|
74
|
-
name: 'brightness',
|
|
75
|
-
label: 'Brightness',
|
|
76
|
-
min: 0,
|
|
77
|
-
max: 200,
|
|
78
|
-
step: 10,
|
|
79
|
-
value: state.brightness,
|
|
80
|
-
showValue: true,
|
|
81
|
-
event: 'change:setBrightness',
|
|
82
|
-
})`,
|
|
83
|
-
{ col: true }
|
|
84
|
-
)}
|
|
85
|
-
|
|
86
|
-
<h2 class="doc-h2" id="disabled">Disabled</h2>
|
|
87
|
-
${demo(
|
|
88
|
-
slider({ name: 'opacity', label: 'Opacity', value: 30, disabled: true }),
|
|
89
|
-
`slider({ name: 'opacity', label: 'Opacity', value: 30, disabled: true })`,
|
|
90
|
-
{ col: true }
|
|
91
|
-
)}
|
|
92
|
-
|
|
93
|
-
${callout('note', 'The fill gradient updates live during drag automatically. To read the final value, either use <code>data-event="change:mutationName"</code> on the slider or submit it as part of a form — the value is available in FormData as a number string under <code>name</code>.')}
|
|
94
|
-
${callout('warning', 'Do not use <code>data-event="input:mutationName"</code> on a slider. Pulse replaces <code>innerHTML</code> on every mutation, which interrupts the drag mid-gesture. Use <code>change</code> instead — it fires once when the user releases the handle.')}
|
|
95
|
-
|
|
96
|
-
${table(
|
|
97
|
-
['Prop', 'Type', 'Default', 'Description'],
|
|
98
|
-
[
|
|
99
|
-
['<code>name</code>', 'string', '—', 'Field name — submitted in FormData'],
|
|
100
|
-
['<code>label</code>', 'string', '—', 'Visible label text'],
|
|
101
|
-
['<code>min</code>', 'number', '0', 'Minimum value'],
|
|
102
|
-
['<code>max</code>', 'number', '100', 'Maximum value'],
|
|
103
|
-
['<code>step</code>', 'number', '1', 'Step increment'],
|
|
104
|
-
['<code>value</code>', 'number', '50', 'Current value'],
|
|
105
|
-
['<code>showValue</code>', 'boolean', 'false', 'Show current value live beside the label as you drag'],
|
|
106
|
-
['<code>disabled</code>', 'boolean', 'false', ''],
|
|
107
|
-
['<code>hint</code>', 'string', '—', 'Helper text below the slider'],
|
|
108
|
-
['<code>event</code>', 'string', '—', '<code>data-event</code> binding, e.g. <code>change:mutationName</code>'],
|
|
109
|
-
['<code>id</code>', 'string', '—', 'Override the generated <code>id</code>'],
|
|
110
|
-
['<code>class</code>', 'string', '—', ''],
|
|
111
|
-
]
|
|
112
|
-
)}
|
|
113
|
-
`,
|
|
114
|
-
}),
|
|
115
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { table } from '../../lib/layout.js'
|
|
4
|
-
import { spinner, button, cluster } from '../../../../src/ui/index.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/spinner')
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
route: '/components/spinner',
|
|
10
|
-
meta: {
|
|
11
|
-
theme: 'light',
|
|
12
|
-
title: 'Spinner — Pulse Docs',
|
|
13
|
-
description: 'Loading spinner component for Pulse UI.',
|
|
14
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
15
|
-
},
|
|
16
|
-
view: () => renderComponentPage({
|
|
17
|
-
currentHref: '/components/spinner',
|
|
18
|
-
prev,
|
|
19
|
-
next,
|
|
20
|
-
name: 'spinner',
|
|
21
|
-
description: 'CSS-animated loading ring. No JavaScript required. Use to indicate background activity — inside buttons, next to labels, or as a full-area overlay.',
|
|
22
|
-
content: `
|
|
23
|
-
|
|
24
|
-
<h2 class="doc-h2" id="sizes">Sizes</h2>
|
|
25
|
-
${demo(
|
|
26
|
-
cluster({ gap: 'lg', align: 'center', content:
|
|
27
|
-
spinner({ size: 'sm' }) +
|
|
28
|
-
spinner({ size: 'md' }) +
|
|
29
|
-
spinner({ size: 'lg' }),
|
|
30
|
-
}),
|
|
31
|
-
`spinner({ size: 'sm' })
|
|
32
|
-
spinner({ size: 'md' })
|
|
33
|
-
spinner({ size: 'lg' })`
|
|
34
|
-
)}
|
|
35
|
-
|
|
36
|
-
<h2 class="doc-h2" id="colors">Colours</h2>
|
|
37
|
-
${demo(
|
|
38
|
-
cluster({ gap: 'lg', align: 'center', content:
|
|
39
|
-
spinner({ color: 'accent' }) +
|
|
40
|
-
spinner({ color: 'muted' }) +
|
|
41
|
-
`<span style="background:var(--ui-accent);padding:.75rem;border-radius:var(--ui-radius);display:inline-flex">` +
|
|
42
|
-
spinner({ color: 'white' }) +
|
|
43
|
-
`</span>`,
|
|
44
|
-
}),
|
|
45
|
-
`spinner({ color: 'accent' })
|
|
46
|
-
spinner({ color: 'muted' })
|
|
47
|
-
spinner({ color: 'white' })`
|
|
48
|
-
)}
|
|
49
|
-
|
|
50
|
-
<h2 class="doc-h2" id="in-button">Inside a button</h2>
|
|
51
|
-
<p>Pair with a <code>button()</code> to show loading state. Pass the spinner as the button's <code>icon</code> prop.</p>
|
|
52
|
-
${demo(
|
|
53
|
-
button({ label: 'Saving', icon: spinner({ size: 'sm', color: 'white' }), disabled: true }) + ' ' +
|
|
54
|
-
button({ label: 'Loading', icon: spinner({ size: 'sm' }), variant: 'secondary', disabled: true }),
|
|
55
|
-
`button({
|
|
56
|
-
label: 'Saving',
|
|
57
|
-
icon: spinner({ size: 'sm', color: 'white' }),
|
|
58
|
-
disabled: state.loading,
|
|
59
|
-
})`
|
|
60
|
-
)}
|
|
61
|
-
|
|
62
|
-
${table(
|
|
63
|
-
['Prop', 'Type', 'Default', 'Description'],
|
|
64
|
-
[
|
|
65
|
-
['<code>size</code>', '<code>sm | md | lg</code>', '<code>md</code>', '1rem / 1.5rem / 2.5rem'],
|
|
66
|
-
['<code>color</code>', '<code>accent | muted | white</code>', '<code>accent</code>', ''],
|
|
67
|
-
['<code>label</code>', 'string', '<code>Loading…</code>', 'Sets <code>aria-label</code> on the <code>role="status"</code> element'],
|
|
68
|
-
['<code>class</code>', 'string', '—', ''],
|
|
69
|
-
]
|
|
70
|
-
)}
|
|
71
|
-
`,
|
|
72
|
-
}),
|
|
73
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { table } from '../../lib/layout.js'
|
|
4
|
-
import { button, stack } from '../../../../src/ui/index.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/stack')
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
route: '/components/stack',
|
|
10
|
-
meta: {
|
|
11
|
-
theme: 'light',
|
|
12
|
-
title: 'Stack — Pulse Docs',
|
|
13
|
-
description: 'Stack component for Pulse UI.',
|
|
14
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
15
|
-
},
|
|
16
|
-
view: () => renderComponentPage({
|
|
17
|
-
currentHref: '/components/stack',
|
|
18
|
-
prev,
|
|
19
|
-
next,
|
|
20
|
-
name: 'stack',
|
|
21
|
-
description: 'Flex column with consistent vertical gap. Replaces the common pattern of adding <code>margin-bottom</code> to every child element.',
|
|
22
|
-
content: `
|
|
23
|
-
${demo(
|
|
24
|
-
stack({
|
|
25
|
-
gap: 'sm',
|
|
26
|
-
content:
|
|
27
|
-
button({ label: 'Primary action' }) +
|
|
28
|
-
button({ label: 'Secondary action', variant: 'secondary' }) +
|
|
29
|
-
button({ label: 'Ghost action', variant: 'ghost' }),
|
|
30
|
-
}),
|
|
31
|
-
`stack({ gap: 'sm', align: 'start', content:
|
|
32
|
-
button({ label: 'Primary action' }) +
|
|
33
|
-
button({ label: 'Secondary action', variant: 'secondary' }) +
|
|
34
|
-
button({ label: 'Ghost', variant: 'ghost' })
|
|
35
|
-
})`
|
|
36
|
-
)}
|
|
37
|
-
|
|
38
|
-
${table(
|
|
39
|
-
['Prop', 'Type', 'Default', 'Description'],
|
|
40
|
-
[
|
|
41
|
-
['<code>content</code>', 'string (HTML)', '—', 'Raw HTML slot'],
|
|
42
|
-
['<code>gap</code>', 'string', "'md'", "'xs' · 'sm' · 'md' · 'lg' · 'xl'"],
|
|
43
|
-
['<code>align</code>', 'string', "'stretch'", "'stretch' · 'start' · 'center' · 'end'"],
|
|
44
|
-
]
|
|
45
|
-
)}
|
|
46
|
-
`,
|
|
47
|
-
}),
|
|
48
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { table } from '../../lib/layout.js'
|
|
4
|
-
import { stat } from '../../../../src/ui/index.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/stat')
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
route: '/components/stat',
|
|
10
|
-
meta: {
|
|
11
|
-
theme: 'light',
|
|
12
|
-
title: 'Stat — Pulse Docs',
|
|
13
|
-
description: 'Stat component for Pulse UI.',
|
|
14
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
15
|
-
},
|
|
16
|
-
view: () => renderComponentPage({
|
|
17
|
-
currentHref: '/components/stat',
|
|
18
|
-
prev,
|
|
19
|
-
next,
|
|
20
|
-
name: 'stat',
|
|
21
|
-
description: 'Numeric metric display with optional trend indicator. Use inside a <code>card()</code> or a flex/grid container for dashboard layouts.',
|
|
22
|
-
content: `
|
|
23
|
-
${demo(
|
|
24
|
-
`<div style="display:flex;gap:2rem;flex-wrap:wrap">` +
|
|
25
|
-
stat({ label: 'Total users', value: '12,483', change: '+8.2%', trend: 'up' }) +
|
|
26
|
-
stat({ label: 'Bounce rate', value: '24%', change: '−3.1%', trend: 'down' }) +
|
|
27
|
-
stat({ label: 'Avg. session', value: '4m 12s' }) +
|
|
28
|
-
`</div>`,
|
|
29
|
-
`stat({ label: 'Total users', value: '12,483', change: '+8.2%', trend: 'up' })
|
|
30
|
-
stat({ label: 'Bounce rate', value: '24%', change: '−3.1%', trend: 'down' })
|
|
31
|
-
stat({ label: 'Avg. session', value: '4m 12s' })`
|
|
32
|
-
)}
|
|
33
|
-
<p>The <code>center</code> prop centre-aligns the value, label, and change — useful in grids or dashboard cards.</p>
|
|
34
|
-
${demo(
|
|
35
|
-
`<div style="display:flex;gap:2rem;flex-wrap:wrap">` +
|
|
36
|
-
stat({ label: 'Total users', value: '12,483', change: '+8.2%', trend: 'up', center: true }) +
|
|
37
|
-
stat({ label: 'Bounce rate', value: '24%', change: '−3.1%', trend: 'down', center: true }) +
|
|
38
|
-
stat({ label: 'Avg. session', value: '4m 12s', center: true }) +
|
|
39
|
-
`</div>`,
|
|
40
|
-
`stat({ label: 'Total users', value: '12,483', change: '+8.2%', trend: 'up', center: true })`
|
|
41
|
-
)}
|
|
42
|
-
|
|
43
|
-
${table(
|
|
44
|
-
['Prop', 'Type', 'Default', 'Description'],
|
|
45
|
-
[
|
|
46
|
-
['<code>label</code>', 'string', '—', ''],
|
|
47
|
-
['<code>value</code>', 'string', '—', 'Formatted value string — e.g. "2.4k", "98%"'],
|
|
48
|
-
['<code>change</code>', 'string', '—', 'Change label — e.g. "+12%", "−3"'],
|
|
49
|
-
['<code>trend</code>', 'string', 'neutral', 'up · down · neutral'],
|
|
50
|
-
['<code>center</code>', 'boolean', 'false', 'Centre-aligns value, label, and change'],
|
|
51
|
-
]
|
|
52
|
-
)}
|
|
53
|
-
`,
|
|
54
|
-
}),
|
|
55
|
-
}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { table } from '../../lib/layout.js'
|
|
4
|
-
import { stepper } from '../../../../src/ui/index.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/stepper')
|
|
7
|
-
|
|
8
|
-
const STEPS = ['Account', 'Details', 'Payment', 'Review']
|
|
9
|
-
|
|
10
|
-
export default {
|
|
11
|
-
route: '/components/stepper',
|
|
12
|
-
meta: {
|
|
13
|
-
theme: 'light',
|
|
14
|
-
title: 'Stepper — Pulse Docs',
|
|
15
|
-
description: 'Horizontal step progress indicator component for Pulse UI.',
|
|
16
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
17
|
-
},
|
|
18
|
-
view: () => renderComponentPage({
|
|
19
|
-
currentHref: '/components/stepper',
|
|
20
|
-
prev,
|
|
21
|
-
next,
|
|
22
|
-
name: 'stepper',
|
|
23
|
-
description: 'Horizontal step progress indicator. Completed steps show a check icon; the active step has an accent border; upcoming steps are muted. A connector line between steps fills with accent colour as progress advances.',
|
|
24
|
-
content: `
|
|
25
|
-
|
|
26
|
-
<h2 class="doc-h2" id="step1">Step 1 active</h2>
|
|
27
|
-
${demo(
|
|
28
|
-
stepper({ steps: STEPS, current: 0 }),
|
|
29
|
-
`stepper({
|
|
30
|
-
steps: ['Account', 'Details', 'Payment', 'Review'],
|
|
31
|
-
current: 0,
|
|
32
|
-
})`,
|
|
33
|
-
{ col: true }
|
|
34
|
-
)}
|
|
35
|
-
|
|
36
|
-
<h2 class="doc-h2" id="step2">Step 2 active</h2>
|
|
37
|
-
${demo(
|
|
38
|
-
stepper({ steps: STEPS, current: 1 }),
|
|
39
|
-
`stepper({
|
|
40
|
-
steps: ['Account', 'Details', 'Payment', 'Review'],
|
|
41
|
-
current: 1,
|
|
42
|
-
})`,
|
|
43
|
-
{ col: true }
|
|
44
|
-
)}
|
|
45
|
-
|
|
46
|
-
<h2 class="doc-h2" id="complete">All complete</h2>
|
|
47
|
-
${demo(
|
|
48
|
-
stepper({ steps: STEPS, current: STEPS.length }),
|
|
49
|
-
`stepper({
|
|
50
|
-
steps: ['Account', 'Details', 'Payment', 'Review'],
|
|
51
|
-
current: steps.length, // past the last index = all complete
|
|
52
|
-
})`,
|
|
53
|
-
{ col: true }
|
|
54
|
-
)}
|
|
55
|
-
|
|
56
|
-
${table(
|
|
57
|
-
['Prop', 'Type', 'Default', 'Description'],
|
|
58
|
-
[
|
|
59
|
-
['<code>steps</code>', 'string[]', '[]', 'Array of step label strings'],
|
|
60
|
-
['<code>current</code>', 'number', '0', '0-based index of the active step. Pass <code>steps.length</code> to mark all steps complete.'],
|
|
61
|
-
['<code>class</code>', 'string', '—', ''],
|
|
62
|
-
]
|
|
63
|
-
)}
|
|
64
|
-
`,
|
|
65
|
-
}),
|
|
66
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { badge, table as uiTable } from '../../../../src/ui/index.js'
|
|
4
|
-
import { escHtml } from '../../../../src/html.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/table')
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
route: '/components/table',
|
|
10
|
-
meta: {
|
|
11
|
-
theme: 'light',
|
|
12
|
-
title: 'Table — Pulse Docs',
|
|
13
|
-
description: 'Table component for Pulse UI.',
|
|
14
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
15
|
-
},
|
|
16
|
-
view: () => renderComponentPage({
|
|
17
|
-
currentHref: '/components/table',
|
|
18
|
-
prev,
|
|
19
|
-
next,
|
|
20
|
-
name: 'table',
|
|
21
|
-
description: 'The scroll wrapper has <code>role="region"</code> and <code>tabindex="0"</code> so keyboard users can scroll horizontally on narrow screens. Row cells are raw HTML slots — wrap user-supplied values in <code>escHtml()</code> when building them.',
|
|
22
|
-
content: `
|
|
23
|
-
${demo(
|
|
24
|
-
uiTable({
|
|
25
|
-
caption: 'Team members',
|
|
26
|
-
headers: ['Name', 'Role', 'Status'],
|
|
27
|
-
rows: [
|
|
28
|
-
[escHtml('Alice Smith'), badge({ label: 'Admin', variant: 'info' }), badge({ label: 'Active', variant: 'success' })],
|
|
29
|
-
[escHtml('Bob Jones'), badge({ label: 'Editor', variant: 'default' }), badge({ label: 'Active', variant: 'success' })],
|
|
30
|
-
[escHtml('Carol White'), badge({ label: 'Viewer', variant: 'default' }), badge({ label: 'Inactive', variant: 'default' })],
|
|
31
|
-
],
|
|
32
|
-
}),
|
|
33
|
-
`table({
|
|
34
|
-
caption: 'Team members',
|
|
35
|
-
headers: ['Name', 'Role', 'Status'],
|
|
36
|
-
rows: server.users.map(u => [
|
|
37
|
-
escHtml(u.name),
|
|
38
|
-
badge({ label: u.role, variant: u.role === 'admin' ? 'info' : 'default' }),
|
|
39
|
-
badge({ label: u.status, variant: u.active ? 'success' : 'default' }),
|
|
40
|
-
]),
|
|
41
|
-
})`
|
|
42
|
-
)}
|
|
43
|
-
`,
|
|
44
|
-
}),
|
|
45
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { textarea } from '../../../../src/ui/index.js'
|
|
4
|
-
|
|
5
|
-
const { prev, next } = prevNext('/components/textarea')
|
|
6
|
-
|
|
7
|
-
export default {
|
|
8
|
-
route: '/components/textarea',
|
|
9
|
-
meta: {
|
|
10
|
-
theme: 'light',
|
|
11
|
-
title: 'Textarea — Pulse Docs',
|
|
12
|
-
description: 'Textarea component for Pulse UI.',
|
|
13
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
14
|
-
},
|
|
15
|
-
view: () => renderComponentPage({
|
|
16
|
-
currentHref: '/components/textarea',
|
|
17
|
-
prev,
|
|
18
|
-
next,
|
|
19
|
-
name: 'textarea',
|
|
20
|
-
description: 'Multi-line text input with label, hint, and error support. Wired up identically to <code>input</code> — <code>for</code>/<code>id</code> and <code>aria-describedby</code> are derived from <code>name</code>.',
|
|
21
|
-
content: `
|
|
22
|
-
${demo(
|
|
23
|
-
textarea({ name: 'bio', label: 'Bio', placeholder: 'Tell us about yourself…', hint: 'Max 500 characters', rows: 3 }) +
|
|
24
|
-
textarea({ name: 'note', label: 'Note', value: 'hello world', error: 'Note is too long', rows: 3 }),
|
|
25
|
-
`textarea({ name: 'bio', label: 'Bio', placeholder: 'Tell us about yourself…', hint: 'Max 500 characters' })
|
|
26
|
-
textarea({ name: 'note', label: 'Note', value: state.note, error: server.errors.note, rows: 6 })`,
|
|
27
|
-
{ col: true }
|
|
28
|
-
)}
|
|
29
|
-
`,
|
|
30
|
-
}),
|
|
31
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { table, callout } from '../../lib/layout.js'
|
|
4
|
-
import { toggle, stack } from '../../../../src/ui/index.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/toggle')
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
route: '/components/toggle',
|
|
10
|
-
meta: {
|
|
11
|
-
theme: 'light',
|
|
12
|
-
title: 'Toggle — Pulse Docs',
|
|
13
|
-
description: 'iOS-style switch toggle component for Pulse UI.',
|
|
14
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
15
|
-
},
|
|
16
|
-
view: () => renderComponentPage({
|
|
17
|
-
currentHref: '/components/toggle',
|
|
18
|
-
prev,
|
|
19
|
-
next,
|
|
20
|
-
name: 'toggle',
|
|
21
|
-
description: 'iOS-style switch that renders a visually hidden <code><input type="checkbox"></code> with a custom track and thumb. No JavaScript required — state is read from FormData on submission.',
|
|
22
|
-
content: `
|
|
23
|
-
|
|
24
|
-
<h2 class="doc-h2" id="default">Default</h2>
|
|
25
|
-
${demo(
|
|
26
|
-
stack({ gap: 'md', content:
|
|
27
|
-
toggle({ name: 'notifications', label: 'Email notifications' }) +
|
|
28
|
-
toggle({ name: 'updates', label: 'Product updates', checked: true }),
|
|
29
|
-
}),
|
|
30
|
-
`toggle({ name: 'notifications', label: 'Email notifications' })
|
|
31
|
-
toggle({ name: 'updates', label: 'Product updates', checked: true })`,
|
|
32
|
-
{ col: true }
|
|
33
|
-
)}
|
|
34
|
-
|
|
35
|
-
<h2 class="doc-h2" id="hint">With hint</h2>
|
|
36
|
-
<p>Use <code>hint</code> to add supporting text below the switch.</p>
|
|
37
|
-
${demo(
|
|
38
|
-
stack({ gap: 'lg', content:
|
|
39
|
-
toggle({ name: 'marketing', label: 'Marketing emails', hint: 'Receive tips, product news, and special offers.' }) +
|
|
40
|
-
toggle({ name: 'digest', label: 'Weekly digest', hint: 'A summary of activity sent every Monday morning.', checked: true }),
|
|
41
|
-
}),
|
|
42
|
-
`toggle({
|
|
43
|
-
name: 'marketing',
|
|
44
|
-
label: 'Marketing emails',
|
|
45
|
-
hint: 'Receive tips, product news, and special offers.',
|
|
46
|
-
})
|
|
47
|
-
toggle({
|
|
48
|
-
name: 'digest',
|
|
49
|
-
label: 'Weekly digest',
|
|
50
|
-
hint: 'A summary of activity sent every Monday morning.',
|
|
51
|
-
checked: true,
|
|
52
|
-
})`,
|
|
53
|
-
{ col: true }
|
|
54
|
-
)}
|
|
55
|
-
|
|
56
|
-
<h2 class="doc-h2" id="disabled">Disabled</h2>
|
|
57
|
-
${demo(
|
|
58
|
-
stack({ gap: 'md', content:
|
|
59
|
-
toggle({ name: 'a', label: 'Off and disabled', disabled: true }) +
|
|
60
|
-
toggle({ name: 'b', label: 'On and disabled', disabled: true, checked: true }),
|
|
61
|
-
}),
|
|
62
|
-
`toggle({ name: 'a', label: 'Off and disabled', disabled: true })
|
|
63
|
-
toggle({ name: 'b', label: 'On and disabled', disabled: true, checked: true })`,
|
|
64
|
-
{ col: true }
|
|
65
|
-
)}
|
|
66
|
-
|
|
67
|
-
<h2 class="doc-h2" id="in-forms">In forms</h2>
|
|
68
|
-
${callout('note', 'The switch submits as <code>\'on\'</code> under its <code>name</code> when checked. When unchecked, the field is absent from FormData entirely — the same behaviour as a native checkbox. Read it with <code>formData.get(\'name\') === \'on\'</code>.')}
|
|
69
|
-
|
|
70
|
-
${table(
|
|
71
|
-
['Prop', 'Type', 'Default', 'Description'],
|
|
72
|
-
[
|
|
73
|
-
['<code>name</code>', 'string', '—', 'Field name — submitted in FormData'],
|
|
74
|
-
['<code>label</code>', 'string', '—', 'Visible label text'],
|
|
75
|
-
['<code>checked</code>', 'boolean', 'false', 'Initial on/off state'],
|
|
76
|
-
['<code>disabled</code>', 'boolean', 'false', ''],
|
|
77
|
-
['<code>hint</code>', 'string', '—', 'Helper text below the switch'],
|
|
78
|
-
['<code>id</code>', 'string', '—', 'Override the generated <code>id</code>'],
|
|
79
|
-
['<code>class</code>', 'string', '—', ''],
|
|
80
|
-
]
|
|
81
|
-
)}
|
|
82
|
-
`,
|
|
83
|
-
}),
|
|
84
|
-
}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { renderComponentPage, demo } from '../../lib/component-page.js'
|
|
2
|
-
import { prevNext } from '../../lib/nav.js'
|
|
3
|
-
import { table } from '../../lib/layout.js'
|
|
4
|
-
import { tooltip, button, cluster } from '../../../../src/ui/index.js'
|
|
5
|
-
|
|
6
|
-
const { prev, next } = prevNext('/components/tooltip')
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
route: '/components/tooltip',
|
|
10
|
-
meta: {
|
|
11
|
-
theme: 'light',
|
|
12
|
-
title: 'Tooltip — Pulse Docs',
|
|
13
|
-
description: 'Tooltip component for Pulse UI.',
|
|
14
|
-
styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
|
|
15
|
-
},
|
|
16
|
-
view: () => renderComponentPage({
|
|
17
|
-
currentHref: '/components/tooltip',
|
|
18
|
-
prev,
|
|
19
|
-
next,
|
|
20
|
-
name: 'tooltip',
|
|
21
|
-
description: 'CSS-powered tooltip that wraps any element. No JavaScript required — the bubble appears on hover and <code>:focus-within</code>. Supports four placements.',
|
|
22
|
-
content: `
|
|
23
|
-
${demo(
|
|
24
|
-
cluster({ gap: 'lg', justify: 'center', content:
|
|
25
|
-
tooltip({ content: 'This appears on top', position: 'top', trigger: button({ label: 'Top', variant: 'secondary' }) }) +
|
|
26
|
-
tooltip({ content: 'This appears below', position: 'bottom', trigger: button({ label: 'Bottom', variant: 'secondary' }) }) +
|
|
27
|
-
tooltip({ content: 'This appears to the left', position: 'left', trigger: button({ label: 'Left', variant: 'secondary' }) }) +
|
|
28
|
-
tooltip({ content: 'This appears to the right', position: 'right', trigger: button({ label: 'Right', variant: 'secondary' }) }),
|
|
29
|
-
}),
|
|
30
|
-
`tooltip({
|
|
31
|
-
content: 'This appears on top',
|
|
32
|
-
position: 'top', // top | bottom | left | right
|
|
33
|
-
trigger: button({ label: 'Hover me', variant: 'secondary' }),
|
|
34
|
-
})`
|
|
35
|
-
)}
|
|
36
|
-
|
|
37
|
-
${table(
|
|
38
|
-
['Prop', 'Type', 'Default', 'Description'],
|
|
39
|
-
[
|
|
40
|
-
['<code>content</code>', 'string', '—', 'Tooltip text (plain text only)'],
|
|
41
|
-
['<code>trigger</code>', 'string (HTML)', '—', 'Raw HTML slot — the element the tooltip wraps'],
|
|
42
|
-
['<code>position</code>', '<code>top | bottom | left | right</code>', '<code>top</code>', ''],
|
|
43
|
-
['<code>class</code>', 'string', '—', ''],
|
|
44
|
-
]
|
|
45
|
-
)}
|
|
46
|
-
`,
|
|
47
|
-
}),
|
|
48
|
-
}
|