@zvk/composite 0.1.2 → 0.1.4
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/CHANGELOG.md +14 -0
- package/README.md +158 -1
- package/dist/domains/activity.d.ts +2 -0
- package/dist/domains/activity.js +1 -0
- package/dist/domains/ai.d.ts +6 -0
- package/dist/domains/ai.js +3 -0
- package/dist/domains/data.d.ts +10 -0
- package/dist/domains/data.js +5 -0
- package/dist/domains/detail.d.ts +2 -0
- package/dist/domains/detail.js +1 -0
- package/dist/domains/forms.d.ts +4 -0
- package/dist/domains/forms.js +2 -0
- package/dist/domains/navigation.d.ts +16 -0
- package/dist/domains/navigation.js +8 -0
- package/dist/domains/settings.d.ts +6 -0
- package/dist/domains/settings.js +3 -0
- package/dist/domains/shell.d.ts +6 -0
- package/dist/domains/shell.js +3 -0
- package/dist/domains/state.d.ts +4 -0
- package/dist/domains/state.js +2 -0
- package/dist/domains/workflow.d.ts +8 -0
- package/dist/domains/workflow.js +4 -0
- package/dist/index.d.ts +10 -56
- package/dist/index.js +10 -28
- package/dist/layout/page-scaffold.js +17 -9
- package/dist/navigation/command-palette-shell.d.ts +2 -1
- package/dist/navigation/command-palette-shell.js +3 -13
- package/dist/navigation/entity-switcher-menu.js +1 -11
- package/dist/navigation/resource-explorer-shell.d.ts +31 -0
- package/dist/navigation/resource-explorer-shell.js +30 -0
- package/dist/navigation/sectioned-workspace-shell.js +13 -6
- package/dist/navigation/shell-slot-rendering.d.ts +13 -0
- package/dist/navigation/shell-slot-rendering.js +25 -0
- package/dist/navigation/simple-workspace-shell.d.ts +16 -0
- package/dist/navigation/simple-workspace-shell.js +25 -0
- package/dist/navigation/split-workspace-shell.d.ts +24 -0
- package/dist/navigation/split-workspace-shell.js +32 -0
- package/dist/styles.css +272 -20
- package/dist/utils/use-controllable-value.d.ts +7 -0
- package/dist/utils/use-controllable-value.js +12 -0
- package/dist/workflows/wizard-shell.d.ts +24 -0
- package/dist/workflows/wizard-shell.js +32 -0
- package/package.json +22 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
# @zvk/composite Changelog
|
|
2
2
|
|
|
3
|
+
## [0.1.4](https://github.com/brandon-schabel/zvk/compare/composite-v0.1.3...composite-v0.1.4) (2026-06-25)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* improve out-of-box DX and UI components ([#24](https://github.com/brandon-schabel/zvk/issues/24)) ([b01272a](https://github.com/brandon-schabel/zvk/commit/b01272a2b35099f5e1fa1dea5883687a0fb4c2e6))
|
|
9
|
+
|
|
10
|
+
## [0.1.3](https://github.com/brandon-schabel/zvk/compare/composite-v0.1.2...composite-v0.1.3) (2026-06-20)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* improve package release workflow and repo maintainability ([#22](https://github.com/brandon-schabel/zvk/issues/22)) ([a41cb66](https://github.com/brandon-schabel/zvk/commit/a41cb66554496f241c5a8e30b29a76c8b8ca92b3))
|
|
16
|
+
|
|
3
17
|
## [0.1.2](https://github.com/brandon-schabel/zvk/compare/composite-v0.1.1...composite-v0.1.2) (2026-06-19)
|
|
4
18
|
|
|
5
19
|
|
package/README.md
CHANGED
|
@@ -13,6 +13,21 @@ Components are UI-only and accept typed props, slots, and callbacks. They do not
|
|
|
13
13
|
|
|
14
14
|
Composite typography inherits the shared `@zvk/ui` font-family slots: primary for body/control text, secondary for titles and navigation accents, and tertiary wherever composed UI primitives render code or technical values.
|
|
15
15
|
|
|
16
|
+
## Domain Ownership
|
|
17
|
+
|
|
18
|
+
The package is organized around product-surface domains so repeated shell structure stays readable without creating new public import groups. This map is for internal ownership and review; it does not add domain barrel imports to the public API.
|
|
19
|
+
|
|
20
|
+
- `shell`: `AppWorkspaceShell`, `PageScaffold`, `FeatureShell`
|
|
21
|
+
- `navigation`: `WorkspaceHeader`, `BreadcrumbPageHeader`, `SimpleWorkspaceShell`, `SplitWorkspaceShell`, `SectionedWorkspaceShell`, `ResourceExplorerShell`, `EntitySwitcherMenu`, `CommandPaletteShell`, `LinkAction`
|
|
22
|
+
- `state`: `StateSurface`, `RouteStateFrame`
|
|
23
|
+
- `forms`: `FormSurface`, `ConfirmActionDialog`
|
|
24
|
+
- `data`: `EntityCard`, `EntityListSection`, `SummaryMetricGrid`, `DataTablePageFrame`, `DataTableControlBar`
|
|
25
|
+
- `workflow`: `IntegrationStatusCard`, `WorkflowStatusCard`, `ProcessListPanel`, `WizardShell`
|
|
26
|
+
- `settings`: `SettingsHubList`, `ParameterEditor`, `SettingsSectionStack`
|
|
27
|
+
- `ai`: `ProviderModelSelector`, `ConversationDirectory`, `StickyComposer`
|
|
28
|
+
- `activity`: `ActivityFeed`
|
|
29
|
+
- `detail`: `DetailInspectorPanel`
|
|
30
|
+
|
|
16
31
|
## What Composite Does Not Own
|
|
17
32
|
|
|
18
33
|
`@zvk/composite` owns repeated product-surface structure, semantic markup, accessible labels for the UI it renders, token-backed spacing, density-aware layout, and typed slots. It deliberately does not own app policy or runtime orchestration.
|
|
@@ -27,6 +42,15 @@ Keep these in the consuming app or a more specific package:
|
|
|
27
42
|
- AI provider catalogs, model compatibility, prompt state, tool execution, attachments, message history, and AI SDK integration;
|
|
28
43
|
- analytics, telemetry, business copy, domain transforms, date formatting, and error classification.
|
|
29
44
|
|
|
45
|
+
## Public Stability
|
|
46
|
+
|
|
47
|
+
- All current component subpaths and the root export are stable public API.
|
|
48
|
+
- Watched surfaces may evolve only through additive, UI-only props, callbacks, and tests; keep them app-agnostic and preserve the current import paths.
|
|
49
|
+
- `./styles.css` is a stable stylesheet export.
|
|
50
|
+
- `./package.json` is stable metadata and tooling export, not a component surface.
|
|
51
|
+
|
|
52
|
+
Watched surfaces: `SimpleWorkspaceShell`, `SplitWorkspaceShell`, `ResourceExplorerShell`, `WizardShell`, `EntitySwitcherMenu`, `CommandPaletteShell`, `ConfirmActionDialog`, `IntegrationStatusCard`, `WorkflowStatusCard`, `ProcessListPanel`, `ActivityFeed`, `ParameterEditor`, `ProviderModelSelector`, `ConversationDirectory`, `StickyComposer`, and `DataTableControlBar`.
|
|
53
|
+
|
|
30
54
|
## App Surface Exports
|
|
31
55
|
|
|
32
56
|
App surfaces are intentionally router-agnostic and UI-only:
|
|
@@ -38,7 +62,10 @@ App surfaces are intentionally router-agnostic and UI-only:
|
|
|
38
62
|
| `CommandPaletteShell` | `@zvk/composite/command-palette-shell` | Controlled command palette dialog with grouped commands and app-owned command execution. |
|
|
39
63
|
| `WorkspaceHeader` | `@zvk/composite/workspace-header` | Page header with title, description, status, metadata, and actions. |
|
|
40
64
|
| `BreadcrumbPageHeader` | `@zvk/composite/breadcrumb-page-header` | Breadcrumb-aware page header for nested workspace routes. |
|
|
65
|
+
| `SimpleWorkspaceShell` | `@zvk/composite/simple-workspace-shell` | Generic workspace frame with optional navigation, header, toolbar, actions, aside, footer, and content slots. |
|
|
66
|
+
| `SplitWorkspaceShell` | `@zvk/composite/split-workspace-shell` | Resizable two-pane workspace shell built on `@zvk/ui/splitter` for app-owned resource/detail or editor/preview layouts. |
|
|
41
67
|
| `SectionedWorkspaceShell` | `@zvk/composite/sectioned-workspace-shell` | Sectioned navigation shell for dense workspace panels. |
|
|
68
|
+
| `ResourceExplorerShell` | `@zvk/composite/resource-explorer-shell` | Tree plus result-list explorer shell for app-owned repositories, files, records, resources, or docs. |
|
|
42
69
|
| `PageScaffold` | `@zvk/composite/page-scaffold` | Page layout with toolbar, aside, constrained width, and content slots. |
|
|
43
70
|
| `FeatureShell` | `@zvk/composite/feature-shell` | Reusable feature page layout with title, description, actions, metadata, and toolbar slots. |
|
|
44
71
|
| `StateSurface` | `@zvk/composite/state-surface` | Empty, loading, error, permission, success, and search-empty state panels. |
|
|
@@ -52,6 +79,7 @@ App surfaces are intentionally router-agnostic and UI-only:
|
|
|
52
79
|
| `IntegrationStatusCard` | `@zvk/composite/integration-status-card` | Provider/API/service connection status card with status, badges, metadata, metrics, actions, and errors. |
|
|
53
80
|
| `WorkflowStatusCard` | `@zvk/composite/workflow-status-card` | Workflow, run, import, queue, deploy, or parser status card with progress and current-step slots. |
|
|
54
81
|
| `ProcessListPanel` | `@zvk/composite/process-list-panel` | List panel for app-owned background work items, rendered by default through workflow status cards. |
|
|
82
|
+
| `WizardShell` | `@zvk/composite/wizard-shell` | Step-by-step workflow frame built on `@zvk/ui/stepper`, with app-owned validation, submission, and persistence. |
|
|
55
83
|
| `ActivityFeed` | `@zvk/composite/activity-feed` | Ordered activity, audit, workflow, comment, or notification feed with app-owned ordering and timestamps. |
|
|
56
84
|
| `ParameterEditor` | `@zvk/composite/parameter-editor` | Grouped parameter/settings rows where controls, validation, persistence, and reset actions stay in the app. |
|
|
57
85
|
| `SettingsSectionStack` | `@zvk/composite/settings-section-stack` | Settings page section stack with controlled dirty/save presentation and app-owned forms. |
|
|
@@ -92,6 +120,18 @@ import { LinkAction } from "@zvk/composite/link-action";
|
|
|
92
120
|
|
|
93
121
|
These components should stay focused on visual structure, semantics, and affordances; routing, domain mapping, and data orchestration remain in the consuming app.
|
|
94
122
|
|
|
123
|
+
## Future Feature Acceptance
|
|
124
|
+
|
|
125
|
+
Accept a new composite only when all of these are true:
|
|
126
|
+
|
|
127
|
+
- [ ] It replaces repeated product-surface structure, not a primitive control or wrapper `div`.
|
|
128
|
+
- [ ] Its name and props stay app-agnostic.
|
|
129
|
+
- [ ] It composes public `@zvk/ui` exports, existing public composites, or local presentational helpers only.
|
|
130
|
+
- [ ] Routing, persistence, data fetching, auth, billing, validation, table engines, AI SDKs, analytics, policy checks, and business rules stay in the app or a more specific package.
|
|
131
|
+
- [ ] It fits an existing domain owner or clearly justifies a new owner in this README and the composite skill.
|
|
132
|
+
- [ ] It can be covered by package export map, root export, internal domain barrel, CSS aggregate, type fixture, SSR import smoke, export validation, tarball inspection, README guidance, preview example, and skill update.
|
|
133
|
+
- [ ] It remains SSR-safe at module initialization and deterministic in initial render.
|
|
134
|
+
|
|
95
135
|
## Migration Guide
|
|
96
136
|
|
|
97
137
|
Migrate repeated app-owned shells into `@zvk/composite` only when the repeated part is visual structure and interaction affordance, not domain behavior.
|
|
@@ -99,11 +139,14 @@ Migrate repeated app-owned shells into `@zvk/composite` only when the repeated p
|
|
|
99
139
|
| Repeated app surface | Composite target | Keep in the app |
|
|
100
140
|
| --- | --- | --- |
|
|
101
141
|
| Product workspace chrome with brand, account, nav, switcher, command, and content slots | `AppWorkspaceShell` | route tree, auth context, workspace persistence, account menu actions |
|
|
142
|
+
| Generic workspace pages with navigation, actions, sidebars, and footer chrome | `SimpleWorkspaceShell` | route tree, permissions, data loading, selected-record state |
|
|
143
|
+
| Split resource/detail, editor/preview, or list/inspector workspaces | `SplitWorkspaceShell` | persistence of pane sizes, route params, selected entity fetching, mobile drawer behavior |
|
|
102
144
|
| Tab-with-sidebar or dense route workspace wrappers | `SectionedWorkspaceShell` | active route, URL updates, permission gating, tab persistence |
|
|
145
|
+
| Tree plus result-list explorers | `ResourceExplorerShell` | search/filter algorithms, repository adapters, file I/O, routing, permissions, preview data fetching |
|
|
103
146
|
| Route/page loading, empty, permission, error, and ready wrappers | `RouteStateFrame` or `StateSurface` | loader state, retry mutations, fetch errors, domain-specific empty data |
|
|
104
147
|
| Page headers and breadcrumb headers | `WorkspaceHeader` or `BreadcrumbPageHeader` | router links, breadcrumb construction, page-level data policy |
|
|
105
148
|
| Settings index pages and settings detail pages | `SettingsHubList` or `SettingsSectionStack` | route anchors, dirty-state calculation, validation, persistence, permission decisions |
|
|
106
|
-
| Provider/API status cards, workflow cards,
|
|
149
|
+
| Provider/API status cards, workflow cards, process lists, and setup flows | `IntegrationStatusCard`, `WorkflowStatusCard`, `ProcessListPanel`, or `WizardShell` | health checks, polling, process control, retries, logs, provider credentials, validation, submission |
|
|
107
150
|
| Audit logs, run histories, review threads, and notification feeds | `ActivityFeed` | event fetching, ordering, timestamps, subscriptions, comment mutations, infinite scroll |
|
|
108
151
|
| AI model choices, conversation sidebars, and sticky prompt forms | `ProviderModelSelector`, `ConversationDirectory`, or `StickyComposer` | catalogs, compatibility rules, message fetching, prompt validation, streaming, tools, persistence |
|
|
109
152
|
| Table page wrappers and table control bars | `DataTablePageFrame` or `DataTableControlBar` | table engine adapters, query state, sorting, filters, pagination, row selection, saved views |
|
|
@@ -420,3 +463,117 @@ import { DataTableControlBar } from "@zvk/composite/data-table-control-bar";
|
|
|
420
463
|
selectionSummary="3 selected"
|
|
421
464
|
/>;
|
|
422
465
|
```
|
|
466
|
+
|
|
467
|
+
## Local-First Workspace Recipe
|
|
468
|
+
|
|
469
|
+
For a local-first todo or list workspace, reach for `AppWorkspaceShell` first, then use `FeatureShell` or `PageScaffold` for the page body, `SummaryMetricGrid` for counts, `EntityListSection` for the repeated list, `FormSurface` for the native form, and `StateSurface` for empty/loading/error presentation.
|
|
470
|
+
|
|
471
|
+
Keep the app-owned parts small and explicit:
|
|
472
|
+
|
|
473
|
+
- route state, persistence, and server actions stay in the app;
|
|
474
|
+
- fields, details, and validation stay in app-owned primitives or local helpers;
|
|
475
|
+
- shell chrome stays in `@zvk/composite`, not custom page CSS;
|
|
476
|
+
- aim for under 120 lines of app-local CSS before you add another shell wrapper.
|
|
477
|
+
|
|
478
|
+
```tsx
|
|
479
|
+
import "@zvk/ui/styles.css";
|
|
480
|
+
import "@zvk/composite/styles.css";
|
|
481
|
+
|
|
482
|
+
import {
|
|
483
|
+
AppWorkspaceShell,
|
|
484
|
+
EntityListSection,
|
|
485
|
+
FeatureShell,
|
|
486
|
+
FormSurface,
|
|
487
|
+
StateSurface,
|
|
488
|
+
SummaryMetricGrid
|
|
489
|
+
} from "@zvk/composite";
|
|
490
|
+
|
|
491
|
+
type Task = {
|
|
492
|
+
id: string;
|
|
493
|
+
title: string;
|
|
494
|
+
status: "open" | "doing" | "done";
|
|
495
|
+
dueLabel: string;
|
|
496
|
+
};
|
|
497
|
+
|
|
498
|
+
async function createTask(formData: FormData) {
|
|
499
|
+
"use server";
|
|
500
|
+
|
|
501
|
+
// App-owned mutation, persistence, and revalidation.
|
|
502
|
+
void formData;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
export function TasksPage({ tasks }: { tasks: readonly Task[] }) {
|
|
506
|
+
return (
|
|
507
|
+
<AppWorkspaceShell
|
|
508
|
+
brand={<strong>Northline</strong>}
|
|
509
|
+
navigation={<nav aria-label="Workspace navigation">...</nav>}
|
|
510
|
+
>
|
|
511
|
+
<FeatureShell
|
|
512
|
+
actions={<button type="button">Sync</button>}
|
|
513
|
+
description="Keep the workspace local-first and fast to scan."
|
|
514
|
+
title="Tasks"
|
|
515
|
+
>
|
|
516
|
+
<SummaryMetricGrid
|
|
517
|
+
columns={3}
|
|
518
|
+
metrics={[
|
|
519
|
+
{ id: "open", label: "Open", value: 12 },
|
|
520
|
+
{ id: "doing", label: "In progress", value: 4 },
|
|
521
|
+
{ id: "done", label: "Done", value: 31 }
|
|
522
|
+
]}
|
|
523
|
+
title="Today"
|
|
524
|
+
/>
|
|
525
|
+
|
|
526
|
+
{tasks.length > 0 ? (
|
|
527
|
+
<EntityListSection
|
|
528
|
+
description="App-owned data, routes, and filters stay outside the composite."
|
|
529
|
+
getItemKey={(task) => task.id}
|
|
530
|
+
items={tasks}
|
|
531
|
+
renderItem={(task) => (
|
|
532
|
+
<article>
|
|
533
|
+
<h3>{task.title}</h3>
|
|
534
|
+
<p>
|
|
535
|
+
{task.status} · {task.dueLabel}
|
|
536
|
+
</p>
|
|
537
|
+
</article>
|
|
538
|
+
)}
|
|
539
|
+
title="Backlog"
|
|
540
|
+
/>
|
|
541
|
+
) : (
|
|
542
|
+
<StateSurface
|
|
543
|
+
description="Add the first task with the form below."
|
|
544
|
+
state="empty"
|
|
545
|
+
title="No tasks yet"
|
|
546
|
+
/>
|
|
547
|
+
)}
|
|
548
|
+
</FeatureShell>
|
|
549
|
+
|
|
550
|
+
<FormSurface
|
|
551
|
+
action={createTask}
|
|
552
|
+
description="Native inputs and server actions stay app-owned."
|
|
553
|
+
footer={<button type="submit">Create task</button>}
|
|
554
|
+
method="post"
|
|
555
|
+
title="Add task"
|
|
556
|
+
>
|
|
557
|
+
<label>
|
|
558
|
+
Title
|
|
559
|
+
<input name="title" required />
|
|
560
|
+
</label>
|
|
561
|
+
<label>
|
|
562
|
+
Notes
|
|
563
|
+
<textarea name="notes" rows={4} />
|
|
564
|
+
</label>
|
|
565
|
+
</FormSurface>
|
|
566
|
+
</AppWorkspaceShell>
|
|
567
|
+
);
|
|
568
|
+
}
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
Checklist:
|
|
572
|
+
|
|
573
|
+
- use `@zvk/composite` before adding custom shell CSS;
|
|
574
|
+
- keep primitives for fields and details only;
|
|
575
|
+
- prefer native forms and app-owned server actions over custom mutation plumbing.
|
|
576
|
+
|
|
577
|
+
## Repo Skill
|
|
578
|
+
|
|
579
|
+
Use `.codex/skills/use-zvk-composite/SKILL.md` when maintaining this package.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ActivityFeed } from "../activity/activity-feed.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ConversationDirectory } from "../ai/conversation-directory.js";
|
|
2
|
+
export type { ConversationDirectoryGroup, ConversationDirectoryItem, ConversationDirectoryProps } from "../ai/conversation-directory.js";
|
|
3
|
+
export { ProviderModelSelector } from "../ai/provider-model-selector.js";
|
|
4
|
+
export type { ProviderModelGroup, ProviderModelItem, ProviderModelSelectorProps } from "../ai/provider-model-selector.js";
|
|
5
|
+
export { StickyComposer } from "../ai/sticky-composer.js";
|
|
6
|
+
export type { StickyComposerProps } from "../ai/sticky-composer.js";
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { DataTableControlBar } from "../data/data-table-control-bar.js";
|
|
2
|
+
export type { DataTableControlBarProps } from "../data/data-table-control-bar.js";
|
|
3
|
+
export { DataTablePageFrame } from "../data/data-table-page-frame.js";
|
|
4
|
+
export type { DataTablePageFrameProps } from "../data/data-table-page-frame.js";
|
|
5
|
+
export { EntityCard } from "../lists/entity-card.js";
|
|
6
|
+
export type { EntityCardProps } from "../lists/entity-card.js";
|
|
7
|
+
export { EntityListSection } from "../lists/entity-list-section.js";
|
|
8
|
+
export type { EntityListSectionProps } from "../lists/entity-list-section.js";
|
|
9
|
+
export { SummaryMetricGrid } from "../lists/summary-metric-grid.js";
|
|
10
|
+
export type { SummaryMetric, SummaryMetricGridActionPosition, SummaryMetricGridColumns, SummaryMetricGridProps } from "../lists/summary-metric-grid.js";
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { DataTableControlBar } from "../data/data-table-control-bar.js";
|
|
2
|
+
export { DataTablePageFrame } from "../data/data-table-page-frame.js";
|
|
3
|
+
export { EntityCard } from "../lists/entity-card.js";
|
|
4
|
+
export { EntityListSection } from "../lists/entity-list-section.js";
|
|
5
|
+
export { SummaryMetricGrid } from "../lists/summary-metric-grid.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DetailInspectorPanel } from "../detail/detail-inspector-panel.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ConfirmActionDialog } from "../forms/confirm-action-dialog.js";
|
|
2
|
+
export type { ConfirmActionDialogProps, ConfirmActionDialogTone } from "../forms/confirm-action-dialog.js";
|
|
3
|
+
export { FormSurface } from "../forms/form-surface.js";
|
|
4
|
+
export type { FormSurfaceProps } from "../forms/form-surface.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { BreadcrumbPageHeader, WorkspaceHeader } from "../navigation/workspace-header.js";
|
|
2
|
+
export type { BreadcrumbPageHeaderItem, BreadcrumbPageHeaderProps, WorkspaceHeaderAlign, WorkspaceHeaderHeadingLevel, WorkspaceHeaderProps } from "../navigation/workspace-header.js";
|
|
3
|
+
export { CommandPaletteShell } from "../navigation/command-palette-shell.js";
|
|
4
|
+
export type { CommandPaletteCommand, CommandPaletteGroup, CommandPaletteShellProps } from "../navigation/command-palette-shell.js";
|
|
5
|
+
export { EntitySwitcherMenu } from "../navigation/entity-switcher-menu.js";
|
|
6
|
+
export type { EntitySwitcherGroup, EntitySwitcherItem, EntitySwitcherMenuProps, EntitySwitcherMenuSize } from "../navigation/entity-switcher-menu.js";
|
|
7
|
+
export { LinkAction } from "../navigation/link-action.js";
|
|
8
|
+
export type { LinkActionProps } from "../navigation/link-action.js";
|
|
9
|
+
export { ResourceExplorerShell } from "../navigation/resource-explorer-shell.js";
|
|
10
|
+
export type { ResourceExplorerShellProps, ResourceExplorerShellResource } from "../navigation/resource-explorer-shell.js";
|
|
11
|
+
export { SectionedWorkspaceShell } from "../navigation/sectioned-workspace-shell.js";
|
|
12
|
+
export type { SectionedWorkspaceItem, SectionedWorkspaceSection, SectionedWorkspaceShellProps } from "../navigation/sectioned-workspace-shell.js";
|
|
13
|
+
export { SimpleWorkspaceShell } from "../navigation/simple-workspace-shell.js";
|
|
14
|
+
export type { SimpleWorkspaceShellProps } from "../navigation/simple-workspace-shell.js";
|
|
15
|
+
export { SplitWorkspaceShell } from "../navigation/split-workspace-shell.js";
|
|
16
|
+
export type { SplitWorkspaceShellProps } from "../navigation/split-workspace-shell.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { BreadcrumbPageHeader, WorkspaceHeader } from "../navigation/workspace-header.js";
|
|
2
|
+
export { CommandPaletteShell } from "../navigation/command-palette-shell.js";
|
|
3
|
+
export { EntitySwitcherMenu } from "../navigation/entity-switcher-menu.js";
|
|
4
|
+
export { LinkAction } from "../navigation/link-action.js";
|
|
5
|
+
export { ResourceExplorerShell } from "../navigation/resource-explorer-shell.js";
|
|
6
|
+
export { SectionedWorkspaceShell } from "../navigation/sectioned-workspace-shell.js";
|
|
7
|
+
export { SimpleWorkspaceShell } from "../navigation/simple-workspace-shell.js";
|
|
8
|
+
export { SplitWorkspaceShell } from "../navigation/split-workspace-shell.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ParameterEditor } from "../settings/parameter-editor.js";
|
|
2
|
+
export type { ParameterEditorDensity, ParameterEditorGroup, ParameterEditorProps, ParameterEditorRow } from "../settings/parameter-editor.js";
|
|
3
|
+
export { SettingsHubList } from "../lists/settings-hub-list.js";
|
|
4
|
+
export type { SettingsHubItem, SettingsHubListProps } from "../lists/settings-hub-list.js";
|
|
5
|
+
export { SettingsSectionStack } from "../settings/settings-section-stack.js";
|
|
6
|
+
export type { SettingsSection, SettingsSectionStackProps } from "../settings/settings-section-stack.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { AppWorkspaceShell } from "../navigation/app-workspace-shell.js";
|
|
2
|
+
export type { AppWorkspaceShellProps } from "../navigation/app-workspace-shell.js";
|
|
3
|
+
export { FeatureShell } from "../layout/feature-shell.js";
|
|
4
|
+
export type { FeatureShellProps } from "../layout/feature-shell.js";
|
|
5
|
+
export { PageScaffold } from "../layout/page-scaffold.js";
|
|
6
|
+
export type { PageScaffoldMaxWidth, PageScaffoldProps } from "../layout/page-scaffold.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { RouteStateFrame } from "../state/route-state-frame.js";
|
|
2
|
+
export type { RouteStateFrameProps, RouteStateFrameStatus } from "../state/route-state-frame.js";
|
|
3
|
+
export { StateSurface } from "../state/state-surface.js";
|
|
4
|
+
export type { StateSurfaceAlign, StateSurfaceProps, StateSurfaceSize, StateSurfaceState } from "../state/state-surface.js";
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { IntegrationStatusCard } from "../integrations/integration-status-card.js";
|
|
2
|
+
export type { IntegrationStatusCardProps, IntegrationStatusTone } from "../integrations/integration-status-card.js";
|
|
3
|
+
export { ProcessListPanel } from "../workflows/process-list-panel.js";
|
|
4
|
+
export type { ProcessListPanelItem, ProcessListPanelProps } from "../workflows/process-list-panel.js";
|
|
5
|
+
export { WizardShell } from "../workflows/wizard-shell.js";
|
|
6
|
+
export type { WizardShellProps, WizardShellStep, WizardShellStepStatus } from "../workflows/wizard-shell.js";
|
|
7
|
+
export { WorkflowStatusCard } from "../workflows/workflow-status-card.js";
|
|
8
|
+
export type { WorkflowStatusCardProps, WorkflowStatusTone } from "../workflows/workflow-status-card.js";
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { IntegrationStatusCard } from "../integrations/integration-status-card.js";
|
|
2
|
+
export { ProcessListPanel } from "../workflows/process-list-panel.js";
|
|
3
|
+
export { WizardShell } from "../workflows/wizard-shell.js";
|
|
4
|
+
export { WorkflowStatusCard } from "../workflows/workflow-status-card.js";
|
package/dist/index.d.ts
CHANGED
|
@@ -1,56 +1,10 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export { EntitySwitcherMenu } from "./navigation/entity-switcher-menu.js";
|
|
12
|
-
export type { EntitySwitcherGroup, EntitySwitcherItem, EntitySwitcherMenuProps, EntitySwitcherMenuSize } from "./navigation/entity-switcher-menu.js";
|
|
13
|
-
export { BreadcrumbPageHeader, WorkspaceHeader } from "./navigation/workspace-header.js";
|
|
14
|
-
export type { BreadcrumbPageHeaderProps, BreadcrumbPageHeaderItem, WorkspaceHeaderAlign, WorkspaceHeaderHeadingLevel, WorkspaceHeaderProps } from "./navigation/workspace-header.js";
|
|
15
|
-
export { SectionedWorkspaceShell } from "./navigation/sectioned-workspace-shell.js";
|
|
16
|
-
export type { SectionedWorkspaceItem, SectionedWorkspaceSection, SectionedWorkspaceShellProps } from "./navigation/sectioned-workspace-shell.js";
|
|
17
|
-
export { StateSurface } from "./state/state-surface.js";
|
|
18
|
-
export type { StateSurfaceAlign, StateSurfaceProps, StateSurfaceSize, StateSurfaceState } from "./state/state-surface.js";
|
|
19
|
-
export { RouteStateFrame } from "./state/route-state-frame.js";
|
|
20
|
-
export type { RouteStateFrameProps, RouteStateFrameStatus } from "./state/route-state-frame.js";
|
|
21
|
-
export { EntityCard } from "./lists/entity-card.js";
|
|
22
|
-
export type { EntityCardProps } from "./lists/entity-card.js";
|
|
23
|
-
export { EntityListSection } from "./lists/entity-list-section.js";
|
|
24
|
-
export type { EntityListSectionProps } from "./lists/entity-list-section.js";
|
|
25
|
-
export { SummaryMetricGrid } from "./lists/summary-metric-grid.js";
|
|
26
|
-
export type { SummaryMetric, SummaryMetricGridActionPosition, SummaryMetricGridColumns, SummaryMetricGridProps } from "./lists/summary-metric-grid.js";
|
|
27
|
-
export { SettingsHubList } from "./lists/settings-hub-list.js";
|
|
28
|
-
export type { SettingsHubItem, SettingsHubListProps } from "./lists/settings-hub-list.js";
|
|
29
|
-
export { ConfirmActionDialog } from "./forms/confirm-action-dialog.js";
|
|
30
|
-
export type { ConfirmActionDialogProps, ConfirmActionDialogTone } from "./forms/confirm-action-dialog.js";
|
|
31
|
-
export { FormSurface } from "./forms/form-surface.js";
|
|
32
|
-
export type { FormSurfaceProps } from "./forms/form-surface.js";
|
|
33
|
-
export { IntegrationStatusCard } from "./integrations/integration-status-card.js";
|
|
34
|
-
export type { IntegrationStatusCardProps, IntegrationStatusTone } from "./integrations/integration-status-card.js";
|
|
35
|
-
export { WorkflowStatusCard } from "./workflows/workflow-status-card.js";
|
|
36
|
-
export type { WorkflowStatusCardProps, WorkflowStatusTone } from "./workflows/workflow-status-card.js";
|
|
37
|
-
export { ProcessListPanel } from "./workflows/process-list-panel.js";
|
|
38
|
-
export type { ProcessListPanelItem, ProcessListPanelProps } from "./workflows/process-list-panel.js";
|
|
39
|
-
export { ParameterEditor } from "./settings/parameter-editor.js";
|
|
40
|
-
export type { ParameterEditorDensity, ParameterEditorGroup, ParameterEditorProps, ParameterEditorRow } from "./settings/parameter-editor.js";
|
|
41
|
-
export { SettingsSectionStack } from "./settings/settings-section-stack.js";
|
|
42
|
-
export type { SettingsSection, SettingsSectionStackProps } from "./settings/settings-section-stack.js";
|
|
43
|
-
export { ProviderModelSelector } from "./ai/provider-model-selector.js";
|
|
44
|
-
export type { ProviderModelGroup, ProviderModelItem, ProviderModelSelectorProps } from "./ai/provider-model-selector.js";
|
|
45
|
-
export { ConversationDirectory } from "./ai/conversation-directory.js";
|
|
46
|
-
export type { ConversationDirectoryGroup, ConversationDirectoryItem, ConversationDirectoryProps } from "./ai/conversation-directory.js";
|
|
47
|
-
export { StickyComposer } from "./ai/sticky-composer.js";
|
|
48
|
-
export type { StickyComposerProps } from "./ai/sticky-composer.js";
|
|
49
|
-
export { DetailInspectorPanel } from "./detail/detail-inspector-panel.js";
|
|
50
|
-
export type { DetailInspectorPanelProps, DetailInspectorSection } from "./detail/detail-inspector-panel.js";
|
|
51
|
-
export { DataTablePageFrame } from "./data/data-table-page-frame.js";
|
|
52
|
-
export { DataTableControlBar } from "./data/data-table-control-bar.js";
|
|
53
|
-
export { LinkAction } from "./navigation/link-action.js";
|
|
54
|
-
export type { LinkActionProps } from "./navigation/link-action.js";
|
|
55
|
-
export type { DataTableControlBarProps } from "./data/data-table-control-bar.js";
|
|
56
|
-
export type { DataTablePageFrameProps } from "./data/data-table-page-frame.js";
|
|
1
|
+
export * from "./domains/activity.js";
|
|
2
|
+
export * from "./domains/shell.js";
|
|
3
|
+
export * from "./domains/navigation.js";
|
|
4
|
+
export * from "./domains/state.js";
|
|
5
|
+
export * from "./domains/data.js";
|
|
6
|
+
export * from "./domains/forms.js";
|
|
7
|
+
export * from "./domains/workflow.js";
|
|
8
|
+
export * from "./domains/settings.js";
|
|
9
|
+
export * from "./domains/ai.js";
|
|
10
|
+
export * from "./domains/detail.js";
|
package/dist/index.js
CHANGED
|
@@ -1,28 +1,10 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
3
|
-
export
|
|
4
|
-
export
|
|
5
|
-
export
|
|
6
|
-
export
|
|
7
|
-
export
|
|
8
|
-
export
|
|
9
|
-
export
|
|
10
|
-
export
|
|
11
|
-
export { EntityCard } from "./lists/entity-card.js";
|
|
12
|
-
export { EntityListSection } from "./lists/entity-list-section.js";
|
|
13
|
-
export { SummaryMetricGrid } from "./lists/summary-metric-grid.js";
|
|
14
|
-
export { SettingsHubList } from "./lists/settings-hub-list.js";
|
|
15
|
-
export { ConfirmActionDialog } from "./forms/confirm-action-dialog.js";
|
|
16
|
-
export { FormSurface } from "./forms/form-surface.js";
|
|
17
|
-
export { IntegrationStatusCard } from "./integrations/integration-status-card.js";
|
|
18
|
-
export { WorkflowStatusCard } from "./workflows/workflow-status-card.js";
|
|
19
|
-
export { ProcessListPanel } from "./workflows/process-list-panel.js";
|
|
20
|
-
export { ParameterEditor } from "./settings/parameter-editor.js";
|
|
21
|
-
export { SettingsSectionStack } from "./settings/settings-section-stack.js";
|
|
22
|
-
export { ProviderModelSelector } from "./ai/provider-model-selector.js";
|
|
23
|
-
export { ConversationDirectory } from "./ai/conversation-directory.js";
|
|
24
|
-
export { StickyComposer } from "./ai/sticky-composer.js";
|
|
25
|
-
export { DetailInspectorPanel } from "./detail/detail-inspector-panel.js";
|
|
26
|
-
export { DataTablePageFrame } from "./data/data-table-page-frame.js";
|
|
27
|
-
export { DataTableControlBar } from "./data/data-table-control-bar.js";
|
|
28
|
-
export { LinkAction } from "./navigation/link-action.js";
|
|
1
|
+
export * from "./domains/activity.js";
|
|
2
|
+
export * from "./domains/shell.js";
|
|
3
|
+
export * from "./domains/navigation.js";
|
|
4
|
+
export * from "./domains/state.js";
|
|
5
|
+
export * from "./domains/data.js";
|
|
6
|
+
export * from "./domains/forms.js";
|
|
7
|
+
export * from "./domains/workflow.js";
|
|
8
|
+
export * from "./domains/settings.js";
|
|
9
|
+
export * from "./domains/ai.js";
|
|
10
|
+
export * from "./domains/detail.js";
|
|
@@ -1,19 +1,27 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
3
|
import { cn } from "../utils/cn.js";
|
|
4
|
+
import { hasRenderableShellSlot, ShellHeaderChrome } from "../navigation/shell-slot-rendering.js";
|
|
4
5
|
import { WorkspaceHeader } from "../navigation/workspace-header.js";
|
|
5
6
|
export function PageScaffold({ actions, aside, children, className, description, eyebrow, footer, headerAlign, headingLevel, maxWidth = "xl", ref, state, status, title, toolbar, ...props }) {
|
|
6
|
-
const
|
|
7
|
-
const
|
|
8
|
-
const
|
|
7
|
+
const hasActions = hasRenderableShellSlot(actions);
|
|
8
|
+
const hasAside = hasRenderableShellSlot(aside);
|
|
9
|
+
const hasDescription = hasRenderableShellSlot(description);
|
|
10
|
+
const hasEyebrow = hasRenderableShellSlot(eyebrow);
|
|
11
|
+
const hasFooter = hasRenderableShellSlot(footer);
|
|
12
|
+
const hasState = hasRenderableShellSlot(state);
|
|
13
|
+
const hasStatus = hasRenderableShellSlot(status);
|
|
14
|
+
const hasTitle = hasRenderableShellSlot(title);
|
|
15
|
+
const hasToolbar = hasRenderableShellSlot(toolbar);
|
|
16
|
+
const hasHeader = hasTitle || hasEyebrow || hasDescription || hasStatus || hasToolbar || hasActions;
|
|
9
17
|
const headerProps = {
|
|
10
|
-
...(
|
|
11
|
-
...(
|
|
12
|
-
...(
|
|
18
|
+
...(hasActions ? { actions } : {}),
|
|
19
|
+
...(hasDescription ? { description } : {}),
|
|
20
|
+
...(hasEyebrow ? { eyebrow } : {}),
|
|
13
21
|
...(headerAlign === undefined ? {} : { align: headerAlign }),
|
|
14
22
|
...(headingLevel === undefined ? {} : { headingLevel }),
|
|
15
|
-
...(
|
|
16
|
-
...(
|
|
23
|
+
...(hasStatus ? { status } : {}),
|
|
24
|
+
...(hasToolbar ? { toolbar } : {})
|
|
17
25
|
};
|
|
18
|
-
return (_jsxs("div", { ...props, ref: ref, className: cn("zvk-composite-page-scaffold", className), "data-max-width": maxWidth, "data-with-aside": hasAside ? "true" : "false", children: [hasTitle ? (_jsx(WorkspaceHeader, { ...headerProps, className: "zvk-composite-page-scaffold__header", title: title })) : hasHeader ? (
|
|
26
|
+
return (_jsxs("div", { ...props, ref: ref, className: cn("zvk-composite-page-scaffold", className), "data-max-width": maxWidth, "data-with-aside": hasAside ? "true" : "false", children: [hasHeader && hasTitle ? (_jsx(WorkspaceHeader, { ...headerProps, className: "zvk-composite-page-scaffold__header", title: title })) : hasHeader ? (_jsx(ShellHeaderChrome, { actions: actions, align: headerAlign, className: "zvk-composite-page-scaffold__header", description: description, eyebrow: eyebrow, status: status, toolbar: toolbar })) : null, hasState ? _jsx("div", { className: "zvk-composite-page-scaffold__state", children: state }) : null, _jsxs("div", { className: "zvk-composite-page-scaffold__grid", children: [_jsx("main", { className: "zvk-composite-page-scaffold__main", children: children }), hasAside ? _jsx("aside", { className: "zvk-composite-page-scaffold__aside", children: aside }) : null] }), hasFooter ? _jsx("footer", { className: "zvk-composite-page-scaffold__footer", children: footer }) : null] }));
|
|
19
27
|
}
|
|
@@ -20,6 +20,7 @@ export interface CommandPaletteShellProps extends Omit<React.HTMLAttributes<HTML
|
|
|
20
20
|
groups: readonly CommandPaletteGroup[];
|
|
21
21
|
label?: React.ReactNode | undefined;
|
|
22
22
|
loading?: boolean | undefined;
|
|
23
|
+
loadingLabel?: React.ReactNode | undefined;
|
|
23
24
|
onCommandSelect?: ((command: CommandPaletteCommand) => void) | undefined;
|
|
24
25
|
onOpenChange: (open: boolean) => void;
|
|
25
26
|
onQueryChange?: ((query: string) => void) | undefined;
|
|
@@ -28,4 +29,4 @@ export interface CommandPaletteShellProps extends Omit<React.HTMLAttributes<HTML
|
|
|
28
29
|
query?: string | undefined;
|
|
29
30
|
ref?: React.Ref<HTMLDivElement> | undefined;
|
|
30
31
|
}
|
|
31
|
-
export declare function CommandPaletteShell({ className, defaultQuery, empty, footer, groups, label, loading, onCommandSelect, onOpenChange, onQueryChange, open, placeholder, query, ref, ...props }: CommandPaletteShellProps): React.JSX.Element;
|
|
32
|
+
export declare function CommandPaletteShell({ className, defaultQuery, empty, footer, groups, label, loading, loadingLabel, onCommandSelect, onOpenChange, onQueryChange, open, placeholder, query, ref, ...props }: CommandPaletteShellProps): React.JSX.Element;
|
|
@@ -5,18 +5,8 @@ import * as React from "react";
|
|
|
5
5
|
import { Command } from "@zvk/ui/command";
|
|
6
6
|
import { Dialog } from "@zvk/ui/dialog";
|
|
7
7
|
import { cn } from "../utils/cn.js";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const resolvedValue = value ?? uncontrolledValue;
|
|
11
|
-
const setValue = React.useCallback((nextValue) => {
|
|
12
|
-
if (value === undefined) {
|
|
13
|
-
setUncontrolledValue(nextValue);
|
|
14
|
-
}
|
|
15
|
-
onChange?.(nextValue);
|
|
16
|
-
}, [onChange, value]);
|
|
17
|
-
return [resolvedValue, setValue];
|
|
18
|
-
}
|
|
19
|
-
export function CommandPaletteShell({ className, defaultQuery = "", empty = "No commands found.", footer, groups, label = "Command menu", loading = false, onCommandSelect, onOpenChange, onQueryChange, open, placeholder = "Search commands...", query, ref, ...props }) {
|
|
8
|
+
import { useControllableValue } from "../utils/use-controllable-value.js";
|
|
9
|
+
export function CommandPaletteShell({ className, defaultQuery = "", empty = "No commands found.", footer, groups, label = "Command menu", loading = false, loadingLabel = "Loading...", onCommandSelect, onOpenChange, onQueryChange, open, placeholder = "Search commands...", query, ref, ...props }) {
|
|
20
10
|
const [resolvedQuery, setResolvedQuery] = useControllableValue({
|
|
21
11
|
defaultValue: defaultQuery,
|
|
22
12
|
...(onQueryChange ? { onChange: onQueryChange } : {}),
|
|
@@ -30,7 +20,7 @@ export function CommandPaletteShell({ className, defaultQuery = "", empty = "No
|
|
|
30
20
|
onCommandSelect?.(command);
|
|
31
21
|
onOpenChange(false);
|
|
32
22
|
}, [onCommandSelect, onOpenChange]);
|
|
33
|
-
return (_jsx(Dialog, { ...props, ...dialogProps, className: cn("zvk-composite-command-palette-shell", className), onOpenChange: onOpenChange, open: open, children: _jsxs(Dialog.Content, { className: "zvk-composite-command-palette-shell__content", children: [_jsx(Dialog.Title, { className: "zvk-composite-command-palette-shell__title", children: label }), _jsxs(Command, { className: "zvk-composite-command-palette-shell__command", onValueChange: setResolvedQuery, value: resolvedQuery, children: [_jsx(Command.Input, { className: "zvk-composite-command-palette-shell__search", placeholder: placeholder }), _jsxs(Command.List, { className: "zvk-composite-command-palette-shell__list", children: [loading ? (_jsx("div", { className: "zvk-composite-command-palette-shell__state", "data-state": "loading", children:
|
|
23
|
+
return (_jsx(Dialog, { ...props, ...dialogProps, className: cn("zvk-composite-command-palette-shell", className), onOpenChange: onOpenChange, open: open, children: _jsxs(Dialog.Content, { className: "zvk-composite-command-palette-shell__content", children: [_jsx(Dialog.Title, { className: "zvk-composite-command-palette-shell__title", children: label }), _jsxs(Command, { className: "zvk-composite-command-palette-shell__command", onValueChange: setResolvedQuery, value: resolvedQuery, children: [_jsx(Command.Input, { className: "zvk-composite-command-palette-shell__search", placeholder: placeholder }), _jsxs(Command.List, { className: "zvk-composite-command-palette-shell__list", children: [loading ? (_jsx("div", { className: "zvk-composite-command-palette-shell__state", "data-state": "loading", children: loadingLabel })) : null, !loading && !hasCommands ? (_jsx("div", { className: "zvk-composite-command-palette-shell__state", "data-state": "empty", children: empty })) : null, !loading && hasCommands ? _jsx(Command.Empty, { children: empty }) : null, !loading
|
|
34
24
|
? groups.map((group) => (_jsx(Command.Group, { className: "zvk-composite-command-palette-shell__group", heading: group.label, children: group.commands.map((command) => {
|
|
35
25
|
const commandProps = {
|
|
36
26
|
...(command.disabled !== undefined ? { disabled: command.disabled } : {}),
|
|
@@ -6,17 +6,7 @@ import { Button } from "@zvk/ui/button";
|
|
|
6
6
|
import { Command } from "@zvk/ui/command";
|
|
7
7
|
import { Popover } from "@zvk/ui/popover";
|
|
8
8
|
import { cn } from "../utils/cn.js";
|
|
9
|
-
|
|
10
|
-
const [uncontrolledValue, setUncontrolledValue] = React.useState(defaultValue);
|
|
11
|
-
const resolvedValue = value ?? uncontrolledValue;
|
|
12
|
-
const setValue = React.useCallback((nextValue) => {
|
|
13
|
-
if (value === undefined) {
|
|
14
|
-
setUncontrolledValue(nextValue);
|
|
15
|
-
}
|
|
16
|
-
onChange?.(nextValue);
|
|
17
|
-
}, [onChange, value]);
|
|
18
|
-
return [resolvedValue, setValue];
|
|
19
|
-
}
|
|
9
|
+
import { useControllableValue } from "../utils/use-controllable-value.js";
|
|
20
10
|
function hasRenderableNode(value) {
|
|
21
11
|
return value !== undefined && value !== null && value !== false;
|
|
22
12
|
}
|