@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,192 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // lawtech-modern — Clio / MyCase / Smokeball / Filevine / PracticePanther.
4
+ // Brex-for-law modern legal tech. Cream + sage accent, friendly dashboard,
5
+ // software-not-stuffy. The opposite of white-shoe; this is the tool the firm uses.
6
+
7
+ export const lawtechModern: Direction = {
8
+ name: "lawtech-modern" as Direction["name"],
9
+ ethos:
10
+ "Clio matter-management warmth · MyCase friendly dashboard · Smokeball pragmatic UI · Filevine fielded-data clarity · PracticePanther solo-practitioner approachability",
11
+ references: [
12
+ { brand: "Clio", trait: "cream + sage, friendly Inter, matter-list density without coldness" },
13
+ { brand: "MyCase", trait: "dashboard warmth, sage CTAs, plain-English voice" },
14
+ { brand: "Smokeball", trait: "pragmatic UI, sage activity-feed, friendly badges" },
15
+ { brand: "Filevine", trait: "fielded-data clarity, dense forms with breathing room" },
16
+ { brand: "PracticePanther", trait: "solo + small-firm approachability, gentle sage primary" },
17
+ ],
18
+ feel:
19
+ "Modern legal-tech dashboard energy. Cream-tinted surfaces with sage primary, " +
20
+ "friendly Inter, dense-but-soft information layout. Software-not-stuffy: the tool " +
21
+ "a paperless solo practitioner or a 40-person firm runs without the white-shoe " +
22
+ "self-image. Brex-for-law — competence with warmth, not gravitas with starch.",
23
+
24
+ fonts: {
25
+ display: {
26
+ family: "Inter",
27
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
28
+ from: "Clio/MyCase — Inter as display reads competent + approachable without serif theater",
29
+ googleFont: "Inter",
30
+ weights: [500, 600, 700],
31
+ },
32
+ body: {
33
+ family: "Inter",
34
+ fallback: ["system-ui", "-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
35
+ from: "same family as display — lawtech dashboards use one face; hierarchy via weight + size",
36
+ googleFont: "Inter",
37
+ weights: [400, 500, 600],
38
+ },
39
+ mono: {
40
+ family: "IBM Plex Mono",
41
+ fallback: ["JetBrains Mono", "ui-monospace", "SFMono-Regular", "Consolas", "monospace"],
42
+ from: "matter IDs, billable codes, court-deadline counters — warm mono for client-facing chrome",
43
+ googleFont: "IBM+Plex+Mono",
44
+ weights: [400, 500],
45
+ },
46
+ },
47
+
48
+ typography: {
49
+ headingTracking: "-0.015em",
50
+ bodyTracking: "0",
51
+ fontFeatureSettings: '"cv11", "ss01", "tnum", "calt"', // tabular for hours, billable amounts
52
+ h1ScaleClamp: "clamp(2rem, 4.5vw, 3.25rem)", // tool-first, not magazine-large
53
+ bodyBaseSize: "0.9375rem", // 15px — denser than marketing, dashboard standard
54
+ bodyLineHeight: "1.55",
55
+ },
56
+
57
+ colors: {
58
+ background: { hsl: "40 32% 97%", from: "Clio warm cream — softer than dashboard white, less yellow than spa cream" },
59
+ foreground: { hsl: "220 28% 16%", from: "deep slate ink — readable on cream, friendly not stark" },
60
+ card: { hsl: "0 0% 100%", from: "true white card — lifts cleanly off cream for dashboard panels" },
61
+ popover: { hsl: "0 0% 100%", from: "same as card" },
62
+ primary: { hsl: "150 38% 38%", from: "Clio/MyCase sage — friendly primary, never enterprise navy" },
63
+ primaryForeground: { hsl: "0 0% 100%", from: "white on sage" },
64
+ secondary: { hsl: "40 24% 93%", from: "deeper cream — secondary panel, side-rail surface" },
65
+ secondaryForeground: { hsl: "220 28% 18%", from: "slate ink on cream panel" },
66
+ muted: { hsl: "40 22% 95%", from: "table-row stripe — softer than secondary, near-bg" },
67
+ mutedForeground: { hsl: "220 12% 44%", from: "slate-gray — captions, timestamps, helper text" },
68
+ accent: { hsl: "150 40% 94%", from: "sage tint — hover surface, status-active chip" },
69
+ accentForeground: { hsl: "150 50% 22%", from: "deep sage on tint" },
70
+ border: { hsl: "40 18% 87%", from: "warm hairline — Clio panel rule, never cool gray" },
71
+ input: { hsl: "40 18% 87%", from: "same as border" },
72
+ ring: { hsl: "150 38% 38%", from: "primary sage, used for focus" },
73
+ destructive: { hsl: "0 65% 50%", from: "friendly clinical red — overdue-invoice, missed-deadline" },
74
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on red" },
75
+ brand: {
76
+ sage: { hsl: "150 38% 38%", from: "= primary; Clio/MyCase sage" },
77
+ "sage-soft": { hsl: "150 40% 94%", from: "sage tint — status-pill, hover surface" },
78
+ "sage-deep": { hsl: "150 45% 28%", from: "sage hover-darken, active state" },
79
+ cream: { hsl: "40 32% 97%", from: "= background; warm cream paper" },
80
+ "cream-deep": { hsl: "40 24% 93%", from: "= secondary; deeper cream for side panel" },
81
+ amber: { hsl: "36 90% 56%", from: "deadline-approaching, pending-review attention amber" },
82
+ "amber-soft": { hsl: "36 90% 94%", from: "amber tint — pending pill" },
83
+ navy: { hsl: "220 50% 32%", from: "secondary info accent — client-portal links, court-filing badges" },
84
+ "navy-soft": { hsl: "220 50% 94%", from: "navy tint — info chip" },
85
+ },
86
+ },
87
+
88
+ spacing: {
89
+ base: 4,
90
+ scale: [2, 4, 6, 8, 10, 12, 14, 16, 20, 24, 32, 40, 48, 64, 80],
91
+ containerMax: "max-w-7xl", // wide — dashboards run edge-to-edge
92
+ containerPadding: "px-4 lg:px-6",
93
+ sectionPadding: {
94
+ hero: "pt-16 pb-12 lg:pt-24 lg:pb-16",
95
+ default: "py-12 lg:py-20",
96
+ tight: "py-8 lg:py-12",
97
+ },
98
+ },
99
+
100
+ radius: {
101
+ base: "0.625rem", // 10px — softer than enterprise, less pillowy than DTC
102
+ pillsAllowed: true, // pills core — matter-status, billable-tag, deadline-state
103
+ },
104
+
105
+ shadows: {
106
+ style: "soft",
107
+ utilities: {
108
+ "shadow-panel":
109
+ "0 1px 2px hsl(150 20% 20% / 0.04), 0 4px 12px hsl(150 20% 20% / 0.06)",
110
+ "shadow-panel-lg":
111
+ "0 2px 4px hsl(150 20% 20% / 0.05), 0 12px 28px hsl(150 20% 20% / 0.08)",
112
+ "shadow-popover":
113
+ "0 4px 8px hsl(150 20% 20% / 0.06), 0 24px 48px hsl(150 20% 20% / 0.12)",
114
+ "shadow-inset-soft":
115
+ "inset 0 1px 0 hsl(0 0% 100% / 0.6)",
116
+ },
117
+ },
118
+
119
+ motion: {
120
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
121
+ durations: {
122
+ reveal: 350,
123
+ loop: 1800,
124
+ ambient: 0,
125
+ },
126
+ keyframes: {
127
+ "fade-rise": {
128
+ css:
129
+ "from { opacity: 0; transform: translateY(8px); }\n" +
130
+ "to { opacity: 1; transform: translateY(0); }",
131
+ defaultDuration: 350,
132
+ iteration: "once",
133
+ purpose: "panel and row entrance — short, dashboard-responsive",
134
+ },
135
+ "scale-in": {
136
+ css:
137
+ "from { opacity: 0; transform: scale(0.97); }\n" +
138
+ "to { opacity: 1; transform: scale(1); }",
139
+ defaultDuration: 180,
140
+ iteration: "once",
141
+ purpose: "modal, popover, dropdown — confirms click without delay",
142
+ },
143
+ "soft-pulse": {
144
+ css:
145
+ "0%, 100% { opacity: 1; }\n" +
146
+ "50% { opacity: 0.6; }",
147
+ defaultDuration: 1800,
148
+ iteration: "infinite",
149
+ purpose: "deadline-approaching dot, live-timer running indicator",
150
+ },
151
+ "shimmer": {
152
+ css:
153
+ "0% { background-position: -200% 0; }\n" +
154
+ "100% { background-position: 200% 0; }",
155
+ defaultDuration: 1400,
156
+ iteration: "infinite",
157
+ purpose: "matter-list and invoice-row loading skeleton",
158
+ },
159
+ },
160
+ respectsReducedMotion: true,
161
+ },
162
+
163
+ density: "high",
164
+
165
+ patterns: {
166
+ button:
167
+ "Primary = solid sage fill, white text, rounded-lg, shadow-panel. " +
168
+ "Secondary = white fill, 1px warm border, foreground text. Tertiary = text-link in sage. " +
169
+ "Destructive = red ghost (border + text), upgrades to solid only on confirm. " +
170
+ "Hover: shadow-panel-lg + 4% darken, never scale.",
171
+ card:
172
+ "Rounded-lg, white fill on cream, 1px warm border, shadow-panel. " +
173
+ "Internal padding p-5 lg:p-6. " +
174
+ "Dashboard tile may use a 4px top-border in the brand color matching the data " +
175
+ "(sage = active matter, navy = court filing, amber = pending, red = overdue).",
176
+ input:
177
+ "Rounded-md, 1px warm border, white background. Compact height (h-9). " +
178
+ "Label above in Inter 500. Focus = 2px sage ring at 40% opacity. " +
179
+ "Error = red border + red helper text below.",
180
+ cta:
181
+ "Primary sage solid is the dashboard default. " +
182
+ "Marketing pages may pair primary + navy ghost side-by-side. " +
183
+ "Voice is friendly-professional: 'Start your free trial', 'Talk to a specialist', 'Import your matters'.",
184
+ },
185
+
186
+ details: {
187
+ selectionBg: "hsl(var(--primary) / 0.22)",
188
+ selectionFg: "hsl(var(--foreground))",
189
+ focusRing: "2px solid hsl(var(--ring) / 0.5)",
190
+ scrollbarStyle: "thin",
191
+ },
192
+ };
@@ -0,0 +1,102 @@
1
+ # Design Direction — Linkedin-Pro
2
+
3
+ ## Ethos
4
+ LinkedIn brand-blue + profile-card density · Polywork tag-strip identity · Read.cv editorial calm · Lunchclub warm-pro pairing · Tomo gentle accent
5
+
6
+ ## Feel
7
+ Professional, populated, slightly dense. The feed is the page — profile cards stack, engagement counts read in tabular numerics, headlines and titles outrank everything else. Corporate-friendly blue carries the entire identity; surfaces stay near-white with hairline borders so cards can sit a dozen-deep without competing.
8
+
9
+ Where `dense-utility` is Bloomberg-terminal cold and `creator-social` is mobile-vertical hot, linkedin-pro lives in the corporate middle — desktop-first, headshot-led, conservative palette, but generous enough to look human.
10
+
11
+ ## Reference brands
12
+ - **LinkedIn** → corporate brand-blue, profile-card density, the headshot-led feed. The card chrome is the language.
13
+ - **Polywork** → tag-strip identity. The colorful chip taxonomy that sits over a calm gray surface.
14
+ - **Read.cv** → editorial calm on a pro profile. Restraint within the corporate envelope.
15
+ - **Lunchclub** → warm-pro pairing. Where LinkedIn is cold-corporate, Lunchclub adds the social warmth.
16
+ - **Tomo** → gentle accent against a navy-blue identity. The credit-builder feel — pro but approachable.
17
+
18
+ ## Tokens
19
+ HSL triples in `src/index.css`. Every token's `from:` comment names its brand origin.
20
+
21
+ Surface stack: **page wash** (`210 30% 97%`, the feed background) → **white card** (`0 0% 100%`) → **chip/hover surface** (`210 24% 94%`). Hairline borders (`210 18% 88%`) define every card edge — depth never comes from fill darkening.
22
+
23
+ Primary is **LinkedIn brand-blue** (`210 90% 38%`) — the identity color. It carries CTAs, link text, name mentions, focus rings, and the connection-ring on hovered avatars.
24
+
25
+ Brand tokens — language, not decoration:
26
+ - `--blue-deep` — pressed/visited link, primary-hover.
27
+ - `--blue-soft` — tinted background for mention pills, selected chips.
28
+ - `--navy` — secondary identity for premium/featured badges (Polywork dark).
29
+ - `--teal` — Lunchclub status accent ("Open to work", "Available"). Used sparingly.
30
+ - `--amber` — endorsement / award / featured-skill tag (Polywork tag color).
31
+ - `--success-green` — quiet success (connection accepted, profile complete). Never Robinhood-bright.
32
+
33
+ ## Typography
34
+ - **Display:** Source Sans 3 — LinkedIn's display-sans feel, humanist and corporate-readable. h1–h4, weights 600/700.
35
+ - **Body:** Inter — Read.cv / Polywork body sans, dense-friendly. Base **15px** with **line-height 1.55** — tighter than soft-modern because the feed is information-dense.
36
+ - **Mono:** IBM Plex Mono — engagement counts, timestamps, follower numbers. Tabular numerics (`"tnum"`) are on globally.
37
+
38
+ H1 uses `clamp(2rem, 4.5vw, 3.25rem)` — restrained; this isn't a marketing hero direction. Heading tracking `-0.015em`. Font features `"tnum", "ss01"`.
39
+
40
+ ## Spacing
41
+ - **Container:** `max-w-6xl px-4 lg:px-6` — desktop-first three-column feed (left rail + feed + right rail).
42
+ - **Section padding tiers:**
43
+ - Hero: `pt-16 pb-10 lg:pt-24 lg:pb-14` — tight; profile-page heroes are short.
44
+ - Default: `py-12 lg:py-16`
45
+ - Tight: `py-8 lg:py-12`
46
+ - **Allowed scale values:** 4 6 8 10 12 14 16 20 24 32 40 48 64. High density — feeds breathe in steps of 4–6px, not 8–12.
47
+
48
+ ## Color
49
+ No hex in components. All color via tokens. Opacity via `/N`.
50
+
51
+ The palette is **one brand-blue carrying the entire identity** over a near-white surface. Resist adding a second saturated accent — `--teal` and `--amber` are for status/tagging and stay below 10% of any surface. Pure black is forbidden; foreground is `210 30% 12%` (corporate-ink with a blue bias).
52
+
53
+ ## Radius
54
+ `--radius: 0.5rem` (8px). LinkedIn card corners — gentle but not playful. Pills are allowed (`pillsAllowed: true`) and are the default for `Connect`, `Follow`, tag chips, and the header search bar.
55
+
56
+ ## Shadows
57
+ Three soft, low-elevation utilities:
58
+ - `.shadow-card` — feed-card resting elevation (1px border-bottom + 3px soft drop).
59
+ - `.shadow-card-hover` — hovered feed-card lift (16px tinted drop).
60
+ - `.shadow-popover` — connection-suggest / hover-card / dropdown menu.
61
+
62
+ Shadows lean cool (`210 30% 20%` tinted drops). No glow utilities — this is not creator-social.
63
+
64
+ ## Motion
65
+ Three keyframes, professional energy:
66
+ - `fade-rise` (400ms) — feed-card entrance. Short rise, no overshoot.
67
+ - `skeleton-shimmer` (1800ms loop) — post-loading skeleton. The feed never renders blank between pages.
68
+ - `ring-pulse` (1400ms loop) — live-now indicator on a headshot. Quiet attention pull on "Posting now" / "In a meeting" status.
69
+
70
+ Easing: `cubic-bezier(0.22, 1, 0.36, 1)`. `prefers-reduced-motion` is honored — `ring-pulse` collapses to a static ring; `fade-rise` collapses to fade-only.
71
+
72
+ ## Component patterns
73
+ - **Buttons:** primary = filled brand-blue rounded-full pill, weight 600 (Connect / Follow / Apply). Secondary = bordered pill with primary-color text and border. Tertiary = ghost text in foreground. Never use a sharp-corner button — every button in this language is a pill.
74
+ - **Cards:** white `bg-card`, hairline border, `.shadow-card`. Padding `p-4 lg:p-5`. Composition is **headshot top-left, name + headline + meta right of headshot, body below, action row at bottom**. Hover lifts to `.shadow-card-hover`. Feed-cards stack 4-deep without spacing fatigue.
75
+ - **Inputs:** full rounded-md box, border, `bg-card`. Focus = 2px brand-blue ring at 60% opacity. Header search bar is the one pill input — everywhere else is rounded-md.
76
+ - **CTAs:** primary pill button is default. `Connect` / `Follow` inline buttons are bordered pills in brand-blue. Mentions (`@name`) and hashtags render as inline primary text-links — never chips. Endorsements render as `--amber` chips.
77
+
78
+ ## Component families
79
+ - `*ProfileCard` — headshot + headline + connection-degree + action row.
80
+ - `*FeedPost` — headshot + name/title/time-meta + body + engagement-row.
81
+ - `*JobRow` — company-logo + role + location + time-posted + Apply pill.
82
+ - `*ConnectionChip` — small avatar + name + mutual-count + Connect pill.
83
+
84
+ ## Recommended rich media
85
+ Headshots, headshots, headshots. Square 1:1 portrait crops, professional-warm lighting (not corporate-cold). Company logos as flat marks (SVG / square crops at 1:1). Cover photos sit at 4:1 — wide, subtle, never a decorative gradient.
86
+
87
+ **AI tools:** Midjourney *"professional LinkedIn headshot, soft natural lighting, neutral office background, 50mm, color-graded warm-neutral"*. Avoid: corporate-stock laughing-at-laptop, glass-skyscraper hero shots, anything with the "AI uncanny smile."
88
+
89
+ **Aspect ratios:** 1:1 for headshots, 4:1 for cover photos, 16:9 for in-feed link previews. Never 9:16 (mobile-creator territory).
90
+
91
+ **AVOID:** vibrant gradients, vertical TikTok video, hand-drawn illustration, mood photography. This direction is sober and headshot-led.
92
+
93
+ ## Details
94
+ - **Selection:** `hsl(var(--primary) / 0.18)` background, foreground text.
95
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.6)`. Brand-blue, visible but quiet.
96
+ - **Scrollbar:** thin.
97
+
98
+ ## Exceptions
99
+ None yet.
100
+
101
+ ## Revisions
102
+ - Initial direction, generated at install time.
@@ -0,0 +1,174 @@
1
+ import type { Direction } from "../schema";
2
+
3
+ // linkedin-pro — corporate-professional networking. Brand blue dominates, dense
4
+ // feed-card surface, hairline borders, system-sans body, profile-card-first.
5
+ // Tool-first language: ship density and information, not decoration.
6
+ export const linkedinPro: Direction = {
7
+ name: "linkedin-pro",
8
+ ethos:
9
+ "LinkedIn brand-blue + profile-card density · Polywork tag-strip identity · Read.cv editorial calm · Lunchclub warm-pro pairing · Tomo gentle accent",
10
+ references: [
11
+ { brand: "LinkedIn", trait: "corporate blue + feed-card density + headshot-led identity" },
12
+ { brand: "Polywork", trait: "tag-strip identity, colorful chip taxonomy on a calm surface" },
13
+ { brand: "Read.cv", trait: "editorial-calm pro profile, restrained type" },
14
+ { brand: "Lunchclub", trait: "warm-pro pairing, friendly chrome over corporate spine" },
15
+ { brand: "Tomo", trait: "gentle accent against a navy-blue identity" },
16
+ ],
17
+ feel:
18
+ "Professional, populated, slightly dense. The feed is the page — profile cards stack, " +
19
+ "engagement counts read in tabular numerics, headlines and titles outrank everything. " +
20
+ "Corporate-friendly blue carries the entire identity; surfaces stay near-white with hairline " +
21
+ "borders so cards can sit a dozen-deep without competing.",
22
+
23
+ fonts: {
24
+ display: {
25
+ family: "Source Sans 3",
26
+ fallback: ["-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
27
+ from: "LinkedIn's display-sans feel — humanist, corporate-readable",
28
+ googleFont: "Source+Sans+3",
29
+ weights: [400, 600, 700],
30
+ },
31
+ body: {
32
+ family: "Inter",
33
+ fallback: ["-apple-system", "BlinkMacSystemFont", "Segoe UI", "sans-serif"],
34
+ from: "Read.cv / Polywork body sans — neutral, dense-friendly",
35
+ googleFont: "Inter",
36
+ weights: [400, 500, 600],
37
+ },
38
+ mono: {
39
+ family: "IBM Plex Mono",
40
+ fallback: ["ui-monospace", "SFMono-Regular", "monospace"],
41
+ from: "engagement counts, timestamps, post-meta — corporate tabular feel",
42
+ googleFont: "IBM+Plex+Mono",
43
+ weights: [400, 500],
44
+ },
45
+ },
46
+
47
+ typography: {
48
+ headingTracking: "-0.015em",
49
+ bodyTracking: "0",
50
+ fontFeatureSettings: '"tnum", "ss01"',
51
+ h1ScaleClamp: "clamp(2rem, 4.5vw, 3.25rem)",
52
+ bodyBaseSize: "0.9375rem",
53
+ bodyLineHeight: "1.55",
54
+ },
55
+
56
+ colors: {
57
+ background: { hsl: "210 30% 97%", from: "LinkedIn page wash — barely-tinted blue-gray, the feed canvas" },
58
+ foreground: { hsl: "210 30% 12%", from: "near-black with a corporate-blue bias — profile headline ink" },
59
+ card: { hsl: "0 0% 100%", from: "pure white profile/post card — lifts off the feed wash" },
60
+ popover: { hsl: "0 0% 100%", from: "same as card" },
61
+ primary: { hsl: "210 90% 38%", from: "LinkedIn brand blue — the identity. CTAs, links, name-mentions" },
62
+ primaryForeground: { hsl: "0 0% 100%", from: "white on brand blue" },
63
+ secondary: { hsl: "210 24% 94%", from: "hover/press surface — chip backgrounds, suggested-card fill" },
64
+ secondaryForeground: { hsl: "210 30% 18%", from: "deep blue-ink on secondary" },
65
+ muted: { hsl: "210 24% 94%", from: "same as secondary — quiet panels inside dense feed" },
66
+ mutedForeground: { hsl: "210 14% 42%", from: "Lunchclub gray — captions, post-meta, follower counts" },
67
+ accent: { hsl: "210 88% 94%", from: "primary tinted bg — selected chip, hovered link, mention pill" },
68
+ accentForeground: { hsl: "210 90% 28%", from: "deeper brand blue on tinted accent" },
69
+ border: { hsl: "210 18% 88%", from: "LinkedIn hairline — visible without dominating the card" },
70
+ input: { hsl: "210 18% 88%", from: "same as border" },
71
+ ring: { hsl: "210 90% 38%", from: "primary, focus only" },
72
+ destructive: { hsl: "0 70% 48%", from: "corporate red — Connection-decline, report" },
73
+ destructiveForeground: { hsl: "0 0% 100%", from: "white on red" },
74
+ brand: {
75
+ "blue-deep": { hsl: "210 90% 28%", from: "pressed/visited link, hover state on primary" },
76
+ "blue-soft": { hsl: "210 88% 94%", from: "= accent; tinted bg for connection chip, mention pill" },
77
+ navy: { hsl: "215 50% 18%", from: "secondary identity — Polywork dark accent, used for premium/badge" },
78
+ teal: { hsl: "175 60% 38%", from: "Lunchclub gentle accent — 'open to work' / status, used sparingly" },
79
+ amber: { hsl: "38 92% 50%", from: "Polywork tag color — endorsement / award / featured" },
80
+ "success-green": { hsl: "142 50% 38%", from: "connection-accepted, profile-100% — quiet, not Robinhood-green" },
81
+ "headshot-ring": { hsl: "210 90% 38%", from: "= primary; the brand-ring around avatars on hover" },
82
+ },
83
+ },
84
+
85
+ spacing: {
86
+ base: 4,
87
+ scale: [4, 6, 8, 10, 12, 14, 16, 20, 24, 32, 40, 48, 64],
88
+ containerMax: "max-w-6xl",
89
+ containerPadding: "px-4 lg:px-6",
90
+ sectionPadding: {
91
+ hero: "pt-16 pb-10 lg:pt-24 lg:pb-14",
92
+ default: "py-12 lg:py-16",
93
+ tight: "py-8 lg:py-12",
94
+ },
95
+ },
96
+
97
+ radius: {
98
+ base: "0.5rem", // 8px — LinkedIn card corners, gentle but corporate
99
+ pillsAllowed: true, // connection chips, follower pills, tag taxonomy
100
+ },
101
+
102
+ shadows: {
103
+ style: "soft",
104
+ utilities: {
105
+ "shadow-card":
106
+ "0 1px 0 hsl(210 18% 86%), 0 1px 3px hsl(210 30% 20% / 0.04)",
107
+ "shadow-card-hover":
108
+ "0 1px 0 hsl(210 18% 86%), 0 6px 16px hsl(210 30% 20% / 0.08)",
109
+ "shadow-popover":
110
+ "0 8px 24px hsl(210 30% 20% / 0.12), 0 0 0 1px hsl(210 18% 86%)",
111
+ },
112
+ },
113
+
114
+ motion: {
115
+ easing: "cubic-bezier(0.22, 1, 0.36, 1)",
116
+ durations: {
117
+ reveal: 400,
118
+ loop: 1800,
119
+ ambient: 12000,
120
+ },
121
+ keyframes: {
122
+ "fade-rise": {
123
+ css:
124
+ "from { opacity: 0; transform: translateY(8px); }\n" +
125
+ "to { opacity: 1; transform: translateY(0); }",
126
+ defaultDuration: 400,
127
+ iteration: "once",
128
+ purpose: "feed-card entrance — short, professional, no overshoot",
129
+ },
130
+ "skeleton-shimmer": {
131
+ css:
132
+ "0% { background-position: -200% 0; }\n" +
133
+ "100% { background-position: 200% 0; }",
134
+ defaultDuration: 1800,
135
+ iteration: "infinite",
136
+ purpose: "post-loading skeleton — pages of feed never render blank",
137
+ },
138
+ "ring-pulse": {
139
+ css:
140
+ "0% { box-shadow: 0 0 0 0 hsl(210 90% 38% / 0.4); }\n" +
141
+ "100% { box-shadow: 0 0 0 8px hsl(210 90% 38% / 0); }",
142
+ defaultDuration: 1400,
143
+ iteration: "infinite",
144
+ purpose: "live-now indicator on a profile headshot — quiet attention pull",
145
+ },
146
+ },
147
+ respectsReducedMotion: true,
148
+ },
149
+
150
+ density: "high",
151
+
152
+ patterns: {
153
+ button:
154
+ "Primary = filled brand-blue, rounded-full pill, weight 600. " +
155
+ "Secondary = pill with primary-color border + primary text (Connect / Follow). " +
156
+ "Tertiary = ghost text in foreground. Hover deepens fill to blue-deep.",
157
+ card:
158
+ "White bg-card, hairline border, shadow-card. Internal padding p-4 lg:p-5. " +
159
+ "Headshot top-left, name + headline right, action-row bottom. Hover lifts to shadow-card-hover.",
160
+ input:
161
+ "Full rounded-md box, border, bg-card. Focus = 2px brand-blue ring. " +
162
+ "Search bar in the header has a pill shape; everywhere else is rounded-md.",
163
+ cta:
164
+ "Primary pill button is default. Inline 'Connect' / 'Follow' buttons are bordered pills. " +
165
+ "Mentions and hashtags render as inline primary-colored text-links, never chips.",
166
+ },
167
+
168
+ details: {
169
+ selectionBg: "hsl(var(--primary) / 0.18)",
170
+ selectionFg: "hsl(var(--foreground))",
171
+ focusRing: "2px solid hsl(var(--ring) / 0.6)",
172
+ scrollbarStyle: "thin",
173
+ },
174
+ };
@@ -0,0 +1,94 @@
1
+ # Design Direction — Logistics-Modern
2
+
3
+ ## Ethos
4
+ Shippo cool-white + carrier-tile chrome · ShipBob warm-blue dashboard density · Flexport ocean-navy + cargo-grid · ShipStation rate-table density · Easyship friendly carrier-comparison cards
5
+
6
+ ## Feel
7
+ A logistics-ops console. Cool-white canvas, a single signal-blue accent, hairline borders carrying the structure. Rate-comparison tables are the hero — carriers × service-levels at a glance, prices in mono tabular. The fulfillment-network map is a working chart, not a decorative globe. Integration-logo strips read as proof, not social validation. The page is what an ops manager opens on a Tuesday at 8am.
8
+
9
+ ## Reference brands
10
+ - **Shippo** → cool-white canvas with carrier-tile rate cards. The page is barely-blue, not warm.
11
+ - **ShipBob** → warm-blue dashboard density and fulfillment-network map. The map is a tool, not a decoration.
12
+ - **Flexport** → ocean-navy and cargo-grid clarity. The sidebar surface is deeper than the body, with a navy lean.
13
+ - **ShipStation** → dense rate-table comparison. Tabular numerics carry the page.
14
+ - **Easyship** → friendly carrier-comparison cards and integration-logo strips. The proof is the integrations.
15
+
16
+ ## Tokens
17
+ All tokens live in `src/index.css` as HSL triples. Every token's `from:` comment names its brand origin.
18
+
19
+ Surface stack is **cool-white background** → `--card` (pure white, one degree above) → `--secondary` (cool gray for table headers and inset panels). Depth comes from hairline borders, not shadows. The sidebar (if used) sits on `--ocean-navy`, a separate surface family.
20
+
21
+ Brand tokens: `--signal-blue`, `--signal-blue-deep`, `--signal-blue-soft`, `--ocean-navy`, `--freight-amber`, `--delivered-green`, `--map-land`, `--map-route`. Freight-amber means "in transit" and delivered-green means "delivered" — semantic-only, never decorative. Ocean-navy is reserved for sidebar surfaces and the map basemap.
22
+
23
+ ## Typography
24
+ - **Display:** Inter semi-heavy (Shippo / Flexport marketing). h1–h4. Tracking `-0.022em`.
25
+ - **Body:** Inter regular/medium (ShipBob / ShipStation body). Body base **14.4px** with **line-height 1.5** — dashboard density.
26
+ - **Mono:** IBM Plex Mono. Rate tables, tracking numbers, weight/dim units. Plex Mono is wider than JetBrains and scans better at table row height.
27
+
28
+ H1 uses `clamp(2rem, 4vw, 3rem)`. Restrained — the rate table is the headline, not the prose.
29
+
30
+ ## Spacing
31
+ - **Container:** `max-w-7xl px-4 lg:px-6` — dashboard-wide.
32
+ - **Section padding tiers:**
33
+ - Hero: `pt-12 pb-8 lg:pt-16 lg:pb-12`
34
+ - Default: `py-10 lg:py-14`
35
+ - Tight: `py-6 lg:py-10`
36
+ - **Allowed scale values:** 2 4 6 8 10 12 14 16 20 24 32 40 48 64. The extra 2/14 steps exist for table-cell padding.
37
+
38
+ ## Color
39
+ No hex anywhere in component files. All color via tokens.
40
+
41
+ Signal-blue is the only saturated UI accent. Freight-amber, delivered-green, ocean-navy are semantic-only. Status pills follow strict semantics: `In transit` (amber), `Delivered` (green), `Failed` (destructive). Pills use brand-soft backgrounds with brand-deep text — never solid fills.
42
+
43
+ ## Radius
44
+ `--radius: 0.375rem` (6px). Sharper than ev-charging — full dashboard language. Pills allowed (`pillsAllowed: true`) for status badges, carrier-name chips, integration tiles.
45
+
46
+ ## Shadows
47
+ **Minimal.** Three utilities: `.shadow-card` (subtle 1px lift), `.shadow-popover` (4-14px for dropdowns and modals), `.shadow-table-row` (inset bottom border). No glows. No colored shadows. The page is held together by borders.
48
+
49
+ ## Motion
50
+ Four keyframes: `fade-in` (200ms — table-row and carrier-card entrance, opacity only), `route-dash` (1400ms infinite — in-transit routes on the network map flow with a dashed line), `row-hover` (120ms — rate-table row hover background), `shimmer` (1400ms infinite — loading skeleton for rate cells while carriers respond).
51
+
52
+ `route-dash` is the one decorative motion — it tells the eye which shipments are moving. Under `prefers-reduced-motion`, the dashes go static at full-extension. Easing: `cubic-bezier(0.22, 1, 0.36, 1)`.
53
+
54
+ ## Density
55
+ High. The user is comparing 15 rates across 5 carriers — they are here to read a table, not to admire a hero. Rate-table rows are 36px tall. Carrier cards are 5 across at desktop. Integration-logo strip fits 8–10 logos per row.
56
+
57
+ ## Component patterns
58
+ - **Buttons:** solid signal-blue primary (rounded-md, shadow-card) for the single commit — `Buy label`, `Connect carrier`, `Ship now`. Secondary is ghost. Tertiary is text-link blue. Hover deepens fill to `--signal-blue-deep`; no scale, no shadow growth.
59
+ - **Cards:** rounded-md, 1px `--border`, `bg-card`, `shadow-card`. Padding `p-4 lg:p-5`. Carrier-rate card holds carrier logo, service level, price, ETA — modular, one purpose.
60
+ - **Inputs:** full rounded-md box, 1px `--input` border, `bg-card`. Tracking-number input is mono. Focus = 2px signal-blue ring at 45% opacity. Weight/dim inputs right-aligned mono.
61
+ - **CTA:** primary signal-blue button for commit. Status pills follow semantic colors (amber/green/destructive) with soft backgrounds. Rate-table selected row uses `--signal-blue-soft` with a left-edge signal-blue accent bar.
62
+
63
+ ## Recommended rich media
64
+ Logistics-Modern leans on **product UI screenshots**, **integration logos**, and **fulfillment-network maps** — the actual dashboard, the actual carrier logos, the actual map. Avoid stock cargo-ship-at-sunset imagery or generic "global commerce" abstractions.
65
+
66
+ **Iconography:** 20px grid, 1.5px stroke, rounded line caps. Box, truck, plane, container, scan, label — drawn in a single hand. Carrier logos use the real marks; never redrawn.
67
+
68
+ **Product screenshots** are the headline media. Captured at 2x retina, cropped to dashboard cards, framed in a subtle browser-chrome SVG. Drop shadow under screenshots is `shadow-popover`, never a custom glow.
69
+
70
+ **AI tool recommendations:** **Midjourney / Flux** with prompts like *"photorealistic warehouse fulfillment interior, neutral lighting, conveyor belts, isometric angle, no people, no logos, soft cool tones"* for the rare warehouse hero shot. **Recraft** for the flat icon set. Avoid the default "global supply chain" world-map gradients — they read consultant deck.
71
+
72
+ **Aspect ratios:** 16:10 for dashboard screenshots. 1:1 for carrier-logo tiles. 21:9 strip for the network-map preview. Never 16:9 — that's video, not UI.
73
+
74
+ **Video:** rare. If used, it is a screen recording of the product UI itself — 30fps, ≤8MB H.265, poster mandatory. No people. No music in autoplay.
75
+
76
+ **Performance:** product screenshots ship as AVIF at 2x retina, ≤120KB each. Network-map is SVG with route overlays, never a raster screenshot of Google Maps. LCP target 1.8s.
77
+
78
+ **Avoid:** cargo-ship-at-sunset stock photography, generic "global commerce" world-globe imagery, neon-blue cyberpunk supply-chain visuals, shipping-container-on-truck-at-night moody shots, animated GIFs of cursors, glassmorphic panels.
79
+
80
+ **Accessibility:** every status pill includes a text label (`In transit`, `Delivered`), never color-only. Rate-table includes `scope` attributes and a screen-reader caption summarizing carrier count and service-level count. Signal-blue meets 4.5:1 against white at body size.
81
+
82
+ ## Component families
83
+ None at install time. Family conventions emerge as the project grows.
84
+
85
+ ## Details
86
+ - **Selection:** `hsl(var(--primary) / 0.22)` background, foreground text.
87
+ - **Focus ring:** `2px solid hsl(var(--ring) / 0.45)`. Signal-blue, soft.
88
+ - **Scrollbar:** thin.
89
+
90
+ ## Exceptions
91
+ None yet.
92
+
93
+ ## Revisions
94
+ - Initial direction, generated at install time.