/* ProvSQL Studio: merged ui_kit stylesheets (Provence brand). panel.css (where mode, .wp-* classes) + circuit.css (circuit mode, .cv-* and gate/node/edge classes) coexist via disjoint class prefixes; the only real overlap is the global base block at the top of each file, lifted here into a single block with a body-class override for circuit mode. */ * { box-sizing: border-box; } html, body { margin: 0; background: var(--bg-canvas); color: var(--purple-900); font-family: var(--font-body); font-size: 19px; line-height: 1.55; } body.mode-circuit { font-size: 18px; } /* Circuit-mode sidebar hosts the cv-canvas and the (currently disabled) semiring-evaluation strip. We keep the shared wp-shell grid; the canvas just needs a fixed-ish height so the dot layout is visible without page scrolling. */ body.mode-circuit #sidebar { padding-bottom: 0; } body.mode-circuit #sidebar-body { display: flex; flex-direction: column; gap: 0.8rem; } body.mode-circuit #sidebar-body .cv-canvas { height: 720px; min-height: 480px; border: 1px solid var(--border-soft); border-radius: 6px; } /* Fullscreen: pin .cv-canvas + .cv-toolbar to the viewport. We don't hide the underlying page; the canvas's `inset: 0` + opaque background + high z-index covers it instead, so the toggle is a single CSS class flip with no display:none cascade to manage. The ResizeObserver on #circuit catches the new size and reflows the viewBox automatically. */ body.circuit-fullscreen { overflow: hidden; } body.circuit-fullscreen #sidebar-body .cv-canvas { position: fixed; inset: 0; height: auto; min-height: 0; border: none; border-radius: 0; background: #fff; z-index: 9999; } body.circuit-fullscreen #sidebar-body .cv-toolbar { position: fixed; top: 0.6rem; left: 50%; transform: translateX(-50%); z-index: 10000; margin: 0; background: rgba(255,255,255,0.96); border: 1px solid var(--border-soft); border-radius: 6px; padding: 0.3rem 0.5rem; box-shadow: 0 4px 18px rgba(42, 24, 80, 0.18); } /* Eval strip in fullscreen: pinned top-left, where the DAG layout is usually empty (the root sits centre-top, branches fan out below). Top-centre is the toolbar, top-right is the inspector : the corner is the only spare slot near the controls. */ body.circuit-fullscreen #sidebar-body .cv-eval { position: fixed; top: 0.6rem; left: 0.6rem; z-index: 10000; margin: 0; background: rgba(255,255,255,0.96); border: 1px solid var(--border-soft); border-top: 1px solid var(--border-soft); /* neutralise the dashed top */ border-radius: 6px; padding: 0.45rem 0.7rem; box-shadow: 0 4px 18px rgba(42, 24, 80, 0.18); max-width: min(420px, calc(100vw - 1.2rem)); } body.mode-circuit #sidebar-body .cv-toolbar { display: flex; align-items: center; gap: 0.4rem; margin-bottom: 0.25rem; } /* Status text moved onto the toolbar row : pushed to the right via margin-left:auto, ellipsised so the buttons keep their natural width on narrow viewports. */ body.mode-circuit #sidebar-body .cv-toolbar__info { margin-left: auto; font-family: var(--font-ui); font-size: 0.78rem; color: var(--fg-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; } body.mode-circuit #sidebar-body .cv-eval { display: flex; flex-direction: column; gap: 0.4rem; font-size: 0.85rem; border-top: 1px dashed var(--border-soft); padding-top: 0.6rem; } body.mode-circuit #sidebar-body .cv-eval__hdr { display: flex; align-items: baseline; gap: 0.6rem; } body.mode-circuit #sidebar-body .cv-eval__label { margin: 0; font-family: var(--font-display); font-style: italic; font-weight: 600; font-size: 0.95rem; letter-spacing: 0.02em; color: var(--purple-700); } body.mode-circuit #sidebar-body .cv-eval__form { display: flex; align-items: center; gap: 0.4rem; flex-wrap: wrap; } body.mode-circuit #sidebar-body .cv-eval__action-row { /* Run button on its own row, with the result chip + bound + time trailing it. min-height keeps the strip stable when there's no result yet. */ display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; min-height: 1.6em; } /* Cross-mode: per-row "→ Circuit" button in where-mode results */ .wp-result__cell--actions { width: 1%; white-space: nowrap; } .wp-btn--mini { font-size: 0.72rem; padding: 0.18rem 0.55rem; border-radius: 4px; border: 1px solid var(--purple-500); background: transparent; color: var(--purple-500); cursor: pointer; font-family: var(--font-ui); } .wp-btn--mini:hover { background: var(--purple-500); color: #fff; } /* Clickable UUID/agg_token cells in circuit mode */ .wp-result__cell.is-clickable { cursor: pointer; text-decoration: underline dotted; color: var(--purple-500); } .wp-result__cell.is-clickable:hover { color: var(--terracotta-500); } /* UUID-typed cells render two siblings : an 8-char abbreviation and the full value : so the circuit panel's "Show UUIDs" toggle can flip them via a body-level class without re-rendering the result table. The default is collapsed (matches state.showUuids=false in circuit.js). */ .wp-uuid__short { display: inline; } .wp-uuid__full { display: none; } body.show-uuids .wp-uuid__short { display: none; } body.show-uuids .wp-uuid__full { display: inline; } code, pre, .wp-editor__ta, .cv-editor__code { font-family: var(--font-mono); } em { font-style: italic; } /* ───────── mode switcher (in top nav, both modes) ───────── */ .ps-modeswitch { display: inline-flex; border: 1px solid rgba(255,255,255,0.25); border-radius: 4px; overflow: hidden; font-family: var(--font-ui); font-size: 0.82rem; } .ps-modeswitch__btn { background: transparent; color: rgba(255,255,255,0.8); border: none; padding: 0.35rem 0.85rem; cursor: pointer; text-decoration: none; display: inline-flex; align-items: center; gap: 0.4rem; transition: background 0.15s, color 0.15s; } .ps-modeswitch__btn:hover { background: rgba(255,255,255,0.1); color: #fff; } /* Drive the active highlight from so it lands on the right tab from the very first paint. The body class is set server-side in _serve_shell, while a JS toggle would only fire once app.js parses : that delay is what produced the brief "Where" flash on /circuit. */ body.mode-where .ps-modeswitch__btn[data-mode="where"], body.mode-circuit .ps-modeswitch__btn[data-mode="circuit"] { background: var(--gold-500); color: var(--purple-900); font-weight: 600; } .wp-nav { position: sticky; top: 0; z-index: 10; background: var(--purple-500); border-bottom: 3px solid var(--gold-500); display: flex; align-items: center; justify-content: space-between; padding: 0.7rem 1.5rem; color: #fff; box-shadow: 0 2px 12px rgba(42, 24, 80, 0.18); } .wp-nav__brand { display: flex; align-items: center; gap: 0.85rem; } .wp-nav__logo { width: 38px; height: 38px; } .wp-nav__title { font-family: var(--font-display); font-size: 1.35rem; font-weight: 600; letter-spacing: 0.01em; } .wp-nav__title em { color: var(--gold-500); font-style: italic; font-weight: 600; } .wp-nav__meta { display: flex; align-items: center; gap: 1.25rem; } /* Connection indicator: green dot (live-server hint) + clickable DB name. */ .wp-nav__conn { display: inline-flex; align-items: center; gap: 0.5rem; font-family: var(--font-ui); font-size: 0.78rem; color: rgba(255,255,255,0.9); } /* Connection trigger: a plug icon + status dot, both inside one