@stylecrib/cli 0.3.1 → 0.3.3

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 (314) hide show
  1. package/README.md +94 -9
  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 +1606 -467
  25. package/package.json +12 -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/THEME.md +125 -0
  38. package/themes/arc-stack/tailwind.snippet.ts +17 -0
  39. package/themes/arc-stack/theme.yml +153 -0
  40. package/themes/arc-stack/tokens.ts +29 -0
  41. package/themes/architectural/THEME.md +102 -0
  42. package/themes/architectural/tokens.ts +159 -0
  43. package/themes/atelier-radiance/THEME.md +93 -0
  44. package/themes/atelier-radiance/tailwind.snippet.ts +15 -0
  45. package/themes/atelier-radiance/theme.yml +130 -0
  46. package/themes/atelier-radiance/tokens.ts +29 -0
  47. package/themes/automotive-ev/THEME.md +87 -0
  48. package/themes/automotive-ev/tokens.ts +183 -0
  49. package/themes/automotive-luxury/THEME.md +88 -0
  50. package/themes/automotive-luxury/tokens.ts +175 -0
  51. package/themes/baby-modern/THEME.md +79 -0
  52. package/themes/baby-modern/tokens.ts +184 -0
  53. package/themes/banking-gravity/THEME.md +171 -0
  54. package/themes/banking-gravity/tokens.ts +169 -0
  55. package/themes/beauty-clean/THEME.md +92 -0
  56. package/themes/beauty-clean/tokens.ts +176 -0
  57. package/themes/beauty-luxury/THEME.md +96 -0
  58. package/themes/beauty-luxury/tokens.ts +178 -0
  59. package/themes/bento-modular/BUILD_BRIEF.md +171 -0
  60. package/themes/bento-modular/THEME.md +80 -0
  61. package/themes/bento-modular/tailwind.snippet.ts +17 -0
  62. package/themes/bento-modular/theme.yml +83 -0
  63. package/themes/bento-modular/tokens.ts +27 -0
  64. package/themes/bookstore-indie/THEME.md +78 -0
  65. package/themes/bookstore-indie/tokens.ts +147 -0
  66. package/themes/brutalist/THEME.md +96 -0
  67. package/themes/brutalist/tokens.ts +151 -0
  68. package/themes/business-tiles/THEME.md +141 -0
  69. package/themes/business-tiles/tokens.ts +178 -0
  70. package/themes/cabana-poster/THEME.md +158 -0
  71. package/themes/cabana-poster/tailwind.snippet.ts +16 -0
  72. package/themes/cabana-poster/theme.yml +221 -0
  73. package/themes/cabana-poster/tokens.ts +34 -0
  74. package/themes/case-panel/THEME.md +126 -0
  75. package/themes/case-panel/tailwind.snippet.ts +15 -0
  76. package/themes/case-panel/theme.yml +153 -0
  77. package/themes/case-panel/tokens.ts +28 -0
  78. package/themes/cinematic-dark/THEME.md +97 -0
  79. package/themes/cinematic-dark/tokens.ts +195 -0
  80. package/themes/classic-car/THEME.md +86 -0
  81. package/themes/classic-car/tokens.ts +173 -0
  82. package/themes/cloud-friendly/THEME.md +152 -0
  83. package/themes/cloud-friendly/tokens.ts +181 -0
  84. package/themes/community-niche/THEME.md +102 -0
  85. package/themes/community-niche/tokens.ts +177 -0
  86. package/themes/corporate-grid/THEME.md +154 -0
  87. package/themes/corporate-grid/tokens.ts +182 -0
  88. package/themes/couture-luxury/THEME.md +85 -0
  89. package/themes/couture-luxury/tokens.ts +146 -0
  90. package/themes/creator-social/THEME.md +131 -0
  91. package/themes/creator-social/tokens.ts +249 -0
  92. package/themes/crypto-onchain/THEME.md +100 -0
  93. package/themes/crypto-onchain/tokens.ts +207 -0
  94. package/themes/cycling-brand/THEME.md +78 -0
  95. package/themes/cycling-brand/tokens.ts +185 -0
  96. package/themes/dating-friendly/THEME.md +102 -0
  97. package/themes/dating-friendly/tokens.ts +178 -0
  98. package/themes/dense-utility/THEME.md +85 -0
  99. package/themes/dense-utility/tokens.ts +155 -0
  100. package/themes/devtool-cli/THEME.md +100 -0
  101. package/themes/devtool-cli/tokens.ts +195 -0
  102. package/themes/devtool-docs/THEME.md +105 -0
  103. package/themes/devtool-docs/tokens.ts +177 -0
  104. package/themes/editorial/THEME.md +129 -0
  105. package/themes/editorial/tailwind.snippet.ts +15 -0
  106. package/themes/editorial/theme.yml +173 -0
  107. package/themes/editorial/tokens.ts +29 -0
  108. package/themes/education-formal/THEME.md +154 -0
  109. package/themes/education-formal/tailwind.snippet.ts +15 -0
  110. package/themes/education-formal/theme.yml +186 -0
  111. package/themes/education-formal/tokens.ts +29 -0
  112. package/themes/education-warm/THEME.md +91 -0
  113. package/themes/education-warm/tokens.ts +185 -0
  114. package/themes/ember-poster/README.md +79 -0
  115. package/themes/ember-poster/THEME.md +101 -0
  116. package/themes/ember-poster/package.json +34 -0
  117. package/themes/ember-poster/tailwind.snippet.ts +17 -0
  118. package/themes/ember-poster/theme.yml +109 -0
  119. package/themes/ember-poster/tokens.ts +27 -0
  120. package/themes/enterprise-cloud/THEME.md +139 -0
  121. package/themes/enterprise-cloud/tokens.ts +179 -0
  122. package/themes/enterprise-tech/THEME.md +167 -0
  123. package/themes/enterprise-tech/tailwind.snippet.ts +15 -0
  124. package/themes/enterprise-tech/theme.yml +202 -0
  125. package/themes/enterprise-tech/tokens.ts +29 -0
  126. package/themes/ev-charging/THEME.md +94 -0
  127. package/themes/ev-charging/tokens.ts +185 -0
  128. package/themes/farm-direct/THEME.md +92 -0
  129. package/themes/farm-direct/tokens.ts +180 -0
  130. package/themes/fintech-card/THEME.md +96 -0
  131. package/themes/fintech-card/tokens.ts +191 -0
  132. package/themes/fintech-trust/THEME.md +94 -0
  133. package/themes/fintech-trust/tokens.ts +192 -0
  134. package/themes/food-blog/THEME.md +98 -0
  135. package/themes/food-blog/tokens.ts +183 -0
  136. package/themes/forum-classic/THEME.md +100 -0
  137. package/themes/forum-classic/tokens.ts +168 -0
  138. package/themes/fresh-plate/THEME.md +144 -0
  139. package/themes/fresh-plate/tailwind.snippet.ts +16 -0
  140. package/themes/fresh-plate/theme.yml +189 -0
  141. package/themes/fresh-plate/tokens.ts +30 -0
  142. package/themes/furniture-modern/THEME.md +94 -0
  143. package/themes/furniture-modern/tokens.ts +176 -0
  144. package/themes/gaming-esports/THEME.md +146 -0
  145. package/themes/gaming-esports/tokens.ts +199 -0
  146. package/themes/gaming-streamer/THEME.md +139 -0
  147. package/themes/gaming-streamer/tokens.ts +201 -0
  148. package/themes/glassmorphic-modern/THEME.md +119 -0
  149. package/themes/glassmorphic-modern/tokens.ts +174 -0
  150. package/themes/government-civic/THEME.md +138 -0
  151. package/themes/government-civic/tokens.ts +164 -0
  152. package/themes/gym-chain/THEME.md +79 -0
  153. package/themes/gym-chain/tokens.ts +196 -0
  154. package/themes/healthcare-bright/THEME.md +95 -0
  155. package/themes/healthcare-bright/tokens.ts +184 -0
  156. package/themes/home-decor/THEME.md +94 -0
  157. package/themes/home-decor/tokens.ts +177 -0
  158. package/themes/hotel-boutique/THEME.md +110 -0
  159. package/themes/hotel-boutique/tokens.ts +179 -0
  160. package/themes/hyperminimal-mono/THEME.md +91 -0
  161. package/themes/hyperminimal-mono/tokens.ts +150 -0
  162. package/themes/indie-art-game/THEME.md +107 -0
  163. package/themes/indie-art-game/tokens.ts +216 -0
  164. package/themes/insurance-legacy/THEME.md +101 -0
  165. package/themes/insurance-legacy/tokens.ts +182 -0
  166. package/themes/insurance-modern/THEME.md +103 -0
  167. package/themes/insurance-modern/tokens.ts +192 -0
  168. package/themes/kaiju-reveal/THEME.md +97 -0
  169. package/themes/kaiju-reveal/tokens.ts +185 -0
  170. package/themes/kinetic-data/THEME.md +172 -0
  171. package/themes/kinetic-data/tailwind.snippet.ts +16 -0
  172. package/themes/kinetic-data/theme.yml +207 -0
  173. package/themes/kinetic-data/tokens.ts +30 -0
  174. package/themes/kinetic-headline/BUILD_BRIEF.md +156 -0
  175. package/themes/kinetic-headline/THEME.md +78 -0
  176. package/themes/kinetic-headline/tailwind.snippet.ts +16 -0
  177. package/themes/kinetic-headline/theme.yml +81 -0
  178. package/themes/kinetic-headline/tokens.ts +26 -0
  179. package/themes/law-firm/THEME.md +108 -0
  180. package/themes/law-firm/tokens.ts +158 -0
  181. package/themes/lawtech-modern/THEME.md +107 -0
  182. package/themes/lawtech-modern/tokens.ts +192 -0
  183. package/themes/linkedin-pro/THEME.md +102 -0
  184. package/themes/linkedin-pro/tokens.ts +174 -0
  185. package/themes/logistics-modern/THEME.md +94 -0
  186. package/themes/logistics-modern/tokens.ts +187 -0
  187. package/themes/magazine-glossy/THEME.md +74 -0
  188. package/themes/magazine-glossy/tokens.ts +158 -0
  189. package/themes/marker-mag/THEME.md +128 -0
  190. package/themes/marker-mag/tailwind.snippet.ts +15 -0
  191. package/themes/marker-mag/theme.yml +159 -0
  192. package/themes/marker-mag/tokens.ts +27 -0
  193. package/themes/marketplace-modern/THEME.md +135 -0
  194. package/themes/marketplace-modern/tokens.ts +186 -0
  195. package/themes/marketplace-vintage/THEME.md +110 -0
  196. package/themes/marketplace-vintage/tokens.ts +185 -0
  197. package/themes/maximalist/THEME.md +96 -0
  198. package/themes/maximalist/tokens.ts +168 -0
  199. package/themes/mid-century/THEME.md +109 -0
  200. package/themes/mid-century/tokens.ts +162 -0
  201. package/themes/motorcycle-brand/THEME.md +86 -0
  202. package/themes/motorcycle-brand/tokens.ts +174 -0
  203. package/themes/museum/THEME.md +83 -0
  204. package/themes/museum/tokens.ts +147 -0
  205. package/themes/music-streaming/THEME.md +101 -0
  206. package/themes/music-streaming/tokens.ts +187 -0
  207. package/themes/music-vinyl/THEME.md +98 -0
  208. package/themes/music-vinyl/tokens.ts +167 -0
  209. package/themes/nature-distilled/BUILD_BRIEF.md +158 -0
  210. package/themes/nature-distilled/THEME.md +81 -0
  211. package/themes/nature-distilled/tailwind.snippet.ts +16 -0
  212. package/themes/nature-distilled/theme.yml +91 -0
  213. package/themes/nature-distilled/tokens.ts +26 -0
  214. package/themes/news-tabloid/THEME.md +72 -0
  215. package/themes/news-tabloid/tokens.ts +158 -0
  216. package/themes/news-tech/THEME.md +75 -0
  217. package/themes/news-tech/tokens.ts +149 -0
  218. package/themes/newsletter/THEME.md +82 -0
  219. package/themes/newsletter/tokens.ts +138 -0
  220. package/themes/newspaper-classic/THEME.md +74 -0
  221. package/themes/newspaper-classic/tokens.ts +159 -0
  222. package/themes/nonprofit-arts/THEME.md +78 -0
  223. package/themes/nonprofit-arts/tokens.ts +157 -0
  224. package/themes/nonprofit-warm/THEME.md +105 -0
  225. package/themes/nonprofit-warm/tokens.ts +188 -0
  226. package/themes/outdoor-adventure/THEME.md +113 -0
  227. package/themes/outdoor-adventure/tokens.ts +181 -0
  228. package/themes/overland-broadside/THEME.md +119 -0
  229. package/themes/overland-broadside/tailwind.snippet.ts +17 -0
  230. package/themes/overland-broadside/theme.yml +138 -0
  231. package/themes/overland-broadside/tokens.ts +27 -0
  232. package/themes/performance-engineered/THEME.md +162 -0
  233. package/themes/performance-engineered/tailwind.snippet.ts +15 -0
  234. package/themes/performance-engineered/theme.yml +193 -0
  235. package/themes/performance-engineered/tokens.ts +29 -0
  236. package/themes/pet-food/THEME.md +78 -0
  237. package/themes/pet-food/tokens.ts +185 -0
  238. package/themes/pharma-clinical/THEME.md +164 -0
  239. package/themes/pharma-clinical/tailwind.snippet.ts +15 -0
  240. package/themes/pharma-clinical/theme.yml +201 -0
  241. package/themes/pharma-clinical/tokens.ts +29 -0
  242. package/themes/pill-editorial/THEME.md +125 -0
  243. package/themes/pill-editorial/tailwind.snippet.ts +15 -0
  244. package/themes/pill-editorial/theme.yml +168 -0
  245. package/themes/pill-editorial/tokens.ts +31 -0
  246. package/themes/podcast-warm/THEME.md +103 -0
  247. package/themes/podcast-warm/tokens.ts +192 -0
  248. package/themes/publisher-indie/THEME.md +78 -0
  249. package/themes/publisher-indie/tokens.ts +148 -0
  250. package/themes/raw-concrete/BUILD_BRIEF.md +157 -0
  251. package/themes/raw-concrete/THEME.md +76 -0
  252. package/themes/raw-concrete/tailwind.snippet.ts +16 -0
  253. package/themes/raw-concrete/theme.yml +88 -0
  254. package/themes/raw-concrete/tokens.ts +27 -0
  255. package/themes/realestate-luxury/THEME.md +94 -0
  256. package/themes/realestate-luxury/tokens.ts +169 -0
  257. package/themes/realestate-marketplace/THEME.md +106 -0
  258. package/themes/realestate-marketplace/tokens.ts +183 -0
  259. package/themes/restaurant-modern/THEME.md +109 -0
  260. package/themes/restaurant-modern/tokens.ts +172 -0
  261. package/themes/runway-fashion/THEME.md +99 -0
  262. package/themes/runway-fashion/tokens.ts +167 -0
  263. package/themes/saturday-morning/THEME.md +117 -0
  264. package/themes/saturday-morning/tokens.ts +281 -0
  265. package/themes/schema.ts +235 -0
  266. package/themes/signal-dark/BUILD_BRIEF.md +168 -0
  267. package/themes/signal-dark/THEME.md +107 -0
  268. package/themes/signal-dark/tokens.ts +181 -0
  269. package/themes/soft-modern/THEME.md +91 -0
  270. package/themes/soft-modern/tokens.ts +166 -0
  271. package/themes/solar-residential/THEME.md +92 -0
  272. package/themes/solar-residential/tokens.ts +176 -0
  273. package/themes/sports-league/THEME.md +180 -0
  274. package/themes/sports-league/tailwind.snippet.ts +15 -0
  275. package/themes/sports-league/theme.yml +213 -0
  276. package/themes/sports-league/tokens.ts +32 -0
  277. package/themes/stadium-sport/THEME.md +114 -0
  278. package/themes/stadium-sport/tokens.ts +187 -0
  279. package/themes/streetwear-hype/THEME.md +100 -0
  280. package/themes/streetwear-hype/tokens.ts +174 -0
  281. package/themes/studio-architect/THEME.md +108 -0
  282. package/themes/studio-architect/tokens.ts +162 -0
  283. package/themes/studio-photographer/THEME.md +88 -0
  284. package/themes/studio-photographer/tokens.ts +164 -0
  285. package/themes/team-kanban/THEME.md +167 -0
  286. package/themes/team-kanban/tailwind.snippet.ts +15 -0
  287. package/themes/team-kanban/theme.yml +209 -0
  288. package/themes/team-kanban/tokens.ts +35 -0
  289. package/themes/telehealth-modern/THEME.md +95 -0
  290. package/themes/telehealth-modern/tokens.ts +197 -0
  291. package/themes/tourism-board/THEME.md +111 -0
  292. package/themes/tourism-board/tokens.ts +173 -0
  293. package/themes/toys-modern/THEME.md +79 -0
  294. package/themes/toys-modern/tokens.ts +200 -0
  295. package/themes/travel-luxury/THEME.md +95 -0
  296. package/themes/travel-luxury/tokens.ts +162 -0
  297. package/themes/vacation-rental/THEME.md +105 -0
  298. package/themes/vacation-rental/tokens.ts +174 -0
  299. package/themes/vault-reel/THEME.md +134 -0
  300. package/themes/vault-reel/tailwind.snippet.ts +16 -0
  301. package/themes/vault-reel/theme.yml +167 -0
  302. package/themes/vault-reel/tokens.ts +30 -0
  303. package/themes/vet-modern/THEME.md +79 -0
  304. package/themes/vet-modern/tokens.ts +194 -0
  305. package/themes/web3-restraint/THEME.md +87 -0
  306. package/themes/web3-restraint/tokens.ts +154 -0
  307. package/themes/wellness-active/THEME.md +102 -0
  308. package/themes/wellness-active/tokens.ts +203 -0
  309. package/themes/wellness-spa/THEME.md +93 -0
  310. package/themes/wellness-spa/tokens.ts +173 -0
  311. package/themes/y2k-chrome/THEME.md +118 -0
  312. package/themes/y2k-chrome/tokens.ts +249 -0
  313. package/themes/yoga-studio/THEME.md +76 -0
  314. package/themes/yoga-studio/tokens.ts +163 -0
@@ -0,0 +1,202 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const agencyCreative: Direction = {
4
+ name: "agency-creative",
5
+ ethos:
6
+ "Ueno saturated gradients · Bruno Simon playful 3D · Locomotive smooth-scroll cinema · Active Theory custom motion · Resn unexpected interaction",
7
+ references: [
8
+ { brand: "Ueno", trait: "saturated gradients, custom display type, experimental layout" },
9
+ { brand: "Bruno Simon (portfolio)", trait: "3D-car driving experience, playful WebGL surface" },
10
+ { brand: "Locomotive", trait: "smooth-scroll cinema, bold display typography" },
11
+ { brand: "Active Theory", trait: "heavy motion choreography, custom 3D scenes" },
12
+ { brand: "Resn", trait: "weird-cool unexpected interactions, custom cursor" },
13
+ ],
14
+ feel:
15
+ "Loud, gradient-saturated, motion-forward — a portfolio that performs as you scroll. " +
16
+ "Custom cursor, marquee headlines at viewport scale, gradient skies that bleed across sections, " +
17
+ "and one-of-one 3D moments that earn their weight. Confident weirdness, not chaos: the rules are " +
18
+ "broken on purpose, with a designer's hand visible in every transition.",
19
+
20
+ fonts: {
21
+ display: {
22
+ family: "Fraunces",
23
+ fallback: ["Recoleta", "Tiempos Headline", "Cooper", "Georgia", "serif"],
24
+ from: "Ueno-flavored expressive serif — quirky optical sizes, the agency display voice",
25
+ googleFont: "Fraunces",
26
+ weights: [400, 700, 900],
27
+ },
28
+ body: {
29
+ family: "Plus Jakarta Sans",
30
+ fallback: ["Inter", "system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
31
+ from: "modern geometric sans with personality — Locomotive case-study body type",
32
+ googleFont: "Plus+Jakarta+Sans",
33
+ weights: [400, 500, 600, 800],
34
+ },
35
+ mono: {
36
+ family: "JetBrains Mono",
37
+ fallback: ["Berkeley Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
38
+ from: "Resn/Active Theory dev-console mono — debug labels, scroll-percent overlays, timestamps",
39
+ googleFont: "JetBrains+Mono",
40
+ weights: [400, 500, 700],
41
+ },
42
+ },
43
+
44
+ typography: {
45
+ headingTracking: "-0.04em", // tight, almost crushed — display serif at scale wants compression
46
+ bodyTracking: "0",
47
+ fontFeatureSettings: '"ss01", "ss02", "ss03", "liga", "dlig"',
48
+ h1ScaleClamp: "clamp(4rem, 14vw, 12rem)", // viewport-scale headlines, Ueno-large
49
+ bodyBaseSize: "1.0625rem",
50
+ bodyLineHeight: "1.5",
51
+ },
52
+
53
+ colors: {
54
+ background: { hsl: "240 18% 6%", from: "Active Theory near-black — deep cool ink, canvas for gradients" },
55
+ foreground: { hsl: "48 100% 96%", from: "warm bone — Ueno cream-on-dark headline color" },
56
+ card: { hsl: "240 16% 10%", from: "elevated panel one stop above ink" },
57
+ popover: { hsl: "240 14% 12%", from: "menu/cursor-overlay surface" },
58
+ primary: { hsl: "320 100% 62%", from: "= brand.hot-pink — Resn signal pink, the principal action" },
59
+ primaryForeground: { hsl: "240 18% 6%", from: "ink on hot-pink" },
60
+ secondary: { hsl: "280 90% 60%", from: "= brand.electric-violet — Ueno gradient counterpoint" },
61
+ secondaryForeground: { hsl: "48 100% 96%", from: "bone on violet" },
62
+ muted: { hsl: "240 12% 16%", from: "muted panel — quiet ground for dense case-study captions" },
63
+ mutedForeground: { hsl: "240 10% 70%", from: "cool gray secondary text — dev-console label tone" },
64
+ accent: { hsl: "180 95% 55%", from: "= brand.cyber-cyan — Bruno Simon UI-overlay accent" },
65
+ accentForeground: { hsl: "240 18% 6%", from: "ink on cyan" },
66
+ border: { hsl: "240 12% 20%", from: "thin neutral border — barely visible, lets gradients carry edges" },
67
+ input: { hsl: "240 12% 20%", from: "same as border — uniform hairline language" },
68
+ ring: { hsl: "320 100% 62%", from: "hot-pink — focus is the brand-signal color" },
69
+ destructive: { hsl: "8 90% 58%", from: "alarm red — distinct from pink primary so warnings don't blur" },
70
+ destructiveForeground: { hsl: "48 100% 96%", from: "bone on alarm red" },
71
+ brand: {
72
+ "hot-pink": { hsl: "320 100% 62%", from: "= primary; Resn signal pink — the gradient anchor" },
73
+ "electric-violet": { hsl: "280 90% 60%", from: "= secondary; Ueno violet — gradient mid-stop" },
74
+ "cyber-cyan": { hsl: "180 95% 55%", from: "= accent; Bruno Simon HUD cyan — interactive highlight" },
75
+ "acid-lime": { hsl: "75 95% 60%", from: "Active Theory lime — unexpected punch, scroll-progress fill" },
76
+ "sunset-orange": { hsl: "20 100% 60%", from: "Locomotive sunset orange — gradient warm stop" },
77
+ ink: { hsl: "240 18% 6%", from: "= background; the deep ink canvas, also a semantic token" },
78
+ bone: { hsl: "48 100% 96%", from: "= foreground; warm bone — never pure white" },
79
+ },
80
+ },
81
+
82
+ spacing: {
83
+ base: 4,
84
+ scale: [4, 8, 12, 16, 24, 32, 48, 64, 96, 128, 160, 240], // generous — viewport-scale compositions
85
+ containerMax: "max-w-[1440px]", // wide — full-bleed hero and 3D scenes need the room
86
+ containerPadding: "px-6 lg:px-12",
87
+ sectionPadding: {
88
+ hero: "pt-32 pb-24 lg:pt-48 lg:pb-40",
89
+ default: "py-24 lg:py-40",
90
+ tight: "py-16 lg:py-24",
91
+ },
92
+ },
93
+
94
+ radius: {
95
+ base: "1rem", // generous rounding on cards and chips — playful, friendly
96
+ pillsAllowed: true, // pill CTAs are part of the language — gradient-filled
97
+ },
98
+
99
+ shadows: {
100
+ style: "glow",
101
+ utilities: {
102
+ "glow-pink":
103
+ "0 0 0 1px hsl(var(--hot-pink) / 0.4), " +
104
+ "0 12px 32px hsl(var(--hot-pink) / 0.28), " +
105
+ "0 60px 160px hsl(var(--hot-pink) / 0.32)",
106
+ "glow-cyan":
107
+ "0 0 0 1px hsl(var(--cyber-cyan) / 0.4), " +
108
+ "0 12px 32px hsl(var(--cyber-cyan) / 0.28), " +
109
+ "0 60px 160px hsl(var(--cyber-cyan) / 0.32)",
110
+ "gradient-skin":
111
+ "linear-gradient(135deg, hsl(var(--hot-pink)) 0%, hsl(var(--electric-violet)) 50%, hsl(var(--cyber-cyan)) 100%)",
112
+ },
113
+ },
114
+
115
+ motion: {
116
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
117
+ durations: {
118
+ reveal: 700, // page transitions and hover swaps — fast enough to feel responsive
119
+ loop: 4000, // ambient gradient/blob loops
120
+ ambient: 24000, // long scroll-tied scenes and rotating 3D
121
+ },
122
+ keyframes: {
123
+ "gradient-shift": {
124
+ css:
125
+ "0% { background-position: 0% 50%; }\n" +
126
+ "50% { background-position: 100% 50%; }\n" +
127
+ "100% { background-position: 0% 50%; }",
128
+ defaultDuration: 12000,
129
+ iteration: "infinite",
130
+ purpose: "background gradient drift on hero — Ueno sky, never static",
131
+ },
132
+ "blob-morph": {
133
+ css:
134
+ "0%, 100% { border-radius: 42% 58% 70% 30% / 45% 30% 70% 55%; transform: translate(0,0) rotate(0deg); }\n" +
135
+ "33% { border-radius: 70% 30% 50% 50% / 30% 60% 40% 70%; transform: translate(8%,-4%) rotate(20deg); }\n" +
136
+ "66% { border-radius: 30% 70% 35% 65% / 60% 40% 60% 40%; transform: translate(-6%,6%) rotate(-15deg); }",
137
+ defaultDuration: 14000,
138
+ iteration: "infinite",
139
+ purpose: "floating gradient blobs behind hero — Resn-style organic background motion",
140
+ },
141
+ "marquee": {
142
+ css:
143
+ "from { transform: translateX(0); }\n" +
144
+ "to { transform: translateX(-50%); }",
145
+ defaultDuration: 18000,
146
+ iteration: "infinite",
147
+ purpose: "Locomotive headline marquee — viewport-scale display type scrolling sideways",
148
+ },
149
+ "cursor-pulse": {
150
+ css:
151
+ "0%, 100% { transform: scale(1); opacity: 0.9; }\n" +
152
+ "50% { transform: scale(1.6); opacity: 0.4; }",
153
+ defaultDuration: 1400,
154
+ iteration: "infinite",
155
+ purpose: "custom-cursor halo — the cursor is a UI element, not the OS arrow",
156
+ },
157
+ "scroll-reveal": {
158
+ css:
159
+ "from { opacity: 0; transform: translateY(80px) scale(0.98); }\n" +
160
+ "to { opacity: 1; transform: translateY(0) scale(1); }",
161
+ defaultDuration: 800,
162
+ iteration: "once",
163
+ purpose: "case-study entrance — fires as a section enters the viewport",
164
+ },
165
+ "tilt-hover": {
166
+ css:
167
+ "0% { transform: perspective(800px) rotateX(0) rotateY(0); }\n" +
168
+ "100% { transform: perspective(800px) rotateX(-6deg) rotateY(8deg); }",
169
+ defaultDuration: 500,
170
+ iteration: "once",
171
+ purpose: "card 3D tilt on hover — Active Theory mouse-tracked parallax",
172
+ },
173
+ },
174
+ respectsReducedMotion: true,
175
+ },
176
+
177
+ density: "low",
178
+
179
+ patterns: {
180
+ button:
181
+ "Two registers. (1) Pill CTA filled with gradient-skin utility (pink → violet → cyan), bone text, glow-pink on hover. " +
182
+ "(2) Outline pill, 1px border, foreground text, fills with hot-pink on hover. " +
183
+ "Buttons animate scale(1.03) and tilt-hover on pointer-enter. Never a flat ghost button — every CTA carries either gradient or motion.",
184
+ card:
185
+ "Rounded 1rem corners, bg-card, hairline border. Feature cards get glow-pink or glow-cyan and tilt-hover on pointer. " +
186
+ "Internal padding p-8 lg:p-12. Case-study cards are full-bleed image with display-serif title overlay, " +
187
+ "saturated duotone treatment (pink/violet) on hover.",
188
+ input:
189
+ "Rounded 1rem, bg-card, 1px border. Label sits above in mono uppercase, tracking 0.08em. " +
190
+ "Focus shifts border to hot-pink and adds 4px hot-pink/20 outer ring. Pill-shaped for search and email-capture.",
191
+ cta:
192
+ "Gradient-skin pill is the canonical hero CTA. Scroll-tied marquee headlines double as ambient CTAs. " +
193
+ "Never a plain rect — and never more than one gradient-skin button per fold.",
194
+ },
195
+
196
+ details: {
197
+ selectionBg: "hsl(var(--acid-lime) / 0.45)",
198
+ selectionFg: "hsl(var(--ink))",
199
+ focusRing: "2px solid hsl(var(--ring))",
200
+ scrollbarStyle: "none",
201
+ },
202
+ };
@@ -0,0 +1,109 @@
1
+ # Design Direction — Agency-Portfolio
2
+
3
+ ## Ethos
4
+ Pentagram severity · Collins editorial cream · Mucca Fraunces restraint · JKR brand-mark sharpness · Order cinematic case studies
5
+
6
+ ## Feel
7
+ Top-tier brand-agency portfolio energy. Severe restraint, oversized headline type, full-bleed case-study photography, near-mono palette with one cream warmth. The page says *we don't need to advertise our talent* — the work is the argument. Reads like Pentagram.com or the Collins case-study index, not like a startup landing page.
8
+
9
+ ## Reference brands
10
+ - **Pentagram** → severe black-and-white, oversized type, brand-mark-first composition. The grid is invisible; the typography is the structure.
11
+ - **Collins** → deep cream canvas, serif display, structured grid. Warmth without softness.
12
+ - **Mucca Design** → cream paper, Fraunces, editorial restraint. Magazine pacing for case studies.
13
+ - **Jones Knowles Ritchie** → sharp black, Plus Jakarta body, brand-mark-first hero. The logo wall replaces the headline.
14
+ - **Order (NYC)** → restraint paired with cinematic case studies. Restraint applies to chrome, never to imagery.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin — untraceable tokens fail review.
18
+
19
+ Surface stack is **deep cream** (background) → **lighter cream** (card) → **deeper cream** (secondary/muted/accent). Three cream stops, full stop. Depth comes from **1px ink hairlines and full-bleed photography**, never from fill differentiation.
20
+
21
+ Brand tokens: `--ink` (Pentagram near-black `0 0% 7%`), `--cream` (Collins paper, `=background`), `--cream-deep` (Mucca shadow, `=secondary`), `--vermilion` (Pentagram editorial red, `=ring`), `--caption-gray` (project-metadata gray, `=mutedForeground`).
22
+
23
+ Primary is **ink itself** — JKR brand-mark-first stance. There is no decorative accent color for hierarchy; the studio name is the only mark that gets a fill. Vermilion is reserved for **focus, destructive, and exactly one accent moment per page** (a pull-quote underline, a single chart label, a project-status dot — never a button face).
24
+
25
+ Pure white and pure black are forbidden — `--cream` and `--ink` replace them.
26
+
27
+ ## Typography
28
+ - **Display:** Fraunces (Mucca / Collins move — high-contrast serif with optical sizing). Weights 400/500/700/900. Use the `opsz` axis at the headline tier; default `9` for body-adjacent labels. h1–h4.
29
+ - **Body:** Plus Jakarta Sans (JKR / Pentagram default-sans). Weights 400/500/600/700. **17px**, line-height **1.55** — magazine-comfortable without preciousness.
30
+ - **Mono:** JetBrains Mono. Case-study metadata only — project number, year, role, client, medium. Mono is the studio's marginalia voice; it is not for code blocks here.
31
+
32
+ H1 uses `clamp(3.5rem, 11vw, 9rem)` — oversized, the headline IS the case-study cover. Tracking `-0.025em` on display (Fraunces needs the squeeze for Pentagram-tight headlines). Body tracking `0`. Font features: `"ss01", "ss02", "calt", "liga"` for Fraunces stylistic sets and Plus Jakarta alternates.
33
+
34
+ ## Spacing
35
+ - **Container:** `max-w-7xl px-6 lg:px-12` — wide. Case-study photography demands full-bleed neighbors; a 3xl container reads blog, not studio.
36
+ - **Section padding tiers:**
37
+ - Hero: `pt-32 pb-24 lg:pt-48 lg:pb-32` — the title block breathes; Pentagram pages don't rush.
38
+ - Default: `py-24 lg:py-40`
39
+ - Tight: `py-16 lg:py-24`
40
+ - **Allowed scale values:** 4 8 12 16 20 24 32 48 64 96 128 192. Wide gulf between small detail (caption-to-headline gap) and section breath (case-study to case-study).
41
+
42
+ ## Color
43
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token, not via new tokens.
44
+
45
+ Three cream stops + ink + vermilion is the entire system. If a new color is proposed, the answer is *the photograph above it is the color* — case-study imagery brings the palette into the page. The shell stays mono.
46
+
47
+ ## Radius
48
+ `--radius: 0`. **Sharp corners only.** `pillsAllowed: false` — pills read SaaS dashboard. This is editorial language. Tags, status, dates: all sharp rectangles or plain text.
49
+
50
+ ## Shadows
51
+ **Minimal.** Two utilities, both 1px ink hairlines:
52
+ - `.hairline-bottom` — inset 0 -1px 0 0 `--border`. Column divider, case-study tile foot.
53
+ - `.hairline-top` — inset 0 1px 0 0 `--border`. Section opener rule, paired with date metadata.
54
+
55
+ No drop shadows. No glows. No box-shadows. The hairline IS the depth language.
56
+
57
+ ## Motion
58
+ Two keyframes:
59
+ - `fade-rise` (1200ms once) — opacity + 24px translate. Section entrance for case-study title cards and image reveals. **Deliberately slow** — the page settles, it does not perform.
60
+ - `ken-burns-slow` (28000ms infinite) — scale 1.03 → 1.12 with a tiny translate. Hero case-study photography drift. Restrained camera push, never Hollywood.
61
+
62
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` honored — both keyframes drop to a static frame inside the media query. No marquees, no parallax, no scroll-triggered choreography. The restraint applies to motion as it applies to color.
63
+
64
+ ## Component patterns
65
+ - **Buttons:** text-link primaries with the `hairline-bottom` utility — underline-on-hover in ink. The **single hero action per case study** may render solid: full ink-fill rectangle, cream text, sharp corners. Never vermilion on a button face — vermilion is the focus and accent reserve.
66
+ - **Cards:** hairline top + bottom borders, no fill differentiation from page. Case-study tile padding `p-8 lg:p-12`. Title in Fraunces display at near-h2 scale; metadata row in mono `--caption-gray` formatted *YEAR · ROLE · CLIENT*. The photograph below the title is the only decoration — no shadow, no radius, no fill.
67
+ - **Inputs:** border-bottom only (1px `--ink`), bg-transparent. Label sits above in **mono uppercase tracking-[0.12em]**. Placeholder italic in `--caption-gray`. Focus shifts the border to the vermilion ring — the only warm touch on the form.
68
+ - **CTAs:** text-link primaries with hairline underline; one solid ink-fill rectangle permitted per case study as the hero action. CTA copy in **display serif, not body sans** — the CTA carries the same voice as the headline above it.
69
+
70
+ ## Recommended rich media
71
+ The work is the website. Case-study photography is the primary asset — and the standard is high.
72
+
73
+ **Cover imagery.** Full-bleed 21:9 or 4:5 photography of brand-identity work: packaging on a seamless backdrop, signage in situ, editorial spreads on a kitchen table, product close-ups under raking light. The image always touches the screen edges; padding around case-study photography reads timid.
74
+
75
+ **Color grading.** Color is preserved from the original work — agency portfolios do not impose a uniform grade across case studies. Each project keeps its native palette; the shell's cream-and-ink restraint is what makes the projects' colors readable.
76
+
77
+ **AI tool recommendations.**
78
+ - **Midjourney / Flux** with prompts like *"Pentagram case study photography, seamless paper backdrop, raking light, 100mm macro, packaging hero"* for product stills you cannot photograph.
79
+ - **Recraft** for vector mockups of identity systems (logo, type specimen, color block).
80
+ - **Topaz Photo AI** for upscaling existing case-study photography to retina full-bleed sizes.
81
+ - Avoid Midjourney's default "epic cinematic" preset — explicitly prompt for studio lighting and a seamless backdrop. The look is *commercial photographer's portfolio*, not *movie poster*.
82
+
83
+ **Aspect ratios.** 21:9 for hero case-study covers (cinematic editorial), 4:5 for detail crops (Pentagram inside-spread feel), 1:1 only for signage-on-architecture or single-object hero shots. Never 16:9 — that reads tech keynote.
84
+
85
+ **Performance.** Case-study hero ≤200 KB AVIF at 2000w; inline figures ≤100 KB. LCP under 2.2s with a single hero. Lazy-load every case-study tile below the fold — the index page often holds 12+ heroes and the network budget is the constraint.
86
+
87
+ **Avoid:**
88
+ - Stock photography (a brand-agency portfolio with stock disqualifies itself).
89
+ - Soft drop shadows on product cutouts — Pentagram and Collins use full-bleed environmental shots, not cutout-on-cream.
90
+ - Glassmorphic anything.
91
+ - Decorative SVG ornament (swooshes, dots, abstract gradients) — vermilion is the only accent, and it's never decorative.
92
+ - Video that autoplays in the case-study index (case-study *detail* pages may use a 4MB H.265 hero loop with poster fallback; the index never does).
93
+ - Logo walls rendered as monochrome grayscale stamps — JKR puts real client logos at full color on the cream, sized down. Restraint applies to the shell, never to the client work.
94
+
95
+ **Accessibility.** Long-form alt-text on every case-study image — describe the project AND the photograph as if for a blind reader. *"Image: packaging for Aesop, three apothecary bottles on a walnut surface, soft north light from camera left"* is the bar.
96
+
97
+ ## Component families
98
+ None at install time. Likely first families: `CaseStudyTile` (cover image + Fraunces title + mono metadata row), `IndexGrid` (12-column ink-rule case-study index), `ClientWall` (full-color logo grid on cream), `PullQuote` (Fraunces display with vermilion underline — the one accent moment).
99
+
100
+ ## Details
101
+ - **Selection:** `hsl(var(--ring) / 0.22)` background, foreground text. Vermilion at low opacity — the page's only warm wash.
102
+ - **Focus ring:** `1px solid hsl(var(--ring))`. Thin vermilion. Quiet, single warm signal.
103
+ - **Scrollbar:** thin.
104
+
105
+ ## Exceptions
106
+ None yet. When an intentional one-of-one violation lands, add it here with the reason.
107
+
108
+ ## Revisions
109
+ - Initial direction, generated at install time.
@@ -0,0 +1,159 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ export const agencyPortfolio: Direction = {
4
+ name: "agency-portfolio",
5
+ ethos:
6
+ "Pentagram severity · Collins editorial cream · Mucca Fraunces restraint · JKR brand-mark sharpness · Order cinematic case studies",
7
+ references: [
8
+ { brand: "Pentagram", trait: "severe black-and-white, Helvetica, giant type" },
9
+ { brand: "Collins", trait: "deep cream, serif display, structured grid" },
10
+ { brand: "Mucca Design", trait: "cream paper, Fraunces, editorial restraint" },
11
+ { brand: "Jones Knowles Ritchie", trait: "sharp black, Plus Jakarta, brand-mark first" },
12
+ { brand: "Order (NYC)", trait: "restraint plus cinematic case studies" },
13
+ ],
14
+ feel:
15
+ "Top-tier brand-agency portfolio energy. Severe restraint, oversized headline type, " +
16
+ "full-bleed case-study photography, near-mono palette with one cream warmth. The page " +
17
+ "says we don't need to advertise our talent — the work is the argument.",
18
+
19
+ fonts: {
20
+ display: {
21
+ family: "Fraunces",
22
+ fallback: ["Tiempos Headline", "Canela", "GT Sectra", "Georgia", "serif"],
23
+ from: "Mucca / Collins move — high-contrast serif with optical sizing, editorial weight without preciousness",
24
+ googleFont: "Fraunces:opsz,wght@9..144,400;9..144,500;9..144,700;9..144,900",
25
+ weights: [400, 500, 700, 900],
26
+ },
27
+ body: {
28
+ family: "Plus Jakarta Sans",
29
+ fallback: ["Inter", "Helvetica Neue", "Helvetica", "Arial", "system-ui", "sans-serif"],
30
+ from: "JKR / Pentagram default-sans body — neutral grotesk that disappears under the serif",
31
+ googleFont: "Plus+Jakarta+Sans",
32
+ weights: [400, 500, 600, 700],
33
+ },
34
+ mono: {
35
+ family: "JetBrains Mono",
36
+ fallback: ["IBM Plex Mono", "ui-monospace", "SFMono-Regular", "Menlo", "monospace"],
37
+ from: "case-study metadata — project number, year, role; mono is the studio's marginalia voice",
38
+ googleFont: "JetBrains+Mono",
39
+ weights: [400, 500],
40
+ },
41
+ },
42
+
43
+ typography: {
44
+ headingTracking: "-0.025em", // Fraunces display needs the squeeze — Pentagram-tight headlines
45
+ bodyTracking: "0",
46
+ fontFeatureSettings: '"ss01", "ss02", "calt", "liga"', // Fraunces stylistic sets + Plus Jakarta alternates
47
+ h1ScaleClamp: "clamp(3.5rem, 11vw, 9rem)", // oversized — the headline is the case-study cover
48
+ bodyBaseSize: "1.0625rem", // 17px — slightly above default, magazine-comfortable
49
+ bodyLineHeight: "1.55",
50
+ },
51
+
52
+ colors: {
53
+ background: { hsl: "36 20% 94%", from: "Collins / Mucca deep cream — warm paper, not white; the page is a sheet" },
54
+ foreground: { hsl: "0 0% 7%", from: "Pentagram near-black — ink, never pure 0; gives the cream room to glow" },
55
+ card: { hsl: "36 20% 97%", from: "lighter cream — case-study tile sits a half-stop above the page" },
56
+ popover: { hsl: "36 20% 97%", from: "same as card; depth comes from hairline borders, not fill" },
57
+ primary: { hsl: "0 0% 7%", from: "ink as the primary — JKR brand-mark-first stance, no decorative accent color" },
58
+ primaryForeground: { hsl: "36 20% 94%", from: "cream on ink — full-bleed inverted blocks" },
59
+ secondary: { hsl: "36 14% 88%", from: "deeper cream — tag rows, footer band, secondary surfaces" },
60
+ secondaryForeground: { hsl: "0 0% 7%", from: "ink on deeper cream" },
61
+ muted: { hsl: "36 14% 88%", from: "same as secondary — restraint refuses to invent extra surfaces" },
62
+ mutedForeground: { hsl: "0 0% 38%", from: "Pentagram caption gray — bylines, year, role labels" },
63
+ accent: { hsl: "36 14% 88%", from: "same as secondary — hover is a half-stop, never a new hue" },
64
+ accentForeground: { hsl: "0 0% 7%", from: "ink on hover surface" },
65
+ border: { hsl: "0 0% 7%", from: "ink hairline — every rule on the page is a 1px ink line" },
66
+ input: { hsl: "0 0% 7%", from: "same as border — inputs are border-bottom ink rules" },
67
+ ring: { hsl: "12 75% 48%", from: "Pentagram editorial vermilion — focus only; the single warm signal" },
68
+ destructive: { hsl: "12 75% 48%", from: "same vermilion — destructive shares the focus color; one warm tone in the whole palette" },
69
+ destructiveForeground: { hsl: "36 20% 94%", from: "cream on vermilion" },
70
+ brand: {
71
+ ink: { hsl: "0 0% 7%", from: "= foreground; the Pentagram near-black, named for case-study inverted blocks" },
72
+ cream: { hsl: "36 20% 94%", from: "= background; the Collins deep cream, named for surface inversions" },
73
+ "cream-deep": { hsl: "36 14% 88%", from: "= secondary; the Mucca paper-shadow tone" },
74
+ vermilion: { hsl: "12 75% 48%", from: "Pentagram editorial red — focus, destructive, and exactly one accent moment per page" },
75
+ "caption-gray": { hsl: "0 0% 38%", from: "= mutedForeground; project-metadata gray, used for year/role/medium captions" },
76
+ },
77
+ },
78
+
79
+ spacing: {
80
+ base: 4,
81
+ scale: [4, 8, 12, 16, 20, 24, 32, 48, 64, 96, 128, 192], // wide gulf between small detail and section breath
82
+ containerMax: "max-w-7xl", // wide — case-study photography demands full-bleed neighbors
83
+ containerPadding: "px-6 lg:px-12",
84
+ sectionPadding: {
85
+ hero: "pt-32 pb-24 lg:pt-48 lg:pb-32", // the title block breathes; Pentagram pages don't rush
86
+ default: "py-24 lg:py-40",
87
+ tight: "py-16 lg:py-24",
88
+ },
89
+ },
90
+
91
+ radius: {
92
+ base: "0", // sharp only — agency portfolios do not round corners
93
+ pillsAllowed: false, // pills read SaaS; this language is editorial
94
+ },
95
+
96
+ shadows: {
97
+ style: "minimal",
98
+ utilities: {
99
+ "hairline-bottom":
100
+ "inset 0 -1px 0 0 hsl(var(--border))", // Mucca column divider
101
+ "hairline-top":
102
+ "inset 0 1px 0 0 hsl(var(--border))", // section opener rule, paired with date metadata
103
+ },
104
+ },
105
+
106
+ motion: {
107
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
108
+ durations: {
109
+ reveal: 1200, // slow on purpose — the page settles, it does not perform
110
+ loop: 0, // no loops — restraint forbids ambient cycling
111
+ ambient: 28000, // single ambient: ken-burns on hero case-study photography
112
+ },
113
+ keyframes: {
114
+ "fade-rise": {
115
+ css:
116
+ "from { opacity: 0; transform: translateY(24px); }\n" +
117
+ "to { opacity: 1; transform: translateY(0); }",
118
+ defaultDuration: 1200,
119
+ iteration: "once",
120
+ purpose: "section entrance — case-study title cards and image reveals, deliberately slow",
121
+ },
122
+ "ken-burns-slow": {
123
+ css:
124
+ "0% { transform: scale(1.03) translate(0, 0); }\n" +
125
+ "100% { transform: scale(1.12) translate(-1.5%, -0.5%); }",
126
+ defaultDuration: 28000,
127
+ iteration: "infinite",
128
+ purpose: "hero case-study photography drift — restrained camera push, not Hollywood",
129
+ },
130
+ },
131
+ respectsReducedMotion: true,
132
+ },
133
+
134
+ density: "low",
135
+
136
+ patterns: {
137
+ button:
138
+ "Text-link primaries with the hairline-bottom utility — underline-on-hover in ink. " +
139
+ "The single hero action per case study may render solid: full ink-fill rectangle, cream text, sharp corners. " +
140
+ "Never the vermilion accent on a button face — vermilion is reserved for focus and one accent moment per page.",
141
+ card:
142
+ "Hairline top and bottom borders, no fill differentiation from page. Case-study tile padding p-8 lg:p-12. " +
143
+ "Title in Fraunces display at near-h2 scale; metadata row in mono caption-gray (year · role · client). " +
144
+ "No shadows, no radius, no fill — the photograph below the title is the only decoration.",
145
+ input:
146
+ "Border-bottom only (1px --ink), bg-transparent. Label sits above in mono uppercase tracking 0.12em. " +
147
+ "Placeholder italic in caption-gray. Focus shifts border to vermilion ring — the only warm touch on the form.",
148
+ cta:
149
+ "Text-link primaries with hairline underline; one solid ink-fill rectangle permitted per case study as the hero action. " +
150
+ "CTA copy in display serif, not body sans — the CTA carries the same voice as the headline above it.",
151
+ },
152
+
153
+ details: {
154
+ selectionBg: "hsl(var(--ring) / 0.22)",
155
+ selectionFg: "hsl(var(--foreground))",
156
+ focusRing: "1px solid hsl(var(--ring))", // thin vermilion — quiet, single warm signal
157
+ scrollbarStyle: "thin",
158
+ },
159
+ };
@@ -0,0 +1,95 @@
1
+ # Design Direction — Ai-Startup
2
+
3
+ ## Ethos
4
+ Anthropic cream-and-Tiempos · OpenAI matte restraint · Mistral structured Inter · Inflection soft serif · DeepMind research-paper density
5
+
6
+ ## Feel
7
+ Deep cream paper, formal serif display, structured like a journal preprint. One restrained accent color (rust) used once per section. Long-form headers, byline-and-affiliation metadata, figure captions in mono. The page reads like it could be submitted to NeurIPS. This is the "we publish in peer review" aesthetic — severe restraint as a posture of seriousness.
8
+
9
+ ## Reference brands
10
+ - **Anthropic** → warm cream + Tiempos-feel serif + research-formal restraint. The blueprint for this direction.
11
+ - **OpenAI** → matte cream/black + EB Garamond restraint + structured. Research blog as marketing site.
12
+ - **Mistral** → cream + Inter + structured European tech. Restraint without serif sentimentality.
13
+ - **Inflection** → cream + serif + soft AI restraint. The warmer end of this register.
14
+ - **DeepMind blog** → cream + Source Serif + research-paper density. Affiliations, citations, figure captions as design elements.
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 brand it traces to.
18
+
19
+ Surface stack is **deep cream** (background) → lighter cream (card) → deeper cream (secondary/muted/accent). Depth comes from hairline borders only. Cards are *framed*, not lifted.
20
+
21
+ Brand tokens: `--paper`, `--ink`, `--rust`, `--ink-soft`, `--paper-deep`. Primary is the deep ink — primary action is text-on-paper inversion, not a brand color. Rust is the one allowed accent, used for focus rings and the single hero CTA per page.
22
+
23
+ ## Typography
24
+ - **Display:** EB Garamond (Anthropic Tiempos / OpenAI Garamond). h1–h4, research-formal humanist serif, never decorative. Tracking `-0.015em` — display serifs tighten at scale.
25
+ - **Body:** Inter (Mistral / DeepMind body sans). Body base **17px** with **line-height 1.7** — long-form reading, dense-friendly.
26
+ - **Mono:** JetBrains Mono. Code blocks, model names, figure captions, affiliations — research-paper instrument feel.
27
+
28
+ H1 uses `clamp(2.5rem, 5vw, 4.25rem)` — restrained. Never broadcast scale; this is a paper, not a poster. Numbers always use `font-variant-numeric: tabular-nums`. Font features: `"ss01"`, `"calt"`, `"tnum"`, `"kern"`.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-3xl px-6 lg:px-10` — prose-first. 768px reading column matches Anthropic and DeepMind blog. Wider columns break long-form research flow.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-24 pb-16 lg:pt-40 lg:pb-24` (deliberately oversized — title page energy)
34
+ - Default: `py-20 lg:py-32`
35
+ - Tight: `py-12 lg:py-20`
36
+ - **Allowed scale values:** 4 6 8 12 16 20 24 32 40 48 64 96 128.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens. Opacity via `/N` modifier on token.
40
+
41
+ The palette is paper-and-ink with one allowed accent. Pure white and pure black are forbidden — `--paper` and `--ink` replace them. The rust accent appears **once per major section**: the hero CTA, a single highlighted callout, or the focus ring. Repeated rust reads decorative and breaks the research register.
42
+
43
+ ## Radius
44
+ `--radius: 0.125rem`. Barely-there softening — research-paper, not soft-modern. Pills are disallowed (`pillsAllowed: false`) — pills read consumer-app; research papers use rectangles and rules.
45
+
46
+ ## Shadows
47
+ **Minimal.** Two utilities:
48
+ - `.hairline-bottom` — 1px border-bottom, journal-paper rule
49
+ - `.figure-frame` — 1px border on all sides, no drop. Research figures are framed, never lifted.
50
+
51
+ No drop shadows. No glows. Depth is a hairline or nothing.
52
+
53
+ ## Motion
54
+ Two keyframes — almost as restrained as editorial:
55
+ - `fade-rise` (1000ms) — the primary entrance, section settles into place, no flourish
56
+ - `cursor-blink` (1100ms, infinite) — single allowed loop, terminal-style cursor for ONE demo/prompt block per page
57
+
58
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. No marquee, no parallax, no ambient drift. `prefers-reduced-motion` honored — cursor-blink collapses to a static block. **No ambient motion, ever**, except the single cursor.
59
+
60
+ ## Component patterns
61
+ - **Buttons:** default = 1px ink border + ink text on paper, sharp `0.125rem` radius, no fill. Hover = invert (ink fill, cream text), no transition fanfare. The rust accent fill is reserved for **the single hero CTA per page** (try the model, read the paper). Tertiary = serif text-link in ink with underline-on-hover. Never a gradient. Never a glow.
62
+ - **Cards:** `0.125rem` radius, hairline border, bg-card a hair brighter than the page. Padding `p-8 lg:p-12`. Title in EB Garamond display. Affiliation/byline in mono uppercase tracking `0.08em`. Figures use `.figure-frame` — 1px border, no drop shadow.
63
+ - **Inputs:** border-bottom only for inline forms. Full-box variant for structured fields (1px `--border`, bg-card, `0.125rem` radius). Label sits above in serif. Focus ring is rust, 1px.
64
+ - **CTA:** the single hero action per page may use the rust filled rectangle. All other CTAs are serif text-links in ink with underline-on-hover. **Never repeat the rust fill** — once per page, like a footnote dagger.
65
+
66
+ ## Recommended rich media
67
+ Ai-Startup uses very little decorative media. The figures *are* the media: model architecture diagrams, evaluation tables, scaling-law charts, attention-pattern visualizations. These get the `.figure-frame` treatment — 1px border, mono caption beneath in `--ink-soft`, figure number in display serif (*Fig. 3*).
68
+
69
+ Where photography is used, it is **environmental research photography** color-graded to neutral Kodak Portra 160 — researchers at whiteboards, ambient office light, never staged "hero shot of CEO". Avoid people-on-stage keynote photography (wrong register — that's enterprise-tech), avoid abstract AI-imagery (neural-net glow art, swirling particles — these are exactly what this direction refuses).
70
+
71
+ **AI tool recommendations:** **Midjourney / Flux** prompts like *"researcher at whiteboard, ambient office light, Kodak Portra 160, documentary photography, no eye contact with camera"* for environmental shots; *"clean architectural diagram of [system], black on cream, technical illustration, minimal, no gradient"* for system diagrams. Strictly avoid: glowing neural-net abstractions, particle swirls, holographic blue grids, robot hands — the entire "AI Stock Photography" visual genre is forbidden in this direction.
72
+
73
+ **Aspect ratios:** 3:2 landscape for environmental photography; 4:3 or square for diagrams (research-paper standard); never 16:9 widescreen (marketing-deck feel).
74
+
75
+ **Video:** generally avoided. If a model demo needs to be shown, prefer a **single screen-recording with a poster image and click-to-play** — never autoplay, never ambient loops. Demos run silently if at all. ≤4 MB per video, AV1 or H.265.
76
+
77
+ **Performance:** hero AVIF ≤120 KB at 1600w; figures inlined as SVG where possible (≤20 KB); total page weight budget ≤800 KB. LCP under 1.5s. The cream palette and minimal media make this achievable; if it slips, media is too heavy, not the framework.
78
+
79
+ **Avoid:** AI-stock-art (glowing brains, particle networks, holographic blue grids), gradient meshes, glassmorphism, 3D-rendered abstract shapes, lens flare, staged CEO portraits, conference-stage photography, anything that reads "Series A pitch deck". The negative space is the design.
80
+
81
+ **Accessibility:** every figure has long-form alt-text describing the diagram in prose (research-paper convention: *"Figure 3. The architecture comprises three layers: …"*). Mathematical notation in inline figures has a text equivalent. Color is never the only signal — rust accent always pairs with a text label or icon.
82
+
83
+ ## Component families
84
+ None at install time. Expect early conventions around `<Figure>`, `<Citation>`, `<Affiliation>`, `<ModelCard>`, `<EvaluationTable>`, `<PromptBlock>`, `<ResearchPaperLink>`.
85
+
86
+ ## Details
87
+ - **Selection:** `hsl(var(--rust) / 0.22)` background, foreground text.
88
+ - **Focus ring:** `1px solid hsl(var(--ring))` — thin and quiet, never glows.
89
+ - **Scrollbar:** thin.
90
+
91
+ ## Exceptions
92
+ None yet. When an intentional one-of-one violation lands, add it here with the reason.
93
+
94
+ ## Revisions
95
+ - Initial direction, generated at install time.