@loworbitstudio/visor 1.31.0 → 1.35.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-10-03T23:23:41.691Z",
3
+ "generated_at": "2026-10-04T07:08:34.766Z",
4
4
  "components": {
5
5
  "accessibility-specimen": {
6
6
  "category": "specimen",
@@ -880,6 +880,76 @@
880
880
  ],
881
881
  "example": "<BentoGrid cols={{ base: 1, md: 2 }} gap=\"4\">\n <BentoTile span=\"full\" aspect=\"21/9\">\n <BentoTileMedia src=\"/projects/knowmentum.jpg\" alt=\"Knowmentum project hero\" />\n <BentoTileBody>\n <h3>Knowmentum</h3>\n <p>Knowledge platform for high-performers.</p>\n </BentoTileBody>\n </BentoTile>\n\n <BentoTile span=\"half\" aspect=\"2/1\" href=\"https://animal.nyc/\" target=\"_blank\">\n <BentoTileMedia src=\"/projects/animal-nyc.jpg\" alt=\"Animal NYC\" />\n <BentoTileBody>\n <h3>Animal NYC</h3>\n </BentoTileBody>\n </BentoTile>\n\n <BentoTile span=\"half\" aspect=\"2/1\" href=\"https://animal.la/\" target=\"_blank\">\n <BentoTileMedia src=\"/projects/animal-la.jpg\" alt=\"Animal LA\" />\n <BentoTileBody>\n <h3>Animal LA</h3>\n </BentoTileBody>\n </BentoTile>\n\n <BentoTile span=\"half\" aspect=\"4/3\" fit=\"contain\">\n <BentoTileMedia src=\"/logos/client-logo.png\" alt=\"Client logo\" />\n <BentoTileBody>\n <p>Natural-fit logo tile</p>\n </BentoTileBody>\n </BentoTile>\n</BentoGrid>\n"
882
882
  },
883
+ "bottom-nav": {
884
+ "category": "navigation",
885
+ "description": "A bottom navigation bar of icon destinations for phone widths. Filled active destination, an optional unread mark, a hairline group break, safe-area padding, and its height published as --bottom-nav-height.",
886
+ "when_to_use": [
887
+ "The primary destinations of an app at phone width, as a row fixed to the foot of the screen (the desktop rail becomes the foot bar)",
888
+ "3 to 7 top-level destinations that each deserve one tap",
889
+ "A destination that sometimes has something waiting on it (an unread dot on Inbox)"
890
+ ],
891
+ "when_not_to_use": [
892
+ "A top bar of site links (use Navbar)",
893
+ "A collapsible side rail on wide screens (use Sidebar)",
894
+ "Switching a view in place without changing the page (use SegmentedControl or Tabs)",
895
+ "More than 7 destinations (group the rest behind one More destination)"
896
+ ],
897
+ "variants": {
898
+ "showLabels": [
899
+ true,
900
+ false
901
+ ],
902
+ "fixed": [
903
+ true,
904
+ false
905
+ ]
906
+ },
907
+ "props": [
908
+ {
909
+ "name": "items",
910
+ "type": "{ label: string; icon: BottomNavIcon; href?: string; onSelect?: (e) => void; active?: boolean; mark?: boolean | number; markLabel?: string; group?: string; key?: string }[]",
911
+ "description": "The destinations, in order. A hairline is drawn before the first destination of each new group."
912
+ },
913
+ {
914
+ "name": "showLabels",
915
+ "type": "boolean",
916
+ "default": false,
917
+ "description": "Show each label under its icon. Otherwise the label is visually hidden."
918
+ },
919
+ {
920
+ "name": "fixed",
921
+ "type": "boolean",
922
+ "default": true,
923
+ "description": "Pin to the foot of the viewport and publish --bottom-nav-height on the document root."
924
+ }
925
+ ],
926
+ "dependencies": [],
927
+ "tokens_used": [
928
+ "--accent",
929
+ "--border-default",
930
+ "--border-focus",
931
+ "--focus-ring-offset",
932
+ "--focus-ring-width",
933
+ "--font-size-xs",
934
+ "--font-weight-medium",
935
+ "--hairline",
936
+ "--hairline-width",
937
+ "--motion-duration-150",
938
+ "--motion-easing-default",
939
+ "--radius-md",
940
+ "--separator-color",
941
+ "--spacing-1",
942
+ "--spacing-12",
943
+ "--spacing-2",
944
+ "--stroke-width-thin",
945
+ "--surface-card",
946
+ "--surface-interactive-active",
947
+ "--surface-interactive-hover",
948
+ "--text-primary",
949
+ "--text-secondary"
950
+ ],
951
+ "example": "<BottomNav\n aria-label=\"Workspace\"\n items={[\n { label: \"Edit\", icon: PencilSimple, href: \"/edit\", active: true },\n { label: \"Inbox\", icon: Tray, href: \"/inbox\", mark: 3 },\n { label: \"Team\", icon: UsersThree, href: \"/team\", group: \"admin\" },\n { label: \"Settings\", icon: Gear, href: \"/settings\", group: \"admin\" },\n ]}\n/>\n"
952
+ },
883
953
  "box": {
884
954
  "category": "layout",
885
955
  "description": "Universal layout wrapper for padding, margin, background, border, and border-radius via Visor design tokens.",
@@ -1220,24 +1290,29 @@
1220
1290
  "--border-focus",
1221
1291
  "--border-strong",
1222
1292
  "--button-dlg-font-size",
1293
+ "--button-dlg-font-weight",
1223
1294
  "--button-dlg-letter-spacing",
1224
1295
  "--button-dlg-radius",
1225
1296
  "--button-dlg-text-transform",
1297
+ "--button-font-weight",
1226
1298
  "--button-icon-ghost-color",
1227
1299
  "--button-icon-pad",
1228
1300
  "--button-icon-radius",
1229
1301
  "--button-icon-size",
1230
1302
  "--button-letter-spacing",
1231
1303
  "--button-lg-font-size",
1304
+ "--button-lg-font-weight",
1232
1305
  "--button-lg-letter-spacing",
1233
1306
  "--button-lg-radius",
1234
1307
  "--button-lg-text-transform",
1235
1308
  "--button-md-font-size",
1309
+ "--button-md-font-weight",
1236
1310
  "--button-md-letter-spacing",
1237
1311
  "--button-md-radius",
1238
1312
  "--button-md-text-transform",
1239
1313
  "--button-radius",
1240
1314
  "--button-sm-font-size",
1315
+ "--button-sm-font-weight",
1241
1316
  "--button-sm-letter-spacing",
1242
1317
  "--button-sm-radius",
1243
1318
  "--button-sm-text-transform",
@@ -3440,6 +3515,30 @@
3440
3515
  "name": "disabled",
3441
3516
  "type": "boolean",
3442
3517
  "default": "false"
3518
+ },
3519
+ {
3520
+ "name": "align",
3521
+ "type": "\"start\" | \"center\" | \"end\"",
3522
+ "default": "\"start\"",
3523
+ "description": "Popover alignment against the trigger. Use \"end\" under a full-width trigger so the calendar does not sit against the right edge."
3524
+ },
3525
+ {
3526
+ "name": "sideOffset",
3527
+ "type": "number",
3528
+ "default": "4",
3529
+ "description": "Gap in px between the trigger and the popover"
3530
+ },
3531
+ {
3532
+ "name": "collisionPadding",
3533
+ "type": "number",
3534
+ "default": "0",
3535
+ "description": "Viewport padding in px the popover keeps clear when it collides with an edge"
3536
+ },
3537
+ {
3538
+ "name": "defaultOpen",
3539
+ "type": "boolean",
3540
+ "default": "false",
3541
+ "description": "Whether the popover starts open (uncontrolled)"
3443
3542
  }
3444
3543
  ],
3445
3544
  "dependencies": [
@@ -3451,6 +3550,9 @@
3451
3550
  "--border-default",
3452
3551
  "--border-focus",
3453
3552
  "--border-strong",
3553
+ "--control-edge-color",
3554
+ "--control-edge-style",
3555
+ "--control-edge-width",
3454
3556
  "--field-menu-bg",
3455
3557
  "--focus-ring-offset",
3456
3558
  "--focus-ring-width",
@@ -5656,6 +5758,16 @@
5656
5758
  "type": "React.ReactNode",
5657
5759
  "description": "Optional leading glyph rendered inside the field (e.g. a Phosphor icon). The input reserves enough left padding to clear it."
5658
5760
  },
5761
+ {
5762
+ "name": "prefix",
5763
+ "type": "React.ReactNode",
5764
+ "description": "Fixed text before the value, inside the same well (a currency symbol). Drawn in the secondary text colour, never part of the value or the selection, and the value never runs under it. Clicking it focuses the input; it is wired to the input with aria-describedby, so assistive tech reads it as a description, not as the value. Replaces the native `prefix` HTML attribute, which is not forwarded. When set, `className` lands on the wrapper that draws the well.\n"
5765
+ },
5766
+ {
5767
+ "name": "suffix",
5768
+ "type": "React.ReactNode",
5769
+ "description": "Fixed text after the value, inside the same well (`.epk.pro`, a unit). Same behaviour as `prefix`."
5770
+ },
5659
5771
  {
5660
5772
  "name": "passwordManagers",
5661
5773
  "type": "'ignore' | 'allow'",
@@ -5665,6 +5777,8 @@
5665
5777
  ],
5666
5778
  "dependencies": [],
5667
5779
  "tokens_used": [
5780
+ "--affix-inset",
5781
+ "--affix-pad-y",
5668
5782
  "--border-default",
5669
5783
  "--border-error",
5670
5784
  "--border-focus",
@@ -5672,17 +5786,27 @@
5672
5786
  "--control-edge-color",
5673
5787
  "--control-edge-style",
5674
5788
  "--control-edge-width",
5789
+ "--control-invalid-halo-width",
5790
+ "--control-invalid-ring-width",
5675
5791
  "--control-state-edge-width",
5676
5792
  "--field-control-bg",
5677
5793
  "--focus-ring-offset",
5678
5794
  "--focus-ring-width",
5795
+ "--font-ascent",
5796
+ "--font-descent",
5679
5797
  "--font-size-base",
5680
5798
  "--font-size-sm",
5799
+ "--input-affix-color",
5800
+ "--input-affix-gap",
5681
5801
  "--input-bg",
5682
5802
  "--input-bg-invalid",
5683
5803
  "--input-border",
5804
+ "--input-box",
5684
5805
  "--input-height-lg",
5685
5806
  "--input-height-md",
5807
+ "--input-md-height",
5808
+ "--input-md-padding",
5809
+ "--input-md-radius",
5686
5810
  "--input-nudge",
5687
5811
  "--input-padding-lg",
5688
5812
  "--input-padding-md",
@@ -5695,6 +5819,7 @@
5695
5819
  "--radius-md",
5696
5820
  "--radius-sm",
5697
5821
  "--spacing-1",
5822
+ "--spacing-2",
5698
5823
  "--spacing-3",
5699
5824
  "--spacing-3_5",
5700
5825
  "--spacing-4",
@@ -5707,7 +5832,7 @@
5707
5832
  "--text-primary",
5708
5833
  "--text-secondary"
5709
5834
  ],
5710
- "example": "<Input type=\"email\" placeholder=\"you@example.com\" />\n\n<Input type=\"password\" passwordManagers=\"allow\" aria-invalid=\"true\" />\n"
5835
+ "example": "<Input type=\"email\" placeholder=\"you@example.com\" />\n\n<Input suffix=\".epk.pro\" aria-label=\"Address\" />\n\n<Input prefix=\"€\" inputMode=\"decimal\" aria-label=\"Amount\" />\n\n<Input type=\"password\" passwordManagers=\"allow\" aria-invalid=\"true\" />\n"
5711
5836
  },
5712
5837
  "kbd": {
5713
5838
  "category": "admin",
@@ -6510,6 +6635,16 @@
6510
6635
  "type": "number",
6511
6636
  "default": "1",
6512
6637
  "description": "Increment/decrement step size."
6638
+ },
6639
+ {
6640
+ "name": "prefix",
6641
+ "type": "React.ReactNode",
6642
+ "description": "Fixed text before the value, inside the same well (a currency symbol). Same treatment as Input's prefix; replaces the native `prefix` attribute."
6643
+ },
6644
+ {
6645
+ "name": "suffix",
6646
+ "type": "React.ReactNode",
6647
+ "description": "Fixed text after the value, inside the same well (a unit such as `h` or `m`)."
6513
6648
  }
6514
6649
  ],
6515
6650
  "dependencies": [
@@ -6518,21 +6653,31 @@
6518
6653
  "tokens_used": [
6519
6654
  "--border-default",
6520
6655
  "--border-focus",
6656
+ "--control-edge-color",
6657
+ "--control-edge-style",
6658
+ "--control-edge-width",
6659
+ "--control-state-edge-width",
6521
6660
  "--focus-ring-offset",
6522
6661
  "--focus-ring-width",
6662
+ "--font-ascent",
6663
+ "--font-descent",
6523
6664
  "--font-size-sm",
6665
+ "--input-affix-color",
6666
+ "--input-affix-gap",
6667
+ "--input-nudge",
6524
6668
  "--motion-duration-150",
6525
6669
  "--motion-easing-default",
6526
6670
  "--number-input-bg",
6527
6671
  "--number-input-border",
6528
6672
  "--radius-md",
6673
+ "--spacing-2",
6529
6674
  "--surface-interactive-default",
6530
6675
  "--surface-interactive-hover",
6531
6676
  "--surface-muted",
6532
6677
  "--text-primary",
6533
6678
  "--text-secondary"
6534
6679
  ],
6535
- "example": "<NumberInput defaultValue={1} min={0} max={10} step={1} />\n"
6680
+ "example": "<NumberInput defaultValue={1} min={0} max={10} step={1} />\n\n<NumberInput prefix=\"$\" defaultValue={150} aria-label=\"Fee\" />\n\n<NumberInput suffix=\"h\" defaultValue={2} aria-label=\"Hours\" />\n"
6536
6681
  },
6537
6682
  "offline-banner": {
6538
6683
  "category": "feedback",
@@ -6690,23 +6835,52 @@
6690
6835
  "type": "boolean",
6691
6836
  "default": "false",
6692
6837
  "description": "Auto-focus the first cell on mount."
6838
+ },
6839
+ {
6840
+ "name": "invalid",
6841
+ "type": "boolean",
6842
+ "default": "false",
6843
+ "description": "Marks every cell aria-invalid and draws the invalid edge. The digits are kept so they can be corrected."
6844
+ },
6845
+ {
6846
+ "name": "errorMessage",
6847
+ "type": "ReactNode",
6848
+ "description": "Shown under the cells while invalid, in the error text colour, as a role=alert live region. The component draws the message, so do not render a second error line."
6849
+ },
6850
+ {
6851
+ "name": "trailing",
6852
+ "type": "ReactNode",
6853
+ "description": "Trailing content beside the cells, for a working indicator (Spinner) or a resend action."
6693
6854
  }
6694
6855
  ],
6695
6856
  "dependencies": [],
6696
6857
  "tokens_used": [
6697
6858
  "--border-default",
6859
+ "--border-error",
6698
6860
  "--border-focus",
6699
6861
  "--border-strong",
6862
+ "--control-edge-color",
6863
+ "--control-edge-style",
6864
+ "--control-edge-width",
6865
+ "--control-invalid-halo-width",
6866
+ "--control-invalid-ring-width",
6867
+ "--control-state-edge-width",
6868
+ "--focus-ring-offset",
6700
6869
  "--focus-ring-width",
6701
6870
  "--font-size-lg",
6871
+ "--font-size-sm",
6702
6872
  "--font-weight-medium",
6873
+ "--font-weight-normal",
6703
6874
  "--motion-duration-150",
6704
6875
  "--motion-easing-default",
6705
6876
  "--otp-bg",
6877
+ "--otp-bg-invalid",
6706
6878
  "--otp-border",
6707
6879
  "--radius-md",
6708
6880
  "--spacing-2",
6881
+ "--surface-error-subtle",
6709
6882
  "--surface-interactive-default",
6883
+ "--text-error",
6710
6884
  "--text-primary",
6711
6885
  "--text-secondary"
6712
6886
  ],
@@ -7165,6 +7339,96 @@
7165
7339
  ],
7166
7340
  "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"
7167
7341
  },
7342
+ "position-picker": {
7343
+ "category": "form",
7344
+ "description": "A 3x3 anchor grid. Nine targets, one chosen, the value a { y, x } pair. Draws on its own ground or over a photograph.",
7345
+ "when_to_use": [
7346
+ "Choosing a focal point over a photograph (nine dots on the image)",
7347
+ "Placing a logo, title or block at one of nine anchors",
7348
+ "Any choice of one of nine positions, in two dimensions"
7349
+ ],
7350
+ "when_not_to_use": [
7351
+ "A choice along one axis only (use RadioGroup or SegmentedControl)",
7352
+ "A free-form coordinate or percentage (use Slider or two NumberInputs)",
7353
+ "Dragging a point to an exact spot (this picks from nine, it does not drag)"
7354
+ ],
7355
+ "props": [
7356
+ {
7357
+ "name": "value",
7358
+ "type": "PositionValue | null",
7359
+ "description": "Controlled value, a { y: 'top' | 'center' | 'bottom', x: 'left' | 'center' | 'right' } pair. null is controlled with nothing chosen."
7360
+ },
7361
+ {
7362
+ "name": "defaultValue",
7363
+ "type": "PositionValue | null",
7364
+ "description": "Initial value when uncontrolled."
7365
+ },
7366
+ {
7367
+ "name": "onValueChange",
7368
+ "type": "(value: PositionValue) => void",
7369
+ "description": "Called with the chosen { y, x } pair."
7370
+ },
7371
+ {
7372
+ "name": "variant",
7373
+ "type": "'default' | 'on-image'",
7374
+ "default": "'default'",
7375
+ "description": "default draws the grid on its own ground. on-image fills a positioned parent (the photograph's frame) and gives every target its own scrim ring."
7376
+ },
7377
+ {
7378
+ "name": "disabled",
7379
+ "type": "boolean",
7380
+ "default": "false",
7381
+ "description": "Disables all nine targets."
7382
+ },
7383
+ {
7384
+ "name": "renderTarget",
7385
+ "type": "(position: PositionValue, state: { selected: boolean }) => ReactNode",
7386
+ "description": "Replaces the drawn dot of one target, for example an alignment icon in the occupied row. Decorative; the target keeps its accessible name."
7387
+ }
7388
+ ],
7389
+ "dependencies": [],
7390
+ "tokens_used": [
7391
+ "--_scrim",
7392
+ "--_target",
7393
+ "--border-default",
7394
+ "--border-focus",
7395
+ "--color-black",
7396
+ "--color-white",
7397
+ "--control-edge-color",
7398
+ "--control-edge-style",
7399
+ "--control-edge-width",
7400
+ "--focus-ring-offset",
7401
+ "--focus-ring-width",
7402
+ "--interactive-primary-bg",
7403
+ "--interactive-primary-text",
7404
+ "--motion-duration-150",
7405
+ "--motion-easing-default",
7406
+ "--opacity-50",
7407
+ "--position-picker-bg",
7408
+ "--position-picker-border",
7409
+ "--position-picker-image-mark",
7410
+ "--position-picker-mark",
7411
+ "--position-picker-mark-selected",
7412
+ "--position-picker-ring",
7413
+ "--position-picker-scrim",
7414
+ "--position-picker-target-size",
7415
+ "--primary",
7416
+ "--radius-full",
7417
+ "--radius-md",
7418
+ "--radius-sm",
7419
+ "--spacing-1",
7420
+ "--spacing-3",
7421
+ "--spacing-4",
7422
+ "--spacing-6",
7423
+ "--spacing-8",
7424
+ "--stroke-width-medium",
7425
+ "--surface-subtle",
7426
+ "--text-primary",
7427
+ "--text-secondary",
7428
+ "--text-tertiary"
7429
+ ],
7430
+ "example": "<PositionPicker\n aria-label=\"Focal point\"\n defaultValue={{ y: \"center\", x: \"center\" }}\n onValueChange={(position) => console.log(position)}\n/>\n"
7431
+ },
7168
7432
  "progress": {
7169
7433
  "category": "feedback",
7170
7434
  "description": "Horizontal bar indicating completion percentage of a task.",
@@ -7439,6 +7703,12 @@
7439
7703
  "default": "\"text\"",
7440
7704
  "description": "How unsaved is drawn. dot draws a dot alone, keeping the label as visually hidden text so it is still announced."
7441
7705
  },
7706
+ {
7707
+ "name": "dot",
7708
+ "type": "boolean",
7709
+ "default": "false",
7710
+ "description": "Draws a status dot before the label in every state, in the state's ink. Its box is as wide as the larger of the two dot sizes, so the label never moves."
7711
+ },
7442
7712
  {
7443
7713
  "name": "retryLabel",
7444
7714
  "type": "string",
@@ -7464,9 +7734,11 @@
7464
7734
  "--radius-sm",
7465
7735
  "--save-status-dot-size",
7466
7736
  "--save-status-font-family",
7737
+ "--save-status-font-size",
7467
7738
  "--save-status-letter-spacing",
7468
7739
  "--save-status-syncing-color",
7469
7740
  "--save-status-text-transform",
7741
+ "--save-status-unsaved-dot-size",
7470
7742
  "--save-status-width",
7471
7743
  "--spacing-1",
7472
7744
  "--spacing-2",
@@ -7896,6 +8168,103 @@
7896
8168
  ],
7897
8169
  "example": "import Link from 'next/link'\nimport { UsersIcon, ShieldIcon, EnvelopeIcon } from '@phosphor-icons/react'\nimport { SectionNav, SectionNavItem } from '@/components/ui/section-nav/section-nav'\n\n<SectionNav aria-label=\"Organization sections\">\n <SectionNavItem asChild isActive icon={UsersIcon} label=\"Detail\">\n <Link href=\"/org/detail\" />\n </SectionNavItem>\n <SectionNavItem asChild icon={ShieldIcon} label=\"Roles\" count={4}>\n <Link href=\"/org/roles\" />\n </SectionNavItem>\n <SectionNavItem asChild icon={EnvelopeIcon} label=\"Invites\" count={2}>\n <Link href=\"/org/invites\" />\n </SectionNavItem>\n</SectionNav>\n"
7898
8170
  },
8171
+ "segmented-control": {
8172
+ "category": "form",
8173
+ "description": "A single-select pill group with a sliding active indicator, an options API and a fullWidth equal-segment layout. A thin wrapper over ToggleGroup that never goes empty.",
8174
+ "when_to_use": [
8175
+ "Switching a list or view filter between 2-5 mutually exclusive options (Unpaid / Paid / Any)",
8176
+ "A scope or range selector where exactly one option is always on",
8177
+ "Compact view-mode switches (day / week / month) that change the content below in place"
8178
+ ],
8179
+ "when_not_to_use": [
8180
+ "Navigation between pages or routes (use Tabs)",
8181
+ "Multi-select toolbar toggles (use ToggleGroup type=\"multiple\")",
8182
+ "A form answer that is submitted with the form (use Radio Group)",
8183
+ "A long list of options (use Select or Combobox)",
8184
+ "Binary on/off (use Switch)"
8185
+ ],
8186
+ "variants": {
8187
+ "size": [
8188
+ "xs",
8189
+ "sm",
8190
+ "md",
8191
+ "lg"
8192
+ ],
8193
+ "fullWidth": [
8194
+ true,
8195
+ false
8196
+ ]
8197
+ },
8198
+ "props": [
8199
+ {
8200
+ "name": "options",
8201
+ "type": "{ value: string; label: ReactNode; icon?: ReactNode; disabled?: boolean }[]",
8202
+ "description": "The segments, in order."
8203
+ },
8204
+ {
8205
+ "name": "value",
8206
+ "type": "string",
8207
+ "description": "Controlled value."
8208
+ },
8209
+ {
8210
+ "name": "defaultValue",
8211
+ "type": "string",
8212
+ "description": "Uncontrolled initial value. Falls back to the first enabled option."
8213
+ },
8214
+ {
8215
+ "name": "onValueChange",
8216
+ "type": "(value: string) => void",
8217
+ "description": "Fires with the new value. Never fires with an empty string."
8218
+ },
8219
+ {
8220
+ "name": "size",
8221
+ "type": "'xs' | 'sm' | 'md' | 'lg'",
8222
+ "default": "md"
8223
+ },
8224
+ {
8225
+ "name": "fullWidth",
8226
+ "type": "boolean",
8227
+ "default": false,
8228
+ "description": "Equal-width segments spanning the container."
8229
+ },
8230
+ {
8231
+ "name": "disabled",
8232
+ "type": "boolean",
8233
+ "default": false
8234
+ }
8235
+ ],
8236
+ "dependencies": [
8237
+ "class-variance-authority"
8238
+ ],
8239
+ "tokens_used": [
8240
+ "--border-default",
8241
+ "--border-focus",
8242
+ "--control-edge-color",
8243
+ "--control-edge-style",
8244
+ "--control-edge-width",
8245
+ "--control-state-edge-width",
8246
+ "--focus-ring-offset",
8247
+ "--focus-ring-width",
8248
+ "--font-weight-medium",
8249
+ "--interactive-primary-bg",
8250
+ "--interactive-primary-text",
8251
+ "--label-box-height",
8252
+ "--primary",
8253
+ "--radius-lg",
8254
+ "--radius-md",
8255
+ "--radius-xl",
8256
+ "--segmented-control-active-weight",
8257
+ "--segmented-control-inactive-text",
8258
+ "--segmented-control-indicator-bg",
8259
+ "--segmented-control-indicator-edge",
8260
+ "--segmented-control-indicator-text",
8261
+ "--segmented-control-radius",
8262
+ "--segmented-control-track-bg",
8263
+ "--surface-page",
8264
+ "--text-primary"
8265
+ ],
8266
+ "example": "<SegmentedControl\n aria-label=\"Payment status\"\n defaultValue=\"unpaid\"\n options={[\n { value: \"unpaid\", label: \"Unpaid\" },\n { value: \"paid\", label: \"Paid\" },\n { value: \"any\", label: \"Any\" },\n ]}\n/>\n"
8267
+ },
7899
8268
  "segmented-progress": {
7900
8269
  "category": "data-display",
7901
8270
  "description": "Discrete per-step progress meter — N equal pill segments in a row, each individually expressing done, current, or pending state. Designed for multi-step flows where individual step completion matters, not just an overall percentage.",
@@ -8043,6 +8412,8 @@
8043
8412
  "--control-edge-color",
8044
8413
  "--control-edge-style",
8045
8414
  "--control-edge-width",
8415
+ "--control-invalid-halo-width",
8416
+ "--control-invalid-ring-width",
8046
8417
  "--control-state-edge-width",
8047
8418
  "--field-control-bg",
8048
8419
  "--field-menu-bg",
@@ -8061,6 +8432,9 @@
8061
8432
  "--radix-select-trigger-width",
8062
8433
  "--select-bg",
8063
8434
  "--select-border",
8435
+ "--select-height",
8436
+ "--select-padding",
8437
+ "--select-radius",
8064
8438
  "--shadow-lg",
8065
8439
  "--spacing-1",
8066
8440
  "--spacing-2",
@@ -8105,16 +8479,25 @@
8105
8479
  "name": "decorative",
8106
8480
  "type": "boolean",
8107
8481
  "default": true,
8108
- "description": "When true, removes the separator from the accessibility tree"
8482
+ "description": "When true, removes the separator from the accessibility tree. Ignored when a label is set."
8483
+ },
8484
+ {
8485
+ "name": "label",
8486
+ "type": "ReactNode",
8487
+ "description": "Text centred on a horizontal rule, with the rule on both sides. A labelled separator is never decorative (role=\"separator\", named by the label). Ignored on a vertical separator."
8109
8488
  }
8110
8489
  ],
8111
8490
  "dependencies": [
8112
8491
  "@radix-ui/react-separator"
8113
8492
  ],
8114
8493
  "tokens_used": [
8115
- "--border-default"
8494
+ "--border-default",
8495
+ "--font-size-sm",
8496
+ "--separator-color",
8497
+ "--spacing-3",
8498
+ "--text-secondary"
8116
8499
  ],
8117
- "example": "<div>\n <h3>Section A</h3>\n <Separator />\n <h3>Section B</h3>\n</div>\n\n<div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span>Item 1</span>\n <Separator orientation=\"vertical\" />\n <span>Item 2</span>\n</div>\n"
8500
+ "example": "<div>\n <h3>Section A</h3>\n <Separator />\n <h3>Section B</h3>\n</div>\n\n<Separator label=\"or\" />\n\n<div style={{ display: \"flex\", alignItems: \"center\", gap: 8 }}>\n <span>Item 1</span>\n <Separator orientation=\"vertical\" />\n <span>Item 2</span>\n</div>\n"
8118
8501
  },
8119
8502
  "session-timeout": {
8120
8503
  "category": "overlay",
@@ -8381,11 +8764,34 @@
8381
8764
  "type": "'offcanvas' | 'icon' | 'none'",
8382
8765
  "default": "offcanvas"
8383
8766
  },
8767
+ {
8768
+ "name": "position",
8769
+ "type": "'fixed' | 'contained'",
8770
+ "default": "fixed",
8771
+ "description": "Sidebar prop. `fixed` pins the sidebar to the viewport at full height. `contained` lays it out inside its parent, so an icon rail can sit under an app bar without covering it.\n"
8772
+ },
8384
8773
  {
8385
8774
  "name": "defaultOpen",
8386
8775
  "type": "boolean",
8387
8776
  "default": true,
8388
8777
  "description": "Initial open state (SidebarProvider prop)"
8778
+ },
8779
+ {
8780
+ "name": "keyboardShortcut",
8781
+ "type": "boolean",
8782
+ "default": true,
8783
+ "description": "SidebarProvider prop. Binds Cmd/Ctrl+B to toggle the sidebar. Skipped (no preventDefault) when only collapsible=\"none\" sidebars are mounted; false never binds it.\n"
8784
+ },
8785
+ {
8786
+ "name": "asChild",
8787
+ "type": "boolean",
8788
+ "default": false,
8789
+ "description": "SidebarMenuButton prop. Renders the child (a Next Link or anchor) as the item via Radix Slot."
8790
+ },
8791
+ {
8792
+ "name": "tooltip",
8793
+ "type": "string | (TooltipContentProps & { children: ReactNode })",
8794
+ "description": "SidebarMenuButton prop. Shown in a Tooltip when the sidebar is an icon rail (collapsible=\"icon\" while collapsed, or collapsible=\"none\"); never on mobile or when expanded. A string also names the button (aria-label) unless the button sets its own. Portals into the Sidebar so a scoped theme reaches it; pass `container` to override.\n"
8389
8795
  }
8390
8796
  ],
8391
8797
  "sub_components": [
@@ -8475,6 +8881,7 @@
8475
8881
  }
8476
8882
  ],
8477
8883
  "dependencies": [
8884
+ "@radix-ui/react-slot",
8478
8885
  "class-variance-authority",
8479
8886
  "@phosphor-icons/react"
8480
8887
  ],
@@ -10166,6 +10573,12 @@
10166
10573
  "type": "boolean",
10167
10574
  "default": "false",
10168
10575
  "description": "Disables the tag input."
10576
+ },
10577
+ {
10578
+ "name": "entryAs",
10579
+ "type": "'text' | 'slot'",
10580
+ "default": "\"text\"",
10581
+ "description": "Where the next tag is typed. text types after the last tag as bare text; slot types into a dashed slot the shape of a held tag, drawn on the shared drop edge so edges off turns it off."
10169
10582
  }
10170
10583
  ],
10171
10584
  "dependencies": [
@@ -10175,6 +10588,8 @@
10175
10588
  "--border-default",
10176
10589
  "--border-focus",
10177
10590
  "--border-strong",
10591
+ "--control-drop-edge-style",
10592
+ "--control-drop-edge-width",
10178
10593
  "--control-edge-color",
10179
10594
  "--control-edge-style",
10180
10595
  "--control-edge-width",
@@ -10192,6 +10607,18 @@
10192
10607
  "--surface-muted",
10193
10608
  "--tag-input-bg",
10194
10609
  "--tag-input-border",
10610
+ "--tag-input-min-height",
10611
+ "--tag-input-padding",
10612
+ "--tag-input-radius",
10613
+ "--tag-input-slot-height",
10614
+ "--tag-input-slot-min-width",
10615
+ "--tag-input-slot-padding-x",
10616
+ "--tag-input-slot-radius",
10617
+ "--tag-input-tag-font-size",
10618
+ "--tag-input-tag-font-weight",
10619
+ "--tag-input-tag-height",
10620
+ "--tag-input-tag-padding-x",
10621
+ "--tag-input-tag-radius",
10195
10622
  "--text-primary",
10196
10623
  "--text-secondary"
10197
10624
  ],
@@ -10354,6 +10781,8 @@
10354
10781
  "--control-edge-color",
10355
10782
  "--control-edge-style",
10356
10783
  "--control-edge-width",
10784
+ "--control-invalid-halo-width",
10785
+ "--control-invalid-ring-width",
10357
10786
  "--control-state-edge-width",
10358
10787
  "--focus-ring-width",
10359
10788
  "--font-size-base",
@@ -10370,7 +10799,9 @@
10370
10799
  "--text-primary",
10371
10800
  "--text-secondary",
10372
10801
  "--textarea-bg",
10373
- "--textarea-border"
10802
+ "--textarea-border",
10803
+ "--textarea-padding",
10804
+ "--textarea-radius"
10374
10805
  ],
10375
10806
  "example": "<Textarea placeholder=\"Write your message...\" rows={4} />\n\n<Textarea aria-invalid=\"true\" />\n"
10376
10807
  },
@@ -10972,6 +11403,7 @@
10972
11403
  "tokens_used": [
10973
11404
  "--border-default",
10974
11405
  "--border-focus",
11406
+ "--focus-ring-offset",
10975
11407
  "--focus-ring-width",
10976
11408
  "--font-size-base",
10977
11409
  "--font-size-sm",
@@ -11057,6 +11489,7 @@
11057
11489
  "--spacing-3",
11058
11490
  "--surface-overlay",
11059
11491
  "--text-inverse",
11492
+ "--text-primary",
11060
11493
  "--tooltip-bg",
11061
11494
  "--tooltip-text"
11062
11495
  ],
@@ -13507,18 +13940,8 @@
13507
13940
  "toast-card",
13508
13941
  "tooltip"
13509
13942
  ],
13510
- "layout": [
13511
- "box",
13512
- "collapsible",
13513
- "container",
13514
- "grid",
13515
- "inline",
13516
- "scroll-area",
13517
- "separator",
13518
- "sidebar",
13519
- "stack"
13520
- ],
13521
13943
  "navigation": [
13944
+ "bottom-nav",
13522
13945
  "breadcrumb",
13523
13946
  "command",
13524
13947
  "doc-frame",
@@ -13532,6 +13955,17 @@
13532
13955
  "stepper",
13533
13956
  "tabs"
13534
13957
  ],
13958
+ "layout": [
13959
+ "box",
13960
+ "collapsible",
13961
+ "container",
13962
+ "grid",
13963
+ "inline",
13964
+ "scroll-area",
13965
+ "separator",
13966
+ "sidebar",
13967
+ "stack"
13968
+ ],
13535
13969
  "form": [
13536
13970
  "button",
13537
13971
  "calendar",
@@ -13554,8 +13988,10 @@
13554
13988
  "otp-input",
13555
13989
  "password-input",
13556
13990
  "phone-input",
13991
+ "position-picker",
13557
13992
  "radio-group",
13558
13993
  "search-input",
13994
+ "segmented-control",
13559
13995
  "select",
13560
13996
  "slider",
13561
13997
  "slider-control",