@nurix/etna 0.18.19 → 0.18.20
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.
- package/data/harness-index.json +1 -1
- package/data/harnesses/code/harness.json +2 -2
- package/data/harnesses/code/skills/design/SKILL.md +65 -0
- package/data/harnesses/code/skills/design/data/catalog/rules.csv +132 -0
- package/data/harnesses/code/skills/design/data/design-md/SCHEMA.md +317 -0
- package/data/harnesses/code/skills/design/data/design-md/library/airbnb.md +235 -0
- package/data/harnesses/code/skills/design/data/design-md/library/airtable.md +232 -0
- package/data/harnesses/code/skills/design/data/design-md/library/anthropic-claude.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/apple.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/binance.md +223 -0
- package/data/harnesses/code/skills/design/data/design-md/library/bmw.md +219 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cal.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/clay.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/clickhouse.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cohere.md +227 -0
- package/data/harnesses/code/skills/design/data/design-md/library/coinbase.md +237 -0
- package/data/harnesses/code/skills/design/data/design-md/library/composio.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/cursor.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/elevenlabs.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/expo.md +228 -0
- package/data/harnesses/code/skills/design/data/design-md/library/figma.md +221 -0
- package/data/harnesses/code/skills/design/data/design-md/library/framer.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/hashicorp.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/ibm.md +234 -0
- package/data/harnesses/code/skills/design/data/design-md/library/intercom.md +240 -0
- package/data/harnesses/code/skills/design/data/design-md/library/kraken.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/linear-app.md +237 -0
- package/data/harnesses/code/skills/design/data/design-md/library/lovable.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/meta.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/minimax.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mintlify.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/miro.md +233 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mistral-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/mongodb.md +236 -0
- package/data/harnesses/code/skills/design/data/design-md/library/notion.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/nvidia.md +222 -0
- package/data/harnesses/code/skills/design/data/design-md/library/ollama.md +226 -0
- package/data/harnesses/code/skills/design/data/design-md/library/opencode-ai.md +223 -0
- package/data/harnesses/code/skills/design/data/design-md/library/posthog.md +234 -0
- package/data/harnesses/code/skills/design/data/design-md/library/raycast.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/replicate.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/resend.md +285 -0
- package/data/harnesses/code/skills/design/data/design-md/library/revolut.md +225 -0
- package/data/harnesses/code/skills/design/data/design-md/library/runwayml.md +219 -0
- package/data/harnesses/code/skills/design/data/design-md/library/sanity.md +251 -0
- package/data/harnesses/code/skills/design/data/design-md/library/sentry.md +244 -0
- package/data/harnesses/code/skills/design/data/design-md/library/shopify.md +227 -0
- package/data/harnesses/code/skills/design/data/design-md/library/slack.md +240 -0
- package/data/harnesses/code/skills/design/data/design-md/library/spacex.md +252 -0
- package/data/harnesses/code/skills/design/data/design-md/library/spotify.md +248 -0
- package/data/harnesses/code/skills/design/data/design-md/library/stripe.md +241 -0
- package/data/harnesses/code/skills/design/data/design-md/library/supabase.md +255 -0
- package/data/harnesses/code/skills/design/data/design-md/library/superhuman.md +226 -0
- package/data/harnesses/code/skills/design/data/design-md/library/tesla.md +233 -0
- package/data/harnesses/code/skills/design/data/design-md/library/theverge.md +248 -0
- package/data/harnesses/code/skills/design/data/design-md/library/together-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/uber.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/vercel.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/voltagent.md +245 -0
- package/data/harnesses/code/skills/design/data/design-md/library/warp.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/webflow.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/wired.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/wise.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/x-ai.md +220 -0
- package/data/harnesses/code/skills/design/data/design-md/library/zapier.md +238 -0
- package/data/harnesses/code/skills/design/data/design-md/nurix.md +217 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/command-center.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/create-edit.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/dashboard.tsx +248 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/entity-detail.tsx +245 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/list-detail.tsx +223 -0
- package/data/harnesses/code/skills/design/data/operator-pack/exemplars/log-stream.tsx +249 -0
- package/data/harnesses/code/skills/design/data/operator-pack/fixtures.md +88 -0
- package/data/harnesses/code/skills/design/data/operator-pack/surface-catalog.md +132 -0
- package/data/harnesses/code/skills/design/data/operator-pack/trust-rubric.md +76 -0
- package/data/harnesses/code/skills/design/references/create.md +126 -0
- package/data/harnesses/code/skills/design/references/diagnosis.md +108 -0
- package/data/harnesses/code/skills/design/references/hard-rules.md +155 -0
- package/data/harnesses/code/skills/design/references/improve.md +85 -0
- package/data/harnesses/code/skills/design/references/interaction.md +77 -0
- package/data/harnesses/code/skills/design/references/introspect.md +100 -0
- package/data/harnesses/code/skills/design/references/lifecycle.md +73 -0
- package/data/harnesses/code/skills/design/references/personality.md +504 -0
- package/data/harnesses/code/skills/design/references/structure.md +138 -0
- package/data/harnesses/code/skills/design/scripts/derive-personality.mjs +706 -0
- package/data/harnesses/code/skills/design/scripts/detector.mjs +898 -0
- package/data/harnesses/code/skills/design/scripts/generate-fixtures.mjs +551 -0
- package/data/harnesses/code/skills/design/scripts/hook-config.json +11 -0
- package/data/harnesses/code/skills/design/scripts/phase-gate.mjs +386 -0
- package/data/harnesses/code/skills/design/scripts/preship-sweep.mjs +280 -0
- package/data/harnesses/code/skills/design/scripts/render-rung.mjs +690 -0
- package/data/harnesses/code/skills/design/scripts/scaffold.mjs +552 -0
- package/data/harnesses/code/skills/design/scripts/self-integrity.mjs +432 -0
- package/package.json +1 -1
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: Miro
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Miro — the operator reading
|
|
9
|
+
|
|
10
|
+
Miro's marketing canvas is a confident, playful frame: a canary-yellow wordmark on stark white,
|
|
11
|
+
black-pill CTAs, and oversized pastel feature cards echoing the live whiteboard's sticky-note palette.
|
|
12
|
+
The 80px Roobert display, the 120px hero rhythm, the real-board mockups, and the exuberant pastels stay
|
|
13
|
+
on the marketing site. An operator surface inherits the *spine*: black ink on white, one chromatic
|
|
14
|
+
accent (Miro brand blue), the friendly geometric Roobert type voice at its elegant medium weight, and a
|
|
15
|
+
roomy rounded radius — a friendly tool made by people who like color, the joy demoted to chart
|
|
16
|
+
encodings. Judgments away from the brand are annotated `# derived:` where the corpus is silent.
|
|
17
|
+
|
|
18
|
+
## 1 Visual Theme
|
|
19
|
+
|
|
20
|
+
Light by default; dark is not documented and stays opt-in. Flat: hierarchy is carried by hairline
|
|
21
|
+
`border`, type weight, and the black/white contrast — never by heavy shadow, and where a true overlay
|
|
22
|
+
lifts, the shadow is soft and **navy-tinted** (`rgba(5,0,56,…)`), never a hard black drop. The primary
|
|
23
|
+
action fills black — Miro's own primary is the black pill, so `primary` is achromatic and the one
|
|
24
|
+
chromatic accent, Miro brand blue, stays a scarce single-shot. Canary yellow is a brand grace for one
|
|
25
|
+
moment (the wordmark lockup), no operator role. The anchor surface is a white content canvas beside a
|
|
26
|
+
faintly cool `sidebar`. Density is `standard`, leaning roomy — the airy rhythm read into an operator
|
|
27
|
+
tier, stepping denser per archetype.
|
|
28
|
+
|
|
29
|
+
## 2 Color Roles
|
|
30
|
+
|
|
31
|
+
Light values first (the manifest carries the corpus's native hex). One chromatic accent — brand blue
|
|
32
|
+
carries interactive meaning; the sticky-note pastels appear only as chart series; yellow is a grace.
|
|
33
|
+
|
|
34
|
+
| Role | Value | Allowed where |
|
|
35
|
+
| --- | --- | --- |
|
|
36
|
+
| `background` / `card` / `popover` | white `#ffffff` | page, cards, and overlays — the dominant surface |
|
|
37
|
+
| `foreground` | Miro ink `#1c1c1e` | all primary ink — headlines, body, labels |
|
|
38
|
+
| `muted` / `secondary` | cool surface `#f7f8fa` | hover rows, tile fills, secondary buttons, the sidebar ground |
|
|
39
|
+
| `muted-foreground` | slate `#555a6a` | labels, captions, table meta — the secondary ink role |
|
|
40
|
+
| `border` | hairline `#e0e2e8` | every separator, grid line, and divider |
|
|
41
|
+
| `input` | stronger hairline `#c7cad5` | field edges — Miro deliberately gives inputs a heavier edge than dividers |
|
|
42
|
+
| `primary` | black `#1c1c1e` | the one primary action; active-nav fill; selected tab |
|
|
43
|
+
| `accent` | pale lavender `#f5f3ff` | selected / hovered rows and nav — a tint, never a fill (Miro's featured-tier wash) |
|
|
44
|
+
| `accent-foreground` / `ring` | brand blue `#4262ff` | inline links, the focus outline, active indicators — the single chromatic pop |
|
|
45
|
+
| `destructive` | red `#e5484d` | destructive actions and error state only |
|
|
46
|
+
| `success` / `warning` | green `#00b473` / amber `#fcb900` | status signalling only, never chrome |
|
|
47
|
+
|
|
48
|
+
The pastels — coral `#ff9999`, teal `#0fbcb0`, rose, orange — are marketing surfaces with no operator
|
|
49
|
+
role, reappearing only as `chart-*` encodings (§7). Canary yellow `#ffd02f` is the wordmark grace,
|
|
50
|
+
never a CTA, status hue, or background fill.
|
|
51
|
+
|
|
52
|
+
## 3 Typography
|
|
53
|
+
|
|
54
|
+
One sans, one mono. `font-sans` is **Roobert PRO** — Miro's geometric, slightly-rounded custom face
|
|
55
|
+
(fallbacks Noto Sans, -apple-system, BlinkMacSystemFont) — carrying UI, body, and headings by weight
|
|
56
|
+
and size, never a second family. Its irreducible trait is the **elegant medium weight**: headings run
|
|
57
|
+
500, not 700 — the brand has no 700 — so hierarchy comes from size and the geometric face, not
|
|
58
|
+
heaviness. `font-mono` substitutes for the mono the corpus never ships, reserved for IDs, codes,
|
|
59
|
+
timestamps, and log lines; numeric columns render `tabular-nums`.
|
|
60
|
+
|
|
61
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
62
|
+
| --- | --- | --- | --- |
|
|
63
|
+
| h1 | page title | 24px / 1.25 | `font-weight-strong` (500) · `heading-tracking` |
|
|
64
|
+
| h2 | section head | 18px / 1.35 | `font-weight-strong` (500) · -0.01em |
|
|
65
|
+
| h3 | card / group head | 16px / 1.45 | `font-weight-strong` (500) · 0 |
|
|
66
|
+
| body | UI + prose | 14px / 1.5 | `font-weight-normal` (400) |
|
|
67
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` (400) |
|
|
68
|
+
| eyebrow / caption | uppercase table divider | 11px / 1.4 | 600, `+0.05em`, uppercase |
|
|
69
|
+
|
|
70
|
+
Emphasis bumps weight one step (400 → 500); the 600 weight is reserved for uppercase eyebrows and badge
|
|
71
|
+
chips. Never change size to emphasise. The 80px hero display, 64px stat-display, and the aggressive
|
|
72
|
+
-2px display tracking stay on the marketing site.
|
|
73
|
+
|
|
74
|
+
## 4 Component Stylings
|
|
75
|
+
|
|
76
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
77
|
+
|
|
78
|
+
- **Button** — `primary`: filled black `primary` on white `primary-foreground`, base `radius` (8px) —
|
|
79
|
+
the marketing full-pill relaxes to the functional radius in dense chrome; the pill (9999) stays on
|
|
80
|
+
icon-only buttons, filter chips, and badges. Secondary: `secondary` fill, 1px `border`, `foreground`.
|
|
81
|
+
Ghost: transparent, `accent` on hover.
|
|
82
|
+
- **Input** — `background` fill, 1px `border` at the stronger `input` edge, `radius`; focus draws the
|
|
83
|
+
brand-blue `ring` at 2px, no fill change and no glow.
|
|
84
|
+
- **Card** — `card` surface, 1px `border`, `radius`, inset by `density-inset`; shadow only when it must
|
|
85
|
+
lift (`shadow-intensity`); larger panels may take the 12px radius step.
|
|
86
|
+
- **Table row** — height `table-row-height`; `border` grid lines; `muted` on hover; `tabular-nums` on
|
|
87
|
+
numeric columns; selection tints the pale-lavender `accent` with a brand-blue indicator.
|
|
88
|
+
- **Side panel** — detail and edit open beside the work (`side-panel-width`, `side-panel-width-rich`
|
|
89
|
+
for content-heavy), not over it.
|
|
90
|
+
- **Badge** — pill radius, `muted`/status fill, uppercase caption; status badges take `success` /
|
|
91
|
+
`warning` / `destructive`, never `primary` or brand blue.
|
|
92
|
+
|
|
93
|
+
## 5 Layout
|
|
94
|
+
|
|
95
|
+
Base spacing unit 4px (8px the primary increment); the on-scale ramp is `4 · 8 · 12 · 16 · 20 · 24 ·
|
|
96
|
+
32 · 40 · 48 · 64` — Miro's distinctive 20px step is kept. Shell dimensions map one-to-one to the
|
|
97
|
+
layout primitives: sidebar `sidebar-width-expanded` / `sidebar-width-collapsed`, topbar `topbar-height`
|
|
98
|
+
(64px — Miro's own nav height), side panel `side-panel-width` / `side-panel-width-rich`, modal
|
|
99
|
+
`modal-width-max`, forms `form-max-width`, tables full-width. Density is governed globally by
|
|
100
|
+
`density-tier` and stepped per archetype by the surface catalog. The 96px and 120px marketing rhythms
|
|
101
|
+
stay behind.
|
|
102
|
+
|
|
103
|
+
## 6 Depth
|
|
104
|
+
|
|
105
|
+
Flat, with strategic soft depth on true overlays only. Hierarchy is the surface ladder and hairlines,
|
|
106
|
+
not shadow:
|
|
107
|
+
|
|
108
|
+
- **0 — canvas** `background`, no border.
|
|
109
|
+
- **1 — panel / card** `card` on a 1px `border`; shadow only when it must lift off the canvas.
|
|
110
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a soft `md`
|
|
111
|
+
shadow, navy-tinted (`rgba(5,0,56,0.08)`), never a hard black drop. Rank is border and position.
|
|
112
|
+
|
|
113
|
+
Focus is a 2px brand-blue `ring` outline (never a glow), visible on every interactive element. Three
|
|
114
|
+
z-levels: content, chrome, overlay.
|
|
115
|
+
|
|
116
|
+
## 7 Do's & Don'ts
|
|
117
|
+
|
|
118
|
+
- **Do** fill black `primary` for the single most important action; everything else is neutral or status.
|
|
119
|
+
- **Do** keep brand blue scarce — inline links, the focus `ring`, and active indicators only; it is a
|
|
120
|
+
single-shot accent, not a fill or a body-text color.
|
|
121
|
+
- **Do** carry hierarchy with size, the geometric Roobert face, hairlines, and whitespace — never heavy
|
|
122
|
+
weight; there is no 700. Apply `tabular-nums` to numeric columns and `font-mono` to IDs and timestamps.
|
|
123
|
+
- **Don't** reach for the sticky-note pastels as UI chrome; they are marketing surfaces and appear
|
|
124
|
+
operator-side only as `chart-*` series.
|
|
125
|
+
- **Don't** spend canary yellow on a CTA, status hue, or background — it is the wordmark grace, nothing more.
|
|
126
|
+
- **Don't** introduce a second chromatic accent, or signal elevation with heavy or hard-black shadows —
|
|
127
|
+
Miro's shadows are soft and navy-tinted.
|
|
128
|
+
|
|
129
|
+
## 8 Responsive
|
|
130
|
+
|
|
131
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
132
|
+
|
|
133
|
+
| Breakpoint | What changes |
|
|
134
|
+
| --- | --- |
|
|
135
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
136
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
|
|
137
|
+
| 1024 | sidebar expands; two-pane list+detail holds side by side |
|
|
138
|
+
| 1440 | content caps at `form-max-width` for forms; tables and dashboards use the full width |
|
|
139
|
+
|
|
140
|
+
## 9 Agent Prompt Guide
|
|
141
|
+
|
|
142
|
+
Directives the emitting agent follows verbatim:
|
|
143
|
+
|
|
144
|
+
- Wear the spine, not the marketing: black ink on white, the friendly rounded radius, hairline depth.
|
|
145
|
+
The 80px hero display, the pastel feature cards, the real-board mockups, and the 120px rhythm stay behind.
|
|
146
|
+
- Primary action fills black. If two things want the black fill, one of them is not primary. Brand blue
|
|
147
|
+
is single-shot — inline links, the focus `ring`, active indicators — never a fill or body text; canary
|
|
148
|
+
yellow is the wordmark grace, never a UI color.
|
|
149
|
+
- Buttons sit at the base `radius`; the full pill (9999) is for icon-only buttons, filter chips, and
|
|
150
|
+
badges. Hierarchy is size and the geometric face, never heavy weight — there is no 700; emphasise 400 → 500.
|
|
151
|
+
- Every numeric column is `tabular-nums`; every ID / code / timestamp is `font-mono`.
|
|
152
|
+
- The sticky-note pastels live only in charts (`chart-1..5`); stay flat — hairline and weight before
|
|
153
|
+
shadow, and reach past a hairline only for a real, soft, navy-tinted overlay.
|
|
154
|
+
|
|
155
|
+
```yaml design-primitives
|
|
156
|
+
radius: 8px # corpus: Miro's functional radius (rounded.md — inputs, search-pill, ghost); the marketing 28-32px pastel cards stay behind
|
|
157
|
+
shadow-intensity: 0.5 # derived: predominantly flat with soft navy-tinted shadows (corpus 0.04-0.12 alpha); shadow lifts only true overlays
|
|
158
|
+
border-weight: 1px
|
|
159
|
+
density-gap: 1
|
|
160
|
+
density-inset: 1
|
|
161
|
+
font-sans: Roobert PRO, Noto Sans, -apple-system, BlinkMacSystemFont, sans-serif # corpus: Roobert PRO plus documented fallbacks
|
|
162
|
+
font-mono: Geist Mono, ui-monospace, SFMono-Regular, monospace # derived: Miro ships no mono (all Roobert); operator IDs/codes/logs need one — Geist Mono's geometric humanist character pairs with Roobert
|
|
163
|
+
font-weight-normal: 400 # corpus: body 400
|
|
164
|
+
font-weight-strong: 500 # corpus: headings AND medium emphasis run 500; Roobert never uses 700 — the elegant medium-weight display voice carries
|
|
165
|
+
heading-tracking: -0.01em # derived: display tracks -2px…-1px but relaxes to 0 by heading-3; a faint -0.01em echoes the display DNA at operator heading sizes
|
|
166
|
+
duration-unit: 50ms # derived: corpus documents no timings; operator functional base
|
|
167
|
+
duration-fast: 100ms # derived: operator functional default
|
|
168
|
+
duration-normal: 150ms # corpus: recommends 150-200ms ease
|
|
169
|
+
duration-slow: 200ms # corpus: recommends 150-200ms ease (upper bound); friendly-quick
|
|
170
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus recommends a generic "ease"; standard functional curve
|
|
171
|
+
contrast-boost: 1 # derived: Miro's hairlines are visible and inputs already take a stronger edge; no boost needed
|
|
172
|
+
icon-stroke: 1.75 # derived: Miro ships no icon system; lucide at 1.75 matches Roobert's geometric medium-weight character
|
|
173
|
+
icon-size-base: 16px # derived: operator standard
|
|
174
|
+
sidebar-width-expanded: 256px # derived: Miro is marketing (no app shell); the airy brand rhythm → a touch roomier than a dense rail
|
|
175
|
+
sidebar-width-collapsed: 64px # derived: mirrors Miro's ~64px nav height as the icon rail
|
|
176
|
+
topbar-height: 64px # corpus: Miro's documented top-nav height (~64px)
|
|
177
|
+
side-panel-width: 440px # derived: no shell in corpus; roomy per the friendly brand rhythm
|
|
178
|
+
side-panel-width-rich: 640px # derived: no shell; content-heavy detail width
|
|
179
|
+
modal-width-max: 560px # derived: no shell; modals for confirmations only
|
|
180
|
+
form-max-width: 640px # derived: no shell; comfortable single-column form cap
|
|
181
|
+
table-row-height: 44px # corpus: Miro's 44px form/touch-target height → roomy operator rows; dense archetypes step down via the surface catalog
|
|
182
|
+
verbosity: default
|
|
183
|
+
feedback: subtle # rationale: Miro's friendly, responsive brand wants present-but-tasteful feedback
|
|
184
|
+
density-tier: standard # rationale: a spacious, airy consumer brand read down to an honest operator tier, leaning roomy; density earned per archetype
|
|
185
|
+
product-traits: [saas, collaboration, workspace, dashboard, admin]
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
```yaml lever-manifest
|
|
189
|
+
version: 1
|
|
190
|
+
fonts: { sans: "Roobert PRO, Noto Sans, -apple-system, BlinkMacSystemFont, sans-serif", mono: "Geist Mono, ui-monospace, SFMono-Regular, monospace" }
|
|
191
|
+
color-tokens:
|
|
192
|
+
light:
|
|
193
|
+
background: "#ffffff"
|
|
194
|
+
foreground: "#1c1c1e"
|
|
195
|
+
card: "#ffffff"
|
|
196
|
+
card-foreground: "#1c1c1e"
|
|
197
|
+
muted: "#f7f8fa"
|
|
198
|
+
muted-foreground: "#555a6a"
|
|
199
|
+
border: "#e0e2e8"
|
|
200
|
+
input: "#c7cad5" # corpus: hairline-strong — Miro gives inputs a heavier edge than dividers
|
|
201
|
+
ring: "#4262ff" # corpus: brand blue on the focus edge (text-input-focused)
|
|
202
|
+
primary: "#1c1c1e" # corpus: the black-pill primary CTA color
|
|
203
|
+
primary-foreground: "#ffffff"
|
|
204
|
+
accent: "#f5f3ff" # corpus: surface-pricing-featured lavender — the featured/selected wash
|
|
205
|
+
accent-foreground: "#4262ff" # corpus: brand blue on the lavender tint
|
|
206
|
+
destructive: "#e5484d" # derived: Miro ships only soft error backgrounds; a saturated red is needed for destructive fills, tuned to the warm coral-leaning palette
|
|
207
|
+
destructive-foreground: "#ffffff"
|
|
208
|
+
success: "#00b473" # corpus: success-accent green
|
|
209
|
+
warning: "#fcb900" # derived: brand-yellow-deep repurposed as the amber warning hue
|
|
210
|
+
popover: "#ffffff"
|
|
211
|
+
popover-foreground: "#1c1c1e"
|
|
212
|
+
secondary: "#f7f8fa"
|
|
213
|
+
secondary-foreground: "#1c1c1e"
|
|
214
|
+
chart-1: "#4262ff" # brand: blue anchors the ramp as the saturated primary series
|
|
215
|
+
chart-2: "#0fbcb0" # brand: teal sticky-note hue
|
|
216
|
+
chart-3: "#ff9999" # brand: coral sticky-note hue
|
|
217
|
+
chart-4: "#fcb900" # brand: deep-yellow sticky-note hue
|
|
218
|
+
chart-5: "#00b473" # brand: green success accent, completing the sticky-note set
|
|
219
|
+
sidebar: "#f7f8fa"
|
|
220
|
+
sidebar-foreground: "#1c1c1e"
|
|
221
|
+
sidebar-primary: "#1c1c1e"
|
|
222
|
+
sidebar-primary-foreground: "#ffffff"
|
|
223
|
+
sidebar-accent: "#eef0f3" # corpus: hairline-soft — neutral nav hover/selection tint
|
|
224
|
+
sidebar-accent-foreground: "#1c1c1e"
|
|
225
|
+
sidebar-border: "#e0e2e8"
|
|
226
|
+
sidebar-ring: "#4262ff" # corpus: brand-blue focus ring in the nav
|
|
227
|
+
spacing-scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64]
|
|
228
|
+
radius-scale: [0, 4, 8, 12, 16, 9999]
|
|
229
|
+
shadow-levels: [none, sm, md]
|
|
230
|
+
motion: { durations: [100, 150, 200], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
231
|
+
icons: { family: lucide, stroke: 1.75 }
|
|
232
|
+
accent-count: 1
|
|
233
|
+
```
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
---
|
|
2
|
+
schema: design-md/v1
|
|
3
|
+
product: Mistral AI
|
|
4
|
+
provenance: library
|
|
5
|
+
sourced: 2026-07-04
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Mistral AI — the operator reading
|
|
9
|
+
|
|
10
|
+
Mistral's public brand is cinematographic: sunset gradients over mountain photography, a red-to-cream
|
|
11
|
+
"stripe" closing every page, hero-scale near-serif display type. This is the *operator* reading — the
|
|
12
|
+
palette temperature, the single saturated-orange accent, the sober editorial geometry, and the type
|
|
13
|
+
voice carry across; the gradients, photographic heroes, and hero-scale display face stay behind. An
|
|
14
|
+
internal tool wearing Mistral is a warm, cream-panelled console with one orange action, not a landing
|
|
15
|
+
page. Both machine blocks are fully valued; judgments away from the brand are annotated inline.
|
|
16
|
+
|
|
17
|
+
## 1 Visual Theme
|
|
18
|
+
|
|
19
|
+
Light by default; dark is opt-in. Flat — hierarchy rides hairline `border`, type weight, and the warm
|
|
20
|
+
surface ladder, never heavy shadow. A single accent, Mistral Orange `primary` (`#fa520f`), for the one
|
|
21
|
+
action that matters. The neutrals are true grays, but the *surfaces* run warm — a white canvas beside a
|
|
22
|
+
cream-tinted `sidebar` with cream panels, the operator signature that carries Mistral's temperature
|
|
23
|
+
without a gradient. Density is `standard`, leaning comfortable (44px rows), dense-capable.
|
|
24
|
+
|
|
25
|
+
## 2 Color Roles
|
|
26
|
+
|
|
27
|
+
Light values; hex is the brand's native format (the manifest carries the same). One accent — `primary`
|
|
28
|
+
orange is the only chromatic hue that carries meaning; status hues speak only status.
|
|
29
|
+
|
|
30
|
+
| Role | Value | Allowed where |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| `background` / `card` / `popover` | canvas white `#ffffff` | page, cards, and overlays — the dominant surface |
|
|
33
|
+
| `foreground` | ink `#1f1f1f` | all primary ink |
|
|
34
|
+
| `muted` | warm-white `#fffaeb` | hover rows, quiet fills, subtle sections |
|
|
35
|
+
| `secondary` | cream `#fff8e0` | secondary buttons, grouped panels |
|
|
36
|
+
| `muted-foreground` | steel `#6a6a6a` | labels, captions, secondary text |
|
|
37
|
+
| `border` | hairline `#e5e5e5` | separators and grid lines on white |
|
|
38
|
+
| `input` | hairline-strong `#c7c7c7` | field edges — a firmer edge than the grid, per brand |
|
|
39
|
+
| `primary` | Mistral Orange `#fa520f` | the one primary action; active nav; key interactive detail |
|
|
40
|
+
| `accent` | cream-deeper `#fff0c2` | selected/hovered rows and nav, on-accent surfaces only |
|
|
41
|
+
| `ring` | `primary` `#fa520f` | the focus outline — unmistakable, keyboard-first |
|
|
42
|
+
| `destructive` | red `#d92d20` | destructive actions and error state only |
|
|
43
|
+
| `success` / `warning` | green `#16a34a` / amber `#d97706` | status signalling only, never chrome |
|
|
44
|
+
|
|
45
|
+
The sunset yellows (`#ffd900`, the sunshine ramp) and gradient bands are brand graces, not operator
|
|
46
|
+
tokens (see §7). The source palette ships no semantic red or green, so status red/green/amber are
|
|
47
|
+
derived functional imports, kept muted.
|
|
48
|
+
|
|
49
|
+
## 3 Typography
|
|
50
|
+
|
|
51
|
+
One sans, one mono. `font-sans` is Inter — body, UI, and headings all ride it; heading weight and
|
|
52
|
+
tracking, not a second family, carry the voice. `font-mono` is JetBrains Mono for IDs, codes,
|
|
53
|
+
timestamps, and log lines. Numeric columns render `tabular-nums` so figures align down a column.
|
|
54
|
+
|
|
55
|
+
| Step | Role | Size · line | Weight · tracking |
|
|
56
|
+
| --- | --- | --- | --- |
|
|
57
|
+
| h1 | page title | 24px / 1.25 | `font-weight-strong` · `heading-tracking` |
|
|
58
|
+
| h2 | section head | 18px / 1.3 | `font-weight-strong` · `heading-tracking` |
|
|
59
|
+
| h3 | card / group head | 15px / 1.35 | `font-weight-strong` |
|
|
60
|
+
| body | UI + prose | 14px / 1.5 | `font-weight-normal` |
|
|
61
|
+
| small | labels, meta, dense table | 13px / 1.4 | `font-weight-normal` |
|
|
62
|
+
| caption | uppercase eyebrow | 11px / 1.4 | 600, `+0.09em`, uppercase |
|
|
63
|
+
|
|
64
|
+
Heading emphasis is `font-weight-strong` = **500**, not 600 — a deliberately lighter, editorial emphasis
|
|
65
|
+
is the brand's tell (the marketing heads run 500); 600 is reserved for the uppercase eyebrow. Emphasize
|
|
66
|
+
by weight, never size. The near-serif PP Editorial Old is a hero-display grace and stays behind —
|
|
67
|
+
operator surfaces have no hero, so Inter carries every head.
|
|
68
|
+
|
|
69
|
+
## 4 Component Stylings
|
|
70
|
+
|
|
71
|
+
Every recurring operator component composes from the primitives — no literal values.
|
|
72
|
+
- **Button** — `primary`: filled orange on `primary-foreground`, `radius` (8px), no pill. Secondary:
|
|
73
|
+
`secondary` (cream) fill, `border`, `foreground`. Ghost: transparent, `accent` on hover.
|
|
74
|
+
- **Input** — `background` fill, 1px `input` border (firmer than the grid), `radius`; focus draws the
|
|
75
|
+
`ring` at 2px, no glow; field height rides `table-row-height` (44px).
|
|
76
|
+
- **Card** — `card` surface, 1px `border`, 12px corner (one step up from the 8px button), shadow only
|
|
77
|
+
when lifted; the cream variant uses `secondary` fill with a warm `sidebar-border` edge, not gray.
|
|
78
|
+
- **Table row** — `table-row-height` (44px); `border` grid lines; `muted` on hover; `tabular-nums` on
|
|
79
|
+
numerics; selection tints `accent`.
|
|
80
|
+
- **Side panel** — detail and edit open in the panel (`side-panel-width`/`-rich`), beside the work.
|
|
81
|
+
- **Badge** — hairline `border`, `muted`/status fill, uppercase caption; pill radius (9999) is for
|
|
82
|
+
badges only. Status badges take `success` / `warning` / `destructive`, never `primary`.
|
|
83
|
+
|
|
84
|
+
## 5 Layout
|
|
85
|
+
|
|
86
|
+
Base spacing unit 4px; the on-scale ramp is the brand's own `4 · 8 · 12 · 16 · 20 · 24 · 32 · 40 · 48 ·
|
|
87
|
+
64` (capped below the hero-scale 96/120 that stays behind). Shell dimensions map one-to-one to the
|
|
88
|
+
layout primitives: sidebar `sidebar-width-expanded` / `sidebar-width-collapsed`, topbar `topbar-height`,
|
|
89
|
+
side panel `side-panel-width` / `side-panel-width-rich`, modal `modal-width-max`, forms `form-max-width`,
|
|
90
|
+
tables full-width. Density is governed globally by `density-tier`, stepped per archetype by the catalog.
|
|
91
|
+
|
|
92
|
+
## 6 Depth
|
|
93
|
+
|
|
94
|
+
Flat. Hierarchy comes from the warm surface ladder and hairlines, not shadow:
|
|
95
|
+
|
|
96
|
+
- **0 — canvas** `background`, no border.
|
|
97
|
+
- **1 — panel / card** `card` or cream `secondary` on a 1px border; `sm` shadow only to lift off canvas.
|
|
98
|
+
- **2 — overlay** `popover` / side panel / modal — the one place `shadow-intensity` earns a soft `md`
|
|
99
|
+
shadow. Rank is border, surface, and position, never a heavier drop shadow.
|
|
100
|
+
|
|
101
|
+
Focus is a 2px `ring` outline (never a glow), visible on every interactive element. Three z-levels:
|
|
102
|
+
content, sticky chrome, overlay — the marketing photographic and gradient depth does not carry.
|
|
103
|
+
|
|
104
|
+
## 7 Do's & Don'ts
|
|
105
|
+
|
|
106
|
+
- **Do** reserve `primary` orange for the single most important action on a surface; everything else is
|
|
107
|
+
neutral or status.
|
|
108
|
+
- **Do** carry warmth with cream surfaces — the `sidebar` and grouped panels — against a white canvas.
|
|
109
|
+
- **Do** apply `tabular-nums` to every numeric column and `font-mono` to IDs, codes, and timestamps.
|
|
110
|
+
- **Do** keep the sober editorial geometry — 8px buttons, 12px cards; emphasize heads with weight-500.
|
|
111
|
+
- **Don't** pill the primary CTA — Mistral's button geometry is sober, not playful; 9999 is for badges.
|
|
112
|
+
- **Don't** promote the sunset yellows, a gradient, or the near-serif display into chrome — the stripe
|
|
113
|
+
band, sunshine ramp, hero photography, and display face are marketing signatures that stay behind.
|
|
114
|
+
- **Don't** open detail or edit in a modal when the side panel fits — modals are for confirmations.
|
|
115
|
+
|
|
116
|
+
## 8 Responsive
|
|
117
|
+
|
|
118
|
+
The operator sweep is 375 / 768 / 1024 / 1440.
|
|
119
|
+
|
|
120
|
+
| Breakpoint | What changes |
|
|
121
|
+
| --- | --- |
|
|
122
|
+
| 375 | sidebar → off-canvas drawer; two-pane list+detail stacks; side panel → full sheet; density holds |
|
|
123
|
+
| 768 | sidebar collapses to the icon rail (`sidebar-width-collapsed`); tables scroll their overflow |
|
|
124
|
+
| 1024 | sidebar expands; two-pane queue+detail holds side by side |
|
|
125
|
+
| 1440 | content caps at `form-max-width` for forms; tables and dashboards use the full width |
|
|
126
|
+
|
|
127
|
+
## 9 Agent Prompt Guide
|
|
128
|
+
|
|
129
|
+
This entry dresses an internal tool — CRM, queue, dashboard, console — in Mistral's design language.
|
|
130
|
+
Carries: the warm temperature (white canvas + cream `sidebar` and panels), the single orange accent,
|
|
131
|
+
the sober 8px/12px radius, the Inter voice with editorial weight-500 heads, JetBrains Mono. Stays
|
|
132
|
+
behind: the sunset gradient bands, the hero-scale PP Editorial Old display face, the photographic heroes.
|
|
133
|
+
|
|
134
|
+
- Lead every list surface with its table; lead every entity with its primary read, not its chrome.
|
|
135
|
+
- Accent only the primary action with orange. If two things want the accent, one is not primary.
|
|
136
|
+
- Anchor warmth in the surface ladder, not the ink — grays stay gray; cream carries the brand.
|
|
137
|
+
- Detail and edit go in the side panel; a modal is a confirmation, not a workspace.
|
|
138
|
+
- Every numeric column is `tabular-nums`; every ID / code / timestamp is `font-mono`.
|
|
139
|
+
- Every workflow completes from the keyboard; the orange `ring` focus outline is always visible.
|
|
140
|
+
- Stay flat and sober — hairline and weight before shadow, no pills, no gradient chrome.
|
|
141
|
+
|
|
142
|
+
```yaml design-primitives
|
|
143
|
+
radius: 8px # derived: brand button radius is md=8px; scale keeps 12px for cards
|
|
144
|
+
shadow-intensity: 0.4 # derived: brand runs predominantly flat, shadows at 0.04 alpha — lift only overlays
|
|
145
|
+
border-weight: 1px
|
|
146
|
+
density-gap: 1
|
|
147
|
+
density-inset: 1
|
|
148
|
+
font-sans: Inter, system-ui, sans-serif # brand's UI/prose face; the hero-scale near-serif display stays behind
|
|
149
|
+
font-mono: JetBrains Mono, ui-monospace, SFMono-Regular, monospace
|
|
150
|
+
font-weight-normal: 400
|
|
151
|
+
font-weight-strong: 500 # derived: brand headings emphasize at 500 (editorial), not 600 — 600 reserved for the eyebrow
|
|
152
|
+
heading-tracking: -0.01em # brand display tracks -0.5px at the large heads; operator heads echo the tightening
|
|
153
|
+
duration-unit: 50ms # derived: corpus does not extract motion timings
|
|
154
|
+
duration-fast: 100ms # derived: no corpus value; operator default
|
|
155
|
+
duration-normal: 150ms # brand note recommends 150–200ms ease for state transitions
|
|
156
|
+
duration-slow: 200ms # brand note recommends 150–200ms; slow lands at the top of that range
|
|
157
|
+
ease-default: cubic-bezier(0.4,0,0.2,1) # derived: corpus silent on easing; standard operator ease
|
|
158
|
+
contrast-boost: 1
|
|
159
|
+
icon-stroke: 1.75 # derived: corpus does not specify icons; refined operator stroke
|
|
160
|
+
icon-size-base: 16px
|
|
161
|
+
sidebar-width-expanded: 248px # derived: corpus is marketing-nav only; operator shell default
|
|
162
|
+
sidebar-width-collapsed: 56px # derived: operator shell default
|
|
163
|
+
topbar-height: 56px # derived: brand marketing nav ~64px; tightened for an operator topbar
|
|
164
|
+
side-panel-width: 420px # derived: no operator side panel in corpus; standard width
|
|
165
|
+
side-panel-width-rich: 640px # derived: standard rich-content width
|
|
166
|
+
modal-width-max: 560px # derived: corpus has a modal elevation level but no width; standard cap
|
|
167
|
+
form-max-width: 560px # brand contact form caps ~520px; rounded to the operator standard
|
|
168
|
+
table-row-height: 44px # brand touch targets (inputs/buttons) render 44px — comfortable, editorial
|
|
169
|
+
verbosity: default
|
|
170
|
+
feedback: subtle
|
|
171
|
+
density-tier: standard # derived: brand reads comfortable/editorial; standard keeps it dense-capable, not cramped
|
|
172
|
+
product-traits: [dashboard, ai-console, dev-tools, admin]
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
```yaml lever-manifest
|
|
176
|
+
version: 1
|
|
177
|
+
fonts: { sans: "Inter, system-ui, sans-serif", mono: "JetBrains Mono, ui-monospace, SFMono-Regular, monospace" }
|
|
178
|
+
color-tokens:
|
|
179
|
+
light:
|
|
180
|
+
background: "#ffffff"
|
|
181
|
+
foreground: "#1f1f1f"
|
|
182
|
+
card: "#ffffff"
|
|
183
|
+
card-foreground: "#1f1f1f"
|
|
184
|
+
muted: "#fffaeb"
|
|
185
|
+
muted-foreground: "#6a6a6a"
|
|
186
|
+
border: "#e5e5e5"
|
|
187
|
+
input: "#c7c7c7"
|
|
188
|
+
ring: "#fa520f"
|
|
189
|
+
primary: "#fa520f"
|
|
190
|
+
primary-foreground: "#ffffff"
|
|
191
|
+
accent: "#fff0c2"
|
|
192
|
+
accent-foreground: "#1f1f1f"
|
|
193
|
+
destructive: "#d92d20" # derived: source palette ships no semantic red; distinct from the CTA orange
|
|
194
|
+
destructive-foreground: "#ffffff"
|
|
195
|
+
success: "#16a34a" # derived: source palette ships no green; functional status import
|
|
196
|
+
warning: "#d97706" # derived: amber distinct from CTA orange; brand yellows fail contrast for status
|
|
197
|
+
popover: "#ffffff"
|
|
198
|
+
popover-foreground: "#1f1f1f"
|
|
199
|
+
secondary: "#fff8e0"
|
|
200
|
+
secondary-foreground: "#1f1f1f"
|
|
201
|
+
chart-1: "#fa520f" # derived: sunset ramp as categorical; warm palette suits sequential/few-series charts
|
|
202
|
+
chart-2: "#cc3a05"
|
|
203
|
+
chart-3: "#ffa110"
|
|
204
|
+
chart-4: "#ffd06a"
|
|
205
|
+
chart-5: "#ff8a00"
|
|
206
|
+
sidebar: "#fff8e0"
|
|
207
|
+
sidebar-foreground: "#1f1f1f"
|
|
208
|
+
sidebar-primary: "#fa520f"
|
|
209
|
+
sidebar-primary-foreground: "#ffffff"
|
|
210
|
+
sidebar-accent: "#fff0c2"
|
|
211
|
+
sidebar-accent-foreground: "#1f1f1f"
|
|
212
|
+
sidebar-border: "#e6d5a8" # brand's cream-surface border (beige-deep)
|
|
213
|
+
sidebar-ring: "#fa520f"
|
|
214
|
+
spacing-scale: [4, 8, 12, 16, 20, 24, 32, 40, 48, 64]
|
|
215
|
+
radius-scale: [4, 6, 8, 12, 16, 9999]
|
|
216
|
+
shadow-levels: [none, sm, md]
|
|
217
|
+
motion: { durations: [100, 150, 200], easings: ["cubic-bezier(0.4,0,0.2,1)"] }
|
|
218
|
+
icons: { family: lucide, stroke: 1.75 }
|
|
219
|
+
accent-count: 1
|
|
220
|
+
```
|