@invisibleloop/pulse 0.20.5 → 0.20.7

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 (164) hide show
  1. package/.claude/pulse-checklist.md +1 -2
  2. package/CLAUDE.md +1 -2
  3. package/docs/.claude/pulse-checklist.md +1 -2
  4. package/docs/public/coutumes.css +21 -44
  5. package/docs/public/docs.css +73 -6
  6. package/docs/public/home-brut.css +175 -191
  7. package/docs/public/pulse-ui.css +8 -1037
  8. package/docs/public/retrowheels.css +23 -0
  9. package/docs/public/shop.css +35 -1
  10. package/docs/public/sparkys.css +56 -23
  11. package/docs/public/theme.css +51 -7
  12. package/docs/server.js +0 -11
  13. package/docs/src/lib/component-page.js +2 -1
  14. package/docs/src/lib/nav.js +0 -11
  15. package/docs/src/pages/accessibility.js +2 -1
  16. package/docs/src/pages/actions.js +2 -1
  17. package/docs/src/pages/auth.js +2 -1
  18. package/docs/src/pages/caching.js +2 -1
  19. package/docs/src/pages/components/accordion.js +2 -1
  20. package/docs/src/pages/components/alert.js +2 -1
  21. package/docs/src/pages/components/app-badge.js +2 -1
  22. package/docs/src/pages/components/avatar.js +2 -1
  23. package/docs/src/pages/components/badge.js +2 -1
  24. package/docs/src/pages/components/breadcrumbs.js +2 -1
  25. package/docs/src/pages/components/button.js +2 -1
  26. package/docs/src/pages/components/card.js +2 -1
  27. package/docs/src/pages/components/charts.js +4 -2
  28. package/docs/src/pages/components/checkbox.js +2 -1
  29. package/docs/src/pages/components/cluster.js +2 -1
  30. package/docs/src/pages/components/container.js +2 -1
  31. package/docs/src/pages/components/cta.js +2 -1
  32. package/docs/src/pages/components/divider.js +2 -1
  33. package/docs/src/pages/components/empty.js +2 -1
  34. package/docs/src/pages/components/feature.js +2 -1
  35. package/docs/src/pages/components/fieldset.js +2 -1
  36. package/docs/src/pages/components/fileupload.js +2 -1
  37. package/docs/src/pages/components/footer.js +2 -1
  38. package/docs/src/pages/components/grid.js +11 -6
  39. package/docs/src/pages/components/heading.js +2 -1
  40. package/docs/src/pages/components/hero.js +2 -1
  41. package/docs/src/pages/components/icons.js +2 -1
  42. package/docs/src/pages/components/image.js +2 -1
  43. package/docs/src/pages/components/input.js +2 -1
  44. package/docs/src/pages/components/media.js +2 -1
  45. package/docs/src/pages/components/modal.js +2 -1
  46. package/docs/src/pages/components/nav.js +2 -1
  47. package/docs/src/pages/components/phone-frame.js +2 -1
  48. package/docs/src/pages/components/progress.js +2 -1
  49. package/docs/src/pages/components/prose.js +2 -1
  50. package/docs/src/pages/components/pullquote.js +2 -1
  51. package/docs/src/pages/components/radio.js +2 -1
  52. package/docs/src/pages/components/rating.js +2 -1
  53. package/docs/src/pages/components/search.js +2 -1
  54. package/docs/src/pages/components/section.js +2 -1
  55. package/docs/src/pages/components/segmented.js +2 -1
  56. package/docs/src/pages/components/select.js +2 -1
  57. package/docs/src/pages/components/slider.js +2 -1
  58. package/docs/src/pages/components/spinner.js +2 -1
  59. package/docs/src/pages/components/stack.js +2 -1
  60. package/docs/src/pages/components/stat.js +2 -1
  61. package/docs/src/pages/components/stepper.js +2 -1
  62. package/docs/src/pages/components/table.js +2 -1
  63. package/docs/src/pages/components/textarea.js +2 -1
  64. package/docs/src/pages/components/toggle.js +2 -1
  65. package/docs/src/pages/components/tooltip.js +2 -1
  66. package/docs/src/pages/components.js +2 -5
  67. package/docs/src/pages/config.js +2 -1
  68. package/docs/src/pages/constraints.js +2 -1
  69. package/docs/src/pages/deploy.js +2 -1
  70. package/docs/src/pages/error-pages.js +2 -1
  71. package/docs/src/pages/extending.js +2 -1
  72. package/docs/src/pages/faq.js +2 -1
  73. package/docs/src/pages/forms.js +2 -1
  74. package/docs/src/pages/getting-started.js +2 -1
  75. package/docs/src/pages/guard.js +2 -1
  76. package/docs/src/pages/home.js +24 -15
  77. package/docs/src/pages/how-it-works.js +22 -15
  78. package/docs/src/pages/hydration.js +2 -1
  79. package/docs/src/pages/images.js +2 -1
  80. package/docs/src/pages/markdown.js +2 -1
  81. package/docs/src/pages/meta.js +2 -1
  82. package/docs/src/pages/mutations.js +2 -1
  83. package/docs/src/pages/navigation.js +2 -1
  84. package/docs/src/pages/performance.js +2 -1
  85. package/docs/src/pages/persist.js +2 -1
  86. package/docs/src/pages/project-structure.js +2 -1
  87. package/docs/src/pages/prompt-examples.js +2 -1
  88. package/docs/src/pages/raw-responses.js +2 -1
  89. package/docs/src/pages/routing.js +2 -1
  90. package/docs/src/pages/server-api.js +2 -1
  91. package/docs/src/pages/server-data.js +2 -1
  92. package/docs/src/pages/slash-commands.js +2 -1
  93. package/docs/src/pages/spec.js +2 -1
  94. package/docs/src/pages/state.js +2 -1
  95. package/docs/src/pages/store.js +2 -1
  96. package/docs/src/pages/streaming.js +2 -1
  97. package/docs/src/pages/stripe.js +2 -1
  98. package/docs/src/pages/supabase.js +2 -1
  99. package/docs/src/pages/templates/coutumes.js +83 -72
  100. package/docs/src/pages/templates/mobile-app.js +36 -9
  101. package/docs/src/pages/templates/retrowheels.js +17 -4
  102. package/docs/src/pages/templates/shop.js +21 -10
  103. package/docs/src/pages/templates/sparkys.js +35 -20
  104. package/docs/src/pages/templates.js +2 -2
  105. package/docs/src/pages/testing.js +2 -1
  106. package/docs/src/pages/validation.js +2 -1
  107. package/examples/.claude/pulse-checklist.md +1 -2
  108. package/examples/examples.test.js +4 -4
  109. package/examples/pricing.js +21 -3
  110. package/examples/public/pulse-ui.css +8 -1037
  111. package/examples/retrowheels.css +23 -0
  112. package/examples/retrowheels.js +17 -4
  113. package/package.json +5 -1
  114. package/public/.pulse-ui-version +1 -1
  115. package/public/pulse-ui.css +8 -1037
  116. package/src/agent/checklist.md +1 -2
  117. package/src/agent/guide-components.md +43 -67
  118. package/src/agent/guide-design-gallery.md +14 -14
  119. package/src/agent/guide-design-references.md +21 -21
  120. package/src/agent/guide-styles.md +2 -2
  121. package/src/agent/guide-templates.md +6 -6
  122. package/src/agent/identity.md +1 -1
  123. package/src/agent/workflow.md +1 -2
  124. package/src/mcp/server.js +31 -24
  125. package/src/ui/index.js +0 -27
  126. package/src/ui/ui.test.js +0 -137
  127. package/types/charts.d.ts +61 -0
  128. package/types/ui.d.ts +1 -129
  129. package/docs/src/pages/components/banner.js +0 -44
  130. package/docs/src/pages/components/carousel.js +0 -71
  131. package/docs/src/pages/components/code-window.js +0 -56
  132. package/docs/src/pages/components/decorate.js +0 -74
  133. package/docs/src/pages/components/gallery.js +0 -102
  134. package/docs/src/pages/components/list.js +0 -111
  135. package/docs/src/pages/components/marquee.js +0 -76
  136. package/docs/src/pages/components/photo-card.js +0 -74
  137. package/docs/src/pages/components/pricing.js +0 -67
  138. package/docs/src/pages/components/testimonial.js +0 -48
  139. package/docs/src/pages/components/timeline.js +0 -226
  140. package/src/ui/banner.js +0 -41
  141. package/src/ui/brand-statement.js +0 -58
  142. package/src/ui/carousel.js +0 -59
  143. package/src/ui/code-window.js +0 -39
  144. package/src/ui/colophon.js +0 -29
  145. package/src/ui/contact-row.js +0 -41
  146. package/src/ui/decorate.js +0 -55
  147. package/src/ui/display-heading.js +0 -44
  148. package/src/ui/drop-cap.js +0 -29
  149. package/src/ui/editorial-hero.js +0 -63
  150. package/src/ui/entry-list.js +0 -36
  151. package/src/ui/gallery.js +0 -60
  152. package/src/ui/image-pair.js +0 -72
  153. package/src/ui/list.js +0 -36
  154. package/src/ui/marquee.js +0 -48
  155. package/src/ui/photo-card.js +0 -44
  156. package/src/ui/pricing.js +0 -56
  157. package/src/ui/product-card.js +0 -65
  158. package/src/ui/section-label.js +0 -38
  159. package/src/ui/service-card.js +0 -47
  160. package/src/ui/stat-grid.js +0 -40
  161. package/src/ui/testimonial.js +0 -59
  162. package/src/ui/timeline.js +0 -72
  163. package/src/ui/top-strip.js +0 -47
  164. package/src/ui/trust-list.js +0 -46
@@ -9,9 +9,10 @@ const { prev, next } = prevNext('/components/feature')
9
9
  export default {
10
10
  route: '/components/feature',
11
11
  meta: {
12
+ theme: 'light',
12
13
  title: 'Feature — Pulse Docs',
13
14
  description: 'Feature component for Pulse UI.',
14
- styles: ['/pulse-ui.css', '/docs.css'],
15
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
15
16
  },
16
17
  view: () => renderComponentPage({
17
18
  currentHref: '/components/feature',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/fieldset')
8
8
  export default {
9
9
  route: '/components/fieldset',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Fieldset — Pulse Docs',
12
13
  description: 'Semantic grouping of related form fields with an accessible legend.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/fieldset',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/file-upload')
8
8
  export default {
9
9
  route: '/components/file-upload',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'File Upload — Pulse Docs',
12
13
  description: 'Drag-and-drop file upload zone component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  state: { fileName: '', fileSize: '' },
16
17
  mutations: {
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/footer')
8
8
  export default {
9
9
  route: '/components/footer',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Footer — Pulse Docs',
12
13
  description: 'Accessible site footer with logo slot, navigation links, and legal text.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/footer',
@@ -1,7 +1,7 @@
1
1
  import { renderComponentPage, demo } from '../../lib/component-page.js'
2
2
  import { prevNext } from '../../lib/nav.js'
3
3
  import { table } from '../../lib/layout.js'
4
- import { grid, card, stat, feature, testimonial } from '../../../../src/ui/index.js'
4
+ import { grid, card, stat, feature } from '../../../../src/ui/index.js'
5
5
 
6
6
  const { prev, next } = prevNext('/components/grid')
7
7
 
@@ -12,9 +12,10 @@ const item = (label) =>
12
12
  export default {
13
13
  route: '/components/grid',
14
14
  meta: {
15
+ theme: 'light',
15
16
  title: 'Grid — Pulse Docs',
16
17
  description: 'Grid component for Pulse UI.',
17
- styles: ['/pulse-ui.css', '/docs.css'],
18
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
18
19
  },
19
20
  view: () => renderComponentPage({
20
21
  currentHref: '/components/grid',
@@ -96,18 +97,22 @@ export default {
96
97
  )}
97
98
 
98
99
  <h3 class="doc-h3">Testimonial grid</h3>
100
+ <p>There is no dedicated <code>testimonial</code> component — build one with <code>card()</code>: the quote in <code>content</code>, the name and role in <code>footer</code>.</p>
99
101
  ${demo(
100
102
  grid({
101
103
  cols: 3,
102
104
  content: [
103
- testimonial({ quote: 'Shipped our redesign in a weekend. No boilerplate, no config hell.', name: 'Alex Morgan', role: 'CTO at Launchpad', rating: 5 }),
104
- testimonial({ quote: 'The streaming SSR makes our pages feel instant. Lighthouse is happy.', name: 'Sara Kim', role: 'Lead Engineer, Orbit', rating: 5 }),
105
- testimonial({ quote: 'Finally a UI kit that doesn\'t fight the platform. Just HTML.', name: 'Dan Okafor', role: 'Founder, Stackly', rating: 5 }),
105
+ card({ content: `<p style="color:var(--muted);margin:0">&ldquo;Shipped our redesign in a weekend. No boilerplate, no config hell.&rdquo;</p>`, footer: `<strong>Alex Morgan</strong><br><span style="color:var(--muted)">CTO at Launchpad</span>` }),
106
+ card({ content: `<p style="color:var(--muted);margin:0">&ldquo;The streaming SSR makes our pages feel instant. Lighthouse is happy.&rdquo;</p>`, footer: `<strong>Sara Kim</strong><br><span style="color:var(--muted)">Lead Engineer, Orbit</span>` }),
107
+ card({ content: `<p style="color:var(--muted);margin:0">&ldquo;Finally a UI kit that doesn\'t fight the platform. Just HTML.&rdquo;</p>`, footer: `<strong>Dan Okafor</strong><br><span style="color:var(--muted)">Founder, Stackly</span>` }),
106
108
  ].join(''),
107
109
  }),
108
110
  `grid({
109
111
  cols: 3,
110
- content: testimonials.map(t => testimonial(t)).join(''),
112
+ content: testimonials.map(t => card({
113
+ content: \`<p>\${t.quote}</p>\`,
114
+ footer: \`<strong>\${t.name}</strong><br>\${t.role}\`,
115
+ })).join(''),
111
116
  })`
112
117
  )}
113
118
 
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/heading')
8
8
  export default {
9
9
  route: '/components/heading',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Heading — Pulse Docs',
12
13
  description: 'Styled semantic heading component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/heading',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/hero')
8
8
  export default {
9
9
  route: '/components/hero',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Hero — Pulse Docs',
12
13
  description: 'Hero component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  state: {},
16
17
  view: () => {
@@ -382,9 +382,10 @@ feature({ icon: iconCode({ size: 22, bg: 'square', bgColor: 'muted' }), titl
382
382
  export default {
383
383
  route: '/components/icons',
384
384
  meta: {
385
+ theme: 'light',
385
386
  title: 'Icons — Pulse Docs',
386
387
  description: 'Built-in icon set for Pulse UI.',
387
- styles: ['/pulse-ui.css', '/docs.css'],
388
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
388
389
  },
389
390
 
390
391
  // Shell: all visible content (nav, examples, icon grid) — sends immediately.
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/image')
8
8
  export default {
9
9
  route: '/components/image',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Image — Pulse Docs',
12
13
  description: 'Responsive image component with optional aspect-ratio crop and caption for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/image',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/input')
8
8
  export default {
9
9
  route: '/components/input',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Input — Pulse Docs',
12
13
  description: 'Input component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/input',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/media')
8
8
  export default {
9
9
  route: '/components/media',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Media — Pulse Docs',
12
13
  description: 'Media component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/media',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/modal')
8
8
  export default {
9
9
  route: '/components/modal',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Modal — Pulse Docs',
12
13
  description: 'Modal dialog component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/modal',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/nav')
8
8
  export default {
9
9
  route: '/components/nav',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Nav — Pulse Docs',
12
13
  description: 'Nav component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/nav',
@@ -28,9 +28,10 @@ const sampleScreen = `
28
28
  export default {
29
29
  route: '/components/phone-frame',
30
30
  meta: {
31
+ theme: 'light',
31
32
  title: 'Phone Frame — Pulse Docs',
32
33
  description: 'Phone Frame component for Pulse UI.',
33
- styles: ['/pulse-ui.css', '/docs.css'],
34
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
34
35
  },
35
36
  state: {},
36
37
  view: () => renderComponentPage({
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/progress')
8
8
  export default {
9
9
  route: '/components/progress',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Progress — Pulse Docs',
12
13
  description: 'Progress bar component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/progress',
@@ -21,9 +21,10 @@ const SAMPLE_HTML = `<h2>Why great coffee starts with water</h2>
21
21
  export default {
22
22
  route: '/components/prose',
23
23
  meta: {
24
+ theme: 'light',
24
25
  title: 'Prose — Pulse Docs',
25
26
  description: 'Typography wrapper for CMS output and rich text content in Pulse UI.',
26
- styles: ['/pulse-ui.css', '/docs.css'],
27
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
27
28
  },
28
29
  view: () => renderComponentPage({
29
30
  currentHref: '/components/prose',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/pullquote')
8
8
  export default {
9
9
  route: '/components/pullquote',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Pullquote — Pulse Docs',
12
13
  description: 'Styled blockquote component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/pullquote',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/radio')
8
8
  export default {
9
9
  route: '/components/radio',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Radio — Pulse Docs',
12
13
  description: 'Radio button and radio group components for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/radio',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/rating')
8
8
  export default {
9
9
  route: '/components/rating',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Rating — Pulse Docs',
12
13
  description: 'Star rating display and interactive input component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/rating',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/search')
8
8
  export default {
9
9
  route: '/components/search',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Search — Pulse Docs',
12
13
  description: 'Search input component with icon, debounce binding, and clear button.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/search',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/section')
8
8
  export default {
9
9
  route: '/components/section',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Section — Pulse Docs',
12
13
  description: 'Vertical padding wrapper with optional background. Compose with container() for full-width background with constrained content.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/section',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/segmented')
8
8
  export default {
9
9
  route: '/components/segmented',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Segmented — Pulse Docs',
12
13
  description: 'iOS-style segmented control component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/segmented',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/components/select')
7
7
  export default {
8
8
  route: '/components/select',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Select — Pulse Docs',
11
12
  description: 'Select component for Pulse UI.',
12
- styles: ['/pulse-ui.css', '/docs.css'],
13
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderComponentPage({
15
16
  currentHref: '/components/select',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/slider')
8
8
  export default {
9
9
  route: '/components/slider',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Slider — Pulse Docs',
12
13
  description: 'Styled range input slider component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  state: { brightness: 100 },
16
17
  mutations: {
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/spinner')
8
8
  export default {
9
9
  route: '/components/spinner',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Spinner — Pulse Docs',
12
13
  description: 'Loading spinner component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/spinner',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/stack')
8
8
  export default {
9
9
  route: '/components/stack',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Stack — Pulse Docs',
12
13
  description: 'Stack component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/stack',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/stat')
8
8
  export default {
9
9
  route: '/components/stat',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Stat — Pulse Docs',
12
13
  description: 'Stat component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/stat',
@@ -10,9 +10,10 @@ const STEPS = ['Account', 'Details', 'Payment', 'Review']
10
10
  export default {
11
11
  route: '/components/stepper',
12
12
  meta: {
13
+ theme: 'light',
13
14
  title: 'Stepper — Pulse Docs',
14
15
  description: 'Horizontal step progress indicator component for Pulse UI.',
15
- styles: ['/pulse-ui.css', '/docs.css'],
16
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
16
17
  },
17
18
  view: () => renderComponentPage({
18
19
  currentHref: '/components/stepper',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/table')
8
8
  export default {
9
9
  route: '/components/table',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Table — Pulse Docs',
12
13
  description: 'Table component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/table',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/components/textarea')
7
7
  export default {
8
8
  route: '/components/textarea',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Textarea — Pulse Docs',
11
12
  description: 'Textarea component for Pulse UI.',
12
- styles: ['/pulse-ui.css', '/docs.css'],
13
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderComponentPage({
15
16
  currentHref: '/components/textarea',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/toggle')
8
8
  export default {
9
9
  route: '/components/toggle',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Toggle — Pulse Docs',
12
13
  description: 'iOS-style switch toggle component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/toggle',
@@ -8,9 +8,10 @@ const { prev, next } = prevNext('/components/tooltip')
8
8
  export default {
9
9
  route: '/components/tooltip',
10
10
  meta: {
11
+ theme: 'light',
11
12
  title: 'Tooltip — Pulse Docs',
12
13
  description: 'Tooltip component for Pulse UI.',
13
- styles: ['/pulse-ui.css', '/docs.css'],
14
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
14
15
  },
15
16
  view: () => renderComponentPage({
16
17
  currentHref: '/components/tooltip',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/components')
7
7
  export default {
8
8
  route: '/components',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Component Library — Pulse Docs',
11
12
  description: 'Server-rendered UI components for Pulse — button, card, input, alert, stat, avatar, table and more. Fully accessible, mobile-ready, zero client JS.',
12
- styles: ['/pulse-ui.css', '/docs.css'],
13
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/components',
@@ -94,8 +95,6 @@ export default {
94
95
  ['<a href="/components/hero">hero</a>', 'Full-width hero section with eyebrow, title, and actions.'],
95
96
  ['<a href="/components/app-badge">appBadge</a>', 'App Store / Google Play download badge.'],
96
97
  ['<a href="/components/feature">feature</a>', 'Icon + title + description block for feature grids.'],
97
- ['<a href="/components/testimonial">testimonial</a>', 'Customer quote with avatar and star rating.'],
98
- ['<a href="/components/pricing">pricing</a>', 'Plan card with feature list and CTA. Supports highlighted state.'],
99
98
  ['<a href="/components/accordion">accordion</a>', 'Collapsible FAQ items — no JS, native <code>&lt;details&gt;</code>.'],
100
99
  ['<a href="/components/cta">cta</a>', 'Call-to-action block with eyebrow, heading, body, and actions slot.'],
101
100
  ]
@@ -111,9 +110,7 @@ export default {
111
110
  ['<a href="/components/stack">stack</a>', 'Flex column with consistent vertical gap.'],
112
111
  ['<a href="/components/cluster">cluster</a>', 'Flex row with wrapping — for badges, buttons, etc.'],
113
112
  ['<a href="/components/divider">divider</a>', 'Horizontal rule, optionally with centred label.'],
114
- ['<a href="/components/banner">banner</a>', 'Full-width announcement bar above the nav.'],
115
113
  ['<a href="/components/media">media</a>', 'Two-column image + text layout, stacks on mobile.'],
116
- ['<a href="/components/code-window">codeWindow</a>', 'macOS window chrome around a code block. Accepts pre-highlighted HTML.'],
117
114
  ['<a href="/components/footer">footer</a>', 'Site footer with logo, nav links, and legal text. Stacks on mobile.'],
118
115
  ]
119
116
  )}
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/config')
7
7
  export default {
8
8
  route: '/config',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Configuration — Pulse Docs',
11
12
  description: 'Full reference for pulse.config.js — port, Lighthouse thresholds, load test config, environments, and per-route overrides.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/config',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/constraints')
7
7
  export default {
8
8
  route: '/constraints',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Constraints — Pulse Docs',
11
12
  description: 'Automatic min/max bounds on state values, enforced after every mutation.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  state: {},
15
16
  view: () => renderLayout({
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/deploy')
7
7
  export default {
8
8
  route: '/deploy',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Deployment — Pulse Docs',
11
12
  description: 'Deploy a Pulse app to a VPS, Docker, Fly.io, Railway, or Render.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/deploy',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/error-pages')
7
7
  export default {
8
8
  route: '/error-pages',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Error Pages — Pulse Docs',
11
12
  description: 'Custom 404 pages in Pulse. A spec with route "*" renders through the normal pipeline with status 404 whenever no route matches.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/error-pages',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/extending')
7
7
  export default {
8
8
  route: '/extending',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Extending Pulse — Pulse Docs',
11
12
  description: 'Escape hatches for features outside the Pulse spec — onRequest middleware, raw server access, WebSockets, SSE, and custom error handling.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/extending',
@@ -17,9 +17,10 @@ function q(question, answer) {
17
17
  export default {
18
18
  route: '/faq',
19
19
  meta: {
20
+ theme: 'light',
20
21
  title: 'FAQ — Pulse Docs',
21
22
  description: 'Frequently asked questions about the Pulse framework.',
22
- styles: ['/pulse-ui.css', '/docs.css'],
23
+ styles: ['/pulse-ui.css', '/theme.css', '/docs.css'],
23
24
  },
24
25
  view: () => renderLayout({
25
26
  currentHref: '/faq',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/forms')
7
7
  export default {
8
8
  route: '/forms',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Forms — Pulse Docs',
11
12
  description: 'Server-side form handling in Pulse. spec.submit processes POST requests without client JavaScript, with automatic CSRF protection and POST-redirect-GET.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/forms',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/getting-started')
7
7
  export default {
8
8
  route: '/getting-started',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Getting Started — Pulse Docs',
11
12
  description: 'Install Pulse and build your first page with an AI agent in minutes.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/getting-started',
@@ -7,9 +7,10 @@ const { prev, next } = prevNext('/guard')
7
7
  export default {
8
8
  route: '/guard',
9
9
  meta: {
10
+ theme: 'light',
10
11
  title: 'Guard — Pulse Docs',
11
12
  description: 'Per-route authorization in Pulse. Guard functions run before server data fetchers and redirect unauthorized requests.',
12
- styles: ['/docs.css'],
13
+ styles: ['/theme.css', '/docs.css'],
13
14
  },
14
15
  view: () => renderLayout({
15
16
  currentHref: '/guard',