@braidlabs/console 0.3.0 → 0.5.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.
Files changed (61) hide show
  1. package/README.md +34 -10
  2. package/package.json +10 -4
  3. package/src/app/auth.d.ts +46 -0
  4. package/src/app/auth.js +80 -0
  5. package/src/app/auth.js.map +1 -0
  6. package/src/app/console-app.d.ts +8 -6
  7. package/src/app/console-app.js +96 -20
  8. package/src/app/console-app.js.map +1 -1
  9. package/src/app/main.js +25 -2
  10. package/src/app/main.js.map +1 -1
  11. package/src/app/routes.d.ts +14 -0
  12. package/src/app/routes.js +23 -0
  13. package/src/app/routes.js.map +1 -0
  14. package/src/index.d.ts +15 -2
  15. package/src/index.js +10 -2
  16. package/src/index.js.map +1 -1
  17. package/src/lib/client.d.ts +61 -2
  18. package/src/lib/client.js +60 -2
  19. package/src/lib/client.js.map +1 -1
  20. package/src/lib/draft.d.ts +1 -1
  21. package/src/lib/draft.js +2 -2
  22. package/src/lib/draft.js.map +1 -1
  23. package/src/lib/empty-state.d.ts +15 -0
  24. package/src/lib/empty-state.js +38 -0
  25. package/src/lib/empty-state.js.map +1 -0
  26. package/src/lib/history-panel.d.ts +19 -0
  27. package/src/lib/history-panel.js +109 -0
  28. package/src/lib/history-panel.js.map +1 -0
  29. package/src/lib/ownership.d.ts +15 -0
  30. package/src/lib/ownership.js +21 -0
  31. package/src/lib/ownership.js.map +1 -0
  32. package/src/lib/query.d.ts +47 -0
  33. package/src/lib/query.js +121 -0
  34. package/src/lib/query.js.map +1 -0
  35. package/src/lib/registry-console.d.ts +13 -2
  36. package/src/lib/registry-console.js +15 -11
  37. package/src/lib/registry-console.js.map +1 -1
  38. package/src/lib/registry-editor.d.ts +3 -1
  39. package/src/lib/registry-editor.js +50 -17
  40. package/src/lib/registry-editor.js.map +1 -1
  41. package/src/lib/shell-codegen.d.ts +28 -0
  42. package/src/lib/shell-codegen.js +316 -0
  43. package/src/lib/shell-codegen.js.map +1 -0
  44. package/src/lib/shells-panel.d.ts +43 -0
  45. package/src/lib/shells-panel.js +307 -0
  46. package/src/lib/shells-panel.js.map +1 -0
  47. package/src/lib/styles.d.ts +1 -1
  48. package/src/lib/styles.js +72 -4
  49. package/src/lib/styles.js.map +1 -1
  50. package/src/lib/tag-chip.d.ts +8 -0
  51. package/src/lib/tag-chip.js +12 -0
  52. package/src/lib/tag-chip.js.map +1 -0
  53. package/src/lib/tags.d.ts +10 -0
  54. package/src/lib/tags.js +53 -0
  55. package/src/lib/tags.js.map +1 -0
  56. package/src/lib/topology-graph.d.ts +5 -2
  57. package/src/lib/topology-graph.js +17 -8
  58. package/src/lib/topology-graph.js.map +1 -1
  59. package/src/lib/topology.d.ts +18 -3
  60. package/src/lib/topology.js +42 -3
  61. package/src/lib/topology.js.map +1 -1
@@ -0,0 +1,307 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { parseAreas, formatAreas, validateShells, SHELL_FRAMEWORKS, } from '@braidlabs/registry';
4
+ import { fetchHead, fetchPermissions, publishSnapshot, RegistryApiError, } from './client.js';
5
+ import { EmptyState, emptyKindOf } from './empty-state.js';
6
+ import { filterBy, shellItem } from './query.js';
7
+ import { SHELL_TARGETS, shellCode } from './shell-codegen.js';
8
+ import { ensureStyles } from './styles.js';
9
+ import { TagChip } from './tag-chip.js';
10
+ import { tagColor } from './tags.js';
11
+ import { tagQuery } from './registry-console.js';
12
+ import { canChange, startingTags } from './ownership.js';
13
+ /**
14
+ * Shells: list, design, and publish them.
15
+ *
16
+ * Same contract as the fragment editor: **branch from what is pinned → edit → publish a new
17
+ * snapshot**. A draft lives in the browser until then. Publishing sends the pinned fragments back
18
+ * unchanged with the edited shells, and `baseId`, so a publish that would overwrite someone else's
19
+ * is refused rather than silently winning.
20
+ *
21
+ * The head a shell declares — meta tags, scripts, stylesheets — is edited as data and never
22
+ * injected into this page. Rendering it here would run third-party code in the admin origin with
23
+ * an operator's token in reach; the preview draws the grid and nothing else.
24
+ */
25
+ export function ShellsPanel({ api, theme, className, selected, onSelect, onPublished, onDirtyChange, refreshKey }) {
26
+ const [workspace, setWorkspace] = useState(null);
27
+ const [phase, setPhase] = useState({ status: 'loading' });
28
+ const [ownOpen, setOwnOpen] = useState(null);
29
+ const [query, setQuery] = useState('');
30
+ const [reloadToken, setReloadToken] = useState(0);
31
+ const apiKey = `${api?.baseUrl ?? ''}|${api?.apiPath ?? ''}`;
32
+ useEffect(() => {
33
+ ensureStyles();
34
+ }, []);
35
+ useEffect(() => {
36
+ const controller = new AbortController();
37
+ let current = true;
38
+ setPhase({ status: 'loading' });
39
+ Promise.all([fetchHead(api, controller.signal), fetchPermissions(api, controller.signal)]).then(([head, permissions]) => {
40
+ if (!current)
41
+ return;
42
+ const shells = head.snapshot?.shells ?? [];
43
+ setWorkspace({ manifests: head.snapshot?.manifests ?? [], base: shells, shells, baseId: head.id, permissions });
44
+ setPhase({ status: 'ready' });
45
+ }, (error) => {
46
+ if (!current || controller.signal.aborted)
47
+ return;
48
+ const kind = emptyKindOf(error);
49
+ setPhase(kind ? { status: 'empty', kind } : { status: 'failed', error: asError(error) });
50
+ });
51
+ return () => {
52
+ current = false;
53
+ controller.abort();
54
+ };
55
+ // apiKey stands in for the api object, which is usually a fresh literal each render
56
+ }, [apiKey, reloadToken]);
57
+ const reload = useCallback(() => setReloadToken((token) => token + 1), []);
58
+ // Controlled by id when the host passes one; an id that is mid-edit (and so matches nothing)
59
+ // keeps the current shell open rather than closing it under the person typing.
60
+ // The shell already open wins when it carries the selected id, so renaming it onto another
61
+ // shell's id (a duplicate, flagged as an error) does not jump the designer to that other shell.
62
+ const open = useMemo(() => {
63
+ if (selected === undefined || !workspace)
64
+ return ownOpen;
65
+ if (selected === null)
66
+ return null;
67
+ if (ownOpen !== null && workspace.shells[ownOpen]?.id === selected)
68
+ return ownOpen;
69
+ const index = workspace.shells.findIndex((shell) => shell.id === selected);
70
+ return index >= 0 ? index : ownOpen;
71
+ }, [selected, workspace, ownOpen]);
72
+ const choose = (index) => {
73
+ setOwnOpen(index);
74
+ onSelect?.(index === null ? null : (workspace?.shells[index]?.id ?? null));
75
+ };
76
+ // Shells only: the fragments are the pinned ones and cannot change here, and re-checking them
77
+ // (pierce overlaps are quadratic) on every keystroke costs ~100 ms at a few hundred fragments.
78
+ const manifests = workspace?.manifests;
79
+ const shells = workspace?.shells;
80
+ const findings = useMemo(() => (shells && manifests ? validateShells(shells, manifests) : []), [shells, manifests]);
81
+ const base = workspace?.base;
82
+ const dirty = useMemo(() => Boolean(shells && base) && JSON.stringify(shells) !== JSON.stringify(base), [shells, base]);
83
+ useEffect(() => {
84
+ onDirtyChange?.(dirty);
85
+ // onDirtyChange is a notification; depending on it would re-notify on every host render.
86
+ }, [dirty]);
87
+ const dirtyRef = useRef(dirty);
88
+ dirtyRef.current = dirty;
89
+ const firstRefresh = useRef(true);
90
+ useEffect(() => {
91
+ if (firstRefresh.current) {
92
+ firstRefresh.current = false;
93
+ return;
94
+ }
95
+ if (!dirtyRef.current)
96
+ setReloadToken((token) => token + 1);
97
+ }, [refreshKey]);
98
+ if (phase.status === 'loading' || (!workspace && phase.status !== 'empty' && phase.status !== 'failed')) {
99
+ return (_jsx("div", { className: rootClass(className), ...themeAttr(theme), children: _jsx("p", { className: "braid-console__empty", children: "Loading shells\u2026" }) }));
100
+ }
101
+ if (phase.status === 'empty' || phase.status === 'failed' || !workspace) {
102
+ return (_jsx("div", { className: rootClass(className), ...themeAttr(theme), children: phase.status === 'empty' ? (_jsx(EmptyState, { kind: phase.kind, onRetry: reload })) : (_jsxs("div", { className: "braid-console__error", role: "alert", children: [_jsx("h3", { children: "Could not load shells" }), _jsx("p", { children: phase.status === 'failed' ? phase.error.message : '' }), _jsx("button", { className: "braid-console__retry", type: "button", onClick: reload, children: "Try again" })] })) }));
103
+ }
104
+ const { permissions } = workspace;
105
+ const canEdit = permissions.publish;
106
+ /** Per-tag ownership: publishing rights, narrowed to the shells whose tags the caller owns. */
107
+ const owned = permissions.tags ?? null;
108
+ const errors = findings.filter((finding) => finding.severity === 'error');
109
+ const update = (shells) => {
110
+ setWorkspace({ ...workspace, shells });
111
+ if (phase.status === 'published' || phase.status === 'refused')
112
+ setPhase({ status: 'ready' });
113
+ };
114
+ const create = () => {
115
+ const shells = [...workspace.shells, newShell(workspace.shells, startingTags(owned))];
116
+ update(shells);
117
+ setOwnOpen(shells.length - 1);
118
+ onSelect?.(shells[shells.length - 1]?.id ?? null);
119
+ };
120
+ const remove = (index) => {
121
+ update(workspace.shells.filter((_, position) => position !== index));
122
+ choose(null);
123
+ };
124
+ const publish = async (pin) => {
125
+ setPhase({ status: 'publishing' });
126
+ // What was sent, not what is in state when the answer arrives: edits typed while the request
127
+ // was in flight are newer than the publish and must survive it.
128
+ const sent = workspace.shells;
129
+ try {
130
+ const outcome = await publishSnapshot(api ?? {}, {
131
+ manifests: workspace.manifests,
132
+ shells: sent,
133
+ baseId: workspace.baseId,
134
+ pin,
135
+ });
136
+ // Only a pinned publish moves the base. A candidate leaves HEAD where it was, so the draft
137
+ // still differs from what is live, and Discard still means "back to HEAD".
138
+ if (outcome.pinned)
139
+ setWorkspace((current) => (current ? { ...current, base: sent, baseId: outcome.snapshot.id } : current));
140
+ setPhase({ status: 'published', outcome });
141
+ onPublished?.(outcome);
142
+ }
143
+ catch (error) {
144
+ const apiError = error instanceof RegistryApiError ? error : null;
145
+ setPhase({ status: 'refused', error: asError(error), findings: apiError?.findings ?? [], conflict: apiError?.status === 409 });
146
+ }
147
+ };
148
+ const shell = open !== null ? workspace.shells[open] : undefined;
149
+ return (_jsxs("div", { className: rootClass(className), ...themeAttr(theme), children: [shell && open !== null ? (_jsx(ShellDesigner, { shell: shell, manifests: workspace.manifests, findings: findings.filter((finding) => finding.shellIds?.includes(shell.id)), readOnly: !(canEdit && canChange(workspace.base.find((base) => base.id === shell.id)?.tags ?? shell.tags, owned)), onChange: (next) => {
150
+ update(workspace.shells.map((current, position) => (position === open ? next : current)));
151
+ if (next.id !== shell.id) {
152
+ // Track the open shell by position from here on, so the id can change under it.
153
+ setOwnOpen(open);
154
+ // An emptied id is mid-edit, not a deselection: keep the URL on the last real id.
155
+ if (next.id !== '')
156
+ onSelect?.(next.id);
157
+ }
158
+ }, onBack: () => choose(null), onDelete: () => remove(open) }, open)) : (_jsx(ShellList, { shells: workspace.shells, query: query, onQuery: setQuery, canEdit: canEdit, owned: owned, base: workspace.base, onOpen: choose, onCreate: create, onDelete: remove })), canEdit && (dirty || phase.status !== 'ready') && (_jsx(PublishBar, { phase: phase, dirty: dirty, errors: errors.length, canPin: permissions.pin, actor: permissions.actor, onPublish: publish, onDiscard: () => {
159
+ update(workspace.base);
160
+ setPhase({ status: 'ready' });
161
+ }, onReload: reload }))] }));
162
+ }
163
+ // ---------------------------------------------------------------------------
164
+ // List
165
+ // ---------------------------------------------------------------------------
166
+ function ShellList({ shells, query, onQuery, canEdit, owned, base, onOpen, onCreate, onDelete, }) {
167
+ const indexed = shells.map((shell, index) => ({ shell, index }));
168
+ const visible = filterBy(indexed, query, ({ shell }) => shellItem(shell));
169
+ return (_jsxs("div", { className: "braid-console__shell", children: [_jsxs("div", { className: "braid-console__header", children: [_jsx("h2", { className: "braid-console__title", children: "Shells" }), _jsx("span", { className: "braid-console__count", children: shells.length }), _jsx("span", { className: "braid-console__spacer" }), _jsx("input", { className: "braid-console__search", type: "search", value: query, placeholder: "Filter \u2014 text, or tag:core framework:react", "aria-label": "Filter shells", onChange: (event) => onQuery(event.target.value) }), canEdit && (_jsx("button", { className: "braid-console__retry", type: "button", onClick: onCreate, children: "New shell" }))] }), shells.length === 0 ? (_jsx(EmptyState, { kind: "empty", ...(canEdit ? { onCreate } : {}) })) : visible.length === 0 ? (_jsxs("p", { className: "braid-console__empty", children: ["Nothing matches \u201C", query, "\u201D."] })) : (_jsxs("table", { className: "braid-console__table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { scope: "col", children: "Shell" }), _jsx("th", { scope: "col", children: "Framework" }), _jsx("th", { scope: "col", children: "Routes" }), _jsx("th", { scope: "col", children: _jsx("span", { className: "braid-console__sronly", children: "Actions" }) })] }) }), _jsx("tbody", { children: visible.map(({ shell, index }) => (_jsxs("tr", { children: [_jsxs("td", { children: [_jsx("div", { className: "braid-console__id", children: shell.id || '(no id)' }), shell.title && _jsx("div", { className: "braid-console__desc", children: shell.title }), shell.tags?.map((tag) => _jsx(TagChip, { tag: tag, onSelect: (t) => onQuery(tagQuery(t)) }, tag))] }), _jsx("td", { className: "braid-console__mono", children: frameworkLabel(shell.framework) }), _jsx("td", { children: _jsx("div", { className: "braid-console__patterns", children: shell.routes.map((route) => (_jsx("span", { className: "braid-console__mono", children: route.path }, route.path))) }) }), _jsxs("td", { className: "braid-console__actions", children: [_jsx("button", { type: "button", className: "braid-console__ghost", onClick: () => onOpen(index), children: canEdit && canChange((base.find((b) => b.id === shell.id) ?? shell).tags, owned) ? 'Edit' : 'View' }), canEdit && canChange((base.find((b) => b.id === shell.id) ?? shell).tags, owned) && (_jsx("button", { type: "button", className: "braid-console__ghost", onClick: () => onDelete(index), "aria-label": `Delete ${shell.id}`, children: "Delete" }))] })] }, `${index}:${shell.id}`))) })] }))] }));
170
+ }
171
+ function ShellDesigner({ shell, manifests, findings, readOnly, onChange, onBack, onDelete, }) {
172
+ const [tab, setTab] = useState('layout');
173
+ const [requestedRoute, setRouteIndex] = useState(0);
174
+ // Clamped once and used everywhere: Discard or a reload can remove the route that was selected.
175
+ const routeIndex = Math.max(0, Math.min(requestedRoute, shell.routes.length - 1));
176
+ const route = shell.routes[routeIndex];
177
+ const set = (patch) => onChange({ ...shell, ...patch });
178
+ const setRoute = (patch) => set({ routes: shell.routes.map((current, index) => (index === routeIndex ? { ...current, ...patch } : current)) });
179
+ return (_jsxs("div", { className: "braid-console__shell braid-console__designer", children: [_jsxs("div", { className: "braid-console__header", children: [_jsx("button", { type: "button", className: "braid-console__ghost", onClick: onBack, children: "\u2190 Shells" }), _jsx("h2", { className: "braid-console__title braid-console__mono", children: shell.id || '(no id)' }), _jsx("span", { className: "braid-console__spacer" }), !readOnly && (_jsx("button", { type: "button", className: "braid-console__ghost", onClick: onDelete, children: "Delete shell" }))] }), _jsxs("fieldset", { className: "braid-console__fields braid-console__shellmeta", disabled: readOnly, children: [_jsx("legend", { className: "braid-console__sronly", children: "Shell" }), _jsx(TextField, { label: "Id", value: shell.id, mono: true, onChange: (id) => set({ id }) }), _jsx(TextField, { label: "Title", value: shell.title ?? '', onChange: (title) => set(optional('title', title)) }), _jsxs("label", { className: "braid-console__field", children: [_jsx("span", { className: "braid-console__fieldlabel", children: "Framework" }), _jsx("select", { value: shell.framework, onChange: (event) => set({ framework: event.target.value }), children: SHELL_FRAMEWORKS.map((framework) => (_jsx("option", { value: framework, children: frameworkLabel(framework) }, framework))) })] }), _jsx(TextField, { label: "Tags", hint: "comma-separated", value: (shell.tags ?? []).join(', '), onChange: (text) => set(optionalList('tags', text)) }), shell.tags && shell.tags.length > 0 && (_jsx("div", { className: "braid-console__tagrow", "aria-label": "Tags", children: shell.tags.map((tag) => (_jsx(TagChip, { tag: tag }, tag))) }))] }), _jsx("p", { className: "braid-console__notice braid-console__notice--quiet", children: "The framework chooses the code this shell generates. The gateway still serves the shell app you deploy; serving shells straight from this definition is planned." }), findings.length > 0 && (_jsx("ul", { className: "braid-console__findings", "aria-label": "Problems with this shell", children: findings.map((finding, index) => (_jsxs("li", { className: `braid-console__finding braid-console__finding--${finding.severity}`, children: [_jsx("span", { className: "braid-console__mono", children: finding.code }), " ", finding.message, finding.hint && _jsxs("span", { className: "braid-console__desc", children: [" ", finding.hint] })] }, index))) })), _jsx("div", { className: "braid-console__tabs", role: "tablist", "aria-label": "Shell sections", children: ['layout', 'head', 'code'].map((id) => (_jsx("button", { type: "button", role: "tab", className: "braid-console__tab", "aria-selected": tab === id, onClick: () => setTab(id), children: id === 'layout' ? 'Routes & layout' : id === 'head' ? 'Head & assets' : 'Code' }, id))) }), tab === 'layout' && (_jsxs("div", { className: "braid-console__designerbody", children: [_jsxs("div", { className: "braid-console__routes", role: "group", "aria-label": "Routes", children: [shell.routes.map((current, index) => (_jsx("button", { type: "button", className: "braid-console__routebutton braid-console__mono", "aria-pressed": index === routeIndex, onClick: () => setRouteIndex(index), children: current.path || '(no path)' }, index))), !readOnly && (_jsx("button", { type: "button", className: "braid-console__ghost", onClick: () => {
180
+ set({ routes: [...shell.routes, { path: '/new', layout: { areas: 'main' }, slots: {} }] });
181
+ setRouteIndex(shell.routes.length);
182
+ }, children: "+ Route" }))] }), route ? (_jsx(RouteEditor, { route: route, manifests: manifests, readOnly: readOnly, onChange: setRoute, ...(shell.routes.length > 1 && !readOnly
183
+ ? {
184
+ onRemove: () => {
185
+ set({ routes: shell.routes.filter((_, index) => index !== routeIndex) });
186
+ setRouteIndex(0);
187
+ },
188
+ }
189
+ : {}) })) : (_jsx("p", { className: "braid-console__empty", children: "This shell has no routes. Add one to give it a layout." }))] })), tab === 'head' && _jsx(HeadEditor, { shell: shell, readOnly: readOnly, onChange: (head) => set({ head }) }), tab === 'code' && _jsx(CodeView, { shell: shell, manifests: manifests })] }));
190
+ }
191
+ function RouteEditor({ route, manifests, readOnly, onChange, onRemove, }) {
192
+ const parsed = useMemo(() => parseAreas(route.layout.areas), [route.layout.areas]);
193
+ const [area, setArea] = useState(null);
194
+ const current = area && parsed.areas.some((a) => a.name === area) ? area : (parsed.areas[0]?.name ?? null);
195
+ const slots = route.slots ?? {};
196
+ const byId = useMemo(() => new Map(manifests.map((manifest) => [manifest.id, manifest])), [manifests]);
197
+ const setLayout = (patch) => onChange({ layout: { ...route.layout, ...patch } });
198
+ const layoutId = `braid-layout-${route.path}`;
199
+ return (_jsxs("div", { className: "braid-console__routeeditor", children: [_jsxs("fieldset", { className: "braid-console__fields", disabled: readOnly, children: [_jsx("legend", { className: "braid-console__sronly", children: "Route" }), _jsx(TextField, { label: "Path", hint: "URLPattern, e.g. /orders/*", value: route.path, mono: true, onChange: (path) => onChange({ path }) }), _jsxs("div", { className: "braid-console__layoutrow", children: [_jsxs("label", { className: "braid-console__field braid-console__field--grow", children: [_jsx("span", { className: "braid-console__fieldlabel", children: "Layout" }), _jsxs("span", { className: "braid-console__desc", id: `${layoutId}-hint`, children: ["Type it like ASCII art: each word names an area, repeat it to span cells, ", _jsx("code", { children: "." }), " leaves a cell empty."] }), _jsx("textarea", { className: "braid-console__ascii", value: route.layout.areas, rows: Math.max(3, route.layout.areas.split('\n').length + 1), spellCheck: false, "aria-describedby": `${layoutId}-hint`, "aria-invalid": parsed.errors.length > 0, onChange: (event) => setLayout({ areas: event.target.value }) })] }), _jsxs("div", { className: "braid-console__tracks", children: [_jsx(TextField, { label: "Columns", value: route.layout.columns ?? '', mono: true, onChange: (columns) => setLayout(optional('columns', columns)) }), _jsx(TextField, { label: "Rows", value: route.layout.rows ?? '', mono: true, onChange: (rows) => setLayout(optional('rows', rows)) }), _jsx(TextField, { label: "Gap", value: route.layout.gap ?? '', mono: true, onChange: (gap) => setLayout(optional('gap', gap)) })] })] }), onRemove && (_jsx("button", { type: "button", className: "braid-console__ghost", onClick: onRemove, children: "Remove this route" }))] }), parsed.errors.length > 0 ? (_jsx("ul", { className: "braid-console__findings", role: "alert", children: parsed.errors.map((error) => (_jsx("li", { className: "braid-console__finding braid-console__finding--error", children: error }, error))) })) : (_jsxs("div", { className: "braid-console__preview", children: [_jsxs("div", { className: "braid-console__previewhead", children: [_jsx("span", { children: "Preview" }), _jsx("span", { className: "braid-console__desc", children: "Pick an area, then the fragment that fills it." })] }), _jsx("div", { className: "braid-console__gridpreview", style: {
200
+ gridTemplateAreas: formatAreas(parsed.cells).join(' '),
201
+ ...(route.layout.columns ? { gridTemplateColumns: route.layout.columns } : {}),
202
+ ...(route.layout.rows ? { gridTemplateRows: route.layout.rows } : {}),
203
+ }, children: parsed.areas.map(({ name }) => {
204
+ const fragment = slots[name];
205
+ const tag = fragment ? byId.get(fragment)?.tags?.[0] : undefined;
206
+ return (_jsxs("button", { type: "button", className: `braid-console__area${fragment ? ' is-filled' : ''}${tag ? ` braid-console__tag--c${tagColor(tag)}` : ''}`, style: { gridArea: name }, "aria-pressed": name === current, "aria-label": `Area ${name}, ${fragment ? `holds ${fragment}` : 'empty'}`, onClick: () => setArea(name), children: [_jsx("span", { className: "braid-console__areaname", children: name }), _jsx("span", { className: "braid-console__areafragment", children: fragment ?? 'empty' })] }, name));
207
+ }) }), current && (_jsxs("label", { className: "braid-console__field", children: [_jsxs("span", { className: "braid-console__fieldlabel", children: ["Fragment in ", _jsx("span", { className: "braid-console__mono", children: current })] }), _jsxs("select", { value: slots[current] ?? '', disabled: readOnly, onChange: (event) => {
208
+ const next = { ...slots };
209
+ if (event.target.value)
210
+ next[current] = event.target.value;
211
+ else
212
+ delete next[current];
213
+ onChange({ slots: next });
214
+ }, children: [_jsx("option", { value: "", children: "\u2014 empty \u2014" }), manifests.map((manifest) => (_jsxs("option", { value: manifest.id, children: [manifest.id, manifest.title && manifest.title !== manifest.id ? ` — ${manifest.title}` : ''] }, manifest.id)))] })] }))] }))] }));
215
+ }
216
+ function HeadEditor({ shell, readOnly, onChange }) {
217
+ const head = shell.head ?? {};
218
+ const meta = head.meta ?? [];
219
+ const scripts = head.scripts ?? [];
220
+ const sheets = head.stylesheets ?? [];
221
+ const set = (patch) => onChange(prune({ ...head, ...patch }));
222
+ return (_jsxs("fieldset", { className: "braid-console__fields braid-console__head", disabled: readOnly, children: [_jsx("legend", { className: "braid-console__sronly", children: "Document head" }), _jsx("p", { className: "braid-console__notice braid-console__notice--quiet", children: "Nothing here loads in the console. Scripts and stylesheets are data until a shell serves them." }), _jsx(TextField, { label: "Document title", value: head.title ?? '', onChange: (title) => set(optional('title', title)) }), _jsx("h4", { className: "braid-console__subhead", children: "Meta tags" }), meta.map((entry, index) => (_jsxs("div", { className: "braid-console__row", children: [_jsx(TextField, { label: "Name", value: entry.name ?? entry.property ?? '', mono: true, onChange: (name) => set({ meta: replace(meta, index, metaName(entry, name)) }) }), _jsx(TextField, { label: "Content", value: entry.content, onChange: (content) => set({ meta: replace(meta, index, { ...entry, content }) }) }), _jsx(RemoveButton, { label: `Remove meta tag ${entry.name ?? entry.property ?? index + 1}`, onClick: () => set({ meta: meta.filter((_, i) => i !== index) }) })] }, index))), _jsx(AddButton, { label: "+ Meta tag", onClick: () => set({ meta: [...meta, { name: '', content: '' }] }) }), _jsx("h4", { className: "braid-console__subhead", children: "Scripts" }), _jsx("p", { className: "braid-console__desc", children: "By URL only \u2014 https: or a root-relative path. Inline JavaScript is not part of a shell." }), scripts.map((script, index) => (_jsxs("div", { className: "braid-console__row", children: [_jsx(TextField, { label: "Script URL", value: script.src, mono: true, onChange: (src) => set({ scripts: replace(scripts, index, { ...script, src }) }) }), _jsxs("label", { className: "braid-console__field", children: [_jsx("span", { className: "braid-console__fieldlabel", children: "Type" }), _jsxs("select", { value: script.type ?? 'classic', onChange: (event) => set({ scripts: replace(scripts, index, { ...script, type: event.target.value }) }), children: [_jsx("option", { value: "module", children: "module" }), _jsx("option", { value: "classic", children: "classic" })] })] }), _jsxs("label", { className: "braid-console__check", children: [_jsx("input", { type: "checkbox", checked: script.defer === true, onChange: (event) => set({ scripts: replace(scripts, index, optionalFlag(script, 'defer', event.target.checked)) }) }), "defer"] }), _jsxs("label", { className: "braid-console__check", children: [_jsx("input", { type: "checkbox", checked: script.async === true, onChange: (event) => set({ scripts: replace(scripts, index, optionalFlag(script, 'async', event.target.checked)) }) }), "async"] }), _jsx(TextField, { label: "Integrity", value: script.integrity ?? '', mono: true, onChange: (integrity) => set({ scripts: replace(scripts, index, { ...script, ...optional('integrity', integrity) }) }) }), _jsx(RemoveButton, { label: `Remove script ${index + 1}`, onClick: () => set({ scripts: scripts.filter((_, i) => i !== index) }) })] }, index))), _jsx(AddButton, { label: "+ Script", onClick: () => set({ scripts: [...scripts, { src: '', type: 'module', defer: true }] }) }), _jsx("h4", { className: "braid-console__subhead", children: "Stylesheets" }), sheets.map((sheet, index) => (_jsxs("div", { className: "braid-console__row", children: [_jsx(TextField, { label: "Stylesheet URL", value: sheet.href, mono: true, onChange: (href) => set({ stylesheets: replace(sheets, index, { ...sheet, href }) }) }), _jsx(RemoveButton, { label: `Remove stylesheet ${index + 1}`, onClick: () => set({ stylesheets: sheets.filter((_, i) => i !== index) }) })] }, index))), _jsx(AddButton, { label: "+ Stylesheet", onClick: () => set({ stylesheets: [...sheets, { href: '' }] }) })] }));
223
+ }
224
+ function CodeView({ shell, manifests }) {
225
+ const [target, setTarget] = useState(shell.framework);
226
+ const files = useMemo(() => shellCode(shell, manifests, target), [shell, manifests, target]);
227
+ return (_jsxs("div", { className: "braid-console__codeview", children: [_jsx("div", { className: "braid-console__tabs", role: "tablist", "aria-label": "Generated code target", children: SHELL_TARGETS.map(({ id, label }) => (_jsx("button", { type: "button", role: "tab", className: "braid-console__tab", "aria-selected": target === id, onClick: () => setTarget(id), children: label }, id))) }), files.map((file) => (_jsxs("section", { className: "braid-console__codefile", "aria-label": file.name, children: [_jsxs("div", { className: "braid-console__codehead", children: [_jsx("span", { className: "braid-console__mono", children: file.name }), _jsx("button", { type: "button", className: "braid-console__ghost", onClick: () => void navigator.clipboard?.writeText(file.code), children: "Copy" })] }), _jsx("pre", { className: "braid-console__code", children: file.code })] }, file.name)))] }));
228
+ }
229
+ // ---------------------------------------------------------------------------
230
+ // Publish bar
231
+ // ---------------------------------------------------------------------------
232
+ function PublishBar({ phase, dirty, errors, canPin, actor, onPublish, onDiscard, onReload, }) {
233
+ const busy = phase.status === 'publishing';
234
+ return (_jsxs("div", { className: "braid-console__bar", role: "region", "aria-label": "Publish shells", children: [_jsx("span", { className: "braid-console__barstate", role: "status", children: phase.status === 'published' && phase.outcome.pullRequest ? (_jsxs(_Fragment, { children: ["Proposed as", ' ', _jsxs("a", { href: phase.outcome.pullRequest.url, target: "_blank", rel: "noreferrer", children: ["pull request #", phase.outcome.pullRequest.number] }), ". It is published when the pull request is merged."] })) : phase.status === 'published' ? (_jsxs(_Fragment, { children: ["Published ", _jsx("code", { className: "braid-console__mono", children: phase.outcome.snapshot.id }), phase.outcome.pinned ? ' and pinned.' : ' as a candidate, not pinned.', " A gateway following HEAD serves a new pin within its refresh interval, or on restart without one."] })) : phase.status === 'refused' ? (_jsxs("span", { className: "braid-console__barstate--error", children: [phase.conflict ? 'Someone published since you started. ' : '', phase.error.message, phase.findings.length > 0 && ` (${phase.findings.map((finding) => finding.code).join(', ')})`] })) : errors > 0 ? (`${errors} error${errors === 1 ? '' : 's'} to fix before publishing.`) : (_jsxs(_Fragment, { children: ["Unpublished changes", actor ? _jsxs(_Fragment, { children: [" \u00B7 recorded as ", _jsx("strong", { children: actor })] }) : null] })) }), _jsx("span", { className: "braid-console__spacer" }), phase.status === 'refused' && phase.conflict ? (_jsx("button", { type: "button", className: "braid-console__retry", onClick: onReload, children: "Reload pinned (discards this draft)" })) : (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "braid-console__ghost", onClick: onDiscard, disabled: busy || !dirty, children: "Discard" }), canPin ? (_jsx("button", { type: "button", className: "braid-console__retry", onClick: () => onPublish(true), disabled: busy || !dirty || errors > 0, children: busy ? 'Publishing…' : 'Publish & pin' })) : (_jsx("button", { type: "button", className: "braid-console__retry", onClick: () => onPublish(false), disabled: busy || !dirty || errors > 0, title: "Your role may publish but not pin; a publisher pins the candidate.", children: busy ? 'Publishing…' : 'Publish as candidate' }))] }))] }));
235
+ }
236
+ // ---------------------------------------------------------------------------
237
+ // Small pieces
238
+ // ---------------------------------------------------------------------------
239
+ function TextField({ label, value, onChange, hint, mono = false, }) {
240
+ return (_jsxs("label", { className: "braid-console__field", children: [_jsx("span", { className: "braid-console__fieldlabel", children: label }), _jsx("input", { className: mono ? 'braid-console__mono' : undefined, value: value, spellCheck: false, onChange: (event) => onChange(event.target.value) }), hint && _jsx("span", { className: "braid-console__desc", children: hint })] }));
241
+ }
242
+ function AddButton({ label, onClick }) {
243
+ return (_jsx("button", { type: "button", className: "braid-console__ghost braid-console__add", onClick: onClick, children: label }));
244
+ }
245
+ function RemoveButton({ label, onClick }) {
246
+ return (_jsx("button", { type: "button", className: "braid-console__ghost", onClick: onClick, "aria-label": label, children: "\u2715" }));
247
+ }
248
+ /**
249
+ * A starting shell: a three-row page. Its id and its route are both unique, so two new shells
250
+ * never collide — a page has one shell, and validation refuses two on the same route.
251
+ */
252
+ export function newShell(existing, tags) {
253
+ const ids = new Set(existing.map((shell) => shell.id));
254
+ const paths = new Set(existing.flatMap((shell) => shell.routes.map((route) => route.path)));
255
+ let id = 'new-shell';
256
+ for (let n = 2; ids.has(id) || paths.has(`/${id}`); n += 1)
257
+ id = `new-shell-${n}`;
258
+ return {
259
+ id,
260
+ framework: 'react',
261
+ ...(tags ? { tags } : {}),
262
+ routes: [{ path: `/${id}`, layout: { areas: 'header header\nnav main\nfooter footer', columns: '220px 1fr', rows: 'auto 1fr auto' }, slots: {} }],
263
+ };
264
+ }
265
+ function frameworkLabel(framework) {
266
+ return SHELL_TARGETS.find((target) => target.id === framework)?.label ?? framework;
267
+ }
268
+ /** Clearing a field removes it: an empty input means unset, the same rule as the fragment editor. */
269
+ function optional(key, value) {
270
+ return (value.trim() === '' ? { [key]: undefined } : { [key]: value });
271
+ }
272
+ function optionalList(key, text) {
273
+ const list = text
274
+ .split(',')
275
+ .map((item) => item.trim())
276
+ .filter(Boolean);
277
+ return (list.length ? { [key]: list } : { [key]: undefined });
278
+ }
279
+ function optionalFlag(value, key, on) {
280
+ const next = { ...value };
281
+ if (on)
282
+ next[key] = true;
283
+ else
284
+ delete next[key];
285
+ return next;
286
+ }
287
+ /** `og:` names are properties in Open Graph; everything else is a plain name. */
288
+ function metaName(entry, name) {
289
+ return name.startsWith('og:') ? { property: name, content: entry.content } : { name, content: entry.content };
290
+ }
291
+ function replace(list, index, value) {
292
+ return list.map((item, position) => (position === index ? value : item));
293
+ }
294
+ function prune(value) {
295
+ const entries = Object.entries(value).filter(([, v]) => v !== undefined && !(Array.isArray(v) && v.length === 0));
296
+ return entries.length ? Object.fromEntries(entries) : undefined;
297
+ }
298
+ function rootClass(className) {
299
+ return `braid-console${className ? ` ${className}` : ''}`;
300
+ }
301
+ function themeAttr(theme) {
302
+ return theme ? { 'data-theme': theme } : {};
303
+ }
304
+ function asError(error) {
305
+ return error instanceof Error ? error : new Error(String(error));
306
+ }
307
+ //# sourceMappingURL=shells-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shells-panel.js","sourceRoot":"","sources":["../../../../../libs/braid-console/src/lib/shells-panel.tsx"],"names":[],"mappings":"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"}
@@ -22,6 +22,6 @@
22
22
  * what it does. The ramp is expressed as tokens rather than literals precisely so a shop with a
23
23
  * different system overrides eight variables instead of forking the stylesheet.
24
24
  */
25
- export declare const CONSOLE_STYLES = "\n.braid-console {\n --bc-bg: #ffffff;\n --bc-surface: #faf9f8;\n --bc-surface-alt: #f3f2f1;\n --bc-border: #e1dfdd;\n --bc-border-strong: #c8c6c4;\n --bc-text: #201f1e;\n --bc-muted: #605e5c;\n --bc-subtle: #8a8886;\n --bc-accent: #0f6cbd;\n --bc-accent-hover: #115ea3;\n --bc-accent-soft: #eff6fc;\n --bc-warn-bg: #fff4ce;\n --bc-warn-text: #6a4b16;\n --bc-warn-border: #f2d98c;\n --bc-ok: #0e700e;\n --bc-ok-soft: #dff6dd;\n --bc-err: #a4262c;\n --bc-err-soft: #fde7e9;\n --bc-radius: 4px;\n --bc-gap: 12px;\n --bc-shadow: 0 1.6px 3.6px rgba(0,0,0,0.10), 0 0.3px 0.9px rgba(0,0,0,0.07);\n --bc-font: \"Segoe UI\", \"Segoe UI Web (West European)\", ui-sans-serif, system-ui, -apple-system, Roboto, sans-serif;\n --bc-mono: ui-monospace, \"Cascadia Mono\", SFMono-Regular, Consolas, Menlo, monospace;\n\n color: var(--bc-text);\n background: var(--bc-bg);\n font-family: var(--bc-font);\n font-size: 14px;\n line-height: 1.4;\n container-type: inline-size;\n}\n\n@media (prefers-color-scheme: dark) {\n .braid-console {\n --bc-bg: #1b1a19;\n --bc-surface: #252423;\n --bc-surface-alt: #292827;\n --bc-border: #3b3a39;\n --bc-border-strong: #484644;\n --bc-text: #f3f2f1;\n --bc-muted: #c8c6c4;\n --bc-subtle: #a19f9d;\n --bc-accent: #479ef5;\n --bc-accent-hover: #62abf5;\n --bc-accent-soft: #082338;\n --bc-warn-bg: #3a2f0b;\n --bc-warn-text: #fce100;\n --bc-warn-border: #6b5a12;\n --bc-ok: #54b054;\n --bc-ok-soft: #052505;\n --bc-err: #f1707b;\n --bc-err-soft: #3b1216;\n --bc-shadow: 0 1.6px 3.6px rgba(0,0,0,0.4), 0 0.3px 0.9px rgba(0,0,0,0.3);\n }\n}\n\n/* An explicit host choice wins over the OS in both directions. */\n.braid-console[data-theme='light'] {\n --bc-bg: #ffffff; --bc-surface: #faf9f8; --bc-surface-alt: #f3f2f1;\n --bc-border: #e1dfdd; --bc-border-strong: #c8c6c4;\n --bc-text: #201f1e; --bc-muted: #605e5c; --bc-subtle: #8a8886;\n --bc-accent: #0f6cbd; --bc-accent-hover: #115ea3; --bc-accent-soft: #eff6fc;\n --bc-warn-bg: #fff4ce; --bc-warn-text: #6a4b16; --bc-warn-border: #f2d98c;\n --bc-ok: #0e700e; --bc-ok-soft: #dff6dd; --bc-err: #a4262c; --bc-err-soft: #fde7e9;\n --bc-shadow: 0 1.6px 3.6px rgba(0,0,0,0.10), 0 0.3px 0.9px rgba(0,0,0,0.07);\n}\n.braid-console[data-theme='dark'] {\n --bc-bg: #1b1a19; --bc-surface: #252423; --bc-surface-alt: #292827;\n --bc-border: #3b3a39; --bc-border-strong: #484644;\n --bc-text: #f3f2f1; --bc-muted: #c8c6c4; --bc-subtle: #a19f9d;\n --bc-accent: #479ef5; --bc-accent-hover: #62abf5; --bc-accent-soft: #082338;\n --bc-warn-bg: #3a2f0b; --bc-warn-text: #fce100; --bc-warn-border: #6b5a12;\n --bc-ok: #54b054; --bc-ok-soft: #052505; --bc-err: #f1707b; --bc-err-soft: #3b1216;\n --bc-shadow: 0 1.6px 3.6px rgba(0,0,0,0.4), 0 0.3px 0.9px rgba(0,0,0,0.3);\n}\n\n.braid-console *, .braid-console *::before, .braid-console *::after { box-sizing: border-box; }\n\n/* --- shell -------------------------------------------------------------- */\n\n/* The chrome an operator reads before anything else: what this is, which gateway, how fresh. */\n.braid-console__shell { display: flex; flex-direction: column; gap: 0; }\n\n.braid-console__titlebar {\n display: flex; align-items: center; gap: 10px; flex-wrap: wrap;\n padding: 0 0 10px;\n}\n.braid-console__producttitle { font-size: 20px; font-weight: 600; margin: 0; letter-spacing: -0.01em; }\n.braid-console__breadcrumb { color: var(--bc-subtle); font-size: 13px; display: flex; align-items: center; gap: 6px; }\n.braid-console__breadcrumb code { font-family: var(--bc-mono); font-size: 12px; color: var(--bc-muted); }\n\n/* Fluent's command bar: actions live on one line above the content, left-aligned, icon-led. */\n.braid-console__commandbar {\n display: flex; align-items: center; gap: 4px; flex-wrap: wrap;\n border-top: 1px solid var(--bc-border); border-bottom: 1px solid var(--bc-border);\n padding: 6px 0; margin-bottom: var(--bc-gap);\n}\n.braid-console__command {\n font: inherit; font-size: 13px; color: inherit; background: transparent; border: 1px solid transparent;\n border-radius: var(--bc-radius); padding: 5px 10px; cursor: pointer;\n display: inline-flex; align-items: center; gap: 6px;\n}\n.braid-console__command:hover { background: var(--bc-surface-alt); }\n.braid-console__command:disabled { opacity: 0.4; cursor: not-allowed; background: transparent; }\n.braid-console__command:focus-visible { outline: 2px solid var(--bc-accent); outline-offset: 1px; }\n.braid-console__commandicon { font-size: 13px; line-height: 1; color: var(--bc-accent); }\n.braid-console__commandsep { width: 1px; align-self: stretch; background: var(--bc-border); margin: 2px 4px; }\n\n/* Tabs (Fluent \"pivot\"): an underline on the selected one, never a filled pill. */\n.braid-console__tabs { display: flex; align-items: center; gap: 2px; }\n.braid-console__tab {\n font: inherit; font-size: 14px; color: var(--bc-muted); background: transparent;\n border: 0; border-bottom: 2px solid transparent; cursor: pointer;\n padding: 7px 10px; display: inline-flex; align-items: center; gap: 6px;\n}\n.braid-console__tab:hover { color: var(--bc-text); }\n.braid-console__tab[aria-selected='true'] { color: var(--bc-text); font-weight: 600; border-bottom-color: var(--bc-accent); }\n.braid-console__tab:focus-visible { outline: 2px solid var(--bc-accent); outline-offset: -2px; }\n.braid-console__tabcount {\n font-size: 11px; font-weight: 600; background: var(--bc-surface-alt); color: var(--bc-muted);\n border-radius: 9px; padding: 0 6px; font-variant-numeric: tabular-nums;\n}\n\n/* --- summary strip ------------------------------------------------------ */\n\n/* Four numbers an operator wants before scrolling: scale, composition, and what is gated. */\n.braid-console__stats { display: flex; gap: 1px; background: var(--bc-border); border: 1px solid var(--bc-border);\n border-radius: var(--bc-radius); overflow: hidden; margin-bottom: var(--bc-gap); flex-wrap: wrap; }\n.braid-console__stat { background: var(--bc-bg); padding: 10px 14px; flex: 1 1 auto; min-width: 8rem; }\n.braid-console__statvalue { font-size: 20px; font-weight: 600; font-variant-numeric: tabular-nums; display: block; line-height: 1.2; }\n.braid-console__statlabel { font-size: 12px; color: var(--bc-muted); }\n.braid-console__stat--warn .braid-console__statvalue { color: var(--bc-warn-text); }\n\n.braid-console__header {\n display: flex; flex-wrap: wrap; align-items: center; gap: var(--bc-gap);\n padding-bottom: var(--bc-gap);\n}\n.braid-console__title { font-size: 15px; font-weight: 600; margin: 0; }\n.braid-console__count { color: var(--bc-muted); font-variant-numeric: tabular-nums; font-size: 13px; }\n.braid-console__spacer { margin-left: auto; }\n\n.braid-console__search {\n font: inherit; color: inherit; background: var(--bc-bg);\n border: 1px solid var(--bc-border-strong); border-radius: var(--bc-radius);\n padding: 6px 10px; min-width: 15rem;\n}\n.braid-console__search::placeholder { color: var(--bc-subtle); }\n.braid-console__search:hover { border-color: var(--bc-muted); }\n/* Fluent's field focus: the border thickens on the accent edge rather than a ring floating outside. */\n.braid-console__search:focus-visible { outline: none; border-color: var(--bc-accent); box-shadow: inset 0 -2px 0 0 var(--bc-accent); }\n\n.braid-console__notice {\n display: flex; gap: 8px; align-items: flex-start;\n background: var(--bc-warn-bg); color: var(--bc-warn-text);\n border: 1px solid var(--bc-warn-border); border-left: 3px solid var(--bc-warn-text);\n border-radius: var(--bc-radius); padding: 9px 12px; margin-bottom: var(--bc-gap); font-size: 13px;\n}\n\n/* --- table -------------------------------------------------------------- */\n\n.braid-console__table { width: 100%; border-collapse: collapse; }\n.braid-console__table th {\n text-align: left; font-size: 12px; font-weight: 600; color: var(--bc-muted);\n padding: 8px 12px; border-bottom: 1px solid var(--bc-border-strong);\n position: sticky; top: 0; background: var(--bc-bg); z-index: 1;\n}\n.braid-console__table td { padding: 10px 12px; border-bottom: 1px solid var(--bc-border); vertical-align: top; }\n.braid-console__table tbody tr:hover { background: var(--bc-surface); }\n/* A 2px accent bar on the hovered row, the way a Fluent DetailsList marks the active one. */\n.braid-console__table tbody tr { box-shadow: inset 2px 0 0 0 transparent; }\n.braid-console__table tbody tr:hover { box-shadow: inset 2px 0 0 0 var(--bc-accent); }\n\n.braid-console__id { font-weight: 600; }\n.braid-console__desc { color: var(--bc-muted); margin-top: 2px; font-size: 13px; }\n.braid-console__mono { font-family: var(--bc-mono); font-size: 12.5px; color: var(--bc-muted); }\n.braid-console__patterns { display: flex; flex-direction: column; gap: 2px; }\n\n.braid-console__tag {\n display: inline-block; font-size: 11px; padding: 1px 7px; margin: 4px 4px 0 0;\n background: var(--bc-surface-alt); border: 1px solid var(--bc-border); border-radius: 3px; color: var(--bc-muted);\n}\n.braid-console__badge {\n display: inline-block; font-size: 11.5px; padding: 1px 7px; font-weight: 600;\n border-radius: 3px; border: 1px solid var(--bc-border);\n}\n.braid-console__badge--loadable { color: var(--bc-ok); border-color: transparent; background: var(--bc-ok-soft); }\n.braid-console__badge--gated { color: var(--bc-muted); background: var(--bc-surface-alt); border-color: transparent; }\n\n.braid-console__empty { padding: 40px 10px; text-align: center; color: var(--bc-muted); }\n.braid-console__error {\n border: 1px solid var(--bc-err); border-left: 3px solid var(--bc-err);\n background: var(--bc-err-soft); color: var(--bc-text);\n border-radius: var(--bc-radius); padding: 14px 16px;\n}\n.braid-console__error h3 { margin: 0 0 4px; font-size: 14px; color: var(--bc-err); }\n.braid-console__retry {\n font: inherit; color: inherit; background: var(--bc-bg); cursor: pointer; margin-top: 10px;\n border: 1px solid var(--bc-border-strong); border-radius: var(--bc-radius); padding: 5px 12px;\n}\n.braid-console__retry:hover { background: var(--bc-surface-alt); }\n\n/* --- topology graph ----------------------------------------------------- */\n\n.braid-console__graphwrap { display: flex; gap: var(--bc-gap); align-items: flex-start; }\n.braid-console__graphmain { flex: 1 1 auto; min-width: 0; overflow-x: auto; }\n\n.braid-console__collabels {\n display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;\n font-size: 11px; font-weight: 600; color: var(--bc-subtle);\n text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px;\n}\n.braid-console__collabels span:nth-child(2) { text-align: center; }\n.braid-console__collabels span:nth-child(3) { text-align: right; }\n\n.braid-console__graph { width: 100%; min-width: 480px; display: block; overflow: visible; }\n\n.braid-console__edge { fill: none; stroke: var(--bc-border-strong); stroke-width: 1.25; transition: stroke 0.12s, opacity 0.12s; }\n.braid-console__edge--served-by { stroke-dasharray: 3 3; }\n.braid-console__edge.is-lit { stroke: var(--bc-accent); stroke-width: 2; }\n.braid-console__edge.is-dim { opacity: 0.2; }\n\n.braid-console__node { cursor: pointer; transition: opacity 0.12s; }\n.braid-console__node.is-dim { opacity: 0.3; }\n.braid-console__nodebox { fill: var(--bc-bg); stroke: var(--bc-border-strong); stroke-width: 1; }\n.braid-console__node:hover .braid-console__nodebox { stroke: var(--bc-accent); }\n.braid-console__node:focus-visible { outline: none; }\n.braid-console__node:focus-visible .braid-console__nodebox { stroke: var(--bc-accent); stroke-width: 2; }\n.braid-console__node.is-selected .braid-console__nodebox { stroke: var(--bc-accent); stroke-width: 2; fill: var(--bc-accent-soft); }\n\n.braid-console__node--fragment .braid-console__nodebox { fill: var(--bc-surface-alt); }\n/* A shared route is the one state worth colouring: more than one fragment lands on this page. */\n.braid-console__node--route.is-shared .braid-console__nodebox { stroke: var(--bc-warn-border); border-left: 2px solid var(--bc-warn-text); }\n.braid-console__node--route.is-shared .braid-console__nodecount { fill: var(--bc-warn-text); font-weight: 700; }\n\n.braid-console__nodelabel { font-family: var(--bc-mono); font-size: 11.5px; fill: var(--bc-text); pointer-events: none; }\n.braid-console__nodecount { font-size: 11px; fill: var(--bc-subtle); pointer-events: none; font-variant-numeric: tabular-nums; }\n.braid-console__nodegate { fill: var(--bc-subtle); pointer-events: none; }\n\n.braid-console__graphnote {\n font-size: 12.5px; color: var(--bc-muted); margin: var(--bc-gap) 0 0;\n padding: 8px 10px; background: var(--bc-surface); border-radius: var(--bc-radius);\n border-left: 2px solid var(--bc-border-strong);\n}\n\n/* --- detail panel ------------------------------------------------------- */\n\n.braid-console__detail {\n flex: 0 0 260px; border: 1px solid var(--bc-border); border-radius: var(--bc-radius);\n background: var(--bc-surface); padding: 12px; font-size: 13px;\n}\n.braid-console__detail--empty { color: var(--bc-muted); }\n.braid-console__detailhint { font-size: 12px; color: var(--bc-subtle); margin: 8px 0 0; line-height: 1.45; }\n.braid-console__detailhead { display: flex; align-items: center; gap: 8px; }\n.braid-console__detailclose {\n margin-left: auto; font: inherit; background: transparent; border: 0; color: var(--bc-muted);\n cursor: pointer; border-radius: 3px; padding: 2px 6px; line-height: 1;\n}\n.braid-console__detailclose:hover { background: var(--bc-surface-alt); color: var(--bc-text); }\n.braid-console__detailtitle { font-size: 15px; margin: 6px 0 4px; font-family: var(--bc-mono); word-break: break-all; }\n.braid-console__detaildesc { color: var(--bc-muted); margin: 0 0 6px; line-height: 1.45; }\n.braid-console__detailwarn { color: var(--bc-warn-text); margin: 8px 0 0; font-size: 12.5px; line-height: 1.45; }\n\n.braid-console__kind {\n font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; font-weight: 600;\n border-radius: 3px; padding: 2px 6px; background: var(--bc-surface-alt); color: var(--bc-muted);\n}\n.braid-console__kind--route { color: var(--bc-accent); background: var(--bc-accent-soft); }\n\n.braid-console__props { display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; margin: 10px 0 0; }\n.braid-console__props dt { color: var(--bc-subtle); font-size: 12px; }\n.braid-console__props dd { margin: 0; }\n\n.braid-console__detailsection { margin-top: 12px; border-top: 1px solid var(--bc-border); padding-top: 10px; }\n.braid-console__detailsection h4 { margin: 0 0 6px; font-size: 12px; color: var(--bc-subtle); text-transform: uppercase; letter-spacing: 0.05em; }\n.braid-console__peerlist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 3px; }\n\n/* --- integration dialog -------------------------------------------------- */\n\n.braid-console__scrim {\n position: fixed; inset: 0; z-index: 40; display: flex; align-items: center; justify-content: center;\n background: rgba(0,0,0,0.4); padding: 24px;\n}\n.braid-console__dialog {\n background: var(--bc-bg); border: 1px solid var(--bc-border); border-radius: 6px;\n box-shadow: 0 6.4px 14.4px rgba(0,0,0,0.13), 0 1.2px 3.6px rgba(0,0,0,0.11);\n width: min(720px, 100%); max-height: 100%; overflow-y: auto; padding: 16px;\n}\n.braid-console__dialoghead { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; }\n.braid-console__dialogtitle { margin: 0; font-size: 16px; font-weight: 600; }\n.braid-console__dialogtitle code { font-family: var(--bc-mono); font-size: 15px; }\n.braid-console__dialoghead .braid-console__detailclose { margin-left: auto; }\n\n.braid-console__code {\n margin: 10px 0 0; padding: 12px; overflow-x: auto;\n background: var(--bc-surface-alt); border: 1px solid var(--bc-border); border-radius: var(--bc-radius);\n font-family: var(--bc-mono); font-size: 12.5px; line-height: 1.55; white-space: pre;\n}\n.braid-console__code:focus-visible { outline: 2px solid var(--bc-accent); outline-offset: 1px; }\n\n.braid-console__dialogfoot { display: flex; align-items: center; gap: 12px; margin-top: 12px; flex-wrap: wrap; }\n.braid-console__dialogfoot .braid-console__hint { font-size: 12px; color: var(--bc-subtle); }\n.braid-console__dialogfoot code { font-family: var(--bc-mono); }\n.braid-console__dialogfoot kbd {\n font-family: var(--bc-mono); font-size: 11px; border: 1px solid var(--bc-border-strong);\n border-bottom-width: 2px; border-radius: 3px; padding: 0 4px; background: var(--bc-bg);\n}\n\n/* --- editor ------------------------------------------------------------- */\n\n.braid-console__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }\n.braid-console__card { border: 1px solid var(--bc-border); border-radius: var(--bc-radius); background: var(--bc-bg); }\n.braid-console__card:hover { border-color: var(--bc-border-strong); }\n.braid-console__cardhead { display: flex; align-items: center; gap: var(--bc-gap); padding: 10px 12px; flex-wrap: wrap; }\n\n.braid-console__card.is-open { border-color: var(--bc-accent); box-shadow: var(--bc-shadow); }\n\n.braid-console__disclose {\n font: inherit; color: inherit; background: transparent; cursor: pointer;\n display: inline-flex; align-items: center; gap: 8px;\n border: 1px solid transparent; border-radius: var(--bc-radius); padding: 3px 8px 3px 4px; margin-left: -4px;\n}\n/* The row is a control, so it says so on hover rather than only when the pointer finds the glyph. */\n.braid-console__disclose:hover { background: var(--bc-surface-alt); border-color: var(--bc-border); }\n.braid-console__disclose:focus-visible { outline: 2px solid var(--bc-accent); outline-offset: 2px; }\n\n.braid-console__caret {\n display: inline-block; color: var(--bc-muted); font-size: 11px;\n transition: transform 0.12s ease; transform-origin: 50% 50%;\n}\n.braid-console__card.is-open .braid-console__caret { transform: rotate(90deg); }\n\n.braid-console__cardmeta { font-size: 12px; color: var(--bc-subtle); }\n\n.braid-console__ghost, .braid-console__primary {\n font: inherit; font-size: 13px; cursor: pointer; border-radius: var(--bc-radius); padding: 5px 12px;\n border: 1px solid var(--bc-border-strong); background: var(--bc-bg); color: inherit;\n}\n.braid-console__ghost:hover { background: var(--bc-surface-alt); }\n.braid-console__primary { background: var(--bc-accent); border-color: var(--bc-accent); color: #fff; font-weight: 600; }\n.braid-console__primary:hover { background: var(--bc-accent-hover); border-color: var(--bc-accent-hover); }\n.braid-console__ghost:disabled, .braid-console__primary:disabled { opacity: 0.45; cursor: not-allowed; }\n.braid-console__ghost:focus-visible, .braid-console__primary:focus-visible { outline: 2px solid var(--bc-accent); outline-offset: 2px; }\n\n.braid-console__badge--error { color: var(--bc-err); background: var(--bc-err-soft); border-color: transparent; }\n\n.braid-console__findings { list-style: none; margin: 0; padding: 0 12px 10px; display: flex; flex-direction: column; gap: 5px; }\n.braid-console__finding { font-size: 12.5px; padding: 4px 0 4px 10px; border-left: 2px solid var(--bc-border); line-height: 1.45; }\n.braid-console__finding--error { border-left-color: var(--bc-err); color: var(--bc-err); }\n.braid-console__finding--warning { border-left-color: var(--bc-warn-border); color: var(--bc-warn-text); }\n\n.braid-console__fields {\n display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: var(--bc-gap); padding: 12px; border-top: 1px solid var(--bc-border); background: var(--bc-surface);\n}\n.braid-console__field { display: flex; flex-direction: column; gap: 4px; }\n.braid-console__fieldlabel { font-size: 12px; font-weight: 600; color: var(--bc-muted); display: flex; align-items: center; gap: 6px; }\n.braid-console__field input, .braid-console__field select {\n font: inherit; font-size: 13px; color: inherit; background: var(--bc-bg);\n border: 1px solid var(--bc-border-strong); border-radius: var(--bc-radius); padding: 6px 9px; width: 100%;\n}\n.braid-console__field input:focus-visible, .braid-console__field select:focus-visible {\n outline: none; border-color: var(--bc-accent); box-shadow: inset 0 -2px 0 0 var(--bc-accent);\n}\n.braid-console__field input:disabled { opacity: 0.6; }\n\n.braid-console__owner {\n font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.04em;\n border: 1px solid var(--bc-border); border-radius: 3px; padding: 1px 5px; color: var(--bc-muted);\n}\n.braid-console__owner--gateway { color: var(--bc-warn-text); border-color: var(--bc-warn-border); background: var(--bc-warn-bg); }\n\n.braid-console__bar {\n position: sticky; bottom: 0; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;\n margin-top: var(--bc-gap); padding: 12px; background: var(--bc-surface);\n border: 1px solid var(--bc-border); border-radius: var(--bc-radius); box-shadow: var(--bc-shadow);\n}\n.braid-console__barstate { color: var(--bc-muted); font-size: 13px; }\n.braid-console__barstate--error { color: var(--bc-err); font-weight: 600; }\n\n.braid-console__notice--ok { background: var(--bc-ok-soft); color: var(--bc-ok); border-color: var(--bc-ok); border-left-color: var(--bc-ok); }\n\n.braid-console__diff {\n font-family: var(--bc-mono); font-size: 12.5px; padding: 12px; margin-top: var(--bc-gap);\n border: 1px solid var(--bc-border); border-radius: var(--bc-radius); background: var(--bc-surface);\n overflow-x: auto;\n}\n.braid-console__diffline { padding: 2px 0; }\n.braid-console__diffline--add { color: var(--bc-ok); }\n.braid-console__diffline--remove { color: var(--bc-err); }\n.braid-console__diffield { padding: 2px 0 2px 16px; color: var(--bc-muted); }\n\n/* --- access matrix ------------------------------------------------------ */\n\n.braid-console__access {\n margin-top: var(--bc-gap); padding: 12px;\n border: 1px solid var(--bc-border); border-radius: var(--bc-radius); background: var(--bc-surface);\n}\n.braid-console__accesshead { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }\n.braid-console__matrix { margin-top: 8px; background: var(--bc-bg); }\n.braid-console__matrix th, .braid-console__matrix td { padding: 6px 10px; }\n.braid-console__matrix th { white-space: nowrap; position: static; }\n.braid-console__remove { border: 0; padding: 0 4px; margin-left: 4px; font-size: 13px; line-height: 1; }\n\n.braid-console__mark { font-family: var(--bc-mono); }\n.braid-console__mark--allowed { color: var(--bc-ok); }\n.braid-console__mark--denied { color: var(--bc-muted); }\n.braid-console__mark--absent { color: var(--bc-muted); opacity: 0.6; }\n\n/* Visually hidden, still read aloud \u2014 the symbols carry meaning that colour alone would not. */\n.braid-console__sronly {\n position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;\n overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;\n}\n\n/* Container query, not a media query: the library's width is its host's business, not the\n viewport's. A console in a 400px sidebar should stack even on a wide screen. */\n@container (max-width: 860px) {\n .braid-console__graphwrap { flex-direction: column; }\n .braid-console__detail { flex: 1 1 auto; width: 100%; }\n}\n\n@container (max-width: 640px) {\n .braid-console__table thead { display: none; }\n .braid-console__table tr { display: block; padding: 8px 0; border-bottom: 1px solid var(--bc-border); }\n .braid-console__table td { display: block; border: 0; padding: 2px 12px; }\n .braid-console__stats { flex-direction: column; }\n}\n\n/* Motion is decoration here; the information is in position and colour, which do not move. */\n@media (prefers-reduced-motion: reduce) {\n .braid-console__edge, .braid-console__node, .braid-console__caret { transition: none; }\n}\n";
25
+ export declare const CONSOLE_STYLES: string;
26
26
  /** Injects the stylesheet once per document. Safe to call from every mounted instance. */
27
27
  export declare function ensureStyles(doc?: Document): void;
package/src/lib/styles.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { TAG_STYLES } from './tags.js';
1
2
  /**
2
3
  * The console's styles, as a string injected once at mount.
3
4
  *
@@ -231,17 +232,17 @@ export const CONSOLE_STYLES = `
231
232
  .braid-console__graphmain { flex: 1 1 auto; min-width: 0; overflow-x: auto; }
232
233
 
233
234
  .braid-console__collabels {
234
- display: grid; grid-auto-flow: column; grid-auto-columns: 1fr;
235
+ position: relative; height: 16px; min-width: 480px;
235
236
  font-size: 11px; font-weight: 600; color: var(--bc-subtle);
236
237
  text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px;
237
238
  }
238
- .braid-console__collabels span:nth-child(2) { text-align: center; }
239
- .braid-console__collabels span:nth-child(3) { text-align: right; }
239
+ .braid-console__collabels span { position: absolute; top: 0; padding-left: 2px; white-space: nowrap; }
240
240
 
241
241
  .braid-console__graph { width: 100%; min-width: 480px; display: block; overflow: visible; }
242
242
 
243
243
  .braid-console__edge { fill: none; stroke: var(--bc-border-strong); stroke-width: 1.25; transition: stroke 0.12s, opacity 0.12s; }
244
244
  .braid-console__edge--served-by { stroke-dasharray: 3 3; }
245
+ .braid-console__edge--slots { stroke-dasharray: 1 3; stroke-linecap: round; }
245
246
  .braid-console__edge.is-lit { stroke: var(--bc-accent); stroke-width: 2; }
246
247
  .braid-console__edge.is-dim { opacity: 0.2; }
247
248
 
@@ -254,6 +255,7 @@ export const CONSOLE_STYLES = `
254
255
  .braid-console__node.is-selected .braid-console__nodebox { stroke: var(--bc-accent); stroke-width: 2; fill: var(--bc-accent-soft); }
255
256
 
256
257
  .braid-console__node--fragment .braid-console__nodebox { fill: var(--bc-surface-alt); }
258
+ .braid-console__node--shell .braid-console__nodebox { fill: var(--bc-accent-soft); stroke: var(--bc-accent); }
257
259
  /* A shared route is the one state worth colouring: more than one fragment lands on this page. */
258
260
  .braid-console__node--route.is-shared .braid-console__nodebox { stroke: var(--bc-warn-border); border-left: 2px solid var(--bc-warn-text); }
259
261
  .braid-console__node--route.is-shared .braid-console__nodecount { fill: var(--bc-warn-text); font-weight: 700; }
@@ -291,6 +293,7 @@ export const CONSOLE_STYLES = `
291
293
  border-radius: 3px; padding: 2px 6px; background: var(--bc-surface-alt); color: var(--bc-muted);
292
294
  }
293
295
  .braid-console__kind--route { color: var(--bc-accent); background: var(--bc-accent-soft); }
296
+ .braid-console__kind--shell { color: var(--bc-accent); background: var(--bc-accent-soft); }
294
297
 
295
298
  .braid-console__props { display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; margin: 10px 0 0; }
296
299
  .braid-console__props dt { color: var(--bc-subtle); font-size: 12px; }
@@ -438,6 +441,71 @@ export const CONSOLE_STYLES = `
438
441
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
439
442
  }
440
443
 
444
+ /* --- shells ------------------------------------------------------------ */
445
+
446
+ .braid-console__identity { display: inline-flex; align-items: center; gap: 8px; font-size: 13px; color: var(--bc-muted); }
447
+ .braid-console__rolebadge { font-size: 11.5px; font-weight: 600; padding: 1px 8px; border-radius: 10px; color: var(--bc-accent); background: var(--bc-accent-soft); }
448
+
449
+ .braid-console__notice--quiet { background: var(--bc-surface); color: var(--bc-muted); border-color: var(--bc-border); border-left-color: var(--bc-border-strong); }
450
+ .braid-console__actions { white-space: nowrap; }
451
+ .braid-console__designer { gap: var(--bc-gap); }
452
+ .braid-console__shellmeta { border: 1px solid var(--bc-border); border-radius: var(--bc-radius); margin: 0; }
453
+ .braid-console__tagrow { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; }
454
+ .braid-console__designerbody { display: flex; gap: var(--bc-gap); align-items: flex-start; flex-wrap: wrap; }
455
+ .braid-console__routes { display: flex; flex-direction: column; gap: 4px; flex: 0 0 200px; }
456
+ .braid-console__routebutton {
457
+ font: inherit; font-size: 13px; text-align: left; color: inherit; cursor: pointer;
458
+ background: var(--bc-bg); border: 1px solid var(--bc-border); border-radius: var(--bc-radius); padding: 7px 10px;
459
+ }
460
+ .braid-console__routebutton[aria-pressed='true'] { border-color: var(--bc-accent); background: var(--bc-accent-soft); }
461
+ .braid-console__routebutton:focus-visible { outline: 2px solid var(--bc-accent); outline-offset: 1px; }
462
+ .braid-console__routeeditor { flex: 999 1 480px; min-width: 0; display: flex; flex-direction: column; gap: var(--bc-gap); }
463
+ .braid-console__routeeditor .braid-console__fields { border: 1px solid var(--bc-border); border-radius: var(--bc-radius); margin: 0; }
464
+ .braid-console__layoutrow { grid-column: 1 / -1; display: flex; gap: var(--bc-gap); flex-wrap: wrap; }
465
+ .braid-console__field--grow { flex: 2 1 320px; }
466
+ .braid-console__tracks { flex: 1 1 200px; display: flex; flex-direction: column; gap: 8px; }
467
+ .braid-console__ascii {
468
+ font-family: var(--bc-mono); font-size: 15px; line-height: 1.7; letter-spacing: 0.02em; white-space: pre;
469
+ color: inherit; background: var(--bc-bg); border: 1px solid var(--bc-border-strong); border-radius: var(--bc-radius);
470
+ padding: 10px 12px; width: 100%; resize: vertical; overflow-x: auto;
471
+ }
472
+ .braid-console__ascii:focus-visible { outline: none; border-color: var(--bc-accent); box-shadow: inset 0 -2px 0 0 var(--bc-accent); }
473
+ .braid-console__ascii[aria-invalid='true'] { border-color: var(--bc-err); }
474
+ .braid-console__preview { display: flex; flex-direction: column; gap: 10px; padding: 12px; border: 1px solid var(--bc-border); border-radius: var(--bc-radius); background: var(--bc-surface); }
475
+ .braid-console__previewhead { display: flex; gap: 10px; align-items: baseline; font-size: 12px; font-weight: 600; color: var(--bc-muted); }
476
+ .braid-console__gridpreview {
477
+ display: grid; gap: 8px; min-height: 260px; padding: 10px;
478
+ background: var(--bc-bg); border: 1px solid var(--bc-border-strong); border-radius: var(--bc-radius);
479
+ }
480
+ .braid-console__area {
481
+ font: inherit; min-width: 0; min-height: 44px; cursor: pointer; text-align: left;
482
+ display: flex; flex-direction: column; gap: 3px; padding: 8px; overflow: hidden;
483
+ color: var(--bc-muted); background: var(--bc-surface); border: 1px dashed var(--bc-border-strong); border-radius: var(--bc-radius);
484
+ }
485
+ .braid-console__area.is-filled { border-style: solid; border-color: transparent; color: var(--bc-text); background: var(--bc-surface-alt); }
486
+ .braid-console__area.is-filled[class*='braid-console__tag--c'] { color: var(--bc-tag-fg); background: var(--bc-tag-bg); }
487
+ .braid-console__area[aria-pressed='true'] { outline: 2px solid var(--bc-accent); outline-offset: -2px; }
488
+ .braid-console__area:focus-visible { outline: 2px solid var(--bc-accent); outline-offset: 1px; }
489
+ .braid-console__areaname { font-family: var(--bc-mono); font-size: 11px; opacity: 0.85; }
490
+ .braid-console__areafragment { font-family: var(--bc-mono); font-size: 13px; font-weight: 600; }
491
+ .braid-console__head { border: 1px solid var(--bc-border); border-radius: var(--bc-radius); margin: 0; }
492
+ .braid-console__head .braid-console__notice, .braid-console__subhead, .braid-console__head > .braid-console__desc, .braid-console__add { grid-column: 1 / -1; }
493
+ .braid-console__subhead { margin: 6px 0 0; font-size: 13px; font-weight: 600; }
494
+ .braid-console__row { grid-column: 1 / -1; display: flex; gap: 8px; align-items: flex-end; flex-wrap: wrap; }
495
+ .braid-console__row > .braid-console__field { flex: 1 1 180px; }
496
+ .braid-console__add { justify-self: start; }
497
+ .braid-console__check { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; padding-bottom: 7px; }
498
+ .braid-console__codeview { display: flex; flex-direction: column; gap: var(--bc-gap); }
499
+ .braid-console__codefile { border: 1px solid var(--bc-border); border-radius: var(--bc-radius); padding: 8px 12px 12px; }
500
+ .braid-console__codehead { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 13px; }
501
+ .braid-console__emptystate {
502
+ display: flex; flex-direction: column; gap: 8px; align-items: flex-start; max-width: 760px;
503
+ padding: 20px; border: 1px dashed var(--bc-border-strong); border-radius: var(--bc-radius); background: var(--bc-surface);
504
+ }
505
+ .braid-console__emptystate h3 { margin: 0; font-size: 16px; }
506
+ .braid-console__emptystate p { margin: 0; color: var(--bc-muted); }
507
+ .braid-console__emptystate .braid-console__code { align-self: stretch; }
508
+
441
509
  /* Container query, not a media query: the library's width is its host's business, not the
442
510
  viewport's. A console in a 400px sidebar should stack even on a wide screen. */
443
511
  @container (max-width: 860px) {
@@ -456,7 +524,7 @@ export const CONSOLE_STYLES = `
456
524
  @media (prefers-reduced-motion: reduce) {
457
525
  .braid-console__edge, .braid-console__node, .braid-console__caret { transition: none; }
458
526
  }
459
- `;
527
+ ` + TAG_STYLES;
460
528
  const STYLE_ELEMENT_ID = 'braid-console-styles';
461
529
  /** Injects the stylesheet once per document. Safe to call from every mounted instance. */
462
530
  export function ensureStyles(doc = document) {
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../libs/braid-console/src/lib/styles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkb7B,CAAC;AAEF,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEhD,0FAA0F;AAC1F,MAAM,UAAU,YAAY,CAAC,MAAgB,QAAQ;IACnD,IAAI,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC;QAAE,OAAO;IAEjD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,GAAG,gBAAgB,CAAC;IAC5B,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC;IACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../../../libs/braid-console/src/lib/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqf7B,GAAG,UAAU,CAAC;AAEf,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;AAEhD,0FAA0F;AAC1F,MAAM,UAAU,YAAY,CAAC,MAAgB,QAAQ;IACnD,IAAI,GAAG,CAAC,cAAc,CAAC,gBAAgB,CAAC;QAAE,OAAO;IAEjD,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,EAAE,GAAG,gBAAgB,CAAC;IAC5B,KAAK,CAAC,WAAW,GAAG,cAAc,CAAC;IACnC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC"}