Resolved: light

Save the Dogs Design System

A living reference for the Save the Dogs skin — the design tokens and the shared UI primitives built on them. Flip the theme in the top bar to preview light and dark.

Save the Dogs is a teal / beryl skin set in Mulish for body and Fraunces for display. It is dark by default: every color is a CSS variable, and the theme is decided entirely in globals.css :root holds the light values and .dark overrides them for the (default) dark skin.

Token layers
Raw palette ramps (--p-beryl-*, --p-neutral-*) feed semantic tokens (--color-accent, --color-surface, --color-text…) which feed the Tailwind utilities.
Theme-aware
Components read semantic tokens only, so flipping :root ↔ .dark re-skins the entire library with no per-component edits.
Primitives
The shared components live in src/components/ui (barrel: @/components/ui). Every section below exercises them across their variants.

Sections

FoundationsColor

Beryl + neutral ramps and the theme-aware semantic palette.

FoundationsTypography

The Mulish body / Fraunces display type scale.

FoundationsSpacing, radius, elevation & motion

The structural tokens: radius scale, shadows, focus ring, motion.

FoundationsIconography

Governance for the lucide-react icon system: sizes, stroke, the decorative-vs-meaningful a11y rule, semantic naming + a catalog.

FoundationsSurfaces

The composable Surface primitive + the full surface taxonomy registry (11 categories).

ComponentsPrimitives (complete inventory)

Every basic primitive on one page — one anchor per component, live demo + source path. The issue-scoping surface.

ComponentsButtons

Variants, sizes, loading & disabled states, icons.

ComponentsOverlays

Modal, Drawer, Popover, Tooltip, Menu, ConfirmDialog, Toaster, Tabs, Accordion.

ComponentsOverlay decisions

The rule for picking a transient/floating surface: tooltip vs popover vs menu vs confirm vs modal vs drawer vs floating panel — a decision tree + use-which-when table.

ComponentsBadges, pills & chips

Badges, status pills, notification counts and icon chips.

ComponentsForms & inputs

Field, Input, Select, Textarea, Label and Toggle.

ComponentsForms (advanced inputs)

Combobox, Checkbox/Radio groups, Switch, Slider, NumberInput, SearchInput, Select, DatePicker & FileUpload.

ComponentsPerson

Avatar, AvatarGroup (overflow +N) and the STD PersonCard.

ComponentsRich text editor

The STD RichTextEditor (Tiptap): formatting toolbar + markdown/HTML output.

ComponentsEvents

The STD events kit: event cards & lists, type/status/recurrence chips + viewer-tz date formatters, RSVP & attendance, the two-column detail layout + calendar/share actions, the event-form building blocks and the door check-in kiosk.

WorkflowWorkflow chrome

TitleBar, a11y Breadcrumbs and a dirty-state SaveBar (+ the useUnsavedChanges guard) for record edit pages.

WorkflowDate & time pickers

DateTimePicker, DateTimeRangePicker and the SchedulerStrip — date + time entry over DatePicker + TimeInput.

WorkflowTree & file browser

TreeView (WAI-ARIA hierarchy, keyboard nav) and a composed FileBrowser over the @phauna/ds Tree.

WorkflowSplit & pane layouts

A draggable, resizable SplitView and the static multi-region PaneLayout skeleton.

WorkflowTeaching & onboarding

TeachingPopover coachmarks, a sequenced Tour and the SetupGuide checklist.

WorkflowExplainers

The “explain this page” family: a collapsible ExplainerPanel (Callout + DescriptionList + Steps) and its AuthExplainer auth-ceremony variant.

WorkflowEntity & tag pickers

EntityPicker (typed multi-select tokens) and a free-entry TagPicker.

RecipesPage recipes

Whole-page templates — ResourceIndexPage, ResourceDetailPage, ResourceEditPage and SettingsPage — composing the TablePage/RecordPage recipes with the workflow TitleBar/SaveBar.

RecipesCRUD

The resource lifecycle pages: ResourceIndexPage (list), ResourceDetailPage (read), ResourceEditPage (create/update) and the delete-confirm flow.

RecipesDashboards

Overview pages: DashboardPage — a summary band over a widget grid and stacked sections, composing the DashboardLayout.

RecipesNavigation & panes

Multi-pane shells: TabbedPage, SplitViewPage (master/detail) and SideTabPage (vertical tab rail + optional inspector).

RecipesData & collections

Collection-heavy templates: tables, faceted filters, boards and card grids composed into whole-page recipes.

RecipesWorkflow

Multi-step flows: the WizardSheet stepped sheet plus the dirty-aware edit/settings shells armed with the route-leave guard.

RecipesCommunication & AI

Messaging + assistant surfaces: conversation panes, the AI assistant panel and notification/activity feeds as page templates.

RecipesSystem & lifecycle

Whole-screen lifecycle states: AuthPage (login / step-up / invite / setup) plus the splash, lock, maintenance and error screens.

RecipesOverlays

Transient page companions: OverlaySurface, InspectorDrawer, WizardSheet and LauncherMenu — responsive dialogs/sheets a page opens by hand.

RecipesSettings & administration

Account & admin templates: BillingPage, IntegrationsPage, PermissionsPage and TeamManagementPage — the settings surfaces an org administrator lives in.

RecipesDocumentation & authoring

Authoring templates: RichEditorPage — a rich-text authoring surface with a metadata / outline aside, over the DocumentLayout.

RecipesMobile & field

On-the-go templates: ScanPage (camera/barcode), OfflineSyncPage (queue + connectivity) and QuickCapturePage (a focused capture form) — the field-work surfaces.

SurfacesCards & surfaces

Card padding/accent variants, ActionCard and lockable tools.

ComponentsBanners, alerts & status

Alerts, empty / error states and loading skeletons.

SurfacesLists & rows

CompactCard, ListRow, CompactListItem and lockable rows.

SurfacesSurfaces · Containers

Region surfaces composed from Surface: Panel, Well, Tile, Sheet and GroupBox.

SurfacesSurfaces · Navigation

Bars and rails that move you around: Toolbar, CommandBar, NavigationRail and BottomBar.

SurfacesSurfaces · Panels

Docked + floating panels: Inspector, Properties, History, Activity, Settings, AI assistant, Flyout, HoverCard and FloatingPanel.

SurfacesSurfaces · Collections

Multi-item layouts: Kanban board, Masonry, Gallery, Feed and Timeline.

SurfacesSurfaces · Temporary

Transient surfaces summoned on demand: BottomSheet, ActionSheet, FabMenu and PeekPreview.

SurfacesCommand palette

The @phauna/ds/command surfaces: CommandPalette (⌘K), GlobalSearch and NotificationCenter.

SurfacesSurfaces · System

Whole-screen lifecycle states: Splash, Lock, Permission, Maintenance, Auth and Error.

SurfacesDocument viewer

The @phauna/ds document module: a pdf.js DocumentViewer (page nav, zoom, search) and PdfThumbnail — mounted SSR-safe via next/dynamic({ ssr: false }) with a self-hosted worker.

ShellNavigation & page structure

PageHeader, PageTabs, ProgressSteps and SectionHeader.

DataData & tables

Tabular layouts, stats and data-density patterns.

DataData table

DataGrid: sortable columns, selection, sticky header, density, CSV export, virtualization.

DataFilters (faceted)

The grants-style FilterBar + SavedViewBar + filterRows → DataGrid, with URL state.

DataData viz & metrics

StatTile, Sparkline, Gauge / Meter / ProgressRing / StatusMeter, TrendDelta and the Line / Area / Bar / Donut charts.

DataCalendar & dates

DatePicker / DateRangePicker / RelativeTime, the DateInput type + fmt helpers, and the app's month calendar (EventsCalendar). Week/agenda views are future work.

DataMaps & geography

STD maplibre wrappers: MapView, markers, territory/district polygons, member clusters, location & district chips.

ShellApp chrome (shell)

The page container, sidebars and overall app frame.