@loworbitstudio/visor 0.10.2 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +36 -0
- package/dist/CHANGELOG.json +73 -1
- package/dist/index.js +1128 -24
- package/dist/registry.json +481 -21
- package/dist/visor-manifest.json +998 -16
- package/package.json +2 -2
package/dist/visor-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "0.4.0",
|
|
3
|
-
"generated_at": "2026-05-
|
|
3
|
+
"generated_at": "2026-05-20T04:45:51.975Z",
|
|
4
4
|
"components": {
|
|
5
5
|
"accessibility-specimen": {
|
|
6
6
|
"category": "specimen",
|
|
@@ -375,6 +375,7 @@
|
|
|
375
375
|
"--surface-error-subtle",
|
|
376
376
|
"--surface-info-default",
|
|
377
377
|
"--surface-info-subtle",
|
|
378
|
+
"--surface-subtle",
|
|
378
379
|
"--surface-success-default",
|
|
379
380
|
"--surface-success-subtle",
|
|
380
381
|
"--surface-warning-default",
|
|
@@ -689,6 +690,89 @@
|
|
|
689
690
|
],
|
|
690
691
|
"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
692
|
},
|
|
693
|
+
"box": {
|
|
694
|
+
"category": "layout",
|
|
695
|
+
"description": "Universal layout wrapper for padding, margin, background, border, and border-radius via Visor design tokens.",
|
|
696
|
+
"when_to_use": [
|
|
697
|
+
"Wrapping a region of content to apply padding, margin, or a surface background",
|
|
698
|
+
"Adding a tokenized border or border-radius to an arbitrary container",
|
|
699
|
+
"Building the outermost wrapper of a Stack, Inline, or Grid layout when you also need spacing/surface chrome",
|
|
700
|
+
"Any place you would otherwise reach for raw Tailwind utility classes like `p-4 bg-white rounded-lg`"
|
|
701
|
+
],
|
|
702
|
+
"when_not_to_use": [
|
|
703
|
+
"Arranging children with consistent gap (use Stack, Inline, or Grid)",
|
|
704
|
+
"Centering content with a max-width (use Container)",
|
|
705
|
+
"As a stylistic Card replacement — Card carries elevation + interaction affordances"
|
|
706
|
+
],
|
|
707
|
+
"props": [
|
|
708
|
+
{
|
|
709
|
+
"name": "as",
|
|
710
|
+
"type": "keyof JSX.IntrinsicElements",
|
|
711
|
+
"default": "'div'",
|
|
712
|
+
"description": "HTML element to render"
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
"name": "padding",
|
|
716
|
+
"type": "SpacingToken | ResponsiveProp<SpacingToken>",
|
|
717
|
+
"description": "Shorthand padding on all sides"
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
"name": "paddingX",
|
|
721
|
+
"type": "SpacingToken | ResponsiveProp<SpacingToken>",
|
|
722
|
+
"description": "Padding on the X axis (overrides `padding`)"
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
"name": "paddingY",
|
|
726
|
+
"type": "SpacingToken | ResponsiveProp<SpacingToken>",
|
|
727
|
+
"description": "Padding on the Y axis (overrides `padding`)"
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
"name": "margin",
|
|
731
|
+
"type": "SpacingToken | ResponsiveProp<SpacingToken>",
|
|
732
|
+
"description": "Shorthand margin on all sides"
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
"name": "bg",
|
|
736
|
+
"type": "SurfaceToken",
|
|
737
|
+
"description": "Token-named background surface (e.g. `'card'`, `'subtle'`)"
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
"name": "border",
|
|
741
|
+
"type": "boolean | BorderToken",
|
|
742
|
+
"description": "When true uses `--border-default`; when a token name uses that border color"
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
"name": "borderRadius",
|
|
746
|
+
"type": "RadiusToken",
|
|
747
|
+
"description": "Token-named border radius"
|
|
748
|
+
}
|
|
749
|
+
],
|
|
750
|
+
"dependencies": [],
|
|
751
|
+
"tokens_used": [
|
|
752
|
+
"--border-default",
|
|
753
|
+
"--box-bg",
|
|
754
|
+
"--box-border-color",
|
|
755
|
+
"--box-border-width",
|
|
756
|
+
"--box-color",
|
|
757
|
+
"--box-m",
|
|
758
|
+
"--box-mb",
|
|
759
|
+
"--box-ml",
|
|
760
|
+
"--box-mr",
|
|
761
|
+
"--box-mt",
|
|
762
|
+
"--box-mx",
|
|
763
|
+
"--box-my",
|
|
764
|
+
"--box-p",
|
|
765
|
+
"--box-pb",
|
|
766
|
+
"--box-pl",
|
|
767
|
+
"--box-pr",
|
|
768
|
+
"--box-pt",
|
|
769
|
+
"--box-px",
|
|
770
|
+
"--box-py",
|
|
771
|
+
"--box-radius",
|
|
772
|
+
"--stroke-width-regular"
|
|
773
|
+
],
|
|
774
|
+
"example": "<Box padding=\"md\" bg=\"card\" borderRadius=\"lg\" border>\n Anything\n</Box>\n\n<Box padding={{ base: \"sm\", md: \"lg\" }} as=\"section\">\n Responsive padding\n</Box>\n"
|
|
775
|
+
},
|
|
692
776
|
"breadcrumb": {
|
|
693
777
|
"category": "navigation",
|
|
694
778
|
"description": "A breadcrumb navigation component showing the user's location within a page hierarchy.",
|
|
@@ -1272,6 +1356,12 @@
|
|
|
1272
1356
|
"--border-error",
|
|
1273
1357
|
"--border-focus",
|
|
1274
1358
|
"--border-strong",
|
|
1359
|
+
"--checkbox-bg",
|
|
1360
|
+
"--checkbox-bg-checked",
|
|
1361
|
+
"--checkbox-bg-hover",
|
|
1362
|
+
"--checkbox-border",
|
|
1363
|
+
"--checkbox-border-checked",
|
|
1364
|
+
"--checkbox-border-hover",
|
|
1275
1365
|
"--focus-ring-width",
|
|
1276
1366
|
"--interactive-primary-bg",
|
|
1277
1367
|
"--interactive-primary-text",
|
|
@@ -1429,6 +1519,77 @@
|
|
|
1429
1519
|
],
|
|
1430
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"
|
|
1431
1521
|
},
|
|
1522
|
+
"chrome-button": {
|
|
1523
|
+
"category": "admin",
|
|
1524
|
+
"description": "A 28px-tall button primitive for topbar and chrome contexts with an optional leading icon and trailing Kbd shortcut hint.",
|
|
1525
|
+
"when_to_use": [
|
|
1526
|
+
"Topbar actions in admin shells (Search, Filter, Group, Density, primary \"New X\")",
|
|
1527
|
+
"Toolbar rows where Button at 32px is too tall for the chrome density",
|
|
1528
|
+
"Any chrome row that pairs an action with a keyboard-shortcut hint inline"
|
|
1529
|
+
],
|
|
1530
|
+
"when_not_to_use": [
|
|
1531
|
+
"Primary body-content CTAs (use Button at default 40px / sm 32px)",
|
|
1532
|
+
"Standalone keyboard-shortcut display without an action (use Kbd directly)",
|
|
1533
|
+
"Icon-only chrome that needs a tooltip — use a separate IconButton primitive when one exists, or wrap with a tooltip and supply aria-label",
|
|
1534
|
+
"Destructive confirmations (use Button variant=\"destructive\" — destructive is intentionally out of scope here)"
|
|
1535
|
+
],
|
|
1536
|
+
"variants": {
|
|
1537
|
+
"variant": [
|
|
1538
|
+
"default",
|
|
1539
|
+
"primary"
|
|
1540
|
+
]
|
|
1541
|
+
},
|
|
1542
|
+
"props": [
|
|
1543
|
+
{
|
|
1544
|
+
"name": "variant",
|
|
1545
|
+
"type": "\"default\" | \"primary\"",
|
|
1546
|
+
"default": "\"default\"",
|
|
1547
|
+
"description": "Visual emphasis. `default` uses the muted interactive surface; `primary` uses the accent surface."
|
|
1548
|
+
},
|
|
1549
|
+
{
|
|
1550
|
+
"name": "icon",
|
|
1551
|
+
"type": "React.ReactNode",
|
|
1552
|
+
"description": "Leading icon — typically a 14px Phosphor icon. Wrapped in an aria-hidden span."
|
|
1553
|
+
},
|
|
1554
|
+
{
|
|
1555
|
+
"name": "keys",
|
|
1556
|
+
"type": "string[]",
|
|
1557
|
+
"description": "Trailing keyboard shortcut hint rendered via `<Kbd keys={keys} size=\"sm\" />`."
|
|
1558
|
+
},
|
|
1559
|
+
{
|
|
1560
|
+
"name": "children",
|
|
1561
|
+
"type": "React.ReactNode",
|
|
1562
|
+
"description": "Button label."
|
|
1563
|
+
}
|
|
1564
|
+
],
|
|
1565
|
+
"dependencies": [
|
|
1566
|
+
"class-variance-authority"
|
|
1567
|
+
],
|
|
1568
|
+
"tokens_used": [
|
|
1569
|
+
"--accent-primary",
|
|
1570
|
+
"--border-focus",
|
|
1571
|
+
"--focus-ring-offset",
|
|
1572
|
+
"--focus-ring-width",
|
|
1573
|
+
"--font-size-sm",
|
|
1574
|
+
"--font-weight-medium",
|
|
1575
|
+
"--font-weight-semibold",
|
|
1576
|
+
"--interactive-primary-bg",
|
|
1577
|
+
"--interactive-primary-bg-hover",
|
|
1578
|
+
"--interactive-primary-text",
|
|
1579
|
+
"--motion-duration-150",
|
|
1580
|
+
"--motion-easing-default",
|
|
1581
|
+
"--opacity-50",
|
|
1582
|
+
"--radius-md",
|
|
1583
|
+
"--spacing-1",
|
|
1584
|
+
"--spacing-2",
|
|
1585
|
+
"--spacing-3",
|
|
1586
|
+
"--surface-interactive-default",
|
|
1587
|
+
"--surface-interactive-hover",
|
|
1588
|
+
"--text-inverse",
|
|
1589
|
+
"--text-primary"
|
|
1590
|
+
],
|
|
1591
|
+
"example": "<ChromeButton icon={<MagnifyingGlass size={14} weight=\"regular\" />} keys={[\"⌘\", \"K\"]}>\n Search\n</ChromeButton>\n<ChromeButton variant=\"primary\" icon={<Plus size={14} weight=\"bold\" />}>\n New event\n</ChromeButton>\n"
|
|
1592
|
+
},
|
|
1432
1593
|
"code-block": {
|
|
1433
1594
|
"category": "typography",
|
|
1434
1595
|
"description": "A lightweight code display component with optional line numbers, copy-to-clipboard, and language badge.",
|
|
@@ -1609,6 +1770,120 @@
|
|
|
1609
1770
|
],
|
|
1610
1771
|
"example": "<ColorBar token=\"--interactive-primary-bg\" label=\"Brand Color\" />\n"
|
|
1611
1772
|
},
|
|
1773
|
+
"color-picker": {
|
|
1774
|
+
"category": "form",
|
|
1775
|
+
"description": "An OKLCH-based color picker with a 2D lightness/chroma plane, hue slider, hex input, and optional preset chips. Renders inline or in a Radix Popover.",
|
|
1776
|
+
"when_to_use": [
|
|
1777
|
+
"Letting users pick a brand color in theme creators or EPK customizers",
|
|
1778
|
+
"Building color-exploration UIs (palettes, swatches, theme tuning)",
|
|
1779
|
+
"Replacing the simple hex picker in the `prototype-review` block when richer selection is needed",
|
|
1780
|
+
"Any form that needs a production-grade color input (not a native browser picker)"
|
|
1781
|
+
],
|
|
1782
|
+
"when_not_to_use": [
|
|
1783
|
+
"Picking from a small fixed list of brand colors (use Radio Group or Toggle Group with color chips)",
|
|
1784
|
+
"Display-only color swatches (use ColorSwatch from the specimen group)",
|
|
1785
|
+
"Picking system tokens — use the theme-creator tooling, not this primitive"
|
|
1786
|
+
],
|
|
1787
|
+
"props": [
|
|
1788
|
+
{
|
|
1789
|
+
"name": "value",
|
|
1790
|
+
"type": "string",
|
|
1791
|
+
"description": "Controlled hex value (e.g. \"#3b82f6\")"
|
|
1792
|
+
},
|
|
1793
|
+
{
|
|
1794
|
+
"name": "defaultValue",
|
|
1795
|
+
"type": "string",
|
|
1796
|
+
"default": "\"#3b82f6\"",
|
|
1797
|
+
"description": "Uncontrolled initial value"
|
|
1798
|
+
},
|
|
1799
|
+
{
|
|
1800
|
+
"name": "onChange",
|
|
1801
|
+
"type": "(hex: string) => void",
|
|
1802
|
+
"description": "Fired on every continuous interaction"
|
|
1803
|
+
},
|
|
1804
|
+
{
|
|
1805
|
+
"name": "onCommit",
|
|
1806
|
+
"type": "(hex: string) => void",
|
|
1807
|
+
"description": "Fired on pointer-up / popover-close — for debounced consumers"
|
|
1808
|
+
},
|
|
1809
|
+
{
|
|
1810
|
+
"name": "mode",
|
|
1811
|
+
"type": "\"popover\" | \"inline\"",
|
|
1812
|
+
"default": "\"popover\"",
|
|
1813
|
+
"description": "Render in a Radix Popover (default) or inline"
|
|
1814
|
+
},
|
|
1815
|
+
{
|
|
1816
|
+
"name": "size",
|
|
1817
|
+
"type": "\"sm\" | \"md\" | \"lg\"",
|
|
1818
|
+
"default": "\"md\"",
|
|
1819
|
+
"description": "Affects trigger swatch size in popover mode"
|
|
1820
|
+
},
|
|
1821
|
+
{
|
|
1822
|
+
"name": "showHex",
|
|
1823
|
+
"type": "boolean",
|
|
1824
|
+
"default": "true",
|
|
1825
|
+
"description": "Show the hex input row"
|
|
1826
|
+
},
|
|
1827
|
+
{
|
|
1828
|
+
"name": "showReadout",
|
|
1829
|
+
"type": "boolean",
|
|
1830
|
+
"default": "true",
|
|
1831
|
+
"description": "Show the L/C/H readout row"
|
|
1832
|
+
},
|
|
1833
|
+
{
|
|
1834
|
+
"name": "presets",
|
|
1835
|
+
"type": "string[]",
|
|
1836
|
+
"description": "Optional hex preset chips"
|
|
1837
|
+
},
|
|
1838
|
+
{
|
|
1839
|
+
"name": "disabled",
|
|
1840
|
+
"type": "boolean",
|
|
1841
|
+
"default": "false",
|
|
1842
|
+
"description": "Disables all interaction"
|
|
1843
|
+
},
|
|
1844
|
+
{
|
|
1845
|
+
"name": "name",
|
|
1846
|
+
"type": "string",
|
|
1847
|
+
"description": "Forwarded to a hidden input for form submission"
|
|
1848
|
+
}
|
|
1849
|
+
],
|
|
1850
|
+
"dependencies": [
|
|
1851
|
+
"@radix-ui/react-popover",
|
|
1852
|
+
"@loworbitstudio/visor-theme-engine"
|
|
1853
|
+
],
|
|
1854
|
+
"tokens_used": [
|
|
1855
|
+
"--border-default",
|
|
1856
|
+
"--border-error",
|
|
1857
|
+
"--border-focus",
|
|
1858
|
+
"--border-strong",
|
|
1859
|
+
"--color-picker-indicator",
|
|
1860
|
+
"--color-picker-indicator-shadow",
|
|
1861
|
+
"--color-picker-indicator-shadow-color",
|
|
1862
|
+
"--focus-ring-width",
|
|
1863
|
+
"--font-size-sm",
|
|
1864
|
+
"--font-size-xs",
|
|
1865
|
+
"--motion-duration-150",
|
|
1866
|
+
"--motion-duration-fast",
|
|
1867
|
+
"--motion-easing-default",
|
|
1868
|
+
"--motion-easing-enter",
|
|
1869
|
+
"--motion-easing-exit",
|
|
1870
|
+
"--opacity-40",
|
|
1871
|
+
"--radius-sm",
|
|
1872
|
+
"--shadow-md",
|
|
1873
|
+
"--spacing-1",
|
|
1874
|
+
"--spacing-2",
|
|
1875
|
+
"--spacing-3",
|
|
1876
|
+
"--spacing-4",
|
|
1877
|
+
"--stroke-width-medium",
|
|
1878
|
+
"--stroke-width-thin",
|
|
1879
|
+
"--surface-card",
|
|
1880
|
+
"--surface-interactive-default",
|
|
1881
|
+
"--surface-popover",
|
|
1882
|
+
"--text-primary",
|
|
1883
|
+
"--text-tertiary"
|
|
1884
|
+
],
|
|
1885
|
+
"example": "// Default (popover trigger)\n<ColorPicker defaultValue=\"#3b82f6\" onChange={(hex) => console.log(hex)} />\n\n// Inline mode\n<ColorPicker mode=\"inline\" defaultValue=\"#3b82f6\" />\n\n// With presets\n<ColorPicker\n mode=\"inline\"\n presets={[\"#ef4444\", \"#f59e0b\", \"#10b981\", \"#3b82f6\", \"#8b5cf6\"]}\n/>\n"
|
|
1886
|
+
},
|
|
1612
1887
|
"color-swatch": {
|
|
1613
1888
|
"category": "specimen",
|
|
1614
1889
|
"description": "Individual color swatch with hex value display, plus grid variants for color scales and semantic color tokens.",
|
|
@@ -2011,6 +2286,47 @@
|
|
|
2011
2286
|
],
|
|
2012
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"
|
|
2013
2288
|
},
|
|
2289
|
+
"container": {
|
|
2290
|
+
"category": "layout",
|
|
2291
|
+
"description": "Max-width centered wrapper for page content with token-driven horizontal padding.",
|
|
2292
|
+
"when_to_use": [
|
|
2293
|
+
"Constraining page content to a comfortable reading width",
|
|
2294
|
+
"Wrapping marketing or documentation section content",
|
|
2295
|
+
"Anywhere you would write `mx-auto max-w-screen-lg px-4` in Tailwind"
|
|
2296
|
+
],
|
|
2297
|
+
"when_not_to_use": [
|
|
2298
|
+
"Arranging children (use Stack, Inline, or Grid as the inner content)",
|
|
2299
|
+
"Adding background or border chrome (compose with Box inside)",
|
|
2300
|
+
"Full-bleed sections (use `size=\"full\"` or skip the Container entirely)"
|
|
2301
|
+
],
|
|
2302
|
+
"props": [
|
|
2303
|
+
{
|
|
2304
|
+
"name": "as",
|
|
2305
|
+
"type": "keyof JSX.IntrinsicElements",
|
|
2306
|
+
"default": "'div'",
|
|
2307
|
+
"description": "HTML element to render"
|
|
2308
|
+
},
|
|
2309
|
+
{
|
|
2310
|
+
"name": "size",
|
|
2311
|
+
"type": "'sm' | 'md' | 'lg' | 'xl' | 'full'",
|
|
2312
|
+
"default": "'lg'",
|
|
2313
|
+
"description": "Max-width preset (sm 640, md 768, lg 1024, xl 1280, full no limit)"
|
|
2314
|
+
},
|
|
2315
|
+
{
|
|
2316
|
+
"name": "padding",
|
|
2317
|
+
"type": "ContainerSpacing",
|
|
2318
|
+
"default": "'md'",
|
|
2319
|
+
"description": "Horizontal padding token"
|
|
2320
|
+
}
|
|
2321
|
+
],
|
|
2322
|
+
"dependencies": [],
|
|
2323
|
+
"tokens_used": [
|
|
2324
|
+
"--container-max-width",
|
|
2325
|
+
"--container-padding",
|
|
2326
|
+
"--spacing-4"
|
|
2327
|
+
],
|
|
2328
|
+
"example": "<Container>\n <Heading>Page Title</Heading>\n <Text>Body content constrained to lg (1024px).</Text>\n</Container>\n\n<Container size=\"md\" padding=\"lg\" as=\"article\">\n Narrow reading column with extra horizontal padding.\n</Container>\n"
|
|
2329
|
+
},
|
|
2014
2330
|
"context-menu": {
|
|
2015
2331
|
"category": "overlay",
|
|
2016
2332
|
"description": "Right-click menu with actions, checkboxes, radio items, and sub-menus.",
|
|
@@ -2253,6 +2569,22 @@
|
|
|
2253
2569
|
"type": "boolean",
|
|
2254
2570
|
"default": "false",
|
|
2255
2571
|
"description": "When true, the thead is positioned sticky at the top of the scroll container."
|
|
2572
|
+
},
|
|
2573
|
+
{
|
|
2574
|
+
"name": "density",
|
|
2575
|
+
"type": "\"compact\" | \"default\" | \"editorial\"",
|
|
2576
|
+
"default": "\"default\"",
|
|
2577
|
+
"description": "Vertical row padding step. Maps to a `data-density` attribute on the root, which sets the `--dt-row-py` custom property the table's cells consume. `\"compact\"` = 8px (sub-content density: long lists, narrow viewports). `\"default\"` = 12px (current behaviour; backward-compatible with consumers that don't pass the prop). `\"editorial\"` = 20px (generous; each row reads as a card; high-design admin patterns). Themes can override per-density values without forking the component by targeting `[data-density=\"…\"]` from their own selector.\n"
|
|
2578
|
+
},
|
|
2579
|
+
{
|
|
2580
|
+
"name": "rowTone",
|
|
2581
|
+
"type": "(row: TData) => \"live\" | \"warn\" | \"scheduled\" | \"sold\" | \"draft\" | \"danger\" | \"info\" | undefined",
|
|
2582
|
+
"description": "Map each data row to a semantic tone for a subtle background tint. `live` and `sold` resolve to `--surface-success-subtle`, `warn` to `--surface-warning-subtle`, `danger` to `--surface-error-subtle`, `info` to `--surface-info-subtle`. `scheduled` and `draft` render on the default surface (no tint) to keep visual signal focused on actionable rows. Tone names mirror StatusBadge / StatusDot so a row tagged \"live\" reads consistently with a \"live\" badge inside the row.\n"
|
|
2583
|
+
},
|
|
2584
|
+
{
|
|
2585
|
+
"name": "onRowClick",
|
|
2586
|
+
"type": "(row: TData) => void",
|
|
2587
|
+
"description": "When supplied, every data row becomes a keyboard-activatable target: `role=\"button\"` (only when `enableRowSelection` is off — see below), `tabIndex={0}`, click + Enter/Space dispatch the handler, and a `data-clickable=\"true\"` attribute drives the hover and focus affordance. The injected selection-checkbox cell stops propagation, so clicking the checkbox does not trigger the row click. When selection is enabled, the row keeps its semantic `tr` role to avoid the nested-interactive accessibility violation — click/keyboard still work via the explicit handlers.\n"
|
|
2256
2588
|
}
|
|
2257
2589
|
],
|
|
2258
2590
|
"dependencies": [
|
|
@@ -2263,6 +2595,7 @@
|
|
|
2263
2595
|
"tokens_used": [
|
|
2264
2596
|
"--border-default",
|
|
2265
2597
|
"--border-strong",
|
|
2598
|
+
"--dt-row-py",
|
|
2266
2599
|
"--focus-ring-color",
|
|
2267
2600
|
"--focus-ring-offset",
|
|
2268
2601
|
"--focus-ring-width",
|
|
@@ -2279,10 +2612,18 @@
|
|
|
2279
2612
|
"--spacing-2",
|
|
2280
2613
|
"--spacing-3",
|
|
2281
2614
|
"--spacing-4",
|
|
2615
|
+
"--spacing-5",
|
|
2282
2616
|
"--spacing-6",
|
|
2283
2617
|
"--spacing-8",
|
|
2284
2618
|
"--surface-card",
|
|
2619
|
+
"--surface-error-subtle",
|
|
2620
|
+
"--surface-info-subtle",
|
|
2621
|
+
"--surface-interactive-active",
|
|
2622
|
+
"--surface-interactive-default",
|
|
2623
|
+
"--surface-selected",
|
|
2285
2624
|
"--surface-subtle",
|
|
2625
|
+
"--surface-success-subtle",
|
|
2626
|
+
"--surface-warning-subtle",
|
|
2286
2627
|
"--text-primary",
|
|
2287
2628
|
"--text-quaternary",
|
|
2288
2629
|
"--text-secondary",
|
|
@@ -3276,6 +3617,66 @@
|
|
|
3276
3617
|
],
|
|
3277
3618
|
"example": "<FullscreenOverlay>\n <FullscreenOverlayTrigger>Expand</FullscreenOverlayTrigger>\n <FullscreenOverlayContent>\n <p>Full-screen content here</p>\n </FullscreenOverlayContent>\n</FullscreenOverlay>\n"
|
|
3278
3619
|
},
|
|
3620
|
+
"grid": {
|
|
3621
|
+
"category": "layout",
|
|
3622
|
+
"description": "CSS Grid wrapper with token-driven gap, responsive column count, and explicit `grid-template-columns` escape hatch.",
|
|
3623
|
+
"when_to_use": [
|
|
3624
|
+
"Equal-width column layouts (2-col, 3-col, 4-col, etc.)",
|
|
3625
|
+
"Responsive column counts that change at breakpoints",
|
|
3626
|
+
"Asymmetric layouts via a `grid-template-columns` string (e.g. `\"1fr 2fr\"`)"
|
|
3627
|
+
],
|
|
3628
|
+
"when_not_to_use": [
|
|
3629
|
+
"Single-axis arrangements (use Stack or Inline)",
|
|
3630
|
+
"Asymmetric tile grids with explicit spans (use BentoGrid)",
|
|
3631
|
+
"Form field layouts (use Stack with Field)"
|
|
3632
|
+
],
|
|
3633
|
+
"props": [
|
|
3634
|
+
{
|
|
3635
|
+
"name": "as",
|
|
3636
|
+
"type": "keyof JSX.IntrinsicElements",
|
|
3637
|
+
"default": "'div'",
|
|
3638
|
+
"description": "HTML element to render"
|
|
3639
|
+
},
|
|
3640
|
+
{
|
|
3641
|
+
"name": "columns",
|
|
3642
|
+
"type": "number | ResponsiveProp<number> | string",
|
|
3643
|
+
"default": "1",
|
|
3644
|
+
"description": "Column count (number or responsive map) or explicit `grid-template-columns` string"
|
|
3645
|
+
},
|
|
3646
|
+
{
|
|
3647
|
+
"name": "gap",
|
|
3648
|
+
"type": "GridSpacing | ResponsiveProp<GridSpacing>",
|
|
3649
|
+
"default": "'md'",
|
|
3650
|
+
"description": "Space between cells"
|
|
3651
|
+
},
|
|
3652
|
+
{
|
|
3653
|
+
"name": "align",
|
|
3654
|
+
"type": "'start' | 'center' | 'end' | 'stretch'",
|
|
3655
|
+
"description": "Block-axis (vertical) alignment within cells"
|
|
3656
|
+
},
|
|
3657
|
+
{
|
|
3658
|
+
"name": "justify",
|
|
3659
|
+
"type": "'start' | 'center' | 'end' | 'stretch'",
|
|
3660
|
+
"description": "Inline-axis (horizontal) alignment within cells"
|
|
3661
|
+
}
|
|
3662
|
+
],
|
|
3663
|
+
"dependencies": [],
|
|
3664
|
+
"tokens_used": [
|
|
3665
|
+
"--grid-cols",
|
|
3666
|
+
"--grid-cols-lg",
|
|
3667
|
+
"--grid-cols-md",
|
|
3668
|
+
"--grid-cols-sm",
|
|
3669
|
+
"--grid-cols-xl",
|
|
3670
|
+
"--grid-gap",
|
|
3671
|
+
"--grid-gap-lg",
|
|
3672
|
+
"--grid-gap-md",
|
|
3673
|
+
"--grid-gap-sm",
|
|
3674
|
+
"--grid-gap-xl",
|
|
3675
|
+
"--grid-template-columns",
|
|
3676
|
+
"--spacing-4"
|
|
3677
|
+
],
|
|
3678
|
+
"example": "<Grid columns={3} gap=\"md\">\n <Card>One</Card>\n <Card>Two</Card>\n <Card>Three</Card>\n</Grid>\n\n<Grid columns={{ base: 1, md: 2, lg: 4 }} gap={{ base: \"sm\", md: \"md\" }}>\n Responsive grid\n</Grid>\n\n<Grid columns=\"1fr 2fr\" gap=\"lg\">\n Sidebar + main\n</Grid>\n"
|
|
3679
|
+
},
|
|
3279
3680
|
"heading": {
|
|
3280
3681
|
"category": "typography",
|
|
3281
3682
|
"description": "A semantic heading component (h1-h6) with independent size and weight variants.",
|
|
@@ -3491,6 +3892,61 @@
|
|
|
3491
3892
|
],
|
|
3492
3893
|
"example": "<Image\n src=\"/photos/hero.jpg\"\n alt=\"Mountain landscape\"\n aspectRatio=\"video\"\n/>\n\n<Image\n src={user.avatar}\n alt={user.name}\n aspectRatio=\"square\"\n objectFit=\"cover\"\n fallback={<span>No photo</span>}\n/>\n"
|
|
3493
3894
|
},
|
|
3895
|
+
"inline": {
|
|
3896
|
+
"category": "layout",
|
|
3897
|
+
"description": "Horizontal flex container with token-driven gap, alignment, optional wrap, and `as` polymorphism.",
|
|
3898
|
+
"when_to_use": [
|
|
3899
|
+
"Laying out a row of buttons, chips, badges, or icons",
|
|
3900
|
+
"Toolbar-style horizontal groupings",
|
|
3901
|
+
"Anywhere you would write `flex items-center gap-N` in Tailwind"
|
|
3902
|
+
],
|
|
3903
|
+
"when_not_to_use": [
|
|
3904
|
+
"Vertical arrangements (use Stack)",
|
|
3905
|
+
"Two-dimensional grids (use Grid)",
|
|
3906
|
+
"Layouts that need to align to a specific column count (use Grid)"
|
|
3907
|
+
],
|
|
3908
|
+
"props": [
|
|
3909
|
+
{
|
|
3910
|
+
"name": "as",
|
|
3911
|
+
"type": "keyof JSX.IntrinsicElements",
|
|
3912
|
+
"default": "'div'",
|
|
3913
|
+
"description": "HTML element to render"
|
|
3914
|
+
},
|
|
3915
|
+
{
|
|
3916
|
+
"name": "gap",
|
|
3917
|
+
"type": "InlineSpacing | ResponsiveProp<InlineSpacing>",
|
|
3918
|
+
"default": "'md'",
|
|
3919
|
+
"description": "Space between children"
|
|
3920
|
+
},
|
|
3921
|
+
{
|
|
3922
|
+
"name": "align",
|
|
3923
|
+
"type": "'start' | 'center' | 'end' | 'stretch' | 'baseline'",
|
|
3924
|
+
"default": "'center'",
|
|
3925
|
+
"description": "Cross-axis alignment"
|
|
3926
|
+
},
|
|
3927
|
+
{
|
|
3928
|
+
"name": "justify",
|
|
3929
|
+
"type": "'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'",
|
|
3930
|
+
"description": "Main-axis alignment"
|
|
3931
|
+
},
|
|
3932
|
+
{
|
|
3933
|
+
"name": "wrap",
|
|
3934
|
+
"type": "boolean",
|
|
3935
|
+
"default": "false",
|
|
3936
|
+
"description": "Allow children to wrap onto multiple lines"
|
|
3937
|
+
}
|
|
3938
|
+
],
|
|
3939
|
+
"dependencies": [],
|
|
3940
|
+
"tokens_used": [
|
|
3941
|
+
"--inline-gap",
|
|
3942
|
+
"--inline-gap-lg",
|
|
3943
|
+
"--inline-gap-md",
|
|
3944
|
+
"--inline-gap-sm",
|
|
3945
|
+
"--inline-gap-xl",
|
|
3946
|
+
"--spacing-4"
|
|
3947
|
+
],
|
|
3948
|
+
"example": "<Inline gap=\"sm\">\n <Button>Save</Button>\n <Button variant=\"secondary\">Cancel</Button>\n</Inline>\n\n<Inline gap=\"xs\" wrap>\n {tags.map(t => <Badge key={t}>{t}</Badge>)}\n</Inline>\n"
|
|
3949
|
+
},
|
|
3494
3950
|
"input": {
|
|
3495
3951
|
"category": "form",
|
|
3496
3952
|
"description": "A text input component with focus and validation states.",
|
|
@@ -4386,12 +4842,23 @@
|
|
|
4386
4842
|
"type": "'sm' | 'md' | 'lg'",
|
|
4387
4843
|
"default": "md",
|
|
4388
4844
|
"description": "Controls vertical rhythm and title size."
|
|
4389
|
-
}
|
|
4390
|
-
|
|
4845
|
+
},
|
|
4846
|
+
{
|
|
4847
|
+
"name": "titleSize",
|
|
4848
|
+
"type": "'default' | 'marquee' | string",
|
|
4849
|
+
"description": "Title font-size override, orthogonal to `size`. `\"default\"` and `\"marquee\"` are tokens that map to `data-title-size` attributes (marquee renders at the `--page-header-title-size` custom property, defaulting to 3.5rem). Any other string is forwarded as a raw CSS length on an inline `--page-header-title-size` declaration and rendered with the marquee rule.\n"
|
|
4850
|
+
},
|
|
4851
|
+
{
|
|
4852
|
+
"name": "titleFamily",
|
|
4853
|
+
"type": "'heading' | 'display' | string",
|
|
4854
|
+
"description": "Title font-family override. `\"heading\"` and `\"display\"` are tokens that map to `data-title-family` attributes; `\"display\"` resolves to `var(--font-display, var(--font-family-heading, inherit))` so themes without a display font degrade to the heading family. Any other string is forwarded as a raw CSS family on an inline `--page-header-title-family` declaration.\n"
|
|
4855
|
+
}
|
|
4856
|
+
],
|
|
4391
4857
|
"dependencies": [
|
|
4392
4858
|
"class-variance-authority"
|
|
4393
4859
|
],
|
|
4394
4860
|
"tokens_used": [
|
|
4861
|
+
"--font-display",
|
|
4395
4862
|
"--font-family-heading",
|
|
4396
4863
|
"--font-size-2xl",
|
|
4397
4864
|
"--font-size-3xl",
|
|
@@ -4404,6 +4871,8 @@
|
|
|
4404
4871
|
"--letter-spacing-wide",
|
|
4405
4872
|
"--line-height-relaxed",
|
|
4406
4873
|
"--line-height-tight",
|
|
4874
|
+
"--page-header-title-family",
|
|
4875
|
+
"--page-header-title-size",
|
|
4407
4876
|
"--spacing-1",
|
|
4408
4877
|
"--spacing-2",
|
|
4409
4878
|
"--spacing-3",
|
|
@@ -4414,7 +4883,7 @@
|
|
|
4414
4883
|
"--text-secondary",
|
|
4415
4884
|
"--text-tertiary"
|
|
4416
4885
|
],
|
|
4417
|
-
"example": "<PageHeader\n eyebrow=\"Blacklight Admin\"\n title=\"Customers\"\n description=\"Manage customer accounts, billing, and access.\"\n actions={\n <>\n <Button variant=\"outline\">Export</Button>\n <Button>New customer</Button>\n </>\n }\n/>\n"
|
|
4886
|
+
"example": "<PageHeader\n eyebrow=\"Blacklight Admin\"\n title=\"Customers\"\n description=\"Manage customer accounts, billing, and access.\"\n actions={\n <>\n <Button variant=\"outline\">Export</Button>\n <Button>New customer</Button>\n </>\n }\n/>\n\n// Marquee title, display font (editorial admin hero)\n<PageHeader\n eyebrow=\"Sat · Apr 27 · 22:00 — 04:00 · Two events\"\n title=\"Tonight\"\n titleSize=\"marquee\"\n titleFamily=\"display\"\n/>\n"
|
|
4418
4887
|
},
|
|
4419
4888
|
"pagination": {
|
|
4420
4889
|
"category": "navigation",
|
|
@@ -4677,7 +5146,8 @@
|
|
|
4677
5146
|
"File upload progress",
|
|
4678
5147
|
"Multi-step form or wizard completion",
|
|
4679
5148
|
"Loading or processing indicators with known progress",
|
|
4680
|
-
"Profile completeness or quota usage"
|
|
5149
|
+
"Profile completeness or quota usage",
|
|
5150
|
+
"Static admin-chrome capacity meters (KPI strips, time-until indicators) — use `size=\"thin\"` and `animate={false}`"
|
|
4681
5151
|
],
|
|
4682
5152
|
"when_not_to_use": [
|
|
4683
5153
|
"Indeterminate loading with no known progress (use Skeleton or a spinner)",
|
|
@@ -4690,6 +5160,18 @@
|
|
|
4690
5160
|
"name": "value",
|
|
4691
5161
|
"type": "number",
|
|
4692
5162
|
"description": "Current progress value from 0 to 100"
|
|
5163
|
+
},
|
|
5164
|
+
{
|
|
5165
|
+
"name": "size",
|
|
5166
|
+
"type": "\"default\" | \"thin\"",
|
|
5167
|
+
"default": "\"default\"",
|
|
5168
|
+
"description": "Track size. `\"thin\"` renders a 4px-tall capacity bar for static admin chrome."
|
|
5169
|
+
},
|
|
5170
|
+
{
|
|
5171
|
+
"name": "animate",
|
|
5172
|
+
"type": "boolean",
|
|
5173
|
+
"default": "true",
|
|
5174
|
+
"description": "Whether the indicator transitions on value change. Set to `false` for static chrome."
|
|
4693
5175
|
}
|
|
4694
5176
|
],
|
|
4695
5177
|
"dependencies": [
|
|
@@ -4700,9 +5182,59 @@
|
|
|
4700
5182
|
"--motion-duration-300",
|
|
4701
5183
|
"--motion-easing-default",
|
|
4702
5184
|
"--radius-full",
|
|
5185
|
+
"--surface-interactive-active",
|
|
4703
5186
|
"--surface-muted"
|
|
4704
5187
|
],
|
|
4705
|
-
"example": "<Progress value={65} />\n"
|
|
5188
|
+
"example": "<Progress value={65} />\n\n{/* Static 4px chrome (e.g. door-open capacity meter — caller normalizes 0-1 to 0-100) */}\n<Progress\n value={Math.round(ratio * 100)}\n size=\"thin\"\n animate={false}\n aria-label=\"Time until door opens\"\n/>\n"
|
|
5189
|
+
},
|
|
5190
|
+
"quick-actions": {
|
|
5191
|
+
"category": "navigation",
|
|
5192
|
+
"description": "Vertical list of action rows pairing a left-aligned label with a right-aligned Kbd shortcut.",
|
|
5193
|
+
"when_to_use": [
|
|
5194
|
+
"Dashboard side-rail \"quick\" panels surfacing keyboard discoverability",
|
|
5195
|
+
"Inline help cards beneath a section header (\"What can I do here\")",
|
|
5196
|
+
"Command-palette preview lists showing the top shortcuts",
|
|
5197
|
+
"Anywhere a short list of label + hotkey pairs needs consistent alignment"
|
|
5198
|
+
],
|
|
5199
|
+
"when_not_to_use": [
|
|
5200
|
+
"Rows with leading icons, counts, or trailing meta data (use RightRailList)",
|
|
5201
|
+
"Modal command palette with filtering (use the Command primitive)",
|
|
5202
|
+
"Single-key shortcut chrome inline with text (use Kbd directly)",
|
|
5203
|
+
"Long lists where keyboard activation is the primary affordance (use a menu)"
|
|
5204
|
+
],
|
|
5205
|
+
"props": [
|
|
5206
|
+
{
|
|
5207
|
+
"name": "actions",
|
|
5208
|
+
"type": "QuickAction[]",
|
|
5209
|
+
"description": "Array of { id, label, keys } entries. Each row renders the label on the left and a Kbd composed from `keys` on the right.\n"
|
|
5210
|
+
},
|
|
5211
|
+
{
|
|
5212
|
+
"name": "onActivate",
|
|
5213
|
+
"type": "(id: string) => void",
|
|
5214
|
+
"description": "When supplied, rows render as activatable buttons. Click, Enter, and Space all fire the handler with the row's id. When omitted, rows are display-only list items.\n"
|
|
5215
|
+
}
|
|
5216
|
+
],
|
|
5217
|
+
"dependencies": [
|
|
5218
|
+
"@loworbitstudio/visor-core"
|
|
5219
|
+
],
|
|
5220
|
+
"tokens_used": [
|
|
5221
|
+
"--border-focus",
|
|
5222
|
+
"--focus-ring-offset",
|
|
5223
|
+
"--focus-ring-width",
|
|
5224
|
+
"--font-size-sm",
|
|
5225
|
+
"--motion-duration-150",
|
|
5226
|
+
"--motion-easing-default",
|
|
5227
|
+
"--radius-sm",
|
|
5228
|
+
"--spacing-1",
|
|
5229
|
+
"--spacing-2",
|
|
5230
|
+
"--spacing-3",
|
|
5231
|
+
"--spacing-4",
|
|
5232
|
+
"--surface-card",
|
|
5233
|
+
"--surface-muted",
|
|
5234
|
+
"--text-primary",
|
|
5235
|
+
"--text-secondary"
|
|
5236
|
+
],
|
|
5237
|
+
"example": "<QuickActions\n aria-label=\"Quick actions\"\n actions={[\n { id: \"new\", label: \"New event\", keys: [\"N\"] },\n { id: \"cmd\", label: \"Open command\", keys: [\"⌘\", \"K\"] },\n { id: \"switch\", label: \"Switch venue\", keys: [\"⌘\", \"O\"] },\n { id: \"help\", label: \"Help\", keys: [\"?\"] },\n ]}\n/>\n"
|
|
4706
5238
|
},
|
|
4707
5239
|
"radio-group": {
|
|
4708
5240
|
"category": "form",
|
|
@@ -4793,6 +5325,120 @@
|
|
|
4793
5325
|
],
|
|
4794
5326
|
"example": "<RadiusScale steps={[\n { token: \"--radius-sm\", name: \"sm\", px: 2 },\n { token: \"--radius-md\", name: \"md\", px: 4 },\n { token: \"--radius-full\", name: \"full\", px: 9999 },\n]} />\n"
|
|
4795
5327
|
},
|
|
5328
|
+
"score-indicator": {
|
|
5329
|
+
"category": "admin",
|
|
5330
|
+
"description": "Compact circular ring visualization for percentage or ratio metrics — health score, uptime, engagement, capacity.",
|
|
5331
|
+
"when_to_use": [
|
|
5332
|
+
"Rendering a percentage / ratio metric inside an admin dashboard facts row",
|
|
5333
|
+
"Health, uptime, engagement, capacity, and other \"x out of y\" indicators",
|
|
5334
|
+
"Compact placement next to a value where a full Progress bar would be too tall",
|
|
5335
|
+
"Auto-toned status display where the color should track the underlying ratio"
|
|
5336
|
+
],
|
|
5337
|
+
"when_not_to_use": [
|
|
5338
|
+
"Long-form completion progress (use Progress)",
|
|
5339
|
+
"Multi-segment pie / donut breakdowns (use a chart primitive)",
|
|
5340
|
+
"Animated count-up reveals (out of scope — wrap with your own animation)",
|
|
5341
|
+
"Linear capacity bars (use Progress with size=\"thin\")"
|
|
5342
|
+
],
|
|
5343
|
+
"variants": {
|
|
5344
|
+
"size": [
|
|
5345
|
+
"sm",
|
|
5346
|
+
"md",
|
|
5347
|
+
"lg"
|
|
5348
|
+
],
|
|
5349
|
+
"tone": [
|
|
5350
|
+
"success",
|
|
5351
|
+
"warning",
|
|
5352
|
+
"destructive",
|
|
5353
|
+
"info",
|
|
5354
|
+
"neutral"
|
|
5355
|
+
],
|
|
5356
|
+
"denominator": [
|
|
5357
|
+
"none",
|
|
5358
|
+
"trailing",
|
|
5359
|
+
"below"
|
|
5360
|
+
]
|
|
5361
|
+
},
|
|
5362
|
+
"props": [
|
|
5363
|
+
{
|
|
5364
|
+
"name": "value",
|
|
5365
|
+
"type": "number",
|
|
5366
|
+
"required": true,
|
|
5367
|
+
"description": "Current value."
|
|
5368
|
+
},
|
|
5369
|
+
{
|
|
5370
|
+
"name": "max",
|
|
5371
|
+
"type": "number",
|
|
5372
|
+
"default": "100",
|
|
5373
|
+
"description": "Maximum value the score can reach."
|
|
5374
|
+
},
|
|
5375
|
+
{
|
|
5376
|
+
"name": "size",
|
|
5377
|
+
"type": "\"sm\" | \"md\" | \"lg\"",
|
|
5378
|
+
"default": "\"md\"",
|
|
5379
|
+
"description": "Ring size. sm=24px, md=36px, lg=56px."
|
|
5380
|
+
},
|
|
5381
|
+
{
|
|
5382
|
+
"name": "tone",
|
|
5383
|
+
"type": "\"auto\" | \"success\" | \"warning\" | \"destructive\" | \"info\" | \"neutral\"",
|
|
5384
|
+
"default": "\"auto\"",
|
|
5385
|
+
"description": "Color treatment. \"auto\" derives from the value/max ratio."
|
|
5386
|
+
},
|
|
5387
|
+
{
|
|
5388
|
+
"name": "ariaLabel",
|
|
5389
|
+
"type": "string",
|
|
5390
|
+
"description": "Override the default \"X out of Y\" aria-label."
|
|
5391
|
+
},
|
|
5392
|
+
{
|
|
5393
|
+
"name": "denominator",
|
|
5394
|
+
"type": "\"none\" | \"trailing\" | \"below\"",
|
|
5395
|
+
"default": "\"trailing\"",
|
|
5396
|
+
"description": "Where to render the \"/ N\" denominator label."
|
|
5397
|
+
},
|
|
5398
|
+
{
|
|
5399
|
+
"name": "format",
|
|
5400
|
+
"type": "(value: number, max: number) => string",
|
|
5401
|
+
"description": "Custom formatter for the displayed value. Defaults to rounded integer."
|
|
5402
|
+
}
|
|
5403
|
+
],
|
|
5404
|
+
"dependencies": [
|
|
5405
|
+
"class-variance-authority",
|
|
5406
|
+
"@phosphor-icons/react",
|
|
5407
|
+
"@loworbitstudio/visor-core"
|
|
5408
|
+
],
|
|
5409
|
+
"tokens_used": [
|
|
5410
|
+
"--border-default",
|
|
5411
|
+
"--font-size-base",
|
|
5412
|
+
"--font-size-sm",
|
|
5413
|
+
"--font-size-xs",
|
|
5414
|
+
"--font-weight-regular",
|
|
5415
|
+
"--font-weight-semibold",
|
|
5416
|
+
"--line-height-tight",
|
|
5417
|
+
"--motion-duration-150",
|
|
5418
|
+
"--motion-duration-500",
|
|
5419
|
+
"--motion-easing-default",
|
|
5420
|
+
"--radius-full",
|
|
5421
|
+
"--score-indicator-center-bg",
|
|
5422
|
+
"--score-indicator-icon-color",
|
|
5423
|
+
"--score-indicator-stroke-color",
|
|
5424
|
+
"--score-indicator-track-color",
|
|
5425
|
+
"--score-indicator-value-color",
|
|
5426
|
+
"--spacing-1",
|
|
5427
|
+
"--spacing-2",
|
|
5428
|
+
"--surface-card",
|
|
5429
|
+
"--surface-error-subtle",
|
|
5430
|
+
"--surface-info-subtle",
|
|
5431
|
+
"--surface-success-subtle",
|
|
5432
|
+
"--surface-warning-subtle",
|
|
5433
|
+
"--text-error",
|
|
5434
|
+
"--text-info",
|
|
5435
|
+
"--text-primary",
|
|
5436
|
+
"--text-success",
|
|
5437
|
+
"--text-tertiary",
|
|
5438
|
+
"--text-warning"
|
|
5439
|
+
],
|
|
5440
|
+
"example": "<ScoreIndicator value={98} max={100} />\n<ScoreIndicator value={42} max={100} size=\"lg\" />\n<ScoreIndicator value={86} max={100} tone=\"success\" denominator=\"below\" />\n"
|
|
5441
|
+
},
|
|
4796
5442
|
"scroll-area": {
|
|
4797
5443
|
"category": "layout",
|
|
4798
5444
|
"description": "Custom-styled scrollable container with thin scrollbar overlays.",
|
|
@@ -4877,6 +5523,52 @@
|
|
|
4877
5523
|
],
|
|
4878
5524
|
"example": "<SearchInput placeholder=\"Search...\" onClear={() => setValue('')} />\n"
|
|
4879
5525
|
},
|
|
5526
|
+
"section-header": {
|
|
5527
|
+
"category": "navigation",
|
|
5528
|
+
"description": "Compact section-divider primitive with an uppercase title and optional right-aligned meta label. Sized for in-page content sectioning, distinct from the page-level PageHeader.",
|
|
5529
|
+
"when_to_use": [
|
|
5530
|
+
"Dividing a page body into stacked sections (dashboard \"Tonight's events\", \"Activity\", \"This week\")",
|
|
5531
|
+
"Pairing a small uppercase label with a count, timestamp, or status on the right",
|
|
5532
|
+
"Establishing visual rhythm across 3-8 sections on a single page",
|
|
5533
|
+
"Replacing repeated inline eyebrow-row markup with a single primitive"
|
|
5534
|
+
],
|
|
5535
|
+
"when_not_to_use": [
|
|
5536
|
+
"Page-level hero with title, description, breadcrumb, and actions (use PageHeader)",
|
|
5537
|
+
"In-content typographic headings — h2 / h3 inside an article (use Heading)",
|
|
5538
|
+
"Action-bearing headers with buttons or menus (use PageHeader)",
|
|
5539
|
+
"Sticky table-section headers with sorting controls"
|
|
5540
|
+
],
|
|
5541
|
+
"props": [
|
|
5542
|
+
{
|
|
5543
|
+
"name": "title",
|
|
5544
|
+
"type": "React.ReactNode",
|
|
5545
|
+
"required": true,
|
|
5546
|
+
"description": "Uppercase tracking label rendered on the left."
|
|
5547
|
+
},
|
|
5548
|
+
{
|
|
5549
|
+
"name": "meta",
|
|
5550
|
+
"type": "React.ReactNode",
|
|
5551
|
+
"description": "Optional right-aligned meta — count, timestamp, status."
|
|
5552
|
+
},
|
|
5553
|
+
{
|
|
5554
|
+
"name": "as",
|
|
5555
|
+
"type": "'header' | 'div' | 'section'",
|
|
5556
|
+
"default": "header",
|
|
5557
|
+
"description": "Root element tag."
|
|
5558
|
+
}
|
|
5559
|
+
],
|
|
5560
|
+
"dependencies": [],
|
|
5561
|
+
"tokens_used": [
|
|
5562
|
+
"--font-size-sm",
|
|
5563
|
+
"--font-size-xs",
|
|
5564
|
+
"--font-weight-medium",
|
|
5565
|
+
"--spacing-3",
|
|
5566
|
+
"--spacing-4",
|
|
5567
|
+
"--surface-subtle",
|
|
5568
|
+
"--text-tertiary"
|
|
5569
|
+
],
|
|
5570
|
+
"example": "<SectionHeader title=\"Tonight's events\" meta=\"2 events\" />\n<SectionHeader title=\"Activity\" meta=\"last hour\" />\n<SectionHeader title=\"Top promoters · 30d\" />\n"
|
|
5571
|
+
},
|
|
4880
5572
|
"select": {
|
|
4881
5573
|
"category": "form",
|
|
4882
5574
|
"description": "An accessible select component built on Radix UI Select with all sub-components.",
|
|
@@ -5485,6 +6177,116 @@
|
|
|
5485
6177
|
],
|
|
5486
6178
|
"example": "<SpacingScale steps={[\n { token: \"--spacing-1\", name: \"1\", px: 4, rem: \"0.25rem\" },\n { token: \"--spacing-2\", name: \"2\", px: 8, rem: \"0.5rem\" },\n { token: \"--spacing-4\", name: \"4\", px: 16, rem: \"1rem\" },\n]} />\n"
|
|
5487
6179
|
},
|
|
6180
|
+
"sparkline": {
|
|
6181
|
+
"category": "data-display",
|
|
6182
|
+
"description": "A decorative inline SVG mini-trend chart for stat-card trend slots and dense data contexts. Renders a single polyline from a numeric series with zero dependencies.",
|
|
6183
|
+
"when_to_use": [
|
|
6184
|
+
"Trend slot inside a StatCard or KpiCard (e.g. \"RSVPs tonight\" with a 12-point series)",
|
|
6185
|
+
"Compact at-a-glance trend cues in dense tables, dashboards, or admin surfaces",
|
|
6186
|
+
"Multi-card KPI strips where each card needs a tiny visual trend hint",
|
|
6187
|
+
"Anywhere a 50-line decorative trend SVG would otherwise be rebuilt locally"
|
|
6188
|
+
],
|
|
6189
|
+
"when_not_to_use": [
|
|
6190
|
+
"Interactive charts with tooltips, hover state, or axis labels (use the `chart` primitive)",
|
|
6191
|
+
"Multi-series overlays or stacked datasets",
|
|
6192
|
+
"Standalone data visualizations that need to be independently navigable by assistive tech",
|
|
6193
|
+
"Area fills, sparkbars, sparkdots — these are separate primitives"
|
|
6194
|
+
],
|
|
6195
|
+
"props": [
|
|
6196
|
+
{
|
|
6197
|
+
"name": "values",
|
|
6198
|
+
"type": "number[]",
|
|
6199
|
+
"required": true,
|
|
6200
|
+
"description": "Numeric series. Minimum 2 values required — anything shorter renders nothing."
|
|
6201
|
+
},
|
|
6202
|
+
{
|
|
6203
|
+
"name": "width",
|
|
6204
|
+
"type": "number",
|
|
6205
|
+
"default": 96,
|
|
6206
|
+
"description": "SVG width in px."
|
|
6207
|
+
},
|
|
6208
|
+
{
|
|
6209
|
+
"name": "height",
|
|
6210
|
+
"type": "number",
|
|
6211
|
+
"default": 22,
|
|
6212
|
+
"description": "SVG height in px."
|
|
6213
|
+
},
|
|
6214
|
+
{
|
|
6215
|
+
"name": "color",
|
|
6216
|
+
"type": "string",
|
|
6217
|
+
"default": "var(--accent-primary)",
|
|
6218
|
+
"description": "Stroke color. Accepts any CSS color string — token, hex, hsl, oklch."
|
|
6219
|
+
},
|
|
6220
|
+
{
|
|
6221
|
+
"name": "strokeWidth",
|
|
6222
|
+
"type": "number",
|
|
6223
|
+
"default": 1.5,
|
|
6224
|
+
"description": "Stroke width in px."
|
|
6225
|
+
},
|
|
6226
|
+
{
|
|
6227
|
+
"name": "fluid",
|
|
6228
|
+
"type": "boolean",
|
|
6229
|
+
"default": false,
|
|
6230
|
+
"description": "When true, the rendered `<svg>` omits its `width` attribute so it fills its container (the `viewBox` preserves the aspect ratio). A CSS class forces `width 100%`, `height auto`, `display block`. Use inside flexible cards where the consumer would otherwise force `width 100%` via CSS.\n"
|
|
6231
|
+
},
|
|
6232
|
+
{
|
|
6233
|
+
"name": "aria-label",
|
|
6234
|
+
"type": "string",
|
|
6235
|
+
"description": "When supplied, the SVG becomes a labeled image and is announced. Omit for decorative use."
|
|
6236
|
+
}
|
|
6237
|
+
],
|
|
6238
|
+
"dependencies": [],
|
|
6239
|
+
"tokens_used": [],
|
|
6240
|
+
"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
|
+
},
|
|
6242
|
+
"stack": {
|
|
6243
|
+
"category": "layout",
|
|
6244
|
+
"description": "Vertical flex container with token-driven gap, alignment, and `as` polymorphism.",
|
|
6245
|
+
"when_to_use": [
|
|
6246
|
+
"Stacking content vertically with a consistent token-spaced gap",
|
|
6247
|
+
"Form sections, card bodies, page content blocks",
|
|
6248
|
+
"Anywhere you would write `flex flex-col gap-N` in Tailwind"
|
|
6249
|
+
],
|
|
6250
|
+
"when_not_to_use": [
|
|
6251
|
+
"Horizontal arrangements (use Inline)",
|
|
6252
|
+
"Two-dimensional grids (use Grid)",
|
|
6253
|
+
"When you need centered max-width chrome (use Container)"
|
|
6254
|
+
],
|
|
6255
|
+
"props": [
|
|
6256
|
+
{
|
|
6257
|
+
"name": "as",
|
|
6258
|
+
"type": "keyof JSX.IntrinsicElements",
|
|
6259
|
+
"default": "'div'",
|
|
6260
|
+
"description": "HTML element to render"
|
|
6261
|
+
},
|
|
6262
|
+
{
|
|
6263
|
+
"name": "gap",
|
|
6264
|
+
"type": "StackSpacing | ResponsiveProp<StackSpacing>",
|
|
6265
|
+
"default": "'md'",
|
|
6266
|
+
"description": "Space between children"
|
|
6267
|
+
},
|
|
6268
|
+
{
|
|
6269
|
+
"name": "align",
|
|
6270
|
+
"type": "'start' | 'center' | 'end' | 'stretch'",
|
|
6271
|
+
"description": "Cross-axis alignment"
|
|
6272
|
+
},
|
|
6273
|
+
{
|
|
6274
|
+
"name": "justify",
|
|
6275
|
+
"type": "'start' | 'center' | 'end' | 'between' | 'around' | 'evenly'",
|
|
6276
|
+
"description": "Main-axis alignment"
|
|
6277
|
+
}
|
|
6278
|
+
],
|
|
6279
|
+
"dependencies": [],
|
|
6280
|
+
"tokens_used": [
|
|
6281
|
+
"--spacing-4",
|
|
6282
|
+
"--stack-gap",
|
|
6283
|
+
"--stack-gap-lg",
|
|
6284
|
+
"--stack-gap-md",
|
|
6285
|
+
"--stack-gap-sm",
|
|
6286
|
+
"--stack-gap-xl"
|
|
6287
|
+
],
|
|
6288
|
+
"example": "<Stack gap=\"md\">\n <Heading>Title</Heading>\n <Text>Body copy</Text>\n <Button>Action</Button>\n</Stack>\n\n<Stack gap={{ base: \"sm\", md: \"lg\" }} align=\"center\">\n Responsive gap, centered\n</Stack>\n"
|
|
6289
|
+
},
|
|
5488
6290
|
"stat-card": {
|
|
5489
6291
|
"category": "admin",
|
|
5490
6292
|
"description": "Admin dashboard metric card with label, value, delta, trend, and footer slots.",
|
|
@@ -5583,6 +6385,7 @@
|
|
|
5583
6385
|
"--font-size-2xl",
|
|
5584
6386
|
"--font-size-3xl",
|
|
5585
6387
|
"--font-size-4xl",
|
|
6388
|
+
"--font-size-6xl",
|
|
5586
6389
|
"--font-size-sm",
|
|
5587
6390
|
"--font-size-xs",
|
|
5588
6391
|
"--font-weight-medium",
|
|
@@ -5604,8 +6407,10 @@
|
|
|
5604
6407
|
"--spacing-3",
|
|
5605
6408
|
"--spacing-4",
|
|
5606
6409
|
"--spacing-5",
|
|
6410
|
+
"--stat-card-trend-padding-top",
|
|
5607
6411
|
"--stat-card-value-font",
|
|
5608
6412
|
"--stat-card-value-size",
|
|
6413
|
+
"--stat-card-value-size-hero",
|
|
5609
6414
|
"--surface-card",
|
|
5610
6415
|
"--text-danger",
|
|
5611
6416
|
"--text-primary",
|
|
@@ -5788,6 +6593,7 @@
|
|
|
5788
6593
|
"Communicating operational state in admin tables, detail pages, and dashboards",
|
|
5789
6594
|
"Labeling service health (healthy, degraded, down)",
|
|
5790
6595
|
"Labeling job or task lifecycle (queued, running, pending, complete, failed, idle)",
|
|
6596
|
+
"Labeling admin-ui event state (live, warn, scheduled, sold, draft)",
|
|
5791
6597
|
{
|
|
5792
6598
|
"Any place you want a consistent \"Status": "X\" accessible announcement"
|
|
5793
6599
|
}
|
|
@@ -5807,7 +6613,12 @@
|
|
|
5807
6613
|
"pending",
|
|
5808
6614
|
"queued",
|
|
5809
6615
|
"idle",
|
|
5810
|
-
"complete"
|
|
6616
|
+
"complete",
|
|
6617
|
+
"live",
|
|
6618
|
+
"warn",
|
|
6619
|
+
"scheduled",
|
|
6620
|
+
"sold",
|
|
6621
|
+
"draft"
|
|
5811
6622
|
],
|
|
5812
6623
|
"tone": [
|
|
5813
6624
|
"subtle",
|
|
@@ -5861,6 +6672,54 @@
|
|
|
5861
6672
|
],
|
|
5862
6673
|
"example": "<StatusBadge status=\"healthy\" />\n<StatusBadge status=\"running\" pulse />\n<StatusBadge status=\"failed\" tone=\"filled\" />\n"
|
|
5863
6674
|
},
|
|
6675
|
+
"status-dot": {
|
|
6676
|
+
"category": "data-display",
|
|
6677
|
+
"description": "A 6×6px tone-tinted indicator dot — composes inside badges, table rows, activity feed items, and inline status text.",
|
|
6678
|
+
"when_to_use": [
|
|
6679
|
+
"As the leading slot of an ActivityFeed item to convey activity tone",
|
|
6680
|
+
"Inside a Badge to add a colored status indicator without StatusBadge's chrome",
|
|
6681
|
+
"In table cells to mark row status without a full label",
|
|
6682
|
+
"Inline with status text where the surrounding label already announces meaning"
|
|
6683
|
+
],
|
|
6684
|
+
"when_not_to_use": [
|
|
6685
|
+
"Standalone status without an adjacent label — prefer StatusBadge for a full labelled control",
|
|
6686
|
+
"Larger callouts or hero-scale indicators — single 6px size is intentional",
|
|
6687
|
+
"As an interactive affordance — StatusDot is a pure indicator with no behaviour"
|
|
6688
|
+
],
|
|
6689
|
+
"variants": {
|
|
6690
|
+
"tone": [
|
|
6691
|
+
"mint",
|
|
6692
|
+
"warn",
|
|
6693
|
+
"muted",
|
|
6694
|
+
"danger",
|
|
6695
|
+
"info"
|
|
6696
|
+
]
|
|
6697
|
+
},
|
|
6698
|
+
"props": [
|
|
6699
|
+
{
|
|
6700
|
+
"name": "tone",
|
|
6701
|
+
"type": "\"mint\" | \"warn\" | \"muted\" | \"danger\" | \"info\"",
|
|
6702
|
+
"default": "\"muted\"",
|
|
6703
|
+
"description": "Tone. Drives the dot fill via a Visor semantic token."
|
|
6704
|
+
},
|
|
6705
|
+
{
|
|
6706
|
+
"name": "aria-label",
|
|
6707
|
+
"type": "string",
|
|
6708
|
+
"optional": true,
|
|
6709
|
+
"description": "When supplied, the dot is announced as a labeled image (role=\"img\"). Omit when the dot is paired with adjacent status text — surrounding labels carry the semantic meaning and the dot stays decorative.\n"
|
|
6710
|
+
}
|
|
6711
|
+
],
|
|
6712
|
+
"dependencies": [],
|
|
6713
|
+
"tokens_used": [
|
|
6714
|
+
"--radius-full",
|
|
6715
|
+
"--surface-error-default",
|
|
6716
|
+
"--surface-info-default",
|
|
6717
|
+
"--surface-success-default",
|
|
6718
|
+
"--surface-warning-default",
|
|
6719
|
+
"--text-tertiary"
|
|
6720
|
+
],
|
|
6721
|
+
"example": "<StatusDot tone=\"mint\" />\n<Badge>\n <StatusDot tone=\"warn\" />\n 96% capacity\n</Badge>\n<StatusDot tone=\"danger\" aria-label=\"Service down\" />\n"
|
|
6722
|
+
},
|
|
5864
6723
|
"stepper": {
|
|
5865
6724
|
"category": "navigation",
|
|
5866
6725
|
"description": "A multi-step progress indicator with horizontal and vertical orientations and auto-derived step status.",
|
|
@@ -7537,7 +8396,7 @@
|
|
|
7537
8396
|
"blocks": {
|
|
7538
8397
|
"admin-dashboard": {
|
|
7539
8398
|
"category": "admin",
|
|
7540
|
-
"description": "Drop-in admin overview composition — PageHeader, responsive stat grid, optional secondary region, and ActivityFeed with empty-state fallback.
|
|
8399
|
+
"description": "Drop-in admin overview composition — PageHeader, responsive stat grid, optional secondary region, and ActivityFeed with empty-state fallback. Supports a 2-column body layout via `layout=\"split\"` (mainCol + sideCol slots) for density-rich operator screens.",
|
|
7541
8400
|
"components_used": [
|
|
7542
8401
|
"page-header",
|
|
7543
8402
|
"stat-card",
|
|
@@ -7547,7 +8406,8 @@
|
|
|
7547
8406
|
"when_to_use": [
|
|
7548
8407
|
"Landing page for an admin or back-office app",
|
|
7549
8408
|
"Overview-at-a-glance screens mixing KPIs and recent events",
|
|
7550
|
-
"Any dashboard needing a title, metrics, and a recent-activity feed"
|
|
8409
|
+
"Any dashboard needing a title, metrics, and a recent-activity feed",
|
|
8410
|
+
"Operator screens needing a main column + right rail below the KPI strip (use `layout=\"split\"`)"
|
|
7551
8411
|
],
|
|
7552
8412
|
"when_not_to_use": [
|
|
7553
8413
|
"Data-heavy list or table pages (use admin-list-page)",
|
|
@@ -7597,7 +8457,7 @@
|
|
|
7597
8457
|
},
|
|
7598
8458
|
"admin-settings-page": {
|
|
7599
8459
|
"category": "admin",
|
|
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.",
|
|
8460
|
+
"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. The default footer can also be replaced entirely via the `customFooter` slot (mirrors `admin-detail-drawer`'s `customHeader` precedent) when callers need full control over the savebar layout. Composes PageHeader, Separator, Heading, Text, Button, and ConfirmDialog.",
|
|
7601
8461
|
"components_used": [
|
|
7602
8462
|
"page-header",
|
|
7603
8463
|
"separator",
|
|
@@ -7677,6 +8537,23 @@
|
|
|
7677
8537
|
"Single-record inline edits (use admin-detail-drawer)"
|
|
7678
8538
|
]
|
|
7679
8539
|
},
|
|
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
|
+
},
|
|
7680
8557
|
"chip-group": {
|
|
7681
8558
|
"category": "form",
|
|
7682
8559
|
"description": "A composable container managing selection state for ChoiceChip (single-select) and FilterChip (multi-select) chips. Mirrors Flutter Material's chip selection model.",
|
|
@@ -7693,6 +8570,26 @@
|
|
|
7693
8570
|
"Large option lists with search (use Select or Combobox)"
|
|
7694
8571
|
]
|
|
7695
8572
|
},
|
|
8573
|
+
"command-dialog": {
|
|
8574
|
+
"category": "navigation",
|
|
8575
|
+
"description": "⌘K command palette block composing Visor's Command + Dialog primitives. Exposes named slots for a scope chip, grouped results with hit-highlighting, per-item meta + Kbd shortcut, and a footer hint row with result count. Binds ⌘K / Ctrl+K to toggle open by default.",
|
|
8576
|
+
"components_used": [
|
|
8577
|
+
"command",
|
|
8578
|
+
"dialog",
|
|
8579
|
+
"kbd"
|
|
8580
|
+
],
|
|
8581
|
+
"when_to_use": [
|
|
8582
|
+
"App-wide quick-search palette opened with ⌘K / Ctrl+K",
|
|
8583
|
+
"Grouped, keyboard-driven action menus (Events / Guests / Actions)",
|
|
8584
|
+
"Replacing multi-level menus with one searchable list"
|
|
8585
|
+
],
|
|
8586
|
+
"when_not_to_use": [
|
|
8587
|
+
"Simple dropdown selection from a short list (use Select or Combobox)",
|
|
8588
|
+
"Form field autocomplete with free text input (use Combobox)",
|
|
8589
|
+
"Modal confirmations or destructive prompts (use Dialog or ConfirmDialog)",
|
|
8590
|
+
"Persistent inline search (use Input + filtered list directly)"
|
|
8591
|
+
]
|
|
8592
|
+
},
|
|
7696
8593
|
"configuration-panel": {
|
|
7697
8594
|
"category": "configuration",
|
|
7698
8595
|
"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.",
|
|
@@ -7792,6 +8689,29 @@
|
|
|
7792
8689
|
"Production user-facing pages"
|
|
7793
8690
|
]
|
|
7794
8691
|
},
|
|
8692
|
+
"export-menu": {
|
|
8693
|
+
"category": "admin",
|
|
8694
|
+
"description": "Export button + popover composing a format-picker radio group, optional scope checkboxes, and an async-aware Cancel/Export footer. Drop-in for any admin list's export affordance.",
|
|
8695
|
+
"components_used": [
|
|
8696
|
+
"button",
|
|
8697
|
+
"popover",
|
|
8698
|
+
"radio-group",
|
|
8699
|
+
"checkbox",
|
|
8700
|
+
"label",
|
|
8701
|
+
"tooltip"
|
|
8702
|
+
],
|
|
8703
|
+
"when_to_use": [
|
|
8704
|
+
"Admin list pages with an Export button (org lists, member tables, invitation tables, roles tables, audit logs)",
|
|
8705
|
+
"Anywhere a single button needs to surface format choice (CSV / JSON / PDF / XLSX) and optional scope toggles (Include archived, Include suspended) before kicking off an export",
|
|
8706
|
+
"When async export work needs a built-in loading state on the submit button and a popover that stays open until the work resolves"
|
|
8707
|
+
],
|
|
8708
|
+
"when_not_to_use": [
|
|
8709
|
+
"Single-format exports without scope or option choices — use a plain `<Button>` instead",
|
|
8710
|
+
"Scheduled / recurring exports — out of scope; needs a dedicated scheduled-export block",
|
|
8711
|
+
"Email-the-export workflows where the popover needs an email recipient input (extend on the consumer side, or file a new ticket)",
|
|
8712
|
+
"Public marketing pages — this is an admin-only affordance"
|
|
8713
|
+
]
|
|
8714
|
+
},
|
|
7795
8715
|
"features-grid": {
|
|
7796
8716
|
"category": "marketing",
|
|
7797
8717
|
"description": "A responsive grid of feature cards with icons, titles, and descriptions. Demonstrates Card + icon composition in a configurable grid layout.",
|
|
@@ -7886,6 +8806,56 @@
|
|
|
7886
8806
|
"Feature comparison tables without pricing"
|
|
7887
8807
|
]
|
|
7888
8808
|
},
|
|
8809
|
+
"profile-menu": {
|
|
8810
|
+
"category": "admin",
|
|
8811
|
+
"description": "Sidebar-footer profile menu — avatar + identity row + upward-opening dropdown of account, notifications, appearance, keyboard, help, and sign-out items. Drop-in for the AdminShell sidebarFooter slot.",
|
|
8812
|
+
"components_used": [
|
|
8813
|
+
"avatar",
|
|
8814
|
+
"dropdown-menu"
|
|
8815
|
+
],
|
|
8816
|
+
"when_to_use": [
|
|
8817
|
+
"Admin and dashboard apps with persistent sidebar navigation",
|
|
8818
|
+
"The sidebar footer area of `AdminShell` — drop into the `sidebarFooter` prop",
|
|
8819
|
+
"Anywhere you need a Mac-style user menu with shortcuts, badges, and a destructive sign-out"
|
|
8820
|
+
],
|
|
8821
|
+
"when_not_to_use": [
|
|
8822
|
+
"Public marketing pages (no signed-in user context)",
|
|
8823
|
+
"Topbar user menus where downward opening is the convention (compose `DropdownMenu` + `Avatar` directly)",
|
|
8824
|
+
"Single-action sign-out buttons (use `Button` with `variant=\"ghost\"` instead)",
|
|
8825
|
+
"Loading or skeleton states (consumer renders their own skeleton until user data is ready)"
|
|
8826
|
+
]
|
|
8827
|
+
},
|
|
8828
|
+
"prototype-review": {
|
|
8829
|
+
"category": "documentation",
|
|
8830
|
+
"description": "Drop-in chrome for design-review prototypes — theme switcher, light/dark mode toggle, brand color picker, treatment tabs, viewport switcher, and a multi-viewport iframe grid. Replaces hand-rolled review HTML (BL-193 style) with a Visor-native block.",
|
|
8831
|
+
"components_used": [],
|
|
8832
|
+
"when_to_use": [
|
|
8833
|
+
"Phase 2+ design-review prototypes that need to evaluate one or more iframe-loaded treatments",
|
|
8834
|
+
"Any UI exploration where reviewers must compare treatments across themes, modes, brand colors, and viewports",
|
|
8835
|
+
"Internal \"design spike\" docs where 3-4 candidate UIs must render side-by-side with shared chrome",
|
|
8836
|
+
"As the visual entry point for a Linear ticket's prototype directory (replaces hand-rolled static HTML)"
|
|
8837
|
+
],
|
|
8838
|
+
"when_not_to_use": [
|
|
8839
|
+
"Production user-facing pages (use marketing or admin blocks)",
|
|
8840
|
+
"Prototypes that already live inside a richer doc system with its own chrome (e.g. Storybook, fumadocs MDX pages)",
|
|
8841
|
+
"Single-treatment reviews with no need for per-treatment switching (just embed the iframe directly)"
|
|
8842
|
+
]
|
|
8843
|
+
},
|
|
8844
|
+
"right-rail-list": {
|
|
8845
|
+
"category": "data-display",
|
|
8846
|
+
"description": "Compact vertical list block tuned for admin dashboard side rails. Each row pairs an optional leading slot (short label, avatar, badge, status dot), a primary label (typically a link), and an optional trailing meta value (count, value, tone-tinted status word). Trailing accepts default / mint / muted / warn tones that bind to the shared semantic text tokens. Supports compact density and ul / ol / div root element variants.",
|
|
8847
|
+
"components_used": [],
|
|
8848
|
+
"when_to_use": [
|
|
8849
|
+
"Side-rail summary panels in dashboards (this-week digests, top-N rankings, status callouts)",
|
|
8850
|
+
"Stacking multiple short list panels in a single column",
|
|
8851
|
+
"Any compact label-plus-value row pattern where each row carries an optional leading stamp"
|
|
8852
|
+
],
|
|
8853
|
+
"when_not_to_use": [
|
|
8854
|
+
"Timestamped activity streams (use activity-feed)",
|
|
8855
|
+
"Sortable / paginated tabular data (use data-table)",
|
|
8856
|
+
"Long-form ranked lists with rich row content (use a full table or card grid)"
|
|
8857
|
+
]
|
|
8858
|
+
},
|
|
7889
8859
|
"sphere-playground": {
|
|
7890
8860
|
"category": "visual-elements",
|
|
7891
8861
|
"description": "An interactive demo composing the Sphere visualization with a Configuration Panel for real-time parameter control. The signature showcase for Visual Elements.",
|
|
@@ -8676,17 +9646,21 @@
|
|
|
8676
9646
|
"chart",
|
|
8677
9647
|
"marquee",
|
|
8678
9648
|
"name-roster",
|
|
9649
|
+
"sparkline",
|
|
9650
|
+
"status-dot",
|
|
8679
9651
|
"table",
|
|
8680
9652
|
"timeline"
|
|
8681
9653
|
],
|
|
8682
9654
|
"admin": [
|
|
8683
9655
|
"activity-feed",
|
|
8684
9656
|
"bulk-action-bar",
|
|
9657
|
+
"chrome-button",
|
|
8685
9658
|
"confirm-dialog",
|
|
8686
9659
|
"data-table",
|
|
8687
9660
|
"empty-state",
|
|
8688
9661
|
"filter-bar",
|
|
8689
9662
|
"kbd",
|
|
9663
|
+
"score-indicator",
|
|
8690
9664
|
"stat-card",
|
|
8691
9665
|
"stat-hero",
|
|
8692
9666
|
"status-badge"
|
|
@@ -8700,12 +9674,25 @@
|
|
|
8700
9674
|
"toast",
|
|
8701
9675
|
"tooltip"
|
|
8702
9676
|
],
|
|
9677
|
+
"layout": [
|
|
9678
|
+
"box",
|
|
9679
|
+
"collapsible",
|
|
9680
|
+
"container",
|
|
9681
|
+
"grid",
|
|
9682
|
+
"inline",
|
|
9683
|
+
"scroll-area",
|
|
9684
|
+
"separator",
|
|
9685
|
+
"sidebar",
|
|
9686
|
+
"stack"
|
|
9687
|
+
],
|
|
8703
9688
|
"navigation": [
|
|
8704
9689
|
"breadcrumb",
|
|
8705
9690
|
"command",
|
|
8706
9691
|
"navbar",
|
|
8707
9692
|
"page-header",
|
|
8708
9693
|
"pagination",
|
|
9694
|
+
"quick-actions",
|
|
9695
|
+
"section-header",
|
|
8709
9696
|
"stepper",
|
|
8710
9697
|
"tabs"
|
|
8711
9698
|
],
|
|
@@ -8714,6 +9701,7 @@
|
|
|
8714
9701
|
"calendar",
|
|
8715
9702
|
"checkbox",
|
|
8716
9703
|
"chip",
|
|
9704
|
+
"color-picker",
|
|
8717
9705
|
"combobox",
|
|
8718
9706
|
"date-picker",
|
|
8719
9707
|
"date-range-picker",
|
|
@@ -8747,12 +9735,6 @@
|
|
|
8747
9735
|
"heading",
|
|
8748
9736
|
"text"
|
|
8749
9737
|
],
|
|
8750
|
-
"layout": [
|
|
8751
|
-
"collapsible",
|
|
8752
|
-
"scroll-area",
|
|
8753
|
-
"separator",
|
|
8754
|
-
"sidebar"
|
|
8755
|
-
],
|
|
8756
9738
|
"overlay": [
|
|
8757
9739
|
"context-menu",
|
|
8758
9740
|
"dialog",
|