@stylecrib/cli 0.3.1 → 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 +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 +1577 -463
  25. package/package.json +11 -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,187 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // logistics-modern — Shippo / ShipBob / Flexport clean fulfillment dashboard.
4
+ // Cool-white canvas, signal blue, dense rate-comparison tables, network-map
5
+ // gravity. Reads like a logistics-ops console — productive, never decorative.
6
+
7
+ export const logisticsModern: Direction = {
8
+ name: "logistics-modern" as Direction["name"],
9
+ ethos:
10
+ "Shippo cool-white + carrier-tile chrome · ShipBob warm-blue dashboard density · Flexport ocean-navy + cargo-grid · " +
11
+ "ShipStation rate-table density · Easyship friendly carrier-comparison cards",
12
+ references: [
13
+ { brand: "Shippo", trait: "cool-white canvas + carrier-tile rate cards" },
14
+ { brand: "ShipBob", trait: "warm-blue dashboard density + fulfillment-network map" },
15
+ { brand: "Flexport", trait: "ocean-navy + cargo-grid, freight-forwarding clarity" },
16
+ { brand: "ShipStation", trait: "dense rate-table comparison, tabular numerics" },
17
+ { brand: "Easyship", trait: "friendly carrier-comparison cards, integration-logo strip" },
18
+ ],
19
+ feel:
20
+ "A logistics-ops console. Cool-white canvas, a single signal-blue accent, hairline borders carrying the structure. " +
21
+ "Rate-comparison tables are the hero — carriers × service-levels at a glance, prices in mono tabular. " +
22
+ "The fulfillment-network map is a working chart, not a decorative globe. Integration-logo strips read as proof, not " +
23
+ "social validation. The page is what an ops manager opens on a Tuesday at 8am.",
24
+
25
+ fonts: {
26
+ display: {
27
+ family: "Inter",
28
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
29
+ from: "Shippo / Flexport marketing display — Inter at semi-heavy weights",
30
+ googleFont: "Inter",
31
+ weights: [500, 600, 700],
32
+ },
33
+ body: {
34
+ family: "Inter",
35
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "sans-serif"],
36
+ from: "ShipBob / ShipStation body — Inter 14px, dashboard density",
37
+ googleFont: "Inter",
38
+ weights: [400, 500, 600],
39
+ },
40
+ mono: {
41
+ family: "IBM Plex Mono",
42
+ fallback: ["JetBrains Mono", "ui-monospace", "SFMono-Regular", "monospace"],
43
+ from: "rate tables, tracking numbers, weight/dim units — Plex Mono scans at row height",
44
+ googleFont: "IBM+Plex+Mono",
45
+ weights: [400, 500],
46
+ },
47
+ },
48
+
49
+ typography: {
50
+ headingTracking: "-0.022em",
51
+ bodyTracking: "0",
52
+ fontFeatureSettings: '"tnum", "cv11", "ss01", "ss03"',
53
+ h1ScaleClamp: "clamp(2rem, 4vw, 3rem)",
54
+ bodyBaseSize: "0.9rem",
55
+ bodyLineHeight: "1.5",
56
+ },
57
+
58
+ colors: {
59
+ background: { hsl: "210 25% 98%", from: "Shippo cool-white — barely-blue canvas, not Mercury cream" },
60
+ foreground: { hsl: "215 35% 12%", from: "deep navy-ink — Flexport ops-console ink" },
61
+ card: { hsl: "0 0% 100%", from: "pure white card — lifts off cool-white background" },
62
+ popover: { hsl: "0 0% 100%", from: "same as card" },
63
+ primary: { hsl: "218 88% 46%", from: "ShipBob signal-blue — the one accent for CTA and selected state" },
64
+ primaryForeground: { hsl: "0 0% 100%", from: "white on signal-blue" },
65
+ secondary: { hsl: "210 22% 95%", from: "cool gray surface — table headers, inset panels" },
66
+ secondaryForeground: { hsl: "215 35% 12%", from: "ink on cool gray" },
67
+ muted: { hsl: "210 20% 94%", from: "muted cool gray — disabled rows" },
68
+ mutedForeground: { hsl: "215 12% 42%", from: "slate gray — table meta, weight units, timestamps" },
69
+ accent: { hsl: "218 70% 96%", from: "pale signal-blue hover — selected-row highlight" },
70
+ accentForeground: { hsl: "218 88% 28%", from: "deep signal-blue ink on pale" },
71
+ border: { hsl: "215 16% 86%", from: "cool hairline — the structural line in every table and card" },
72
+ input: { hsl: "215 16% 86%", from: "same as border" },
73
+ ring: { hsl: "218 88% 46%", from: "primary signal-blue — focus ring" },
74
+ destructive: { hsl: "356 72% 50%", from: "alert red — distinct from any blue accent, used for failed-delivery/error" },
75
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on alert red" },
76
+ brand: {
77
+ "signal-blue": { hsl: "218 88% 46%", from: "= primary; ShipBob signal" },
78
+ "signal-blue-deep": { hsl: "218 84% 32%", from: "hover, gradient anchor, sidebar surface" },
79
+ "signal-blue-soft": { hsl: "218 70% 96%", from: "selected-row bg, network-line halo" },
80
+ "ocean-navy": { hsl: "212 60% 22%", from: "Flexport ocean-navy — used on sidebar and map basemap" },
81
+ "freight-amber": { hsl: "32 92% 52%", from: "transit-in-progress amber — semantic only" },
82
+ "delivered-green": { hsl: "146 60% 38%", from: "delivered/active status — semantic only" },
83
+ "map-land": { hsl: "210 22% 93%", from: "map basemap land — recessive" },
84
+ "map-route": { hsl: "218 88% 46%", from: "shipment route line — same as primary signal" },
85
+ },
86
+ },
87
+
88
+ spacing: {
89
+ base: 4,
90
+ scale: [2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 32, 40, 48, 64],
91
+ containerMax: "max-w-7xl",
92
+ containerPadding: "px-4 lg:px-6",
93
+ sectionPadding: {
94
+ hero: "pt-12 pb-8 lg:pt-16 lg:pb-12",
95
+ default: "py-10 lg:py-14",
96
+ tight: "py-6 lg:py-10",
97
+ },
98
+ },
99
+
100
+ radius: {
101
+ base: "0.375rem",
102
+ pillsAllowed: true,
103
+ },
104
+
105
+ shadows: {
106
+ style: "minimal",
107
+ utilities: {
108
+ "shadow-card":
109
+ "0 1px 2px hsl(215 35% 12% / 0.04), 0 1px 2px hsl(215 35% 12% / 0.03)",
110
+ "shadow-popover":
111
+ "0 4px 14px hsl(215 35% 12% / 0.08), 0 1px 2px hsl(215 35% 12% / 0.06)",
112
+ "shadow-table-row":
113
+ "inset 0 -1px 0 hsl(var(--border))",
114
+ },
115
+ },
116
+
117
+ motion: {
118
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
119
+ durations: {
120
+ reveal: 200,
121
+ loop: 1400,
122
+ ambient: 2400,
123
+ },
124
+ keyframes: {
125
+ "fade-in": {
126
+ css:
127
+ "from { opacity: 0; }\n" +
128
+ "to { opacity: 1; }",
129
+ defaultDuration: 200,
130
+ iteration: "once",
131
+ purpose: "table-row and carrier-card entrance — opacity only",
132
+ },
133
+ "route-dash": {
134
+ css:
135
+ "from { stroke-dashoffset: 0; }\n" +
136
+ "to { stroke-dashoffset: -24; }",
137
+ defaultDuration: 1400,
138
+ iteration: "infinite",
139
+ purpose: "in-transit shipment routes on the network map flow with a dashed line",
140
+ },
141
+ "row-hover": {
142
+ css:
143
+ "from { background-color: transparent; }\n" +
144
+ "to { background-color: hsl(var(--accent)); }",
145
+ defaultDuration: 120,
146
+ iteration: "once",
147
+ purpose: "rate-table row hover transition — almost imperceptible",
148
+ },
149
+ "shimmer": {
150
+ css:
151
+ "0% { background-position: -200% 0; }\n" +
152
+ "100% { background-position: 200% 0; }",
153
+ defaultDuration: 1400,
154
+ iteration: "infinite",
155
+ purpose: "loading skeleton for rate-comparison cells while carriers respond",
156
+ },
157
+ },
158
+ respectsReducedMotion: true,
159
+ },
160
+
161
+ density: "high",
162
+
163
+ patterns: {
164
+ button:
165
+ "Solid signal-blue primary (rounded-md, shadow-card) for the single commit — Buy label, Connect carrier. " +
166
+ "Secondary is ghost (border + foreground). Tertiary is text-link blue. " +
167
+ "Hover deepens fill to signal-blue-deep; no scale, no shadow growth.",
168
+ card:
169
+ "Rounded-md, 1px --border, bg-card, shadow-card. Padding p-4 lg:p-5. " +
170
+ "Carrier-rate card holds carrier logo, service level, price, ETA — modular, one purpose. " +
171
+ "Title in display sans, price in mono tabular.",
172
+ input:
173
+ "Full rounded-md box, 1px --input border, bg-card. Tracking-number input is mono. " +
174
+ "Focus = 2px signal-blue ring at 45% opacity. Weight/dim inputs right-aligned mono.",
175
+ cta:
176
+ "Primary signal-blue button for Buy label / Connect. " +
177
+ "Status pills: freight-amber for in-transit, delivered-green for delivered, destructive for failed. " +
178
+ "Rate-table selected row uses signal-blue-soft bg with a left-edge signal-blue accent bar.",
179
+ },
180
+
181
+ details: {
182
+ selectionBg: "hsl(var(--primary) / 0.22)",
183
+ selectionFg: "hsl(var(--foreground))",
184
+ focusRing: "2px solid hsl(var(--ring) / 0.45)",
185
+ scrollbarStyle: "thin",
186
+ },
187
+ };
@@ -0,0 +1,74 @@
1
+ # Design Direction — Magazine-Glossy
2
+
3
+ ## Ethos
4
+ Vogue cover masthead · Vanity Fair Hollywood-issue display Didone · Harper's Bazaar Brodovitch composition · T Magazine cream stock · Document Journal photo-essay strip
5
+
6
+ ## Feel
7
+ Cream paper stock with oversized Didone display headlines and a heavy reliance on full-bleed editorial photography. The page is a slow, considered glossy magazine spread — large image, single caption block, sparse type. Color is restrained to ink, cream, blush, and a single deep editorial accent (oxblood). Atmosphere over information density.
8
+
9
+ ## Reference brands
10
+ - **Vogue** → oversized Didone masthead, cover-line typography.
11
+ - **Vanity Fair** → Hollywood-issue feature openers, contributor portraits, oxblood accent.
12
+ - **Harper's Bazaar** → Brodovitch asymmetric photo composition, type married to image.
13
+ - **T Magazine** → cream stock + photographic full-bleed editorial.
14
+ - **Document Journal** → photo-essay strip, generous caption blocks.
15
+
16
+ ## Tokens
17
+ HSL triples in `src/index.css`. Brand tokens: `--ink`, `--cream`, `--oxblood`, `--blush`, `--ink-soft`, `--photo-frame`. The warm ink (`hsl(20 25% 10%)`) has a deliberate brown undertone — pure black reads dot-matrix; this reads Bodoni-printed.
18
+
19
+ Primary accent is **Vanity Fair oxblood** (`hsl(350 35% 30%)`) — one deep editorial color. Blush (`hsl(16 35% 84%)`) is the Bazaar page-trim accent, used for hover and inset panels.
20
+
21
+ ## Typography
22
+ - **Display:** Bodoni Moda (Vogue/Vanity Fair high-contrast Didone). Tracking `-0.025em` — very tight, masthead feel.
23
+ - **Body:** Cormorant Garamond (T Magazine body serif). 17px / `line-height: 1.7` — magazine pacing.
24
+ - **Mono:** JetBrains Mono. Photo credits, contributor titles, captions — always small-caps with positive tracking.
25
+
26
+ H1 uses `clamp(3.5rem, 10vw, 8rem)` — oversized cover-line scale.
27
+
28
+ ## Spacing
29
+ - **Container:** `max-w-6xl px-6 lg:px-12` — full-bleed photography needs the width.
30
+ - **Section padding:** hero `pt-24 pb-16 lg:pt-36 lg:pb-24`; default `py-20 lg:py-32`; tight `py-12 lg:py-16`.
31
+ - **Scale:** 4 6 8 12 16 20 24 32 48 64 96 128. Glossy breathes.
32
+
33
+ ## Color
34
+ No hex in components. Color belongs to the photography, not the chrome. White is forbidden — `--cream` replaces it. The four colors of the page are ink, cream, blush, oxblood.
35
+
36
+ ## Radius
37
+ `--radius: 0`. **Sharp corners only.** Photo frames are rectangles. Pills disallowed — every glossy magazine spread frames its image with a straight rule.
38
+
39
+ ## Shadows
40
+ Soft. Two utilities: `.photo-frame` (single bottom hairline beneath captions) and `.page-lift` (a subtle 8px / 32px glossy-paper lift). Glows are forbidden — atmosphere is photographic, not luminous.
41
+
42
+ ## Motion
43
+ Two keyframes. `fade-rise` (1100ms) — slow magazine-spread settle. `image-breathe` (24,000ms infinite) — very slow ken-burns on hero photography, honors reduced-motion by pausing.
44
+
45
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`.
46
+
47
+ ## Component patterns
48
+ - **Buttons:** text-link CTAs in `--ink`, underline on hover. The single Subscribe is the only solid: `--ink` bg + `--cream` fg, sharp rect, no radius. Never a colored fill — color is for photography.
49
+ - **Cards:** top + bottom hairlines only. Background `--cream`. Title in Bodoni, kicker in mono caps. Padding `p-8 lg:p-12`. Captions live in mono italic.
50
+ - **Inputs:** border-bottom only. Mono small-caps label above, Cormorant italic placeholder.
51
+ - **CTA links:** text-link in `--ink`, underline on hover. **Never a colored chip.**
52
+
53
+ ## Bespoke section
54
+ Featured-story photo-essay strip (one big full-bleed image with a generous caption block: image-credit, story-kicker, title, deck) + a contributor strip with four writers / photographers each with a circular portrait, name in Bodoni, role + contribution count in mono caps + a subscriber-prompt card with email-capture + tier-label. The composition is asymmetric — Bazaar/Brodovitch tradition — not a centered hero with three pillars.
55
+
56
+ ## Recommended rich media
57
+ Photography is everything. Editorial portraiture (Annie Leibovitz lighting), fashion shoots (Steven Meisel composition), or Brodovitch-style high-contrast b&w. Always full-bleed within the photo frame; captions sit *under* the image with credits in mono italic.
58
+
59
+ **AI tool recommendations:** Midjourney prompts like *"Vogue cover portrait, Steven Meisel lighting, 85mm, Kodak Portra 400, magazine-glossy print"*. For abstract atmospheric shots: *"Harper's Bazaar Brodovitch, high-contrast b&w, asymmetric composition"*. Avoid newsroom photojournalism (newspaper-classic territory) and tech-product renders.
60
+
61
+ **Aspect ratios:** 4:5 portrait (the magazine page) or 3:2 landscape. Never 16:9. Captions are mandatory, in mono italic: *"Photographed by Helmut Newton, Paris, 1975."*
62
+
63
+ **Avoid:** stock photography, animated GIFs, dark moody product shots, gradient backgrounds, glassmorphic anything, pill-shaped chips, drop shadows, lens flare, AI photos with uncanny features.
64
+
65
+ ## Details
66
+ - **Selection:** `hsl(var(--primary) / 0.18)` (oxblood at 18%).
67
+ - **Focus ring:** `1px solid hsl(var(--ring))`.
68
+ - **Scrollbar:** thin.
69
+
70
+ ## Exceptions
71
+ None yet.
72
+
73
+ ## Revisions
74
+ - Initial direction.
@@ -0,0 +1,158 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // Note: "magazine-glossy" is not yet in the Direction["name"] enum.
4
+ // The schema is closed; until it is extended this file casts the name.
5
+
6
+ export const magazineGlossy: Direction = {
7
+ name: "magazine-glossy" as Direction["name"],
8
+ ethos: "Vogue cover masthead · Vanity Fair Hollywood-issue display Didone · Harper's Bazaar Brodovitch composition · T Magazine cream stock · Document Journal photo-essay strip",
9
+ references: [
10
+ { brand: "Vogue", trait: "oversized Didone masthead, cover-line typography" },
11
+ { brand: "Vanity Fair", trait: "Hollywood-issue feature openers, contributor portraits" },
12
+ { brand: "Harper's Bazaar", trait: "Brodovitch asymmetric photo composition, type married to image" },
13
+ { brand: "T Magazine (NYT)", trait: "cream stock + photographic full-bleed editorial" },
14
+ { brand: "Document Journal", trait: "photo-essay strip, generous caption blocks" },
15
+ ],
16
+ feel:
17
+ "Cream paper stock with oversized Didone display headlines and a heavy reliance on full-bleed editorial photography. " +
18
+ "The page is a slow, considered glossy magazine spread — large image, single caption block, sparse type. " +
19
+ "Color is restrained to ink, cream, blush, and a single deep editorial accent. Atmosphere over information density.",
20
+
21
+ fonts: {
22
+ display: {
23
+ family: "Bodoni Moda",
24
+ fallback: ["Didot", "Bodoni 72", "Playfair Display", "Georgia", "serif"],
25
+ from: "Vogue/Vanity Fair high-contrast Didone — masthead cover-line feel",
26
+ googleFont: "Bodoni+Moda",
27
+ weights: [400, 500, 700, 900],
28
+ },
29
+ body: {
30
+ family: "Cormorant Garamond",
31
+ fallback: ["EB Garamond", "Iowan Old Style", "Georgia", "serif"],
32
+ from: "T Magazine body serif — humanist, breathes against Bodoni display",
33
+ googleFont: "Cormorant+Garamond",
34
+ weights: [400, 500, 600],
35
+ },
36
+ mono: {
37
+ family: "JetBrains Mono",
38
+ fallback: ["ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
39
+ from: "photo credits, captions, contributor titles — small-cap mono instrument feel",
40
+ googleFont: "JetBrains+Mono",
41
+ weights: [400, 500],
42
+ },
43
+ },
44
+
45
+ typography: {
46
+ headingTracking: "-0.025em", // Didone wants very tight — masthead feel
47
+ bodyTracking: "0.005em",
48
+ fontFeatureSettings: '"liga", "dlig", "onum"',
49
+ h1ScaleClamp: "clamp(3.5rem, 10vw, 8rem)", // oversized — cover-line scale
50
+ bodyBaseSize: "1.0625rem",
51
+ bodyLineHeight: "1.7",
52
+ },
53
+
54
+ colors: {
55
+ background: { hsl: "32 32% 94%", from: "T Magazine cream paper stock — warm, glossy" },
56
+ foreground: { hsl: "20 25% 10%", from: "deep warm ink — never pure black, has a brown undertone" },
57
+ card: { hsl: "32 32% 97%", from: "lighter cream card — sits on the paper" },
58
+ popover: { hsl: "32 32% 97%", from: "same as card; depth from caption rules" },
59
+ primary: { hsl: "350 35% 30%", from: "Vanity Fair deep oxblood — single editorial accent" },
60
+ primaryForeground: { hsl: "32 32% 94%", from: "cream on oxblood" },
61
+ secondary: { hsl: "32 25% 89%", from: "deeper cream — caption blocks and photo gutters" },
62
+ secondaryForeground: { hsl: "20 25% 10%", from: "ink on cream" },
63
+ muted: { hsl: "32 25% 89%", from: "same as secondary; differentiation by usage" },
64
+ mutedForeground: { hsl: "20 12% 36%", from: "secondary type — credits, contributor titles" },
65
+ accent: { hsl: "16 35% 84%", from: "blush — Harper's Bazaar pink page-trim, hover states only" },
66
+ accentForeground: { hsl: "20 25% 10%", from: "ink on blush" },
67
+ border: { hsl: "20 14% 78%", from: "caption-block rule — visible, gallery-frame style" },
68
+ input: { hsl: "20 14% 78%", from: "same as border" },
69
+ ring: { hsl: "350 35% 30%", from: "primary oxblood, focus only" },
70
+ destructive: { hsl: "0 60% 42%", from: "editorial alert red — different family from primary oxblood" },
71
+ destructiveForeground: { hsl: "32 32% 94%", from: "cream on alert" },
72
+ brand: {
73
+ ink: { hsl: "20 25% 10%", from: "= foreground; deep warm ink" },
74
+ cream: { hsl: "32 32% 94%", from: "= background; the glossy paper stock" },
75
+ oxblood: { hsl: "350 35% 30%", from: "= primary; Vanity Fair deep editorial accent" },
76
+ blush: { hsl: "16 35% 84%", from: "= accent; Bazaar page trim, soft pink" },
77
+ "ink-soft": { hsl: "20 20% 22%", from: "deck text, secondary headlines" },
78
+ "photo-frame": { hsl: "20 14% 78%", from: "= border; gallery-frame rule around full-bleed photos" },
79
+ },
80
+ },
81
+
82
+ spacing: {
83
+ base: 4,
84
+ scale: [4, 6, 8, 12, 16, 20, 24, 32, 48, 64, 96, 128], // glossy breathes
85
+ containerMax: "max-w-6xl", // wide — full-bleed photography needs the room
86
+ containerPadding: "px-6 lg:px-12",
87
+ sectionPadding: {
88
+ hero: "pt-24 pb-16 lg:pt-36 lg:pb-24",
89
+ default: "py-20 lg:py-32",
90
+ tight: "py-12 lg:py-16",
91
+ },
92
+ },
93
+
94
+ radius: {
95
+ base: "0", // sharp — photo frames are rectangles
96
+ pillsAllowed: false,
97
+ },
98
+
99
+ shadows: {
100
+ style: "soft",
101
+ utilities: {
102
+ "photo-frame":
103
+ "0 1px 0 0 hsl(var(--border))", // single gallery-rule under captions
104
+ "page-lift":
105
+ "0 8px 32px hsl(var(--ink) / 0.08)", // subtle glossy-paper lift for feature cards
106
+ },
107
+ },
108
+
109
+ motion: {
110
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
111
+ durations: {
112
+ reveal: 1100, // slow, magazine pacing
113
+ loop: 4000,
114
+ ambient: 24000,
115
+ },
116
+ keyframes: {
117
+ "fade-rise": {
118
+ css:
119
+ "from { opacity: 0; transform: translateY(28px); }\n" +
120
+ "to { opacity: 1; transform: translateY(0); }",
121
+ defaultDuration: 1100,
122
+ iteration: "once",
123
+ purpose: "feature entrance — slow rise, magazine spread settling onto the page",
124
+ },
125
+ "image-breathe": {
126
+ css:
127
+ "0%, 100% { transform: scale(1.02); }\n" +
128
+ "50% { transform: scale(1.05); }",
129
+ defaultDuration: 24000,
130
+ iteration: "infinite",
131
+ purpose: "very slow ken-burns on full-bleed editorial photography",
132
+ },
133
+ },
134
+ respectsReducedMotion: true,
135
+ },
136
+
137
+ density: "low",
138
+
139
+ patterns: {
140
+ button:
141
+ "Text-link CTAs in --ink with underline on hover. The single subscribe CTA may be a solid --ink fill with --cream text. " +
142
+ "Never a colored fill button — color belongs to the photography, not the controls.",
143
+ card:
144
+ "Top hairline + bottom hairline only. Background is --cream, no fill differentiation. " +
145
+ "Title in Bodoni Moda display, kicker in mono small caps. Padding p-8 lg:p-12. Captions live in mono.",
146
+ input:
147
+ "Border-bottom only (1px --ink-soft). Label in mono small caps above. Placeholder italic Cormorant.",
148
+ cta:
149
+ "Text-link with --ink, underline on hover. Subscribe is the only solid: --ink bg + --cream fg, sharp rect, no radius.",
150
+ },
151
+
152
+ details: {
153
+ selectionBg: "hsl(var(--primary) / 0.18)",
154
+ selectionFg: "hsl(var(--foreground))",
155
+ focusRing: "1px solid hsl(var(--ring))",
156
+ scrollbarStyle: "thin",
157
+ },
158
+ };
@@ -0,0 +1,128 @@
1
+ # Marker Mag
2
+
3
+ > Student-magazine DIY register — saturated hot canvas (hot pink by default, other saturated hues per palette variant) broken by dark charcoal header + footer bands, hand-drawn brush-lettered wordmark repeated top and bottom, big DIY cover-art tile featuring the current issue, editorial article grid of dark cards on the saturated canvas.
4
+
5
+ **Slug:** `marker-mag` — **Surface:** web — **Density:** dense
6
+
7
+ ## Influence
8
+
9
+ Independent campus / student magazines (the register held by NZ / AU / UK campus quarterlies — Salient, Craccum, Palatinate, Isis at their most DIY). Also youth-culture editorial (Dazed at their most zine-adjacent, i-D at their most staple-bound, The Face relaunch when it leans DIY). Adjacent to punk photocopy zines but structured — brush lettering instead of ransom-note, editorial grid instead of collage anarchy.
10
+
11
+
12
+ ## Signature move
13
+
14
+ A hand-drawn BRUSH-LETTERED wordmark, rendered as bespoke SVG paths
15
+ (not a font), sits centered at the top of the composition on a dark
16
+ charcoal band and is REPEATED at the bottom of the composition in
17
+ the footer. The brush strokes carry a marker-on-paper texture — some
18
+ strokes are thicker, some thinner, some have visible ink pooling at
19
+ corners — so the word reads as "hand-drawn today" not "a font
20
+ someone bought." The main page canvas is a SATURATED band color
21
+ (hot pink by default, other saturated hues per palette) that
22
+ dominates every surface not covered by dark cards. Below the top
23
+ charcoal band, a big DIY COVER-ART tile shows the current issue's
24
+ cover in xeroxed / DIY-print texture: dark backdrop with a strong
25
+ central image (a fictional issue mascot or graphic), the issue's
26
+ volume + issue label in small caps on the cover, and a hand-drawn
27
+ border. Beside the cover, a FEATURED-INDEX list of the top articles
28
+ from the current issue — each row a small thumbnail + title + author
29
+ byline + "Read More »" link, all on the hot canvas. Below, a row of
30
+ category filter chips (Columns / Editorial / Entertainment /
31
+ Features / News / Reviews). Below the chips, a 12-tile editorial
32
+ grid arranged 3 columns wide, each tile a dark charcoal card with
33
+ the article's image on top, category badge overlay, title in
34
+ DM-Sans-800-capitalize, small italic author byline, body preview,
35
+ and "Read More »" link at bottom. Grid pagination row (1 2 3 4 5)
36
+ below the grid. Dark charcoal footer band with the wordmark
37
+ repeated + Instagram + Facebook + YouTube social icons. Border-
38
+ radius 0 everywhere. Brand character sits in the brush wordmark,
39
+ the saturated canvas, the DIY cover-art tile, and the disciplined
40
+ student-mag article-grid — not in decoration, not in mono-caps
41
+ eyebrows, not in stat-card triads.
42
+
43
+ ## Palette
44
+
45
+ - **bg:** `#E35BA0`
46
+ - **surface:** `#2C2C2C`
47
+ - **ink:** `#FFFFFF`
48
+ - **accent:** `#0000EE`
49
+
50
+ ## Typography
51
+
52
+ - **Display:** DM Sans (free, Google Fonts) at 800 weight — capitalize case, letter-spacing normal. At scale — 36-44px article-tile titles, 22-28px featured article titles, 20px section labels. DM Sans is the reference face itself (the source site literally uses it) and it's a Google-Fonts-shelf humanist sans that reads as youth-friendly without being loud. The BRUSH-LETTERED wordmark is NOT a font — it's a bespoke hand-drawn SVG (see signature).
53
+ - **Body:** DM Sans same family — 400 weight for body, 500 for card titles, 600 for filter chips. 14-16px body copy, line-height 1.5. Sentence case, not all caps. Small captions (author bylines) get 12-13px 500-weight.
54
+ - **Mono:** none. Marker Mag is a consumer editorial surface — mono has no legitimate role. Author bylines are in body-face italic 12px, NOT mono-caps (that's the universal-slop-blocklist fingerprint).
55
+ - **Scale:** 1.25 (major third — deliberately shallow contrast; the article-grid cards should feel evenly-weighted so no one card dominates. The magazine cover-art tile carries the hero volume through IMAGE, not through outsized type.)
56
+
57
+ ## Motion
58
+
59
+ Ships live in the section renderer (no external dependencies):
60
+ 1. Wordmark drop-in on first paint — the brush-lettered SVG wordmark strokes draw from opacity 0 → 1 with a 400ms cubic-bezier ease + 60ms stagger per letter, so it reads as "hand-drawn on the page in real time." Only fires once on load.
61
+ 2. Cover-art tile hover — slight rotate(-1deg) + scale(1.02) on hover, 220ms cubic-bezier. Reads as "picking up a physical magazine off the desk."
62
+ 3. Article card hover — the dark card lifts translateY(-4px) + the image inside scales(1.03) with 220ms cubic-bezier. Simultaneous "Read More »" arrow slides 4px right.
63
+ 4. Category filter chips — click swaps active chip; grid re-renders filtered instantly (no cross-fade). Active chip has a solid white background with dark ink, inactive is transparent with hot-pink underline.
64
+ 5. Pagination — click swaps active page number; grid scrolls to top of grid via smooth-scroll. Fast, no page-transition animation.
65
+ 6. Featured-article-list rows in the editorial index — hover flips the row background from transparent to a subtle rgba(255,255,255,0.05) accent, 180ms transition.
66
+ 7. prefers-reduced-motion: reduce — brush wordmark starts at final opacity; cover-tile hover disabled; card hover becomes instant. State changes still fire (they're content, not decoration).
67
+
68
+ Customer installs these as dependencies for the deeper motion tier:
69
+ - Lenis — smooth inertial scroll for the long article grid.
70
+ - GSAP DrawSVG — the brush wordmark stroke-draw could use DrawSVG for a more considered pen-on-paper reveal. The default CSS version is close enough for MVP.
71
+ - No preloader — student magazines land instantly, not with a splash screen.
72
+
73
+ Motion character: DIY, physical, tactile. Custom cubic-bezier(0.25,0.1,0.25,1) for reveals. Nothing electric, nothing corporate, nothing tech-bro-slick. The whole point of the DIY register is that it feels made by a human at a desk in a dorm, not by a design system.
74
+
75
+
76
+ ## Imagery
77
+
78
+ DIY / xerox / punk photocopy aesthetic imagery. The cover-art tile
79
+ is the primary hero — a dark backdrop with a bold graphic (mascot,
80
+ illustration, photograph) that reads as a fictional student
81
+ magazine cover. Article-tile images use a mix of: (1) FPO
82
+ photograph rectangles with visible grain, (2) fake newspaper clip
83
+ scans, (3) colorful graphic panels with a fictional article-topic
84
+ hint. All FPO imagery has a slight rotation, an unfinished quality,
85
+ or a torn-edge treatment — because student magazines never ship
86
+ with polished stock photography. NO gradient blobs, NO glassmorphism,
87
+ NO clean brand-color panels (that's case-panel's move), NO
88
+ drop-shadow-md polish. The whole composition reads as printed +
89
+ photocopied + stapled.
90
+
91
+ ## Best for
92
+
93
+ - Student / campus magazine sites (university quarterlies, college publications)
94
+ - Independent zines going from print to web (small-run editorial with a distinctive voice)
95
+ - Community publications with a youth or subculture voice
96
+ - Music / arts / culture writing sites that want DIY register instead of corporate polish
97
+ - Substack-alternative editorial platforms leaning into indie youth aesthetic
98
+ - Anything trading on "made by humans in a room, not a content team"
99
+
100
+ ## Reject if
101
+
102
+ _Director grades each of the following as a pass/fail check. Any violation blocks the theme._
103
+
104
+ - Border-radius greater than 0px anywhere on the page — sharp corners are core to the identity
105
+ - Rounded pill buttons or fully-rounded CTAs — buttons and filter chips are sharp-cornered with 0 radius
106
+ - Serif or condensed display type — display face MUST be DM Sans or similar humanist sans, never Fraunces / Times / Playfair / Anton
107
+ - The wordmark rendered as a font — the wordmark MUST be hand-drawn bespoke SVG paths so it reads as marker-on-paper, not as a downloadable font
108
+ - Mono type as a decorative label voice — mono has no role on this consumer editorial surface
109
+ - Neutral canvas (white / cream / black / charcoal) as the primary background — the CANVAS IS ALWAYS SATURATED. Hot pink by default, other saturated hues per palette variant. A neutral canvas turns this into a generic dark-mode blog and the register dies.
110
+ - Corporate polish on the article cards — no drop-shadow-md, no soft-glow, no rounded 2xl. Cards are FLAT dark rectangles on the saturated canvas.
111
+ - Uniform 3-pillar / feature-triad layout for the article grid — the grid is a 3×N grid of same-size dark cards which is fine because that IS what magazines do, but the tiles must SHIP with real content variation (different images, different lengths, different categories) so it doesn't collapse into template output
112
+ - Center-aligned everything — hero cover art is LEFT of the featured-index, article grid is left-weighted
113
+ - Adding a second saturated accent color competing with the canvas — the canvas hue IS the accent. Blue #0000EE is reserved for interactive hover states only.
114
+ - Emoji or decorative unicode marks — the brush wordmark carries all the personality; nothing else decorative ships
115
+ - Auto-advancing hero sliders / cycling headline words — refused
116
+ - Grain overlay as a fake-DIY treatment on the whole canvas — DIY texture lives IN the cover-art tile and article-tile images, not smeared across the whole page
117
+
118
+ ## Banned defaults (inherited + theme-specific)
119
+
120
+ - claude-cream (#F4F1EA + serif + #D97757)
121
+ - void+acid (near-black bg + single bright acid-green or vermilion accent)
122
+ - broadsheet-on-noneditorial (hairline rules + zero border-radius + newspaper columns on non-editorial content)
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
+ - wordmark-as-font (the brush-lettered wordmark MUST be bespoke SVG paths. The moment you replace it with a Google Fonts brush face like Caveat or Permanent Marker, the register collapses into generic-blog-hand-drawn slop.)
126
+ - neutral-canvas-with-pink-accent (the whole point is the SATURATED CANVAS. A white canvas with hot pink accents is a completely different register and collapses this theme into generic-editorial-slop.)
127
+ - corporate-article-cards (dark cards must be FLAT rectangles on the canvas. The moment you add rounded-2xl + shadow-md + hover-scale-1.05, the register becomes stock Medium / Substack / Ghost editorial slop.)
128
+ - generic-cover-art (the DIY cover-art tile must feel PRINTED + PHOTOCOPIED + STAPLED. The moment you replace it with a clean brand-panel or a gradient hero, the register collapses.)
@@ -0,0 +1 @@
1
+ {"slug":"marker-mag","gates":[{"gate":"slop-blocklist","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T07:08:06.173Z","dismissed":[]},{"gate":"regression-scan","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T07:08:06.183Z","dismissed":[]},{"gate":"avoid-rubric","verdict":{"passed":true,"failures":[]},"ran_at":"2026-07-04T07:08:53.448Z","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-04T07:08:53.450Z","dismissed":[]}],"overall":"PASS","ran_at":"2026-07-04T07:08:06.173Z"}
@@ -0,0 +1,15 @@
1
+ // Generated from theme.yml. Merge into your tailwind.config.ts under theme.extend.
2
+ // slug: marker-mag
3
+ export const markerMagTailwindExtend = {
4
+ colors: {
5
+ bg: "#E35BA0",
6
+ surface: "#2C2C2C",
7
+ ink: "#FFFFFF",
8
+ accent: "#0000EE",
9
+ },
10
+ fontFamily: {
11
+ display: ["DM Sans (free, Google Fonts) at 800 weight — capitalize case, letter-spacing normal. At scale — 36-44px article-tile titles, 22-28px featured article titles, 20px section labels. DM Sans is the reference face itself (the source site literally uses it) and it's a Google-Fonts-shelf humanist sans that reads as youth-friendly without being loud. The BRUSH-LETTERED wordmark is NOT a font — it's a bespoke hand-drawn SVG (see signature)."],
12
+ body: ["DM Sans same family — 400 weight for body, 500 for card titles, 600 for filter chips. 14-16px body copy, line-height 1.5. Sentence case, not all caps. Small captions (author bylines) get 12-13px 500-weight."],
13
+ mono: ["none. Marker Mag is a consumer editorial surface — mono has no legitimate role. Author bylines are in body-face italic 12px, NOT mono-caps (that's the universal-slop-blocklist fingerprint)."],
14
+ },
15
+ };