# SHD.build Design System This document defines the visual language for SHD.build. New pages should feel like part of the same tactical data network as the admin dashboard, while public pages may use more space and larger editorial typography. ## Design principles 1. **Tactical, not military cosplay.** Use operational language, compact information density, restrained status indicators, and precise alignment. Avoid camouflage, distressed textures, or decorative weapon imagery in utility interfaces. 2. **Data first.** Hierarchy comes from grouping, typography, borders, and spacing. Admin tools should resemble a dependable control surface rather than a collection of marketing cards. 3. **Orange means action.** SHD orange identifies primary actions, active navigation, focus, and important values. It should not cover large areas. 4. **State is always visible.** Loading, disabled, active, archived, configured, error, and success states need both visual and textual indicators. 5. **Square and engineered.** Panels and controls use square corners, fine borders, tight spacing, and deliberate grid alignment. 6. **Links use interface feedback, not underlines.** Links do not use native text underlines. Communicate hover and focus through SHD accent color, borders, brightness, and the required focus-visible outline. ## Tokens The canonical tokens live in `src/app.css` under `:root`. | Purpose | Token | Value | | --- | --- | --- | | Page background | `--shd-bg` | `#0a0c0d` | | Base surface | `--shd-surface` | `#111415` | | Raised surface | `--shd-surface-raised` | `#141718` | | Primary border | `--shd-border` | `#303536` | | Main text | `--shd-text` | `#ecebe5` | | Muted text | `--shd-text-muted` | `#858b8d` | | SHD action orange | `--shd-orange` | `#f6a821` | | Success | `--shd-success` | `#75c08c` | | Destructive/error | `--shd-danger` | `#df8069` | | Informational/defensive | `--shd-info` | `#70b9d6` | Use the spacing tokens for new components. Prefer `8px`, `12px`, and `20px` gaps. Dashboard controls use the shared `40px` height when practical. ## Typography - The current UI stack is `Arial, Helvetica, sans-serif`. - Page and module headings are uppercase, heavy, and tightly spaced. - Eyebrows and table labels use 7–10px text with 1–2px letter spacing. - Body and form text should normally remain between 9–12px in dashboards. - Public/editorial copy may use Georgia for a restrained field-manual character. - Never use low-contrast tiny text for information required to complete a task. ## Layout patterns ### Public pages - Maximum content width: approximately 1400–1640px. - Larger headings and more generous vertical rhythm are appropriate. - Preserve the grid background and orange accents. - Catalogue and editorial pages use `catalogue-hero` for an angular introductory panel and may pair it with a compact operational control bar. - Community build cards retain the colored top rule, abstract loadout artwork, concise tags, agent attribution, and a full-width terminal action. ### Agent and authentication surfaces - Account pages should read as an agent dossier: identity and access at the top, activity metrics beside it, archives in the primary column, and security controls in a narrower console column. - Authentication pages use a split frame: contextual SHD network information on the left and the actionable secure-access console on the right. - OAuth providers appear as connection nodes with a recognizable provider color; SHD orange remains reserved for the primary local action and navigation. - On small screens, the split frame becomes a single column and account controls move before archival content. ### Third-party identity buttons - Follow the identity provider's current official brand and sign-in guidelines. - Use official, unmodified assets downloaded from the provider's brand resources. - Discord sign-in uses the official white Discord symbol on Blurple `#5865F2` with the explicit label “Continue with Discord.” - Discord account connection controls use the same official symbol and Blurple treatment with the explicit label “Link Discord.” - Preserve the provider's required clearspace, logo proportions, approved color, readable contrast, and text/logo alignment even when the surrounding surface follows the SHD theme. - Provider buttons still require SHD.build's focus-visible, pressed, pending, and duplicate-interaction protection where those states do not conflict with the provider's branding requirements. ### Admin dashboard - Use `admin-page`, `admin-command`, `admin-dashboard`, `admin-sidebar`, and `admin-content`. - The administrative system is named ISAC. Separate navigation into explicit operational domains such as User Operations and Data Management; visibility must reflect server-provided capabilities. - Each module starts with `module-toolbar`, followed by `module-kpis`. - Editors use `dashboard-editor` and appear before the affected table. - Data collections use `dashboard-table`, `dashboard-row`, and `table-heading`. - Keep tables dense and horizontally scrollable rather than wrapping columns unpredictably. - User dossiers pair access controls and moderation in a two-column console, followed by compact login and content-history streams. Restriction state must be textual and use the danger color; inactivity remains a separate activity classification rather than a punishment state. - Role names describe durable organizational responsibility. `Admin` is the unrestricted administrative role; `Moderator` is reserved for community content moderation and does not imply ISAC access. Operational ISAC access is delegated separately through scoped roles and permissions. - Account deletion uses a collapsed danger zone, explicit identity confirmation, and plain-language retention guidance. Soft-deleted accounts retain authored content under a deleted-agent identity while releasing credentials, usernames, external identity links, sessions, roles, and permissions. - Threshold-based set bonuses use compact `effect-band` groups. Each threshold is displayed as a fixed piece-count marker followed by its mapped stat and value, keeping progression readable in editors and table summaries. - Multi-value compatibility fields use a dense `selection-grid` of checkbox rows with a visible selected-count summary. Keep the entire row clickable and preserve native checkbox semantics for keyboard and assistive-technology use. - When compatibility is conditional on another field, show only valid choices, clear stale selections when the controlling field changes, and state required minimum selections in both the section label and validation feedback. - Tiered records with shared structure use one shared selector and side-by-side value columns rather than duplicating the entire editor. Template-driven copy must show live previews for every tier and document its placeholder syntax. ### Forms - Labels are uppercase and letter-spaced. - Inputs use dark surfaces, one-pixel borders, and clear disabled styling. - Related min/max fields remain visually paired. - Small mutually exclusive option sets use a compact segmented radio control, even when visually presented like selectable checkbox cells. Include an explicit “None” option when the field is optional. - Primary save actions sit at the lower right. Cancel is secondary. - Destructive/archive actions are visually separated from save actions. ## Interaction rules - Every interactive element needs a pointer cursor unless disabled. - Buttons have hover, pressed, focus-visible, pending, and disabled states. - Forms that send requests should use `PendingForm.svelte` or equivalent enhancement to prevent duplicate submissions. - Pending buttons use `aria-busy="true"` and remain disabled until the request completes. - Respect `prefers-reduced-motion`. ## Color semantics - Orange: primary action, current location, selected operational value. - Green: online, active, configured, or successful. - Red: destructive action, error, or offensive classification when context requires it. - Blue: defensive or informational classification. - Gray: inactive, archived, unavailable, or supporting metadata. Do not communicate state by color alone; include a label, icon, or pattern. ## Responsive behavior - Collapse the dashboard sidebar into a two-column module grid below 900px. - KPI tiles become two columns on small screens. - Tier editors stack vertically on tablets. - Tables retain a useful minimum width and scroll horizontally. - Primary and secondary toolbar actions may expand equally on narrow screens. ## Adding a new admin module 1. Add the route beneath `src/routes/admin`. 2. Register it in the admin layout navigation. 3. Start with the module toolbar and KPI row. 4. Reuse dashboard editor and table classes. 5. Use the shared tokens instead of introducing near-duplicate colors. 6. Verify keyboard focus, pending behavior, empty states, mobile layout, and archived data behavior. If a new interface needs a genuinely new pattern, document it here when introducing it. ## Design-system governance Significant visual and interaction changes must update this document and the shared implementation in the same change. A change is significant when it introduces or materially revises a reusable token, component pattern, layout, responsive rule, accessibility behavior, motion behavior, or state convention. Small alignment corrections and isolated visual bug fixes do not require a documentation change unless they establish a rule that other interfaces should follow. Repository agents and contributors should follow the maintenance checklist in `AGENTS.md`.