Skinning Control UI
Author complete token-driven Control UI skins with slots, adornments, motion controls, and one shared component source.
Not sure a skin is even the right tool? The customization ladder in the Architecture guide places every “make it different” request on one of eight rungs — with what each rung costs an app that never uses it. This page picks up once the answer is a skin.
Where skin values live
One owner for each visual decision.
The token contract
Every custom property a skin may re-value, rendered straight from lib/theme-contract.ts — the same module the coverage test enforces, so this reference can never drift from the CSS.
--backgroundColorBase surface color (panels, bubbles read it via bg-background).--foregroundColorDefault text color on --background.--cardColorCard surface; sits on --background in light, one ramp step above it in dark.--card-foregroundColorText color on --card.--popoverColorFloating surface base (popover / menu / select / dialog).--popover-foregroundColorText color on --popover.--primaryColorTHE brand color; primary action surfaces route through it.--primary-foregroundColorText color on --primary.--mutedColorSubdued fill for quiet surfaces.--muted-foregroundColorSecondary / meta text color.--secondaryColorSecondary action fill (assistant bubble in chat skins).--secondary-foregroundColorText color on --secondary.--accentColorHover / selection highlight fill.--accent-foregroundColorText color on --accent.--destructiveColorDestructive action color.--destructive-foregroundColorText color on --destructive.--borderColorHairline border color (carries --ring-opacity).--ringColorRing palette color; --focus-ring derives from it at 70% alpha, so a skin whose ring loses 3:1 there (a saturated accent or a softened halo) must set --focus-ring.--canvasColorThe page paper the scene/panels float on; same ramp step as --background by default, skins may drop it below.--font-sansTypographyTypeface for the whole UI.--font-monoTypographyMonospace face (code, kbd).--radiusRadiusTHE single radius knob; the whole scale multiplies from it.--duration-fastMotionFast tempo for press feedback and small state transitions; frequent hover paint is instant.--duration-baseMotionBase tempo (menus, indicators).--duration-slowMotionSlow tempo (panel/message entrances).Derived — optional overrides123 tokens with a core default; re-value one in theme.css only to diverge›
--primary-textColorReadable brand text color on base and card surfaces; --primary at ramp step 11.--destructive-textColorReadable destructive text color on base and card surfaces; --destructive at ramp step 11.--success-textColorReadable success text color on base and card surfaces; --success at ramp step 11.--warning-textColorReadable warning text color on base and card surfaces; defaults to --scale-yellow-11.--info-textColorReadable informational text color on base and card surfaces; defaults to --scale-blue-11.--inputColorForm field border color; defaults to --control-rim.--focus-ringColorColor of the keyboard focus indicator; defaults to --ring at 70% alpha. Must clear 3:1 against every surface it lands on (WCAG 1.4.11).--control-rimColorBoundary color of a control's own edge; defaults to --border.--control-boundaryColorEdge of a control that has no other outline (unchecked checkbox, radio, switch track); defaults to --foreground at 60% and must clear 3:1 on --background and --card (WCAG 1.4.11).--image-outlineColorHairline inside images and media that separates them from any surface; 10% black in light, 10% white in dark.--control-fillColorResting fill shared by fields and surface controls; defaults to --card at 72% alpha.--hover-fillColorWash a row or control takes on hover; defaults to a 6% tint of --foreground.--active-fillColorWash a selected or pressed row keeps; defaults to an 8% tint of --foreground.--canvas-grid-dotColorDot color of canvas and flow grid backgrounds.--ring-opacityColorAlpha of the --border hairline; 0 = borderless, defaults to 1.--scale-neutral-seedColorSeed of the neutral ramp; its hue and chroma drive --scale-neutral-1 to --scale-neutral-12.--scale-primary-seedColorSeed of the primary ramp; its hue and chroma drive --scale-primary-1 to --scale-primary-12.--scale-red-seedColorSeed of the red ramp; its hue and chroma drive --scale-red-1 to --scale-red-12.--scale-orange-seedColorSeed of the orange ramp; its hue and chroma drive --scale-orange-1 to --scale-orange-12.--scale-yellow-seedColorSeed of the yellow ramp; its hue and chroma drive --scale-yellow-1 to --scale-yellow-12.--scale-green-seedColorSeed of the green ramp; its hue and chroma drive --scale-green-1 to --scale-green-12.--scale-blue-seedColorSeed of the blue ramp; its hue and chroma drive --scale-blue-1 to --scale-blue-12.--scale-purple-seedColorSeed of the purple ramp; its hue and chroma drive --scale-purple-1 to --scale-purple-12.--scale-pink-seedColorSeed of the pink ramp; its hue and chroma drive --scale-pink-1 to --scale-pink-12.--badge-neutralColorSoft neutral-family badge background; the skin owns the exact hue.--badge-neutral-foregroundColorText color on the neutral-family badge.--badge-neutral-borderColorBorder of the outline neutral-family badge variant.--badge-neutral-hoverColorHover background of filled neutral-family badge links and buttons.--badge-redColorSoft red-family badge background; the skin owns the exact hue.--badge-red-foregroundColorText color on the red-family badge.--badge-red-borderColorBorder of the outline red-family badge variant.--badge-red-hoverColorHover background of filled red-family badge links and buttons.--badge-orangeColorSoft orange-family badge background; the skin owns the exact hue.--badge-orange-foregroundColorText color on the orange-family badge.--badge-orange-borderColorBorder of the outline orange-family badge variant.--badge-orange-hoverColorHover background of filled orange-family badge links and buttons.--badge-yellowColorSoft yellow-family badge background; the skin owns the exact hue.--badge-yellow-foregroundColorText color on the yellow-family badge.--badge-yellow-borderColorBorder of the outline yellow-family badge variant.--badge-yellow-hoverColorHover background of filled yellow-family badge links and buttons.--badge-greenColorSoft green-family badge background; the skin owns the exact hue.--badge-green-foregroundColorText color on the green-family badge.--badge-green-borderColorBorder of the outline green-family badge variant.--badge-green-hoverColorHover background of filled green-family badge links and buttons.--badge-blueColorSoft blue-family badge background; the skin owns the exact hue.--badge-blue-foregroundColorText color on the blue-family badge.--badge-blue-borderColorBorder of the outline blue-family badge variant.--badge-blue-hoverColorHover background of filled blue-family badge links and buttons.--badge-purpleColorSoft purple-family badge background; the skin owns the exact hue.--badge-purple-foregroundColorText color on the purple-family badge.--badge-purple-borderColorBorder of the outline purple-family badge variant.--badge-purple-hoverColorHover background of filled purple-family badge links and buttons.--badge-pinkColorSoft pink-family badge background; the skin owns the exact hue.--badge-pink-foregroundColorText color on the pink-family badge.--badge-pink-borderColorBorder of the outline pink-family badge variant.--badge-pink-hoverColorHover background of filled pink-family badge links and buttons.--chart-blueColorChart series color for the blue hue; area, line, bar, arc, and legend paint read it.--chart-purpleColorChart series color for the purple hue; area, line, bar, arc, and legend paint read it.--chart-pinkColorChart series color for the pink hue; area, line, bar, arc, and legend paint read it.--chart-orangeColorChart series color for the orange hue; area, line, bar, arc, and legend paint read it.--chart-greenColorChart series color for the green hue; area, line, bar, arc, and legend paint read it.--chart-yellowColorChart series color for the yellow hue; area, line, bar, arc, and legend paint read it.--chart-redColorChart series color for the red hue; area, line, bar, arc, and legend paint read it.--chart-neutralColorChart series color for the neutral hue; area, line, bar, arc, and legend paint read it.--sidebarColorSidebar surface; defaults to --canvas.--sidebar-foregroundColorText on the sidebar surface; defaults to --foreground.--sidebar-primaryColorAccent of the active sidebar item; defaults to --primary.--sidebar-accentColorHover and active wash of sidebar items; defaults to --hover-fill.--sidebar-accent-foregroundColorText on a washed sidebar item; defaults to --foreground.--sidebar-borderColorEdge between the sidebar and the page; defaults to --border.--font-bodyTypographyFont ROLE for body/UI text; defaults to --font-sans.--font-displayTypographyFont ROLE for headings; defaults to --font-sans.--text-microTypography10px rung — kbd, badge counters, dense numeric meta.--text-captionTypography11px rung — overlines, timestamps, group labels.--text-labelTypography12px rung — form labels + small chrome.--text-bodyTypography14px rung — DEFAULT body & control text.--text-body-lgTypography16px rung — emphasized / larger body.--text-heading-4TypographySmallest heading rung (15px).--text-heading-4--line-heightTypographyLine-height paired onto text-heading-4.--text-heading-4--font-weightTypographyWeight paired onto text-heading-4.--text-heading-3TypographyHeading rung (18px).--text-heading-3--line-heightTypographyLine-height paired onto text-heading-3.--text-heading-3--font-weightTypographyWeight paired onto text-heading-3.--text-heading-2TypographyHeading rung (22px).--text-heading-2--line-heightTypographyLine-height paired onto text-heading-2.--text-heading-2--font-weightTypographyWeight paired onto text-heading-2.--text-heading-1TypographyLargest content heading (30px — in-page / markdown h1).--text-heading-1--line-heightTypographyLine-height paired onto text-heading-1.--text-heading-1--font-weightTypographyWeight paired onto text-heading-1.--text-heading-1--letter-spacingTypographyTracking paired onto text-heading-1.--text-displayTypographyDisplay rung above h1 (36px — page titles, heroes).--text-display--line-heightTypographyLine-height paired onto text-display.--text-display--font-weightTypographyWeight paired onto text-display.--text-display--letter-spacingTypographyTracking paired onto text-display.--radius-smRadiusScale rung: --radius × 0.6.--radius-mdRadiusScale rung: --radius × 0.8.--radius-lgRadiusScale rung: --radius × 1.--radius-xlRadiusScale rung: --radius × 1.4.--radius-2xlRadiusScale rung: --radius × 1.6.--radius-composerRadiusComposer shell corner, concentric with the fitted control corner plus composer padding and rim.--corner-shapeRadiusProgressive corner reshape (round | squircle | scoop | …); defaults to round.--radius-popoverRadiusPopup container corner, concentric with the fitted row corner.--shadow-highlightShadowInner top light painted along raised surfaces' top edge (carries its resting alpha).--shadow-yShadowVertical bias: 0 = centered, 1 = default bottom cast.--shadow-control-multiplierShadowElevation tier: controls; defaults to 1.--shadow-panel-multiplierShadowElevation tier: panels; defaults to 2.--shadow-popover-multiplierShadowElevation tier: floating popovers; defaults to 4.--shadow-modal-multiplierShadowElevation tier: dialogs and sheets; defaults to 5.--shadow-ambient-multiplierShadowElevation tier: ambient scene lift; defaults to 8.--duration-loopMotionPeriod of one loader turn; essential loaders keep it under reduced motion.--disabled-opacitySurfaceOpacity of a disabled control; defaults to 0.45.--composer-paddingLayoutInset shared by the composer shell, toolbar controls, and nested corner geometry.--control-h-xsLayoutDerived control height: xs (×0.78, px-snapped).--control-h-smLayoutDerived control height: sm (×0.89, px-snapped).--control-h-mdLayoutDerived control height: md (= --control-h).--control-h-lgLayoutDerived control height: lg (×1.11, px-snapped).--focus-ring-widthLayoutThickness of the keyboard focus indicator; 0 removes it and fails WCAG 2.4.7.--focus-ring-styleLayoutLine style of the keyboard focus indicator (solid, dotted, dashed); none removes it and fails WCAG 2.4.7.--focus-ring-offsetLayoutGap between a control edge and its focus ring; negative draws it inside. Bordered fields ignore it and paint the indicator over their border.--control-rim-widthLayoutThickness of a control's own edge; defaults to 1px, shared across modes.--touch-targetLayoutMinimum hit area of a control under a coarse pointer (WCAG 2.5.5); defaults to 44px.--target-minLayoutMinimum hit area of a small control under a fine pointer (WCAG 2.5.8); defaults to 24px.--text-input-minLayoutSmallest text-input font size under a coarse pointer, so iOS never zooms on focus; defaults to 16px.Advanced — Color6 tokens›
--successColorSuccess status color; defaults to --scale-green-9.--warningColorWarning status color; defaults to --scale-yellow-9.--infoColorInfo status color; defaults to --scale-blue-9.--badge-fill-alphaColorAlpha of every tinted badge fill; defaults to 0.16.--badge-border-alphaColorAlpha of every tinted badge border; defaults to 0.2.--badge-hover-alphaColorAlpha a tinted badge fill reaches on hover; defaults to 0.24.Advanced — Radius5 tokens›
--radius-controlRadiusShared control corner (button, trigger, field, chip); ×2 from --radius.--radius-fieldRadiusUser bubble corner; --radius × 2.2.--radius-panelRadiusCode / markdown panel corner; --radius × 2.6.--radius-sceneRadiusScene frame / large media corner; --radius × 2.8.--radius-popup-itemRadiusSelect/menu row corner; derived from --radius-control.Advanced — Shadow3 tokens›
--shadow-colorShadowHue every shadow is tinted with.--shadow-sizeShadowGlobal geometry multiplier: 0 = flat (the default), 1 = full depth.--shadow-opacityShadowGlobal alpha multiplier: 1 = default density, 0 = invisible.Advanced — Motion2 tokens›
--ease-standardMotionDefault easing curve for color/text transitions.--ease-emphasizedMotionEmphasized curve for entrances and larger moves.Advanced — Surface5 tokens›
--popover-opacitySurfaceFloating-surface translucency; <1 + blur = frosted glass.--backdrop-blur-popoverSurfaceBackdrop blur behind floating surfaces.--overlay-opacitySurfaceModal overlay (dialog backdrop) dim strength.--backdrop-blur-overlaySurfaceBackdrop blur of the modal overlay.--scroll-fade-sizeSurfaceEdge-fade depth of scrollable surfaces; 0 = hard edges.Advanced — Layout11 tokens›
--popover-paddingLayoutGap between popup container edge and rows (drives concentric corners).--padding-xLayoutHorizontal content density of rounded surfaces (bubble, composer).--padding-yLayoutVertical content density of rounded surfaces.--control-hLayoutTHE base control height (md); the ramp derives from it.--sidebar-widthLayoutExpanded sidebar width; a dragged width overrides it inline.--sidebar-width-iconLayoutCollapsed icon-rail sidebar width.--z-overlayLayoutStacking level of modal backdrops.--z-modalLayoutStacking level of dialogs and sheets.--z-popupLayoutStacking level of menus, popovers, and selects.--z-tooltipLayoutStacking level of tooltips.--z-toastLayoutStacking level of toasts.The anatomy contract
Generated from canonical component DOM. Family is the selector key; slot names the part; scope identifies the component.
Copy a selector as [data-skin="brand"] [data-slot="shell"][data-control-family="chat-composer"]. Optional adornment anchors are listed separately in the machine-readable contract, one slice per paint family, so they cannot be mistaken for DOM parts.
accordion (6)
rooticonitempanelpanel-contenttriggeraction-bar (1)
rootactivity (12)
rootchevroncontentcontent-griddetaildetail-contentdetail-labeliconrowstatustitletriggeralert (3)
rootdescriptiontitlealert-dialog (8)
backdropbodycontentdescriptionfooterheadertitletriggerapp-shell (1)
rootaspect-ratio (1)
rootaudio-device-select (8)
rootcontentitempermissionpreviewstatustriggervalueaudio-recorder (9)
rootactionscancelcontentdurationstatussubmittriggervisualizeraudio-visualizer (5)
rootbarbar-trackbaselinetrackaudio-visualizer-line (1)
waveformautocomplete (11)
rootclearcontentemptygroupgroup-labelinputitemitem-textlistpositioneravatar (5)
rootbadgefallbackgroupimagebadge (1)
rootbreadcrumb (7)
rootellipsisitemlinklistpageseparatorbutton (2)
rootcontentbutton-group (3)
rootseparatortextcalendar (11)
rootcaption-labeldayday-cellmonthmonth-captionmonth-gridmonthsnavnav-buttonweekdaycard (7)
rootactioncontentdescriptionfooterheadertitlechannel-strip (8)
rootactionsbodycontrolsheadermixertitlevaluechart (13)
rootcenterhatch-stripehatch-tintlegendlegend-itemlegend-togglepatternsplotswatchtooltiptooltip-rowtooltip-titlechat-composer (12)
rootaccentfootermentionmention-descriptionmention-iconmention-labelshellsubmittextareatoolbartoolschat-composer-attachment (9)
rootcontentdescriptionpreviewpreview-labelprogressprogress-indicatorremovetitlechat-composer-attachments (3)
rootlistscrollchat-composer-editor (4)
editoreditor-rootfallbackplaceholderchat-layout (5)
rootactionsdescriptionheadertitlechat-message (25)
rootactionsactions-surfaceauthoravatarbodycontentedit-erroredit-inputedit-sizeredit-toolbaredit-toolbarsedit-valueeditablefooterheaderpendingreactionreaction-emojireactionsrepliesreply-summaryrowtimetyping-dotschat-thread (4)
rootdockscroll-anchorthread-contentchat-turn (1)
turncheckbox (2)
rootindicatorcheckbox-group (2)
rootitemcode (11)
rootaccessible-sourceactionscontenteditorfloating-framegridgutterheaderlinetitlecode-diff (22)
rootaccessible-sourceactionsbodyemphasisempty-halfexpand-buttonexpanderexpander-labelfilefile-headerfile-titlegutterheaderlinemarkerrevealed-rowrowstatstat-additionsstat-deletionstitlecollapsible (3)
rootcontenttriggercolor-picker (40)
areaarea-brightnessarea-contrastarea-contrast-failarea-contrast-thresholdarea-saturationarea-thumbchannelchannel-labelchannelscontentcontrastcontrast-fixcontrast-levelcontrast-ratioeye-dropperformatinputoutputoutput-checkeroutput-coloroutput-swatchoutput-valuepanelpositionersliderslider-thumbslider-trackswatchswatch-addswatch-checkerswatch-colorswatchesswatches-groupswatches-labeltriggertrigger-checkertrigger-colorwheelwheel-thumbcombobox (13)
contentemptygroupgroup-labeliconinputinput-groupitemitem-indicatoritem-textlistpositionertriggercommand (12)
rootdialog-rootemptygroupinputinput-iconinput-wrapperitemlistloadingseparatorshortcutcontext (24)
rootcontentcontent-griddescriptiongraphheaderlegendlegend-descriptionlegend-indicatorlegend-itemlegend-labellegend-valuelimit-markeroveragesegmentsummarysummary-valuetitletracktriggertrigger-indicatortrigger-labeltrigger-tracktrigger-valuecontext-menu (14)
checkbox-itemcontentgroupitemlabelradio-groupradio-indicatorradio-itemseparatorshortcutsub-contentsub-triggersub-trigger-indicatortriggerdialog (8)
backdropbodycontentdescriptionfooterheadertitletriggerdockable-panel (8)
rootactionscontentdrag-buttondrag-handledrop-zoneheadertitledrawer (11)
backdropbodyclosecontentdescriptionfooterhandleheadertitletriggerviewportdropdown-menu (13)
checkbox-itemcontentgroupitemlabelradio-groupradio-itemseparatorshortcutsub-contentsub-triggersub-trigger-indicatortriggerdropzone (14)
rootareafeedbackfeedback-iconfeedback-messagefeedback-spinnerfilefile-listinputoverlayrejectionrejection-liststatustriggerdynamic-notification (15)
rootclosecontentglassindicatorislandliquidmessagepillreplyreply-errorreply-inputreply-submittitlewordemoji-icon-picker (1)
rootemoji-picker (21)
rootcategoriescategorycategory-headercontentemojiemptyerrorfooterfooter-emojifooter-labelfooter-placeholderlistloadingrecentrecent-gridrecent-labelrowsearchsearch-iconsearch-inputempty (6)
rootcontentdescriptionheadermediatitlefield (14)
rootcontentcontroldescriptionerrorerror-reservegroupitemlabellegendseparatorseparator-contentsettitlefilter-bar (5)
rootchipexitremovesegmentflow (10)
rootcontrolsedgeedge-labeledge-label-chiphandlenodenode-bodynode-headerpanelform (1)
rootgradient-editor (6)
rootpreviewstopstop-addtrackvalue-rowhover-card (3)
contentpositionertriggericon-picker (7)
rootcolorcolorscontentemptygridiconinfinite-canvas (4)
rootcontentcontrolsiteminline-attachment (14)
rootactionactionscontentdescriptiondocumentdocument-headingdocument-linedocument-sheetdocument-stampimagemedia-imageplaceholdertitleinline-citation (18)
rootcontentfaviconfaviconslabelnavigationnextpositionprevioussourcesource-descriptionsource-external-iconsource-faviconsource-headersource-hostnamesource-quotesource-titletriggerinput (1)
rootinput-group (3)
rootaddoninputinput-otp (3)
rootseparatorslotitem (10)
rootactionscontentdescriptionfootergroupheadermediaseparatortitlekbd (2)
rootgrouplabel (1)
rootlevel-meter (6)
rootbarpeakscaleticktracklive-status (1)
rootmarkdown (22)
rootblockquoteemphasisflowh1h2h3h4h5h6inline-codelinklist-itemordered-listparagraphseparatorstrongtabletable-celltable-headertable-scrollunordered-listmarkdown-block (5)
rootcontentheadertitletitle-iconmarkdown-editor (8)
rootcontentsourcetask-checkboxtask-contenttask-itemtoolbaruploadsmenubar (11)
rootcontentgroupitemlabelseparatorshortcutsub-contentsub-triggersub-trigger-indicatortriggermeter (5)
rootindicatorlabeltrackvaluemodel-switcher (2)
hintvaluemorphing-panel (7)
rootbodycontentfooterheaderpositionertriggernative-select (2)
rooticonnavigation-menu (10)
rootcontenticonitemlinklistpopuppositionertriggerviewportnumber-field (7)
decrementdrag-icongroupincrementinputscrub-areascrub-cursorpage-layout (8)
rootactionsasidebodycontentdescriptionheadertitlepagination (5)
rootcontentellipsisitemlinkphone-input (7)
rootcheckchevroncountry-codecountry-triggerflagmetadatapopover (8)
closecontentdescriptionheadertitletriggerviewportviewport-contentprogress (5)
rootindicatorlabeltrackvalueprogressive-blur (2)
rootlayerradio-group (4)
rootindicatoritemlabelresizable (6)
floatinghandlehandle-grippanelpanel-groupsurfaceresize-handle (1)
rootrich-tooltip (14)
arrowclosecontentdescriptiondotfooterheadermedianextpositionerpreviousprogresstitletriggerscroll-area (6)
rootcontentcornerscrollbarthumbviewportselect (7)
contenticonitemitem-indicatoritem-texttriggervalueseparator (1)
rootsheet (6)
backdropclosecontentdescriptionheadertitlesidebar (25)
rootcontainercontentcontent-stackfootergapgroupgroup-contentgroup-labelheaderinnerinsetmenumenu-actionmenu-badgemenu-buttonmenu-itemmenu-trackmobile-navmobile-nav-containermobile-triggerrailskip-linktriggerwrappersidebar-layout (1)
contentskeleton (1)
rootslider (9)
rootcontrolindicatorlabellabel-overlaythumbticktrackvaluesource-badge (2)
rootlabelspinner (2)
rootindicatorstepper (9)
rootcontentdescriptionindicatoritemlistseparatortitletriggerswitch (3)
rootthumbthumb-icontable (9)
rootbodycaptioncellcontainerfooterheadheaderrowtable-of-contents (8)
rootindicatoritemlabellistrailtracktrailtabs (6)
rootindicatorlistpanelsurfacetabtask-list (8)
rootchevronitemitem-indicatoritemslabelprogresstriggertextarea (1)
roottheme-toggle (3)
rootindicatoroptionthread-rail (11)
rootfilefile-iconfooteritemlinemorepopoverpopover-layersummarytitletimeline (8)
rootcontentdescriptionindicatoritemmetaseparatortitletoast (6)
rootcontentdescriptionindicatortitleviewporttoggle (4)
rootcheckcontentgrouptoolbar (7)
rootbuttongroupinputlinkseparatorsurfacetooltip (3)
arrowcontentpositionertrack-highlight (2)
roothovertranscript-divider (2)
rootlabeltree (8)
rootitemitem-contentitem-groupitem-indicatoritem-labelitem-triggerlisttrigger-menu (8)
rootemptygroupgroup-labeliconitemlistpositionertypography (2)
headingtextuser-ask (16)
rootdismissfooterfreeform-labelheaderoptionoption-descriptionoption-indicatoroption-inputoption-labelpaginationpagination-countquestionrecommendedsubmittitleSkin requirements — the do-not list
What a pack must and must not do. Every rule is enforced by a test, so a violating pack fails the build before it ships.
Adornments
JSX at named anchors — decorative chrome, or behavioral fx layers.
Additive, render zero DOM when absent, never gate library behavior. Decorative anchors (window titlebars, window controls) take plain aria-hidden JSX. Behavioral anchors (like chat-composer:send-layer) take a (ctx) => JSX render prop whose ctx carries plain render-time values — this is how a pack activates an anchored extension (send-aurora). Adornments are nested by scope and part in skin.config. Interactive values live in a separate "use client" file the pack ships, so skin.config itself stays RSC-pure.
Motion flag
One boolean, zero JavaScript.
motion: "reduced" stamps data-motion="reduced", which collapses --duration-fast/base/slow to 0 — every cva transition, Base UI enter/exit and the shimmer/ripple keyframes flatten at once. The theme editor also exposes a manual “Reduce motion” toggle.
Component knobs and the cascade
Tokens theme the whole app from :root. Knobs theme one family and live on its root element — every slot inherits.
/* app-wide: a token, on :root */:root { --radius-field: 0.75rem; }/* one family, everywhere: a knob, on the family root */[data-control-family="chat-composer"] { --cui-chat-composer-shell-radius: 0; }/* one instance, on the root element: className="[--cui-chat-composer-shell-radius:0]" or style={{ "--cui-chat-composer-shell-radius": "0" }} */The recipe declares each knob’s default on the family root at zero specificity, so a value set on that element always wins: style beats a skin, a skin beats the recipe, a utility class beats both. Setting a knob on :root does nothing — the family root re-declares it; re-value the token it derives from instead. Portaled surfaces are their own root: set --popup-* on the popup content, not on the trigger. Each component page lists its knobs with type and default.
Skins
Each pack’s tokens, skin.css and config, ready to read and install.