@invisibleloop/pulse 0.20.10 → 0.20.19

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 (266) hide show
  1. package/package.json +6 -5
  2. package/public/.pulse-ui-version +1 -1
  3. package/scripts/build.js +26 -0
  4. package/scripts/release-version.js +17 -8
  5. package/scripts/strip-server.test.js +60 -0
  6. package/src/agent/checklist.md +8 -12
  7. package/src/agent/commands/pulse-start.md +2 -0
  8. package/src/agent/commands/verify.md +30 -8
  9. package/src/agent/guide-components.md +7 -25
  10. package/src/agent/guide-routing.md +0 -12
  11. package/src/agent/guide-server.md +102 -1
  12. package/src/agent/guide-spec.md +8 -1
  13. package/src/agent/guide-styles.md +23 -0
  14. package/src/agent/identity.md +9 -0
  15. package/src/agent/workflow.md +4 -23
  16. package/src/cli/check-bundles.js +113 -0
  17. package/src/cli/check-bundles.test.js +137 -0
  18. package/src/cli/cli.test.js +105 -0
  19. package/src/cli/dev.js +48 -3
  20. package/src/cli/diagnose.js +105 -0
  21. package/src/cli/diagnose.test.js +124 -0
  22. package/src/cli/discover.js +9 -2
  23. package/src/cli/index.js +171 -9
  24. package/src/cli/process-utils.js +57 -0
  25. package/src/cli/process-utils.test.js +114 -0
  26. package/src/cli/review.js +391 -0
  27. package/src/cli/review.test.js +143 -0
  28. package/src/cli/scaffold.js +9 -4
  29. package/src/cli/stamp.js +102 -0
  30. package/src/cli/stamp.test.js +149 -0
  31. package/src/cli/start.js +15 -2
  32. package/src/cli/validate.js +184 -0
  33. package/src/cli/validate.test.js +153 -0
  34. package/src/mcp/mcp.test.js +261 -30
  35. package/src/mcp/server.js +207 -515
  36. package/src/mcp/validate-worker.js +18 -1
  37. package/src/runtime/index.js +144 -11
  38. package/src/runtime/runtime.test.js +199 -0
  39. package/src/runtime/ssr.js +14 -7
  40. package/src/runtime/ssr.test.js +31 -0
  41. package/src/server/index.js +163 -10
  42. package/src/server/server.test.js +225 -2
  43. package/src/spec/schema.js +1 -1
  44. package/src/ui/index.js +0 -5
  45. package/src/ui/ui.test.js +0 -75
  46. package/types/ui.d.ts +0 -21
  47. package/.claude/commands/build-page.md +0 -63
  48. package/.claude/commands/new-doc-page.md +0 -45
  49. package/.claude/commands/pulse-start.md +0 -11
  50. package/.claude/commands/pulse-stop.md +0 -5
  51. package/.claude/commands/verify.md +0 -118
  52. package/.claude/pulse-checklist.md +0 -189
  53. package/.github/workflows/ci.yml +0 -25
  54. package/.github/workflows/publish.yml +0 -45
  55. package/.pulse/load-reports/home/1773432711417.json +0 -22
  56. package/.pulse-verified +0 -1
  57. package/AGENTS.md +0 -697
  58. package/CLAUDE.md +0 -697
  59. package/README.md +0 -95
  60. package/benchmark/public/dist/counter.boot-PO6SNSJZ.js +0 -8
  61. package/benchmark/public/dist/home.boot-YK6VAEQI.js +0 -6
  62. package/benchmark/public/dist/manifest.json +0 -5
  63. package/benchmark/public/dist/runtime-5Y7ESAIB.js +0 -2
  64. package/benchmark/public/dist/runtime-KO4BHUQ3.js +0 -49
  65. package/benchmark/results/2026-03-27-09-20.json +0 -188
  66. package/benchmark/results/2026-03-27-09-21.json +0 -188
  67. package/benchmark/results/2026-03-27-09-29.json +0 -188
  68. package/benchmark/results/2026-03-27-10-14.json +0 -188
  69. package/benchmark/results/2026-03-27-10-18.json +0 -232
  70. package/benchmark/src/pages/counter.js +0 -37
  71. package/benchmark/src/pages/home.js +0 -21
  72. package/docs/.claude/commands/pulse-build.md +0 -7
  73. package/docs/.claude/commands/pulse-dev.md +0 -7
  74. package/docs/.claude/commands/pulse-start.md +0 -9
  75. package/docs/.claude/commands/pulse-stop.md +0 -5
  76. package/docs/.claude/commands/verify.md +0 -84
  77. package/docs/.claude/coverage-check.js +0 -196
  78. package/docs/.claude/pulse-checklist.md +0 -189
  79. package/docs/public/.pulse-ui-version +0 -1
  80. package/docs/public/andypixel.css +0 -237
  81. package/docs/public/bookworms.css +0 -422
  82. package/docs/public/coutumes.css +0 -561
  83. package/docs/public/docs.css +0 -2388
  84. package/docs/public/favicon.svg +0 -4
  85. package/docs/public/home-brut.css +0 -982
  86. package/docs/public/images/bookworms/hero-books.jpg +0 -0
  87. package/docs/public/images/bookworms/how-we-read-now.jpg +0 -0
  88. package/docs/public/images/bookworms/lantern-keepers.jpg +0 -0
  89. package/docs/public/images/bookworms/provincial-bookseller.jpg +0 -0
  90. package/docs/public/images/journey/178.jpg +0 -0
  91. package/docs/public/images/journey/29.jpg +0 -0
  92. package/docs/public/images/retrowheels/hero.jpg +0 -0
  93. package/docs/public/images/shop/devbook-pro.jpg +0 -0
  94. package/docs/public/images/suzukibento/1015.jpg +0 -0
  95. package/docs/public/images/suzukibento/1025.jpg +0 -0
  96. package/docs/public/images/suzukibento/1043.jpg +0 -0
  97. package/docs/public/images/suzukibento/1059.jpg +0 -0
  98. package/docs/public/images/suzukibento/1062.jpg +0 -0
  99. package/docs/public/images/suzukibento/1084.jpg +0 -0
  100. package/docs/public/images/swish/1469334031218-e382a71b716b.jpg +0 -0
  101. package/docs/public/images/swish/1483985988355-763728e1935b.jpg +0 -0
  102. package/docs/public/images/swish/1485518882345-15568b007407.jpg +0 -0
  103. package/docs/public/images/swish/1490481651871-ab68de25d43d.jpg +0 -0
  104. package/docs/public/images/swish/1496747611176-843222e1e57c.jpg +0 -0
  105. package/docs/public/images/swish/1502716119720-b23a93e5fe1b.jpg +0 -0
  106. package/docs/public/images/swish/1539109136881-3be0616acf4b.jpg +0 -0
  107. package/docs/public/images/swish/1551803091-e20673f15770.jpg +0 -0
  108. package/docs/public/images/swish/1558769132-cb1aea458c5e.jpg +0 -0
  109. package/docs/public/images/swish/1572804013309-59a88b7e92f1.jpg +0 -0
  110. package/docs/public/img/heic1501a.jpg +0 -0
  111. package/docs/public/img/placeholder-landscape.svg +0 -18
  112. package/docs/public/img/placeholder-square.svg +0 -14
  113. package/docs/public/img/placeholder-tall.svg +0 -22
  114. package/docs/public/journey.css +0 -528
  115. package/docs/public/menu.js +0 -327
  116. package/docs/public/pulse-ui.css +0 -3028
  117. package/docs/public/pulse-ui.js +0 -257
  118. package/docs/public/retrowheels.css +0 -425
  119. package/docs/public/shop.css +0 -269
  120. package/docs/public/sparkys.css +0 -382
  121. package/docs/public/suzukibento.css +0 -517
  122. package/docs/public/swish.css +0 -394
  123. package/docs/public/theme.css +0 -52
  124. package/docs/public/themes/lumio.css +0 -50
  125. package/docs/public/themes/observatory.css +0 -104
  126. package/docs/server.js +0 -161
  127. package/docs/src/lib/component-page.js +0 -49
  128. package/docs/src/lib/highlight.js +0 -2
  129. package/docs/src/lib/layout.js +0 -190
  130. package/docs/src/lib/metrics-store.js +0 -6
  131. package/docs/src/lib/nav.js +0 -171
  132. package/docs/src/lib/stats.js +0 -81
  133. package/docs/src/pages/accessibility.js +0 -157
  134. package/docs/src/pages/actions.js +0 -194
  135. package/docs/src/pages/auth.js +0 -176
  136. package/docs/src/pages/caching.js +0 -95
  137. package/docs/src/pages/components/accordion.js +0 -48
  138. package/docs/src/pages/components/alert.js +0 -35
  139. package/docs/src/pages/components/app-badge.js +0 -41
  140. package/docs/src/pages/components/avatar.js +0 -35
  141. package/docs/src/pages/components/badge.js +0 -36
  142. package/docs/src/pages/components/breadcrumbs.js +0 -94
  143. package/docs/src/pages/components/button.js +0 -84
  144. package/docs/src/pages/components/card.js +0 -225
  145. package/docs/src/pages/components/charts.js +0 -283
  146. package/docs/src/pages/components/checkbox.js +0 -129
  147. package/docs/src/pages/components/cluster.js +0 -47
  148. package/docs/src/pages/components/container.js +0 -40
  149. package/docs/src/pages/components/cta.js +0 -54
  150. package/docs/src/pages/components/divider.js +0 -37
  151. package/docs/src/pages/components/empty.js +0 -36
  152. package/docs/src/pages/components/feature.js +0 -60
  153. package/docs/src/pages/components/fieldset.js +0 -65
  154. package/docs/src/pages/components/fileupload.js +0 -128
  155. package/docs/src/pages/components/footer.js +0 -58
  156. package/docs/src/pages/components/grid.js +0 -169
  157. package/docs/src/pages/components/heading.js +0 -107
  158. package/docs/src/pages/components/hero.js +0 -123
  159. package/docs/src/pages/components/icons.js +0 -410
  160. package/docs/src/pages/components/image.js +0 -71
  161. package/docs/src/pages/components/input.js +0 -51
  162. package/docs/src/pages/components/media.js +0 -51
  163. package/docs/src/pages/components/modal.js +0 -111
  164. package/docs/src/pages/components/nav.js +0 -136
  165. package/docs/src/pages/components/phone-frame.js +0 -74
  166. package/docs/src/pages/components/progress.js +0 -102
  167. package/docs/src/pages/components/prose.js +0 -111
  168. package/docs/src/pages/components/pullquote.js +0 -71
  169. package/docs/src/pages/components/radio.js +0 -194
  170. package/docs/src/pages/components/rating.js +0 -106
  171. package/docs/src/pages/components/search.js +0 -61
  172. package/docs/src/pages/components/section.js +0 -98
  173. package/docs/src/pages/components/segmented.js +0 -121
  174. package/docs/src/pages/components/select.js +0 -45
  175. package/docs/src/pages/components/slider.js +0 -115
  176. package/docs/src/pages/components/spinner.js +0 -73
  177. package/docs/src/pages/components/stack.js +0 -48
  178. package/docs/src/pages/components/stat.js +0 -55
  179. package/docs/src/pages/components/stepper.js +0 -66
  180. package/docs/src/pages/components/table.js +0 -45
  181. package/docs/src/pages/components/textarea.js +0 -31
  182. package/docs/src/pages/components/toggle.js +0 -84
  183. package/docs/src/pages/components/tooltip.js +0 -48
  184. package/docs/src/pages/components.js +0 -200
  185. package/docs/src/pages/config.js +0 -193
  186. package/docs/src/pages/constraints.js +0 -100
  187. package/docs/src/pages/deploy.js +0 -233
  188. package/docs/src/pages/error-pages.js +0 -99
  189. package/docs/src/pages/extending.js +0 -198
  190. package/docs/src/pages/faq.js +0 -99
  191. package/docs/src/pages/forms.js +0 -129
  192. package/docs/src/pages/getting-started.js +0 -147
  193. package/docs/src/pages/guard.js +0 -120
  194. package/docs/src/pages/home.js +0 -345
  195. package/docs/src/pages/how-it-works.js +0 -244
  196. package/docs/src/pages/hydration.js +0 -108
  197. package/docs/src/pages/images.js +0 -120
  198. package/docs/src/pages/markdown.js +0 -156
  199. package/docs/src/pages/meta.js +0 -193
  200. package/docs/src/pages/mutations.js +0 -107
  201. package/docs/src/pages/navigation.js +0 -85
  202. package/docs/src/pages/performance.js +0 -157
  203. package/docs/src/pages/persist.js +0 -89
  204. package/docs/src/pages/project-structure.js +0 -91
  205. package/docs/src/pages/prompt-examples.js +0 -186
  206. package/docs/src/pages/raw-responses.js +0 -122
  207. package/docs/src/pages/routing.js +0 -120
  208. package/docs/src/pages/server-api.js +0 -291
  209. package/docs/src/pages/server-data.js +0 -203
  210. package/docs/src/pages/slash-commands.js +0 -55
  211. package/docs/src/pages/spec.js +0 -207
  212. package/docs/src/pages/state.js +0 -102
  213. package/docs/src/pages/store.js +0 -203
  214. package/docs/src/pages/streaming.js +0 -107
  215. package/docs/src/pages/stripe.js +0 -194
  216. package/docs/src/pages/supabase.js +0 -324
  217. package/docs/src/pages/templates/andypixel.js +0 -260
  218. package/docs/src/pages/templates/blog-post.js +0 -226
  219. package/docs/src/pages/templates/bookworms.js +0 -227
  220. package/docs/src/pages/templates/coutumes.js +0 -237
  221. package/docs/src/pages/templates/journey.js +0 -186
  222. package/docs/src/pages/templates/mobile-app.js +0 -371
  223. package/docs/src/pages/templates/retrowheels.js +0 -355
  224. package/docs/src/pages/templates/shop.js +0 -268
  225. package/docs/src/pages/templates/sparkys.js +0 -264
  226. package/docs/src/pages/templates/suzukibento.js +0 -200
  227. package/docs/src/pages/templates/swish.js +0 -313
  228. package/docs/src/pages/templates.js +0 -534
  229. package/docs/src/pages/testing.js +0 -199
  230. package/docs/src/pages/validation.js +0 -138
  231. package/examples/.claude/commands/pulse-build.md +0 -7
  232. package/examples/.claude/commands/pulse-dev.md +0 -7
  233. package/examples/.claude/commands/pulse-start.md +0 -9
  234. package/examples/.claude/commands/pulse-stop.md +0 -5
  235. package/examples/.claude/commands/verify.md +0 -84
  236. package/examples/.claude/coverage-check.js +0 -196
  237. package/examples/.claude/pulse-checklist.md +0 -189
  238. package/examples/andypixel.css +0 -237
  239. package/examples/andypixel.js +0 -258
  240. package/examples/bookworms.css +0 -422
  241. package/examples/bookworms.js +0 -225
  242. package/examples/contact.js +0 -166
  243. package/examples/counter.js +0 -94
  244. package/examples/dev.server.js +0 -110
  245. package/examples/examples.test.js +0 -394
  246. package/examples/journey.css +0 -528
  247. package/examples/journey.js +0 -186
  248. package/examples/pricing.js +0 -262
  249. package/examples/products.js +0 -190
  250. package/examples/public/.pulse-ui-version +0 -1
  251. package/examples/public/pulse-ui.css +0 -3028
  252. package/examples/public/pulse-ui.js +0 -257
  253. package/examples/quiz.js +0 -208
  254. package/examples/retrowheels.css +0 -425
  255. package/examples/retrowheels.js +0 -353
  256. package/examples/shared.js +0 -84
  257. package/examples/suzukibento.css +0 -513
  258. package/examples/suzukibento.js +0 -200
  259. package/examples/swish.css +0 -394
  260. package/examples/swish.js +0 -311
  261. package/examples/todos.js +0 -162
  262. package/src/ui/fieldset.js +0 -37
  263. package/src/ui/phone-frame.js +0 -40
  264. package/src/ui/search.js +0 -78
  265. package/src/ui/segmented.js +0 -50
  266. package/src/ui/tooltip.js +0 -28
@@ -1,394 +0,0 @@
1
- /*
2
- * swish.css — Swish editorial fashion example
3
- *
4
- * Palette: warm off-white paper, deep ink, oxblood accent.
5
- * Font: Playfair Display (display headings), system-ui (body)
6
- *
7
- * Split into two logical sections:
8
- * 1. Token overrides — hex values, palette definitions ([data-theme="light"])
9
- * 2. Component styles — layout, typography, custom elements (var() only)
10
- */
11
-
12
- /* ==========================================================================
13
- 1. Token overrides (hex values live here)
14
- ========================================================================== */
15
-
16
- /* Override --font-display so --ui-font-display cascades to Playfair Display */
17
- :root {
18
- --font-display: 'Playfair Display', Georgia, 'Times New Roman', serif;
19
- }
20
-
21
- [data-theme="light"] {
22
- --ui-bg: #f5f1ea;
23
- --ui-surface: #faf7f1;
24
- --ui-surface-2: #ede7dc;
25
- --ui-border: #d8cfc0;
26
- --ui-text: #14110d;
27
- --ui-muted: #6b6357;
28
- --ui-accent: #6b1d1d;
29
- --ui-accent-hover: #4a1212;
30
- --ui-accent-dim: rgba(107, 29, 29, 0.10);
31
- --ui-accent-text: #faf7f1;
32
-
33
- /* Swish-specific tokens */
34
- --swish-paper: #faf7f1;
35
- --swish-ink: #14110d;
36
- --swish-hero-veil: rgba(20, 17, 13, 0.55);
37
- --swish-hero-veil-top: rgba(20, 17, 13, 0.05);
38
- --swish-label-bg: rgba(20, 17, 13, 0.55);
39
- }
40
-
41
- /* Primary button on light theme — needs paper text, not default */
42
- [data-theme="light"] .ui-btn--primary {
43
- color: var(--swish-paper);
44
- }
45
-
46
- /* Frosted nav over editorial imagery */
47
- [data-theme="light"] .ui-nav {
48
- backdrop-filter: blur(14px);
49
- -webkit-backdrop-filter: blur(14px);
50
- background: rgba(245, 241, 234, 0.78);
51
- }
52
-
53
- [data-theme="light"] .ui-nav-mobile .ui-nav-link,
54
- [data-theme="light"] .ui-nav-mobile .ui-nav-mega-item-label,
55
- [data-theme="light"] .ui-nav-mobile-section {
56
- color: var(--ui-text);
57
- }
58
-
59
- /* ==========================================================================
60
- 2. Component styles (var() only — no hex values below this line)
61
- ========================================================================== */
62
-
63
- /* --------------------------------------------------------------------------
64
- Skip link
65
- -------------------------------------------------------------------------- */
66
- .skip-link {
67
- position: absolute;
68
- left: -9999px;
69
- top: 0;
70
- background: var(--ui-text);
71
- color: var(--ui-bg);
72
- padding: var(--ui-space-2) var(--ui-space-4);
73
- z-index: 100;
74
- }
75
-
76
- .skip-link:focus {
77
- left: var(--ui-space-4);
78
- top: var(--ui-space-4);
79
- }
80
-
81
- /* --------------------------------------------------------------------------
82
- Brand wordmark
83
- -------------------------------------------------------------------------- */
84
- .swish-mark {
85
- font-family: var(--ui-font-display);
86
- font-weight: 400;
87
- font-size: var(--ui-text-2xl);
88
- letter-spacing: 0.32em;
89
- text-transform: uppercase;
90
- }
91
-
92
- /* --------------------------------------------------------------------------
93
- Full-bleed hero
94
- -------------------------------------------------------------------------- */
95
- .swish-hero {
96
- position: relative;
97
- min-height: 88vh;
98
- display: flex;
99
- align-items: center;
100
- background-image:
101
- linear-gradient(180deg, var(--swish-hero-veil-top) 0%, var(--swish-hero-veil) 100%),
102
- url('/images/swish/1490481651871-ab68de25d43d.jpg');
103
- background-size: cover;
104
- background-position: center;
105
- color: var(--swish-paper);
106
- padding: var(--ui-space-12) var(--ui-space-6) var(--ui-space-16);
107
- }
108
-
109
- .swish-hero__inner {
110
- max-width: 880px;
111
- margin: 0 auto;
112
- width: 100%;
113
- }
114
-
115
- .swish-hero__eyebrow {
116
- display: inline-block;
117
- font-size: var(--ui-text-xs);
118
- letter-spacing: 0.24em;
119
- text-transform: uppercase;
120
- color: var(--swish-ink);
121
- background: var(--swish-paper);
122
- padding: var(--ui-space-1) var(--ui-space-3);
123
- margin-bottom: var(--ui-space-5);
124
- }
125
-
126
- .swish-hero__title {
127
- font-family: var(--ui-font-display);
128
- font-weight: 400;
129
- font-size: clamp(3rem, 9vw, 7rem);
130
- line-height: 0.95;
131
- letter-spacing: -0.02em;
132
- margin-bottom: var(--ui-space-6);
133
- }
134
-
135
- .swish-hero__deck {
136
- font-size: var(--ui-text-lg);
137
- line-height: 1.6;
138
- max-width: 36rem;
139
- margin-bottom: var(--ui-space-8);
140
- opacity: 0.92;
141
- }
142
-
143
- /* Ghost button inside the hero — force white so it's visible over the dark veil */
144
- .swish-hero .ui-btn--ghost {
145
- color: #fff;
146
- border-color: rgba(255,255,255,0.6);
147
- }
148
- .swish-hero .ui-btn--ghost:hover {
149
- background: rgba(255,255,255,0.12);
150
- border-color: #fff;
151
- }
152
-
153
- /* Quote section — equal top and bottom padding */
154
- .swish-quote-section { padding-bottom: var(--ui-space-16); }
155
-
156
- /* --------------------------------------------------------------------------
157
- Section eyebrow / issue marker
158
- -------------------------------------------------------------------------- */
159
- .swish-issue {
160
- display: flex;
161
- align-items: center;
162
- gap: var(--ui-space-4);
163
- font-size: var(--ui-text-xs);
164
- letter-spacing: 0.24em;
165
- text-transform: uppercase;
166
- color: var(--ui-muted);
167
- margin-bottom: var(--ui-space-6);
168
- }
169
-
170
- .swish-issue::before,
171
- .swish-issue::after {
172
- content: '';
173
- flex: 1;
174
- height: 1px;
175
- background: var(--ui-border);
176
- }
177
-
178
- .swish-issue--left::after {
179
- display: none;
180
- }
181
-
182
- /* --------------------------------------------------------------------------
183
- Featured looks (product cards)
184
- -------------------------------------------------------------------------- */
185
- .swish-look {
186
- display: block;
187
- text-decoration: none;
188
- color: var(--ui-text);
189
- }
190
-
191
- .swish-look__frame {
192
- aspect-ratio: 3 / 4;
193
- overflow: hidden;
194
- background: var(--ui-surface-2);
195
- margin-bottom: var(--ui-space-4);
196
- }
197
-
198
- .swish-look__frame img {
199
- width: 100%;
200
- height: 100%;
201
- object-fit: cover;
202
- display: block;
203
- transition: transform 600ms ease;
204
- }
205
-
206
- .swish-look:hover .swish-look__frame img {
207
- transform: scale(1.04);
208
- }
209
-
210
- .swish-look__name {
211
- font-family: var(--ui-font-display);
212
- font-size: var(--ui-text-lg);
213
- font-weight: 400;
214
- margin-bottom: var(--ui-space-1);
215
- }
216
-
217
- .swish-look__meta {
218
- font-size: var(--ui-text-sm);
219
- color: var(--ui-muted);
220
- letter-spacing: 0.04em;
221
- }
222
-
223
- /* --------------------------------------------------------------------------
224
- Atelier split layout
225
- -------------------------------------------------------------------------- */
226
- .swish-split {
227
- display: grid;
228
- grid-template-columns: 1fr 1fr;
229
- gap: var(--ui-space-12);
230
- align-items: center;
231
- }
232
-
233
- .swish-split__media {
234
- aspect-ratio: 4 / 5;
235
- overflow: hidden;
236
- background: var(--ui-surface-2);
237
- }
238
-
239
- .swish-split__media img {
240
- width: 100%;
241
- height: 100%;
242
- object-fit: cover;
243
- display: block;
244
- }
245
-
246
- .swish-split__title {
247
- font-family: var(--ui-font-display);
248
- font-size: clamp(2rem, 4vw, 3rem);
249
- font-weight: 400;
250
- line-height: 1.05;
251
- letter-spacing: -0.015em;
252
- margin-bottom: var(--ui-space-5);
253
- }
254
-
255
- .swish-split__body p {
256
- font-size: var(--ui-text-lg);
257
- line-height: 1.75;
258
- color: var(--ui-text);
259
- margin-bottom: var(--ui-space-4);
260
- }
261
-
262
- @media (max-width: 720px) {
263
- .swish-split {
264
- grid-template-columns: 1fr;
265
- gap: var(--ui-space-8);
266
- }
267
- }
268
-
269
- /* --------------------------------------------------------------------------
270
- Lookbook strip
271
- -------------------------------------------------------------------------- */
272
- .swish-strip {
273
- display: grid;
274
- grid-template-columns: repeat(3, 1fr);
275
- gap: var(--ui-space-4);
276
- }
277
-
278
- .swish-strip__cell {
279
- position: relative;
280
- aspect-ratio: 4 / 5;
281
- overflow: hidden;
282
- background: var(--ui-surface-2);
283
- }
284
-
285
- .swish-strip__cell img {
286
- width: 100%;
287
- height: 100%;
288
- object-fit: cover;
289
- display: block;
290
- }
291
-
292
- .swish-strip__label {
293
- position: absolute;
294
- left: var(--ui-space-4);
295
- bottom: var(--ui-space-4);
296
- font-size: var(--ui-text-xs);
297
- letter-spacing: 0.24em;
298
- text-transform: uppercase;
299
- color: var(--swish-paper);
300
- background: var(--swish-label-bg);
301
- padding: var(--ui-space-2) var(--ui-space-3);
302
- }
303
-
304
- @media (max-width: 720px) {
305
- .swish-strip {
306
- grid-template-columns: 1fr;
307
- }
308
- }
309
-
310
- /* --------------------------------------------------------------------------
311
- Journal cards
312
- -------------------------------------------------------------------------- */
313
- .swish-journal-card {
314
- display: flex;
315
- flex-direction: column;
316
- gap: var(--ui-space-3);
317
- }
318
-
319
- .swish-journal-card__frame {
320
- aspect-ratio: 16 / 10;
321
- overflow: hidden;
322
- background: var(--ui-surface-2);
323
- }
324
-
325
- .swish-journal-card__frame img {
326
- width: 100%;
327
- height: 100%;
328
- object-fit: cover;
329
- display: block;
330
- }
331
-
332
- .swish-journal-card__category {
333
- font-size: var(--ui-text-xs);
334
- letter-spacing: 0.24em;
335
- text-transform: uppercase;
336
- color: var(--ui-accent);
337
- }
338
-
339
- .swish-journal-card__title {
340
- font-family: var(--ui-font-display);
341
- font-size: var(--ui-text-xl);
342
- font-weight: 400;
343
- line-height: 1.25;
344
- }
345
-
346
- .swish-journal-card__deck {
347
- font-size: var(--ui-text-base);
348
- color: var(--ui-muted);
349
- line-height: 1.6;
350
- }
351
-
352
- .swish-journal-card__byline {
353
- font-size: var(--ui-text-xs);
354
- letter-spacing: 0.08em;
355
- text-transform: uppercase;
356
- color: var(--ui-muted);
357
- }
358
-
359
- /* --------------------------------------------------------------------------
360
- Newsletter section
361
- -------------------------------------------------------------------------- */
362
- .swish-newsletter {
363
- text-align: center;
364
- }
365
-
366
- .swish-newsletter__title {
367
- font-family: var(--ui-font-display);
368
- font-size: clamp(2rem, 4vw, 2.75rem);
369
- font-weight: 400;
370
- letter-spacing: -0.01em;
371
- margin-bottom: var(--ui-space-4);
372
- }
373
-
374
- .swish-newsletter__deck {
375
- max-width: 32rem;
376
- margin: 0 auto var(--ui-space-8);
377
- color: var(--ui-muted);
378
- line-height: 1.6;
379
- }
380
-
381
- .swish-newsletter__form {
382
- max-width: 32rem;
383
- margin: 0 auto;
384
- display: flex;
385
- gap: var(--ui-space-3);
386
- align-items: flex-end;
387
- flex-wrap: wrap;
388
- justify-content: center;
389
- }
390
-
391
- /* Safe area padding for mobile devices (home indicator bar) */
392
- @supports (padding-bottom: env(safe-area-inset-bottom)) {
393
- footer { padding-bottom: max(var(--ui-space-6), env(safe-area-inset-bottom)); }
394
- }
@@ -1,52 +0,0 @@
1
- /* Brut theme tokens — home page only, scoped to [data-theme="light"] on <body> */
2
- [data-theme="light"] {
3
- /* Confident saturated gold — solid block fill (dark ink text sits on top) */
4
- --brut-gold: #e8b613;
5
- --brut-gold-deep: #c99700;
6
- --brut-ink: #171512;
7
- --brut-surface: #faf8f2;
8
- --brut-surface-2: #f1ede1;
9
- --brut-muted: #5c574c;
10
- --brut-dark: #171512;
11
- --brut-darker: #100f0c;
12
- --brut-surface-dot: #e6e0d2;
13
- }
14
-
15
- /* Site-wide light theme tokens — feeds docs.css's :root token names (--bg,
16
- --surface, --text, --accent, etc.) and pulse-ui.css's input tokens, so
17
- every docs page (nav, sidebar, guides, component reference, templates
18
- gallery) picks up the same warm/gold/paper palette as the home page. */
19
- [data-theme="light"] {
20
- --bg: var(--brut-surface);
21
- --surface: #ffffff;
22
- --surface-2: var(--brut-surface-2);
23
- --border: #ddd6c4;
24
- --border-subtle: #ece7d9;
25
- --text: var(--brut-ink);
26
- --muted: var(--brut-muted);
27
- --muted-2: #736b5c;
28
- --accent: #8a6300;
29
- --accent-text: var(--brut-ink);
30
- --accent-hover: #7a5700;
31
- --accent-dim: rgba(201, 151, 0, 0.12);
32
- --green: #166534;
33
- --red: #b91c1c;
34
-
35
- /* Syntax tokens — dark-on-light, tuned for contrast on --surface-2 */
36
- --tok-kw: #7c3aed;
37
- --tok-str: #166534;
38
- --tok-cmt: #5c574f;
39
- --tok-num: #9a3412;
40
- --tok-fn: #1d4ed8;
41
- --tok-prop: #854d0e;
42
- --tok-op: #0e6280;
43
- --tok-punct: #57534e;
44
-
45
- /* Sticky header background — replaces the hardcoded rgba(13,13,16,.9) */
46
- --header-bg: rgba(250, 248, 242, 0.9);
47
-
48
- /* Callout / tag accents that were hardcoded dark-theme hex in docs.css */
49
- --callout-note-icon: #1d4ed8;
50
- --tag-required-bg: rgba(185, 28, 28, 0.12);
51
- --tag-required-text: #b91c1c;
52
- }
@@ -1,50 +0,0 @@
1
- /* ─── Lumio brand theme ───────────────────────────────────────────────────────
2
- Palette tokens + light-theme overrides for the Lumio mobile-app template.
3
- Load after pulse-ui.css so these override the framework defaults. */
4
-
5
- /* Palette tokens — available in any rule */
6
- :root {
7
- --cotton-rose: #e5c1bd;
8
- --bone: #d2d0ba;
9
- --dry-sage: #b6be9c;
10
- --muted-teal: #7b9e87;
11
- --blue-slate: #5e747f;
12
- }
13
-
14
- /* Override light-theme semantic tokens */
15
- [data-theme="light"],
16
- .ui-theme-light {
17
- --ui-bg: #f7f4ed;
18
- --ui-surface: #edeae0;
19
- --ui-surface-2: #e4e1d6;
20
- --ui-border: #cbc8b8;
21
- /* Deep teal — darker than --muted-teal so it passes WCAG AA on both bg surfaces */
22
- --ui-accent: #3d6650;
23
- --ui-accent-hover: #2e5040;
24
- --ui-accent-dim: rgba(61, 102, 80, 0.14);
25
- --ui-accent-text: #ffffff;
26
- --ui-muted: #5a574e;
27
- }
28
-
29
- /* Nav: frosted glass effect */
30
- [data-theme="light"] .ui-nav {
31
- backdrop-filter: blur(14px);
32
- -webkit-backdrop-filter: blur(14px);
33
- }
34
-
35
- /* Mobile menu: dark text on light dropdown background */
36
- [data-theme="light"] .ui-nav-mobile .ui-nav-link,
37
- [data-theme="light"] .ui-nav-mobile .ui-nav-mega-item-label,
38
- [data-theme="light"] .ui-nav-mobile-section {
39
- color: var(--ui-text);
40
- }
41
-
42
- /* Pricing: show the Pro (highlighted) card first on mobile */
43
- @media (max-width: 639px) {
44
- #pricing .ui-grid > div:nth-child(2) { order: -1; }
45
- }
46
-
47
- /* Primary buttons: white text on the deep teal accent background (6.5:1) */
48
- [data-theme="light"] .ui-btn--primary {
49
- color: #fff;
50
- }
@@ -1,104 +0,0 @@
1
- /*
2
- * Observatory theme — dark astronomy palette
3
- *
4
- * Contrast notes (all checked against WCAG AA 4.5:1 for small text on --ui-bg):
5
- * --pacific-blue (#53a2be) on --prussian-blue (#0a2239) → 5.29:1 ✓
6
- * --ocean-blue (#1d84b5) on --prussian-blue (#0a2239) → 3.68:1 (large text / UI only)
7
- * Default --ui-text (#e2e2ea) on --prussian-blue (#0a2239) ✓ (very high)
8
- * --ui-muted rgba(180,215,230,0.85) on --prussian-blue (#0a2239) → ~7.4:1 ✓
9
- * --ui-muted rgba(180,215,230,0.85) on --jet-black (#132e32) → ~6.4:1 ✓
10
- */
11
-
12
- /* Palette tokens */
13
- :root {
14
- --prussian-blue: #0a2239;
15
- --pacific-blue: #53a2be;
16
- --ocean-blue: #1d84b5;
17
- --jet-black: #132e32;
18
- --baltic-blue: #176087;
19
- }
20
-
21
- /* Dark theme overrides — target :root (dark is the default pulse-ui theme) */
22
- :root {
23
- --ui-bg: var(--prussian-blue);
24
- --ui-surface: var(--jet-black);
25
- --ui-surface-2: #0d2b38;
26
- --ui-border: rgba(83, 162, 190, 0.18);
27
- --ui-accent: var(--pacific-blue);
28
- --ui-accent-hover:#6bbcd4;
29
- --ui-accent-dim: rgba(83, 162, 190, 0.12);
30
- --ui-accent-text: var(--prussian-blue);
31
- --ui-muted: rgba(180, 215, 230, 0.85);
32
- }
33
-
34
- /* Reading progress bar — CSS scroll-driven animation, no JS required */
35
- .obs-reading-progress {
36
- position: fixed;
37
- top: 0;
38
- left: 0;
39
- width: 100%;
40
- height: 3px;
41
- z-index: 10000;
42
- pointer-events: none;
43
- }
44
- .obs-reading-progress-bar {
45
- height: 100%;
46
- width: 100%;
47
- background: var(--ui-accent);
48
- transform: scaleX(0);
49
- transform-origin: left;
50
- animation: obs-reading-progress linear both;
51
- animation-timeline: scroll(root block);
52
- }
53
- @keyframes obs-reading-progress {
54
- from { transform: scaleX(0); }
55
- to { transform: scaleX(1); }
56
- }
57
-
58
- /* Article hero — restore bottom padding (ui-hero--sm removes it) */
59
- .ui-hero--sm { padding-bottom: 3rem; }
60
-
61
- /* Article layout — prose + aside side by side */
62
- .obs-article {
63
- display: grid;
64
- grid-template-columns: 1fr 260px;
65
- gap: 3rem;
66
- align-items: start;
67
- }
68
-
69
- @media (max-width: 767px) {
70
- .obs-article { grid-template-columns: 1fr; }
71
- .obs-aside-section:first-child { display: none; } /* ToC not useful below article on mobile */
72
- }
73
-
74
- /* Aside sections */
75
- .obs-aside-section {
76
- margin-bottom: 2rem;
77
- }
78
- .obs-aside-section:last-child {
79
- margin-bottom: 0;
80
- }
81
- .obs-aside-nav-link {
82
- display: block;
83
- padding: 0.375rem 0;
84
- font-size: 0.875rem;
85
- color: var(--ui-muted);
86
- text-decoration: none;
87
- border-bottom: 1px solid var(--ui-border);
88
- transition: color .15s;
89
- }
90
- .obs-aside-nav-link:hover { color: var(--ui-text); }
91
- .obs-aside-nav-link:last-child { border-bottom: none; }
92
-
93
- /* Nav — frosted glass effect */
94
- .ui-nav {
95
- backdrop-filter: blur(14px);
96
- -webkit-backdrop-filter: blur(14px);
97
- }
98
-
99
- /* Mobile nav — ensure readable text on the expanded panel */
100
- .ui-nav-mobile .ui-nav-link,
101
- .ui-nav-mobile .ui-nav-mega-item-label,
102
- .ui-nav-mobile-section {
103
- color: var(--ui-text);
104
- }