@loworbitstudio/visor 0.10.0 → 1.0.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-05-12T23:36:26.147Z",
3
+ "generated_at": "2026-05-18T21:20:42.445Z",
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",
@@ -1272,6 +1273,12 @@
1272
1273
  "--border-error",
1273
1274
  "--border-focus",
1274
1275
  "--border-strong",
1276
+ "--checkbox-bg",
1277
+ "--checkbox-bg-checked",
1278
+ "--checkbox-bg-hover",
1279
+ "--checkbox-border",
1280
+ "--checkbox-border-checked",
1281
+ "--checkbox-border-hover",
1275
1282
  "--focus-ring-width",
1276
1283
  "--interactive-primary-bg",
1277
1284
  "--interactive-primary-text",
@@ -1429,6 +1436,77 @@
1429
1436
  ],
1430
1437
  "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
1438
  },
1439
+ "chrome-button": {
1440
+ "category": "admin",
1441
+ "description": "A 28px-tall button primitive for topbar and chrome contexts with an optional leading icon and trailing Kbd shortcut hint.",
1442
+ "when_to_use": [
1443
+ "Topbar actions in admin shells (Search, Filter, Group, Density, primary \"New X\")",
1444
+ "Toolbar rows where Button at 32px is too tall for the chrome density",
1445
+ "Any chrome row that pairs an action with a keyboard-shortcut hint inline"
1446
+ ],
1447
+ "when_not_to_use": [
1448
+ "Primary body-content CTAs (use Button at default 40px / sm 32px)",
1449
+ "Standalone keyboard-shortcut display without an action (use Kbd directly)",
1450
+ "Icon-only chrome that needs a tooltip — use a separate IconButton primitive when one exists, or wrap with a tooltip and supply aria-label",
1451
+ "Destructive confirmations (use Button variant=\"destructive\" — destructive is intentionally out of scope here)"
1452
+ ],
1453
+ "variants": {
1454
+ "variant": [
1455
+ "default",
1456
+ "primary"
1457
+ ]
1458
+ },
1459
+ "props": [
1460
+ {
1461
+ "name": "variant",
1462
+ "type": "\"default\" | \"primary\"",
1463
+ "default": "\"default\"",
1464
+ "description": "Visual emphasis. `default` uses the muted interactive surface; `primary` uses the accent surface."
1465
+ },
1466
+ {
1467
+ "name": "icon",
1468
+ "type": "React.ReactNode",
1469
+ "description": "Leading icon — typically a 14px Phosphor icon. Wrapped in an aria-hidden span."
1470
+ },
1471
+ {
1472
+ "name": "keys",
1473
+ "type": "string[]",
1474
+ "description": "Trailing keyboard shortcut hint rendered via `<Kbd keys={keys} size=\"sm\" />`."
1475
+ },
1476
+ {
1477
+ "name": "children",
1478
+ "type": "React.ReactNode",
1479
+ "description": "Button label."
1480
+ }
1481
+ ],
1482
+ "dependencies": [
1483
+ "class-variance-authority"
1484
+ ],
1485
+ "tokens_used": [
1486
+ "--accent-primary",
1487
+ "--border-focus",
1488
+ "--focus-ring-offset",
1489
+ "--focus-ring-width",
1490
+ "--font-size-sm",
1491
+ "--font-weight-medium",
1492
+ "--font-weight-semibold",
1493
+ "--interactive-primary-bg",
1494
+ "--interactive-primary-bg-hover",
1495
+ "--interactive-primary-text",
1496
+ "--motion-duration-150",
1497
+ "--motion-easing-default",
1498
+ "--opacity-50",
1499
+ "--radius-md",
1500
+ "--spacing-1",
1501
+ "--spacing-2",
1502
+ "--spacing-3",
1503
+ "--surface-interactive-default",
1504
+ "--surface-interactive-hover",
1505
+ "--text-inverse",
1506
+ "--text-primary"
1507
+ ],
1508
+ "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"
1509
+ },
1432
1510
  "code-block": {
1433
1511
  "category": "typography",
1434
1512
  "description": "A lightweight code display component with optional line numbers, copy-to-clipboard, and language badge.",
@@ -2253,6 +2331,16 @@
2253
2331
  "type": "boolean",
2254
2332
  "default": "false",
2255
2333
  "description": "When true, the thead is positioned sticky at the top of the scroll container."
2334
+ },
2335
+ {
2336
+ "name": "rowTone",
2337
+ "type": "(row: TData) => \"live\" | \"warn\" | \"scheduled\" | \"sold\" | \"draft\" | \"danger\" | \"info\" | undefined",
2338
+ "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"
2339
+ },
2340
+ {
2341
+ "name": "onRowClick",
2342
+ "type": "(row: TData) => void",
2343
+ "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
2344
  }
2257
2345
  ],
2258
2346
  "dependencies": [
@@ -2282,7 +2370,14 @@
2282
2370
  "--spacing-6",
2283
2371
  "--spacing-8",
2284
2372
  "--surface-card",
2373
+ "--surface-error-subtle",
2374
+ "--surface-info-subtle",
2375
+ "--surface-interactive-active",
2376
+ "--surface-interactive-default",
2377
+ "--surface-selected",
2285
2378
  "--surface-subtle",
2379
+ "--surface-success-subtle",
2380
+ "--surface-warning-subtle",
2286
2381
  "--text-primary",
2287
2382
  "--text-quaternary",
2288
2383
  "--text-secondary",
@@ -4386,12 +4481,23 @@
4386
4481
  "type": "'sm' | 'md' | 'lg'",
4387
4482
  "default": "md",
4388
4483
  "description": "Controls vertical rhythm and title size."
4484
+ },
4485
+ {
4486
+ "name": "titleSize",
4487
+ "type": "'default' | 'marquee' | string",
4488
+ "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"
4489
+ },
4490
+ {
4491
+ "name": "titleFamily",
4492
+ "type": "'heading' | 'display' | string",
4493
+ "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"
4389
4494
  }
4390
4495
  ],
4391
4496
  "dependencies": [
4392
4497
  "class-variance-authority"
4393
4498
  ],
4394
4499
  "tokens_used": [
4500
+ "--font-display",
4395
4501
  "--font-family-heading",
4396
4502
  "--font-size-2xl",
4397
4503
  "--font-size-3xl",
@@ -4404,6 +4510,8 @@
4404
4510
  "--letter-spacing-wide",
4405
4511
  "--line-height-relaxed",
4406
4512
  "--line-height-tight",
4513
+ "--page-header-title-family",
4514
+ "--page-header-title-size",
4407
4515
  "--spacing-1",
4408
4516
  "--spacing-2",
4409
4517
  "--spacing-3",
@@ -4414,7 +4522,7 @@
4414
4522
  "--text-secondary",
4415
4523
  "--text-tertiary"
4416
4524
  ],
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"
4525
+ "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
4526
  },
4419
4527
  "pagination": {
4420
4528
  "category": "navigation",
@@ -4677,7 +4785,8 @@
4677
4785
  "File upload progress",
4678
4786
  "Multi-step form or wizard completion",
4679
4787
  "Loading or processing indicators with known progress",
4680
- "Profile completeness or quota usage"
4788
+ "Profile completeness or quota usage",
4789
+ "Static admin-chrome capacity meters (KPI strips, time-until indicators) — use `size=\"thin\"` and `animate={false}`"
4681
4790
  ],
4682
4791
  "when_not_to_use": [
4683
4792
  "Indeterminate loading with no known progress (use Skeleton or a spinner)",
@@ -4690,6 +4799,18 @@
4690
4799
  "name": "value",
4691
4800
  "type": "number",
4692
4801
  "description": "Current progress value from 0 to 100"
4802
+ },
4803
+ {
4804
+ "name": "size",
4805
+ "type": "\"default\" | \"thin\"",
4806
+ "default": "\"default\"",
4807
+ "description": "Track size. `\"thin\"` renders a 4px-tall capacity bar for static admin chrome."
4808
+ },
4809
+ {
4810
+ "name": "animate",
4811
+ "type": "boolean",
4812
+ "default": "true",
4813
+ "description": "Whether the indicator transitions on value change. Set to `false` for static chrome."
4693
4814
  }
4694
4815
  ],
4695
4816
  "dependencies": [
@@ -4700,9 +4821,59 @@
4700
4821
  "--motion-duration-300",
4701
4822
  "--motion-easing-default",
4702
4823
  "--radius-full",
4824
+ "--surface-interactive-active",
4703
4825
  "--surface-muted"
4704
4826
  ],
4705
- "example": "<Progress value={65} />\n"
4827
+ "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"
4828
+ },
4829
+ "quick-actions": {
4830
+ "category": "navigation",
4831
+ "description": "Vertical list of action rows pairing a left-aligned label with a right-aligned Kbd shortcut.",
4832
+ "when_to_use": [
4833
+ "Dashboard side-rail \"quick\" panels surfacing keyboard discoverability",
4834
+ "Inline help cards beneath a section header (\"What can I do here\")",
4835
+ "Command-palette preview lists showing the top shortcuts",
4836
+ "Anywhere a short list of label + hotkey pairs needs consistent alignment"
4837
+ ],
4838
+ "when_not_to_use": [
4839
+ "Rows with leading icons, counts, or trailing meta data (use RightRailList)",
4840
+ "Modal command palette with filtering (use the Command primitive)",
4841
+ "Single-key shortcut chrome inline with text (use Kbd directly)",
4842
+ "Long lists where keyboard activation is the primary affordance (use a menu)"
4843
+ ],
4844
+ "props": [
4845
+ {
4846
+ "name": "actions",
4847
+ "type": "QuickAction[]",
4848
+ "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"
4849
+ },
4850
+ {
4851
+ "name": "onActivate",
4852
+ "type": "(id: string) => void",
4853
+ "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"
4854
+ }
4855
+ ],
4856
+ "dependencies": [
4857
+ "@loworbitstudio/visor-core"
4858
+ ],
4859
+ "tokens_used": [
4860
+ "--border-focus",
4861
+ "--focus-ring-offset",
4862
+ "--focus-ring-width",
4863
+ "--font-size-sm",
4864
+ "--motion-duration-150",
4865
+ "--motion-easing-default",
4866
+ "--radius-sm",
4867
+ "--spacing-1",
4868
+ "--spacing-2",
4869
+ "--spacing-3",
4870
+ "--spacing-4",
4871
+ "--surface-card",
4872
+ "--surface-muted",
4873
+ "--text-primary",
4874
+ "--text-secondary"
4875
+ ],
4876
+ "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
4877
  },
4707
4878
  "radio-group": {
4708
4879
  "category": "form",
@@ -4877,6 +5048,52 @@
4877
5048
  ],
4878
5049
  "example": "<SearchInput placeholder=\"Search...\" onClear={() => setValue('')} />\n"
4879
5050
  },
5051
+ "section-header": {
5052
+ "category": "navigation",
5053
+ "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.",
5054
+ "when_to_use": [
5055
+ "Dividing a page body into stacked sections (dashboard \"Tonight's events\", \"Activity\", \"This week\")",
5056
+ "Pairing a small uppercase label with a count, timestamp, or status on the right",
5057
+ "Establishing visual rhythm across 3-8 sections on a single page",
5058
+ "Replacing repeated inline eyebrow-row markup with a single primitive"
5059
+ ],
5060
+ "when_not_to_use": [
5061
+ "Page-level hero with title, description, breadcrumb, and actions (use PageHeader)",
5062
+ "In-content typographic headings — h2 / h3 inside an article (use Heading)",
5063
+ "Action-bearing headers with buttons or menus (use PageHeader)",
5064
+ "Sticky table-section headers with sorting controls"
5065
+ ],
5066
+ "props": [
5067
+ {
5068
+ "name": "title",
5069
+ "type": "React.ReactNode",
5070
+ "required": true,
5071
+ "description": "Uppercase tracking label rendered on the left."
5072
+ },
5073
+ {
5074
+ "name": "meta",
5075
+ "type": "React.ReactNode",
5076
+ "description": "Optional right-aligned meta — count, timestamp, status."
5077
+ },
5078
+ {
5079
+ "name": "as",
5080
+ "type": "'header' | 'div' | 'section'",
5081
+ "default": "header",
5082
+ "description": "Root element tag."
5083
+ }
5084
+ ],
5085
+ "dependencies": [],
5086
+ "tokens_used": [
5087
+ "--font-size-sm",
5088
+ "--font-size-xs",
5089
+ "--font-weight-medium",
5090
+ "--spacing-3",
5091
+ "--spacing-4",
5092
+ "--surface-subtle",
5093
+ "--text-tertiary"
5094
+ ],
5095
+ "example": "<SectionHeader title=\"Tonight's events\" meta=\"2 events\" />\n<SectionHeader title=\"Activity\" meta=\"last hour\" />\n<SectionHeader title=\"Top promoters · 30d\" />\n"
5096
+ },
4880
5097
  "select": {
4881
5098
  "category": "form",
4882
5099
  "description": "An accessible select component built on Radix UI Select with all sub-components.",
@@ -5485,6 +5702,68 @@
5485
5702
  ],
5486
5703
  "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
5704
  },
5705
+ "sparkline": {
5706
+ "category": "data-display",
5707
+ "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.",
5708
+ "when_to_use": [
5709
+ "Trend slot inside a StatCard or KpiCard (e.g. \"RSVPs tonight\" with a 12-point series)",
5710
+ "Compact at-a-glance trend cues in dense tables, dashboards, or admin surfaces",
5711
+ "Multi-card KPI strips where each card needs a tiny visual trend hint",
5712
+ "Anywhere a 50-line decorative trend SVG would otherwise be rebuilt locally"
5713
+ ],
5714
+ "when_not_to_use": [
5715
+ "Interactive charts with tooltips, hover state, or axis labels (use the `chart` primitive)",
5716
+ "Multi-series overlays or stacked datasets",
5717
+ "Standalone data visualizations that need to be independently navigable by assistive tech",
5718
+ "Area fills, sparkbars, sparkdots — these are separate primitives"
5719
+ ],
5720
+ "props": [
5721
+ {
5722
+ "name": "values",
5723
+ "type": "number[]",
5724
+ "required": true,
5725
+ "description": "Numeric series. Minimum 2 values required — anything shorter renders nothing."
5726
+ },
5727
+ {
5728
+ "name": "width",
5729
+ "type": "number",
5730
+ "default": 96,
5731
+ "description": "SVG width in px."
5732
+ },
5733
+ {
5734
+ "name": "height",
5735
+ "type": "number",
5736
+ "default": 22,
5737
+ "description": "SVG height in px."
5738
+ },
5739
+ {
5740
+ "name": "color",
5741
+ "type": "string",
5742
+ "default": "var(--accent-primary)",
5743
+ "description": "Stroke color. Accepts any CSS color string — token, hex, hsl, oklch."
5744
+ },
5745
+ {
5746
+ "name": "strokeWidth",
5747
+ "type": "number",
5748
+ "default": 1.5,
5749
+ "description": "Stroke width in px."
5750
+ },
5751
+ {
5752
+ "name": "fluid",
5753
+ "type": "boolean",
5754
+ "default": false,
5755
+ "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"
5756
+ },
5757
+ {
5758
+ "name": "aria-label",
5759
+ "type": "string",
5760
+ "description": "When supplied, the SVG becomes a labeled image and is announced. Omit for decorative use."
5761
+ }
5762
+ ],
5763
+ "dependencies": [],
5764
+ "tokens_used": [],
5765
+ "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
+ },
5488
5767
  "stat-card": {
5489
5768
  "category": "admin",
5490
5769
  "description": "Admin dashboard metric card with label, value, delta, trend, and footer slots.",
@@ -5583,6 +5862,7 @@
5583
5862
  "--font-size-2xl",
5584
5863
  "--font-size-3xl",
5585
5864
  "--font-size-4xl",
5865
+ "--font-size-6xl",
5586
5866
  "--font-size-sm",
5587
5867
  "--font-size-xs",
5588
5868
  "--font-weight-medium",
@@ -5604,8 +5884,10 @@
5604
5884
  "--spacing-3",
5605
5885
  "--spacing-4",
5606
5886
  "--spacing-5",
5887
+ "--stat-card-trend-padding-top",
5607
5888
  "--stat-card-value-font",
5608
5889
  "--stat-card-value-size",
5890
+ "--stat-card-value-size-hero",
5609
5891
  "--surface-card",
5610
5892
  "--text-danger",
5611
5893
  "--text-primary",
@@ -5788,6 +6070,7 @@
5788
6070
  "Communicating operational state in admin tables, detail pages, and dashboards",
5789
6071
  "Labeling service health (healthy, degraded, down)",
5790
6072
  "Labeling job or task lifecycle (queued, running, pending, complete, failed, idle)",
6073
+ "Labeling admin-ui event state (live, warn, scheduled, sold, draft)",
5791
6074
  {
5792
6075
  "Any place you want a consistent \"Status": "X\" accessible announcement"
5793
6076
  }
@@ -5807,7 +6090,12 @@
5807
6090
  "pending",
5808
6091
  "queued",
5809
6092
  "idle",
5810
- "complete"
6093
+ "complete",
6094
+ "live",
6095
+ "warn",
6096
+ "scheduled",
6097
+ "sold",
6098
+ "draft"
5811
6099
  ],
5812
6100
  "tone": [
5813
6101
  "subtle",
@@ -5861,6 +6149,54 @@
5861
6149
  ],
5862
6150
  "example": "<StatusBadge status=\"healthy\" />\n<StatusBadge status=\"running\" pulse />\n<StatusBadge status=\"failed\" tone=\"filled\" />\n"
5863
6151
  },
6152
+ "status-dot": {
6153
+ "category": "data-display",
6154
+ "description": "A 6×6px tone-tinted indicator dot — composes inside badges, table rows, activity feed items, and inline status text.",
6155
+ "when_to_use": [
6156
+ "As the leading slot of an ActivityFeed item to convey activity tone",
6157
+ "Inside a Badge to add a colored status indicator without StatusBadge's chrome",
6158
+ "In table cells to mark row status without a full label",
6159
+ "Inline with status text where the surrounding label already announces meaning"
6160
+ ],
6161
+ "when_not_to_use": [
6162
+ "Standalone status without an adjacent label — prefer StatusBadge for a full labelled control",
6163
+ "Larger callouts or hero-scale indicators — single 6px size is intentional",
6164
+ "As an interactive affordance — StatusDot is a pure indicator with no behaviour"
6165
+ ],
6166
+ "variants": {
6167
+ "tone": [
6168
+ "mint",
6169
+ "warn",
6170
+ "muted",
6171
+ "danger",
6172
+ "info"
6173
+ ]
6174
+ },
6175
+ "props": [
6176
+ {
6177
+ "name": "tone",
6178
+ "type": "\"mint\" | \"warn\" | \"muted\" | \"danger\" | \"info\"",
6179
+ "default": "\"muted\"",
6180
+ "description": "Tone. Drives the dot fill via a Visor semantic token."
6181
+ },
6182
+ {
6183
+ "name": "aria-label",
6184
+ "type": "string",
6185
+ "optional": true,
6186
+ "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"
6187
+ }
6188
+ ],
6189
+ "dependencies": [],
6190
+ "tokens_used": [
6191
+ "--radius-full",
6192
+ "--surface-error-default",
6193
+ "--surface-info-default",
6194
+ "--surface-success-default",
6195
+ "--surface-warning-default",
6196
+ "--text-tertiary"
6197
+ ],
6198
+ "example": "<StatusDot tone=\"mint\" />\n<Badge>\n <StatusDot tone=\"warn\" />\n 96% capacity\n</Badge>\n<StatusDot tone=\"danger\" aria-label=\"Service down\" />\n"
6199
+ },
5864
6200
  "stepper": {
5865
6201
  "category": "navigation",
5866
6202
  "description": "A multi-step progress indicator with horizontal and vertical orientations and auto-derived step status.",
@@ -7537,7 +7873,7 @@
7537
7873
  "blocks": {
7538
7874
  "admin-dashboard": {
7539
7875
  "category": "admin",
7540
- "description": "Drop-in admin overview composition — PageHeader, responsive stat grid, optional secondary region, and ActivityFeed with empty-state fallback. Composes existing admin compounds, nothing to configure.",
7876
+ "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
7877
  "components_used": [
7542
7878
  "page-header",
7543
7879
  "stat-card",
@@ -7547,7 +7883,8 @@
7547
7883
  "when_to_use": [
7548
7884
  "Landing page for an admin or back-office app",
7549
7885
  "Overview-at-a-glance screens mixing KPIs and recent events",
7550
- "Any dashboard needing a title, metrics, and a recent-activity feed"
7886
+ "Any dashboard needing a title, metrics, and a recent-activity feed",
7887
+ "Operator screens needing a main column + right rail below the KPI strip (use `layout=\"split\"`)"
7551
7888
  ],
7552
7889
  "when_not_to_use": [
7553
7890
  "Data-heavy list or table pages (use admin-list-page)",
@@ -7597,7 +7934,7 @@
7597
7934
  },
7598
7935
  "admin-settings-page": {
7599
7936
  "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.",
7937
+ "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
7938
  "components_used": [
7602
7939
  "page-header",
7603
7940
  "separator",
@@ -7693,6 +8030,26 @@
7693
8030
  "Large option lists with search (use Select or Combobox)"
7694
8031
  ]
7695
8032
  },
8033
+ "command-dialog": {
8034
+ "category": "navigation",
8035
+ "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.",
8036
+ "components_used": [
8037
+ "command",
8038
+ "dialog",
8039
+ "kbd"
8040
+ ],
8041
+ "when_to_use": [
8042
+ "App-wide quick-search palette opened with ⌘K / Ctrl+K",
8043
+ "Grouped, keyboard-driven action menus (Events / Guests / Actions)",
8044
+ "Replacing multi-level menus with one searchable list"
8045
+ ],
8046
+ "when_not_to_use": [
8047
+ "Simple dropdown selection from a short list (use Select or Combobox)",
8048
+ "Form field autocomplete with free text input (use Combobox)",
8049
+ "Modal confirmations or destructive prompts (use Dialog or ConfirmDialog)",
8050
+ "Persistent inline search (use Input + filtered list directly)"
8051
+ ]
8052
+ },
7696
8053
  "configuration-panel": {
7697
8054
  "category": "configuration",
7698
8055
  "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.",
@@ -7886,6 +8243,21 @@
7886
8243
  "Feature comparison tables without pricing"
7887
8244
  ]
7888
8245
  },
8246
+ "right-rail-list": {
8247
+ "category": "data-display",
8248
+ "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.",
8249
+ "components_used": [],
8250
+ "when_to_use": [
8251
+ "Side-rail summary panels in dashboards (this-week digests, top-N rankings, status callouts)",
8252
+ "Stacking multiple short list panels in a single column",
8253
+ "Any compact label-plus-value row pattern where each row carries an optional leading stamp"
8254
+ ],
8255
+ "when_not_to_use": [
8256
+ "Timestamped activity streams (use activity-feed)",
8257
+ "Sortable / paginated tabular data (use data-table)",
8258
+ "Long-form ranked lists with rich row content (use a full table or card grid)"
8259
+ ]
8260
+ },
7889
8261
  "sphere-playground": {
7890
8262
  "category": "visual-elements",
7891
8263
  "description": "An interactive demo composing the Sphere visualization with a Configuration Panel for real-time parameter control. The signature showcase for Visual Elements.",
@@ -8676,12 +9048,15 @@
8676
9048
  "chart",
8677
9049
  "marquee",
8678
9050
  "name-roster",
9051
+ "sparkline",
9052
+ "status-dot",
8679
9053
  "table",
8680
9054
  "timeline"
8681
9055
  ],
8682
9056
  "admin": [
8683
9057
  "activity-feed",
8684
9058
  "bulk-action-bar",
9059
+ "chrome-button",
8685
9060
  "confirm-dialog",
8686
9061
  "data-table",
8687
9062
  "empty-state",
@@ -8706,6 +9081,8 @@
8706
9081
  "navbar",
8707
9082
  "page-header",
8708
9083
  "pagination",
9084
+ "quick-actions",
9085
+ "section-header",
8709
9086
  "stepper",
8710
9087
  "tabs"
8711
9088
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loworbitstudio/visor",
3
- "version": "0.10.0",
3
+ "version": "1.0.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": {
@@ -45,7 +45,7 @@
45
45
  "dependencies": {
46
46
  "@aws-sdk/client-s3": "^3.1021.0",
47
47
  "@babel/parser": "^7.26.0",
48
- "@loworbitstudio/visor-theme-engine": "^0.6.0",
48
+ "@loworbitstudio/visor-theme-engine": "^0.8.0",
49
49
  "commander": "^13.1.0",
50
50
  "diff": "^8.0.4",
51
51
  "picocolors": "^1.1.1",