@signalsafe/tree-spec-editor 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -42,7 +42,7 @@ export type { DraftHistoryModalProps } from './modals/DraftHistoryModal';
42
42
  export { default as AuditLogModal } from './modals/AuditLogModal';
43
43
  export type { AuditLogModalProps } from './modals/AuditLogModal';
44
44
  export { default as ToolbarPanel, TOOLBAR_ITEM_KIND } from './panels/ToolbarPanel';
45
- export type { ToolbarPanelProps, ToolbarItem, ToolbarItemKind, ToolbarButtonItem, ToolbarDropdownItem, ToolbarDropdownEntry, ToolbarBadgeItem, ToolbarTextItem, ToolbarCustomItem, ToolbarVariant, } from './panels/ToolbarPanel';
45
+ export type { ToolbarPanelProps, ToolbarItem, ToolbarItemKind, ToolbarButtonItem, ToolbarDropdownItem, ToolbarDropdownEntry, ToolbarBadgeItem, ToolbarTextItem, ToolbarCustomItem, } from './panels/ToolbarPanel';
46
46
  export { getIssueSeverityBadgeClass } from './lib/panelHelpers';
47
47
  export { default as PanelHeaderCollapseCarets } from './lib/PanelHeaderCollapseCarets';
48
48
  export { buildDefaultToolbarSpec } from './lib/buildDefaultToolbarSpec';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,7 @@
1
- /**
2
- * Single toggle next to the panel title: **caret-up** while expanded (click to hide body),
3
- * **caret-down** while collapsed (click to show). Avoids relying on Bootstrap’s `.collapse`
4
- * transition/CSS, which can fail to hide content in some host bundles.
5
- */
6
- export default function PanelHeaderCollapseCarets({ expanded, onToggle, }: Readonly<{
1
+ export interface PanelHeaderCollapseCaretsProps {
7
2
  expanded: boolean;
8
3
  onToggle: () => void;
9
- }>): import("react/jsx-runtime").JSX.Element;
4
+ }
5
+ /** Collapse/expand carets for card panel headers. */
6
+ export default function PanelHeaderCollapseCarets({ expanded, onToggle, }: Readonly<PanelHeaderCollapseCaretsProps>): import("react/jsx-runtime").JSX.Element;
10
7
  //# sourceMappingURL=PanelHeaderCollapseCarets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanelHeaderCollapseCarets.d.ts","sourceRoot":"","sources":["../../src/lib/PanelHeaderCollapseCarets.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAC9C,QAAQ,EACR,QAAQ,GACX,EAAE,QAAQ,CAAC;IACR,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC,2CAiBD"}
1
+ {"version":3,"file":"PanelHeaderCollapseCarets.d.ts","sourceRoot":"","sources":["../../src/lib/PanelHeaderCollapseCarets.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,qDAAqD;AACrD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAC9C,QAAQ,EACR,QAAQ,GACX,EAAE,QAAQ,CAAC,8BAA8B,CAAC,2CAY1C"}
@@ -1,13 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- /**
3
- * Single toggle next to the panel title: **caret-up** while expanded (click to hide body),
4
- * **caret-down** while collapsed (click to show). Avoids relying on Bootstrap’s `.collapse`
5
- * transition/CSS, which can fail to hide content in some host bundles.
6
- */
2
+ /** Collapse/expand carets for card panel headers. */
7
3
  export default function PanelHeaderCollapseCarets({ expanded, onToggle, }) {
8
- return (_jsx("button", { type: "button", className: "btn btn-link btn-sm py-1 px-2 lh-1 text-body-secondary text-decoration-none ms-1 align-middle", "aria-expanded": expanded, "aria-label": expanded ? 'Collapse panel' : 'Expand panel', title: expanded ? 'Collapse' : 'Expand', onClick: (e) => {
9
- e.preventDefault();
10
- e.stopPropagation();
11
- onToggle();
12
- }, children: _jsx("i", { className: `bi ${expanded ? 'bi-caret-up' : 'bi-caret-down'}`, "aria-hidden": true }) }));
4
+ return (_jsx("button", { type: "button", className: "btn btn-sm btn-link text-body-secondary p-0 ms-1", "aria-expanded": expanded, "aria-label": expanded ? 'Collapse panel' : 'Expand panel', onClick: onToggle, children: _jsx("i", { className: `bi bi-caret-${expanded ? 'up' : 'down'}`, "aria-hidden": true }) }));
13
5
  }
@@ -1,41 +1,43 @@
1
1
  import type { ReactNode } from 'react';
2
- import { AUTOSAVE_STATUS, type AutosaveStatus, type EditorNode, type TreeTemplateSpec } from '@signalsafe/tree-spec-editor-core';
3
- import { type ToolbarItem } from '../panels/ToolbarPanel';
4
- /**
5
- * Description of a node type the host wants in the "+ Add" dropdown, or a
6
- * visual divider between groups.
7
- *
8
- * Each entry encodes the host's vocabulary: the package never assumes a fixed
9
- * set of node types. When a label is omitted, the type id is title-cased. Pass
10
- * `{ divider: true }` to insert a `<Dropdown.Divider />`.
11
- */
2
+ import { type AutosaveStatus, type TreeTemplateSpec } from '@signalsafe/tree-spec-editor-core';
3
+ import { type ToolbarItem } from '../panels/ToolbarPanel.js';
4
+ export { AUTOSAVE_STATUS } from '@signalsafe/tree-spec-editor-core';
5
+ export interface DefaultToolbarCapabilities {
6
+ canValidate?: boolean;
7
+ canListSnapshots?: boolean;
8
+ canListAudit?: boolean;
9
+ canCreateSnapshot?: boolean;
10
+ canCloneToDraft?: boolean;
11
+ canPublish?: boolean;
12
+ }
12
13
  export interface DefaultToolbarNodeType {
13
- /** Node type id (matches `EditorNode.type`). Required unless `divider: true`. */
14
14
  type?: string;
15
- /** Optional display label; defaults to the title-cased type id. */
16
- label?: ReactNode;
17
- /** Optional patch applied to the spawned node (e.g. starter prompt). */
18
- patch?: Partial<EditorNode>;
19
- /** Optional stable id; defaults to `add-<type>`. */
20
- id?: string;
21
- /** Render this entry as a visual divider. Ignores `type` / `label` / `patch`. */
15
+ label?: string;
22
16
  divider?: boolean;
17
+ id?: string;
18
+ patch?: Record<string, unknown>;
23
19
  }
24
- /** Description of a starter template the host wants in the "Templates" dropdown. */
25
20
  export interface DefaultToolbarTemplate {
26
- /** Template id used as the React key. */
27
21
  id: string;
28
- /** Display label in the dropdown. */
29
- label: ReactNode;
30
- /** Template spec consumed by `actions.insertTemplate`. */
22
+ label: string;
31
23
  spec: TreeTemplateSpec;
32
24
  }
33
- /**
34
- * Minimal subset of {@link UseTreeSpecEditorState} consumed by
35
- * {@link buildDefaultToolbarSpec}. Hosts pass the state object returned by
36
- * `useTreeSpecEditor` (which satisfies this contract structurally) — see the
37
- * `-react` package for the full state type.
38
- */
25
+ export interface DefaultToolbarLabels {
26
+ add?: string;
27
+ templates?: string;
28
+ validate?: string;
29
+ autoLayout?: string;
30
+ resetView?: string;
31
+ preview?: string;
32
+ save?: string;
33
+ publish?: string;
34
+ history?: string;
35
+ audit?: string;
36
+ snapshot?: string;
37
+ clone?: string;
38
+ draftBadge?: string;
39
+ publishedBadge?: string;
40
+ }
39
41
  export interface DefaultToolbarState {
40
42
  isPublished: boolean;
41
43
  saving: boolean;
@@ -46,112 +48,36 @@ export interface DefaultToolbarState {
46
48
  hasTree: boolean;
47
49
  autosaveStatus: AutosaveStatus;
48
50
  }
49
- /**
50
- * Minimal subset of {@link UseTreeSpecEditorActions} consumed by
51
- * {@link buildDefaultToolbarSpec}.
52
- */
53
51
  export interface DefaultToolbarActions {
54
- addNodeOfType: (type: string, patch?: Partial<EditorNode>) => unknown;
52
+ addNodeOfType: (type: string, patch?: Record<string, unknown>) => void;
55
53
  insertTemplate: (spec: TreeTemplateSpec) => void;
56
54
  triggerResetView: () => void;
57
55
  autoLayout: () => void;
58
- validate: (...args: unknown[]) => unknown;
59
- saveDraft: (...args: unknown[]) => unknown;
60
- setShowDraftHistory: (next: boolean) => void;
61
- setShowAudit: (next: boolean) => void;
62
- createSnapshot: (...args: unknown[]) => unknown;
63
- cloneToDraft: (...args: unknown[]) => unknown;
64
- setShowPublishModal: (next: boolean) => void;
56
+ validate: () => void | Promise<void>;
57
+ saveDraft: () => void | Promise<void>;
58
+ setShowDraftHistory: (show: boolean) => void;
59
+ setShowAudit: (show: boolean) => void;
60
+ createSnapshot: () => void | Promise<void>;
61
+ cloneToDraft: () => void | Promise<void>;
62
+ setShowPublishModal: (show: boolean) => void;
65
63
  }
66
- /**
67
- * Adapter-capability flags consumed by {@link buildDefaultToolbarSpec}.
68
- * Hosts pass `Boolean(adapter.validate)` (etc.) so the builder can gate the
69
- * Validate / Draft history / Audit / Snapshot / Clone / Publish buttons.
70
- */
71
- export interface DefaultToolbarCapabilities {
72
- /** Show the Validate button. */
73
- canValidate?: boolean;
74
- /** Show the Draft history button. */
75
- canListSnapshots?: boolean;
76
- /** Show the Audit button. */
77
- canListAudit?: boolean;
78
- /** Show the Snapshot button. */
79
- canCreateSnapshot?: boolean;
80
- /** Show the Clone to Draft button. */
81
- canCloneToDraft?: boolean;
82
- /** Show the Publish button. */
83
- canPublish?: boolean;
84
- }
85
- /** Optional labels for the default toolbar; defaults are in en-US. */
86
- export interface DefaultToolbarLabels {
87
- add?: ReactNode;
88
- templates?: ReactNode;
89
- resetView?: ReactNode;
90
- autoLayout?: ReactNode;
91
- validate?: ReactNode;
92
- draftHistory?: ReactNode;
93
- audit?: ReactNode;
94
- snapshot?: ReactNode;
95
- snapshotInFlight?: ReactNode;
96
- cloneToDraft?: ReactNode;
97
- cloneInFlight?: ReactNode;
98
- saveDraft?: ReactNode;
99
- saveDraftInFlight?: ReactNode;
100
- publish?: ReactNode;
101
- publishInFlight?: ReactNode;
102
- statusPublished?: ReactNode;
103
- statusDraft?: ReactNode;
104
- }
105
- /** Options for {@link buildDefaultToolbarSpec}. */
106
64
  export interface BuildDefaultToolbarSpecOptions {
107
- /** Editor state from `useTreeSpecEditor` (or a structurally compatible source). */
108
65
  state: DefaultToolbarState;
109
- /** Editor actions from `useTreeSpecEditor`. */
110
66
  actions: DefaultToolbarActions;
111
- /** Adapter-capability flags. Buttons are hidden when their flag is false. */
112
67
  capabilities?: DefaultToolbarCapabilities;
113
- /** Node types the host wants in the "+ Add" dropdown. */
114
68
  nodeTypes?: DefaultToolbarNodeType[];
115
- /** Starter templates the host wants in the "Templates" dropdown. */
116
69
  templates?: DefaultToolbarTemplate[];
117
- /**
118
- * Optional slot rendered before everything else. Hosts use this for a
119
- * router-aware back link (e.g. `() => <Link to=...>Back</Link>`).
120
- */
121
70
  backSlot?: {
122
71
  id?: string;
123
72
  render: () => ReactNode;
124
73
  };
125
- /**
126
- * Optional Preview action. When supplied, a `Preview` button is appended
127
- * after the status badge.
128
- */
129
74
  preview?: {
130
75
  onClick: () => void;
131
76
  disabled?: boolean;
132
- label?: ReactNode;
133
77
  };
134
- /**
135
- * When `false`, the published/draft badge and autosave status text are not
136
- * appended to the toolbar (hosts can show them elsewhere, e.g. an info panel).
137
- * Default: `true`.
138
- */
139
- includePublishedAutosaveStatus?: boolean;
140
- /** Items appended after the autosave-status text (e.g. project-specific badges). */
141
- extraItems?: ToolbarItem[];
142
- /** Override the default English labels. */
143
78
  labels?: DefaultToolbarLabels;
79
+ extraItems?: ToolbarItem[];
144
80
  }
145
- /**
146
- * Build the standard TreeSpec editor toolbar — Reset view / Auto layout /
147
- * Validate / Draft history / Audit / Snapshot / Clone to Draft / Save Draft /
148
- * Publish / (optional) status badge + autosave label — and inject host-supplied
149
- * vocabulary (node types, templates, back-link slot, preview action).
150
- *
151
- * This is the opinionated SignalSafe + Bootstrap toolbar layout. Hosts using a
152
- * different UI library should write their own builder; the
153
- * {@link useTreeSpecEditor} hook does not depend on this helper.
154
- */
81
+ /** Build the default TreeSpec editor toolbar item list from state, actions, and capability flags. */
155
82
  export declare function buildDefaultToolbarSpec(options: BuildDefaultToolbarSpecOptions): ToolbarItem[];
156
- export { AUTOSAVE_STATUS };
157
83
  //# sourceMappingURL=buildDefaultToolbarSpec.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildDefaultToolbarSpec.d.ts","sourceRoot":"","sources":["../../src/lib/buildDefaultToolbarSpec.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"buildDefaultToolbarSpec.d.ts","sourceRoot":"","sources":["../../src/lib/buildDefaultToolbarSpec.ts"],"names":[],"mappings":"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"}
@@ -1,131 +1,90 @@
1
- import { AUTOSAVE_STATUS, getAutosaveStatusLabel, } from '@signalsafe/tree-spec-editor-core';
2
- import { TOOLBAR_ITEM_KIND, } from '../panels/ToolbarPanel';
3
- const DEFAULT_LABELS = {
4
- add: '+ Add',
5
- templates: 'Templates',
6
- resetView: 'Reset view',
7
- autoLayout: 'Auto layout',
8
- validate: 'Validate',
9
- draftHistory: 'Draft history',
10
- audit: 'Audit',
11
- snapshot: 'Snapshot',
12
- snapshotInFlight: 'Creating…',
13
- cloneToDraft: 'Clone to Draft',
14
- cloneInFlight: 'Cloning…',
15
- saveDraft: 'Save Draft',
16
- saveDraftInFlight: 'Saving…',
17
- publish: 'Publish',
18
- publishInFlight: 'Publishing…',
19
- statusPublished: 'Published (read-only)',
20
- statusDraft: 'Draft',
21
- };
22
- function titleCase(type) {
23
- return type
24
- .split(/[_-]/)
25
- .filter(Boolean)
26
- .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
27
- .join(' ');
1
+ import { getAutosaveStatusLabel, } from '@signalsafe/tree-spec-editor-core';
2
+ import { TOOLBAR_ITEM_KIND } from '../panels/ToolbarPanel.js';
3
+ export { AUTOSAVE_STATUS } from '@signalsafe/tree-spec-editor-core';
4
+ function appendBackSlot(items, backSlot) {
5
+ items.push({
6
+ kind: TOOLBAR_ITEM_KIND.CUSTOM,
7
+ id: backSlot.id ?? 'back',
8
+ render: backSlot.render,
9
+ });
28
10
  }
29
- /**
30
- * Build the standard TreeSpec editor toolbar — Reset view / Auto layout /
31
- * Validate / Draft history / Audit / Snapshot / Clone to Draft / Save Draft /
32
- * Publish / (optional) status badge + autosave label — and inject host-supplied
33
- * vocabulary (node types, templates, back-link slot, preview action).
34
- *
35
- * This is the opinionated SignalSafe + Bootstrap toolbar layout. Hosts using a
36
- * different UI library should write their own builder; the
37
- * {@link useTreeSpecEditor} hook does not depend on this helper.
38
- */
39
- export function buildDefaultToolbarSpec(options) {
40
- const { state, actions, capabilities = {}, nodeTypes = [], templates = [], backSlot, preview, extraItems = [], labels: labelOverrides, includePublishedAutosaveStatus = true, } = options;
41
- const labels = { ...DEFAULT_LABELS, ...(labelOverrides ?? {}) };
42
- const items = [];
43
- if (backSlot) {
44
- items.push({
45
- kind: TOOLBAR_ITEM_KIND.CUSTOM,
46
- id: backSlot.id ?? 'back',
47
- render: backSlot.render,
48
- });
49
- }
50
- if (nodeTypes.length > 0) {
51
- const entries = nodeTypes
52
- .map((nt, idx) => {
53
- if (nt.divider) {
54
- return { id: nt.id ?? `divider-${idx}`, label: '', divider: true };
55
- }
56
- if (!nt.type)
57
- return null;
58
- return {
59
- id: nt.id ?? `add-${nt.type}`,
60
- label: nt.label ?? titleCase(nt.type),
61
- onClick: () => actions.addNodeOfType(nt.type, nt.patch),
62
- disabled: state.isPublished,
63
- };
64
- })
65
- .filter((e) => e !== null);
66
- items.push({
67
- kind: TOOLBAR_ITEM_KIND.DROPDOWN,
68
- id: 'add',
69
- label: labels.add,
70
- disabled: state.isPublished,
71
- entries,
72
- });
73
- }
74
- if (templates.length > 0) {
75
- const entries = templates.map((t) => ({
11
+ function appendAddDropdown(items, nodeTypes, actions, labels, isPublished) {
12
+ const addEntries = nodeTypes.map((entry, index) => {
13
+ if (entry.divider) {
14
+ return { id: entry.id ?? `divider-${index}`, label: '', divider: true };
15
+ }
16
+ const type = entry.type ?? 'prompt';
17
+ return {
18
+ id: entry.id ?? `add-${type}`,
19
+ label: entry.label ?? type,
20
+ onClick: () => actions.addNodeOfType(type, entry.patch),
21
+ };
22
+ });
23
+ if (addEntries.length === 0)
24
+ return;
25
+ items.push({
26
+ kind: TOOLBAR_ITEM_KIND.DROPDOWN,
27
+ id: 'add',
28
+ label: labels.add ?? '+ Add',
29
+ disabled: isPublished,
30
+ entries: addEntries,
31
+ });
32
+ }
33
+ function appendTemplatesDropdown(items, templates, actions, labels, isPublished) {
34
+ if (templates.length === 0)
35
+ return;
36
+ items.push({
37
+ kind: TOOLBAR_ITEM_KIND.DROPDOWN,
38
+ id: 'templates',
39
+ label: labels.templates ?? 'Templates',
40
+ disabled: isPublished,
41
+ entries: templates.map((t) => ({
76
42
  id: t.id,
77
43
  label: t.label,
78
44
  onClick: () => actions.insertTemplate(t.spec),
79
- disabled: state.isPublished,
80
- }));
81
- items.push({
82
- kind: TOOLBAR_ITEM_KIND.DROPDOWN,
83
- id: 'templates',
84
- label: labels.templates,
85
- disabled: state.isPublished,
86
- entries,
87
- });
88
- }
45
+ })),
46
+ });
47
+ }
48
+ function appendLayoutButtons(items, state, actions, labels) {
49
+ const { isPublished, hasTree } = state;
89
50
  items.push({
90
51
  kind: TOOLBAR_ITEM_KIND.BUTTON,
91
52
  id: 'reset-view',
92
- label: labels.resetView,
53
+ label: labels.resetView ?? 'Reset view',
54
+ disabled: !hasTree,
93
55
  onClick: () => actions.triggerResetView(),
94
- title: 'Reset view to fit graph',
95
- });
96
- items.push({
56
+ }, {
97
57
  kind: TOOLBAR_ITEM_KIND.BUTTON,
98
58
  id: 'auto-layout',
99
- label: labels.autoLayout,
59
+ label: labels.autoLayout ?? 'Auto layout',
60
+ disabled: !hasTree || isPublished,
100
61
  onClick: () => actions.autoLayout(),
101
- disabled: state.isPublished,
102
62
  });
63
+ }
64
+ function appendCapabilityButtons(items, capabilities, state, actions, labels) {
65
+ const { isPublished, creatingSnapshot, cloning, hasTree } = state;
103
66
  if (capabilities.canValidate) {
104
67
  items.push({
105
68
  kind: TOOLBAR_ITEM_KIND.BUTTON,
106
69
  id: 'validate',
107
- label: labels.validate,
108
- variant: 'outline-primary',
109
- onClick: () => {
110
- void actions.validate();
111
- },
112
- disabled: state.saving || state.publishing,
70
+ label: labels.validate ?? 'Validate',
71
+ disabled: !hasTree,
72
+ onClick: () => void actions.validate(),
113
73
  });
114
74
  }
115
75
  if (capabilities.canListSnapshots) {
116
76
  items.push({
117
77
  kind: TOOLBAR_ITEM_KIND.BUTTON,
118
78
  id: 'draft-history',
119
- label: labels.draftHistory,
79
+ label: labels.history ?? 'Draft history',
120
80
  onClick: () => actions.setShowDraftHistory(true),
121
- disabled: state.isPublished,
122
81
  });
123
82
  }
124
83
  if (capabilities.canListAudit) {
125
84
  items.push({
126
85
  kind: TOOLBAR_ITEM_KIND.BUTTON,
127
86
  id: 'audit',
128
- label: labels.audit,
87
+ label: labels.audit ?? 'Audit log',
129
88
  onClick: () => actions.setShowAudit(true),
130
89
  });
131
90
  }
@@ -133,70 +92,76 @@ export function buildDefaultToolbarSpec(options) {
133
92
  items.push({
134
93
  kind: TOOLBAR_ITEM_KIND.BUTTON,
135
94
  id: 'snapshot',
136
- label: state.creatingSnapshot ? labels.snapshotInFlight : labels.snapshot,
137
- onClick: () => {
138
- void actions.createSnapshot();
139
- },
140
- disabled: state.isPublished || !state.hasTree || state.creatingSnapshot,
95
+ label: creatingSnapshot ? 'Creating…' : (labels.snapshot ?? 'Snapshot'),
96
+ disabled: isPublished || creatingSnapshot || !hasTree,
97
+ onClick: () => void actions.createSnapshot(),
141
98
  });
142
99
  }
143
100
  if (capabilities.canCloneToDraft) {
144
101
  items.push({
145
102
  kind: TOOLBAR_ITEM_KIND.BUTTON,
146
103
  id: 'clone-to-draft',
147
- label: state.cloning ? labels.cloneInFlight : labels.cloneToDraft,
148
- onClick: () => {
149
- void actions.cloneToDraft();
150
- },
151
- disabled: state.cloning,
104
+ label: cloning ? 'Cloning…' : (labels.clone ?? 'Clone to draft'),
105
+ disabled: cloning,
106
+ onClick: () => void actions.cloneToDraft(),
152
107
  });
153
108
  }
109
+ }
110
+ function appendSaveAndPublish(items, capabilities, state, actions, labels, preview) {
111
+ const { isPublished, saving, publishing, canPublish, hasTree } = state;
154
112
  items.push({
155
113
  kind: TOOLBAR_ITEM_KIND.BUTTON,
156
114
  id: 'save-draft',
157
- label: state.saving ? labels.saveDraftInFlight : labels.saveDraft,
158
- variant: 'primary',
159
- onClick: () => {
160
- void actions.saveDraft();
161
- },
162
- disabled: state.isPublished || state.saving || state.publishing,
115
+ label: saving ? 'Saving…' : (labels.save ?? 'Save draft'),
116
+ disabled: isPublished || saving || !hasTree,
117
+ onClick: () => void actions.saveDraft(),
163
118
  });
164
119
  if (capabilities.canPublish) {
165
120
  items.push({
166
121
  kind: TOOLBAR_ITEM_KIND.BUTTON,
167
122
  id: 'publish',
168
- label: state.publishing ? labels.publishInFlight : labels.publish,
169
- variant: 'success',
123
+ label: publishing ? 'Publishing…' : (labels.publish ?? 'Publish'),
124
+ disabled: isPublished || publishing || !canPublish,
170
125
  onClick: () => actions.setShowPublishModal(true),
171
- disabled: state.isPublished || !state.canPublish || state.saving || state.publishing,
172
126
  });
173
127
  }
174
128
  if (preview) {
175
129
  items.push({
176
130
  kind: TOOLBAR_ITEM_KIND.BUTTON,
177
131
  id: 'preview',
178
- label: preview.label ?? 'Preview',
179
- variant: 'outline-dark',
180
- onClick: preview.onClick,
132
+ label: labels.preview ?? 'Preview',
181
133
  disabled: preview.disabled ?? false,
134
+ onClick: preview.onClick,
182
135
  });
183
136
  }
184
- if (includePublishedAutosaveStatus) {
185
- items.push({
186
- kind: TOOLBAR_ITEM_KIND.BADGE,
187
- id: 'status',
188
- label: state.isPublished ? labels.statusPublished : labels.statusDraft,
189
- variant: state.isPublished ? 'success' : 'secondary',
190
- });
191
- items.push({
192
- kind: TOOLBAR_ITEM_KIND.TEXT,
193
- id: 'autosave',
194
- content: getAutosaveStatusLabel(state.autosaveStatus),
195
- });
137
+ }
138
+ function appendStatusFooter(items, state, labels, extraItems) {
139
+ const { isPublished, autosaveStatus } = state;
140
+ items.push({
141
+ kind: TOOLBAR_ITEM_KIND.BADGE,
142
+ id: 'status',
143
+ label: isPublished
144
+ ? (labels.publishedBadge ?? 'Published')
145
+ : (labels.draftBadge ?? 'Draft'),
146
+ variant: isPublished ? 'success' : 'secondary',
147
+ }, {
148
+ kind: TOOLBAR_ITEM_KIND.TEXT,
149
+ id: 'autosave',
150
+ content: getAutosaveStatusLabel(autosaveStatus),
151
+ }, ...extraItems);
152
+ }
153
+ /** Build the default TreeSpec editor toolbar item list from state, actions, and capability flags. */
154
+ export function buildDefaultToolbarSpec(options) {
155
+ const { state, actions, capabilities = {}, nodeTypes = [], templates = [], backSlot, preview, labels = {}, extraItems = [], } = options;
156
+ const items = [];
157
+ if (backSlot) {
158
+ appendBackSlot(items, backSlot);
196
159
  }
197
- if (extraItems.length > 0)
198
- items.push(...extraItems);
160
+ appendAddDropdown(items, nodeTypes, actions, labels, state.isPublished);
161
+ appendTemplatesDropdown(items, templates, actions, labels, state.isPublished);
162
+ appendLayoutButtons(items, state, actions, labels);
163
+ appendCapabilityButtons(items, capabilities, state, actions, labels);
164
+ appendSaveAndPublish(items, capabilities, state, actions, labels, preview);
165
+ appendStatusFooter(items, state, labels, extraItems);
199
166
  return items;
200
167
  }
201
- // Re-exported for tests / hosts wiring the autosave label themselves.
202
- export { AUTOSAVE_STATUS };
@@ -1,9 +1,3 @@
1
- /**
2
- * Map a TreeSpec issue severity to the matching Bootstrap badge classes.
3
- *
4
- * This lives in the Bootstrap-flavored package because the returned class
5
- * names are Bootstrap-specific. Material / Angular shells expose their own
6
- * equivalent helper.
7
- */
1
+ /** Bootstrap severity badge class for issue rows. */
8
2
  export declare function getIssueSeverityBadgeClass(severity: string): string;
9
3
  //# sourceMappingURL=panelHelpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"panelHelpers.d.ts","sourceRoot":"","sources":["../../src/lib/panelHelpers.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAInE"}
1
+ {"version":3,"file":"panelHelpers.d.ts","sourceRoot":"","sources":["../../src/lib/panelHelpers.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWnE"}
@@ -1,22 +1,14 @@
1
- /**
2
- * Bootstrap-flavored helpers for the editor sidebar panels.
3
- *
4
- * Pure / framework-agnostic helpers (e.g. {@link buildStableEntries}) live in
5
- * `@signalsafe/tree-spec-editor-core` and are re-exported from this package's
6
- * barrel for consumer convenience.
7
- */
8
1
  import { TREE_SPEC_ISSUE_SEVERITY } from '@signalsafe/tree-spec';
9
- /**
10
- * Map a TreeSpec issue severity to the matching Bootstrap badge classes.
11
- *
12
- * This lives in the Bootstrap-flavored package because the returned class
13
- * names are Bootstrap-specific. Material / Angular shells expose their own
14
- * equivalent helper.
15
- */
2
+ /** Bootstrap severity badge class for issue rows. */
16
3
  export function getIssueSeverityBadgeClass(severity) {
17
- if (severity === TREE_SPEC_ISSUE_SEVERITY.ERROR)
18
- return 'bg-danger';
19
- if (severity === TREE_SPEC_ISSUE_SEVERITY.WARNING)
20
- return 'bg-warning text-dark';
21
- return 'bg-info';
4
+ switch (severity) {
5
+ case TREE_SPEC_ISSUE_SEVERITY.ERROR:
6
+ return 'text-bg-danger';
7
+ case TREE_SPEC_ISSUE_SEVERITY.WARNING:
8
+ return 'text-bg-warning text-dark';
9
+ case TREE_SPEC_ISSUE_SEVERITY.INFO:
10
+ return 'text-bg-info text-dark';
11
+ default:
12
+ return 'text-bg-secondary';
13
+ }
22
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"IssuesPanel.d.ts","sourceRoot":"","sources":["../../src/panels/IssuesPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAKxF,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uGAAuG;IACvG,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;CAC3C;AA4BD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,MAAM,EACN,eAAe,EACf,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,IAAI,EACJ,KAAgB,EAChB,iBAAyC,EACzC,eAAwC,EACxC,6BAAoC,GACvC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,2CA0G5B"}
1
+ {"version":3,"file":"IssuesPanel.d.ts","sourceRoot":"","sources":["../../src/panels/IssuesPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAKxF,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,aAAa,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IAC9C;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uGAAuG;IACvG,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;IAC1C;;;;OAIG;IACH,6BAA6B,CAAC,EAAE,OAAO,CAAC;CAC3C;AA4BD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAChC,MAAM,EACN,eAAe,EACf,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,IAAI,EACJ,KAAgB,EAChB,iBAAyC,EACzC,eAAwC,EACxC,6BAAoC,GACvC,EAAE,QAAQ,CAAC,gBAAgB,CAAC,2CAmG5B"}
@@ -36,11 +36,6 @@ export default function IssuesPanel({ issues, lastValidatedAt, onSelectIssue, is
36
36
  return (_jsxs("div", { className: "card", children: [_jsxs("div", { className: "card-header bg-body-secondary py-2 px-2 d-flex justify-content-between align-items-center gap-2", children: [_jsxs("div", { className: "d-flex align-items-center min-w-0", children: [_jsx("span", { className: "fw-semibold", children: title }), _jsx(PanelHeaderCollapseCarets, { expanded: expanded, onToggle: () => setExpanded((v) => !v) })] }), showValidationSummaryInHeader ? (_jsx("span", { className: "text-muted font-size-12 text-end flex-shrink-0", children: lastValidatedAt ? `Validated ${formatTimestamp(lastValidatedAt)}` : 'Not validated' })) : null] }), _jsx("div", { className: `card-body p-0${expanded ? '' : ' d-none'}`, "aria-hidden": !expanded, children: issues.length === 0 ? (_jsx("div", { className: "list-group list-group-flush", children: _jsx("div", { className: "list-group-item text-muted small py-2 px-3 border-0", children: _jsx("em", { children: "No issues" }) }) })) : (_jsxs(_Fragment, { children: [_jsx(Form.Control, { className: "rounded-0 border-0 border-bottom shadow-none", placeholder: searchPlaceholder, value: issueSearch, onChange: (e) => onIssueSearchChange(e.target.value) }), _jsx("div", { className: "overflow-auto-max-h-320", children: issueEntries.length === 0 ? (_jsx("div", { className: "list-group list-group-flush", children: _jsx("div", { className: "list-group-item text-muted small py-2 px-3 border-0", children: _jsx("em", { children: "No matching issues." }) }) })) : (_jsx("div", { className: "list-group list-group-flush", children: issueEntries.map(({ item: issue, key }) => {
37
37
  const typeLabel = nodeTypeLabel(tree, issue.node_id);
38
38
  const headerTitle = issueHeaderTitle(issue, typeLabel);
39
- return (_jsxs("div", { role: "button", tabIndex: 0, className: "list-group-item list-group-item-action px-3 py-2 text-start", onClick: () => onSelectIssue(issue), onKeyDown: (e) => {
40
- if (e.key === 'Enter' || e.key === ' ') {
41
- e.preventDefault();
42
- onSelectIssue(issue);
43
- }
44
- }, children: [_jsxs("div", { className: "d-flex w-100 justify-content-between align-items-center gap-2 mb-1", children: [_jsxs("div", { className: "min-w-0 flex-grow-1 text-truncate text-start", title: headerTitle, children: [_jsx("span", { className: "fs-6 fw-semibold text-uppercase", children: issue.node_id ?? '—' }), _jsx("span", { className: "fs-6 text-uppercase text-body-secondary", children: `, ${typeLabel}` })] }), _jsx("span", { className: `badge flex-shrink-0 text-uppercase ${getIssueSeverityBadgeClass(issue.severity)}`, children: issue.severity })] }), _jsx("p", { className: "mb-1 small text-truncate font-monospace", style: { minWidth: 0 }, children: issue.message }), issue.choice_id ? (_jsx("small", { className: "text-body-secondary", children: issue.choice_id })) : null] }, key));
39
+ return (_jsxs("button", { type: "button", className: "list-group-item list-group-item-action px-3 py-2 text-start w-100", onClick: () => onSelectIssue(issue), children: [_jsxs("div", { className: "d-flex w-100 justify-content-between align-items-center gap-2 mb-1", children: [_jsxs("div", { className: "min-w-0 flex-grow-1 text-truncate text-start", title: headerTitle, children: [_jsx("span", { className: "fs-6 fw-semibold text-uppercase", children: issue.node_id ?? '—' }), _jsx("span", { className: "fs-6 text-uppercase text-body-secondary", children: `, ${typeLabel}` })] }), _jsx("span", { className: `badge flex-shrink-0 text-uppercase ${getIssueSeverityBadgeClass(issue.severity)}`, children: issue.severity })] }), _jsx("p", { className: "mb-1 small text-truncate font-monospace", style: { minWidth: 0 }, children: issue.message }), issue.choice_id ? (_jsx("small", { className: "text-body-secondary", children: issue.choice_id })) : null] }, key));
45
40
  }) })) })] })) })] }));
46
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"NodesPanel.d.ts","sourceRoot":"","sources":["../../src/panels/NodesPanel.tsx"],"names":[],"mappings":"AAIA,OAAO,EAIH,KAAK,UAAU,EACf,KAAK,cAAc,EACtB,MAAM,mCAAmC,CAAC;AAI3C,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,cAAc,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,mFAAmF;IACnF,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AA0BD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAC/B,IAAI,EACJ,UAAU,EACV,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,iBAAwC,EACxC,OAA0B,EAC1B,SAAS,EACT,YAAY,EACZ,WAAmB,GACtB,EAAE,QAAQ,CAAC,eAAe,CAAC,2CAyI3B"}
1
+ {"version":3,"file":"NodesPanel.d.ts","sourceRoot":"","sources":["../../src/panels/NodesPanel.tsx"],"names":[],"mappings":"AAIA,OAAO,EAIH,KAAK,UAAU,EACf,KAAK,cAAc,EACtB,MAAM,mCAAmC,CAAC;AAI3C,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,UAAU,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,cAAc,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,mBAAmB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChD,sDAAsD;IACtD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,mFAAmF;IACnF,WAAW,CAAC,EAAE,OAAO,CAAC;CACzB;AA0BD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,EAC/B,IAAI,EACJ,UAAU,EACV,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,EACnB,iBAAwC,EACxC,OAA0B,EAC1B,SAAS,EACT,YAAY,EACZ,WAAmB,GACtB,EAAE,QAAQ,CAAC,eAAe,CAAC,2CAqI3B"}
@@ -43,14 +43,6 @@ export default function NodesPanel({ tree, nodeSearch, selection, showMiniMap, o
43
43
  const typeLabel = n.type || 'unknown';
44
44
  const mutedTop = isSelected ? '' : ' text-body-secondary';
45
45
  const mutedMeta = isSelected ? 'opacity-75' : 'text-body-secondary';
46
- return (_jsxs("div", { role: "button", tabIndex: 0, className: `list-group-item list-group-item-action text-start px-3 py-2${isSelected ? ' active' : ''}`, "aria-current": isSelected ? 'true' : undefined, onClick: () => onNodeSelect(n.id), onKeyDown: (e) => {
47
- if (e.key === 'Enter' || e.key === ' ') {
48
- e.preventDefault();
49
- onNodeSelect(n.id);
50
- }
51
- }, children: [_jsxs("div", { className: "d-flex w-100 justify-content-between align-items-center gap-2 mb-1", children: [_jsxs("div", { className: "min-w-0 flex-grow-1 text-truncate text-start", title: `${n.id}, ${typeLabel}`, children: [_jsx("span", { className: `fs-6 fw-semibold text-uppercase${mutedTop}`, children: n.id }), _jsx("span", { className: `fs-6 text-uppercase ${isSelected ? 'opacity-75' : 'text-body-secondary'}`, children: `, ${typeLabel}` })] }), onDeleteNode ? (_jsx("button", { type: "button", className: "btn p-0 border-0 bg-transparent flex-shrink-0", "aria-label": `Delete node ${n.id}`, title: "Delete node", disabled: isPublished, onClick: (e) => {
52
- e.stopPropagation();
53
- onDeleteNode(n.id);
54
- }, children: _jsx("i", { className: `bi bi-trash action-icon cursor-pointer${isPublished ? ' text-secondary opacity-50' : ' text-danger'}`, "aria-hidden": true }) })) : null] }), _jsx("p", { className: "mb-1 small text-truncate", style: { minWidth: 0 }, children: n.prompt || '(empty)' }), _jsx("small", { className: mutedMeta, children: choiceLine(n) })] }, n.id));
46
+ return (_jsx("div", { className: `list-group-item px-3 py-2${isSelected ? ' active' : ''}`, "aria-current": isSelected ? 'true' : undefined, children: _jsxs("div", { className: "d-flex w-100 justify-content-between align-items-start gap-2", children: [_jsxs("button", { type: "button", className: "btn p-0 border-0 bg-transparent flex-grow-1 text-start", onClick: () => onNodeSelect(n.id), children: [_jsx("div", { className: "d-flex w-100 justify-content-between align-items-center gap-2 mb-1", children: _jsxs("div", { className: "min-w-0 flex-grow-1 text-truncate text-start", title: `${n.id}, ${typeLabel}`, children: [_jsx("span", { className: `fs-6 fw-semibold text-uppercase${mutedTop}`, children: n.id }), _jsx("span", { className: `fs-6 text-uppercase ${isSelected ? 'opacity-75' : 'text-body-secondary'}`, children: `, ${typeLabel}` })] }) }), _jsx("p", { className: "mb-1 small text-truncate", style: { minWidth: 0 }, children: n.prompt || '(empty)' }), _jsx("small", { className: mutedMeta, children: choiceLine(n) })] }), onDeleteNode ? (_jsx("button", { type: "button", className: "btn p-0 border-0 bg-transparent flex-shrink-0", "aria-label": `Delete node ${n.id}`, title: "Delete node", disabled: isPublished, onClick: () => onDeleteNode(n.id), children: _jsx("i", { className: `bi bi-trash action-icon cursor-pointer${isPublished ? ' text-secondary opacity-50' : ' text-danger'}`, "aria-hidden": true }) })) : null] }) }, n.id));
55
47
  }) })) }), _jsx("div", { className: "card-footer p-2 border-top", children: _jsxs("div", { className: "d-flex justify-content-between align-items-center", children: [_jsx("div", { className: "text-muted font-size-12", children: tipText }), _jsx(Form.Check, { type: "switch", id: "showMiniMapToggle", label: "Mini-map", checked: showMiniMap, onChange: (e) => onShowMiniMapChange(e.target.checked), className: "font-size-12" })] }) })] })] }));
56
48
  }
@@ -11,8 +11,6 @@
11
11
  * the package stays free of `react-router` (or any other) routing concerns.
12
12
  */
13
13
  import { type ReactNode } from 'react';
14
- /** Bootstrap variant string (e.g. "outline-secondary", "primary", "success"). */
15
- export type ToolbarVariant = string;
16
14
  /**
17
15
  * Discriminator values used by the `kind` field on every {@link ToolbarItem}.
18
16
  * Use these constants instead of bare string literals (e.g.
@@ -34,7 +32,7 @@ export interface ToolbarButtonItem {
34
32
  label: ReactNode;
35
33
  onClick: () => void;
36
34
  /** Bootstrap variant. Default: `"outline-secondary"`. */
37
- variant?: ToolbarVariant;
35
+ variant?: string;
38
36
  disabled?: boolean;
39
37
  title?: string;
40
38
  className?: string;
@@ -55,7 +53,7 @@ export interface ToolbarDropdownItem {
55
53
  label: ReactNode;
56
54
  entries: ToolbarDropdownEntry[];
57
55
  /** Bootstrap variant for the toggle. Default: `"outline-secondary"`. */
58
- variant?: ToolbarVariant;
56
+ variant?: string;
59
57
  disabled?: boolean;
60
58
  className?: string;
61
59
  }
@@ -64,7 +62,7 @@ export interface ToolbarBadgeItem {
64
62
  id?: string;
65
63
  label: ReactNode;
66
64
  /** Bootstrap badge variant (e.g. `"success"`, `"secondary"`). Default: `"secondary"`. */
67
- variant?: ToolbarVariant;
65
+ variant?: string;
68
66
  className?: string;
69
67
  }
70
68
  export interface ToolbarTextItem {
@@ -1 +1 @@
1
- {"version":3,"file":"ToolbarPanel.d.ts","sourceRoot":"","sources":["../../src/panels/ToolbarPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD,iFAAiF;AACjF,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;CAMpB,CAAC;AAEX,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAEzF,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC;IACtC,+EAA+E;IAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,yDAAyD;IACzD,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACjC,+EAA+E;IAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,wEAAwE;IACxE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,yFAAyF;IACzF,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,OAAO,iBAAiB,CAAC,IAAI,CAAC;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,SAAS,CAAC;IACnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,MAAM,EAAE,MAAM,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,iBAAiB,CAAC;AAExB,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAyED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACjC,KAAK,EACL,SAAiC,GACpC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,2CAQ7B"}
1
+ {"version":3,"file":"ToolbarPanel.d.ts","sourceRoot":"","sources":["../../src/panels/ToolbarPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAGjD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;;;;;;CAMpB,CAAC;AAEX,0EAA0E;AAC1E,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAEzF,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC;IACtC,+EAA+E;IAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACjC,+EAA+E;IAC/E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,OAAO,iBAAiB,CAAC,QAAQ,CAAC;IACxC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,OAAO,iBAAiB,CAAC,KAAK,CAAC;IACrC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,CAAC;IACjB,yFAAyF;IACzF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,OAAO,iBAAiB,CAAC,IAAI,CAAC;IACpC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,SAAS,CAAC;IACnB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,OAAO,iBAAiB,CAAC,MAAM,CAAC;IACtC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oFAAoF;IACpF,MAAM,EAAE,MAAM,SAAS,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GACjB,iBAAiB,GACjB,mBAAmB,GACnB,gBAAgB,GAChB,eAAe,GACf,iBAAiB,CAAC;AAExB,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,oGAAoG;IACpG,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAyED,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACjC,KAAK,EACL,SAAiC,GACpC,EAAE,QAAQ,CAAC,iBAAiB,CAAC,2CAQ7B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signalsafe/tree-spec-editor",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Reusable TreeSpec graph editor (React Flow) and authoring helpers (no API or routing)",
@@ -46,9 +46,9 @@
46
46
  "test": "cd ../../frontend && yarn vitest run --config vitest.tree-spec-editor.config.ts"
47
47
  },
48
48
  "dependencies": {
49
- "@signalsafe/tree-spec": "^0.1.3",
50
- "@signalsafe/tree-spec-editor-core": "^0.1.0",
51
- "@signalsafe/tree-spec-editor-react": "^0.1.0"
49
+ "@signalsafe/tree-spec": "^0.1.4",
50
+ "@signalsafe/tree-spec-editor-core": "^0.1.1",
51
+ "@signalsafe/tree-spec-editor-react": "^0.1.1"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "react": "^18.0.0",