UNPKG

@mochabug/adapt-web

Version:

Browser client library for Adapt automation platform

896 lines (789 loc) 27.7 kB
const PANEL_MANAGER_CSS=`/* ========================================================================== Mochabug Adapt Web \u2014 Combined Styles Panel Manager CSS + Cap Widget CSS ========================================================================== */ :root { --mb-adapt-styles-loaded: 1; } /* \u2500\u2500 Root \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-adapt { position: relative; width: 100%; height: 100%; min-height: inherit; display: flex; flex-direction: column; /* Two-layer CSS variables: --_X reads user-set --mb-adapt-X first, falls back to light default */ --_bg: var(--mb-adapt-bg, transparent); --_font: var(--mb-adapt-font, system-ui, -apple-system, sans-serif); --_button-hover-bg: var(--mb-adapt-button-hover-bg, rgba(128, 128, 128, 0.2)); --_separator-active: var(--mb-adapt-separator-active, rgba(59, 130, 246, 0.5)); --_floating-shadow: var(--mb-adapt-floating-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.25), 0 12px 24px -8px rgba(0, 0, 0, 0.15)); --_floating-border: var(--mb-adapt-floating-border, none); --_floating-backdrop: var(--mb-adapt-floating-backdrop, none); --_floating-radius: var(--mb-adapt-floating-radius, 8px); --_status-card-bg: var(--mb-adapt-status-card-bg, #ffffff); --_status-card-border: var(--mb-adapt-status-card-border, #e5e7eb); --_status-card-shadow: var(--mb-adapt-status-card-shadow, 0 4px 24px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04)); --_status-icon-bg: var(--mb-adapt-status-icon-bg, #fef2f2); --_status-icon-stopped-bg: var(--mb-adapt-status-icon-stopped-bg, var(--mb-adapt-status-icon-bg, #f3f4f6)); --_status-text: var(--mb-adapt-status-text, #374151); --_drag-ghost-shadow: var(--mb-adapt-drag-ghost-shadow, 0 4px 12px rgba(0, 0, 0, 0.15)); --_border-radius: var(--mb-adapt-border-radius, 8px); --_z-base: var(--mb-adapt-z-base, 0); --mb-adapt-responsive-breakpoint: 768; --mb-adapt-responsive-hysteresis: 40; /* Cap.js widget variables */ --_cap-background: var(--mb-adapt-cap-background, #ffffff); --_cap-border-color: var(--mb-adapt-cap-border-color, #e2e8f0); --_cap-border-radius: var(--mb-adapt-cap-border-radius, 16px); --_cap-height: var(--mb-adapt-cap-height, 72px); --_cap-width: var(--mb-adapt-cap-width, 380px); --_cap-padding: var(--mb-adapt-cap-padding, 20px 28px); --_cap-gap: var(--mb-adapt-cap-gap, 20px); --_cap-color: var(--mb-adapt-cap-color, #1e293b); --_cap-checkbox-size: var(--mb-adapt-cap-checkbox-size, 36px); --_cap-checkbox-border: var(--mb-adapt-cap-checkbox-border, 2px solid #cbd5e1); --_cap-checkbox-radius: var(--mb-adapt-cap-checkbox-radius, 10px); --_cap-checkbox-background: var(--mb-adapt-cap-checkbox-background, #f8fafc); --_cap-spinner-color: var(--mb-adapt-cap-spinner-color, #6366f1); --_cap-spinner-bg: var(--mb-adapt-cap-spinner-bg, #e2e8f0); --_cap-font: var(--mb-adapt-cap-font, inherit); --_cap-spinner-thickness: var(--mb-adapt-cap-spinner-thickness, 3px); --_cap-invalid-border-color: var(--mb-adapt-cap-invalid-border-color, #f55b50); --_cap-invalid-ring-color: var(--mb-adapt-cap-invalid-ring-color, rgba(245, 91, 80, 0.2)); --_cap-shadow: var(--mb-adapt-cap-shadow, 0 4px 20px rgba(0, 0, 0, 0.08), 0 2px 8px rgba(0, 0, 0, 0.04)); --_cap-shadow-hover: var(--mb-adapt-cap-shadow-hover, 0 8px 30px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.06)); /* Fork panel theming */ --_main-bg: var(--mb-adapt-main-bg, transparent); --_fork-bg: var(--mb-adapt-fork-bg, #ffffff); --_fork-tab-bg: var(--mb-adapt-fork-tab-bg, #f3f3f3); --_fork-tab-active-bg: var(--mb-adapt-fork-tab-active-bg, #ffffff); --_fork-tab-color: var(--mb-adapt-fork-tab-color, rgb(51, 51, 51)); --_fork-tab-inactive-color: var(--mb-adapt-fork-tab-inactive-color, rgba(51, 51, 51, 0.7)); --_fork-separator: var(--mb-adapt-fork-separator, rgb(218, 218, 218)); /* Tab shape */ --_tab-radius: var(--mb-adapt-tab-radius, 0); --_tab-shadow: var(--mb-adapt-tab-shadow, none); --_tab-active-shadow: var(--mb-adapt-tab-active-shadow, none); --_tab-gap: var(--mb-adapt-tab-gap, 0px); --_tab-padding: var(--mb-adapt-tab-padding, 0 14px); --_tab-font-size: var(--mb-adapt-tab-font-size, 13px); --_tab-min-width: var(--mb-adapt-tab-min-width, 100px); --_tab-spacing: var(--mb-adapt-tab-spacing, 6px); --_toolbar-height: var(--mb-adapt-toolbar-height, 40px); --_toolbar-padding: var(--mb-adapt-toolbar-padding, 0); /* Drop targets \u2014 light defaults */ --_drop-header-bg: var(--mb-adapt-drop-header-bg, rgba(99, 102, 241, 0.18)); --_drop-center-bg: var(--mb-adapt-drop-center-bg, rgba(99, 102, 241, 0.12)); --_drop-split-bg: var(--mb-adapt-drop-split-bg, rgba(99, 102, 241, 0.14)); --_drop-border: var(--mb-adapt-drop-border, rgba(99, 102, 241, 0.55)); background: var(--_bg); } .mb-adapt--dark { /* Cap.js widget dark mode */ --_cap-background: var(--mb-adapt-cap-background, #1e293b); --_cap-border-color: var(--mb-adapt-cap-border-color, #334155); --_cap-color: var(--mb-adapt-cap-color, #f1f5f9); --_cap-checkbox-border: var(--mb-adapt-cap-checkbox-border, 2px solid #475569); --_cap-checkbox-background: var(--mb-adapt-cap-checkbox-background, #0f172a); --_cap-spinner-color: var(--mb-adapt-cap-spinner-color, #818cf8); --_cap-spinner-bg: var(--mb-adapt-cap-spinner-bg, #334155); --_cap-shadow: var(--mb-adapt-cap-shadow, 0 4px 20px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15)); --_cap-shadow-hover: var(--mb-adapt-cap-shadow-hover, 0 8px 30px rgba(0, 0, 0, 0.35), 0 4px 12px rgba(0, 0, 0, 0.2)); /* Status card dark mode */ --_status-card-bg: var(--mb-adapt-status-card-bg, #1e293b); --_status-card-border: var(--mb-adapt-status-card-border, #334155); --_status-icon-bg: var(--mb-adapt-status-icon-bg, #351c1c); --_status-icon-stopped-bg: var(--mb-adapt-status-icon-stopped-bg, var(--mb-adapt-status-icon-bg, #1e293b)); --_status-text: var(--mb-adapt-status-text, #e2e8f0); /* Panel dark mode overrides */ --_button-hover-bg: var(--mb-adapt-button-hover-bg, rgba(128, 128, 128, 0.3)); --_separator-active: var(--mb-adapt-separator-active, rgba(99, 130, 246, 0.6)); --_floating-shadow: var(--mb-adapt-floating-shadow, 0 25px 50px -12px rgba(0, 0, 0, 0.5), 0 12px 24px -8px rgba(0, 0, 0, 0.3)); --_floating-border: var(--mb-adapt-floating-border, 1px solid rgba(255, 255, 255, 0.06)); --_status-card-shadow: var(--mb-adapt-status-card-shadow, 0 4px 24px rgba(0, 0, 0, 0.25), 0 2px 8px rgba(0, 0, 0, 0.15)); --_drag-ghost-shadow: var(--mb-adapt-drag-ghost-shadow, 0 4px 12px rgba(0, 0, 0, 0.35)); /* Fork panel dark mode */ --_main-bg: var(--mb-adapt-main-bg, transparent); --_fork-bg: var(--mb-adapt-fork-bg, #1e1e1e); --_fork-tab-bg: var(--mb-adapt-fork-tab-bg, #252526); --_fork-tab-active-bg: var(--mb-adapt-fork-tab-active-bg, #1e1e1e); --_fork-tab-color: var(--mb-adapt-fork-tab-color, #ffffff); --_fork-tab-inactive-color: var(--mb-adapt-fork-tab-inactive-color, #969696); --_fork-separator: var(--mb-adapt-fork-separator, rgb(68, 68, 68)); /* Drop target dark mode */ --_drop-header-bg: var(--mb-adapt-drop-header-bg, rgba(129, 140, 248, 0.22)); --_drop-center-bg: var(--mb-adapt-drop-center-bg, rgba(129, 140, 248, 0.15)); --_drop-split-bg: var(--mb-adapt-drop-split-bg, rgba(129, 140, 248, 0.18)); --_drop-border: var(--mb-adapt-drop-border, rgba(129, 140, 248, 0.6)); } /* \u2500\u2500 Layout (recursive split tree) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-layout { flex: 1; min-height: 0; position: relative; display: flex; } .mb-split-container { display: flex; min-width: 0; min-height: 0; } .mb-split-horizontal { flex-direction: row; } .mb-split-vertical { flex-direction: column; } .mb-split-leaf { min-width: 0; min-height: 0; overflow: hidden; } /* Animated flex transition \u2014 applied temporarily during dock/undock/maximize */ .mb-split-leaf--animating { transition: flex 0.25s ease; } .mb-split-container--animating { transition: flex 0.25s ease; } .mb-layout-separator--animating { transition: opacity 0.25s ease; } /* Draggable separator between split panels */ .mb-layout-separator { flex: 0 0 5px; background: var(--_fork-separator); transition: background 0.15s; position: relative; z-index: calc(1 + var(--_z-base)); touch-action: none; } .mb-layout-separator-v { cursor: col-resize; } .mb-layout-separator-h { cursor: row-resize; } .mb-layout-separator:hover, .mb-layout-separator--active { background: var(--_separator-active); } /* \u2500\u2500 Group \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-group { display: flex; flex-direction: column; height: 100%; background: var(--_bg); } .mb-group-header { display: flex; align-items: stretch; height: var(--_toolbar-height); min-height: var(--_toolbar-height); padding: var(--_toolbar-padding); background: var(--_fork-tab-bg); border-bottom: 1px solid var(--_fork-separator); user-select: none; } .mb-group-header-prefix { display: flex; align-items: stretch; } .mb-group-tabs { display: flex; align-items: stretch; overflow-x: auto; overflow-y: hidden; flex: 0 1 auto; min-width: 0; } .mb-group-tabs::-webkit-scrollbar { height: 2px; } /* Drag handle \u2014 fills remaining header space so the user can grab it */ .mb-group-header-void { flex: 1; min-width: 40px; touch-action: none; } .mb-group-header-actions { display: flex; align-items: center; } .mb-group-content { flex: 1; position: relative; overflow: hidden; background: var(--_fork-bg); } /* Main group overrides */ .mb-group[data-main-group="true"] { background: var(--_bg); } .mb-group[data-main-group="true"] .mb-group-content { background: var(--_main-bg); } /* \u2500\u2500 Tab \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-tab { display: flex; align-items: center; gap: var(--_tab-spacing); padding: var(--_tab-padding); min-width: var(--_tab-min-width); font-size: var(--_tab-font-size); font-family: var(--_font); white-space: nowrap; cursor: pointer; touch-action: none; color: var(--_fork-tab-inactive-color); background: var(--_fork-tab-bg); border-right: 1px solid var(--_fork-separator); border-radius: var(--_tab-radius); box-shadow: var(--_tab-shadow); margin: var(--_tab-gap); transition: background 0.15s, box-shadow 0.15s; } .mb-tab[data-active="true"] { color: var(--_fork-tab-color); background: var(--_fork-tab-active-bg); box-shadow: var(--_tab-active-shadow); } .mb-tab:hover { background: var(--_fork-tab-active-bg); } .mb-tab-label { display: flex; align-items: center; } .mb-tab-label svg { width: 14px; height: 14px; opacity: 0.7; flex-shrink: 0; } .mb-tab[data-active="true"] .mb-tab-label svg { opacity: 1; } .mb-tab-actions { display: flex; align-items: center; gap: 2px; width: 40px; flex-shrink: 0; justify-content: flex-end; margin-left: auto; } .mb-tab-close { width: 18px; height: 18px; padding: 0; border: none; background: transparent; color: inherit; cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 3px; opacity: 0; transition: opacity 0.15s, background 0.15s; } .mb-tab:hover .mb-tab-close { opacity: 0.7; } .mb-tab-close:hover { opacity: 1 !important; background: var(--_button-hover-bg); } .mb-tab-close svg { width: 12px; height: 12px; } /* \u2500\u2500 Panel visibility \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-panel { width: 100%; height: 100%; position: absolute; inset: 0; } .mb-panel[data-active="false"] { display: none; } .mb-panel[data-active="true"] { display: block; } /* \u2500\u2500 Floating overlay \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-floating-overlay { position: fixed; z-index: calc(100000 + var(--_z-base)); box-shadow: var(--_floating-shadow); border: var(--_floating-border); backdrop-filter: var(--_floating-backdrop); -webkit-backdrop-filter: var(--_floating-backdrop); border-radius: var(--_floating-radius); display: flex; flex-direction: column; /* No overflow:hidden here \u2014 resize handles use negative offsets (top:-3px etc.) and would be clipped. The inner .mb-group already has overflow:hidden for its own border-radius clipping. */ } .mb-floating-overlay > .mb-group { flex: 1; border-radius: var(--_floating-radius); overflow: hidden; } /* Internal split layout inside a floating overlay */ .mb-floating-overlay > .mb-layout { position: relative; inset: auto; height: auto; flex: 1; min-width: 0; min-height: 0; border-radius: var(--_floating-radius); overflow: hidden; } .mb-floating-maximized { border-radius: 0; box-shadow: none; } .mb-floating-maximized .mb-group { border-radius: 0; } .mb-floating-maximized .mb-resize-handle { display: none !important; } .mb-floating-maximized .mb-group-header-void { pointer-events: none; } /* \u2500\u2500 Resize handles \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-resize-handle { position: absolute; z-index: calc(10 + var(--_z-base)); touch-action: none; } .mb-resize-n { top: -3px; left: 8px; right: 8px; height: 6px; cursor: n-resize; } .mb-resize-s { bottom: -3px; left: 8px; right: 8px; height: 6px; cursor: s-resize; } .mb-resize-e { right: -3px; top: 8px; bottom: 8px; width: 6px; cursor: e-resize; } .mb-resize-w { left: -3px; top: 8px; bottom: 8px; width: 6px; cursor: w-resize; } .mb-resize-ne { top: -3px; right: -3px; width: 12px; height: 12px; cursor: ne-resize; } .mb-resize-nw { top: -3px; left: -3px; width: 12px; height: 12px; cursor: nw-resize; } .mb-resize-se { bottom: -3px; right: -3px; width: 12px; height: 12px; cursor: se-resize; } .mb-resize-sw { bottom: -3px; left: -3px; width: 12px; height: 12px; cursor: sw-resize; } /* \u2500\u2500 Iframe styling \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-adapt__iframe { width: 100%; height: 100%; min-height: 0; border: 0; display: block; background: transparent; border-radius: var(--_border-radius); pointer-events: auto; opacity: 0; transition: opacity 0.1s ease-out; } .mb-adapt__iframe--visible { opacity: 1; } .mb-adapt__iframe--hidden { display: none; } /* \u2500\u2500 Status message overlay \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-adapt__status-message { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; z-index: calc(200000 + var(--_z-base)); background: transparent; pointer-events: none; } .mb-adapt__status-card { pointer-events: auto; display: flex; flex-direction: column; align-items: center; gap: 16px; padding: 32px 40px; max-width: 380px; border-radius: 16px; background: var(--_status-card-bg); border: 1px solid var(--_status-card-border); box-shadow: var(--_status-card-shadow); font-family: var(--_font); text-align: center; } .mb-adapt__status-icon { width: 48px; height: 48px; border-radius: 12px; display: flex; align-items: center; justify-content: center; background: var(--_status-icon-bg); } .mb-adapt__status-icon svg { width: 24px; height: 24px; } .mb-adapt__status-icon--stopped { background: var(--_status-icon-stopped-bg); } .mb-adapt__status-text { color: var(--_status-text); font-size: 15px; line-height: 1.5; margin: 0; } .mb-adapt__status-restart { padding: 8px 20px; border: 1px solid var(--_status-card-border); border-radius: 8px; background: transparent; color: var(--_status-text); font-size: 14px; font-weight: 500; font-family: var(--_font); cursor: pointer; transition: background 0.15s, border-color 0.15s; } .mb-adapt__status-restart:hover { background: var(--_status-card-border); } /* \u2500\u2500 Confirm-on-close dialog \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-adapt__confirm-overlay { position: fixed; inset: 0; display: flex; flex-direction: row; align-items: center; justify-content: center; z-index: calc(300000 + var(--_z-base)); background: rgba(0, 0, 0, 0.4); height: auto; min-height: 0; } .mb-adapt--dark.mb-adapt__confirm-overlay { background: rgba(0, 0, 0, 0.55); } .mb-adapt__confirm-card { display: flex; flex-direction: column; align-items: stretch; gap: 16px; padding: 24px 28px; max-width: 360px; width: 100%; border-radius: var(--_floating-radius); background: var(--_fork-tab-active-bg); border: 1px solid var(--_fork-separator); box-shadow: var(--_floating-shadow); font-family: var(--_font); text-align: center; } .mb-adapt__confirm-text { font-size: 14px; line-height: 1.5; color: var(--_fork-tab-color); margin: 0; } .mb-adapt__confirm-buttons { display: flex; gap: 8px; justify-content: flex-end; } .mb-adapt__confirm-btn { padding: 8px 16px; border-radius: 6px; font-size: 13px; font-family: var(--_font); cursor: pointer; font-weight: 500; transition: background 0.15s, border-color 0.15s; } .mb-adapt__confirm-btn--cancel { background: transparent; border: 1px solid var(--_fork-separator); color: var(--_fork-tab-color); } .mb-adapt__confirm-btn--cancel:hover { background: var(--_button-hover-bg); } .mb-adapt__confirm-btn--confirm { background: var(--_fork-tab-color); color: var(--_fork-tab-active-bg); border: 1px solid transparent; } .mb-adapt__confirm-btn--confirm:hover { opacity: 0.85; } /* \u2500\u2500 Cap.js widget positioning \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-adapt-cap { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; pointer-events: none; z-index: calc(200000 + var(--_z-base)); } .mb-adapt-cap > * { pointer-events: auto; } /* Cap.js widget styling */ .mb-adapt cap-widget { --cap-background: var(--_cap-background); --cap-border-color: var(--_cap-border-color); --cap-border-radius: var(--_cap-border-radius); --cap-widget-height: var(--_cap-height); --cap-widget-width: var(--_cap-width); --cap-widget-padding: var(--_cap-padding); --cap-gap: var(--_cap-gap); --cap-color: var(--_cap-color); --cap-checkbox-size: var(--_cap-checkbox-size); --cap-checkbox-border: var(--_cap-checkbox-border); --cap-checkbox-border-radius: var(--_cap-checkbox-radius); --cap-checkbox-background: var(--_cap-checkbox-background); --cap-checkbox-margin: 0; --cap-font: var(--_cap-font); --cap-spinner-color: var(--_cap-spinner-color); --cap-spinner-background-color: var(--_cap-spinner-bg); --cap-spinner-thickness: var(--_cap-spinner-thickness); --cap-invalid-border-color: var(--_cap-invalid-border-color); --cap-invalid-ring-color: var(--_cap-invalid-ring-color); } /* Hide Cap.js credits */ cap-widget::part(attribution) { display: none !important; visibility: hidden !important; pointer-events: none !important; } /* \u2500\u2500 Fork group action 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 */ .mb-adapt-fork-actions { display: flex; align-items: center; gap: 2px; padding-right: 4px; } .mb-adapt-fork-actions button { width: 20px; height: 20px; padding: 0; border: none; background: transparent; color: var(--_fork-tab-color); cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 3px; opacity: 0.7; transition: opacity 0.15s, background 0.15s; } .mb-adapt-fork-actions button:hover { opacity: 1; background: var(--_button-hover-bg); } .mb-adapt-fork-actions button svg { width: 14px; height: 14px; } /* \u2500\u2500 Minimized-group tabs bar (at the top, NOT an overlay) \u2500\u2500\u2500 */ /* Sits at the top of .mb-adapt as a normal flow element so the layout underneath shrinks to accommodate it. This prevents scrollbars when docked panels are minimized \u2014 the iframe gets the remaining height. */ .mb-adapt-minimized-tabs { display: none; height: var(--_toolbar-height); flex-shrink: 0; z-index: calc(100 + var(--_z-base)); align-items: stretch; background: var(--_fork-tab-bg); border-bottom: 1px solid var(--_fork-separator); user-select: none; } .mb-adapt-minimized-tab { display: flex; align-items: center; gap: 8px; padding: 0 12px; flex: 1; background: var(--_fork-tab-bg); color: var(--_fork-tab-color); font-size: var(--_tab-font-size); font-family: var(--_font); white-space: nowrap; border-right: 1px solid var(--_fork-separator); cursor: default; } .mb-adapt-minimized-tab-label { flex: 1; display: flex; align-items: center; gap: 4px; } .mb-adapt-minimized-tab-label svg { width: 14px; height: 14px; opacity: 0.8; flex-shrink: 0; } .mb-adapt-minimized-tab-action { width: 22px; height: 22px; padding: 0; border: none; background: transparent; color: inherit; cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 4px; opacity: 0.6; transition: opacity 0.15s, background 0.15s; } .mb-adapt-minimized-tab-action:hover { opacity: 1; background: var(--_button-hover-bg); } .mb-adapt-minimized-tab-action svg { width: 14px; height: 14px; } /* Minimized tab drag handle cursor */ .mb-adapt-minimized-tab { cursor: grab; touch-action: none; } /* Drop target highlight for minimized tab merge */ .mb-adapt-minimized-tab--drop-target { background: var(--_drop-header-bg) !important; box-shadow: inset 0 0 0 2px var(--_drop-border); } /* \u2500\u2500 Pointer-drag ghost element \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-drag-ghost { position: fixed; pointer-events: none; z-index: calc(999999 + var(--_z-base)); padding: 4px 10px; background: var(--_fork-tab-bg); color: var(--_fork-tab-color); border: 1px solid var(--_fork-separator); border-radius: var(--_tab-radius, 4px); font-size: var(--_tab-font-size); font-family: var(--_font); white-space: nowrap; box-shadow: var(--_drag-ghost-shadow); opacity: 0.92; display: flex; align-items: center; } .mb-drag-ghost svg { width: 16px; height: 16px; } /* \u2500\u2500 Drop target highlight on group header \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ .mb-group-header--drop-target { background: var(--_drop-header-bg) !important; box-shadow: inset 0 0 0 2px var(--_drop-border); } /* \u2500\u2500 Drop overlay (content-area and dock-strip indicators) */ .mb-drop-overlay { position: fixed; pointer-events: none; z-index: calc(999998 + var(--_z-base)); display: none; box-sizing: border-box; border-radius: 6px; transition: opacity 0.1s ease-out; } .mb-drop-overlay[data-zone="center"] { background: var(--_drop-center-bg); border: 2px solid var(--_drop-border); } .mb-drop-overlay[data-zone="top"], .mb-drop-overlay[data-zone="bottom"], .mb-drop-overlay[data-zone="left"], .mb-drop-overlay[data-zone="right"] { background: var(--_drop-split-bg); border: 2px solid var(--_drop-border); } /* \u2500\u2500 Iframe pointer-event guard during drag \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ html.mb-dragging iframe, html.mb-dragging webview { pointer-events: none !important; } /* \u2500\u2500 Tab pop-out 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 */ .mb-tab-popout { width: 18px; height: 18px; padding: 0; border: none; background: transparent; color: inherit; cursor: pointer; display: flex; align-items: center; justify-content: center; border-radius: 3px; opacity: 0; transition: opacity 0.15s, background 0.15s; } .mb-tab:hover .mb-tab-popout { opacity: 0.7; } .mb-tab-popout:hover { opacity: 1 !important; background: var(--_button-hover-bg); } .mb-tab-popout svg { width: 12px; height: 12px; } /* Hide pop-out button on main group (never floats), when overlay has 0 or 1 total tabs (nothing to pop out), and when floating is disallowed. */ .mb-group[data-main-group="true"] .mb-tab-popout, .mb-floating-overlay[data-total-tab-count="0"] .mb-tab-popout, .mb-floating-overlay[data-total-tab-count="1"] .mb-tab-popout, .mb-group[data-allow-floating="false"] .mb-tab-popout { display: none !important; } /* \u2500\u2500 Iframe portal layer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ /* MUST NOT create a stacking context \u2014 portal entries' z-indexes must compete with floating overlays in the parent stacking context. position: absolute + no z-index achieves this. */ .mb-iframe-portal-layer { position: absolute; width: 0; height: 0; overflow: visible; pointer-events: none; } .mb-iframe-portal { position: fixed; pointer-events: auto; overflow: hidden; } /* \u2500\u2500 Touch device adjustments \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */ @media (hover: none) { .mb-tab-close { opacity: 0.5; } .mb-tab-popout { opacity: 0.5; } .mb-tab:hover .mb-tab-close, .mb-tab:hover .mb-tab-popout { opacity: 0.7; } } @media (pointer: coarse) { .mb-tab-close, .mb-tab-popout { width: 24px; height: 24px; } .mb-adapt-fork-actions button { width: 26px; height: 26px; } .mb-adapt-minimized-tab-action { width: 28px; height: 28px; } }`;export{PANEL_MANAGER_CSS};