@loworbitstudio/visor 1.0.0 → 1.2.1
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 +43 -1
- package/dist/index.js +1128 -24
- package/dist/registry.json +289 -3
- package/dist/visor-manifest.json +612 -7
- 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-20T19:48:54.653Z",
|
|
4
4
|
"components": {
|
|
5
5
|
"accessibility-specimen": {
|
|
6
6
|
"category": "specimen",
|
|
@@ -690,6 +690,89 @@
|
|
|
690
690
|
],
|
|
691
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"
|
|
692
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
|
+
},
|
|
693
776
|
"breadcrumb": {
|
|
694
777
|
"category": "navigation",
|
|
695
778
|
"description": "A breadcrumb navigation component showing the user's location within a page hierarchy.",
|
|
@@ -1687,6 +1770,120 @@
|
|
|
1687
1770
|
],
|
|
1688
1771
|
"example": "<ColorBar token=\"--interactive-primary-bg\" label=\"Brand Color\" />\n"
|
|
1689
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
|
+
},
|
|
1690
1887
|
"color-swatch": {
|
|
1691
1888
|
"category": "specimen",
|
|
1692
1889
|
"description": "Individual color swatch with hex value display, plus grid variants for color scales and semantic color tokens.",
|
|
@@ -2089,6 +2286,47 @@
|
|
|
2089
2286
|
],
|
|
2090
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"
|
|
2091
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
|
+
},
|
|
2092
2330
|
"context-menu": {
|
|
2093
2331
|
"category": "overlay",
|
|
2094
2332
|
"description": "Right-click menu with actions, checkboxes, radio items, and sub-menus.",
|
|
@@ -2332,6 +2570,12 @@
|
|
|
2332
2570
|
"default": "false",
|
|
2333
2571
|
"description": "When true, the thead is positioned sticky at the top of the scroll container."
|
|
2334
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
|
+
},
|
|
2335
2579
|
{
|
|
2336
2580
|
"name": "rowTone",
|
|
2337
2581
|
"type": "(row: TData) => \"live\" | \"warn\" | \"scheduled\" | \"sold\" | \"draft\" | \"danger\" | \"info\" | undefined",
|
|
@@ -2351,6 +2595,7 @@
|
|
|
2351
2595
|
"tokens_used": [
|
|
2352
2596
|
"--border-default",
|
|
2353
2597
|
"--border-strong",
|
|
2598
|
+
"--dt-row-py",
|
|
2354
2599
|
"--focus-ring-color",
|
|
2355
2600
|
"--focus-ring-offset",
|
|
2356
2601
|
"--focus-ring-width",
|
|
@@ -2367,6 +2612,7 @@
|
|
|
2367
2612
|
"--spacing-2",
|
|
2368
2613
|
"--spacing-3",
|
|
2369
2614
|
"--spacing-4",
|
|
2615
|
+
"--spacing-5",
|
|
2370
2616
|
"--spacing-6",
|
|
2371
2617
|
"--spacing-8",
|
|
2372
2618
|
"--surface-card",
|
|
@@ -3371,6 +3617,66 @@
|
|
|
3371
3617
|
],
|
|
3372
3618
|
"example": "<FullscreenOverlay>\n <FullscreenOverlayTrigger>Expand</FullscreenOverlayTrigger>\n <FullscreenOverlayContent>\n <p>Full-screen content here</p>\n </FullscreenOverlayContent>\n</FullscreenOverlay>\n"
|
|
3373
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
|
+
},
|
|
3374
3680
|
"heading": {
|
|
3375
3681
|
"category": "typography",
|
|
3376
3682
|
"description": "A semantic heading component (h1-h6) with independent size and weight variants.",
|
|
@@ -3586,6 +3892,61 @@
|
|
|
3586
3892
|
],
|
|
3587
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"
|
|
3588
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
|
+
},
|
|
3589
3950
|
"input": {
|
|
3590
3951
|
"category": "form",
|
|
3591
3952
|
"description": "A text input component with focus and validation states.",
|
|
@@ -4964,6 +5325,120 @@
|
|
|
4964
5325
|
],
|
|
4965
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"
|
|
4966
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
|
+
},
|
|
4967
5442
|
"scroll-area": {
|
|
4968
5443
|
"category": "layout",
|
|
4969
5444
|
"description": "Custom-styled scrollable container with thin scrollbar overlays.",
|
|
@@ -5764,6 +6239,54 @@
|
|
|
5764
6239
|
"tokens_used": [],
|
|
5765
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"
|
|
5766
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
|
+
},
|
|
5767
6290
|
"stat-card": {
|
|
5768
6291
|
"category": "admin",
|
|
5769
6292
|
"description": "Admin dashboard metric card with label, value, delta, trend, and footer slots.",
|
|
@@ -8014,6 +8537,23 @@
|
|
|
8014
8537
|
"Single-record inline edits (use admin-detail-drawer)"
|
|
8015
8538
|
]
|
|
8016
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
|
+
},
|
|
8017
8557
|
"chip-group": {
|
|
8018
8558
|
"category": "form",
|
|
8019
8559
|
"description": "A composable container managing selection state for ChoiceChip (single-select) and FilterChip (multi-select) chips. Mirrors Flutter Material's chip selection model.",
|
|
@@ -8149,6 +8689,29 @@
|
|
|
8149
8689
|
"Production user-facing pages"
|
|
8150
8690
|
]
|
|
8151
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
|
+
},
|
|
8152
8715
|
"features-grid": {
|
|
8153
8716
|
"category": "marketing",
|
|
8154
8717
|
"description": "A responsive grid of feature cards with icons, titles, and descriptions. Demonstrates Card + icon composition in a configurable grid layout.",
|
|
@@ -8243,6 +8806,41 @@
|
|
|
8243
8806
|
"Feature comparison tables without pricing"
|
|
8244
8807
|
]
|
|
8245
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
|
+
},
|
|
8246
8844
|
"right-rail-list": {
|
|
8247
8845
|
"category": "data-display",
|
|
8248
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.",
|
|
@@ -9062,6 +9660,7 @@
|
|
|
9062
9660
|
"empty-state",
|
|
9063
9661
|
"filter-bar",
|
|
9064
9662
|
"kbd",
|
|
9663
|
+
"score-indicator",
|
|
9065
9664
|
"stat-card",
|
|
9066
9665
|
"stat-hero",
|
|
9067
9666
|
"status-badge"
|
|
@@ -9075,6 +9674,17 @@
|
|
|
9075
9674
|
"toast",
|
|
9076
9675
|
"tooltip"
|
|
9077
9676
|
],
|
|
9677
|
+
"layout": [
|
|
9678
|
+
"box",
|
|
9679
|
+
"collapsible",
|
|
9680
|
+
"container",
|
|
9681
|
+
"grid",
|
|
9682
|
+
"inline",
|
|
9683
|
+
"scroll-area",
|
|
9684
|
+
"separator",
|
|
9685
|
+
"sidebar",
|
|
9686
|
+
"stack"
|
|
9687
|
+
],
|
|
9078
9688
|
"navigation": [
|
|
9079
9689
|
"breadcrumb",
|
|
9080
9690
|
"command",
|
|
@@ -9091,6 +9701,7 @@
|
|
|
9091
9701
|
"calendar",
|
|
9092
9702
|
"checkbox",
|
|
9093
9703
|
"chip",
|
|
9704
|
+
"color-picker",
|
|
9094
9705
|
"combobox",
|
|
9095
9706
|
"date-picker",
|
|
9096
9707
|
"date-range-picker",
|
|
@@ -9124,12 +9735,6 @@
|
|
|
9124
9735
|
"heading",
|
|
9125
9736
|
"text"
|
|
9126
9737
|
],
|
|
9127
|
-
"layout": [
|
|
9128
|
-
"collapsible",
|
|
9129
|
-
"scroll-area",
|
|
9130
|
-
"separator",
|
|
9131
|
-
"sidebar"
|
|
9132
|
-
],
|
|
9133
9738
|
"overlay": [
|
|
9134
9739
|
"context-menu",
|
|
9135
9740
|
"dialog",
|