@braidlabs/console 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -10
- package/package.json +10 -4
- package/src/app/auth.d.ts +46 -0
- package/src/app/auth.js +80 -0
- package/src/app/auth.js.map +1 -0
- package/src/app/console-app.d.ts +8 -6
- package/src/app/console-app.js +91 -20
- package/src/app/console-app.js.map +1 -1
- package/src/app/main.js +25 -2
- package/src/app/main.js.map +1 -1
- package/src/app/routes.d.ts +14 -0
- package/src/app/routes.js +23 -0
- package/src/app/routes.js.map +1 -0
- package/src/index.d.ts +15 -2
- package/src/index.js +10 -2
- package/src/index.js.map +1 -1
- package/src/lib/client.d.ts +52 -1
- package/src/lib/client.js +48 -0
- package/src/lib/client.js.map +1 -1
- package/src/lib/draft.d.ts +1 -1
- package/src/lib/draft.js +2 -2
- package/src/lib/draft.js.map +1 -1
- package/src/lib/empty-state.d.ts +15 -0
- package/src/lib/empty-state.js +38 -0
- package/src/lib/empty-state.js.map +1 -0
- package/src/lib/history-panel.d.ts +19 -0
- package/src/lib/history-panel.js +85 -0
- package/src/lib/history-panel.js.map +1 -0
- package/src/lib/ownership.d.ts +15 -0
- package/src/lib/ownership.js +21 -0
- package/src/lib/ownership.js.map +1 -0
- package/src/lib/query.d.ts +47 -0
- package/src/lib/query.js +121 -0
- package/src/lib/query.js.map +1 -0
- package/src/lib/registry-console.d.ts +13 -2
- package/src/lib/registry-console.js +15 -11
- package/src/lib/registry-console.js.map +1 -1
- package/src/lib/registry-editor.js +20 -7
- package/src/lib/registry-editor.js.map +1 -1
- package/src/lib/shell-codegen.d.ts +28 -0
- package/src/lib/shell-codegen.js +316 -0
- package/src/lib/shell-codegen.js.map +1 -0
- package/src/lib/shells-panel.d.ts +43 -0
- package/src/lib/shells-panel.js +307 -0
- package/src/lib/shells-panel.js.map +1 -0
- package/src/lib/styles.d.ts +1 -1
- package/src/lib/styles.js +72 -4
- package/src/lib/styles.js.map +1 -1
- package/src/lib/tag-chip.d.ts +8 -0
- package/src/lib/tag-chip.js +12 -0
- package/src/lib/tag-chip.js.map +1 -0
- package/src/lib/tags.d.ts +10 -0
- package/src/lib/tags.js +53 -0
- package/src/lib/tags.js.map +1 -0
- package/src/lib/topology-graph.d.ts +5 -2
- package/src/lib/topology-graph.js +17 -8
- package/src/lib/topology-graph.js.map +1 -1
- package/src/lib/topology.d.ts +18 -3
- package/src/lib/topology.js +42 -3
- 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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"}
|
package/src/lib/styles.d.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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) {
|
package/src/lib/styles.js.map
CHANGED
|
@@ -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
|
|
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"}
|