@bpmnkit/plugins 0.0.12 → 0.0.14

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.
@@ -1,4 +1,4 @@
1
1
  export declare const CONFIG_PANEL_STYLE_ID = "bpmnkit-config-panel-styles-v1";
2
- export declare const CONFIG_PANEL_CSS = "\n/* \u2500\u2500 Inspector panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/*\n * top: 36px matches the height of the .bpmnkit-tabs bar from canvas-plugin-tabs,\n * so the inspector panel does not overlap the tab bar.\n */\n.bpmnkit-cfg-full {\n position: fixed;\n right: 0;\n top: 36px;\n bottom: 0;\n width: 320px;\n background: var(--bpmnkit-panel-bg, rgba(13,13,22,0.92));\n backdrop-filter: blur(16px);\n border-left: 1px solid var(--bpmnkit-panel-border, rgba(255,255,255,0.08));\n box-shadow: -8px 0 40px rgba(0,0,0,0.6);\n display: flex;\n flex-direction: column;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 13px;\n color: rgba(255,255,255,0.85);\n z-index: 9999;\n transition: width 0.2s ease;\n}\n.bpmnkit-cfg-full--collapsed {\n width: 40px;\n}\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-info,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-close,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-docs-link,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-search-bar,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-guide-bar,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-tabs-area,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-body,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-search-results {\n display: none;\n}\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-header {\n justify-content: center;\n padding: 14px 0;\n}\n\n/* Hosted mode \u2014 renders inside a dock pane instead of as a fixed overlay */\n.bpmnkit-cfg-full--hosted {\n position: static !important;\n width: auto !important;\n top: auto; right: auto; bottom: auto;\n box-shadow: none; border-left: none; backdrop-filter: none;\n flex: 1; min-height: 0;\n}\n/* suppress controls that the dock replaces */\n.bpmnkit-cfg-full--hosted .bpmnkit-cfg-resize-handle,\n.bpmnkit-cfg-full--hosted .bpmnkit-cfg-collapse-btn { display: none; }\n\n/* Resize handle \u2014 a thin grab zone along the left edge */\n.bpmnkit-cfg-resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 5px;\n cursor: ew-resize;\n z-index: 1;\n}\n.bpmnkit-cfg-resize-handle:hover {\n background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-full-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px 10px;\n border-bottom: 1px solid rgba(255,255,255,0.08);\n flex-shrink: 0;\n}\n.bpmnkit-cfg-full-info {\n flex: 1;\n min-width: 0;\n}\n.bpmnkit-cfg-full-type {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: rgba(255,255,255,0.35);\n margin-bottom: 2px;\n}\n.bpmnkit-cfg-full-template {\n font-size: 11px;\n font-weight: 600;\n color: var(--bpmnkit-accent, #6b9df7);\n margin-bottom: 1px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.bpmnkit-cfg-full-name {\n font-size: 14px;\n font-weight: 600;\n color: #fff;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* Docs link \u2014 ? button shown when the schema has a documentationRef */\n.bpmnkit-cfg-docs-link {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n border: 1px solid rgba(255,255,255,0.2);\n color: rgba(255,255,255,0.45);\n font-size: 11px;\n font-weight: 700;\n text-decoration: none;\n flex-shrink: 0;\n transition: border-color 0.1s, color 0.1s, background 0.1s;\n}\n.bpmnkit-cfg-docs-link:hover {\n color: var(--bpmnkit-accent, #6b9df7);\n border-color: var(--bpmnkit-accent, #6b9df7);\n background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n}\n.bpmnkit-cfg-collapse-btn {\n width: 28px;\n height: 28px;\n background: none;\n border: none;\n color: rgba(255,255,255,0.4);\n cursor: pointer;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n transition: background 0.1s, color 0.1s;\n}\n.bpmnkit-cfg-collapse-btn:hover { background: rgba(255,255,255,0.08); color: #fff; }\n.bpmnkit-cfg-full-close {\n width: 28px;\n height: 28px;\n background: none;\n border: none;\n color: rgba(255,255,255,0.4);\n cursor: pointer;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-size: 20px;\n line-height: 1;\n flex-shrink: 0;\n transition: background 0.1s, color 0.1s;\n}\n.bpmnkit-cfg-full-close:hover { background: rgba(255,255,255,0.08); color: #fff; }\n\n/* \u2500\u2500 Search bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-search-bar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n flex-shrink: 0;\n}\n.bpmnkit-cfg-search-input {\n flex: 1;\n height: 28px;\n padding: 0 8px;\n background: rgba(255,255,255,0.07);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 5px;\n color: rgba(255,255,255,0.85);\n font-size: 12px;\n font-family: system-ui, -apple-system, sans-serif;\n outline: none;\n transition: border-color 0.15s, background 0.15s;\n box-sizing: border-box;\n}\n.bpmnkit-cfg-search-input::placeholder { color: rgba(255,255,255,0.28); }\n.bpmnkit-cfg-search-input:focus {\n border-color: var(--bpmnkit-accent, #6b9df7);\n background: rgba(255,255,255,0.1);\n}\n.bpmnkit-cfg-search-clear {\n width: 22px;\n height: 22px;\n background: none;\n border: none;\n color: rgba(255,255,255,0.35);\n cursor: pointer;\n padding: 0;\n /* display toggled via JS */\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n font-size: 14px;\n flex-shrink: 0;\n transition: color 0.1s, background 0.1s;\n}\n.bpmnkit-cfg-search-clear:hover { color: #fff; background: rgba(255,255,255,0.08); }\n\n/* \u2500\u2500 Guide bar (field assistant) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-guide-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 7px 14px;\n background: rgba(248, 113, 113, 0.09);\n border-bottom: 1px solid rgba(248, 113, 113, 0.18);\n flex-shrink: 0;\n}\n.bpmnkit-cfg-guide-info {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n}\n.bpmnkit-cfg-guide-icon {\n width: 16px;\n height: 16px;\n background: var(--bpmnkit-danger, #f87171);\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: 800;\n color: #fff;\n flex-shrink: 0;\n line-height: 1;\n}\n.bpmnkit-cfg-guide-text {\n font-size: 11px;\n font-weight: 500;\n color: rgba(248, 113, 113, 0.9);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.bpmnkit-cfg-guide-btn {\n flex-shrink: 0;\n padding: 3px 10px;\n border-radius: 4px;\n border: 1px solid rgba(248, 113, 113, 0.4);\n background: rgba(248, 113, 113, 0.12);\n color: var(--bpmnkit-danger, #f87171);\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.1s, border-color 0.1s;\n white-space: nowrap;\n}\n.bpmnkit-cfg-guide-btn:hover {\n background: rgba(248, 113, 113, 0.22);\n border-color: rgba(248, 113, 113, 0.6);\n}\n\n/* \u2500\u2500 Search results \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-search-results {\n flex: 1;\n overflow-y: auto;\n padding: 4px 22px 32px;\n scrollbar-width: thin;\n scrollbar-color: rgba(255,255,255,0.15) transparent;\n}\n.bpmnkit-cfg-search-group-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: rgba(255,255,255,0.3);\n margin: 16px 0 10px;\n padding-bottom: 5px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n}\n.bpmnkit-cfg-search-group-label:first-child { margin-top: 10px; }\n.bpmnkit-cfg-search-empty {\n font-size: 12px;\n color: rgba(255,255,255,0.3);\n text-align: center;\n padding: 28px 0;\n}\n\n/* \u2500\u2500 Tabs area (wrapper + scroll buttons) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-tabs-area {\n display: flex;\n align-items: stretch;\n border-bottom: 1px solid rgba(255,255,255,0.08);\n flex-shrink: 0;\n overflow: hidden;\n}\n.bpmnkit-cfg-tabs {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: flex-end;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.bpmnkit-cfg-tabs::-webkit-scrollbar { display: none; }\n.bpmnkit-cfg-tab-btn {\n padding: 10px 14px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n color: rgba(255,255,255,0.4);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n transition: color 0.1s, border-color 0.1s;\n margin-bottom: -1px;\n flex-shrink: 0;\n}\n.bpmnkit-cfg-tab-btn:hover { color: rgba(255,255,255,0.75); }\n.bpmnkit-cfg-tab-btn.active { color: var(--bpmnkit-accent, #6b9df7); border-bottom-color: var(--bpmnkit-accent, #6b9df7); }\n/* Red dot shown after tab label when the group has required-empty fields */\n.bpmnkit-cfg-tab-btn.has-error::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--bpmnkit-danger, #f87171);\n margin-left: 5px;\n vertical-align: middle;\n flex-shrink: 0;\n}\n\n/* Arrow buttons for overflowing tabs */\n.bpmnkit-cfg-tabs-scroll-btn {\n flex-shrink: 0;\n width: 26px;\n background: none;\n border: none;\n border-radius: 0;\n color: rgba(255,255,255,0.5);\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n padding: 0;\n /* display toggled via JS */\n align-items: center;\n justify-content: center;\n transition: background 0.1s, color 0.1s;\n}\n.bpmnkit-cfg-tabs-scroll-btn:hover { color: #fff; background: rgba(255,255,255,0.08); }\n.bpmnkit-cfg-tabs-scroll-btn--prev { border-right: 1px solid rgba(255,255,255,0.06); }\n.bpmnkit-cfg-tabs-scroll-btn--next { border-left: 1px solid rgba(255,255,255,0.06); }\n\n/* \u2500\u2500 Scrollable body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-full-body {\n flex: 1;\n overflow-y: auto;\n padding: 22px 22px 32px;\n scrollbar-width: thin;\n scrollbar-color: rgba(255,255,255,0.15) transparent;\n}\n\n/* \u2500\u2500 Groups & Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-group-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: rgba(255,255,255,0.3);\n margin-bottom: 14px;\n padding-bottom: 6px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n}\n.bpmnkit-cfg-field {\n margin-bottom: 14px;\n}\n.bpmnkit-cfg-field-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n color: rgba(255,255,255,0.55);\n margin-bottom: 5px;\n cursor: default;\n}\n.bpmnkit-cfg-field-label[title] { cursor: help; }\n.bpmnkit-cfg-field-docs {\n font-size: 10px;\n color: var(--bpmnkit-accent, #6b9df7);\n text-decoration: none;\n opacity: 0.7;\n transition: opacity 0.1s;\n}\n.bpmnkit-cfg-field-docs:hover { opacity: 1; }\n.bpmnkit-cfg-required-star {\n color: var(--bpmnkit-danger, #f87171);\n font-weight: 700;\n margin-left: 2px;\n}\n.bpmnkit-cfg-field--invalid {\n border-left: 2px solid var(--bpmnkit-danger, #f87171);\n padding-left: 8px;\n}\n.bpmnkit-cfg-field--invalid .bpmnkit-cfg-input,\n.bpmnkit-cfg-field--invalid .bpmnkit-cfg-select,\n.bpmnkit-cfg-field--invalid .bpmnkit-cfg-textarea {\n border-color: var(--bpmnkit-danger, #f87171);\n}\n\n.bpmnkit-cfg-input,\n.bpmnkit-cfg-select,\n.bpmnkit-cfg-textarea {\n width: 100%;\n padding: 7px 10px;\n background: rgba(255,255,255,0.06);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 6px;\n color: rgba(255,255,255,0.9);\n font-size: 12px;\n font-family: system-ui, -apple-system, sans-serif;\n outline: none;\n transition: border-color 0.15s, background 0.15s;\n box-sizing: border-box;\n}\n.bpmnkit-cfg-input:focus,\n.bpmnkit-cfg-select:focus,\n.bpmnkit-cfg-textarea:focus {\n border-color: var(--bpmnkit-accent, #6b9df7);\n background-color: rgba(255,255,255,0.09);\n}\n.bpmnkit-cfg-select {\n appearance: none;\n cursor: pointer;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(255,255,255,0.4)' stroke-width='1.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 28px;\n}\n.bpmnkit-cfg-textarea {\n resize: vertical;\n min-height: 68px;\n line-height: 1.5;\n font-family: var(--bpmnkit-font-mono, ui-monospace, \"SF Mono\", monospace);\n font-size: 11px;\n}\n.bpmnkit-cfg-field-hint {\n font-size: 11px;\n color: rgba(255,255,255,0.3);\n margin-top: 4px;\n line-height: 1.4;\n}\n\n/* \u2500\u2500 Field error message \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-field-error {\n font-size: 11px;\n color: var(--bpmnkit-danger, #f87171);\n margin-top: 3px;\n line-height: 1.3;\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-field-error { color: var(--bpmnkit-danger, #dc2626); }\n\n/* \u2500\u2500 FEEL expression field \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* FEEL/string mode toggle \u2014 appears at the right end of a feel-expression label row */\n.bpmnkit-cfg-feel-mode-btn {\n margin-left: auto;\n flex-shrink: 0;\n padding: 1px 6px;\n border-radius: 3px;\n border: 1px solid rgba(255,255,255,0.12);\n background: none;\n color: rgba(255,255,255,0.3);\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n cursor: pointer;\n transition: background 0.1s, color 0.1s, border-color 0.1s;\n}\n.bpmnkit-cfg-feel-mode-btn:hover {\n background: rgba(255,255,255,0.06);\n color: rgba(255,255,255,0.55);\n}\n.bpmnkit-cfg-feel-mode-btn--active {\n border-color: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n color: var(--bpmnkit-accent, #6b9df7);\n}\n.bpmnkit-cfg-feel-mode-btn--active:hover { background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15)); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn {\n border-color: rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.3);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn:hover {\n background: rgba(0,0,0,0.05);\n color: rgba(0,0,0,0.55);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn--active {\n border-color: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12));\n background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12));\n color: var(--bpmnkit-accent, #1a56db);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn--active:hover { background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12)); }\n\n.bpmnkit-cfg-feel-ta {\n width: 100%;\n min-height: 68px;\n padding: 7px 10px;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 6px;\n font-size: 11px;\n font-family: var(--bpmnkit-font-mono, ui-monospace, \"SF Mono\", monospace);\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 0.15s;\n box-sizing: border-box;\n}\n\n.bpmnkit-cfg-feel-playground-btn {\n display: inline-flex;\n margin-top: 4px;\n padding: 3px 8px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.12);\n background: none;\n color: var(--bpmnkit-accent, #6b9df7);\n font-size: 11px;\n cursor: pointer;\n transition: background 0.1s;\n}\n.bpmnkit-cfg-feel-playground-btn:hover { background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15)); }\n\n/* Light theme overrides */\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-playground-btn {\n border-color: rgba(0,0,0,0.12);\n color: var(--bpmnkit-accent, #1a56db);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-playground-btn:hover { background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12)); }\n\n/* \u2500\u2500 Toggle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-toggle-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.bpmnkit-cfg-toggle-label {\n font-size: 12px;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n}\n.bpmnkit-cfg-toggle-label[title] { cursor: help; }\n.bpmnkit-cfg-toggle {\n position: relative;\n display: inline-flex;\n width: 34px;\n height: 18px;\n flex-shrink: 0;\n cursor: pointer;\n}\n.bpmnkit-cfg-toggle input {\n opacity: 0;\n width: 0;\n height: 0;\n position: absolute;\n}\n.bpmnkit-cfg-toggle-track {\n position: absolute;\n inset: 0;\n background: rgba(255,255,255,0.15);\n border-radius: 9px;\n transition: background 0.2s;\n}\n.bpmnkit-cfg-toggle input:checked + .bpmnkit-cfg-toggle-track { background: var(--bpmnkit-accent, #6b9df7); }\n.bpmnkit-cfg-toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n background: #fff;\n border-radius: 50%;\n transition: transform 0.2s;\n pointer-events: none;\n}\n.bpmnkit-cfg-toggle input:checked ~ .bpmnkit-cfg-toggle-thumb { transform: translateX(16px); }\n\n/* \u2500\u2500 Action button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.15);\n background: rgba(255,255,255,0.07);\n color: rgba(255,255,255,0.85);\n font-size: 12px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.bpmnkit-cfg-action-btn:hover {\n background: rgba(255,255,255,0.13);\n border-color: rgba(255,255,255,0.25);\n}\n\n/* \u2500\u2500 Light theme overrides \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full {\n background: var(--bpmnkit-panel-bg, rgba(255,255,255,0.92));\n border-left-color: var(--bpmnkit-panel-border, rgba(0,0,0,0.08));\n box-shadow: -8px 0 40px rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.85);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-header { border-bottom-color: rgba(0,0,0,0.07); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-type { color: rgba(0,0,0,0.35); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-template { color: var(--bpmnkit-accent, #1a56db); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-name { color: rgba(0,0,0,0.9); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-docs-link { color: rgba(0,0,0,0.4); border-color: rgba(0,0,0,0.2); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-docs-link:hover { color: var(--bpmnkit-accent, #1a56db); border-color: var(--bpmnkit-accent, #1a56db); background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12)); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-collapse-btn { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-collapse-btn:hover { background: rgba(0,0,0,0.06); color: rgba(0,0,0,0.9); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-close { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-close:hover { background: rgba(0,0,0,0.06); color: rgba(0,0,0,0.9); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-bar { border-bottom-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-input {\n background: rgba(0,0,0,0.04);\n border-color: rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.85);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-input::placeholder { color: rgba(0,0,0,0.3); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-clear { color: rgba(0,0,0,0.35); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-clear:hover { color: rgba(0,0,0,0.9); background: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-results { scrollbar-color: rgba(0,0,0,0.15) transparent; }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-group-label { color: rgba(0,0,0,0.35); border-bottom-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-empty { color: rgba(0,0,0,0.35); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-area { border-bottom-color: rgba(0,0,0,0.07); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tab-btn { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tab-btn:hover { color: rgba(0,0,0,0.7); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn:hover { color: rgba(0,0,0,0.9); background: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn--prev { border-right-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn--next { border-left-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-body { scrollbar-color: rgba(0,0,0,0.15) transparent; }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-group-label {\n color: rgba(0,0,0,0.35);\n border-bottom-color: rgba(0,0,0,0.06);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-field-label { color: rgba(0,0,0,0.55); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-field-hint { color: rgba(0,0,0,0.4); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-input,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-select,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-textarea {\n background-color: rgba(0,0,0,0.04);\n border-color: rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.85);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-input:focus,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-select:focus,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-textarea:focus {\n background-color: rgba(0,0,0,0.06);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-select {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(0,0,0,0.45)' stroke-width='1.5'/%3E%3C/svg%3E\");\n}\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-toggle-label { color: rgba(0,0,0,0.7); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-toggle-track { background: rgba(0,0,0,0.12); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-action-btn {\n border-color: rgba(0,0,0,0.15);\n background: rgba(0,0,0,0.04);\n color: rgba(0,0,0,0.75);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-action-btn:hover {\n background: rgba(0,0,0,0.08);\n border-color: rgba(0,0,0,0.2);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-resize-handle:hover {\n background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12));\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-bar {\n background: rgba(248, 113, 113, 0.06);\n border-bottom-color: rgba(248, 113, 113, 0.15);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-text { color: var(--bpmnkit-danger, #dc2626); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-btn {\n color: var(--bpmnkit-danger, #dc2626);\n border-color: rgba(220, 38, 38, 0.3);\n background: rgba(220, 38, 38, 0.07);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-btn:hover {\n background: rgba(220, 38, 38, 0.14);\n border-color: rgba(220, 38, 38, 0.5);\n}\n";
2
+ export declare const CONFIG_PANEL_CSS = "\n/* \u2500\u2500 Inspector panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/*\n * top: 36px matches the height of the .bpmnkit-tabs bar from canvas-plugin-tabs,\n * so the inspector panel does not overlap the tab bar.\n */\n.bpmnkit-cfg-full {\n position: fixed;\n right: 0;\n top: 36px;\n bottom: 0;\n width: 320px;\n background: var(--bpmnkit-panel-bg, rgba(13,13,22,0.92));\n backdrop-filter: blur(16px);\n border-left: 1px solid var(--bpmnkit-panel-border, rgba(255,255,255,0.08));\n box-shadow: -8px 0 40px rgba(0,0,0,0.6);\n display: flex;\n flex-direction: column;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 13px;\n color: rgba(255,255,255,0.85);\n z-index: 9999;\n transition: width 0.2s ease;\n}\n.bpmnkit-cfg-full--collapsed {\n width: 40px;\n}\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-info,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-close,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-docs-link,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-search-bar,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-guide-bar,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-tabs-area,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-body,\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-search-results {\n display: none;\n}\n.bpmnkit-cfg-full--collapsed .bpmnkit-cfg-full-header {\n justify-content: center;\n padding: 14px 0;\n}\n\n/* Hosted mode \u2014 renders inside a dock pane instead of as a fixed overlay */\n.bpmnkit-cfg-full--hosted {\n position: static !important;\n width: auto !important;\n top: auto; right: auto; bottom: auto;\n box-shadow: none; border-left: none; backdrop-filter: none;\n flex: 1; min-height: 0;\n}\n/* suppress controls that the dock replaces */\n.bpmnkit-cfg-full--hosted .bpmnkit-cfg-resize-handle,\n.bpmnkit-cfg-full--hosted .bpmnkit-cfg-collapse-btn { display: none; }\n\n/* Resize handle \u2014 a thin grab zone along the left edge */\n.bpmnkit-cfg-resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 5px;\n cursor: ew-resize;\n z-index: 1;\n}\n.bpmnkit-cfg-resize-handle:hover {\n background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n}\n\n/* \u2500\u2500 Header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-full-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 14px 10px;\n border-bottom: 1px solid rgba(255,255,255,0.08);\n flex-shrink: 0;\n}\n.bpmnkit-cfg-full-info {\n flex: 1;\n min-width: 0;\n}\n.bpmnkit-cfg-full-type {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: rgba(255,255,255,0.35);\n margin-bottom: 2px;\n}\n.bpmnkit-cfg-full-template {\n font-size: 11px;\n font-weight: 600;\n color: var(--bpmnkit-accent, #6b9df7);\n margin-bottom: 1px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.bpmnkit-cfg-full-name {\n font-size: 14px;\n font-weight: 600;\n color: #fff;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n/* Docs link \u2014 ? button shown when the schema has a documentationRef */\n.bpmnkit-cfg-docs-link {\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n border: 1px solid rgba(255,255,255,0.2);\n color: rgba(255,255,255,0.45);\n font-size: 11px;\n font-weight: 700;\n text-decoration: none;\n flex-shrink: 0;\n transition: border-color 0.1s, color 0.1s, background 0.1s;\n}\n.bpmnkit-cfg-docs-link:hover {\n color: var(--bpmnkit-accent, #6b9df7);\n border-color: var(--bpmnkit-accent, #6b9df7);\n background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n}\n.bpmnkit-cfg-collapse-btn {\n width: 28px;\n height: 28px;\n background: none;\n border: none;\n color: rgba(255,255,255,0.4);\n cursor: pointer;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-size: 18px;\n line-height: 1;\n flex-shrink: 0;\n transition: background 0.1s, color 0.1s;\n}\n.bpmnkit-cfg-collapse-btn:hover { background: rgba(255,255,255,0.08); color: #fff; }\n.bpmnkit-cfg-full-close {\n width: 28px;\n height: 28px;\n background: none;\n border: none;\n color: rgba(255,255,255,0.4);\n cursor: pointer;\n padding: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n font-size: 20px;\n line-height: 1;\n flex-shrink: 0;\n transition: background 0.1s, color 0.1s;\n}\n.bpmnkit-cfg-full-close:hover { background: rgba(255,255,255,0.08); color: #fff; }\n\n/* \u2500\u2500 Search bar \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-search-bar {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 8px 12px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n flex-shrink: 0;\n}\n.bpmnkit-cfg-search-input {\n flex: 1;\n height: 28px;\n padding: 0 8px;\n background: rgba(255,255,255,0.07);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 5px;\n color: rgba(255,255,255,0.85);\n font-size: 12px;\n font-family: system-ui, -apple-system, sans-serif;\n outline: none;\n transition: border-color 0.15s, background 0.15s;\n box-sizing: border-box;\n}\n.bpmnkit-cfg-search-input::placeholder { color: rgba(255,255,255,0.28); }\n.bpmnkit-cfg-search-input:focus {\n border-color: var(--bpmnkit-accent, #6b9df7);\n background: rgba(255,255,255,0.1);\n}\n.bpmnkit-cfg-search-clear {\n width: 22px;\n height: 22px;\n background: none;\n border: none;\n color: rgba(255,255,255,0.35);\n cursor: pointer;\n padding: 0;\n /* display toggled via JS */\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n font-size: 14px;\n flex-shrink: 0;\n transition: color 0.1s, background 0.1s;\n}\n.bpmnkit-cfg-search-clear:hover { color: #fff; background: rgba(255,255,255,0.08); }\n\n/* \u2500\u2500 Guide bar (field assistant) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-guide-bar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 8px;\n padding: 7px 14px;\n background: rgba(248, 113, 113, 0.09);\n border-bottom: 1px solid rgba(248, 113, 113, 0.18);\n flex-shrink: 0;\n}\n.bpmnkit-cfg-guide-info {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n}\n.bpmnkit-cfg-guide-icon {\n width: 16px;\n height: 16px;\n background: var(--bpmnkit-danger, #f87171);\n border-radius: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n font-size: 10px;\n font-weight: 800;\n color: #fff;\n flex-shrink: 0;\n line-height: 1;\n}\n.bpmnkit-cfg-guide-text {\n font-size: 11px;\n font-weight: 500;\n color: rgba(248, 113, 113, 0.9);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.bpmnkit-cfg-guide-btn {\n flex-shrink: 0;\n padding: 3px 10px;\n border-radius: 4px;\n border: 1px solid rgba(248, 113, 113, 0.4);\n background: rgba(248, 113, 113, 0.12);\n color: var(--bpmnkit-danger, #f87171);\n font-size: 11px;\n font-weight: 600;\n cursor: pointer;\n transition: background 0.1s, border-color 0.1s;\n white-space: nowrap;\n}\n.bpmnkit-cfg-guide-btn:hover {\n background: rgba(248, 113, 113, 0.22);\n border-color: rgba(248, 113, 113, 0.6);\n}\n\n/* \u2500\u2500 Search results \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-search-results {\n flex: 1;\n overflow-y: auto;\n padding: 4px 22px 32px;\n scrollbar-width: thin;\n scrollbar-color: rgba(255,255,255,0.15) transparent;\n}\n.bpmnkit-cfg-search-group-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: rgba(255,255,255,0.3);\n margin: 16px 0 10px;\n padding-bottom: 5px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n}\n.bpmnkit-cfg-search-group-label:first-child { margin-top: 10px; }\n.bpmnkit-cfg-search-empty {\n font-size: 12px;\n color: rgba(255,255,255,0.3);\n text-align: center;\n padding: 28px 0;\n}\n\n/* \u2500\u2500 Tabs area (wrapper + scroll buttons) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-tabs-area {\n display: flex;\n align-items: stretch;\n border-bottom: 1px solid rgba(255,255,255,0.08);\n flex-shrink: 0;\n overflow: hidden;\n}\n.bpmnkit-cfg-tabs {\n flex: 1;\n min-width: 0;\n display: flex;\n align-items: flex-end;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.bpmnkit-cfg-tabs::-webkit-scrollbar { display: none; }\n.bpmnkit-cfg-tab-btn {\n padding: 10px 14px;\n background: none;\n border: none;\n border-bottom: 2px solid transparent;\n color: rgba(255,255,255,0.4);\n cursor: pointer;\n font-size: 12px;\n font-weight: 500;\n white-space: nowrap;\n transition: color 0.1s, border-color 0.1s;\n margin-bottom: -1px;\n flex-shrink: 0;\n}\n.bpmnkit-cfg-tab-btn:hover { color: rgba(255,255,255,0.75); }\n.bpmnkit-cfg-tab-btn.active { color: var(--bpmnkit-accent, #6b9df7); border-bottom-color: var(--bpmnkit-accent, #6b9df7); }\n/* Red dot shown after tab label when the group has required-empty fields */\n.bpmnkit-cfg-tab-btn.has-error::after {\n content: '';\n display: inline-block;\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--bpmnkit-danger, #f87171);\n margin-left: 5px;\n vertical-align: middle;\n flex-shrink: 0;\n}\n\n/* Arrow buttons for overflowing tabs */\n.bpmnkit-cfg-tabs-scroll-btn {\n flex-shrink: 0;\n width: 26px;\n background: none;\n border: none;\n border-radius: 0;\n color: rgba(255,255,255,0.5);\n cursor: pointer;\n font-size: 16px;\n line-height: 1;\n padding: 0;\n /* display toggled via JS */\n align-items: center;\n justify-content: center;\n transition: background 0.1s, color 0.1s;\n}\n.bpmnkit-cfg-tabs-scroll-btn:hover { color: #fff; background: rgba(255,255,255,0.08); }\n.bpmnkit-cfg-tabs-scroll-btn--prev { border-right: 1px solid rgba(255,255,255,0.06); }\n.bpmnkit-cfg-tabs-scroll-btn--next { border-left: 1px solid rgba(255,255,255,0.06); }\n\n/* \u2500\u2500 Scrollable body \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-full-body {\n flex: 1;\n overflow-y: auto;\n padding: 22px 22px 32px;\n scrollbar-width: thin;\n scrollbar-color: rgba(255,255,255,0.15) transparent;\n}\n\n/* \u2500\u2500 Groups & Fields \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-group-label {\n font-size: 10px;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: rgba(255,255,255,0.3);\n margin-bottom: 14px;\n padding-bottom: 6px;\n border-bottom: 1px solid rgba(255,255,255,0.06);\n}\n.bpmnkit-cfg-field {\n margin-bottom: 14px;\n}\n.bpmnkit-cfg-field-label {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 12px;\n font-weight: 500;\n color: rgba(255,255,255,0.55);\n margin-bottom: 5px;\n cursor: default;\n}\n.bpmnkit-cfg-field-label[title] { cursor: help; }\n.bpmnkit-cfg-field-docs {\n font-size: 10px;\n color: var(--bpmnkit-accent, #6b9df7);\n text-decoration: none;\n opacity: 0.7;\n transition: opacity 0.1s;\n}\n.bpmnkit-cfg-field-docs:hover { opacity: 1; }\n.bpmnkit-cfg-required-star {\n color: var(--bpmnkit-danger, #f87171);\n font-weight: 700;\n margin-left: 2px;\n}\n.bpmnkit-cfg-field--invalid {\n border-left: 2px solid var(--bpmnkit-danger, #f87171);\n padding-left: 8px;\n}\n.bpmnkit-cfg-field--invalid .bpmnkit-cfg-input,\n.bpmnkit-cfg-field--invalid .bpmnkit-cfg-select,\n.bpmnkit-cfg-field--invalid .bpmnkit-cfg-textarea {\n border-color: var(--bpmnkit-danger, #f87171);\n}\n\n.bpmnkit-cfg-input,\n.bpmnkit-cfg-select,\n.bpmnkit-cfg-textarea {\n width: 100%;\n padding: 7px 10px;\n background: rgba(255,255,255,0.06);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 6px;\n color: rgba(255,255,255,0.9);\n font-size: 12px;\n font-family: system-ui, -apple-system, sans-serif;\n outline: none;\n transition: border-color 0.15s, background 0.15s;\n box-sizing: border-box;\n}\n.bpmnkit-cfg-input:focus,\n.bpmnkit-cfg-select:focus,\n.bpmnkit-cfg-textarea:focus {\n border-color: var(--bpmnkit-accent, #6b9df7);\n background-color: rgba(255,255,255,0.09);\n}\n.bpmnkit-cfg-select {\n appearance: none;\n cursor: pointer;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(255,255,255,0.4)' stroke-width='1.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 10px center;\n padding-right: 28px;\n}\n.bpmnkit-cfg-textarea {\n resize: vertical;\n min-height: 68px;\n line-height: 1.5;\n font-family: var(--bpmnkit-font-mono, ui-monospace, \"SF Mono\", monospace);\n font-size: 11px;\n}\n.bpmnkit-cfg-field-hint {\n font-size: 11px;\n color: rgba(255,255,255,0.3);\n margin-top: 4px;\n line-height: 1.4;\n}\n\n/* \u2500\u2500 Field error message \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-field-error {\n font-size: 11px;\n color: var(--bpmnkit-danger, #f87171);\n margin-top: 3px;\n line-height: 1.3;\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-field-error { color: var(--bpmnkit-danger, #dc2626); }\n\n/* \u2500\u2500 FEEL expression field \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n/* FEEL/string mode toggle \u2014 appears at the right end of a feel-expression label row */\n.bpmnkit-cfg-feel-mode-btn {\n margin-left: auto;\n flex-shrink: 0;\n padding: 1px 6px;\n border-radius: 3px;\n border: 1px solid rgba(255,255,255,0.12);\n background: none;\n color: rgba(255,255,255,0.3);\n font-size: 10px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n cursor: pointer;\n transition: background 0.1s, color 0.1s, border-color 0.1s;\n}\n.bpmnkit-cfg-feel-mode-btn:hover {\n background: rgba(255,255,255,0.06);\n color: rgba(255,255,255,0.55);\n}\n.bpmnkit-cfg-feel-mode-btn--active {\n border-color: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15));\n color: var(--bpmnkit-accent, #6b9df7);\n}\n.bpmnkit-cfg-feel-mode-btn--active:hover { background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15)); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn {\n border-color: rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.3);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn:hover {\n background: rgba(0,0,0,0.05);\n color: rgba(0,0,0,0.55);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn--active {\n border-color: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12));\n background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12));\n color: var(--bpmnkit-accent, #1a56db);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-mode-btn--active:hover { background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12)); }\n\n.bpmnkit-cfg-feel-ta {\n width: 100%;\n min-height: 68px;\n padding: 7px 10px;\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 6px;\n font-size: 11px;\n font-family: var(--bpmnkit-font-mono, ui-monospace, \"SF Mono\", monospace);\n line-height: 1.5;\n resize: vertical;\n outline: none;\n transition: border-color 0.15s;\n box-sizing: border-box;\n}\n\n.bpmnkit-cfg-feel-playground-btn {\n display: inline-flex;\n margin-top: 4px;\n padding: 3px 8px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.12);\n background: none;\n color: var(--bpmnkit-accent, #6b9df7);\n font-size: 11px;\n cursor: pointer;\n transition: background 0.1s;\n}\n.bpmnkit-cfg-feel-playground-btn:hover { background: var(--bpmnkit-accent-subtle, rgba(107,157,247,0.15)); }\n\n/* Light theme overrides */\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-playground-btn {\n border-color: rgba(0,0,0,0.12);\n color: var(--bpmnkit-accent, #1a56db);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-feel-playground-btn:hover { background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12)); }\n\n/* \u2500\u2500 Toggle \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-toggle-row {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.bpmnkit-cfg-toggle-label {\n font-size: 12px;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n}\n.bpmnkit-cfg-toggle-label[title] { cursor: help; }\n.bpmnkit-cfg-toggle {\n position: relative;\n display: inline-flex;\n width: 34px;\n height: 18px;\n flex-shrink: 0;\n cursor: pointer;\n}\n.bpmnkit-cfg-toggle input {\n opacity: 0;\n width: 0;\n height: 0;\n position: absolute;\n}\n.bpmnkit-cfg-toggle-track {\n position: absolute;\n inset: 0;\n background: rgba(255,255,255,0.15);\n border-radius: 9px;\n transition: background 0.2s;\n}\n.bpmnkit-cfg-toggle input:checked + .bpmnkit-cfg-toggle-track { background: var(--bpmnkit-accent, #6b9df7); }\n.bpmnkit-cfg-toggle-thumb {\n position: absolute;\n top: 2px;\n left: 2px;\n width: 14px;\n height: 14px;\n background: #fff;\n border-radius: 50%;\n transition: transform 0.2s;\n pointer-events: none;\n}\n.bpmnkit-cfg-toggle input:checked ~ .bpmnkit-cfg-toggle-thumb { transform: translateX(16px); }\n\n/* \u2500\u2500 Action button \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-action-btn {\n display: inline-flex;\n align-items: center;\n gap: 5px;\n padding: 5px 12px;\n border-radius: 4px;\n border: 1px solid rgba(255,255,255,0.15);\n background: rgba(255,255,255,0.07);\n color: rgba(255,255,255,0.85);\n font-size: 12px;\n cursor: pointer;\n transition: background 0.15s;\n}\n.bpmnkit-cfg-action-btn:hover {\n background: rgba(255,255,255,0.13);\n border-color: rgba(255,255,255,0.25);\n}\n\n/* \u2500\u2500 Light theme overrides \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full {\n background: var(--bpmnkit-panel-bg, rgba(255,255,255,0.92));\n border-left-color: var(--bpmnkit-panel-border, rgba(0,0,0,0.08));\n box-shadow: -8px 0 40px rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.85);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-header { border-bottom-color: rgba(0,0,0,0.07); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-type { color: rgba(0,0,0,0.35); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-template { color: var(--bpmnkit-accent, #1a56db); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-name { color: rgba(0,0,0,0.9); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-docs-link { color: rgba(0,0,0,0.4); border-color: rgba(0,0,0,0.2); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-docs-link:hover { color: var(--bpmnkit-accent, #1a56db); border-color: var(--bpmnkit-accent, #1a56db); background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12)); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-collapse-btn { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-collapse-btn:hover { background: rgba(0,0,0,0.06); color: rgba(0,0,0,0.9); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-close { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-close:hover { background: rgba(0,0,0,0.06); color: rgba(0,0,0,0.9); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-bar { border-bottom-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-input {\n background: rgba(0,0,0,0.04);\n border-color: rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.85);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-input::placeholder { color: rgba(0,0,0,0.3); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-clear { color: rgba(0,0,0,0.35); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-clear:hover { color: rgba(0,0,0,0.9); background: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-results { scrollbar-color: rgba(0,0,0,0.15) transparent; }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-group-label { color: rgba(0,0,0,0.35); border-bottom-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-search-empty { color: rgba(0,0,0,0.35); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-area { border-bottom-color: rgba(0,0,0,0.07); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tab-btn { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tab-btn:hover { color: rgba(0,0,0,0.7); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn { color: rgba(0,0,0,0.4); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn:hover { color: rgba(0,0,0,0.9); background: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn--prev { border-right-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-tabs-scroll-btn--next { border-left-color: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-full-body { scrollbar-color: rgba(0,0,0,0.15) transparent; }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-group-label {\n color: rgba(0,0,0,0.35);\n border-bottom-color: rgba(0,0,0,0.06);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-field-label { color: rgba(0,0,0,0.55); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-field-hint { color: rgba(0,0,0,0.4); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-input,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-select,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-textarea {\n background-color: rgba(0,0,0,0.04);\n border-color: rgba(0,0,0,0.12);\n color: rgba(0,0,0,0.85);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-input:focus,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-select:focus,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-textarea:focus {\n background-color: rgba(0,0,0,0.06);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-select {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(0,0,0,0.45)' stroke-width='1.5'/%3E%3C/svg%3E\");\n}\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-toggle-label { color: rgba(0,0,0,0.7); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-toggle-track { background: rgba(0,0,0,0.12); }\n\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-action-btn {\n border-color: rgba(0,0,0,0.15);\n background: rgba(0,0,0,0.04);\n color: rgba(0,0,0,0.75);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-action-btn:hover {\n background: rgba(0,0,0,0.08);\n border-color: rgba(0,0,0,0.2);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-resize-handle:hover {\n background: var(--bpmnkit-accent-subtle, rgba(26,86,219,0.12));\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-bar {\n background: rgba(248, 113, 113, 0.06);\n border-bottom-color: rgba(248, 113, 113, 0.15);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-text { color: var(--bpmnkit-danger, #dc2626); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-btn {\n color: var(--bpmnkit-danger, #dc2626);\n border-color: rgba(220, 38, 38, 0.3);\n background: rgba(220, 38, 38, 0.07);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-guide-btn:hover {\n background: rgba(220, 38, 38, 0.14);\n border-color: rgba(220, 38, 38, 0.5);\n}\n\n/* \u2500\u2500 Neon theme overrides \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full {\n background: oklch(8% 0.03 270 / 0.96);\n border-left-color: oklch(65% 0.28 280 / 0.2);\n box-shadow: -8px 0 40px oklch(0% 0 0 / 0.7), 0 0 0 1px oklch(65% 0.28 280 / 0.05);\n color: oklch(65% 0.1 280);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full-header { border-bottom-color: oklch(65% 0.28 280 / 0.12); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full-type { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full-template { color: oklch(73% 0.16 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full-name { color: oklch(88% 0.02 270); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-docs-link { color: oklch(55% 0.06 280); border-color: oklch(65% 0.28 280 / 0.25); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-docs-link:hover { color: oklch(73% 0.16 280); border-color: oklch(65% 0.28 280 / 0.5); background: oklch(65% 0.28 280 / 0.1); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-collapse-btn { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-collapse-btn:hover { background: oklch(65% 0.28 280 / 0.1); color: oklch(88% 0.02 270); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full-close { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full-close:hover { background: oklch(65% 0.28 280 / 0.1); color: oklch(88% 0.02 270); }\n\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-bar { border-bottom-color: oklch(65% 0.28 280 / 0.1); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-input {\n background: oklch(65% 0.28 280 / 0.05);\n border-color: oklch(65% 0.28 280 / 0.15);\n color: oklch(88% 0.02 270);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-input::placeholder { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-input:focus { border-color: oklch(65% 0.28 280 / 0.45); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-clear { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-clear:hover { color: oklch(88% 0.02 270); background: oklch(65% 0.28 280 / 0.1); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-results { scrollbar-color: oklch(65% 0.28 280 / 0.15) transparent; }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-group-label { color: oklch(50% 0.06 280); border-bottom-color: oklch(65% 0.28 280 / 0.1); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-search-empty { color: oklch(50% 0.06 280); }\n\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tabs-area { border-bottom-color: oklch(65% 0.28 280 / 0.12); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tab-btn { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tab-btn:hover { color: oklch(73% 0.1 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tab-btn.active { color: oklch(73% 0.16 280); border-bottom-color: oklch(73% 0.16 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tabs-scroll-btn { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tabs-scroll-btn:hover { color: oklch(88% 0.02 270); background: oklch(65% 0.28 280 / 0.1); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tabs-scroll-btn--prev { border-right-color: oklch(65% 0.28 280 / 0.12); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-tabs-scroll-btn--next { border-left-color: oklch(65% 0.28 280 / 0.12); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-full-body { scrollbar-color: oklch(65% 0.28 280 / 0.15) transparent; }\n\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-group-label {\n color: oklch(50% 0.06 280);\n border-bottom-color: oklch(65% 0.28 280 / 0.1);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-field-label { color: oklch(55% 0.08 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-field-hint { color: oklch(50% 0.06 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-field-error { color: oklch(70% 0.18 20); }\n\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-input,\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-select,\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-textarea {\n background: oklch(65% 0.28 280 / 0.05);\n border-color: oklch(65% 0.28 280 / 0.15);\n color: oklch(88% 0.02 270);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-input:focus,\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-select:focus,\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-textarea:focus {\n border-color: oklch(65% 0.28 280 / 0.45);\n background: oklch(65% 0.28 280 / 0.08);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-select {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='%238080c0' stroke-width='1.5'/%3E%3C/svg%3E\");\n}\n\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-feel-mode-btn {\n border-color: oklch(65% 0.28 280 / 0.15);\n color: oklch(50% 0.06 280);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-feel-mode-btn:hover {\n background: oklch(65% 0.28 280 / 0.08);\n color: oklch(65% 0.1 280);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-feel-mode-btn--active {\n border-color: oklch(65% 0.28 280 / 0.3);\n background: oklch(65% 0.28 280 / 0.12);\n color: oklch(73% 0.16 280);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-feel-playground-btn {\n border-color: oklch(65% 0.28 280 / 0.2);\n color: oklch(73% 0.16 280);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-feel-playground-btn:hover { background: oklch(65% 0.28 280 / 0.1); }\n\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-toggle-label { color: oklch(65% 0.1 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-toggle-track { background: oklch(65% 0.28 280 / 0.15); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-toggle input:checked + .bpmnkit-cfg-toggle-track { background: oklch(65% 0.28 280 / 0.7); }\n\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-action-btn {\n border-color: oklch(65% 0.28 280 / 0.2);\n background: oklch(65% 0.28 280 / 0.06);\n color: oklch(65% 0.1 280);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-action-btn:hover {\n background: oklch(65% 0.28 280 / 0.12);\n border-color: oklch(65% 0.28 280 / 0.35);\n}\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-resize-handle:hover { background: oklch(65% 0.28 280 / 0.1); }\n\n/* \u2500\u2500 Searchable select \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cfg-ss-trigger {\n width: 100%;\n padding: 7px 10px;\n background: rgba(255,255,255,0.06);\n border: 1px solid rgba(255,255,255,0.1);\n border-radius: 6px;\n color: rgba(255,255,255,0.9);\n font-size: 12px;\n font-family: system-ui, -apple-system, sans-serif;\n text-align: left;\n cursor: pointer;\n outline: none;\n transition: border-color 0.15s, background 0.15s;\n box-sizing: border-box;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.bpmnkit-cfg-ss-trigger:hover { background: rgba(255,255,255,0.09); border-color: rgba(255,255,255,0.18); }\n.bpmnkit-cfg-ss-trigger:focus,\n.bpmnkit-cfg-ss-trigger[aria-expanded=\"true\"] { border-color: var(--bpmnkit-accent, #6b9df7); background: rgba(255,255,255,0.09); }\n.bpmnkit-cfg-ss-trigger-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.bpmnkit-cfg-ss-arrow {\n flex-shrink: 0;\n width: 10px; height: 6px;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(255,255,255,0.4)' stroke-width='1.5'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-size: contain;\n}\n/* Dropdown panel \u2014 appended to document.body, positioned fixed */\n.bpmnkit-cfg-ss-dropdown {\n background: #1a1a2e;\n border: 1px solid rgba(255,255,255,0.15);\n border-radius: 8px;\n box-shadow: 0 8px 32px rgba(0,0,0,0.6);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n.bpmnkit-cfg-ss-search {\n padding: 8px 10px;\n background: rgba(255,255,255,0.05);\n border: none;\n border-bottom: 1px solid rgba(255,255,255,0.08);\n color: rgba(255,255,255,0.9);\n font-size: 12px;\n font-family: system-ui, -apple-system, sans-serif;\n outline: none;\n width: 100%;\n box-sizing: border-box;\n flex-shrink: 0;\n}\n.bpmnkit-cfg-ss-search::placeholder { color: rgba(255,255,255,0.3); }\n.bpmnkit-cfg-ss-list {\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: rgba(255,255,255,0.15) transparent;\n}\n.bpmnkit-cfg-ss-option {\n padding: 7px 10px;\n font-size: 12px;\n color: rgba(255,255,255,0.85);\n cursor: pointer;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.bpmnkit-cfg-ss-option--focused { background: rgba(255,255,255,0.08); }\n.bpmnkit-cfg-ss-option--selected { color: var(--bpmnkit-accent, #6b9df7); }\n.bpmnkit-cfg-ss-option--selected.bpmnkit-cfg-ss-option--focused { background: rgba(107,157,247,0.1); }\n.bpmnkit-cfg-ss-empty { padding: 10px; font-size: 12px; color: rgba(255,255,255,0.3); text-align: center; }\n/* Neon theme \u2014 applied via data-theme=\"neon\" on the dropdown element itself */\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] {\n background: oklch(9% 0.025 270);\n border-color: oklch(65% 0.28 280 / 0.2);\n box-shadow: 0 8px 32px oklch(0% 0 0 / 0.7), 0 0 0 1px oklch(65% 0.28 280 / 0.1);\n}\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-search {\n background: oklch(65% 0.28 280 / 0.05);\n border-bottom-color: oklch(65% 0.28 280 / 0.12);\n color: oklch(88% 0.02 270);\n}\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-search::placeholder { color: oklch(55% 0.06 280); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-list { scrollbar-color: oklch(65% 0.28 280 / 0.15) transparent; }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-option { color: oklch(65% 0.1 280); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-option--focused { background: oklch(65% 0.28 280 / 0.08); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-option--selected { color: oklch(73% 0.16 280); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-option--selected.bpmnkit-cfg-ss-option--focused { background: oklch(65% 0.28 280 / 0.12); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"neon\"] .bpmnkit-cfg-ss-empty { color: oklch(50% 0.06 280); }\n/* Neon theme trigger */\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-ss-trigger { background: oklch(65% 0.28 280 / 0.06); border-color: oklch(65% 0.28 280 / 0.2); color: oklch(65% 0.1 280); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-ss-trigger:hover { background: oklch(65% 0.28 280 / 0.1); border-color: oklch(65% 0.28 280 / 0.3); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-ss-trigger:focus,\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-ss-trigger[aria-expanded=\"true\"] { border-color: oklch(65% 0.28 280 / 0.5); background: oklch(65% 0.28 280 / 0.1); }\n[data-bpmnkit-hud-theme=\"neon\"] .bpmnkit-cfg-ss-arrow {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='%238080c0' stroke-width='1.5'/%3E%3C/svg%3E\");\n}\n/* Light theme \u2014 applied via data-theme=\"light\" on the dropdown element itself */\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] {\n background: #ffffff;\n border-color: rgba(0,0,0,0.12);\n box-shadow: 0 4px 20px rgba(0,0,0,0.15);\n}\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-search {\n background: rgba(0,0,0,0.03);\n border-bottom-color: rgba(0,0,0,0.08);\n color: rgba(0,0,0,0.85);\n}\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-search::placeholder { color: rgba(0,0,0,0.3); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-list { scrollbar-color: rgba(0,0,0,0.15) transparent; }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-option { color: rgba(0,0,0,0.85); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-option--focused { background: rgba(0,0,0,0.05); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-option--selected { color: var(--bpmnkit-accent, #1a56db); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-option--selected.bpmnkit-cfg-ss-option--focused { background: rgba(26,86,219,0.08); }\n.bpmnkit-cfg-ss-dropdown[data-theme=\"light\"] .bpmnkit-cfg-ss-empty { color: rgba(0,0,0,0.35); }\n/* Light theme trigger */\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-ss-trigger { background: rgba(0,0,0,0.04); border-color: rgba(0,0,0,0.12); color: rgba(0,0,0,0.85); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-ss-trigger:hover { background: rgba(0,0,0,0.06); border-color: rgba(0,0,0,0.2); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-ss-trigger:focus,\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-ss-trigger[aria-expanded=\"true\"] { border-color: var(--bpmnkit-accent, #1a56db); background: rgba(0,0,0,0.06); }\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cfg-ss-arrow {\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(0,0,0,0.45)' stroke-width='1.5'/%3E%3C/svg%3E\");\n}\n";
3
3
  export declare function injectConfigPanelStyles(): void;
4
4
  //# sourceMappingURL=css.d.ts.map
@@ -705,6 +705,232 @@ export const CONFIG_PANEL_CSS = `
705
705
  background: rgba(220, 38, 38, 0.14);
706
706
  border-color: rgba(220, 38, 38, 0.5);
707
707
  }
708
+
709
+ /* ── Neon theme overrides ─────────────────────────────────────────────────── */
710
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full {
711
+ background: oklch(8% 0.03 270 / 0.96);
712
+ border-left-color: oklch(65% 0.28 280 / 0.2);
713
+ box-shadow: -8px 0 40px oklch(0% 0 0 / 0.7), 0 0 0 1px oklch(65% 0.28 280 / 0.05);
714
+ color: oklch(65% 0.1 280);
715
+ }
716
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full-header { border-bottom-color: oklch(65% 0.28 280 / 0.12); }
717
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full-type { color: oklch(50% 0.06 280); }
718
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full-template { color: oklch(73% 0.16 280); }
719
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full-name { color: oklch(88% 0.02 270); }
720
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-docs-link { color: oklch(55% 0.06 280); border-color: oklch(65% 0.28 280 / 0.25); }
721
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-docs-link:hover { color: oklch(73% 0.16 280); border-color: oklch(65% 0.28 280 / 0.5); background: oklch(65% 0.28 280 / 0.1); }
722
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-collapse-btn { color: oklch(50% 0.06 280); }
723
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-collapse-btn:hover { background: oklch(65% 0.28 280 / 0.1); color: oklch(88% 0.02 270); }
724
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full-close { color: oklch(50% 0.06 280); }
725
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full-close:hover { background: oklch(65% 0.28 280 / 0.1); color: oklch(88% 0.02 270); }
726
+
727
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-bar { border-bottom-color: oklch(65% 0.28 280 / 0.1); }
728
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-input {
729
+ background: oklch(65% 0.28 280 / 0.05);
730
+ border-color: oklch(65% 0.28 280 / 0.15);
731
+ color: oklch(88% 0.02 270);
732
+ }
733
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-input::placeholder { color: oklch(50% 0.06 280); }
734
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-input:focus { border-color: oklch(65% 0.28 280 / 0.45); }
735
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-clear { color: oklch(50% 0.06 280); }
736
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-clear:hover { color: oklch(88% 0.02 270); background: oklch(65% 0.28 280 / 0.1); }
737
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-results { scrollbar-color: oklch(65% 0.28 280 / 0.15) transparent; }
738
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-group-label { color: oklch(50% 0.06 280); border-bottom-color: oklch(65% 0.28 280 / 0.1); }
739
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-search-empty { color: oklch(50% 0.06 280); }
740
+
741
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tabs-area { border-bottom-color: oklch(65% 0.28 280 / 0.12); }
742
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tab-btn { color: oklch(50% 0.06 280); }
743
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tab-btn:hover { color: oklch(73% 0.1 280); }
744
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tab-btn.active { color: oklch(73% 0.16 280); border-bottom-color: oklch(73% 0.16 280); }
745
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tabs-scroll-btn { color: oklch(50% 0.06 280); }
746
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tabs-scroll-btn:hover { color: oklch(88% 0.02 270); background: oklch(65% 0.28 280 / 0.1); }
747
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tabs-scroll-btn--prev { border-right-color: oklch(65% 0.28 280 / 0.12); }
748
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-tabs-scroll-btn--next { border-left-color: oklch(65% 0.28 280 / 0.12); }
749
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-full-body { scrollbar-color: oklch(65% 0.28 280 / 0.15) transparent; }
750
+
751
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-group-label {
752
+ color: oklch(50% 0.06 280);
753
+ border-bottom-color: oklch(65% 0.28 280 / 0.1);
754
+ }
755
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-field-label { color: oklch(55% 0.08 280); }
756
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-field-hint { color: oklch(50% 0.06 280); }
757
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-field-error { color: oklch(70% 0.18 20); }
758
+
759
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-input,
760
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-select,
761
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-textarea {
762
+ background: oklch(65% 0.28 280 / 0.05);
763
+ border-color: oklch(65% 0.28 280 / 0.15);
764
+ color: oklch(88% 0.02 270);
765
+ }
766
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-input:focus,
767
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-select:focus,
768
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-textarea:focus {
769
+ border-color: oklch(65% 0.28 280 / 0.45);
770
+ background: oklch(65% 0.28 280 / 0.08);
771
+ }
772
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-select {
773
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='%238080c0' stroke-width='1.5'/%3E%3C/svg%3E");
774
+ }
775
+
776
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-feel-mode-btn {
777
+ border-color: oklch(65% 0.28 280 / 0.15);
778
+ color: oklch(50% 0.06 280);
779
+ }
780
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-feel-mode-btn:hover {
781
+ background: oklch(65% 0.28 280 / 0.08);
782
+ color: oklch(65% 0.1 280);
783
+ }
784
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-feel-mode-btn--active {
785
+ border-color: oklch(65% 0.28 280 / 0.3);
786
+ background: oklch(65% 0.28 280 / 0.12);
787
+ color: oklch(73% 0.16 280);
788
+ }
789
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-feel-playground-btn {
790
+ border-color: oklch(65% 0.28 280 / 0.2);
791
+ color: oklch(73% 0.16 280);
792
+ }
793
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-feel-playground-btn:hover { background: oklch(65% 0.28 280 / 0.1); }
794
+
795
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-toggle-label { color: oklch(65% 0.1 280); }
796
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-toggle-track { background: oklch(65% 0.28 280 / 0.15); }
797
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-toggle input:checked + .bpmnkit-cfg-toggle-track { background: oklch(65% 0.28 280 / 0.7); }
798
+
799
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-action-btn {
800
+ border-color: oklch(65% 0.28 280 / 0.2);
801
+ background: oklch(65% 0.28 280 / 0.06);
802
+ color: oklch(65% 0.1 280);
803
+ }
804
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-action-btn:hover {
805
+ background: oklch(65% 0.28 280 / 0.12);
806
+ border-color: oklch(65% 0.28 280 / 0.35);
807
+ }
808
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-resize-handle:hover { background: oklch(65% 0.28 280 / 0.1); }
809
+
810
+ /* ── Searchable select ────────────────────────────────────────────────────── */
811
+ .bpmnkit-cfg-ss-trigger {
812
+ width: 100%;
813
+ padding: 7px 10px;
814
+ background: rgba(255,255,255,0.06);
815
+ border: 1px solid rgba(255,255,255,0.1);
816
+ border-radius: 6px;
817
+ color: rgba(255,255,255,0.9);
818
+ font-size: 12px;
819
+ font-family: system-ui, -apple-system, sans-serif;
820
+ text-align: left;
821
+ cursor: pointer;
822
+ outline: none;
823
+ transition: border-color 0.15s, background 0.15s;
824
+ box-sizing: border-box;
825
+ display: flex;
826
+ align-items: center;
827
+ gap: 6px;
828
+ }
829
+ .bpmnkit-cfg-ss-trigger:hover { background: rgba(255,255,255,0.09); border-color: rgba(255,255,255,0.18); }
830
+ .bpmnkit-cfg-ss-trigger:focus,
831
+ .bpmnkit-cfg-ss-trigger[aria-expanded="true"] { border-color: var(--bpmnkit-accent, #6b9df7); background: rgba(255,255,255,0.09); }
832
+ .bpmnkit-cfg-ss-trigger-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
833
+ .bpmnkit-cfg-ss-arrow {
834
+ flex-shrink: 0;
835
+ width: 10px; height: 6px;
836
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(255,255,255,0.4)' stroke-width='1.5'/%3E%3C/svg%3E");
837
+ background-repeat: no-repeat;
838
+ background-size: contain;
839
+ }
840
+ /* Dropdown panel — appended to document.body, positioned fixed */
841
+ .bpmnkit-cfg-ss-dropdown {
842
+ background: #1a1a2e;
843
+ border: 1px solid rgba(255,255,255,0.15);
844
+ border-radius: 8px;
845
+ box-shadow: 0 8px 32px rgba(0,0,0,0.6);
846
+ overflow: hidden;
847
+ display: flex;
848
+ flex-direction: column;
849
+ }
850
+ .bpmnkit-cfg-ss-search {
851
+ padding: 8px 10px;
852
+ background: rgba(255,255,255,0.05);
853
+ border: none;
854
+ border-bottom: 1px solid rgba(255,255,255,0.08);
855
+ color: rgba(255,255,255,0.9);
856
+ font-size: 12px;
857
+ font-family: system-ui, -apple-system, sans-serif;
858
+ outline: none;
859
+ width: 100%;
860
+ box-sizing: border-box;
861
+ flex-shrink: 0;
862
+ }
863
+ .bpmnkit-cfg-ss-search::placeholder { color: rgba(255,255,255,0.3); }
864
+ .bpmnkit-cfg-ss-list {
865
+ overflow-y: auto;
866
+ scrollbar-width: thin;
867
+ scrollbar-color: rgba(255,255,255,0.15) transparent;
868
+ }
869
+ .bpmnkit-cfg-ss-option {
870
+ padding: 7px 10px;
871
+ font-size: 12px;
872
+ color: rgba(255,255,255,0.85);
873
+ cursor: pointer;
874
+ white-space: nowrap;
875
+ overflow: hidden;
876
+ text-overflow: ellipsis;
877
+ }
878
+ .bpmnkit-cfg-ss-option--focused { background: rgba(255,255,255,0.08); }
879
+ .bpmnkit-cfg-ss-option--selected { color: var(--bpmnkit-accent, #6b9df7); }
880
+ .bpmnkit-cfg-ss-option--selected.bpmnkit-cfg-ss-option--focused { background: rgba(107,157,247,0.1); }
881
+ .bpmnkit-cfg-ss-empty { padding: 10px; font-size: 12px; color: rgba(255,255,255,0.3); text-align: center; }
882
+ /* Neon theme — applied via data-theme="neon" on the dropdown element itself */
883
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] {
884
+ background: oklch(9% 0.025 270);
885
+ border-color: oklch(65% 0.28 280 / 0.2);
886
+ box-shadow: 0 8px 32px oklch(0% 0 0 / 0.7), 0 0 0 1px oklch(65% 0.28 280 / 0.1);
887
+ }
888
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-search {
889
+ background: oklch(65% 0.28 280 / 0.05);
890
+ border-bottom-color: oklch(65% 0.28 280 / 0.12);
891
+ color: oklch(88% 0.02 270);
892
+ }
893
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-search::placeholder { color: oklch(55% 0.06 280); }
894
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-list { scrollbar-color: oklch(65% 0.28 280 / 0.15) transparent; }
895
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-option { color: oklch(65% 0.1 280); }
896
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-option--focused { background: oklch(65% 0.28 280 / 0.08); }
897
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-option--selected { color: oklch(73% 0.16 280); }
898
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-option--selected.bpmnkit-cfg-ss-option--focused { background: oklch(65% 0.28 280 / 0.12); }
899
+ .bpmnkit-cfg-ss-dropdown[data-theme="neon"] .bpmnkit-cfg-ss-empty { color: oklch(50% 0.06 280); }
900
+ /* Neon theme trigger */
901
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-ss-trigger { background: oklch(65% 0.28 280 / 0.06); border-color: oklch(65% 0.28 280 / 0.2); color: oklch(65% 0.1 280); }
902
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-ss-trigger:hover { background: oklch(65% 0.28 280 / 0.1); border-color: oklch(65% 0.28 280 / 0.3); }
903
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-ss-trigger:focus,
904
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-ss-trigger[aria-expanded="true"] { border-color: oklch(65% 0.28 280 / 0.5); background: oklch(65% 0.28 280 / 0.1); }
905
+ [data-bpmnkit-hud-theme="neon"] .bpmnkit-cfg-ss-arrow {
906
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='%238080c0' stroke-width='1.5'/%3E%3C/svg%3E");
907
+ }
908
+ /* Light theme — applied via data-theme="light" on the dropdown element itself */
909
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] {
910
+ background: #ffffff;
911
+ border-color: rgba(0,0,0,0.12);
912
+ box-shadow: 0 4px 20px rgba(0,0,0,0.15);
913
+ }
914
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-search {
915
+ background: rgba(0,0,0,0.03);
916
+ border-bottom-color: rgba(0,0,0,0.08);
917
+ color: rgba(0,0,0,0.85);
918
+ }
919
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-search::placeholder { color: rgba(0,0,0,0.3); }
920
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-list { scrollbar-color: rgba(0,0,0,0.15) transparent; }
921
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-option { color: rgba(0,0,0,0.85); }
922
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-option--focused { background: rgba(0,0,0,0.05); }
923
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-option--selected { color: var(--bpmnkit-accent, #1a56db); }
924
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-option--selected.bpmnkit-cfg-ss-option--focused { background: rgba(26,86,219,0.08); }
925
+ .bpmnkit-cfg-ss-dropdown[data-theme="light"] .bpmnkit-cfg-ss-empty { color: rgba(0,0,0,0.35); }
926
+ /* Light theme trigger */
927
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cfg-ss-trigger { background: rgba(0,0,0,0.04); border-color: rgba(0,0,0,0.12); color: rgba(0,0,0,0.85); }
928
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cfg-ss-trigger:hover { background: rgba(0,0,0,0.06); border-color: rgba(0,0,0,0.2); }
929
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cfg-ss-trigger:focus,
930
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cfg-ss-trigger[aria-expanded="true"] { border-color: var(--bpmnkit-accent, #1a56db); background: rgba(0,0,0,0.06); }
931
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cfg-ss-arrow {
932
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M0 0l5 6 5-6' fill='none' stroke='rgba(0,0,0,0.45)' stroke-width='1.5'/%3E%3C/svg%3E");
933
+ }
708
934
  `;
709
935
  export function injectConfigPanelStyles() {
710
936
  if (typeof document === "undefined")
@@ -121,6 +121,7 @@ export declare class ConfigPanelRenderer {
121
121
  private _renderTextarea;
122
122
  private _renderSelect;
123
123
  private _renderToggle;
124
+ private _renderSearchableSelect;
124
125
  private _renderActionButton;
125
126
  }
126
127
  export {};
@@ -4,6 +4,8 @@ const SVG_NS = "http://www.w3.org/2000/svg";
4
4
  // by _refreshConditionals to toggle visibility without a full re-render.
5
5
  const FIELD_WRAPPER_ATTR = "data-field-wrapper";
6
6
  const STORAGE_KEY_WIDTH = "bpmnkit-cfg-panel-width";
7
+ // At most one searchable-select dropdown is open at a time across all panels.
8
+ let _activeDropdownClose = null;
7
9
  /**
8
10
  * Validates a `feel-expression` field value using the real FEEL parser.
9
11
  * Returns null when the value is empty or is a valid FEEL expression (or a plain string).
@@ -208,6 +210,7 @@ export class ConfigPanelRenderer {
208
210
  this._guideStarted = false;
209
211
  }
210
212
  _hidePanel() {
213
+ _activeDropdownClose?.();
211
214
  this._panelEl?.remove();
212
215
  this._panelEl = null;
213
216
  this._tabsAreaEl = null;
@@ -966,7 +969,9 @@ export class ConfigPanelRenderer {
966
969
  }
967
970
  wrapper.appendChild(labelRow);
968
971
  if (field.type === "select") {
969
- wrapper.appendChild(this._renderSelect(field, value));
972
+ wrapper.appendChild(field.searchable
973
+ ? this._renderSearchableSelect(field, value)
974
+ : this._renderSelect(field, value));
970
975
  }
971
976
  else if (field.type === "textarea") {
972
977
  wrapper.appendChild(this._renderTextarea(field, value));
@@ -1143,6 +1148,167 @@ export class ConfigPanelRenderer {
1143
1148
  row.appendChild(labelText);
1144
1149
  return row;
1145
1150
  }
1151
+ _renderSearchableSelect(field, value) {
1152
+ const options = field.options ?? [];
1153
+ const currentValue = typeof value === "string" ? value : (options[0]?.value ?? "");
1154
+ const trigger = document.createElement("button");
1155
+ trigger.type = "button";
1156
+ trigger.className = "bpmnkit-cfg-ss-trigger";
1157
+ trigger.setAttribute("data-field-key", field.key);
1158
+ trigger.setAttribute("aria-haspopup", "listbox");
1159
+ trigger.setAttribute("aria-expanded", "false");
1160
+ const triggerLabel = document.createElement("span");
1161
+ triggerLabel.className = "bpmnkit-cfg-ss-trigger-label";
1162
+ triggerLabel.textContent = options.find((o) => o.value === currentValue)?.label ?? currentValue;
1163
+ const arrow = document.createElement("span");
1164
+ arrow.className = "bpmnkit-cfg-ss-arrow";
1165
+ arrow.setAttribute("aria-hidden", "true");
1166
+ trigger.append(triggerLabel, arrow);
1167
+ if (this._readonly) {
1168
+ trigger.disabled = true;
1169
+ return trigger;
1170
+ }
1171
+ const applyField = (v) => this._applyField(field.key, v);
1172
+ const openDropdown = () => {
1173
+ // Close any existing dropdown first
1174
+ _activeDropdownClose?.();
1175
+ const rect = trigger.getBoundingClientRect();
1176
+ const hudTheme = document.body.dataset.bpmnkitHudTheme ?? "";
1177
+ const panel = document.createElement("div");
1178
+ panel.className = "bpmnkit-cfg-ss-dropdown";
1179
+ if (hudTheme === "light" || hudTheme === "neon")
1180
+ panel.setAttribute("data-theme", hudTheme);
1181
+ // Position: prefer below, flip above if not enough room
1182
+ const spaceBelow = window.innerHeight - rect.bottom;
1183
+ const dropHeight = Math.min(300, options.length * 28 + 48);
1184
+ const openUpward = spaceBelow < dropHeight && rect.top > spaceBelow;
1185
+ panel.style.cssText = [
1186
+ "position:fixed",
1187
+ `left:${Math.round(rect.left)}px`,
1188
+ `width:${Math.round(rect.width)}px`,
1189
+ "max-height:300px",
1190
+ "z-index:99999",
1191
+ openUpward
1192
+ ? `bottom:${Math.round(window.innerHeight - rect.top + 4)}px`
1193
+ : `top:${Math.round(rect.bottom + 4)}px`,
1194
+ ].join(";");
1195
+ const search = document.createElement("input");
1196
+ search.type = "text";
1197
+ search.className = "bpmnkit-cfg-ss-search";
1198
+ search.placeholder = "Search\u2026";
1199
+ search.setAttribute("aria-label", "Search connectors");
1200
+ const list = document.createElement("div");
1201
+ list.className = "bpmnkit-cfg-ss-list";
1202
+ list.setAttribute("role", "listbox");
1203
+ // Leave room for search bar: total panel max-height minus ~37px search bar
1204
+ list.style.maxHeight = "263px";
1205
+ let focusIdx = 0;
1206
+ let visibleOpts = options;
1207
+ const renderOpts = (query) => {
1208
+ const q = query.toLowerCase().trim();
1209
+ visibleOpts = q ? options.filter((o) => o.label.toLowerCase().includes(q)) : options;
1210
+ focusIdx = 0;
1211
+ list.innerHTML = "";
1212
+ if (visibleOpts.length === 0) {
1213
+ const empty = document.createElement("div");
1214
+ empty.className = "bpmnkit-cfg-ss-empty";
1215
+ empty.textContent = "No results";
1216
+ list.appendChild(empty);
1217
+ return;
1218
+ }
1219
+ for (let i = 0; i < visibleOpts.length; i++) {
1220
+ const opt = visibleOpts[i];
1221
+ if (!opt)
1222
+ continue;
1223
+ const el = document.createElement("div");
1224
+ el.className = "bpmnkit-cfg-ss-option";
1225
+ if (opt.value === currentValue)
1226
+ el.classList.add("bpmnkit-cfg-ss-option--selected");
1227
+ if (i === focusIdx)
1228
+ el.classList.add("bpmnkit-cfg-ss-option--focused");
1229
+ el.setAttribute("role", "option");
1230
+ el.setAttribute("aria-selected", String(opt.value === currentValue));
1231
+ el.setAttribute("data-value", opt.value);
1232
+ el.textContent = opt.label;
1233
+ el.addEventListener("pointerdown", (e) => {
1234
+ e.preventDefault();
1235
+ triggerLabel.textContent = opt.label;
1236
+ closeDropdown();
1237
+ applyField(opt.value);
1238
+ });
1239
+ list.appendChild(el);
1240
+ }
1241
+ };
1242
+ const updateFocus = () => {
1243
+ const items = list.querySelectorAll(".bpmnkit-cfg-ss-option");
1244
+ for (let i = 0; i < items.length; i++) {
1245
+ items[i]?.classList.toggle("bpmnkit-cfg-ss-option--focused", i === focusIdx);
1246
+ }
1247
+ };
1248
+ search.addEventListener("input", () => renderOpts(search.value));
1249
+ search.addEventListener("keydown", (e) => {
1250
+ const items = list.querySelectorAll(".bpmnkit-cfg-ss-option");
1251
+ if (e.key === "ArrowDown") {
1252
+ e.preventDefault();
1253
+ focusIdx = Math.min(focusIdx + 1, items.length - 1);
1254
+ updateFocus();
1255
+ items[focusIdx]?.scrollIntoView({ block: "nearest" });
1256
+ }
1257
+ else if (e.key === "ArrowUp") {
1258
+ e.preventDefault();
1259
+ focusIdx = Math.max(focusIdx - 1, 0);
1260
+ updateFocus();
1261
+ items[focusIdx]?.scrollIntoView({ block: "nearest" });
1262
+ }
1263
+ else if (e.key === "Enter") {
1264
+ e.preventDefault();
1265
+ const focused = visibleOpts[focusIdx];
1266
+ if (focused) {
1267
+ triggerLabel.textContent = focused.label;
1268
+ closeDropdown();
1269
+ applyField(focused.value);
1270
+ }
1271
+ }
1272
+ else if (e.key === "Escape") {
1273
+ closeDropdown();
1274
+ trigger.focus();
1275
+ }
1276
+ });
1277
+ panel.append(search, list);
1278
+ document.body.appendChild(panel);
1279
+ trigger.setAttribute("aria-expanded", "true");
1280
+ renderOpts("");
1281
+ // Scroll the current selection into view
1282
+ list.querySelector(".bpmnkit-cfg-ss-option--selected")?.scrollIntoView({
1283
+ block: "nearest",
1284
+ });
1285
+ const onOutside = (e) => {
1286
+ if (!panel.contains(e.target) && e.target !== trigger)
1287
+ closeDropdown();
1288
+ };
1289
+ document.addEventListener("pointerdown", onOutside);
1290
+ _activeDropdownClose = closeDropdown;
1291
+ function closeDropdown() {
1292
+ panel.remove();
1293
+ trigger.setAttribute("aria-expanded", "false");
1294
+ document.removeEventListener("pointerdown", onOutside);
1295
+ if (_activeDropdownClose === closeDropdown)
1296
+ _activeDropdownClose = null;
1297
+ }
1298
+ requestAnimationFrame(() => {
1299
+ search.focus();
1300
+ });
1301
+ };
1302
+ trigger.addEventListener("click", () => {
1303
+ if (trigger.getAttribute("aria-expanded") === "true") {
1304
+ _activeDropdownClose?.();
1305
+ }
1306
+ else {
1307
+ openDropdown();
1308
+ }
1309
+ });
1310
+ return trigger;
1311
+ }
1146
1312
  _renderActionButton(field) {
1147
1313
  const btn = document.createElement("button");
1148
1314
  btn.type = "button";
@@ -15,6 +15,13 @@ export interface FieldSchema {
15
15
  placeholder?: string;
16
16
  /** Options for `select` fields. */
17
17
  options?: SelectOption[];
18
+ /**
19
+ * For `type: "select"` fields — when true, renders a custom searchable
20
+ * dropdown instead of a native `<select>`. Use this for large option lists
21
+ * where filtering is helpful and where the native dropdown's lack of dark
22
+ * theme support is a problem.
23
+ */
24
+ searchable?: boolean;
18
25
  /** Short hint displayed below the field. */
19
26
  hint?: string;
20
27
  /** Tooltip text shown on hover over the field label. */
@@ -142,6 +142,7 @@ const GENERIC_SERVICE_TASK_SCHEMA = {
142
142
  key: "connector",
143
143
  label: "Connector",
144
144
  type: "select",
145
+ searchable: true,
145
146
  options: CONNECTOR_OPTIONS,
146
147
  hint: "Select a Camunda connector or use a custom job worker type.",
147
148
  },
@@ -281,6 +282,7 @@ const GENERIC_ADHOC_SCHEMA = {
281
282
  key: "connector",
282
283
  label: "Template",
283
284
  type: "select",
285
+ searchable: true,
284
286
  options: ADHOC_OPTIONS,
285
287
  hint: "Attach a Camunda AI agent template or use a plain ad-hoc subprocess.",
286
288
  },
@@ -773,6 +775,7 @@ const TIMER_SCHEMA = {
773
775
  key: "timerType",
774
776
  label: "Timer type",
775
777
  type: "select",
778
+ searchable: true,
776
779
  options: [
777
780
  { value: "timeCycle", label: "Cycle" },
778
781
  { value: "timeDuration", label: "Duration" },
@@ -79,6 +79,7 @@ function propToFieldSchema(prop) {
79
79
  return {
80
80
  ...base,
81
81
  type: "select",
82
+ searchable: true,
82
83
  options: (prop.choices ?? []).map((c) => ({ value: c.value, label: c.name })),
83
84
  };
84
85
  case "Boolean":
@@ -0,0 +1,4 @@
1
+ export declare const CONNECTOR_CATALOG_STYLE_ID = "bpmnkit-connector-catalog-v1";
2
+ export declare const CONNECTOR_CATALOG_CSS = "\n/* \u2500\u2500 Toast notifications \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.bpmnkit-cc-toast {\n position: fixed;\n bottom: 20px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 9px 16px;\n border-radius: 8px;\n font-family: system-ui, -apple-system, sans-serif;\n font-size: 13px;\n font-weight: 500;\n z-index: 99999;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);\n animation: bpmnkit-cc-fadein 0.15s ease;\n max-width: 420px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n pointer-events: none;\n}\n@keyframes bpmnkit-cc-fadein {\n from { opacity: 0; transform: translateX(-50%) translateY(6px); }\n to { opacity: 1; transform: translateX(-50%) translateY(0); }\n}\n.bpmnkit-cc-toast--loading {\n background: var(--bpmnkit-surface-2, #1e1e2e);\n border: 1px solid var(--bpmnkit-border, #2a2a42);\n color: var(--bpmnkit-fg-muted, #8888a8);\n}\n.bpmnkit-cc-toast--success {\n background: rgba(22, 163, 74, 0.12);\n border: 1px solid rgba(22, 163, 74, 0.35);\n color: var(--bpmnkit-success, #22c55e);\n}\n.bpmnkit-cc-toast--error {\n background: rgba(220, 38, 38, 0.12);\n border: 1px solid rgba(220, 38, 38, 0.35);\n color: var(--bpmnkit-danger, #f87171);\n}\n/* Light theme */\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cc-toast--loading {\n background: var(--bpmnkit-surface-2, #eeeef8);\n border-color: var(--bpmnkit-border, #d0d0e8);\n color: var(--bpmnkit-fg-muted, #6666a0);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cc-toast--success {\n background: rgba(22, 163, 74, 0.07);\n border-color: rgba(22, 163, 74, 0.3);\n color: var(--bpmnkit-success, #16a34a);\n}\n[data-bpmnkit-hud-theme=\"light\"] .bpmnkit-cc-toast--error {\n background: rgba(220, 38, 38, 0.07);\n border-color: rgba(220, 38, 38, 0.3);\n color: var(--bpmnkit-danger, #dc2626);\n}\n";
3
+ export declare function injectConnectorCatalogStyles(): void;
4
+ //# sourceMappingURL=css.d.ts.map
@@ -0,0 +1,72 @@
1
+ export const CONNECTOR_CATALOG_STYLE_ID = "bpmnkit-connector-catalog-v1";
2
+ export const CONNECTOR_CATALOG_CSS = `
3
+ /* ── Toast notifications ─────────────────────────────────────────────────── */
4
+ .bpmnkit-cc-toast {
5
+ position: fixed;
6
+ bottom: 20px;
7
+ left: 50%;
8
+ transform: translateX(-50%);
9
+ display: flex;
10
+ align-items: center;
11
+ gap: 8px;
12
+ padding: 9px 16px;
13
+ border-radius: 8px;
14
+ font-family: system-ui, -apple-system, sans-serif;
15
+ font-size: 13px;
16
+ font-weight: 500;
17
+ z-index: 99999;
18
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
19
+ animation: bpmnkit-cc-fadein 0.15s ease;
20
+ max-width: 420px;
21
+ white-space: nowrap;
22
+ overflow: hidden;
23
+ text-overflow: ellipsis;
24
+ pointer-events: none;
25
+ }
26
+ @keyframes bpmnkit-cc-fadein {
27
+ from { opacity: 0; transform: translateX(-50%) translateY(6px); }
28
+ to { opacity: 1; transform: translateX(-50%) translateY(0); }
29
+ }
30
+ .bpmnkit-cc-toast--loading {
31
+ background: var(--bpmnkit-surface-2, #1e1e2e);
32
+ border: 1px solid var(--bpmnkit-border, #2a2a42);
33
+ color: var(--bpmnkit-fg-muted, #8888a8);
34
+ }
35
+ .bpmnkit-cc-toast--success {
36
+ background: rgba(22, 163, 74, 0.12);
37
+ border: 1px solid rgba(22, 163, 74, 0.35);
38
+ color: var(--bpmnkit-success, #22c55e);
39
+ }
40
+ .bpmnkit-cc-toast--error {
41
+ background: rgba(220, 38, 38, 0.12);
42
+ border: 1px solid rgba(220, 38, 38, 0.35);
43
+ color: var(--bpmnkit-danger, #f87171);
44
+ }
45
+ /* Light theme */
46
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cc-toast--loading {
47
+ background: var(--bpmnkit-surface-2, #eeeef8);
48
+ border-color: var(--bpmnkit-border, #d0d0e8);
49
+ color: var(--bpmnkit-fg-muted, #6666a0);
50
+ }
51
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cc-toast--success {
52
+ background: rgba(22, 163, 74, 0.07);
53
+ border-color: rgba(22, 163, 74, 0.3);
54
+ color: var(--bpmnkit-success, #16a34a);
55
+ }
56
+ [data-bpmnkit-hud-theme="light"] .bpmnkit-cc-toast--error {
57
+ background: rgba(220, 38, 38, 0.07);
58
+ border-color: rgba(220, 38, 38, 0.3);
59
+ color: var(--bpmnkit-danger, #dc2626);
60
+ }
61
+ `;
62
+ export function injectConnectorCatalogStyles() {
63
+ if (typeof document === "undefined")
64
+ return;
65
+ if (document.getElementById(CONNECTOR_CATALOG_STYLE_ID))
66
+ return;
67
+ const style = document.createElement("style");
68
+ style.id = CONNECTOR_CATALOG_STYLE_ID;
69
+ style.textContent = CONNECTOR_CATALOG_CSS;
70
+ document.head.appendChild(style);
71
+ }
72
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @bpmnkit/canvas-plugin-connector-catalog — Import API connectors from
3
+ * OpenAPI specs into the BPMN editor via the command palette.
4
+ *
5
+ * Exposes 30+ pre-configured APIs (GitHub, Stripe, Slack, …) as searchable
6
+ * commands in Ctrl+K / ⌘K. Selecting one fetches the spec, generates connector
7
+ * templates via `@bpmnkit/connector-gen`, and registers them in the
8
+ * config-panel-bpmn connector selector — no restart required.
9
+ *
10
+ * An additional "Import from OpenAPI URL…" command accepts any OpenAPI 3.x
11
+ * spec URL for custom or private APIs.
12
+ *
13
+ * ## Usage
14
+ * ```typescript
15
+ * import { createConnectorCatalogPlugin } from "@bpmnkit/plugins/connector-catalog";
16
+ *
17
+ * const catalog = createConnectorCatalogPlugin(configPanelBpmn, palette);
18
+ * const editor = new BpmnEditor({
19
+ * container, xml,
20
+ * plugins: [configPanel, configPanelBpmn, palette, catalog],
21
+ * });
22
+ * ```
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ import type { CanvasPlugin } from "@bpmnkit/canvas";
27
+ import type { CommandPalettePlugin } from "../command-palette/index.js";
28
+ import type { ElementTemplate } from "../config-panel-bpmn/index.js";
29
+ import { CONNECTOR_CATALOG_CSS, CONNECTOR_CATALOG_STYLE_ID, injectConnectorCatalogStyles } from "./css.js";
30
+ export { CONNECTOR_CATALOG_CSS, CONNECTOR_CATALOG_STYLE_ID, injectConnectorCatalogStyles };
31
+ /** Subset of the config-panel-bpmn plugin API needed by this plugin. */
32
+ export interface TemplateRegistrar {
33
+ registerTemplate(template: ElementTemplate): void;
34
+ }
35
+ /**
36
+ * Creates the connector catalog plugin.
37
+ *
38
+ * Registers one command per built-in catalog entry plus an "Import from
39
+ * OpenAPI URL" command. All commands appear in the command palette (Ctrl+K /
40
+ * ⌘K). Selecting a catalog entry fetches the spec, generates connector
41
+ * templates, and registers them immediately in the config panel connector
42
+ * selector.
43
+ *
44
+ * @param registrar - The config-panel-bpmn plugin (or any object with
45
+ * `registerTemplate`).
46
+ * @param palette - The command palette plugin.
47
+ */
48
+ export declare function createConnectorCatalogPlugin(registrar: TemplateRegistrar, palette: CommandPalettePlugin): CanvasPlugin;
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,152 @@
1
+ /**
2
+ * @bpmnkit/canvas-plugin-connector-catalog — Import API connectors from
3
+ * OpenAPI specs into the BPMN editor via the command palette.
4
+ *
5
+ * Exposes 30+ pre-configured APIs (GitHub, Stripe, Slack, …) as searchable
6
+ * commands in Ctrl+K / ⌘K. Selecting one fetches the spec, generates connector
7
+ * templates via `@bpmnkit/connector-gen`, and registers them in the
8
+ * config-panel-bpmn connector selector — no restart required.
9
+ *
10
+ * An additional "Import from OpenAPI URL…" command accepts any OpenAPI 3.x
11
+ * spec URL for custom or private APIs.
12
+ *
13
+ * ## Usage
14
+ * ```typescript
15
+ * import { createConnectorCatalogPlugin } from "@bpmnkit/plugins/connector-catalog";
16
+ *
17
+ * const catalog = createConnectorCatalogPlugin(configPanelBpmn, palette);
18
+ * const editor = new BpmnEditor({
19
+ * container, xml,
20
+ * plugins: [configPanel, configPanelBpmn, palette, catalog],
21
+ * });
22
+ * ```
23
+ *
24
+ * @packageDocumentation
25
+ */
26
+ import { CATALOG, generateFromCatalog, generateFromUrl } from "@bpmnkit/connector-gen/browser";
27
+ import { CONNECTOR_CATALOG_CSS, CONNECTOR_CATALOG_STYLE_ID, injectConnectorCatalogStyles, } from "./css.js";
28
+ export { CONNECTOR_CATALOG_CSS, CONNECTOR_CATALOG_STYLE_ID, injectConnectorCatalogStyles };
29
+ // ── Toast helper ──────────────────────────────────────────────────────────────
30
+ function showToast(message, variant) {
31
+ const el = document.createElement("div");
32
+ el.className = `bpmnkit-cc-toast bpmnkit-cc-toast--${variant}`;
33
+ el.setAttribute("role", "status");
34
+ el.setAttribute("aria-live", "polite");
35
+ el.textContent = message;
36
+ document.body.append(el);
37
+ return el;
38
+ }
39
+ function resolveToast(el, message, variant, autoDismissMs) {
40
+ el.className = `bpmnkit-cc-toast bpmnkit-cc-toast--${variant}`;
41
+ el.textContent = message;
42
+ setTimeout(() => el.remove(), autoDismissMs);
43
+ }
44
+ // ── Core logic ────────────────────────────────────────────────────────────────
45
+ /**
46
+ * Strips common API descriptor words from an entry name to get a short prefix.
47
+ * "GitHub REST API" → "GitHub", "Twilio Messaging API" → "Twilio".
48
+ */
49
+ function derivePrefix(entryName) {
50
+ return entryName
51
+ .replace(/\s+(REST|Web|Admin|Management|CRM|Messaging|Mail|Payments|Helix|Email|Transactional)?\s*API\s*$/i, "")
52
+ .trim();
53
+ }
54
+ function withPrefix(templates, prefix) {
55
+ return templates.map((t) => ({ ...t, name: `${prefix}: ${t.name}` }));
56
+ }
57
+ function registerAll(templates, registrar) {
58
+ for (const t of templates) {
59
+ registrar.registerTemplate(t);
60
+ }
61
+ }
62
+ async function loadCatalogEntry(id, registrar) {
63
+ const entry = CATALOG.find((e) => e.id === id);
64
+ const label = entry?.name ?? id;
65
+ const toast = showToast(`Importing ${label}…`, "loading");
66
+ try {
67
+ const { templates } = await generateFromCatalog(id);
68
+ const prefix = entry ? derivePrefix(entry.name) : id;
69
+ registerAll(withPrefix(templates, prefix), registrar);
70
+ resolveToast(toast, `${templates.length} operations from ${label} added`, "success", 3000);
71
+ }
72
+ catch (err) {
73
+ const msg = err instanceof Error ? err.message : String(err);
74
+ resolveToast(toast, `Import failed: ${msg}`, "error", 5000);
75
+ }
76
+ }
77
+ async function loadFromUrl(url, registrar) {
78
+ // Derive idPrefix and a display prefix from the hostname
79
+ let idPrefix = "io.custom";
80
+ let prefix = "Custom";
81
+ try {
82
+ const parts = new URL(url).hostname.split(".").filter(Boolean);
83
+ if (parts.length >= 2) {
84
+ idPrefix = parts.slice(-2).reverse().join(".");
85
+ const last = idPrefix.split(".").at(-1) ?? "custom";
86
+ prefix = last.charAt(0).toUpperCase() + last.slice(1);
87
+ }
88
+ }
89
+ catch {
90
+ // url was not parseable — idPrefix/prefix stay as fallback
91
+ }
92
+ const toast = showToast("Fetching spec…", "loading");
93
+ try {
94
+ const { templates } = await generateFromUrl(url, { idPrefix });
95
+ registerAll(withPrefix(templates, prefix), registrar);
96
+ resolveToast(toast, `${templates.length} operations imported`, "success", 3000);
97
+ }
98
+ catch (err) {
99
+ const msg = err instanceof Error ? err.message : String(err);
100
+ resolveToast(toast, `Import failed: ${msg}`, "error", 5000);
101
+ }
102
+ }
103
+ // ── Factory ───────────────────────────────────────────────────────────────────
104
+ /**
105
+ * Creates the connector catalog plugin.
106
+ *
107
+ * Registers one command per built-in catalog entry plus an "Import from
108
+ * OpenAPI URL" command. All commands appear in the command palette (Ctrl+K /
109
+ * ⌘K). Selecting a catalog entry fetches the spec, generates connector
110
+ * templates, and registers them immediately in the config panel connector
111
+ * selector.
112
+ *
113
+ * @param registrar - The config-panel-bpmn plugin (or any object with
114
+ * `registerTemplate`).
115
+ * @param palette - The command palette plugin.
116
+ */
117
+ export function createConnectorCatalogPlugin(registrar, palette) {
118
+ let _deregister = null;
119
+ return {
120
+ name: "connector-catalog",
121
+ install() {
122
+ injectConnectorCatalogStyles();
123
+ const catalogCmds = CATALOG.map((entry) => ({
124
+ id: `connector-catalog:${entry.id}`,
125
+ title: `Import API: ${entry.name}`,
126
+ description: entry.description,
127
+ action() {
128
+ void loadCatalogEntry(entry.id, registrar);
129
+ },
130
+ }));
131
+ const urlCmd = {
132
+ id: "connector-catalog:url",
133
+ title: "Import from OpenAPI URL\u2026",
134
+ description: "Fetch any OpenAPI 3.x spec from a URL and add its operations",
135
+ action() {
136
+ palette.pushView([], {
137
+ placeholder: "https://\u2026 (OpenAPI 3.x spec URL)",
138
+ onConfirm(url) {
139
+ void loadFromUrl(url, registrar);
140
+ },
141
+ });
142
+ },
143
+ };
144
+ _deregister = palette.addCommands([...catalogCmds, urlCmd]);
145
+ },
146
+ uninstall() {
147
+ _deregister?.();
148
+ _deregister = null;
149
+ },
150
+ };
151
+ }
152
+ //# sourceMappingURL=index.js.map
@@ -1,5 +1,5 @@
1
1
  import type { CanvasPlugin } from "@bpmnkit/canvas";
2
- import type { MainMenuApi } from "../main-menu/index.js";
2
+ import type { MainMenuApi, MenuItem } from "../main-menu/index.js";
3
3
  import { StorageApi, type StorageApiOptions } from "./storage-api.js";
4
4
  import type { FileType } from "./types.js";
5
5
  export type { FileType, WorkspaceRecord, ProjectRecord, FileRecord, FileContentRecord, } from "./types.js";
@@ -30,6 +30,12 @@ export interface StoragePluginOptions extends StorageApiOptions {
30
30
  * Update the corresponding tab's display name from this callback.
31
31
  */
32
32
  onRenameCurrentFile?: (fileId: string, name: string) => void;
33
+ /**
34
+ * Optional items prepended to the dynamic menu items on every open.
35
+ * Use this to inject context-sensitive items (e.g. mobile edit actions)
36
+ * without being overridden by storage change events.
37
+ */
38
+ prependItems?: () => MenuItem[];
33
39
  }
34
40
  /**
35
41
  * Creates an IndexedDB-backed storage plugin.
@@ -107,7 +107,7 @@ export function createStoragePlugin(options) {
107
107
  }
108
108
  function buildDynamicItems() {
109
109
  const currentProjectId = storageApi.getCurrentProjectId();
110
- const items = [];
110
+ const items = [...(options.prependItems?.() ?? [])];
111
111
  if (currentProjectId) {
112
112
  items.push({
113
113
  type: "info",
@@ -12,7 +12,7 @@
12
12
  */
13
13
  import type { CanvasPlugin } from "@bpmnkit/canvas";
14
14
  import type { CommandPalettePlugin } from "../command-palette/index.js";
15
- import type { MainMenuApi } from "../main-menu/index.js";
15
+ import type { MainMenuApi, MenuItem } from "../main-menu/index.js";
16
16
  import type { StorageApi } from "../storage/index.js";
17
17
  import { InMemoryFileResolver } from "../tabs/index.js";
18
18
  import type { TabConfig, TabsApi, WelcomeExample, WelcomeSection } from "../tabs/index.js";
@@ -81,6 +81,11 @@ export interface StorageTabsBridgeOptions {
81
81
  * Use this to disable editing UI (toolbar buttons, sidebar) while raw mode is active.
82
82
  */
83
83
  onRawModeChange?: (active: boolean) => void;
84
+ /**
85
+ * Optional items prepended to the dynamic menu items on every menu open.
86
+ * Composed with storage items so they survive storage change events.
87
+ */
88
+ prependItems?: () => MenuItem[];
84
89
  }
85
90
  export interface StorageTabsBridgeResult {
86
91
  tabsPlugin: CanvasPlugin & {
@@ -131,6 +131,7 @@ export function createStorageTabsBridge(options) {
131
131
  mainMenu: options.mainMenu,
132
132
  getOpenTabs: () => tabsPlugin.api.getAllTabContent(),
133
133
  initialTitle: options.initialTitle,
134
+ prependItems: options.prependItems,
134
135
  onLeaveProject() {
135
136
  tabsPlugin.api.closeAllTabs();
136
137
  tabIdToStorageFileId.clear();
@@ -84,7 +84,7 @@ export function createTabsPlugin(options = {}) {
84
84
  const bpmnProcessNames = new Map();
85
85
  /** Tracks the last-activated tab ID per type group. */
86
86
  const groupActiveId = new Map();
87
- /** Which type group's dropdown is currently open, if any. */
87
+ /** Which type group's dropdown is currently open, if any. "mobile" means the unified mobile dropdown. */
88
88
  let openDropdownType = null;
89
89
  let outsideClickHandler = null;
90
90
  // --- Close-confirmation dialog ---
@@ -449,6 +449,59 @@ export function createTabsPlugin(options = {}) {
449
449
  openDropdown(type, group, anchorEl);
450
450
  }
451
451
  }
452
+ function openMobileDropdown(anchorEl) {
453
+ if (!dropdownEl)
454
+ return;
455
+ dropdownEl.innerHTML = "";
456
+ dropdownEl.dataset.theme = theme;
457
+ for (const type of GROUP_TYPES) {
458
+ const group = tabs.filter((t) => t.config.type === type);
459
+ for (const tab of group) {
460
+ const item = document.createElement("div");
461
+ item.className = "bpmnkit-tab-drop-item";
462
+ if (tab.id === activeId)
463
+ item.classList.add("active");
464
+ const badge = document.createElement("span");
465
+ badge.className = `bpmnkit-tab-type ${type}`;
466
+ badge.textContent = type.toUpperCase();
467
+ item.appendChild(badge);
468
+ const nameSpan = document.createElement("span");
469
+ nameSpan.className = "bpmnkit-tab-drop-name";
470
+ nameSpan.textContent = tab.config.name ?? tab.id;
471
+ item.appendChild(nameSpan);
472
+ if (!isProjectMode) {
473
+ const closeBtn = document.createElement("span");
474
+ closeBtn.className = "bpmnkit-tab-close";
475
+ closeBtn.textContent = "×";
476
+ closeBtn.addEventListener("click", (e) => {
477
+ e.stopPropagation();
478
+ closeDropdownEl();
479
+ requestClose(tab);
480
+ });
481
+ item.appendChild(closeBtn);
482
+ }
483
+ item.addEventListener("click", () => {
484
+ groupActiveId.set(type, tab.id);
485
+ api.setActiveTab(tab.id);
486
+ closeDropdownEl();
487
+ });
488
+ dropdownEl.appendChild(item);
489
+ }
490
+ }
491
+ const rect = anchorEl.getBoundingClientRect();
492
+ dropdownEl.style.top = `${rect.bottom}px`;
493
+ dropdownEl.style.left = `${rect.left}px`;
494
+ dropdownEl.classList.add("open");
495
+ openDropdownType = "mobile";
496
+ }
497
+ function toggleMobileDropdown(anchorEl) {
498
+ if (openDropdownType === "mobile") {
499
+ closeDropdownEl();
500
+ }
501
+ else {
502
+ openMobileDropdown(anchorEl);
503
+ }
504
+ }
452
505
  // --- Tab bar rendering ---
453
506
  function requestClose(tab) {
454
507
  if (isProjectMode)
@@ -465,29 +518,63 @@ export function createTabsPlugin(options = {}) {
465
518
  /**
466
519
  * Rebuilds the tab bar from scratch.
467
520
  * At most three group tabs are rendered (one per type: BPMN, DMN, Form).
521
+ * On narrow viewports (≤600px) a single unified tab is shown instead.
468
522
  */
469
523
  function renderTabBar() {
470
524
  if (!tabBar)
471
525
  return;
472
526
  tabBar.innerHTML = "";
473
- for (const type of GROUP_TYPES) {
474
- const group = tabs.filter((t) => t.config.type === type);
475
- if (group.length === 0)
476
- continue;
477
- // Ensure groupActiveId[type] points to a valid tab in this group
478
- if (!group.some((t) => t.id === groupActiveId.get(type))) {
479
- const first = group[0];
480
- if (first)
481
- groupActiveId.set(type, first.id);
527
+ if (window.innerWidth <= 600 && tabs.length > 0) {
528
+ const activeTab = tabs.find((t) => t.id === activeId);
529
+ if (activeTab) {
530
+ createMobileTabEl(activeTab);
531
+ }
532
+ }
533
+ else {
534
+ for (const type of GROUP_TYPES) {
535
+ const group = tabs.filter((t) => t.config.type === type);
536
+ if (group.length === 0)
537
+ continue;
538
+ // Ensure groupActiveId[type] points to a valid tab in this group
539
+ if (!group.some((t) => t.id === groupActiveId.get(type))) {
540
+ const first = group[0];
541
+ if (first)
542
+ groupActiveId.set(type, first.id);
543
+ }
544
+ const isGroupActive = group.some((t) => t.id === activeId);
545
+ createGroupTabEl(type, group, isGroupActive);
482
546
  }
483
- const isGroupActive = group.some((t) => t.id === activeId);
484
- createGroupTabEl(type, group, isGroupActive);
485
547
  }
486
548
  // Center slot must be re-appended after innerHTML clear
487
549
  if (centerSlotEl)
488
550
  tabBar.appendChild(centerSlotEl);
489
551
  updateRawModeBtn();
490
552
  }
553
+ function createMobileTabEl(activeTab) {
554
+ const el = document.createElement("div");
555
+ el.className = "bpmnkit-tab active";
556
+ const typeBadge = document.createElement("span");
557
+ typeBadge.className = `bpmnkit-tab-type ${activeTab.config.type}`;
558
+ typeBadge.textContent = activeTab.config.type.toUpperCase();
559
+ el.appendChild(typeBadge);
560
+ const nameEl = document.createElement("span");
561
+ nameEl.className = "bpmnkit-tab-name";
562
+ nameEl.textContent = activeTab.config.name ?? activeTab.config.type;
563
+ el.appendChild(nameEl);
564
+ if (tabs.length > 1) {
565
+ const chevron = document.createElement("span");
566
+ chevron.className = "bpmnkit-tab-chevron";
567
+ chevron.innerHTML =
568
+ '<svg viewBox="0 0 10 6" fill="currentColor"><path d="M0 0l5 6 5-6z"/></svg>';
569
+ el.appendChild(chevron);
570
+ }
571
+ el.addEventListener("click", () => {
572
+ if (tabs.length > 1) {
573
+ toggleMobileDropdown(el);
574
+ }
575
+ });
576
+ tabBar?.appendChild(el);
577
+ }
491
578
  function createGroupTabEl(type, group, isGroupActive) {
492
579
  const el = document.createElement("div");
493
580
  el.className = `bpmnkit-tab${isGroupActive ? " active" : ""}`;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bpmnkit/plugins",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "exports": {
@@ -16,6 +16,10 @@
16
16
  "import": "./dist/command-palette/index.js",
17
17
  "types": "./dist/command-palette/index.d.ts"
18
18
  },
19
+ "./connector-catalog": {
20
+ "import": "./dist/connector-catalog/index.js",
21
+ "types": "./dist/connector-catalog/index.d.ts"
22
+ },
19
23
  "./command-palette-editor": {
20
24
  "import": "./dist/command-palette-editor/index.js",
21
25
  "types": "./dist/command-palette-editor/index.d.ts"
@@ -104,13 +108,14 @@
104
108
  "dist/**/*.d.ts"
105
109
  ],
106
110
  "dependencies": {
107
- "@bpmnkit/ascii": "0.0.12",
108
- "@bpmnkit/core": "0.0.12",
109
- "@bpmnkit/canvas": "0.0.12",
110
- "@bpmnkit/editor": "0.0.12",
111
+ "@bpmnkit/ascii": "0.0.13",
112
+ "@bpmnkit/canvas": "0.0.13",
113
+ "@bpmnkit/connector-gen": "0.0.7",
114
+ "@bpmnkit/core": "0.0.13",
115
+ "@bpmnkit/editor": "0.0.14",
111
116
  "@bpmnkit/feel": "0.0.12"
112
117
  },
113
- "description": "22 composable canvas plugins for BPMN editors and viewers — minimap, AI chat, process simulation, storage, and more",
118
+ "description": "23 composable canvas plugins for BPMN editors and viewers — minimap, AI chat, process simulation, storage, and more",
114
119
  "keywords": [
115
120
  "bpmn",
116
121
  "plugins",