Purpose: shared vocabulary for UI cleanup and convergence work, grounded in current LinkSim usage.
Status labels:
standard: preferred pattern for new work in this roleunder migration: actively converging to this patternexception: intentional non-standard caselegacy: older pattern retained until migratedmapped only: inventoried/visible in gallery, intentionally not converged in current pass
Current snapshot (after tabbed gallery and broad action convergence pass):
- Normal text-bearing app actions continue converging into one shared
ActionButtonfamily. ToolButtoncurrently maps to icon-only map/workspace overlay controls in production UI.- No active text-bearing ToolButton family is in use.
- Icon-only controls outside true overlay controls are mapped and tracked (
mapped only) but not visually converged in this run.
- Standard patterns
- Exceptions and specialized controls
- Borderline/early categories (not standardized yet)
- Role: structural app chrome shells that host content families; shell naming is independent from the feature content rendered inside.
- Use when: discussing layout/frame behavior (left side, right side, bottom shell) instead of feature-specific content.
- Do not use when: describing the internals of a feature module (map settings, profile chart details, library forms).
- Variants:
LeftSidePanel(current shell class:sidebar-panel)RightSidePanel(current shell class:map-inspector, legacy name retained temporarily)BottomPanel(current shell class:chart-panel, mobile host:mobile-workspace-panel)
- Known examples/files:
src/components/AppShell.tsxsrc/components/MapView.tsxsrc/components/LinkProfileChart.tsxsrc/index.css(.sidebar-panel,.map-inspector,.chart-panel,.mobile-workspace-panel*)
- Status:
under migration
Shell concerns vs content concerns:
- Shell concerns:
- panel placement, visibility/expand/collapse, mobile tab hosting, shell spacing/chrome
- Content concerns:
- Sidebar sections (Simulation/Site/Path/Radio/Data)
- Right-panel inspector/details/map settings content
- Bottom-panel path profile chart content
Legacy names to keep temporarily for stability:
- Keep
map-inspectorclass/props for now (widely used selectors/props), but treat it asRightSidePanelin planning vocabulary. - Keep
profilenaming for the bottom chart shell toggles/keys in current code until a dedicated rename pass is scoped.
- Role: standard app action control (inline actions in modals, panels, and inspector actions).
- Use when: triggering an app action like Save, Load, Details, Create, Dismiss, or Remove.
- Do not use when: the control is a map/workspace tool control, a selection row/card, tab, or specialized trigger.
- Variants:
defaultdanger
- Known examples/files:
src/components/ActionButton.tsxsrc/components/SimulationLibraryPanel.tsxsrc/components/MapView.tsx(inspector action group + inline notice dismiss)
- Status:
under migration
Boundary (simplified):
- Includes standard text-bearing app actions in side panels, inspector sections, dialogs, popovers, and modal form actions.
- Excludes true overlay tool controls, link-style actions, tabs, selection surfaces, and icon-only utilities.
- Role: map/workspace overlay controls and view tools.
- Use when: zooming, fitting, panel show/hide, and map-side helper actions tied to overlay/tool context.
- Do not use when: action belongs to standard app action family (ActionButton) in forms/modals/normal panel flows.
- Variants:
map-control-btn map-control-btn-icon
- Known examples/files:
src/components/MapView.tsxsrc/components/AppShell.tsxsrc/index.css(.map-control-btn*)
- Status:
standard
Boundary (strict):
- Includes map/workspace overlay controls and panel visibility/resize controls in workspace chrome.
- Must not be used for text-bearing form/app-flow actions inside panel/modal content.
- Role: selectable rows/cards/items representing entities or choices.
- Use when: selecting a Site, Path, user row, or candidate item.
- Do not use when: action is command-like (Save/Delete/Apply).
- Variants:
site-rowlink-itemlibrary-row user-list-row-btnsite-quick-item
- Known examples/files:
src/components/Sidebar.tsxsrc/components/UserAdminPanel.tsxsrc/index.css(.site-row,.link-item,.site-quick-item,.library-row)
- Status:
standard
Boundary (stabilized):
- Handles entity selection state (selected/active rows/cards).
- Must not be used as a substitute for command actions.
- Role: panel-switching tabs with tab semantics.
- Use when: switching mobile workspace panels.
- Do not use when: action is command-like or selection-card-like.
- Variants:
mobile-workspace-tabmobile-workspace-tab is-active
- Known examples/files:
src/components/app-shell/MobileWorkspaceTabs.tsxsrc/index.css(.mobile-workspace-tab)
- Status:
standard
- Role: reusable overlay and card shell patterns for dialogs/popup workflows.
- Use when: presenting focused modal content with dismiss behavior.
- Do not use when: inline section can stay in normal layout without overlay interruption.
- Variants:
ModalOverlaytierbaseModalOverlaytierraised- card shell via
library-manager-cardand context-specific card classes
- Known examples/files:
src/components/ModalOverlay.tsxsrc/components/SimulationLibraryPanel.tsxsrc/components/UserAdminPanel.tsxsrc/components/Sidebar.tsx
- Status:
standard
Shell/header/action-row convergence note:
- Panel headers (
section-heading,library-manager-header, inspector/chart top rows) now follow a shared header rhythm baseline. - Form action rows (
chip-groupin panel/modal action contexts) now follow a shared action-row cadence baseline.
- Role: consistent pairing of field layout and nearby actions.
- Use when: presenting label/input pairs with local action groups (filter actions, save/create groups).
- Do not use when: data is purely presentational or should be list/card selection.
- Variants:
field-gridchip-groupfor clustered actions
- Known examples/files:
src/components/SimulationLibraryPanel.tsxsrc/components/UserAdminPanel.tsxsrc/index.css(.field-grid,.chip-group)
- Status:
standard
- Role: inline, low-emphasis action styled as text link.
- Use when: action should read as contextual/link-like rather than primary button.
- Do not use when: user must clearly notice a primary action.
- Variants:
inline-link-button- tutorial/document links (
tutorial-inline-link, anchor styles)
- Known examples/files:
src/components/Sidebar.tsxsrc/components/OnboardingTutorialModal.tsxsrc/index.css(.inline-link-button)
- Status:
exception
Exception policy:
- Keep as exception when visual intent is contextual/link-like and intentionally lower emphasis than ActionButton.
- Do not migrate to ActionButton unless the control should read as a primary/standard command.
- Role: icon-only actions (close, compact utility icons, icon-only overlay controls).
- Use when: control is intentionally icon-only and discoverable via aria-label/title.
- Do not use when: action needs readable text label for normal app-flow operations.
- Variants:
inline-action-iconmap-control-btn-iconchart-endpoint-icon
- Known examples/files:
src/components/InlineCloseIconButton.tsxsrc/components/MapView.tsxsrc/components/AppShell.tsx
- Status:
mapped only
Policy:
- Mapped and tracked in gallery for coverage.
- Out of scope for visual convergence in the current pass.
- True map/workspace overlay icon controls are standardized under
ToolButton; non-overlay icon controls remain mapped-only.
- AppShell transient/persistent notices now use one unified app-level notification stack (always visible, multi-item, auto/manual dismiss, overflow expand/collapse).
- Existing
publishAppNoticepublication points now route into this unified system.
notification-bell+notification-badge(trigger/badge behavior pattern)map-holiday-note(seasonal/context-specific content treatment)
field-help-errorinline validation text (form-level, not always banner-level)- domain-specific status tiles (
margin-status,terrain-alert) that encode simulation semantics
Recommended next cleanup pass:
- Migrate remaining standalone notice surfaces (
notification-banner, selected offline/status blocks) onto the same notification container language where semantics match, while keeping bell/badge and domain tiles as exceptions.
- Role: controls with distinct meaning and visual behavior that should not be forced into generic button taxonomy.
- Use when: control carries unique domain meaning (account chip, bell/badge trigger, upload label, info tip).
- Do not use when: a standard ActionButton or ToolButton already fits.
- Variants:
user-chipnotification-bellupload-buttoninfo-tip
- Known examples/files:
src/components/UserAdminPanel.tsxsrc/components/NotificationsPanel.tsxsrc/components/InfoTip.tsxsrc/index.css
- Status:
exception
Exception policy:
- Keep distinct when control communicates a unique role (user chip, badge trigger, upload affordance, info-tip).
- Avoid forcing these into ActionButton/ToolButton unless repeated usage proves a shared family is needed.
- Role: standardized close affordance for modal/header dismiss actions.
- Use when: explicit close/dismiss icon is needed in modal/header contexts.
- Do not use when: control is a generic action button.
- Variants:
InlineCloseIconButton(built oninline-action inline-action-icon)
- Known examples/files:
src/components/InlineCloseIconButton.tsx- reused across
Sidebar,SimulationLibraryPanel,UserAdminPanel,AppShell
- Status:
standard
Exception policy:
- Icon-only close remains a dedicated primitive and is not part of ActionButton family.
- Sidebar library/filter/editor utility controls with embedded data/edit semantics (for example collaborator candidate row affordances) still need role cleanup.
- Some mixed utility controls remain near ActionButton visually but need one more semantics pass before forced convergence.
Recommendation: keep this glossary compact until ActionButton migration coverage is broader and ToolButton vs ActionButton boundaries are fully settled.
ActionButtonmigrated:SimulationLibraryPanel,MapViewinspector standard actions- broad standard actions in
AppShell,UserAdminPanel, and expandedSidebarmodal/library flows - welcome modal primary actions
- Intentionally separate:
ToolButtonoverlay controlsLinkButton- tab controls, selection surfaces
- Mapped-only:
- icon-only utility controls
- Remaining legacy concentration:
- a small number of role-ambiguous Sidebar utility affordances