@stylecrib/cli 0.0.0-stage → 0.3.2

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 (348) hide show
  1. package/README.md +163 -2
  2. package/agents/MANIFEST.yml +136 -0
  3. package/agents/README.md +75 -0
  4. package/agents/art-director.md +168 -0
  5. package/agents/audacity-director.md +109 -0
  6. package/agents/brand-identity.md +179 -0
  7. package/agents/brand-precedent.md +119 -0
  8. package/agents/brief-enforcer.md +136 -0
  9. package/agents/component-qa.md +167 -0
  10. package/agents/cto.md +49 -0
  11. package/agents/design-director.md +184 -0
  12. package/agents/design-systems-engineer.md +162 -0
  13. package/agents/direction-curator.md +133 -0
  14. package/agents/homogeneity-detector.md +104 -0
  15. package/agents/logo-designer.md +240 -0
  16. package/agents/marketing-designer.md +156 -0
  17. package/agents/media-curator.md +165 -0
  18. package/agents/motion-engineer.md +270 -0
  19. package/agents/qa-conductor.md +143 -0
  20. package/agents/render-qa.md +133 -0
  21. package/agents/upgrade-simulator.md +123 -0
  22. package/agents/vp-architecture.md +49 -0
  23. package/agents/vp-engineering.md +49 -0
  24. package/dist/index.js +7182 -0
  25. package/package.json +69 -4
  26. package/themes/README.md +70 -0
  27. package/themes/acrylic-soft/THEME.md +142 -0
  28. package/themes/acrylic-soft/tokens.ts +180 -0
  29. package/themes/agency-creative/THEME.md +91 -0
  30. package/themes/agency-creative/tokens.ts +202 -0
  31. package/themes/agency-portfolio/THEME.md +109 -0
  32. package/themes/agency-portfolio/tokens.ts +159 -0
  33. package/themes/ai-startup/THEME.md +95 -0
  34. package/themes/ai-startup/tokens.ts +162 -0
  35. package/themes/airline-modern/THEME.md +104 -0
  36. package/themes/airline-modern/tokens.ts +179 -0
  37. package/themes/arc-stack/.anchor-render.png +0 -0
  38. package/themes/arc-stack/THEME.md +125 -0
  39. package/themes/arc-stack/audit.log.jsonl +6 -0
  40. package/themes/arc-stack/dismissals.jsonl +3 -0
  41. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  42. package/themes/arc-stack/theme.yml +153 -0
  43. package/themes/arc-stack/tokens.ts +29 -0
  44. package/themes/architectural/THEME.md +102 -0
  45. package/themes/architectural/tokens.ts +159 -0
  46. package/themes/atelier-radiance/THEME.md +93 -0
  47. package/themes/atelier-radiance/audit.log.jsonl +1 -0
  48. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  49. package/themes/atelier-radiance/theme.yml +130 -0
  50. package/themes/atelier-radiance/tokens.ts +29 -0
  51. package/themes/automotive-ev/THEME.md +87 -0
  52. package/themes/automotive-ev/tokens.ts +183 -0
  53. package/themes/automotive-luxury/THEME.md +88 -0
  54. package/themes/automotive-luxury/tokens.ts +175 -0
  55. package/themes/baby-modern/THEME.md +79 -0
  56. package/themes/baby-modern/tokens.ts +184 -0
  57. package/themes/banking-gravity/THEME.md +171 -0
  58. package/themes/banking-gravity/tokens.ts +169 -0
  59. package/themes/beauty-clean/THEME.md +92 -0
  60. package/themes/beauty-clean/tokens.ts +176 -0
  61. package/themes/beauty-luxury/THEME.md +96 -0
  62. package/themes/beauty-luxury/tokens.ts +178 -0
  63. package/themes/bento-modular/.anchor-render.png +0 -0
  64. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  65. package/themes/bento-modular/THEME.md +80 -0
  66. package/themes/bento-modular/audit.log.jsonl +3 -0
  67. package/themes/bento-modular/dismissals.jsonl +1 -0
  68. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  69. package/themes/bento-modular/theme.yml +83 -0
  70. package/themes/bento-modular/tokens.ts +27 -0
  71. package/themes/bookstore-indie/THEME.md +78 -0
  72. package/themes/bookstore-indie/tokens.ts +147 -0
  73. package/themes/brutalist/THEME.md +96 -0
  74. package/themes/brutalist/tokens.ts +151 -0
  75. package/themes/business-tiles/THEME.md +141 -0
  76. package/themes/business-tiles/tokens.ts +178 -0
  77. package/themes/cabana-poster/THEME.md +158 -0
  78. package/themes/cabana-poster/audit.log.jsonl +1 -0
  79. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  80. package/themes/cabana-poster/theme.yml +221 -0
  81. package/themes/cabana-poster/tokens.ts +34 -0
  82. package/themes/case-panel/THEME.md +126 -0
  83. package/themes/case-panel/audit.log.jsonl +2 -0
  84. package/themes/case-panel/tailwind.snippet.ts +15 -0
  85. package/themes/case-panel/theme.yml +153 -0
  86. package/themes/case-panel/tokens.ts +28 -0
  87. package/themes/cinematic-dark/THEME.md +97 -0
  88. package/themes/cinematic-dark/tokens.ts +195 -0
  89. package/themes/classic-car/THEME.md +86 -0
  90. package/themes/classic-car/tokens.ts +173 -0
  91. package/themes/cloud-friendly/THEME.md +152 -0
  92. package/themes/cloud-friendly/tokens.ts +181 -0
  93. package/themes/community-niche/THEME.md +102 -0
  94. package/themes/community-niche/tokens.ts +177 -0
  95. package/themes/corporate-grid/THEME.md +154 -0
  96. package/themes/corporate-grid/tokens.ts +182 -0
  97. package/themes/couture-luxury/THEME.md +85 -0
  98. package/themes/couture-luxury/tokens.ts +146 -0
  99. package/themes/creator-social/THEME.md +131 -0
  100. package/themes/creator-social/tokens.ts +249 -0
  101. package/themes/crypto-onchain/THEME.md +100 -0
  102. package/themes/crypto-onchain/tokens.ts +207 -0
  103. package/themes/cycling-brand/THEME.md +78 -0
  104. package/themes/cycling-brand/tokens.ts +185 -0
  105. package/themes/dating-friendly/THEME.md +102 -0
  106. package/themes/dating-friendly/tokens.ts +178 -0
  107. package/themes/dense-utility/THEME.md +85 -0
  108. package/themes/dense-utility/tokens.ts +155 -0
  109. package/themes/devtool-cli/THEME.md +100 -0
  110. package/themes/devtool-cli/tokens.ts +195 -0
  111. package/themes/devtool-docs/THEME.md +105 -0
  112. package/themes/devtool-docs/tokens.ts +177 -0
  113. package/themes/editorial/THEME.md +129 -0
  114. package/themes/editorial/audit.log.jsonl +2 -0
  115. package/themes/editorial/tailwind.snippet.ts +15 -0
  116. package/themes/editorial/theme.yml +173 -0
  117. package/themes/editorial/tokens.ts +29 -0
  118. package/themes/education-formal/THEME.md +154 -0
  119. package/themes/education-formal/audit.log.jsonl +1 -0
  120. package/themes/education-formal/tailwind.snippet.ts +15 -0
  121. package/themes/education-formal/theme.yml +186 -0
  122. package/themes/education-formal/tokens.ts +29 -0
  123. package/themes/education-warm/THEME.md +91 -0
  124. package/themes/education-warm/tokens.ts +185 -0
  125. package/themes/ember-poster/README.md +79 -0
  126. package/themes/ember-poster/THEME.md +101 -0
  127. package/themes/ember-poster/audit.log.jsonl +17 -0
  128. package/themes/ember-poster/package.json +34 -0
  129. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  130. package/themes/ember-poster/theme.yml +109 -0
  131. package/themes/ember-poster/tokens.ts +27 -0
  132. package/themes/enterprise-cloud/THEME.md +139 -0
  133. package/themes/enterprise-cloud/tokens.ts +179 -0
  134. package/themes/enterprise-tech/.anchor-render.png +0 -0
  135. package/themes/enterprise-tech/THEME.md +167 -0
  136. package/themes/enterprise-tech/audit.log.jsonl +1 -0
  137. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  138. package/themes/enterprise-tech/theme.yml +202 -0
  139. package/themes/enterprise-tech/tokens.ts +29 -0
  140. package/themes/ev-charging/THEME.md +94 -0
  141. package/themes/ev-charging/tokens.ts +185 -0
  142. package/themes/farm-direct/THEME.md +92 -0
  143. package/themes/farm-direct/tokens.ts +180 -0
  144. package/themes/fintech-card/THEME.md +96 -0
  145. package/themes/fintech-card/tokens.ts +191 -0
  146. package/themes/fintech-trust/THEME.md +94 -0
  147. package/themes/fintech-trust/tokens.ts +192 -0
  148. package/themes/food-blog/THEME.md +98 -0
  149. package/themes/food-blog/tokens.ts +183 -0
  150. package/themes/forum-classic/THEME.md +100 -0
  151. package/themes/forum-classic/tokens.ts +168 -0
  152. package/themes/fresh-plate/.anchor-render.png +0 -0
  153. package/themes/fresh-plate/THEME.md +144 -0
  154. package/themes/fresh-plate/audit.log.jsonl +2 -0
  155. package/themes/fresh-plate/dismissals.jsonl +3 -0
  156. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  157. package/themes/fresh-plate/theme.yml +189 -0
  158. package/themes/fresh-plate/tokens.ts +30 -0
  159. package/themes/furniture-modern/THEME.md +94 -0
  160. package/themes/furniture-modern/tokens.ts +176 -0
  161. package/themes/gaming-esports/THEME.md +146 -0
  162. package/themes/gaming-esports/tokens.ts +199 -0
  163. package/themes/gaming-streamer/THEME.md +139 -0
  164. package/themes/gaming-streamer/tokens.ts +201 -0
  165. package/themes/glassmorphic-modern/THEME.md +119 -0
  166. package/themes/glassmorphic-modern/tokens.ts +174 -0
  167. package/themes/government-civic/THEME.md +138 -0
  168. package/themes/government-civic/tokens.ts +164 -0
  169. package/themes/gym-chain/THEME.md +79 -0
  170. package/themes/gym-chain/tokens.ts +196 -0
  171. package/themes/healthcare-bright/THEME.md +95 -0
  172. package/themes/healthcare-bright/tokens.ts +184 -0
  173. package/themes/home-decor/THEME.md +94 -0
  174. package/themes/home-decor/tokens.ts +177 -0
  175. package/themes/hotel-boutique/THEME.md +110 -0
  176. package/themes/hotel-boutique/tokens.ts +179 -0
  177. package/themes/hyperminimal-mono/THEME.md +91 -0
  178. package/themes/hyperminimal-mono/tokens.ts +150 -0
  179. package/themes/indie-art-game/THEME.md +107 -0
  180. package/themes/indie-art-game/tokens.ts +216 -0
  181. package/themes/insurance-legacy/THEME.md +101 -0
  182. package/themes/insurance-legacy/tokens.ts +182 -0
  183. package/themes/insurance-modern/THEME.md +103 -0
  184. package/themes/insurance-modern/tokens.ts +192 -0
  185. package/themes/kaiju-reveal/THEME.md +97 -0
  186. package/themes/kaiju-reveal/tokens.ts +185 -0
  187. package/themes/kinetic-data/THEME.md +172 -0
  188. package/themes/kinetic-data/audit.log.jsonl +1 -0
  189. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  190. package/themes/kinetic-data/theme.yml +207 -0
  191. package/themes/kinetic-data/tokens.ts +30 -0
  192. package/themes/kinetic-headline/.anchor-render.png +0 -0
  193. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  194. package/themes/kinetic-headline/THEME.md +78 -0
  195. package/themes/kinetic-headline/audit.log.jsonl +4 -0
  196. package/themes/kinetic-headline/dismissals.jsonl +1 -0
  197. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  198. package/themes/kinetic-headline/theme.yml +81 -0
  199. package/themes/kinetic-headline/tokens.ts +26 -0
  200. package/themes/law-firm/THEME.md +108 -0
  201. package/themes/law-firm/tokens.ts +158 -0
  202. package/themes/lawtech-modern/THEME.md +107 -0
  203. package/themes/lawtech-modern/tokens.ts +192 -0
  204. package/themes/linkedin-pro/THEME.md +102 -0
  205. package/themes/linkedin-pro/tokens.ts +174 -0
  206. package/themes/logistics-modern/THEME.md +94 -0
  207. package/themes/logistics-modern/tokens.ts +187 -0
  208. package/themes/magazine-glossy/THEME.md +74 -0
  209. package/themes/magazine-glossy/tokens.ts +158 -0
  210. package/themes/marker-mag/THEME.md +128 -0
  211. package/themes/marker-mag/audit.log.jsonl +1 -0
  212. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  213. package/themes/marker-mag/theme.yml +159 -0
  214. package/themes/marker-mag/tokens.ts +27 -0
  215. package/themes/marketplace-modern/THEME.md +135 -0
  216. package/themes/marketplace-modern/tokens.ts +186 -0
  217. package/themes/marketplace-vintage/THEME.md +110 -0
  218. package/themes/marketplace-vintage/tokens.ts +185 -0
  219. package/themes/maximalist/THEME.md +96 -0
  220. package/themes/maximalist/tokens.ts +168 -0
  221. package/themes/mid-century/THEME.md +109 -0
  222. package/themes/mid-century/tokens.ts +162 -0
  223. package/themes/motorcycle-brand/THEME.md +86 -0
  224. package/themes/motorcycle-brand/tokens.ts +174 -0
  225. package/themes/museum/THEME.md +83 -0
  226. package/themes/museum/tokens.ts +147 -0
  227. package/themes/music-streaming/THEME.md +101 -0
  228. package/themes/music-streaming/tokens.ts +187 -0
  229. package/themes/music-vinyl/THEME.md +98 -0
  230. package/themes/music-vinyl/tokens.ts +167 -0
  231. package/themes/nature-distilled/.anchor-render.png +0 -0
  232. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  233. package/themes/nature-distilled/THEME.md +81 -0
  234. package/themes/nature-distilled/audit.log.jsonl +2 -0
  235. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  236. package/themes/nature-distilled/theme.yml +91 -0
  237. package/themes/nature-distilled/tokens.ts +26 -0
  238. package/themes/news-tabloid/THEME.md +72 -0
  239. package/themes/news-tabloid/tokens.ts +158 -0
  240. package/themes/news-tech/THEME.md +75 -0
  241. package/themes/news-tech/tokens.ts +149 -0
  242. package/themes/newsletter/THEME.md +82 -0
  243. package/themes/newsletter/tokens.ts +138 -0
  244. package/themes/newspaper-classic/THEME.md +74 -0
  245. package/themes/newspaper-classic/tokens.ts +159 -0
  246. package/themes/nonprofit-arts/THEME.md +78 -0
  247. package/themes/nonprofit-arts/tokens.ts +157 -0
  248. package/themes/nonprofit-warm/THEME.md +105 -0
  249. package/themes/nonprofit-warm/tokens.ts +188 -0
  250. package/themes/outdoor-adventure/THEME.md +113 -0
  251. package/themes/outdoor-adventure/tokens.ts +181 -0
  252. package/themes/overland-broadside/THEME.md +119 -0
  253. package/themes/overland-broadside/audit.log.jsonl +1 -0
  254. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  255. package/themes/overland-broadside/theme.yml +138 -0
  256. package/themes/overland-broadside/tokens.ts +27 -0
  257. package/themes/performance-engineered/THEME.md +162 -0
  258. package/themes/performance-engineered/audit.log.jsonl +1 -0
  259. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  260. package/themes/performance-engineered/theme.yml +193 -0
  261. package/themes/performance-engineered/tokens.ts +29 -0
  262. package/themes/pet-food/THEME.md +78 -0
  263. package/themes/pet-food/tokens.ts +185 -0
  264. package/themes/pharma-clinical/THEME.md +164 -0
  265. package/themes/pharma-clinical/audit.log.jsonl +1 -0
  266. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  267. package/themes/pharma-clinical/theme.yml +201 -0
  268. package/themes/pharma-clinical/tokens.ts +29 -0
  269. package/themes/pill-editorial/THEME.md +125 -0
  270. package/themes/pill-editorial/audit.log.jsonl +1 -0
  271. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  272. package/themes/pill-editorial/theme.yml +168 -0
  273. package/themes/pill-editorial/tokens.ts +31 -0
  274. package/themes/podcast-warm/THEME.md +103 -0
  275. package/themes/podcast-warm/tokens.ts +192 -0
  276. package/themes/publisher-indie/THEME.md +78 -0
  277. package/themes/publisher-indie/tokens.ts +148 -0
  278. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  279. package/themes/raw-concrete/THEME.md +76 -0
  280. package/themes/raw-concrete/audit.log.jsonl +10 -0
  281. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  282. package/themes/raw-concrete/theme.yml +88 -0
  283. package/themes/raw-concrete/tokens.ts +27 -0
  284. package/themes/realestate-luxury/THEME.md +94 -0
  285. package/themes/realestate-luxury/tokens.ts +169 -0
  286. package/themes/realestate-marketplace/THEME.md +106 -0
  287. package/themes/realestate-marketplace/tokens.ts +183 -0
  288. package/themes/restaurant-modern/THEME.md +109 -0
  289. package/themes/restaurant-modern/tokens.ts +172 -0
  290. package/themes/runway-fashion/THEME.md +99 -0
  291. package/themes/runway-fashion/tokens.ts +167 -0
  292. package/themes/saturday-morning/THEME.md +117 -0
  293. package/themes/saturday-morning/tokens.ts +281 -0
  294. package/themes/schema.ts +235 -0
  295. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  296. package/themes/signal-dark/THEME.md +107 -0
  297. package/themes/signal-dark/tokens.ts +181 -0
  298. package/themes/soft-modern/THEME.md +91 -0
  299. package/themes/soft-modern/tokens.ts +166 -0
  300. package/themes/solar-residential/THEME.md +92 -0
  301. package/themes/solar-residential/tokens.ts +176 -0
  302. package/themes/sports-league/THEME.md +180 -0
  303. package/themes/sports-league/audit.log.jsonl +1 -0
  304. package/themes/sports-league/tailwind.snippet.ts +15 -0
  305. package/themes/sports-league/theme.yml +213 -0
  306. package/themes/sports-league/tokens.ts +32 -0
  307. package/themes/stadium-sport/THEME.md +114 -0
  308. package/themes/stadium-sport/tokens.ts +187 -0
  309. package/themes/streetwear-hype/THEME.md +100 -0
  310. package/themes/streetwear-hype/tokens.ts +174 -0
  311. package/themes/studio-architect/THEME.md +108 -0
  312. package/themes/studio-architect/tokens.ts +162 -0
  313. package/themes/studio-photographer/THEME.md +88 -0
  314. package/themes/studio-photographer/tokens.ts +164 -0
  315. package/themes/team-kanban/.anchor-render.png +0 -0
  316. package/themes/team-kanban/THEME.md +167 -0
  317. package/themes/team-kanban/audit.log.jsonl +2 -0
  318. package/themes/team-kanban/dismissals.jsonl +1 -0
  319. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  320. package/themes/team-kanban/theme.yml +209 -0
  321. package/themes/team-kanban/tokens.ts +35 -0
  322. package/themes/telehealth-modern/THEME.md +95 -0
  323. package/themes/telehealth-modern/tokens.ts +197 -0
  324. package/themes/tourism-board/THEME.md +111 -0
  325. package/themes/tourism-board/tokens.ts +173 -0
  326. package/themes/toys-modern/THEME.md +79 -0
  327. package/themes/toys-modern/tokens.ts +200 -0
  328. package/themes/travel-luxury/THEME.md +95 -0
  329. package/themes/travel-luxury/tokens.ts +162 -0
  330. package/themes/vacation-rental/THEME.md +105 -0
  331. package/themes/vacation-rental/tokens.ts +174 -0
  332. package/themes/vault-reel/THEME.md +134 -0
  333. package/themes/vault-reel/audit.log.jsonl +3 -0
  334. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  335. package/themes/vault-reel/theme.yml +167 -0
  336. package/themes/vault-reel/tokens.ts +30 -0
  337. package/themes/vet-modern/THEME.md +79 -0
  338. package/themes/vet-modern/tokens.ts +194 -0
  339. package/themes/web3-restraint/THEME.md +87 -0
  340. package/themes/web3-restraint/tokens.ts +154 -0
  341. package/themes/wellness-active/THEME.md +102 -0
  342. package/themes/wellness-active/tokens.ts +203 -0
  343. package/themes/wellness-spa/THEME.md +93 -0
  344. package/themes/wellness-spa/tokens.ts +173 -0
  345. package/themes/y2k-chrome/THEME.md +118 -0
  346. package/themes/y2k-chrome/tokens.ts +249 -0
  347. package/themes/yoga-studio/THEME.md +76 -0
  348. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,195 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const devtoolCli: Direction = {
4
+ name: "devtool-cli",
5
+ ethos:
6
+ "Cloudflare signal-orange · Fly.io Plex-Mono voice · Railway dark canvas · Vercel Geist restraint · Resend warm-yellow accent",
7
+ references: [
8
+ { brand: "Cloudflare", trait: "dark canvas + signal orange + JetBrains-Mono accents" },
9
+ { brand: "Fly.io", trait: "deep paper-cream + IBM Plex Mono brand voice" },
10
+ { brand: "Railway", trait: "deep dark + Inter + node-graph illustrations" },
11
+ { brand: "Vercel", trait: "black canvas + Geist sans + restrained chrome" },
12
+ { brand: "Resend", trait: "black canvas + warm yellow + minimal flourish" },
13
+ ],
14
+ feel:
15
+ "Near-black canvas with one signal accent — orange-amber, used like a status LED. " +
16
+ "Monospace is promoted to display: terminal prompts, version strings, and code excerpts " +
17
+ "do the heavy lifting that headlines normally would. The page reads like a status dashboard " +
18
+ "that happens to be marketing — we run the internet, but the surface is effortless.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "JetBrains Mono",
23
+ fallback: ["IBM Plex Mono", "Berkeley Mono", "ui-monospace", "SFMono-Regular", "Menlo", "monospace"],
24
+ from: "Cloudflare/Fly.io devtool convention — mono as display, terminal prompt as headline",
25
+ googleFont: "JetBrains+Mono",
26
+ weights: [400, 500, 700],
27
+ },
28
+ body: {
29
+ family: "Inter",
30
+ fallback: ["Geist", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
31
+ from: "Railway/Vercel body sans — neutral, technical, legible on dark surfaces at 15px",
32
+ googleFont: "Inter",
33
+ weights: [400, 500, 600, 700],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["IBM Plex Mono", "Berkeley Mono", "ui-monospace", "SFMono-Regular", "Menlo", "monospace"],
38
+ from: "same family as display — code blocks, shell commands, metric counters",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400, 500],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.02em", // mono display reads tighter at scale — counters Inter's looser default
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"ss01", "ss02", "cv11", "calt", "zero", "tnum"',
48
+ h1ScaleClamp: "clamp(2.25rem, 5.5vw, 4.5rem)", // restrained — mono at oversize loses readability fast
49
+ bodyBaseSize: "0.9375rem", // 15px — Vercel/Railway standard for technical body
50
+ bodyLineHeight: "1.6",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "220 14% 6%", from: "Railway/Vercel deep canvas — near-black with a soft blue bias" },
55
+ foreground: { hsl: "210 14% 92%", from: "Cloudflare cool off-white — readable on dark, never pure white" },
56
+ card: { hsl: "220 14% 9%", from: "elevated card surface — one stop up, still feels like terminal pane" },
57
+ popover: { hsl: "220 14% 11%", from: "popover/command-palette surface — two stops up from canvas" },
58
+ primary: { hsl: "24 95% 56%", from: "Cloudflare signal orange — the canonical devtool accent, status-LED amber" },
59
+ primaryForeground: { hsl: "220 14% 6%", from: "canvas on signal — dark text on bright primary for contrast" },
60
+ secondary: { hsl: "220 12% 14%", from: "Railway elevated steel — secondary surface, hover panel base" },
61
+ secondaryForeground: { hsl: "210 14% 92%", from: "off-white on steel" },
62
+ muted: { hsl: "220 10% 16%", from: "muted surface — code-block background, one tier above secondary" },
63
+ mutedForeground: { hsl: "215 10% 62%", from: "Vercel secondary text — metadata, timestamps, file paths" },
64
+ accent: { hsl: "220 10% 18%", from: "hover lift on cards — minimal step above muted" },
65
+ accentForeground: { hsl: "210 14% 92%", from: "off-white on hover" },
66
+ border: { hsl: "220 10% 20%", from: "hairline panel rule — visible only at edge, never a frame" },
67
+ input: { hsl: "220 10% 20%", from: "same as border — single hairline language for chrome" },
68
+ ring: { hsl: "24 95% 56%", from: "signal-orange focus ring — the accent IS the focus indicator" },
69
+ destructive: { hsl: "0 72% 56%", from: "terminal stderr red — error log color, not decoration" },
70
+ destructiveForeground: { hsl: "210 14% 92%", from: "off-white on error red" },
71
+ brand: {
72
+ signal: { hsl: "24 95% 56%", from: "Cloudflare signal orange — the one accent, used as status LED" },
73
+ "signal-warm": { hsl: "38 92% 58%", from: "Resend warm yellow — gradient anchor partner for signal" },
74
+ success: { hsl: "142 70% 45%", from: "terminal stdout green — exit code 0, health check OK" },
75
+ info: { hsl: "200 88% 56%", from: "Railway info blue — info-level log, link color" },
76
+ canvas: { hsl: "220 14% 6%", from: "the deep canvas — semantic background, also pane behind hero terminal" },
77
+ ink: { hsl: "210 14% 92%", from: "the off-white ink — semantic foreground, also prompt text" },
78
+ },
79
+ },
80
+
81
+ spacing: {
82
+ base: 4,
83
+ scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96, 128], // medium density — terminal-pane breathing
84
+ containerMax: "max-w-6xl", // 1152px — wide enough for two-column code + prose
85
+ containerPadding: "px-5 lg:px-8",
86
+ sectionPadding: {
87
+ hero: "pt-20 pb-16 lg:pt-28 lg:pb-24",
88
+ default: "py-16 lg:py-24",
89
+ tight: "py-10 lg:py-14",
90
+ },
91
+ },
92
+
93
+ radius: {
94
+ base: "0.375rem", // 6px — Vercel/Railway standard, soft but not pillow
95
+ pillsAllowed: true, // status pills allowed — "v2.4.1", "stable", "edge" — terminal convention
96
+ },
97
+
98
+ shadows: {
99
+ style: "glow",
100
+ utilities: {
101
+ "glow-signal":
102
+ "0 0 0 1px hsl(var(--signal) / 0.4), " +
103
+ "0 8px 24px hsl(var(--signal) / 0.18), " +
104
+ "0 24px 64px hsl(var(--signal) / 0.12)",
105
+ "panel-lift":
106
+ "0 1px 0 0 hsl(var(--border)), " +
107
+ "0 12px 32px hsl(0 0% 0% / 0.4)",
108
+ "terminal-inset":
109
+ "inset 0 1px 0 0 hsl(var(--border)), " +
110
+ "inset 0 0 0 1px hsl(var(--border))",
111
+ },
112
+ },
113
+
114
+ motion: {
115
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
116
+ durations: {
117
+ reveal: 600,
118
+ loop: 1200,
119
+ ambient: 8000,
120
+ },
121
+ keyframes: {
122
+ "caret-blink": {
123
+ css:
124
+ "0%, 49% { opacity: 1; }\n" +
125
+ "50%, 100% { opacity: 0; }",
126
+ defaultDuration: 1100,
127
+ iteration: "infinite",
128
+ purpose: "terminal cursor blink on hero prompt — the canonical devtool tell",
129
+ },
130
+ "type-in": {
131
+ css:
132
+ "from { width: 0; }\n" +
133
+ "to { width: 100%; }",
134
+ defaultDuration: 1800,
135
+ iteration: "once",
136
+ purpose: "typewriter reveal for hero command — paired with steps-12 timing function in usage",
137
+ },
138
+ "log-stream": {
139
+ css:
140
+ "from { opacity: 0; transform: translateY(8px); }\n" +
141
+ "to { opacity: 1; transform: translateY(0); }",
142
+ defaultDuration: 400,
143
+ iteration: "once",
144
+ purpose: "stagger-in for log lines and status rows — each row delayed 60ms",
145
+ },
146
+ "status-pulse": {
147
+ css:
148
+ "0%, 100% { box-shadow: 0 0 0 0 hsl(var(--success) / 0.6); }\n" +
149
+ "50% { box-shadow: 0 0 0 6px hsl(var(--success) / 0); }",
150
+ defaultDuration: 2000,
151
+ iteration: "infinite",
152
+ purpose: "live status indicator — 'all systems operational' green dot, breathes",
153
+ },
154
+ "fade-rise": {
155
+ css:
156
+ "from { opacity: 0; transform: translateY(16px); }\n" +
157
+ "to { opacity: 1; transform: translateY(0); }",
158
+ defaultDuration: 600,
159
+ iteration: "once",
160
+ purpose: "section entrance — quiet rise, no bounce",
161
+ },
162
+ },
163
+ respectsReducedMotion: true,
164
+ },
165
+
166
+ density: "medium",
167
+
168
+ patterns: {
169
+ button:
170
+ "Default = ghost button: 1px border (--border), foreground text, no fill. Hover = bg-accent. " +
171
+ "Primary = solid signal-orange fill with canvas text (high contrast, status-LED energy) — used on the single hero CTA per page. " +
172
+ "Tertiary = text-link with foreground color and dotted underline-offset 4px. " +
173
+ "Mono labels allowed on buttons that represent commands (e.g. `npm install`). " +
174
+ "Never gradient on button faces — gradient is reserved for the signal→signal-warm headline accent only.",
175
+ card:
176
+ "Sharp-ish 0.375rem corners, hairline border (--border), bg-card. " +
177
+ "Terminal-pane variant: header strip with three dot-buttons (close/min/max) in --muted, prompt body uses mono. " +
178
+ "Padding p-5 lg:p-8. Glow-signal utility is reserved for the hero card only.",
179
+ input:
180
+ "Full box, 1px --border, bg-card, 0.375rem radius. " +
181
+ "Mono font-family by default — inputs in a devtool surface are command-shaped. " +
182
+ "Focus = signal ring (1px --ring), no glow. Label in body sans above; placeholder in --muted-foreground, mono.",
183
+ cta:
184
+ "Hero: solid signal-fill rectangle with canvas text and an inline arrow glyph. " +
185
+ "Secondary CTAs are ghost buttons in pairs (e.g. 'Read the docs' / 'Star on GitHub'). " +
186
+ "Status pills (--success, --info, --signal) accompany CTAs to communicate runtime state — never decorative.",
187
+ },
188
+
189
+ details: {
190
+ selectionBg: "hsl(var(--signal) / 0.35)",
191
+ selectionFg: "hsl(var(--foreground))",
192
+ focusRing: "1px solid hsl(var(--ring))",
193
+ scrollbarStyle: "thin",
194
+ },
195
+ };
@@ -0,0 +1,105 @@
1
+ # Design Direction — Devtool-Docs
2
+
3
+ ## Ethos
4
+ Linear Docs cream-and-Inter · Cal.com DM-Sans clarity · Plausible JetBrains-Mono code · Mintlify structured sidebar · Stripe Docs density
5
+
6
+ ## Feel
7
+ Warm cream paper, narrow reading column, generous code blocks. A sidebar of structure on the left, prose-and-code in the middle, an "on this page" rail on the right. Signal-color links are the only chrome. The whole surface is a documentation site that respects your time — every page answers a question, and the answer is one ctrl-F away.
8
+
9
+ ## Reference brands
10
+ - **Linear Docs** → warm cream paper + Inter sans + sidebar-then-content. The canonical 2024+ docs feel.
11
+ - **Cal.com Docs** → warm cream + DM Sans + clean rounded code blocks. Open-source warmth done right.
12
+ - **Plausible Docs** → light paper + JetBrains Mono code + simple two-pane nav. Less structure, more clarity.
13
+ - **Mintlify** → clean white + structured sidebar + tab-switchable code blocks. The framework standard.
14
+ - **Stripe Docs** → cream + dense reference + multi-language code switching. The gold standard for API reference density.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin. Do not introduce numbered or generic tokens — if a new color is needed, name a purpose (sidebar, callout, anchor-highlight) and a brand it traces to.
18
+
19
+ Surface stack is **warm cream paper** (background) → **pure white card** (content panels, code-block frames) → **warm paper deeper** (secondary, sidebar) → **muted** (code-block fill). Depth comes from a single soft shadow utility, never heavy elevation. The signal-violet is the only chromatic accent — links, focus rings, primary CTA, current-page sidebar state.
20
+
21
+ Brand tokens: `--paper`, `--ink`, `--signal` (the violet), `--callout-info`, `--callout-warn`, `--callout-success`. Admonitions (`> info:`, `> warning:`, `> tip:`) are styled with their own border-left + tint, but the docs body itself stays paper-and-ink.
22
+
23
+ ## Typography
24
+ - **Display:** Inter. Same family as body — Linear/Cal.com convention. Hierarchy comes from weight (700 for h1, 600 for h2-h3) and scale, not from face change. Tracking `-0.015em` for headings.
25
+ - **Body:** Inter. Base **16px** with line-height **1.65** — comfortable for long-form docs reading.
26
+ - **Mono:** JetBrains Mono. Code blocks, inline code, kbd hints, file paths.
27
+
28
+ H1 uses `clamp(1.875rem, 3.5vw, 2.75rem)` — **docs h1 is restrained on purpose**. The content is the headline; an oversized title wastes the first scroll. Numbers always use tabular figures.
29
+
30
+ Inline code (`<code>`) gets `bg-muted`, no border, `0.25rem` radius, `px-1.5 py-0.5`, JetBrains Mono at 0.9em. **Inline code is the most touched element in docs — get the size and contrast right or the page reads broken.**
31
+
32
+ ## Spacing
33
+ - **Outer container:** `max-w-7xl px-5 lg:px-8` — holds the three-pane shell (sidebar / content / on-this-page).
34
+ - **Inner prose column:** constrained to `max-w-3xl` inside the content pane — 768px reading width, magazine-derived.
35
+ - **Section padding tiers:**
36
+ - Hero: `pt-12 pb-8 lg:pt-16 lg:pb-12` (small — content begins fast in docs)
37
+ - Default: `py-10 lg:py-14`
38
+ - Tight: `py-6 lg:py-8`
39
+ - **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 80 96. Medium density — reading rhythm, not magazine breathing.
40
+
41
+ ## Color
42
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier. Pure white IS allowed here (it's `--card`, the content-panel surface that sits on warm cream paper) — but pure black is forbidden; `--ink` (deep blue-ink) replaces it. The violet signal is the one chromatic accent in the chrome — adding a second link color or accent breaks the discipline.
43
+
44
+ ## Radius
45
+ `--radius: 0.5rem` (8px). Linear/Cal.com modern-soft, never pillow. **Pills are allowed** for version badges (`v2.4.1`), "new" / "beta" / "deprecated" labels, and language switchers on code blocks — docs convention. Never a pill button.
46
+
47
+ ## Shadows
48
+ **Soft style.** Three utilities ship:
49
+ - `.card-soft` — 1px + 4px stack, very light. For elevated feature cards.
50
+ - `.code-frame` — inset 1px `--border`. The default code-block frame.
51
+ - `.popover-soft` — 8px + 2px stack. For dropdowns, search results, the command palette.
52
+
53
+ No heavy elevation. No glow. Docs surfaces sit nearly flat — depth is for affordance, not flourish.
54
+
55
+ ## Motion
56
+ Docs motion is **near-invisible by design** — three keyframes, all reactive to user action, none ambient.
57
+
58
+ - `fade-in` — 200ms once. Page transitions, modal entrance. Must feel instant; docs reads break if pages stage themselves in.
59
+ - `highlight-anchor` — 1500ms once. When the user clicks a `#heading` link, the target heading gets a violet `accent` wash that fades to transparent. The page tells you "you arrived at the right place."
60
+ - `copy-confirm` — 1200ms once. The "copied!" toast on the code-block copy button. The only motion the user actively triggers — and the only one that earns a brief loop.
61
+
62
+ No ambient motion. No marquee. No parallax. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — anchor highlight becomes a brief static violet underline; copy-confirm becomes a static text swap.
63
+
64
+ ## Component patterns
65
+ - **Buttons:** ghost-default (1px `--border`, foreground text, hover `bg-secondary`). **Primary = solid `--primary` fill** (Linear-violet, paper text) — reserved for the hero "Get started" and the primary action inside callout cards. Tertiary = inline text link, `--primary` color, underline on hover with 4px offset.
66
+ - **Sidebar nav items:** styled links, NOT buttons. Hover = `bg-accent` (violet wash). Current page = `text-foreground font-medium` + `bg-accent`. Nested levels use a 2px `--border` left rule and indent of 16px.
67
+ - **Cards:** soft `0.5rem` corners, hairline `--border`, `bg-card` (white on cream). `.card-soft` shadow for feature highlights only. Padding `p-5 lg:p-6`.
68
+ - **Callouts (admonitions):** border-left 3px in `--callout-{info|warn|success}` + matching tinted background at 0.06 alpha + icon glyph. No full border — the left rule is the affordance. `> info:`, `> warning:`, `> tip:`, `> danger:` are the four allowed types.
69
+ - **Inputs:** full box, 1px `--border`, `bg-card`, `0.5rem` radius. Search input in the top bar has a leading magnifying-glass and a trailing `Ctrl K` kbd hint. Focus = 2px `--ring` with 1px offset.
70
+ - **Code blocks:** `.code-frame` inset border, `bg-card` or `bg-muted` (per theme), `0.5rem` radius. **Filename strip on top** (mono, `--muted-foreground`, `text-xs`). **Copy button** top-right corner, ghost style, 16px icon. **Language tabs** for multi-language examples (Linear/Stripe convention) — pill row above the code, active tab gets `--primary` underline.
71
+ - **Tables:** zebra-striping disabled. Row separator = 1px `--border` bottom. Header row = `font-medium`, `text-muted-foreground`, `text-xs uppercase tracking-wide`. **Reference tables (prop name / type / default / description) are the docs workhorse — get the column rhythm right and the page reads itself.**
72
+ - **`kbd` element:** 1px `--border`, `bg-card`, `0.375rem` radius, mono font, `text-xs`, `px-1.5 py-0.5`, slight bottom-shadow to feel keycap-like.
73
+
74
+ ## Recommended rich media
75
+ Devtool-Docs is **text-and-code first** — images appear only when they answer a question prose cannot.
76
+
77
+ 1. **Architecture diagrams** — same vocabulary as Devtool-CLI's diagrams. Geometric, monochrome (`--ink` + `--muted-foreground`), one `--signal` highlight per diagram. Built in Excalidraw or Figma with the docs token palette. Embedded inline as SVG so they respond to light/dark theme.
78
+ 2. **Annotated screenshots** — when documenting a dashboard or UI feature. Crop tight, no chrome, with `--signal`-color numbered circles (1, 2, 3) keyed to a list below. **Never a full-window screenshot with browser chrome** — wastes pixels and dates fast.
79
+ 3. **Inline figures** — small SVG-only illustrations (a sequence diagram, a request lifecycle). Hand-drawn-feel acceptable (Excalidraw's default), CAD-clean acceptable (Figma) — pick one and stay consistent.
80
+
81
+ **AI tool recommendations:** **Excalidraw** for diagrams, exported as SVG with the docs theme tokens applied. **CleanShot X** or **Shottr** for annotated screenshots — both have built-in numbered-circle annotations. **Mermaid** for sequence and flow diagrams that need to live in markdown source. Avoid Midjourney/Flux for docs — generated imagery is wrong-context for documentation.
82
+
83
+ **Aspect ratios:** SVGs are intrinsic. Screenshots are 16:9 or 4:3, never portrait. Diagrams are usually wider than tall (request flows, architectures).
84
+
85
+ **Video:** rarely. If used, an embedded YouTube player for a tutorial video on a getting-started page — never autoplay, always with a poster image.
86
+
87
+ **Performance:** the docs are read on slow conference Wi-Fi, on phones, on flights. Inlined SVG is free; raster screenshots ≤60 KB AVIF each at 1600w. **Total page weight under 250 KB on a typical reference page** — search and navigation must feel instant.
88
+
89
+ **Avoid:** stock illustration of "developer at laptop," gradient meshes, 3D isometric anything, animated GIFs (use video or static), screenshots with personal data not redacted, screenshots dated by a visible timestamp or version number that will rot.
90
+
91
+ **Accessibility:** every image needs alt text that conveys the answer the image gives, not its appearance. *"Diagram: a request from the client passes through edge → origin → database, and the response returns via cache."* Code blocks must remain real `<pre><code>` — never images of code. Tables must use real `<table>` with `<th scope>` so screen readers narrate column headers correctly.
92
+
93
+ ## Component families
94
+ None at install time. Expected first families as the project grows: `sidebar-nav`, `prose-typography`, `code-block`, `callout`, `reference-table`, `command-k-search`, `version-switcher`.
95
+
96
+ ## Details
97
+ - **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text — soft violet highlight on the cream paper.
98
+ - **Focus ring:** `2px solid hsl(var(--ring))` with 1px offset — visible, keyboard-first, never loud.
99
+ - **Scrollbar:** thin. Track is `--paper`; thumb is `--border`. Hover thumb `--muted-foreground`. The sidebar gets its own scrollbar; the right rail does not (it's short enough not to need one).
100
+
101
+ ## Exceptions
102
+ None yet. When an intentional one-of-one violation lands, add it here with the reason.
103
+
104
+ ## Revisions
105
+ - Initial direction, generated at install time.
@@ -0,0 +1,177 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const devtoolDocs: Direction = {
4
+ name: "devtool-docs",
5
+ ethos:
6
+ "Linear Docs cream-and-Inter · Cal.com DM-Sans clarity · Plausible JetBrains-Mono code · Mintlify structured sidebar · Stripe Docs density",
7
+ references: [
8
+ { brand: "Linear Docs", trait: "warm cream paper + Inter sans + sidebar-then-content reading pattern" },
9
+ { brand: "Cal.com Docs", trait: "warm cream + DM Sans + clean rounded code blocks" },
10
+ { brand: "Plausible Docs", trait: "light paper + JetBrains Mono code + simple two-pane nav" },
11
+ { brand: "Mintlify", trait: "clean white + structured sidebar + tab-switchable code" },
12
+ { brand: "Stripe Docs", trait: "cream + dense reference + multi-language code switching" },
13
+ ],
14
+ feel:
15
+ "Warm cream paper, narrow reading column, generous code blocks. A sidebar of structure on " +
16
+ "the left, prose-and-code in the middle, a 'on this page' rail on the right. Signal-color " +
17
+ "links are the only chrome. The whole surface is a documentation site that respects your " +
18
+ "time — every page answers a question, and the answer is one ctrl-F away.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Inter",
23
+ fallback: ["DM Sans", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
24
+ from: "Linear/Cal.com docs sans — same family display and body, hierarchy by weight and scale",
25
+ googleFont: "Inter",
26
+ weights: [400, 500, 600, 700],
27
+ },
28
+ body: {
29
+ family: "Inter",
30
+ fallback: ["DM Sans", "system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
31
+ from: "Linear/Mintlify body sans — neutral, optimized for long-form reading at 16px",
32
+ googleFont: "Inter",
33
+ weights: [400, 500, 600],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["IBM Plex Mono", "Fira Code", "ui-monospace", "SFMono-Regular", "Menlo", "monospace"],
38
+ from: "Plausible/Stripe Docs code face — readable at code-block sizes, ligature-friendly",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400, 500],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.015em", // Inter at heading scale wants a hair tighter — Linear/Vercel convention
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"ss01", "cv11", "calt", "tnum"',
48
+ h1ScaleClamp: "clamp(1.875rem, 3.5vw, 2.75rem)", // docs h1 is restrained — content is the headline
49
+ bodyBaseSize: "1rem", // 16px — comfortable for long-form docs reading
50
+ bodyLineHeight: "1.65",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "36 30% 97%", from: "Linear/Cal.com warm cream paper — barely-there warmth, not white" },
55
+ foreground: { hsl: "220 22% 14%", from: "deep ink — Linear/Stripe Docs body color, never pure black" },
56
+ card: { hsl: "0 0% 100%", from: "card surface — pure white sits on the cream paper" },
57
+ popover: { hsl: "0 0% 100%", from: "popover/dropdown surface — same as card" },
58
+ primary: { hsl: "260 70% 56%", from: "Linear-violet signal link — restrained accent, used for links and primary actions" },
59
+ primaryForeground: { hsl: "36 30% 97%", from: "paper on violet" },
60
+ secondary: { hsl: "36 22% 93%", from: "warm paper, one tier deeper — sidebar surface, code-block background partner" },
61
+ secondaryForeground: { hsl: "220 22% 14%", from: "ink on warm paper" },
62
+ muted: { hsl: "36 18% 91%", from: "code-block fill — warm gray that sits on cream without fighting it" },
63
+ mutedForeground: { hsl: "220 12% 42%", from: "metadata text — file paths, last-updated stamps, secondary nav" },
64
+ accent: { hsl: "260 70% 96%", from: "violet hover wash — sidebar item hover, callout tint" },
65
+ accentForeground: { hsl: "260 65% 32%", from: "deep violet text on the wash" },
66
+ border: { hsl: "220 14% 88%", from: "hairline rule — sidebar divider, code-block frame, table row" },
67
+ input: { hsl: "220 14% 88%", from: "same as border — single hairline language" },
68
+ ring: { hsl: "260 70% 56%", from: "primary violet — focus ring matches link accent" },
69
+ destructive: { hsl: "0 70% 48%", from: "callout-warning red — danger admonition only, not decoration" },
70
+ destructiveForeground: { hsl: "36 30% 97%", from: "paper on warning" },
71
+ brand: {
72
+ paper: { hsl: "36 30% 97%", from: "the warm cream — semantic background, also content-area paper" },
73
+ ink: { hsl: "220 22% 14%", from: "the deep ink — semantic foreground, also prose body" },
74
+ signal: { hsl: "260 70% 56%", from: "Linear-violet signal — the canonical docs link/CTA color" },
75
+ "callout-info": { hsl: "200 88% 50%", from: "info admonition blue — > info: callouts" },
76
+ "callout-warn": { hsl: "38 92% 50%", from: "warning admonition amber — > warning: callouts" },
77
+ "callout-success": { hsl: "150 60% 42%", from: "success admonition green — > tip/note: callouts" },
78
+ },
79
+ },
80
+
81
+ spacing: {
82
+ base: 4,
83
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 40, 48, 64, 80, 96], // medium-low density — reading rhythm
84
+ containerMax: "max-w-7xl", // outer shell holds 3 panes; inner prose column is constrained separately
85
+ containerPadding: "px-5 lg:px-8",
86
+ sectionPadding: {
87
+ hero: "pt-12 pb-8 lg:pt-16 lg:pb-12", // docs heroes are small — content begins fast
88
+ default: "py-10 lg:py-14",
89
+ tight: "py-6 lg:py-8",
90
+ },
91
+ },
92
+
93
+ radius: {
94
+ base: "0.5rem", // 8px — Linear/Cal.com docs standard, modern-soft
95
+ pillsAllowed: true, // version pills, status pills, "new" badges — docs convention
96
+ },
97
+
98
+ shadows: {
99
+ style: "soft",
100
+ utilities: {
101
+ "card-soft":
102
+ "0 1px 2px 0 hsl(220 22% 14% / 0.04), " +
103
+ "0 4px 12px 0 hsl(220 22% 14% / 0.04)",
104
+ "code-frame":
105
+ "inset 0 0 0 1px hsl(var(--border))",
106
+ "popover-soft":
107
+ "0 8px 24px 0 hsl(220 22% 14% / 0.08), " +
108
+ "0 2px 4px 0 hsl(220 22% 14% / 0.04)",
109
+ },
110
+ },
111
+
112
+ motion: {
113
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
114
+ durations: {
115
+ reveal: 200,
116
+ loop: 1500,
117
+ ambient: 0,
118
+ },
119
+ keyframes: {
120
+ "fade-in": {
121
+ css:
122
+ "from { opacity: 0; }\n" +
123
+ "to { opacity: 1; }",
124
+ defaultDuration: 200,
125
+ iteration: "once",
126
+ purpose: "page transition and modal entrance — docs reveal must be near-instant, never theatrical",
127
+ },
128
+ "highlight-anchor": {
129
+ css:
130
+ "0% { background-color: hsl(var(--accent)); }\n" +
131
+ "100% { background-color: hsl(var(--accent) / 0); }",
132
+ defaultDuration: 1500,
133
+ iteration: "once",
134
+ purpose: "anchor-link landing — the violet wash fades to signal you arrived at the right heading",
135
+ },
136
+ "copy-confirm": {
137
+ css:
138
+ "0% { opacity: 0; transform: translateY(4px); }\n" +
139
+ "20%, 80% { opacity: 1; transform: translateY(0); }\n" +
140
+ "100% { opacity: 0; transform: translateY(-4px); }",
141
+ defaultDuration: 1200,
142
+ iteration: "once",
143
+ purpose: "'copied!' toast on code-block copy button — the only motion the user actively triggers",
144
+ },
145
+ },
146
+ respectsReducedMotion: true,
147
+ },
148
+
149
+ density: "medium",
150
+
151
+ patterns: {
152
+ button:
153
+ "Default = ghost: 1px --border, foreground text, hover bg-secondary. " +
154
+ "Primary = solid --primary fill (Linear-violet) with paper text — reserved for hero 'Get started' and primary CTA in callouts. " +
155
+ "Tertiary = inline text link, --primary color, underline on hover with 4px offset. " +
156
+ "Nav items in the sidebar are NOT buttons — they are styled links with hover bg-accent and current-page foreground-color.",
157
+ card:
158
+ "Soft 0.5rem corners, hairline border (--border), bg-card (pure white on cream). " +
159
+ "Card-soft shadow utility for elevated cards (feature highlights). " +
160
+ "Padding p-5 lg:p-6. Callout cards use callout-info/warn/success border-left 3px instead of full border.",
161
+ input:
162
+ "Full box, 1px --border, bg-card, 0.5rem radius. " +
163
+ "Search input in the top bar has a leading magnifying-glass icon and 'Ctrl K' kbd hint on the right. " +
164
+ "Focus = 2px --ring with 1px offset; visible but not loud.",
165
+ cta:
166
+ "Hero: solid --primary fill rectangle, 'Read the quickstart' style copy. " +
167
+ "Card CTAs are text-links with arrow glyph (→) inline. " +
168
+ "Callout CTAs use ghost buttons in the callout's tint family.",
169
+ },
170
+
171
+ details: {
172
+ selectionBg: "hsl(var(--primary) / 0.22)",
173
+ selectionFg: "hsl(var(--foreground))",
174
+ focusRing: "2px solid hsl(var(--ring))",
175
+ scrollbarStyle: "thin",
176
+ },
177
+ };
@@ -0,0 +1,129 @@
1
+ # Editorial
2
+
3
+ > Photography-first quarterly register — off-white gallery canvas at
4
+
5
+ **Slug:** `editorial` — **Surface:** web — **Density:** airy
6
+
7
+ ## Influence
8
+
9
+ Fine-art photography quarterlies (Aperture at its most spartan,
10
+ Foam Magazine, IMA Magazine, The Photographic Journal). Gallery
11
+ publication design (Gagosian catalogues, David Zwirner books at
12
+ the type-restrained end). Distinct from other Family C bases
13
+ through PHOTOGRAPHY-AS-PRIMARY-DESIGN-ELEMENT — the image
14
+ dominates the composition; type is reduced to caption weight.
15
+
16
+
17
+ ## Signature move
18
+
19
+ Off-white gallery canvas at #fafafa — the register's non-negotiable
20
+ base (deliberately NOT pure white, deliberately NOT claude-cream,
21
+ deliberately NOT warm cream). Cold near-black ink at #0a0a0a. ONE
22
+ vermilion accent at #b81a1a used ONLY for the reading-progress bar
23
+ and hover states on essay-index rows. Sharp corners everywhere.
24
+ Composition begins with a MINIMAL MASTHEAD — small Söhne-style
25
+ wordmark left (HELIOGRAPH, 20px, uppercase, letter-spacing tight),
26
+ center nav row (6-8 links, 13px), right-column shows ISSUE NAMEPLATE
27
+ MARK (small caps "ISSUE 04 · MARCH 2026", 10px 0.14em tracked). Below
28
+ the masthead: a FULL-BLEED HERO PHOTOGRAPH occupying the entire
29
+ hero viewport (78-90vh) with a subtle bottom-gradient scrim; overlaid
30
+ on the bottom-left are the essay title (24-32px display sans mixed
31
+ case) + photographer credit line ("Photographs by Ren Havelock",
32
+ Newsreader italic 14px). Below the hero: a NUMBERED TABLE OF
33
+ CONTENTS with 6-10 numbered essay entries — each row is "01 · Essay
34
+ title · photographer name" in a horizontal layout with a hairline
35
+ bottom border and the vermilion hover-underline. Below the ToC: the
36
+ FEATURED ESSAY block, which alternates SEQUENTIAL PHOTOGRAPH FRAMES
37
+ at varied aspect ratios (3:2 wide, 4:5 tall, 1:1 square) with tiny
38
+ caption strips beneath each frame ("PLATE 07 / 12 · location, year").
39
+ A drop-cap opens the accompanying body text. Between essays: a PULL
40
+ QUOTE BAND — full-width italic Newsreader at 40-56px display size
41
+ centered on a cream inverted band. A CONTRIBUTOR BIO GRID follows
42
+ with 4-6 headshots (140x140 sharp squares) + micro-bio (100 words
43
+ max in body serif). A SUBSCRIBE/ORDER STRIP with a horizontal input
44
+ + a black filled submit button. Footer opens with a giant
45
+ wordmark repeat, colophon body block, and utility link column.
46
+ Six bespoke SVG marks (issue-number seal, plate-number bracket,
47
+ camera-shutter icon, photographer's dot mark, subscribe-form arrow,
48
+ colophon separator glyph) are dropped as PUNCTUATION at specific
49
+ compositional moments — never as a uniform icon row.
50
+
51
+ ## Palette
52
+
53
+ - **bg:** `#fafafa`
54
+ - **surface:** `#ffffff`
55
+ - **ink:** `#0a0a0a`
56
+ - **accent:** `#b81a1a`
57
+
58
+ ## Typography
59
+
60
+ - **Display:** A precise geometric grotesk with quirky wide letterforms — the reference uses a Söhne / Grafik / Founders Grotesk / GT America family. Free fallback stack — "Neue Haas Grotesk Display", "Space Grotesk", "Inter", system-ui, sans-serif. Weight 500-700, mixed case for section titles + photographer names, UPPERCASE only for the nameplate wordmark. Top of scale ~48px for essay titles, 28px for section headings — deliberately RESTRAINED so the photograph carries the drama. Small caps at 10-11px for micro-labels (issue number, date, photographer credit).
61
+ - **Body:** The reference uses a text-optimized serif for essay body copy — Newsreader / Newzald / Domine / EB Garamond family. Free fallback stack — "Newsreader", "Domine", "Georgia", serif. Weight 400 for body, 400 italic for photographer credit lines. 14-15px body copy, line-height 1.55. Small captions at 11-12px in the display sans, not the body serif.
62
+ - **Mono:** none. Editorial is a consumer publication surface. Mono has no role.
63
+ - **Scale:** 1.25 (perfect fourth — restrained, so composition and photography carry the drama)
64
+
65
+ ## Motion
66
+
67
+ Ships live in the section renderer (no external dependencies):
68
+ 1. Hero photograph fade-in — the full-bleed cover image opens from opacity 0 + scale(1.02) to opacity 1 + scale(1) over 1400ms cubic-bezier(0.23,1,0.32,1) on first paint.
69
+ 2. Progressive image reveal — every photograph on the page transitions from blur(8px) + opacity 0.3 → blur(0) + opacity 1 on IntersectionObserver at 25% visibility, 900ms cubic-bezier.
70
+ 3. Caption strip fade — each photograph's tiny caption strip fades in 200ms AFTER its photograph finishes revealing, so the caption reads AFTER the image is seen.
71
+ 4. Sticky reading progress — a thin horizontal bar in the vermilion accent grows across the top of the viewport as the user scrolls, indicating essay progress. Fixed position, 2px height.
72
+ 5. Contributor headshot reveal — bios fade in with 100ms per-bio stagger + 500ms cubic-bezier on IntersectionObserver visibility.
73
+ 6. Small essay-index hover — each entry in the numbered table of contents shifts the horizontal accent line from 0 → 100% width over 240ms cubic-bezier on hover, then reverses on hover-out.
74
+ 7. Nav shrink on scroll — the top masthead reduces from 88px → 52px height after 200px of scroll, transitioning font-size and padding over 300ms cubic-bezier.
75
+ 8. prefers-reduced-motion: reduce — hero photo shows at final scale; progressive image reveal disabled (photos show at final blur:0); caption strips show immediately; progress bar still tracks; contributor bios show all at once; hover accent-line still animates (interaction feedback); nav still shrinks (state change).
76
+
77
+ Motion character: gallery-quiet, precise, restrained. Custom cubic-bezier(0.23,1,0.32,1) for all reveals. The register lives in fine-art publication, not marketing web — motion should feel like turning a page in a printed quarterly, not like a SaaS product tour.
78
+
79
+
80
+ ## Imagery
81
+
82
+ FULL-BLEED photography as the primary compositional element —
83
+ the reference uses fine-art documentary + portrait + landscape
84
+ photography shot at gallery/exhibition-print quality. FPO imagery
85
+ here should read as intentional photography (composed framing,
86
+ directional light, considered subject) — never generic stock, never
87
+ gradient blobs, never radial glow fallbacks. Every photograph is a
88
+ SHARP-EDGED rectangle with no border, no rounded corner, no drop
89
+ shadow. Caption strips beneath photographs use tiny sans-serif
90
+ labels (10-11px) with the PLATE number, subject, and year. NO stock
91
+ photography that reads as marketing-stock. NO 3D-rendered "photo"
92
+ placeholders. NO warm-glow gradient fills.
93
+
94
+ ## Best for
95
+
96
+ - Fine-art photography journals and photobook publishers
97
+ - Small-run print quarterlies and independent magazines
98
+ - Gallery + museum publication websites (catalogues, exhibition sites)
99
+ - Photographer portfolios that need editorial framing
100
+ - Architecture / interior-design publications with photography focus
101
+ - Documentary photo essay platforms and photojournalism sites
102
+
103
+ ## Reject if
104
+
105
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
106
+
107
+ - Warm cream canvas — Editorial's canvas is #fafafa (off-white gallery ground), deliberately COOLER and MORE NEUTRAL than the warm-cream family. Warm cream would collapse into a literary-quarterly register (which is a different theme).
108
+ - Multi-color accent palette — the whole register's move is ONE vermilion accent doing everything (progress bar, hover underline, issue-number mark). Introducing amber / green / any second accent collapses the discipline.
109
+ - Rounded corners on cards, buttons, inputs, photograph frames — 0px radius everywhere. The gallery-print register is uncompromising on sharp edges.
110
+ - Uniform 3-column photograph grid — sequential photo essays use VARIED aspect ratios and offsets. Uniform grids collapse into stock-photo-gallery slop.
111
+ - Big monumental hero display type — Editorial's type stays RESTRAINED. The photograph carries the drama; type is caption weight. Any hero-sized (80px+) display type overrides the photograph and collapses the register.
112
+ - Sans-serif body copy — body must be a text-optimized serif (Newsreader / Domine / EB Garamond). Sans body reads as marketing-web, not publication.
113
+ - Serif display type — display face MUST be a precise geometric grotesk (Söhne / Grafik / Space Grotesk fallback). Serif display collapses into a literary register (which is a different theme).
114
+ - Drop shadows or glassmorphism on photographs — every photograph sits FLAT against the canvas with no shadow, no border. Frames are the AI-tell for placeholder imagery.
115
+ - Mono-caps eyebrow labels outside the two legitimate use sites — ISSUE NAMEPLATE MARK (masthead) and PLATE-NUMBER STRIP (photo caption) are the ONLY permitted mono-caps uses. Any additional 'SECTION · X' / 'CHAPTER · Y' / 'READ TIME' plate is slop-blocklist violation.
116
+ - Cycling headline words / auto-advancing sliders — no marketing motion. The photograph is STATIC, the pull quote is STATIC. Motion here is reveal-on-scroll + reading-progress bar + hover accent-line.
117
+
118
+ ## Banned defaults (inherited + theme-specific)
119
+
120
+ - claude-cream (#F4F1EA + serif + #D97757) — this theme's canvas is off-white gallery ground #fafafa, distinct from claude-cream.
121
+ - void+acid (near-black bg + single bright acid-green or vermilion accent) — this theme's canvas is LIGHT gallery ground with a saturated vermilion accent used SPARINGLY, not a void+acid register.
122
+ - broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content) — Editorial IS an editorial context so hairline rules and 0px radius are legitimate.
123
+ - tech-bro purple gradient (purple→blue gradient hero + centered headline + double CTA + emoji icons)
124
+ - uniform-everything (identical padding + one weight of one sans doing every job + rounded-2xl + shadow-md cards)
125
+ - monumental-type-primary (Editorial's whole discipline is PHOTOGRAPHY-PRIMARY / TYPE-SECONDARY. Making the display type the compositional anchor inverts the register into a monumental-editorial base.)
126
+ - sans-body-serif-display (Editorial pairs SERIF BODY with SANS DISPLAY — the opposite of the marketing-web default. Flipping this pairing collapses the register.)
127
+ - photo-gallery-3col-grid (photograph sequences use VARIED aspect ratios and rhythmic offsets. Uniform 3-column photo grids are the AI-tell for stock-photo-gallery slop.)
128
+ - multi-accent-punctuation (ONE vermilion accent doing 100% of the punctuation work. Introducing green / blue / amber as a secondary punctuation accent collapses the discipline.)
129
+ - big-hero-marketing-copy (Editorial's essay-title overlay stays SMALL and RESTRAINED — this is a magazine cover, not a landing page hero. Any 80px+ hero-marketing display type collapses the register.)
@@ -0,0 +1,2 @@
1
+ {"slug":"editorial","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T23:42:51.195Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T23:42:51.205Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":false,"failures":[{"rule":"AVOID-02","severity":"block","evidence":"Rule \"Multi-color accent palette — the whole register's move is ONE vermilion accent doing everything (progress bar, hover underline, issue-number mark). Introducing amber / green / any second accent collapses the discipline.\" — Palette exposes a second saturated accent alongside vermilion: `\"accent\": \"#b81a1a\"` AND `\"secondary\": \"#1e40af\"` (a saturated blue) in both tokens.ts and tailwind.snippet.ts colors. The rule requires ONE vermilion accent doing everything; introducing a second accent (here a blue secondary) collapses the discipline."}]},"ran_at":"2026-07-04T23:43:26.955Z","dismissed":[]}],"overall":"BLOCK","ran_at":"2026-07-04T23:42:51.195Z"}
2
+ {"slug":"editorial","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T23:43:48.099Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T23:43:48.109Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T23:44:21.062Z","dismissed":[]},{"gate":"anchor-compare","verdict":{"passed":true,"failures":[],"skipped":"Family C rubric.md missing at /Users/mattfrischer/Taste/site/design-system/golden-set/C/rubric.md — anchor-compare skipped."},"ran_at":"2026-07-04T23:44:21.063Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-04T23:43:48.099Z"}
@@ -0,0 +1,15 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: editorial
3
+ export const editorialTailwindExtend = {
4
+ colors: {
5
+ bg: "#fafafa",
6
+ surface: "#ffffff",
7
+ ink: "#0a0a0a",
8
+ accent: "#b81a1a",
9
+ },
10
+ fontFamily: {
11
+ display: ["A precise geometric grotesk with quirky wide letterforms — the reference uses a Söhne / Grafik / Founders Grotesk / GT America family. Free fallback stack — \"Neue Haas Grotesk Display\", \"Space Grotesk\", \"Inter\", system-ui, sans-serif. Weight 500-700, mixed case for section titles + photographer names, UPPERCASE only for the nameplate wordmark. Top of scale ~48px for essay titles, 28px for section headings — deliberately RESTRAINED so the photograph carries the drama. Small caps at 10-11px for micro-labels (issue number, date, photographer credit)."],
12
+ body: ["The reference uses a text-optimized serif for essay body copy — Newsreader / Newzald / Domine / EB Garamond family. Free fallback stack — \"Newsreader\", \"Domine\", \"Georgia\", serif. Weight 400 for body, 400 italic for photographer credit lines. 14-15px body copy, line-height 1.55. Small captions at 11-12px in the display sans, not the body serif."],
13
+ mono: ["none. Editorial is a consumer publication surface. Mono has no role."],
14
+ },
15
+ };