@unofficialbox/box-open-elements 0.33.0 → 0.34.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 CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  Browse the full catalog on the **[live docs site](https://unofficialbox.github.io/box-open-elements)** — live previews, an events/properties inspector, per-framework code snippets (React / Angular / Vue / Svelte / HTML), and the foundations pages.
14
14
 
15
- The library is organized around three layers (see [taxonomy](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/taxonomy.md) for the canonical model):
15
+ The library is organized around three layers (see [taxonomy](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/taxonomy.md) for the canonical model):
16
16
 
17
17
  - **Foundations** — design decisions as data: tokens, color, typography, iconography, accessibility, theming
18
18
  - **Components** — accessible Web Components for single controls, organized by category
@@ -77,7 +77,7 @@ selection.toggleSelection("1");
77
77
  - optimized component entrypoints: `@unofficialbox/box-open-elements/<name>`
78
78
  - patterns: `@unofficialbox/box-open-elements/patterns/<area>` and `@unofficialbox/box-open-elements/patterns/<area>/<module>`
79
79
 
80
- See the versioned [API guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/api-guidelines.md).
80
+ See the versioned [API guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/api-guidelines.md).
81
81
 
82
82
  ## Developing
83
83
 
@@ -91,17 +91,17 @@ bun run docs # build + serve the docs site at http://localhost:4600
91
91
 
92
92
  ## Documentation
93
93
 
94
- The versioned docs index is at [docs/README.md](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/README.md). The most important entries:
95
-
96
- - [Taxonomy](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/taxonomy.md)
97
- - [Architecture](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/architecture.md)
98
- - [API Guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/api-guidelines.md)
99
- - [Components catalog](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/components/catalog.md) and [patterns catalog](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/patterns/catalog.md)
100
- - [Using with React, Angular, Vue, and Svelte](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/integration/frameworks.md)
101
- - [Design Tokens](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/foundations/tokens.md)
102
- - [Content Explorer](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/patterns/content-explorer.md)
103
- - [Box Server Integration](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/integration/box-server.md)
104
- - [Agent UI guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/patterns/agent-ui-guidelines.md), [building blocks](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/patterns/agent-ui.md), and [motion](https://github.com/unofficialbox/box-open-elements/blob/v0.33.0/docs/foundations/motion.md)
94
+ The versioned docs index is at [docs/README.md](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/README.md). The most important entries:
95
+
96
+ - [Taxonomy](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/taxonomy.md)
97
+ - [Architecture](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/architecture.md)
98
+ - [API Guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/api-guidelines.md)
99
+ - [Components catalog](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/components/catalog.md) and [patterns catalog](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/patterns/catalog.md)
100
+ - [Using with React, Angular, Vue, and Svelte](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/integration/frameworks.md)
101
+ - [Design Tokens](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/foundations/tokens.md)
102
+ - [Content Explorer](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/patterns/content-explorer.md)
103
+ - [Box Server Integration](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/integration/box-server.md)
104
+ - [Agent UI guidelines](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/patterns/agent-ui-guidelines.md), [building blocks](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/patterns/agent-ui.md), and [motion](https://github.com/unofficialbox/box-open-elements/blob/v0.34.0/docs/foundations/motion.md)
105
105
 
106
106
  ## Contributing
107
107
 
@@ -1,2 +1,2 @@
1
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 position: relative;\n isolation: isolate;\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], [part=status], [part=urgent-status] { 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: 8px; white-space: nowrap; font-size: 13px; font-weight: 600; cursor: pointer; }\n [part=run-toggle] input { appearance: none; position: relative; width: 32px; height: 18px; margin: 0; border: 0; border-radius: 9px; background: var(--boe-token-surface-surface-hover, #f4f4f4); cursor: pointer; transition: background var(--boe-profile-motion-interactive, 200ms) ease-out; }\n [part=run-toggle] input::after { content: ''; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: var(--boe-token-surface-surface, #fff); box-shadow: 0 1px 2px rgb(0 0 0 / .25); transition: transform var(--boe-profile-motion-interactive, 200ms) ease-out; }\n [part=run-toggle] input:checked { background: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=run-toggle] input:checked::after { transform: translateX(14px); }\n [part=run-toggle] input:focus-visible { outline: 2px solid var(--boe-token-surface-surface-brand, #0061d5); outline-offset: 2px; }\n [part=toolbar] [data-command=checks-status] { white-space: nowrap; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=toolbar] [data-command=checks-status][data-state=bad] { color: var(--boe-token-text-status-text-error, #b92340); }\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=canvas-stack] { display: grid; grid-template-rows: auto minmax(0, 1fr); min-width: 0; min-height: 0; }\n /* The hidden hold leaves row 1 empty. Keep the canvas in the flexible row\n explicitly; auto-placement otherwise puts its absolute world in a 0px row. */\n [part=canvas-stack] > [part=hold] { grid-row: 1; }\n [part=canvas-stack] > [part=canvas] { grid-row: 2; }\n [part=insert-chooser]::backdrop { background: rgb(0 0 0 / .45); }\n [part=pane-scrim] { position: absolute; inset: 0; z-index: 30; background: rgb(0 0 0 / .45); }\n [part=pane-title], [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=palette-heading] { margin: 0 4px; font-size: 14px; font-weight: 650; line-height: 20px; }\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; line-height: 1.45; 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; touch-action: none;\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.45; }\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, color-mix(in srgb, var(--boe-token-text-text-secondary, #6f6f6f) 26%, transparent) 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] { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; padding: 10px 16px; border-bottom: 1px solid color-mix(in srgb, var(--boe-token-text-status-text-warning, #9a6b00) 45%, var(--boe-token-stroke-stroke, #e8e8e8)); background: color-mix(in srgb, var(--boe-token-surface-status-surface-inprogress, #ffc447) 14%, var(--boe-token-surface-surface, #fff)); color: var(--boe-token-text-status-text-warning, #6b4a00); font-size: 13px; }\n [part=hold-text] { flex: 1 1 280px; min-width: 0; }\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][data-shape=task] { align-content: normal; font-size: 14px; line-height: 1.45; }\n [part=box][data-shape=task] > [part=icon] { grid-row: span 4; margin-top: 1px; }\n [part=box]:hover, [part=frame]:hover { border-color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [data-connect-target=true][data-connect-invalid=true] { border-color: var(--boe-token-text-status-text-error, #b92340) !important; }\n [part=connection-preview][data-invalid=true] { stroke: var(--boe-token-text-status-text-error, #b92340); }\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; display: flex; gap: 6px; flex-wrap: wrap; margin-top: 3px; font-size: 12px; line-height: 1.45; font-variant-numeric: tabular-nums; }\n [part=metrics][data-state=unmeasured] { color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=metric-separator] { color: var(--boe-token-text-text-tertiary, #767676); }\n [part=technical-summary] { overflow-wrap: anywhere; }\n [part=technical-inline-code] { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; }\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][data-palette-drop=true] { border-color: var(--boe-token-surface-surface-brand, #0061d5); box-shadow: 0 0 0 2px color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 18%, transparent); }\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 [part=caption] { position: absolute; left: 50%; translate: -50% 0; width: max-content; max-width: 168px; padding: 1px 4px; border-radius: 4px; text-align: center; background: color-mix(in srgb, var(--boe-token-surface-surface-hover, #f4f4f4) 88%, transparent); }\n [part=caption][data-side=below] { top: 60px; }\n [part=caption][data-side=above] { bottom: 60px; }\n [part=caption] strong { font-size: 12.5px; font-weight: 600; line-height: 1.3; }\n [part=caption] small { display: block; font-weight: 400; }\n [part=caption] [part=technical-description] { font: 10.5px ui-monospace, 'SF Mono', Menlo, Consolas, monospace !important; white-space: nowrap; }\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 [part=event-details] { position: absolute; top: 75px; left: 50%; width: 172px; translate: -50% 0; text-align: center; }\n [part=event-details] small { display: block; 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 /* Unlabelled lines still need a reachable midpoint for pointer insert/selection. */\n [part=connection]:has(> span:empty):not(:has(> small)) { padding: 0; background: transparent; min-width: var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1))); min-height: var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1))); }\n [part=connection] > small { margin-left: 4px; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 11px; font-weight: 400; font-variant-numeric: tabular-nums; }\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-width: max(24px, var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1)))); min-height: max(32px, var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1)))); 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] { pointer-events: auto !important; }\n [part=note][data-selected=true] { outline: 2px solid var(--boe-process-line-selected, var(--boe-brand-fill, #1976d2)); }\n [part=note]:focus-visible { outline: 2px solid var(--boe-focus-ring, #1976d2); outline-offset: 3px; }\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=palette-ghost][data-pointer] { position: fixed; z-index: 100; padding: 8px 12px; border: 1px solid var(--boe-token-surface-surface-brand, #0061d5); border-radius: 10px; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-token-elevation-overlay, 0 8px 24px #0002); font-size: 13px; font-weight: 600; line-height: 1.45; gap: 8px; translate: -50% -50%; }\n [part=palette-ghost][data-pointer] svg { width: 20px; height: 20px; }\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=keyboard-chooser] { position: fixed; inset: auto; width: min(320px, calc(100vw - 24px)); max-height: min(420px, calc(100dvh - 24px)); margin: 0; overflow: auto; padding: 12px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface, #fff); color: var(--boe-token-text-text, #141413); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); }\n [part=chooser-title] { margin: 0 0 10px; font-size: 12px; font-weight: 650; line-height: 1.4; color: var(--boe-token-text-text-secondary, #6f6f6f); }\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] button:not([data-command=reset]) { width: 32px; padding: 0; }\n [part=controls-divider] { width: 1px; height: 20px; margin: 0 4px; background: var(--boe-token-stroke-stroke, #e8e8e8); }\n [part=controls] [data-command=reset] { min-width: 56px; padding: 0 6px; 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: color-mix(in srgb, var(--boe-token-text-text-secondary, #6f6f6f) 35%, transparent); }\n [part=minimap] rect[data-selected=true] { fill: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=minimap] rect[data-section] { fill: color-mix(in srgb, var(--boe-token-text-text-secondary, #6f6f6f) 8%, transparent); }\n [part=minimap] [data-viewport] { fill: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 8%, transparent); stroke: var(--boe-token-surface-surface-brand, #0061d5); stroke-width: 1.5; vector-effect: non-scaling-stroke; }\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=selection-toolbar] button { display: inline-flex; align-items: center; gap: 4px; }\n [part=selection-plus] { font-size: 18px; line-height: 12px; font-weight: 500; }\n [part=checks] { display: grid; gap: 6px; margin: 0; padding: 0; }\n [part=checks] button { width: 100%; display: grid; grid-template-columns: 16px 1fr; align-items: start; gap: 8px; padding: 8px 10px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 10px; text-align: start; background: var(--boe-token-surface-surface, #fff); color: var(--boe-token-text-text, #222); line-height: 1.45; }\n [part=check-icon] { flex: 0 0 16px; width: 16px; height: 16px; margin-top: 1px; color: var(--boe-token-text-status-text-error, #b92340); }\n [part=checks] strong { display: block; font-size: 13px; font-weight: 600; line-height: 1.45; }\n [part=checks] small { color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; }\n [part=check-icon][data-tone=success] { color: var(--boe-token-text-status-text-success, #138a58); }\n [part=problem] { display: flex; align-items: center; gap: 4px; }\n [part=problem] [part=check-icon] { flex-basis: 12px; width: 12px; height: 12px; margin: 0; }\n [part=checks-ready] { display: flex; align-items: center; gap: 8px; margin: 0; color: var(--boe-token-text-text, #222); font-size: 13px; line-height: 1.45; }\n [part=process-heading] { display: grid; gap: 2px; padding: 0 16px 12px; }\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=editor], [part=pane-content], [part=editor] > *, [part=pane-content] > * { min-width: 0; }\n [part=process-title], [part=process-summary] { min-width: 0; overflow-wrap: anywhere; }\n :is([part=local-variable-summary],[part=saved-result-summary]) :is(ul,li) { min-width: 0; max-width: 100%; }\n [part=pane-content][data-pane=Variables] { display: grid; align-content: start; gap: 14px; }\n [part=variables-intro], [part=variable-list] > p { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--boe-token-text-text-secondary,#6f6f6f); }\n [part=variable-scopes] { display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; margin: 0; font-size: 12.5px; line-height: 1.45; }\n [part=variable-scopes] dt { font-weight: 650; }\n [part=variable-scopes] dd { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n :is([part=local-variable-summary],[part=saved-result-summary],[part=local-variables]) { font-size: 12.5px; line-height: 1.45; }\n :is([part=local-variable-summary],[part=saved-result-summary],[part=local-variables]) h3 { margin: 0 0 6px; font-size: 12.5px; line-height: 1.45; font-weight: 650; }\n :is([part=local-variable-summary],[part=saved-result-summary],[part=local-variables]) p { margin: 0; line-height: 1.5; color: var(--boe-token-text-text-secondary,#6f6f6f); }\n :is([part=local-variable-summary],[part=saved-result-summary]) ul { list-style: none; display: grid; gap: 4px; margin: 0; padding: 0; }\n :is([part=local-variable-summary],[part=saved-result-summary]) li { display: flex; align-items: center; gap: 8px; padding: 4px 4px 4px 10px; border: 1px solid var(--boe-token-stroke-stroke,#e8e8e8); border-radius: 10px; background: var(--boe-token-surface-surface-secondary,#fbfbfb); font-size: 13px; line-height: 1.45; }\n :is([part=local-variable-summary],[part=saved-result-summary]) li > span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n :is([part=local-variable-summary],[part=saved-result-summary]) code { font-family: monospace; font-size: 13px; }\n :is([part=local-variable-summary],[part=saved-result-summary]) em { font-style: normal; color: var(--boe-token-text-text-secondary,#6f6f6f); }\n [part=local-variable-list], [part=variable-list] { display: grid; gap: 10px; }\n [part=local-variable-row] { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr) 32px; gap: 6px; align-items: center; }\n [part=local-variable-row] [part=field-problem] { grid-column: 1 / -1; color: var(--boe-token-text-status-text-error, #b92340); font-size: 12px; }\n [part=local-variables] label { display: block; min-width: 0; }\n [part=local-variables] input { width: 100%; min-width: 0; min-height: 32px; padding: 5px 10px; border: 1px solid var(--boe-token-surface-surface-quaternary,#d3d3d3); border-radius: 10px; background: var(--boe-token-surface-surface,#fff); color: var(--boe-token-text-text,#141413); font: 12.5px/1.45 var(--boe-token-font-family-base,Inter,sans-serif); }\n [part=local-variables] input:focus-visible { outline-offset: 1px; }\n [part=local-variable-actions], [part=variable-actions] { display: flex; gap: 8px; flex-wrap: wrap; padding-top: 4px; }\n [part=variable-icon] { flex: 0 0 16px; width: 16px; height: 16px; color: var(--boe-token-text-text-secondary,#6f6f6f); }\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; font-size: 12.5px; line-height: 1.5; font-variant-numeric: tabular-nums; }\n [part=inspector-metrics] h3 { margin: 0 0 6px; font-size: 12.5px; }\n [part=inspector-metrics] p { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=inspector-metrics] table { width: 100%; border-collapse: collapse; font-size: 13px; line-height: 1.45; }\n [part=inspector-metrics] :is(th,td) { padding: 5px 0; border-bottom: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); font-weight: 400; }\n [part=inspector-metrics] th { text-align: start; font-variant-numeric: normal; }\n [part=inspector-metrics] td { text-align: right; font-variant-numeric: tabular-nums; }\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: 32px; margin-top: 4px; padding: 0 14px; border-radius: 20px; font-size: 13px; font-weight: 600; letter-spacing: .01em; }\n [part=outline-list] { margin: 0; padding-left: 22px; font-size: 13.5px; line-height: 1.5; }\n [part=outline-list] [part=outline-list] { margin-top: 2px; }\n [part=outline-list] li { margin: 3px 0; padding-left: 2px; }\n [part=outline-list] li::marker { color: var(--boe-token-text-text-secondary, #6f6f6f); font-variant-numeric: tabular-nums; font-size: 12.5px; }\n [part=outline-list] button, [part=outline-list] strong { border: 0; border-radius: 4px; background: transparent; padding: 0; min-height: 24px; display: inline-block; font-size: 13.5px; font-weight: 600; line-height: 24px; text-align: start; }\n [part=outline-list] button:hover { color: var(--boe-token-surface-surface-brand, #0061d5); text-decoration: underline; text-underline-offset: 2px; }\n [part=outline-list] button[aria-current=true] { color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=outline-list] p { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; line-height: 1.5; }\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=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 :host([data-variables-editable]) [part=variable-row] { grid-template-columns: minmax(0,1fr) minmax(0,1fr) 32px; gap: 6px; align-items: center; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=name]) { grid-column: 1; grid-row: 1; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=value]) { grid-column: 2; grid-row: 1; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=scope]) { grid-column: 2; grid-row: 2; }\n :host([data-variables-editable]) [part=variable-remove] { grid-column: 3; grid-row: 1; }\n :host([data-variables-editable]) [part=variable-row] :is(input,select) { width: 100%; min-width: 0; min-height: 32px; border-radius: 10px; font-size: 12.5px; }\n :host([data-variables-editable]) [part=variable-row] p { grid-column: 1 / -1; }\n :host([data-variables-editable]) [part=variable-row] [part=field-problem] { color: var(--boe-token-text-status-text-error, #b92340); }\n [part=variable-remove], [part=variable-add] { min-height: 32px; align-self: end; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 8px; background: var(--boe-token-surface-surface, #fff); color: inherit; cursor: pointer; }\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] :is(input,select) { 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 :host([data-variables-editable]) [part=variable-row] { padding: 0; border: 0; }\n :host([data-variables-editable]) [part=variable-row] label { display: block; min-width: 0; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=description]) { grid-column: 1; grid-row: 2; }\n :host([data-variables-editable]) [part=variable-row] :is(input,select) { min-height: 32px; padding: 5px 10px; border: 1px solid var(--boe-token-surface-surface-quaternary,#d3d3d3); font: 12.5px/1.45 var(--boe-token-font-family-base,Inter,sans-serif); }\n :host([data-variables-editable]) [part=variable-row] select { padding: 4px 8px; }\n :host([data-variables-editable]) [part=variable-row] input:focus-visible { outline-offset: 1px; }\n [part=local-variables] button, [part=variable-add], [part=variable-remove] { display: inline-flex; align-items: center; gap: 6px; height: 32px; min-height: 32px; padding: 0 14px; border: 1px solid var(--boe-token-stroke-stroke,#e8e8e8); border-radius: 20px; background: var(--boe-token-surface-surface,#fff); font: 600 13px/1.45 var(--boe-token-font-family-base,Inter,sans-serif); letter-spacing: .01em; white-space: nowrap; }\n [part=local-variables] [data-local-key=remove], [part=variable-remove] { width: 32px; padding: 0; justify-content: center; border-color: transparent; background: transparent; align-self: center; }\n [part=local-variables] button:hover, [part=variable-add]:hover, [part=variable-remove]:hover { background: var(--boe-token-surface-surface-hover,#f4f4f4); }\n [part=local-variables] button:disabled, [part=variable-add]:disabled, [part=variable-remove]:disabled { opacity: .45; }\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=layout] { overflow: visible; }\n :host([data-narrow]) [part=pane-drawer] { display: none; position: absolute; 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-title] { display: block; position: absolute; top: 18px; left: 16px; margin: 0; font-size: 14px; font-weight: 650; line-height: 20px; }\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; width: 28px; height: 28px; padding: 0; border-radius: 50%; font-size: 16px; font-weight: 600; line-height: 1; }\n :host([data-narrow]) [part=pane-drawer][data-pane=palette] { left: 0; top: 0; bottom: auto; width: min(320px, 86%); height: 100%; max-height: 100%; }\n :host([data-narrow]) [part=pane-drawer][data-pane=inspector] { left: 0; right: 0; top: auto; bottom: 0; width: 100%; height: min(62%, 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-text-text-secondary, #767676); opacity: .55; }\n :host([data-narrow]) [part=palette], :host([data-narrow]) [part=inspector] { height: 100%; }\n :host([data-narrow]) [part=inspector] { border-left: 0; }\n :host([data-narrow]) [part=palette] { padding-top: 54px; }\n :host([data-narrow]) [part=palette-heading] { display: none; }\n :host([data-narrow]) [part=minimap] { display: none; }\n :host([data-narrow]) [part=toolbar] { justify-content: flex-start; }\n :host([data-narrow]) [data-command=palette] { order: -2; }\n :host([data-narrow]) [part=view-menu] { order: -1; }\n :host([data-narrow]) [part=view-switch], :host([data-narrow]) [part=run-toggle] { display: none; }\n :host([data-narrow]) [data-command=checks-status] { display: none; }\n :host([data-narrow]) [part=view-menu] { display: block; }\n :host([data-hide-tidy]) [part=controls] { left: 12px; bottom: 12px; }\n :host([data-narrow]) [part=selection-toolbar] [part=selection-plus] + span { display: none; }\n :host([data-hide-tidy]) [data-command=tidy] { display: none; }\n :host([data-phone]) [data-command=undo], :host([data-phone]) [data-command=redo] { display: none; }\n @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0s !important; animation-duration: 0s !important; scroll-behavior: auto !important; } }\n";
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 position: relative;\n isolation: isolate;\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], [part=status], [part=urgent-status] { 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: 10px 16px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 12px;\n flex-wrap: nowrap;\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: 8px; white-space: nowrap; font-size: 13px; font-weight: 600; cursor: pointer; }\n [part=run-toggle] input { appearance: none; position: relative; width: 32px; height: 18px; margin: 0; border: 0; border-radius: 9px; background: var(--boe-token-surface-surface-hover, #f4f4f4); cursor: pointer; transition: background var(--boe-profile-motion-interactive, 200ms) ease-out; }\n [part=run-toggle] input::after { content: ''; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 50%; background: var(--boe-token-surface-surface, #fff); box-shadow: 0 1px 2px rgb(0 0 0 / .25); transition: transform var(--boe-profile-motion-interactive, 200ms) ease-out; }\n [part=run-toggle] input:checked { background: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=run-toggle] input:checked::after { transform: translateX(14px); }\n [part=run-toggle] input:focus-visible { outline: 2px solid var(--boe-token-surface-surface-brand, #0061d5); outline-offset: 2px; }\n [part=toolbar] [data-command=checks-status] { white-space: nowrap; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=toolbar] [data-command=checks-status][data-state=bad] { color: color-mix(in srgb, var(--boe-token-text-status-text-error, #b92340) 85%, var(--boe-token-text-text, #141413)); }\n [part=toolbar] [data-command=checks-status] svg { flex: none; }\n [part=toolbar] [data-command=checks-status][data-state=ready] svg { color: var(--boe-token-text-status-text-success, #187657); }\n [part=view-menu] { display: none; position: relative; }\n [part=view-menu] summary { list-style: none; height: 32px; display: flex; align-items: center; padding: 0 14px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 20px; font-size: 13px; font-weight: 600; letter-spacing: .01em; cursor: pointer; white-space: nowrap; }\n [part=view-menu][open] { z-index: 20; }\n [part=view-menu-options] { position: absolute; z-index: 20; top: calc(100% + 4px); right: 0; width: 200px; max-width: calc(100vw - 24px); 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: flex; justify-content: space-between; gap: 16px; width: 100%; min-height: 32px; padding: 0 10px; text-align: start; background: transparent; }\n [part=view-menu] small { color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=view-menu] [role=separator] { border-top: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); margin: 4px 2px; }\n [part=toolbar-document] { display: flex; align-items: baseline; gap: 10px; min-width: 0; flex: 1 1 auto; visibility: hidden; }\n [part=toolbar-title] { font-size: 15px; font-weight: 650; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }\n [part=toolbar-document] span { font-size: 12px; white-space: nowrap; }\n [part=toolbar-actions] { display: flex; align-items: center; gap: 8px; }\n [part=toolbar] button:not([role]) { height: 32px; min-height: 32px; padding: 0 14px; border-radius: 20px; font-size: 13px; font-weight: 600; letter-spacing: .01em; white-space: nowrap; }\n [part=toolbar] [part=view-switch] { padding: 2px; gap: 0; background: var(--boe-token-surface-surface-secondary, #fbfbfb); }\n [part=toolbar] [part=view-switch] button { height: 26px; min-height: 26px; padding: 0 12px; border: 0; border-radius: 16px; font-size: 12.5px; letter-spacing: normal; }\n [part=toolbar] [part=view-switch] button[aria-pressed=true] { box-shadow: 0 0 0 1px var(--boe-token-stroke-stroke, #e8e8e8); }\n [part=toolbar] button[data-command=checks-status] { display: inline-flex; align-items: center; gap: 6px; height: auto; min-height: 0; line-height: 1.45; padding: 4px 6px; border: 0; border-radius: 8px; font-weight: 400; letter-spacing: normal; }\n [part=toolbar] [data-command=palette], [part=toolbar] [data-command=undo], [part=toolbar] [data-command=redo] { width: 32px; padding: 0; place-items: center; }\n [part=toolbar] [data-command=palette], [part=toolbar] [data-command=details] { border-color: var(--boe-token-stroke-stroke, #e8e8e8); background: var(--boe-token-surface-surface, #fff); }\n :host([data-compact-toolbar]) [part=view-switch], :host([data-compact-toolbar]) [part=run-toggle] { display: none; }\n :host([data-compact-toolbar]) [part=view-menu] { display: block; }\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=canvas-stack] { display: grid; grid-template-rows: auto minmax(0, 1fr); min-width: 0; min-height: 0; }\n /* The hidden hold leaves row 1 empty. Keep the canvas in the flexible row\n explicitly; auto-placement otherwise puts its absolute world in a 0px row. */\n [part=canvas-stack] > [part=hold] { grid-row: 1; }\n [part=canvas-stack] > [part=canvas] { grid-row: 2; }\n [part=insert-chooser]::backdrop { background: rgb(0 0 0 / .45); }\n [part=pane-scrim] { position: absolute; inset: 0; z-index: 30; background: rgb(0 0 0 / .45); }\n [part=pane-title], [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=palette-heading] { margin: 0 4px; font-size: 14px; font-weight: 650; line-height: 20px; }\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; line-height: 1.45; 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; touch-action: none;\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.45; }\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, color-mix(in srgb, var(--boe-token-text-text-secondary, #6f6f6f) 26%, transparent) 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] { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; padding: 10px 16px; border-bottom: 1px solid color-mix(in srgb, var(--boe-token-text-status-text-warning, #9a6b00) 45%, var(--boe-token-stroke-stroke, #e8e8e8)); background: color-mix(in srgb, var(--boe-token-surface-status-surface-inprogress, #ffc447) 14%, var(--boe-token-surface-surface, #fff)); color: var(--boe-token-text-status-text-warning, #6b4a00); font-size: 13px; }\n [part=hold-text] { flex: 1 1 280px; min-width: 0; }\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][data-shape=task] { align-content: normal; font-size: 14px; line-height: 1.45; }\n [part=box][data-shape=task] > [part=icon] { grid-row: span 4; margin-top: 1px; }\n [part=box]:hover, [part=frame]:hover { border-color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [data-connect-target=true][data-connect-invalid=true] { border-color: var(--boe-token-text-status-text-error, #b92340) !important; }\n [part=connection-preview][data-invalid=true] { stroke: var(--boe-token-text-status-text-error, #b92340); }\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; display: flex; gap: 6px; flex-wrap: wrap; margin-top: 3px; font-size: 12px; line-height: 1.45; font-variant-numeric: tabular-nums; }\n [part=metrics][data-state=unmeasured] { color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=metric-separator] { color: var(--boe-token-text-text-tertiary, #767676); }\n [part=technical-summary] { overflow-wrap: anywhere; }\n [part=technical-inline-code] { font-family: ui-monospace, 'SF Mono', Menlo, Consolas, monospace; }\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][data-palette-drop=true] { border-color: var(--boe-token-surface-surface-brand, #0061d5); box-shadow: 0 0 0 2px color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 18%, transparent); }\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 [part=caption] { position: absolute; left: 50%; translate: -50% 0; width: max-content; max-width: 168px; padding: 1px 4px; border-radius: 4px; text-align: center; background: color-mix(in srgb, var(--boe-token-surface-surface-hover, #f4f4f4) 88%, transparent); }\n [part=caption][data-side=below] { top: 60px; }\n [part=caption][data-side=above] { bottom: 60px; }\n [part=caption] strong { font-size: 12.5px; font-weight: 600; line-height: 1.3; }\n [part=caption] small { display: block; font-weight: 400; }\n [part=caption] [part=technical-description] { font: 10.5px ui-monospace, 'SF Mono', Menlo, Consolas, monospace !important; white-space: nowrap; }\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 [part=event-details] { position: absolute; top: 75px; left: 50%; width: 172px; translate: -50% 0; text-align: center; }\n [part=event-details] small { display: block; 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 /* Unlabelled lines still need a reachable midpoint for pointer insert/selection. */\n [part=connection]:has(> span:empty):not(:has(> small)) { padding: 0; background: transparent; min-width: var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1))); min-height: var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1))); }\n [part=connection] > small { margin-left: 4px; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 11px; font-weight: 400; font-variant-numeric: tabular-nums; }\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-width: max(24px, var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1)))); min-height: max(32px, var(--boe-process-hit-target, calc(24px * var(--boe-process-inverse-zoom, 1)))); 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] { pointer-events: auto !important; }\n [part=note][data-selected=true] { outline: 2px solid var(--boe-process-line-selected, var(--boe-brand-fill, #1976d2)); }\n [part=note]:focus-visible { outline: 2px solid var(--boe-focus-ring, #1976d2); outline-offset: 3px; }\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=palette-ghost][data-pointer] { position: fixed; z-index: 100; padding: 8px 12px; border: 1px solid var(--boe-token-surface-surface-brand, #0061d5); border-radius: 10px; background: var(--boe-token-surface-surface, #fff); box-shadow: var(--boe-token-elevation-overlay, 0 8px 24px #0002); font-size: 13px; font-weight: 600; line-height: 1.45; gap: 8px; translate: -50% -50%; }\n [part=palette-ghost][data-pointer] svg { width: 20px; height: 20px; }\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=keyboard-chooser] { position: fixed; inset: auto; width: min(320px, calc(100vw - 24px)); max-height: min(420px, calc(100dvh - 24px)); margin: 0; overflow: auto; padding: 12px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface, #fff); color: var(--boe-token-text-text, #141413); box-shadow: var(--boe-shadow-overlay, 0 4px 12px rgb(0 0 0 / .16)); }\n [part=chooser-title] { margin: 0 0 10px; font-size: 12px; font-weight: 650; line-height: 1.4; color: var(--boe-token-text-text-secondary, #6f6f6f); }\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] button:not([data-command=reset]) { width: 32px; padding: 0; }\n [part=controls-divider] { width: 1px; height: 20px; margin: 0 4px; background: var(--boe-token-stroke-stroke, #e8e8e8); }\n [part=controls] [data-command=reset] { min-width: 56px; padding: 0 6px; 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: color-mix(in srgb, var(--boe-token-text-text-secondary, #6f6f6f) 35%, transparent); }\n [part=minimap] rect[data-selected=true] { fill: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=minimap] rect[data-section] { fill: color-mix(in srgb, var(--boe-token-text-text-secondary, #6f6f6f) 8%, transparent); }\n [part=minimap] [data-viewport] { fill: color-mix(in srgb, var(--boe-token-surface-surface-brand, #0061d5) 8%, transparent); stroke: var(--boe-token-surface-surface-brand, #0061d5); stroke-width: 1.5; vector-effect: non-scaling-stroke; }\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=selection-toolbar] button { display: inline-flex; align-items: center; gap: 4px; }\n [part=selection-plus] { font-size: 18px; line-height: 12px; font-weight: 500; }\n [part=checks] { display: grid; gap: 6px; margin: 0; padding: 0; }\n [part=checks] button { width: 100%; display: grid; grid-template-columns: 16px 1fr; align-items: start; gap: 8px; padding: 8px 10px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 10px; text-align: start; background: var(--boe-token-surface-surface, #fff); color: var(--boe-token-text-text, #222); line-height: 1.45; }\n [part=check-icon] { flex: 0 0 16px; width: 16px; height: 16px; margin-top: 1px; color: var(--boe-token-text-status-text-error, #b92340); }\n [part=checks] strong { display: block; font-size: 13px; font-weight: 600; line-height: 1.45; }\n [part=checks] small { color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; }\n [part=check-icon][data-tone=success] { color: var(--boe-token-text-status-text-success, #138a58); }\n [part=problem] { display: flex; align-items: center; gap: 4px; }\n [part=problem] [part=check-icon] { flex-basis: 12px; width: 12px; height: 12px; margin: 0; }\n [part=checks-ready] { display: flex; align-items: center; gap: 8px; margin: 0; color: var(--boe-token-text-text, #222); font-size: 13px; line-height: 1.45; }\n [part=process-heading] { display: grid; gap: 2px; padding: 0 16px 12px; }\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] :is(input,textarea)[part=expression-control] { border-color: var(--boe-token-surface-surface-quaternary, #d3d3d3); padding: 7px 12px; border-radius: 12px; box-shadow: inset 0 2px 4px rgb(0 0 0 / .06); font: 12.5px/1.5 ui-monospace, \"SF Mono\", Menlo, Consolas, monospace; }\n [part=field] textarea[part=expression-control] { min-height: 72px; }\n [part=field]:has([part=expression-control]), [part=field] label:has([part=expression-control]) { gap: 6px; }\n [part=field] label:has([part=expression-control]) { font-weight: 600; line-height: 1.45; }\n [part=field]:has([part=expression-control]) small { line-height: 1.45; }\n [part=expression-help] { margin-top: 8px; font-size: 12.5px; line-height: 1.45; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=expression-help] summary { cursor: pointer; font-weight: 600; }\n [part=expression-help] ul { padding-left: 18px; margin: 6px 0 0; display: grid; gap: 4px; }\n [part=expression-help] li { margin: 0; }\n [part=field-feedback][data-tone=success] { color: var(--boe-token-text-status-text-success, #247b3e); }\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=editor], [part=pane-content], [part=editor] > *, [part=pane-content] > * { min-width: 0; }\n [part=process-title], [part=process-summary] { min-width: 0; overflow-wrap: anywhere; }\n :is([part=local-variable-summary],[part=saved-result-summary]) :is(ul,li) { min-width: 0; max-width: 100%; }\n [part=pane-content][data-pane=Variables] { display: grid; align-content: start; gap: 14px; }\n [part=variables-intro], [part=variable-list] > p { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--boe-token-text-text-secondary,#6f6f6f); }\n [part=variable-scopes] { display: grid; grid-template-columns: auto 1fr; gap: 4px 10px; margin: 0; font-size: 12.5px; line-height: 1.45; }\n [part=variable-scopes] dt { font-weight: 650; }\n [part=variable-scopes] dd { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n :is([part=local-variable-summary],[part=saved-result-summary],[part=local-variables]) { font-size: 12.5px; line-height: 1.45; }\n :is([part=local-variable-summary],[part=saved-result-summary],[part=local-variables]) h3 { margin: 0 0 6px; font-size: 12.5px; line-height: 1.45; font-weight: 650; }\n :is([part=local-variable-summary],[part=saved-result-summary],[part=local-variables]) p { margin: 0; line-height: 1.5; color: var(--boe-token-text-text-secondary,#6f6f6f); }\n :is([part=local-variable-summary],[part=saved-result-summary]) ul { list-style: none; display: grid; gap: 4px; margin: 0; padding: 0; }\n :is([part=local-variable-summary],[part=saved-result-summary]) li { display: flex; align-items: center; gap: 8px; padding: 4px 4px 4px 10px; border: 1px solid var(--boe-token-stroke-stroke,#e8e8e8); border-radius: 10px; background: var(--boe-token-surface-surface-secondary,#fbfbfb); font-size: 13px; line-height: 1.45; }\n :is([part=local-variable-summary],[part=saved-result-summary]) li > span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n :is([part=local-variable-summary],[part=saved-result-summary]) code { font-family: monospace; font-size: 13px; }\n :is([part=local-variable-summary],[part=saved-result-summary]) em { font-style: normal; color: var(--boe-token-text-text-secondary,#6f6f6f); }\n [part=local-variable-list], [part=variable-list] { display: grid; gap: 10px; }\n [part=local-variable-row] { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr) 32px; gap: 6px; align-items: center; }\n [part=local-variable-row] [part=field-problem] { grid-column: 1 / -1; color: var(--boe-token-text-status-text-error, #b92340); font-size: 12px; }\n [part=local-variables] label { display: block; min-width: 0; }\n [part=local-variables] input { width: 100%; min-width: 0; min-height: 32px; padding: 5px 10px; border: 1px solid var(--boe-token-surface-surface-quaternary,#d3d3d3); border-radius: 10px; background: var(--boe-token-surface-surface,#fff); color: var(--boe-token-text-text,#141413); font: 12.5px/1.45 var(--boe-token-font-family-base,Inter,sans-serif); }\n [part=local-variables] input:focus-visible { outline-offset: 1px; }\n [part=local-variable-actions], [part=variable-actions] { display: flex; gap: 8px; flex-wrap: wrap; padding-top: 4px; }\n [part=variable-icon] { flex: 0 0 16px; width: 16px; height: 16px; color: var(--boe-token-text-text-secondary,#6f6f6f); }\n [part=variable-chips] { display: flex; flex-wrap: wrap; gap: 6px; }\n [part=variable-chips] button { min-height: 24px; padding: 3px 8px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface-secondary, #fbfbfb); font: 12px ui-monospace, \"SF Mono\", Menlo, Consolas, monospace; }\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; font-size: 12.5px; line-height: 1.5; font-variant-numeric: tabular-nums; }\n [part=inspector-metrics] h3 { margin: 0 0 6px; font-size: 12.5px; }\n [part=inspector-metrics] p { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); }\n [part=inspector-metrics] table { width: 100%; border-collapse: collapse; font-size: 13px; line-height: 1.45; }\n [part=inspector-metrics] :is(th,td) { padding: 5px 0; border-bottom: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); font-weight: 400; }\n [part=inspector-metrics] th { text-align: start; font-variant-numeric: normal; }\n [part=inspector-metrics] td { text-align: right; font-variant-numeric: tabular-nums; }\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: 32px; margin-top: 4px; padding: 0 14px; border-radius: 20px; font-size: 13px; font-weight: 600; letter-spacing: .01em; }\n [part=outline-list] { margin: 0; padding-left: 22px; font-size: 13.5px; line-height: 1.5; }\n [part=outline-list] [part=outline-list] { margin-top: 2px; }\n [part=outline-list] li { margin: 3px 0; padding-left: 2px; }\n [part=outline-list] li::marker { color: var(--boe-token-text-text-secondary, #6f6f6f); font-variant-numeric: tabular-nums; font-size: 12.5px; }\n [part=outline-list] button, [part=outline-list] strong { border: 0; border-radius: 4px; background: transparent; padding: 0; min-height: 24px; display: inline-block; font-size: 13.5px; font-weight: 600; line-height: 24px; text-align: start; }\n [part=outline-list] button:hover { color: var(--boe-token-surface-surface-brand, #0061d5); text-decoration: underline; text-underline-offset: 2px; }\n [part=outline-list] button[aria-current=true] { color: var(--boe-token-surface-surface-brand, #0061d5); }\n [part=outline-list] p { margin: 0; color: var(--boe-token-text-text-secondary, #6f6f6f); font-size: 12.5px; line-height: 1.5; }\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=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 :host([data-variables-editable]) [part=variable-row] { grid-template-columns: minmax(0,1fr) minmax(0,1fr) 32px; gap: 6px; align-items: center; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=name]) { grid-column: 1; grid-row: 1; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=value]) { grid-column: 2; grid-row: 1; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=scope]) { grid-column: 2; grid-row: 2; }\n :host([data-variables-editable]) [part=variable-remove] { grid-column: 3; grid-row: 1; }\n :host([data-variables-editable]) [part=variable-row] :is(input,select) { width: 100%; min-width: 0; min-height: 32px; border-radius: 10px; font-size: 12.5px; }\n :host([data-variables-editable]) [part=variable-row] p { grid-column: 1 / -1; }\n :host([data-variables-editable]) [part=variable-row] [part=field-problem] { color: var(--boe-token-text-status-text-error, #b92340); }\n [part=variable-remove], [part=variable-add] { min-height: 32px; align-self: end; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 8px; background: var(--boe-token-surface-surface, #fff); color: inherit; cursor: pointer; }\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] :is(input,select) { 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 :host([data-variables-editable]) [part=variable-row] { padding: 0; border: 0; }\n :host([data-variables-editable]) [part=variable-row] label { display: block; min-width: 0; }\n :host([data-variables-editable]) [part=variable-row] label:has([data-variable-key=description]) { grid-column: 1; grid-row: 2; }\n :host([data-variables-editable]) [part=variable-row] :is(input,select) { min-height: 32px; padding: 5px 10px; border: 1px solid var(--boe-token-surface-surface-quaternary,#d3d3d3); font: 12.5px/1.45 var(--boe-token-font-family-base,Inter,sans-serif); }\n :host([data-variables-editable]) [part=variable-row] select { padding: 4px 8px; }\n :host([data-variables-editable]) [part=variable-row] input:focus-visible { outline-offset: 1px; }\n [part=local-variables] button, [part=variable-add], [part=variable-remove] { display: inline-flex; align-items: center; gap: 6px; height: 32px; min-height: 32px; padding: 0 14px; border: 1px solid var(--boe-token-stroke-stroke,#e8e8e8); border-radius: 20px; background: var(--boe-token-surface-surface,#fff); font: 600 13px/1.45 var(--boe-token-font-family-base,Inter,sans-serif); letter-spacing: .01em; white-space: nowrap; }\n [part=local-variables] [data-local-key=remove], [part=variable-remove] { width: 32px; padding: 0; justify-content: center; border-color: transparent; background: transparent; align-self: center; }\n [part=local-variables] button:hover, [part=variable-add]:hover, [part=variable-remove]:hover { background: var(--boe-token-surface-surface-hover,#f4f4f4); }\n [part=local-variables] button:disabled, [part=variable-add]:disabled, [part=variable-remove]:disabled { opacity: .45; }\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=layout] { overflow: visible; }\n :host([data-narrow]) [part=pane-drawer] { display: none; position: absolute; 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-title] { display: block; position: absolute; top: 18px; left: 16px; margin: 0; font-size: 14px; font-weight: 650; line-height: 20px; }\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; width: 28px; height: 28px; padding: 0; border-radius: 50%; font-size: 16px; font-weight: 600; line-height: 1; }\n :host([data-narrow]) [part=pane-drawer][data-pane=palette] { left: 0; top: 0; bottom: auto; width: min(320px, 86%); height: 100%; max-height: 100%; }\n :host([data-narrow]) [part=pane-drawer][data-pane=inspector] { left: 0; right: 0; top: auto; bottom: 0; width: 100%; height: min(62%, 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-text-text-secondary, #767676); opacity: .55; }\n :host([data-narrow]) [part=palette], :host([data-narrow]) [part=inspector] { height: 100%; }\n :host([data-narrow]) [part=inspector] { border-left: 0; }\n :host([data-narrow]) [part=palette] { padding-top: 54px; }\n :host([data-narrow]) [part=palette-heading] { display: none; }\n :host([data-narrow]) [part=minimap] { display: none; }\n :host([data-narrow]) [part=toolbar] { justify-content: flex-start; gap: 8px; padding: 8px 12px; flex-wrap: wrap; }\n :host([data-narrow]) [part=view-switch], :host([data-narrow]) [part=run-toggle] { display: none; }\n :host([data-narrow]) [data-command=checks-status] { display: none; }\n :host([data-narrow]) [part=view-menu] { display: block; }\n :host([data-hide-tidy]) [part=toolbar-title] { font-size: 14px; }\n :host([data-hide-tidy]) [part=toolbar-document] span { display: none; }\n :host([data-hide-tidy]) [part=controls] { left: 12px; bottom: 12px; }\n :host([data-narrow]) [part=selection-toolbar] [part=selection-plus] + span { display: none; }\n :host([data-hide-tidy]) [part=toolbar-actions] [data-command=tidy] { display: none; }\n :host([data-narrow]) [part=toolbar-actions] [data-command=undo], :host([data-narrow]) [part=toolbar-actions] [data-command=redo] { display: none; }\n @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0s !important; animation-duration: 0s !important; scroll-behavior: auto !important; } }\n";
@@ -20,12 +20,12 @@ export const processModelerDesign = `
20
20
  [part=toolbar] {
21
21
  min-height: 56px;
22
22
  margin: 0;
23
- padding: 8px 16px;
23
+ padding: 10px 16px;
24
24
  display: flex;
25
25
  align-items: center;
26
26
  justify-content: flex-end;
27
- gap: 8px;
28
- flex-wrap: wrap;
27
+ gap: 12px;
28
+ flex-wrap: nowrap;
29
29
  border-bottom: 1px solid var(--boe-token-stroke-stroke, #e8e8e8);
30
30
  background: var(--boe-token-surface-surface, #fff);
31
31
  }
@@ -55,12 +55,29 @@ export const processModelerDesign = `
55
55
  [part=run-toggle] input:checked::after { transform: translateX(14px); }
56
56
  [part=run-toggle] input:focus-visible { outline: 2px solid var(--boe-token-surface-surface-brand, #0061d5); outline-offset: 2px; }
57
57
  [part=toolbar] [data-command=checks-status] { white-space: nowrap; color: var(--boe-token-text-text-secondary, #6f6f6f); }
58
- [part=toolbar] [data-command=checks-status][data-state=bad] { color: var(--boe-token-text-status-text-error, #b92340); }
58
+ [part=toolbar] [data-command=checks-status][data-state=bad] { color: color-mix(in srgb, var(--boe-token-text-status-text-error, #b92340) 85%, var(--boe-token-text-text, #141413)); }
59
+ [part=toolbar] [data-command=checks-status] svg { flex: none; }
60
+ [part=toolbar] [data-command=checks-status][data-state=ready] svg { color: var(--boe-token-text-status-text-success, #187657); }
59
61
  [part=view-menu] { display: none; position: relative; }
60
- [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; }
62
+ [part=view-menu] summary { list-style: none; height: 32px; display: flex; align-items: center; padding: 0 14px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 20px; font-size: 13px; font-weight: 600; letter-spacing: .01em; cursor: pointer; white-space: nowrap; }
61
63
  [part=view-menu][open] { z-index: 20; }
62
- [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)); }
63
- [part=view-menu] button { display: block; width: 100%; text-align: start; background: transparent; }
64
+ [part=view-menu-options] { position: absolute; z-index: 20; top: calc(100% + 4px); right: 0; width: 200px; max-width: calc(100vw - 24px); 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)); }
65
+ [part=view-menu] button { display: flex; justify-content: space-between; gap: 16px; width: 100%; min-height: 32px; padding: 0 10px; text-align: start; background: transparent; }
66
+ [part=view-menu] small { color: var(--boe-token-text-text-secondary, #6f6f6f); }
67
+ [part=view-menu] [role=separator] { border-top: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); margin: 4px 2px; }
68
+ [part=toolbar-document] { display: flex; align-items: baseline; gap: 10px; min-width: 0; flex: 1 1 auto; visibility: hidden; }
69
+ [part=toolbar-title] { font-size: 15px; font-weight: 650; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
70
+ [part=toolbar-document] span { font-size: 12px; white-space: nowrap; }
71
+ [part=toolbar-actions] { display: flex; align-items: center; gap: 8px; }
72
+ [part=toolbar] button:not([role]) { height: 32px; min-height: 32px; padding: 0 14px; border-radius: 20px; font-size: 13px; font-weight: 600; letter-spacing: .01em; white-space: nowrap; }
73
+ [part=toolbar] [part=view-switch] { padding: 2px; gap: 0; background: var(--boe-token-surface-surface-secondary, #fbfbfb); }
74
+ [part=toolbar] [part=view-switch] button { height: 26px; min-height: 26px; padding: 0 12px; border: 0; border-radius: 16px; font-size: 12.5px; letter-spacing: normal; }
75
+ [part=toolbar] [part=view-switch] button[aria-pressed=true] { box-shadow: 0 0 0 1px var(--boe-token-stroke-stroke, #e8e8e8); }
76
+ [part=toolbar] button[data-command=checks-status] { display: inline-flex; align-items: center; gap: 6px; height: auto; min-height: 0; line-height: 1.45; padding: 4px 6px; border: 0; border-radius: 8px; font-weight: 400; letter-spacing: normal; }
77
+ [part=toolbar] [data-command=palette], [part=toolbar] [data-command=undo], [part=toolbar] [data-command=redo] { width: 32px; padding: 0; place-items: center; }
78
+ [part=toolbar] [data-command=palette], [part=toolbar] [data-command=details] { border-color: var(--boe-token-stroke-stroke, #e8e8e8); background: var(--boe-token-surface-surface, #fff); }
79
+ :host([data-compact-toolbar]) [part=view-switch], :host([data-compact-toolbar]) [part=run-toggle] { display: none; }
80
+ :host([data-compact-toolbar]) [part=view-menu] { display: block; }
64
81
  [part=layout] {
65
82
  display: grid;
66
83
  grid-template-columns: 248px minmax(0, 1fr) 320px;
@@ -275,6 +292,16 @@ export const processModelerDesign = `
275
292
  [part=field] label { display: grid; gap: 5px; font-size: 12.5px; font-weight: 650; }
276
293
  [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; }
277
294
  [part=field] textarea { min-height: 76px; resize: vertical; }
295
+ [part=field] :is(input,textarea)[part=expression-control] { border-color: var(--boe-token-surface-surface-quaternary, #d3d3d3); padding: 7px 12px; border-radius: 12px; box-shadow: inset 0 2px 4px rgb(0 0 0 / .06); font: 12.5px/1.5 ui-monospace, "SF Mono", Menlo, Consolas, monospace; }
296
+ [part=field] textarea[part=expression-control] { min-height: 72px; }
297
+ [part=field]:has([part=expression-control]), [part=field] label:has([part=expression-control]) { gap: 6px; }
298
+ [part=field] label:has([part=expression-control]) { font-weight: 600; line-height: 1.45; }
299
+ [part=field]:has([part=expression-control]) small { line-height: 1.45; }
300
+ [part=expression-help] { margin-top: 8px; font-size: 12.5px; line-height: 1.45; color: var(--boe-token-text-text-secondary, #6f6f6f); }
301
+ [part=expression-help] summary { cursor: pointer; font-weight: 600; }
302
+ [part=expression-help] ul { padding-left: 18px; margin: 6px 0 0; display: grid; gap: 4px; }
303
+ [part=expression-help] li { margin: 0; }
304
+ [part=field-feedback][data-tone=success] { color: var(--boe-token-text-status-text-success, #247b3e); }
278
305
  [part=field]:has([part=action-options]) { position: relative; }
279
306
  [part=field]:has([part=action-options]) input { padding-right: 34px; }
280
307
  [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; }
@@ -312,8 +339,8 @@ export const processModelerDesign = `
312
339
  [part=local-variables] input:focus-visible { outline-offset: 1px; }
313
340
  [part=local-variable-actions], [part=variable-actions] { display: flex; gap: 8px; flex-wrap: wrap; padding-top: 4px; }
314
341
  [part=variable-icon] { flex: 0 0 16px; width: 16px; height: 16px; color: var(--boe-token-text-text-secondary,#6f6f6f); }
315
- [part=variable-chips] { display: flex; flex-wrap: wrap; gap: 4px; }
316
- [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; }
342
+ [part=variable-chips] { display: flex; flex-wrap: wrap; gap: 6px; }
343
+ [part=variable-chips] button { min-height: 24px; padding: 3px 8px; border: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); border-radius: 12px; background: var(--boe-token-surface-surface-secondary, #fbfbfb); font: 12px ui-monospace, "SF Mono", Menlo, Consolas, monospace; }
317
344
  [part=leads-to] { display: grid; gap: 6px; padding-top: 10px; border-top: 1px solid var(--boe-token-stroke-stroke, #e8e8e8); }
318
345
  [part=leads-to] h3 { margin: 0; font-size: 12.5px; }
319
346
  [part=lead-row] { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: 12.5px; }
@@ -380,15 +407,15 @@ export const processModelerDesign = `
380
407
  :host([data-narrow]) [part=palette] { padding-top: 54px; }
381
408
  :host([data-narrow]) [part=palette-heading] { display: none; }
382
409
  :host([data-narrow]) [part=minimap] { display: none; }
383
- :host([data-narrow]) [part=toolbar] { justify-content: flex-start; }
384
- :host([data-narrow]) [data-command=palette] { order: -2; }
385
- :host([data-narrow]) [part=view-menu] { order: -1; }
410
+ :host([data-narrow]) [part=toolbar] { justify-content: flex-start; gap: 8px; padding: 8px 12px; flex-wrap: wrap; }
386
411
  :host([data-narrow]) [part=view-switch], :host([data-narrow]) [part=run-toggle] { display: none; }
387
412
  :host([data-narrow]) [data-command=checks-status] { display: none; }
388
413
  :host([data-narrow]) [part=view-menu] { display: block; }
414
+ :host([data-hide-tidy]) [part=toolbar-title] { font-size: 14px; }
415
+ :host([data-hide-tidy]) [part=toolbar-document] span { display: none; }
389
416
  :host([data-hide-tidy]) [part=controls] { left: 12px; bottom: 12px; }
390
417
  :host([data-narrow]) [part=selection-toolbar] [part=selection-plus] + span { display: none; }
391
- :host([data-hide-tidy]) [data-command=tidy] { display: none; }
392
- :host([data-phone]) [data-command=undo], :host([data-phone]) [data-command=redo] { display: none; }
418
+ :host([data-hide-tidy]) [part=toolbar-actions] [data-command=tidy] { display: none; }
419
+ :host([data-narrow]) [part=toolbar-actions] [data-command=undo], :host([data-narrow]) [part=toolbar-actions] [data-command=redo] { display: none; }
393
420
  @media (prefers-reduced-motion: reduce) { *, *::before, *::after { transition-duration: 0s !important; animation-duration: 0s !important; scroll-behavior: auto !important; } }
394
421
  `;
@@ -118,6 +118,32 @@ export interface ProcessOutlineItem {
118
118
  boxId?: string;
119
119
  children?: readonly ProcessOutlineItem[];
120
120
  }
121
+ /** Host-authored expression presentation; BOE does not infer scope or evaluate CEL. */
122
+ export interface ProcessExpressionField {
123
+ /** Complete ordered scope; [] suppresses legacy global-variable chips. */
124
+ variables?: readonly {
125
+ name: string;
126
+ description?: string;
127
+ }[];
128
+ /** Values greater than one render a textarea. */
129
+ rows?: number;
130
+ /** Error feedback uses ProcessField.problem and takes precedence. */
131
+ feedback?: {
132
+ message: string;
133
+ tone?: 'neutral' | 'success';
134
+ };
135
+ help?: {
136
+ summary: string;
137
+ examples: readonly {
138
+ expression: string;
139
+ description: string;
140
+ segments?: readonly {
141
+ text: string;
142
+ format?: 'code' | 'text';
143
+ }[];
144
+ }[];
145
+ };
146
+ }
121
147
  /** Host-supplied field values; the modeler draws controls and requests edits. */
122
148
  export interface ProcessField {
123
149
  key: string;
@@ -134,6 +160,7 @@ export interface ProcessField {
134
160
  required?: boolean;
135
161
  disabled?: boolean;
136
162
  problem?: string;
163
+ expression?: ProcessExpressionField;
137
164
  }
138
165
  export interface ProcessPositionSnapshot {
139
166
  path?: NodePath;
@@ -232,6 +232,9 @@ export declare class ProcessModeler<D = ProcessProjection, N = unknown> extends
232
232
  private minimapBounds;
233
233
  private bounds;
234
234
  protected renderTemplate(): void;
235
+ private viewMenuDocument?;
236
+ private syncViewMenuDismissal;
237
+ private dismissViewMenuOutside;
235
238
  private setupPanes;
236
239
  private openDrawer;
237
240
  private closeDrawer;
@@ -215,8 +215,15 @@ export class ProcessModeler extends BaseElement {
215
215
  }
216
216
  load(document, options = {}) {
217
217
  this.pendingLocalRename = undefined;
218
- this.layoutEditSession++;
218
+ const session = ++this.layoutEditSession;
219
+ this.insertion = undefined;
219
220
  this.cancelPalettePointer();
221
+ this.closeKeyboardChooser();
222
+ const chooser = this.shadowRoot?.querySelector('[part=insert-chooser]');
223
+ if (chooser)
224
+ dismissModal(chooser);
225
+ if (session !== this.layoutEditSession)
226
+ return;
220
227
  const projection = this.model.project(document);
221
228
  validateProjection(projection);
222
229
  this.documentValue = document;
@@ -387,6 +394,11 @@ export class ProcessModeler extends BaseElement {
387
394
  this.refresh();
388
395
  }
389
396
  disconnectedCallback() {
397
+ const menu = this.shadowRoot?.querySelector('[part=view-menu]');
398
+ if (menu)
399
+ menu.open = false;
400
+ this.viewMenuDocument?.removeEventListener('pointerdown', this.dismissViewMenuOutside, true);
401
+ this.viewMenuDocument = undefined;
390
402
  this.layoutEditSession++;
391
403
  this.resizeObserver?.disconnect();
392
404
  this.clearClipboard();
@@ -407,7 +419,7 @@ export class ProcessModeler extends BaseElement {
407
419
  this.marquee = undefined;
408
420
  this.segmentDrag = undefined;
409
421
  }
410
- connectedCallback() { super.connectedCallback(); this.resizeObserver?.observe(this); }
422
+ connectedCallback() { super.connectedCallback(); this.resizeObserver?.observe(this); this.syncViewMenuDismissal(); }
411
423
  refresh() {
412
424
  if (this.isRendered)
413
425
  this.update();
@@ -906,13 +918,13 @@ export class ProcessModeler extends BaseElement {
906
918
  chooser.append(picker);
907
919
  this.shadowRoot.append(chooser);
908
920
  picker.addEventListener("kind-pick", event => {
909
- const insertion = this.insertion;
910
- dismissModal(chooser);
921
+ const insertion = this.insertion, session = this.layoutEditSession;
911
922
  this.insertion = undefined;
912
- if (insertion)
923
+ dismissModal(chooser);
924
+ if (insertion && session === this.layoutEditSession && this.isConnected)
913
925
  this.requestEdit({ ...insertion, kind: event.detail.kind });
914
926
  });
915
- picker.addEventListener("picker-cancel", () => { dismissModal(chooser); this.insertion = undefined; });
927
+ picker.addEventListener("picker-cancel", () => { this.insertion = undefined; dismissModal(chooser); });
916
928
  const keyboardChooser = document.createElement('div');
917
929
  keyboardChooser.setAttribute('part', 'keyboard-chooser');
918
930
  keyboardChooser.setAttribute('popover', 'manual');
@@ -927,18 +939,35 @@ export class ProcessModeler extends BaseElement {
927
939
  keyboardChooser.append(keyboardTitle, keyboardPicker);
928
940
  this.shadowRoot.append(keyboardChooser);
929
941
  keyboardPicker.addEventListener('kind-pick', event => {
930
- const edit = this.keyboardInsertion;
942
+ const edit = this.keyboardInsertion, session = this.layoutEditSession;
931
943
  this.closeKeyboardChooser(true);
944
+ if (session !== this.layoutEditSession || !this.isConnected)
945
+ return;
932
946
  // Keep a stable step focused while the host applies and accepts the edit.
933
947
  // World refreshes preserve step focus, including deferred acceptance.
934
948
  if (edit?.from)
935
949
  this.focusBox(edit.from);
936
- if (edit)
950
+ if (edit && session === this.layoutEditSession && this.isConnected)
937
951
  this.requestEdit({ ...edit, kind: event.detail.kind });
938
952
  });
939
953
  keyboardPicker.addEventListener('picker-cancel', () => this.closeKeyboardChooser(true));
940
954
  this.setupPanes();
941
955
  }
956
+ viewMenuDocument;
957
+ syncViewMenuDismissal() {
958
+ const menu = this.shadowRoot?.querySelector('[part=view-menu]');
959
+ const target = this.isConnected && menu?.open ? this.ownerDocument : undefined;
960
+ if (this.viewMenuDocument === target)
961
+ return;
962
+ this.viewMenuDocument?.removeEventListener('pointerdown', this.dismissViewMenuOutside, true);
963
+ this.viewMenuDocument = target;
964
+ target?.addEventListener('pointerdown', this.dismissViewMenuOutside, true);
965
+ }
966
+ dismissViewMenuOutside = (event) => {
967
+ const menu = this.shadowRoot?.querySelector('[part=view-menu]');
968
+ if (menu?.open && !event.composedPath().includes(menu))
969
+ menu.open = false;
970
+ };
942
971
  setupPanes() {
943
972
  const root = this.shadowRoot;
944
973
  const toolbar = root.querySelector('[part=toolbar]');
@@ -971,27 +1000,99 @@ export class ProcessModeler extends BaseElement {
971
1000
  viewMenu.append(summary);
972
1001
  const viewOptions = document.createElement('div');
973
1002
  viewOptions.setAttribute('part', 'view-menu-options');
1003
+ viewOptions.setAttribute('role', 'menu');
1004
+ viewOptions.setAttribute('aria-label', 'Diagram view');
974
1005
  viewMenu.append(viewOptions);
1006
+ summary.setAttribute('aria-haspopup', 'menu');
1007
+ viewMenu.addEventListener('toggle', () => { summary.setAttribute('aria-expanded', String(viewMenu.open)); this.syncViewMenuDismissal(); });
1008
+ const closeViewMenu = () => { const session = this.layoutEditSession; viewMenu.open = false; summary.focus({ preventScroll: true }); return session === this.layoutEditSession && this.isConnected; };
1009
+ viewMenu.addEventListener('keydown', event => {
1010
+ const items = Array.from(viewOptions.querySelectorAll('button')).filter(item => !item.hidden && !item.disabled);
1011
+ if (event.key === 'Tab') {
1012
+ if (viewMenu.open && root.activeElement === summary && !event.shiftKey && items.length) {
1013
+ event.preventDefault();
1014
+ items[0].focus();
1015
+ }
1016
+ else
1017
+ viewMenu.open = false;
1018
+ return;
1019
+ }
1020
+ if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || !items.length)
1021
+ return;
1022
+ event.preventDefault();
1023
+ viewMenu.open = true;
1024
+ const index = items.indexOf(root.activeElement);
1025
+ const next = event.key === 'Home' ? 0 : event.key === 'End' ? items.length - 1 : event.key === 'ArrowDown' ? (index + 1) % items.length : (index < 0 ? items.length - 1 : (index + items.length - 1) % items.length);
1026
+ items[next].focus();
1027
+ });
1028
+ root.addEventListener('pointerdown', event => { if (!event.composedPath().includes(viewMenu))
1029
+ viewMenu.open = false; });
975
1030
  for (const [value, label] of [["business", "Business view"], ["technical", "Technical view"]]) {
976
1031
  const button = document.createElement("button");
977
1032
  button.type = "button";
978
1033
  button.dataset.detail = value;
979
1034
  button.textContent = label;
980
- button.onclick = () => { this.detail = value; viewMenu.open = false; };
1035
+ button.setAttribute('role', 'menuitemradio');
1036
+ button.onclick = () => { if (closeViewMenu())
1037
+ this.detail = value; };
981
1038
  viewOptions.append(button);
982
1039
  }
983
1040
  const mobileRun = document.createElement('button');
984
1041
  mobileRun.type = 'button';
985
1042
  mobileRun.dataset.viewOption = 'last-run';
986
- mobileRun.textContent = 'Last run';
987
- mobileRun.onclick = () => { this.showLastRun = !this.showLastRun; viewMenu.open = false; };
1043
+ mobileRun.textContent = 'Show last run';
1044
+ mobileRun.setAttribute('role', 'menuitem');
1045
+ mobileRun.onclick = () => { if (closeViewMenu())
1046
+ this.showLastRun = !this.showLastRun; };
988
1047
  viewOptions.append(mobileRun);
989
1048
  const mobileChecks = document.createElement('button');
990
1049
  mobileChecks.type = 'button';
991
- mobileChecks.textContent = 'Checks';
992
- mobileChecks.onclick = () => { this.select(null); this.activePane = 'Checks'; this.renderPane(); viewMenu.open = false; this.openDrawer('inspector'); };
1050
+ mobileChecks.dataset.viewOption = 'checks';
1051
+ mobileChecks.textContent = 'Checks: ready to run';
1052
+ mobileChecks.setAttribute('role', 'menuitem');
1053
+ mobileChecks.onclick = () => { if (closeViewMenu())
1054
+ checksStatus.click(); };
993
1055
  viewOptions.append(mobileChecks);
994
- toolbar.prepend(viewSwitch, runToggle, viewMenu);
1056
+ const separator = document.createElement('div');
1057
+ separator.setAttribute('role', 'separator');
1058
+ viewOptions.append(separator);
1059
+ for (const [command, label, hint] of [['tidy', 'Tidy up', ''], ['undo', 'Undo', 'Ctrl Z'], ['redo', 'Redo', 'Shift Ctrl Z']]) {
1060
+ const item = document.createElement('button');
1061
+ item.type = 'button';
1062
+ item.dataset.viewOption = command;
1063
+ item.setAttribute('role', 'menuitem');
1064
+ const text = document.createElement('span');
1065
+ text.textContent = label;
1066
+ item.append(text);
1067
+ if (hint) {
1068
+ const key = document.createElement('small');
1069
+ key.textContent = hint;
1070
+ item.append(key);
1071
+ }
1072
+ item.onclick = () => { if (!closeViewMenu())
1073
+ return; if (command === 'tidy')
1074
+ this.tidy();
1075
+ else if (command === 'undo')
1076
+ this.undo();
1077
+ else
1078
+ this.redo(); };
1079
+ viewOptions.append(item);
1080
+ }
1081
+ const spacer = document.createElement('div');
1082
+ spacer.setAttribute('part', 'toolbar-document');
1083
+ spacer.setAttribute('aria-hidden', 'true');
1084
+ const spacerTitle = document.createElement('strong');
1085
+ spacerTitle.setAttribute('part', 'toolbar-title');
1086
+ spacerTitle.textContent = this.processTitleValue;
1087
+ const saved = document.createElement('span');
1088
+ saved.textContent = 'Saved';
1089
+ spacer.append(spacerTitle, saved);
1090
+ toolbar.prepend(spacer, viewSwitch, runToggle, viewMenu);
1091
+ const actions = document.createElement('div');
1092
+ actions.setAttribute('part', 'toolbar-actions');
1093
+ for (const command of ['undo', 'redo', 'tidy'])
1094
+ actions.append(toolbar.querySelector(`[data-command=${command}]`));
1095
+ toolbar.append(actions);
995
1096
  const layout = root.querySelector('[part=layout]');
996
1097
  const scrim = document.createElement('div');
997
1098
  scrim.setAttribute('part', 'pane-scrim');
@@ -1071,7 +1172,13 @@ export class ProcessModeler extends BaseElement {
1071
1172
  trigger.setAttribute("aria-label", part === "palette" ? "Add building blocks" : `Open ${label.toLowerCase()}`);
1072
1173
  trigger.setAttribute('aria-expanded', 'false');
1073
1174
  trigger.onclick = () => this.openDrawer(part);
1074
- toolbar.append(trigger);
1175
+ if (part === 'palette') {
1176
+ trigger.textContent = '';
1177
+ trigger.append(variableGlyph(true));
1178
+ toolbar.prepend(trigger);
1179
+ }
1180
+ else
1181
+ actions.append(trigger);
1075
1182
  }
1076
1183
  const inspector = root.querySelector('[part=inspector]');
1077
1184
  const heading = document.createElement("div");
@@ -1170,6 +1277,7 @@ export class ProcessModeler extends BaseElement {
1170
1277
  this.narrowValue = narrow;
1171
1278
  this.toggleAttribute("data-narrow", narrow);
1172
1279
  this.toggleAttribute('data-phone', entries[0].contentRect.width < 560);
1280
+ this.toggleAttribute('data-compact-toolbar', entries[0].contentRect.width <= 1100);
1173
1281
  this.toggleAttribute('data-hide-tidy', entries[0].contentRect.width <= 560);
1174
1282
  this.renderSelectionToolbar();
1175
1283
  this.positionSelectionToolbar();
@@ -2616,9 +2724,10 @@ export class ProcessModeler extends BaseElement {
2616
2724
  this.transientChooserAnchor = undefined;
2617
2725
  document.removeEventListener('pointerdown', this.dismissKeyboardChooserOutside, true);
2618
2726
  this.keyboardInsertion = undefined;
2619
- if (returnFocus)
2620
- this.keyboardReturn?.focus({ preventScroll: true });
2727
+ const target = this.keyboardReturn;
2621
2728
  this.keyboardReturn = undefined;
2729
+ if (returnFocus)
2730
+ target?.focus({ preventScroll: true });
2622
2731
  }
2623
2732
  dismissKeyboardChooserOutside = (event) => {
2624
2733
  const chooser = this.shadowRoot?.querySelector('[part=keyboard-chooser]');
@@ -3462,14 +3571,17 @@ export class ProcessModeler extends BaseElement {
3462
3571
  checks.append(button);
3463
3572
  });
3464
3573
  }
3465
- renderField(box, field) {
3574
+ renderField(box, field, helpOpen = false) {
3466
3575
  const row = document.createElement('div');
3467
3576
  row.setAttribute('part', 'field');
3468
3577
  const label = document.createElement('label');
3469
3578
  label.textContent = field.label;
3470
3579
  let control;
3471
- if (field.kind === 'multiline')
3580
+ if (field.kind === 'multiline' || (field.kind === 'expression' && (field.expression?.rows ?? 1) > 1)) {
3472
3581
  control = document.createElement('textarea');
3582
+ if (field.expression?.rows)
3583
+ control.rows = Math.max(2, Math.floor(field.expression.rows));
3584
+ }
3473
3585
  else if (field.kind === 'choice') {
3474
3586
  const select = document.createElement('select');
3475
3587
  const groups = new Map();
@@ -3498,14 +3610,20 @@ export class ProcessModeler extends BaseElement {
3498
3610
  control = input;
3499
3611
  }
3500
3612
  control.dataset.field = field.key;
3613
+ control.dataset.fieldBox = box.id;
3501
3614
  if (control instanceof HTMLInputElement && control.type === 'checkbox')
3502
3615
  control.checked = Boolean(field.value);
3503
3616
  else
3504
3617
  control.value = field.kind === 'action' ? field.options?.find(option => option.value === field.value)?.label ?? String(field.value) : String(field.value);
3505
3618
  control.disabled = Boolean(field.disabled || this.locked);
3506
3619
  control.required = Boolean(field.required);
3507
- if (field.placeholder && control instanceof HTMLInputElement)
3620
+ if (field.placeholder && (control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement))
3508
3621
  control.placeholder = field.placeholder;
3622
+ if (field.kind === 'expression') {
3623
+ control.spellcheck = false;
3624
+ control.setAttribute('autocomplete', 'off');
3625
+ control.setAttribute('part', 'expression-control');
3626
+ }
3509
3627
  if (field.problem)
3510
3628
  control.setAttribute('aria-invalid', 'true');
3511
3629
  const submit = () => emit(this, 'process-field-change-request', { boxId: box.id, path: box.path, key: field.key, value: control instanceof HTMLInputElement && control.type === 'checkbox' ? control.checked : control instanceof HTMLInputElement && control.type === 'number' && control.value !== '' ? Number(control.value) : control.value });
@@ -3642,30 +3760,88 @@ export class ProcessModeler extends BaseElement {
3642
3760
  control.setAttribute('list', options.id);
3643
3761
  row.append(options);
3644
3762
  }
3645
- if (field.kind === 'expression' && this.variables.length) {
3763
+ const scope = field.expression?.variables ?? this.variables;
3764
+ if (field.kind === 'expression' && scope.length) {
3646
3765
  const chips = document.createElement('div');
3647
3766
  chips.setAttribute('part', 'variable-chips');
3648
- chips.setAttribute('aria-label', 'Variables in scope');
3649
- for (const variable of this.variables) {
3767
+ chips.setAttribute('role', 'group');
3768
+ chips.setAttribute('aria-label', 'Insert a variable');
3769
+ for (const variable of scope) {
3650
3770
  const chip = document.createElement('button');
3651
3771
  chip.type = 'button';
3652
3772
  chip.textContent = variable.name;
3653
3773
  chip.disabled = control.disabled;
3654
- chip.onclick = () => { control.value += variable.name; submit(); control.focus(); };
3774
+ if (variable.description)
3775
+ chip.title = variable.description;
3776
+ chip.addEventListener('pointerdown', event => event.preventDefault());
3777
+ chip.onclick = () => {
3778
+ if (control.disabled || !control.isConnected || this.selected?.id !== box.id)
3779
+ return;
3780
+ const input = control;
3781
+ const session = this.layoutEditSession;
3782
+ const start = input.selectionStart ?? input.value.length, end = input.selectionEnd ?? start;
3783
+ input.focus();
3784
+ if (session !== this.layoutEditSession || !input.isConnected || input.disabled || this.locked || this.selected?.id !== box.id || this.shadowRoot?.activeElement !== input || input.closest('[inert]'))
3785
+ return;
3786
+ input.value = input.value.slice(0, start) + variable.name + input.value.slice(end);
3787
+ input.setSelectionRange(start + variable.name.length, start + variable.name.length);
3788
+ submit();
3789
+ };
3655
3790
  chips.append(chip);
3656
3791
  }
3657
3792
  row.append(chips);
3658
3793
  }
3794
+ const messageId = `process-field-${encodeURIComponent(box.id)}-${encodeURIComponent(field.key)}`;
3795
+ const describedBy = [];
3659
3796
  if (field.description) {
3660
3797
  const help = document.createElement('small');
3798
+ help.id = `${messageId}-description`;
3661
3799
  help.textContent = field.description;
3662
3800
  row.append(help);
3663
- }
3664
- if (field.problem) {
3665
- const problem = document.createElement('small');
3666
- problem.setAttribute('part', 'field-problem');
3667
- problem.textContent = field.problem;
3668
- row.append(problem);
3801
+ describedBy.push(help.id);
3802
+ }
3803
+ const feedback = field.problem || (field.kind === 'expression' ? field.expression?.feedback?.message : undefined);
3804
+ if (feedback) {
3805
+ const message = document.createElement('small');
3806
+ message.id = `${messageId}-feedback`;
3807
+ message.textContent = feedback;
3808
+ message.setAttribute('part', field.problem ? 'field-problem' : 'field-feedback');
3809
+ if (field.kind === 'expression')
3810
+ message.setAttribute('aria-live', 'polite');
3811
+ if (!field.problem && field.expression?.feedback?.tone)
3812
+ message.dataset.tone = field.expression.feedback.tone;
3813
+ const chips = row.querySelector('[part=variable-chips]');
3814
+ row.insertBefore(message, chips);
3815
+ describedBy.push(message.id);
3816
+ }
3817
+ if (describedBy.length)
3818
+ control.setAttribute('aria-describedby', describedBy.join(' '));
3819
+ if (field.kind === 'expression' && field.expression?.help) {
3820
+ const details = document.createElement('details');
3821
+ details.setAttribute('part', 'expression-help');
3822
+ details.dataset.helpField = field.key;
3823
+ details.dataset.session = String(this.layoutEditSession);
3824
+ details.open = helpOpen;
3825
+ const summary = document.createElement('summary');
3826
+ summary.textContent = field.expression.help.summary;
3827
+ details.append(summary);
3828
+ const list = document.createElement('ul');
3829
+ details.append(list);
3830
+ for (const example of field.expression.help.examples) {
3831
+ const paragraph = document.createElement('li'), code = document.createElement('code');
3832
+ code.textContent = example.expression;
3833
+ paragraph.append(code, document.createTextNode(' '));
3834
+ if (example.segments)
3835
+ for (const segment of example.segments) {
3836
+ const run = document.createElement(segment.format === 'code' ? 'code' : 'span');
3837
+ run.textContent = segment.text;
3838
+ paragraph.append(run);
3839
+ }
3840
+ else
3841
+ paragraph.append(document.createTextNode(example.description));
3842
+ list.append(paragraph);
3843
+ }
3844
+ row.append(details);
3669
3845
  }
3670
3846
  return row;
3671
3847
  }
@@ -3676,14 +3852,20 @@ export class ProcessModeler extends BaseElement {
3676
3852
  const focusedControl = this.shadowRoot.activeElement;
3677
3853
  const focusedKey = focusedControl?.dataset.field ?? focusedControl?.dataset.variable ?? focusedControl?.dataset.localVariable;
3678
3854
  const variableKey = focusedControl?.dataset.variableKey;
3855
+ const fieldBox = focusedControl?.dataset.fieldBox;
3679
3856
  const localKey = focusedControl?.dataset.localKey, localName = focusedControl?.dataset.localName;
3680
3857
  const focusedType = focusedControl?.dataset.field !== undefined ? 'field' : focusedControl?.dataset.variable !== undefined ? 'variable' : focusedControl?.dataset.localVariable !== undefined ? 'localVariable' : null;
3681
3858
  const caret = focusedControl && 'selectionStart' in focusedControl ? focusedControl.selectionStart : null;
3859
+ const selectionEnd = focusedControl && 'selectionEnd' in focusedControl ? focusedControl.selectionEnd : null;
3860
+ const direction = focusedControl && 'selectionDirection' in focusedControl ? focusedControl.selectionDirection : null;
3861
+ const scrollTop = focusedControl?.scrollTop, scrollLeft = focusedControl?.scrollLeft;
3682
3862
  const restoreControlFocus = () => {
3683
3863
  if (focusedKey === undefined || !focusedType)
3684
3864
  return;
3865
+ if (focusedType === 'field' && (this.selected?.id !== fieldBox || this.locked))
3866
+ return;
3685
3867
  const controls = Array.from(this.shadowRoot.querySelectorAll('input,textarea,select,button'));
3686
- const control = controls.find(item => item.dataset[focusedType] === focusedKey && (focusedType !== 'variable' || item.dataset.variableKey === variableKey) && focusedType !== 'localVariable')
3868
+ const control = controls.find(item => item.dataset[focusedType] === focusedKey && (focusedType !== 'field' || item.dataset.fieldBox === fieldBox) && (focusedType !== 'variable' || item.dataset.variableKey === variableKey) && focusedType !== 'localVariable')
3687
3869
  ?? (focusedType === 'variable' ? controls.find(item => this.pendingVariableRename?.name === focusedKey && item.dataset.variable === this.pendingVariableRename.value && item.dataset.variableKey === variableKey) ?? controls.find(item => item.dataset.variableKey === 'add') : undefined);
3688
3870
  if (focusedType === 'localVariable') {
3689
3871
  if (focusedControl?.dataset.localAmbiguous === 'true') {
@@ -3712,11 +3894,15 @@ export class ProcessModeler extends BaseElement {
3712
3894
  localControl.setSelectionRange(caret, caret);
3713
3895
  return;
3714
3896
  }
3715
- if (!control)
3897
+ if (!control || control.disabled || control.closest('[inert]'))
3716
3898
  return;
3717
- control.focus();
3899
+ control.focus({ preventScroll: true });
3718
3900
  if (caret !== null && (control instanceof HTMLInputElement || control instanceof HTMLTextAreaElement) && control.type !== 'number' && control.type !== 'checkbox')
3719
- control.setSelectionRange(caret, caret);
3901
+ control.setSelectionRange(caret, selectionEnd ?? caret, direction ?? undefined);
3902
+ if (scrollTop !== undefined)
3903
+ control.scrollTop = scrollTop;
3904
+ if (scrollLeft !== undefined)
3905
+ control.scrollLeft = scrollLeft;
3720
3906
  };
3721
3907
  this.shadowRoot.querySelectorAll('[part=minimap] [data-map-box]').forEach(rect => rect.dataset.selected = String(this.selectedIds.has(rect.dataset.mapBox)));
3722
3908
  this.shadowRoot.querySelectorAll('[part=line]').forEach(line => { const selected = this.selectedLineIds.has(line.dataset.lineId); line.dataset.selected = String(selected); line.setAttribute('marker-end', `url(#${selected ? 'boe-process-arrow-brand' : 'boe-process-arrow'})`); });
@@ -3729,7 +3915,8 @@ export class ProcessModeler extends BaseElement {
3729
3915
  });
3730
3916
  const editor = this.shadowRoot.querySelector("[part=editor]");
3731
3917
  const selected = this.selected;
3732
- const controlsKey = `${[...this.selectedIds].join(',')}|${this.locked}|${this.disableConnections}|${this.showLastRunValue}|${selected?.runMetrics}|${JSON.stringify([selected?.localVariables, selected?.localVariablesEditable, selected?.frame])}|${JSON.stringify(selected ? this.fieldsValue[selected.id] ?? [] : [])}`;
3918
+ const fallbackScope = selected && (this.fieldsValue[selected.id] ?? []).some(field => field.kind === 'expression' && field.expression?.variables === undefined) ? this.variables.map(({ name, description }) => ({ name, description })) : undefined;
3919
+ const controlsKey = `${JSON.stringify(fallbackScope)}|${[...this.selectedIds].join(',')}|${this.locked}|${this.disableConnections}|${this.showLastRunValue}|${selected?.runMetrics}|${JSON.stringify([selected?.localVariables, selected?.localVariablesEditable, selected?.frame])}|${JSON.stringify(selected ? this.fieldsValue[selected.id] ?? [] : [])}`;
3733
3920
  this.shadowRoot.querySelector("[part=palette]").hidden = false;
3734
3921
  this.shadowRoot.querySelector('[part=selection-toolbar]').hidden = this.selection.length === 0;
3735
3922
  this.renderSelectionToolbar();
@@ -3749,6 +3936,13 @@ export class ProcessModeler extends BaseElement {
3749
3936
  restoreControlFocus();
3750
3937
  return;
3751
3938
  }
3939
+ const expressionHelp = new Map();
3940
+ if (this.inspectedId === selected?.id && this.selectedIds.size === 1) {
3941
+ for (const help of Array.from(editor.querySelectorAll('[part=expression-help]'))) {
3942
+ if (help.dataset.session === String(this.layoutEditSession))
3943
+ expressionHelp.set(help.dataset.helpField, help.open);
3944
+ }
3945
+ }
3752
3946
  this.cleanupInspector?.();
3753
3947
  this.cleanupInspector = undefined;
3754
3948
  editor.replaceChildren();
@@ -3798,7 +3992,7 @@ export class ProcessModeler extends BaseElement {
3798
3992
  editor.append(purpose);
3799
3993
  }
3800
3994
  for (const field of this.fieldsValue[selected.id] ?? [])
3801
- editor.append(this.renderField(selected, field));
3995
+ editor.append(this.renderField(selected, field, expressionHelp.get(field.key)));
3802
3996
  if (selected.localVariables !== undefined)
3803
3997
  editor.append(this.renderLocalVariables(selected));
3804
3998
  this.cleanupInspector =
@@ -4057,21 +4251,49 @@ export class ProcessModeler extends BaseElement {
4057
4251
  button("undo").disabled = !this.history.canUndo || this.locked;
4058
4252
  button("redo").disabled = !this.history.canRedo || this.locked;
4059
4253
  button("tidy").disabled = this.locked;
4254
+ this.shadowRoot.querySelector('[part=toolbar-title]').textContent = this.processTitleValue;
4255
+ for (const command of ['undo', 'redo', 'tidy'])
4256
+ this.shadowRoot.querySelector(`[data-view-option=${command}]`).disabled = button(command).disabled;
4060
4257
  button("lock").setAttribute("aria-pressed", String(this.locked));
4061
4258
  button("snap").setAttribute("aria-pressed", String(this.snapToGrid));
4062
4259
  this.shadowRoot.querySelectorAll('[data-detail]').forEach(control => {
4063
- control.setAttribute("aria-pressed", String(control.dataset.detail === this.detailValue));
4260
+ if (!control.closest('[part=view-menu]'))
4261
+ control.setAttribute("aria-pressed", String(control.dataset.detail === this.detailValue));
4262
+ if (control.closest('[part=view-menu]'))
4263
+ control.setAttribute('aria-checked', String(control.dataset.detail === this.detailValue));
4264
+ if (control.closest('[part=view-menu]'))
4265
+ control.textContent = `${control.dataset.detail === this.detailValue ? '✓ ' : ''}${control.dataset.detail === 'business' ? 'Business view' : 'Technical view'}`;
4064
4266
  });
4065
4267
  const runToggle = this.shadowRoot.querySelector('[part=run-toggle]');
4066
4268
  runToggle.hidden = !this.lastRunValue;
4067
4269
  runToggle.querySelector('input').checked = this.showLastRunValue;
4068
4270
  const mobileRun = this.shadowRoot.querySelector('[data-view-option=last-run]');
4069
4271
  mobileRun.hidden = !this.lastRunValue;
4070
- mobileRun.setAttribute('aria-pressed', String(this.showLastRunValue));
4272
+ mobileRun.removeAttribute('aria-pressed');
4273
+ mobileRun.textContent = this.showLastRunValue ? 'Hide last run' : 'Show last run';
4071
4274
  const checksStatus = button('checks-status');
4072
4275
  const count = this.allChecks.length;
4073
- checksStatus.textContent = count ? `${count} ${count === 1 ? 'problem' : 'problems'}` : '✓ Ready to run';
4276
+ const glyph = svgElement('svg');
4277
+ glyph.setAttribute('viewBox', '0 0 16 16');
4278
+ glyph.setAttribute('aria-hidden', 'true');
4279
+ const circle = svgElement('circle');
4280
+ circle.setAttribute('cx', '8');
4281
+ circle.setAttribute('cy', '8');
4282
+ circle.setAttribute('r', '7');
4283
+ circle.setAttribute('fill', 'currentColor');
4284
+ const mark = svgElement('path');
4285
+ mark.setAttribute('d', count ? 'm5 5 6 6m0-6-6 6' : 'm4.5 8 2.5 2.5 4.5-5');
4286
+ mark.setAttribute('stroke', 'var(--boe-token-surface-surface, #fff)');
4287
+ mark.setAttribute('stroke-width', '1.5');
4288
+ mark.setAttribute('fill', 'none');
4289
+ mark.setAttribute('stroke-linecap', 'round');
4290
+ mark.setAttribute('stroke-linejoin', 'round');
4291
+ glyph.append(circle, mark);
4292
+ const label = document.createElement('span');
4293
+ label.textContent = count ? `${count} ${count === 1 ? 'thing needs' : 'things need'} attention` : 'Ready to run';
4294
+ checksStatus.replaceChildren(glyph, label);
4074
4295
  checksStatus.dataset.state = count ? 'bad' : 'ready';
4296
+ this.shadowRoot.querySelector('[data-view-option=checks]').textContent = count ? `Checks (${count})` : 'Checks: ready to run';
4075
4297
  }
4076
4298
  paintViewport() {
4077
4299
  const world = this.shadowRoot.querySelector("[part=world]");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unofficialbox/box-open-elements",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
4
4
  "description": "Box Open Elements: an open, framework-agnostic design system and web component library for Box-style experiences",
5
5
  "license": "MIT",
6
6
  "homepage": "https://unofficialbox.github.io/box-open-elements",