@loworbitstudio/visor 1.3.4 → 1.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "0.4.0",
3
- "generated_at": "2026-05-30T23:15:47.105Z",
3
+ "generated_at": "2026-06-04T00:42:59.544Z",
4
4
  "components": {
5
5
  "accessibility-specimen": {
6
6
  "category": "specimen",
@@ -239,6 +239,10 @@
239
239
  {
240
240
  "name": "AlertDescription",
241
241
  "description": "Secondary descriptive text below the title."
242
+ },
243
+ {
244
+ "name": "AlertActions",
245
+ "description": "Right-aligned, gap-aware row for inline action buttons (e.g. retry/dismiss)."
242
246
  }
243
247
  ],
244
248
  "dependencies": [
@@ -254,6 +258,7 @@
254
258
  "--radius-lg",
255
259
  "--shadow-sm",
256
260
  "--spacing-1",
261
+ "--spacing-2",
257
262
  "--spacing-3",
258
263
  "--spacing-4",
259
264
  "--surface-card",
@@ -301,6 +306,10 @@
301
306
  {
302
307
  "name": "AvatarFallback",
303
308
  "description": "Centered fallback content (initials or icon) shown when image is unavailable."
309
+ },
310
+ {
311
+ "name": "AvatarStack",
312
+ "description": "Compound primitive for overlapping avatar groups with a `+N` overflow indicator. Accepts an array of image sources (`avatars`), a `total` count (supports server-truncated lists), a `max` cap (default 6), a `size` pass-through (`\"sm\" | \"default\" | \"lg\"`, default `\"sm\"`), and an optional accessible `label` override. Renders `role=\"img\"` with `data-slot=\"avatar-stack\"`.\n"
304
313
  }
305
314
  ],
306
315
  "dependencies": [
@@ -335,6 +344,7 @@
335
344
  "default",
336
345
  "secondary",
337
346
  "outline",
347
+ "neutral",
338
348
  "destructive",
339
349
  "success",
340
350
  "warning",
@@ -342,14 +352,26 @@
342
352
  "filled-destructive",
343
353
  "filled-success",
344
354
  "filled-warning",
345
- "filled-info"
355
+ "filled-info",
356
+ "filled-neutral"
357
+ ],
358
+ "size": [
359
+ "sm",
360
+ "md",
361
+ "lg"
346
362
  ]
347
363
  },
348
364
  "props": [
349
365
  {
350
366
  "name": "variant",
351
- "type": "\"default\" | \"secondary\" | \"outline\" | \"destructive\" | \"success\" | \"warning\" | \"info\" | \"filled-destructive\" | \"filled-success\" | \"filled-warning\" | \"filled-info\"",
367
+ "type": "\"default\" | \"secondary\" | \"outline\" | \"neutral\" | \"destructive\" | \"success\" | \"warning\" | \"info\" | \"filled-destructive\" | \"filled-success\" | \"filled-warning\" | \"filled-info\" | \"filled-neutral\"",
352
368
  "default": "\"default\""
369
+ },
370
+ {
371
+ "name": "size",
372
+ "type": "\"sm\" | \"md\" | \"lg\"",
373
+ "default": "\"md\"",
374
+ "description": "Controls token-driven padding, font-size, gap, and embedded-icon scaling. `md` (the default) reproduces the original badge sizing exactly — existing call sites are unchanged. `sm` is tighter for dense inline data contexts; `lg` is larger for editorial contexts like page headers and stat-card status pills. Icons inside the badge scale with the size step.\n"
353
375
  }
354
376
  ],
355
377
  "dependencies": [
@@ -358,8 +380,11 @@
358
380
  "tokens_used": [
359
381
  "--border-default",
360
382
  "--border-focus",
383
+ "--color-neutral-600",
384
+ "--color-white",
361
385
  "--focus-ring-offset",
362
386
  "--focus-ring-width",
387
+ "--font-size-sm",
363
388
  "--font-size-xs",
364
389
  "--font-weight-medium",
365
390
  "--interactive-primary-bg",
@@ -371,10 +396,12 @@
371
396
  "--radius-full",
372
397
  "--spacing-1",
373
398
  "--spacing-2",
399
+ "--spacing-3",
374
400
  "--surface-error-default",
375
401
  "--surface-error-subtle",
376
402
  "--surface-info-default",
377
403
  "--surface-info-subtle",
404
+ "--surface-muted",
378
405
  "--surface-subtle",
379
406
  "--surface-success-default",
380
407
  "--surface-success-subtle",
@@ -384,10 +411,11 @@
384
411
  "--text-info",
385
412
  "--text-inverse",
386
413
  "--text-primary",
414
+ "--text-secondary",
387
415
  "--text-success",
388
416
  "--text-warning"
389
417
  ],
390
- "example": "<Badge variant=\"default\">Active</Badge>\n<Badge variant=\"secondary\">Draft</Badge>\n<Badge variant=\"outline\">v2.1.0</Badge>\n<Badge variant=\"destructive\">Error</Badge>\n<Badge variant=\"success\">Published</Badge>\n<Badge variant=\"warning\">Pending</Badge>\n<Badge variant=\"info\">Beta</Badge>\n<Badge variant=\"filled-destructive\">Critical</Badge>\n"
418
+ "example": "<Badge variant=\"default\">Active</Badge>\n<Badge variant=\"secondary\">Secondary</Badge>\n<Badge variant=\"outline\">v2.1.0</Badge>\n<Badge variant=\"neutral\">Draft</Badge>\n<Badge variant=\"destructive\">Error</Badge>\n<Badge variant=\"success\">Published</Badge>\n<Badge variant=\"warning\">Pending</Badge>\n<Badge variant=\"info\">Beta</Badge>\n<Badge variant=\"filled-destructive\">Critical</Badge>\n\n{/* Sizes — sm for dense inline data, md (default) inline, lg for headers/pills */}\n<Badge size=\"sm\" variant=\"secondary\">v2.1.0</Badge>\n<Badge size=\"md\" variant=\"success\">Published</Badge>\n<Badge size=\"lg\" variant=\"info\">Beta</Badge>\n"
391
419
  },
392
420
  "banner": {
393
421
  "category": "feedback",
@@ -970,12 +998,26 @@
970
998
  "name": "disabled",
971
999
  "type": "boolean",
972
1000
  "default": false
1001
+ },
1002
+ {
1003
+ "name": "gated",
1004
+ "type": "boolean",
1005
+ "default": false,
1006
+ "description": "Renders the button in an inert permission-gated state — visually dimmed, cursor not-allowed, and click handlers suppressed. Uses aria-disabled instead of native disabled so the button stays keyboard-focusable (required for the tooltip to be reachable by keyboard and screen-reader users). Works orthogonally with all variants and sizes.\n"
1007
+ },
1008
+ {
1009
+ "name": "gatedReason",
1010
+ "type": "string",
1011
+ "default": "undefined",
1012
+ "description": "Explanation surfaced in an anchored Radix tooltip when the button is gated. Only rendered when gated is also true. A TooltipProvider ancestor is required whenever gatedReason is set — add one at the page or layout level. Example: \"You can't delete this — you're not an owner\".\n"
973
1013
  }
974
1014
  ],
975
1015
  "dependencies": [
976
- "class-variance-authority"
1016
+ "class-variance-authority",
1017
+ "@radix-ui/react-tooltip"
977
1018
  ],
978
1019
  "tokens_used": [
1020
+ "--border-default",
979
1021
  "--border-focus",
980
1022
  "--border-strong",
981
1023
  "--focus-ring-offset",
@@ -997,6 +1039,8 @@
997
1039
  "--interactive-secondary-text",
998
1040
  "--motion-duration-150",
999
1041
  "--motion-easing-default",
1042
+ "--opacity-50",
1043
+ "--primary",
1000
1044
  "--radius-md",
1001
1045
  "--spacing-2",
1002
1046
  "--spacing-3",
@@ -1005,7 +1049,7 @@
1005
1049
  "--surface-muted",
1006
1050
  "--text-primary"
1007
1051
  ],
1008
- "example": "<Button variant=\"default\" size=\"md\">Save changes</Button>\n\n<Button variant=\"destructive\">Delete account</Button>\n\n<Button variant=\"ghost\" size=\"sm\">Cancel</Button>\n"
1052
+ "example": "<Button variant=\"default\" size=\"md\">Save changes</Button>\n\n<Button variant=\"destructive\">Delete account</Button>\n\n<Button variant=\"ghost\" size=\"sm\">Cancel</Button>\n\n{/* Gated — no reason (tooltip suppressed) */}\n<Button gated>Delete organization</Button>\n\n{/* Gated with reason — tooltip shown on hover/focus */}\n<TooltipProvider>\n <Button gated gatedReason=\"You can't delete this — you're not an owner\">\n Delete organization\n </Button>\n</TooltipProvider>\n"
1009
1053
  },
1010
1054
  "calendar": {
1011
1055
  "category": "form",
@@ -1367,6 +1411,7 @@
1367
1411
  "--interactive-primary-text",
1368
1412
  "--motion-duration-150",
1369
1413
  "--motion-easing-default",
1414
+ "--primary",
1370
1415
  "--radius-sm"
1371
1416
  ],
1372
1417
  "example": "<div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Checkbox id=\"terms\" />\n <Label htmlFor=\"terms\">Accept terms and conditions</Label>\n</div>\n"
@@ -1465,7 +1510,7 @@
1465
1510
  {
1466
1511
  "name": "FilterChip",
1467
1512
  "element": "button",
1468
- "description": "Toggle-style multi-select chip. Renders with role=\"checkbox\" and aria-checked. Use inside a ChipGroup with type=\"multiple\".",
1513
+ "description": "Toggle-style multi-select chip. Renders with role=\"checkbox\" and aria-checked. Use inside a ChipGroup with type=\"multiple\". Supports an optional count pill for quick-filter pivots (e.g. \"Active 47\").",
1469
1514
  "props": [
1470
1515
  {
1471
1516
  "name": "selected",
@@ -1481,6 +1526,18 @@
1481
1526
  "name": "value",
1482
1527
  "type": "string",
1483
1528
  "optional": true
1529
+ },
1530
+ {
1531
+ "name": "count",
1532
+ "type": "React.ReactNode",
1533
+ "optional": true,
1534
+ "description": "Count pill rendered after the label. Accepts strings, numbers, or elements. Part of the accessible button name."
1535
+ },
1536
+ {
1537
+ "name": "countTone",
1538
+ "type": "\"primary\" | \"neutral\"",
1539
+ "default": "\"neutral\"",
1540
+ "description": "Tone for the count pill. \"neutral\" uses muted surface; \"primary\" uses accent surface. Auto re-tones on selected state."
1484
1541
  }
1485
1542
  ]
1486
1543
  }
@@ -1517,7 +1574,7 @@
1517
1574
  "--text-primary",
1518
1575
  "--text-secondary"
1519
1576
  ],
1520
- "example": "<Chip label=\"React\" />\n<Chip label=\"Featured\" onDeleted={() => removeTag(\"featured\")} />\n<ChoiceChip label=\"Compact\" selected={density === \"compact\"} onPressed={() => setDensity(\"compact\")} />\n<FilterChip label=\"Events\" selected={filters.includes(\"events\")} onPressed={() => toggleFilter(\"events\")} />\n"
1577
+ "example": "<Chip label=\"React\" />\n<Chip label=\"Featured\" onDeleted={() => removeTag(\"featured\")} />\n<ChoiceChip label=\"Compact\" selected={density === \"compact\"} onPressed={() => setDensity(\"compact\")} />\n<FilterChip label=\"Events\" selected={filters.includes(\"events\")} onPressed={() => toggleFilter(\"events\")} />\n<FilterChip label=\"All\" count={132} onPressed={() => setFilter(\"all\")} />\n<FilterChip label=\"Active\" count={47} countTone=\"primary\" selected onPressed={() => setFilter(\"active\")} />\n<FilterChip label=\"Suspended\" count={8} onPressed={() => setFilter(\"suspended\")} />\n"
1521
1578
  },
1522
1579
  "chrome-button": {
1523
1580
  "category": "admin",
@@ -1566,7 +1623,6 @@
1566
1623
  "class-variance-authority"
1567
1624
  ],
1568
1625
  "tokens_used": [
1569
- "--accent-primary",
1570
1626
  "--border-focus",
1571
1627
  "--focus-ring-offset",
1572
1628
  "--focus-ring-width",
@@ -1579,6 +1635,7 @@
1579
1635
  "--motion-duration-150",
1580
1636
  "--motion-easing-default",
1581
1637
  "--opacity-50",
1638
+ "--primary",
1582
1639
  "--radius-md",
1583
1640
  "--spacing-1",
1584
1641
  "--spacing-2",
@@ -2024,6 +2081,9 @@
2024
2081
  "--border-default",
2025
2082
  "--border-focus",
2026
2083
  "--border-strong",
2084
+ "--combobox-bg",
2085
+ "--combobox-border",
2086
+ "--field-menu-bg",
2027
2087
  "--focus-ring-width",
2028
2088
  "--font-size-sm",
2029
2089
  "--font-size-xs",
@@ -2031,6 +2091,7 @@
2031
2091
  "--interactive-primary-bg",
2032
2092
  "--motion-duration-150",
2033
2093
  "--motion-easing-default",
2094
+ "--primary",
2034
2095
  "--radius-lg",
2035
2096
  "--radius-md",
2036
2097
  "--radius-sm",
@@ -2172,6 +2233,9 @@
2172
2233
  "severity": [
2173
2234
  "info",
2174
2235
  "warning",
2236
+ "destructive"
2237
+ ],
2238
+ "severity_deprecated": [
2175
2239
  "danger"
2176
2240
  ]
2177
2241
  },
@@ -2180,7 +2244,7 @@
2180
2244
  "name": "title",
2181
2245
  "type": "React.ReactNode",
2182
2246
  "required": true,
2183
- "description": "Dialog title. Rendered next to the severity icon."
2247
+ "description": "Dialog title. Rendered below the severity icon plate in the dialog header."
2184
2248
  },
2185
2249
  {
2186
2250
  "name": "description",
@@ -2194,9 +2258,9 @@
2194
2258
  },
2195
2259
  {
2196
2260
  "name": "severity",
2197
- "type": "'info' | 'warning' | 'danger'",
2261
+ "type": "'info' | 'warning' | 'destructive' | 'danger'",
2198
2262
  "default": "warning",
2199
- "description": "Drives icon, icon color, and confirm button variant."
2263
+ "description": "Drives icon, tinted icon plate, and confirm button variant. Use \"info\", \"warning\", or \"destructive\". The value \"danger\" is a deprecated alias for \"destructive\" and will be removed in the next major version.\n"
2200
2264
  },
2201
2265
  {
2202
2266
  "name": "trigger",
@@ -2221,7 +2285,7 @@
2221
2285
  {
2222
2286
  "name": "confirmLabel",
2223
2287
  "type": "React.ReactNode",
2224
- "description": "Confirm button label. Defaults to \"Delete\" for danger, \"Confirm\" otherwise."
2288
+ "description": "Confirm button label. Defaults to \"Delete\" for destructive/danger severity, \"Confirm\" otherwise."
2225
2289
  },
2226
2290
  {
2227
2291
  "name": "cancelLabel",
@@ -2272,19 +2336,23 @@
2272
2336
  "--motion-easing-default",
2273
2337
  "--radius-md",
2274
2338
  "--spacing-1",
2339
+ "--spacing-10",
2275
2340
  "--spacing-2",
2276
2341
  "--spacing-3",
2277
2342
  "--spacing-4",
2278
2343
  "--spacing-5",
2279
2344
  "--spacing-6",
2345
+ "--surface-error-subtle",
2346
+ "--surface-info-subtle",
2280
2347
  "--surface-page",
2348
+ "--surface-warning-subtle",
2281
2349
  "--text-error",
2282
2350
  "--text-info",
2283
2351
  "--text-primary",
2284
2352
  "--text-secondary",
2285
2353
  "--text-warning"
2286
2354
  ],
2287
- "example": "<ConfirmDialog\n trigger={<Button variant=\"destructive\">Delete project</Button>}\n severity=\"danger\"\n title=\"Delete project?\"\n description=\"This action cannot be undone. All associated data will be permanently removed.\"\n confirmText=\"acme\"\n onConfirm={async () => {\n await deleteProject()\n }}\n/>\n"
2355
+ "example": "<ConfirmDialog\n trigger={<Button variant=\"destructive\">Delete project</Button>}\n severity=\"destructive\"\n title=\"Delete project?\"\n description=\"This action cannot be undone. All associated data will be permanently removed.\"\n confirmText=\"acme\"\n onConfirm={async () => {\n await deleteProject()\n }}\n/>\n"
2288
2356
  },
2289
2357
  "container": {
2290
2358
  "category": "layout",
@@ -2682,6 +2750,7 @@
2682
2750
  "--border-default",
2683
2751
  "--border-focus",
2684
2752
  "--border-strong",
2753
+ "--field-menu-bg",
2685
2754
  "--focus-ring-offset",
2686
2755
  "--focus-ring-width",
2687
2756
  "--font-size-sm",
@@ -2750,6 +2819,7 @@
2750
2819
  "--border-default",
2751
2820
  "--border-focus",
2752
2821
  "--border-strong",
2822
+ "--field-menu-bg",
2753
2823
  "--focus-ring-offset",
2754
2824
  "--focus-ring-width",
2755
2825
  "--font-size-sm",
@@ -2907,7 +2977,13 @@
2907
2977
  "name": "variant",
2908
2978
  "type": "'default' | 'destructive'",
2909
2979
  "default": "default",
2910
- "description": "Visual style for the menu item"
2980
+ "description": "Visual style for the menu item (DropdownMenuItem)"
2981
+ },
2982
+ {
2983
+ "name": "variant (DropdownMenuContent / DropdownMenuSubContent)",
2984
+ "type": "'default' | 'breakout'",
2985
+ "default": "default",
2986
+ "description": "Elevation variant for the menu container. Use \"breakout\" inside scroll-clipped containers like DataTable rows, sticky toolbars, or any overflow:hidden ancestor. The breakout variant raises z-index to 200 and deepens the shadow so the menu escapes the stacking context. The \"default\" value is byte-identical to pre-variant rendering — no consumer migration required.\n"
2911
2987
  }
2912
2988
  ],
2913
2989
  "sub_components": [
@@ -2921,7 +2997,7 @@
2921
2997
  },
2922
2998
  {
2923
2999
  "name": "DropdownMenuContent",
2924
- "description": "The floating menu container."
3000
+ "description": "The floating menu container. Accepts variant=\"breakout\" for scroll-clipped contexts."
2925
3001
  },
2926
3002
  {
2927
3003
  "name": "DropdownMenuItem",
@@ -2965,7 +3041,7 @@
2965
3041
  },
2966
3042
  {
2967
3043
  "name": "DropdownMenuSubContent",
2968
- "description": "The nested sub-menu container."
3044
+ "description": "The nested sub-menu container. Accepts variant=\"breakout\" for scroll-clipped contexts."
2969
3045
  },
2970
3046
  {
2971
3047
  "name": "DropdownMenuPortal",
@@ -2987,6 +3063,7 @@
2987
3063
  "--radius-lg",
2988
3064
  "--radius-md",
2989
3065
  "--shadow-lg",
3066
+ "--shadow-xl",
2990
3067
  "--spacing-1",
2991
3068
  "--spacing-2",
2992
3069
  "--spacing-3",
@@ -3993,9 +4070,13 @@
3993
4070
  "--border-error",
3994
4071
  "--border-focus",
3995
4072
  "--border-strong",
4073
+ "--focus-ring-offset",
3996
4074
  "--focus-ring-width",
3997
4075
  "--font-size-base",
3998
4076
  "--font-size-sm",
4077
+ "--input-bg",
4078
+ "--input-bg-invalid",
4079
+ "--input-border",
3999
4080
  "--motion-duration-150",
4000
4081
  "--motion-easing-default",
4001
4082
  "--radius-sm",
@@ -4005,6 +4086,7 @@
4005
4086
  "--spacing-4",
4006
4087
  "--spacing-4_5",
4007
4088
  "--spacing-5",
4089
+ "--surface-error-subtle",
4008
4090
  "--surface-interactive-default",
4009
4091
  "--text-primary",
4010
4092
  "--text-secondary"
@@ -4080,6 +4162,69 @@
4080
4162
  ],
4081
4163
  "example": "<Kbd>⌘K</Kbd>\n<Kbd keys={[\"⌘\", \"K\"]} />\n<Kbd keys={[\"Ctrl\", \"K\"]} separator=\"+\" size=\"lg\" variant=\"outline\" />\n"
4082
4164
  },
4165
+ "key-value-list": {
4166
+ "category": "data-display",
4167
+ "description": "Definition-list display primitive for one record's attributes — label/value pairs in a responsive grid. Values accept any node (Badge, AvatarStack, StatHero, ScoreIndicator, text).",
4168
+ "when_to_use": [
4169
+ "The \"key facts\" panel atop a detail / inspector page (org detail, user detail, billing summary)",
4170
+ "Rendering a single record's attributes as label/value pairs",
4171
+ "A 4-up editorial facts row with rich value nodes (badges, avatar stacks, stat figures, score rings)"
4172
+ ],
4173
+ "when_not_to_use": [
4174
+ "Many records in rows and columns (use DataTable)",
4175
+ "A single large KPI figure with delta / trend (use StatCard or StatHero)",
4176
+ "Editable form fields (use the Field family)"
4177
+ ],
4178
+ "props": [
4179
+ {
4180
+ "name": "items",
4181
+ "type": "KeyValueItem[]",
4182
+ "description": "The label/value pairs. Each item is { label, value, hint? } with ReactNode fields."
4183
+ },
4184
+ {
4185
+ "name": "columns",
4186
+ "type": "1 | 2 | 3 | 4",
4187
+ "default": "1",
4188
+ "description": "Grid column count; collapses responsively on narrow viewports."
4189
+ },
4190
+ {
4191
+ "name": "orientation",
4192
+ "type": "\"horizontal\" | \"stacked\"",
4193
+ "default": "\"stacked\"",
4194
+ "description": "stacked = label above value (facts panel); horizontal = label beside value (inspector)."
4195
+ },
4196
+ {
4197
+ "name": "density",
4198
+ "type": "\"compact\" | \"default\" | \"editorial\"",
4199
+ "default": "\"editorial\"",
4200
+ "description": "Row density; editorial is the admin-ui default."
4201
+ },
4202
+ {
4203
+ "name": "as",
4204
+ "type": "\"dl\" | \"div\"",
4205
+ "default": "\"dl\"",
4206
+ "description": "Root element; dl renders semantic <dl>/<dt>/<dd>, div opts out."
4207
+ }
4208
+ ],
4209
+ "dependencies": [],
4210
+ "tokens_used": [
4211
+ "--font-size-base",
4212
+ "--font-size-lg",
4213
+ "--font-size-sm",
4214
+ "--font-size-xs",
4215
+ "--font-weight-medium",
4216
+ "--font-weight-normal",
4217
+ "--spacing-1",
4218
+ "--spacing-2",
4219
+ "--spacing-3",
4220
+ "--spacing-4",
4221
+ "--spacing-6",
4222
+ "--spacing-8",
4223
+ "--text-primary",
4224
+ "--text-tertiary"
4225
+ ],
4226
+ "example": "<KeyValueList\n columns={4}\n items={[\n { label: \"Plan\", value: <Badge tone=\"info\">Enterprise</Badge> },\n { label: \"Members\", value: <AvatarStack avatars={avatars} total={142} />, hint: \"142 total\" },\n { label: \"Monthly revenue\", value: <StatHero value=\"$48,200\" /> },\n { label: \"Health score\", value: <ScoreIndicator value={98} max={100} />, hint: \"/ 100\" },\n ]}\n/>\n"
4227
+ },
4083
4228
  "label": {
4084
4229
  "category": "form",
4085
4230
  "description": "An accessible label component built on Radix UI Label.",
@@ -4678,6 +4823,8 @@
4678
4823
  "--font-size-sm",
4679
4824
  "--motion-duration-150",
4680
4825
  "--motion-easing-default",
4826
+ "--number-input-bg",
4827
+ "--number-input-border",
4681
4828
  "--radius-md",
4682
4829
  "--surface-interactive-default",
4683
4830
  "--surface-interactive-hover",
@@ -4769,6 +4916,8 @@
4769
4916
  "--font-weight-medium",
4770
4917
  "--motion-duration-150",
4771
4918
  "--motion-easing-default",
4919
+ "--otp-bg",
4920
+ "--otp-border",
4772
4921
  "--radius-md",
4773
4922
  "--spacing-2",
4774
4923
  "--surface-interactive-default",
@@ -5084,7 +5233,8 @@
5084
5233
  "Displaying a small form or filter controls near a trigger",
5085
5234
  "Rich content previews that need more space than a tooltip",
5086
5235
  "Non-modal floating panels for settings or options",
5087
- "Date pickers or color pickers anchored to an input"
5236
+ "Date pickers or color pickers anchored to an input",
5237
+ "Single-select or multi-select option lists inside a filter popover (use PopoverSelectionList)"
5088
5238
  ],
5089
5239
  "when_not_to_use": [
5090
5240
  "Simple text hints on hover (use Tooltip)",
@@ -5121,23 +5271,58 @@
5121
5271
  {
5122
5272
  "name": "PopoverAnchor",
5123
5273
  "description": "Optional custom anchor element for positioning."
5274
+ },
5275
+ {
5276
+ "name": "PopoverFooter",
5277
+ "description": "Right-aligned action row separated from the body by a top border. Hosts a primary/secondary button pair (e.g. Apply/Cancel) for filter popovers, inline editors, and lightweight confirms.\n"
5278
+ },
5279
+ {
5280
+ "name": "PopoverSelectionList",
5281
+ "description": "WAI-ARIA listbox container for single- or multi-select option lists. Takes a mode prop (\"checkbox\" | \"radio\", default \"checkbox\") that propagates to all child PopoverSelectionItem elements via context. Implements roving-tabindex keyboard navigation (Arrow Up/Down, Home/End, Enter/Space, Esc closes via Radix).\n"
5282
+ },
5283
+ {
5284
+ "name": "PopoverSelectionItem",
5285
+ "description": "A selectable option row inside PopoverSelectionList. Renders role=\"option\" with aria-selected, aria-disabled, and an always-rendered indicator plate (checkbox: filled square on selection; radio: ring with dot on selection). Accepts selected, onSelect, disabled, count, and leadingIcon props.\n"
5286
+ },
5287
+ {
5288
+ "name": "PopoverSelectionLabel",
5289
+ "description": "A non-interactive label heading row for a PopoverSelectionList, styled as a small-caps section header.\n"
5124
5290
  }
5125
5291
  ],
5126
5292
  "dependencies": [
5127
- "@radix-ui/react-popover"
5293
+ "@radix-ui/react-popover",
5294
+ "@phosphor-icons/react"
5128
5295
  ],
5129
5296
  "tokens_used": [
5297
+ "--border-default",
5298
+ "--focus-ring-offset",
5299
+ "--focus-ring-width",
5300
+ "--font-size-sm",
5301
+ "--font-size-xs",
5302
+ "--hairline-strong",
5303
+ "--interactive-primary-text",
5130
5304
  "--motion-duration-fast",
5305
+ "--motion-easing-default",
5131
5306
  "--motion-easing-enter",
5132
5307
  "--motion-easing-exit",
5308
+ "--opacity-40",
5309
+ "--primary",
5133
5310
  "--radius-lg",
5311
+ "--radius-md",
5134
5312
  "--shadow-lg",
5313
+ "--spacing-1",
5314
+ "--spacing-2",
5315
+ "--spacing-3",
5135
5316
  "--spacing-4",
5317
+ "--stroke-width-thin",
5136
5318
  "--surface-card",
5319
+ "--surface-interactive-hover",
5137
5320
  "--surface-popover",
5138
- "--text-primary"
5321
+ "--surface-subtle",
5322
+ "--text-primary",
5323
+ "--text-secondary"
5139
5324
  ],
5140
- "example": "<Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Open settings</Button>\n </PopoverTrigger>\n <PopoverContent>\n <p>Popover content here</p>\n </PopoverContent>\n</Popover>\n"
5325
+ "example": "<Popover>\n <PopoverTrigger asChild>\n <Button variant=\"outline\">Filter</Button>\n </PopoverTrigger>\n <PopoverContent>\n <p>Filter options here</p>\n <PopoverFooter>\n <Button variant=\"ghost\">Cancel</Button>\n <Button>Apply</Button>\n </PopoverFooter>\n </PopoverContent>\n</Popover>\n"
5141
5326
  },
5142
5327
  "progress": {
5143
5328
  "category": "feedback",
@@ -5179,8 +5364,10 @@
5179
5364
  ],
5180
5365
  "tokens_used": [
5181
5366
  "--interactive-primary-bg",
5182
- "--motion-duration-300",
5367
+ "--motion-duration-1500",
5183
5368
  "--motion-easing-default",
5369
+ "--primary",
5370
+ "--progress-animation-duration",
5184
5371
  "--radius-full",
5185
5372
  "--surface-interactive-active",
5186
5373
  "--surface-muted"
@@ -5293,6 +5480,8 @@
5293
5480
  "--interactive-primary-text",
5294
5481
  "--motion-duration-150",
5295
5482
  "--motion-easing-default",
5483
+ "--primary",
5484
+ "--radio-border",
5296
5485
  "--spacing-2"
5297
5486
  ],
5298
5487
  "example": "<RadioGroup defaultValue=\"medium\">\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RadioGroupItem value=\"small\" id=\"small\" />\n <Label htmlFor=\"small\">Small</Label>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RadioGroupItem value=\"medium\" id=\"medium\" />\n <Label htmlFor=\"medium\">Medium</Label>\n </div>\n <div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <RadioGroupItem value=\"large\" id=\"large\" />\n <Label htmlFor=\"large\">Large</Label>\n </div>\n</RadioGroup>\n"
@@ -5647,6 +5836,7 @@
5647
5836
  "--border-error",
5648
5837
  "--border-focus",
5649
5838
  "--border-strong",
5839
+ "--field-menu-bg",
5650
5840
  "--focus-ring-width",
5651
5841
  "--font-size-base",
5652
5842
  "--font-size-sm",
@@ -5659,6 +5849,8 @@
5659
5849
  "--radix-select-content-available-height",
5660
5850
  "--radix-select-trigger-height",
5661
5851
  "--radix-select-trigger-width",
5852
+ "--select-bg",
5853
+ "--select-border",
5662
5854
  "--shadow-lg",
5663
5855
  "--spacing-1",
5664
5856
  "--spacing-2",
@@ -6081,6 +6273,7 @@
6081
6273
  "--interactive-primary-bg-hover",
6082
6274
  "--motion-duration-150",
6083
6275
  "--motion-easing-default",
6276
+ "--primary",
6084
6277
  "--shadow-sm",
6085
6278
  "--surface-card",
6086
6279
  "--surface-interactive-default",
@@ -6214,7 +6407,7 @@
6214
6407
  {
6215
6408
  "name": "color",
6216
6409
  "type": "string",
6217
- "default": "var(--accent-primary)",
6410
+ "default": "var(--primary, currentColor)",
6218
6411
  "description": "Stroke color. Accepts any CSS color string — token, hex, hsl, oklch."
6219
6412
  },
6220
6413
  {
@@ -6236,7 +6429,13 @@
6236
6429
  }
6237
6430
  ],
6238
6431
  "dependencies": [],
6239
- "tokens_used": [],
6432
+ "tokens_used": [
6433
+ "--motion-duration-1500",
6434
+ "--motion-easing-ease-out",
6435
+ "--sparkline-animation-duration",
6436
+ "--sparkline-animation-easing",
6437
+ "--sparkline-length"
6438
+ ],
6240
6439
  "example": "<Sparkline values={[12, 18, 22, 19, 27, 36, 41, 48, 54, 62, 71, 84]} />\n<Sparkline values={[12, 18, 22, 19, 27, 36, 41, 48, 54, 62, 71, 84]} width={120} height={32} />\n<Sparkline values={[12, 18, 22, 19, 27, 36, 41, 48, 54, 62, 71, 84]} color=\"var(--text-success)\" />\n<Sparkline values={[12, 18, 22, 19, 27, 36, 41, 48, 54, 62, 71, 84]} fluid />\n<Sparkline values={[12, 18, 22, 19, 27, 36, 41, 48, 54, 62, 71, 84]} aria-label=\"RSVPs over the last 12 weeks\" />\n"
6241
6440
  },
6242
6441
  "stack": {
@@ -6594,6 +6793,7 @@
6594
6793
  "Labeling service health (healthy, degraded, down)",
6595
6794
  "Labeling job or task lifecycle (queued, running, pending, complete, failed, idle)",
6596
6795
  "Labeling admin-ui event state (live, warn, scheduled, sold, draft)",
6796
+ "Labeling CRM / pipeline stage (prospect, pitched, contracted, active, paused, completed, archived)",
6597
6797
  {
6598
6798
  "Any place you want a consistent \"Status": "X\" accessible announcement"
6599
6799
  }
@@ -6618,7 +6818,14 @@
6618
6818
  "warn",
6619
6819
  "scheduled",
6620
6820
  "sold",
6621
- "draft"
6821
+ "draft",
6822
+ "prospect",
6823
+ "pitched",
6824
+ "contracted",
6825
+ "active",
6826
+ "paused",
6827
+ "completed",
6828
+ "archived"
6622
6829
  ],
6623
6830
  "tone": [
6624
6831
  "subtle",
@@ -6660,6 +6867,7 @@
6660
6867
  "badge"
6661
6868
  ],
6662
6869
  "tokens_used": [
6870
+ "--color-white",
6663
6871
  "--motion-duration-800",
6664
6872
  "--motion-easing-standard",
6665
6873
  "--radius-full",
@@ -6792,6 +7000,7 @@
6792
7000
  "--line-height-snug",
6793
7001
  "--motion-duration-200",
6794
7002
  "--motion-easing-default",
7003
+ "--primary",
6795
7004
  "--radius-full",
6796
7005
  "--spacing-1",
6797
7006
  "--spacing-2",
@@ -6903,8 +7112,10 @@
6903
7112
  "--interactive-primary-bg",
6904
7113
  "--motion-duration-150",
6905
7114
  "--motion-easing-default",
7115
+ "--primary",
6906
7116
  "--shadow-sm",
6907
- "--surface-page"
7117
+ "--surface-page",
7118
+ "--switch-track-bg"
6908
7119
  ],
6909
7120
  "example": "<div style={{ display: \"flex\", alignItems: \"center\", gap: \"0.5rem\" }}>\n <Switch id=\"notifications\" />\n <Label htmlFor=\"notifications\">Enable notifications</Label>\n</div>\n"
6910
7121
  },
@@ -7029,7 +7240,20 @@
7029
7240
  },
7030
7241
  {
7031
7242
  "name": "TabsTrigger",
7032
- "description": "Clickable tab button tied to a content panel via matching value prop."
7243
+ "description": "Clickable tab button tied to a content panel via matching value prop.",
7244
+ "props": [
7245
+ {
7246
+ "name": "count",
7247
+ "type": "React.ReactNode",
7248
+ "description": "Optional inline count pill rendered after the label. Accepts strings, numbers, or elements. Omit to render the trigger without a pill."
7249
+ },
7250
+ {
7251
+ "name": "countTone",
7252
+ "type": "\"primary\" | \"neutral\"",
7253
+ "default": "\"neutral\"",
7254
+ "description": "Visual tone of the count pill when inactive. Active state (data-state=\"active\") re-tones the pill automatically regardless of this prop."
7255
+ }
7256
+ ]
7033
7257
  },
7034
7258
  {
7035
7259
  "name": "TabsContent",
@@ -7046,6 +7270,7 @@
7046
7270
  "--focus-ring-offset",
7047
7271
  "--focus-ring-width",
7048
7272
  "--font-size-sm",
7273
+ "--font-size-xs",
7049
7274
  "--font-weight-medium",
7050
7275
  "--motion-duration-150",
7051
7276
  "--motion-duration-normal",
@@ -7055,13 +7280,15 @@
7055
7280
  "--shadow-sm",
7056
7281
  "--spacing-1",
7057
7282
  "--spacing-2",
7283
+ "--surface-accent-subtle",
7058
7284
  "--surface-muted",
7059
7285
  "--surface-page",
7060
7286
  "--tabs-indicator-color",
7287
+ "--text-link",
7061
7288
  "--text-primary",
7062
7289
  "--text-secondary"
7063
7290
  ],
7064
- "example": "<Tabs defaultValue=\"overview\">\n <TabsList variant=\"default\">\n <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n <TabsTrigger value=\"settings\">Settings</TabsTrigger>\n </TabsList>\n <TabsContent value=\"overview\">Overview content here.</TabsContent>\n <TabsContent value=\"settings\">Settings content here.</TabsContent>\n</Tabs>\n"
7291
+ "example": "<Tabs defaultValue=\"members\">\n <TabsList variant=\"default\">\n <TabsTrigger value=\"members\" count={12}>Members</TabsTrigger>\n <TabsTrigger value=\"pending\" count={3}>Pending</TabsTrigger>\n <TabsTrigger value=\"roles\" count={4}>Roles</TabsTrigger>\n </TabsList>\n <TabsContent value=\"members\">Members content here.</TabsContent>\n <TabsContent value=\"pending\">Pending content here.</TabsContent>\n <TabsContent value=\"roles\">Roles content here.</TabsContent>\n</Tabs>\n"
7065
7292
  },
7066
7293
  "tag-input": {
7067
7294
  "category": "form",
@@ -7127,6 +7354,8 @@
7127
7354
  "--spacing-2",
7128
7355
  "--surface-interactive-default",
7129
7356
  "--surface-muted",
7357
+ "--tag-input-bg",
7358
+ "--tag-input-border",
7130
7359
  "--text-primary",
7131
7360
  "--text-secondary"
7132
7361
  ],
@@ -7282,7 +7511,9 @@
7282
7511
  "--spacing-5",
7283
7512
  "--surface-interactive-default",
7284
7513
  "--text-primary",
7285
- "--text-secondary"
7514
+ "--text-secondary",
7515
+ "--textarea-bg",
7516
+ "--textarea-border"
7286
7517
  ],
7287
7518
  "example": "<Textarea placeholder=\"Write your message...\" rows={4} />\n\n<Textarea aria-invalid=\"true\" />\n"
7288
7519
  },
@@ -7427,6 +7658,7 @@
7427
7658
  "--line-height-snug",
7428
7659
  "--motion-duration-150",
7429
7660
  "--motion-easing-default",
7661
+ "--primary",
7430
7662
  "--radius-full",
7431
7663
  "--spacing-1",
7432
7664
  "--spacing-3",
@@ -7487,6 +7719,7 @@
7487
7719
  "--motion-duration-normal",
7488
7720
  "--motion-easing-enter",
7489
7721
  "--motion-easing-exit",
7722
+ "--primary",
7490
7723
  "--radius-lg",
7491
7724
  "--radius-md",
7492
7725
  "--shadow-lg",
@@ -7589,6 +7822,7 @@
7589
7822
  "--motion-duration-150",
7590
7823
  "--motion-duration-200",
7591
7824
  "--motion-easing-default",
7825
+ "--primary",
7592
7826
  "--radius-lg",
7593
7827
  "--radius-md",
7594
7828
  "--radius-sm",
@@ -8537,23 +8771,6 @@
8537
8771
  "Single-record inline edits (use admin-detail-drawer)"
8538
8772
  ]
8539
8773
  },
8540
- "avatar-stack": {
8541
- "category": "data-display",
8542
- "description": "Overlapping avatar group with a `+N more` overflow indicator. Pure composition of the Avatar primitive, no new tokens or ARIA pattern.",
8543
- "components_used": [
8544
- "avatar"
8545
- ],
8546
- "when_to_use": [
8547
- "Compact summary of multiple members on a card or facts row",
8548
- "Member presence indicators on org-detail, project, or workspace summaries",
8549
- "Server-truncated lists where the total count is known but only the first few avatar URLs were sent down"
8550
- ],
8551
- "when_not_to_use": [
8552
- "Single-user contexts (use Avatar directly)",
8553
- "Full member directories (use a paginated list or table)",
8554
- "Interactive selection of members (use a list block with checkboxes)"
8555
- ]
8556
- },
8557
8774
  "chip-group": {
8558
8775
  "category": "form",
8559
8776
  "description": "A composable container managing selection state for ChoiceChip (single-select) and FilterChip (multi-select) chips. Mirrors Flutter Material's chip selection model.",
@@ -8768,21 +8985,23 @@
8768
8985
  },
8769
8986
  "login-form": {
8770
8987
  "category": "authentication",
8771
- "description": "A login form block using Visor form components (Button, Input, Label, Card).",
8988
+ "description": "A login form block using Visor form components (Button, Input, Label, Card), with optional OAuth provider buttons.",
8772
8989
  "components_used": [
8773
8990
  "button",
8774
8991
  "input",
8775
8992
  "field",
8776
- "card"
8993
+ "card",
8994
+ "separator",
8995
+ "alert"
8777
8996
  ],
8778
8997
  "when_to_use": [
8779
8998
  "Authentication pages",
8780
8999
  "Sign-in screens",
9000
+ "OAuth and social sign-in flows",
8781
9001
  "Demo login flows"
8782
9002
  ],
8783
9003
  "when_not_to_use": [
8784
- "Registration forms (extend with additional fields)",
8785
- "OAuth-only flows with no email/password fields"
9004
+ "Registration forms (extend with additional fields)"
8786
9005
  ]
8787
9006
  },
8788
9007
  "pricing-section": {
@@ -9644,6 +9863,7 @@
9644
9863
  "bento-grid",
9645
9864
  "card",
9646
9865
  "chart",
9866
+ "key-value-list",
9647
9867
  "marquee",
9648
9868
  "name-roster",
9649
9869
  "sparkline",
@@ -10582,6 +10802,13 @@
10582
10802
  "defaultLight": "800ms",
10583
10803
  "defaultDark": "800ms"
10584
10804
  },
10805
+ {
10806
+ "name": "--motion-duration-1500",
10807
+ "tier": "primitive",
10808
+ "description": "Primitive motion duration: 1500ms",
10809
+ "defaultLight": "1500ms",
10810
+ "defaultDark": "1500ms"
10811
+ },
10585
10812
  {
10586
10813
  "name": "--motion-easing-linear",
10587
10814
  "tier": "primitive",
@@ -11585,7 +11812,7 @@
11585
11812
  "tier": "adaptive",
11586
11813
  "description": "Adaptive surface: success-subtle",
11587
11814
  "defaultLight": "#f0fdf4",
11588
- "defaultDark": "#14532d"
11815
+ "defaultDark": "var(--color-mix(in srgb, var(--color-success-900) 12%, var(--surface-card)))"
11589
11816
  },
11590
11817
  {
11591
11818
  "name": "--surface-success-default",
@@ -11599,7 +11826,7 @@
11599
11826
  "tier": "adaptive",
11600
11827
  "description": "Adaptive surface: warning-subtle",
11601
11828
  "defaultLight": "#fffbeb",
11602
- "defaultDark": "#78350f"
11829
+ "defaultDark": "var(--color-mix(in srgb, var(--color-warning-900) 12%, var(--surface-card)))"
11603
11830
  },
11604
11831
  {
11605
11832
  "name": "--surface-warning-default",
@@ -11613,7 +11840,7 @@
11613
11840
  "tier": "adaptive",
11614
11841
  "description": "Adaptive surface: error-subtle",
11615
11842
  "defaultLight": "#fef2f2",
11616
- "defaultDark": "#7f1d1d"
11843
+ "defaultDark": "var(--color-mix(in srgb, var(--color-error-900) 12%, var(--surface-card)))"
11617
11844
  },
11618
11845
  {
11619
11846
  "name": "--surface-error-default",
@@ -11627,7 +11854,7 @@
11627
11854
  "tier": "adaptive",
11628
11855
  "description": "Adaptive surface: info-subtle",
11629
11856
  "defaultLight": "#f0f9ff",
11630
- "defaultDark": "#0c4a6e"
11857
+ "defaultDark": "var(--color-mix(in srgb, var(--color-info-900) 12%, var(--surface-card)))"
11631
11858
  },
11632
11859
  {
11633
11860
  "name": "--surface-info-default",
@@ -11953,7 +12180,7 @@
11953
12180
  }
11954
12181
  ],
11955
12182
  "summary": {
11956
- "total": 311
12183
+ "total": 312
11957
12184
  }
11958
12185
  }
11959
12186
  }