@loworbitstudio/visor 0.6.0 → 0.9.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-04-29T19:23:27.556Z",
3
+ "generated_at": "2026-05-12T02:11:40.675Z",
4
4
  "components": {
5
5
  "accessibility-specimen": {
6
6
  "category": "specimen",
@@ -469,6 +469,226 @@
469
469
  ],
470
470
  "example": "<Banner intent=\"warning\" position=\"sticky\">\n <BannerTitle>Scheduled maintenance</BannerTitle>\n <BannerDescription>The system will be down Saturday 2am-4am EST.</BannerDescription>\n <BannerAction>\n <Button variant=\"outline\" size=\"sm\">Learn more</Button>\n </BannerAction>\n</Banner>\n"
471
471
  },
472
+ "bento-grid": {
473
+ "category": "data-display",
474
+ "description": "An asymmetric tile grid primitive with full/half span variants, per-tile aspect ratios, and contain/cover media fit modes. Designed for portfolio, case-study, and showcase layouts.",
475
+ "when_to_use": [
476
+ "Asymmetric portfolio or case-study grids where tiles have different visual weights",
477
+ "Hero-style layouts mixing full-width feature tiles with paired half-width tiles",
478
+ "Showcase grids with varied aspect ratios (21:9, 2:1, 4:3) and image fit modes",
479
+ "Marketing pages using Apple-style \"bento\" layouts",
480
+ "Any grid where tiles intentionally have different sizes or spans"
481
+ ],
482
+ "when_not_to_use": [
483
+ "Symmetric uniform grids where all tiles are the same size (use card-grid instead)",
484
+ "Simple two-column content layouts (use CSS grid or flexbox directly)",
485
+ "List-style data displays (use Table or DataTable)",
486
+ "Pinterest-style masonry layouts where tile heights vary based on content"
487
+ ],
488
+ "props": [
489
+ {
490
+ "name": "cols",
491
+ "type": "number | { base: number; sm?: number; md?: number; lg?: number; xl?: number }",
492
+ "default": "2",
493
+ "description": "Number of grid columns. Accepts a plain number or a responsive breakpoint map."
494
+ },
495
+ {
496
+ "name": "gap",
497
+ "type": "string",
498
+ "default": "\"4\"",
499
+ "description": "Gap between tiles as a spacing token suffix. E.g. '4' resolves to var(--spacing-4)."
500
+ },
501
+ {
502
+ "name": "reveal",
503
+ "type": "boolean",
504
+ "default": "false",
505
+ "description": "Fade + rise each tile on viewport entry, staggered by DOM order. Suppressed under prefers-reduced-motion."
506
+ },
507
+ {
508
+ "name": "revealStepMs",
509
+ "type": "number",
510
+ "default": "110",
511
+ "description": "Per-tile delay in milliseconds. Each tile's actual delay is revealStepMs × index."
512
+ },
513
+ {
514
+ "name": "revealThreshold",
515
+ "type": "number",
516
+ "default": "0.2",
517
+ "description": "IntersectionObserver threshold for the entrance trigger."
518
+ }
519
+ ],
520
+ "sub_components": [
521
+ {
522
+ "name": "BentoTile",
523
+ "description": "Individual grid tile. Renders as <article> by default, or <a> when href is provided.",
524
+ "props": [
525
+ {
526
+ "name": "layout",
527
+ "type": "\"stacked\" | \"overlay\"",
528
+ "default": "\"stacked\"",
529
+ "description": "Visual layout. stacked (default): media on top with its own aspect ratio, body below as a sibling. overlay: media fills the tile (which carries the aspect ratio), body floats over the lower portion."
530
+ },
531
+ {
532
+ "name": "span",
533
+ "type": "\"full\" | \"half\" | number",
534
+ "default": "\"half\"",
535
+ "description": "Column span: full (1/-1), half (1 col), or a numeric span count."
536
+ },
537
+ {
538
+ "name": "aspect",
539
+ "type": "\"21/9\" | \"2/1\" | \"4/3\" | \"1/1\" | string",
540
+ "description": "Aspect ratio. In stacked mode it shapes the media; in overlay mode it shapes the entire tile root."
541
+ },
542
+ {
543
+ "name": "fit",
544
+ "type": "\"cover\" | \"contain\"",
545
+ "default": "\"cover\"",
546
+ "description": "Media fit mode. contain adds a surface-card background plate for logos/portraits."
547
+ },
548
+ {
549
+ "name": "href",
550
+ "type": "string",
551
+ "description": "When provided, renders the tile root as an anchor element."
552
+ },
553
+ {
554
+ "name": "target",
555
+ "type": "string",
556
+ "description": "Link target (e.g. _blank). Only relevant when href is set."
557
+ },
558
+ {
559
+ "name": "rel",
560
+ "type": "string",
561
+ "description": "Link rel attribute. Defaults to 'noopener noreferrer' when target is _blank."
562
+ }
563
+ ]
564
+ },
565
+ {
566
+ "name": "BentoTileMedia",
567
+ "description": "Image element. Zooms 1.04× on tile hover (suppressed in fit=\"contain\" mode).",
568
+ "props": [
569
+ {
570
+ "name": "src",
571
+ "type": "string",
572
+ "required": true,
573
+ "description": "Image source URL."
574
+ },
575
+ {
576
+ "name": "alt",
577
+ "type": "string",
578
+ "required": true,
579
+ "description": "Image alt text for accessibility."
580
+ },
581
+ {
582
+ "name": "loading",
583
+ "type": "\"lazy\" | \"eager\"",
584
+ "default": "\"lazy\"",
585
+ "description": "Native image loading strategy."
586
+ }
587
+ ]
588
+ },
589
+ {
590
+ "name": "BentoTileBody",
591
+ "description": "Body container. Stretches to fill the tile in stacked mode so tiles in the same row share height."
592
+ },
593
+ {
594
+ "name": "BentoTileMeta",
595
+ "description": "Eyebrow row — uppercase, tracked, with · separators between items. Accepts an `items` array shorthand or arbitrary children.",
596
+ "props": [
597
+ {
598
+ "name": "items",
599
+ "type": "ReactNode[]",
600
+ "description": "Array of items rendered as spans with `·` separators between siblings. When omitted, children are used as-is."
601
+ }
602
+ ]
603
+ },
604
+ {
605
+ "name": "BentoTileTitle",
606
+ "description": "Display heading with optional hover arrow that nudges on tile hover.",
607
+ "props": [
608
+ {
609
+ "name": "as",
610
+ "type": "\"h2\" | \"h3\" | \"h4\"",
611
+ "default": "\"h3\"",
612
+ "description": "Heading element."
613
+ },
614
+ {
615
+ "name": "showArrow",
616
+ "type": "boolean",
617
+ "default": "false",
618
+ "description": "Render a ↗ arrow after the title; nudges on tile hover."
619
+ }
620
+ ]
621
+ },
622
+ {
623
+ "name": "BentoTileDescription",
624
+ "description": "Muted body text with max-width 56ch for comfortable reading. Renders as <div> (not <p>) so MDX-authored multi-line children don't create invalid <p>-in-<p> nesting."
625
+ },
626
+ {
627
+ "name": "BentoTileFigure",
628
+ "description": "Non-image hero slot — drop-in replacement for BentoTileMedia when the tile's hero is a chart, large number, or custom JSX. Inherits the same hover scale + layout-mode positioning as the media slot."
629
+ },
630
+ {
631
+ "name": "BentoTileHeadline",
632
+ "description": "Larger display heading (clamp 2rem → 3.5rem) for tiles where the heading is the primary content (manifesto / statement / headline tiles).",
633
+ "props": [
634
+ {
635
+ "name": "as",
636
+ "type": "\"h1\" | \"h2\" | \"h3\"",
637
+ "default": "\"h2\"",
638
+ "description": "Heading element."
639
+ }
640
+ ]
641
+ }
642
+ ],
643
+ "dependencies": [
644
+ "@loworbitstudio/visor-core"
645
+ ],
646
+ "tokens_used": [
647
+ "--bento-cols",
648
+ "--bento-cols-lg",
649
+ "--bento-cols-md",
650
+ "--bento-cols-sm",
651
+ "--bento-cols-xl",
652
+ "--bento-gap",
653
+ "--bento-reveal-step",
654
+ "--bento-tile-aspect",
655
+ "--bento-tile-body-gap",
656
+ "--bento-tile-body-padding-x",
657
+ "--bento-tile-body-padding-y",
658
+ "--bento-tile-lift-hover",
659
+ "--bento-tile-media-scale-hover",
660
+ "--bento-tile-radius",
661
+ "--bento-tile-span",
662
+ "--border-focus",
663
+ "--focus-ring-offset",
664
+ "--focus-ring-width",
665
+ "--font-size-sm",
666
+ "--font-weight-bold",
667
+ "--font-weight-medium",
668
+ "--font-weight-normal",
669
+ "--line-height-tight",
670
+ "--motion-duration-normal",
671
+ "--motion-duration-slow",
672
+ "--motion-easing-default",
673
+ "--motion-easing-enter",
674
+ "--overlay-bg",
675
+ "--radius-lg",
676
+ "--reveal-index",
677
+ "--shadow-md",
678
+ "--shadow-sm",
679
+ "--spacing-1",
680
+ "--spacing-2",
681
+ "--spacing-3",
682
+ "--spacing-4",
683
+ "--spacing-5",
684
+ "--surface-card",
685
+ "--surface-subtle",
686
+ "--text-primary",
687
+ "--text-secondary",
688
+ "--text-tertiary"
689
+ ],
690
+ "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"
691
+ },
472
692
  "breadcrumb": {
473
693
  "category": "navigation",
474
694
  "description": "A breadcrumb navigation component showing the user's location within a page hierarchy.",
@@ -1061,6 +1281,154 @@
1061
1281
  ],
1062
1282
  "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"
1063
1283
  },
1284
+ "chip": {
1285
+ "category": "form",
1286
+ "description": "Selectable chip primitive for suggestion, tag, and filter patterns with selected/unselected states and size variants. Maps to React ToggleGroup.",
1287
+ "when_to_use": [
1288
+ "Displaying filterable tag or category options the user can toggle on/off",
1289
+ "Suggestion rows (search autocomplete, style recommendations)",
1290
+ "Multi-select filter bars where individual options are toggled independently",
1291
+ "Any UI pattern that maps to a \"toggle group\" of labelled options"
1292
+ ],
1293
+ "when_not_to_use": [
1294
+ "Single binary toggle (use Switch or Checkbox)",
1295
+ "Navigation tabs or route selectors (use TabBar)",
1296
+ "Dismissible labels that can be removed from a list (use a deletable tag/badge)",
1297
+ "Triggering an action rather than selecting a state (use Button)"
1298
+ ],
1299
+ "variants": {
1300
+ "variant": [
1301
+ "default",
1302
+ "outlined"
1303
+ ],
1304
+ "size": [
1305
+ "sm",
1306
+ "md",
1307
+ "lg"
1308
+ ]
1309
+ },
1310
+ "props": [
1311
+ {
1312
+ "name": "variant",
1313
+ "type": "\"default\" | \"outlined\"",
1314
+ "default": "\"default\""
1315
+ },
1316
+ {
1317
+ "name": "size",
1318
+ "type": "\"sm\" | \"md\" | \"lg\"",
1319
+ "default": "\"md\""
1320
+ },
1321
+ {
1322
+ "name": "avatar",
1323
+ "type": "React.ReactNode",
1324
+ "optional": true
1325
+ },
1326
+ {
1327
+ "name": "leadingIcon",
1328
+ "type": "React.ReactNode",
1329
+ "optional": true
1330
+ },
1331
+ {
1332
+ "name": "label",
1333
+ "type": "React.ReactNode",
1334
+ "optional": true
1335
+ },
1336
+ {
1337
+ "name": "onDeleted",
1338
+ "type": "() => void",
1339
+ "optional": true
1340
+ },
1341
+ {
1342
+ "name": "deleteIcon",
1343
+ "type": "React.ReactNode",
1344
+ "optional": true
1345
+ },
1346
+ {
1347
+ "name": "deleteLabel",
1348
+ "type": "string",
1349
+ "default": "\"Remove\""
1350
+ }
1351
+ ],
1352
+ "sub_components": [
1353
+ {
1354
+ "name": "ChoiceChip",
1355
+ "element": "button",
1356
+ "description": "Radio-style single-select chip. Renders with role=\"radio\" and aria-checked. Use inside a ChipGroup with type=\"single\".",
1357
+ "props": [
1358
+ {
1359
+ "name": "selected",
1360
+ "type": "boolean",
1361
+ "default": "false"
1362
+ },
1363
+ {
1364
+ "name": "onPressed",
1365
+ "type": "() => void",
1366
+ "optional": true
1367
+ },
1368
+ {
1369
+ "name": "value",
1370
+ "type": "string",
1371
+ "optional": true
1372
+ }
1373
+ ]
1374
+ },
1375
+ {
1376
+ "name": "FilterChip",
1377
+ "element": "button",
1378
+ "description": "Toggle-style multi-select chip. Renders with role=\"checkbox\" and aria-checked. Use inside a ChipGroup with type=\"multiple\".",
1379
+ "props": [
1380
+ {
1381
+ "name": "selected",
1382
+ "type": "boolean",
1383
+ "default": "false"
1384
+ },
1385
+ {
1386
+ "name": "onPressed",
1387
+ "type": "() => void",
1388
+ "optional": true
1389
+ },
1390
+ {
1391
+ "name": "value",
1392
+ "type": "string",
1393
+ "optional": true
1394
+ }
1395
+ ]
1396
+ }
1397
+ ],
1398
+ "dependencies": [
1399
+ "class-variance-authority",
1400
+ "@phosphor-icons/react"
1401
+ ],
1402
+ "tokens_used": [
1403
+ "--border-default",
1404
+ "--border-focus",
1405
+ "--focus-ring-offset",
1406
+ "--focus-ring-width",
1407
+ "--font-body",
1408
+ "--font-size-base",
1409
+ "--font-size-sm",
1410
+ "--font-size-xs",
1411
+ "--font-weight-medium",
1412
+ "--motion-duration-150",
1413
+ "--motion-easing-default",
1414
+ "--opacity-40",
1415
+ "--radius-full",
1416
+ "--spacing-1",
1417
+ "--spacing-2",
1418
+ "--spacing-3",
1419
+ "--spacing-4",
1420
+ "--stroke-width-thin",
1421
+ "--surface-accent-default",
1422
+ "--surface-accent-subtle",
1423
+ "--surface-card",
1424
+ "--surface-interactive-hover",
1425
+ "--surface-muted",
1426
+ "--text-link",
1427
+ "--text-primary",
1428
+ "--text-secondary"
1429
+ ],
1430
+ "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"
1431
+ },
1064
1432
  "code-block": {
1065
1433
  "category": "typography",
1066
1434
  "description": "A lightweight code display component with optional line numbers, copy-to-clipboard, and language badge.",
@@ -1432,6 +1800,16 @@
1432
1800
  "name": "onOpenChange",
1433
1801
  "type": "(open: boolean) => void",
1434
1802
  "description": "Callback when CommandDialog open state changes"
1803
+ },
1804
+ {
1805
+ "name": "contentClassName",
1806
+ "type": "string",
1807
+ "description": "Additional class name merged onto DialogContent via cn(). Use for width, padding, or elevation overrides (e.g. the V7 640 px / 540 px palette spec)."
1808
+ },
1809
+ {
1810
+ "name": "contentProps",
1811
+ "type": "Omit<React.ComponentProps<typeof DialogContent>, 'className' | 'children'>",
1812
+ "description": "Spread of any remaining DialogContent props (e.g. onOpenAutoFocus, onCloseAutoFocus, onPointerDownOutside, onEscapeKeyDown). className and children are excluded to prevent conflicts."
1435
1813
  }
1436
1814
  ],
1437
1815
  "sub_components": [
@@ -1779,8 +2157,17 @@
1779
2157
  {
1780
2158
  "name": "data",
1781
2159
  "type": "TData[]",
1782
- "required": true,
1783
- "description": "Array of row records."
2160
+ "description": "Array of row records. Optional when `rows` is provided — DataTable derives the data array from row entries internally."
2161
+ },
2162
+ {
2163
+ "name": "rows",
2164
+ "type": "DataTableRow<TData>[]",
2165
+ "description": "Mixed render order with group-head separators. Each entry is either `{ kind: \"group\", id, label, count? }` or `{ kind: \"data\", id, row }`. When provided, the caller owns sort/grouping/windowing — column header sort UI and the pagination footer are suppressed. Group rows render full-width via colSpan and are excluded from selection state.\n"
2166
+ },
2167
+ {
2168
+ "name": "groupRowRenderer",
2169
+ "type": "(group: DataTableGroupRow) => React.ReactNode",
2170
+ "description": "Optional render slot for custom group-head content. When omitted, the default renderer shows label + optional count using the eyebrow type scale and `--surface-subtle` background."
1784
2171
  },
1785
2172
  {
1786
2173
  "name": "sorting",
@@ -1880,6 +2267,8 @@
1880
2267
  "--focus-ring-offset",
1881
2268
  "--focus-ring-width",
1882
2269
  "--font-size-sm",
2270
+ "--font-size-xs",
2271
+ "--font-weight-medium",
1883
2272
  "--font-weight-semibold",
1884
2273
  "--line-height-tight",
1885
2274
  "--motion-duration-fast",
@@ -1893,7 +2282,9 @@
1893
2282
  "--spacing-6",
1894
2283
  "--spacing-8",
1895
2284
  "--surface-card",
2285
+ "--surface-subtle",
1896
2286
  "--text-primary",
2287
+ "--text-quaternary",
1897
2288
  "--text-secondary",
1898
2289
  "--text-tertiary"
1899
2290
  ],
@@ -2452,6 +2843,7 @@
2452
2843
  ],
2453
2844
  "tokens_used": [
2454
2845
  "--font-size-sm",
2846
+ "--font-size-xs",
2455
2847
  "--font-weight-medium",
2456
2848
  "--font-weight-normal",
2457
2849
  "--spacing-1",
@@ -2731,7 +3123,7 @@
2731
3123
  "--surface-card",
2732
3124
  "--surface-muted",
2733
3125
  "--text-primary",
2734
- "--text-tertiary"
3126
+ "--text-secondary"
2735
3127
  ],
2736
3128
  "example": "<FontShowcase\n token=\"--font-heading\"\n role=\"Heading & Body\"\n familyName=\"Satoshi\"\n weights={[{ label: \"Regular\", value: 400 }, { label: \"Bold\", value: 700 }]}\n/>\n"
2737
3129
  },
@@ -2778,6 +3170,11 @@
2778
3170
  "type": "'onSubmit' | 'onBlur' | 'onInput'",
2779
3171
  "default": "onBlur",
2780
3172
  "description": "When to trigger client-side validation"
3173
+ },
3174
+ {
3175
+ "name": "passwordManagers",
3176
+ "type": "'ignore' | 'allow'",
3177
+ "description": "Form-level default for password-manager autofill on descendant Input and Textarea fields. Field-level passwordManagers prop always wins. When omitted, fields fall back to their own default of \"ignore\".\n"
2781
3178
  }
2782
3179
  ],
2783
3180
  "sub_components": [
@@ -3126,6 +3523,12 @@
3126
3523
  "name": "leadingIcon",
3127
3524
  "type": "React.ReactNode",
3128
3525
  "description": "Optional leading glyph rendered inside the field (e.g. a Phosphor icon). The input reserves enough left padding to clear it."
3526
+ },
3527
+ {
3528
+ "name": "passwordManagers",
3529
+ "type": "'ignore' | 'allow'",
3530
+ "default": "ignore",
3531
+ "description": "Controls password-manager autofill behavior. Defaults to \"ignore\" so contact, marketing, and settings forms don't render 1Password/Bitwarden/LastPass autofill icons. Set to \"allow\" on login and credential fields. When \"ignore\", emits data-1p-ignore, data-bwignore, data-lpignore, and data-form-type=\"other\" — the four per-manager opt-out attributes browsers honor where autocomplete=\"off\" is ignored.\n"
3129
3532
  }
3130
3533
  ],
3131
3534
  "dependencies": [],
@@ -3150,7 +3553,7 @@
3150
3553
  "--text-primary",
3151
3554
  "--text-secondary"
3152
3555
  ],
3153
- "example": "<Input type=\"email\" placeholder=\"you@example.com\" />\n\n<Input type=\"password\" aria-invalid=\"true\" />\n"
3556
+ "example": "<Input type=\"email\" placeholder=\"you@example.com\" />\n\n<Input type=\"password\" passwordManagers=\"allow\" aria-invalid=\"true\" />\n"
3154
3557
  },
3155
3558
  "kbd": {
3156
3559
  "category": "admin",
@@ -3329,6 +3732,98 @@
3329
3732
  ],
3330
3733
  "example": "<Lightbox\n images={[\n { src: \"/photo-1.jpg\", alt: \"Beach sunset\" },\n { src: \"/photo-2.jpg\", alt: \"Mountain view\" },\n ]}\n open={isOpen}\n onOpenChange={setIsOpen}\n>\n <LightboxTrigger>\n <button>View gallery</button>\n </LightboxTrigger>\n <LightboxContent />\n</Lightbox>\n"
3331
3734
  },
3735
+ "marquee": {
3736
+ "category": "data-display",
3737
+ "description": "A multi-band counter-flow infinite-scroll primitive for continuous animated content strips.",
3738
+ "when_to_use": [
3739
+ "Trusted-by logo strips on marketing / landing pages",
3740
+ "News tickers or announcement banners that cycle continuously",
3741
+ "Tag clouds or label lists that benefit from animated browsing",
3742
+ "Feature highlights that need ambient motion without user interaction",
3743
+ "Counter-flow dual-band patterns that convey momentum and volume"
3744
+ ],
3745
+ "when_not_to_use": [
3746
+ "Paginated or interactive content browsing (use Carousel)",
3747
+ "Content that users need to read or click (pause-on-hover helps, but prefer static lists)",
3748
+ "Environments where animation is not appropriate (prefers-reduced-motion renders static)",
3749
+ "Primary navigation or critical actions (animation reduces discoverability)"
3750
+ ],
3751
+ "props": [
3752
+ {
3753
+ "name": "bands",
3754
+ "type": "MarqueeBand[]",
3755
+ "description": "Multi-band configuration array. When provided, top-level items/durationSec/separator are ignored.",
3756
+ "default": "undefined"
3757
+ },
3758
+ {
3759
+ "name": "items",
3760
+ "type": "ReactNode[]",
3761
+ "description": "Single-band shorthand: items to scroll. Used when bands is not provided.",
3762
+ "default": "undefined"
3763
+ },
3764
+ {
3765
+ "name": "durationSec",
3766
+ "type": "number",
3767
+ "description": "Duration of one full scroll cycle in seconds (single-band shorthand). Defaults to 40s so descender-rich items at marketing-display sizes have a calm, readable scroll. For ticker-style strips at body-text size, pass a lower value (e.g. 20).",
3768
+ "default": 40
3769
+ },
3770
+ {
3771
+ "name": "separator",
3772
+ "type": "ReactNode | string",
3773
+ "description": "Separator rendered between items (single-band shorthand).",
3774
+ "default": "undefined"
3775
+ },
3776
+ {
3777
+ "name": "pauseOnHover",
3778
+ "type": "boolean",
3779
+ "description": "When true, scrolling pauses on hover.",
3780
+ "default": true
3781
+ },
3782
+ {
3783
+ "name": "gap",
3784
+ "type": "CSSProperties['gap']",
3785
+ "description": "Gap between items. Accepts any CSS gap value.",
3786
+ "default": "var(--spacing-6, 1.5rem)"
3787
+ },
3788
+ {
3789
+ "name": "renderItem",
3790
+ "type": "(item, index) => ReactNode",
3791
+ "description": "Custom render function for each item.",
3792
+ "default": "undefined"
3793
+ },
3794
+ {
3795
+ "name": "renderSeparator",
3796
+ "type": "(separator, index) => ReactNode",
3797
+ "description": "Custom render function for the separator.",
3798
+ "default": "undefined"
3799
+ }
3800
+ ],
3801
+ "dependencies": [
3802
+ "@loworbitstudio/visor-core"
3803
+ ],
3804
+ "tokens_used": [
3805
+ "--font-size-sm",
3806
+ "--font-weight-medium",
3807
+ "--line-height-normal",
3808
+ "--marquee-duration",
3809
+ "--marquee-fade-width",
3810
+ "--marquee-gap",
3811
+ "--marquee-item-color",
3812
+ "--marquee-item-font-size",
3813
+ "--marquee-item-font-weight",
3814
+ "--marquee-item-letter-spacing",
3815
+ "--marquee-item-line-height",
3816
+ "--marquee-separator-color",
3817
+ "--marquee-separator-font-size",
3818
+ "--motion-easing-linear",
3819
+ "--spacing-12",
3820
+ "--spacing-4",
3821
+ "--spacing-6",
3822
+ "--text-primary",
3823
+ "--text-tertiary"
3824
+ ],
3825
+ "example": "<Marquee\n items={['Acme Corp', 'Vercel', 'Low Orbit Studio', 'Figma', 'Notion']}\n durationSec={20}\n separator=\"·\"\n/>\n\n<Marquee\n bands={[\n { items: clients, direction: 'left', durationSec: 40, separator: '●' },\n { items: clientsReversed, direction: 'right', durationSec: 50, separator: '○' },\n ]}\n pauseOnHover\n gap=\"2.5rem\"\n/>\n"
3826
+ },
3332
3827
  "menubar": {
3333
3828
  "category": "overlay",
3334
3829
  "description": "Horizontal menu bar with dropdown menus, keyboard navigation, and full a11y support.",
@@ -3493,6 +3988,94 @@
3493
3988
  ],
3494
3989
  "example": "<MotionDuration durations={[\n { token: \"--motion-duration-200\", name: \"200\", ms: 200 },\n { token: \"--motion-duration-300\", name: \"300\", ms: 300 },\n]} />\n<MotionEasing easings={[\n { token: \"--motion-easing-ease-out\", name: \"ease-out\", value: \"cubic-bezier(0, 0, 0.2, 1)\" },\n]} />\n"
3495
3990
  },
3991
+ "name-roster": {
3992
+ "category": "data-display",
3993
+ "description": "A column-flow alphabetical list of named items with a dot-prefix indicator and a highlighted-row variant for featured or owned entries.",
3994
+ "when_to_use": [
3995
+ "Displaying a flat list of clients, contributors, alumni, or team members",
3996
+ "Marketing pages where names need to flow across responsive column counts (1→2→3→4)",
3997
+ "Any list where some entries should be visually distinguished (e.g. LO-owned products, featured clients)",
3998
+ "Directory-style lists where column-flow balance is preferred over strict grid alignment"
3999
+ ],
4000
+ "when_not_to_use": [
4001
+ "Lists that require click handlers, selection, or filter/search (different primitive)",
4002
+ "Grouped lists with alphabetical separators (extend with a heading layer)",
4003
+ "Lists that need two-letter avatars or icons next to names",
4004
+ "Short single-item or two-item lists where layout overhead isn't worth it"
4005
+ ],
4006
+ "props": [
4007
+ {
4008
+ "name": "columns",
4009
+ "type": "number | { base?: number; sm?: number; md?: number; lg?: number; xl?: number }",
4010
+ "default": "1",
4011
+ "description": "Number of CSS columns. Pass a plain number or a breakpoint map for responsive layouts."
4012
+ },
4013
+ {
4014
+ "name": "sort",
4015
+ "type": "\"alpha\" | \"none\"",
4016
+ "default": "\"none\"",
4017
+ "description": "Sort order. \"alpha\" applies localeCompare client-side; \"none\" preserves insertion order."
4018
+ },
4019
+ {
4020
+ "name": "items",
4021
+ "type": "NameRosterItemData[]",
4022
+ "default": "undefined",
4023
+ "description": "Shorthand array of { name, highlighted? } items. Takes precedence over children when provided."
4024
+ },
4025
+ {
4026
+ "name": "dot",
4027
+ "type": "boolean",
4028
+ "default": "true",
4029
+ "description": "Show the dot-prefix indicator on each item."
4030
+ },
4031
+ {
4032
+ "name": "as",
4033
+ "type": "\"ul\" | \"ol\"",
4034
+ "default": "\"ul\"",
4035
+ "description": "HTML list element to render."
4036
+ }
4037
+ ],
4038
+ "dependencies": [
4039
+ "@loworbitstudio/visor-core"
4040
+ ],
4041
+ "tokens_used": [
4042
+ "--font-size-sm",
4043
+ "--font-weight-medium",
4044
+ "--font-weight-normal",
4045
+ "--line-height-normal",
4046
+ "--motion-duration-150",
4047
+ "--motion-duration-300",
4048
+ "--motion-easing-default",
4049
+ "--radius-full",
4050
+ "--roster-columns",
4051
+ "--roster-columns-lg",
4052
+ "--roster-columns-md",
4053
+ "--roster-columns-sm",
4054
+ "--roster-columns-xl",
4055
+ "--roster-dot-color",
4056
+ "--roster-dot-color-highlighted",
4057
+ "--roster-dot-color-hover",
4058
+ "--roster-dot-glow-hover",
4059
+ "--roster-dot-size",
4060
+ "--roster-item-color",
4061
+ "--roster-item-color-highlighted",
4062
+ "--roster-item-color-hover",
4063
+ "--roster-item-font-size",
4064
+ "--roster-item-font-weight",
4065
+ "--roster-item-font-weight-highlighted",
4066
+ "--roster-item-hover-transform",
4067
+ "--roster-item-letter-spacing",
4068
+ "--roster-item-line-height",
4069
+ "--spacing-1",
4070
+ "--spacing-2",
4071
+ "--spacing-8",
4072
+ "--surface-accent-default",
4073
+ "--surface-accent-strong",
4074
+ "--text-primary",
4075
+ "--text-secondary"
4076
+ ],
4077
+ "example": "{/* Shorthand with responsive columns and highlighted rows */}\n<NameRoster\n columns={{ base: 1, sm: 2, md: 3, lg: 4 }}\n sort=\"alpha\"\n items={[\n { name: 'ANIMAL' },\n { name: 'Blacklight', highlighted: true },\n { name: 'Knowmentum', highlighted: true },\n { name: 'SCRUFF' },\n { name: 'Visor', highlighted: true },\n ]}\n/>\n\n{/* Children mode with anchor nodes */}\n<NameRoster columns={{ base: 1, md: 3 }}>\n <NameRosterItem><a href=\"/clients/scruff\">SCRUFF</a></NameRosterItem>\n <NameRosterItem highlighted><a href=\"/products/visor\">Visor</a></NameRosterItem>\n</NameRoster>\n"
4078
+ },
3496
4079
  "navbar": {
3497
4080
  "category": "navigation",
3498
4081
  "description": "A top navigation bar with brand, content areas, links, and style variants.",
@@ -4925,6 +5508,11 @@
4925
5508
  "size": [
4926
5509
  "sm",
4927
5510
  "md"
5511
+ ],
5512
+ "valueAs": [
5513
+ "default",
5514
+ "hero",
5515
+ "compact"
4928
5516
  ]
4929
5517
  },
4930
5518
  "props": [
@@ -4972,6 +5560,17 @@
4972
5560
  "type": "'sm' | 'md'",
4973
5561
  "default": "md",
4974
5562
  "description": "Dimensional density. Use sm for dense rows of compact cards; md is the default dashboard size."
5563
+ },
5564
+ {
5565
+ "name": "valueAs",
5566
+ "type": "'default' | 'hero' | 'compact'",
5567
+ "default": "default",
5568
+ "description": "Typography scale for the value. \"hero\" applies a marquee display treatment (large font, display weight, tabular-nums, letter-spacing 0). \"compact\" uses a tighter 2xl size. Override the font and size via --stat-card-value-font and --stat-card-value-size CSS custom properties.\n"
5569
+ },
5570
+ {
5571
+ "name": "valueClassName",
5572
+ "type": "string",
5573
+ "description": "Additional class names forwarded to the value element for fully custom value rendering."
4975
5574
  }
4976
5575
  ],
4977
5576
  "dependencies": [
@@ -4979,6 +5578,7 @@
4979
5578
  ],
4980
5579
  "tokens_used": [
4981
5580
  "--border-default",
5581
+ "--font-display",
4982
5582
  "--font-family-heading",
4983
5583
  "--font-size-2xl",
4984
5584
  "--font-size-3xl",
@@ -4986,6 +5586,7 @@
4986
5586
  "--font-size-sm",
4987
5587
  "--font-size-xs",
4988
5588
  "--font-weight-medium",
5589
+ "--font-weight-normal",
4989
5590
  "--font-weight-regular",
4990
5591
  "--font-weight-semibold",
4991
5592
  "--interactive-primary-bg",
@@ -5003,6 +5604,8 @@
5003
5604
  "--spacing-3",
5004
5605
  "--spacing-4",
5005
5606
  "--spacing-5",
5607
+ "--stat-card-value-font",
5608
+ "--stat-card-value-size",
5006
5609
  "--surface-card",
5007
5610
  "--text-danger",
5008
5611
  "--text-primary",
@@ -5012,6 +5615,172 @@
5012
5615
  ],
5013
5616
  "example": "<StatCard\n label=\"Total Revenue\"\n value=\"$48,120\"\n delta={{ value: \"+12.4%\", direction: \"up\", label: \"vs last month\" }}\n/>\n"
5014
5617
  },
5618
+ "stat-hero": {
5619
+ "category": "admin",
5620
+ "description": "Hero-scale animated metric banner for flagship KPI display on admin dashboards. A 35/65 grid banner with a large headline value on the left and a full-height animated trendline on the right.",
5621
+ "when_to_use": [
5622
+ "Displaying a single flagship KPI at the top of an admin dashboard",
5623
+ "Showing a headline metric (e.g. total revenue, active users) with an animated trendline",
5624
+ "Anchoring a dashboard page with a visually dominant, brand-colored data visualization",
5625
+ "Providing a \"marquee\" number that sets the tone for the rest of the dashboard"
5626
+ ],
5627
+ "when_not_to_use": [
5628
+ "Dense metric grids where multiple KPIs share equal visual weight (use stat-card instead)",
5629
+ "Narrow sidebars or compact panels where the 35/65 layout cannot breathe",
5630
+ "Marketing or landing pages (use a marketing hero pattern instead)",
5631
+ "When you need more than one metric in the same banner (compose multiple stat-cards instead)"
5632
+ ],
5633
+ "props": [
5634
+ {
5635
+ "name": "label",
5636
+ "type": "React.ReactNode",
5637
+ "required": true,
5638
+ "description": "Small uppercase label describing the metric, e.g. \"Monthly Recurring Revenue\"."
5639
+ },
5640
+ {
5641
+ "name": "value",
5642
+ "type": "React.ReactNode",
5643
+ "required": true,
5644
+ "description": "Hero-scale metric value, e.g. \"$1,240,000\"."
5645
+ },
5646
+ {
5647
+ "name": "delta",
5648
+ "type": "StatHeroDelta",
5649
+ "description": "Change indicator with value and direction. Drives color and accessible glyph."
5650
+ },
5651
+ {
5652
+ "name": "values",
5653
+ "type": "number[]",
5654
+ "required": true,
5655
+ "description": "Array of numeric data points (min 2) driving the animated trendline SVG."
5656
+ },
5657
+ {
5658
+ "name": "caption",
5659
+ "type": "React.ReactNode",
5660
+ "description": "Optional caption rendered beneath the delta row, e.g. \"vs same period last year\"."
5661
+ }
5662
+ ],
5663
+ "dependencies": [],
5664
+ "tokens_used": [
5665
+ "--border-default",
5666
+ "--font-family-heading",
5667
+ "--font-size-lg",
5668
+ "--font-size-sm",
5669
+ "--font-size-xs",
5670
+ "--font-weight-medium",
5671
+ "--font-weight-semibold",
5672
+ "--interactive-primary-bg",
5673
+ "--letter-spacing-tight",
5674
+ "--letter-spacing-wide",
5675
+ "--line-height-normal",
5676
+ "--line-height-tight",
5677
+ "--motion-duration-800",
5678
+ "--motion-easing-ease-out",
5679
+ "--radius-lg",
5680
+ "--shadow-sm",
5681
+ "--spacing-1",
5682
+ "--spacing-20",
5683
+ "--spacing-3",
5684
+ "--spacing-8",
5685
+ "--stat-hero-value-size",
5686
+ "--stroke-width-medium",
5687
+ "--surface-card",
5688
+ "--text-danger",
5689
+ "--text-primary",
5690
+ "--text-secondary",
5691
+ "--text-success",
5692
+ "--text-tertiary"
5693
+ ],
5694
+ "example": "<StatHero\n label=\"Monthly Recurring Revenue\"\n value=\"$1,240,000\"\n delta={{ value: \"+18.2%\", direction: \"up\" }}\n values={[820000, 910000, 870000, 980000, 1050000, 1120000, 1240000]}\n caption=\"vs same period last year\"\n/>\n"
5695
+ },
5696
+ "station-spectrum": {
5697
+ "category": "visual-elements",
5698
+ "description": "Animated N-station progress diagram with a hairline rail that draws on scroll-entry and dots that illuminate sequentially via CSS transition delays. Designed for \"process / phases / pipeline\" marketing diagrams.",
5699
+ "when_to_use": [
5700
+ "Illustrating a multi-step process, pipeline, or phased journey on marketing or landing pages",
5701
+ "Showing the stages of an engagement model (e.g. discovery → brand → engineering → infrastructure)",
5702
+ "Animating a sequential workflow diagram that reveals on scroll",
5703
+ "Decorating a section header with a visual representation of sequential phases"
5704
+ ],
5705
+ "when_not_to_use": [
5706
+ "When the user needs to navigate between steps — use `stepper` instead",
5707
+ "When stations need icons or custom rendering per dot — extend the component for that use case",
5708
+ "In compact admin layouts where the horizontal rail cannot breathe (use a text list or timeline instead)",
5709
+ "For vertical orientation — this component is horizontal-only in v1"
5710
+ ],
5711
+ "props": [
5712
+ {
5713
+ "name": "stations",
5714
+ "type": "Station[]",
5715
+ "required": true,
5716
+ "description": "Array of station objects. Each station has `num` (string label, e.g. \"01\"), `title` (string), and optional `description` (string). Minimum 2 stations recommended.\n"
5717
+ },
5718
+ {
5719
+ "name": "density",
5720
+ "type": "'compact' | 'default'",
5721
+ "required": false,
5722
+ "default": "'default'",
5723
+ "description": "Visual density of the diagram. `compact` reduces dot size and hides descriptions for tighter horizontal spaces.\n"
5724
+ },
5725
+ {
5726
+ "name": "inView",
5727
+ "type": "boolean",
5728
+ "required": false,
5729
+ "description": "When `autoTrigger` is false, this prop drives the animation. Set to `true` to activate the rail draw and dot illumination.\n"
5730
+ },
5731
+ {
5732
+ "name": "autoTrigger",
5733
+ "type": "boolean",
5734
+ "required": false,
5735
+ "default": "true",
5736
+ "description": "When true (default), the component auto-wires an IntersectionObserver to trigger the animation when the component enters the viewport. Set to false to control the trigger manually via the `inView` prop and your own ref/hook.\n"
5737
+ }
5738
+ ],
5739
+ "dependencies": [
5740
+ "@loworbitstudio/visor-core"
5741
+ ],
5742
+ "tokens_used": [
5743
+ "--border-default",
5744
+ "--dot-delay-step",
5745
+ "--font-size-sm",
5746
+ "--font-size-xs",
5747
+ "--font-weight-semibold",
5748
+ "--idx",
5749
+ "--interactive-primary-bg",
5750
+ "--letter-spacing-wide",
5751
+ "--line-height-normal",
5752
+ "--line-height-tight",
5753
+ "--motion-duration-normal",
5754
+ "--motion-duration-slow",
5755
+ "--motion-easing-default",
5756
+ "--motion-easing-enter",
5757
+ "--rail-delay",
5758
+ "--rail-duration",
5759
+ "--rail-easing",
5760
+ "--spacing-1",
5761
+ "--spacing-2",
5762
+ "--spacing-3",
5763
+ "--spacing-4",
5764
+ "--station-count",
5765
+ "--station-spectrum-desc-color",
5766
+ "--station-spectrum-dot-border-color",
5767
+ "--station-spectrum-dot-border-color-on",
5768
+ "--station-spectrum-dot-color-off",
5769
+ "--station-spectrum-dot-color-on",
5770
+ "--station-spectrum-dot-size",
5771
+ "--station-spectrum-dot-size-compact",
5772
+ "--station-spectrum-num-color",
5773
+ "--station-spectrum-rail-color",
5774
+ "--station-spectrum-rail-thickness",
5775
+ "--station-spectrum-title-color",
5776
+ "--stroke-width-thin",
5777
+ "--surface-card",
5778
+ "--text-primary",
5779
+ "--text-secondary",
5780
+ "--text-tertiary"
5781
+ ],
5782
+ "example": "<StationSpectrum\n stations={[\n { num: '01', title: 'Discovery', description: 'Goals, audience, constraints, what success looks like.' },\n { num: '02', title: 'Brand', description: 'Name, identity, voice, and a design system that scales.' },\n { num: '03', title: 'Product design', description: 'Wireframes, screens, interactions, prototypes you can hold.' },\n { num: '04', title: 'Engineering', description: 'Apps, websites, APIs. Built, shipped, and live in production.' },\n { num: '05', title: 'Infrastructure', description: 'Logs, metrics, deploys, on-call. The boring parts.' },\n ]}\n/>\n"
5783
+ },
5015
5784
  "status-badge": {
5016
5785
  "category": "admin",
5017
5786
  "description": "Semantic wrapper over Badge that maps admin status names to visual variants with an optional colored indicator dot.",
@@ -5429,6 +6198,7 @@
5429
6198
  "--spacing-2",
5430
6199
  "--surface-muted",
5431
6200
  "--surface-page",
6201
+ "--tabs-indicator-color",
5432
6202
  "--text-primary",
5433
6203
  "--text-secondary"
5434
6204
  ],
@@ -5626,6 +6396,12 @@
5626
6396
  {
5627
6397
  "name": "placeholder",
5628
6398
  "type": "string"
6399
+ },
6400
+ {
6401
+ "name": "passwordManagers",
6402
+ "type": "'ignore' | 'allow'",
6403
+ "default": "ignore",
6404
+ "description": "Controls password-manager autofill behavior. Defaults to \"ignore\" so contact, marketing, and settings forms don't render 1Password/Bitwarden/LastPass autofill icons. Set to \"allow\" on the rare credential field where autofill is desired. When \"ignore\", emits data-1p-ignore, data-bwignore, data-lpignore, and data-form-type=\"other\" — the four per-manager opt-out attributes browsers honor where autocomplete=\"off\" is ignored.\n"
5629
6405
  }
5630
6406
  ],
5631
6407
  "dependencies": [],
@@ -6781,7 +7557,7 @@
6781
7557
  },
6782
7558
  "admin-detail-drawer": {
6783
7559
  "category": "admin",
6784
- "description": "Right-side slide-out panel for viewing or editing a single record. Composes Sheet with a sticky save/cancel footer, async save handler with pending state, an unsaved-changes guard powered by ConfirmDialog, and sm/md/lg/xl width variants.",
7560
+ "description": "Right-side slide-out panel for viewing or editing a single record. Composes Sheet with a sticky save/cancel footer, async save handler with pending state, an unsaved-changes guard powered by ConfirmDialog, sm/md/lg/xl width variants, and optional header customization via hideHeader and customHeader props.",
6785
7561
  "components_used": [
6786
7562
  "sheet",
6787
7563
  "button",
@@ -6821,7 +7597,7 @@
6821
7597
  },
6822
7598
  "admin-settings-page": {
6823
7599
  "category": "admin",
6824
- "description": "Long scrollable settings archetype with labeled sections and an optional sticky left-side nav that sync-scrolls via intersection observer. Supports two mutually-exclusive modes — a single global sticky save/cancel footer (default) or per-section save/revert footer rows. Composes PageHeader, Separator, Heading, Text, Button, and ConfirmDialog.",
7600
+ "description": "Long scrollable settings archetype with labeled sections and an optional sticky left-side nav that sync-scrolls via intersection observer. Supports flat or grouped (categorical) nav with eyebrow labels above section clusters. Supports two mutually-exclusive modes — a single global sticky save/cancel footer (default) or per-section save/revert footer rows. Composes PageHeader, Separator, Heading, Text, Button, and ConfirmDialog.",
6825
7601
  "components_used": [
6826
7602
  "page-header",
6827
7603
  "separator",
@@ -6901,6 +7677,22 @@
6901
7677
  "Single-record inline edits (use admin-detail-drawer)"
6902
7678
  ]
6903
7679
  },
7680
+ "chip-group": {
7681
+ "category": "form",
7682
+ "description": "A composable container managing selection state for ChoiceChip (single-select) and FilterChip (multi-select) chips. Mirrors Flutter Material's chip selection model.",
7683
+ "components_used": [
7684
+ "chip"
7685
+ ],
7686
+ "when_to_use": [
7687
+ "Filter bars where users toggle multiple category chips",
7688
+ "Settings pickers for density, theme, or display preferences (radio-style)",
7689
+ "Tag filters on events, content, or data list pages"
7690
+ ],
7691
+ "when_not_to_use": [
7692
+ "Plain visual chip lists without selection (use Chip directly)",
7693
+ "Large option lists with search (use Select or Combobox)"
7694
+ ]
7695
+ },
6904
7696
  "configuration-panel": {
6905
7697
  "category": "configuration",
6906
7698
  "description": "A floating, glassmorphic configuration panel for organizing controls into labeled sections. Supports collapse animation, positional anchoring, and responsive stacking. Composed from Visor form components.",
@@ -7149,6 +7941,25 @@
7149
7941
  "Product reviews with ratings (extend with star component)",
7150
7942
  "User-generated content feeds"
7151
7943
  ]
7944
+ },
7945
+ "workspace-switcher": {
7946
+ "category": "admin",
7947
+ "description": "Sidebar-header workspace switcher composing a button trigger and a DropdownMenu of available workspaces. The trigger displays the current workspace's avatar, name, optional plan/role line, and a caret. Used in the AdminShell's `logo` slot for multi-tenant admin apps.",
7948
+ "components_used": [
7949
+ "avatar",
7950
+ "dropdown-menu"
7951
+ ],
7952
+ "when_to_use": [
7953
+ "Multi-tenant admin apps where users belong to multiple workspaces or organizations",
7954
+ "Sidebar header (`logo` slot) of `AdminShell` to swap the active workspace context",
7955
+ "Any UI where the active org/team is part of the user's mental address bar"
7956
+ ],
7957
+ "when_not_to_use": [
7958
+ "Single-tenant apps with no concept of switching context",
7959
+ "Search-to-filter pickers (use a combobox or command palette instead)",
7960
+ "Workspace creation flows (consumer composes those above or below the switcher)",
7961
+ "Loading or skeleton states (consumer renders their own skeleton until data is ready)"
7962
+ ]
7152
7963
  }
7153
7964
  },
7154
7965
  "hooks": {
@@ -7860,8 +8671,11 @@
7860
8671
  "accordion",
7861
8672
  "avatar",
7862
8673
  "badge",
8674
+ "bento-grid",
7863
8675
  "card",
7864
8676
  "chart",
8677
+ "marquee",
8678
+ "name-roster",
7865
8679
  "table",
7866
8680
  "timeline"
7867
8681
  ],
@@ -7874,6 +8688,7 @@
7874
8688
  "filter-bar",
7875
8689
  "kbd",
7876
8690
  "stat-card",
8691
+ "stat-hero",
7877
8692
  "status-badge"
7878
8693
  ],
7879
8694
  "feedback": [
@@ -7898,6 +8713,7 @@
7898
8713
  "button",
7899
8714
  "calendar",
7900
8715
  "checkbox",
8716
+ "chip",
7901
8717
  "combobox",
7902
8718
  "date-picker",
7903
8719
  "date-range-picker",
@@ -7946,6 +8762,10 @@
7946
8762
  "menubar",
7947
8763
  "sheet"
7948
8764
  ],
8765
+ "visual-elements": [
8766
+ "sphere",
8767
+ "station-spectrum"
8768
+ ],
7949
8769
  "general": [
7950
8770
  "theme-switcher"
7951
8771
  ],
@@ -7964,9 +8784,6 @@
7964
8784
  "deck-toc-slide",
7965
8785
  "slide",
7966
8786
  "slide-theme-context"
7967
- ],
7968
- "visual-elements": [
7969
- "sphere"
7970
8787
  ]
7971
8788
  },
7972
8789
  "tokens": {
@@ -8489,6 +9306,13 @@
8489
9306
  "defaultLight": "4px",
8490
9307
  "defaultDark": "4px"
8491
9308
  },
9309
+ {
9310
+ "name": "--font-size-2xs",
9311
+ "tier": "primitive",
9312
+ "description": "Primitive font size: 11px",
9313
+ "defaultLight": "0.6875rem",
9314
+ "defaultDark": "0.6875rem"
9315
+ },
8492
9316
  {
8493
9317
  "name": "--font-size-xs",
8494
9318
  "tier": "primitive",
@@ -9051,6 +9875,41 @@
9051
9875
  "defaultLight": "var(--color-info-500)",
9052
9876
  "defaultDark": "var(--color-info-500)"
9053
9877
  },
9878
+ {
9879
+ "name": "--surface-elev-0",
9880
+ "tier": "semantic",
9881
+ "description": "Semantic surface: elev-0",
9882
+ "defaultLight": "var(--color-neutral-950)",
9883
+ "defaultDark": "var(--color-neutral-950)"
9884
+ },
9885
+ {
9886
+ "name": "--surface-elev-1",
9887
+ "tier": "semantic",
9888
+ "description": "Semantic surface: elev-1",
9889
+ "defaultLight": "var(--color-neutral-900)",
9890
+ "defaultDark": "var(--color-neutral-900)"
9891
+ },
9892
+ {
9893
+ "name": "--surface-elev-2",
9894
+ "tier": "semantic",
9895
+ "description": "Semantic surface: elev-2",
9896
+ "defaultLight": "var(--color-neutral-800)",
9897
+ "defaultDark": "var(--color-neutral-800)"
9898
+ },
9899
+ {
9900
+ "name": "--surface-elev-3",
9901
+ "tier": "semantic",
9902
+ "description": "Semantic surface: elev-3",
9903
+ "defaultLight": "var(--color-neutral-700)",
9904
+ "defaultDark": "var(--color-neutral-700)"
9905
+ },
9906
+ {
9907
+ "name": "--surface-elev-4",
9908
+ "tier": "semantic",
9909
+ "description": "Semantic surface: elev-4",
9910
+ "defaultLight": "var(--color-neutral-600)",
9911
+ "defaultDark": "var(--color-neutral-600)"
9912
+ },
9054
9913
  {
9055
9914
  "name": "--border-default",
9056
9915
  "tier": "semantic",
@@ -9795,6 +10654,41 @@
9795
10654
  "defaultLight": "#0ea5e9",
9796
10655
  "defaultDark": "#0ea5e9"
9797
10656
  },
10657
+ {
10658
+ "name": "--surface-elev-0",
10659
+ "tier": "adaptive",
10660
+ "description": "Adaptive surface: elev-0",
10661
+ "defaultLight": "#ffffff",
10662
+ "defaultDark": "#030712"
10663
+ },
10664
+ {
10665
+ "name": "--surface-elev-1",
10666
+ "tier": "adaptive",
10667
+ "description": "Adaptive surface: elev-1",
10668
+ "defaultLight": "#f9fafb",
10669
+ "defaultDark": "#111827"
10670
+ },
10671
+ {
10672
+ "name": "--surface-elev-2",
10673
+ "tier": "adaptive",
10674
+ "description": "Adaptive surface: elev-2",
10675
+ "defaultLight": "#f3f4f6",
10676
+ "defaultDark": "#1f2937"
10677
+ },
10678
+ {
10679
+ "name": "--surface-elev-3",
10680
+ "tier": "adaptive",
10681
+ "description": "Adaptive surface: elev-3",
10682
+ "defaultLight": "#e5e7eb",
10683
+ "defaultDark": "#374151"
10684
+ },
10685
+ {
10686
+ "name": "--surface-elev-4",
10687
+ "tier": "adaptive",
10688
+ "description": "Adaptive surface: elev-4",
10689
+ "defaultLight": "#d1d5db",
10690
+ "defaultDark": "#4b5563"
10691
+ },
9798
10692
  {
9799
10693
  "name": "--border-default",
9800
10694
  "tier": "adaptive",
@@ -10077,7 +10971,7 @@
10077
10971
  }
10078
10972
  ],
10079
10973
  "summary": {
10080
- "total": 300
10974
+ "total": 311
10081
10975
  }
10082
10976
  }
10083
10977
  }