@loworbitstudio/visor 1.16.1 → 1.18.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/dist/CHANGELOG.json +13 -1
- package/dist/index.js +433 -12
- package/dist/registry.json +109 -3
- package/dist/visor-manifest.json +247 -1
- package/package.json +1 -1
package/dist/visor-manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": "0.4.0",
|
|
3
|
-
"generated_at": "2026-07-
|
|
3
|
+
"generated_at": "2026-07-09T19:24:03.742Z",
|
|
4
4
|
"components": {
|
|
5
5
|
"accessibility-specimen": {
|
|
6
6
|
"category": "specimen",
|
|
@@ -3429,6 +3429,213 @@
|
|
|
3429
3429
|
],
|
|
3430
3430
|
"example": "<Dialog>\n <DialogTrigger asChild>\n <Button>Edit profile</Button>\n </DialogTrigger>\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Edit profile</DialogTitle>\n <DialogDescription>Make changes to your profile here.</DialogDescription>\n </DialogHeader>\n {/* form content */}\n </DialogContent>\n</Dialog>\n"
|
|
3431
3431
|
},
|
|
3432
|
+
"doc-frame": {
|
|
3433
|
+
"category": "navigation",
|
|
3434
|
+
"description": "The themed doc-page shell that wraps DocNav. A sticky header with a flexible brand/logo slot, the DocNav slot, and a content wrapper for the doc. Reads a single docs manifest, derives the active product, and passes the slice + active-state down to DocNav. Themed entirely by Visor tokens. Replaces the vanilla-JS doc shell (nav.js + docs.css) on the React/route track.",
|
|
3435
|
+
"when_to_use": [
|
|
3436
|
+
"The surrounding themed page shell for a documentation site — sticky header, brand/logo slot, and content wrapper around a manifest-driven DocNav",
|
|
3437
|
+
"A doc host that must theme its whole chrome from Visor tokens and adopt the active project theme without modification",
|
|
3438
|
+
"A brand/logo slot that resolves an explicit logo, then the active theme's mode-aware brand logo, then a text wordmark",
|
|
3439
|
+
"Multi-product doc sets where the frame derives the active product from the route and drives the DocNav accordion"
|
|
3440
|
+
],
|
|
3441
|
+
"when_not_to_use": [
|
|
3442
|
+
"The nav internals themselves — the peer groups, accordion, pinned Shared, and Appendix (use DocNav — rendered in the slot)",
|
|
3443
|
+
"Top-level site navigation with brand and actions across an app (use Navbar)",
|
|
3444
|
+
"A generic app page layout or shell unrelated to docs (use Container, Stack, or a page-header composition)",
|
|
3445
|
+
"Manifest parsing, tiering, or routing resolution (owned upstream; DocFrame consumes the parsed manifest)"
|
|
3446
|
+
],
|
|
3447
|
+
"variants": {},
|
|
3448
|
+
"props": [
|
|
3449
|
+
{
|
|
3450
|
+
"name": "manifest",
|
|
3451
|
+
"type": "DocsManifest",
|
|
3452
|
+
"required": true,
|
|
3453
|
+
"description": "The parsed manifest (docs[], optional products[], optional brand text, optional dispositions) — the single input everything derives from."
|
|
3454
|
+
},
|
|
3455
|
+
{
|
|
3456
|
+
"name": "children",
|
|
3457
|
+
"type": "React.ReactNode",
|
|
3458
|
+
"required": true,
|
|
3459
|
+
"description": "The doc content, rendered in the content wrapper below the nav."
|
|
3460
|
+
},
|
|
3461
|
+
{
|
|
3462
|
+
"name": "logo",
|
|
3463
|
+
"type": "React.ReactNode",
|
|
3464
|
+
"description": "The brand slot. Any node — an <img> of an SVG, an inline <svg>, or a full component. Resolution order — explicit logo → the active theme's brand logo SVG (mode-aware via --brand-logo, upgraded only once it loads so a 404 keeps the wordmark) → the manifest brand text (a leading glyph chip + the name)."
|
|
3465
|
+
},
|
|
3466
|
+
{
|
|
3467
|
+
"name": "home",
|
|
3468
|
+
"type": "DocFrameHome",
|
|
3469
|
+
"description": "The OVERVIEW / home pill rendered after the brand — a bordered mono chip with a leading compass glyph and a { href, label }. Omit to hide it."
|
|
3470
|
+
},
|
|
3471
|
+
{
|
|
3472
|
+
"name": "meta",
|
|
3473
|
+
"type": "React.ReactNode",
|
|
3474
|
+
"description": "A right-aligned breadcrumb / status slot in the header (mono, UPPERCASE, --text-tertiary) — e.g. ARTIST · BUILD-READY."
|
|
3475
|
+
},
|
|
3476
|
+
{
|
|
3477
|
+
"name": "groupAccents",
|
|
3478
|
+
"type": "Record<string, string>",
|
|
3479
|
+
"description": "Per-group nav accent overrides keyed by DocNav group id or role, driving its --doc-nav-group-accent hook. Merged over the default palette (pro → --warning, the amber Pro dot); DocNav already defaults shared → --info, other products → --accent, appendix → --text-tertiary."
|
|
3480
|
+
},
|
|
3481
|
+
{
|
|
3482
|
+
"name": "borderless",
|
|
3483
|
+
"type": "boolean",
|
|
3484
|
+
"description": "Force the borderless treatment — null the pinned Shared group's frame for borderless themes (Animal / ENTR) that carry structure from surface contrast. Auto-detected from theme for the known borderless set; pass explicitly when the theme is applied by an ancestor."
|
|
3485
|
+
},
|
|
3486
|
+
{
|
|
3487
|
+
"name": "activeProduct",
|
|
3488
|
+
"type": "string",
|
|
3489
|
+
"description": "Which product group is expanded (the accordion). Defaults to the route's product, else the first product in the roster. Absent roster → single-product mode."
|
|
3490
|
+
},
|
|
3491
|
+
{
|
|
3492
|
+
"name": "currentPath",
|
|
3493
|
+
"type": "string",
|
|
3494
|
+
"description": "The active route for active-state. Next consumers pass usePathname(); a static page passes location.pathname. Defaults to window.location.pathname in the browser, or \"/\" during SSR."
|
|
3495
|
+
},
|
|
3496
|
+
{
|
|
3497
|
+
"name": "theme",
|
|
3498
|
+
"type": "string",
|
|
3499
|
+
"description": "A Visor theme class name applied to the shell root, scoping all doc-shell CSS variables. Defaults to the app's ambient theme."
|
|
3500
|
+
}
|
|
3501
|
+
],
|
|
3502
|
+
"dependencies": [
|
|
3503
|
+
"@phosphor-icons/react",
|
|
3504
|
+
"@loworbitstudio/visor-core"
|
|
3505
|
+
],
|
|
3506
|
+
"tokens_used": [
|
|
3507
|
+
"--border-default",
|
|
3508
|
+
"--border-focus",
|
|
3509
|
+
"--brand-logo",
|
|
3510
|
+
"--brand-logo-aspect-ratio",
|
|
3511
|
+
"--doc-frame-glyph-radius",
|
|
3512
|
+
"--doc-frame-logo-height",
|
|
3513
|
+
"--doc-frame-max-width",
|
|
3514
|
+
"--focus-ring-offset",
|
|
3515
|
+
"--focus-ring-width",
|
|
3516
|
+
"--font-mono",
|
|
3517
|
+
"--font-size-2xs",
|
|
3518
|
+
"--font-size-lg",
|
|
3519
|
+
"--font-size-sm",
|
|
3520
|
+
"--font-size-xs",
|
|
3521
|
+
"--font-weight-bold",
|
|
3522
|
+
"--font-weight-medium",
|
|
3523
|
+
"--hairline",
|
|
3524
|
+
"--hairline-strong",
|
|
3525
|
+
"--motion-duration-fast",
|
|
3526
|
+
"--motion-easing-standard",
|
|
3527
|
+
"--primary",
|
|
3528
|
+
"--primary-text",
|
|
3529
|
+
"--radius-full",
|
|
3530
|
+
"--spacing-1",
|
|
3531
|
+
"--spacing-2",
|
|
3532
|
+
"--spacing-3",
|
|
3533
|
+
"--spacing-4",
|
|
3534
|
+
"--spacing-5",
|
|
3535
|
+
"--spacing-6",
|
|
3536
|
+
"--spacing-8",
|
|
3537
|
+
"--stroke-width-thin",
|
|
3538
|
+
"--surface-card",
|
|
3539
|
+
"--surface-page",
|
|
3540
|
+
"--text-primary",
|
|
3541
|
+
"--text-tertiary"
|
|
3542
|
+
],
|
|
3543
|
+
"example": "import { DocFrame, type DocsManifest } from '@/components/ui/doc-frame/doc-frame'\n\nconst manifest: DocsManifest = {\n brand: 'Blacklight',\n products: [{ id: 'artist' }, { id: 'pro' }],\n docs: [\n { order: 1, label: 'Charter', href: '/docs/charter.html', group: 'Shared' },\n { order: 3, label: 'Screens', href: '/docs/artist/screens', scope: ['artist'], group: 'Artist' },\n { order: 2, label: 'Journeys', href: '/docs/pro/journeys', scope: ['pro'], group: 'Pro' },\n { order: 11, label: 'Q3 Audit', href: '/docs/q3-audit.html' },\n ],\n}\n\nexport function Shell({ children }: { children: React.ReactNode }) {\n return (\n <DocFrame manifest={manifest} currentPath=\"/docs/artist/screens\">\n {children}\n </DocFrame>\n )\n}\n"
|
|
3544
|
+
},
|
|
3545
|
+
"doc-nav": {
|
|
3546
|
+
"category": "navigation",
|
|
3547
|
+
"description": "A manifest-driven, grouped/collapsible, multi-product-aware documentation navigation. Renders peer collapsible groups from a manifest slice — a pinned Shared set, accordion product groups (one open at a time), and an Appendix bucket for ad-hoc docs — resolving the active pill from the current path. The group row wraps and is never an overflow-x scroll strip. Replaces the vanilla-JS doc nav (nav.js).",
|
|
3548
|
+
"when_to_use": [
|
|
3549
|
+
"A documentation shell that must group docs by product/section and collapse them, driven by a docs manifest",
|
|
3550
|
+
"Multi-product doc sets where a pinned Shared group sits beside accordion product groups (switching product = expanding its group)",
|
|
3551
|
+
"Ad-hoc/one-off docs with no canonical slot that should tuck into an Appendix instead of widening the row",
|
|
3552
|
+
"Any doc nav that must never run off the edge — groups wrap, they do not scroll horizontally"
|
|
3553
|
+
],
|
|
3554
|
+
"when_not_to_use": [
|
|
3555
|
+
"The surrounding themed page shell, sticky header, and brand/logo slot (use DocFrame — VI-609)",
|
|
3556
|
+
"In-app section sub-navigation with count pills across a detail view (use SectionNav)",
|
|
3557
|
+
"Top-level site navigation with brand + actions (use Navbar)",
|
|
3558
|
+
"A single expandable section (use Collapsible) or a grouped side rail (use Sidebar)"
|
|
3559
|
+
],
|
|
3560
|
+
"variants": {},
|
|
3561
|
+
"props": [
|
|
3562
|
+
{
|
|
3563
|
+
"name": "docs",
|
|
3564
|
+
"type": "DocEntry[]",
|
|
3565
|
+
"required": true,
|
|
3566
|
+
"description": "The manifest slice for the active view (Shared + product-scoped), pre-filtered by DocFrame. Each DocEntry carries order, label, href, and optional kind/scope/group/tier/external."
|
|
3567
|
+
},
|
|
3568
|
+
{
|
|
3569
|
+
"name": "currentPath",
|
|
3570
|
+
"type": "string",
|
|
3571
|
+
"required": true,
|
|
3572
|
+
"description": "The active route (or static location.pathname). Resolves the active pill (with aria-current=\"page\") and auto-expands its group."
|
|
3573
|
+
},
|
|
3574
|
+
{
|
|
3575
|
+
"name": "activeProduct",
|
|
3576
|
+
"type": "string",
|
|
3577
|
+
"description": "Which product group is open (the accordion). Absent → single-product mode with no accordion."
|
|
3578
|
+
},
|
|
3579
|
+
{
|
|
3580
|
+
"name": "onProductToggle",
|
|
3581
|
+
"type": "(id: string) => void",
|
|
3582
|
+
"description": "Accordion callback — the parent expands a product group and collapses the sibling by swapping activeProduct. Absent → groups render as plain, independently expandable links (static-doc mode)."
|
|
3583
|
+
},
|
|
3584
|
+
{
|
|
3585
|
+
"name": "pinnedGroups",
|
|
3586
|
+
"type": "string[]",
|
|
3587
|
+
"default": "[\"shared\"]",
|
|
3588
|
+
"description": "Group ids that stay open regardless of the accordion."
|
|
3589
|
+
},
|
|
3590
|
+
{
|
|
3591
|
+
"name": "defaultCollapsed",
|
|
3592
|
+
"type": "boolean",
|
|
3593
|
+
"default": "true",
|
|
3594
|
+
"description": "Whether non-active, non-pinned groups start collapsed — the anti-wall rule."
|
|
3595
|
+
}
|
|
3596
|
+
],
|
|
3597
|
+
"dependencies": [
|
|
3598
|
+
"@phosphor-icons/react",
|
|
3599
|
+
"@loworbitstudio/visor-core"
|
|
3600
|
+
],
|
|
3601
|
+
"tokens_used": [
|
|
3602
|
+
"--accent",
|
|
3603
|
+
"--border-default",
|
|
3604
|
+
"--border-focus",
|
|
3605
|
+
"--color-neutral-950",
|
|
3606
|
+
"--doc-nav-accent",
|
|
3607
|
+
"--doc-nav-group-accent",
|
|
3608
|
+
"--doc-nav-group-radius",
|
|
3609
|
+
"--doc-nav-pill-bg",
|
|
3610
|
+
"--doc-nav-pin-bg",
|
|
3611
|
+
"--doc-nav-pin-border",
|
|
3612
|
+
"--focus-ring-offset",
|
|
3613
|
+
"--focus-ring-width",
|
|
3614
|
+
"--font-mono",
|
|
3615
|
+
"--font-size-2xs",
|
|
3616
|
+
"--font-size-xs",
|
|
3617
|
+
"--font-weight-bold",
|
|
3618
|
+
"--font-weight-medium",
|
|
3619
|
+
"--hairline",
|
|
3620
|
+
"--info",
|
|
3621
|
+
"--motion-duration-fast",
|
|
3622
|
+
"--motion-easing-standard",
|
|
3623
|
+
"--radius-full",
|
|
3624
|
+
"--radius-md",
|
|
3625
|
+
"--radius-sm",
|
|
3626
|
+
"--spacing-1",
|
|
3627
|
+
"--spacing-2",
|
|
3628
|
+
"--spacing-3",
|
|
3629
|
+
"--spacing-4",
|
|
3630
|
+
"--stroke-width-thin",
|
|
3631
|
+
"--surface-card",
|
|
3632
|
+
"--surface-selected",
|
|
3633
|
+
"--text-primary",
|
|
3634
|
+
"--text-secondary",
|
|
3635
|
+
"--text-tertiary"
|
|
3636
|
+
],
|
|
3637
|
+
"example": "import { DocNav, type DocEntry } from '@/components/ui/doc-nav/doc-nav'\n\nconst docs: DocEntry[] = [\n { order: 0, label: 'Overview', href: '/docs', group: 'Shared' },\n { order: 1, label: 'Charter', href: '/docs/charter', group: 'Shared' },\n { order: 3, label: 'Screens', href: '/docs/artist-screens', scope: ['artist'], group: 'Artist' },\n { order: 2, label: 'Journeys', href: '/docs/pro-journeys', scope: ['pro'], group: 'Pro' },\n { order: 11, label: 'Q3 Audit', href: '/docs/q3-audit' },\n]\n\nexport function Nav({ product }: { product: string }) {\n const [open, setOpen] = React.useState(product)\n return (\n <DocNav\n docs={docs}\n currentPath=\"/docs/artist-screens\"\n activeProduct={open}\n onProductToggle={setOpen}\n />\n )\n}\n"
|
|
3638
|
+
},
|
|
3432
3639
|
"dropdown-menu": {
|
|
3433
3640
|
"category": "overlay",
|
|
3434
3641
|
"description": "Menu of actions or options that opens from a trigger button.",
|
|
@@ -10816,6 +11023,28 @@
|
|
|
10816
11023
|
"Settings forms (use admin-settings-page)"
|
|
10817
11024
|
]
|
|
10818
11025
|
},
|
|
11026
|
+
"admin-detail": {
|
|
11027
|
+
"category": "admin",
|
|
11028
|
+
"description": "Full-page, read-oriented detail RECORD for the admin-shell main column. Composes an identity header (media + title + StatusBadge + actions), N key-value sections built on KeyValueList, an optional sensitive/reveal panel gated behind a Switch, and optional sub-list slots for ledgers or history — separated by hairline dividers. The full-page sibling to admin-detail-drawer (a drawer) and admin-list-page.",
|
|
11029
|
+
"components_used": [
|
|
11030
|
+
"key-value-list",
|
|
11031
|
+
"status-badge",
|
|
11032
|
+
"switch",
|
|
11033
|
+
"separator"
|
|
11034
|
+
],
|
|
11035
|
+
"when_to_use": [
|
|
11036
|
+
"Read-oriented single-record detail pages rendered in the admin-shell main column",
|
|
11037
|
+
"Records with an identity header plus grouped key-value facts (profile, account, metadata)",
|
|
11038
|
+
"Detail pages that expose sensitive data (tax IDs, banking, W-9) behind a reveal control",
|
|
11039
|
+
"Records with sub-ledgers or history tables beneath the key-value sections"
|
|
11040
|
+
],
|
|
11041
|
+
"when_not_to_use": [
|
|
11042
|
+
"Inline editing of a record from a list without leaving the page (use admin-detail-drawer)",
|
|
11043
|
+
"Full-page multi-section editors with save/cancel (use admin-settings-page)",
|
|
11044
|
+
"Multi-step create/edit flows (use admin-wizard)",
|
|
11045
|
+
"Tabular lists of many records (use admin-list-page)"
|
|
11046
|
+
]
|
|
11047
|
+
},
|
|
10819
11048
|
"admin-detail-drawer": {
|
|
10820
11049
|
"category": "admin",
|
|
10821
11050
|
"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.",
|
|
@@ -11171,6 +11400,21 @@
|
|
|
11171
11400
|
"Registration forms (extend with additional fields)"
|
|
11172
11401
|
]
|
|
11173
11402
|
},
|
|
11403
|
+
"month-calendar": {
|
|
11404
|
+
"category": "data-display",
|
|
11405
|
+
"description": "A theme-portable month event-grid (scheduler) block. Renders a 6×7 day-cell grid under a localized weekday header, with prev/next month navigation, a view-mode segmented control (Month / Week / Day), and per-cell event chips. Each chip carries a status-dot slot (success / warning / danger / info) and an optional series tint (1–5) keyed to the theme's chart ramp for color-coding a recurring series or resource lane. Days outside the displayed month are dimmed; optional today and selected-day highlighting. Fully token-driven — every color, spacing, stroke, radius, shadow, opacity, and motion value binds to a Visor token, so the grid adopts the active theme without modification.",
|
|
11406
|
+
"components_used": [],
|
|
11407
|
+
"when_to_use": [
|
|
11408
|
+
"Admin or booking surfaces that show events-in-a-month (the most common scheduling view)",
|
|
11409
|
+
"Color-coding recurring series or resource lanes via the per-chip series tint",
|
|
11410
|
+
"Status-at-a-glance calendars where each event needs a success / warning / danger / info dot"
|
|
11411
|
+
],
|
|
11412
|
+
"when_not_to_use": [
|
|
11413
|
+
"Picking a single date or date range (use calendar, date-picker, or date-range-picker)",
|
|
11414
|
+
"Time-slot / day-timeline scheduling with hour rows (use a dedicated day/week scheduler)",
|
|
11415
|
+
"Dense agenda lists with no month context (use a table or activity-feed)"
|
|
11416
|
+
]
|
|
11417
|
+
},
|
|
11174
11418
|
"pricing-section": {
|
|
11175
11419
|
"category": "marketing",
|
|
11176
11420
|
"description": "A responsive pricing tier grid with feature lists, highlighted plan, and per-tier CTAs.",
|
|
@@ -12073,6 +12317,8 @@
|
|
|
12073
12317
|
"navigation": [
|
|
12074
12318
|
"breadcrumb",
|
|
12075
12319
|
"command",
|
|
12320
|
+
"doc-frame",
|
|
12321
|
+
"doc-nav",
|
|
12076
12322
|
"navbar",
|
|
12077
12323
|
"page-header",
|
|
12078
12324
|
"pagination",
|