@unofficialbox/box-open-elements 0.24.0 → 0.26.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 +13 -13
- package/dist/components/actions/button.d.ts +1 -0
- package/dist/components/actions/button.js +13 -0
- package/dist/components/forms/checkbox.d.ts +1 -0
- package/dist/components/forms/checkbox.js +2 -0
- package/dist/components/forms/code-editor.d.ts +28 -3
- package/dist/components/forms/code-editor.js +71 -6
- package/dist/components/forms/combobox.js +7 -8
- package/dist/components/forms/number-input.d.ts +1 -0
- package/dist/components/forms/number-input.js +4 -1
- package/dist/components/forms/select.d.ts +1 -0
- package/dist/components/forms/select.js +3 -1
- package/dist/components/forms/text-area.js +5 -7
- package/dist/components/forms/text-field.d.ts +1 -0
- package/dist/components/forms/text-field.js +2 -0
- package/dist/components/navigation/accordion.d.ts +7 -0
- package/dist/components/navigation/accordion.js +31 -8
- package/dist/components/output/code-block.js +3 -1
- package/dist/components/overlays/drawer.js +2 -2
- package/dist/foundations/geometry/tokens.d.ts +2 -2
- package/dist/foundations/geometry/tokens.js +3 -3
- package/dist/foundations/icons/box-iconography.generated.d.ts +472 -1
- package/dist/foundations/icons/box-iconography.generated.js +473 -2
- package/dist/patterns/flow-builder/flow-builder.d.ts +5 -1
- package/dist/patterns/flow-builder/flow-builder.js +18 -7
- package/dist/patterns/flow-builder/primitives.d.ts +1 -0
- package/dist/patterns/flow-builder/primitives.js +11 -4
- package/dist/patterns/process-modeler/bridge.d.ts +10 -0
- package/dist/patterns/process-modeler/bridge.js +173 -0
- package/dist/patterns/process-modeler/design.d.ts +2 -0
- package/dist/patterns/process-modeler/design.js +288 -0
- package/dist/patterns/process-modeler/geometry.d.ts +20 -0
- package/dist/patterns/process-modeler/geometry.js +330 -0
- package/dist/patterns/process-modeler/index.d.ts +2 -0
- package/dist/patterns/process-modeler/index.js +2 -0
- package/dist/patterns/process-modeler/model.d.ts +106 -1
- package/dist/patterns/process-modeler/model.js +2 -2
- package/dist/patterns/process-modeler/process-modeler.d.ts +115 -3
- package/dist/patterns/process-modeler/process-modeler.js +1864 -128
- package/package.json +4 -3
|
@@ -27,7 +27,11 @@ export declare class FlowBuilder<N extends FlowNodeBase = FlowNode> extends Base
|
|
|
27
27
|
private headingEl?;
|
|
28
28
|
private renderedRenderer?;
|
|
29
29
|
private observer?;
|
|
30
|
-
private
|
|
30
|
+
private narrowValue;
|
|
31
|
+
private visible;
|
|
32
|
+
get narrow(): boolean;
|
|
33
|
+
/** Focus a rendered card without changing selection or opening the editor. */
|
|
34
|
+
focusNode(node: N): void;
|
|
31
35
|
private insertion?;
|
|
32
36
|
private invoker?;
|
|
33
37
|
private spine;
|
|
@@ -22,7 +22,11 @@ export class FlowBuilder extends BaseElement {
|
|
|
22
22
|
headingEl;
|
|
23
23
|
renderedRenderer;
|
|
24
24
|
observer;
|
|
25
|
-
|
|
25
|
+
narrowValue = false;
|
|
26
|
+
visible = true;
|
|
27
|
+
get narrow() { return this.narrowValue; }
|
|
28
|
+
/** Focus a rendered card without changing selection or opening the editor. */
|
|
29
|
+
focusNode(node) { this.spine?.focusNode(node); }
|
|
26
30
|
insertion;
|
|
27
31
|
invoker;
|
|
28
32
|
spine;
|
|
@@ -60,12 +64,18 @@ export class FlowBuilder extends BaseElement {
|
|
|
60
64
|
this.refresh();
|
|
61
65
|
}
|
|
62
66
|
connectedCallback() {
|
|
67
|
+
this.visible = this.getClientRects().length > 0;
|
|
63
68
|
super.connectedCallback();
|
|
64
69
|
if (typeof ResizeObserver !== "undefined") {
|
|
65
|
-
this.observer = new ResizeObserver(entries =>
|
|
70
|
+
this.observer = new ResizeObserver(entries => {
|
|
71
|
+
const rect = entries[0].contentRect;
|
|
72
|
+
this.visible = rect.width > 0 && rect.height > 0 && this.getClientRects().length > 0;
|
|
73
|
+
this.setNarrow(this.visible && rect.width < 800);
|
|
74
|
+
this.updateInspector();
|
|
75
|
+
});
|
|
66
76
|
this.observer.observe(this);
|
|
67
77
|
}
|
|
68
|
-
this.setNarrow(
|
|
78
|
+
this.setNarrow(this.visible && this.getBoundingClientRect().width < 800);
|
|
69
79
|
}
|
|
70
80
|
disconnectedCallback() {
|
|
71
81
|
this.observer?.disconnect();
|
|
@@ -79,9 +89,10 @@ export class FlowBuilder extends BaseElement {
|
|
|
79
89
|
setNarrow(narrow) {
|
|
80
90
|
if (this.narrow === narrow)
|
|
81
91
|
return;
|
|
82
|
-
this.
|
|
92
|
+
this.narrowValue = narrow;
|
|
83
93
|
this.shadowRoot.querySelector("[part=layout]").dataset.narrow = String(narrow);
|
|
84
94
|
this.updateInspector();
|
|
95
|
+
this.dispatchEvent(new CustomEvent("narrow-changed", { detail: { narrow }, bubbles: true, composed: true }));
|
|
85
96
|
}
|
|
86
97
|
renderTemplate() {
|
|
87
98
|
this.shadowRoot.innerHTML = `<style>
|
|
@@ -134,7 +145,7 @@ export class FlowBuilder extends BaseElement {
|
|
|
134
145
|
});
|
|
135
146
|
this.palette.addEventListener("kind-pick", event => this.insert(event.detail.kind, { list: this.nodes, index: this.nodes.length, label: "Append to flow" }));
|
|
136
147
|
this.drawer.addEventListener("open-changed", event => {
|
|
137
|
-
if (!event.detail.open && this.narrow && this.selectedValue)
|
|
148
|
+
if (!event.detail.open && this.visible && this.narrow && this.selectedValue)
|
|
138
149
|
this.select(null);
|
|
139
150
|
});
|
|
140
151
|
}
|
|
@@ -220,7 +231,7 @@ export class FlowBuilder extends BaseElement {
|
|
|
220
231
|
if (this.inspector.parentElement !== target)
|
|
221
232
|
target.append(this.inspector);
|
|
222
233
|
if (this.inspected === this.selected && this.renderedRenderer === this.renderer && (!this.selected || this.headingEl?.tagName === `H${this.headingLevel}`)) {
|
|
223
|
-
this.drawer.open = this.narrow && Boolean(this.selected);
|
|
234
|
+
this.drawer.open = this.visible && this.narrow && Boolean(this.selected);
|
|
224
235
|
return;
|
|
225
236
|
}
|
|
226
237
|
this.cleanupInspector?.();
|
|
@@ -243,7 +254,7 @@ export class FlowBuilder extends BaseElement {
|
|
|
243
254
|
}
|
|
244
255
|
this.drawer.heading = nodeTitle(this.selected, this.catalog, this.model);
|
|
245
256
|
}
|
|
246
|
-
this.drawer.open = this.narrow && Boolean(this.selected);
|
|
257
|
+
this.drawer.open = this.visible && this.narrow && Boolean(this.selected);
|
|
247
258
|
}
|
|
248
259
|
}
|
|
249
260
|
FlowBuilder.register();
|
|
@@ -31,6 +31,7 @@ export declare class KindPicker extends BaseElement {
|
|
|
31
31
|
static readonly tagName = "box-kind-picker";
|
|
32
32
|
catalog: readonly FlowKind[];
|
|
33
33
|
variant: "inline" | "menu";
|
|
34
|
+
searchable: boolean;
|
|
34
35
|
protected renderTemplate(): void;
|
|
35
36
|
protected setupListeners(): void;
|
|
36
37
|
refresh(): void;
|
|
@@ -24,7 +24,7 @@ export class FlowCard extends BaseElement {
|
|
|
24
24
|
renderTemplate() {
|
|
25
25
|
this.shadowRoot.innerHTML = `<style>${styles}
|
|
26
26
|
button { width:100%; text-align:start; display:grid; gap:6px; padding:16px; border:1px solid var(--boe-token-stroke-stroke,#ddd); border-radius:var(--boe-profile-radius-med,8px); background:var(--boe-token-surface-surface,#fff); overflow-wrap:anywhere; }
|
|
27
|
-
button[aria-pressed=true] { border-color:var(--boe-token-surface-surface-brand,#0061d5); background:color-mix(in srgb,var(--boe-token-surface-surface-brand,#0061d5)
|
|
27
|
+
button[aria-pressed=true] { border-color:var(--boe-token-surface-surface-brand,#0061d5); background:color-mix(in srgb,var(--boe-token-surface-surface-brand,#0061d5) 5%,var(--boe-token-surface-surface,#fff)); }
|
|
28
28
|
button[data-invalid=true] { border-color:var(--boe-token-text-status-text-error,#b92340); }
|
|
29
29
|
button.has-icon{grid-template-columns:20px minmax(0,1fr);column-gap:12px} button.has-icon [part=icon]{grid-column:1;grid-row:1/span 4} button.has-icon [part=title],button.has-icon [part=kind],button.has-icon [part=description],button.has-icon [part=status],button.has-icon [part=error]{grid-column:2}
|
|
30
30
|
[part=icon]{color:var(--boe-token-surface-surface-brand,#0061d5);width:20px;height:20px} [part=icon][data-tone=neutral]{color:var(--boe-token-text-text-secondary,#666)} [part=icon] svg{display:block;width:20px;height:20px} [part=title] { font-weight:650; } [part=kind],[part=description] { color:var(--boe-token-text-text-secondary,#666); } [part=error] { color:var(--boe-token-text-status-text-error,#b92340); }
|
|
@@ -67,8 +67,10 @@ export class KindPicker extends BaseElement {
|
|
|
67
67
|
static tagName = "box-kind-picker";
|
|
68
68
|
catalog = [];
|
|
69
69
|
variant = "inline";
|
|
70
|
-
|
|
70
|
+
searchable = false;
|
|
71
|
+
renderTemplate() { this.shadowRoot.innerHTML = `<style>${styles} [part=search]{width:100%;min-height:36px;margin-bottom:8px;padding:8px;border:1px solid var(--boe-token-stroke-stroke,#ddd);border-radius:8px;background:var(--boe-token-surface-surface,#fff);font:inherit;color:inherit} [part=choices]{display:grid;gap:8px} button{text-align:start;padding:10px;border:1px solid var(--boe-token-stroke-stroke,#ddd);border-radius:8px;background:var(--boe-token-surface-surface,#fff)} button.has-icon{display:grid;grid-template-columns:20px minmax(0,1fr);column-gap:10px;align-items:start} [part=choice-icon]{grid-row:1/span 2;width:20px;height:20px;color:var(--boe-token-surface-surface-brand,#0061d5)} [part=choice-icon][data-tone=neutral]{color:var(--boe-token-text-text-secondary,#666)} [part=choice-icon] svg{display:block;width:20px;height:20px} [part=choice-label]{display:block} small{display:block;color:var(--boe-token-text-text-secondary,#666)} h3{font:inherit;font-weight:650;margin:12px 0 4px}</style><input part="search" type="search" aria-label="Find a building block" placeholder="Find a building block"><div part="choices"></div>`; }
|
|
71
72
|
setupListeners() {
|
|
73
|
+
this.shadowRoot.querySelector('[part=search]').addEventListener('input', () => this.update());
|
|
72
74
|
this.shadowRoot.addEventListener("keydown", event => {
|
|
73
75
|
const e = event;
|
|
74
76
|
if (this.variant !== "menu")
|
|
@@ -78,6 +80,8 @@ export class KindPicker extends BaseElement {
|
|
|
78
80
|
emit(this, "picker-cancel", {});
|
|
79
81
|
return;
|
|
80
82
|
}
|
|
83
|
+
if (e.target === this.shadowRoot.querySelector('[part=search]') && e.key !== "ArrowDown")
|
|
84
|
+
return;
|
|
81
85
|
const buttons = Array.from(this.shadowRoot.querySelectorAll("button"));
|
|
82
86
|
if (!buttons.length)
|
|
83
87
|
return;
|
|
@@ -92,14 +96,17 @@ export class KindPicker extends BaseElement {
|
|
|
92
96
|
}
|
|
93
97
|
refresh() { if (this.isRendered)
|
|
94
98
|
this.update(); }
|
|
95
|
-
focus(options) { this.shadowRoot?.querySelector("button")?.focus(options); }
|
|
99
|
+
focus(options) { (this.searchable ? this.shadowRoot?.querySelector('[part=search]') : this.shadowRoot?.querySelector("button"))?.focus(options); }
|
|
96
100
|
update() {
|
|
97
101
|
const choices = this.shadowRoot.querySelector("[part=choices]");
|
|
102
|
+
const search = this.shadowRoot.querySelector('[part=search]');
|
|
103
|
+
search.hidden = !this.searchable;
|
|
104
|
+
const query = this.searchable ? search.value.trim().toLowerCase() : '';
|
|
98
105
|
choices.setAttribute("role", this.variant === "menu" ? "menu" : "group");
|
|
99
106
|
choices.setAttribute("aria-label", "Choose a step type");
|
|
100
107
|
choices.replaceChildren();
|
|
101
108
|
let group = "";
|
|
102
|
-
this.catalog.forEach((kind, index) => {
|
|
109
|
+
this.catalog.filter(kind => `${kind.label} ${kind.description} ${kind.group ?? ''} ${kind.aliases?.join(' ') ?? ''}`.toLowerCase().includes(query)).forEach((kind, index) => {
|
|
103
110
|
if (kind.group && group !== kind.group) {
|
|
104
111
|
const heading = document.createElement("h3");
|
|
105
112
|
heading.textContent = kind.group;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { NodePath } from "../flow-builder/model.js";
|
|
2
|
+
import type { ProcessCheck, ProcessLayout, ProcessLoadOptions, ProcessPositionSnapshot, ProcessProjection } from "./model.js";
|
|
3
|
+
/** Restore only current paths with explicitly matching host fingerprints. */
|
|
4
|
+
export declare function restoreProcessPositions<N>(projection: ProcessProjection<N>, positions: ProcessLoadOptions["positions"]): ProcessLayout;
|
|
5
|
+
/** Detached, ID-sorted entries; stale layout IDs and unplaced boxes are omitted. */
|
|
6
|
+
export declare function snapshotProcessPositions<N>(projection: ProcessProjection<N>, layout: ProcessLayout): readonly ProcessPositionSnapshot[];
|
|
7
|
+
/** Resolve a host field path to its deepest projected box, without string coercion. */
|
|
8
|
+
export declare function normalizeProcessSelectionPath<N>(projection: ProcessProjection<N>, path: NodePath | null | undefined): NodePath | null;
|
|
9
|
+
/** Generic topology only. Hosts own workflow vocabulary and semantic validation. */
|
|
10
|
+
export declare function graphChecks<N>(projection: ProcessProjection<N>): readonly ProcessCheck[];
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
const validPosition = (position) => Number.isFinite(position.x) && Number.isFinite(position.y) &&
|
|
2
|
+
(position.width === undefined || (Number.isFinite(position.width) && position.width > 0)) &&
|
|
3
|
+
(position.height === undefined || (Number.isFinite(position.height) && position.height > 0));
|
|
4
|
+
/** Restore only current paths with explicitly matching host fingerprints. */
|
|
5
|
+
export function restoreProcessPositions(projection, positions) {
|
|
6
|
+
const savedPositions = Array.isArray(positions)
|
|
7
|
+
? Object.fromEntries(positions.filter(entry => entry.path).map(entry => [JSON.stringify(entry.path), entry]))
|
|
8
|
+
: positions;
|
|
9
|
+
const boxes = {};
|
|
10
|
+
for (const box of projection.boxes) {
|
|
11
|
+
if (!box.path || box.fingerprint === undefined)
|
|
12
|
+
continue;
|
|
13
|
+
const key = JSON.stringify(box.path);
|
|
14
|
+
const saved = savedPositions && Object.hasOwn(savedPositions, key) ? savedPositions[key] : undefined;
|
|
15
|
+
if (!saved || saved.fingerprint === undefined || saved.fingerprint !== box.fingerprint ||
|
|
16
|
+
!saved.position || !validPosition(saved.position))
|
|
17
|
+
continue;
|
|
18
|
+
Object.defineProperty(boxes, box.id, {
|
|
19
|
+
value: { ...saved.position }, enumerable: true, configurable: true, writable: true,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
return { boxes };
|
|
23
|
+
}
|
|
24
|
+
/** Detached, ID-sorted entries; stale layout IDs and unplaced boxes are omitted. */
|
|
25
|
+
export function snapshotProcessPositions(projection, layout) {
|
|
26
|
+
const snapshots = [];
|
|
27
|
+
for (const box of projection.boxes) {
|
|
28
|
+
if (!Object.hasOwn(layout.boxes, box.id))
|
|
29
|
+
continue;
|
|
30
|
+
const position = layout.boxes[box.id];
|
|
31
|
+
if (!position || !validPosition(position))
|
|
32
|
+
continue;
|
|
33
|
+
snapshots.push({
|
|
34
|
+
id: box.id,
|
|
35
|
+
...(box.path ? { path: [...box.path] } : {}),
|
|
36
|
+
...(box.fingerprint !== undefined ? { fingerprint: box.fingerprint } : {}),
|
|
37
|
+
position: { ...position },
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return snapshots.sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
41
|
+
}
|
|
42
|
+
/** Resolve a host field path to its deepest projected box, without string coercion. */
|
|
43
|
+
export function normalizeProcessSelectionPath(projection, path) {
|
|
44
|
+
if (path == null)
|
|
45
|
+
return null;
|
|
46
|
+
let selected;
|
|
47
|
+
for (const box of projection.boxes) {
|
|
48
|
+
if (box.path && box.path.length <= path.length &&
|
|
49
|
+
box.path.every((segment, index) => segment === path[index]) &&
|
|
50
|
+
(!selected || box.path.length > selected.length))
|
|
51
|
+
selected = box.path;
|
|
52
|
+
}
|
|
53
|
+
return selected ? [...selected] : null;
|
|
54
|
+
}
|
|
55
|
+
const branchKinds = new Set(["decision", "choice", "weighted", "weighted-choice", "parallel", "fork"]);
|
|
56
|
+
const parallelKinds = new Set(["parallel", "fork"]);
|
|
57
|
+
/** Generic topology only. Hosts own workflow vocabulary and semantic validation. */
|
|
58
|
+
export function graphChecks(projection) {
|
|
59
|
+
const boxes = new Map(projection.boxes.map(box => [box.id, box]));
|
|
60
|
+
const outgoing = new Map(projection.boxes.map(box => [box.id, []]));
|
|
61
|
+
const incoming = new Map(projection.boxes.map(box => [box.id, []]));
|
|
62
|
+
for (const line of projection.lines) {
|
|
63
|
+
if (!boxes.has(line.from) || !boxes.has(line.to))
|
|
64
|
+
continue;
|
|
65
|
+
outgoing.get(line.from).push(line.to);
|
|
66
|
+
incoming.get(line.to).push(line.from);
|
|
67
|
+
}
|
|
68
|
+
// Iterative strongly connected components keep long host graphs off the call stack.
|
|
69
|
+
const visited = new Set();
|
|
70
|
+
const finished = [];
|
|
71
|
+
for (const id of boxes.keys()) {
|
|
72
|
+
if (visited.has(id))
|
|
73
|
+
continue;
|
|
74
|
+
visited.add(id);
|
|
75
|
+
const stack = [{ id, next: 0 }];
|
|
76
|
+
while (stack.length) {
|
|
77
|
+
const top = stack[stack.length - 1];
|
|
78
|
+
const targets = outgoing.get(top.id);
|
|
79
|
+
if (top.next < targets.length) {
|
|
80
|
+
const target = targets[top.next++];
|
|
81
|
+
if (!visited.has(target)) {
|
|
82
|
+
visited.add(target);
|
|
83
|
+
stack.push({ id: target, next: 0 });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
finished.push(top.id);
|
|
88
|
+
stack.pop();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
visited.clear();
|
|
93
|
+
const loops = new Set();
|
|
94
|
+
for (const id of finished.reverse()) {
|
|
95
|
+
if (visited.has(id))
|
|
96
|
+
continue;
|
|
97
|
+
const component = [];
|
|
98
|
+
const stack = [id];
|
|
99
|
+
visited.add(id);
|
|
100
|
+
while (stack.length) {
|
|
101
|
+
const current = stack.pop();
|
|
102
|
+
component.push(current);
|
|
103
|
+
for (const source of incoming.get(current)) {
|
|
104
|
+
if (!visited.has(source)) {
|
|
105
|
+
visited.add(source);
|
|
106
|
+
stack.push(source);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (component.length > 1 || outgoing.get(id).includes(id)) {
|
|
111
|
+
for (const member of component)
|
|
112
|
+
loops.add(member);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const reachable = (start) => {
|
|
116
|
+
const distances = new Map([[start, 0]]);
|
|
117
|
+
const queue = [start];
|
|
118
|
+
for (let i = 0; i < queue.length; i++) {
|
|
119
|
+
const id = queue[i];
|
|
120
|
+
for (const target of outgoing.get(id)) {
|
|
121
|
+
if (!distances.has(target)) {
|
|
122
|
+
distances.set(target, distances.get(id) + 1);
|
|
123
|
+
queue.push(target);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return distances;
|
|
128
|
+
};
|
|
129
|
+
const allPathsMeet = (start, join) => {
|
|
130
|
+
const queue = [start];
|
|
131
|
+
const seen = new Set();
|
|
132
|
+
for (let i = 0; i < queue.length; i++) {
|
|
133
|
+
const id = queue[i];
|
|
134
|
+
if (id === join || seen.has(id))
|
|
135
|
+
continue;
|
|
136
|
+
seen.add(id);
|
|
137
|
+
const targets = outgoing.get(id);
|
|
138
|
+
if (!targets.length || loops.has(id))
|
|
139
|
+
return false;
|
|
140
|
+
queue.push(...targets);
|
|
141
|
+
}
|
|
142
|
+
return true;
|
|
143
|
+
};
|
|
144
|
+
const checks = [];
|
|
145
|
+
for (const box of projection.boxes) {
|
|
146
|
+
const add = (message) => checks.push({
|
|
147
|
+
message, boxId: box.id, ...(box.path ? { path: [...box.path] } : {}),
|
|
148
|
+
});
|
|
149
|
+
if (loops.has(box.id))
|
|
150
|
+
add("This box is part of a loop. Remove a connection to break the loop.");
|
|
151
|
+
const targets = outgoing.get(box.id);
|
|
152
|
+
if (targets.length < 2)
|
|
153
|
+
continue;
|
|
154
|
+
if (!branchKinds.has(box.kind)) {
|
|
155
|
+
add("This step leads to multiple places. Use a Decision, Weighted choice or Parallel to branch.");
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
const routes = targets.map(reachable);
|
|
159
|
+
const candidates = [...routes[0].keys()].filter(id => id !== box.id && routes.every(route => route.has(id)));
|
|
160
|
+
candidates.sort((a, b) => Math.max(...routes.map(route => route.get(a))) - Math.max(...routes.map(route => route.get(b))) ||
|
|
161
|
+
(a < b ? -1 : a > b ? 1 : 0));
|
|
162
|
+
const join = candidates.find(id => targets.every(target => allPathsMeet(target, id)));
|
|
163
|
+
if (!join) {
|
|
164
|
+
add(parallelKinds.has(box.kind)
|
|
165
|
+
? "Parallel paths must meet at a Wait for all (join) box."
|
|
166
|
+
: "These branch paths do not meet. Connect every path to a common next box.");
|
|
167
|
+
}
|
|
168
|
+
else if (parallelKinds.has(box.kind) && boxes.get(join).kind !== "join") {
|
|
169
|
+
add("Parallel paths must meet at a Wait for all (join) box.");
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return checks;
|
|
173
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/** Riptide Diagram anatomy expressed through public Box Open Elements tokens. */
|
|
2
|
+
export declare const processModelerDesign = "\n :host([hidden]), [hidden] { display: none !important; }\n *, *::before, *::after { box-sizing: border-box; }\n button, input, textarea, select { font: inherit; color: inherit; }\n button { min-height: 36px; padding: 8px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 8px; background: var(--boe-token-surface-surface, #fff); cursor: pointer; }\n button:disabled { opacity: .5; cursor: default; }\n :is(button,input,textarea,select,[part=canvas],[part=minimap],[part=box],[part=frame]):focus-visible { outline: 2px solid var(--boe-token-surface-surface-brand, #0061d5); outline-offset: 2px; }\n :host {\n display: block;\n min-width: 0;\n --boe-process-box-edge: color-mix(in srgb, var(--boe-token-text-text, #141413) 55%, var(--boe-token-surface-surface, #fff));\n color: var(--boe-token-text-text, #141413);\n background: var(--boe-token-surface-surface, #fff);\n font: 14px/1.5 var(--boe-token-font-family-base, Inter, sans-serif);\n }\n [part=sr-only] { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n [part=toolbar] {\n min-height: 56px;\n margin: 0;\n padding: 8px 16px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n flex-wrap: wrap;\n border-bottom: 1px solid var(--boe-token-stroke-stroke, #e8e8e8);\n background: var(--boe-token-surface-surface, #fff);\n }\n [part=toolbar] button, [part=controls] button, [part=selection-toolbar] button {\n min-height: 30px;\n padding: 4px 10px;\n border: 1px solid transparent;\n border-radius: 8px;\n background: transparent;\n font-size: 13px;\n font-weight: 600;\n }\n [part=toolbar] svg, [part=controls] svg { width: 16px; height: 16px; display: block; }\n [part=toolbar] [data-command=undo], [part=toolbar] [data-command=redo], [part=controls] button:not([data-command=reset]) { width: 30px; height: 30px; padding: 6px; display: grid; place-items: center; }\n [part=controls] [data-command=snap][aria-pressed=true], [part=controls] [data-command=lock][aria-pressed=true] { background: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 10%, var(--boe-token-surface-surface, #fff)); color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=toolbar] button:hover, [part=controls] button:hover, [part=selection-toolbar] button:hover {\n background: var(--boe-token-surface-surface-hover, #f4f4f4);\n }\n [part=toolbar] [data-command=tidy] { border-color: var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 18px; }\n [part=view-switch] { display: flex; gap: 2px; padding: 3px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 20px; }\n [part=view-switch] button { border-radius: 16px; }\n [part=view-switch] button[aria-pressed=true] { border-color: var(--boe-token-stroke-stroke, #e8e8e8); background: var(--boe-token-surface-surface, #fff); }\n [part=run-toggle] { display: flex; align-items: center; gap: 6px; white-space: nowrap; font-size: 13px; font-weight: 600; }\n [part=run-toggle] input { accent-color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=view-menu] { display: none; position: relative; }\n [part=view-menu] summary { list-style: none; padding: 4px 14px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 18px; font-size: 13px; font-weight: 600; cursor: pointer; }\n [part=view-menu][open] { z-index: 20; }\n [part=view-menu-options] { position: absolute; z-index: 20; top: calc(100% + 4px); left: 0; width: 192px; padding: 6px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 10px; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); }\n [part=view-menu] button { display: block; width: 100%; text-align: start; background: transparent; }\n [part=layout] {\n display: grid;\n grid-template-columns: 248px minmax(0, 1fr) 320px;\n gap: 0;\n min-height: 0;\n height: var(--boe-process-height, 660px);\n overflow: hidden;\n }\n [part=pane-drawer] { display: contents; color: inherit; }\n [part=pane-drawer]::backdrop, [part=insert-chooser]::backdrop { background: rgb(0 0 0 / .45); }\n [part=pane-close], [data-command=palette], [data-command=details] { display: none; }\n [part=palette], [part=inspector] {\n min-width: 0;\n overflow: auto;\n padding: 12px;\n border: 0;\n border-radius: 0;\n background: var(--boe-token-surface-surface, #fff);\n }\n [part=palette] { display: flex; flex-direction: column; gap: 12px; border-right: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); }\n [part=skip-link] { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); }\n [part=skip-link]:focus-visible { position: static; width: auto; height: auto; clip-path: none; }\n [part=inspector] { border-left: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); padding: 16px 0; }\n [part=palette] label { font-size: 0; position: relative; }\n [part=search-icon] { position: absolute; left: 12px; top: 9px; width: 18px; height: 18px; color: var(--boe-token-text-text-secondary, #6f6f6f); pointer-events: none; }\n [part=palette] input {\n width: 100%; min-width: 0;\n height: 36px;\n padding: 0 12px 0 36px;\n border: 1px solid transparent;\n border-radius: 24px;\n background: var(--boe-token-surface-surface-hover, #f4f4f4);\n font-size: 13px;\n }\n [part=palette] input:focus-visible { border-color: var(--boe-token-surface-surface-brand, #0061d5); background: var(--boe-token-surface-surface, #fff); }\n [part=choices] { display: grid; align-content: start; gap: 4px; max-height: none; overflow: visible; }\n [part=group] { margin: 4px 4px 6px; font-size: 12px; font-weight: 650; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=choice] {\n display: grid; grid-template-columns: 20px minmax(0,1fr); gap: 0 10px;\n min-height: 44px; padding: 8px 10px; border: 1px solid transparent; border-radius: 10px;\n text-align: start; background: transparent; cursor: grab;\n }\n [part=choice]:hover { border-color: var(--boe-token-stroke-stroke, #e8e8e8); background: var(--boe-token-surface-surface-hover, #f4f4f4); }\n [part=choice-icon] { grid-row: span 2; width: 20px; height: 20px; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=choice][data-tone=accent] [part=choice-icon] { color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=choice-icon] svg { width: 20px; height: 20px; }\n [part=choice-name] { font-size: 13px; font-weight: 600; line-height: 1.3; }\n [part=choice-description] { grid-column: 2; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12px; line-height: 1.35; }\n [part=palette-hint] { margin: 4px; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12px; line-height: 1.45; }\n [part=canvas] {\n position: relative; min-width: 0; height: 100%; overflow: hidden;\n border: 0; border-radius: 0;\n background-color: var(--boe-token-surface-surface-secondary, #fbfbfb);\n background-image: radial-gradient(circle, var(--boe-token-stroke-stroke-hover, #d3d3d3) 1px, transparent 1.2px);\n background-size: 12px 12px;\n touch-action: none; user-select: none; cursor: grab;\n }\n [part=canvas][data-panning] { cursor: grabbing; }\n [part=hold] { position: absolute; z-index: 12; top: 12px; left: 50%; translate: -50% 0; display: flex; align-items: center; gap: 12px; max-width: calc(100% - 24px); padding: 8px 12px; border: 1px solid var(--boe-token-stroke-status-stroke-warning, #9a6b00); border-radius: 8px; background: var(--boe-token-surface-status-surface-warning, #fff7df); color: var(--boe-token-text-status-text-warning, #6b4a00); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); font-size: 12.5px; cursor: default; }\n [part=hold] button { min-height: 28px; padding: 3px 8px; border: 1px solid currentColor; border-radius: 6px; background: transparent; font-size: 12px; font-weight: 650; white-space: nowrap; }\n [part=world] { position: absolute; inset: 0; transform-origin: 0 0; }\n [part=lines] { position: absolute; inset: 0; width: 1px; height: 1px; overflow: visible; pointer-events: none; z-index: 3; }\n [part=line] { stroke: var(--boe-token-text-text-secondary, #6f6f6f); stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; fill: none; }\n [part=line][data-selected=true] { stroke: var(--boe-token-surface-surface-brand, #0061d5); stroke-width: 2; }\n [part=line][data-drop=true] { stroke: var(--boe-token-surface-surface-brand, #0061d5); stroke-width: 2.5; stroke-dasharray: 6 4; }\n [part=line-hit] { fill: none; stroke: transparent; stroke-width: 24; pointer-events: stroke; }\n [part=connection-preview] { fill: none; stroke: var(--boe-token-surface-surface-brand, #0061d5); stroke-width: 2.5; stroke-dasharray: 6 4; }\n [part=pinned-end] { fill: var(--boe-token-surface-surface-brand, #0061d5); pointer-events: none; }\n [part=box], [part=frame] {\n position: absolute; touch-action: none; text-align: start; z-index: 4; display: grid; grid-template-columns: 20px minmax(0,1fr); align-content: center;\n gap: 2px 10px; min-width: 0; min-height: 64px; padding: 11px 12px;\n border: 1px solid var(--boe-process-box-edge, var(--boe-control-edge, #858585));\n border-radius: 8px; background: var(--boe-token-surface-surface, #fff);\n font-size: 13px; line-height: 1.3;\n transition: border-color var(--boe-profile-motion-interactive, 200ms) ease-out,\n background var(--boe-profile-motion-interactive, 200ms) ease-out;\n }\n [part=box]:hover, [part=frame]:hover { border-color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [data-connect-target=true] { border-color: var(--boe-token-surface-surface-brand, #0061d5) !important; }\n [part=box] strong, [part=frame] strong { overflow-wrap: anywhere; }\n [part=box] strong, [part=frame] strong { font-size: 13.5px; font-weight: 650; line-height: 1.3; }\n [part=box] small, [part=frame] small { grid-column: 2; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; line-height: 1.35; }\n [part=technical-description] { font: 12px/1.4 ui-monospace, 'SF Mono', Menlo, Consolas, monospace !important; overflow-wrap: anywhere; }\n [part=metrics] { grid-column: 2; font-size: 12px; font-variant-numeric: tabular-nums; }\n [part=metric-warning] { color: var(--boe-token-text-status-text-warning, #8a5800); }\n [part=icon] { grid-row: span 3; width: 20px; height: 20px; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=icon] svg { display: block; width: 20px; height: 20px; }\n [data-tone=accent] > [part=icon] { color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=box][aria-current=true], [part=frame][aria-current=true] {\n border: 1px solid var(--boe-token-surface-surface-brand, #0061d5);\n background: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 7%, var(--boe-token-surface-surface, #fff));\n }\n [data-invalid=true] { border-color: var(--boe-token-text-status-text-error, #b92340) !important; }\n [part=problem] { grid-column: 1 / -1; color: var(--boe-token-text-status-text-error, #b92340); font-size: 12px; }\n [part=frame] { z-index: 1; align-content: start; border-radius: 12px; background: color-mix(in srgb, var(--boe-token-surface-surface, #fff) 78%, transparent); }\n [part=frame] small { grid-column: 2; }\n [part=loop-mark] { position: absolute; right: 12px; bottom: 8px; font-size: 20px; line-height: 1; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=frame-resize] { position: absolute; right: -12px; bottom: -12px; z-index: 8; width: 28px; height: 28px; min-height: 28px; padding: 0; border: 0; border-radius: 8px; background: var(--boe-token-surface-surface, #fff); box-shadow: 0 0 0 1px var(--boe-process-box-edge, #858585); cursor: nwse-resize; }\n [part=frame-resize]::before { content: ''; position: absolute; right: 7px; bottom: 7px; width: 11px; height: 11px; border-right: 2px solid var(--boe-token-text-text-secondary, #6f6f6f); border-bottom: 2px solid var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=frame]:not([aria-current=true]) [part=frame-resize] { visibility: hidden; }\n [data-shape=gateway], [data-shape=event] { width: 56px !important; height: 56px !important; min-height: 0; padding: 0; border: 0 !important; background: transparent !important; display: block; overflow: visible; }\n [data-shape=gateway]::before { content: ''; position: absolute; left: 8px; top: 8px; width: 40px; height: 40px; rotate: 45deg; border: 1.5px solid var(--boe-process-box-edge, var(--boe-control-edge, #858585)); border-radius: 8px; background: var(--boe-token-surface-surface, #fff); }\n [data-shape=event]::before { content: ''; position: absolute; left: 8px; top: 8px; width: 40px; height: 40px; border: 1.5px solid var(--boe-process-box-edge, var(--boe-control-edge, #858585)); border-radius: 50%; background: var(--boe-token-surface-surface, #fff); }\n [data-shape=event][data-kind=finish]::before { border-width: 4px; }\n [data-shape=event][data-kind=scheduled-start]::after { content: ''; position: absolute; left: 13px; top: 13px; width: 30px; height: 30px; border: 1px solid currentColor; border-radius: 50%; }\n [data-shape=gateway] > [part=icon], [data-shape=event] > [part=icon] { position: absolute; left: 18px; top: 18px; z-index: 1; }\n [data-shape=gateway] > strong, [data-shape=event] > strong { position: absolute; top: 58px; left: 50%; width: 150px; translate: -50% 0; text-align: center; font-size: 12px; }\n [data-shape=gateway] > small { display: none; }\n [data-shape=event] > small { position: absolute; top: 75px; left: 50%; width: 172px; translate: -50% 0; text-align: center; font-size: 11px; line-height: 1.25; }\n [data-shape=gateway][aria-current=true]::before, [data-shape=event][aria-current=true]::before { border-color: var(--boe-token-surface-surface-brand, #0061d5); background: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 7%, var(--boe-token-surface-surface, #fff)); }\n [part=port] { position: absolute; z-index: 5; width: 24px; height: 24px; min-height: 24px; padding: 0; border: 0; border-radius: 50%; background: transparent; opacity: 0; }\n [part=port][data-side=north] { left: calc(50% - 12px); top: -12px; }\n [part=port][data-side=south] { left: calc(50% - 12px); bottom: -12px; }\n [part=port][data-side=east] { right: -12px; top: calc(50% - 12px); }\n [part=port][data-side=west] { left: -12px; top: calc(50% - 12px); }\n [part=port]::before { content: ''; display: block; width: 10px; height: 10px; margin: 7px; border: 1.5px solid var(--boe-token-surface-surface-brand, #0061d5); border-radius: 50%; background: var(--boe-token-surface-surface, #fff); }\n [part=port]:hover::before, [part=port]:focus-visible::before { width: 22px; height: 22px; margin: 1px; background: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=port]::after { position: absolute; inset: 1px; display: none; place-items: center; color: #fff; font-size: 15px; font-weight: 700; line-height: 1; }\n [part=port][data-side=north]::after { content: '\u2191'; }\n [part=port][data-side=east]::after { content: '\u2192'; }\n [part=port][data-side=south]::after { content: '\u2193'; }\n [part=port][data-side=west]::after { content: '\u2190'; }\n [part=port]:hover::after, [part=port]:focus-visible::after, [part=port][data-hot=true]::after { display: grid; }\n [part=port][data-hot=true] { opacity: 1; }\n [part=port][data-hot=true]::before { width: 22px; height: 22px; margin: 1px; background: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=end-grip] { position: absolute; z-index: 8; width: 24px; height: 24px; min-height: 24px; padding: 0; border: 0; border-radius: 50%; background: transparent; }\n [part=end-grip]::before { content: ''; display: block; width: 10px; height: 10px; margin: 7px; border: 1.5px solid var(--boe-token-surface-surface-brand, #0061d5); border-radius: 50%; background: var(--boe-token-surface-surface, #fff); }\n [part=box]:hover [part=port], [part=box]:focus-within [part=port], [part=box][aria-current=true] [part=port], [part=frame]:hover [part=port] { opacity: 1; }\n [part=connection] { position: absolute; z-index: 5; display: flex; align-items: center; gap: 4px; transform: translate(-50%,-50%); min-width: 0; min-height: 0; padding: 2px 6px; border-radius: 6px; background: var(--boe-token-surface-surface-secondary, #fbfbfb); font-size: 12px; font-weight: 600; white-space: nowrap; }\n [part=connection]:has(> span:empty) { padding: 0; background: transparent; min-width: 0; min-height: 0; }\n [part=connection-actions] { position: absolute; top: 100%; left: 50%; transform: translateX(-50%); display: flex; gap: 4px; width: max-content; padding: 4px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 8px; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); opacity: 0; pointer-events: none; }\n [part=connection]:hover [part=connection-actions], [part=connection]:focus-within [part=connection-actions] { opacity: 1; pointer-events: auto; }\n [part=connection-actions] button { min-height: 32px; padding: 4px; font-size: 12px; }\n [part=note] { width: 208px; border: 1px dashed var(--boe-process-box-edge, var(--boe-control-edge, #858585)); border-radius: 8px; }\n [part=section] { z-index: 0; border: 1px solid var(--boe-process-box-edge, var(--boe-control-edge, #858585)); border-radius: 16px; background: color-mix(in srgb, var(--boe-token-surface-surface, #fff) 45%, transparent); }\n [part=section] strong { display: block; font-size: 12.5px; font-weight: 650; line-height: 1.3; }\n [part=section] small { display: block; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 11.5px; line-height: 1.35; }\n [part=note], [part=section] { position: absolute; padding: 8px; pointer-events: none; }\n [part=marquee] { position: absolute; border: 2px solid var(--boe-token-surface-surface-brand, #0061d5); background: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 12%, transparent); pointer-events: none; }\n [part=connect-tooltip] { position: absolute; z-index: 20; max-width: 240px; padding: 5px 8px; border-radius: 7px; background: var(--boe-token-text-text, #141413); color: var(--boe-token-surface-surface, #fff); font-size: 12px; pointer-events: none; box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); }\n [part=connect-tooltip][data-invalid=true] { background: var(--boe-token-text-status-text-error, #b92340); color: #fff; }\n [part=ghost-box], [part=palette-ghost] { position: absolute; z-index: 5; display: flex; align-items: center; padding: 11px 12px; border: 1.5px dashed var(--boe-token-surface-surface-brand, #0061d5); border-radius: 8px; background: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 10%, var(--boe-token-surface-surface, #fff)); font-size: 13px; font-weight: 650; pointer-events: none; }\n [part=guide] { position: absolute; background: var(--boe-token-surface-surface-brand, #0061d5); pointer-events: none; }\n [part=measure] { position: absolute; padding: 4px; background: var(--boe-token-surface-surface, #fff); font-size: 12px; pointer-events: none; }\n [part=insert-chooser] { max-width: calc(100vw - 32px); max-height: 65vh; overflow: auto; padding: 12px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface, #fff); }\n [part=controls] { position: absolute; left: 16px; bottom: 16px; z-index: 10; display: flex; align-items: center; gap: 2px; padding: 4px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); }\n [part=controls] [data-command=reset] { min-width: 56px; font-variant-numeric: tabular-nums; }\n [part=minimap] { position: absolute; right: 16px; bottom: 16px; width: 208px; height: 136px; touch-action: none; background: var(--boe-token-surface-surface, #fff); border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); }\n [part=minimap] rect:not([data-viewport]) { fill: var(--boe-token-stroke-stroke-hover, #d3d3d3); }\n [part=minimap] [data-viewport] { fill: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 9%, transparent); stroke: var(--boe-token-surface-surface-brand, #0061d5); stroke-width: 1; }\n [part=selection-toolbar] { position: absolute; bottom: auto; z-index: 11; display: flex; flex-wrap: nowrap; gap: 2px; padding: 4px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); white-space: nowrap; }\n [part=checks] { display: grid; gap: 6px; margin-top: 12px; }\n [part=checks] button { color: var(--boe-token-text-status-text-error, #b92340); }\n [part=process-heading] { display: grid; gap: 2px; padding: 0 16px 12px; }\n :host([embed-mode]) [part=process-heading], :host([embed-mode]) [part=view-switch], :host([embed-mode]) [part=run-toggle], :host([embed-mode]) [part=view-menu] { display: none; }\n [part=process-title] { font-size: 15px; line-height: 1.4; }\n [part=process-summary] { color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; }\n [part=pane-tabs] { display: flex; flex-wrap: nowrap; gap: 4px; margin: 0; padding: 0 16px; border-bottom: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); overflow-x: auto; }\n [part=pane-tabs] button { flex: none; min-height: 40px; border: 0; border-bottom: 2px solid transparent; border-radius: 0; background: transparent; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 13px; font-weight: 600; }\n [part=pane-tabs] button[aria-selected=true] { color: var(--boe-token-text-text, #141413); border-bottom-color: currentColor; }\n [part=editor], [part=pane-content] { padding: 8px 16px; }\n [part=editor] { display: grid; align-content: start; gap: 12px; }\n [part=inspector-kind] { display: none; }\n [part=inspector-purpose] { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; }\n [part=field] { display: grid; gap: 4px; }\n [part=field] label { display: grid; gap: 5px; font-size: 12.5px; font-weight: 650; }\n [part=field] :is(input:not([type=checkbox]),textarea,select) { width: 100%; min-height: 36px; padding: 7px 10px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 8px; background: var(--boe-token-surface-surface, #fff); color: var(--boe-token-text-text, #141413); font-family: inherit; font-size: 13px; line-height: 1.4; }\n [part=field] textarea { min-height: 76px; resize: vertical; }\n [part=field]:has([part=action-options]) { position: relative; }\n [part=field]:has([part=action-options]) input { padding-right: 34px; }\n [part=action-caret] { position: absolute; z-index: 1; top: 25px; right: 2px; width: 32px; min-height: 32px; padding: 0; border: 0; background: transparent; font-size: 18px; }\n [part=action-options] { position: absolute; z-index: 30; top: calc(100% - 1px); left: 0; right: 0; max-height: 280px; overflow: auto; padding: 6px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 10px; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); }\n [part=action-options][hidden] { display: none; }\n [part=action-options] button { display: block; width: 100%; min-height: 36px; padding: 7px 9px; border: 0; border-radius: 7px; text-align: start; background: transparent; font-size: 12.5px; }\n [part=action-options] button:hover, [part=action-options] [aria-selected=true] { background: var(--boe-token-surface-surface-hover, #f4f4f4); }\n [part=action-options] button strong { display: block; font-size: 13px; font-weight: 650; }\n [part=action-options] button small { display: block; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=action-options] [part=action-back] { color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=field] input[type=checkbox] { justify-self: start; width: 18px; height: 18px; accent-color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=field] small { color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12px; line-height: 1.4; }\n [part=field] [part=field-problem] { color: var(--boe-token-text-status-text-error, #b92340); }\n [part=variable-chips] { display: flex; flex-wrap: wrap; gap: 4px; }\n [part=variable-chips] button { min-height: 24px; padding: 2px 8px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface-secondary, #fbfbfb); font-size: 11.5px; }\n [part=leads-to] { display: grid; gap: 6px; padding-top: 10px; border-top: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); }\n [part=leads-to] h3 { margin: 0; font-size: 12.5px; }\n [part=lead-row] { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12.5px; }\n [part=lead-row] button, [part=leads-to] > button, [part=inspector-actions] button { min-height: 28px; padding: 4px 8px; font-size: 12px; }\n [part=inspector-metrics] { margin: 0; padding-top: 10px; border-top: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); font-size: 12px; font-variant-numeric: tabular-nums; }\n [part=inspector-metrics] h3 { margin: 0 0 6px; font-size: 12.5px; }\n [part=inspector-metrics] dl { display: grid; grid-template-columns: 1fr auto; gap: 4px 8px; margin: 0; }\n [part=inspector-metrics] dt { color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=inspector-metrics] dd { margin: 0; font-weight: 650; }\n [part=inspector-actions] { display: flex; gap: 8px; padding-top: 10px; border-top: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); }\n [part=arrange-actions] { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 6px; }\n [part=arrange-actions] button { min-height: 32px; padding: 5px 7px; font-size: 12px; text-align: start; }\n [part=outline-intro] { margin: 4px 0 14px; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; line-height: 1.5; }\n [part=copy-outline] { justify-self: start; min-height: 28px; margin-bottom: 8px; padding: 4px 10px; border-radius: 16px; font-size: 12px; font-weight: 650; }\n [part=outline-list] { margin: 0; padding-left: 18px; display: grid; gap: 8px; }\n [part=outline-list] [part=outline-list] { margin: 6px 0 0; gap: 6px; }\n [part=outline-list] li { padding-left: 0; font-size: 12.5px; }\n [part=outline-list] li::marker { color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=outline-list] button, [part=outline-list] strong { border: 0; border-radius: 4px; background: transparent; padding: 0; min-height: 0; font-size: 12.5px; font-weight: 650; line-height: 1.45; text-align: start; }\n [part=outline-list] button:hover { color: var(--boe-token-surface-surface-brand, #0061d5); text-decoration: underline; }\n [part=outline-list] button[aria-current=true] { color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=outline-list] p { margin: 2px 0 0; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12px; line-height: 1.45; }\n [part=inspector-heading] { margin: 0 0 2px; font-size: 15px; font-weight: 650; }\n [part=inspector-heading][data-single=true]:not(:focus-visible) { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n [part=checks] { margin: 0; padding: 0; }\n [part=checks] button { width: 100%; border: 0; border-bottom: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 0; text-align: start; background: transparent; }\n [part=variable-row], [part=connection-row] { display: grid; gap: 4px; padding: 10px 0; border-bottom: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); font-size: 12.5px; }\n [part=variable-row] p { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=variable-scope] { color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 11.5px; }\n [part=variable-row] label { display: grid; gap: 4px; font-weight: 650; }\n [part=variable-row] input { min-height: 36px; padding: 7px 10px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 8px; background: var(--boe-token-surface-surface, #fff); }\n [part=help] { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }\n :host([data-narrow]) [part=layout] { grid-template-columns: minmax(0,1fr); }\n :host([data-narrow]) [part=pane-drawer] { display: none; position: fixed; z-index: 40; margin: 0; max-width: none; max-height: none; padding: 0; overflow: auto; border: 0; border-radius: 0; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .24)); }\n :host([data-narrow]) [part=pane-drawer][open] { display: block; }\n :host([data-narrow]) [part=pane-close], :host([data-narrow]) [data-command=palette], :host([data-narrow]) [data-command=details] { display: inline-block; }\n :host([data-narrow]) [part=pane-close] { position: absolute; top: 12px; right: 12px; z-index: 1; min-height: 28px; padding: 4px 9px; border-radius: 14px; font-size: 12px; }\n :host([data-narrow]) [part=pane-drawer][data-pane=palette] { left: 0; top: 0; bottom: 0; width: min(320px, 86vw); }\n :host([data-narrow]) [part=pane-drawer][data-pane=inspector] { left: 0; right: 0; top: auto; bottom: 0; width: 100%; height: min(62vh, 560px); border-radius: 24px 24px 0 0; }\n :host([data-narrow]) [part=pane-drawer][data-pane=inspector]::before { content: ''; display: block; width: 36px; height: 4px; margin: 6px auto; border-radius: 2px; background: var(--boe-token-surface-surface-secondary, #e8e8e8); }\n :host([data-narrow]) [part=palette], :host([data-narrow]) [part=inspector] { height: 100%; }\n :host([data-narrow]) [part=palette] { padding-top: 54px; }\n :host([data-narrow]) [part=minimap] { display: none; }\n :host([data-narrow]) [part=toolbar] { justify-content: flex-start; }\n :host([data-narrow]) [part=view-switch], :host([data-narrow]) [part=run-toggle] { display: none; }\n :host([data-narrow]) [part=view-menu] { display: block; }\n :host([data-narrow]) [part=controls] { left: 12px; bottom: 12px; }\n :host([data-phone]) [data-command=tidy] { display: none; }\n @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0s !important; animation-duration: 0s !important; scroll-behavior: auto !important; } }\n";
|