A hybrid system. Skeleton White carries the marketing voice — sculptural, Calatrava-inflected, white-on-bone. Warm Stone carries the product — receding, museum-label calm. Two registers, one wordmark, one set of tokens.
v1 specified one register: warm stone, museum-label restraint. v2 keeps that verbatim for the product, and adds a second register — Skeleton White — for the marketing surface, where the brand needs to assert itself before the rendering ever appears.
#F6F5F2, espresso ribs #1A1816, axial symmetry,
visible structural sketch lines.
| Surface | Mode | Why |
|---|---|---|
| offplan.online landing | Skeleton White | Brand must assert itself; no studio render present |
| Pitch deck for studios | Skeleton White | Same — speaking as offplan, not as a project |
| Buyer Sales App | Warm Stone | Studio's render is hero; UI must recede |
| Operator Admin Panel | Warm Stone v7 (atmosphere) | Default empty state; works without uploaded photo |
| Embedded iframe widget | Warm Stone v5 (solid) | Performance + browser compatibility |
| Studio's own white-label | Warm Stone, override tokens | System holds; only :root values change |
A fan of six structural ribs anchored at a single point, capped by a parabolic arc and a base line. Reads as architecture before it reads as a logo. The mark sits at x-height with the wordmark, never above or to the side.
| Ribs | 6 lines from anchor |
| Apex arc | Quadratic Bézier · 55% opacity |
| Baseline | 1px hairline · full width |
| Stroke ratio | Mark height / 34 |
| Mark / type ratio | Mark height = 0.95 × cap height |
| Mark / type gap | 0.32em |
| Type | Helvetica Neue 300 · -0.02em tracking |
| Domain (.online) | Helvetica Neue 200 · 40% opacity |
| Minimum size | 16px (mark height) · digital · 14mm print |
Reserve half the mark height (½ M) on every side. Dashed lines below show the minimum exclusion zone — never bring text or graphics inside it.
| Never | Stretch or compress the mark — preserve aspect ratio |
| Never | Add stroke weight — ribs stay at 1.1 unit |
| Never | Tilt or rotate — the mark is always horizontal |
| Never | Apply gradient or shadow to the mark |
| Never | Place over busy imagery without scrim or atmosphere overlay |
| Never | Use mark without baseline — the baseline is the ground |
| Never | Recolor with brand accents — only ink, white, or stone |
All v1 Figma-confirmed values carry through unchanged. v2 adds two new ink/bone values for Skeleton mode, and tightens the gradient stops on atmosphere with cleaner names.
Used as Admin v7 background, empty-state hero, and placeholder for any surface that hasn't received a building photo yet.
Helvetica Neue stays the workhorse — display + UI labels. Inter handles body copy and admin text. v2 adds JetBrains Mono for stamps, coordinates, build numbers, and any place metadata wants to feel slightly engineered.
Every component carries through both registers. The component contract stays the same; only surface tokens swap. Below are the v1 components plus the new Calatrava motifs introduced in v2.
The rib cap is the single architectural motif allowed on product surfaces. A 7-rib parabolic stack at 35% opacity, spans the card width, sits above the title block. Use only on the primary unit card — not on every container.
Replaces flat hairline rules at major section breaks. Five rib arcs, 0.4 stroke, stepped opacity. Use on long-form pages — never on dense data tables.
v1 specified premium-restraint motion: 120/200/280ms. v2 keeps that for product, and adds one new token — Wing — for marketing-only sculptural reveals (heroes, page transitions). Wing is slow on purpose. Use sparingly.
Diff from v1: all original tokens preserved. New Skeleton mode tokens prefixed
with --skel-*. New Wing motion token. New parabolic divider primitive.
Drop-in compatible — nothing is renamed or removed.
The single page that anchors every design decision. If a choice doesn't serve this, it doesn't ship — regardless of how good it looks in isolation.
offplan.online is a frame for architecture. We build the operating system real-estate developers use to sell projects that don't physically exist yet — so the rendering, the floor plate, the keystone moment of the building are what the buyer actually sees. Our UI is structural and quiet. The architecture is the work.
Sees the Sales App on a developer's website. AED 2M-15M decisions made partly in 90 seconds. Wants confidence: real architecture, real units, real availability. Allergic to SaaS-y polish.
Uses the Admin Panel daily. 5–50 projects, 50–500 units each. Needs speed, not delight. Doesn't want to learn a "platform" — wants their data in, their renders up, their team running.
Reviews us in a pitch deck for 3 minutes. Decides if offplan.online is worthy of representing their work. This is who Skeleton White is for — everything else is downstream of winning this room.
Six trade-offs we've already made. Cite the principle by number when defending a decision in review.
Phosphor Thin · 1.25px stroke · 24px artboard. Outline only — never filled, never two-tone. Corner radius matches our component radius (2px). Icons align to optical center, not bounding box.
| Library | Phosphor Icons · Thin weight · phosphoricons.com |
| Stroke | 1.25px at 24px artboard. Scale stroke proportionally — 1.0px at 48px+. |
| Style | Outline only. No two-tone, no fills, no duotone, no color icons. |
| Caps & joins | Round caps, round joins — matches type letterforms. |
| Color | Inherit currentColor. Never color icons with brand accents (gold/navy) — they're functional, not decorative. |
| Custom icons | Allowed only when Phosphor lacks a domain term (floorplan, keystone, plotsize). Match the family conventions exactly. |
The Admin Panel is ~80% forms. The Sales App lead capture is forms. Settings, profile, KYC — all forms. The system below is comprehensive, not exemplary — every state needed to ship.
| Token | Comfortable (default) | Compact (admin tables, dense lists) |
|---|---|---|
| --field-h | 44px | 32px |
| --field-pad-x | 14px | 10px |
| --field-font | 14px | 13px |
| --row-h | 56px | 40px |
| --gap | 16px | 10px |
Apply via data-density="compact" on the parent. Buyers always see comfortable; admin power users opt into compact.
WCAG 2.2 AA is the floor. AAA where the contrast allows it without breaking the visual register. Audit run 2026-05-06 against the v2 token set.
| Foreground | Background | Ratio | Normal text | Large text |
|---|---|---|---|---|
| Text 900 | Surface | 11.8:1 | AAA ✓ | AAA ✓ |
| Text 700 | Surface | 10.4:1 | AAA ✓ | AAA ✓ |
| Text 500 | Surface | 5.1:1 | AA ✓ | AAA ✓ |
| Text 300 | Surface | 2.6:1 | decorative only | decorative only |
| Espresso | Bone | 14.9:1 | AAA ✓ | AAA ✓ |
| Gold | Card | 3.3:1 | large only | AA ✓ |
| White | Gold | 3.3:1 | large only | AA ✓ |
| White | Navy | 13.6:1 | AAA ✓ | AAA ✓ |
| Sage | Sage tint | 4.6:1 | AA ✓ | AAA ✓ |
Rule: Text 300 is ornamental only — captions, watermarks, dividers. Never use it for any content the user must read. Gold-on-white is reserved for prices (large) and CTA buttons (large) — never small body text.
Gold 2px outline, 3px offset. Always visible — never :focus { outline: none }.
Use :focus-visible to suppress on mouse-click but keep on keyboard.
| Mobile (touch) | Minimum 44 × 44 CSS px — Apple/Google guidance, WCAG 2.5.5 |
| Desktop (mouse) | Minimum 32 × 32 px |
| Adjacent targets | 8px minimum gap (compact) · 12px (default) |
| Tap target ≠ visual size | Hit area can extend beyond the painted button — use padding, not size |
| Motion | Respect prefers-reduced-motion — disable Wing reveals, drop transitions to 0ms |
| Status colour | Always pair colour with text label or icon — colourblind users must see the same information |
| Form errors | Never colour-only — use icon + text + ARIA aria-invalid + aria-describedby |
| Heading order | Strict h1 → h2 → h3, no skips. Style with classes, not by jumping levels |
| Alt text | Renders need real descriptions: "Côte Résidence — north elevation, dusk render". Decorative images: alt="". |
| Language | Set html[lang] per page (en / ar / ru). Critical for screen readers. |
| RTL | Layout flips for Arabic. Numerals stay LTR. Wordmark mark stays on the leading edge (right in RTL). |
Editorial. Specific. Quietly confident. We sound like a museum label or a serious architecture monograph, not a consumer real-estate app. Every word earns its place.
| 1. Specifics over adjectives | "142 m², 12th floor, east view" — not "spacious premium apartment with stunning views" |
| 2. Verbs over nouns | "Reserve" not "Make a reservation". "Save changes" not "Settings update". |
| 3. Numbers in context | "AED 4.2M · AED 29,500 / m²" — give the comparable, not just the headline. |
| 4. Never say "stunning" | Or "luxurious", "exclusive", "premium", "world-class", "iconic", "elegant". |
| Currency | AED 4,200,000 in tables · AED 4.2M in cards · always with the AED prefix, never bare numbers |
| Per-meter | AED 29,500 / m² · m² always with the superscript |
| Area | 142 m² · no rounding to "approx" — use the GLA from the survey |
| Bedrooms | 3-bedroom in copy · 3BR only in dense lists with column headers |
| Dates | Q3 2026 for handover · 2026-05-06 for stamps · 6 May 2026 for letters |
| Coordinates | 25°11′24″N · 55°16′28″E in JetBrains Mono |
First impression of every screen before data lands. Empty > loading > error — design all three for every list, every chart, every table. No spinners. Skeleton loaders use the system: hairline shapes, slow pulse.
Add your first project to begin. Renders, plans, and units sync within minutes.
The connection dropped. Reconnect or refresh — your changes are saved.
| No spinners | Skeleton loaders only. They preview the layout the data will fill. |
| No "Oops" | State the problem: "Couldn't save". Say what to do: "Reconnect". |
| Always offer next step | Empty: primary action. Loading: nothing (it'll resolve). Error: retry. |
| Skeleton timing | Show after 200ms — anything faster feels janky. Pulse 1.6s ease-in-out infinite. |
| Empty hierarchy | Icon (48px) → headline → one-line desc → primary action. Never longer. |
The Admin Panel surfaces sales velocity, conversion, project mix, lead funnels. Charts live in our world: stone-toned, hairline axes, gold for the primary series, sequential desaturated supports. Never rainbow.
Always start with Series 1 (Navy) for the primary metric, Series 4 (Gold) for the comparator. Don't reach for Series 3 (Stone) until the chart has more than two lines.
| Axes | Hairlines only · 1px Stone 200 · no axis line below x |
| Gridlines | Horizontal only · 0.5px · max 4 visible |
| Labels | x-axis: UI label style (uppercase, tracked) · y-axis: JetBrains Mono numerals |
| Legend | Top, left-aligned, label style · square swatch matching series colour |
| Tooltips | Espresso background, white text, mono numerals (see Overlays section) |
| Sparklines | 2px stroke, gold, no fill · used in stat cards |
| Never | 3D, donut centre labels, gradients, rainbow palettes, shadow on bars |
The Admin Panel's primary surface for unit lists, lead pipelines, transactions. Hairline rules, mono numerals, sticky header, hover row, sortable columns.
| Numerals | JetBrains Mono · right-aligned with .num · easier scan |
| Header | UI label style · sticky on scroll · subtle background |
| Row hover | Surface subtle (#F2F0ED) · 120ms ease-out |
| Selected row | Gold-tinted left border (3px, --gold) · keep all other styling |
| Empty cell | em-dash (—) in Text 300 · never blank |
| Density | Default 14px row pad · compact 8px via data-density="compact" |
| Sort affordance | Tiny chevron after column label · highlights gold when active |
| No zebra striping | Hairlines do the row separation work |
Three overlay patterns, one purpose each. Don't blur the lines. Tooltip = hover-only labels. Toast = transient feedback. Modal = decision required.
| Tooltip | Toast | Modal | |
|---|---|---|---|
| Trigger | Hover / focus | System action complete | User action required |
| Dismissal | Mouse leave / blur | Auto · 4s | Explicit choice or Esc |
| Background | Espresso (#1A1816) | White card · status-coloured left border | Backdrop blur 8px · 40% opacity |
| Position | Above element · 6px arrow | Bottom-left · stack to 3 | Center · 480px max width |
| Motion | 120ms fade | 200ms slide-up + fade | 280ms scale 0.96→1 + fade |
| Trap focus | No | No | Yes · with Esc to close |
12-column grid · 16px gutter · max content 1240px. Four breakpoints. Edge padding scales: 24px mobile → 48px desktop.
Marketing surfaces use 7+5 or 5+7 splits to break the symmetric centre — this is where Calatrava-influence shows. Product surfaces stay symmetric and centered for readability.
Studios provide their own renders — we don't shoot. But we control how they're presented: warm bias, eye-level, structural composition, golden-hour preference. These rules go into the studio onboarding kit.
Warm-bias light. Avoid harsh midday — kills the architectural shadow play. Dusk renders activate the building from inside (warm windows against cool sky).
Render from human height (1.6m) or slightly below. Aerial drone-style shots are prohibited as hero — they flatten the architecture into a site plan.
Building centred, parallel to picture plane, with one structural detail (rib, oculus, cantilever) emphasised. Diagonal three-quarter "real estate" shots are forbidden.
1–3 figures, motion-blurred, never looking at camera. People to give scale, not to perform "lifestyle". No families, no laughing groups, no glassware.
Sky must feel like the city's actual sky — humid Dubai haze, not a Caribbean cyan. Some atmosphere/dust adds gravity. Pure clear skies feel render-y.
If no render is available, show the atmosphere gradient (Sky → Plaster → Stone → Anchor) — never an "image missing" placeholder, never a stock photo.
| Crop | Honour the architect's intended aspect — never crop facade for our layout convenience |
| Filter | None. We display renders as the studio rendered them. |
| Overlay | Only the parabolic scrim at bottom 30% when text must sit on the image — Espresso 0% → 60% gradient |
| Resolution | Hero: 2400px wide minimum · Card: 1200px · Thumbnail: 600px · always 2× retina |
| Format | WebP primary · JPEG fallback · AVIF where supported |
| Alt text | "[Project] · [view] · [time of day]" — descriptive, not decorative |
offplan.online appears alongside studio logos in pitch decks, embedded widgets, partner pages. The lockup rules below preserve both marks.
| Order | offplan.online sits LEFT in LTR · RIGHT in RTL · always on the leading edge |
| Separator | Hairline divider · 1px Stone 200 · 32px tall · 32px gap each side |
| Optical balance | Match cap heights, not pixel heights — the studio mark may be slightly larger if its letterforms read smaller |
| Never | Place "x" or "&" between marks · stack vertically · place inside the same bounding box |
| Pitch deck slide | "Presented with [Studio]" — small caps label above lockup, lockup centred |
| Embedded widget | "Powered by offplan.online" — bottom-right · Stone 500 · 11px · linkable |
English at launch · Arabic (UAE) Stage 2 · Russian Stage 3. Layout flips for Arabic; numerals stay Western LTR; the wordmark mirrors so the mark sits on the leading edge.
| Concern | EN (LTR) | AR (RTL) | RU (LTR) |
|---|---|---|---|
| HTML | lang="en" dir="ltr" | lang="ar" dir="rtl" | lang="ru" dir="ltr" |
| Type | Helvetica Neue + Inter | + IBM Plex Sans Arabic 400/500 | Same — Cyrillic in Inter |
| Type scale | Default | +8% size · Arabic letterforms read smaller at parity | Default |
| Tracking | Default | Reduce -0.005em on display sizes — Arabic doesn't tolerate as much tracking | Default |
| Numerals | Western (1234) | Western (1234) — finance norm in UAE | Western (1234) |
| Currency | AED 4,200,000 | 4,200,000 د.إ · symbol after, RTL flow | 4 200 000 AED |
| Date | 6 May 2026 | ٦ مايو ٢٠٢٦ — long form | 6 мая 2026 |
| Wordmark | Mark left of "offplan.online" | Mark RIGHT of mirrored text | Mark left of "offplan.online" |
| Layout | Sidebar left | Sidebar right · all chevrons mirror | Sidebar left |
| Icons | Default | Mirror: arrow, chevron, back. Don't mirror: search, calendar, location, user | Default |
Semver applied to design tokens. The brandbook is the source of truth; consumers (Sales App, Admin Panel, marketing site) pin a version and upgrade explicitly.
| Bump | Triggered by | Examples | Action for consumers |
|---|---|---|---|
| MAJOR | Removed token · renamed token · changed semantic meaning | Drop --gold · rename --text-700 · invert --navy | Migration required · breaking |
| MINOR | Added token · added component · added mode | Add Skeleton White (this release) · add Wing motion · add JetBrains Mono | Drop in · backward compatible |
| PATCH | Fixed value · clarified docs · fixed hex | Sage shifted +2% saturation · type spec corrected | Pull · no review needed |
| Stable | Default · safe to use · in design system library |
| Experimental | Marked --exp-* prefix · subject to change without notice |
| Deprecated | Still works · marked @deprecated in source · remove next MAJOR |
| Removed | Gone · MAJOR bump only |
| Allowed | --gold · --navy · the four atmosphere stops · type body family (with approval) |
| Locked | Wordmark (mark + type) · stone scale · text scale · motion durations · component contracts · WCAG ratios |
Third register. Use when evening renders are the hero (dusk facades, lit interiors), or when admin power users opt in via system preference. Inverts the warm-stone neutrals; gold and navy stay as accents but shift slightly cooler so they read at night.
Floor-to-ceiling glazing oriented to the marina. Handover Q3 2026. 142 m² gross.
| Auto | @media (prefers-color-scheme: dark) · respects OS |
| Manual override | User toggle in admin settings · stored per-user |
| Marketing | Section-level only · use for evening render heroes, never the whole page |
| Sales App | Auto-switch when uploaded render is detected as dusk/night (luminance < 0.35) |
| Status colors | Sage/gold lift +12% lightness · charcoal becomes Stone Text |
| Wordmark | Mark + type both Bone Text — never gold |
Brochures, A4 spec sheets, pitch deck handouts. CMYK conversions below (Coated FOGRA39 / sRGB v4). Use these — never let the print shop convert from screen hex.
| Stock · brochure | GF Smith Colorplan Mist · 270gsm uncoated · matches Bone exactly |
| Stock · spec sheet | Munken Pure Rough · 120gsm · daily-handling weight |
| Bleed | 3mm all sides · safe area 8mm from trim |
| Body type minimum | 9pt Inter · 11pt leading — never smaller |
| Display | Helvetica Neue 200 — same as digital, scales beautifully |
| Hairlines | 0.5pt minimum · prepress-safe |
| Black overprint | Espresso text overprints on light bg · disable on Bone (causes mis-registration) |
| Gold treatment | For pitch covers, spec PANTONE 872 C metallic — flat CMYK loses the architecture |
| Document scale | A4 portrait default · A3 landscape for plates · A5 for handouts |
| Embedded fonts | Always · subset to ASCII + extended Latin + Arabic + Cyrillic |
The actual strings. Drop-in copy for buttons, labels, errors, onboarding, transactional moments. Russian and Arabic columns left blank for the copywriter pass — the EN column is binding.
| Context | EN | Notes |
|---|---|---|
| Primary purchase | Reserve unit | Verb + object · never just "Reserve" |
| Secondary action | Request viewing | Active, specific |
| Form save | Save changes | Always plural · always "changes" |
| Form submit · new | Add project | Verb matches the noun being created |
| Cancel destructive | Keep editing | Frames the safe action positively |
| Confirm destructive | Discard | Single word · honest |
| Login | Continue | Not "Sign in" or "Log in" — feels less SaaS |
| Logout | Sign out | Match the platform convention here |
| Upload | Add render | "Add" not "Upload" · domain word |
| Filter clear | Clear filters | Plural · explicit object |
| Surface | Headline + body | Action |
|---|---|---|
| No projects yet | No projects yet Add your first project to begin. Renders, plans, and units sync within minutes. | Add project |
| No units match | No units match these filters Loosen a filter or clear them all to see the full inventory. | Clear filters |
| No leads yet | The pipeline is quiet Leads arrive when buyers request a viewing. Share the project link to start. | Copy link |
| No render uploaded | Ready for your render Drop a JPG or PNG, 2400px wide minimum. The atmosphere placeholder shows until you do. | Add render |
| Cause | Message | Action |
|---|---|---|
| Network · save | Couldn't save. Reconnect or refresh — your changes are local until reconnected. | Retry |
| Network · load | Couldn't load floor plates. The connection dropped. | Try again |
| Validation · email | Enter a complete email address. | — |
| Validation · price | Price must be a positive number in AED. | — |
| Validation · area | Area is required — buyers compare by m² first. | — |
| Conflict · double-reserve | Unit 1204 was reserved 2 minutes ago. Choose another, or contact the buyer. | View nearby units |
| Permission | Ask a project admin to grant you access. | Request access |
| Step | Headline | Body |
|---|---|---|
| Welcome | Let's set up your first project. | Three steps · about five minutes. Skip anything you'll fill in later. |
| Step 1 · basics | Project basics | Name, location, handover quarter. The rest follows. |
| Step 2 · units | Add the unit mix | Bedrooms, area, floor, view. Bulk-paste from CSV if you have it. |
| Step 3 · visual | Render & floor plates | One hero render and one plate per floor. We'll handle the rest. |
| Done | You're live. | Share the project link. Buyers see units, prices, and availability — automatically. |
| Trigger | Subject line | First line |
|---|---|---|
| Viewing requested | Your viewing request · Côte Résidence | Thank you. The studio will reply within one business day. |
| Viewing confirmed | Côte Résidence · viewing confirmed for {date} | Address, time, and the lead architect's contact below. |
| Unit reserved | Unit 1204 reserved · 24-hour hold | Your reservation holds until {datetime}. Reservation ID: {id}. |
| Reservation expiring | 2 hours remaining · Unit 1204 | Confirm to keep this unit, or it returns to inventory. |
| KYC requested | Identity verification · Côte Résidence | UAE law requires this for off-plan transactions. Five minutes, secure. |
| Handover scheduled | Handover scheduled · {date} | Final walkthrough, keys, and snag-list — all in one visit. |
Durations alone don't make motion considered. Six principles below decide what moves, how, and why. v1.1 specified the timings · this is the philosophy.
Rest is the default. Motion is reserved for state changes the user caused — never for ambient decoration. No "scroll-revealed" elements, no parallax, no pulsing.
Use ease-out (cubic-bezier 0.16, 1, 0.3, 1) for entrances · ease-in for exits. Never spring overshoots — they read playful, we read serious.
New things arrive from where they came: detail panels slide from right, modals scale from center, toasts rise from bottom. Direction is information.
Wing duration (720ms) is for one moment per page maximum — typically the marketing hero rib animation. If everything is sculptural, nothing is.
When multiple elements enter, stagger by 30–50ms in reading order. Three items max — beyond that it feels like a slot machine.
Respect prefers-reduced-motion by setting all durations to 0ms — not by replacing animations with cross-fades. The user opted out of motion, period.
For mobile (iOS/Android) Sales App. Haptic feedback only — sound is off by default for premium feel. Map iOS HIG impact levels to our intent.
| Default | Haptics ON · sound OFF · respect system silent switch |
| Frequency cap | Maximum one haptic per 250ms — debounce rapid taps |
| Never haptic | Hover · scroll · text input · failed validation (visual + text only) |
| Error haptic | Use .warning sparingly · only for blocking errors (double-reserve, KYC fail) |
| Sound | Off by default. If enabled in admin (future): 24-bit AIFF, sub-200ms, no fade-out reverb |
| Watch (future) | Crown-detents map to selection · tap sequences for notifications |
The single most important interaction in the Sales App. Buyers spend more time here than anywhere else. The parabolic rib visualises the building's structural axis · floors map to vertices along the arc.
| Hover · floor | Vertex grows to 4px gold · floor name in detail panel updates · 120ms ease-out |
| Click · floor | Vertex stays gold · detail panel slides in 200ms · selected floor item gets espresso bg |
| Drag · scrubbing | Continuous floor change as the cursor moves vertically along the rib · selectionChanged haptic on each tick |
| Keyboard | ↑/↓ moves between floors · Home/End jumps to top/ground · Enter selects |
| Building has 50+ floors | Rib stays the same height · vertex spacing tightens · floor names group every 5 (L20, L25, L30 visible · others on hover) |
| Sky lobby / mechanical floor | Vertex shown as hairline ring (no fill) · count shows "—" · not selectable |
| Single-floor property (villa) | Pattern collapses to a horizontal axis · same vocabulary, rotated 90° |
| Irregular floor heights | Vertex y-position scales to actual storey height — penthouse vertex visibly higher above L17 |
| All units sold on a floor | Vertex Stone 400 · count "0" · still selectable for completeness, but no detail-panel CTA |
| Mobile | Rib stays anchored on the right edge · detail panel stacks below · no scrubbing (tap only — too imprecise) |
Drop-in upgrade. No tokens renamed. No components removed. Only additions and one new architectural motif applied judiciously.
--skel-* token family (bone, espresso, ink-soft)--tracking-mega (0.32em) for hero eyebrowsHonest inventory of gaps. v2 closes the wordmark and mode questions. These remain for v2.1 / v3.
| Area | Status | Priority |
|---|---|---|
| Iconography system (Phosphor Thin · 1.25px) | Not specified | High · v2.1 |
| Photography & render guidelines (warm bias, golden hour) | Not specified | High · v2.1 |
| Empty states & loading skeletons | Not specified | Medium · v2.1 |
| Data-viz palette (5–7 series for admin charts) | Not specified | Medium · v2.1 |
| Dark / Night mode (evening renders) | Not specified | Medium · v3 |
| Density modes (comfortable vs compact) | Implicit only | Low · v3 |
| Voice & tone for microcopy | Not specified | Medium · v2.1 |
| Print / PDF spec (CMYK + brochures) | Not specified | Low · v3 |
| Token versioning policy (semver) | Not specified | Medium · v3 |
| Accessibility: contrast audit, focus rings, hit targets | Partial | High · v2.1 |