Design system · v3.1 · based on skill in Claude: kc-design-foundations v1.3.3

KCDS — Design system documentation

Component reference for the unified KnowledgeCity product UI. Every component below is shown in all of its states — default, hover, focus, active, disabled, error — across both density modes, with live theme and product category switching to demonstrate how the entire chrome shifts per Native product.

Foundations

Color

Three tiers — primitive, semantic, tenant. Components reference semantic tokens, never raw hex. Status colors are universal across every KC product.

Brand orange ramp

50#FFEDDC
100#FFE1C4
200#FFDBBA
300#FBD1AB
400#FF7A00
500#FF881A
600#FF6F00
700#C75F00

Neutrals

0#FFFFFF
100#F3F7F9
200#EAEFF3
400#CCD5DD
500#9A9A9A
600#74838A
700#404A4F
950#1F2023

Semantic tokens — status

Success
--kcds-color-status-success
Error
--kcds-color-status-error
Warning
--kcds-color-status-warning
Info
--kcds-color-status-info
Featured
--kcds-color-status-featured
AI suggestion
--kcds-color-ai-suggestion
Foundations · v1.3.3

Product suite accents

KCDS has three product suites — Learn, Comply, Grow — and each owns a primary color. Internal/admin tools are not a suite and carry no accent (neutral gray chrome). Buttons, focus rings, links, active states, hover tints — all resolve from the suite. KC corporate orange is the logo-mark anchor in every product; in Learn it is also the suite accent. Try the switcher in the sidebar to see every component on this page shift colors live. (3-suite model per ADR 012/013/014/015; the former Perform/indigo and Platform/cyan categories were removed.)

Three suite primaries + internal

Activated by data-kcds-product-category="..." on <body>. Valid values: learn · comply · grow · internal.

Legacy / Orange
#FF881A
LMS 3.0 · LMS Admin Legacy · Portal Legacy
no category attribute = default
primary#FF881A
hover#FF6F00
active#C75F00
fill#FFE1C4
tint#FFEDDC
KC Learn · Orange
#FF881A
KC Library · KC LMS · KC Studio
data-kcds-product-category="learn"
primary#FF881A
hover#FF6F00
active#C75F00
fill#FFE1C4
tint#FFEDDC
KC Comply · Teal
#0A7A7A
KC Safety · KC Docs · KC Onboard · KC Phishing
data-kcds-product-category="comply"
primary#0A7A7A
hover#096B6B
active#085C5C
fill#B5EBEB
tint#E0F7F7
KC Grow · Blue
#006CD0
KC Skills · KC Map · KC TNA · KC Talent · KC Performance
data-kcds-product-category="grow"
primary#006CD0
hover#005CB0
active#004E96
fill#C7E2FF
tint#E4F5FF
Internal · Neutral gray
#2C3E46
User Directory · Admin Tools · USMP · Integrations · Communications
data-kcds-product-category="internal"
primary#2C3E46
hover#1F2023
active#0F1419
fill#EAEFF3
tint#F3F7F9

Live preview — chrome shifts per category

Each preview is scoped to its own data-kcds-product-category. The button, focus ring, active sidebar item, and link all resolve from the category.

Legacy · LMS 3.0
Learn more
KnowledgeCity · KC Skills
Learn more
KnowledgeCity · KC LMS
Learn more
KnowledgeCity · User Directory
Learn more
KnowledgeCity · KC Safety
Learn more

Learn = orange — the AA exception

Learn owns the KC master orange, so the flagship learner products (KC Library, KC LMS) stay on the brand orange they ship today. Two rules apply to Learn only:

  • On-primary is WHITE (#FFFFFF), light and dark. This is a deliberate, accepted WCAG AA exception — white on orange-500 is 2.39:1. The master brand orange is never darkened, and dark text on orange was rejected as off-brand (ADR 012). Links on white still use orange-700 (#C75F00 — text on white, not on the orange fill).
  • Warnings must not rely on colour alone in Learn. Since status-warning is also orange, a warning in a Learn product is differentiated by icon + leading-stripe, not hue.

What stays orange — always

  • KC logo mark — the orange "kc" circle is the corporate anchor in every product, every suite. In Comply/Grow it is the single brand accent against the suite hue; in Learn the chrome is also orange.
  • Legacy products — LMS 3.0, LMS Admin Legacy, Portal Legacy — kept as formerly aliases; because Learn = orange, these legacy learner surfaces are already on their suite colour.

What never changes per suite

  • Status colors — green success, red error, amber/orange warning, blue info, gray neutral. A "Completed" badge stays green in every suite. Status semantics always override the suite accent.
  • AI augmentation — violet (#8543DA), system-fixed. An AI suggestion chip in any product (AI Teacher, KC Studio) stays violet regardless of suite.
  • Severity & sensitivity colors — system-fixed across all KC products.
  • Body text, borders, shadows, radius, spacing, typography — system primitives, never tinted by suite.

Indirection rule (v1.0+)

When a semantic token references another semantic token via var(...), the cascade silently breaks at suite-override boundaries. CSS Custom Properties resolve at the declaring element, not the styled descendant. These tokens MUST be redeclared as direct primitives in every suite and theme block:

TokenReason
--kcds-color-text-linkLinks render orange on non-Learn pages without explicit redeclaration.
--kcds-color-border-focusFocus rings render orange on non-Learn pages without explicit redeclaration.
--kcds-color-on-primary-tintActive sidebar / chip / pager text on tint backgrounds — needs hue-specific dark text in light theme, lifted for legibility in dark theme.
--kcds-color-on-primaryWhite for every suite except internal dark, where the light neutral CTA needs dark on-primary. Redeclared in Learn (white AA exception) and internal so it never inherits the wrong value.
Foundations · v1.3.3

Dark theme

System-wide opt-in via data-kcds-theme="dark" on <body>. Cascades over data-kcds-product-category — accent hue persists, but tints and fills become semi-transparent overlays. Toggle the theme in the sidebar to see every component on this page switch live.

Surface hierarchy

The light rule "white chrome on gray canvas" inverts cleanly: dark chrome (#181D22) on darker canvas (#0F1419). Modals and popovers sit lighter still. Hierarchy reads via color contrast, not shadow — shadows in dark are nearly invisible.

Canvas
#0F1419
Surface (chrome / cards)
#181D22
Elevated (modals, popovers)
#21272D
Subtle (hover, table header)
#1C2228
Border default
#3A424B
Border subtle
#2A3038

Suite accents in dark — recomputed

Each suite accent is recomputed to a PD-205 OKLCH-balanced dark value (L≈0.55) — light-mode values read muddy on dark canvas. Learn mirrors the orange dark chain; Comply and Grow shift to their calibrated dark teal / blue. on-primary stays white for every suite (Learn's white-on-orange is the accepted AA exception). Internal is the inversion — a light neutral CTA reads on the dark surface, so its on-primary is dark, the one non-suite exception.

SuiteLight primaryDark primaryStrategy
Legacy / Orange#FF881A#FF881Aunchanged — hover lifts to #FF9D40
KC Learn / Orange#FF881A#FF881Amirrors legacy orange chain; white on-primary (AA exception)
KC Comply / Teal#0A7A7A#0A8282PD-205 dark teal — hover lifts to #238E8E
KC Grow / Blue#006CD0#0874C8PD-205 dark blue — hover lifts to #2080D5
Internal / Gray#2C3E46#E8EAEDinverts — light neutral CTA on dark, dark on-primary #1F2023

Tint / fill — rgba overlays in dark

Solid pale-color blocks look like glowing burns on dark surfaces. A light-mode blue tint #E4F5FF becomes dark-mode tint rgba(50, 157, 255, 0.10) — the hue is preserved, but it sits as a transparent overlay over the actual dark surface beneath.

Status colors lift for contrast

Saturated mid-tone status colors (green-700, red-500) become unreadable on dark surfaces. They lift to *-400/300 palette values for visibility, and their backgrounds become rgba overlays.

StatusLightDark
Success#00A01A#4ADE80
Error#F03E3E#F87171
Warning#FF881A#FBBF24
Info#329DFF#60A5FA
Featured / AI#8543DA#A78BFA

Elevation in dark — borders, not shadows

Drop shadows on dark backgrounds are nearly invisible. Elevation is communicated by stepping up the surface lightness (canvas → surface → elevated) plus 1px borders. Shadow tokens stay in code — they contribute in light and degrade gracefully in dark.

Foundations · v1.3.0

Visual discipline

Four hard rules promoted to zero-rule status (F-067–F-070). They are violated more often than anything else and quietly break the system. A surface that follows them reads as KCDS before any component-level polish.

1 · Colour is a budget

One colour-carrying channel per component. The icon carries the accent, the value stays text-primary, and the meaning lives in the label — not three tinted things competing. If everything is coloured, nothing reads as emphasis (F-067).

2 · The accent is never a status colour

The product accent (suite primary) and the status palette are separate systems. Never colour a "success"/"error"/"warning" state with the suite accent, and never use green/red/amber to mean "primary action". Status semantics always override the accent — a "Completed" badge is green in every suite (F-068). (In Learn, where the accent is orange and warning is also orange, differentiate the warning by icon + leading stripe.)

3 · font-weight is 400 / 700 only

Lato is loaded at 400 and 700 only. 500/600 are forbidden — Google Fonts synthesizes a fuzzy pseudo-bold. Never mix weights inside one line (it breaks tabular-nums); max two type styles per card header (F-069).

ElementWeight
Body, meta, badges, status text, tab / button / nav labels, input values400
Card titles, structural headings (h1–h5), KPI values, table header labels700
Anything at 500 or 600❌ forbidden

4 · Never white-on-white

The fill and the border trade places depending on the parent surface. A control on a white surface uses a visible border and a subtle fill; the same control on a tinted/canvas surface uses a white fill and a lighter border. A white control on a white parent (no border) disappears (F-070).

Foundations

Typography

Lato as the primary face. Twelve tokens — eight canonical, four edge cases. The default heading flow is H1 → H2 → H4. H3 only when an admin sub-section needs extra weight.

--kcds-text-display
Aa Gg
80 / 90 · 600 · edge
--kcds-text-h1
Page titles set the scope
32 / 42 · 600
--kcds-text-h2
Section headings group the work
24 / 34 · 600
--kcds-text-h3
Sub-sections, admin density only
20 / 28 · 700 · edge
--kcds-text-h4
Card titles and everyday sub-heads
18 / 28 · 600
--kcds-text-body-l
Lead paragraphs in learner contexts
18 / 28 · 400 · edge
--kcds-text-body-m
Default body in learner / Portal contexts. The everyday reading register, calibrated for long sessions and good rhythm against a 16px baseline.
16 / 26 · 400
--kcds-text-body-s
Default body in admin / LMS contexts. Compact, dense, made for scanning rows.
14 / 20 · 400
--kcds-text-caption
Captions, fine print, table meta, tooltip secondary text
12 / 16 · 400
--kcds-text-label
Section labels · sidebar group headers
11 / 16 · 700 · uppercase
Foundations

Spacing

4px-based rhythm. Density mode picks the actual values used in components.

--kcds-spacing-4
4 px
--kcds-spacing-8
8 px
--kcds-spacing-12
12 px
--kcds-spacing-16
16 px
--kcds-spacing-20
20 px
--kcds-spacing-24
24 px
--kcds-spacing-32
32 px
--kcds-spacing-40
40 px
--kcds-spacing-48
48 px
Foundations

Radius

Pattern A leans toward larger radii (32 px section frames). Pattern B keeps tighter corners.

--radius-4
--radius-8
--radius-12
--radius-16
--radius-20
--radius-24
--radius-32
--radius-full
Foundations

Elevation

Three depths in light theme. In dark, drop shadows are nearly invisible — elevation is communicated by stepping up the surface lightness + 1px borders. Shadow tokens stay in code; they degrade gracefully (no-op in dark). Toggle the theme to see the three cards switch from shadow-based to surface-based elevation.

--shadow-sm
light: subtle shadow · dark: 1px border
--shadow-md
light: shadow-md · dark: surface-elevated
--shadow-lg
light: shadow-lg · dark: elevated + outer ring
Foundations

Density

Two modes — same tokens, different output values. Comfortable for learner / Portal. Compact for admin / LMS.

Comfortable
Default · Pattern A · KC Library · Learner Portal
Button
Input
Badge Completed
Heights btn 56 · input 52 · row 56
Compact
Default · Pattern B · LMS Admin · Admin Tools
Button
Input
Badge Done
Heights btn 32 · input 32 · row 32

Spec table

ElementComfortableCompact
Button — Medium56 px · r20 · 16/Regular32 px · r8 · 14/Bold
Button — Large64 px · r2440 px · r12
Button — Small48 px · r1628 px · r6
Input field52 px · r20 · 16 px body32 px · r8 · 14 px body
Status badgepill · 14/600 · pad 6/16r4 · 12/700 · pad 2/8
Table row56 px · pad 16 · body 1632 px · pad 8/12 · body 14
Default body--kcds-text-body-m · 16/26--kcds-text-body-s · 14/20
Card padding24–32 px12–16 px
Section radius32 px (Pattern A)16 px (Pattern B)
Component · Actions

Button

One primary per logical decision point. Secondary may sit beside it. Tertiary may sit beside either. Destructive is red and always preceded by confirmation.

Variants by weight

Comfortable 56 · r20 · 16/400
Primaryfilled · brand
Secondaryoutlined
Tertiarytext only
Destructivered filled
Loadingspinner
Compact 32 · r8 · 14/700
Primaryfilled · brand
Secondaryoutlined
Tertiarytext only
Destructivered filled
Loadingspinner

Sizes — Large · Medium · Small

Comfortable 64 · 56 · 48
Large64 · r24
Medium56 · r20
Small48 · r16
Compact 40 · 32 · 28
Large40 · r8
Medium32 · r8
Small28 · r8
Component · Actions

Icon button

Icon-only actions for constrained space or universally-recognised actions (close, edit, delete, more).

Comfortable 40 · r-full · 20px icon
States
With dotunread indicator
Common icons
Compact 32 · r-full · 16px icon
States
With dotunread indicator
Common icons
Component · Actions

Button group

For two or more closely related actions presented as a unit. Used for view switchers and segmented controls.

Comfortable r12 · 14/600
Default3 options
Two options
Compact r8 · 13/600
Default3 options
Two options
Component · Inputs

Text input

Label is mandatory. Placeholder is not a label. Focus ring is 3 px brand-tinted.

Comfortable 52 · r20 · 16px
Defaultempty
We will only use this for sign-in.
Hover
Focus
Filled
Error
Enter a valid email address.
Disabled
Issued automatically. Cannot be changed.
With iconsearch
Compact 32 · r8 · 14px
Defaultempty
We will only use this for sign-in.
Hover
Focus
Filled
Error
Enter a valid email address.
Disabled
Issued automatically. Cannot be changed.
With iconsearch
Component · Inputs

Textarea

Comfortable r16 · 16px · min 120
Default
Visible to all admins on the course detail page.
Filled
Compact r8 · 14px · min 80
Default
Visible to all admins on the course detail page.
Filled
Component · Inputs

Switch

For boolean settings that take effect immediately. For deferred application, use a checkbox.

Comfortable 44×24 · 20 thumb
Off
default · focus · disabled
On
In context
Email weekly digest
Course-due reminders
Compact 32×18 · 14 thumb
Off
default · focus · disabled
On
In context
Email weekly digest
Course-due reminders
Component · Inputs

Checkbox

Comfortable 20 · r4 · 2px border
Unchecked
default · hover · focus · disabled
Checked
Indeterminatepartial selection
used in select-all when only some rows are selected
In context
Send invitation by email
Add to default cohort
Compact 16 · r4 · 1.5px border
Unchecked
default · hover · focus · disabled
Checked
Indeterminatepartial selection
used in select-all when only some rows are selected
In context
Send invitation by email
Add to default cohort
Component · Inputs

Radio

Comfortable 20 · 2px border
Unselected
Selected
In contextgroup
Send immediately
Schedule for later
Save as draft
Compact 16 · 1.5px border
Unselected
Selected
In contextgroup
Send immediately
Schedule for later
Save as draft
Component · Selection · v1.0

Opinion scale

Discrete choice on a labeled spectrum — Likert (1–5 agree/disagree), NPS (0–10 detractor/promoter), easiness (1–7), CSAT (1–5 smileys). Only the selected position is highlighted — never cumulative. That is the visual difference from Rating below.

Comfortable 44 · 14/700 · gap 8
Easiness 1–7selected = 5
How easy was completing this course?

On a scale from 1 to 7, how easy was it to complete this course?

Very difficult Very easy
Likert 1–5selected = 4
The training was relevant to my role.
Strongly disagree Strongly agree
NPS 0–10selected = 9
How likely are you to recommend us?
Detractor Promoter
CSAT smileysselected = 4
How satisfied are you?
Compact 32 · 12/700 · gap 4
Easiness 1–7selected = 5
How easy was completing this course?

On a scale from 1 to 7, how easy was it to complete this course?

Very difficult Very easy
Likert 1–5selected = 4
The training was relevant to my role.
Strongly disagree Strongly agree
NPS 0–10selected = 9
How likely are you to recommend us?
Detractor Promoter
CSAT smileysselected = 4
How satisfied are you?
Component · Selection · v1.0

Rating

A scalar star rating. Stars 1..N are all filled when rating = N — cumulative. Used for course/instructor/content quality feedback. The opposite encoding from Opinion scale: rating means "I reached this level", opinion means "I am at this position".

Comfortable 20 star · 6 gap
Inputcommitted = 4
Rate your experience with this course.
Hover previewcommitted = 2, hover star 4
Displaycard metadata · 4.6 (231)
Hero sizepost-completion modal
How was this course?
Emptyno rating yet
Disabledsubmitted
Compact 16 star · 4 gap
Inputcommitted = 4
Rate your experience with this course.
Hover previewcommitted = 2, hover star 4
Displaycard metadata · 4.6 (231)
Hero sizepost-completion modal
How was this course?
Emptyno rating yet
Disabledsubmitted
Component · Status

Status badge

Status semantics are universal across every KC product. Overdue is always red. In-progress is always blue.

Comfortable pill · 12/600 · pad 4/12
Variants
Completed In progress Due soon Overdue Featured Archived AI-generated
Without icon
Completed In progress Due soon Overdue
Compact r4 · 11/700 · pad 2/8
Variants
Completed In progress Due soon Overdue Featured Archived AI-generated
Without icon
Completed In progress Due soon Overdue
Component · Status

Severity badge

Used in Compliance Operations, Safety, audit reports. Sortable by severity rank.

Comfortable r4 · 12/700
5-tier scale
Critical High Medium Low Info
Compact r4 · 10/700
5-tier scale
Critical High Medium Low Info
Component · Status

Filter chip

Comfortable pill · 14/400 · pad 6/12
Defaultunselected
All teams Hover Focused Disabled
Activeselected
Engineering Active this week
With addappend filter
Add filter
Compact pill · 12/400 · pad 3/10
Defaultunselected
All teams Hover Focused Disabled
Activeselected
Engineering Active this week
With addappend filter
Add filter
Component · Status

Progress

Comfortable track 8 · meta 12px
Standalonewith meta
62% completeModule 8 of 12
States
Inlineused in tables
88%
42%
18%
Compact track 6 · meta 11px
Standalonewith meta
62% completeModule 8 of 12
States
Inlineused in tables
88%
42%
18%
Component · Feedback

Alert

Inline page-level messages. Five variants — info, success, warning, error, AI.

Comfortable r12 · 16/600 · 14/400
Info
New compliance pathway available
Operations 2026 has 3 new modules. Existing learners keep their progress.
Success
Roster import succeeded
248 learners added. 3 duplicates were skipped.
Warning
12 learners are at risk of missing the deadline
Send a reminder, extend the deadline, or escalate to managers.
Error
Cannot publish — 2 modules are missing required fields
Module 4 has no description. Module 7 has no estimated duration.
AIviolet accent
AI suggested 3 improvements to this learning path
Review the suggestions before publishing.
Compact r8 · 14/600 · 12/400
Info
New compliance pathway available
Operations 2026 has 3 new modules. Existing learners keep their progress.
Success
Roster import succeeded
248 learners added. 3 duplicates were skipped.
Warning
12 learners are at risk of missing the deadline
Send a reminder, extend the deadline, or escalate to managers.
Error
Cannot publish — 2 modules are missing required fields
Module 4 has no description. Module 7 has no estimated duration.
AIviolet accent
AI suggested 3 improvements to this learning path
Review the suggestions before publishing.
Component · Feedback

Toast

Brief, dismissible, dark. For action confirmations. Disappears after 4–6 seconds unless hovered.

Comfortable r12 · 14/400
Success
Settings saved.
Error
Could not save — check your connection.
Compact r8 · 13/400
Success
Settings saved.
Error
Could not save — check your connection.
Component · Feedback

AI suggestion panel

Universal across every KC product where AI surfaces a suggestion. Always violet-accented. User must explicitly accept or dismiss.

Comfortable r16 · pad 20 · 16/600
AI suggestion
Based on your team's recent skill gaps, learners on the Operations team would benefit from the Risk Communication path. Estimated impact: 18% improvement on incident response scoring within one quarter.
Compact r8 · pad 12/16 · 13/600
AI suggestion
Based on your team's recent skill gaps, learners on the Operations team would benefit from the Risk Communication path. Estimated impact: 18% improvement on incident response scoring within one quarter.
Component · Data display

Avatar

Comfortable 40 · sm 28 · lg 56
Sizes
AM AM AM AM 28 · 40 · 56 · 80
Tone variantsderived from name hash
AM JT PK RS
With photouploaded profile picture
Kseniia Zaitseva Kseniia Zaitseva Kseniia Zaitseva Kseniia Zaitseva Kseniia Zaitseva
Stackcollaborator group
AM JT PK +4
Compact 32 · sm 24 · lg 40
Sizes
AM AM AM AM 28 · 40 · 56 · 80
Tone variantsderived from name hash
AM JT PK RS
With photouploaded profile picture
Kseniia Zaitseva Kseniia Zaitseva Kseniia Zaitseva Kseniia Zaitseva Kseniia Zaitseva
Stackcollaborator group
AM JT PK +4
Component · Data display

KPI tile

Used in admin dashboards. White card, subtle border, no colored borders.

Comfortable r16 · 28px value
Trend up
12%
Active learners
2,847
Trend down
2h
Avg. session
28 min
Loadingskeleton
Compact r8 · 22px value
Trend up
12%
Active learners
2,847
Trend down
2h
Avg. session
28 min
Loadingskeleton
Component · Data display

Table

Header in surface-canvas tone. Hover highlight on rows. Selected rows tinted with primary-tint. Compact is the default for admin surfaces.

Comfortable · row 56 · body 16/26
Learner Team Progress Status Last active
Kseniia Zaitseva
Kseniia Zaitseva
kseniia.z@example.com
Operations
88%
On track 2 hours ago
JT
Joaquín Torres
joaquin.t@example.com
Engineering
42%
Due soon Yesterday
DH
Dafydd Hughes
dafydd.h@example.com
Compliance
18%
Overdue 12 days ago
Compact · row 32 · body 14/20 · default for admin
Learner Team Progress Status Last active
Kseniia Zaitseva
Kseniia Zaitseva
kseniia.z@example.com
Operations
88%
On track 2 hours ago
JT
Joaquín Torres
joaquin.t@example.com
Engineering
42%
Due soon Yesterday
DH
Dafydd Hughes
dafydd.h@example.com
Compliance
18%
Overdue 12 days ago

Required table pattern (v1.3.0 · F-081–F-084)

Admin tables are sortable by default. The full pattern is mandatory — a bare <th> is a failure.

  • Type-aware sortable headers. Each sortable <th> carries aria-sort cycling three states — none → ascending → descending. Sort direction is type-aware: text A→Z, numbers low→high, dates old→new. Only one column sorted at a time.
  • Range-readout pagination that resets on filter change. Show "1–12 of 340", not just page numbers; when a filter changes, reset to page 1 and recompute the readout.
  • Three distinct empty states. No data yet (onboarding CTA) ≠ no results for this filter (clear-filters action) ≠ error loading (retry). Never one generic "No data".
  • Labelled trailing row actions. A data-no-sort actions column; the kebab reveals on :focus-within (never hover-only — that fails keyboard/touch) and stays permanent on touch; focus returns to the originating kebab on menu close.
  • Card-scoped overflow. Horizontal scroll lives on the table container, never on body/html. Numeric columns use font-variant-numeric: tabular-nums so digits align.
  • Mobile (4 rules): hide secondary columns, turn sticky off, shrink the primary-cell max-width, consolidate chips. Row detail opens a bottom sheet, not a route.

Chart honesty (F-085–F-089)

  • Empty ≠ small. No data renders an explicit empty state, never a flat/zero bar that reads as a real value of zero.
  • Show the track. Progress/meter fills always show their container track so 0% is distinguishable from "not rendered".
  • Multi-channel ramps. Series are separated by more than hue (pattern, label, position) — colour alone fails for colour-blind users.
Component · Data display

Tabs

Comfortable r0 · 14/600 · pad 12/20
Defaultwith counts
Compact r0 · 13/600 · pad 8/12
Defaultwith counts
Component · Data display

Pagination

Comfortable 36 · r8 · 14/600
Default
Compact 28 · r4 · 12/600
Default
Component · Overlays

Tooltip

For supplementary information on hover or focus. Never for critical info.

Comfortable r8 · 12/400 · pad 6/12
Default
Last sync: 2 minutes ago Press ⌘ K to search Beta feature
Compact r4 · 11/400 · pad 4/8
Default
Last sync: 2 minutes ago Press ⌘ K to search Beta feature
Component · States

Loading

Skeleton for layout-known loading. Spinner for unknown duration or small surfaces.

Comfortable spinner 24 · text 12
Spinner3 sizes
16 · 24 · 40
Skeletontext lines
Skeletoncard placeholder
Compact spinner 18 · text 10
Spinner3 sizes
16 · 24 · 40
Skeletontext lines
Skeletoncard placeholder
Component · States

Empty state

Always tell the user what is missing and what they can do next. Never just "No data".

Comfortable icon 56 · h4 · pad 40
No Learners in this Cohort Yet
Invite learners by email or import a roster CSV. They will see their assigned courses on first sign-in.
Compact icon 40 · 15px · pad 24
No Learners in this Cohort Yet
Invite learners by email or import a roster CSV. They will see their assigned courses on first sign-in.
Component · Inputs

Number input

For numeric values with stepper buttons. Triggers numeric keyboard on mobile.

Comfortable 52 · r20 · stepper 40
Default
With unit
MB
Filled
Compact 32 · r8 · stepper 28
Default
With unit
MB
Filled
Component · Inputs

Password

Masked by default with a reveal toggle. Same dimensions as text input.

Comfortable 52 · r20 · reveal 36
Maskeddefault
At least 12 characters with one number.
Revealedafter click
Errortoo short
At least 12 characters required.
Compact 32 · r8 · reveal 24
Maskeddefault
At least 12 characters with one number.
Revealedafter click
Errortoo short
At least 12 characters required.
Component · Inputs

Email input

Same structure as text input, with type="email". Triggers the email keyboard on mobile (with @ and .com prominent) and gives the browser basic format validation. Visually identical to text input — functionally distinct via the type attribute.

Comfortable 52 · r20 · 16px
Defaultemail keyboard
Triggers email keyboard on mobile.
Validsuccess state
Valid email
Invalidformat error
Missing top-level domain (.com, .org, etc.)
Compact 32 · r8 · 14px
Defaultemail keyboard
Triggers email keyboard on mobile.
Validsuccess state
Valid email
Invalidformat error
Missing top-level domain (.com, .org, etc.)
Component · Inputs

Date picker

For specific calendar dates. Always paired with a calendar surface — never free typing. Supports single-date and range selection.

Comfortable 280 wide · r12 · 12px day
Triggerfield
Calendarrange selection
March 2026
Mo
Tu
We
Th
Fr
Sa
Su
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Compact 240 wide · r8 · 11px day
Triggerfield
Calendarrange selection
March 2026
Mo
Tu
We
Th
Fr
Sa
Su
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Component · Inputs

Date range picker

Two dates marking a period. Connected dual calendar on desktop, sequential single calendar on mobile. Always offer common range presets — Last 7 days, This month, etc — they cover ~80% of use cases. Validate that end date is never before start date.

Comfortable cal 240 · preset 14/600
Triggertwo fields
Connected dualdesktop · with presets
March 2026
Mo
Tu
We
Th
Fr
Sa
Su
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
April 2026
Mo
Tu
We
Th
Fr
Sa
Su
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
Compact cal 200 · preset 12/600
Triggertwo fields
Connected dualdesktop · with presets
March 2026
Mo
Tu
We
Th
Fr
Sa
Su
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
April 2026
Mo
Tu
We
Th
Fr
Sa
Su
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
Component · Inputs

File upload

Dashed border drop zone with optional click-to-browse fallback. Uploaded files render as rows below.

Comfortable r12 · pad 32/24 · icon 48
Emptydrop zone
Drop your roster CSV here
or browse files — up to 50 MB
Drag overactive
Drop to upload
Release to add the file
Uploadedfile rows
Q2-onboarding-roster.csv
248 KB · uploaded 2 minutes ago
team-photo-2026.jpg
1.2 MB · uploaded just now
Compact r8 · pad 20/16 · icon 36
Emptydrop zone
Drop your roster CSV here
or browse files — up to 50 MB
Drag overactive
Drop to upload
Release to add the file
Uploadedfile rows
Q2-onboarding-roster.csv
248 KB · uploaded 2 minutes ago
team-photo-2026.jpg
1.2 MB · uploaded just now
Component · Inputs

Rich text editor

Use sparingly. Most descriptions don't need formatting. Toolbar exposes only the formatting that matters for the surface.

Comfortable r12 · btn 30 · body 16
Default

Operations team — Q2 onboarding cohort.

Target completion by end of quarter; manager review monthly.

Compact r8 · btn 24 · body 13
Default

Operations team — Q2 onboarding cohort.

Target completion by end of quarter; manager review monthly.

Component · Inputs · v1.2

Signature pad

Hand-drawn attestation capture (<canvas>) that locks into a tamper-proof record on submit. A pad is never the only signing path — a typed-name equivalent is mandatory.

Sign above
Signed
StateTreatment
EmptyDashed frame, "Sign above" hint, baseline visible
DrawingLive stroke (Pointer Events, smoothing, high-DPR scaling)
SignedStroke + "Signed" confirmation, Clear enabled
Submitted-lockedHands off to the tamper-proof-record sealed treatment (never invents its own)
  • Accessibility: role="img" + aria-live state announcements; the mandatory typed-name field is the non-drawing signing path.
  • Approved Lucide only: signature, refresh-ccw, lock, shield-check. Existing tokens only; shares the bounded form-column measure.
Component · Selection

Select

Choose one option from a list. Trigger looks like an input; menu opens below with selectable items.

Comfortable 52 · r20 · 16px
Closedstates
Openmenu
All teams
Engineering
Operations
People & Culture
Compliance
Compact 32 · r8 · 14px
Closedstates
Openmenu
All teams
Engineering
Operations
People & Culture
Compliance
Component · Selection

Autocomplete

Like a select, but the user types to filter options. Used when the option set is large, dynamic, or partly unknown. Always debounce server queries (100-200ms), show a loading indicator while a request is in flight, and handle the no-results state with an optional "Add new" action where applicable.

Comfortable 52 trigger · menu r12 · 14/600 item
Typingfiltered results
2 results
SC
Sarah Chen
sara@company.com
SL
Sara Lopez
s.lopez@company.com
Loadingserver query in flight
No resultswith add action
No matches for "qzx_user"
Invite new user
qzx_user will receive an invitation email
Empty staterecent selections
Recent
PK
Priya Kapoor
priya.k@example.com
AM
Amira Mansour
amira.m@example.com
Compact 32 trigger · menu r8 · 12/600 item
Typingfiltered results
2 results
SC
Sarah Chen
sara@company.com
SL
Sara Lopez
s.lopez@company.com
Loadingserver query in flight
No resultswith add action
No matches for "qzx_user"
Invite new user
qzx_user will receive an invitation email
Empty staterecent selections
Recent
PK
Priya Kapoor
priya.k@example.com
AM
Amira Mansour
amira.m@example.com
Component · Selection

Multi-select

Choose multiple options. Selected items render as removable tags inside the field.

Comfortable 52 min · r20 · tag 14/600
With tags3 selected
Engineering Operations Compliance
Empty
Compact 32 min · r8 · tag 12/600
With tags3 selected
Engineering Operations Compliance
Empty
Component · Selection

Segmented control

For 2–4 mutually exclusive views. Different from button group: segmented sits in a tinted track, button group does not.

Comfortable r12 · pad 4 · 14/600
2 options
3 options
4 options
Compact r8 · pad 2 · 13/600
2 options
3 options
4 options
Component · Selection · v1.2

Choice tiles

A single-select tile group for form-submit choices that need per-option colour. One component recoloured per group via --tile-accent / --tile-tint / --tile-on. Two presets: product-accent and severity.

Product-accent preset

Email
Reply within 1 business day
Phone
Same-day callback
Chat
Live during business hours

Severity preset (via data-level)

Severity is always a tint background + saturated text — solid red/amber/green fills fail WCAG AA.

Low
Medium
High
  • Corner-check pitfall: an absolute corner check knocks a centred label off optical centre — omit it on centred tiles, or left-align and reserve symmetric padding.
  • Don't use a connected segmented control for a form-submit choice needing per-option colour — its overflow:hidden clips the selection ring and it reads as a different component family.
Component · Status

Sensitivity badge

Document classification — Public, Internal, Confidential, Restricted, Secret. Used in Compliance Operations and any product handling sensitive data.

Comfortable r4 · 12/700 · pad 4/12
5-tier scale
Public Internal Confidential Restricted Secret
Compact r4 · 10/700 · pad 2/8
5-tier scale
Public Internal Confidential Restricted Secret
Component · Status

AI badge

Marks any content authored, suggested, or curated by AI. Always violet-accented and gradient-tinted to distinguish from status badges.

Comfortable r-full · 10/700 · violet gradient
Standalone
AI AI generated AI suggested
On contentmarking AI-authored items
Risk Communication Path
5 modules · 3h 20m
AI
Curated based on team skill gaps and compliance roadmap.
Compact r-full · 9/700 · violet gradient
Standalone
AI AI generated AI suggested
On contentmarking AI-authored items
Risk Communication Path
5 modules · 3h 20m
AI
Curated based on team skill gaps and compliance roadmap.
Component · Status

Count badge

Numeric indicator for unread, pending, or new items. Brand color by default; error red for urgent counts.

Comfortable 18 · r-full · 11/700
Numbers
3 12 99+ 5 8
On nav item
Compact 16 · r-full · 10/700
Numbers
3 12 99+ 5 8
On nav item
Component · Feedback

Inline message

Lightweight feedback inside or under a field. Shorter and quieter than a full alert.

Comfortable 12/600 · 12px icon
Variants
Saved Required field Deadline approaching Auto-saved 2 minutes ago
In contextunder fields
Available
This field is required
Compact 11/600 · 10px icon
Variants
Saved Required field Deadline approaching Auto-saved 2 minutes ago
In contextunder fields
Available
This field is required
Component · Data display

Card

A bounded surface for grouped content. Subtle gray border, no colored borders. Clickable cards lift on hover.

Comfortable r16 · pad 20 · 18/600 title
Defaultstatic
Q2 Operations Onboarding
248 learners · started Mar 1
In progress
Required compliance pathway for new hires. Completion by end of quarter is mandatory for all team members.
Due Jun 30
Clickablehover lifts
Risk Communication Path
AI-suggested learning path based on recent skill gaps.
Compact r8 · pad 12 · 14/600 title
Defaultstatic
Q2 Operations Onboarding
248 learners · started Mar 1
In progress
Required compliance pathway for new hires. Completion by end of quarter is mandatory for all team members.
Due Jun 30
Clickablehover lifts
Risk Communication Path
AI-suggested learning path based on recent skill gaps.
Component · Data display

List row

For lists where each row needs a leading element (avatar, icon), title, sub, and trailing meta. Lighter than a table.

Comfortable row 56 · 14/600 title
Defaultroster row
AM
Amira Mansour
Operations · 88% complete
On track
JT
Joaquín Torres
Engineering · 42% complete
Due soon
DH
Dafydd Hughes
Compliance · 18% complete
Overdue
Compact row 36 · 13/600 title
Defaultroster row
AM
Amira Mansour
Operations · 88% complete
On track
JT
Joaquín Torres
Engineering · 42% complete
Due soon
DH
Dafydd Hughes
Compliance · 18% complete
Overdue
Component · Data display

Stat

Standalone large number with label. Use for hero KPIs and dashboard headlines.

Comfortable 40 / 64 · 700
Standard40px value
2,847
Active learners
+12% vs last month
86.3%
Completion rate
+4.1%
Displayhero numbers
73/100
Adoption health score
Compact 28 / 40 · 700
Standard40px value
2,847
Active learners
+12% vs last month
86.3%
Completion rate
+4.1%
Displayhero numbers
73/100
Adoption health score
Component · Data display

Key-value

For displaying paired metadata: account details, technical specs, settings summaries.

Comfortable key 160 · 14/600
Definition list
Tenant ID
ten_8a14f
Plan
Enterprise · Annual
Created
January 14, 2024
Owner
AM Amira Mansour
Sensitivity
Confidential
Compact key 120 · 12/600
Definition list
Tenant ID
ten_8a14f
Plan
Enterprise · Annual
Created
January 14, 2024
Owner
AM Amira Mansour
Sensitivity
Confidential
Component · Data display · v1.2

Timeline

Events on a real date axis. Encodes event type by shape — milestone (dot), range (bar), marker (rule) — never by status colour (avoids the severity collision). Not a stepper (order, not dates), not an audit log, not an activity feed.

Kickoff
Rollout
GA release
Today
Event typeShapeUse
MilestoneDotA single point in time (release, sign-off)
RangeBarA span with start + end (rollout window)
MarkerRuleA reference line (today, deadline)
  • Accessibility: the absolutely-positioned track needs a mandatory ordered-list equivalent — spatial position is invisible to assistive tech. Events are focusable buttons; detail opens on hover and focus and tap.
  • Responsive: collapses to a vertical timeline on narrow viewports / long sets. RTL: axis mirrors via logical properties (earliest at inline-start).
Component · Data display · v1.2

Gantt

Task rows + duration bars on a date axis, with finish-to-start dependencies. Shares the date-axis mechanics with the timeline. Critical path is emphasis (accent), explicitly not status-red — a bar can be both critical and overdue.

Discovery
Design
Build

The outlined bar marks the critical path (accent emphasis, not red).

  • Layout: two-pane with a pinned task-name column (frozen-column technique from Table).
  • Accessibility: mandatory real-table equivalent (role="table"); bars are focusable with dates + dependency in the aria-label; dependencies / critical path never conveyed by colour or line alone.
  • Responsive: falls back to the table on mobile / long plans.
Component · Data display · v1.2

Nine-box

A labelled 3×3 talent matrix (performance × potential) whose cells are named segments holding employee cards. Explicitly not a data table or a dot-scatter. Cell tint follows the conventional diagonal value tier via status -bg tokens with neutral borders. Used by KC Performance (Grow).

Enigma
Growth
Star
A. Mansour
Dilemma
Core
J. Torres
High-impact
Risk
Effective
Trusted pro

Columns = Performance (low → high) · Rows = Potential (high → low). Value tier tints the diagonal.

  • Hero-element composition: the department filter, legend and summary KPIs live inside the hero panel; the page's secondary surfaces are separate cards.
  • Drill-down: a cell opens the canonical right-edge detail sheet (segment roster) with focus trap / Esc / restore; bottom sheet below md.
  • Mobile reflow: the 3×3 stacks into one column in grid reading order, each cell carrying a (Performance, Potential) coordinate chip so the matrix model survives (44px targets).
Component · Navigation

Side navigation

Pattern B admin shell. White on canvas, subtle border. Active item has orange leading stripe + peach tint.

Comfortable 240 wide · 14/600 · 16 icon
Groupedwith active item
Compact 200 wide · 12/600 · 14 icon
Groupedwith active item
Component · Navigation

Top nav

Admin/workspace top bar (Pattern B). Brand · breadcrumbs · search · utility icons · account avatar.

Comfortable pad 10/16 · r12
Admin shellPattern B
LMS Admin
AM
Compact pad 6/12 · r8
Admin shellPattern B
LMS Admin
AM
Component · Navigation

Back button

Returns to a parent or previous page. Light text-only treatment so it doesn't compete with primary actions.

Comfortable 14/600 · pad 6/10
Compact 12/600 · pad 4/8
Component · Navigation

Stepper

For multi-step flows. Each step has a status: complete (green check), current (orange), or upcoming (gray).

Comfortable num 28 · pad 12/16
4-step wizardstep 2 of 4
Compact num 22 · pad 8/12
4-step wizardstep 2 of 4
Component · Overlays

Drawer

Side panel that slides in from an edge. For contextual editing without leaving the current page.

Comfortable 380 wide · pad 16/20
Right sidecontextual edit
Edit Learner
Update Amira Mansour's profile, team assignment, and access levels. Changes apply immediately.
Compact 320 wide · pad 12/16
Right sidecontextual edit
Edit Learner
Update Amira Mansour's profile, team assignment, and access levels. Changes apply immediately.
Component · Overlays

Popover

For richer contextual content than a tooltip. Has a title, body, optional actions, and arrow pointing to the trigger.

Comfortable 320 wide · r12 · pad 16
With arrowanchored
Filter by Team
Limits the table to learners in the selected team. Multiple teams can be combined with the chip filter above.
Compactinfo only
What Is the AHS Score?
Adoption Health Score combines four signals: weekly active rate, completion rate, content engagement, and manager check-ins.
Compact 280 wide · r8 · pad 12
With arrowanchored
Filter by Team
Limits the table to learners in the selected team. Multiple teams can be combined with the chip filter above.
Compactinfo only
What Is the AHS Score?
Adoption Health Score combines four signals: weekly active rate, completion rate, content engagement, and manager check-ins.
Component · Overlays

Bottom sheet

Mobile-only modal that slides up from the bottom. Used for filters, action menus, multi-select on small screens.

Comfortable 360 max · r24 · pad 16/20
Bottom sheetmobile pattern
Filter by Status
On track
Due soon
Overdue
Completed
Compact 320 max · r16 · pad 12/16
Bottom sheetmobile pattern
Filter by Status
On track
Due soon
Overdue
Completed
Component · Conversational UI

Message bubbles

User bubbles use brand orange. AI bubbles use white with subtle border. Typing dots indicate streaming response.

Comfortable r12 · pad 12/16 · 14px
Conversationuser + AI
AM
Which courses should the Operations team prioritize this quarter?
2:14 PM
Based on recent compliance updates and skill gaps, I'd recommend three: Risk Communication, Incident Response, and Data Handling. The first two have the most impact on Q2 audits.
AI just now
Compact r8 · pad 8/12 · 12px
Conversationuser + AI
AM
Which courses should the Operations team prioritize this quarter?
2:14 PM
Based on recent compliance updates and skill gaps, I'd recommend three: Risk Communication, Incident Response, and Data Handling. The first two have the most impact on Q2 audits.
AI just now
Component · Conversational UI

Citation chips

Required for factual AI answers. Each chip links to the source. Numbered for inline references in the response text.

Comfortable r-full · 11/600 · num 14
Citation chipsinline
The Q2 deadline for compliance training is June 30. Learners who miss the deadline will be auto-enrolled in a 7-day grace period before manager escalation.
AI 2 minutes ago
Compact r-full · 10/600 · num 12
Citation chipsinline
The Q2 deadline for compliance training is June 30. Learners who miss the deadline will be auto-enrolled in a 7-day grace period before manager escalation.
AI 2 minutes ago
Component · Conversational UI

Suggested chips

Follow-up question chips after AI responses, or starter prompts in empty conversations. Tapping sends the chip text as the next message.

Comfortable r-full · 12/400 · pad 6/12
Follow-upsuggested questions
The Operations team has 12 learners at risk of missing the Q2 deadline.
Starter promptsempty conversation
Compact r-full · 11/400 · pad 4/10
Follow-upsuggested questions
The Operations team has 12 learners at risk of missing the Q2 deadline.
Starter promptsempty conversation
Component · Conversational UI

Confirmation card

When AI proposes a state-changing action (enroll, assign, schedule), the user must confirm before execution. The confirmation appears as a structured card inside the chat — not as a modal. Cancel always sits left of Confirm.

Comfortable r12 · 14/700 head · 12px rows
Inline confirmationbefore mutation
AM
Enroll the Engineering team in compliance training.
I will enroll 12 learners in Compliance Training Q2. Here is the summary:
Confirm Enrollment
CourseCompliance Training Q2
Learners12 (Engineering team)
DeadlineMay 30, 2026
NotificationEmail + in-app
Compact r8 · 12/700 head · 11px rows
Inline confirmationbefore mutation
AM
Enroll the Engineering team in compliance training.
I will enroll 12 learners in Compliance Training Q2. Here is the summary:
Confirm Enrollment
CourseCompliance Training Q2
Learners12 (Engineering team)
DeadlineMay 30, 2026
NotificationEmail + in-app
Component · Conversational UI

Clarification

When AI is below its confidence threshold for an intent, it asks a clarifying question rather than guess. Styled as a normal AI message — not as an error or warning. Tone is curious and collaborative, never apologetic. Usually 2-3 disambiguation chips + optional free-text fallback.

Comfortable chip 14/600 · pad 8/12
Disambiguationbelow threshold
AM
Show me compliance completion.
I want to make sure I am answering the right question. Did you mean:
or tell me more about what you need
Compact chip 12/600 · pad 5/10
Disambiguationbelow threshold
AM
Show me compliance completion.
I want to make sure I am answering the right question. Did you mean:
or tell me more about what you need
Component · Conversational UI

Refusal / out-of-scope

When the query is outside the AI's scope, the assistant refuses and explains what it can help with. Visual register is muted — gray/tertiary text, not red error styling. Refusals are not failures, they are redirects. Tone is helpful, never apologetic.

Comfortable r12 · pad 12/16 · 14px
Out of scoperedirect, not error
AM
What\'s the weather in Riyadh today?
This isn\'t something I can help with directly.
  • Training enrollment and completion data
  • Performance cycle status and scores
  • Safety incidents and corrective actions
  • TNA reports and skill gaps
For weather, you might try a web search or your device\'s weather app.
HR-legal redirect
This needs a person, not an assistant.
For salary, HR policy, or employment questions, please contact your HR business partner. I can help you find their info in the directory.
Compact r8 · pad 8/12 · 12px
Out of scoperedirect, not error
AM
What\'s the weather in Riyadh today?
This isn\'t something I can help with directly.
  • Training enrollment and completion data
  • Performance cycle status and scores
  • Safety incidents and corrective actions
  • TNA reports and skill gaps
For weather, you might try a web search or your device\'s weather app.
HR-legal redirect
This needs a person, not an assistant.
For salary, HR policy, or employment questions, please contact your HR business partner. I can help you find their info in the directory.
Component · Conversational UI

Soft acknowledgment

Brief between-question responses that prevent a multi-turn conversation from feeling like a form. Same styling as regular AI message — no special bubble. 1-2 short sentences: repeat the user's input + brief affirmation. Used heavily in the TNA Interview Agent. Never flatter ("Excellent question!") and never over-acknowledge.

Comfortable same as message bubble
TNA interviewacknowledgment + next
AM
We have about 30 people on the Engineering team.
Got it — 30 people on Engineering.

Next question: How would you describe the team\'s current proficiency with cloud infrastructure?
Bad exampleswhat to avoid
"Excellent question!"
AI flattery is performative — never appropriate.
"Great! Wonderful!"
Over-acknowledging every response feels artificial.
Compact same as message bubble
TNA interviewacknowledgment + next
AM
We have about 30 people on the Engineering team.
Got it — 30 people on Engineering.

Next question: How would you describe the team\'s current proficiency with cloud infrastructure?
Bad exampleswhat to avoid
"Excellent question!"
AI flattery is performative — never appropriate.
"Great! Wonderful!"
Over-acknowledging every response feels artificial.
Component · Conversational UI

Voice input

Mobile and accessibility users benefit from voice-to-text. Mic button sits at the leading edge of the input. Active state uses AI violet with a pulsing animation; the waveform indicates audio capture. For reduced-motion users, the waveform falls back to a static "Listening…" label.

Comfortable bar 48 · mic 32 · waveform 18
Idlemic ready
Listeninglive transcription
Reduced motionstatic "Listening…" label
Listening…
Compact bar 32 · mic 24 · waveform 14
Idlemic ready
Listeninglive transcription
Reduced motionstatic "Listening…" label
Listening…
Component · Conversational UI

Resume / session continuity

Conversations persist across reloads and browser sessions. When a user returns, show a thin resume banner at the top of the conversation followed by a contextual welcome-back message. Always offer continue/start-fresh as suggested chips.

Comfortable banner r-full · pad 6/16 · 12/600
Resume banner+ welcome back
Resumed from May 3 · 16 messages
Welcome back, Sarah. We were discussing your team\'s Q2 compliance training.

Want to pick up from where we left off, or start something new?
Compact banner r-full · pad 4/10 · 10/600
Resume banner+ welcome back
Resumed from May 3 · 16 messages
Welcome back, Sarah. We were discussing your team\'s Q2 compliance training.

Want to pick up from where we left off, or start something new?
Component · Conversational UI

Conversation export

Users can download full transcripts. PDF for humans (with citations preserved as text), JSON for downstream consumption. Trigger lives in the chat header menu. Privacy: exports contain only role-scoped data the user already saw.

Comfortable modal r16 · pad 20/24
Triggermenu item in header
Export dialogformat + scope
Compact modal r8 · pad 12/16
Triggermenu item in header
Export dialogformat + scope
Component · States

Error state

Full-surface error treatment. Always offer a path forward — retry, support contact, or alternative action.

Comfortable icon 56 · h4 · pad 40
Genericwith retry
Could Not Load Roster
A network error occurred while fetching the learner list. Check your connection and try again.
Compact icon 40 · 15px · pad 24
Genericwith retry
Could Not Load Roster
A network error occurred while fetching the learner list. Check your connection and try again.
Canonical references · v1.3.3

Canonical references

Full-page, self-contained examples — specification by example. Words describe rules; these show what KC actually looks like and how interactive elements behave. Each preview is a live, scaled-down render; click any card (or Open ↗) to open the full page in a new tab. All 20 ship light + dark with a working theme toggle, on the 3-suite accent model.

Pattern A · Learner-facing

Pattern A · Home · Learn Learner portal — Home Three-tier top nav, section-container pattern, white-on-white card borders. The mandatory spec for any learner-facing surface. Open
Pattern A · Library · Learn Learner portal — Library Catalog browse: white-block layout, category tabs + filter sidebar + course rows, canonical portal header, tenant-themable canvas. Open
Pattern A · Detail · Learn Learner portal — Course detail Player-centric detail layout, curriculum in the right rail, section + button tablists. The "not started" state. Open
Pattern A · Player · Learn Learner portal — Lesson player The "playing" state: active video player with native-style controls, fullscreen mode, current-lesson highlight. Open

Pattern B · Admin / workspace

Pattern B · Dashboard LMS Admin — Dashboard The mandatory admin/workspace spec: side nav + top bar, KPI row, two dashboard compositions, full working JS (collapse, filters, theme, drawer). Open
Pattern B · Detail · Archetype 5 LMS Admin — Detail page A record inside the full admin shell: entity pagehead, bold-active section tabs, two-column body, caution-tier action, mobile save bar. Open
Pattern B · Settings LMS Admin — Settings Horizontal section-tab strip on white, panel-per-group forms, persistent sticky save bar, red danger-zone panel. Open
Pattern B · Wizard · Archetype 6 LMS Admin — Wizard Multi-step builder: four-row focused shell, five-state stepper, content card on canvas, final review + commit. Open
Pattern B · Pipeline · Archetype 1 · Grow Pipeline — Kanban Board pipeline (KC Skills, Grow/blue): drag-and-drop stages with a keyboard-accessible move menu, mobile scroll-snap columns. Open
Pattern B · Dashboard · Archetype 3 · Grow Succession — 9-box grid Matrix-hero dashboard (KC Performance, Grow/blue): 3×3 talent grid, in-hero filter + legend + KPIs, cell drill-down sheet, mobile reflow. Open
Pattern B · Request form · Internal Upgrade to Enterprise Focused request/quote form + success-confirmation modal: .pagehead--card, choice tiles (accent + severity presets), copyable ticket ref. Open
Pattern B · Detail (abstract) · Archetype 5 · Internal Detail / record — abstract shell The Archetype-5 body composition independent of a product shell: entity pagehead, 9-tab body, two-column + audit rail, mobile save bar. Open

Editor & document wizard

Pattern B · Authoring · Archetype 2-W Authoring — Editor shell Slide-canvas editor: thumbnail rail + canvas + properties inspector; bottom fixed mobile tab bar as the mobile transformation. Open
Pattern B · Wizard (document) · Archetype 6 · Comply Document-context wizard Policy-acknowledgment (KC Comply, teal): document-first stacked layout, full stepper state set (done/current/future/skipped/error), pinned footer. Open

Pattern C · AI Assistant overlay

Pattern C on A AI Assistant — on portal Floating overlay panel on a learner host: page-aware context, structured response card, 3-step write-action confirmation, FAB → bottom sheet on mobile. Open
Pattern C on B AI Assistant — on admin The same host-agnostic assistant panel grafted onto the Pattern B admin shell — confirms Pattern C is additive to either base with no panel change. Open

Conversational

Archetype 7 · Grow Conversational AI — workspace Standalone workspace (KC Map, Grow/blue) inside the Pattern B shell: thread + live context rail, full conversational component set, dual accent (violet AI + suite). Open
Conversational · focused modal · Grow TNA — Interview agent Focused modal interview (KC TNA, Grow/blue): adaptive numberless stepper, single question + multiple input modes, dual accent, explainable draft. Open

Pre-auth

Pre-auth · Sign-in Universal sign-in Split brand/form login shared by every product: username/password, inline validation, error + loading states, password show/hide, theme toggle. Re-skins per suite. Open
Pre-auth · Role entry Role entry + explore Role-choice variant: entry via choice-tiles (no selection check) plus a low-commitment "Explore — no sign-in needed" CTA that stays inside the public surface. Open