docs(intel): unlock creative decisions across brand + design + assets specs

Adds brand-identity.md (Brief #1: name + blurb + creative slate).
Rewrites design-system.md and assets-spec.md to flip aesthetic
prescriptions into options while keeping Chrome MV3 / WCAG /
icon-size floors as binding (marked (FLOOR) inline). Mokosh codename
is the only locked decision; every other creative choice delegated
to brand + design teams with explicit ownership annotations.

Three-file intel pack now consistent:
- brand-identity.md: brand-team primary (naming, voice, blurb)
- design-system.md: design-team primary (palette, type, components)
- assets-spec.md: design-team primary (deliverables + floors)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-17 16:29:57 +02:00
parent a881bf0f6a
commit f768498b87
3 changed files with 677 additions and 291 deletions

View File

@@ -1,173 +1,229 @@
# Mokosh Design System
Cross-phase visual + interaction language for the Mokosh extension (user-facing
name "AI Call Recorder", internal codename "Mokosh"). Authored 2026-05-17 in
response to Plan 01-09's notification-icon discovery that the original
placeholder PNGs (`icons/icon{16,48,128}.png` at 79/123/306 bytes) fail Chrome's
notification API. Surfaces the visual decisions so any contributor (you, an
agent, a future designer) can produce assets that fit the same language.
Cross-phase visual + interaction reference for the Mokosh extension (internal
codename "Mokosh"; public display name currently `"AI Call Recorder"`
open per `brand-identity.md`). Authored 2026-05-17 in response to Plan 01-09's
notification-icon discovery that the original placeholder PNGs failed Chrome's
notification API.
Status: `draft` — first iteration; expect amendments as actual designs surface.
**This file mixes two kinds of content** and the design team should treat them
differently:
1. **Engineering sketches** — what the extension currently ships in placeholder
builds (colors, fonts, sizes, voice). These exist so the extension *runs*;
they are not direction. Override anything aesthetic.
2. **Technical floors** — what Chrome MV3, the notification API, MV3 CSP, or
WCAG accessibility require. These are binding regardless of creative
direction. Marked explicitly with **(FLOOR)** wherever they appear.
Status: `draft` — engineering sketch + binding floors. Both design and brand
teams have full authority over everything not marked **(FLOOR)**.
---
## 1. Brand voice
## What's locked vs what's open
**Mokosh is an operator's silent helper.** It records continuously, surfaces
itself only when needed, and stays out of the operator's way the rest of the
time. The visual identity should reflect that:
| Decision | Status |
|---|---|
| Codename **"Mokosh"** | **LOCKED** (engineering — wired through code) |
| Public display name | OPEN (brand team) |
| All color hexes + token names | OPEN (design team) |
| Typography face(s) and scale | OPEN (design team) — must cover Cyrillic, must bundle locally **(FLOOR)** |
| Iconography style + mark concept | OPEN (design team) — must ship at 16/48/128 px PNG with file-size floors **(FLOOR)** |
| Spacing scale, corner radii, motion | OPEN (design team) |
| Brand voice, tagline, copy | OPEN (brand team) |
| Welcome-tab layout + treatment | OPEN (design team) |
| WCAG AA contrast | **FLOOR** (legal/accessibility — not creative) |
| Chrome notification API icon ≥ 128 px | **FLOOR** |
| MV3 CSP (no remote fonts/scripts, no `unsafe-eval`) | **FLOOR** |
| Toolbar badge text max 4 chars | **FLOOR** (Chrome truncates) |
| Russian-first audience | **FLOOR** (product, not visual) — visuals must work without depending on language for legibility |
- **Quietly competent.** Not playful, not flashy. Dependable industrial.
- **Diagnostic, not decorative.** Every visual choice serves an operator goal:
is recording active? did the bug get captured? where do I click to save?
- **Low chrome, high clarity.** When the extension is invisible (recording
silently), it should genuinely be invisible. When it shows itself (badge,
notification, popup), it should be unambiguous about state.
- **Russian-first wording, internationally legible visuals.** Operators read
Russian (per SPEC). Visuals must not depend on any language for legibility —
symbols + color + position carry meaning.
Anti-patterns to avoid:
- Animated icons that draw attention during normal operation
- Decorative imagery in a tool that should fade into background
- Brand-marketing tone in operator-facing copy ("Hi there!", emojis)
- Color-only state indication (must pair color with text/shape)
Everything below is engineering's current sketch, framed as starting options,
unless explicitly tagged **(FLOOR)**.
---
## 2. Identity
## 1. Brand voice *(OPEN — brand team)*
Engineering has no opinion. Axes to decide:
- **Warmth** — clinical / neutral / warm / friendly
- **Formality** — system-terse / professional / conversational / casual
- **Humour** — none / dry / occasional / playful
- **Emoji policy** — never / functional only (✓ × ⚠) / freely
- **Two-register vs single-register** — toolbar/notification copy can match welcome-tab copy, or diverge (e.g. terse system messages vs full-prose onboarding)
Engineering's current placeholder voice in shipped strings is *calm, brief,
operationally serious* — chosen because the product runs for operators under
stress. This is a defensible starting point and equally defensible to replace
entirely.
---
## 2. Identity *(OPEN except codename)*
| | |
|---|---|
| Codename | Mokosh — Slavic goddess of fate, weaving, and the earth |
| User-facing display name | "AI Call Recorder" (Russian-speaking operator-tool name) |
| Tagline candidates (TBD) | "Записывает, чтобы вы могли воспроизвести." ("Records so you can reproduce.") |
| Mark concept | A thread/spool/weave motif evokes the codename without overpowering. Alternative: a simple recording dot inside a frame, more conventional. **Decision deferred** — see Section 10. |
| Codename **(LOCKED)** | Mokosh — Slavic goddess of weaving and fate |
| Public display name *(OPEN — brand)* | Currently placeholder `"AI Call Recorder"`. See `brand-identity.md` §2 for options. |
| Tagline *(OPEN — brand)* | Currently placeholder `"Записывает, чтобы вы могли воспроизвести."` ("Records so you can reproduce.") Replace, translate, or drop. |
| Mark concept *(OPEN — design)* | See §5 below — engineering sketches one possible direction; design team picks from anything. |
---
## 3. Color tokens
## 3. Color *(OPEN — design team)*
All extension surfaces draw from this palette. Color values are RGB; CSS
variable names are how implementation references them.
Engineering currently ships the placeholder palette below so the extension
runs. **Every hex is open. Every token name is open. The whole palette
strategy is open.**
### 3.1 Semantic state (operator-visible)
### 3.1 Engineering's current placeholder palette
| Token | Hex | Use |
| Token | Hex | Currently used for |
|---|---|---|
| `--mks-rec` | `#00C853` | Recording active. Match `BADGE_REC_COLOR` in src/background/index.ts. Material Green A700; widely recognised "go/record" affordance. |
| `--mks-off` | `#9E9E9E` | Idle / not recording. Neutral gray, not red (red implies error). Material Gray 500. |
| `--mks-error` | `#FFB300` | Recoverable error (codec failure, buffer empty, etc.). Match `BADGE_ERROR_COLOR`. Material Amber 600 — caution not catastrophe. |
| `--mks-fatal` | `#D32F2F` | Unrecoverable state (rare). Material Red 700. |
**Accessibility constraint:** All four colors must meet WCAG AA 4.5:1 contrast
when paired with their badge text color. White text on `--mks-rec` and
`--mks-fatal`; black text on `--mks-off` and `--mks-error`.
### 3.2 UI surfaces
| Token | Hex | Use |
|---|---|---|
| `--mks-surface-bg` | `#222222` | Smoke-test page background (current); also acceptable for popup dark mode |
| `--mks-rec` | `#00C853` | Toolbar badge background when recording (Material Green A700) |
| `--mks-off` | `#9E9E9E` | Toolbar badge background when idle |
| `--mks-error` | `#FFB300` | Toolbar badge background on recoverable error (Material Amber 600) |
| `--mks-fatal` | `#D32F2F` | Toolbar badge background on unrecoverable state (Material Red 700) |
| `--mks-surface-bg` | `#222222` | Smoke-test page / dark popup surfaces |
| `--mks-surface-text` | `#EEEEEE` | Text on dark surfaces |
| `--mks-surface-code` | `#444444` | Inline code background (dark theme) |
| `--mks-popup-bg-light` | `#FFFFFF` | Popup background, light Chrome theme |
| `--mks-popup-bg-dark` | `#1F1F1F` | Popup background, dark Chrome theme |
| `--mks-popup-fg-light` | `#202124` | Popup text, light theme (matches Chrome's Material 3) |
| `--mks-popup-fg-dark` | `#E8EAED` | Popup text, dark theme |
| `--mks-diag-bg` / `--mks-diag-fg` | `#000000` / `#00FF00` | Smoke-test timer overlay (dev-only — keep monospace + high-contrast for legibility, but recolor freely) |
### 3.3 Diagnostic / dev-only
### 3.2 Palette directions for the design team to choose from
| Token | Hex | Use |
|---|---|---|
| `--mks-diag-bg` | `#000000` | Smoke-test timer overlay background |
| `--mks-diag-fg` | `#00FF00` | Smoke-test timer overlay text (high-contrast monospace) |
Direction matters more than specific hexes. Options without ranking:
- **Dark-mode-native, monochrome + single accent for "recording"** (current placeholder)
- **Light-mode primary with dark-mode variant**
- **Multi-accent** — separate distinguishing color per state beyond just green/yellow/red
- **Warm / earthy** — browns, ochres, off-whites
- **Cool / clinical** — blues, grays, white
- **High-contrast monochrome** — pure black/white + one accent
- **Whatever the design team coins**
### 3.3 Mechanical hooks the palette has to fill
(Not creative — these are surfaces engineering wires colors into.)
- `chrome.action.setBadgeBackgroundColor(...)` — one color per toolbar badge state
- Popup background + text (two themes if supporting both Chrome light/dark)
- Welcome-tab background + text
- Smoke-test diagnostic overlay (dev-only — design team can ignore)
If the design team lands on N states beyond recording/idle/error, engineering
adapts the badge wiring.
---
## 4. Typography
## 4. Typography *(OPEN — design team, with one floor)*
**System fonts only.** No web-font loads — keeps the extension CSP simple and
load-time near-zero. Falls back gracefully on every OS.
Engineering ships system stack as a placeholder. Open to replacement.
| Family token | Stack | Use |
### 4.1 Technical floor **(FLOOR — KEEP)**
- **Must cover Cyrillic glyphs.** Russian operators are primary. Latin-only faces are non-starters.
- **Must bundle locally.** MV3 CSP forbids remote `@font-face` from external CDNs. Any custom face ships as a static asset in `dist/`.
- **Should not block the service worker.** The SW has no DOM and renders no text; this only matters for popup + welcome.
### 4.2 Engineering's current placeholder stack
| Family token | Stack | Currently used for |
|---|---|---|
| `--mks-font-ui` | `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` | All UI text (popup, welcome page, notifications-rendered-as-pages) |
| `--mks-font-ui` | `-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif` | All UI text |
| `--mks-font-mono` | `"SF Mono", Menlo, Consolas, "Courier New", monospace` | Diagnostic overlays, code, timer |
### 4.1 Type scale
Chosen for zero-load, no FOUT, automatic Cyrillic coverage on every OS.
**Equally valid:** a licensed custom face (Inter, IBM Plex Sans, JetBrains
Mono, or anything), variable fonts, a type pair, a different system fallback
chain.
| Token | Size | Line-height | Use |
### 4.3 Engineering's current type scale (placeholder)
| Token | Size | Line-height | Currently used for |
|---|---|---|---|
| `--mks-text-xs` | 11px | 1.3 | Badge labels, status pills, footnotes |
| `--mks-text-sm` | 13px | 1.4 | Secondary UI text, captions |
| `--mks-text-base` | 15px | 1.5 | Body text, popup messages, notification body |
| `--mks-text-xs` | 11px | 1.3 | Badge labels, footnotes |
| `--mks-text-sm` | 13px | 1.4 | Secondary UI text |
| `--mks-text-base` | 15px | 1.5 | Body text |
| `--mks-text-lg` | 18px | 1.4 | Section headings within popup |
| `--mks-text-xl` | 24px | 1.3 | Welcome page H1, primary call-to-action |
| `--mks-text-xxl` | 32px | 1.2 | Diagnostic timer (smoke), large status |
| `--mks-text-xl` | 24px | 1.3 | Welcome page H1 |
| `--mks-text-xxl` | 32px | 1.2 | Diagnostic timer, large status |
### 4.2 Weights
Replace freely. Modular scale, fluid type, t-shirt sizes — design team picks.
- 400 (regular): all body text
- 500 (medium): UI labels, badge text
- 700 (bold): primary CTAs, status indicators (REC/OFF/ERROR)
### 4.4 Engineering's current weight ladder (placeholder)
Avoid 600 / italic — keep the weight ladder tight.
- 400 (regular), 500 (medium), 700 (bold)
Replace freely.
---
## 5. Iconography
## 5. Iconography *(OPEN — design team, with floors)*
### 5.1 Style
### 5.1 Technical floors **(FLOOR — KEEP)**
- **Solid filled** (not outline). Solid icons read better at 16px/48px sizes
where extension icons live; outline detail is lost at small sizes.
- **24×24 source grid** with 2px padding (effective icon area 20×20). Standard
Material/Apple icon-grid convention; ensures consistent visual weight.
- **Single accent color or two-tone max.** Reserve color complexity for badges
and notifications.
- Sized PNGs at **16, 48, 128 px** in `dist/icons/`, declared in `manifest.json:icons` and `manifest.json:action.default_icon`
- The **128 px is required** for `chrome.notifications.create({type:'basic'})` to render an iconUrl
- File-size minimums per `assets-spec.md` (Chrome silently rejects icons below ~200 B / 500 B / 1 KB at the three sizes)
- Optional 192 px variant for hi-DPI notification rendering
- Inline SVG preferred for popup/welcome surfaces where Chrome permits — sharper at all DPIs. Chrome's `notifications.create` REQUIRES PNG `iconUrl` though.
### 5.2 Mark concept (action.default_icon)
### 5.2 Engineering's current placeholder direction
The extension's primary mark serves 3 roles simultaneously:
- Browser toolbar icon (16/32 — tiny; needs immediately-readable silhouette)
- Extensions page icon (48 — moderate; can carry a bit more detail)
- Chrome Web Store + notification icon (128 — full detail)
Solid-filled, 24×24 source grid with 2 px padding, neutral mark + state via
badge (the toolbar icon itself doesn't change between idle/recording — the
`chrome.action.setBadgeBackgroundColor` does the state work).
**Recommended motif: a "recording dot inside a thread spool / frame".** A
red-or-green circle inside a hexagonal/circular frame. Reads as: "this thing
records." The frame nods at the Mokosh "weaving" theme without literally
showing thread (which would be unreadable at 16px).
**This is one of many possible directions.** Equally valid:
Alternative (cleaner, more conventional): just a filled red circle with a thin
white inner ring — looks like a record button, no thematic baggage. Slightly
less distinctive but immediately understood.
- Line-only icons
- Mixed (solid for primary, line for secondary)
- Per-state icon swaps via `chrome.action.setIcon` (adds perf cost — see §7)
- Animated SVG icons
- Illustrated mark (full scene rather than abstract glyph)
**Color in the mark:** the mark uses `--mks-rec` (green) when REC overlay would
be added by Chrome's badge anyway, OR a neutral mark with state communicated
purely via badge. Recommended: **neutral mark, state via badge.** Keeps the
icon recognizable across all states.
### 5.3 Mark concept *(OPEN — design team)*
### 5.3 Inline glyphs
Engineering's current placeholder is "dark square + green dot" via
ImageMagick. **No mark direction is implied.** Possible directions:
For popup and welcome page:
- Recording-dot inside a frame (conventional, immediately readable as "records")
- Thread/spool/weave motif (leans into the Mokosh etymology)
- Abstract geometric mark (no figurative reference)
- Wordmark only (the letterforms are the mark)
- Illustrated mascot
- Whatever the design team coins
| Concept | Glyph | Notes |
Constraints: must resolve at 16 px (a strong silhouette is hard at that size),
must work neutral OR colored (depending on the team's badge-vs-icon-state
decision).
### 5.4 Inline glyphs *(OPEN — design team)*
The popup and welcome surfaces need glyphs for actions and states. Concepts
engineering currently shows:
| Concept | Currently shown as | Design-team-owned |
|---|---|---|
| Save / download | ⬇ filled-arrow-into-tray | 20px in popup |
| Stop | ■ filled-square | Reserved for explicit stop control (see Section 10) |
| Recording active | ● solid-circle in `--mks-rec` | Pulsing optional (see Section 7) |
| Error | ▲ filled-triangle with `!` | `--mks-error` background |
| Settings | ⚙ filled-gear | Reserved; not currently surfaced |
| Welcome / intro | 🧵 thread/spool emoji is currently used in smoke; replace with custom glyph at design time |
| Save / download | ⬇ filled-arrow-into-tray (Unicode, placeholder) | Replace with custom glyph or icon font |
| Stop | ■ filled-square (placeholder) | — |
| Recording active | ● solid-circle (placeholder) | — |
| Error | ▲ filled-triangle with `!` (placeholder) | — |
| Settings | ⚙ filled-gear (placeholder; not currently surfaced) | — |
| Welcome / intro | 🧵 thread emoji (smoke-test placeholder only) | Replace at design time |
---
## 6. Spacing
## 6. Spacing *(OPEN — design team)*
Base unit: **4px.** All spacing values are multiples of this base.
Engineering currently uses a **4 px base** with the steps below as
placeholders. Replace with any base (8 px, variable, t-shirt sizes,
golden-ratio, etc.).
| Token | Value | Use |
| Token | Value | Currently used for |
|---|---|---|
| `--mks-space-1` | 4px | Tight padding within badges |
| `--mks-space-2` | 8px | Default padding inside controls |
@@ -176,143 +232,159 @@ Base unit: **4px.** All spacing values are multiples of this base.
| `--mks-space-6` | 24px | Welcome page section gaps |
| `--mks-space-8` | 32px | Welcome page hero spacing |
### 6.1 Surface sizing
### 6.1 Surface sizing — current placeholders + technical floors
| Surface | Size | Notes |
| Surface | Engineering's placeholder | Floor / mechanism |
|---|---|---|
| Popup default | 320×200 | Chrome auto-sizes; this is the comfortable target |
| Welcome page | full viewport, max-width 720px content column | Plan 01-10 |
| Notification | Chrome-controlled (basic type, ~360px wide) | iconUrl + title + message |
| Toolbar badge text | max 4 chars | Chrome truncates beyond |
| Popup | 320 × 200 (comfortable; Chrome auto-sizes) | Chrome popups auto-size; no hard max |
| Welcome page | full viewport, content max-width 720 px | None — fully open |
| Notification | Chrome-controlled (~360 px wide) | **(FLOOR)** — not styleable |
| Toolbar badge text | max 4 chars | **(FLOOR)** — Chrome truncates beyond |
---
## 7. Motion
## 7. Motion *(OPEN — design team)*
Conservative. Motion draws attention; the extension should draw attention only
on state change.
Engineering currently ships near-zero motion (200300 ms opacity fades, no
bounce) because the product promise is unobtrusiveness. **Equally valid:**
| Motion | Duration | Easing | Use |
- Lively spring physics
- Fully static (no transitions at all)
- Cinematic entrances on welcome
- Subtle micro-interactions on every state change
Engineering's current placeholder durations:
| Where | Duration | Easing | Notes |
|---|---|---|---|
| Hover transitions | 150ms | `ease-out` | Buttons, links |
| Badge state change | instant | — | REC/OFF/ERROR transitions; no animation |
| Recording pulse (optional) | 1000ms loop | `ease-in-out` | Subtle 0.85→1.0 opacity loop on REC badge if surface allows. Currently used in smoke `.flash` class — adopt for badge if Chrome's badge API allows (it doesn't natively; would need an action.setIcon swap on interval, which has perf cost — recommend OFF for now). |
| Notification slide | Chrome default | — | We don't control |
| Welcome page CTA hover | 200ms | `ease-out` | Background-color + scale 1.0→1.02 |
| Badge state change | instant | — | No animation (Chrome badge API doesn't support; setIcon swap interval would cost perf) |
| Welcome page CTA hover | 200ms | `ease-out` | Background-color + slight scale |
| Notification slide | Chrome default | — | **(FLOOR)** — not controllable |
Per-state icon swap animation (e.g. recording-pulse) is possible but adds
`setIcon` interval cost; design team picks if worth it.
---
## 8. Component conventions
### 8.1 Toolbar action (chrome.action)
Two layers per component: **functional contract** (KEEP — comes from PLAN,
not creative direction) and **visual treatment** (OPEN — design team).
States:
- **Idle** — neutral mark, badge text empty (or `""`), background transparent
- **REC** — neutral mark + badge text `"REC"` + background `--mks-rec`
- **ERROR** — neutral mark + badge text `"ERR"` + background `--mks-error`
- **OFF** (post-stop, awaiting restart) — neutral mark + badge text `"OFF"` + background `--mks-off`
### 8.1 Toolbar action (`chrome.action`)
Tooltip (`chrome.action.setTitle`) communicates current state in Russian:
- Idle: "Mokosh — щёлкните, чтобы начать запись"
- REC: "Mokosh — идёт запись (00:42)" (with live duration)
- ERROR: "Mokosh — ошибка записи, щёлкните для восстановления"
- OFF: "Mokosh — запись остановлена, щёлкните, чтобы начать снова"
**Functional contract (KEEP):**
- Three states surface to operators: IDLE, REC, ERROR (some teams add OFF as a distinct post-stop state)
- Click behavior depends on state — IDLE click starts recording; REC click opens SAVE popup; ERROR click opens RESTART popup
- Tooltip text changes per state via `chrome.action.setTitle`
**Visual treatment (OPEN):**
- Badge background color per state (currently mapped to `--mks-rec` / `--mks-off` / `--mks-error`)
- Badge text per state (currently `""` / `"REC"` / `"ERR"` / `"OFF"`)
- Tooltip wording (currently Russian, placeholder copy below — brand team rewrites)
- IDLE: `"Mokosh — щёлкните, чтобы начать запись"`
- REC: `"Mokosh — идёт запись (00:42)"`
- ERROR: `"Mokosh — ошибка записи, щёлкните для восстановления"`
### 8.2 Notification
Use `chrome.notifications.create` with `type: 'basic'`:
**Functional contract (KEEP):**
- Fired via `chrome.notifications.create({type:'basic', iconUrl, title, message, priority})`
- `iconUrl` must be a ≥128 px PNG via `chrome.runtime.getURL` **(FLOOR)**
- Fires on startup (until operator dismisses), on recovery (after user-stopped-sharing), optionally on save-complete (Phase 5 candidate)
- One notification per state transition (no spam)
```js
{
type: 'basic',
iconUrl: chrome.runtime.getURL('icons/icon128.png'), // hi-res required
title: 'Mokosh', // short, branded
message: 'Recording started.' | 'Recording stopped.' | etc., // Russian
priority: 1, // default; 2 only for urgent
}
```
**Visual treatment (OPEN):**
- Title text (currently `"Mokosh"`)
- Message text (brand team rewrites)
- `priority` (1 default, 2 for urgent — design team can pick when to escalate)
Notifications fire on:
- Startup prompt (every Chrome session) — until operator clicks once
- Recovery prompt (after user-stopped-sharing) — once
- Save complete (optional acknowledgement) — Phase 5 candidate
### 8.3 Popup (current scope: SAVE-only per Plan 01-09)
Avoid notification spam — at most one notification per state transition.
**Functional contract (KEEP):**
- Represents the current toolbar state (REC / ERROR; IDLE shouldn't normally surface here)
- REC state offers a single primary action: save the buffered archive
- ERROR state offers a single primary action: restart recording
- No secondary actions in either state (Plan 01-09 scope decision)
### 8.3 Popup (SAVE-only per Plan 01-09)
- Compact: 320×200 max
- Single primary CTA: "Сохранить отчёт об ошибке" (full-width)
- Status line above CTA: "Запись активна, последние 30 сек захвачены"
- Footer: small text with recording duration ("XX:XX") for trust
- No secondary actions in REC mode
- ERROR mode: replace CTA with restart-recording action; status line shows
error reason
**Visual treatment (OPEN):**
- Sizing (current placeholder 320 × 200)
- CTA wording (current placeholder Russian; brand team rewrites)
- Layout (CTA position, status line, footer)
- Status messaging copy
- Dark/light theme handling (current placeholder: auto via `prefers-color-scheme`)
### 8.4 Welcome page (Plan 01-10)
- Full viewport, dark theme matching `--mks-popup-bg-dark`
- Hero: large mark + name + 1-line tagline
- Body: 2-3 short bullets explaining what Mokosh does (operator-readable Russian)
- Primary CTA: "Начать запись" button — large, `--mks-rec` background, white text
- Footer: privacy note ("Mokosh записывает только ваш экран; данные остаются у вас")
**Functional contract (KEEP):**
- Opens via `chrome.tabs.create` on first install
- Static HTML/CSS/JS in `dist/` (no remote loads **(FLOOR)**)
- Must communicate: what Mokosh does, how the operator triggers a save, privacy story
**Visual treatment (OPEN — design team owns entirely):**
- Layout (hero + steps, scrolling story, modal, video walkthrough, anything)
- Tone (welcome cheer vs sober briefing — brand team)
- Hero treatment (wordmark-only, mark + wordmark, illustrated scene, video)
- Primary CTA wording + placement
- Whether there's a CTA at all (some onboarding flows just inform)
---
## 9. Accessibility & internationalization
## 9. Accessibility & internationalization *(FLOORS — KEEP)*
- **Contrast:** WCAG AA (4.5:1 normal, 3:1 large text). All semantic-state
pairings pre-validated above.
- **Focus:** visible focus rings on all interactive elements (popup buttons,
welcome page CTA). Use Chrome's default `outline: 2px solid auto`.
- **Color-independence:** every color-coded state pairs with text (REC/OFF/ERR
badge labels; never color alone).
- **Localization:** all user-facing strings are Russian per SPEC. UI scaffolding
must support future English/other-locale strings via standard Chrome
`_locales/` mechanism (deferred — no MVP requirement).
- **Reduced motion:** if recording-pulse animation is ever enabled (see §7),
honor `prefers-reduced-motion: reduce` by falling back to static.
These are functional/legal floors, not creative:
- **Contrast: WCAG AA** (4.5:1 normal text, 3:1 large text). Any palette the design team lands on must validate against this for all state pairings. Engineering's current placeholder palette is pre-validated; new palettes need re-validation.
- **Focus indicators:** visible focus rings on all interactive elements (popup buttons, welcome CTA). Chrome's default `outline` works; custom focus styles welcome as long as they remain visible.
- **Color-independence:** every color-coded state must pair with text or shape. Color alone is not an accessible state indicator — pairs with badge labels, glyphs, or copy.
- **Russian-first localization:** all user-facing strings ship in Russian as the default locale. UI scaffolding must support future locales via Chrome's `_locales/` mechanism.
- **Reduced motion:** if any animation is enabled, honor `prefers-reduced-motion: reduce` by falling back to static.
---
## 10. Open design decisions
## 10. Open creative decisions
These are visual choices that need a human design pass before locking:
Non-exhaustive list for both teams. None block engineering today
(placeholders ship); each unlocks a polish pass when answered.
| # | Question | Default if undecided |
|---|---|---|
| ODD-1 | Mark concept: thread/spool motif OR clean record-button | Clean record-button (faster to produce; recognizable; no thematic risk) |
| ODD-2 | Pulsing REC badge animation | OFF (Chrome badge API doesn't support; would need setIcon interval; perf cost) |
| ODD-3 | Tagline final wording | "Записывает, чтобы вы могли воспроизвести." (above) |
| ODD-4 | Welcome page hero illustration | None — type-only hero |
| ODD-5 | Notification iconUrl: same as toolbar mark OR distinct? | Same — operator should recognise the source |
| ODD-6 | Dark/light theme detection in popup | Auto via `prefers-color-scheme` (uses Chrome theme by default) |
1. Public display name (`brand-identity.md` §2)
2. Design system name (`brand-identity.md` §3)
3. Voice register — one tone or two (system-terse vs welcome-prose)
4. Tagline final wording (currently `"Записывает, чтобы вы могли воспроизвести."`)
5. Palette direction (§3.2) + specific hexes
6. Token naming convention (`--mks-rec` placeholder pattern)
7. Typography face(s) — system stack vs custom
8. Type scale + weight ladder
9. Spacing base + steps
10. Corner radii — sharp / soft / mixed
11. Iconography style — solid / line / mixed
12. Mark concept (§5.3)
13. Per-state icon swaps vs fixed mark + dynamic badge
14. Motion vocabulary — minimal / lively / static
15. Welcome-tab layout + treatment (§8.4)
16. Popup layout treatment (§8.3 visual)
17. Notification copy + tone (§8.2)
18. Tooltip wording per state (§8.1)
19. Dark/light theme strategy — auto-detect, follow-Chrome, force one, user-toggle
---
## 11. Implementation notes
## 11. Implementation notes *(TECHNICAL — KEEP)*
- All extension contexts (SW, offscreen, popup, welcome page) share the same
CSP. No external font/asset loads. Everything bundled or `chrome.runtime.getURL`.
- Icons must be in `dist/icons/` and declared in both `manifest.json` `icons`
AND `action.default_icon`.
- Notification iconUrl uses `chrome.runtime.getURL('icons/icon128.png')` — at
least 128×128, ideally 192×192 for retina. Smaller icons silently fail
Chrome's `imageUtil` validation.
- All popup HTML/CSS lives in `src/popup/`. All welcome HTML/CSS lives in
`src/welcome/` (Plan 01-10).
- Inline SVG preferred over PNG where the surface permits — sharper at all
DPIs. Chrome's notification API REQUIRES PNG iconUrl though.
- All extension contexts (SW, offscreen, popup, welcome page) share the same CSP. No external font/asset loads. Everything bundled or `chrome.runtime.getURL`. **(FLOOR)**
- Icons must be in `dist/icons/` and declared in both `manifest.json:icons` AND `manifest.json:action.default_icon`. **(FLOOR)**
- Notification iconUrl uses `chrome.runtime.getURL('icons/icon128.png')` — at least 128 × 128, ideally 192 × 192 for retina. Smaller icons silently fail Chrome's `imageUtil` validation. **(FLOOR)**
- All popup HTML/CSS lives in `src/popup/`. All welcome HTML/CSS lives in `src/welcome/` (Plan 01-10). **(file convention — easy to change)**
- Inline SVG preferred over PNG where the surface permits — sharper at all DPIs. Notification API requires PNG. **(FLOOR for notification only)**
---
## 12. Related
- `assets-spec.md` — concrete deliverables list (specific files, sizes, formats)
derived from this design system
- `brand-identity.md` — naming + blurb + voice (Brief #1)
- `assets-spec.md` — concrete file deliverables + technical floors
- `src/background/index.ts` — implements toolbar action + notification per §8
- `src/popup/index.html` — implements popup per §8.3
- `src/welcome/welcome.html` — implements welcome per §8.4 (Plan 01-10)
- `.planning/phases/01-stabilize-video-pipeline/01-CONTEXT.md` D-16-toolbar,
D-15-display-surface amendments — interaction model this design system
visually realises
- `.planning/phases/01-stabilize-video-pipeline/01-CONTEXT.md` D-15/D-16/D-17 amendments — interaction model this design language sits inside