Files
shd.build/docs/DESIGN_SYSTEM.md
T

9.2 KiB
Raw Blame History

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.
  • 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.