@loworbitstudio/visor 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "0.4.0",
3
- "generated_at": "2026-04-28T22:06:10.255Z",
3
+ "generated_at": "2026-05-01T00:42:09.764Z",
4
4
  "components": {
5
5
  "accessibility-specimen": {
6
6
  "category": "specimen",
@@ -1432,6 +1432,16 @@
1432
1432
  "name": "onOpenChange",
1433
1433
  "type": "(open: boolean) => void",
1434
1434
  "description": "Callback when CommandDialog open state changes"
1435
+ },
1436
+ {
1437
+ "name": "contentClassName",
1438
+ "type": "string",
1439
+ "description": "Additional class name merged onto DialogContent via cn(). Use for width, padding, or elevation overrides (e.g. the V7 640 px / 540 px palette spec)."
1440
+ },
1441
+ {
1442
+ "name": "contentProps",
1443
+ "type": "Omit<React.ComponentProps<typeof DialogContent>, 'className' | 'children'>",
1444
+ "description": "Spread of any remaining DialogContent props (e.g. onOpenAutoFocus, onCloseAutoFocus, onPointerDownOutside, onEscapeKeyDown). className and children are excluded to prevent conflicts."
1435
1445
  }
1436
1446
  ],
1437
1447
  "sub_components": [
@@ -1779,8 +1789,17 @@
1779
1789
  {
1780
1790
  "name": "data",
1781
1791
  "type": "TData[]",
1782
- "required": true,
1783
- "description": "Array of row records."
1792
+ "description": "Array of row records. Optional when `rows` is provided — DataTable derives the data array from row entries internally."
1793
+ },
1794
+ {
1795
+ "name": "rows",
1796
+ "type": "DataTableRow<TData>[]",
1797
+ "description": "Mixed render order with group-head separators. Each entry is either `{ kind: \"group\", id, label, count? }` or `{ kind: \"data\", id, row }`. When provided, the caller owns sort/grouping/windowing — column header sort UI and the pagination footer are suppressed. Group rows render full-width via colSpan and are excluded from selection state.\n"
1798
+ },
1799
+ {
1800
+ "name": "groupRowRenderer",
1801
+ "type": "(group: DataTableGroupRow) => React.ReactNode",
1802
+ "description": "Optional render slot for custom group-head content. When omitted, the default renderer shows label + optional count using the eyebrow type scale and `--surface-subtle` background."
1784
1803
  },
1785
1804
  {
1786
1805
  "name": "sorting",
@@ -1880,6 +1899,8 @@
1880
1899
  "--focus-ring-offset",
1881
1900
  "--focus-ring-width",
1882
1901
  "--font-size-sm",
1902
+ "--font-size-xs",
1903
+ "--font-weight-medium",
1883
1904
  "--font-weight-semibold",
1884
1905
  "--line-height-tight",
1885
1906
  "--motion-duration-fast",
@@ -1893,7 +1914,9 @@
1893
1914
  "--spacing-6",
1894
1915
  "--spacing-8",
1895
1916
  "--surface-card",
1917
+ "--surface-subtle",
1896
1918
  "--text-primary",
1919
+ "--text-quaternary",
1897
1920
  "--text-secondary",
1898
1921
  "--text-tertiary"
1899
1922
  ],
@@ -2452,6 +2475,7 @@
2452
2475
  ],
2453
2476
  "tokens_used": [
2454
2477
  "--font-size-sm",
2478
+ "--font-size-xs",
2455
2479
  "--font-weight-medium",
2456
2480
  "--font-weight-normal",
2457
2481
  "--spacing-1",
@@ -2778,6 +2802,11 @@
2778
2802
  "type": "'onSubmit' | 'onBlur' | 'onInput'",
2779
2803
  "default": "onBlur",
2780
2804
  "description": "When to trigger client-side validation"
2805
+ },
2806
+ {
2807
+ "name": "passwordManagers",
2808
+ "type": "'ignore' | 'allow'",
2809
+ "description": "Form-level default for password-manager autofill on descendant Input and Textarea fields. Field-level passwordManagers prop always wins. When omitted, fields fall back to their own default of \"ignore\".\n"
2781
2810
  }
2782
2811
  ],
2783
2812
  "sub_components": [
@@ -3126,6 +3155,12 @@
3126
3155
  "name": "leadingIcon",
3127
3156
  "type": "React.ReactNode",
3128
3157
  "description": "Optional leading glyph rendered inside the field (e.g. a Phosphor icon). The input reserves enough left padding to clear it."
3158
+ },
3159
+ {
3160
+ "name": "passwordManagers",
3161
+ "type": "'ignore' | 'allow'",
3162
+ "default": "ignore",
3163
+ "description": "Controls password-manager autofill behavior. Defaults to \"ignore\" so contact, marketing, and settings forms don't render 1Password/Bitwarden/LastPass autofill icons. Set to \"allow\" on login and credential fields. When \"ignore\", emits data-1p-ignore, data-bwignore, data-lpignore, and data-form-type=\"other\" — the four per-manager opt-out attributes browsers honor where autocomplete=\"off\" is ignored.\n"
3129
3164
  }
3130
3165
  ],
3131
3166
  "dependencies": [],
@@ -3150,7 +3185,7 @@
3150
3185
  "--text-primary",
3151
3186
  "--text-secondary"
3152
3187
  ],
3153
- "example": "<Input type=\"email\" placeholder=\"you@example.com\" />\n\n<Input type=\"password\" aria-invalid=\"true\" />\n"
3188
+ "example": "<Input type=\"email\" placeholder=\"you@example.com\" />\n\n<Input type=\"password\" passwordManagers=\"allow\" aria-invalid=\"true\" />\n"
3154
3189
  },
3155
3190
  "kbd": {
3156
3191
  "category": "admin",
@@ -4925,6 +4960,11 @@
4925
4960
  "size": [
4926
4961
  "sm",
4927
4962
  "md"
4963
+ ],
4964
+ "valueAs": [
4965
+ "default",
4966
+ "hero",
4967
+ "compact"
4928
4968
  ]
4929
4969
  },
4930
4970
  "props": [
@@ -4972,6 +5012,17 @@
4972
5012
  "type": "'sm' | 'md'",
4973
5013
  "default": "md",
4974
5014
  "description": "Dimensional density. Use sm for dense rows of compact cards; md is the default dashboard size."
5015
+ },
5016
+ {
5017
+ "name": "valueAs",
5018
+ "type": "'default' | 'hero' | 'compact'",
5019
+ "default": "default",
5020
+ "description": "Typography scale for the value. \"hero\" applies a marquee display treatment (large font, display weight, tabular-nums, letter-spacing 0). \"compact\" uses a tighter 2xl size. Override the font and size via --stat-card-value-font and --stat-card-value-size CSS custom properties.\n"
5021
+ },
5022
+ {
5023
+ "name": "valueClassName",
5024
+ "type": "string",
5025
+ "description": "Additional class names forwarded to the value element for fully custom value rendering."
4975
5026
  }
4976
5027
  ],
4977
5028
  "dependencies": [
@@ -4979,6 +5030,7 @@
4979
5030
  ],
4980
5031
  "tokens_used": [
4981
5032
  "--border-default",
5033
+ "--font-display",
4982
5034
  "--font-family-heading",
4983
5035
  "--font-size-2xl",
4984
5036
  "--font-size-3xl",
@@ -4986,6 +5038,7 @@
4986
5038
  "--font-size-sm",
4987
5039
  "--font-size-xs",
4988
5040
  "--font-weight-medium",
5041
+ "--font-weight-normal",
4989
5042
  "--font-weight-regular",
4990
5043
  "--font-weight-semibold",
4991
5044
  "--interactive-primary-bg",
@@ -5003,6 +5056,8 @@
5003
5056
  "--spacing-3",
5004
5057
  "--spacing-4",
5005
5058
  "--spacing-5",
5059
+ "--stat-card-value-font",
5060
+ "--stat-card-value-size",
5006
5061
  "--surface-card",
5007
5062
  "--text-danger",
5008
5063
  "--text-primary",
@@ -5429,6 +5484,7 @@
5429
5484
  "--spacing-2",
5430
5485
  "--surface-muted",
5431
5486
  "--surface-page",
5487
+ "--tabs-indicator-color",
5432
5488
  "--text-primary",
5433
5489
  "--text-secondary"
5434
5490
  ],
@@ -5626,6 +5682,12 @@
5626
5682
  {
5627
5683
  "name": "placeholder",
5628
5684
  "type": "string"
5685
+ },
5686
+ {
5687
+ "name": "passwordManagers",
5688
+ "type": "'ignore' | 'allow'",
5689
+ "default": "ignore",
5690
+ "description": "Controls password-manager autofill behavior. Defaults to \"ignore\" so contact, marketing, and settings forms don't render 1Password/Bitwarden/LastPass autofill icons. Set to \"allow\" on the rare credential field where autofill is desired. When \"ignore\", emits data-1p-ignore, data-bwignore, data-lpignore, and data-form-type=\"other\" — the four per-manager opt-out attributes browsers honor where autocomplete=\"off\" is ignored.\n"
5629
5691
  }
5630
5692
  ],
5631
5693
  "dependencies": [],
@@ -5651,6 +5713,81 @@
5651
5713
  ],
5652
5714
  "example": "<Textarea placeholder=\"Write your message...\" rows={4} />\n\n<Textarea aria-invalid=\"true\" />\n"
5653
5715
  },
5716
+ "theme-switcher": {
5717
+ "category": "general",
5718
+ "description": "Fixed-position pill switcher for theme and dark/light mode, with an extras slot for hosting devtools chrome.",
5719
+ "when_to_use": [
5720
+ "Hosts apps that ship multiple Visor themes and need a runtime switcher",
5721
+ "Dark/light mode toggle persisted across sessions",
5722
+ "Mounting devtools chrome (e.g., SourceInspectorToggle) into a stable host"
5723
+ ],
5724
+ "when_not_to_use": [
5725
+ "Production-only chrome with no dev affordances (use a tighter custom switcher)",
5726
+ "Single-theme apps that only need a mode toggle (build a leaner control)"
5727
+ ],
5728
+ "props": [
5729
+ {
5730
+ "name": "themes",
5731
+ "type": "ThemeOption[]",
5732
+ "default": "[]",
5733
+ "description": "List of themes available in the Theme segment. Empty list hides the Theme segment and only renders Mode."
5734
+ },
5735
+ {
5736
+ "name": "defaultThemeId",
5737
+ "type": "string",
5738
+ "default": "themes[0]?.id",
5739
+ "description": "Initial theme id when nothing is stored."
5740
+ },
5741
+ {
5742
+ "name": "defaultMode",
5743
+ "type": "'dark' | 'light'",
5744
+ "default": "dark"
5745
+ },
5746
+ {
5747
+ "name": "themeStorageKey",
5748
+ "type": "string",
5749
+ "default": "visor-theme"
5750
+ },
5751
+ {
5752
+ "name": "modeStorageKey",
5753
+ "type": "string",
5754
+ "default": "visor-color-mode"
5755
+ },
5756
+ {
5757
+ "name": "extras",
5758
+ "type": "React.ReactNode",
5759
+ "description": "Rendered after the Mode segment, inside the wrapper. For dev chrome (e.g., SourceInspectorToggle)."
5760
+ },
5761
+ {
5762
+ "name": "className",
5763
+ "type": "string",
5764
+ "description": "Additional className merged onto the root wrapper."
5765
+ }
5766
+ ],
5767
+ "dependencies": [],
5768
+ "tokens_used": [
5769
+ "--border-focus",
5770
+ "--focus-ring-offset",
5771
+ "--focus-ring-width",
5772
+ "--font-body",
5773
+ "--font-size-xs",
5774
+ "--font-weight-medium",
5775
+ "--motion-duration-100",
5776
+ "--motion-easing-default",
5777
+ "--radius-full",
5778
+ "--shadow-md",
5779
+ "--spacing-1",
5780
+ "--spacing-2",
5781
+ "--spacing-3",
5782
+ "--stroke-width-thin",
5783
+ "--surface-card",
5784
+ "--surface-popover",
5785
+ "--text-primary",
5786
+ "--text-secondary",
5787
+ "--text-tertiary"
5788
+ ],
5789
+ "example": "import { ThemeSwitcher } from \"@/components/ui/theme-switcher/theme-switcher\"\nimport { SourceInspectorToggle } from \"@/components/devtools/source-inspector/source-inspector-toggle\"\n\n<ThemeSwitcher\n themes={[\n { id: \"default\", label: \"Default\", bodyClass: \"\" },\n { id: \"blackout\", label: \"Blackout\", bodyClass: \"blackout-theme\" },\n ]}\n extras={<SourceInspectorToggle />}\n/>\n"
5790
+ },
5654
5791
  "timeline": {
5655
5792
  "category": "data-display",
5656
5793
  "description": "A vertical timeline with status-based styling, optional icons, timestamps, and connector lines.",
@@ -6706,7 +6843,7 @@
6706
6843
  },
6707
6844
  "admin-detail-drawer": {
6708
6845
  "category": "admin",
6709
- "description": "Right-side slide-out panel for viewing or editing a single record. Composes Sheet with a sticky save/cancel footer, async save handler with pending state, an unsaved-changes guard powered by ConfirmDialog, and sm/md/lg/xl width variants.",
6846
+ "description": "Right-side slide-out panel for viewing or editing a single record. Composes Sheet with a sticky save/cancel footer, async save handler with pending state, an unsaved-changes guard powered by ConfirmDialog, sm/md/lg/xl width variants, and optional header customization via hideHeader and customHeader props.",
6710
6847
  "components_used": [
6711
6848
  "sheet",
6712
6849
  "button",
@@ -6746,7 +6883,7 @@
6746
6883
  },
6747
6884
  "admin-settings-page": {
6748
6885
  "category": "admin",
6749
- "description": "Long scrollable settings archetype with labeled sections and an optional sticky left-side nav that sync-scrolls via intersection observer. Supports two mutually-exclusive modes — a single global sticky save/cancel footer (default) or per-section save/revert footer rows. Composes PageHeader, Separator, Heading, Text, Button, and ConfirmDialog.",
6886
+ "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.",
6750
6887
  "components_used": [
6751
6888
  "page-header",
6752
6889
  "separator",
@@ -7074,6 +7211,25 @@
7074
7211
  "Product reviews with ratings (extend with star component)",
7075
7212
  "User-generated content feeds"
7076
7213
  ]
7214
+ },
7215
+ "workspace-switcher": {
7216
+ "category": "admin",
7217
+ "description": "Sidebar-header workspace switcher composing a button trigger and a DropdownMenu of available workspaces. The trigger displays the current workspace's avatar, name, optional plan/role line, and a caret. Used in the AdminShell's `logo` slot for multi-tenant admin apps.",
7218
+ "components_used": [
7219
+ "avatar",
7220
+ "dropdown-menu"
7221
+ ],
7222
+ "when_to_use": [
7223
+ "Multi-tenant admin apps where users belong to multiple workspaces or organizations",
7224
+ "Sidebar header (`logo` slot) of `AdminShell` to swap the active workspace context",
7225
+ "Any UI where the active org/team is part of the user's mental address bar"
7226
+ ],
7227
+ "when_not_to_use": [
7228
+ "Single-tenant apps with no concept of switching context",
7229
+ "Search-to-filter pickers (use a combobox or command palette instead)",
7230
+ "Workspace creation flows (consumer composes those above or below the switcher)",
7231
+ "Loading or skeleton states (consumer renders their own skeleton until data is ready)"
7232
+ ]
7077
7233
  }
7078
7234
  },
7079
7235
  "hooks": {
@@ -7871,6 +8027,9 @@
7871
8027
  "menubar",
7872
8028
  "sheet"
7873
8029
  ],
8030
+ "general": [
8031
+ "theme-switcher"
8032
+ ],
7874
8033
  "deck": [
7875
8034
  "deck-card-grid",
7876
8035
  "deck-carousel-gallery",
@@ -8411,6 +8570,13 @@
8411
8570
  "defaultLight": "4px",
8412
8571
  "defaultDark": "4px"
8413
8572
  },
8573
+ {
8574
+ "name": "--font-size-2xs",
8575
+ "tier": "primitive",
8576
+ "description": "Primitive font size: 11px",
8577
+ "defaultLight": "0.6875rem",
8578
+ "defaultDark": "0.6875rem"
8579
+ },
8414
8580
  {
8415
8581
  "name": "--font-size-xs",
8416
8582
  "tier": "primitive",
@@ -8973,6 +9139,41 @@
8973
9139
  "defaultLight": "var(--color-info-500)",
8974
9140
  "defaultDark": "var(--color-info-500)"
8975
9141
  },
9142
+ {
9143
+ "name": "--surface-elev-0",
9144
+ "tier": "semantic",
9145
+ "description": "Semantic surface: elev-0",
9146
+ "defaultLight": "var(--color-neutral-950)",
9147
+ "defaultDark": "var(--color-neutral-950)"
9148
+ },
9149
+ {
9150
+ "name": "--surface-elev-1",
9151
+ "tier": "semantic",
9152
+ "description": "Semantic surface: elev-1",
9153
+ "defaultLight": "var(--color-neutral-900)",
9154
+ "defaultDark": "var(--color-neutral-900)"
9155
+ },
9156
+ {
9157
+ "name": "--surface-elev-2",
9158
+ "tier": "semantic",
9159
+ "description": "Semantic surface: elev-2",
9160
+ "defaultLight": "var(--color-neutral-800)",
9161
+ "defaultDark": "var(--color-neutral-800)"
9162
+ },
9163
+ {
9164
+ "name": "--surface-elev-3",
9165
+ "tier": "semantic",
9166
+ "description": "Semantic surface: elev-3",
9167
+ "defaultLight": "var(--color-neutral-700)",
9168
+ "defaultDark": "var(--color-neutral-700)"
9169
+ },
9170
+ {
9171
+ "name": "--surface-elev-4",
9172
+ "tier": "semantic",
9173
+ "description": "Semantic surface: elev-4",
9174
+ "defaultLight": "var(--color-neutral-600)",
9175
+ "defaultDark": "var(--color-neutral-600)"
9176
+ },
8976
9177
  {
8977
9178
  "name": "--border-default",
8978
9179
  "tier": "semantic",
@@ -9717,6 +9918,41 @@
9717
9918
  "defaultLight": "#0ea5e9",
9718
9919
  "defaultDark": "#0ea5e9"
9719
9920
  },
9921
+ {
9922
+ "name": "--surface-elev-0",
9923
+ "tier": "adaptive",
9924
+ "description": "Adaptive surface: elev-0",
9925
+ "defaultLight": "#ffffff",
9926
+ "defaultDark": "#030712"
9927
+ },
9928
+ {
9929
+ "name": "--surface-elev-1",
9930
+ "tier": "adaptive",
9931
+ "description": "Adaptive surface: elev-1",
9932
+ "defaultLight": "#f9fafb",
9933
+ "defaultDark": "#111827"
9934
+ },
9935
+ {
9936
+ "name": "--surface-elev-2",
9937
+ "tier": "adaptive",
9938
+ "description": "Adaptive surface: elev-2",
9939
+ "defaultLight": "#f3f4f6",
9940
+ "defaultDark": "#1f2937"
9941
+ },
9942
+ {
9943
+ "name": "--surface-elev-3",
9944
+ "tier": "adaptive",
9945
+ "description": "Adaptive surface: elev-3",
9946
+ "defaultLight": "#e5e7eb",
9947
+ "defaultDark": "#374151"
9948
+ },
9949
+ {
9950
+ "name": "--surface-elev-4",
9951
+ "tier": "adaptive",
9952
+ "description": "Adaptive surface: elev-4",
9953
+ "defaultLight": "#d1d5db",
9954
+ "defaultDark": "#4b5563"
9955
+ },
9720
9956
  {
9721
9957
  "name": "--border-default",
9722
9958
  "tier": "adaptive",
@@ -9999,7 +10235,7 @@
9999
10235
  }
10000
10236
  ],
10001
10237
  "summary": {
10002
- "total": 300
10238
+ "total": 311
10003
10239
  }
10004
10240
  }
10005
10241
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loworbitstudio/visor",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "CLI for the Visor design system — add components, hooks, and utilities to your project.",
5
5
  "type": "module",
6
6
  "bin": {