Surfaces
Every framed region in the app is a SURFACE. This page is two things: the composable <Surface> primitive — the keystone the whole taxonomy composes from — shown across all five of its variant axes; and the canonical surface taxonomy, an 11-category registry mapping every surface kind to what EXISTS today (the real component + import path), what's WIRED in @phauna/ds and waiting to be surfaced, and what's PLANNED. The registry is data (src/components/ds/surface/taxonomy.ts); this page renders entirely from it, so the docs can't drift. @phauna/ds stays UNFORKED — Surface is purely additive in our ds/ layer, and the existing DS surfaces (Card, Modal, DataGrid…) are MAPPED here, not rewritten.
- elevation
- flat · raised (default) · overlay · modal · sunken. The outer drop-shadow depth (sunken is the inset exception). LIGHT only — in DARK shadows resolve to none; depth comes from the ramp + border.
- padding
- none · xs · sm · md (default) · lg · xl. The inner gutter, mapped to the Tailwind spacing scale.
- radius
- none · sm · md · lg (default) · xl · pill. The corner radius, from the DS --radius-* scale.
- tone
- surface (default) · surface-2 · surface-3 · overlay · accent-soft · good · warn · bad. The fill; the status tones pair a soft -bg with matching ink.
- bordered · interactive · inset
- bordered (default true) the hairline edge; interactive a hover/focus affordance (paint a ring only when focusable, e.g. as="button"); inset the recessed-well treatment.
- as
- Polymorphic host element/component (default div). Server-safe (no state/effects), so Surface renders in server or client trees.
import { Surface } from "@/components/ds/surface";
<Surface elevation="raised" padding="md" radius="lg" tone="surface">
Any framed region — composed from the one Surface keystone.
</Surface>Anatomy — elevation
The five elevation keys on live Surface tiles, framed on the page canvas so the shadow (or, for sunken, the inset well) reads. raised is the default card lift; overlay and modal are the higher tiers (popovers, modals); flat sits on the page with no shadow; sunken carves a recessed well.
Anatomy — padding
The padding ramp from none to xl. A dashed inner outline traces the content box so each inset is visible; the border, radius and elevation are identical across all six.
Anatomy — radius
The corner-radius scale from square (none) through the DS --radius-* steps to a full pill. lg is the default surface corner.
Anatomy — tone
The fill tones — the surface ramp (surface → surface-2 → surface-3), the overlay fill, accent-soft, and the three status tones (good · warn · bad), which pair a soft -bg with matching ink. Flip the theme in the top bar to confirm each re-skins.
Anatomy — interactive & inset
Two modifiers. interactive adds a hover edge/fill shift plus a focus-visible ring (the ring only paints when the host is actually focusable — here as="button"); hover and tab to the middle tile to see both. inset (or elevation="sunken") replaces the drop-shadow with a recessed well.
The surface taxonomy
The canonical registry, grouped by its 11 categories. Each surface is a card (rendered on the Surface primitive itself) showing its name, a status badge — Exists (shipped, with the real component + import path), Wired (in @phauna/ds, to be surfaced) or Planned (a reserved slot) — a one-line blurb, and what it composes from. The trivially-renderable 'exists' surfaces carry a small live example.
- Base
- The page-level frames everything else sits inside — the app shell, the content container, and the layout panes.
- Container
- Bordered surfaces that group related content and lift it off the canvas — the Surface keystone and its card family.
- Navigation
- Surfaces whose job is to move you somewhere — sidebars, headers, tabs, breadcrumbs and the bars that hold them.
- Overlay
- Surfaces that float above the page on a higher elevation tier — modals, drawers, popovers and floating panels.
- Collection
- Surfaces that lay out many items at once — tables, trees, grids, calendars and feeds.
- Content
- Surfaces built to read or author a single body of content — prose, rich-text, forms and record pages.
- Status
- Surfaces that report what happened, what's missing, or what's loading — banners, empty/error states and loaders.
- Interactive
- Rich, direct-manipulation canvases — maps, charts, documents and the heavier viewers/editors.
- Utility
- Persistent helper surfaces docked beside the main work — filters, search, inspectors and properties panels.
- Temporary
- Lightweight, transient surfaces summoned on demand and dismissed — tooltips, menus, peeks and sheets.
- System
- Whole-screen states owned by the app lifecycle — onboarding, auth, errors, locks and maintenance.
Base
The page-level frames everything else sits inside — the app shell, the content container, and the layout panes.
AppShell
ExistsThe outermost app frame — header + sidebar + main region scaffolding that hosts a whole screen.
AppMain
ExistsThe main scrollable content region that lives inside AppShell.
composes from AppShell
PageContainer
ExistsThe max-width content well (size variants) that centres a page's content within AppMain.
Section
ExistsA titled content band — Section is the @phauna/ds wrapper, SectionHeader the STD titled rule used across the portal.
Layout panes
ExistsMulti-pane page skeletons — the app frame (AppLayout) and the list↔detail master/detail split (ListDetailLayout).
Box / Container
ExistsThe unstyled layout atoms — a bare Box and a width-constrained Container to build bespoke frames from.
Canvas
PlannedAn unbounded, pannable/zoomable free-form work area (for a map-like or diagram-like full-bleed page).
composes from Surface
Workspace
PlannedA multi-region work layout with resizable panes around the main content (the SplitView/PaneLayout family was removed unused — kernel-slim round 2, 2026-07-22; rebuild if a workspace surface returns).
composes from Surface
Container
Bordered surfaces that group related content and lift it off the canvas — the Surface keystone and its card family.
Surface
ExistsTHE keystone. A composable, polymorphic, server-safe surface (elevation × padding × radius × tone × interactive). Every surface below is a Surface with locked-in variants.
Card
ExistsThe everyday elevated surface — bordered, raised, padded. Padding + accent variants; the portal's ground-floor container.
composes from Surface
Card
The everyday elevated surface.
WidgetCard
ExistsA dashboard widget shell — a Card with a title/action header band over a body slot.
composes from Card
Scorecard
ExistsA KPI tile — a Card framing a single big metric with a label/delta.
composes from Card
CompactCard
ExistsThe grouped-list surface — a padding-less Card with an optional header band and a divide-y body of rows.
composes from Card
ActionCard
ExistsA single focused call-to-action card — accent icon + label + short desc + one action (href or cta).
composes from Card
Panel
ExistsA flat, full-height region surface (no lift) for the body of a pane or a settings section.
composes from Surface
Well
ExistsA recessed, inset surface (sunken elevation) for nesting content one layer down — code blocks, quoted input.
composes from Surface
Tile
ExistsA small, square-ish interactive surface for a grid of equal-weight choices (a launcher / picker cell).
composes from Surface
Sheet
ExistsA large paper-like surface for a document or print-style layout (the canvas of a report).
composes from Surface
GroupBox
ExistsA bordered, captioned grouping of related controls (a fieldset-style enclosure within a form).
composes from Surface
Overlay
Surfaces that float above the page on a higher elevation tier — modals, drawers, popovers and floating panels.
Modal
ExistsA centred, focus-trapped dialog on the modal elevation tier with a backdrop scrim.
composes from Surface
Drawer
ExistsAn edge-anchored sliding panel for secondary flows without leaving the page.
composes from Surface
Popover
ExistsA small anchored floating surface for contextual controls or details.
composes from Surface
Tooltip
ExistsA tiny hover/focus label clarifying an element on the overlay tier.
Menu
ExistsAn anchored list of actions — the dropdown / context-menu surface.
composes from Popover
ConfirmDialog
ExistsA pre-composed yes/no confirmation Modal for destructive or irreversible actions.
composes from Modal
CommandPalette
WiredThe ⌘K fuzzy command/navigation launcher — available in @phauna/ds, to be wired through our ds/ layer.
composes from Modal
Flyout
ExistsA larger anchored panel than a Popover — a rich mega-menu / detail flyout.
composes from Popover
FloatingPanel
ExistsA draggable, non-modal floating window that persists over the workspace.
composes from Surface
InspectorPanel
ExistsA docked-or-floating overlay inspecting the current selection (overlay form of the Utility inspector).
composes from Drawer
Collection
Surfaces that lay out many items at once — tables, trees, grids, calendars and feeds.
DataTable / DataGrid
ExistsThe admin-table lingua franca — sortable columns, selection, sticky header, density, CSV export, virtualization.
Tree
ExistsA collapsible hierarchical list for nested data (megaregion → region → team) — the TreeView wrapper over the @phauna/ds Tree plus a composed FileBrowser.
composes from Surface
List
ExistsA simple semantic list surface (ordered/unordered, marker variants) for plain enumerations.
- Confirm your address
- Join a team
CardGrid / AutoGrid
ExistsResponsive grids of equal cards — fixed-column (CardGrid) or auto-fitting (AutoGrid).
ActivityFeed
ExistsA reverse-chronological stream of activity entries (who did what, when).
Kanban
ExistsA column-of-cards board with drag-between-columns (status-pipeline view).
composes from Surface
Masonry
ExistsA staggered, variable-height tile layout for mixed-size cards/media.
composes from Surface
Gallery
ExistsA grid of media thumbnails with a lightbox/preview affordance.
composes from Surface
Feed
ExistsA rich, infinitely-paged content stream of heterogeneous post cards.
composes from Surface
Timeline
ExistsA time-ordered vertical track of dated events (built on the @phauna/ds TimelineItem atom).
composes from Surface
Content
Surfaces built to read or author a single body of content — prose, rich-text, forms and record pages.
Prose / Article
ExistsThe long-form reading surface — typographic defaults for rendered markdown/HTML article bodies.
RichTextEditor
ExistsThe Tiptap authoring surface — formatting toolbar with markdown/HTML output.
Form
ExistsThe form surface — Field wrappers (label/help/error) composing the STD input controls.
RecordPage / DashboardLayout
ExistsPre-composed page recipes — a single-record detail page and a widget dashboard.
DocumentViewer
WiredA rich PDF/document viewer with highlights and critical-facts overlays — in @phauna/ds (the local ds/document barrel was removed unused, kernel-slim round 2; re-wire from the DS package if needed).
CodeEditor
PlannedA syntax-highlighted code editing surface (deferred — no current app need).
composes from Surface
Status
Surfaces that report what happened, what's missing, or what's loading — banners, empty/error states and loaders.
Banner
ExistsA full-width page-level notice bar (toned) for a standing message at the top of a region.
Callout
ExistsAn inline highlighted aside within content — a tip / note block set off from the prose.
An inline aside set off from the surrounding prose.
EmptyState
ExistsThe calm 'nothing here yet' block — icon + title + description + an optional action.
You're all caught up
No notifications right now.
Skeleton
ExistsPulsing placeholders that hold a region's shape while its content loads.
Spinner
ExistsAn indeterminate loading indicator for an in-flight action.
InlineMessage
ExistsA small toned inline note (icon + text) attached to a field or row — sub-Alert weight.
Alert
ExistsThe STD inline banner — four semantic tones with sensible role/aria-live defaults.
ErrorState
ExistsThe failure counterpart to EmptyState — a danger glyph, plain reason, and a retry control.
Something went wrong
We couldn't load your teams.
Toast
ExistsTransient corner notifications fired imperatively via useToast through a mounted Toaster.
Interactive
Rich, direct-manipulation canvases — maps, charts, documents and the heavier viewers/editors.
MapView
ExistsThe maplibre map surface — markers, territory/district polygons and member clusters.
Charts
ExistsThe recharts data-viz surfaces for trends, comparisons and breakdowns.
DocumentViewer
WiredThe interactive PDF/document canvas (highlights, thumbnails) — in @phauna/ds (local barrel removed unused, kernel-slim round 2).
Canvas / Whiteboard
PlannedA free-form drawing/diagramming surface (deferred — niche, no current need).
composes from Surface
Graph
PlannedA node/edge network visualization with pan/zoom (deferred — niche).
composes from Surface
Spreadsheet
PlannedAn editable cell-grid with formulas (deferred — DataGrid covers tabular needs today).
composes from DataGrid
Terminal
PlannedA console/log surface with a command line (deferred — niche).
composes from Surface
ImageViewer
PlannedA zoom/pan single-image viewer with a lightbox (niche — pairs with Gallery).
composes from Surface
VideoPlayer
PlannedA framed video player surface with controls (niche).
composes from Surface
Utility
Persistent helper surfaces docked beside the main work — filters, search, inspectors and properties panels.
FilterBar / FacetRail
ExistsThe faceted-filter surfaces — a horizontal FilterBar and a vertical FacetRail driving a DataGrid.
GlobalSearch
WiredAn app-wide search surface — in @phauna/ds (alongside the command palette), to be wired.
ActivityFeed
ExistsAn activity stream docked as a side rail — recent changes/audit alongside the main view.
Inspector panel
ExistsA docked side panel showing/editing the properties of the current selection.
composes from Surface
Properties panel
ExistsA grouped key/value editing surface for an object's attributes (form-dense inspector).
composes from Surface
Settings panel
ExistsA sectioned preferences surface — toggles and fields grouped by area.
composes from Surface
History panel
ExistsA docked audit/revision trail for the current record — who changed what, when.
composes from Surface
AIAssistant panel
ExistsA docked conversational assistant rail beside the main work area.
composes from Surface
Temporary
Lightweight, transient surfaces summoned on demand and dismissed — tooltips, menus, peeks and sheets.
Tooltip
ExistsA transient hover/focus label — summoned on demand, dismissed on blur.
DropdownMenu
ExistsAn anchored action list (kebab / row-actions / context menu) — a roving-tabindex role=menu over the Popover; degrades to ActionSheet on mobile.
composes from Popover
Popover
ExistsA transient anchored panel for quick context, dismissed on outside-click.
Spotlight
PlannedA centred spotlight/quick-switch summoned by hotkey — a planned thin preset over CommandPalette (no dedicated @phauna/ds export today).
composes from CommandPalette
HoverCard
ExistsA rich preview card shown on hover-intent over a link/entity (more than a Tooltip).
composes from Popover
PeekPreview
ExistsA quick inline peek at a record without navigating away from the list.
composes from Popover
BottomSheet
ExistsA bottom-anchored sliding sheet for mobile secondary content/actions.
composes from Drawer
ActionSheet
ExistsA mobile bottom sheet of large action choices (the touch context menu).
composes from BottomSheet
FabMenu
ExistsA floating-action-button that expands into a radial/stacked menu of quick actions.
composes from Menu
System
Whole-screen states owned by the app lifecycle — onboarding, auth, errors, locks and maintenance.
WelcomeWizard
ExistsThe onboarding surface — a multi-step wizard that captures a new volunteer's profile.
Login
ExistsThe auth surface — the passwordless-first sign-in screen (portal & admin variants).
NotFound
ExistsThe error surface — the friendly 404 screen for an unknown route.
Lock screen
ExistsA whole-screen lock prompting re-authentication after an idle timeout.
composes from Surface
Splash
ExistsA branded initial-load screen shown while the app boots.
composes from Surface
Permission
ExistsA 403/no-access screen explaining why a page is gated and how to gain access.
composes from Surface
Maintenance
ExistsA whole-screen 'down for maintenance' notice with an ETA.
composes from Surface
Auth layout
ExistsA formalized centred auth shell (brand + card) shared by login/verify/reset screens.
composes from Surface
Error layout
ExistsA formalized whole-screen error shell shared by 404/500/permission/maintenance.
composes from Surface