UDS 0.3
Release notes
Semantic icon destructive token (
--uds-color-icon-destructive) with light-mode red/70 and dark-mode red/50 aliases
Internal support pages checkbox-control, input, and slot were inspected but intentionally kept out of public docs for 0.3
New rule
.cursor/rules/uds-source-of-truth.mdccodifies thatuds-docs/uds/is Figma-as-source-of-truth across every file kind (tokens, component CSS, spec.json, examples, status.json, schemas, etc.) and that agents must not autonomously modify anything under that path in response to audit findings. Cross-referenced fromAGENTS.md("Don't do" list) anduds-master-preflight.mdc. Authorized write paths intouds-docs/uds/are the named Figma-sync skills (import-figma-tokens,sync-figma-component-spec,sync-figma-component-status,link-figma-nodes,new-component), each requiring explicit user authorization. A revert toward verified Figma parity is also allowed with explicit user direction.
--uds-color-text-secondarydark-mode binding aligned to Figma. Was aliased to--uds-primitive-color-neutral-70(#525252); Figma now aliases to--uds-primitive-color-neutral-60-M(#737373) in every dark mode (Base Dark, ResMan Dark). Light modes were already correct. The shift improves dark-modetext-secondaryonsurface-main(#0a0a0a) contrast from ~2.6:1 to ~4.3:1 — still below the WCAG AA 4.5:1 threshold but a meaningful improvement against the dark-mode entries in the AGENTS.md "Currently known WCAG AA failures" table. Sourced from a 2026-05-12 figma-token-audit dry-run that confirmed direct-Figma-Variables read against the .cursor/figma/state/tokens.snapshot.json baseline; this is the only token-value drift the audit found across 249 primitives + 94 semantic colors × 6 modes. T-1 in the audit report.
Reverted the unauthorized design-system edits an agent applied during the repo restructure (commits
6022fcdPhase 16 and6564ae8Phase 17). Two distinct layers reverted: (1) ~38 semantic-token value bumps inuds/tokens/semantic.css, including the AnyoneHome (emerald-70 → emerald-90) and Inhabit (amber-70 → amber-90) brand accents, all light-mode status surface/text bumps to -80/-90, dark-mode status text shifts -50 → -40, andtext-secondaryflips in both modes — all darkening tokens to clear axe-core WCAG AA contrast violations. (2) Theuds/components/button/button.csspalette override swap from primitive-token references (green-70,orange-70,neutral-90) to semantic tokens (surface-success,surface-warning,surface-inverse), plus the pairedaria-selected→aria-pressedexample markup change inbutton/examples/selected.html. Neither layer was sourced from Figma. Figma is the source of truth for everything underuds-docs/uds/(tokens AND component implementation AND specs), and the Phase 16/17 agent did not preserve that contract. Both layers are now restored bit-for-bit to the UDS 0.3 release state (commit16e8e89), so Figma and code agree again. Knowing trade-off: the contrast failures Phase 16/17 was masking are restored as a known issue (e.g. white text onsurface-interactive-defaultis 3.77:1 in AnyoneHome, 3.19:1 in Inhabit, both below WCAG AA 4.5:1). The right fix is a design conversation — see PR #7 description for four candidate fix paths. Thescripts/audit-theme-contrast.shCI job will fail until that conversation lands; that is intentional, not a regression to fix in code.
Components
Badge
Figma variant matrix confirmed: 2 sizes (Default/Small), 5 variants (Info/Secondary/Success/Error/Warning), and Prominent true/false
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Rebuilt the playground with interactive controls (tone, variant, size, label) for
<udc-badge>. The existing shadow-DOM CSS port (5 tones × prominent/subtle × default/sm) already matched the originalbadge.css.
Fixed invisible text on the secondary prominent variant. The CSS paired
surface-bold(light gray in light mode) withtext-inverse(near-white in light mode) — contrast was ~1.07:1, basically invisible. Switched totext-primaryfor a contrast of ~9.7:1 in light mode and ~10:1 in dark mode. Affected the changelog component-name pills and per-component changelog type labels.
Breadcrumb
Figma variant matrix confirmed: framed/frameless, depth on/off, 2-6 link groups, current/default/disabled link states, and open-in-new-window affordance
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full breadcrumb CSS into the
<udc-breadcrumb>shadow DOM (pill container with surface-main bg + border-tertiary + container-xl radius, chevron-right separator drawn via SVG mask-image, text-interactive-neutral links with hover underline, bold text-primary current page, frameless variant). Component accepts anitemsarray attribute and renders the<ol>automatically; falls back to slotted content. Rebuilt the playground with items count and frameless controls.
Button
Figma variant matrix confirmed for primary/secondary/ghost buttons: destructive true/false, default/small sizes, default/hover/active/selected/disabled states, leading/trailing icons, icon-only, and horizontal/vertical button groups
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full button CSS into the
<udc-button>shadow DOM withvariant(primary/secondary/ghost),size(default/sm),color(default/danger/success/warning/neutral),leading-icon,trailing-icon,icon-only,selected, anddisabled. Rebuilt the playground with the original 12 controls (variant, size, color, leading/trailing icon toggle + picker, icon-only + icon, disabled, selected, label). Fixed a Lit empty-string reflection bug that was forcing every button to 12px padding on all sides.
Checkbox
Figma variant matrix confirmed for checkbox and multiline checkbox: selected true/false plus default/hover/active/focused/selected/disabled/error states
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full checkbox CSS into the
<udc-checkbox>shadow DOM (SVG-mask checkmark, hover/focus/disabled/error treatments) and rebuilt the playground with the original 4 controls plus indeterminate and required toggles.
Chip
Figma variant matrix confirmed: default/filter/input/dropdown variants, selected true/false, and default/hover/active/focused/focused-on-active states
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full chip CSS into the
<udc-chip>shadow DOM (BEM.udc-chip__leading-icon/__label/__trailing-iconwith--uds-font-size-lgicon sizing, hover/active/focus rings, surface-interactive-active selected state with inverse text + icons, dropdown variant trailing-chevron smaller). Rebuilt the playground with variant/label/selected/leading-icon/disabled controls.
Combobox
Placeholder page for searchable text-entry selection component from Figma 0.3
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
<udc-combobox>now aliases the rebuilt<udc-dropdown>Web Component, so it inherits the full shadow-DOM styling (label, leading icon, placeholder, chevron, helper text, error/disabled treatments, listbox panel). Added an interactive playground with the same control surface as Dropdown. Filtering/autocomplete behavior on top of the alias is still pending Figma source.
Data Table
Figma data-table coverage expanded: text/dropdown/ghost-button/checkbox/badge cell types, header cells, 1-14 columns, 2-14 rows, alignment, leading/trailing icons, dividers, prominent text, and error highlighting
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
<udc-data-table>now renders the table itself in shadow DOM driven bycolumns+rowsJSON attributes (rather than expecting consumers to author the inner<table>markup). Ports the original data-table.css inside shadow DOM — 56px sticky header row with surface-alt bg + bold text, 44px body rows with hover/selected/striped surfaces, alignment helpers, prominent text, optional checkbox column with select-all, sortable headers with Material Symbols indicator. Emitsudc-sort-changeandudc-selection-change.
Data View
Placeholder page for non-table record collection layouts from Figma 0.3
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
<udc-data-view>now ships a card-style container in shadow DOM (surface-main bg, border-secondary, container-md radius, space-300 padding) with header + body + actions slot groups. The originaldata-view.csswas placeholder-only in 0.3; this fills in a token-bound default. Added an interactive playground (heading, body content shape, show-actions).
Date Picker
Placeholder page for calendar date-entry component from Figma 0.3
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
<udc-date-picker>now ships the same field chrome as<udc-text-input>(label, leading calendar icon, helper text, focus ring, error/disabled states), wraps the browser-native<input type="date">popover, and acceptsmin/maxbounds. Added an interactive playground (state, label, required, helper, value, min, max). Figma source for the custom calendar popover is still pending.
Dialog
Figma dialog component supports 1-4 slot configurations plus header and footer subcomponents
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full dialog CSS into the
<udc-dialog>shadow DOM (480px container, container-xl radius, shadow-depth-500, subtle header background, border-bottom divider, scrollable body, right-aligned footer). Backdrop click + Escape close. Focus trap with Tab cycling. Added an interactive playground (heading, content slots count, primary/secondary button labels) emitting<udc-dialog>markup with<udc-button slot="actions">siblings.
Divider
Figma divider coverage confirmed for sm, md, lg, and xl padding variants
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full divider CSS into the
<udc-divider>shadow DOM (1px border-tertiary stroke, container-full radius, sm/md/lg/xl padding mapped to--uds-space-050/100/150/200). Replaces the prior generic horizontal/vertical implementation. Added an interactive playground with the padding select.
Dropdown
Figma dropdown coverage confirmed: default/disabled/error field states plus dropdown item active/default/focused/hover states
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full dropdown CSS into the
<udc-dropdown>shadow DOM and rebuilt the playground with the original 13 controls (state, disabled, show-label, label text, required, leading icon, placeholder, helper text, counter text, options count). Restores visual and interactive parity with the pre-Web-Components dropdown.
Icon Wrapper
Figma icon wrapper coverage confirmed for 16, 20, 24, 32, 48, and 64px sizes
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full icon-wrapper CSS into the
<udc-icon-wrapper>shadow DOM with the original size matrix (16/20/24/32/48/64 padded containers with corresponding inner icon sizes) and acolorattribute that maps to--uds-color-icon-*tokens. Replaces the prior info/success/warning/error tone-pill behaviour. Added an interactive playground with icon, size, and color controls.
Label
Blocked form-control label component with multiline/basic/extended features, default/disabled/error/interactive/success variants, token-first CSS, examples, code, playground, and Demo Builder coverage
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full label CSS into the
<udc-label>shadow DOM with the full variant matrix (default/disabled/error/interactive/success), small size, prominent (bold) weight, alignment (start/middle/right), fill-frame, and multiline support. Required dot rendered after the slot content. Rebuilt the playground with text, variant, required, small, and prominent controls.
Link
In-progress navigational link component with default/current page/disabled states, optional open-in-new-window affordance, token-first CSS, examples, code, playground, and Demo Builder coverage
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full link CSS into the
<udc-link>shadow DOM (text-interactive color, underline with 0.18em offset, hover/active/focus states, disabled treatment). Addedcurrent(aria-current=page),new-window(auto-sets target/rel plus open_in_new icon),leading-icon, andtrailing-iconattributes. Rebuilt the playground with label, href, current, disabled, new-window, and leading/trailing icon controls.
List
Figma list coverage confirmed: 1-10 item lists, draggable and non-draggable item variants, leading/trailing icons, and default/hover/active/focused/selected states
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full list CSS into
<udc-list>+<udc-list-item>shadow DOM (48px row height, BEM.udc-list-item__leading-icon/__label/__trailing-iconwith--uds-font-size-2xlicons, hover/active/selected/focus treatments matchingsurface-interactive-*tokens, padding-left/right shrinks when icons are present). Selectable lists exposerole="listbox"and items getrole="option". Rebuilt the playground with items, leading/trailing icon toggles, selected item, and selectable controls.
Nav Header
Spec populated from inspector: showSearch + showMyWork props (BOOLEANs from the Figma set), bento-toggle + bento-dismiss events, 8 anatomy slots, default / bento-open / title-only / not-applicable states, commonlyPairedWith for every nested instance, 4 screenReader entries, 5 WCAG criteria, 10 acceptance criteria.
Title-Only variant exposed: new .udc-nav-title-area[data-title-only="true"] CSS state (transparent fill, no border/shadow, no leading icon, no chevron, font-size --uds-font-size-xl). New titleOnly boolean prop, title-only state, playground checkbox, examples/title-only.html and manifest entry. Mirrors Figma _udc-nav-header_title-area Title Only=True (5586:8859).
Mirrored Figma sub-component rename _udc-nav-header_bentobutton → _udc-nav-header_title-area (id 5586:8858 preserved). CSS public-contract rename: .udc-nav-bento-button → .udc-nav-title-area, .udc-nav-bento-button__chevron → .udc-nav-title-area__chevron. Spec slot bento (trigger) → title-area. Dropdown panel intentionally kept as .udc-nav-bento because Figma still calls that component _udc-nav-header_dropdown.
.cursor/figma/state/components.snapshot.json nav-header.nestedInstances precision update: entries 0 (logo) and 1 (title-area) now record the parent component-set node + variant-property matrix in new optional fields mainComponentSetNodeId and mainComponentVariantProperties. Logo set 6403:39131 with
Outline: [false, true]; title-area set 5586:8858 withVariant: [A],Title Only: [false, true]. Previously the snapshot only pointed at the rendered variant (6403:39130 / 5505:7875) which loses the variant-matrix signal. Spec.json untouched.spec.json knownIssues expanded with three new entries: (a) the new
_udc-nav-header_logo-pillcomponent on the Figma page (id 6399:13744, 98×48 brand vector + 'ResMan' text label) is NOT wired into the canonical udc-nav-header Variant=Default; treating as design exploration pending designer confirmation; (b) the logoOutline=Truevariant (id 6403:39132, light-fill brand vector) is defined in Figma but not exposed as a doc-side prop — deferred pending designer direction; (c) standalone_udc-nav-header_dropdown(6019:32094) and_udc-nav-header_nav-tile(5498:2340) components still exist on the nav-header page as orphans (not nested anywhere); the bento concept was removed from the canonical contract but the sub-components weren't deleted from the page; no doc-side surface for these orphans.Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full nav-header CSS into the
<udc-nav-header>shadow DOM. The component now renders the canonical anatomy (logo, title-area pill, center search, My Work button, account button group) as a single opinionated Web Component driven byapp-name,title-only,show-search,show-mywork,mywork-badge,logo-icon, andtitle-iconattributes. Slot escape hatches (logo,title-icon,title,search,mywork,account) let consumers override individual sections without forking the CSS. Rebuilt the playground with the original controls.
figmaNodeId corrected from 5586:8858 (sub-component) to 5684:11340 (canonical udc-nav-header set) after a deep figma-component-inspector pass on page 5373:972.
Chevron color realigned with Figma: --uds-color-icon-secondary → --uds-color-icon-primary.
Bento trigger icon + chevron size realigned with Figma: 20px literal → --uds-font-size-2xl (24px) — matches udc-icon-wrapper Size=24px.
Bento dropdown shadow realigned with Figma: --uds-shadow-bento → --uds-shadow-depth-300.
Bento dropdown footer realigned with Figma: 14px / text-interactive → 12px / text-primary (--uds-font-size-sm + --uds-color-text-primary).
Nav-tile font size: 10px literal → --uds-font-size-sm (12px). Removes a token-usage violation and matches Figma font/size/sm.
Nav-tile background and foreground: always-blue → transparent default (interactive-none + text-interactive + icon-interactive) with aria-current="page" driving the blue + text-inverse selected state. Hover split between subtle-hover (default) and interactive-hover (selected). Matches Figma two-state tile anatomy.
Escape-while-open dismissal in nav-header.js. Handler now bound to document, gated on panel[data-open=true], restores focus to the trigger on dismiss. Matches the bento-dismiss event contract.
aria-label on icon-only ghost buttons in account-actions pill — Notifications / Settings / Account — added to examples/default.html, playground render strings (HTML + Vue), and impl.json reference HTML.
Bento dropdown divider rows added per Figma _udc-nav-header_dropdown anatomy: udc-divider-horizontal (data-padding="sm") between every section in bento-dropdown.html, bento-tiles.html, and the playground render.
Title-area Title Only=True line-height aligned to Figma. Added line-height: var(--uds-font-line-height-xl) (28px) to .udc-nav-title-area[data-title-only="true"] so it pairs with the existing font-size: var(--uds-font-size-xl) (20px). Matches Figma text style uds/text/paragraph/xl-bold (line-height/400 = 28). Sourced from a 2026-05-12 figma-component-inspector dry-run on the _udc-nav-header_title-area Title Only=True variant (5586:8859).
Bento dropdown panel padding-bottom aligned to Figma. .udc-nav-bento padding split from the symmetric var(--uds-space-150) shorthand (12 all sides) to var(--uds-space-150) var(--uds-space-150) var(--uds-space-200) so the bottom edge gets 16px instead of 12. Matches Figma _udc-nav-header_dropdown padding-top 12 / padding-x 12 / padding-bottom 16. Sourced from a 2026-05-12 figma-component-inspector dry-run.
Bento footer line-height aligned to Figma. Added line-height: var(--uds-font-line-height-sm) (16px) to .udc-nav-bento__footer so the existing font-size: var(--uds-font-size-sm) (12px) is paired with the matching line-height instead of inheriting --uds-font-line-height-base (20px). Matches Figma text style uds/text/label/sm-medium (line-height/250 = 16). Sourced from a 2026-05-12 figma-component-inspector dry-run.
spec.json commonlyPairedWith corrected:
searchremoved (the centered search box is actually a udc-text-input instance per Figma, not a separate udc-search component);text-inputadded;button-ghostremoved (button-ghost is the data-icon-only attribute variant of udc-button, not a separate component, and it's not in components.json);divider/listremoved (those were paired with the bento dropdown, now gone).
Bento app-switcher concept removed in full. The canonical udc-nav-header Variant=Default tree in Figma no longer nests
_udc-nav-header_dropdownor any tile/list/footer sub-component (confirmed by deep figma-component-inspector pass via the new bidirectional contract — Doc-site surplus + Snapshot delta sections). Cleanup: spec.json slotsbento.tiles/bento.list/bento.footerremoved; eventsbento-toggle+bento-dismissremoved (events[] now empty); statebento-openremoved; 4 bento acceptance-criteria removed; description + whenToUse + whenNotToUse updated to drop bento references; commonlyPairedWith trimmed (button-ghost / search / divider / list removed; text-input added — Search Box is actually a udc-text-input instance, not udc-search). nav-header.css: removed ~100 lines (.udc-nav-bento, .udc-nav-bento__tiles, .udc-nav-bento__list, .udc-nav-bento__footer, .udc-nav-tile, .udc-nav-tile[aria-current], .udc-nav-bento-wrapper rules). .udc-nav-title-area is now a static pill (chevron decorative — no popover wired in the canonical contract); removed cursor:pointer, :hover bg change, :focus-visible outline, aria-expanded rotate, and the data-title-only:hover override. nav-header.js: file deleted entirely (initNavBento was the only function). uds-docs/uds/uds.js orchestrator: removed'components/nav-header/nav-header.js'from COMPONENT_SCRIPTS and theif (UDS._initNavBento) ... .udc-nav-bento-wrapper ...line from UDS.init; nav-header is now CSS-only. examples/bento-dropdown.html + examples/bento-tiles.html deleted; examples/manifest.json trimmed to default + title-only. examples/default.html updated: removed the bento panel markup, bento-wrapper div, aria-haspopup/aria-expanded on the title-area, and the udc-nav-button list. impl.json: jsFunc + jsFile set to null; html regenerated for the bento-free anatomy; tokens groups trimmed (--uds-color-surface-page, --uds-color-text-inverse, --uds-color-text-secondary used differently, etc.). playground.js: removed showBento + showTiles + bento-tile branches from the render; controls trimmed to 4 (titleOnly, showSearch, showMyWork, appName). index.html Code-tab API table: removed 6 bento/tile rows (.udc-nav-bento-wrapper, .udc-nav-bento, .udc-nav-bento__tiles, .udc-nav-bento__list, .udc-nav-bento__footer, .udc-nav-tile) plus the aria-expanded row; updated title-area description to note the chevron is decorative. Sourced from a 2026-05-13 figma-component-inspector pass using the new bidirectional contract (PR #16); 22 of 22 surplus findings + the 4 nav-header allow-listed audit-doc-internal-consistency entries resolve cleanly.
Nav Vertical
Spec populated from a 2026-05-12 figma-component-inspector dry-run that the previous quick-look pass had left blank. spec.json props[] gains a leadingIcons boolean (default true) mapped to the Figma component-set udc-nav-vertical (6598:8555) variant property
Leading Icons: True | False. spec.json states[] populated with the 5 states the underlying _udc-list_item exposes in Figma: default, hover, active, selected, focused. The Disabled state that exists in code (.udc-nav-button:disabled, [aria-disabled="true"]) is intentionally NOT added to states[] because it has no Figma source — see knownIssues for the open question.
.cursor/figma/state/components.snapshot.json nav-vertical entry refreshed from placeholder seed values. variantProperties was {} — now
Leading Icons: [true, false]. nestedInstances was [] — now records the udc-list instance (6598:8558 -> main 5195:894) that wraps the 7 _udc-list_item rows; this is the structural detail the previous snapshot missed entirely. fingerprint hashes upgraded fromseed:6598:8553/seed:6598:8555/not-capturedtocaptured:2026-05-12:*markers. tokenBindings stays [] (snapshot convention) but the per-state token-binding tables for container, default, hover, active, selected, and focused list-items are documented in the inspector report.Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full nav-vertical CSS into
<udc-nav-vertical>+<udc-nav-item>shadow DOM. The container drivesvariant(list/rail) andleading-iconson its children. List items render as full-width 48px rows with hover/selected (surface-interactive-active + text-inverse) treatments; rail items stack icon-over-label with a 2px active indicator bar on the left. Rebuilt the playground with variant, leading-icons, item-count, and selected-item controls.
Notification
Figma notification coverage confirmed: info/success/error/warning variants, inline true/false, and prominent true/false
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full notification CSS into the
<udc-notification>shadow DOM with BEM.udc-notification__icon/__text/__closesiblings. Restored the dedicated--uds-color-icon-*token for the leading icon (separate from the text color), the--uds-font-size-xlclose-button glyph sizing, and the prominent + inline variants. Rebuilt the playground with tone, style (subtle/prominent/inline), message, and dismissible controls.
Pagination
Blocked paginated navigation component with default/active states, rows-per-page context, token-first CSS, examples, code, playground, and Demo Builder coverage
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full pagination CSS into the
<udc-pagination>shadow DOM (32px page buttons with border-primary, hover surface-interactive-subtle-hover, active page in surface-interactive-default with text-inverse, focus ring, and the meta row for rows-per-page + range). Component now numbers its own buttons based onpage/total-pages, collapses long ranges with ellipsis, and exposesudc-page-changeevents. Rebuilt the playground with current-page, total-pages, and show-meta controls.
Radio
Figma radio coverage confirmed: radio button states including selected/error/disabled/hover/active combinations plus 2-5 option radio groups
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full radio CSS into
<udc-radio>+<udc-radio-group>shadow DOM (20×20 ring, 12×12 center dot, selected/hover/focus/disabled/error states with text-interactive recolor and required dot alignment). RadioGroup now manages selection via thevalueattribute and emitsudc-change; individual radios bubbleudc-radio-change. Rebuilt the playground with the original options/disabled/error controls.
Search
Figma search bar coverage confirmed: default/hover/focused/active/error-active states
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full search CSS into the
<udc-search>shadow DOM (search-icon leading slot, hover background, focus ring on the wrapper, clear button that appears when the input has a value, error and disabled treatments) and rebuilt the playground with placeholder, initial value, state, and disabled controls.
Spacer
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full spacer CSS into the
<udc-spacer>shadow DOM with the originalsizetoken-step API (050/075/100/150/200/300/400/500/600) and the 100×100 Figma default. Replaces the prior xs/sm/md/lg/xl t-shirt sizing. Added an interactive playground with the size select.
Tabs
Figma tab coverage confirmed: default/small sizes, 2-6 tab groups, selected and disabled states, plus hover/focus/active-on-selected variants
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Rebuilt the playground with the original tab-count, size (default/sm), and disabled-tab controls. The existing
<udc-tabs>/<udc-tab>/<udc-tab-panel>shadow DOM already shipped the original tabs.css (border-bottom tablist, 2px interactive border on selected, hover surface-interactive-subtle-hover, focus outline, sm size with tighter vertical padding) plus the keyboard navigation (Arrow/Home/End) andudc-tab-changeevent.
Text Area
Multi-line text-entry component with default/hover/focused/active/error-focused states, token-first CSS, examples, code, playground, and Demo Builder coverage
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full text-area CSS into the
<udc-text-area>shadow DOM (88px min-height field, hover/focus ring on the field, error and disabled treatments, helper row with counter). Rebuilt the playground with the original label/placeholder/state controls plus disabled, required, helper text, max-length, and counter toggle.
Text Input
Figma text input coverage confirmed: field default/disabled/error states and wrapper default/active/error states
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full text-input CSS into the
<udc-text-input>shadow DOM (field border, focus ring, error recolor, disabled treatment, leading icon, trailing button hover/active/focus) and rebuilt the playground with the original 14 controls (state, disabled, show-label, label, required, leading icon, trailing button + icon, placeholder, show-helper, helper text, show-counter, max-length). Restores visual and interactive parity with the pre-Web-Components text input.
Tile
Figma tile coverage confirmed: default/hover/focused/selected/disabled states
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full tile CSS into the
<udc-tile>shadow DOM with BEM.udc-tile__content/__label/__required/__body/__chevronsiblings. Chevron icon now uses--uds-font-size-2xl. Hover, selected (info-subtle bg + 2px interactive border), focus-visible ring, and disabled (opacity 0.5, chevron hidden) all match the original. Added an interactive playground (label, body lines, required, chevron, state).
Toggle
Immediate on/off setting control with active true/false and disabled variants, token-first CSS, examples, code, playground, and Demo Builder coverage
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full toggle CSS into the
<udc-toggle>shadow DOM (52×32 track, 20×20 thumb with shadow-depth-100, translateX(20px) when active, focus ring, disabled treatment) and rebuilt the playground with the original label/checked/disabled controls. Extracted Toggle into its own component file.
Tooltip
Replaced documented examples, implementation reference, and playground output with the Web Component API.
Cleared legacy per-component behavior references; behavior now lives in the shared Web Components bundle.
Ported the full tooltip CSS into the
<udc-tooltip>shadow DOM — lightsurface-mainbackground withshadow-depth-300,text-primarycontent, 4 positions (top/bottom/left/right), and visibility driven by:hover/:focus-within/open. Added an interactive playground (tooltip text, position, always-open) emitting<udc-tooltip>markup with a<udc-button slot="trigger">.