howone 0.1.29 → 0.1.31

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 (243) hide show
  1. package/package.json +1 -1
  2. package/templates/vite/.howone/skills/hallmark/SKILL.md +48 -42
  3. package/templates/vite/.howone/skills/hallmark/references/anti-patterns.md +12 -6
  4. package/templates/vite/.howone/skills/hallmark/references/assets.md +7 -0
  5. package/templates/vite/.howone/skills/hallmark/references/component-cookbook.md +19 -10
  6. package/templates/vite/.howone/skills/hallmark/references/components/f2-sticky-scroll-stack.md +1 -1
  7. package/templates/vite/.howone/skills/hallmark/references/components/ft6-letter-close.md +1 -1
  8. package/templates/vite/.howone/skills/hallmark/references/components/h7-demo-video-clipped-by-viewport-edge.md +1 -1
  9. package/templates/vite/.howone/skills/hallmark/references/components/h9-custom-illustration-centerpiece.md +1 -1
  10. package/templates/vite/.howone/skills/hallmark/references/components/n10-floating-on-scroll-morph.md +1 -1
  11. package/templates/vite/.howone/skills/hallmark/references/components/n11-mega-menu.md +40 -0
  12. package/templates/vite/.howone/skills/hallmark/references/components/n12-banner-retract.md +34 -0
  13. package/templates/vite/.howone/skills/hallmark/references/components/n13-inline-cmdk-pill.md +39 -0
  14. package/templates/vite/.howone/skills/hallmark/references/components/n1b-saas-three-section.md +35 -0
  15. package/templates/vite/.howone/skills/hallmark/references/components/n9-edge-aligned-minimal.md +1 -1
  16. package/templates/vite/.howone/skills/hallmark/references/components/s3-sticky-pinned.md +2 -2
  17. package/templates/vite/.howone/skills/hallmark/references/copy.md +8 -8
  18. package/templates/vite/.howone/skills/hallmark/references/custom-craft.md +2 -2
  19. package/templates/vite/.howone/skills/hallmark/references/custom-theme.md +50 -12
  20. package/templates/vite/.howone/skills/hallmark/references/export-formats.md +1 -1
  21. package/templates/vite/.howone/skills/hallmark/references/genres/atmospheric.md +11 -7
  22. package/templates/vite/.howone/skills/hallmark/references/genres/editorial.md +6 -4
  23. package/templates/vite/.howone/skills/hallmark/references/genres/modern-minimal.md +10 -6
  24. package/templates/vite/.howone/skills/hallmark/references/genres/playful.md +15 -10
  25. package/templates/vite/.howone/skills/hallmark/references/hero-enrichment.md +13 -12
  26. package/templates/vite/.howone/skills/hallmark/references/interaction-and-states.md +2 -1
  27. package/templates/vite/.howone/skills/hallmark/references/layout-and-space.md +4 -3
  28. package/templates/vite/.howone/skills/hallmark/references/macrostructures/04-stat-led.md +3 -1
  29. package/templates/vite/.howone/skills/hallmark/references/macrostructures/12-letter.md +1 -1
  30. package/templates/vite/.howone/skills/hallmark/references/macrostructures.md +1 -1
  31. package/templates/vite/.howone/skills/hallmark/references/microinteractions.md +1 -3
  32. package/templates/vite/.howone/skills/hallmark/references/preview-examples.md +12 -12
  33. package/templates/vite/.howone/skills/hallmark/references/responsive.md +8 -8
  34. package/templates/vite/.howone/skills/hallmark/references/slop-test.md +72 -85
  35. package/templates/vite/.howone/skills/hallmark/references/structure.md +9 -13
  36. package/templates/vite/.howone/skills/hallmark/references/study.md +40 -17
  37. package/templates/vite/.howone/skills/hallmark/references/themes/carnival.md +301 -0
  38. package/templates/vite/.howone/skills/hallmark/references/themes/cobalt.md +146 -0
  39. package/templates/vite/.howone/skills/hallmark/references/themes/hum.md +403 -0
  40. package/templates/vite/.howone/skills/hallmark/references/themes/lumen.md +478 -0
  41. package/templates/vite/.howone/skills/hallmark/references/typography.md +3 -3
  42. package/templates/vite/.howone/skills/hallmark/references/verbs/redesign.md +1 -1
  43. package/templates/vite/.howone/skills/howone/01-architect/01-app-generation.md +132 -176
  44. package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/01-schema-design.md +3 -1
  45. package/templates/vite/.howone/skills/howone/{04-ai → 03-ai-capabilities}/01-ai-capability-architecture.md +6 -5
  46. package/templates/vite/.howone/skills/howone/{04-ai/04-service-capability-catalog.md → 03-ai-capabilities/03-service-capability-catalog.md} +15 -11
  47. package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/01-client-setup.md +6 -4
  48. package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/07-ai-action-calls.md +3 -3
  49. package/templates/vite/.howone/skills/howone/{04-ai/03-ai-sdk-handoff.md → 04-app-sdk/08-ai-manifest-handoff.md} +2 -2
  50. package/templates/vite/.howone/skills/howone/SKILL.md +98 -131
  51. package/templates/vite/.howone/skills/howone/agents/openai.yaml +3 -3
  52. package/templates/vite/AGENTS.md +2 -2
  53. package/templates/vite/.howone/skills/hallmark/LICENSE +0 -21
  54. package/templates/vite/.howone/skills/hallmark/README.md +0 -147
  55. package/templates/vite/.howone/skills/hallmark/ROADMAP.md +0 -201
  56. package/templates/vite/.howone/skills/hallmark/docs/recipes.md +0 -186
  57. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-anya.jpg +0 -0
  58. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-bananastudio.jpg +0 -0
  59. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-hyperlane.jpg +0 -0
  60. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-najm.jpg +0 -0
  61. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-slow-pour.jpg +0 -0
  62. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-soroe.jpg +0 -0
  63. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-tally.jpg +0 -0
  64. package/templates/vite/.howone/skills/hallmark/docs/screenshots/hero-wayfare.jpg +0 -0
  65. package/templates/vite/.howone/skills/hallmark/docs/study-examples.md +0 -176
  66. package/templates/vite/.howone/skills/hallmark/docs/talk-slides.md +0 -364
  67. package/templates/vite/.howone/skills/hallmark/package.json +0 -36
  68. package/templates/vite/.howone/skills/hallmark/site/OG-hallmark.png +0 -0
  69. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/brief.md +0 -71
  70. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/index.html +0 -64
  71. package/templates/vite/.howone/skills/hallmark/site/_tests/01-tide-podcast/style.css +0 -240
  72. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/brief.md +0 -65
  73. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/index.html +0 -105
  74. package/templates/vite/.howone/skills/hallmark/site/_tests/02-streampipe-cli/style.css +0 -250
  75. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/brief.md +0 -64
  76. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/index.html +0 -131
  77. package/templates/vite/.howone/skills/hallmark/site/_tests/03-maple-bakery/style.css +0 -240
  78. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/brief.md +0 -67
  79. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/index.html +0 -86
  80. package/templates/vite/.howone/skills/hallmark/site/_tests/04-meridian-manifesto/style.css +0 -262
  81. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/brief.md +0 -63
  82. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/index.html +0 -167
  83. package/templates/vite/.howone/skills/hallmark/site/_tests/05-tracejam-saas/style.css +0 -457
  84. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/brief.md +0 -65
  85. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/index.html +0 -159
  86. package/templates/vite/.howone/skills/hallmark/site/_tests/06-anya-portfolio/style.css +0 -288
  87. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/brief.md +0 -64
  88. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/index.html +0 -146
  89. package/templates/vite/.howone/skills/hallmark/site/_tests/07-foundry-compliance/style.css +0 -484
  90. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/brief.md +0 -64
  91. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/index.html +0 -116
  92. package/templates/vite/.howone/skills/hallmark/site/_tests/08-cohort-courses/style.css +0 -354
  93. package/templates/vite/.howone/skills/hallmark/site/_tests/09-slow-pour/index.html +0 -638
  94. package/templates/vite/.howone/skills/hallmark/site/_tests/10-owl-hours/index.html +0 -515
  95. package/templates/vite/.howone/skills/hallmark/site/_tests/11-soroe-ceramics/index.html +0 -515
  96. package/templates/vite/.howone/skills/hallmark/site/_tests/12-loafer/index.html +0 -608
  97. package/templates/vite/.howone/skills/hallmark/site/_tests/13-alma/index.html +0 -587
  98. package/templates/vite/.howone/skills/hallmark/site/_tests/README.md +0 -157
  99. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-loop.mp4 +0 -0
  100. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/BananaStudio-still.jpg +0 -0
  101. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-example.mp4 +0 -0
  102. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Hyperlane-still.jpg +0 -0
  103. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-loop.mp4 +0 -0
  104. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Najm-still.jpg +0 -0
  105. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Podcast-loop.mp4 +0 -0
  106. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-loop.mp4 +0 -0
  107. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/SaaS-still.jpg +0 -0
  108. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-loop.mp4 +0 -0
  109. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/Soroe-still.jpg +0 -0
  110. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/after-quiet-hour.png +0 -0
  111. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-loop.mp4 +0 -0
  112. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/anya-still.jpg +0 -0
  113. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/audit-example.png +0 -0
  114. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/before-quiet-hour.png +0 -0
  115. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/example-redesign-uractivation.png +0 -0
  116. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-loop.mp4 +0 -0
  117. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/slow-pour-still.jpg +0 -0
  118. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/study-example.png +0 -0
  119. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/uractivation-after-loop.mp4 +0 -0
  120. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-loop.mp4 +0 -0
  121. package/templates/vite/.howone/skills/hallmark/site/_tests/_thumbs/wayfare-still.jpg +0 -0
  122. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/index.html +0 -77
  123. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/01-coffeebox/style.css +0 -238
  124. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/index.html +0 -110
  125. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/02-loop/style.css +0 -326
  126. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/index.html +0 -134
  127. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/03-mossroot/style.css +0 -262
  128. package/templates/vite/.howone/skills/hallmark/site/_tests/custom/README.md +0 -30
  129. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/README.md +0 -17
  130. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/audit-report.md +0 -56
  131. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/input.html +0 -160
  132. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/audit/notes.md +0 -29
  133. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/input.html +0 -63
  134. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/notes.md +0 -72
  135. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/redesign/output.html +0 -374
  136. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/diagnosis.md +0 -52
  137. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/input-description.md +0 -29
  138. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/notes.md +0 -61
  139. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.css +0 -193
  140. package/templates/vite/.howone/skills/hallmark/site/_tests/verbs/study/output.html +0 -66
  141. package/templates/vite/.howone/skills/hallmark/site/css/base.css +0 -194
  142. package/templates/vite/.howone/skills/hallmark/site/css/components.css +0 -4886
  143. package/templates/vite/.howone/skills/hallmark/site/css/sections.css +0 -2072
  144. package/templates/vite/.howone/skills/hallmark/site/css/tokens.css +0 -1129
  145. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/index.html +0 -475
  146. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/styles.css +0 -1584
  147. package/templates/vite/.howone/skills/hallmark/site/examples/bananastudio/tokens.css +0 -96
  148. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/index.html +0 -344
  149. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/script.js +0 -103
  150. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/styles.css +0 -1103
  151. package/templates/vite/.howone/skills/hallmark/site/examples/hyperlane/tokens.css +0 -83
  152. package/templates/vite/.howone/skills/hallmark/site/examples/najm/index.html +0 -368
  153. package/templates/vite/.howone/skills/hallmark/site/examples/najm/script.js +0 -133
  154. package/templates/vite/.howone/skills/hallmark/site/examples/najm/styles.css +0 -1062
  155. package/templates/vite/.howone/skills/hallmark/site/examples/najm/tokens.css +0 -97
  156. package/templates/vite/.howone/skills/hallmark/site/examples/tally/app.js +0 -84
  157. package/templates/vite/.howone/skills/hallmark/site/examples/tally/index.html +0 -446
  158. package/templates/vite/.howone/skills/hallmark/site/examples/tally/styles.css +0 -1087
  159. package/templates/vite/.howone/skills/hallmark/site/examples/tally/tokens.css +0 -101
  160. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/index.html +0 -359
  161. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/style.css +0 -1168
  162. package/templates/vite/.howone/skills/hallmark/site/examples/wayfare/tokens.css +0 -81
  163. package/templates/vite/.howone/skills/hallmark/site/favicon-dark.svg +0 -5
  164. package/templates/vite/.howone/skills/hallmark/site/favicon-light.svg +0 -5
  165. package/templates/vite/.howone/skills/hallmark/site/index.html +0 -1043
  166. package/templates/vite/.howone/skills/hallmark/site/js/main.js +0 -1175
  167. package/templates/vite/.howone/skills/hallmark/vercel.json +0 -6
  168. package/templates/vite/.howone/skills/impeccable/SKILL.md +0 -168
  169. package/templates/vite/.howone/skills/impeccable/agents/impeccable-asset-producer.md +0 -101
  170. package/templates/vite/.howone/skills/impeccable/reference/adapt.md +0 -190
  171. package/templates/vite/.howone/skills/impeccable/reference/animate.md +0 -175
  172. package/templates/vite/.howone/skills/impeccable/reference/audit.md +0 -133
  173. package/templates/vite/.howone/skills/impeccable/reference/bolder.md +0 -113
  174. package/templates/vite/.howone/skills/impeccable/reference/brand.md +0 -118
  175. package/templates/vite/.howone/skills/impeccable/reference/clarify.md +0 -174
  176. package/templates/vite/.howone/skills/impeccable/reference/codex.md +0 -105
  177. package/templates/vite/.howone/skills/impeccable/reference/cognitive-load.md +0 -106
  178. package/templates/vite/.howone/skills/impeccable/reference/color-and-contrast.md +0 -105
  179. package/templates/vite/.howone/skills/impeccable/reference/colorize.md +0 -154
  180. package/templates/vite/.howone/skills/impeccable/reference/craft.md +0 -123
  181. package/templates/vite/.howone/skills/impeccable/reference/critique.md +0 -273
  182. package/templates/vite/.howone/skills/impeccable/reference/delight.md +0 -302
  183. package/templates/vite/.howone/skills/impeccable/reference/distill.md +0 -111
  184. package/templates/vite/.howone/skills/impeccable/reference/document.md +0 -427
  185. package/templates/vite/.howone/skills/impeccable/reference/extract.md +0 -69
  186. package/templates/vite/.howone/skills/impeccable/reference/harden.md +0 -347
  187. package/templates/vite/.howone/skills/impeccable/reference/heuristics-scoring.md +0 -234
  188. package/templates/vite/.howone/skills/impeccable/reference/interaction-design.md +0 -195
  189. package/templates/vite/.howone/skills/impeccable/reference/layout.md +0 -141
  190. package/templates/vite/.howone/skills/impeccable/reference/live.md +0 -622
  191. package/templates/vite/.howone/skills/impeccable/reference/motion-design.md +0 -109
  192. package/templates/vite/.howone/skills/impeccable/reference/onboard.md +0 -234
  193. package/templates/vite/.howone/skills/impeccable/reference/optimize.md +0 -258
  194. package/templates/vite/.howone/skills/impeccable/reference/overdrive.md +0 -130
  195. package/templates/vite/.howone/skills/impeccable/reference/personas.md +0 -179
  196. package/templates/vite/.howone/skills/impeccable/reference/polish.md +0 -242
  197. package/templates/vite/.howone/skills/impeccable/reference/product.md +0 -62
  198. package/templates/vite/.howone/skills/impeccable/reference/quieter.md +0 -99
  199. package/templates/vite/.howone/skills/impeccable/reference/responsive-design.md +0 -114
  200. package/templates/vite/.howone/skills/impeccable/reference/shape.md +0 -165
  201. package/templates/vite/.howone/skills/impeccable/reference/spatial-design.md +0 -100
  202. package/templates/vite/.howone/skills/impeccable/reference/teach.md +0 -156
  203. package/templates/vite/.howone/skills/impeccable/reference/typeset.md +0 -124
  204. package/templates/vite/.howone/skills/impeccable/reference/typography.md +0 -159
  205. package/templates/vite/.howone/skills/impeccable/reference/ux-writing.md +0 -107
  206. package/templates/vite/.howone/skills/impeccable/scripts/cleanup-deprecated.mjs +0 -284
  207. package/templates/vite/.howone/skills/impeccable/scripts/command-metadata.json +0 -94
  208. package/templates/vite/.howone/skills/impeccable/scripts/critique-storage.mjs +0 -242
  209. package/templates/vite/.howone/skills/impeccable/scripts/design-parser.mjs +0 -820
  210. package/templates/vite/.howone/skills/impeccable/scripts/detect-csp.mjs +0 -198
  211. package/templates/vite/.howone/skills/impeccable/scripts/detect.mjs +0 -21
  212. package/templates/vite/.howone/skills/impeccable/scripts/impeccable-paths.mjs +0 -110
  213. package/templates/vite/.howone/skills/impeccable/scripts/is-generated.mjs +0 -69
  214. package/templates/vite/.howone/skills/impeccable/scripts/live-accept.mjs +0 -595
  215. package/templates/vite/.howone/skills/impeccable/scripts/live-browser-session.js +0 -123
  216. package/templates/vite/.howone/skills/impeccable/scripts/live-browser.js +0 -4860
  217. package/templates/vite/.howone/skills/impeccable/scripts/live-complete.mjs +0 -75
  218. package/templates/vite/.howone/skills/impeccable/scripts/live-completion.mjs +0 -18
  219. package/templates/vite/.howone/skills/impeccable/scripts/live-inject.mjs +0 -446
  220. package/templates/vite/.howone/skills/impeccable/scripts/live-poll.mjs +0 -200
  221. package/templates/vite/.howone/skills/impeccable/scripts/live-resume.mjs +0 -48
  222. package/templates/vite/.howone/skills/impeccable/scripts/live-server.mjs +0 -838
  223. package/templates/vite/.howone/skills/impeccable/scripts/live-session-store.mjs +0 -254
  224. package/templates/vite/.howone/skills/impeccable/scripts/live-status.mjs +0 -47
  225. package/templates/vite/.howone/skills/impeccable/scripts/live-wrap.mjs +0 -632
  226. package/templates/vite/.howone/skills/impeccable/scripts/live.mjs +0 -247
  227. package/templates/vite/.howone/skills/impeccable/scripts/load-context.mjs +0 -141
  228. package/templates/vite/.howone/skills/impeccable/scripts/modern-screenshot.umd.js +0 -14
  229. package/templates/vite/.howone/skills/impeccable/scripts/pin.mjs +0 -214
  230. /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/02-schema-operations.md +0 -0
  231. /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/03-data-access-patterns.md +0 -0
  232. /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/04-query-dsl-and-responses.md +0 -0
  233. /package/templates/vite/.howone/skills/howone/{02-database → 02-entity-schema}/05-ai-persistence-patterns.md +0 -0
  234. /package/templates/vite/.howone/skills/howone/{04-ai → 03-ai-capabilities}/02-workflow-contract-rules.md +0 -0
  235. /package/templates/vite/.howone/skills/howone/{04-ai/05-workflow-operations.md → 03-ai-capabilities/04-workflow-operations.md} +0 -0
  236. /package/templates/vite/.howone/skills/howone/{04-ai/06-ai-feature-playbooks.md → 03-ai-capabilities/05-ai-feature-playbooks.md} +0 -0
  237. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/02-entity-operations.md +0 -0
  238. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/03-auth.md +0 -0
  239. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/04-react-integration.md +0 -0
  240. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/05-file-upload.md +0 -0
  241. /package/templates/vite/.howone/skills/howone/{03-sdk → 04-app-sdk}/06-raw-http.md +0 -0
  242. /package/templates/vite/.howone/skills/howone/{03-sdk/08-extension-boundaries.md → 04-app-sdk/09-extension-boundaries.md} +0 -0
  243. /package/templates/vite/.howone/skills/howone/{03-sdk/09-workflow-execute-sse.md → 04-app-sdk/10-workflow-execute-sse.md} +0 -0
@@ -1,1584 +0,0 @@
1
- /* Hallmark · genre: atmospheric · macrostructure: Marquee Hero
2
- * H7 Marquee Hero knobs: title=display-italic-mix · alignment=left-bias · counterweight=animated-aperture
3
- * theme: Bloom · accent: amber-bloom ~75° (radial bloom + ember-warm)
4
- * enrichment: Tier-A pure-CSS aperture (animated) + breathing portrait silhouettes + scrolling marquee strip
5
- * tone: cinematic + bold + precise · audience: founders/recruiters/sales/jobseekers · studied: no
6
- */
7
-
8
- @import url("./tokens.css");
9
-
10
- /* ─── Reset · base ─────────────────────────────────────────────────── */
11
- *, *::before, *::after { box-sizing: border-box; }
12
- html { overflow-x: clip; scroll-behavior: smooth; }
13
- body { overflow-x: clip; }
14
- * { margin: 0; padding: 0; }
15
-
16
- html {
17
- font-size: 16px;
18
- line-height: 1.55;
19
- -webkit-text-size-adjust: 100%;
20
- -webkit-font-smoothing: antialiased;
21
- -moz-osx-font-smoothing: grayscale;
22
- text-rendering: optimizeLegibility;
23
- }
24
-
25
- body {
26
- font-family: var(--font-body);
27
- background: var(--color-paper);
28
- color: var(--color-ink);
29
- font-feature-settings: "ss01", "cv11";
30
- font-weight: 400;
31
- position: relative;
32
- isolation: isolate;
33
- }
34
-
35
- /* Page-wide ambient bloom — fixed, behind everything */
36
- body::before {
37
- content: "";
38
- position: fixed;
39
- inset: -20%;
40
- z-index: -1;
41
- pointer-events: none;
42
- background:
43
- radial-gradient(40% 30% at 80% 0%, var(--color-glow) 0%, transparent 60%),
44
- radial-gradient(45% 35% at 10% 110%, oklch(60% 0.18 30 / 0.25) 0%, transparent 60%),
45
- radial-gradient(60% 50% at 50% 50%, oklch(20% 0.025 285 / 0.6) 0%, transparent 70%);
46
- }
47
-
48
- img, svg { display: block; max-width: 100%; }
49
- a { color: inherit; text-decoration: none; }
50
- button { font: inherit; background: none; border: 0; color: inherit; cursor: pointer; }
51
-
52
- ::selection { background: var(--color-accent); color: oklch(15% 0.020 60); }
53
-
54
- /* ─── Page container ──────────────────────────────────────────────── */
55
- .shell {
56
- width: 100%;
57
- max-width: var(--page-max);
58
- margin-inline: auto;
59
- padding-inline: var(--page-gutter);
60
- }
61
- .section { padding-block: var(--space-3xl); }
62
- .section--tight { padding-block: var(--space-2xl); }
63
-
64
- /* ─── Nav — morphs from full-width bar to floating pill on scroll ─── */
65
- .nav {
66
- position: sticky;
67
- top: 0;
68
- z-index: var(--z-sticky);
69
-
70
- /* Default state: full-width bar, edge-to-edge, with backdrop blur */
71
- padding-block: 0;
72
- background: oklch(10% 0.018 285 / 0.62);
73
- border-block-end: var(--rule-hair) solid var(--color-rule);
74
- -webkit-backdrop-filter: saturate(1.4) blur(14px);
75
- backdrop-filter: saturate(1.4) blur(14px);
76
-
77
- transition:
78
- padding-block var(--dur-mid) var(--ease-out),
79
- background-color var(--dur-mid) var(--ease-out),
80
- border-block-end-color var(--dur-mid) var(--ease-out),
81
- -webkit-backdrop-filter var(--dur-mid) var(--ease-out),
82
- backdrop-filter var(--dur-mid) var(--ease-out);
83
- }
84
-
85
- /* Floating state: outer .nav goes transparent AND drops the blur — so
86
- only the pill carries the glass effect, no wide blurred strip across
87
- the viewport. Padding-block keeps total nav height at 60px (no jitter).
88
- The visible top breathing room is delivered via transform on .nav__inner
89
- (see below) — that way it doesn't push content below. */
90
- .nav.is-floating {
91
- padding-block: var(--space-2xs);
92
- background-color: transparent;
93
- border-block-end-color: transparent;
94
- -webkit-backdrop-filter: blur(0);
95
- backdrop-filter: blur(0);
96
- }
97
-
98
- .nav__inner {
99
- display: flex;
100
- align-items: center;
101
- justify-content: space-between;
102
- gap: var(--space-md);
103
- padding-block: var(--space-sm);
104
- min-height: 60px;
105
-
106
- /* Default: invisible — the bar visual lives on .nav above */
107
- background: oklch(10% 0.020 285 / 0);
108
- border: 1px solid transparent;
109
- border-radius: 0;
110
- box-shadow: 0 0 0 0 transparent, 0 0 0 0 transparent;
111
- -webkit-backdrop-filter: blur(0);
112
- backdrop-filter: blur(0);
113
- transform: translateY(0);
114
-
115
- transition:
116
- max-width var(--dur-mid) var(--ease-out),
117
- padding var(--dur-mid) var(--ease-out),
118
- min-height var(--dur-mid) var(--ease-out),
119
- border-radius var(--dur-mid) var(--ease-out),
120
- border-color var(--dur-mid) var(--ease-out),
121
- background-color var(--dur-mid) var(--ease-out),
122
- box-shadow var(--dur-mid) var(--ease-out),
123
- -webkit-backdrop-filter var(--dur-mid) var(--ease-out),
124
- backdrop-filter var(--dur-mid) var(--ease-out),
125
- transform var(--dur-mid) var(--ease-out);
126
- }
127
-
128
- .nav.is-floating .nav__inner {
129
- /* Pill — overrides .shell's max-width; .shell still provides margin-inline: auto */
130
- max-width: 58rem;
131
- min-height: 52px;
132
- padding-block: var(--space-2xs);
133
- padding-inline: var(--space-md) var(--space-2xs);
134
-
135
- border-radius: var(--radius-pill);
136
- border-color: oklch(48% 0.022 285 / 0.45);
137
- background: oklch(8% 0.020 285 / 0.82);
138
- -webkit-backdrop-filter: saturate(1.5) blur(18px);
139
- backdrop-filter: saturate(1.5) blur(18px);
140
-
141
- box-shadow:
142
- 0 18px 50px -18px oklch(0% 0 0 / 0.6),
143
- 0 4px 14px -4px oklch(0% 0 0 / 0.35),
144
- inset 0 0 0 1px oklch(98% 0.005 80 / 0.05),
145
- 0 0 36px -8px var(--color-glow-soft);
146
-
147
- /* Visible breathing room from the viewport top — pure transform,
148
- so it doesn't change layout / shift content below. The pill ends
149
- up sitting ~16px from the top edge while the page underneath
150
- scrolls cleanly past the rest of the (now-transparent) .nav. */
151
- transform: translateY(12px);
152
- }
153
- .wordmark {
154
- font-family: var(--font-display);
155
- font-size: var(--text-md);
156
- font-weight: 600;
157
- letter-spacing: -0.02em;
158
- font-style: italic;
159
- color: var(--color-ink);
160
- display: inline-flex;
161
- align-items: center;
162
- gap: 0.6ch;
163
- line-height: 1;
164
- }
165
- .wordmark::before {
166
- content: "";
167
- display: inline-block;
168
- width: 10px; height: 10px;
169
- background: var(--color-accent);
170
- border-radius: 50%;
171
- box-shadow: 0 0 16px 2px var(--color-glow);
172
- animation: pulse-soft var(--dur-breath) var(--ease-in-out) infinite;
173
- transform: translateY(-1px);
174
- }
175
- @keyframes pulse-soft {
176
- 0%, 100% { transform: translateY(-1px) scale(1); opacity: 1; }
177
- 50% { transform: translateY(-1px) scale(0.85); opacity: 0.78; }
178
- }
179
- .nav__links {
180
- display: flex;
181
- align-items: center;
182
- gap: var(--space-lg);
183
- list-style: none;
184
- }
185
- .nav__links a:not(.btn) {
186
- font-family: var(--font-body);
187
- font-size: var(--text-sm);
188
- color: var(--color-ink-2);
189
- line-height: 1;
190
- padding: var(--space-xs) var(--space-2xs);
191
- position: relative;
192
- transition: color var(--dur-short) var(--ease-out);
193
- }
194
- .nav__links > li:not(:last-child) > a::after {
195
- content: "";
196
- position: absolute;
197
- left: var(--space-2xs);
198
- right: var(--space-2xs);
199
- bottom: calc(var(--space-xs) - 2px);
200
- height: 1px;
201
- background: var(--color-accent);
202
- transform: scaleX(0);
203
- transform-origin: 0 50%;
204
- transition: transform var(--dur-short) var(--ease-out);
205
- }
206
- .nav__links a:not(.btn):hover { color: var(--color-ink); }
207
- .nav__links > li:not(:last-child) > a:hover::after { transform: scaleX(1); }
208
- .nav__links a:not(.btn):focus-visible {
209
- outline: 2px solid var(--color-focus);
210
- outline-offset: 4px;
211
- border-radius: 2px;
212
- }
213
-
214
- /* ─── Buttons ─────────────────────────────────────────────────────── */
215
- .btn {
216
- --btn-bg: var(--color-accent);
217
- --btn-fg: oklch(14% 0.020 60);
218
- display: inline-flex;
219
- align-items: center;
220
- gap: 0.6ch;
221
- min-height: 48px;
222
- padding: 0 var(--space-lg);
223
- border-radius: var(--radius-pill);
224
- background: var(--btn-bg);
225
- color: var(--btn-fg);
226
- font-family: var(--font-body);
227
- font-size: var(--text-sm);
228
- font-weight: 600;
229
- letter-spacing: -0.005em;
230
- line-height: 1;
231
- position: relative;
232
- isolation: isolate;
233
- overflow: hidden;
234
- box-shadow: 0 8px 30px -10px var(--color-glow);
235
- transition:
236
- transform var(--dur-micro) var(--ease-out),
237
- box-shadow var(--dur-short) var(--ease-out),
238
- background-color var(--dur-short) var(--ease-out);
239
- white-space: nowrap;
240
- }
241
- .btn::before {
242
- content: "";
243
- position: absolute;
244
- inset: 0;
245
- z-index: -1;
246
- background: linear-gradient(105deg,
247
- transparent 0%, transparent 35%,
248
- oklch(98% 0.04 80 / 0.55) 50%,
249
- transparent 65%, transparent 100%);
250
- transform: translateX(-100%);
251
- transition: transform 700ms var(--ease-out);
252
- }
253
- .btn:hover {
254
- transform: translateY(-2px);
255
- box-shadow: 0 14px 40px -8px var(--color-glow);
256
- background: var(--color-accent-2);
257
- }
258
- .btn:hover::before { transform: translateX(100%); }
259
- .btn:active { transform: translateY(0); transition-duration: 60ms; }
260
- .btn:focus-visible {
261
- outline: 2px solid var(--color-focus);
262
- outline-offset: 3px;
263
- }
264
- .btn:disabled, .btn[aria-disabled="true"] {
265
- opacity: 0.55;
266
- cursor: not-allowed;
267
- pointer-events: none;
268
- }
269
-
270
- .btn--ghost {
271
- --btn-bg: transparent;
272
- --btn-fg: var(--color-ink);
273
- border: var(--rule-hair) solid var(--color-rule-2);
274
- box-shadow: none;
275
- }
276
- .btn--ghost:hover {
277
- background: var(--color-paper-2);
278
- border-color: var(--color-accent);
279
- box-shadow: 0 0 0 1px var(--color-accent);
280
- }
281
- .btn--ghost::before { display: none; }
282
- .btn--sm {
283
- min-height: 40px;
284
- padding: 0 var(--space-md);
285
- font-size: var(--text-xs);
286
- letter-spacing: 0.02em;
287
- }
288
- .btn .arrow { transition: transform var(--dur-short) var(--ease-out); }
289
- .btn:hover .arrow { transform: translateX(3px); }
290
-
291
- /* ─── Hero — Marquee (huge title left, animated aperture right) ──── */
292
- .hero {
293
- position: relative;
294
- padding-block: clamp(var(--space-2xl), 8vw, var(--space-4xl)) var(--space-3xl);
295
- display: grid;
296
- grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr);
297
- gap: var(--space-2xl);
298
- align-items: center;
299
- }
300
- .hero__copy {
301
- display: grid;
302
- gap: var(--space-lg);
303
- position: relative;
304
- z-index: 2;
305
- }
306
- .hero__eyebrow {
307
- font-family: var(--font-outlier);
308
- font-size: var(--text-xs);
309
- font-weight: 500;
310
- letter-spacing: 0.16em;
311
- text-transform: uppercase;
312
- color: var(--color-accent);
313
- display: inline-flex;
314
- align-items: center;
315
- gap: 0.6ch;
316
- line-height: 1;
317
- }
318
- .hero__eyebrow::before {
319
- content: "";
320
- width: 24px;
321
- height: 1px;
322
- background: currentColor;
323
- }
324
- .hero__title {
325
- font-family: var(--font-display);
326
- font-size: clamp(2.25rem, 4.5vw + 0.75rem, 5rem);
327
- font-weight: 500;
328
- letter-spacing: -0.04em;
329
- line-height: 1.0;
330
- text-wrap: balance;
331
- color: var(--color-ink);
332
- max-width: 14ch;
333
- }
334
- .hero__title em {
335
- font-style: italic;
336
- font-weight: 300;
337
- color: var(--color-accent-2);
338
- background: linear-gradient(180deg,
339
- var(--color-accent-2) 0%,
340
- var(--color-accent) 60%,
341
- var(--color-accent-deep) 100%);
342
- -webkit-background-clip: text;
343
- background-clip: text;
344
- -webkit-text-fill-color: transparent;
345
- }
346
- .hero__lede {
347
- max-width: 46ch;
348
- font-size: var(--text-md);
349
- color: var(--color-ink-2);
350
- text-wrap: pretty;
351
- line-height: 1.55;
352
- }
353
- .hero__cta {
354
- display: flex;
355
- align-items: center;
356
- gap: var(--space-sm);
357
- margin-top: var(--space-xs);
358
- flex-wrap: wrap;
359
- }
360
- .hero__meta {
361
- font-family: var(--font-outlier);
362
- font-size: var(--text-xs);
363
- letter-spacing: 0.06em;
364
- color: var(--color-muted);
365
- display: flex;
366
- align-items: center;
367
- gap: var(--space-md);
368
- flex-wrap: wrap;
369
- padding-block-start: var(--space-md);
370
- border-block-start: var(--rule-hair) solid var(--color-rule);
371
- margin-top: var(--space-sm);
372
- }
373
- .hero__meta span { display: inline-flex; align-items: center; gap: 0.5ch; }
374
- .hero__meta .dot {
375
- width: 6px; height: 6px;
376
- border-radius: 50%;
377
- background: var(--color-accent);
378
- display: inline-block;
379
- }
380
-
381
- /* ─── Hero illustration — animated aperture + halo ────────────────── */
382
- .hero__aside {
383
- position: relative;
384
- aspect-ratio: 1;
385
- max-width: 30rem;
386
- justify-self: end;
387
- width: 100%;
388
- display: grid;
389
- place-items: center;
390
- }
391
- .aperture {
392
- position: relative;
393
- width: 78%;
394
- aspect-ratio: 1;
395
- border-radius: 50%;
396
- background:
397
- radial-gradient(circle at 50% 50%,
398
- oklch(20% 0.025 285) 0%,
399
- oklch(12% 0.022 285) 60%,
400
- oklch(10% 0.018 285) 100%);
401
- box-shadow:
402
- inset 0 0 0 1px var(--color-rule-2),
403
- inset 0 0 80px 4px oklch(8% 0.018 285),
404
- 0 0 0 1px var(--color-rule),
405
- 0 30px 80px -20px oklch(0% 0 0 / 0.7);
406
- overflow: hidden;
407
- isolation: isolate;
408
- }
409
- .aperture__halo {
410
- position: absolute;
411
- inset: -22%;
412
- border-radius: 50%;
413
- background: conic-gradient(
414
- from 0deg,
415
- transparent 0deg,
416
- var(--color-glow-soft) 30deg,
417
- transparent 90deg,
418
- var(--color-glow) 200deg,
419
- transparent 260deg,
420
- var(--color-glow-soft) 320deg,
421
- transparent 360deg);
422
- filter: blur(28px);
423
- z-index: -1;
424
- animation: spin var(--dur-aperture) linear infinite;
425
- }
426
- @keyframes spin {
427
- to { transform: rotate(360deg); }
428
- }
429
- .aperture__pupil {
430
- position: absolute;
431
- inset: 28%;
432
- border-radius: 50%;
433
- background:
434
- radial-gradient(circle at 35% 35%, oklch(98% 0.04 80 / 0.55) 0%, transparent 28%),
435
- radial-gradient(circle at 50% 50%,
436
- var(--color-accent) 0%,
437
- var(--color-accent-deep) 50%,
438
- oklch(35% 0.16 40) 90%);
439
- box-shadow:
440
- inset 0 0 30px 4px oklch(45% 0.18 40 / 0.7),
441
- 0 0 60px 6px var(--color-glow);
442
- animation: aperture-breath var(--dur-aperture) var(--ease-in-out) infinite;
443
- }
444
- @keyframes aperture-breath {
445
- 0%, 100% { inset: 28%; }
446
- 50% { inset: 36%; }
447
- }
448
- .aperture__blade {
449
- position: absolute;
450
- inset: 0;
451
- transform-origin: 50% 50%;
452
- }
453
- .aperture__blade::before {
454
- content: "";
455
- position: absolute;
456
- inset: 8% 8% 50% 8%;
457
- background:
458
- linear-gradient(180deg,
459
- oklch(28% 0.030 285) 0%,
460
- oklch(18% 0.026 285) 60%,
461
- oklch(13% 0.022 285) 100%);
462
- clip-path: polygon(0 0, 100% 0, 60% 100%, 40% 100%);
463
- border-radius: 50% 50% 0 0;
464
- box-shadow:
465
- inset 1px 1px 0 oklch(40% 0.030 285 / 0.6),
466
- inset 0 -10px 20px oklch(8% 0.020 285 / 0.5);
467
- }
468
- .aperture__blade:nth-child(1) { transform: rotate(0deg); }
469
- .aperture__blade:nth-child(2) { transform: rotate(60deg); }
470
- .aperture__blade:nth-child(3) { transform: rotate(120deg); }
471
- .aperture__blade:nth-child(4) { transform: rotate(180deg); }
472
- .aperture__blade:nth-child(5) { transform: rotate(240deg); }
473
- .aperture__blade:nth-child(6) { transform: rotate(300deg); }
474
-
475
- .aperture__ticks {
476
- position: absolute;
477
- inset: -4%;
478
- border-radius: 50%;
479
- border: 1px dashed oklch(38% 0.020 285 / 0.6);
480
- animation: spin-slow calc(var(--dur-aperture) * 4) linear infinite reverse;
481
- }
482
- @keyframes spin-slow {
483
- to { transform: rotate(360deg); }
484
- }
485
- .aperture__label {
486
- position: absolute;
487
- font-family: var(--font-outlier);
488
- font-size: 11px;
489
- letter-spacing: 0.18em;
490
- color: var(--color-muted);
491
- text-transform: uppercase;
492
- z-index: 2;
493
- }
494
- .aperture__label--top { top: -8px; left: 50%; transform: translateX(-50%); }
495
- .aperture__label--right { right: -8px; top: 50%; transform: translateY(-50%) rotate(90deg); transform-origin: 100% 50%; }
496
- .aperture__label--btm { bottom: -8px; left: 50%; transform: translateX(-50%); }
497
- .aperture__label--left { left: -8px; top: 50%; transform: translateY(-50%) rotate(-90deg); transform-origin: 0 50%; }
498
-
499
- /* ─── Hero before/after slider ────────────────────────────────────── */
500
- .hero__aside:has(.compare) {
501
- aspect-ratio: auto;
502
- max-width: 26rem;
503
- display: grid;
504
- gap: var(--space-md);
505
- align-content: center;
506
- }
507
-
508
- .compare {
509
- position: relative;
510
- width: 100%;
511
- aspect-ratio: 4 / 5;
512
- border-radius: var(--radius-lg);
513
- border: var(--rule-hair) solid var(--color-rule-2);
514
- overflow: hidden;
515
- isolation: isolate;
516
- user-select: none;
517
- -webkit-user-select: none;
518
- touch-action: none;
519
- cursor: ew-resize;
520
- background: var(--color-paper-2);
521
- box-shadow:
522
- 0 30px 70px -28px oklch(0% 0 0 / 0.7),
523
- 0 0 0 1px oklch(50% 0.18 70 / 0.18),
524
- 0 0 60px -8px var(--color-glow-soft);
525
- }
526
- .compare.is-dragging { cursor: ew-resize; }
527
- .compare.is-dragging .compare__handle {
528
- transform: translate(-50%, -50%) scale(1.12);
529
- box-shadow:
530
- 0 0 0 4px oklch(8% 0.018 285 / 0.55),
531
- 0 8px 22px oklch(0% 0 0 / 0.55),
532
- 0 0 32px var(--color-glow);
533
- }
534
- .compare__pane {
535
- position: absolute;
536
- inset: 0;
537
- margin: 0;
538
- pointer-events: none;
539
- }
540
- .compare__pane .portrait {
541
- position: absolute;
542
- inset: 0;
543
- width: 100%;
544
- height: 100%;
545
- }
546
- .compare__pane--after { z-index: 1; }
547
- .compare__pane--before {
548
- z-index: 2;
549
- clip-path: inset(0 calc(100% - var(--pos)) 0 0);
550
- }
551
-
552
- .compare__label {
553
- position: absolute;
554
- top: var(--space-md);
555
- z-index: 4;
556
- font-family: var(--font-outlier);
557
- font-size: var(--text-xs);
558
- font-weight: 500;
559
- letter-spacing: 0.16em;
560
- text-transform: uppercase;
561
- color: oklch(98% 0.005 80);
562
- line-height: 1;
563
- padding: var(--space-2xs) var(--space-sm);
564
- border-radius: var(--radius-pill);
565
- background: oklch(8% 0.018 285 / 0.55);
566
- -webkit-backdrop-filter: blur(8px);
567
- backdrop-filter: blur(8px);
568
- border: 1px solid oklch(98% 0.005 80 / 0.12);
569
- pointer-events: none;
570
- }
571
- .compare__label--before { left: var(--space-md); }
572
- .compare__label--after { right: var(--space-md); color: oklch(14% 0.020 60); background: var(--color-accent); border-color: transparent; box-shadow: 0 0 14px var(--color-glow-soft); }
573
-
574
- .compare__divider {
575
- position: absolute;
576
- top: 0;
577
- bottom: 0;
578
- left: var(--pos);
579
- width: 2px;
580
- margin-left: -1px;
581
- z-index: 3;
582
- background: linear-gradient(180deg,
583
- oklch(98% 0.005 80 / 0.0) 0%,
584
- oklch(98% 0.005 80 / 0.95) 50%,
585
- oklch(98% 0.005 80 / 0.0) 100%);
586
- box-shadow:
587
- 0 0 12px var(--color-glow),
588
- 0 0 24px var(--color-glow-soft);
589
- pointer-events: none;
590
- }
591
- .compare__handle {
592
- position: absolute;
593
- top: 50%;
594
- left: 50%;
595
- transform: translate(-50%, -50%);
596
- width: 44px;
597
- height: 44px;
598
- border-radius: 50%;
599
- background: oklch(98% 0.010 80);
600
- color: oklch(15% 0.020 60);
601
- display: grid;
602
- place-items: center;
603
- box-shadow:
604
- 0 0 0 4px oklch(8% 0.018 285 / 0.45),
605
- 0 8px 22px oklch(0% 0 0 / 0.45),
606
- 0 0 24px var(--color-glow);
607
- transition: transform var(--dur-short) var(--ease-out);
608
- pointer-events: none;
609
- }
610
- .compare:hover .compare__handle {
611
- transform: translate(-50%, -50%) scale(1.07);
612
- }
613
- /* (handle scale on focus / drag is handled below) */
614
-
615
- /* Hidden range input — Tab-reachable for keyboard a11y. Pointer
616
- events go to the .compare canvas, where the JS drag loop runs. */
617
- .compare__input {
618
- position: absolute;
619
- inset: 50% auto auto 0;
620
- width: 100%;
621
- height: 1px;
622
- margin: 0;
623
- appearance: none;
624
- -webkit-appearance: none;
625
- background: transparent;
626
- pointer-events: none;
627
- opacity: 0;
628
- z-index: 0;
629
- }
630
- .compare__input:focus-visible ~ .compare__divider {
631
- outline: 2px solid var(--color-focus);
632
- outline-offset: 2px;
633
- border-radius: 2px;
634
- }
635
- .compare__input:focus-visible ~ .compare__divider .compare__handle {
636
- transform: translate(-50%, -50%) scale(1.1);
637
- }
638
-
639
- .compare__caption {
640
- display: flex;
641
- align-items: center;
642
- justify-content: space-between;
643
- gap: var(--space-sm);
644
- font-family: var(--font-outlier);
645
- font-size: var(--text-xs);
646
- letter-spacing: 0.10em;
647
- color: var(--color-muted);
648
- line-height: 1;
649
- text-transform: uppercase;
650
- flex-wrap: wrap;
651
- }
652
- .compare__caption-meta {
653
- color: var(--color-muted-2);
654
- text-transform: none;
655
- letter-spacing: 0.04em;
656
- font-style: italic;
657
- font-family: var(--font-display);
658
- font-size: var(--text-xs);
659
- }
660
-
661
- /* Before/after portrait variants — selfie register vs. studio register */
662
- .portrait--before {
663
- --bg-1: oklch(34% 0.020 240);
664
- --bg-2: oklch(20% 0.012 250);
665
- --skin: oklch(70% 0.04 50);
666
- --shirt: oklch(38% 0.06 250);
667
- --rim: oklch(80% 0.02 240);
668
- filter: saturate(0.55) contrast(0.92) brightness(0.94);
669
- }
670
- .portrait--after {
671
- --bg-1: oklch(50% 0.14 35);
672
- --bg-2: oklch(16% 0.06 30);
673
- --skin: oklch(74% 0.08 45);
674
- --shirt: oklch(20% 0.012 60);
675
- --rim: oklch(88% 0.14 70);
676
- }
677
- /* Lock the head still inside the comparator — the breathing loop
678
- would otherwise drift the two halves out of register at the seam. */
679
- .compare .portrait::before {
680
- animation: none;
681
- transform: translateX(-50%);
682
- }
683
-
684
- /* ─── Marquee strip ───────────────────────────────────────────────── */
685
- .marquee {
686
- position: relative;
687
- border-block: var(--rule-hair) solid var(--color-rule);
688
- padding-block: var(--space-lg);
689
- background:
690
- linear-gradient(180deg,
691
- transparent 0%,
692
- oklch(8% 0.018 285 / 0.6) 100%);
693
- overflow: hidden;
694
- }
695
- .marquee::before, .marquee::after {
696
- content: "";
697
- position: absolute;
698
- top: 0; bottom: 0;
699
- width: clamp(80px, 12vw, 200px);
700
- z-index: 2;
701
- pointer-events: none;
702
- }
703
- .marquee::before {
704
- left: 0;
705
- background: linear-gradient(90deg, var(--color-paper) 10%, transparent 100%);
706
- }
707
- .marquee::after {
708
- right: 0;
709
- background: linear-gradient(270deg, var(--color-paper) 10%, transparent 100%);
710
- }
711
- .marquee__track {
712
- display: flex;
713
- align-items: center;
714
- gap: var(--space-2xl);
715
- width: max-content;
716
- animation: marquee var(--dur-marquee) linear infinite;
717
- }
718
- .marquee__track:hover { animation-play-state: paused; }
719
- @keyframes marquee {
720
- to { transform: translateX(-50%); }
721
- }
722
- .marquee__word {
723
- font-family: var(--font-display);
724
- font-style: italic;
725
- font-weight: 400;
726
- font-size: var(--text-marquee);
727
- letter-spacing: -0.04em;
728
- line-height: 1;
729
- color: var(--color-ink);
730
- white-space: nowrap;
731
- display: inline-flex;
732
- align-items: center;
733
- gap: var(--space-md);
734
- }
735
- .marquee__word::after {
736
- content: "";
737
- width: 12px; height: 12px;
738
- border-radius: 50%;
739
- background: var(--color-accent);
740
- box-shadow: 0 0 18px 2px var(--color-glow);
741
- display: inline-block;
742
- }
743
- .marquee__word--mute { color: var(--color-muted-2); }
744
- .marquee__word--mute::after {
745
- background: transparent;
746
- border: 1px solid var(--color-rule-2);
747
- box-shadow: none;
748
- }
749
-
750
- /* ─── Output gallery (six breathing portraits, wide grid) ─────────── */
751
- .gallery {
752
- display: grid;
753
- grid-template-columns: 1.1fr repeat(3, 1fr);
754
- gap: var(--space-md);
755
- }
756
- .gallery__intro {
757
- grid-column: 1 / -1;
758
- display: grid;
759
- grid-template-columns: 1fr auto;
760
- align-items: end;
761
- gap: var(--space-lg);
762
- margin-bottom: var(--space-md);
763
- border-block-end: var(--rule-hair) solid var(--color-rule);
764
- padding-block-end: var(--space-lg);
765
- }
766
- .section__head {
767
- font-family: var(--font-outlier);
768
- font-size: var(--text-xs);
769
- letter-spacing: 0.16em;
770
- color: var(--color-accent);
771
- text-transform: uppercase;
772
- line-height: 1;
773
- display: inline-flex;
774
- align-items: center;
775
- gap: 0.6ch;
776
- margin-bottom: var(--space-md);
777
- }
778
- .section__head::before {
779
- content: "";
780
- width: 24px; height: 1px;
781
- background: currentColor;
782
- }
783
- .section__title {
784
- font-family: var(--font-display);
785
- font-size: clamp(2rem, 4vw + 0.5rem, 3.5rem);
786
- font-weight: 400;
787
- letter-spacing: -0.035em;
788
- line-height: 1.02;
789
- text-wrap: balance;
790
- max-width: 22ch;
791
- color: var(--color-ink);
792
- }
793
- .section__title em {
794
- font-style: italic;
795
- font-weight: 300;
796
- color: var(--color-accent-2);
797
- }
798
- .section__sub {
799
- font-size: var(--text-sm);
800
- color: var(--color-muted);
801
- max-width: 36ch;
802
- text-align: end;
803
- line-height: 1.5;
804
- }
805
-
806
- .tile {
807
- position: relative;
808
- border: var(--rule-hair) solid var(--color-rule);
809
- border-radius: var(--radius-lg);
810
- background: var(--color-paper-2);
811
- overflow: hidden;
812
- isolation: isolate;
813
- transition:
814
- transform var(--dur-short) var(--ease-out),
815
- border-color var(--dur-short) var(--ease-out);
816
- }
817
- .tile:hover {
818
- transform: translateY(-4px);
819
- border-color: var(--color-rule-2);
820
- }
821
- .tile--feature {
822
- grid-column: span 1;
823
- grid-row: span 2;
824
- display: grid;
825
- grid-template-rows: auto 1fr auto;
826
- padding: var(--space-lg);
827
- gap: var(--space-md);
828
- background:
829
- radial-gradient(120% 80% at 0% 100%, oklch(20% 0.03 50 / 0.5), transparent 70%),
830
- var(--color-paper-2);
831
- }
832
- .tile--feature h2 {
833
- font-family: var(--font-display);
834
- font-size: var(--text-2xl);
835
- font-weight: 400;
836
- letter-spacing: -0.025em;
837
- line-height: 1.05;
838
- color: var(--color-ink);
839
- text-wrap: balance;
840
- }
841
- .tile--feature h2 em {
842
- font-style: italic;
843
- color: var(--color-accent-2);
844
- }
845
- .tile--feature p {
846
- color: var(--color-ink-2);
847
- font-size: var(--text-sm);
848
- line-height: 1.55;
849
- max-width: 32ch;
850
- }
851
- .tile--feature .meta {
852
- font-family: var(--font-outlier);
853
- font-size: var(--text-xs);
854
- letter-spacing: 0.10em;
855
- color: var(--color-muted);
856
- text-transform: uppercase;
857
- line-height: 1.4;
858
- }
859
-
860
- .tile--portrait {
861
- aspect-ratio: 1;
862
- cursor: default;
863
- }
864
- .tile--portrait .portrait { width: 100%; height: 100%; }
865
- .tile--portrait .portrait__caption {
866
- position: absolute;
867
- inset: auto var(--space-sm) var(--space-sm) var(--space-sm);
868
- display: flex;
869
- align-items: center;
870
- justify-content: space-between;
871
- font-family: var(--font-outlier);
872
- font-weight: 500;
873
- font-size: var(--text-xs);
874
- text-transform: uppercase;
875
- letter-spacing: 0.12em;
876
- color: oklch(96% 0.005 80);
877
- line-height: 1;
878
- pointer-events: none;
879
- z-index: 2;
880
- text-shadow: 0 1px 12px oklch(0% 0 0 / 0.7);
881
- }
882
- .tile--portrait .portrait__caption .num { opacity: 0.65; }
883
- .tile--portrait::after {
884
- /* gradient floor for caption legibility */
885
- content: "";
886
- position: absolute;
887
- inset: 50% 0 0 0;
888
- background: linear-gradient(180deg, transparent 0%, oklch(0% 0 0 / 0.55) 100%);
889
- pointer-events: none;
890
- z-index: 1;
891
- }
892
-
893
- /* ─── Pure-CSS portrait silhouette + breathing animation ──────────── */
894
- .portrait {
895
- --bg-1: oklch(40% 0.10 65);
896
- --bg-2: oklch(15% 0.04 280);
897
- --skin: oklch(72% 0.06 55);
898
- --shirt: oklch(22% 0.012 60);
899
- --rim: oklch(82% 0.14 70);
900
-
901
- position: relative;
902
- background:
903
- radial-gradient(120% 80% at 30% 0%, oklch(95% 0.02 80 / 0.20), transparent 60%),
904
- linear-gradient(160deg, var(--bg-1), var(--bg-2));
905
- }
906
- .portrait::before {
907
- /* head */
908
- content: "";
909
- position: absolute;
910
- left: 50%;
911
- top: 26%;
912
- width: 38%;
913
- aspect-ratio: 4 / 5;
914
- background:
915
- radial-gradient(60% 50% at 35% 35%, oklch(96% 0.04 70 / 0.45), transparent 70%),
916
- var(--skin);
917
- border-radius: 50% 50% 46% 46% / 55% 55% 45% 45%;
918
- transform: translateX(-50%);
919
- box-shadow:
920
- inset -6px -10px 22px oklch(15% 0.05 30 / 0.45),
921
- inset 4px 4px 12px oklch(96% 0.05 80 / 0.18),
922
- -2px 0 0 var(--rim);
923
- transform-origin: 50% 100%;
924
- animation: portrait-breath var(--dur-breath) var(--ease-in-out) infinite;
925
- }
926
- .portrait::after {
927
- /* shoulders */
928
- content: "";
929
- position: absolute;
930
- left: 50%;
931
- bottom: -8%;
932
- width: 130%;
933
- aspect-ratio: 3 / 1;
934
- background: var(--shirt);
935
- border-radius: 50% 50% 0 0 / 60% 60% 0 0;
936
- transform: translateX(-50%);
937
- box-shadow:
938
- inset 0 8px 0 oklch(40% 0.012 60 / 0.5),
939
- inset 0 -2px 14px oklch(10% 0 0 / 0.6);
940
- }
941
- @keyframes portrait-breath {
942
- 0%, 100% { transform: translateX(-50%) translateY(0) scale(1); }
943
- 50% { transform: translateX(-50%) translateY(-2px) scale(1.012); }
944
- }
945
-
946
- .portrait--boardroom {
947
- --bg-1: oklch(34% 0.08 250);
948
- --bg-2: oklch(14% 0.040 240);
949
- --skin: oklch(72% 0.06 50);
950
- --shirt: oklch(94% 0.005 80);
951
- --rim: oklch(78% 0.15 70);
952
- }
953
- .portrait--editorial {
954
- --bg-1: oklch(50% 0.12 35);
955
- --bg-2: oklch(18% 0.06 30);
956
- --skin: oklch(70% 0.07 45);
957
- --shirt: oklch(20% 0.010 60);
958
- --rim: oklch(86% 0.10 60);
959
- }
960
- .portrait--daylight {
961
- --bg-1: oklch(58% 0.10 80);
962
- --bg-2: oklch(28% 0.06 70);
963
- --skin: oklch(76% 0.05 60);
964
- --shirt: oklch(46% 0.10 240);
965
- --rim: oklch(96% 0.020 80);
966
- }
967
- .portrait--onset {
968
- --bg-1: oklch(28% 0.02 60);
969
- --bg-2: oklch(10% 0.005 60);
970
- --skin: oklch(64% 0.020 60);
971
- --shirt: oklch(18% 0.005 60);
972
- --rim: oklch(84% 0.03 60);
973
- filter: saturate(0.4) contrast(1.05);
974
- }
975
- .portrait--noir {
976
- --bg-1: oklch(20% 0.018 285);
977
- --bg-2: oklch(8% 0.008 285);
978
- --skin: oklch(64% 0.04 50);
979
- --shirt: oklch(94% 0.005 80);
980
- --rim: oklch(78% 0.16 70);
981
- }
982
-
983
- /* ─── Stat counter ────────────────────────────────────────────────── */
984
- .stat {
985
- padding-block: var(--space-3xl);
986
- display: grid;
987
- grid-template-columns: 1.4fr 1fr;
988
- gap: var(--space-2xl);
989
- align-items: end;
990
- border-block-end: var(--rule-hair) solid var(--color-rule);
991
- }
992
- .stat__figure {
993
- font-family: var(--font-display);
994
- font-size: var(--text-figure);
995
- font-weight: 300;
996
- font-style: italic;
997
- letter-spacing: -0.05em;
998
- line-height: 0.9;
999
- font-variant-numeric: tabular-nums;
1000
- color: var(--color-ink);
1001
- display: inline-flex;
1002
- align-items: baseline;
1003
- gap: 0.1ch;
1004
- }
1005
- .stat__figure .num {
1006
- background: linear-gradient(180deg,
1007
- var(--color-ink) 0%,
1008
- var(--color-accent-2) 70%,
1009
- var(--color-accent) 100%);
1010
- -webkit-background-clip: text;
1011
- background-clip: text;
1012
- -webkit-text-fill-color: transparent;
1013
- /* Italic + tight tracking + background-clip:text crops the rightmost
1014
- glyph in some browsers; reserve ~10% em of trailing room. */
1015
- padding-inline-end: 0.1em;
1016
- letter-spacing: -0.04em;
1017
- }
1018
- .stat__figure .plus {
1019
- font-style: normal;
1020
- font-weight: 200;
1021
- color: var(--color-accent);
1022
- font-size: 0.5em;
1023
- align-self: start;
1024
- margin-top: 0.2em;
1025
- }
1026
- .stat__copy {
1027
- display: grid;
1028
- gap: var(--space-md);
1029
- }
1030
- .stat__copy h2 {
1031
- font-family: var(--font-display);
1032
- font-size: var(--text-xl);
1033
- font-weight: 400;
1034
- font-style: italic;
1035
- letter-spacing: -0.02em;
1036
- line-height: 1.2;
1037
- color: var(--color-ink);
1038
- max-width: 28ch;
1039
- }
1040
- .stat__copy p {
1041
- font-size: var(--text-sm);
1042
- color: var(--color-muted);
1043
- max-width: 32ch;
1044
- line-height: 1.55;
1045
- }
1046
-
1047
- /* ─── Process — three large stages, workbench-style ───────────────── */
1048
- .process {
1049
- display: grid;
1050
- gap: var(--space-2xl);
1051
- }
1052
- .process__head {
1053
- display: grid;
1054
- grid-template-columns: 1fr auto;
1055
- gap: var(--space-lg);
1056
- align-items: end;
1057
- border-block-end: var(--rule-hair) solid var(--color-rule);
1058
- padding-block-end: var(--space-md);
1059
- }
1060
- .process__head h2 {
1061
- font-family: var(--font-display);
1062
- font-size: clamp(2rem, 4vw + 0.5rem, 3.5rem);
1063
- font-weight: 400;
1064
- letter-spacing: -0.035em;
1065
- line-height: 1.0;
1066
- text-wrap: balance;
1067
- max-width: 18ch;
1068
- }
1069
- .process__head h2 em {
1070
- font-style: italic;
1071
- font-weight: 300;
1072
- color: var(--color-accent-2);
1073
- }
1074
- .process__head p {
1075
- font-size: var(--text-sm);
1076
- color: var(--color-muted);
1077
- max-width: 32ch;
1078
- text-align: end;
1079
- }
1080
- .steps {
1081
- display: grid;
1082
- grid-template-columns: repeat(3, 1fr);
1083
- gap: var(--space-lg);
1084
- list-style: none;
1085
- }
1086
- .step {
1087
- position: relative;
1088
- display: grid;
1089
- gap: var(--space-md);
1090
- padding: var(--space-xl);
1091
- border: var(--rule-hair) solid var(--color-rule);
1092
- border-radius: var(--radius-lg);
1093
- background:
1094
- linear-gradient(180deg,
1095
- oklch(14% 0.020 285 / 0.6) 0%,
1096
- oklch(11% 0.018 285 / 0.6) 100%);
1097
- transition:
1098
- border-color var(--dur-short) var(--ease-out),
1099
- transform var(--dur-short) var(--ease-out);
1100
- }
1101
- .step:hover {
1102
- transform: translateY(-3px);
1103
- border-color: var(--color-rule-2);
1104
- }
1105
- .step__num {
1106
- font-family: var(--font-display);
1107
- font-size: var(--text-3xl);
1108
- font-style: italic;
1109
- font-weight: 300;
1110
- color: var(--color-accent-2);
1111
- line-height: 1;
1112
- letter-spacing: -0.05em;
1113
- font-variant-numeric: tabular-nums;
1114
- display: flex;
1115
- align-items: baseline;
1116
- gap: 0.4ch;
1117
- }
1118
- .step__num::after {
1119
- content: "";
1120
- display: inline-block;
1121
- flex: 1;
1122
- height: 1px;
1123
- background: linear-gradient(90deg, var(--color-rule-2) 0%, transparent 100%);
1124
- align-self: center;
1125
- margin-left: var(--space-sm);
1126
- }
1127
- .step__stage {
1128
- font-family: var(--font-outlier);
1129
- font-size: var(--text-xs);
1130
- letter-spacing: 0.14em;
1131
- color: var(--color-accent);
1132
- text-transform: uppercase;
1133
- line-height: 1;
1134
- }
1135
- .step h3 {
1136
- font-family: var(--font-display);
1137
- font-size: var(--text-lg);
1138
- font-weight: 500;
1139
- letter-spacing: -0.02em;
1140
- line-height: 1.15;
1141
- color: var(--color-ink);
1142
- }
1143
- .step p {
1144
- color: var(--color-ink-2);
1145
- font-size: var(--text-sm);
1146
- line-height: 1.55;
1147
- }
1148
-
1149
- /* ─── Pricing ─────────────────────────────────────────────────────── */
1150
- .pricing {
1151
- display: grid;
1152
- gap: var(--space-2xl);
1153
- }
1154
- .pricing__head {
1155
- display: grid;
1156
- gap: var(--space-md);
1157
- max-width: 38ch;
1158
- }
1159
- .pricing__head h2 {
1160
- font-family: var(--font-display);
1161
- font-size: clamp(2rem, 4vw + 0.5rem, 3.5rem);
1162
- font-weight: 400;
1163
- letter-spacing: -0.035em;
1164
- line-height: 1.0;
1165
- }
1166
- .pricing__head h2 em {
1167
- font-style: italic;
1168
- font-weight: 300;
1169
- color: var(--color-accent-2);
1170
- }
1171
- .pricing__head p {
1172
- color: var(--color-ink-2);
1173
- font-size: var(--text-md);
1174
- max-width: 40ch;
1175
- }
1176
-
1177
- .tiers {
1178
- display: grid;
1179
- grid-template-columns: repeat(3, 1fr);
1180
- gap: var(--space-md);
1181
- }
1182
- .tier {
1183
- position: relative;
1184
- border: var(--rule-hair) solid var(--color-rule);
1185
- border-radius: var(--radius-lg);
1186
- padding: var(--space-xl);
1187
- background:
1188
- linear-gradient(180deg,
1189
- oklch(14% 0.020 285 / 0.5) 0%,
1190
- oklch(10% 0.018 285 / 0.6) 100%);
1191
- display: grid;
1192
- gap: var(--space-md);
1193
- align-content: start;
1194
- transition:
1195
- transform var(--dur-short) var(--ease-out),
1196
- border-color var(--dur-short) var(--ease-out),
1197
- box-shadow var(--dur-short) var(--ease-out);
1198
- }
1199
- .tier:hover {
1200
- transform: translateY(-4px);
1201
- border-color: var(--color-rule-2);
1202
- }
1203
- .tier__name {
1204
- font-family: var(--font-outlier);
1205
- font-weight: 500;
1206
- font-size: var(--text-xs);
1207
- text-transform: uppercase;
1208
- letter-spacing: 0.16em;
1209
- color: var(--color-accent);
1210
- line-height: 1;
1211
- }
1212
- .tier__price {
1213
- font-family: var(--font-display);
1214
- font-size: var(--text-3xl);
1215
- font-style: italic;
1216
- font-weight: 400;
1217
- letter-spacing: -0.04em;
1218
- line-height: 1;
1219
- color: var(--color-ink);
1220
- font-variant-numeric: tabular-nums;
1221
- display: inline-flex;
1222
- align-items: baseline;
1223
- gap: 0.4ch;
1224
- }
1225
- .tier__price .unit {
1226
- font-family: var(--font-outlier);
1227
- font-style: normal;
1228
- font-size: var(--text-sm);
1229
- font-weight: 400;
1230
- color: var(--color-muted);
1231
- letter-spacing: 0;
1232
- line-height: 1;
1233
- }
1234
- .tier__sub {
1235
- color: var(--color-ink-2);
1236
- font-size: var(--text-sm);
1237
- line-height: 1.5;
1238
- max-width: 28ch;
1239
- }
1240
- .tier__list {
1241
- list-style: none;
1242
- display: grid;
1243
- gap: var(--space-sm);
1244
- margin-block: var(--space-md);
1245
- padding-block-start: var(--space-md);
1246
- border-block-start: var(--rule-hair) solid var(--color-rule);
1247
- }
1248
- .tier__list li {
1249
- display: grid;
1250
- grid-template-columns: 16px 1fr;
1251
- gap: var(--space-sm);
1252
- align-items: start;
1253
- font-size: var(--text-sm);
1254
- color: var(--color-ink-2);
1255
- line-height: 1.45;
1256
- }
1257
- .tier__list li::before {
1258
- content: "";
1259
- width: 12px;
1260
- height: 12px;
1261
- border-radius: 50%;
1262
- background: var(--color-accent);
1263
- box-shadow: 0 0 10px 1px var(--color-glow-soft);
1264
- margin-top: 4px;
1265
- }
1266
- .tier .btn { justify-content: center; width: 100%; }
1267
-
1268
- .tier--rec {
1269
- border-color: var(--color-accent);
1270
- background:
1271
- radial-gradient(80% 60% at 50% 0%, oklch(50% 0.18 50 / 0.18), transparent 70%),
1272
- linear-gradient(180deg,
1273
- oklch(16% 0.030 60 / 0.6) 0%,
1274
- oklch(11% 0.020 285 / 0.6) 100%);
1275
- box-shadow: 0 0 0 1px var(--color-accent), 0 24px 60px -24px var(--color-glow);
1276
- }
1277
- .tier--rec::after {
1278
- content: "Recommended";
1279
- position: absolute;
1280
- top: -12px;
1281
- left: var(--space-xl);
1282
- font-family: var(--font-outlier);
1283
- font-weight: 500;
1284
- font-size: var(--text-xs);
1285
- letter-spacing: 0.14em;
1286
- text-transform: uppercase;
1287
- color: oklch(14% 0.020 60);
1288
- background: var(--color-accent);
1289
- padding: var(--space-2xs) var(--space-sm);
1290
- border-radius: var(--radius-pill);
1291
- line-height: 1;
1292
- box-shadow: 0 0 16px 2px var(--color-glow);
1293
- }
1294
- .tier--rec.rec-pulse {
1295
- animation: rec-pulse 2400ms var(--ease-in-out) 1 forwards;
1296
- }
1297
- @keyframes rec-pulse {
1298
- 0% { box-shadow: 0 0 0 1px var(--color-accent), 0 24px 60px -24px var(--color-glow), 0 0 0 0 oklch(80% 0.18 75 / 0.0); }
1299
- 35% { box-shadow: 0 0 0 1px var(--color-accent), 0 24px 60px -24px var(--color-glow), 0 0 0 10px oklch(80% 0.18 75 / 0.18); }
1300
- 100% { box-shadow: 0 0 0 1px var(--color-accent), 0 24px 60px -24px var(--color-glow), 0 0 0 0 oklch(80% 0.18 75 / 0.0); }
1301
- }
1302
-
1303
- /* ─── FAQ ─────────────────────────────────────────────────────────── */
1304
- .faq {
1305
- display: grid;
1306
- grid-template-columns: 1fr 2fr;
1307
- gap: var(--space-2xl);
1308
- align-items: start;
1309
- }
1310
- .faq__head h2 {
1311
- font-family: var(--font-display);
1312
- font-size: clamp(2rem, 4vw + 0.5rem, 3.25rem);
1313
- font-weight: 400;
1314
- letter-spacing: -0.035em;
1315
- line-height: 1.0;
1316
- max-width: 14ch;
1317
- }
1318
- .faq__head h2 em {
1319
- font-style: italic;
1320
- font-weight: 300;
1321
- color: var(--color-accent-2);
1322
- }
1323
- .faq__head p {
1324
- margin-top: var(--space-md);
1325
- color: var(--color-ink-2);
1326
- font-size: var(--text-sm);
1327
- max-width: 32ch;
1328
- }
1329
- .faq__list { display: grid; }
1330
- .faq__item {
1331
- border-block-end: var(--rule-hair) solid var(--color-rule);
1332
- }
1333
- .faq__item:first-child { border-block-start: var(--rule-hair) solid var(--color-rule); }
1334
- .faq__summary {
1335
- list-style: none;
1336
- display: grid;
1337
- grid-template-columns: 1fr auto;
1338
- align-items: center;
1339
- gap: var(--space-md);
1340
- padding-block: var(--space-md);
1341
- cursor: pointer;
1342
- min-height: 48px;
1343
- font-family: var(--font-display);
1344
- font-size: var(--text-md);
1345
- font-weight: 500;
1346
- letter-spacing: -0.02em;
1347
- color: var(--color-ink);
1348
- line-height: 1.3;
1349
- transition: color var(--dur-short) var(--ease-out);
1350
- }
1351
- .faq__summary::-webkit-details-marker { display: none; }
1352
- .faq__summary:hover { color: var(--color-accent); }
1353
- .faq__summary:focus-visible {
1354
- outline: 2px solid var(--color-focus);
1355
- outline-offset: 4px;
1356
- border-radius: 4px;
1357
- }
1358
- .faq__sign {
1359
- position: relative;
1360
- width: 20px; height: 20px;
1361
- flex: 0 0 20px;
1362
- color: var(--color-accent);
1363
- }
1364
- .faq__sign::before, .faq__sign::after {
1365
- content: "";
1366
- position: absolute;
1367
- inset: 0;
1368
- margin: auto;
1369
- background: currentColor;
1370
- }
1371
- .faq__sign::before { width: 14px; height: 1.5px; }
1372
- .faq__sign::after { width: 1.5px; height: 14px; transition: transform var(--dur-short) var(--ease-out); }
1373
- details[open] .faq__sign::after { transform: rotate(90deg); }
1374
-
1375
- .faq__answer-wrap {
1376
- display: grid;
1377
- grid-template-rows: 0fr;
1378
- transition: grid-template-rows var(--dur-long) var(--ease-in-out);
1379
- }
1380
- details[open] .faq__answer-wrap { grid-template-rows: 1fr; }
1381
- .faq__answer-inner { overflow: hidden; }
1382
- .faq__answer {
1383
- padding-block: 0 var(--space-md);
1384
- color: var(--color-ink-2);
1385
- font-size: var(--text-sm);
1386
- max-width: 60ch;
1387
- line-height: 1.6;
1388
- }
1389
-
1390
- /* ─── Final CTA — full-bleed dramatic ─────────────────────────────── */
1391
- .final {
1392
- position: relative;
1393
- margin-block: var(--space-3xl) var(--space-2xl);
1394
- border-radius: var(--radius-xl);
1395
- border: var(--rule-hair) solid var(--color-rule-2);
1396
- padding: clamp(var(--space-2xl), 8vw, var(--space-4xl)) clamp(var(--space-lg), 6vw, var(--space-3xl));
1397
- background:
1398
- radial-gradient(60% 80% at 80% 50%, oklch(30% 0.14 50 / 0.4) 0%, transparent 70%),
1399
- radial-gradient(60% 100% at 0% 100%, oklch(20% 0.10 60 / 0.5) 0%, transparent 70%),
1400
- linear-gradient(180deg, oklch(15% 0.030 60 / 0.6) 0%, oklch(11% 0.020 285 / 0.6) 100%);
1401
- display: grid;
1402
- grid-template-columns: 1fr auto;
1403
- gap: var(--space-xl);
1404
- align-items: center;
1405
- overflow: hidden;
1406
- isolation: isolate;
1407
- }
1408
- .final::before {
1409
- /* slow drifting halo */
1410
- content: "";
1411
- position: absolute;
1412
- inset: -30%;
1413
- background: radial-gradient(35% 25% at 30% 40%, var(--color-glow) 0%, transparent 70%);
1414
- z-index: -1;
1415
- animation: drift 22s var(--ease-in-out) infinite alternate;
1416
- }
1417
- @keyframes drift {
1418
- to { transform: translate(40%, 20%); }
1419
- }
1420
- .final h2 {
1421
- font-family: var(--font-display);
1422
- font-size: clamp(2rem, 5vw + 0.5rem, 4rem);
1423
- font-weight: 400;
1424
- letter-spacing: -0.04em;
1425
- line-height: 0.98;
1426
- max-width: 22ch;
1427
- text-wrap: balance;
1428
- }
1429
- .final h2 em {
1430
- font-style: italic;
1431
- font-weight: 300;
1432
- color: var(--color-accent-2);
1433
- }
1434
- .final__sub {
1435
- margin-top: var(--space-md);
1436
- color: var(--color-ink-2);
1437
- font-size: var(--text-md);
1438
- max-width: 38ch;
1439
- line-height: 1.55;
1440
- }
1441
- .final__cta {
1442
- display: flex;
1443
- align-items: center;
1444
- gap: var(--space-sm);
1445
- flex-wrap: wrap;
1446
- }
1447
-
1448
- /* ─── Footer ──────────────────────────────────────────────────────── */
1449
- .foot {
1450
- padding-block: var(--space-2xl);
1451
- display: grid;
1452
- gap: var(--space-md);
1453
- border-block-start: var(--rule-hair) solid var(--color-rule);
1454
- }
1455
- .foot__row {
1456
- display: flex;
1457
- align-items: center;
1458
- justify-content: space-between;
1459
- gap: var(--space-md);
1460
- flex-wrap: wrap;
1461
- }
1462
- .foot__tagline {
1463
- color: var(--color-muted);
1464
- font-size: var(--text-sm);
1465
- max-width: 38ch;
1466
- line-height: 1.5;
1467
- }
1468
- .foot__links {
1469
- display: flex;
1470
- align-items: center;
1471
- gap: var(--space-md);
1472
- list-style: none;
1473
- flex-wrap: wrap;
1474
- }
1475
- .foot__links a {
1476
- color: var(--color-ink-2);
1477
- font-size: var(--text-sm);
1478
- line-height: 1;
1479
- transition: color var(--dur-short) var(--ease-out);
1480
- }
1481
- .foot__links a:hover { color: var(--color-accent); }
1482
- .foot__links a:focus-visible {
1483
- outline: 2px solid var(--color-focus);
1484
- outline-offset: 4px;
1485
- border-radius: 2px;
1486
- }
1487
- .foot__credit {
1488
- font-family: var(--font-outlier);
1489
- font-size: var(--text-xs);
1490
- color: var(--color-muted);
1491
- letter-spacing: 0.04em;
1492
- border-block-start: var(--rule-hair) solid var(--color-rule);
1493
- padding-block-start: var(--space-md);
1494
- display: flex;
1495
- align-items: center;
1496
- justify-content: space-between;
1497
- gap: var(--space-md);
1498
- flex-wrap: wrap;
1499
- line-height: 1.5;
1500
- }
1501
-
1502
- /* ─── Reveal (one-shot, IntersectionObserver-driven) ──────────────── */
1503
- .reveal {
1504
- opacity: 0;
1505
- transform: translateY(14px);
1506
- transition:
1507
- opacity var(--dur-long) var(--ease-out),
1508
- transform var(--dur-long) var(--ease-out);
1509
- transition-delay: calc(var(--i, 0) * 80ms);
1510
- }
1511
- .reveal.is-in {
1512
- opacity: 1;
1513
- transform: none;
1514
- }
1515
-
1516
- /* ─── Responsive ──────────────────────────────────────────────────── */
1517
- @media (max-width: 64rem) {
1518
- .hero {
1519
- grid-template-columns: 1fr;
1520
- gap: var(--space-xl);
1521
- }
1522
- .hero__aside {
1523
- justify-self: center;
1524
- max-width: 22rem;
1525
- }
1526
- .gallery {
1527
- grid-template-columns: repeat(3, 1fr);
1528
- }
1529
- .gallery .tile--feature {
1530
- grid-column: 1 / -1;
1531
- grid-row: auto;
1532
- }
1533
- .stat {
1534
- grid-template-columns: 1fr;
1535
- gap: var(--space-lg);
1536
- }
1537
- .steps { grid-template-columns: 1fr; gap: var(--space-md); }
1538
- .tiers { grid-template-columns: 1fr; }
1539
- .faq { grid-template-columns: 1fr; }
1540
- .final { grid-template-columns: 1fr; }
1541
- .gallery__intro,
1542
- .process__head { grid-template-columns: 1fr; }
1543
- .gallery__intro .section__sub,
1544
- .process__head p { text-align: start; }
1545
- }
1546
- @media (max-width: 40rem) {
1547
- .section { padding-block: var(--space-2xl); }
1548
- .nav__links { gap: var(--space-md); }
1549
- .nav__links li:nth-child(1),
1550
- .nav__links li:nth-child(2) { display: none; }
1551
- .hero__cta { flex-direction: column; align-items: stretch; width: 100%; }
1552
- .hero__cta .btn { justify-content: center; }
1553
- .gallery { grid-template-columns: repeat(2, 1fr); }
1554
- .gallery .tile--feature { grid-column: 1 / -1; }
1555
- .marquee__track { gap: var(--space-xl); }
1556
- }
1557
-
1558
- @media (pointer: coarse) {
1559
- .btn { min-height: 52px; }
1560
- .nav__links a { padding: var(--space-sm) var(--space-2xs); }
1561
- }
1562
-
1563
- /* ─── Reduced motion ──────────────────────────────────────────────── */
1564
- @media (prefers-reduced-motion: reduce) {
1565
- *, *::before, *::after {
1566
- animation-duration: 1ms !important;
1567
- animation-iteration-count: 1 !important;
1568
- transition-duration: 1ms !important;
1569
- scroll-behavior: auto !important;
1570
- }
1571
- .reveal { opacity: 1; transform: none; }
1572
- .marquee__track { animation: none; transform: none; }
1573
- .aperture__halo, .aperture__pupil, .aperture__ticks,
1574
- .portrait::before, .wordmark::before, .final::before { animation: none !important; }
1575
- .btn:hover, .tier:hover, .step:hover, .tile:hover { transform: none; }
1576
- }
1577
-
1578
- /* ─── Visually-hidden (a11y) ──────────────────────────────────────── */
1579
- .sr-only {
1580
- position: absolute;
1581
- width: 1px; height: 1px;
1582
- padding: 0; margin: -1px; overflow: hidden;
1583
- clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
1584
- }