@godxjp/ui-mcp 15.0.0 → 16.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1125,7 +1125,8 @@ export default function InvoiceList({
1125
1125
  "DO use <CardContent flush> for edge-to-edge children such as DataTable, Table, or a Tabs list \u2014 this removes horizontal padding. Combine with <CardContent tight> when there is no visual gap needed after the header, and <CardContent solo> when there is no CardHeader above (top padding matches the card shell).",
1126
1126
  "DO use <CardFooter separated> to render a top-bordered action band (Save/Cancel buttons, table summary row). Use <CardFooter flush> for a full-bleed footer bar.",
1127
1127
  "DO use <CardCover> as the first child for full-bleed cover media \u2014 the header below it uses card-section top spacing, not the card shell.",
1128
- "DON'T hand-roll a stat/KPI tile with <Card> + raw divs \u2014 use <StatCard> (label, value, hint, delta, layout, inverse props) which is already a Card internally with correct token-driven layout."
1128
+ "DON'T hand-roll a stat/KPI tile with <Card> + raw divs \u2014 use <StatCard> (label, value, hint, delta, layout, inverse props) which is already a Card internally with correct token-driven layout.",
1129
+ "SPACING IS BORDER-AWARE & token-driven (theme via src/tokens/components/card.css, never hard-code padding on slots): `--card-space-inset` is the shared horizontal column every slot (header/content/footer) aligns to. A DIVIDED section \u2014 a `banded` header or a `separated` footer, i.e. one carrying a divider border \u2014 pads SYMMETRICALLY top+bottom from `--card-space-divided-y` (a band reads as its own region). A PLAIN header flows into the body instead: top `--card-space-inset`, no bottom, and the body supplies the gap via `--card-space-body-y`. Special case: a header above `<CardContent flush>` with a <Table> gets its own `--card-space-body-y` bottom gap (the flush table zeroes its top), so the title never butts the table. `--card-space-gap` is the in-slot stack gap (title\u2195description). Tune the band rhythm once at `--card-space-divided-y`; tune the accent stripe width at `--card-accent-rail-width` (default 6px)."
1129
1130
  ],
1130
1131
  useCases: [
1131
1132
  'Dashboard KPI summary row: wrap each metric in <StatCard> (or a plain <Card size="compact"> with <CardContent>) to render a uniform grid of labeled value tiles with optional trend deltas.',
@@ -1216,6 +1217,11 @@ export default function InvoiceList({
1216
1217
  description: "Metric value (string/number/ReactNode)."
1217
1218
  },
1218
1219
  { name: "hint", type: "ReactNode", description: "Secondary context below the value." },
1220
+ {
1221
+ name: "icon",
1222
+ type: "LucideIcon",
1223
+ description: "Optional leading icon rendered as a tinted medallion above the metric. Decorative (aria-hidden) \u2014 the label carries the meaning. Tint via the --stat-card-icon-{background,foreground} tokens (default a soft brand-primary wash)."
1224
+ },
1219
1225
  {
1220
1226
  name: "delta",
1221
1227
  type: "ReactNode",
@@ -1434,6 +1440,12 @@ import { Smartphone } from "lucide-react";
1434
1440
  defaultValue: "2",
1435
1441
  description: "Column count; collapses to 1 on mobile."
1436
1442
  },
1443
+ {
1444
+ name: "layout",
1445
+ type: '"vertical" | "horizontal"',
1446
+ defaultValue: '"vertical"',
1447
+ description: "Label placement within each item \u2014 `vertical` stacks the label over the value (default); `horizontal` puts the label BESIDE the value in a token-aligned column (mirrors `<Form layout>`). Tune the horizontal label-column width via `--descriptions-label-width`."
1448
+ },
1437
1449
  {
1438
1450
  name: "children",
1439
1451
  type: "ReactNode",
@@ -1961,6 +1973,11 @@ import { Smartphone } from "lucide-react";
1961
1973
  name: "onClear",
1962
1974
  type: "() => void",
1963
1975
  description: "Called after the field is cleared via the inline \u2715 (requires `allowClear`)."
1976
+ },
1977
+ {
1978
+ name: "trailingIcon",
1979
+ type: "React.ReactNode",
1980
+ description: "A trailing affordance pinned inside the field (e.g. a calendar / clock popover trigger). ONE trailing icon shows at a time: when `allowClear` and the field holds a value the clear \u2715 REPLACES this icon; otherwise this icon shows. Never both \u2014 this is how DatePicker/TimePicker render their open trigger."
1964
1981
  }
1965
1982
  ],
1966
1983
  usage: [
@@ -2087,7 +2104,7 @@ import { Smartphone } from "lucide-react";
2087
2104
  "Input \u2014 the plain single-line field NumberInput composes; use Input directly only for free numeric text with no stepper/clamp need.",
2088
2105
  "Slider \u2014 use instead when the user picks an approximate value within a range by dragging; NumberInput is for exact keyed entry.",
2089
2106
  "FormField \u2014 compose NumberInput inside FormField (matching id) for label/helper/error a11y wiring.",
2090
- "TimeInput \u2014 the HH:mm sibling spinbutton; NumberInput is for plain numbers, TimeInput for clock times."
2107
+ "TimePicker \u2014 the HH:mm time sibling; NumberInput is for plain numbers, TimePicker for clock times."
2091
2108
  ],
2092
2109
  storyPath: "data-entry/NumberInput.stories.tsx",
2093
2110
  rules: [3, 6],
@@ -6871,15 +6888,19 @@ export default function PasswordBlock() {
6871
6888
  },
6872
6889
  {
6873
6890
  name: "defaultSize",
6874
- type: "number",
6875
- description: "ResizablePanel initial size as a percentage (0\u2013100) of the group."
6891
+ type: "string | number",
6892
+ description: 'ResizablePanel initial size. react-resizable-panels v4: a STRING is a unit ("35%", "20rem", "240px"); a bare NUMBER is PIXELS. For a percentage of the group pass a string like "35%" \u2014 `defaultSize={35}` means 35px (a sliver), not 35%.'
6876
6893
  },
6877
6894
  {
6878
6895
  name: "minSize",
6879
- type: "number",
6880
- description: "ResizablePanel minimum size (%) \u2014 drag can't shrink below this."
6896
+ type: "string | number",
6897
+ description: `ResizablePanel minimum size \u2014 drag can't shrink below this. Same unit rule: "20%" for percent, bare number = px.`
6898
+ },
6899
+ {
6900
+ name: "maxSize",
6901
+ type: "string | number",
6902
+ description: 'ResizablePanel maximum size. "60%" for percent, bare number = px.'
6881
6903
  },
6882
- { name: "maxSize", type: "number", description: "ResizablePanel maximum size (%)." },
6883
6904
  {
6884
6905
  name: "collapsible",
6885
6906
  type: "boolean",
@@ -6894,7 +6915,7 @@ export default function PasswordBlock() {
6894
6915
  ],
6895
6916
  usage: [
6896
6917
  'DO put the layout on `<ResizablePanelGroup orientation="horizontal|vertical">`, the resizable regions in `<ResizablePanel>`, and a `<ResizableHandle>` BETWEEN every adjacent pair \u2014 a group of N panels needs N-1 handles or there is nothing to drag.',
6897
- "DO size panels with `defaultSize`/`minSize`/`maxSize` as PERCENTAGES (the group totals 100), not pixels \u2014 don't fight this with a fixed `w-[280px]` className on the panel.",
6918
+ 'DO express `defaultSize`/`minSize`/`maxSize` as PERCENTAGE STRINGS like `defaultSize="35%"` (react-resizable-panels v4: a bare number is PIXELS, so `defaultSize={35}` renders a 35px sliver, NOT 35% \u2014 pass the string). Don\'t fight sizing with a fixed `w-[280px]` className on the panel.',
6898
6919
  "DON'T reach for ResizablePanel when the split is fixed and never user-adjustable \u2014 use a plain `Flex`/`ResponsiveGrid`, or `SplitPane` for a simple two-pane layout. Resizable is for *user-draggable* boundaries only.",
6899
6920
  "DO give each panel a stable `id` and use `collapsible` + `collapsedSize` for a side panel the user can fully tuck away (e.g. a filters rail), reacting via `onResize`.",
6900
6921
  "DON'T hand-roll a draggable divider with mouse-move listeners \u2014 the primitive handles pointer + keyboard resizing, ARIA separator semantics, and min/max clamping. Always render `<ResizableHandle>`, never a bare styled `<div>`."
@@ -6909,10 +6930,10 @@ export default function PasswordBlock() {
6909
6930
  rules: [3, 6],
6910
6931
  example: `import { ResizablePanelGroup, ResizablePanel, ResizableHandle } from "@godxjp/ui/layout";
6911
6932
 
6912
- <ResizablePanelGroup>
6913
- <ResizablePanel>Panel A</ResizablePanel>
6933
+ <ResizablePanelGroup orientation="horizontal">
6934
+ <ResizablePanel id="list" defaultSize="35%" minSize="20%">Panel A</ResizablePanel>
6914
6935
  <ResizableHandle />
6915
- <ResizablePanel>Panel B</ResizablePanel>
6936
+ <ResizablePanel id="detail" defaultSize="65%" minSize="40%">Panel B</ResizablePanel>
6916
6937
  </ResizablePanelGroup>`
6917
6938
  },
6918
6939
  {
@@ -6964,50 +6985,6 @@ export default function PasswordBlock() {
6964
6985
  <CarouselNext />
6965
6986
  <CarouselDots />
6966
6987
  </Carousel>`
6967
- },
6968
- {
6969
- name: "TimeInput",
6970
- group: "data-entry",
6971
- tagline: "Masking HH:mm input with validation and optional minute step quantization.",
6972
- props: [
6973
- { name: "value", type: "string", description: "Controlled HH:mm value." },
6974
- {
6975
- name: "defaultValue",
6976
- type: "string",
6977
- description: "Uncontrolled initial HH:mm value."
6978
- },
6979
- {
6980
- name: "onValueChange",
6981
- type: "(value: string) => void",
6982
- description: "Validated value callback."
6983
- },
6984
- {
6985
- name: "step",
6986
- type: "number",
6987
- defaultValue: "1",
6988
- description: "Minute step (clamped 1\u201359). Snaps the committed minute to the nearest lower multiple and sets the ArrowUp/ArrowDown increment."
6989
- },
6990
- { name: "name", type: "string", description: "Form field name." }
6991
- ],
6992
- usage: [
6993
- "DO treat the value as a plain `HH:mm` string (24-hour, zero-padded) \u2014 TimeInput is calendar-free. For a date, or a date+time, use `DatePicker`/`Calendar`; for a richer dropdown time selector use `TimePicker`.",
6994
- "DO drive it controlled with `value` + `onValueChange` (it follows the vocabulary \u2014 NOT `onChange`/`defaultValue` pairing for control). `onValueChange` fires only with a VALID, step-snapped `HH:mm`, so your state never holds a half-typed value.",
6995
- "DON'T pass `value` without `onValueChange` \u2014 like every controlled @godxjp/ui input that freezes the field. Omit both for uncontrolled (use `defaultValue`).",
6996
- "DO set `step` to your scheduling granularity (e.g. `15` or `30`) \u2014 the user can still type freely, but blur/Enter snaps the minute down to the nearest multiple, and ArrowUp/ArrowDown step by that amount (wrapping across midnight).",
6997
- "DO let the built-in masking + validation work: digits auto-format to `HH:mm`, invalid input sets `aria-invalid` and is reverted on blur. Don't add your own regex/onChange masking on top.",
6998
- "DON'T use it for a duration/elapsed time that can exceed 23:59 \u2014 it's a clock time-of-day input (00:00\u201323:59). Use a numeric Input for durations."
6999
- ],
7000
- useCases: [
7001
- "\u52E4\u6020 (attendance) start/end time fields \u2014 \u51FA\u52E4 / \u9000\u52E4 HH:mm entry with step={1} or a rounding step for shift schedules.",
7002
- "Business-hours / reservation slot editor where times snap to a 15- or 30-minute grid (step={15}).",
7003
- "A from\u2013to time range filter on a report or log screen (two TimeInputs) with no date component.",
7004
- "Any calendar-free HH:mm-only form field (e.g. a recurring daily batch time, a \u7DE0\u3081\u6642\u523B)."
7005
- ],
7006
- storyPath: "data-entry/TimeInput.stories.tsx",
7007
- rules: [3, 6],
7008
- example: `import { TimeInput } from "@godxjp/ui/data-entry";
7009
-
7010
- <TimeInput value="09:00" step={15} onValueChange={(time) => console.log(time)} />`
7011
6988
  },
7012
6989
  {
7013
6990
  name: "AppSettingPicker",
@@ -7664,6 +7641,36 @@ var TOKENS = [
7664
7641
  tier: "primitive",
7665
7642
  role: "Distance (10px) a revealed element travels on enter (translateY/-X). Read instead of a literal `translateY(10px)` for staggered reveals."
7666
7643
  },
7644
+ {
7645
+ name: "--shadow-color",
7646
+ category: "primitive",
7647
+ tier: "primitive",
7648
+ role: "RGB channels (space-separated, e.g. `12 26 49`) that tint the WHOLE elevation ramp (--shadow-xs..2xl) at once. Default `0 0 0`. Single-brand :root only \u2014 a scoped override does not re-resolve the ramp (the steps compute at :root); for a scoped/multi-tenant card lift set --card-shadow to a literal value."
7649
+ },
7650
+ {
7651
+ name: "--shadow-glow",
7652
+ category: "primitive",
7653
+ tier: "primitive",
7654
+ role: "Opt-in brand GLOW halo layered on the primary CTA's resting shadow. Default invisible (`0 0 0 0 transparent`, valid inside a comma shadow list). A service sets the whole value, e.g. `--shadow-glow: 0 8px 20px hsl(var(--primary) / .32)` \u2014 works scoped under [data-tenant] because the service declares it inside the scope."
7655
+ },
7656
+ {
7657
+ name: "--focus-ring-color",
7658
+ category: "primitive",
7659
+ tier: "primitive",
7660
+ role: "Themeable hue of EVERY keyboard-focus ring (HSL components, default var(--ring)). A leaf token, so it re-resolves at the element that paints the ring \u2014 override it once, even scoped under [data-tenant], to retint all focus rings. Pair with --focus-ring-width."
7661
+ },
7662
+ {
7663
+ name: "--focus-ring-width",
7664
+ category: "primitive",
7665
+ tier: "primitive",
7666
+ role: "Thickness (2px) of the solid keyboard-focus ring. Leaf token \u2014 :focus-visible rules read it directly as `0 0 0 var(--focus-ring-width) hsl(var(--focus-ring-color))`, never via an intermediate composite (which would freeze at :root). Propagates scoped."
7667
+ },
7668
+ {
7669
+ name: "--gradient-{brand,hero,glow}",
7670
+ category: "primitive",
7671
+ tier: "primitive",
7672
+ role: "Opt-in decorative gradient fills, default `none`. --gradient-hero paints the PageContainer header (hero banner); --gradient-glow paints the AppShell .app-main (ambient brand wash); --gradient-brand is a spare. A service sets the full gradient, e.g. `--gradient-glow: radial-gradient(60% 80% at 50% 0%, hsl(var(--primary) / .25), transparent)`."
7673
+ },
7667
7674
  { name: "--primary", category: "semantic", tier: "semantic", role: "Brand/action color role." },
7668
7675
  { name: "--success", category: "semantic", tier: "semantic", role: "Success status role." },
7669
7676
  { name: "--warning", category: "semantic", tier: "semantic", role: "Warning status role." },
@@ -7681,6 +7688,12 @@ var TOKENS = [
7681
7688
  tier: "semantic",
7682
7689
  role: "PageContainer header bottom divider. Default none; a service theme opts in with `1px solid hsl(var(--border))`."
7683
7690
  },
7691
+ {
7692
+ name: "--overlay-background",
7693
+ category: "semantic",
7694
+ tier: "semantic",
7695
+ role: "Modal scrim \u2014 the single backdrop colour shared by every overlay (Dialog, AlertDialog, Sheet, Drawer). Default `rgb(0 0 0 / 0.5)`. A service tints it once, e.g. a navy `rgb(12 26 49 / .55)`. NOTE: portaled overlays render outside a [data-tenant] subtree, so for multi-tenant scoping put the tenant attribute on the portal container too."
7696
+ },
7684
7697
  {
7685
7698
  name: "--page-header-pad-bottom",
7686
7699
  category: "semantic",
@@ -7749,72 +7762,77 @@ var COMPONENT_TOKENS = [
7749
7762
  {
7750
7763
  "name": "--card-space-inset",
7751
7764
  "value": "var(--space-section-active)",
7752
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7765
+ "description": "Horizontal inset of every slot (header / content / footer) + the resting top/bottom * shell padding. This is the column the title, body and footer all align to."
7753
7766
  },
7754
7767
  {
7755
7768
  "name": "--card-space-header-y",
7756
7769
  "value": "var(--space-stack-sm)",
7757
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7770
+ "description": "Vertical padding of a BANDED header band (top = bottom). Drives --card-space-divided-y."
7758
7771
  },
7759
7772
  {
7760
7773
  "name": "--card-space-body-y",
7761
7774
  "value": "var(--space-section-active)",
7762
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7775
+ "description": "Gap between the header and the body, and the body's own top padding \u2014 the breathing * room under a title before content begins."
7763
7776
  },
7764
7777
  {
7765
7778
  "name": "--card-space-footer-y",
7766
7779
  "value": "var(--space-stack-sm)",
7767
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7780
+ "description": "Vertical padding of a SEPARATED footer band (top = bottom). Drives --card-space-divided-y."
7781
+ },
7782
+ {
7783
+ "name": "--card-space-divided-y",
7784
+ "value": "var(--card-space-header-y)",
7785
+ "description": "DIVIDED-section vertical padding (rule #44/#45). A header/footer that carries a divider * border (banded header, separated footer) reads as its own band, so it pads SYMMETRICALLY * top+bottom \u2014 distinct from a plain header that flows into the body (top inset, no bottom). * One themeable knob keeps the header- and footer-band rhythm in sync; a service theme tunes * the band density here instead of forking per-slot CSS."
7768
7786
  },
7769
7787
  {
7770
7788
  "name": "--card-space-gap",
7771
7789
  "value": "var(--space-stack-xs)",
7772
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7790
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7773
7791
  },
7774
7792
  {
7775
7793
  "name": "--card-title-font-size",
7776
7794
  "value": "var(--font-size-base)",
7777
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7795
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7778
7796
  },
7779
7797
  {
7780
7798
  "name": "--card-title-line-height",
7781
7799
  "value": "var(--line-height-tight)",
7782
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7800
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7783
7801
  },
7784
7802
  {
7785
7803
  "name": "--card-title-font-weight",
7786
7804
  "value": "var(--font-weight-semibold)",
7787
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7805
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7788
7806
  },
7789
7807
  {
7790
7808
  "name": "--card-description-font-size",
7791
7809
  "value": "var(--font-size-sm)",
7792
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7810
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7793
7811
  },
7794
7812
  {
7795
7813
  "name": "--card-description-line-height",
7796
7814
  "value": "var(--line-height-normal)",
7797
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7815
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7798
7816
  },
7799
7817
  {
7800
7818
  "name": "--card-background",
7801
7819
  "value": "var(--card)",
7802
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7820
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7803
7821
  },
7804
7822
  {
7805
7823
  "name": "--card-border",
7806
7824
  "value": "var(--border)",
7807
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7825
+ "description": "Vertical gap between stacked items WITHIN a slot (e.g. title \u2195 description in the header)."
7808
7826
  },
7809
7827
  {
7810
7828
  "name": "--card-header-background",
7811
7829
  "value": "var(--muted)",
7812
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7830
+ "description": "Banded-header fill \u2014 already role-tintable (rule #45): a service points this at any role, * e.g. --card-header-background: var(--primary), and tunes --card-header-background-alpha for * the wash strength. No separate tint token needed."
7813
7831
  },
7814
7832
  {
7815
7833
  "name": "--card-header-background-alpha",
7816
7834
  "value": "0.55",
7817
- "description": "Card component tokens: card chrome derives from semantic layout tokens."
7835
+ "description": "Banded-header fill \u2014 already role-tintable (rule #45): a service points this at any role, * e.g. --card-header-background: var(--primary), and tunes --card-header-background-alpha for * the wash strength. No separate tint token needed."
7818
7836
  },
7819
7837
  {
7820
7838
  "name": "--card-header-border-bottom",
@@ -7826,6 +7844,21 @@ var COMPONENT_TOKENS = [
7826
7844
  "value": "var(--radius)",
7827
7845
  "description": "Banded-header divider \u2014 tokenised (rule #44) so a service theme can make it * dashed / heavier / none without forking CSS. Pair with * --card-header-background-alpha: 0 for a quiet borderless-band header."
7828
7846
  },
7847
+ {
7848
+ "name": "--card-shadow",
7849
+ "value": "0 0 0 0 transparent",
7850
+ "description": "Resting elevation \u2014 quiet by default (rule #44): cards are flat (1px border, no shadow) in the * dxs-kintai baseline. A service that wants lifted cards sets this to an elevation token once, * e.g. --card-shadow: var(--shadow-sm), and every Card picks up the shadow with no markup change."
7851
+ },
7852
+ {
7853
+ "name": "--card-glow",
7854
+ "value": "0 0 0 0 transparent",
7855
+ "description": "Brand glow layer \u2014 invisible no-op at rest (rule #44). Paired AFTER --card-shadow in the * surface box-shadow so a service can wash every card with the global glow, e.g. * --card-glow: var(--shadow-glow), with no markup change."
7856
+ },
7857
+ {
7858
+ "name": "--card-tint",
7859
+ "value": "transparent",
7860
+ "description": "Fill tint \u2014 subtle role wash over the card background (default transparent = invisible). * Painted as an overlay so a service sets --card-tint: hsl(var(--primary) / 0.04) once."
7861
+ },
7829
7862
  {
7830
7863
  "name": "--card-accent-rail-width",
7831
7864
  "value": "6px",
@@ -7876,10 +7909,30 @@ var COMPONENT_TOKENS = [
7876
7909
  "value": "2.25rem",
7877
7910
  "description": "Accent edge \u2014 width of the semantic leading-edge stripe (data-accent). * Tokenised (rule #44) so a service theme can re-tune it without forking CSS. * The slot padding compensation in card-layout.css subtracts the same token, * so content stays aligned on the shell whatever the rail width."
7878
7911
  },
7912
+ {
7913
+ "name": "--stat-card-icon-glyph-size",
7914
+ "value": "1.25rem",
7915
+ "description": "Accent edge \u2014 width of the semantic leading-edge stripe (data-accent). * Tokenised (rule #44) so a service theme can re-tune it without forking CSS. * The slot padding compensation in card-layout.css subtracts the same token, * so content stays aligned on the shell whatever the rail width."
7916
+ },
7917
+ {
7918
+ "name": "--stat-card-icon-radius",
7919
+ "value": "var(--radius-md)",
7920
+ "description": "Accent edge \u2014 width of the semantic leading-edge stripe (data-accent). * Tokenised (rule #44) so a service theme can re-tune it without forking CSS. * The slot padding compensation in card-layout.css subtracts the same token, * so content stays aligned on the shell whatever the rail width."
7921
+ },
7922
+ {
7923
+ "name": "--stat-card-icon-background",
7924
+ "value": "hsl(var(--primary) / 0.1)",
7925
+ "description": "Medallion tint \u2014 soft brand wash + brand glyph by default; a service retints by overriding * --primary or these tokens directly (rule #44/#45)."
7926
+ },
7927
+ {
7928
+ "name": "--stat-card-icon-foreground",
7929
+ "value": "hsl(var(--primary))",
7930
+ "description": "Medallion tint \u2014 soft brand wash + brand glyph by default; a service retints by overriding * --primary or these tokens directly (rule #44/#45)."
7931
+ },
7879
7932
  {
7880
7933
  "name": "--stat-card-delta-font-size",
7881
7934
  "value": "var(--font-size-xs)",
7882
- "description": "Accent edge \u2014 width of the semantic leading-edge stripe (data-accent). * Tokenised (rule #44) so a service theme can re-tune it without forking CSS. * The slot padding compensation in card-layout.css subtracts the same token, * so content stays aligned on the shell whatever the rail width."
7935
+ "description": "Medallion tint \u2014 soft brand wash + brand glyph by default; a service retints by overriding * --primary or these tokens directly (rule #44/#45)."
7883
7936
  },
7884
7937
  {
7885
7938
  "name": "--control-height-compact",
@@ -7963,7 +8016,7 @@ var COMPONENT_TOKENS = [
7963
8016
  },
7964
8017
  {
7965
8018
  "name": "--control-focus-ring-width",
7966
- "value": "2px",
8019
+ "value": "var(--focus-ring-width)",
7967
8020
  "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
7968
8021
  },
7969
8022
  {
@@ -8076,85 +8129,110 @@ var COMPONENT_TOKENS = [
8076
8129
  "value": "1rem",
8077
8130
  "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8078
8131
  },
8132
+ {
8133
+ "name": "--checkbox-checked-background",
8134
+ "value": "hsl(var(--primary))",
8135
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8136
+ },
8137
+ {
8138
+ "name": "--switch-checked-background",
8139
+ "value": "hsl(var(--primary))",
8140
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8141
+ },
8142
+ {
8143
+ "name": "--toggle-on-background",
8144
+ "value": "hsl(var(--primary))",
8145
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8146
+ },
8147
+ {
8148
+ "name": "--slider-track-background",
8149
+ "value": "hsl(var(--primary) / 0.2)",
8150
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8151
+ },
8152
+ {
8153
+ "name": "--slider-range-background",
8154
+ "value": "hsl(var(--primary))",
8155
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8156
+ },
8079
8157
  {
8080
8158
  "name": "--color-picker-input-width",
8081
8159
  "value": "6.5rem",
8082
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8160
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8083
8161
  },
8084
8162
  {
8085
8163
  "name": "--command-list-max-height",
8086
8164
  "value": "min(300px, 50vh)",
8087
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8165
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8088
8166
  },
8089
8167
  {
8090
8168
  "name": "--command-input-padding-x",
8091
8169
  "value": "var(--space-3)",
8092
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8170
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8093
8171
  },
8094
8172
  {
8095
8173
  "name": "--command-group-padding",
8096
8174
  "value": "var(--space-1)",
8097
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8175
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8098
8176
  },
8099
8177
  {
8100
8178
  "name": "--command-item-padding-y",
8101
8179
  "value": "var(--space-2)",
8102
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8180
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8103
8181
  },
8104
8182
  {
8105
8183
  "name": "--command-item-padding-x",
8106
8184
  "value": "var(--space-2)",
8107
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8185
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8108
8186
  },
8109
8187
  {
8110
8188
  "name": "--search-input-edge-inset",
8111
8189
  "value": "var(--space-3)",
8112
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8190
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8113
8191
  },
8114
8192
  {
8115
8193
  "name": "--search-input-start-padding",
8116
8194
  "value": "calc( var(--search-input-edge-inset) + var(--control-icon-size) + var(--control-gap) )",
8117
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8195
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8118
8196
  },
8119
8197
  {
8120
8198
  "name": "--search-input-end-padding",
8121
8199
  "value": "calc( var(--search-input-edge-inset) + var(--control-icon-size) + var(--control-gap) )",
8122
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8200
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8123
8201
  },
8124
8202
  {
8125
8203
  "name": "--choice-description-font-size",
8126
8204
  "value": "var(--font-size-xs)",
8127
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8205
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8128
8206
  },
8129
8207
  {
8130
8208
  "name": "--color-picker-hex-font-size",
8131
8209
  "value": "var(--font-size-xs)",
8132
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8210
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8133
8211
  },
8134
8212
  {
8135
8213
  "name": "--command-group-heading-font-size",
8136
8214
  "value": "var(--font-size-xs)",
8137
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8215
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8138
8216
  },
8139
8217
  {
8140
8218
  "name": "--search-input-label-font-size",
8141
8219
  "value": "var(--font-size-xs)",
8142
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8220
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8143
8221
  },
8144
8222
  {
8145
8223
  "name": "--tag-input-chip-font-size",
8146
8224
  "value": "var(--font-size-xs)",
8147
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8225
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8148
8226
  },
8149
8227
  {
8150
8228
  "name": "--toggle-sm-font-size",
8151
8229
  "value": "var(--font-size-xs)",
8152
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8230
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8153
8231
  },
8154
8232
  {
8155
8233
  "name": "--button-sm-font-size",
8156
8234
  "value": "var(--font-size-xs)",
8157
- "description": "Adjacent control sizes, derived from the active --control-height. The \xB1step * is scaled too so the whole control ladder stays proportional under --scaling."
8235
+ "description": 'Checked/on/active fills \u2014 themeable role expression, defaults equal the current literal * (quiet: no visual change). A service retints the "selected" state by overriding these.'
8158
8236
  },
8159
8237
  {
8160
8238
  "name": "--control-height-compact",
@@ -8186,6 +8264,51 @@ var COMPONENT_TOKENS = [
8186
8264
  "value": "var(--font-size-xs)",
8187
8265
  "description": "Data-display component tokens \u2014 small-by-design text knobs (rule #45/#46)."
8188
8266
  },
8267
+ {
8268
+ "name": "--avatar-background",
8269
+ "value": "hsl(var(--muted))",
8270
+ "description": "Avatar surface \u2014 reads the muted role by default. A service can re-tint the placeholder fill once (e.g. --avatar-background: hsl(var(--accent)))."
8271
+ },
8272
+ {
8273
+ "name": "--avatar-tint",
8274
+ "value": "transparent",
8275
+ "description": "Optional role wash over the avatar (default transparent = invisible, rule #44). Painted as an overlay so a service sets --avatar-tint: hsl(var(--primary) / 0.08)."
8276
+ },
8277
+ {
8278
+ "name": "--progress-track-background",
8279
+ "value": "hsl(var(--secondary))",
8280
+ "description": "Progress track + fill \u2014 quiet defaults equal the current literals (rule #44). Track reads secondary, fill reads success; a service re-tones once."
8281
+ },
8282
+ {
8283
+ "name": "--progress-fill-background",
8284
+ "value": "hsl(var(--success))",
8285
+ "description": "Progress track + fill \u2014 quiet defaults equal the current literals (rule #44). Track reads secondary, fill reads success; a service re-tones once."
8286
+ },
8287
+ {
8288
+ "name": "--timeline-dot-done-background",
8289
+ "value": "hsl(var(--success))",
8290
+ "description": "Timeline accents \u2014 dot/line roles, defaults unchanged (rule #44)."
8291
+ },
8292
+ {
8293
+ "name": "--timeline-dot-current-background",
8294
+ "value": "hsl(var(--primary))",
8295
+ "description": "Timeline accents \u2014 dot/line roles, defaults unchanged (rule #44)."
8296
+ },
8297
+ {
8298
+ "name": "--timeline-line-completed-background",
8299
+ "value": "hsl(var(--primary))",
8300
+ "description": "Timeline accents \u2014 dot/line roles, defaults unchanged (rule #44)."
8301
+ },
8302
+ {
8303
+ "name": "--tree-item-active-border",
8304
+ "value": "hsl(var(--primary) / 0.3)",
8305
+ "description": "Tree active item \u2014 border + soft bg tint over the primary role. Defaults equal the current literals (rule #44)."
8306
+ },
8307
+ {
8308
+ "name": "--tree-item-active-background",
8309
+ "value": "hsl(var(--primary) / 0.05)",
8310
+ "description": "Tree active item \u2014 border + soft bg tint over the primary role. Defaults equal the current literals (rule #44)."
8311
+ },
8189
8312
  {
8190
8313
  "name": "--password-strength-score-font-size",
8191
8314
  "value": "var(--font-size-xs)",
@@ -8196,6 +8319,11 @@ var COMPONENT_TOKENS = [
8196
8319
  "value": "var(--font-size-xs)",
8197
8320
  "description": "Data-entry component tokens \u2014 small-by-design text knobs (rule #45/#46)."
8198
8321
  },
8322
+ {
8323
+ "name": "--descriptions-label-width",
8324
+ "value": "8rem",
8325
+ "description": 'Width of the label column when <Descriptions layout="horizontal">. Labels align to this * shared column so the values line up (the horizontal-detail look, mirroring <Form layout>). * A rem value gives a fixed aligned column; set `max-content` to size each label to its text. * (rule #44/#45 \u2014 a service theme tunes it here instead of forking CSS.)'
8326
+ },
8199
8327
  {
8200
8328
  "name": "--dialog-space-x",
8201
8329
  "value": "var(--space-chrome-x)",
@@ -8251,35 +8379,55 @@ var COMPONENT_TOKENS = [
8251
8379
  "value": "0.3",
8252
8380
  "description": "Soft (subtle) semantic tint ratios \u2014 themeable so a service can hit its exact spec * (a brand's success-bg/-border are often more present than the faint 5%/30% default)."
8253
8381
  },
8382
+ {
8383
+ "name": "--dialog-content-glow",
8384
+ "value": "0 0 0 0 transparent",
8385
+ "description": "Brand glow layer for the raised dialog/sheet panel \u2014 invisible no-op at rest (rule #44). * Paired AFTER --shadow-lg in the surface box-shadow so a service can wash the overlay with the * global glow, e.g. --dialog-content-glow: var(--shadow-glow), with no markup change."
8386
+ },
8254
8387
  {
8255
8388
  "name": "--empty-state-space-y",
8256
8389
  "value": "var(--space-10)",
8257
- "description": "Soft (subtle) semantic tint ratios \u2014 themeable so a service can hit its exact spec * (a brand's success-bg/-border are often more present than the faint 5%/30% default)."
8390
+ "description": "Brand glow layer for the raised dialog/sheet panel \u2014 invisible no-op at rest (rule #44). * Paired AFTER --shadow-lg in the surface box-shadow so a service can wash the overlay with the * global glow, e.g. --dialog-content-glow: var(--shadow-glow), with no markup change."
8258
8391
  },
8259
8392
  {
8260
8393
  "name": "--empty-state-space-x",
8261
8394
  "value": "var(--space-6)",
8262
- "description": "Soft (subtle) semantic tint ratios \u2014 themeable so a service can hit its exact spec * (a brand's success-bg/-border are often more present than the faint 5%/30% default)."
8395
+ "description": "Brand glow layer for the raised dialog/sheet panel \u2014 invisible no-op at rest (rule #44). * Paired AFTER --shadow-lg in the surface box-shadow so a service can wash the overlay with the * global glow, e.g. --dialog-content-glow: var(--shadow-glow), with no markup change."
8396
+ },
8397
+ {
8398
+ "name": "--empty-state-icon-foreground",
8399
+ "value": "hsl(var(--muted-foreground))",
8400
+ "description": "EmptyState icon medallion colour \u2014 defaults to the current literal (rule #44), so a service can * recolour the glyph (--icon-foreground) or wash the medallion fill (--icon-tint) without forking."
8401
+ },
8402
+ {
8403
+ "name": "--empty-state-icon-tint",
8404
+ "value": "hsl(var(--muted))",
8405
+ "description": "EmptyState icon medallion colour \u2014 defaults to the current literal (rule #44), so a service can * recolour the glyph (--icon-foreground) or wash the medallion fill (--icon-tint) without forking."
8263
8406
  },
8264
8407
  {
8265
8408
  "name": "--skeleton-row-gap",
8266
8409
  "value": "var(--space-stack-sm)",
8267
- "description": "Soft (subtle) semantic tint ratios \u2014 themeable so a service can hit its exact spec * (a brand's success-bg/-border are often more present than the faint 5%/30% default)."
8410
+ "description": "EmptyState icon medallion colour \u2014 defaults to the current literal (rule #44), so a service can * recolour the glyph (--icon-foreground) or wash the medallion fill (--icon-tint) without forking."
8268
8411
  },
8269
8412
  {
8270
8413
  "name": "--skeleton-cell-gap",
8271
8414
  "value": "var(--space-inline-lg)",
8272
- "description": "Soft (subtle) semantic tint ratios \u2014 themeable so a service can hit its exact spec * (a brand's success-bg/-border are often more present than the faint 5%/30% default)."
8415
+ "description": "EmptyState icon medallion colour \u2014 defaults to the current literal (rule #44), so a service can * recolour the glyph (--icon-foreground) or wash the medallion fill (--icon-tint) without forking."
8273
8416
  },
8274
8417
  {
8275
8418
  "name": "--skeleton-card-inset",
8276
8419
  "value": "var(--space-section-active)",
8277
- "description": "Soft (subtle) semantic tint ratios \u2014 themeable so a service can hit its exact spec * (a brand's success-bg/-border are often more present than the faint 5%/30% default)."
8420
+ "description": "EmptyState icon medallion colour \u2014 defaults to the current literal (rule #44), so a service can * recolour the glyph (--icon-foreground) or wash the medallion fill (--icon-tint) without forking."
8278
8421
  },
8279
8422
  {
8280
8423
  "name": "--skeleton-radius",
8281
8424
  "value": "var(--radius)",
8282
- "description": "Soft (subtle) semantic tint ratios \u2014 themeable so a service can hit its exact spec * (a brand's success-bg/-border are often more present than the faint 5%/30% default)."
8425
+ "description": "EmptyState icon medallion colour \u2014 defaults to the current literal (rule #44), so a service can * recolour the glyph (--icon-foreground) or wash the medallion fill (--icon-tint) without forking."
8426
+ },
8427
+ {
8428
+ "name": "--skeleton-background",
8429
+ "value": "hsl(var(--muted))",
8430
+ "description": "Skeleton placeholder fill \u2014 defaults to the current literal hsl(var(--muted)); themeable so a * service can tint the shimmer to its surface (rule #44) without forking the keyframes."
8283
8431
  },
8284
8432
  {
8285
8433
  "name": "--form-label-width",
@@ -8366,6 +8514,16 @@ var COMPONENT_TOKENS = [
8366
8514
  "value": "var(--font-size-xs)",
8367
8515
  "description": "Navigation primitive tokens: pagination, filters, compact pickers."
8368
8516
  },
8517
+ {
8518
+ "name": "--menubar-item-hover-background",
8519
+ "value": "hsl(var(--accent))",
8520
+ "description": "Menu item hover/highlight tint \u2014 reads the accent role; default unchanged."
8521
+ },
8522
+ {
8523
+ "name": "--menubar-item-hover-foreground",
8524
+ "value": "hsl(var(--accent-foreground))",
8525
+ "description": "Menu item hover/highlight tint \u2014 reads the accent role; default unchanged."
8526
+ },
8369
8527
  {
8370
8528
  "name": "--sidebar-section-label-font-size",
8371
8529
  "value": "var(--font-size-2xs)",
@@ -8421,6 +8579,36 @@ var COMPONENT_TOKENS = [
8421
8579
  "value": "var(--font-size-xs)",
8422
8580
  "description": "Shell (sidebar / topbar / kbd) component tokens \u2014 small-by-design text * knobs (rule #45/#46). A service re-tunes chrome text without moving the * global scale."
8423
8581
  },
8582
+ {
8583
+ "name": "--sidebar-gradient",
8584
+ "value": "none",
8585
+ "description": "Brand-chrome gradient hooks \u2014 opt-in, invisible by default. A service paints * the sidebar/topbar surface by setting these to a gradient (no-op = none)."
8586
+ },
8587
+ {
8588
+ "name": "--topbar-gradient",
8589
+ "value": "none",
8590
+ "description": "Brand-chrome gradient hooks \u2014 opt-in, invisible by default. A service paints * the sidebar/topbar surface by setting these to a gradient (no-op = none)."
8591
+ },
8592
+ {
8593
+ "name": "--sidebar-item-active-color",
8594
+ "value": "hsl(var(--primary))",
8595
+ "description": "Sidebar active-item tint/marker \u2014 tokenised from the literal hsl(var(--primary)) * usages; defaults are byte-identical to the prior hard-coded values. A service * can re-tune the active sub-item accent without forking CSS."
8596
+ },
8597
+ {
8598
+ "name": "--sidebar-item-active-tint",
8599
+ "value": "hsl(var(--primary))",
8600
+ "description": "Sidebar active-item tint/marker \u2014 tokenised from the literal hsl(var(--primary)) * usages; defaults are byte-identical to the prior hard-coded values. A service * can re-tune the active sub-item accent without forking CSS."
8601
+ },
8602
+ {
8603
+ "name": "--sidebar-item-active-background",
8604
+ "value": "hsl(var(--accent))",
8605
+ "description": "Main nav-item active row \u2014 defaults are byte-identical to the hover state (accent bg, * foreground text). A service overrides these to brand the selected row (e.g. a gold tint + * gold text on a navy sidebar)."
8606
+ },
8607
+ {
8608
+ "name": "--sidebar-item-active-foreground",
8609
+ "value": "hsl(var(--foreground))",
8610
+ "description": "Main nav-item active row \u2014 defaults are byte-identical to the hover state (accent bg, * foreground text). A service overrides these to brand the selected row (e.g. a gold tint + * gold text on a navy sidebar)."
8611
+ },
8424
8612
  {
8425
8613
  "name": "--table-row-height-compact",
8426
8614
  "value": "1.75rem",
@@ -8456,10 +8644,35 @@ var COMPONENT_TOKENS = [
8456
8644
  "value": "var(--font-size-xs)",
8457
8645
  "description": "Table component tokens: row height, cell padding."
8458
8646
  },
8647
+ {
8648
+ "name": "--table-header-background",
8649
+ "value": "hsl(var(--muted))",
8650
+ "description": "Header band \u2014 its OWN bg + fg tokens (decoupled from --secondary, which == --muted by default so * this is byte-identical). A brand whose --secondary is dark (navy buttons) no longer bleeds a * dark band under the dark header text; it sets both header tokens together to keep contrast."
8651
+ },
8652
+ {
8653
+ "name": "--table-header-foreground",
8654
+ "value": "hsl(var(--muted-foreground))",
8655
+ "description": "Header band \u2014 its OWN bg + fg tokens (decoupled from --secondary, which == --muted by default so * this is byte-identical). A brand whose --secondary is dark (navy buttons) no longer bleeds a * dark band under the dark header text; it sets both header tokens together to keep contrast."
8656
+ },
8459
8657
  {
8460
8658
  "name": "--table-pin-shadow",
8461
8659
  "value": "-6px 0 6px -5px hsl(var(--foreground) / 0.12)",
8462
8660
  "description": "Inline-end shadow that lifts a pinned (sticky) action column off the body it scrolls over."
8661
+ },
8662
+ {
8663
+ "name": "--table-row-striped-background",
8664
+ "value": "hsl(var(--muted) / 0.4)",
8665
+ "description": "Row-state tint washes \u2014 translucent muted over the opaque base. Defaults equal * the prior literals; a service retints by reading another role (e.g. --primary)."
8666
+ },
8667
+ {
8668
+ "name": "--table-row-hover-background",
8669
+ "value": "hsl(var(--muted) / 0.5)",
8670
+ "description": "Row-state tint washes \u2014 translucent muted over the opaque base. Defaults equal * the prior literals; a service retints by reading another role (e.g. --primary)."
8671
+ },
8672
+ {
8673
+ "name": "--table-row-selected-background",
8674
+ "value": "hsl(var(--muted) / 0.3)",
8675
+ "description": "Row-state tint washes \u2014 translucent muted over the opaque base. Defaults equal * the prior literals; a service retints by reading another role (e.g. --primary)."
8463
8676
  }
8464
8677
  ];
8465
8678
 
@@ -12518,7 +12731,7 @@ ${c.example}
12518
12731
  // package.json
12519
12732
  var package_default = {
12520
12733
  name: "@godxjp/ui-mcp",
12521
- version: "15.0.0",
12734
+ version: "16.5.0",
12522
12735
  description: "Model Context Protocol server for @godxjp/ui \u2014 gives Claude Code / Codex CLI / Cursor / any MCP-aware agent live access to the component catalog, prop vocabulary, design tokens, 45 cardinal rules, copy-paste-ready patterns, 12 design / taste skills synthesised from Leonxlnx/taste-skill, 20+ anti-AI-tell patterns, and a 50-check redesign audit \u2014 token-efficient (list \u2192 drill-down).",
12523
12736
  type: "module",
12524
12737
  main: "./dist/index.js",