From 2c477be110a9918b81fb5526715bd4cc30bb84b5 Mon Sep 17 00:00:00 2001 From: QuinnWan <144975606+somewan820@users.noreply.github.com> Date: Thu, 25 Jun 2026 21:06:04 +0800 Subject: [PATCH] refactor(css): split styles.css by UI surface into 15 files (Round E, #253) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split the 13733-line @layer components block into 15 surface- focused files under apps/desktop/src/renderer/styles/: sidebar / onboarding / module-pages / chat-header / chat-message tool-output / composer / settings / reasoning-panel / markdown-link permission-center / health-center / tool-stream / daily-review theme-glass styles.css is now a ~215-line entry: imports, :root, @theme inline, @layer base, then 15 @import "..." layer(components) statements for the split files. Uses CSS standard @import layer() syntax (not @layer-wrapped @import, which lightningcss/tailwind build chain does not support). Pure file relocation — no rule, selector, property, or comment changed. Verified: - vite build:renderer succeeds, CSS output 432KB - #256 renderer-style-pruning-contract test passes (2/2) - computed style comparison: 3480 selectors, 0 mismatches - all 15 segment files lightningcss-parse VALID Part of issue #253 Round E. --- apps/desktop/src/renderer/styles.css | 13766 +--------------- .../src/renderer/styles/chat-header.css | 784 + .../src/renderer/styles/chat-message.css | 328 + apps/desktop/src/renderer/styles/composer.css | 356 + .../src/renderer/styles/daily-review.css | 529 + .../src/renderer/styles/health-center.css | 281 + .../src/renderer/styles/markdown-link.css | 61 + .../src/renderer/styles/module-pages.css | 2104 +++ .../src/renderer/styles/onboarding.css | 998 ++ .../src/renderer/styles/permission-center.css | 519 + .../src/renderer/styles/reasoning-panel.css | 153 + apps/desktop/src/renderer/styles/settings.css | 4298 +++++ apps/desktop/src/renderer/styles/sidebar.css | 1225 ++ .../src/renderer/styles/theme-glass.css | 131 + .../src/renderer/styles/tool-output.css | 841 + .../src/renderer/styles/tool-stream.css | 1126 ++ 16 files changed, 13764 insertions(+), 13736 deletions(-) create mode 100644 apps/desktop/src/renderer/styles/chat-header.css create mode 100644 apps/desktop/src/renderer/styles/chat-message.css create mode 100644 apps/desktop/src/renderer/styles/composer.css create mode 100644 apps/desktop/src/renderer/styles/daily-review.css create mode 100644 apps/desktop/src/renderer/styles/health-center.css create mode 100644 apps/desktop/src/renderer/styles/markdown-link.css create mode 100644 apps/desktop/src/renderer/styles/module-pages.css create mode 100644 apps/desktop/src/renderer/styles/onboarding.css create mode 100644 apps/desktop/src/renderer/styles/permission-center.css create mode 100644 apps/desktop/src/renderer/styles/reasoning-panel.css create mode 100644 apps/desktop/src/renderer/styles/settings.css create mode 100644 apps/desktop/src/renderer/styles/sidebar.css create mode 100644 apps/desktop/src/renderer/styles/theme-glass.css create mode 100644 apps/desktop/src/renderer/styles/tool-output.css create mode 100644 apps/desktop/src/renderer/styles/tool-stream.css diff --git a/apps/desktop/src/renderer/styles.css b/apps/desktop/src/renderer/styles.css index a24066426d..2efe3ed2ad 100644 --- a/apps/desktop/src/renderer/styles.css +++ b/apps/desktop/src/renderer/styles.css @@ -12,6 +12,22 @@ @import "./maka-tokens.css"; @import "./reference-shell.css"; +@import "./styles/sidebar.css" layer(components); +@import "./styles/onboarding.css" layer(components); +@import "./styles/module-pages.css" layer(components); +@import "./styles/chat-header.css" layer(components); +@import "./styles/chat-message.css" layer(components); +@import "./styles/tool-output.css" layer(components); +@import "./styles/composer.css" layer(components); +@import "./styles/settings.css" layer(components); +@import "./styles/reasoning-panel.css" layer(components); +@import "./styles/markdown-link.css" layer(components); +@import "./styles/permission-center.css" layer(components); +@import "./styles/health-center.css" layer(components); +@import "./styles/tool-stream.css" layer(components); +@import "./styles/daily-review.css" layer(components); +@import "./styles/theme-glass.css" layer(components); + :root { --maka-titlebar-control-safe-left: 94px; /* Shared titlebar baseline = macOS traffic-light vertical center; every icon @@ -194,13740 +210,18 @@ button:active { } } -@layer components { -.appFrame { - height: 100dvh; - padding: 0; - /* PR-CHAT-CHROME-FIX-1 (WAWQAQ msg `4a1b8c13`): the appFrame root - was the LAST place still painting the 172deg "上面灰下面白" - gradient — round-0 only killed the gradient on - `.maka-shell-2col`, and the macOS rule put `shell` to - `transparent`, so the appFrame gradient bled through and - revived the visual WAWQAQ explicitly rejected. Keep this flat: - the shell/backplate is neutral, while `.maka-panel-detail` - paints the white content surface. */ - background: var(--surface-canvas); - color: var(--foreground); - font-size: var(--font-size-base); - box-sizing: border-box; -} - -.app { - height: 100%; -} - -.maka-shell-2col { - display: grid; - grid-template-columns: - var(--maka-session-list-width, var(--w-sessionlist)) - var(--maka-resize-handle-width, 0px) - minmax(0, 1fr); - align-items: stretch; - gap: 0; - overflow: hidden; - /* PR-CHAT-CHROME-FIX-0 (WAWQAQ msg `1e693dee` + `486b5611`): - the shell used to carry a 172deg gradient from `--foreground-3` - to `--background`. The session sidebar is transparent and - showed the gradient through, so users saw "gray top, white - bottom" on the sidebar — distracting, and also produced a - visible seam where the gradient met the flat-white floating - detail panel. Keep the shell flat neutral; no gradient or - divider line. */ - background: var(--surface-canvas); -} - -.maka-panel { - min-width: 0; - min-height: 0; - overflow: hidden; -} - -.maka-floating-panel { - border: 0; - border-radius: 0; - background: var(--background); - box-shadow: none; -} - -.maka-panel-list.maka-floating-panel { - border-right: 0; - background: transparent; -} - -.maka-panel-detail.maka-floating-panel { - /* Right column = the workspace content surface (chat / module / - artifact panes share it). Border and box-shadow already null'd by - the base `.maka-floating-panel` rule above; only the geometry and - layout-mode bits live here. - PR-CHAT-CHROME-FIX-0 (WAWQAQ msg `486b5611`): symmetric `margin: - 4px` so all four sides have a gap and the radius reads as a real - floating-card edge — was `4px 4px 4px 0` before. - PR-CHAT-CHROME-FIX-1 (WAWQAQ msg `4a1b8c13`): "圆盘感觉不对劲, - 很不明显,尤其是下面的看都看不到" — 6px radius + 4px margin on - a same-color surface had no visual handle for the eye. Bumped - radius to 12px (matches reference's surface plate), added a soft - drop-shadow so the curved edge actually reads against the sidebar - translucent backdrop and the bottom corners are visible. The - window's outer rounded chrome on macOS is ~10–12px; matching that - reads as "card inside chrome" rather than "rectangle bleeding off - the bottom". */ - margin: 4px; - border-radius: 12px; - background: var(--background); - box-sizing: border-box; - display: flex; - flex-direction: column; - box-shadow: - 0 1px 3px oklch(from var(--foreground) l c h / 0.06), - 0 8px 24px oklch(from var(--foreground) l c h / 0.08); -} - -.maka-shell-2col[data-sidebar-state="collapsed"] .maka-panel-list.maka-floating-panel { - border-right: 0; -} - -.maka-collapsed-drag-strip { - min-height: 38px; - display: flex; - align-items: center; - gap: 0; - /* 17px correction = 12px half-icon + 5px detail-panel inset. */ - padding: calc(var(--maka-titlebar-control-safe-top) - 17px) 12px 0 var(--maka-titlebar-control-safe-left); - -webkit-app-region: drag; -} - -.maka-collapsed-topbar-actions { - display: inline-flex; - align-items: center; - gap: 2px; - -webkit-app-region: no-drag; -} - -.maka-collapsed-topbar-button { - width: 24px; - height: 24px; - border-radius: 6px; - color: var(--foreground-70); - -webkit-app-region: no-drag; -} - -.maka-collapsed-topbar-button:hover { - color: var(--foreground); - background: var(--foreground-5); -} - -.maka-resize-handle { - position: relative; - width: var(--maka-resize-handle-width, 0px); - box-sizing: content-box; - padding-inline: 4px; - margin-inline: -4px; - outline: none; - cursor: col-resize; - user-select: none; - touch-action: none; - background: transparent; -} - -.maka-shell-2col[data-sidebar-state="collapsed"] .maka-resize-handle { - pointer-events: none; - cursor: default; -} - -.maka-shell-2col[data-sidebar-state="collapsed"] .maka-resize-handle::after { - display: none; -} - -.maka-resize-handle::after { - content: ""; - position: absolute; - left: 4px; - top: 14px; - bottom: 14px; - width: 1px; - border-radius: 999px; - background: transparent; - transition: background var(--duration-quick) var(--ease-out-strong); -} - -.maka-resize-handle:hover::after, -.isResizingColumns .maka-resize-handle::after { - background: var(--foreground-20); -} - -/* Keyboard-focused separator: replace the suppressed native outline with a - visible accent ring on the pseudo-element. Hover styling intentionally - overrides via cascade order. */ -.maka-resize-handle:focus-visible::after { - background: var(--ring); - width: 1px; - left: 4px; -} - -.isResizingColumns { - cursor: col-resize; - user-select: none; -} - -.mainColumn { - --maka-chat-measure: 680px; - min-width: 0; - min-height: 0; - height: 100%; - display: grid; - grid-template-rows: minmax(0, 1fr) auto; - overflow: hidden; - background: transparent; -} - -.mainColumn[data-home-surface="true"] { - grid-template-rows: minmax(0, 1fr) auto; - align-content: stretch; - padding-bottom: 0; -} - -.mainColumn[data-home-surface="true"] .maka-main, -.mainColumn[data-home-surface="true"] .maka-chat-shell, -.mainColumn[data-home-surface="true"] .messages { - flex: 1 1 auto; - min-height: 0; -} - -.mainColumn[data-home-surface="true"] .maka-chatViewport { - height: 100%; -} - -.mainColumn[data-home-surface="true"] .maka-chatContent { - min-height: 100%; - box-sizing: border-box; - padding: clamp(72px, 10vh, 116px) 0 clamp(20px, 4vh, 42px); - display: grid; - align-content: center; -} - -.maka-workspace-top-actions { - -webkit-app-region: no-drag; - position: absolute; - /* PR-FE-BUG-HUNT-9 (kenji audit reminder 9, finding #4): - was bare `z-index: 4`. Tokenized to `--z-panel-action`. - Identical visual stacking, but referenceable + contract-locked. */ - z-index: var(--z-panel-action); - /* Same baseline; 17px correction = 12px half-icon + 5px detail-panel inset. */ - top: calc(var(--maka-titlebar-control-safe-top) - 17px); - right: 24px; - display: inline-flex; - align-items: center; - gap: 6px; - color: var(--foreground-60); -} - -.maka-panel-detail[data-agents-view="skills"] .maka-workspace-top-actions, -.maka-panel-detail[data-agents-view="cron"] .maka-workspace-top-actions, -.maka-panel-detail[data-agents-view="daily-review"] .maka-workspace-top-actions { - display: none; -} - -.maka-workspace-icon-action { - width: 24px; - height: 24px; - border-radius: 6px; - color: var(--foreground-65); -} - -.maka-workspace-icon-action:hover { - color: var(--foreground); - background: var(--foreground-5); -} - -.maka-session-panel { - min-width: 0; - min-height: 0; - height: 100%; - display: grid; - grid-template-rows: auto auto minmax(0, 1fr) auto; - overflow: hidden; - background: transparent; - contain: layout paint style; -} - -.maka-session-panel[data-collapsed="true"] { - grid-template-rows: auto auto minmax(0, 1fr) auto; -} - -/* Search modal: input + local thread-search results, backed by - * `window.maka.search.thread()` through the renderer shell. The dialog - * backdrop is rendered by the shared Dialog primitive (.maka-dialog-backdrop - * + .maka-modal-backdrop tokens), not a search-modal-specific element. */ -.maka-search-modal { - width: min(560px, 92vw); - max-height: 64vh; - display: grid; - grid-template-rows: auto auto minmax(0, 1fr); - padding: 0; - overflow: hidden; - /* Double-bezel inner highlight — high-end-visual-design §4A: premium - modals read as physical hardware via a 1px inner top highlight. The - outer chrome (border + shadow) lives on the Dialog primitive; this - adds the inner sheen. */ - box-shadow: inset 0 1px 0 oklch(1 0 0 / 0.05); -} -.maka-search-modal-header { - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - align-items: center; - padding: 8px 12px 6px; - border-bottom: 1px solid var(--border); -} -.maka-search-modal-title { - margin: 0; - font-size: 12px; - font-weight: 600; - color: var(--foreground); -} -.maka-search-modal-close { - width: 22px; - height: 22px; - border: 0; - background: transparent; - color: var(--foreground-60); - font-size: 16px; - line-height: 1; - border-radius: 6px; -} -.maka-search-modal-close:hover { - background: oklch(from var(--foreground) l c h / 0.04); - color: var(--foreground); -} -.maka-search-modal-close:focus-visible { - outline: 2px solid var(--ring); - outline-offset: 1px; -} -/* PR-UX-POLISH-1 commit 5: real search modal layout. - * - input-row: text input + leading magnifier icon, sits below the - * header band. - * - body: results list OR empty/loading/error/incognito state. Max - * height capped so long result lists scroll inside the modal. - */ -.maka-search-modal-input-row { - width: auto; - min-height: 32px; - margin: 8px 12px; - border-color: var(--border); - background: var(--surface); -} -.maka-search-modal-input-icon { - color: var(--foreground-50); -} -.maka-search-modal-input { - width: 100%; - color: var(--foreground); - font-size: 13px; - line-height: 1.4; -} -.maka-search-modal-input::placeholder { - color: var(--foreground-40); -} -.maka-search-modal-input::-webkit-search-cancel-button { - display: none; -} -.maka-search-modal-clear { - width: 22px; - height: 22px; - border-radius: 6px; - color: var(--foreground-50); -} -.maka-search-modal-clear:hover { - background: oklch(from var(--foreground) l c h / 0.06); - color: var(--foreground); -} -.maka-search-modal-clear:focus-visible { - outline: 2px solid var(--ring); - outline-offset: 1px; -} - -.maka-search-modal-body { - display: block; - border-top: 1px solid var(--border); - padding: 10px 10px 12px; - min-height: 180px; - max-height: calc(70vh - 110px); - overflow-y: auto; - text-align: left; -} -.maka-search-modal-placeholder { - margin: 14px 8px; - font-size: 12px; - color: var(--foreground-50); - text-align: center; -} -/* PR-UX-POLISH-1 commit 5: state cards for incognito / error. - * Distinct tone (info / warning) from regular placeholder. */ -.maka-search-modal-state { - display: grid; - gap: 3px; - padding: 10px 12px; - border-radius: 6px; - background: oklch(from var(--foreground) l c h / 0.03); - margin: 6px 4px; -} -.maka-search-modal-state[data-tone="info"] { - background: oklch(from var(--info, var(--accent)) l c h / 0.06); -} -.maka-search-modal-state[data-tone="warning"] { - background: oklch(from var(--warning, var(--info)) l c h / 0.08); -} -.maka-search-modal-state p { - margin: 0; - font-size: 12px; - color: var(--foreground); -} -.maka-search-modal-state-detail { - font-size: 11px; - color: var(--foreground-60) !important; -} - -.maka-search-modal-result-summary { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; - padding: 0 6px 6px; - font-size: 11px; - color: var(--foreground-50); -} - -.maka-search-modal-results { - list-style: none; - margin: 0; - padding: 0; - display: grid; - gap: 2px; -} -.maka-search-modal-result { - display: grid; - gap: 2px; - width: 100%; - text-align: left; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground); - padding: 6px 10px; - transition: - background var(--duration-base) var(--ease-out-strong), - transform var(--duration-emphasized) var(--ease-out-strong); -} -.maka-search-modal-result:hover:not([disabled]) { - background: oklch(from var(--foreground) l c h / 0.05); - transform: translateX(1px); -} -.maka-search-modal-result[data-active="true"]:not([disabled]) { - background: oklch(from var(--accent) l c h / 0.08); - box-shadow: inset 2px 0 0 var(--accent); -} -.maka-search-modal-result:focus-visible { - outline: none; - background: oklch(from var(--foreground) l c h / 0.04); - box-shadow: 0 0 0 2px oklch(from var(--accent) l c h / 0.18); -} -.maka-search-modal-result[disabled] { - cursor: default; - opacity: 0.7; -} -.maka-search-modal-result-title { - font-size: 12px; - font-weight: 600; - color: var(--foreground); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.maka-search-modal-result-meta { - font-size: 10px; - color: var(--foreground-40); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.maka-search-modal-result-snippet { - font-size: 11px; - color: var(--foreground-60); - line-height: 1.45; - /* Plain text snippet — backend redacts secrets + bounds to - * SNIPPET_MAX_CODE_POINTS. We cap visual lines at 3 so very - * long snippets don't blow up the row height. */ - display: -webkit-box; - -webkit-line-clamp: 3; - -webkit-box-orient: vertical; - overflow: hidden; -} -.maka-search-modal-snippet-hit { - color: var(--foreground); - background: oklch(from var(--accent) l c h / 0.14); - border-radius: 3px; - padding: 0 2px; -} - -.maka-session-panel-header { - display: grid; - gap: 5px; - padding: 6px 6px 7px; - border-bottom: 0; - -webkit-app-region: drag; -} - -.maka-sidebar-drag-strip { - min-height: 34px; - display: flex; - align-items: center; - justify-content: flex-start; - gap: 8px; - box-sizing: border-box; - /* Same baseline; 18px correction = 12px half-icon + 6px sidebar-header pad. */ - padding-top: calc(var(--maka-titlebar-control-safe-top) - 18px); - padding-left: calc(var(--maka-titlebar-control-safe-left) - 10px); - -webkit-app-region: drag; -} - -.maka-sidebar-search-button, -.maka-sidebar-toggle { - -webkit-app-region: no-drag; - width: 24px; - height: 24px; - display: inline-grid; - place-items: center; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground-55); - transition: background var(--duration-base) var(--ease-out-strong), color var(--duration-base) var(--ease-out-strong), box-shadow var(--duration-base) var(--ease-out-strong); -} - -.maka-sidebar-search-button:hover, -.maka-sidebar-toggle:hover { - background: oklch(from var(--foreground) l c h / 0.06); - color: var(--foreground); -} - -.maka-sidebar-search-button:focus-visible, -.maka-sidebar-toggle:focus-visible { - outline: none; - box-shadow: 0 0 0 3px oklch(from var(--accent) l c h / 0.14); -} - -.maka-session-panel[data-collapsed="true"] .maka-session-panel-header { - padding: 6px 8px 8px; -} - -.maka-session-panel[data-collapsed="true"] .maka-sidebar-drag-strip { - display: flex; - justify-content: flex-start; - align-items: center; - gap: 4px; - padding-left: 8px; -} - -.maka-session-panel[data-collapsed="true"] .maka-session-panel-footer { - justify-items: center; - padding-inline: 8px; -} - -.maka-session-panel[data-collapsed="true"] .maka-sidebar-settings-button > span { - display: none; -} - -.maka-session-panel[data-collapsed="true"] .maka-session-list { - border-top: 0; -} - -.maka-session-panel[data-collapsed="true"] .maka-list-stack, -.maka-session-panel[data-collapsed="true"] .maka-empty-state { - display: none !important; -} - -.maka-session-list { - /* PR-SIDEBAR-IA-0 Phase 1 (xuan msg `dc790a54`, kenji msg `0f7bb872`): - * scroll fix. The previous block layout let the inner `.maka-list-stack` - * grow to its natural content height, so the scroll viewport was - * unconstrained — once a workspace had enough sessions, the - * list overflowed the parent and the footer (Settings / Update) got - * pushed out of view. Defining a grid row template here pins the - * title at the top (`auto`) and gives the scroll body the remaining - * space (`minmax(0, 1fr)`), at which point the stack's own - * overlay viewport activates correctly. - * - * Hard gate: 50+ sessions in a narrow window must still let the - * footer stay visible. See the visual-smoke `sidebar-long-sessions` - * scenario. - */ - min-height: 0; - position: relative; - overflow: hidden; - border-top: 0; - display: grid; - grid-template-rows: auto minmax(0, 1fr); - padding-top: 5px; -} - -.maka-session-panel-footer { - display: flex; - align-items: center; - padding: 8px 8px 8px; - border-top: 0; -} - -/* Sidebar footer — Settings affordance only. The earlier "Free Plan" account - widget was removed (WAWQAQ msg cad3dec4: "现在左下角怎么还有 账户部分, - 我们没有账户"). About / version still reachable via Settings → 关于. */ -.maka-sidebar-settings-button { - width: 100%; - min-width: 0; - display: inline-grid; - grid-template-columns: 24px minmax(0, 1fr); - align-items: center; - gap: 8px; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground-65); - padding: 6px 8px; - text-align: left; - font-size: 12px; - font-weight: 500; - transition: background-color var(--duration-base) var(--ease-out-strong), - color var(--duration-base) var(--ease-out-strong); -} - -.maka-sidebar-settings-button:hover { - background: oklch(from var(--foreground) l c h / 0.06); - color: var(--foreground); -} - -.maka-sidebar-settings-button .maka-nav-icon { - width: 18px; - height: 18px; - color: currentColor; -} - -.maka-nav-icon { - width: var(--icon-size); - height: var(--icon-size); - color: var(--foreground-50); - justify-self: center; -} - -/* PR-PARCHMENT-HOME-9 (WAWQAQ msg `781852eb` 2026-06-20): module nav - styles restored, then tightened after task #98 so active rows read - as slim target-layout like nav rows instead of full-width pills. */ -.maka-sidebar-modules { - align-self: start; - align-content: start; - display: grid; - gap: 1px; - padding: 4px 6px; -} - -.maka-nav-row { - width: calc(100% - 12px); - margin-inline: 6px; - min-height: 30px; - display: grid; - grid-template-columns: var(--icon-size) minmax(0, 1fr) auto; - align-items: center; - gap: 8px; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground-80); - -webkit-app-region: no-drag; - padding: 3px 6px; - text-align: left; - /* PR-NAV-NEW-TASK-WEIGHT-0 (2026-06-23): reference-atlas §2 type - scale uses text-sm (14px / 20px line-height) for sidebar nav - rows. Maka was sitting at 13px / 1.25 (≈16.25px line-height), - a half-step smaller that read tighter than the reference. */ - font-size: 14px; - line-height: 1.43; - transition: - background var(--duration-base) var(--ease-out-strong), - color var(--duration-base) var(--ease-out-strong); -} - -.maka-nav-row:hover { - /* PR-GRAY-CARD-LIFT-4 (WAWQAQ msg `d4277aba` round 2): hover bg - was `--foreground-3` (3% mix into background = ~oklch(0.97 0 0)), - which on the new `--surface-canvas` (oklch(0.935 0 0)) was almost - invisible. Switch to alpha overlay so the hover state lifts - consistently regardless of the plate tone behind it. */ - background: oklch(from var(--foreground) l c h / 0.06); - color: var(--foreground); -} - -.maka-nav-row[data-active="true"] { - background: oklch(from var(--foreground) l c h / 0.07); - color: var(--foreground); - font-weight: 600; - box-shadow: none; -} -.maka-nav-row[data-active="true"] .maka-nav-icon { - color: var(--foreground); -} - -.maka-nav-new-task { - /* PR-NAV-NEW-TASK-WEIGHT-0 (2026-06-23): "新任务" should not render - bold by default — the active-state already carries weight: 600, - and a permanently-bold idle entry reads as "this is the active - page" even when nothing is selected. Reference nav rows are all - normal weight at rest; the create-action stays a normal-weight - row with the SquarePen glyph carrying the affordance. */ - color: var(--foreground); -} - -.maka-nav-new-task .maka-nav-icon { - color: var(--foreground-70); -} - -.maka-nav-row[aria-disabled="true"], -.maka-nav-row[data-disabled="true"] { - cursor: not-allowed; - opacity: 0.55; -} -.maka-nav-row[aria-disabled="true"]:hover, -.maka-nav-row[data-disabled="true"]:hover { - background: transparent; -} - -.maka-nav-row span:nth-child(2) { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.maka-nav-row small { - color: var(--foreground-40); - font-size: 11px; - font-variant-numeric: tabular-nums; -} - -.maka-nav-count { - min-width: 16px; - height: 16px; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 999px; - background: oklch(from var(--foreground) l c h / 0.06); - padding: 0 4px; - font-size: 11px; - font-variant-numeric: tabular-nums; -} - -.maka-nav-row[data-active="true"] .maka-nav-count { - background: oklch(from var(--foreground) l c h / 0.08); - color: var(--foreground); -} - -.maka-session-panel[data-collapsed="true"] .maka-sidebar-modules { - padding: 4px 4px; -} - -.maka-session-panel[data-collapsed="true"] .maka-nav-row { - grid-template-columns: 1fr; - padding: 7px 0; - place-items: center; -} - -.maka-session-panel[data-collapsed="true"] .maka-nav-row span:nth-child(2), -.maka-session-panel[data-collapsed="true"] .maka-nav-row small { - display: none; -} - -.maka-list-stack { - min-height: 0; - overflow: hidden; -} - -.maka-list-stackViewport { - height: 100%; - overscroll-behavior: contain; -} - -.maka-list-stackContent { - align-content: start; - display: grid; - gap: 1px; - padding: 2px 8px 6px; -} - -.maka-list-group { - display: grid; - gap: 0; -} - -/* Sidebar group separator — atlas §14.6 + Phase 4A. Each group beyond - the first is preceded by a 1px hairline divider that reads as a - "data section break" rather than a card-like edge. */ -.maka-list-group + .maka-list-group { - margin-top: 10px; - padding-top: 8px; - border-top: 1px solid oklch(from var(--foreground) l c h / 0.05); -} - -/* Group label as "data-tier section header" — tighter typography, - uppercase tracking, slight monospace flavor. Mirrors the - reference's `.sidebar-section-title` (foreground-quaternary at 90%). */ -.maka-list-group-label { - display: flex; - align-items: baseline; - gap: 3px; - padding: 0 6px 3px; - color: var(--foreground-45); - font-size: 9.5px; - font-weight: 600; - letter-spacing: 0.08em; - text-transform: uppercase; - font-variant-numeric: tabular-nums; -} - -/* PR-SIDEBAR-IA-0 Phase 3 (WAWQAQ msgs `14ed98b5`, `761141c5` — - * "list 很丑、很肥很臃肿"; xuan `6b28984e` sign-off + "32-40px 薄行"; - * kenji `2b20c73c`): slim row. - * - * Before Phase 3: each row was a 56-72px card (border + radius + - * shadow) showing title + snippet + meta stacked over three lines. - * That made 9-10 rows visible in a 990px viewport — far too few for - * a sidebar of 60 sessions. - * - * After Phase 3: - * - 30px min-height, single line: status indicator + name + time. - * - Flat list (no border, no radius, no shadow); the surrounding - * `.maka-list-stackContent` provides the row stack, so rows just need - * to read as a list, not a stack of cards. - * - Snippet drops out of the default DOM (lives only in a native - * `title=` tooltip on hover) — see SessionRow render path. - * - Row actions still slide in on hover (current behavior preserved). - * - Active row uses a neutral flat fill instead of the old accent rail. - */ -.maka-list-row { - position: relative; - width: 100%; - min-height: 30px; - display: flex; - align-items: stretch; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground); - overflow: hidden; - transition: - background-color var(--duration-base) var(--ease-out-strong), - transform var(--duration-emphasized) var(--ease-out-strong); - /* Session list stagger — each row fades up with a 40ms cascade per index - via --maka-row-index custom property set by the renderer. Capped at 12 - to avoid a long visible cascade on big sidebars. Reduced-motion below - drops the animation. */ - animation: maka-list-row-enter 240ms var(--ease-out-strong) both; - animation-delay: calc(min(var(--maka-row-index, 0), 11) * 32ms); -} - -@keyframes maka-list-row-enter { - from { opacity: 0; transform: translateY(3px); } - to { opacity: 1; transform: translateY(0); } -} - -@media (prefers-reduced-motion: reduce) { - .maka-list-row { - animation: none; - } -} - -[data-maka-visual-smoke="true"] .maka-list-row { - animation: none; -} - -.maka-list-row:hover { - background: oklch(from var(--foreground) l c h / 0.06); -} - -/* PR-SESSION-ROW-TACTILE-0 (WAWQAQ msg `ed67a267`, skills round - task #116): consistent `:active scale(0.98)` press feedback — - sidebar session rows are the most-clicked surface in the app - and previously had no press signal. Pattern matches - .maka-onboarding-card / .maka-skill-library-row / .maka-prompt-chip - / .maka-artifact-row. Reduced-motion clause below keeps - contracts clean. */ -.maka-list-row:active { - transform: scale(0.98); -} - -@media (prefers-reduced-motion: reduce) { - .maka-list-row:active { - transform: none; - } -} - -/* PR-UI-PIXEL-6 (2026-06-21): selected session row uses a clearly readable - neutral gray (≈#efefef), still flat and accent-free like 参考实现. */ -.maka-list-row[data-active="true"] { - background: oklch(from var(--foreground) l c h / 0.06); -} - -.maka-list-row[data-active="true"] .maka-list-row-name { - color: var(--foreground); - font-weight: 600; -} - -.maka-list-row-main { - flex: 1; - min-width: 0; - display: grid; - /* Phase 3: single-row layout — name takes the flex column, time - * sits in the auto column at the inline-end. Snippet drops out of - * the default DOM entirely (replaced by native title= tooltip on - * the button). */ - grid-template-columns: minmax(0, 1fr) auto; - align-items: center; - gap: 6px; - border: 0; - background: transparent; - color: inherit; - padding: 3px 8px 3px 10px; - text-align: left; -} - -.maka-list-row-actions { - /* PR-SIDEBAR-IA-0 Phase 3 (xuan `2d4526b5` + kenji `e949119d`): - * actions overlay via absolute positioning instead of occupying - * a reserved flex column. In a 280px narrow sidebar a 126px - * reserved area left only ~74px for the title — kenji's math - * showed long Chinese names like "Artifact Pane 验收" would - * truncate too early. Absolute overlay gives the title the - * row's full content width by default; on hover/focus the - * actions paint over the right portion with the gradient bg - * masking the (visually-hidden) time/title text behind them. - * - * Layout shift invariant still holds: actions don't participate - * in row flex layout in either state, so showing/hiding them - * never resizes the title column. - */ - position: absolute; - top: 0; - right: 0; - bottom: 0; - display: flex; - align-items: center; - gap: 2px; - padding: 0 8px; - /* Gradient bg fades from transparent on the left so the title - * underneath blurs smoothly into the action chip cluster on the - * right; opaque from ~24% onwards so the buttons themselves sit - * on a solid hover-tinted background. */ - background: linear-gradient( - to right, - transparent 0%, - var(--foreground-3) 24%, - var(--foreground-3) 100% - ); - opacity: 0; - transform: translateX(8px); - transition: - opacity 140ms ease, - transform 140ms var(--ease-out-strong); - pointer-events: none; -} - -.maka-list-row:hover .maka-list-row-actions, -.maka-list-row:focus-within .maka-list-row-actions { - opacity: 1; - transform: translateX(0); - pointer-events: auto; -} - -/* PR-SIDEBAR-IA-0 Phase 3 P0 fixup v4 (WAWQAQ msg `5dd1c348`): - * when row actions appear, hide the meta (time) and unread dot so - * they don't show through the absolute-positioned actions overlay. - * The gradient bg below was supposed to mask them visually but - * couldn't match every row state (transparent default vs hover bg - * vs accent-tinted selected bg), so the time text leaked through - * the actions cluster on selected rows ("9m ago" overlapping with - * 📌 ✏️ 📦 🗑️). `visibility: hidden` preserves layout (the auto - * grid column still reserves the time slot), so the actions slide - * in without shifting anything around them. */ -.maka-list-row:hover .maka-list-row-meta, -.maka-list-row:hover .maka-list-row-unread, -.maka-list-row:focus-within .maka-list-row-meta, -.maka-list-row:focus-within .maka-list-row-unread { - visibility: hidden; -} - -.maka-list-row[data-active="true"] .maka-list-row-actions { - background: linear-gradient( - to right, - transparent 0%, - var(--foreground-4) 24%, - var(--foreground-4) 100% - ); -} - -.maka-list-row-action { - width: 26px; - height: 26px; - display: grid; - place-items: center; - border: 0; - /* PR-UI-LAYOUT-26: row action toggles (rename / flag / archive) - * radius 6 → 8 to match the new tap-target family + add - * focus-visible ring; missing focus state was a a11y gap. */ - border-radius: 8px; - background: transparent; - color: var(--foreground-60); - transition: background var(--duration-quick) var(--ease-out-strong), color var(--duration-quick) var(--ease-out-strong), box-shadow var(--duration-quick) var(--ease-out-strong); -} - -.maka-list-row-action:hover { - color: var(--foreground); - background: var(--foreground-5); -} - -.maka-list-row-action:focus-visible { - outline: none; - color: var(--foreground); - background: var(--foreground-5); - box-shadow: 0 0 0 3px oklch(from var(--accent) l c h / 0.14); -} - -.maka-list-row-action[data-active="true"] { - color: var(--accent); -} - -.maka-list-row-action-danger:hover { - color: var(--destructive-text); - background: oklch(from var(--destructive) l c h / 0.10); -} - -.maka-list-row-action-danger:focus-visible { - color: var(--destructive-text); - background: oklch(from var(--destructive) l c h / 0.10); - box-shadow: 0 0 0 3px oklch(from var(--destructive) l c h / 0.18); -} - -.maka-list-row-action:disabled, -.maka-list-row-action:disabled:hover, -.maka-list-row-action:disabled:focus-visible { - color: var(--foreground-45); - background: transparent; - box-shadow: none; - cursor: default; -} - -.maka-list-row-action[data-pending="true"] { - color: var(--foreground); - background: var(--foreground-5); - cursor: progress; - opacity: 0.78; -} - -.maka-list-row-rename-input { - width: 100%; - border: 0; - background: transparent; - color: var(--foreground); - font: inherit; - font-size: 14px; - font-weight: 600; - outline: 0; - padding: 1px 0; - border-bottom: 1px solid oklch(from var(--accent) l c h / 0.4); -} - -.maka-list-row-rename-input:focus { - border-bottom-color: var(--accent); -} - -.maka-list-row[data-editing="true"] { - border-color: oklch(from var(--accent) l c h / 0.45); - background: var(--background); -} - -.maka-list-row[data-editing="true"] .maka-list-row-main { - cursor: text; -} - -.maka-list-row-main:focus-visible { - outline: 0; -} - -.maka-list-row:has(.maka-list-row-main:focus-visible) { - border-color: oklch(from var(--accent) l c h / 0.4); - box-shadow: 0 0 0 2px oklch(from var(--accent) l c h / 0.18); -} - -.maka-prompt-suggestions { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); - gap: 10px; - margin: 20px 0 0; - padding: 0; - list-style: none; -} - -.maka-prompt-suggestions li { - display: flex; -} - -.maka-prompt-chip { - flex: 1; - display: grid; - gap: 3px; - /* PR-UI-LAYOUT-5 (@yuejing): tighter chip chrome — was 12px - * radius + var(--background-elevated) bg + 12/14px padding. the reference design - * uses lighter pills; we keep two-line content (label + hint) - * but pull the visual weight down so the grid feels lighter and - * less card-like. Border drops to hairline `--border`, - * background to transparent (inherits warm panel bg) — accent - * tint only appears on hover. */ - border: 1px solid var(--foreground-8); - border-radius: 10px; - background: transparent; - color: var(--foreground); - padding: 10px 12px; - text-align: left; - transition: - border-color 140ms ease, - background 140ms ease, - transform 140ms var(--ease-out-strong); -} - -.maka-prompt-chip:hover { - border-color: oklch(from var(--accent) l c h / 0.32); - background: oklch(from var(--accent) l c h / 0.04); - transform: translateY(-1px); -} - -.maka-prompt-chip:active { - transform: translateY(0) scale(0.99); -} - -.maka-prompt-chip-label { - color: var(--foreground); - font-size: 13px; - font-weight: 600; -} - -.maka-prompt-chip-hint { - color: var(--foreground-60); - font-size: 12px; - line-height: 1.45; - overflow: hidden; - text-overflow: ellipsis; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; -} - -.maka-deep-research-workflow { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 8px; - margin: 0; - padding: 0; - list-style: none; -} - -.maka-deep-research-workflow li { - min-width: 0; - border: 1px solid var(--border); - border-radius: 10px; - background: oklch(from var(--accent) l c h / 0.035); - padding: 10px; -} - -.maka-deep-research-workflow-title { - display: block; - margin: 0 0 4px; - color: var(--foreground); - font-size: 12px; - font-weight: 700; -} - -.maka-deep-research-workflow-body { - display: block; - color: var(--foreground-60); - font-size: 12px; - line-height: 1.45; -} - -.maka-deep-research-report, -.maka-deep-research-scope, -.maka-deep-research-evidence, -.maka-deep-research-progress { - display: grid; - gap: 8px; - padding: 12px 0 0; - border-top: 1px solid var(--border); -} - -.maka-deep-research-report h2, -.maka-deep-research-scope h2, -.maka-deep-research-evidence h2, -.maka-deep-research-progress h2 { - margin: 0; - color: var(--foreground); - font-size: 13px; - line-height: 1.3; -} - -.maka-deep-research-report ul, -.maka-deep-research-scope ul, -.maka-deep-research-evidence ul, -.maka-deep-research-progress ul { - display: grid; - gap: 6px; - margin: 0; - padding: 0; - list-style: none; -} - -.maka-deep-research-report li, -.maka-deep-research-scope li, -.maka-deep-research-evidence li, -.maka-deep-research-progress li { - display: grid; - grid-template-columns: minmax(72px, max-content) minmax(0, 1fr); - gap: 10px; - align-items: baseline; - min-width: 0; -} - -.maka-deep-research-report-title, -.maka-deep-research-scope-label, -.maka-deep-research-evidence-title, -.maka-deep-research-progress-title { - color: var(--foreground); - font-size: 12px; - font-weight: 700; - white-space: nowrap; -} - -.maka-deep-research-report-body, -.maka-deep-research-scope-body, -.maka-deep-research-evidence-body, -.maka-deep-research-progress-body { - min-width: 0; - color: var(--foreground-60); - font-size: 12px; - line-height: 1.45; -} - -/* Onboarding hero — first-run, no real connection configured. - PR-ONBOARDING-HERO-STAGGER-0 (WAWQAQ msg `cdfd68eb`, skills round - task #116): block-level fade-up was a single 200ms ramp — every - child landed at the same moment, reading as a flat reveal. Now - the wrapper just sets layout; each direct child fades up + scales - from 0.96 with a 60ms cascade (Emil Kowalski "agents-with-taste": - start scale at 0.95-ish, not 0; cap entry at <300ms each; - transform+opacity only, GPU-accelerated). The block fade is gone - so we don't double-animate. */ -.maka-onboarding { - width: min(680px, 100%); - margin: auto; - padding: 12px 16px 16px; - display: grid; - gap: 10px; - color: var(--foreground); -} - -.maka-onboarding > * { - opacity: 0; - transform: translateY(8px) scale(0.96); - animation: maka-onboarding-child-enter 280ms var(--ease-out-strong) forwards; -} -.maka-onboarding > *:nth-child(1) { animation-delay: 0ms; } -.maka-onboarding > *:nth-child(2) { animation-delay: 60ms; } -.maka-onboarding > *:nth-child(3) { animation-delay: 120ms; } -.maka-onboarding > *:nth-child(4) { animation-delay: 180ms; } -.maka-onboarding > *:nth-child(n + 5) { animation-delay: 220ms; } - -@keyframes maka-onboarding-child-enter { - to { - opacity: 1; - transform: translateY(0) scale(1); - } -} - -@media (prefers-reduced-motion: reduce) { - .maka-onboarding > * { - animation: none; - opacity: 1; - transform: none; - } -} - -[data-maka-visual-smoke="true"] .maka-onboarding > * { - animation: none; - opacity: 1; - transform: none; -} - -/* PR-AUDIT-CLEANUP-BATCH-2 (WAWQAQ msg `01efbebb`): deleted unused - `@keyframes maka-agents-slide-up` and `@keyframes maka-agents-fade-in`. - Both were referenced only from rules that previous PRs removed - (PR-ONBOARDING-HERO-STAGGER-0 + PR-FRONTEND-AUDIT-CLEANUP-0 F1). - `maka-hero-enter` is the live block-level entrance now. */ - -@keyframes maka-workbench-card-scale-in { - 0% { - opacity: 0; - transform: scale(0.97); - } - 100% { - opacity: 1; - transform: scale(1); - } -} - -/* PR-ONBOARDING-HERO-STAGGER-0: the prior `@media reduced-motion` + - `[data-maka-visual-smoke]` blocks that targeted the now-removed - block-level `.maka-onboarding` fade rule are gone. Per-child - stagger has its own guards above. (`maka-hero-enter` keyframe - itself is still used by `.maka-hero` / `.emptyChat` elsewhere — - self-review corrected an earlier "unused" claim here.) */ - -.maka-onboarding header { - display: grid; - gap: 4px; - justify-items: start; - text-align: left; -} - -.maka-onboarding-ready header { - justify-items: start; - text-align: left; - gap: 4px; -} - -.maka-onboarding-ready .maka-onboarding-eyebrow { - justify-content: flex-start; -} - -.maka-onboarding-eyebrow { - display: none; -} - -.maka-onboarding header h1 { - margin: 0; - max-width: 32ch; - color: var(--foreground); - font-size: 18px; - font-weight: 650; - line-height: 1.25; - letter-spacing: 0; -} - -.maka-onboarding header p { - display: none; -} - -/* ============================================================ - First-run hero (needs_connection) — selection-led redesign. - Scoped via `.maka-firstrun` so the other onboarding hero states - (SetupHero) keep their existing layout. Title leads, the three - setup steps compress to one quiet stepper line, and the provider - list is the clear subject. - ============================================================ */ -.maka-firstrun { - width: min(600px, 100%); - display: flex; - flex-direction: column; - gap: 0; -} - -/* PR-FRONTEND-AUDIT-CLEANUP-0 F1 (WAWQAQ msg `dde696a1`): the earlier - `maka-agents-fade-in 150ms` block + nth-child delay ladder was - completely overridden by the `maka-card-enter 280ms` block below, - plus that block's own delay ladder. The dead rules silently caused - any "polish" attempt on the upper block to look like a no-op. Deleted. */ - -.maka-firstrun-title { - margin: 0; - max-width: none; - font-size: 26px; - font-weight: 680; - line-height: 1.2; - letter-spacing: -0.01em; - color: var(--foreground); -} - -.maka-firstrun-sub { - margin: 8px 0 0; - font-size: 14px; - line-height: 1.5; - color: var(--foreground-55); -} - -/* --- compact stepper (numbered nodes + connectors) --- */ -.maka-firstrun-stepper { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 0; - margin: 22px 0 0; - padding: 0; - list-style: none; -} - -.maka-firstrun-step { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 5px 10px 5px 6px; - border-radius: 999px; -} - -.maka-firstrun-step-dot { - display: inline-grid; - place-items: center; - width: 21px; - height: 21px; - border-radius: 999px; - font-size: 11.5px; - font-weight: 650; - border: 1.5px solid var(--border-strong); - color: var(--foreground-50); -} - -.maka-firstrun-step-label { - font-size: 13px; - color: var(--foreground-50); - white-space: nowrap; -} - -.maka-firstrun-step[data-state="active"] { - background: oklch(from var(--accent) l c h / 0.12); -} -.maka-firstrun-step[data-state="active"] .maka-firstrun-step-dot { - background: var(--accent); - border-color: var(--accent); - color: var(--background); -} -.maka-firstrun-step[data-state="active"] .maka-firstrun-step-label { - color: var(--foreground); - font-weight: 600; -} - -.maka-firstrun-step[data-state="done"] .maka-firstrun-step-dot { - background: var(--foreground-8); - border-color: transparent; - color: var(--foreground-60); -} - -.maka-firstrun-step[data-state="warning"] .maka-firstrun-step-dot { - border-color: var(--warning); - color: var(--warning-text); -} - -.maka-firstrun-step-line { - width: 20px; - height: 1.5px; - flex: 0 0 auto; - margin: 0 2px; - border-radius: 2px; - background: var(--border-strong); -} - -/* --- section label above the provider list --- */ -.maka-firstrun-pick { - display: flex; - align-items: baseline; - gap: 10px; - margin: 30px 0 12px; -} -.maka-firstrun-pick-label { - font-size: 13.5px; - font-weight: 600; - color: var(--foreground); -} -.maka-firstrun-pick-hint { - font-size: 12.5px; - color: var(--foreground-50); -} - -/* --- provider list panel (scrolls vertically as the list grows) --- */ -.maka-firstrun-list { - border: 1px solid var(--border); - border-radius: 12px; - overflow: hidden; - background: var(--background-elevated); -} -.maka-firstrun-list ul { - margin: 0; - padding: 0; - list-style: none; - max-height: 56vh; - overflow-y: auto; -} -.maka-firstrun-list li + li { - border-top: 1px solid var(--border); -} - -/* --- "常用" tag inside a provider row title --- */ -.maka-firstrun-tag { - flex: 0 0 auto; - font-size: 11px; - font-weight: 600; - line-height: 1; - color: var(--accent); - background: oklch(from var(--accent) l c h / 0.12); - padding: 2px 6px; - border-radius: 5px; -} - -.maka-firstrun .maka-onboarding-footer { - margin-top: 22px; -} - -.maka-onboarding-footer { - display: flex; - align-items: center; - justify-content: center; - gap: 8px; -} - -.maka-onboarding-ready .maka-onboarding-footer { - /* In-chat ready_empty branch keeps the composer-led left-anchored - rhythm — same exception as `.maka-onboarding-ready header`. */ - justify-content: flex-start; -} - -.maka-onboarding-setup-steps { - margin: 0; - padding: 0; - list-style: none; - display: grid; - gap: 3px; -} - -.maka-onboarding-setup-steps > li { - min-width: 0; - display: grid; - grid-template-columns: 18px minmax(0, 1fr) max-content; - align-items: center; - gap: 8px; - padding: 4px 8px; - border: 0; - border-radius: 6px; - background: transparent; -} - -.maka-onboarding-setup-steps > li[data-state="active"] { - border-color: oklch(from var(--accent) l c h / 0.34); - background: oklch(from var(--accent) l c h / 0.06); -} - -.maka-onboarding-setup-steps > li[data-state="warning"] { - border-color: oklch(from var(--destructive-text) l c h / 0.30); - background: oklch(from var(--destructive-text) l c h / 0.06); -} - -.maka-onboarding-setup-steps > li[data-state="done"] { - border-color: oklch(from var(--success, var(--accent)) l c h / 0.28); -} - -.maka-onboarding-setup-step-marker { - width: 18px; - height: 18px; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 999px; - background: var(--background-elevated); - color: var(--foreground-70); - font-size: 10px; - font-weight: 600; -} - -.maka-onboarding-setup-steps > li[data-state="active"] .maka-onboarding-setup-step-marker { - background: var(--accent); - color: var(--accent-contrast, var(--background)); -} - -.maka-onboarding-setup-steps > li[data-state="warning"] .maka-onboarding-setup-step-marker { - background: var(--destructive-text); - color: var(--background); -} - -.maka-onboarding-setup-step-copy { - min-width: 0; - display: grid; - gap: 2px; -} - -.maka-onboarding-setup-step-copy strong { - color: var(--foreground); - font-size: 11px; - font-weight: 600; - line-height: 1.2; -} - -.maka-onboarding-setup-step-copy small { - color: var(--foreground-60); - font-size: 10px; - line-height: 1.3; -} - -.maka-onboarding-setup-step-state { - justify-self: end; - padding: 2px 6px; - border-radius: 999px; - background: var(--background-elevated); - color: var(--foreground-60); - font-size: 10px; - font-weight: 600; - white-space: nowrap; -} - -.maka-onboarding-setup-steps > li[data-state="active"] .maka-onboarding-setup-step-state { - background: oklch(from var(--accent) l c h / 0.12); - color: var(--accent); -} - -.maka-onboarding-setup-steps > li[data-state="warning"] .maka-onboarding-setup-step-state { - background: oklch(from var(--destructive-text) l c h / 0.12); - color: var(--destructive-text); -} - -@media (max-width: 620px) { - .maka-onboarding-setup-steps > li { - grid-template-columns: 24px minmax(0, 1fr); - } - - .maka-onboarding-setup-step-state { - grid-column: 2; - justify-self: start; - } -} -/* PR110c: extended OnboardingHero variants. The setup variants - reuse the base `.maka-onboarding` chrome but skip the provider - grid; we add a compact body + a single CTA. - PR-UI-LAYOUT-25: clearer tone treatment on the warm canvas. - - Headline color stays neutral for `setup` (default), shifts - warm/amber for `warning` (info family), shifts destructive - for `blocked` so a stranded user immediately sees gravity. */ -.maka-onboarding-setup header h1 { - font-size: 22px; -} -.maka-onboarding-setup header p { - margin-top: 8px; - color: var(--foreground-70); - line-height: 1.55; -} -.maka-onboarding-setup[data-tone="warning"] header h1 { - color: var(--warning, var(--info-text)); -} -.maka-onboarding-setup[data-tone="destructive"] header h1 { - color: var(--destructive-text); -} - -/* PR-UI-LAYOUT-25: setup hero eyebrow icon picks up the tone for - * each variant so the visual hierarchy reads (icon tone → headline - * tone → body) instead of relying on copy alone. */ -.maka-onboarding-setup[data-tone="warning"] .maka-onboarding-eyebrow { - color: var(--info-text); -} -.maka-onboarding-setup[data-tone="destructive"] .maka-onboarding-eyebrow { - color: var(--destructive-text); -} - -.maka-onboarding-slug { - font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace); - font-size: 13px; - padding: 2px 6px; - /* PR-UI-LAYOUT-25: slug radius 6 → 8 to join the form input - * family (same chrome as inline code badges). */ - border-radius: 8px; - background: var(--foreground-5, oklch(from var(--foreground) l c h / 0.06)); - color: var(--foreground-80, oklch(from var(--foreground) l c h / 0.80)); -} - -/* Quick Chat composer (ready_empty branch). Looks similar to the - main composer but lives inside the hero card so the first-run - surface stays self-contained. */ -.maka-onboarding-ready header h1 { - font-family: Georgia, "Times New Roman", Times, serif; - font-size: 29px; - font-weight: 680; - letter-spacing: 0; - line-height: 1.18; -} -.maka-onboarding-ready header p { - /* Slightly larger subtitle so it carries the meaning without - reading like fine print under the now-heavier h1. */ - margin-top: 6px; - font-size: 14px; - line-height: 1.5; - max-width: 56ch; -} -.maka-onboarding-quickchat { - display: flex; - flex-direction: column; - gap: 0; - margin-top: 24px; - width: min(100%, 620px); - margin-inline: auto; - position: relative; - border-radius: 12px; - border: 1px solid oklch(from var(--foreground) l c h / 0.08); - background: var(--background-elevated, var(--background)); - box-shadow: - 0 18px 42px oklch(from var(--foreground) l c h / 0.07), - 0 1px 0 oklch(from var(--foreground) 1 0 h / 0.72) inset; - transition: - border-color 160ms ease, - box-shadow 160ms ease, - transform 160ms ease; -} - -.maka-onboarding-quickchat-field { - display: grid; - gap: 8px; - padding: 20px 150px 20px 22px; -} - -.maka-onboarding-quickchat:focus-within { - border-color: oklch(from var(--accent) l c h / 0.34); - box-shadow: - 0 20px 52px oklch(from var(--foreground) l c h / 0.10), - 0 0 0 4px oklch(from var(--accent) l c h / 0.08), - 0 1px 0 oklch(from var(--foreground) 1 0 h / 0.75) inset; -} -.maka-onboarding-quickchat-input { - appearance: none; - box-sizing: border-box; - width: 100%; - resize: none; - min-height: 90px; - padding: 0 !important; - border: 0 !important; - border-radius: 0 !important; - background: transparent !important; - color: var(--foreground); - font: inherit; - font-size: 15px; - line-height: 1.5; - box-shadow: none !important; - outline: none; -} -.maka-onboarding-quickchat[data-drag-active="true"] .maka-onboarding-quickchat-input { - border-color: oklch(from var(--accent) l c h / 0.46); - background: oklch(from var(--accent) 0.98 calc(c * 0.20) h / 0.35); - box-shadow: - 0 0 0 1px oklch(from var(--accent) l c h / 0.22), - 0 0 0 4px oklch(from var(--accent) l c h / 0.08); -} -.maka-onboarding-quickchat-input:focus-visible { - /* No per-input outline: the parent `.maka-onboarding-quickchat` - surface owns the focus ring via :focus-within, so the - textarea reads as part of one card instead of having a - second nested focus rectangle. */ - outline: none; - box-shadow: none !important; -} -.maka-onboarding-quickchat-input:disabled { - opacity: 0.6; - cursor: not-allowed; -} -/* PR-UI-15 (@yuejing 2026-05-22): small example hint shown below the - * quickChat textarea so first-run users still see an example of what - * to type after we shortened the placeholder to "Message Maka…". */ -.maka-onboarding-quickchat-example { - margin-top: 0; - margin-bottom: 0; - padding-inline: 0; - color: var(--foreground-50); - font-size: 12px; - line-height: 1.4; - font-style: italic; -} -.maka-onboarding-quickchat-example[data-pending="true"] { - color: var(--accent); - font-style: normal; - font-weight: 650; -} -.maka-onboarding-quickchat-mode { - width: fit-content; - max-width: calc(100% - 190px); - margin: -10px 150px 18px 22px; - border: 1px solid var(--border); - border-radius: 999px; - padding: 4px 8px; - color: var(--accent); - background: color-mix(in srgb, var(--accent) 10%, transparent); - font-size: 0.78rem; - line-height: 1; -} -.maka-onboarding-quickchat-submit { - min-width: auto; -} - -.maka-onboarding-quickchat-submit { - display: inline-flex; - align-items: center; - justify-content: center; - width: 40px; - height: 40px; - min-height: 40px; - min-width: 40px; - padding: 0; - border-radius: 12px; - background: var(--accent); - color: var(--accent-foreground, oklch(0.985 0.003 250)); - box-shadow: - inset 0 1px 0 oklch(1 0 0 / 0.16), - 0 10px 20px oklch(from var(--accent) l c h / 0.22); -} - -.maka-onboarding-quickchat-submit { - position: absolute; - right: 18px; - bottom: 18px; -} - -.maka-onboarding-quickchat-submit:hover:not(:disabled) { - background: color-mix(in srgb, var(--accent) 88%, black); - color: var(--accent-foreground, oklch(0.985 0.003 250)); - transform: translateY(-1px); - box-shadow: - inset 0 1px 0 oklch(1 0 0 / 0.18), - 0 12px 24px oklch(from var(--accent) l c h / 0.26); -} - -.maka-onboarding-quickchat-submit:disabled { - background: color-mix(in srgb, var(--accent) 58%, white); - color: var(--accent-foreground, oklch(0.985 0.003 250)); - opacity: 0.6; - cursor: not-allowed; -} - -.maka-first-run-task-suggestions { - display: grid; - justify-items: center; - gap: 0; - margin-top: 22px; - width: min(760px, 100%); -} - -.maka-first-run-task-suggestions-inner { - width: min(100%, 760px); - display: grid; - gap: 10px; -} - -.maka-first-run-task-suggestions-header { - display: flex; - align-items: center; - justify-content: space-between; - gap: 12px; -} - -.maka-first-run-task-suggestions-header > strong { - font-size: 12px; - color: var(--foreground-50); - font-weight: 600; -} - -.maka-first-run-task-suggestion-list { - display: flex; - flex-wrap: wrap; - justify-content: center; - gap: 10px; -} - -.maka-first-run-task-suggestion-chip { - position: relative; - display: inline-flex; - align-items: center; - flex: 0 0 auto; -} - -.maka-first-run-task-suggestion { - display: inline-flex; - align-items: center; - justify-content: center; - width: auto; - flex: 0 0 auto; - border: 1px solid oklch(from var(--foreground) l c h / 0.08); - border-radius: 999px; - background: oklch(from var(--background-elevated, var(--background)) l c h / 0.78); - color: var(--foreground-75); - height: auto; - min-height: 38px; - padding: 9px 18px; - font-size: 12.5px; - line-height: 1.2; - text-align: center; - box-shadow: 0 1px 2px oklch(from var(--foreground) l c h / 0.04); -} - -.maka-first-run-task-suggestion:hover { - background: var(--background-elevated, var(--background)); - border-color: oklch(from var(--foreground) l c h / 0.16); - color: var(--foreground); -} - -.maka-first-run-task-suggestion:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; -} - -.maka-first-run-task-suggestion:disabled { - opacity: 0.55; - cursor: not-allowed; -} - -/* @kenji PR110c review: loading slot rendered while the first - onboarding snapshot resolves. Empty visual — just blocks the - default EmptyChatHero so the user doesn't see prompt suggestions - flash before the state-routed hero mounts. */ -.maka-onboarding-loading { - min-height: 120px; -} - -.maka-list-row-name { - display: flex; - align-items: center; - /* PR-UI-3: tighten badge gap 8→6 so streaming dot / status icon / - * stale pill / name cluster reads as one unit, not 4 disconnected - * elements. */ - gap: 6px; - overflow: hidden; - /* PR-SIDEBAR-IA-0 Phase 3: 14→13px + 600→500 weight reads as a list - * item (Slack/Linear) instead of a card title. Bold cards felt - * heavy when stacked 60-deep. */ - font-size: 13px; - font-weight: 500; - min-width: 0; -} - -.maka-list-row-name > span { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - min-width: 0; -} - -/* Small pulsing accent dot rendered when a session has live streaming - * delta in flight. Replaces the unread halo for streaming sessions so the - * indicator hierarchy is: streaming > unread > inactive. Respects - * prefers-reduced-motion. */ -.maka-list-row-streaming-dot { - flex-shrink: 0; - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--accent); - box-shadow: 0 0 0 3px oklch(from var(--accent) l c h / 0.15); - animation: maka-list-row-streaming-pulse 1.2s ease-in-out infinite; -} - -@keyframes maka-list-row-streaming-pulse { - 0%, 100% { - box-shadow: 0 0 0 3px oklch(from var(--accent) l c h / 0.18); - transform: scale(1); - } - 50% { - box-shadow: 0 0 0 5px oklch(from var(--accent) l c h / 0.05); - transform: scale(1.1); - } -} - -@media (prefers-reduced-motion: reduce) { - .maka-list-row-streaming-dot { - animation: none; - } -} - -.maka-list-row[data-streaming="true"] .maka-list-row-name > span { - color: var(--foreground); -} - -/* PR-SIDEBAR-IA-0 Phase 3: meta (relative time) now sits inline at - * the row's inline-end instead of stacked below the name. Color + - * size kept muted so it reads as secondary info, not a competing - * label. `margin-top` from the old stacked layout is removed. */ -.maka-list-row-meta { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - /* Phase 4A — tighten meta typography. 11/50 was reading too loud: - the date stamp dominated visual hierarchy when it should sit - under the title. 9/42 mirrors reference's secondary-meta tier. */ - color: var(--foreground-42); - font-size: 9.5px; - font-weight: 500; - font-variant-numeric: tabular-nums; - letter-spacing: 0.01em; - flex-shrink: 0; -} - -/* PR-SIDEBAR-IA-0 Phase 3: `.maka-list-row-text` collapses to a single - * row (name on the inline-start). The previous stack-of-three - * layout (name / preview / meta) is gone — preview drops out of the - * default DOM, meta moves inline to the row's right column. */ -.maka-list-row-text { - min-width: 0; - display: flex; - align-items: center; - min-height: 24px; -} - -/* PR-SIDEBAR-IA-0 Phase 3: `.maka-list-row-preview` is no longer - * rendered in the default DOM — preview text is exposed via the row - * button's native `title=` tooltip on hover so users can still peek - * at the last message without paying the layout cost of a second - * stacked line. This rule intentionally remains DELETED (no fallback - * style). The `sidebar-row-density-contract.test.ts` gate asserts - * the rule is gone so a future "let's bring snippet back" patch - * lands as an explicit design discussion, not a silent regression. - */ - -/* PR-SIDEBAR-IA-0 Phase 3: `.maka-list-row-preview` is no longer - * rendered in the default DOM (see comment above). The - * `[data-active]` variant of that rule is therefore dead and - * removed. */ - -.maka-list-row-unread { - width: 8px; - height: 8px; - border-radius: 999px; - background: var(--accent); - box-shadow: 0 0 0 3px oklch(from var(--accent) l c h / 0.15); -} - -/* Stale session — `backend='fake'` or `llmConnectionSlug` no longer - * resolves. Pairs with the chat-header banner (PR108e) so users can spot - * dead sessions in the sidebar list before clicking in. Visual treatment: - * - * - Row body dimmed via opacity reduction (preserves all underlying tones - * but reads as "secondary"); active state remains fully opaque so the - * currently-selected row never disappears just because it's stale. - * - A small amber pill labelled "已过期" sits next to the session name — - * muted-warning tone, not destructive, because @xuan's send-path silent - * rebind makes these sessions still functional. - */ -.maka-list-row[data-stale="true"] { - opacity: 0.7; -} - -.maka-list-row[data-stale="true"][data-active="true"] { - opacity: 1; -} - -/* PR109b: SessionStatusIcon — small inline icon next to session name - * representing lifecycle status. Tone-based color from the - * design-system token vocabulary; running spins via `animation` - * (capped under reduced-motion + visual-smoke per PR-IR-04). */ -.maka-list-row-status-icon { - display: inline-flex; - align-items: center; - justify-content: center; - flex-shrink: 0; - margin-right: 4px; - width: 14px; - height: 14px; - color: var(--foreground-60); -} -.maka-list-row-status-icon[data-tone="accent"] { - color: var(--accent); -} -.maka-list-row-status-icon[data-tone="warning"] { - color: var(--info-text); -} -.maka-list-row-status-icon[data-tone="destructive"] { - color: var(--destructive); -} -.maka-list-row-status-icon[data-tone="info"] { - color: var(--info-text); -} -.maka-list-row-status-icon[data-tone="success"] { - /* Success uses the brand-deep tone introduced for Settings hero */ - color: var(--brand-deep); -} -.maka-list-row-status-icon[data-tone="muted"] { - color: var(--foreground-40); -} -.maka-list-row-status-icon[data-status="running"] svg { - animation: maka-status-spin 1.2s linear infinite; -} -@keyframes maka-status-spin { - to { transform: rotate(360deg); } -} -@media (prefers-reduced-motion: reduce) { - .maka-list-row-status-icon[data-status="running"] svg { - animation: none; - } -} -[data-maka-visual-smoke="true"] .maka-list-row-status-icon[data-status="running"] svg { - animation: none; -} - -/* Group label as a toggle button (archived group). Matches existing - * maka-list-group-label tone so the toggle doesn't visually fight - * non-collapsible groups. */ -.maka-list-group-toggle { - display: flex; - align-items: center; - gap: 6px; - width: 100%; - padding: 0; - background: transparent; - border: 0; - text-align: left; - font: inherit; - color: inherit; -} -.maka-list-group-toggle:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; - border-radius: 4px; -} -.maka-list-group-count { - font-variant-numeric: tabular-nums; - color: var(--foreground-35); - font-size: 10.5px; - font-weight: 500; -} - -.maka-list-row-stale-pill { - flex-shrink: 0; - /* PR-UI-3: drop margin-left, let parent's gap (6px) handle spacing - * so all badges in .maka-list-row-name share the same rhythm. */ - padding: 1px 6px; - border-radius: 999px; - /* Reuses the chat-header-alert warning tone tokens (--warning + --warning-text) - * for visual consistency with the banner that explains the same state. - * Switched from --info (blue) to --warning (amber) per UI audit §2.9 — - * "已过期" is a degraded-state signal, not informational. */ - background: oklch(from var(--warning, var(--info)) l c h / 0.18); - color: var(--warning-text, var(--info-text)); - font-size: 10px; - font-weight: 600; - letter-spacing: 0.02em; - line-height: 1.4; -} - -.maka-list-row:hover .maka-list-row-name { - color: var(--foreground); -} - -.maka-list-row-main { - transition: transform 160ms var(--ease-out-strong); -} - -.maka-list-row:hover .maka-list-row-main { - transform: none; -} - -.maka-list-row[data-active="true"] .maka-list-row-main { - transform: translateX(0); -} - -.maka-empty-state { - position: absolute; - left: 50%; - top: 46%; - width: min(205px, calc(100% - 40px)); - transform: translate(-50%, -50%); - display: grid; - justify-items: center; - gap: 6px; - text-align: center; - color: var(--foreground-60); -} - -.maka-empty-state-icon { - width: 32px; - height: 32px; - color: var(--foreground-40); - padding: 0; -} - -.maka-empty-state-media .maka-empty-state-icon { - width: 20px; - height: 20px; -} - -.maka-empty-state-title { - color: var(--foreground); - font-size: 13px; - font-weight: 600; -} - -.maka-empty-state-body { - max-width: 30ch; - color: var(--foreground-45); - font-size: 12px; - line-height: 1.4; - text-wrap: pretty; -} - -.maka-session-list .maka-session-empty-state { - width: calc(100% - 42px); - top: 34%; - border: 0 !important; - border-radius: 0 !important; - background: transparent !important; - box-shadow: none !important; - padding: 0 !important; - color: var(--foreground-45); -} - -.maka-session-list .maka-session-empty-state .maka-empty-state-media { - display: none; -} - -.maka-session-list .maka-session-empty-state .maka-empty-state-title { - color: var(--foreground-55); - font-size: 12px; - font-weight: 600; -} - -.maka-session-list .maka-session-empty-state .maka-empty-state-body { - max-width: 22ch; - color: var(--foreground-40); - font-size: 11px; -} - -.maka-empty-state-code { - font-family: var(--font-mono); - font-size: 12px; - padding: 1px 5px; - border-radius: 4px; - background: var(--foreground-5); - color: var(--foreground-70); -} - -.maka-empty-state-actions { - margin-top: 4px; - display: grid; - gap: 4px; - justify-items: center; -} - -.maka-empty-state-cta { - min-width: 88px; -} - -.maka-plan-panel { - min-height: 0; - overflow: auto; - display: grid; - align-content: start; - padding: 0; -} - -.maka-module-main .maka-plan-panel { - padding: 0; - width: 100%; -} - -/* PR-UI-ALIGN-2 (2026-06-21): the page content is NOT a nested card — it - fills the one floating content-area card directly, exactly like 参考实现's - 定时任务 page (header → banner → tabs → grid sit straight on the white card). - Removed the inner border/radius/shadow/1080-center so there's no card-in-card, - and opened up the padding so the page breathes like the reference. */ -/* Phase 2 — atlas-driven rewrite (notes/reference-atlas.md §10). Plan/Reminder - page card uses the universal recipe: 1px hairline border + 6px radius + - single 4% lift + 1px inner top highlight. Tight 4-6px internal gaps - (`--card-gap`) replace the old 14-18px loose stacking. */ -.maka-plan-shell { - width: min(100%, 900px); - margin-inline: auto; - display: grid; - /* Atlas §14.6 quick-win: section gap tightens 14 -> 8 (reference uses - `--agents-content-area-gap: 4px`; 8 keeps long-page readability while - pulling toward the dense reference cadence). */ - gap: 8px; - padding: 18px 20px 20px; - background: var(--card-bg); - border: 1px solid var(--card-border-color); - border-radius: var(--card-radius); - box-shadow: - var(--card-shadow), - var(--card-highlight); - animation: maka-page-shell-enter 320ms var(--ease-out-strong) both; -} - -.maka-plan-hero { - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 12px; -} - -.maka-plan-heading { - display: grid; - gap: 4px; - max-width: 560px; -} - -.maka-plan-eyebrow { - margin: 0; - color: var(--foreground-40); - font-size: 10px; - font-weight: 600; - letter-spacing: 0; -} - -.maka-plan-heading h2 { - margin: 0; - color: var(--foreground); - font-size: 30px; - font-weight: 600; - letter-spacing: -0.012em; - line-height: 1.15; -} - -.maka-plan-heading p:last-child { - margin: 0; - color: var(--foreground-60); - font-size: 13.5px; - line-height: 1.45; -} - -.maka-plan-top-actions { - display: flex; - align-items: center; - justify-content: flex-end; - gap: 6px; - flex-wrap: wrap; -} - -.maka-plan-create-through { - gap: 4px; - background: var(--foreground-3); - color: var(--foreground); - border-color: transparent; - border-radius: 999px; - font-size: 11px; - font-weight: 600; -} - -/* PR-UI-PIXEL-3: signature off-black CTA, matching the reference's restrained - primary command treatment without using the app accent. Pure #000 is banned - per design-taste rules — use oklch off-black (charcoal) for premium feel. */ -.maka-plan-new-task-button { - gap: 4px; - border-color: oklch(0.20 0 0); - border-radius: 999px; - background: oklch(0.18 0 0); - box-shadow: - inset 0 1px 0 oklch(1 0 0 / 0.15), - 0 1px 2px oklch(0 0 0 / 0.10); - color: oklch(1 0 0); - font-size: 11px; - font-weight: 600; - transition: - background-color var(--duration-base) var(--ease-out-strong), - border-color var(--duration-base) var(--ease-out-strong), - transform var(--duration-emphasized) var(--ease-out-strong), - box-shadow 200ms var(--ease-out-strong); -} - -.maka-plan-new-task-button:hover { - border-color: oklch(0.28 0 0); - background: oklch(0.26 0 0); - color: oklch(1 0 0); - transform: translateY(-0.5px); - box-shadow: - inset 0 1px 0 oklch(1 0 0 / 0.20), - 0 4px 14px -8px oklch(0 0 0 / 0.32); -} - -.maka-plan-new-task-button:active:not(:disabled) { - transform: scale(0.97); -} - -.maka-plan-refresh-button { - color: var(--foreground-60); -} - -.maka-plan-template-strip { - display: flex; - flex-direction: column; - gap: 4px; -} - -.maka-plan-template-strip[data-layout="cards"] { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 10px; -} - -.maka-plan-template-card { - display: grid; - grid-template-columns: max-content minmax(0, 1fr) max-content; - gap: 10px; - min-width: 0; - height: auto; - min-height: 0; - justify-content: stretch; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground); - padding: 6px 8px; - text-align: left; -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-card { - min-height: 134px; - grid-template-columns: minmax(0, 1fr) max-content; - grid-template-rows: auto minmax(0, 1fr) auto; - align-items: start; - gap: 12px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - box-shadow: none; - padding: 12px; -} - -.maka-plan-template-card:hover { - border-color: transparent; - background: oklch(from var(--foreground) l c h / 0.04); -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-card:hover { - border-color: var(--border); - background: var(--background); - box-shadow: 0 4px 14px -12px oklch(from var(--foreground) l c h / 0.22); -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-card::after { - content: "•••"; - grid-column: 2; - grid-row: 1; - justify-self: end; - color: var(--foreground-45); - font-size: 14px; - letter-spacing: 1px; - line-height: 20px; -} - -.maka-plan-template-icon { - display: inline-flex; - width: 18px; - height: 18px; - align-items: center; - justify-content: center; - border-radius: 4px; - background: var(--foreground-3); - color: var(--foreground-70); -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-icon { - width: 36px; - height: 20px; - border-radius: 999px; - background: oklch(from var(--foreground) l c h / 0.16); - color: transparent; -} - -.maka-plan-template-switch { - position: relative; - display: inline-flex; - width: 36px; - height: 20px; - border-radius: 999px; - background: oklch(from var(--foreground) l c h / 0.16); -} - -.maka-plan-template-switch::after { - content: ""; - position: absolute; - top: 2px; - left: 2px; - width: 16px; - height: 16px; - border-radius: 999px; - background: var(--background); - box-shadow: 0 1px 2px oklch(from var(--foreground) l c h / 0.22); -} - -.maka-plan-template-main { - display: grid; - min-width: 0; - gap: 2px; -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-main { - grid-column: 1 / -1; - gap: 7px; -} - -.maka-plan-template-title { - color: var(--foreground); - font-size: 12px; - font-weight: 600; - line-height: 1.2; -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-title { - font-size: 15px; - line-height: 1.3; -} - -.maka-plan-template-note { - color: var(--foreground-55); - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 10px; - font-weight: 500; - line-height: 1.35; -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-note { - color: var(--foreground-60); - white-space: normal; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - font-size: 12px; - line-height: 1.5; -} - -.maka-plan-template-schedule { - display: inline-flex; - align-self: start; - align-items: center; - gap: 4px; - border: 1px solid var(--border); - border-radius: 999px; - background: var(--foreground-2); - color: var(--foreground-55); - font-size: 10px; - font-weight: 600; - line-height: 1; - padding: 3px 6px; - white-space: nowrap; -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-schedule { - grid-column: 1 / -1; - width: 100%; - margin-top: auto; - border: 0; - border-top: 1px dashed var(--border); - border-radius: 0; - background: transparent; - color: var(--foreground-60); - padding: 11px 0 0; -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-schedule::before { - content: ""; -} - -.maka-plan-template-strip[data-layout="cards"] .maka-plan-template-schedule > svg { - width: 13px; - height: 13px; -} - -/* PR-UI-PIXEL-2: reference's info strip is a calm, roomy blue banner - (≈#e6f7ff bg / #b0e3ff border, r8, 12×16 padding) — not a tight chip. */ -.maka-plan-system-alert { - display: flex; - min-height: 48px; - align-items: center; - justify-content: space-between; - gap: 12px; - border-color: oklch(0.90 0.04 240); - border-radius: 7px; - background: oklch(0.965 0.035 235); - color: oklch(0.50 0.13 245); - padding: 12px 16px; -} - -.maka-plan-system-alert [class*="lucide"] { - color: oklch(0.42 0.095 245); -} - -.maka-plan-system-alert-main, -.maka-plan-system-alert-switch { - display: inline-flex; - min-width: 0; - align-items: center; - gap: 6px; -} - -.maka-plan-system-alert-main div { - display: flex; - align-items: center; - gap: 6px; -} - -.maka-plan-system-alert-main [data-slot="alert-description"] { - display: none; -} - -.maka-plan-system-alert-main > [class*="lucide"] { - flex: 0 0 auto; -} - -.maka-plan-system-alert-switch { - flex: 0 0 auto; - color: oklch(0.38 0.075 245); - font-size: 11px; - font-weight: 600; - white-space: nowrap; -} - -.dark .maka-plan-system-alert { - border-color: oklch(0.56 0.08 245 / 0.44); - background: oklch(0.25 0.04 245 / 0.52); - color: oklch(0.84 0.07 245); -} - -.dark .maka-plan-system-alert [class*="lucide"], -.dark .maka-plan-system-alert-switch { - color: oklch(0.84 0.07 245); -} - -.maka-capability-audit-strip { - display: flex; - align-items: center; - justify-content: space-between; - gap: 14px; - border: 1px solid var(--foreground-8); - border-radius: 6px; - background: - linear-gradient(90deg, oklch(from var(--accent) l c h / 0.06), transparent 42%), - var(--background); - padding: 12px 14px; -} - -.maka-capability-audit-copy { - display: grid; - min-width: 0; - gap: 3px; -} - -.maka-capability-audit-kicker { - color: var(--foreground-50); - font-size: 10px; - font-weight: 700; - letter-spacing: 0; - text-transform: uppercase; -} - -.maka-capability-audit-copy strong { - color: var(--foreground); - font-size: 14px; - font-weight: 700; - line-height: 1.25; -} - -.maka-capability-audit-copy small { - color: var(--foreground-60); - font-size: 11px; - font-weight: 600; - line-height: 1.45; -} - -.maka-capability-audit-metrics { - display: grid; - grid-template-columns: repeat(3, minmax(92px, 1fr)); - gap: 6px; - min-width: min(420px, 48%); - margin: 0; -} - -.maka-capability-audit-metrics div { - display: grid; - gap: 2px; - min-width: 0; - border-left: 1px solid var(--foreground-8); - padding-left: 10px; -} - -.maka-capability-audit-metrics dt { - color: var(--foreground-45); - font-size: 9px; - font-weight: 700; - letter-spacing: 0; - text-transform: uppercase; -} - -.maka-capability-audit-metrics dd { - margin: 0; - color: var(--foreground-80); - font-size: 11px; - font-weight: 700; - line-height: 1.3; - overflow-wrap: anywhere; -} - -.maka-plan-tabs { - display: grid; - gap: 8px; -} - -.maka-plan-tabs-bar { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; -} - -.maka-plan-tabs-list { - gap: 16px; - border-radius: 0; - background: transparent; - padding: 0; -} - -.maka-plan-tab { - position: relative; - gap: 6px; - min-width: 0; - height: 28px; - padding: 0; - border-radius: 0; - background: transparent; - color: var(--foreground-45); - font-size: 13px; - font-weight: 600; -} - -.maka-plan-tab[data-state="active"] { - color: var(--foreground); - background: transparent; - box-shadow: none; -} - -/* PR-UI-PIXEL-2 (2026-06-21): reference keeps the active-tab under-bar - NEUTRAL (the text/foreground color), not a brand tint — structural chrome - stays calm, brand color is reserved as a garnish (study §4 rule 2/3). */ -.maka-plan-tab[data-state="active"]::after { - content: ""; - position: absolute; - left: 0; - right: 0; - bottom: 0; - height: 2px; - border-radius: 999px; - background: var(--foreground); -} - -.maka-plan-tab span { - color: var(--foreground-40); - font-size: 10px; - font-variant-numeric: tabular-nums; -} - -.maka-plan-toolbar { - display: flex; - flex-wrap: wrap; - align-items: end; - justify-content: flex-end; - gap: 8px; -} - -.maka-plan-toolbar-compact { - display: flex; -} - -.maka-plan-tab-panel { - display: grid; - gap: 10px; -} - -/* PR-UI-PIXEL-1: reference lays scheduled tasks out in a responsive card - grid (~2-up), not a single vertical column of rows. */ -.maka-plan-card-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; -} - -.maka-plan-card-grid > article { - animation: maka-workbench-card-scale-in 350ms var(--ease-out-strong) both; -} - -.maka-plan-card-grid > article:nth-child(n + 1) { animation-delay: 60ms; } -.maka-plan-card-grid > article:nth-child(n + 4) { animation-delay: 120ms; } -.maka-plan-card-grid > article:nth-child(n + 8) { animation-delay: 180ms; } - -@media (prefers-reduced-motion: reduce) { - .maka-plan-card-grid > article { - animation: none; - } -} - -.maka-plan-form, -.maka-plan-run-row { - display: grid; - gap: 10px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - padding: 16px; -} - -/* PR-UI-PIXEL-1 (2026-06-21): scheduled-task cards rebuilt to match the - reference's roomy vertical card (study §3.3): switch top-left + ⋯ top-right, - title, 2-line note, dashed divider, clock pill footer — laid out in a - responsive 2-up grid instead of the previous compact horizontal rows. */ -.maka-plan-card { - display: flex; - flex-direction: column; - gap: 10px; - position: relative; - border: 1px solid var(--foreground-8); - border-radius: 6px; - background: var(--background); - padding: 14px 16px 13px; - min-height: 148px; - transition: - border-color var(--duration-base) var(--ease-out-strong), - box-shadow var(--duration-base) var(--ease-out-strong), - transform var(--duration-base) var(--ease-out-strong); -} - -.maka-plan-card:hover { - border-color: oklch(from var(--foreground) l c h / 0.13); - box-shadow: 0 4px 12px -8px oklch(from var(--foreground) l c h / 0.08); - transform: translateY(-1px); -} - -.maka-plan-card[data-status="completed"] { - opacity: 0.62; -} - -.maka-plan-card-chrome, -.maka-plan-card-footer, -.maka-plan-form-header, -.maka-plan-form-footer { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; -} - -.maka-plan-card-title-row { - display: flex; - align-items: center; - gap: 8px; - min-width: 0; -} - -.maka-plan-card-title-row > span { - display: none; -} - -/* PR-UI-PIXEL-1: switch + ⋯ menu now sit persistently at the top of the - card (reference shows the on/off switch at all times), spread to opposite - corners by the shared `justify-content: space-between`. */ -.maka-plan-card-chrome { - order: 1; - gap: 4px; - opacity: 1; - pointer-events: auto; -} - -.maka-plan-card-menu-trigger { - display: inline-flex; - width: 22px; - height: 22px; - align-items: center; - justify-content: center; - border: 0; - border-radius: 4px; - background: transparent; - color: var(--foreground-60); -} - -.maka-plan-card-menu-trigger:hover { - background: oklch(from var(--foreground) l c h / 0.06); - color: var(--foreground); -} - -.maka-plan-card-menu-trigger:disabled { - cursor: default; - opacity: 0.45; -} - -.maka-plan-card-menu { - min-width: 132px; -} - -.maka-plan-dialog { - max-height: min(86dvh, 760px); -} - -.maka-plan-form { - border: 0; - border-radius: 0; - background: var(--background); - padding: 12px; - overflow: auto; -} - -.maka-plan-form-header { - align-items: flex-start; - padding-bottom: 2px; -} - -.maka-plan-form-title { - margin: 0; - color: var(--foreground); - font-size: 14px; - font-weight: 600; - line-height: 1.2; -} - -.maka-plan-form-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 6px; -} - -.maka-plan-field { - display: grid; - gap: 3px; - color: var(--foreground-60); - font-size: 10px; - font-weight: 600; -} - -.maka-plan-field input, -.maka-plan-field textarea { - width: 100%; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - color: var(--foreground); - font: inherit; - font-size: 12px; - font-weight: 500; - padding: 7px 8px; - outline: none; - resize: vertical; -} - -.maka-plan-field input:focus, -.maka-plan-field textarea:focus { - border-color: oklch(from var(--accent) l c h / 0.55); - box-shadow: 0 0 0 2px oklch(from var(--accent) l c h / 0.12); -} - -.maka-plan-presets { - display: grid; - grid-template-columns: repeat(4, minmax(0, 1fr)); - gap: 4px; -} - -.maka-plan-preset { - min-width: 0; - font-size: 10px; - font-weight: 600; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.maka-plan-preset:hover { - background: var(--foreground-2); -} - -.maka-plan-validation { - margin: 0; - border: 1px solid oklch(from var(--warning) l c h / 0.34); - border-radius: 5px; - background: oklch(from var(--warning) l c h / 0.08); - color: var(--foreground-80); - font-size: 11px; - font-weight: 600; - line-height: 1.4; - padding: 4px 8px; -} - -.maka-plan-delivery-grid { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); - gap: 6px; -} - -.maka-plan-delivery-help { - margin: 0; - color: var(--foreground-60); - font-size: 10px; - font-weight: 500; - line-height: 1.4; -} - -.maka-plan-submit { - justify-content: center; -} - -.maka-plan-search, -.maka-plan-compact-select { - display: grid; - gap: 4px; - color: var(--foreground-60); - font-size: 11px; - font-weight: 600; -} - -.maka-plan-search { - width: min(200px, 28vw); -} - -.maka-plan-compact-select { - width: 124px; -} - -.maka-plan-sort-select { - width: 168px; -} - -/* PR-UI-ALIGN-1 (2026-06-21): the reference's task toolbar is a single bare - sort control on the right of the tabs — not a form. Hide the stacked field - labels (排序 / 搜索计划提醒 / 状态) so the controls read as light inline chips, - and let the bar sit on the tabs row instead of wrapping to its own block. */ -.maka-plan-toolbar label > span:first-child { - display: none; -} - -.maka-panel-detail[data-agents-view="cron"] .maka-plan-tabs-bar .maka-plan-search, -.maka-panel-detail[data-agents-view="cron"] .maka-plan-tabs-bar .maka-plan-compact-select:not(.maka-plan-sort-select) { - display: none; -} - -.maka-plan-compact-select { - gap: 0; -} -.maka-plan-tabs-bar { - flex-wrap: wrap; - row-gap: 10px; -} - -.maka-plan-search input { - width: 100%; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - color: var(--foreground); - font: inherit; - font-size: 12px; - font-weight: 500; - outline: none; - padding: 7px 8px; -} - -.maka-plan-search input:focus { - border-color: oklch(from var(--accent) l c h / 0.55); - box-shadow: 0 0 0 2px oklch(from var(--accent) l c h / 0.12); -} - -/* PR round-AB-shared-select (yuejing 2026-06-25): the Plan Reminder - delivery select and the 5 Settings selects used to ship two slightly - different wrappers — different option shapes, different selected - trigger renderers, different CSS recipes. They are now one - `SettingsSelect` primitive in `@maka/ui` (see kenji styles inventory - `notes/maka-styles-css-inventory-2026-06-25-task-128.md`). These - `.settingsSelect*` rules pin the unified chrome. */ -.settingsSelectTrigger { - min-width: 0; - height: 34px; - justify-content: space-between; - border-radius: 6px; - font-size: 12px; - font-weight: 600; -} - -.settingsSelectPopup { - min-width: var(--anchor-width); -} - -/* The icon slot lines up with the text via inline-flex; the icon tile - is a fixed 16x16 to absorb Iconify's size: '100%' rendering of the - simple-icons svg without pushing option row height around. */ -.settingsSelectOption { - display: inline-flex; - align-items: center; - gap: 8px; - min-width: 0; -} - -.settingsSelectOptionIcon { - flex: 0 0 auto; - width: 16px; - height: 16px; - display: inline-flex; - align-items: center; - justify-content: center; -} - -.maka-plan-search-summary { - display: flex; - min-width: 0; - align-items: center; - justify-content: space-between; - gap: 6px; - color: var(--foreground-50); - font-size: 10px; - font-weight: 600; -} - -.maka-plan-empty { - position: static; - width: auto; - transform: none; - padding: 16px 10px; -} - -.maka-plan-empty-wrap[data-mode="starter-cards"] { - display: grid; - gap: 12px; -} - -.maka-plan-card-main { - order: 2; - display: grid; - gap: 6px; - min-width: 0; -} - -.maka-plan-card-title { - margin: 0; - min-width: 0; - color: var(--foreground); - font-size: 15.5px; - font-weight: 600; - line-height: 1.3; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.maka-plan-card-run { - display: none; -} - -/* PR-UI-PIXEL-1: footer drops to the card bottom behind a dashed divider - (reference §3.3), holding the clock schedule pill left-aligned. */ -.maka-plan-card-footer { - order: 3; - margin-top: auto; - padding-top: 11px; - border-top: 1px dashed var(--border); - justify-content: flex-start; - flex-wrap: nowrap; - gap: 4px; - white-space: nowrap; -} - -/* PR-UI-PIXEL-1: schedule pill gets a filled tint (reference uses - fill-tertiary, not an outline) so it reads as a metadata chip. */ -.maka-plan-card-chip { - display: inline-flex; - max-width: 100%; - min-height: 21px; - align-items: center; - gap: 5px; - border: 0; - border-radius: 999px; - background: oklch(from var(--foreground) l c h / 0.05); - color: var(--foreground-60); - font-size: 10.5px; - font-weight: 600; - line-height: 1; - padding: 3px 8px; -} - -.maka-plan-card-chip + .maka-plan-card-chip { - display: none; -} - -/* PR-PLAN-NEXT-RUN-COUNTDOWN-0: small accent pill next to the - absolute next-run time so user sees both wall-clock and - distance-from-now in one glance. */ -.maka-plan-card-countdown { - display: inline-block; - margin-left: 4px; - padding: 0 5px; - border-radius: 999px; - background: oklch(from var(--accent) l c h / 0.10); - color: var(--accent); - font-weight: 600; - font-size: 9px; - letter-spacing: 0; -} - -/* PR-UI-PIXEL-1: note clamps to two lines (reference cards show a 2-line - description), replacing the single-line ellipsis used by the old row layout. */ -.maka-plan-card-note { - color: var(--foreground-60); - font-size: 12.5px; - line-height: 1.5; - margin: 0; - padding: 0; - overflow: hidden; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; -} - -.maka-plan-run-list { - display: grid; - gap: 4px; -} - -.maka-plan-run-row { - grid-template-columns: max-content minmax(0, 1fr) max-content; - align-items: center; - gap: 8px; - padding: 6px 10px; -} - -.maka-plan-run-status { - border-radius: 999px; - background: var(--foreground-3); - color: var(--foreground-60); - font-size: 10px; - font-weight: 600; - padding: 2px 6px; -} - -.maka-plan-run-status[data-status="triggered"] { - background: oklch(from var(--success) l c h / 0.10); - color: var(--success-text); -} - -.maka-plan-run-status[data-status="blocked"], -.maka-plan-run-status[data-status="failed"] { - background: oklch(from var(--warning) l c h / 0.10); - color: var(--warning-text); -} - -.maka-plan-run-main { - display: grid; - gap: 1px; - min-width: 0; -} - -.maka-plan-run-main strong { - color: var(--foreground); - font-size: 12px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.maka-plan-run-main span, -.maka-plan-run-row time { - color: var(--foreground-50); - font-size: 10px; - line-height: 1.35; -} - -.maka-plan-run-row time { - font-variant-numeric: tabular-nums; - white-space: nowrap; -} - -.maka-plan-runs-empty { - border-style: dashed; - background: transparent; - box-shadow: none; -} - -@media (max-width: 1100px) { - .maka-plan-hero, - .maka-plan-tabs-bar { - display: grid; - } - - .maka-plan-system-alert { - display: grid; - } - - .maka-capability-audit-strip { - display: grid; - } - - .maka-capability-audit-metrics { - grid-template-columns: minmax(0, 1fr); - min-width: 0; - } - - .maka-plan-template-strip { - grid-template-columns: minmax(0, 1fr); - } - - .maka-plan-template-card { - grid-template-columns: max-content minmax(0, 1fr); - } - - .maka-plan-template-schedule { - grid-column: 2; - justify-self: start; - } - - .maka-plan-top-actions { - justify-content: flex-start; - } - - .maka-plan-card-grid, - .maka-plan-form-grid, - .maka-plan-delivery-grid { - grid-template-columns: minmax(0, 1fr); - } - - .maka-plan-toolbar, - .maka-plan-toolbar-compact { - justify-content: flex-start; - } - - .maka-plan-search, - .maka-plan-compact-select, - .maka-plan-sort-select { - width: min(100%, 260px); - } - - .maka-plan-run-row { - grid-template-columns: minmax(0, 1fr); - } -} - -.detailPane { - min-width: 0; - min-height: 0; - overflow: hidden; -} - -/* PR-UI-ALIGN-2: the module pages (技能 / 定时任务 / 每日回顾) breathe with a - single generous padding layer on the content-area card — ~24px like 参考实现, - not the old cramped 12px. Inner wrappers (plan-shell etc.) no longer re-pad. */ -.maka-module-main { - display: grid; - grid-template-rows: auto minmax(0, 1fr); - gap: 18px; - padding: 64px 26px 26px; - overflow: auto; -} - -.maka-module-main[data-module="daily-review"] { - grid-template-rows: auto auto; - align-content: start; -} - -.maka-module-main-header { - width: min(100%, 900px); - margin-inline: auto; - display: flex; - align-items: flex-start; - justify-content: space-between; - gap: 12px; - padding-bottom: 0; - border-bottom: 0; -} - -/* Module page titles use reference layout's --text-3xl display scale (30px) — - atlas §2 + §9. Negative letter-spacing gives the heading the cinematic - weight reference layout uses for page-level headings. */ -.maka-module-main-header h2 { - margin: 0; - color: var(--foreground); - font-size: 30px; - font-weight: 600; - letter-spacing: -0.012em; - line-height: 1.15; -} - -.maka-module-main-header p { - margin: 4px 0 0; - color: var(--foreground-60); - font-size: 13.5px; - line-height: 1.45; -} - -.maka-module-main-actions { - display: inline-flex; - align-items: center; - justify-content: flex-end; - gap: 8px; - flex-wrap: wrap; -} - -.maka-panel-detail[data-agents-view="skills"] .maka-module-main-actions > .maka-button-ghost:not(.maka-skill-add-button) { - display: none; -} - -.maka-skill-search { - width: min(280px, 30vw); - height: 32px; - display: inline-flex; - align-items: center; - gap: 7px; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--background); - color: var(--foreground-50); - padding: 0 10px; -} - -.maka-skill-search input { - /* PR-SKILL-SEARCH-DOUBLE-BOX-0 (WAWQAQ msg `703f2167` + screenshot - `d6218b43`): the `` primitive carries Tailwind utilities - `rounded-md border border-input bg-background shadow-sm` from - `@maka/ui inputClasses`. The per-page overrides killed - `border` + `background`, but `border-radius`, `box-shadow`, and - `min-height` (via `min-h-9` = 36px) leaked through and painted - a second visible rounded card INSIDE the outer - `.maka-skill-search` label — reading as two stacked search - bars. The fix zeroes every visual property the primitive can - paint, so the inner `` reads as a bare text field and - the outer label is the only box. */ - min-width: 0; - width: 100%; - height: 30px; - min-height: 0; - border: 0; - border-radius: 0; - background: transparent; - box-shadow: none; - outline: none; - padding: 0; - font-size: 13px; -} - -.maka-skill-search input::placeholder { - color: var(--foreground-40); -} - -.maka-skill-search:focus-within { - border-color: oklch(from var(--foreground) l c h / 0.16); - box-shadow: 0 0 0 2px oklch(from var(--foreground) l c h / 0.055); -} - -.maka-skill-add-button { - gap: 5px; - border-color: #151515; - border-radius: 999px; - background: linear-gradient(#333, #151515); - box-shadow: - inset 0 1px 0 #ffffff26, - 0 1px 2px #0c0c0d1a; - color: #fff; - font-size: 12px; - font-weight: 600; -} - -.maka-skill-add-button:hover { - border-color: #1f1f1f; - background: linear-gradient(#3e3e3e, #1f1f1f); - color: #fff; -} - -/* Phase 2 — atlas-driven rewrite (notes/reference-atlas.md §10). Skills page - card mirrors the Plan shell: 1px hairline border + 6px radius + 4% lift + - 1px inner top highlight, with tight 4-6px internal gaps. */ -.maka-skill-library { - width: min(100%, 900px); - margin-inline: auto; - min-height: 0; - overflow: auto; - display: grid; - align-content: start; - /* Atlas §14.6 quick-win: section gap 14 -> 8 to track the reference's - 4px `--agents-content-area-gap` cadence. */ - gap: 8px; - padding: 18px 20px 20px; - background: var(--card-bg); - border: 1px solid var(--card-border-color); - border-radius: var(--card-radius); - box-shadow: - var(--card-shadow), - var(--card-highlight); - animation: maka-page-shell-enter 320ms var(--ease-out-strong) both; -} - -/* Reference-layout page-shell entrance — opacity 0 + translateY(6px) -> 0, - so each top-level module page lands as a lifted card rather than slamming - onto the canvas. Used by Skills + Plan/Reminder shells. */ -@keyframes maka-page-shell-enter { - from { opacity: 0; transform: translateY(6px); } - to { opacity: 1; transform: translateY(0); } -} - -@media (prefers-reduced-motion: reduce) { - .maka-skill-library, - .maka-plan-shell, - .maka-module-main .maka-daily-review-panel, - .maka-daily-review-panel { - animation: none; - } -} - -[data-maka-visual-smoke="true"] .maka-skill-library, -[data-maka-visual-smoke="true"] .maka-plan-shell, -[data-maka-visual-smoke="true"] .maka-module-main .maka-daily-review-panel, -[data-maka-visual-smoke="true"] .maka-daily-review-panel { - animation: none; - opacity: 1; - transform: none; -} - -[data-maka-visual-smoke="true"] .maka-plan-card-grid > article, -[data-maka-visual-smoke="true"] .maka-plan-template-strip[data-layout="cards"] .maka-plan-template-card { - animation: none; - opacity: 1; - transform: none; -} - -.maka-skill-tool-summary-hidden { - display: none; -} - -.maka-skill-featured-banner { - position: relative; - min-height: 128px; - display: flex; - align-items: center; - justify-content: space-between; - gap: 24px; - overflow: hidden; - border: 1px solid oklch(88% 0.035 224 / 0.72); - border-radius: 8px; - background: - radial-gradient(circle at 80% 50%, oklch(100% 0 0 / 0.44) 0 24%, transparent 25%), - linear-gradient(100deg, oklch(92.5% 0.035 222) 0%, oklch(93.5% 0.045 205) 56%, oklch(88.8% 0.052 199) 100%); - box-shadow: inset 0 1px 0 oklch(100% 0 0 / 0.65); - padding: 26px 34px; -} - -.maka-skill-featured-banner h3 { - margin: 0; - color: var(--foreground); - font-size: 18px; - font-weight: 600; - line-height: 1.25; -} - -.maka-skill-featured-banner p { - max-width: 540px; - margin: 10px 0 0; - color: var(--foreground-65); - font-size: 13px; - line-height: 1.45; -} - -.maka-skill-featured-art { - position: relative; - align-self: stretch; - width: min(38%, 310px); - min-width: 220px; - display: flex; - align-items: center; - justify-content: center; - margin: -18px 2px -20px 0; -} - -.maka-skill-featured-art span { - position: absolute; - width: 94px; - height: 112px; - display: inline-flex; - flex-direction: column; - align-items: center; - justify-content: center; - gap: 5px; - border: 1px solid oklch(from var(--foreground) l c h / 0.07); - border-radius: 6px; - background: - linear-gradient(180deg, oklch(100% 0 0), oklch(98.2% 0.006 96)), - var(--background); - color: var(--foreground-60); - box-shadow: - 0 12px 24px -20px oklch(from var(--foreground) l c h / 0.32), - 0 1px 2px oklch(from var(--foreground) l c h / 0.06); -} - -.maka-skill-featured-art strong { - color: var(--foreground-70); - font-size: 10px; - font-weight: 650; - line-height: 1.1; -} - -.maka-skill-featured-art small { - color: var(--foreground-45); - font-size: 8px; - font-weight: 600; - line-height: 1.1; -} - -.maka-skill-featured-art span:first-child { - left: 14px; - top: 28px; - transform: rotate(-14deg); - color: oklch(64% 0.15 154); -} - -.maka-skill-featured-art span:nth-child(2) { - left: 92px; - top: 4px; - /* PR-FE-BUG-HUNT-9 z-index allowlist: decorative sticker stack - local stacking (3 spans within `.maka-skill-featured-art`). - Bare 2 is intentional — these never escape the parent container, - so they don't need a global token. The contract test - `z-index-contract.test.ts` whitelists this exact site. */ - z-index: 2; - width: 104px; - height: 122px; - transform: rotate(10deg); - color: oklch(54% 0.10 236); -} - -.maka-skill-featured-art span:nth-child(3) { - right: 4px; - top: 34px; - width: 88px; - height: 104px; - transform: rotate(7deg); - color: oklch(58% 0.18 32); -} - -.maka-skill-tabs-bar { - display: flex; - align-items: center; - justify-content: space-between; - gap: 16px; - border-bottom: 1px solid var(--border); -} - -.maka-skill-tabs { - display: flex; - gap: 18px; - border-bottom: 0; -} - -.maka-skill-tab { - position: relative; - display: inline-flex; - height: 32px; - align-items: center; - gap: 5px; - border: 0; - border-radius: 0; - background: transparent; - color: var(--foreground-55); - font-size: 13px; - font-weight: 500; - padding: 0 1px; -} - -.maka-skill-tab[data-state="active"] { - color: var(--foreground); - font-weight: 650; -} - -.maka-skill-tab[data-state="active"]::after { - content: ""; - position: absolute; - left: 0; - right: 0; - bottom: -1px; - height: 2px; - border-radius: 999px; - background: var(--foreground); -} - -.maka-skill-tab span { - min-width: 16px; - height: 16px; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 999px; - background: oklch(from var(--foreground) l c h / 0.06); - color: var(--foreground-55); - font-size: 11px; - font-weight: 650; - padding: 0 5px; -} - -.maka-skill-filter-actions { - display: inline-flex; - align-items: center; - gap: 8px; - padding-bottom: 6px; -} - -.maka-skill-filter-pill { - height: 28px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - color: var(--foreground-70); - font-size: 12px; - font-weight: 600; - padding: 0 12px; - opacity: 1; -} - -.maka-skill-market { - display: grid; - gap: 12px; -} - -.maka-skill-section-row { - display: flex; - align-items: center; - justify-content: space-between; - gap: 10px; -} - -.maka-skill-section-row small { - color: var(--foreground-45); - font-size: 11px; - font-weight: 600; -} - -.maka-skill-market-grid { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 12px; -} - -.maka-skill-market-card { - min-width: 0; - min-height: 150px; - display: flex; - flex-direction: column; - gap: 12px; - border: 1px solid var(--foreground-8); - border-radius: 6px; - background: var(--background); - padding: 16px; - transition: - border-color var(--duration-base) var(--ease-out-strong), - box-shadow var(--duration-emphasized) var(--ease-out-strong), - transform var(--duration-emphasized) var(--ease-out-strong); -} - -.maka-skill-market-card:hover { - border-color: oklch(from var(--foreground) l c h / 0.14); - box-shadow: 0 4px 12px -8px oklch(from var(--foreground) l c h / 0.08); - transform: translateY(-1px); -} - -.maka-skill-market-card-head { - min-width: 0; - display: flex; - align-items: flex-start; - gap: 11px; -} - -.maka-skill-market-card h3 { - margin: 0; - color: var(--foreground); - font-size: 15px; - font-weight: 600; - line-height: 1.25; -} - -.maka-skill-market-card small, -.maka-skill-market-card-foot span { - color: var(--foreground-45); - font-size: 11px; - font-weight: 600; -} - -.maka-skill-market-card p { - min-height: 40px; - margin: 0; - color: var(--foreground-60); - font-size: 12.5px; - line-height: 1.5; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; -} - -.maka-skill-market-icon { - width: 38px; - height: 38px; - display: inline-flex; - align-items: center; - justify-content: center; - flex: 0 0 auto; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--background); - color: var(--foreground-65); - box-shadow: 0 1px 2px oklch(from var(--foreground) l c h / 0.05); -} - -.maka-skill-market-card-foot { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - margin-top: auto; -} - -.maka-skill-market-install { - height: 26px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - color: var(--foreground-45); - cursor: not-allowed; - font-size: 12px; - font-weight: 650; - padding: 0 14px; -} - -.maka-skill-examples, -.maka-skill-installed { - display: grid; - /* Atlas §14.6 quick-win — section internal gap aligned to reference's - `--agents-content-area-gap: 4px` cadence; was 6px. */ - gap: 4px; - min-width: 0; -} - -.maka-skill-section-label { - color: var(--foreground-65); - font-size: 9.5px; - font-weight: 600; - letter-spacing: 0.08em; - text-transform: uppercase; -} - -.maka-skill-example-grid { - margin: 0; - padding: 0; - list-style: none; - display: grid; - gap: 2px; -} - -.maka-skill-template-row { - min-width: 0; - display: grid; - grid-template-columns: 18px minmax(0, 1fr); - gap: 2px 6px; - align-items: center; - padding: 5px 8px; - border: 0; - border-radius: 6px; - background: transparent; - transition: background-color var(--duration-base) var(--ease-out-strong); -} - -.maka-skill-template-row:hover { - background: oklch(from var(--foreground) l c h / 0.04); -} - -.maka-skill-template-icon { - grid-row: span 2; - width: 18px; - height: 18px; - display: inline-grid; - place-items: center; - border-radius: 6px; - background: oklch(from var(--accent) l c h / 0.08); - color: var(--accent); -} - -.maka-skill-template-copy { - min-width: 0; - display: grid; - gap: 2px; -} - -.maka-skill-template-copy strong { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--foreground); - font-size: 12px; - font-weight: 600; - line-height: 1.3; -} - -.maka-skill-template-copy span { - min-width: 0; - color: var(--foreground-60); - font-size: 11px; - line-height: 1.45; -} - -.maka-skill-template-row small { - grid-column: 2; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--foreground-45); - font-size: 9px; - line-height: 1.35; -} - -.maka-skill-library-list { - margin: 0; - padding: 0; - list-style: none; - min-height: 0; - overflow: visible; - display: grid; - align-content: start; - gap: 0; - border: 1px solid var(--foreground-8); - border-radius: 6px; - background: var(--background); -} - -.maka-skill-library-item { - min-width: 0; -} - -.maka-skill-library-item + .maka-skill-library-item { - border-top: 1px solid var(--foreground-8); -} - -.maka-skill-library-row { - appearance: none; - width: 100%; - height: auto !important; - min-height: 58px; - display: grid; - grid-template-columns: 34px minmax(180px, 1fr) minmax(72px, max-content) 40px 36px; - align-items: center; - justify-content: stretch !important; - gap: 10px; - padding: 10px 14px; - border: 0; - border-radius: 0; - background: transparent; - color: var(--foreground); - white-space: normal !important; - text-align: left; - transition: - background-color var(--duration-base) var(--ease-out-strong), - transform var(--duration-emphasized) var(--ease-out-strong); -} - -/* PR-UI-PIXEL-0 (2026-06-21): reference rule #2 — hover/selected states are - NEUTRAL gray (#efefef ≈ foreground/0.06), never tinted with the brand color. - The purple-tinted row hover read as "themed"; neutral reads calmer/native. - See notes/近期 UI study §1.4, §4. */ -.maka-skill-library-row:hover { - background: oklch(from var(--foreground) l c h / 0.06); - transform: translateX(1px); -} - -.maka-skill-library-row:active { - transform: translateY(1px); -} - -.maka-skill-library-row:focus-visible { - outline: 3px solid oklch(from var(--accent) l c h / 0.35); - outline-offset: 2px; -} - -/* PR-UI-PIXEL-1: skill rows are anchored by a reference-style icon tile — - a 38px rounded white square with a hairline + ultra-soft shadow holding the - glyph (study §3.2), instead of the previous flat 20px chip. */ -.maka-skill-library-status { - width: 34px; - height: 34px; - display: inline-grid; - place-items: center; - border-radius: 8px; - border: 1px solid var(--foreground-8); - background: var(--background); - box-shadow: 0 1px 2px oklch(from var(--foreground) l c h / 0.05); - color: var(--foreground-55); - transition: background-color var(--duration-base) var(--ease-out-strong), color var(--duration-base) var(--ease-out-strong); -} - -/* PR-UI-PIXEL-1: tile stays white on hover (reference keeps icon tiles - neutral); only the glyph deepens. */ -.maka-skill-library-row:hover .maka-skill-library-status, -.maka-skill-library-row:focus-visible .maka-skill-library-status { - background: var(--background); - color: var(--foreground); -} - -.maka-skill-library-copy { - min-width: 0; - display: grid; - gap: 3px; -} - -/* PR-UI-PIXEL-4 (2026-06-21): reference's built-in skill rows use a 14px/600 - name + 12px description (study §3.2). maka's 12/11 read cramped — bump to the - reference scale so the skills list feels as comfortable as 参考实现's. */ -.maka-skill-library-name { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 13px; - font-weight: 600; -} - -.maka-skill-library-description { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--foreground-60); - font-size: 11.5px; - line-height: 1.45; -} - -.maka-skill-library-meta { - display: inline-flex; - justify-self: end; - align-items: center; - gap: 6px; - color: var(--foreground-50); - font-size: 10px; - white-space: nowrap; - min-width: 0; - overflow: hidden; -} - -/* PR-UI-PIXEL-3: the skill id reads as a soft monospace metadata pill - (reference treats ids/counts/sources as filled fill-tertiary pills, §4 rule 8) - instead of loose gray text. */ -.maka-skill-library-meta > span:first-child { - overflow: hidden; - text-overflow: ellipsis; - max-width: 100%; - padding: 2px 8px; - border-radius: 999px; - background: oklch(from var(--foreground) l c h / 0.05); - color: var(--foreground-55); - font-family: var(--font-mono, ui-monospace, SFMono-Regular, Menlo, monospace); - font-size: 10px; - letter-spacing: -0.01em; -} - -.maka-skill-library-action { - justify-self: end; - min-width: 40px; - padding: 3px 8px; - border: 1px solid var(--border); - border-radius: 7px; - background: var(--background); - color: var(--foreground-55); - font-size: 11px; - font-weight: 600; - text-align: center; - opacity: 1; - transform: none; - transition: opacity var(--duration-base) var(--ease-out-strong), transform var(--duration-base) var(--ease-out-strong), background-color var(--duration-base) var(--ease-out-strong), color var(--duration-base) var(--ease-out-strong); -} - -.maka-skill-library-row:hover .maka-skill-library-action, -.maka-skill-library-row:focus-visible .maka-skill-library-action { - opacity: 1; - transform: translateX(0); - background: oklch(from var(--foreground) l c h / 0.06); - color: var(--foreground); -} - -.maka-skill-library-switch { - position: relative; - justify-self: end; - width: 34px; - height: 18px; - border-radius: 999px; - background: var(--accent); - box-shadow: inset 0 0 0 1px oklch(from var(--foreground) l c h / 0.05); -} - -.maka-skill-library-switch::after { - content: ""; - position: absolute; - top: 2px; - left: 18px; - width: 14px; - height: 14px; - border-radius: 999px; - background: var(--background); - box-shadow: 0 1px 2px oklch(from var(--foreground) l c h / 0.22); -} - -.maka-skill-installed-empty { - align-self: stretch; -} - -@media (max-width: 820px) { - .maka-module-main { - padding: 16px; - } - - .maka-module-main-header { - display: grid; - } - - .maka-module-main-actions { - justify-content: flex-start; - } - - .maka-skill-search { - width: min(100%, 280px); - } - - .maka-skill-library { - grid-template-columns: minmax(0, 1fr); - } - -.maka-skill-library-row { - grid-template-columns: 38px minmax(0, 1fr) max-content; - gap: 6px; - } - - .maka-skill-library-meta { - grid-column: 2; - flex-wrap: wrap; - white-space: normal; - } - - .maka-skill-library-action { - grid-column: 2; - justify-self: start; - opacity: 1; - transform: none; - } - - .maka-skill-library-switch { - grid-column: 3; - grid-row: 1; - } -} - -:where(input, select, textarea):focus { - outline: none; - border-color: oklch(from var(--accent) l c h / 0.48); - box-shadow: inset 0 0 0 1px oklch(from var(--accent) l c h / 0.22) !important; -} - -.maka-chat-header { - height: 32px; - display: flex; - align-items: flex-end; - gap: 4px; - padding: 0 10px; - background: transparent; - border-bottom: 0; - -webkit-app-region: drag; -} - -/* PR-REMOVE-CHAT-TAB (WAWQAQ msg d401938d 2026-06-23): the - browser-style session tab + the duplicate "新建对话" plus button at - the top-left of the chat header are removed. ~95 LOC of .maka-chat-tab* - rules came out with them. Session name + model live in the sidebar; - create-session lives in the sidebar new-task button. */ - -.maka-chat-header-spacer { - flex: 1; -} - -/* PR-MEMORY-VISIBILITY-INDICATOR-0: small clickable pill that fires - when local MEMORY.md is being injected into the agent's system - prompt. Tone matches the existing info badge family. */ -.maka-chat-header-memory-pill { - appearance: none; - background: oklch(from var(--accent) l c h / 0.10); - border: 1px solid oklch(from var(--accent) l c h / 0.25); - color: var(--accent); - border-radius: 999px; - display: inline-flex; - align-items: center; - gap: 4px; - padding: 1px 6px; - font-size: 11px; - font-weight: 600; - -webkit-app-region: no-drag; - margin-right: 4px; - margin-bottom: 3px; - white-space: nowrap; - flex: 0 0 auto; -} - -.maka-chat-header-memory-pill:hover { - background: oklch(from var(--accent) l c h / 0.18); -} - -.maka-chat-header-memory-pill:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; -} - -.maka-chat-header-mode-pill { - border: 1px solid oklch(from var(--info) l c h / 0.32); - background: oklch(from var(--info) l c h / 0.10); - color: var(--info-text); - border-radius: 999px; - display: inline-flex; - align-items: center; - gap: 4px; - padding: 1px 6px; - font-size: 11px; - font-weight: 650; - -webkit-app-region: no-drag; - margin-right: 4px; - margin-bottom: 3px; - white-space: nowrap; - flex: 0 0 auto; -} - -.maka-chat-header-mode-pill svg { - flex: 0 0 auto; -} - -.maka-model-switcher { - display: inline-flex; - align-items: center; - margin: 0 4px 2px 0; - min-width: 0; - max-width: min(320px, 28vw); - -webkit-app-region: no-drag; -} - -.maka-model-switcher[data-disabled="true"] { - opacity: 0.56; -} - -.maka-model-switcher[data-pending="true"] { - opacity: 0.78; - cursor: progress; -} - -.maka-model-switcher-trigger { - width: 100%; - min-width: 120px; - max-width: min(320px, 28vw); - height: 22px; - display: inline-flex; - align-items: center; - justify-content: space-between; - gap: 6px; - padding: 1px 6px 1px 8px; - border: 1px solid var(--border); - border-radius: 999px; - background: var(--foreground-5); - color: var(--foreground); - font-size: 11px; - box-shadow: none; - /* PR-MODEL-SWITCHER-TACTILE-0 (WAWQAQ msg `ed67a267`, skills round - task #116): tactile press feedback so the switch-model flow - feels physical. Same convention as the other interactive - surfaces in this round (artifact-row, session-row, - onboarding-card, prompt-chip). */ - transition: background 140ms var(--ease-out-strong), transform var(--duration-quick) var(--ease-out-strong); -} - -.maka-model-switcher-trigger:hover:not(:disabled):not([data-disabled]) { - background: var(--foreground-8, var(--foreground-5)); -} - -.maka-model-switcher-trigger:active:not(:disabled):not([data-disabled]) { - transform: scale(0.97); -} - -@media (prefers-reduced-motion: reduce) { - .maka-model-switcher-trigger { - transition: background 0ms; - } - .maka-model-switcher-trigger:active:not(:disabled):not([data-disabled]) { - transform: none; - } -} - -.maka-model-switcher-trigger[data-popup-open] { - background: var(--background); - box-shadow: var(--shadow-minimal-flat); -} - -.maka-model-switcher-trigger:disabled, -.maka-model-switcher-trigger[data-disabled] { - cursor: not-allowed; -} - -.maka-model-switcher-label { - flex: 0 0 auto; - font-size: 11px; - font-weight: 650; - color: var(--foreground-50); -} - -.maka-model-switcher-value { - min-width: 0; - max-width: 180px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--foreground); - font-size: 12px; - font-weight: 600; -} - -.maka-model-switcher-positioner { - z-index: var(--z-dropdown); - outline: none; -} - -.maka-model-switcher-popup { - width: min(330px, calc(100vw - 32px)); - min-width: min(300px, calc(100vw - 32px)); - max-height: min(420px, var(--available-height)); - padding: 8px; - border-radius: 12px; - background: var(--background); - box-shadow: - 0 1px 2px oklch(from var(--foreground) l c h / 0.04), - 0 14px 34px oklch(from var(--foreground) l c h / 0.13); -} - -.maka-model-switcher-popup [role="group"] + [role="group"] { - border-top: 1px solid var(--border); -} - -.maka-model-switcher-popup [role="option"] { - min-height: 46px; - align-items: center; - border-radius: 10px; - padding: 7px 10px; -} - -.maka-model-switcher-item-main { - display: block; - color: var(--foreground); - font-size: 13px; - font-weight: 650; - line-height: 1.25; -} - -/* Inline credential-lifecycle pill in the chat header. Clickable when the - * caller provides onClick (jumps to Settings · 账号). Tone follows the - * 6-state ConnectionUiStatus surface tokens for visual continuity. */ -.maka-chat-header-alert { - display: inline-flex; - align-items: center; - gap: 4px; - padding: 1px 6px; - margin-bottom: 3px; - border-radius: 999px; - border: 1px solid transparent; - font-size: 11px; - font-weight: 600; - letter-spacing: 0.02em; - white-space: nowrap; - flex: 0 0 auto; - -webkit-app-region: no-drag; - transition: transform 0.12s var(--ease-out-strong); -} -.maka-chat-header-alert:hover { - transform: translateY(-1px); -} -.maka-chat-header-alert:focus-visible { - outline: 2px solid var(--accent); - outline-offset: 2px; -} -.maka-chat-header-alert[data-tone="info"] { - background: oklch(from var(--info) l c h / 0.14); - color: var(--info-text); - border-color: oklch(from var(--info) l c h / 0.20); -} -.maka-chat-header-alert[data-tone="warning"] { - background: oklch(from var(--info) l c h / 0.18); - color: var(--info-text); - border-color: oklch(from var(--info) l c h / 0.30); -} -.maka-chat-header-alert[data-tone="destructive"] { - background: oklch(from var(--destructive) l c h / 0.14); - color: var(--destructive); - border-color: oklch(from var(--destructive) l c h / 0.28); -} - -/* PR109b: chat header lifecycle status badge. Sits next to the - * ChatHeaderAlert pill but with different semantics — alert is an - * ephemeral fault signal; status is the settled lifecycle position. - * Tone matches the SessionStatusIcon mapping so the sidebar row + the - * header badge read as the same status. */ -.maka-chat-header-status { - display: inline-flex; - align-items: center; - padding: 2px 8px; - border-radius: 999px; - border: 1px solid transparent; - font-size: 12px; - font-weight: 600; - line-height: 1.4; - margin-right: 6px; - -webkit-app-region: no-drag; - /* Short status label (运行中 etc.): keep on one line and never let the - tight header (browser panel open) collapse it into vertical text. */ - white-space: nowrap; - flex: 0 0 auto; -} -.maka-chat-header-status[data-tone="accent"] { - background: oklch(from var(--accent) l c h / 0.14); - color: var(--accent); - border-color: oklch(from var(--accent) l c h / 0.24); -} -.maka-chat-header-status[data-tone="warning"] { - background: oklch(from var(--info) l c h / 0.18); - color: var(--info-text); - border-color: oklch(from var(--info) l c h / 0.30); -} -.maka-chat-header-status[data-tone="destructive"] { - background: oklch(from var(--destructive) l c h / 0.14); - color: var(--destructive); - border-color: oklch(from var(--destructive) l c h / 0.28); -} -.maka-chat-header-status[data-tone="info"] { - background: oklch(from var(--info) l c h / 0.14); - color: var(--info-text); - border-color: oklch(from var(--info) l c h / 0.20); -} -.maka-chat-header-status[data-tone="success"] { - background: oklch(from var(--brand-deep) l c h / 0.14); - color: var(--brand-deep); - border-color: oklch(from var(--brand-deep) l c h / 0.28); -} -.maka-chat-header-status[data-tone="muted"] { - background: var(--foreground-5); - color: var(--foreground-60); - border-color: var(--border); -} - -.messages { - position: relative; - flex: 1; - min-height: 0; - overflow: hidden; -} - -.maka-chatViewport { - height: 100%; - overscroll-behavior: contain; -} - -.maka-chatContent { - position: relative; - min-height: 100%; - padding-inline: clamp(24px, 4vw, 40px); -} - -.maka-chat-shell { - position: relative; - min-height: 0; - display: flex; - flex-direction: column; - flex: 1; - overflow: hidden; -} - -.maka-chat-jump-bottom { - position: absolute; - bottom: 10px; - left: 50%; - transform: translateX(-50%); - width: 26px; - height: 26px; - display: grid; - place-items: center; - border: 1px solid var(--border-strong); - border-radius: 999px; - background: var(--background); - color: var(--foreground-70); - box-shadow: var(--shadow-medium); - opacity: 1; - transition: - transform var(--duration-emphasized) var(--ease-out-strong), - opacity var(--duration-emphasized) var(--ease-out-strong), - background 120ms ease; -} - -.maka-chat-jump-bottom:hover { - color: var(--foreground); - background: var(--foreground-3); - transform: translateX(-50%) translateY(-2px); -} - -.maka-chat-jump-bottom:active { - transform: translateX(-50%) scale(0.97); -} - -@starting-style { - .maka-chat-jump-bottom { - opacity: 0; - transform: translateX(-50%) translateY(8px); - } -} - -.maka-error-surface { - position: fixed; - inset: 0; - z-index: var(--z-overlay); - display: grid; - place-items: center; - padding: 32px; - background: var(--background); -} - -.maka-error-card { - display: grid; - grid-template-columns: 32px minmax(0, 1fr); - align-items: start; - gap: 12px; - max-width: 520px; - padding: 14px 16px; - border: 1px solid oklch(from var(--destructive) l c h / 0.3); - border-radius: 10px; - background: var(--background-elevated); - box-shadow: var(--shadow-modal); -} - -.maka-error-icon { - width: 32px; - height: 32px; - display: grid; - place-items: center; - border-radius: 8px; - background: oklch(from var(--destructive) l c h / 0.10); - color: var(--destructive-text); -} - -.maka-error-copy { - display: grid; - gap: 6px; -} - -.maka-error-copy h2 { - margin: 0; - color: var(--foreground); - font-size: 14px; - font-weight: 600; -} - -.maka-error-copy p { - margin: 0; - color: var(--foreground-70); - font-size: 12px; - line-height: 1.45; - max-width: 56ch; -} - -.maka-error-stack { - margin: 4px 0 0; - max-height: 220px; - padding: 10px 12px; - border: 1px solid var(--border); - border-radius: 10px; - background: var(--foreground-3); - color: var(--foreground-80); - overflow: auto; - font-family: var(--font-mono); - font-size: 11.5px; - line-height: 1.5; - white-space: pre-wrap; - word-break: break-word; -} - -.maka-error-actions { - display: flex; - align-items: center; - gap: 8px; - margin-top: 6px; -} - -.maka-error-copy-action[data-copy-state="pending"] { - cursor: progress; -} - -.maka-error-copy-action[data-copy-state="failed"] { - color: var(--destructive); - border-color: oklch(from var(--destructive) l c h / 0.35); -} - -.maka-error-copy-status { - color: var(--destructive-text); -} - -.maka-fake-backend-banner { - display: flex; - align-items: center; - gap: 8px; - margin: 8px 14px 0; - padding: 8px 12px; - border: 1px solid oklch(from var(--info) l c h / 0.3); - border-radius: 8px; - background: oklch(from var(--info) l c h / 0.10); - color: var(--info-text); - font-size: 12.5px; - line-height: 1.5; -} - -.maka-fake-backend-banner svg { - flex: 0 0 auto; -} - -.maka-fake-backend-banner strong { - font-weight: 600; -} - -.maka-toast-viewport { - position: fixed; - /* PR-UI-16: position now driven by `data-position` (default - * bottom-right preserves v1 behavior). Default anchors here are a - * safety fallback if data-position is missing or invalid. */ - right: 24px; - bottom: 24px; - z-index: var(--z-overlay); - display: grid; - gap: 10px; - width: min(360px, calc(100vw - 48px)); - margin: 0; - padding: 0; - list-style: none; - pointer-events: none; -} - -/* Reset position properties before each variant sets its own, so - * switching positions at runtime doesn't leave stale anchors. */ -.maka-toast-viewport[data-position] { - top: auto; - right: auto; - bottom: auto; - left: auto; - transform: none; -} - -.maka-toast-viewport[data-position="bottom-right"] { - bottom: 24px; - right: 24px; -} - -/* PR-TOAST-POLISH-0 (WAWQAQ msg `7f0ec4a5`): editorial card-shape pass - on toast notifications. Larger radius (10px) so toasts feel like - real floating cards instead of pill chips, and a layered depth shadow - (1px hairline + 3px close + 14px ambient) matching the impeccable - "premium card stacking" recipe. Bigger padding so copy doesn't crowd - the edge. - Entry animation slides from the right edge (`translateX(24px)→0`) - instead of from bottom — toasts land at bottom-right by default, - so right-edge slide reads as "arriving" rather than "growing up - from the canvas". Easing stays `var(--ease-out-strong)`. */ -.maka-toast { - display: grid; - grid-template-columns: 14px minmax(0, 1fr) auto auto; - align-items: start; - gap: 9px; - border: 1px solid var(--border); - border-radius: 10px; - background: var(--background); - box-shadow: - 0 1px 2px oklch(from var(--foreground) l c h / 0.05), - 0 3px 6px oklch(from var(--foreground) l c h / 0.04), - 0 14px 28px oklch(from var(--foreground) l c h / 0.07); - padding: 9px 12px; - pointer-events: auto; - opacity: 1; - transform: translateX(0); - transition: - opacity 200ms var(--ease-out-strong), - transform 240ms var(--ease-out-strong); -} - -@starting-style { - .maka-toast { - opacity: 0; - transform: translateX(24px); - } -} - -.maka-toast[data-variant="success"] { border-left: 3px solid var(--success); } -.maka-toast[data-variant="warning"] { border-left: 3px solid var(--info); } -.maka-toast[data-variant="error"] { border-left: 3px solid var(--destructive); } -.maka-toast[data-variant="info"] { border-left: 3px solid var(--accent); } - -.maka-toast-icon { - margin-top: 2px; - color: var(--foreground-60); -} -.maka-toast[data-variant="success"] .maka-toast-icon { color: var(--success-text); } -.maka-toast[data-variant="warning"] .maka-toast-icon { color: var(--info-text); } -.maka-toast[data-variant="error"] .maka-toast-icon { color: var(--destructive-text); } -.maka-toast[data-variant="info"] .maka-toast-icon { color: var(--accent); } - -.maka-toast-copy { - min-width: 0; - display: grid; - gap: 2px; -} - -.maka-toast-copy strong { - color: var(--foreground); - font-size: 11px; - font-weight: 600; - text-wrap: balance; -} - -.maka-toast-copy small { - color: var(--foreground-60); - font-size: 10px; - line-height: 1.4; - text-wrap: pretty; -} - -.maka-toast-action { - align-self: center; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - color: var(--accent); - padding: 3px 9px; - font-size: 10px; - font-weight: 600; - transition: - background-color var(--duration-base) var(--ease-out-strong), - transform var(--duration-quick) var(--ease-out-strong); -} - -.maka-toast-action:hover { - background: oklch(from var(--accent) l c h / 0.08); -} - -.maka-toast-action:active { - transform: scale(0.97); -} - -.maka-toast-close { - width: 20px; - height: 20px; - display: grid; - place-items: center; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground-50); - transition: - background-color var(--duration-base) var(--ease-out-strong), - color var(--duration-base) var(--ease-out-strong), - transform var(--duration-quick) var(--ease-out-strong); -} - -.maka-toast-close:hover { - color: var(--foreground); - background: var(--foreground-5); -} - -.maka-toast-close:active { - transform: scale(0.92); -} - -@media (prefers-reduced-motion: reduce) { - .maka-toast-action:active, - .maka-toast-close:active { - transform: none; - } -} - -.maka-confirm-modal { - width: min(420px, calc(100vw - 48px)); -} - -.maka-confirm-backdrop { - /* Slightly opaque so destructive confirms feel weightier than regular - toast notifications. */ - background: oklch(from var(--background) l c h / 0.7); -} - -.maka-help-modal { - width: min(560px, calc(100vw - 48px)); - max-height: calc(100dvh - 96px); - display: grid; - grid-template-rows: auto minmax(0, 1fr); - box-shadow: inset 0 1px 0 oklch(1 0 0 / 0.05); -} - -.maka-help-header { - display: flex; - align-items: start; - justify-content: space-between; - gap: 12px; -} - -.maka-help-eyebrow { - display: inline-flex; - align-items: center; - gap: 4px; - margin-bottom: 4px; - color: var(--foreground-50); - font-size: 10px; - font-weight: 600; - letter-spacing: 0; - text-transform: none; -} - -.maka-help-body { - display: grid; - gap: 10px; - padding: 8px 12px 12px; - overflow-y: auto; -} - -.maka-help-section h3 { - margin: 0 0 4px; - color: var(--foreground-70); - font-size: 10px; - font-weight: 600; - letter-spacing: 0; - text-transform: none; -} - -.maka-help-section dl { - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - gap: 3px 12px; - margin: 0; -} - -.maka-help-section dl > div { - display: contents; -} - -.maka-help-section dt { - color: var(--foreground-80); - font-size: 11px; - line-height: 1.45; -} - -.maka-help-section dd { - margin: 0; - display: inline-flex; - align-items: center; - gap: 4px; - justify-self: end; -} - -.maka-help-section dd > span { - display: inline-flex; - align-items: center; - gap: 4px; -} - -.maka-help-plus { - color: var(--foreground-40); - font-size: 10px; -} - -.maka-palette-backdrop { - padding-top: 12vh; - align-items: start; -} - -.maka-palette-modal { - width: min(584px, calc(100vw - 32px)); - max-height: min(620px, 68vh); - display: grid; - grid-template-rows: auto minmax(0, 1fr) auto; - overflow: hidden; - border: 1px solid var(--border); - border-radius: 8px; - box-shadow: - 0 1px 2px oklch(from var(--foreground) l c h / 0.05), - 0 18px 48px oklch(from var(--foreground) l c h / 0.12), - inset 0 1px 0 oklch(1 0 0 / 0.05); -} - -.maka-palette-modal, -.maka-palette-list, -.maka-palette-group-label, -.maka-palette-item, -.maka-palette-hint, -.maka-palette-footer { - -webkit-user-select: none; - user-select: none; -} - -.maka-palette-input-wrap { - width: auto; - min-height: 32px; - margin: 8px 10px; - border-color: var(--border); - background: var(--surface); -} - -.maka-palette-input { - color: var(--foreground); - font-size: 12px; - line-height: 1.4; - -webkit-user-select: text; - user-select: text; -} - -.maka-palette-input::placeholder { - color: var(--foreground-40); -} - -.maka-palette-input-hint { - display: inline-flex; - align-items: center; - gap: 6px; - color: var(--foreground-50); - font-size: 11px; - white-space: nowrap; -} - -.maka-palette-input-hint-addon { - flex-shrink: 0; -} - -.maka-shortcut-group { - display: inline-flex; - align-items: center; - gap: 4px; -} - -.maka-shortcut-kbd { - height: 16px; - min-width: 16px; - padding: 0 4px; - border-radius: 3px; - border: 1px solid var(--border); - background: var(--foreground-5); - box-shadow: inset 0 1px 0 oklch(from var(--background) l c h / 0.45); - color: var(--foreground-60); - font-family: var(--font-mono); - font-size: 9px; - font-weight: 600; - line-height: 1; -} - -.maka-palette-input-hint .maka-shortcut-kbd { - background: var(--foreground-5); -} - -@media (max-width: 560px) { - .maka-palette-input-hint-addon { - display: none; - } -} - -.maka-palette-list { - border-top: 1px solid var(--border); - overflow-y: auto; - padding: 5px 6px 7px; -} - -.maka-palette-group + .maka-palette-group { - margin-top: 4px; -} - -.maka-palette-group-label { - padding: 4px 8px 3px; - color: var(--foreground-50); - font-size: 10px; - font-weight: 600; - letter-spacing: 0; - text-transform: none; -} - -.maka-palette-item { - position: relative; - width: 100%; - min-height: 28px; - display: grid; - grid-template-columns: 18px minmax(0, 1fr) auto; - align-items: center; - gap: 8px; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground); - padding: 5px 8px; - text-align: left; - font-size: 11px; - cursor: default; - transform: translateY(0); - transition: - background-color 140ms var(--ease-out-strong), - color 140ms var(--ease-out-strong), - opacity 140ms var(--ease-out-strong), - transform 140ms var(--ease-out-strong); -} - -.maka-palette-item::before { - content: ""; - position: absolute; - inset: 5px auto 5px 3px; - width: 2px; - border-radius: 999px; - background: transparent; - transition: background-color 140ms var(--ease-out-strong); -} - -.maka-palette-item:hover:not([data-disabled="true"]) { - background: var(--foreground-5); -} - -.maka-palette-item[data-active="true"] { - background: oklch(from var(--accent) l c h / 0.10); - color: var(--foreground); -} - -.maka-palette-item[data-active="true"]::before { - background: oklch(from var(--accent) l c h / 0.72); -} - -.maka-palette-item:active:not([data-disabled="true"]) { - transform: translateY(1px); -} - -.maka-palette-item:focus-visible { - outline: 2px solid var(--ring); - outline-offset: 1px; -} - -.maka-palette-item[data-disabled="true"] { - color: var(--foreground-50); - cursor: default; - opacity: 0.72; -} - -.maka-palette-item[data-pending="true"] { - cursor: progress; -} - -.maka-palette-icon { - display: grid; - place-items: center; - width: 18px; - height: 18px; - border-radius: 5px; - color: var(--foreground-50); - transition: - background-color 140ms var(--ease-out-strong), - color 140ms var(--ease-out-strong); -} - -.maka-palette-item[data-active="true"] .maka-palette-icon { - background: oklch(from var(--accent) l c h / 0.10); - color: var(--accent); -} - -.maka-palette-label { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.maka-palette-hint { - display: inline-flex; - align-items: center; - gap: 4px; - color: var(--foreground-50); - font-size: 10px; - font-family: var(--font-mono); - font-variant-numeric: tabular-nums; -} - -.maka-palette-item[data-pending="true"] .maka-palette-hint { - color: var(--accent); -} - -.maka-palette-empty { - color: var(--foreground-50); -} - -.maka-palette-footer { - display: flex; - align-items: center; - gap: 6px; - padding: 3px 8px; - border-top: 1px solid var(--border); - background: var(--foreground-2); - color: var(--foreground-50); - font-size: 10px; -} - -.maka-palette-footer .maka-shortcut-group, -.maka-palette-footer .maka-shortcut-kbd { - margin-right: 4px; -} - -.maka-palette-footer .maka-shortcut-group .maka-shortcut-kbd { - margin-right: 0; -} - -.maka-palette-footer .maka-shortcut-kbd { - padding: 1px 5px; - background: var(--background); - font-size: 10px; -} - -/* PR-UI-1 (@yuejing 2026-05-22): unified hero chrome. - * - * `.maka-hero` is the shared layout for both EmptyChatHero (after a - * session exists but has no messages) and OnboardingHero variants - * (first-run / setup / ready_empty / blocked). Same width / margin / - * gap / eyebrow / heading scale, so the visual switch between - * "first-run" and "empty session" no longer feels jarring. - * - * Legacy `.emptyChat` and `.eyebrow` are kept as aliases so any - * external CSS / smoke fixture references still match. - */ -.maka-hero { - width: min(750px, 80vw); - margin: auto; - padding: 0; - display: grid; - justify-items: center; - gap: 26px; - color: var(--foreground); - text-align: center; - animation: maka-hero-enter 320ms var(--ease-out-strong) both; -} - -/* Hero mount entrance — opacity 0 + translateY(8px) -> 0. Visible whenever - an empty-chat or onboarding hero appears (new session, app boot, blocked - state). Ported from the upstream reference design's agents-slide-up cadence. */ -@keyframes maka-hero-enter { - from { opacity: 0; transform: translateY(8px); } - to { opacity: 1; transform: translateY(0); } -} - -@media (prefers-reduced-motion: reduce) { - .maka-hero { - animation: none; - } -} - -[data-maka-visual-smoke="true"] .maka-hero { - animation: none; -} - -.maka-hero header, -.maka-hero-empty-chat header { - display: grid; - gap: 10px; - justify-items: center; -} - -.maka-hero-visual { - position: relative; - width: min(520px, 62vw); - height: 130px; - margin-bottom: 4px; -} - -.maka-hero-bubble { - position: absolute; - display: inline-flex; - align-items: center; - min-height: 32px; - border-radius: 12px; - background: var(--foreground-3); - color: var(--foreground-55); - font-size: 12px; - font-weight: 600; - line-height: 1; - white-space: nowrap; - padding: 0 14px; -} - -.maka-hero-bubble-primary { - left: 38px; - top: 16px; - background: oklch(from var(--accent) l c h / 0.10); - color: var(--accent); -} - -.maka-hero-bubble-secondary { - right: 22px; - top: 42px; -} - -.maka-hero-avatar { - position: absolute; - display: inline-grid; - place-items: center; - border-radius: 999px; - box-shadow: 0 6px 18px -14px oklch(from var(--foreground) l c h / 0.32); -} - -.maka-hero-avatar-maka { - left: calc(50% - 48px); - top: 42px; - width: 66px; - height: 66px; - background: oklch(from var(--accent) l c h / 0.18); - color: var(--accent); -} - -.maka-hero-avatar-user { - left: calc(50% + 4px); - top: 52px; - width: 62px; - height: 62px; - border: 4px solid oklch(from var(--accent) l c h / 0.12); - background: oklch(0.93 0.035 70); - color: var(--foreground); - font-size: 22px; - font-weight: 700; -} - -.maka-hero-eyebrow { - display: inline-flex; - align-items: center; - gap: 6px; - color: var(--accent); - font-size: 11px; - font-weight: 700; - letter-spacing: 0.12em; - text-transform: uppercase; -} - -.maka-hero h1 { - margin: 0; - max-width: 34ch; - /* Phase 4A hero typography — atlas §15 deep RE notes reference uses - `.welcome-title` with `Instrument Sans` variable font at wdth:100/ - wght:500 for hero. Maka uses Geist Variable which also has wdth + - wght axes. Pulling the heading to 32px / wght 550 / -0.018em - tracking + setting font-variation-settings wdth 105 gives the - hero the same "wider, slightly heavier, optically distinct from - chrome" feel without adding a second variable font asset. */ - font-size: 32px; - font-weight: 550; - letter-spacing: -0.018em; - line-height: 1.1; - font-variation-settings: "wght" 550, "wdth" 105; - text-wrap: balance; -} - -.maka-hero p { - margin: 0; - max-width: 54ch; - color: var(--foreground-60); - font-size: 14.5px; - line-height: 1.55; - text-wrap: pretty; -} - -@media (max-width: 820px) { - .maka-hero-visual { - width: min(420px, 84vw); - height: 112px; - } - - .maka-hero-bubble { - font-size: 11px; - padding-inline: 10px; - } - - .maka-hero-bubble-primary { - left: 0; - } - - .maka-hero-bubble-secondary { - right: 0; - } -} - -/* Chat message mount entrance — opacity 0 + translateY(6px) -> 0, ported - from the upstream reference design's agents-slide-up keyframe. Every - message slides up gently when it lands, including streaming deltas and - session-switch loads. Honored by prefers-reduced-motion below. */ -.maka-message-row { - animation: maka-message-row-enter 220ms var(--ease-out-strong) both; -} - -@keyframes maka-message-row-enter { - from { opacity: 0; transform: translateY(6px); } - to { opacity: 1; transform: translateY(0); } -} - -@media (prefers-reduced-motion: reduce) { - .maka-message-row { - animation: none; - } -} - -[data-maka-visual-smoke="true"] .maka-message-row { - animation: none; -} - -.message > span { - display: block; - margin-bottom: 6px; - color: var(--foreground-50); - font-size: 11px; - font-weight: 600; - letter-spacing: 0.01em; -} - -.message.user > span { color: var(--foreground-60); } -.message.assistant > span { color: var(--accent); } -.message.system > span { color: var(--info-text); } - -/* PR-CHAT-CHROME-FOLLOWUP-0: the relative time is always visible now - (it was `opacity: 0` until hover, which hid it on touch + from - assistive tech). It stays quiet — 12px at the shared chrome size, - muted — and rides in the user turn's meta row beneath the block. */ -.maka-message-time-inline { - display: inline-block; - color: var(--foreground-40); - font-size: 12px; - font-weight: 500; - line-height: 1; - font-variant-numeric: tabular-nums; - white-space: nowrap; -} - -/* User turn meta row: quiet time + a copy affordance, right-aligned - beneath the message block (the parent `.message.user` aligns items - to flex-end, so this row shrink-wraps and hugs the right edge). */ -.maka-message-meta { - display: inline-flex; - align-items: center; - gap: 6px; -} - -.message.user { - display: flex; - flex-direction: column; - align-items: flex-end; - /* Separate the meta row from the bubble. Kept below the 8px turn - rhythm so the time + copy still read as belonging to the bubble - (proximity) rather than floating between turns. */ - gap: 6px; -} - -.maka-turn > .maka-turn-summary, -.maka-turn > .maka-turn-lineage-row, -.message.assistant .maka-turn-lineage-row, -.message.assistant .maka-turn-footer { - display: flex; - max-width: var(--maka-chat-measure, 680px); - width: 100%; - margin-left: 0; - margin-right: auto; - justify-content: flex-start; -} - -.message.assistant, -.message.system { - max-width: var(--maka-chat-measure, 680px); - width: 100%; - margin-left: 0; - margin-right: auto; -} - -.message pre { - margin: 0; - font: inherit; -} - -.message.system pre { - display: inline-flex; - border-radius: 999px; - background: oklch(from var(--info) l c h / 0.08); - color: var(--info-text); - padding: 2px 7px; - font-size: 10px; -} - -.toolInline { - width: min(680px, 100%); - margin: 2px auto 0; - padding: 0 16px; -} - -.toolInline > header { - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 3px; - color: var(--foreground-50); - font-size: 10px; -} - -.toolItem { - overflow: hidden; - box-shadow: var(--shadow-minimal-flat); -} - -.toolArgs { - margin: 0; - max-height: 110px; - overflow: auto; -} - -.maka-overlay-preview { - margin: 5px 0 0; - max-height: 180px; - overflow: auto; - font-family: var(--font-mono); - font-size: 10px; - white-space: pre-wrap; - word-break: break-word; -} - -.maka-overlay-close { - justify-self: end; - display: inline-flex; - align-items: center; - gap: 4px; - min-height: 22px; - padding-inline: 7px; -} - -.maka-load-tool-preview { - margin: 5px 0 0; - padding: 5px 8px; - display: grid; - gap: 2px; - border: 1px solid var(--border); - border-radius: 6px; - background: var(--background); - font-size: 10px; - animation: maka-tool-card-enter 350ms var(--ease-out-strong) both; -} - -.maka-load-tool-preview p { - margin: 0; -} - -.maka-load-tool-title { - font-weight: 600; -} - -.maka-load-tool-count { - color: var(--foreground-2); -} - -.maka-load-tool-tools { - font-family: var(--font-mono); - word-break: break-word; -} - -.maka-load-tool-footer { - color: var(--foreground-2); - font-size: 11px; -} - -/* File diff: each line tagged with data-line for add / del / hunk / meta / - * ctx so we can color the unified-diff payload like GitHub / VS Code. */ -.maka-tool-diff { - padding: 0; - display: grid; - gap: 0; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--background); - white-space: normal; - animation: maka-tool-card-enter 350ms var(--ease-out-strong) both; -} - -/* Tool-card mount entrance — opacity 0 + scale .97 -> 1, ported from - the upstream reference design's compact code-output entrance so each - tool result feels like it "lands" instead of popping in. Honored by - prefers-reduced-motion via the rule below. */ -@keyframes maka-tool-card-enter { - from { opacity: 0; transform: scale(0.97); } - to { opacity: 1; transform: scale(1); } -} - -@media (prefers-reduced-motion: reduce) { - .maka-tool-diff, - .maka-tool-terminal, - .maka-load-tool-preview { - animation: none; - } -} - -.maka-tool-diff-paths { - display: flex; - flex-wrap: wrap; - gap: 6px; - padding: 5px 8px; - border-bottom: 1px solid var(--border); - background: var(--foreground-2); - font-family: var(--font-mono); - font-size: 10px; -} - -.maka-tool-diff-paths code { - color: var(--foreground-70); - background: transparent; -} - -.maka-tool-diff-body { - margin: 0; - padding: 5px 0; - max-height: 320px; - overflow: auto; - font-family: var(--font-mono); - font-size: 11.5px; - line-height: 1.45; - white-space: pre; - word-break: normal; -} - -.maka-tool-diff-line { - display: block; - padding: 0 8px; - white-space: pre; -} - -.maka-tool-diff-line[data-line="add"] { - background: oklch(from var(--success) l c h / 0.10); - color: var(--success-text); -} - -.maka-tool-diff-line[data-line="del"] { - background: oklch(from var(--destructive) l c h / 0.10); - color: var(--destructive); -} - -.maka-tool-diff-line[data-line="hunk"] { - background: oklch(from var(--accent) l c h / 0.08); - color: var(--foreground-70); - font-weight: 600; -} - -.maka-tool-diff-line[data-line="meta"] { - color: var(--foreground-50); -} - -.maka-tool-diff-line[data-line="ctx"] { - color: var(--foreground-70); -} - -/* Terminal output: head row (cwd + cmd + exit badge) then optional stdout / - * stderr blocks with stderr tinted destructive. */ -.maka-tool-terminal { - padding: 0; - display: grid; - gap: 0; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--background); - white-space: normal; - animation: maka-tool-card-enter 350ms var(--ease-out-strong) both; -} - -.maka-tool-terminal-head { - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 6px; - padding: 5px 8px; - border-bottom: 1px solid var(--border); - background: var(--foreground-2); - font-family: var(--font-mono); - font-size: 10px; -} - -.maka-tool-terminal-cwd { - color: var(--foreground-50); - background: transparent; -} - -.maka-tool-terminal-cmd { - flex: 1 1 auto; - min-width: 0; - color: var(--foreground); - background: transparent; - font-weight: 600; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; -} - -.maka-tool-terminal-exit { - padding: 1px 6px; - border-radius: 999px; - font-size: 9px; - font-weight: 700; - letter-spacing: 0.04em; - background: var(--foreground-5); - color: var(--foreground-60); -} - -.maka-tool-terminal-exit[data-ok="true"] { - background: oklch(from var(--success) l c h / 0.14); - color: var(--success); -} - -.maka-tool-terminal-exit[data-ok="false"] { - background: oklch(from var(--destructive) l c h / 0.14); - color: var(--destructive); -} - -.maka-tool-terminal-empty { - margin: 0; - padding: 8px; - color: var(--foreground-50); - font-family: var(--font-mono); - font-size: 11px; - font-style: italic; -} - -.maka-tool-terminal-stream { - margin: 0; - padding: 6px 8px; - max-height: 180px; - overflow: auto; - font-family: var(--font-mono); - font-size: 11.5px; - white-space: pre-wrap; - word-break: break-word; -} - -.maka-tool-terminal-stream[data-stream="stdout"] { - color: var(--foreground); -} - -.maka-tool-terminal-stream[data-stream="stderr"] { - border-top: 1px solid var(--border); - background: oklch(from var(--destructive) l c h / 0.04); - color: var(--destructive); -} - -.maka-tool-terminal-truncated-note { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - padding: 6px 8px; - border-top: 1px solid var(--border); - background: oklch(from var(--warning) l c h / 0.06); - color: var(--foreground-70); - font-size: 11px; - line-height: 1.5; -} - -.maka-tool-terminal-truncated-note > span { - min-width: 0; -} - -.maka-tool-terminal-copy { - flex: 0 0 auto; -} - -.maka-tool-terminal-copy[data-pending="true"], -.maka-explore-agent-copy[data-pending="true"] { - cursor: progress; -} - -.maka-tool-terminal-copy[data-copy-error="true"], -.maka-explore-agent-copy[data-copy-error="true"] { - color: var(--destructive); - border-color: oklch(from var(--destructive) l c h / 0.35); -} - -.maka-tool-error-copy[data-pending="true"] { - cursor: progress; -} - -.maka-tool-error-copy[data-copy-feedback="copied"] { - color: var(--accent); - border-color: oklch(from var(--accent) l c h / 0.35); -} - -.maka-tool-error-copy[data-copy-feedback="failed"] { - color: var(--destructive); - border-color: oklch(from var(--destructive) l c h / 0.35); -} - -.maka-office-document-preview { - display: grid; - gap: 8px; - padding: 10px 12px; - border: 1px solid var(--foreground-10); - border-radius: 8px; - background: var(--foreground-3); - white-space: normal; -} - -.maka-office-document-preview[data-ok="false"] { - border-color: oklch(from var(--destructive) l c h / 0.22); -} - -.maka-office-document-head { - display: grid; - gap: 2px; - padding-bottom: 6px; - border-bottom: 1px solid var(--foreground-10); -} - -.maka-office-document-head strong { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 13px; - color: var(--foreground); -} - -.maka-office-document-head small, -.maka-office-document-message small { - font-size: 11px; - color: var(--foreground-50); - text-transform: uppercase; - letter-spacing: 0.04em; -} - -.maka-office-document-args { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--foreground-60); - background: transparent; - font-size: 11px; -} - -.maka-office-document-message { - display: grid; - gap: 3px; - padding: 8px 10px; - border-radius: 6px; - background: oklch(from var(--destructive) l c h / 0.07); - color: var(--destructive); - font-family: var(--font-sans); - font-size: 12px; -} - -.maka-office-document-empty { - margin: 0; - color: var(--foreground-50); - font-family: var(--font-mono); - font-size: 12px; - font-style: italic; -} - -.maka-office-document-stream { - margin: 0; - padding: 8px 10px; - max-height: 200px; - overflow: auto; - border: 1px solid var(--foreground-10); - border-radius: 6px; - background: var(--background); - font-family: var(--font-mono); - font-size: 12.5px; - white-space: pre-wrap; - word-break: break-word; -} - -.maka-office-document-stream[data-stream="stderr"] { - background: oklch(from var(--destructive) l c h / 0.04); - color: var(--destructive); -} - -.maka-explore-agent-preview, -.maka-subagent-preview { - display: grid; - gap: 10px; - padding: 10px 12px; - border: 1px solid var(--foreground-10); - border-radius: 8px; - background: var(--foreground-3); - font-family: var(--font-sans); - white-space: normal; -} - -.maka-explore-agent-preview[data-ok="false"], -.maka-subagent-preview[data-status="failed"], -.maka-subagent-preview[data-status="cancelled"] { - border-color: oklch(from var(--destructive) l c h / 0.22); -} - -.maka-explore-agent-head { - display: grid; - gap: 2px; - padding-bottom: 6px; - border-bottom: 1px solid var(--foreground-10); -} - -.maka-explore-agent-head strong { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 13px; - color: var(--foreground); -} - -.maka-explore-agent-head small, -.maka-explore-agent-section small, -.maka-explore-agent-meta dt { - font-size: 11px; - color: var(--foreground-50); - text-transform: uppercase; - letter-spacing: 0.04em; -} - -.maka-explore-agent-summary-line { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - min-width: 0; -} - -.maka-explore-agent-summary-line small { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.maka-explore-agent-actions { - display: flex; - align-items: center; - justify-content: flex-end; - gap: 6px; - margin-top: 4px; -} - -.maka-explore-agent-message { - padding: 8px 10px; - border-radius: 6px; - background: oklch(from var(--destructive) l c h / 0.07); - color: var(--destructive); - font-size: 12px; -} - -.maka-explore-agent-meta { - display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); - gap: 8px; - margin: 0; -} - -.maka-explore-agent-meta div { - min-width: 0; - display: grid; - gap: 2px; -} - -.maka-explore-agent-meta dd { - min-width: 0; - margin: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--foreground-70); - font-size: 12px; -} - -.maka-explore-agent-section { - display: grid; - gap: 6px; -} - -.maka-explore-agent-section-head { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - min-width: 0; -} - -.maka-explore-agent-section > strong { - font-size: 12px; - color: var(--foreground); -} - -.maka-explore-agent-section-head > strong { - min-width: 0; - font-size: 12px; - color: var(--foreground); -} - -.maka-explore-agent-copy { - flex: 0 0 auto; - gap: 4px; - min-height: 24px; - padding: 3px 8px; - font-size: 11px; -} - -.maka-explore-agent-copy[data-copied="true"] { - color: var(--accent); - border-color: oklch(from var(--accent) l c h / 0.35); -} - -.maka-explore-agent-section ul { - list-style: none; - margin: 0; - padding: 0; - display: grid; - gap: 6px; -} - -.maka-explore-agent-section li { - min-width: 0; - display: grid; - gap: 3px; - padding: 6px 0; - border-top: 1px solid var(--foreground-5); -} - -.maka-explore-agent-section li:first-child { - border-top: 0; - padding-top: 0; -} - -.maka-explore-agent-section code { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: var(--foreground); - background: transparent; - font-family: var(--font-mono); - font-size: 12px; -} - -.maka-explore-agent-section p, -.maka-explore-agent-section span { - margin: 0; - color: var(--foreground-70); - font-size: 12px; - line-height: 1.45; - white-space: pre-wrap; - word-break: break-word; -} - -.composer { - flex: 0 0 auto; - display: flex; - flex-direction: column; - align-items: center; - padding: 12px 24px 16px; - /* PR-GRAY-CARD-LIFT-5 (WAWQAQ msg `d4277aba` round 3): the composer - outer used to paint a vertical white-fade over `--background`, - designed for the older parchment shell where the page bg was - warm-white. Now that `--background` itself is pure white and the - shell is a visibly gray `--surface-canvas`, the composer outer - painted itself white-on-white, defeating the gray-plate / white- - card lift. Switch to transparent so the gray plate shows around - the composer card. */ - background: transparent; -} - -.composer .maka-composer-inner { - --h-composer-min: 56px; - position: relative; - width: min(var(--maka-chat-measure, 680px), 100%); - max-width: var(--maka-chat-measure, 680px); - margin-inline: auto; - box-sizing: border-box; - /* Composer outer chrome uses the universal page-card recipe (atlas §4 - + maka-tokens.css --card-*) but with a slightly larger 10px radius - since the composer reads as a "hero card" rather than a flush page - surface — 6px would feel too tight for a 72px+ tall floating panel. */ - border: 1px solid var(--card-border-color); - border-radius: 16px; - padding: 10px 12px 8px; - background: var(--card-bg); - box-shadow: - 0 10px 30px -24px oklch(from var(--foreground) l c h / 0.25), - 0 1px 0 oklch(1 0 0 / 0.76); - transition: - border-color var(--duration-emphasized) var(--ease-out-strong), - box-shadow 220ms var(--ease-out-strong); -} - -.composer .maka-composer-inner::before, -.composer .maka-composer-inner::after { - content: none; -} - -.composer .maka-composer-inner::before { - box-shadow: none; -} - -.composer .maka-composer-inner::after { - box-shadow: none; -} - -/* PR-UI-PIXEL-3: on focus the composer gains a soft lift (ring + faint - drop glow), so the input feels alive — the reference's composer breathes - rather than sitting flat (study §8.1, §8.4). */ -.composer .maka-composer-inner:focus-within { - box-shadow: - 0 0 0 1px oklch(from var(--accent) l c h / 0.24), - 0 14px 34px -28px oklch(from var(--foreground) l c h / 0.24); -} - -.composer textarea { - /* Auto-resizing textarea: starts at min-height for a single line, grows up - to max-height as the user adds lines, then scrolls internally. The JS - side caps at 240px (see `COMPOSER_MAX_HEIGHT` in @maka/ui). */ - min-height: var(--h-composer-min, 84px); - max-height: 240px; - resize: none; - overflow-y: auto; -} - -.composer .maka-composer-textarea { - appearance: none; - display: block; - width: 100%; - min-height: var(--h-composer-min, 56px); - border: 0 !important; - border-radius: 0 !important; - background: transparent !important; - box-shadow: none !important; - outline: 0 !important; - padding: 0 !important; - color: var(--foreground); - font-family: var(--font-default); - font-size: 15px; - line-height: 1.55; - --tw-ring-shadow: 0 0 #0000 !important; - --tw-ring-offset-shadow: 0 0 #0000 !important; -} - -.composer textarea:focus { - /* The focus ring lives on the wrapper (.maka-composer-inner:focus-within). - The textarea itself stays clean — no double ring. */ - outline: 0; - box-shadow: none !important; -} - -.composer textarea:focus-visible, -.composer .maka-composer-textarea:focus-visible { - outline: 0; - box-shadow: none !important; -} - -.maka-composer-streaming-hint .maka-shortcut-kbd { - font-size: 10px; - padding: 1px 5px; - background: var(--foreground-3); - border: 1px solid var(--border); -} - -.composerActions { - display: flex; - align-items: center; - justify-content: space-between; - gap: 8px; - margin-top: 8px; - padding-top: 2px; - border-top: 0; -} - -.maka-composer-left-controls, -.maka-composer-right-controls { - display: flex; - align-items: center; - /* PR-REFERENCE-PIXEL-8 (WAWQAQ msg `f79de85f` round 8): reference implementation's - bundle uses gap values centered on 4-8px (extracted from - `globals-UfMzAdiO.css` — 4px is the most common gap, 12px never - appears as a toolbar gap). Maka's 12px composer toolbar gap - read as too loose vs reference implementation's tighter density. 8px keeps - individual controls separable while pulling them into one - coherent toolbar group. */ - gap: 6px; -} - -.maka-composer-left-controls { - flex: 0 0 auto; -} - -.maka-composer-right-controls { - flex: 0 0 auto; - justify-content: flex-end; -} - -.maka-composer-status-slot { - min-width: 0; - flex: 1 1 auto; - color: var(--foreground-42); - font-size: 10px; - text-align: center; -} - -.maka-composer-mode-chip, -.maka-composer-model-chip { - height: 26px; - display: inline-flex; - align-items: center; - gap: 4px; - border: 1px solid var(--color-border-tertiary); - border-radius: 999px; - padding: 0 9px; - background: oklch(from var(--background) l c h / 0.82); - color: var(--foreground-62); - font-size: 10.5px; - font-weight: 500; - white-space: nowrap; - transition: - background-color var(--duration-base) var(--ease-out-strong), - color var(--duration-base) var(--ease-out-strong), - border-color var(--duration-base) var(--ease-out-strong); -} - -.maka-composer-mode-chip:hover, -.maka-composer-model-chip:hover { - background: var(--foreground-3); - color: var(--foreground); - border-color: oklch(from var(--foreground) l c h / 0.16); -} - -.maka-composer-model-chip { - max-width: min(180px, 28vw); -} - -/* PR-MOVE-PERMISSION-MODE (WAWQAQ 2026-06-23): permission-mode chip - in the composer left-controls + its dropdown menu. The chip reuses - the shared `.maka-composer-role-chip` / `.maka-composer-mode-chip` - geometry (h-24 pill, foreground-65 ink); only the menu styling - below is new. */ -.maka-composer-mode-chip { - font-variant-numeric: tabular-nums; -} -.maka-composer-mode-chip[data-tone="accent"] { - border-color: oklch(from var(--accent) l c h / 0.32); - color: oklch(from var(--accent) l c h); -} -.maka-composer-mode-chip[data-tone="caution"] { - border-color: oklch(from var(--success) l c h / 0.32); - color: oklch(from var(--success) l c h); -} -.maka-composer-mode-chip[data-tone="info"] { - border-color: oklch(from var(--info) l c h / 0.32); - color: oklch(from var(--info) l c h); -} -.maka-composer-mode-chip[data-pending="true"] { - opacity: 0.7; -} -.maka-composer-mode-chip:disabled { - cursor: not-allowed; - opacity: 0.55; -} - -.maka-composer-mode-menu { - min-width: 280px; - padding: 4px; - border-radius: 8px; -} -.maka-composer-mode-menu [role="menuitem"] { - display: grid; - grid-template-columns: minmax(0, 1fr) auto; - align-items: center; - gap: 8px; - padding: 8px 10px; - border-radius: 6px; -} -.maka-composer-mode-menu-item { - display: flex; - flex-direction: column; - gap: 2px; - min-width: 0; -} -.maka-composer-mode-menu-label { - font-size: 12.5px; - font-weight: 600; - color: var(--foreground); -} -.maka-composer-mode-menu-hint { - font-size: 11px; - color: var(--foreground-55); - line-height: 1.4; - white-space: normal; -} -.maka-composer-mode-menu [data-active="true"] .maka-composer-mode-menu-label { - color: oklch(from var(--accent) l c h); -} - -.maka-composer-right-controls .maka-model-switcher { - margin: 0; - max-width: min(180px, 28vw); - font-size: 10.5px; -} - -.maka-composer-right-controls .maka-model-switcher-trigger { - min-width: 100px; - max-width: min(180px, 28vw); - height: 26px; - gap: 4px; - padding: 0 9px; - border-color: var(--color-border-tertiary); - background: var(--background); - color: var(--foreground-65); -} - -.maka-composer-right-controls .maka-model-switcher-trigger:hover:not(:disabled):not([data-disabled]) { - background: var(--foreground-3); - color: var(--foreground); - border-color: oklch(from var(--foreground) l c h / 0.16); -} - -.maka-composer-right-controls .maka-model-switcher-label { - display: none; -} - -.maka-composer-right-controls .maka-model-switcher-value { - max-width: 128px; - color: inherit; - font-size: 10.5px; - font-weight: 500; -} - -.maka-composer-model-chip-text { - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -.maka-composer-model-status { - width: 6px; - height: 6px; - border-radius: 999px; - background: var(--destructive); - flex: 0 0 auto; -} - -.maka-composer-tool-button { - display: inline-flex; - align-items: center; - justify-content: center; - width: 26px; - height: 26px; - border: 0; - border-radius: 999px; - background: transparent; - color: var(--foreground-60); - transition: - background-color var(--duration-base) var(--ease-out-strong), - color var(--duration-base) var(--ease-out-strong), - transform var(--duration-emphasized) var(--ease-out-strong); -} - -.maka-composer-context-plus { - width: 26px; - height: 26px; - border: 1px solid var(--foreground-20); - border-radius: 999px; - background: transparent; -} - -.maka-composer-tool-button.maka-composer-mic-button { - width: 26px; - height: 26px; - border: 0; - background: transparent; -} - -/* PR-FE-BUG-HUNT-7 (kenji aesthetic-audit reminder 9, finding #1): - composer micro-interaction scales drifted way past the global - tactile press range (`button:active { scale(0.97) }`). 1.08 hover - and 0.94 active read as bouncy and call attention to the wrong - thing — these are quiet utility buttons at the bottom of the - composer, not primary CTAs. Pull back to 1.02 hover / 0.97 active - so they match the rest of the app. */ -.maka-composer-tool-button:hover:not(:disabled) { - color: var(--foreground); - background: var(--foreground-5); - transform: scale(1.02); -} - -.maka-composer-tool-button:active:not(:disabled) { - transform: scale(0.97); -} - -.maka-composer-tool-button:disabled { - opacity: 0.45; - cursor: not-allowed; -} - -.maka-composer-tool-button.maka-composer-mic-button:disabled { - border: 0; - background: transparent; - color: var(--foreground-55); - opacity: 1; -} - -/* Reference's round send button is an off-black pill gradient with a 1px - inner top highlight — a tiny physical sheen, not flat pure #000 (banned - per design-taste rules). Uses oklch off-black (charcoal) so the button - reads as premium machined hardware. */ -.maka-composer-send-button { - width: 30px; - height: 30px; - border-radius: 999px; - background: linear-gradient( - oklch(from var(--accent) calc(l - 0.10) c h), - oklch(from var(--accent) calc(l - 0.20) c h) - ); - color: oklch(1 0 0); - box-shadow: - inset 0 1px 0 oklch(1 0 0 / 0.18), - 0 8px 18px -14px oklch(from var(--accent) l c h / 0.5); - transition: - background var(--duration-base) var(--ease-out-strong), - transform var(--duration-emphasized) var(--ease-out-strong), - box-shadow 220ms var(--ease-out-strong); -} - -/* PR-FE-BUG-HUNT-7: send button is a primary CTA so it gets a hair - more travel than the tool buttons, but still inside the global - tactile press range. 1.06→1.03 hover, 0.96→0.97 active. */ -.maka-composer-send-button:hover:not(:disabled) { - background: linear-gradient( - oklch(from var(--accent) calc(l - 0.05) c h), - oklch(from var(--accent) calc(l - 0.15) c h) - ); - color: oklch(1 0 0); - transform: scale(1.03); - box-shadow: - inset 0 1px 0 oklch(1 0 0 / 0.18), - 0 10px 22px -14px oklch(from var(--accent) l c h / 0.55); -} - -.maka-composer-send-button:active:not(:disabled) { - transform: scale(0.97); - box-shadow: inset 0 1px 0 oklch(1 0 0 / 0.10); -} - -.maka-composer-send-button:disabled { - background: oklch(from var(--foreground) 0.72 0 h / 0.18); - color: oklch(1 0 0); - opacity: 0.72; - cursor: not-allowed; -} - -.maka-composer-workspace-row { - /* PR-PARCHMENT-HOME-2: must share the new composer card measure - (620px) so the "选择工作目录 ▾" pill stays aligned with the card - left edge above it. */ - width: min(var(--maka-chat-measure, 680px), 100%); - display: flex; - justify-content: flex-start; - box-sizing: border-box; - margin: 8px auto 0; -} - -.maka-composer-workspace-picker { - -webkit-app-region: no-drag; - appearance: none; - min-width: 0; - min-height: 24px; - display: inline-flex; - align-items: center; - gap: 5px; - padding: 4px 6px; - border: 0; - border-radius: 6px; - background: transparent; - color: var(--foreground-55); - font: inherit; - font-size: 11px; - line-height: 1.25; - text-align: left; - transition: color var(--duration-quick) var(--ease-out-strong); -} - -.maka-composer-workspace-picker:hover { - /* PR-REFERENCE-PIXEL-1 (WAWQAQ msg `f79de85f`): same gray-plate hover - visibility fix as nav-row — `--foreground-3` (3% mix into - background ≈ #f7f7f7) was indistinguishable from the gray plate - (≈ #ebebeb). Alpha overlay reads consistently regardless of - plate tone. */ - color: var(--foreground-80); - background: oklch(from var(--foreground) l c h / 0.06); -} - -.maka-composer-workspace-picker:focus-visible { - outline: none; - border-radius: 6px; - box-shadow: 0 0 0 3px oklch(from var(--accent) l c h / 0.14); -} - -.maka-composer-workspace-picker svg { - flex: 0 0 auto; -} - -.maka-composer-workspace-current { - min-width: 0; - max-width: 180px; - overflow: hidden; - color: var(--foreground-45); - text-overflow: ellipsis; - white-space: nowrap; -} - -/* Composer streaming hint — replaces the Enter/Shift+Enter help text while - * Maka is mid-stream. Pulsing dot signals "live", and the Stop button on - * the right swaps in as the only primary action so Send isn't ambiguous. */ -.maka-composer-streaming-hint { - display: inline-flex; - align-items: center; - gap: 8px; - color: var(--foreground-70); - font-size: 11px; -} - -/* Streaming indicator — 3-dot typing pattern (the center dot is the - element itself, the side dots are ::before / ::after). Each dot - bounces 4px up on its own offset cycle so the row reads as a - talking-back animation rather than a single pulsing blip. */ -.maka-composer-streaming-dot { - position: relative; - width: 5px; - height: 5px; - margin-inline: 9px; - border-radius: 50%; - background: var(--accent); - animation: maka-composer-stream-bounce 1.05s ease-in-out -0.2s infinite both; -} - -.maka-composer-streaming-dot::before, -.maka-composer-streaming-dot::after { - content: ""; - position: absolute; - top: 0; - width: 5px; - height: 5px; - border-radius: 50%; - background: var(--accent); - animation: maka-composer-stream-bounce 1.05s ease-in-out infinite both; -} - -.maka-composer-streaming-dot::before { - left: -9px; - animation-delay: -0.4s; -} - -.maka-composer-streaming-dot::after { - left: 9px; - animation-delay: 0s; -} - -@keyframes maka-composer-stream-bounce { - 0%, 60%, 100% { - transform: translateY(0); - opacity: 0.55; - } - 30% { - transform: translateY(-3px); - opacity: 1; - } -} - -@media (prefers-reduced-motion: reduce) { - .maka-composer-streaming-dot, - .maka-composer-streaming-dot::before, - .maka-composer-streaming-dot::after { - animation: none; - } -} - -/* PR-COMPOSER-PERMISSION-PULSE-0 (WAWQAQ msg `ed67a267`, skills - round task #116): paired with the 3-dot streaming bounce — when - the composer is disabled awaiting human permission decision, the - text gets a pulsing accent dot so the user sees "waiting on YOU" - instead of plain prose. Uses a slow opacity pulse (different - rhythm from streaming's bounce so the two states are not - confusable at a glance). Pattern from design-taste-frontend §8.3 - perpetual micro-interactions. */ -.maka-composer-permission-hint { - display: inline-flex; - align-items: center; - gap: 7px; -} - -.maka-composer-permission-dot { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--accent); - animation: maka-composer-permission-pulse 1.4s ease-in-out infinite; - flex-shrink: 0; -} - -@keyframes maka-composer-permission-pulse { - 0%, 100% { opacity: 0.35; transform: scale(0.85); } - 50% { opacity: 1; transform: scale(1); } -} - -@media (prefers-reduced-motion: reduce) { - .maka-composer-permission-dot { - animation: none; - opacity: 1; - } -} -.permissionDialog pre { - margin: 0; - max-height: 300px; - overflow: auto; -} - -.permissionDialog h2 { - margin: 0; -} - -.permissionDialog p { - margin: 2px 0 0; -} - -.permissionRemember { - display: grid; - grid-template-columns: auto 1fr; - align-items: center; - gap: 5px; - margin-top: 10px; - color: var(--foreground-70); - font-size: 12px; -} - -/* PR30 Permission dialog: per-reason iconography + per-tool summary block */ -.permissionDialog { - width: min(480px, calc(100vw - 48px)); -} - -.maka-permission-header { - display: grid; - grid-template-columns: 24px minmax(0, 1fr); - align-items: start; - gap: 8px; -} - -.maka-permission-icon { - width: 24px; - height: 24px; - display: grid; - place-items: center; - border-radius: 6px; - background: oklch(from var(--info) l c h / 0.10); - color: var(--info-text); -} - -.permissionDialog[data-tone="caution"] .maka-permission-icon { - background: oklch(from var(--info) l c h / 0.14); - color: var(--info-text); -} - -.permissionDialog[data-tone="destructive"] .maka-permission-icon { - background: oklch(from var(--destructive) l c h / 0.10); - color: var(--destructive-text); -} - -.permissionDialog[data-tone="destructive"] { - border: 1px solid oklch(from var(--destructive) l c h / 0.32); -} - -.maka-permission-tool { - font-family: var(--font-mono); - font-size: 11px; - padding: 0 5px; - border-radius: 4px; - background: var(--foreground-5); - color: var(--foreground-80); - border: 1px solid oklch(from var(--foreground) l c h / 0.03); -} - -.maka-permission-age { - color: var(--foreground-55); - font-size: 11px; - white-space: nowrap; -} - -.maka-permission-age[data-status="stale"] { - color: var(--warning-text); -} - -.maka-permission-age[data-status="expired"] { - color: var(--destructive-text); -} - -.maka-permission-body { - display: grid; - gap: 10px; -} - -.maka-permission-summary { - display: grid; - gap: 5px; -} - -.maka-permission-line { - margin: 0; - color: var(--foreground-80); - font-size: 11px; -} - -.maka-permission-path { - margin: 0; -} - -.maka-permission-path code { - font-family: var(--font-mono); - font-size: 11px; - padding: 1px 5px; - border-radius: 5px; - background: var(--foreground-5); - color: var(--foreground); - border: 1px solid oklch(from var(--foreground) l c h / 0.03); -} - -.maka-permission-command, -.maka-permission-preview { - margin: 0; - max-height: 180px; - overflow: auto; -} - -.maka-permission-meta { - margin: 0; - color: var(--foreground-60); - font-size: 11px; -} - -.maka-permission-hint { - border-radius: 6px; - background: oklch(from var(--info) l c h / 0.10); - color: var(--info-text); - padding: 6px 10px; - font-size: 11px; - line-height: 1.4; -} - -/* Single-line emphasis under the "记住本轮" checkbox when the action is - * destructive. Keeps the dialog body readable but draws an extra beat - * before the user clicks 我已确认,允许. */ -.maka-permission-danger-note { - margin: 0; - color: var(--destructive); - font-size: 12px; - line-height: 1.5; - font-weight: 600; -} - -.maka-permission-stale-note { - margin: 0; - border-radius: 6px; - padding: 6px 10px; - font-size: 11px; - line-height: 1.4; - color: var(--warning-text); - background: oklch(from var(--warning) l c h / 0.10); - border: 1px solid oklch(from var(--warning) l c h / 0.20); -} - -.maka-permission-stale-note[data-status="expired"] { - color: var(--destructive-text); - background: oklch(from var(--destructive) l c h / 0.10); - border-color: oklch(from var(--destructive) l c h / 0.24); -} - -.maka-permission-diff { - display: grid; - gap: 6px; -} - -.maka-permission-diff > div { - display: grid; - gap: 2px; -} - -.maka-permission-diff-tag { - display: inline-flex; - align-items: center; - width: fit-content; - padding: 0 5px; - border-radius: 4px; - font-size: 9px; - font-weight: 600; - letter-spacing: 0; - text-transform: none; -} - -.maka-permission-diff-tag[data-side="old"] { - background: oklch(from var(--destructive) l c h / 0.10); - color: var(--destructive-text); -} - -.maka-permission-diff-tag[data-side="new"] { - background: oklch(from var(--success) l c h / 0.10); - color: var(--success-text); -} - -.maka-permission-raw { - border: 1px solid var(--border); - border-radius: 6px; - background: var(--foreground-2); -} - -.maka-permission-raw > summary { - list-style: none; - padding: 5px 10px; - color: var(--foreground-60); - font-size: 11px; -} - -.maka-permission-raw > summary::-webkit-details-marker { display: none; } -.maka-permission-raw > summary::marker { content: ''; } - -.maka-permission-raw[open] > summary { - border-bottom: 1px solid var(--border); -} - -.maka-permission-raw .maka-code { - margin: 0; - border: 0; - border-radius: 0 0 6px 6px; - background: var(--foreground-2); - max-height: 180px; - overflow: auto; -} - -.settingsSurface { - min-height: 0; - height: 100%; - display: grid; - grid-template-rows: auto minmax(0, 1fr); - overflow: hidden; - background: var(--background); -} - -.settingsModalBackdrop { - position: fixed; - inset: 0; - z-index: var(--z-modal); - display: grid; - place-items: center; - /* PR-UI-LAYOUT-2: stronger backdrop blur + slightly darker scrim - * so the underlying chat reads as "paused behind a dialog" - * (matches the reference design's settings screenshot 2/3/4 where the chat is - * still semi-visible but clearly dimmed). Was: blur 8px + 0.34 - * scrim. Now: blur 14px + 0.42 scrim. The dialog itself shrinks - * (see .settingsModal below) so the visible "frame" of chat - * around the dialog grows — that gives the modal feeling. */ - background: oklch(0.40 0.01 80 / 0.42); - backdrop-filter: blur(14px) saturate(0.85); - -webkit-backdrop-filter: blur(14px) saturate(0.85); - padding: 34px; - /* Modern @starting-style entrance — emil-design-eng prefers transitions - over keyframes for modals so the animation is interruptible. */ - opacity: 1; - transition: opacity 200ms var(--ease-out-strong); - overscroll-behavior: contain; -} - -@starting-style { - .settingsModalBackdrop { - opacity: 0; - } -} - -.settingsModal { - /* Modal-mode Settings (when the page mode override below is not set). Sized - to match the upstream reference layout's settings dialog (~88vw / 76vh, - ~1100×680 cap). */ - width: min(88vw, 1100px); - max-width: calc(100vw - 64px); - height: min(76vh, 680px); - min-width: min(760px, calc(100vw - 64px)); - min-height: 520px; - overflow: hidden; - /* Chrome derived from --card-* tokens (atlas §4 + Phase 2A recipe). The - dialog edge is now a tight 8px reference-aligned radius with a single - 1px hairline border, a Doppelrand inner highlight and a soft 4% lift — - the same recipe used by every other page card, scaled to a bigger - surface. The previous double 28px / 8px black shadows read as "modal - popup heavy"; the new single lift reads as "premium card sitting on a - dimmed canvas". */ - border: 1px solid var(--card-border-color); - border-radius: 8px; - background: var(--card-bg); - box-shadow: - var(--card-shadow), - var(--card-highlight), - 0 28px 64px oklch(0 0 0 / 0.10); - transform: scale(1); - opacity: 1; - transition: - transform 240ms var(--ease-out-strong), - opacity 200ms var(--ease-out-strong); -} - -@starting-style { - .settingsModal { - transform: scale(0.96); - opacity: 0; - } -} - -.settingsModal.settingsPage { - position: fixed; - inset: 0; - width: auto; - max-width: none; - height: auto; - min-width: 0; - min-height: 0; - border: 0; - border-radius: 0; - box-shadow: none; - background: var(--agents-layout-bg); - /* PR-FE-BUG-HUNT-9 (kenji audit reminder 9, finding #4): - was bare `z-index: 35`. Tokenized to `--z-settings-fullpage`. - 35 sits between `--z-titlebar` (40) and `--z-sticky` (20) so - the OS titlebar still owns top of the stack — preserved - visual behavior exactly. */ - z-index: var(--z-settings-fullpage); - overflow: hidden; - transform: none; - transition: opacity 160ms var(--ease-out-strong); -} - -@starting-style { - .settingsModal.settingsPage { - /* PR-AUDIT-CLEANUP-BATCH-2: the matching `.settingsModal.settingsPage` - rule only transitions `opacity` (line ~7026), so a `transform: none` - here was a no-op — kept just the opacity start-style. */ - opacity: 0; - } -} - -.settingsSurface[data-modal="true"] { - position: relative; - background: transparent; - grid-template-columns: 240px minmax(0, 1fr); - grid-template-rows: minmax(0, 1fr); - gap: 0; -} - -.settingsSidebar { - min-height: 0; - width: var(--sidebar-width, 240px); - display: grid; - padding: 0; - background: transparent; -} - -.settingsSidebarInner { - min-height: 0; - display: grid; - grid-template-rows: auto minmax(0, 1fr); - /* PR-SETTINGS-REVIEW-0 (2026-06-23, WAWQAQ msg `1b2d4e83`): traffic - light row sits at y=14–28 on macOS; 22px sidebar top padding put - the 设置 brand right against it. Bump to 52px so the brand label - starts well below the traffic lights, matching reference. */ - padding: 52px 10px 12px 14px; - background: transparent; -} - -/* PR-SETTINGS-REVIEW-0 (WAWQAQ msg `e1194266`): left-aligned `返回应用` - in place of the right-side X. Sits above the 设置 brand. */ -.settingsBackButton { - /* WAWQAQ msg `dd21e793` 2026-06-25: the "返回应用" link previously - used 4px 8px padding + 13px / weight 500 + 6px radius + 4px gap + - `align-self: flex-start` — none of which matched `.settingsNavItem` - below it (38px height, 12px h-pad, 7px radius, 14px / weight 500, - 12px gap). Combined with `inline-flex` + no width, the back link - looked intrinsically sized and visually centered, while every nav - row below was full-width, left-aligned with the same glyph + label - rhythm. Match `.settingsNavItem` exactly so the row reads as part - of the same vertical list. */ - width: calc(100% - 8px); - height: 38px; - min-height: 38px; - display: flex; - align-items: center; - gap: 12px; - margin: 0 4px 4px; - padding: 6px 12px; - border-radius: 7px; - background: transparent; - color: var(--foreground-70); - font-size: 14px; - font-weight: 500; - text-align: left; - justify-content: initial; - -webkit-app-region: no-drag; - transition: background-color var(--duration-base) var(--ease-out-strong), color var(--duration-base) var(--ease-out-strong); -} -.settingsBackButton:hover { - background: oklch(from var(--foreground) l c h / 0.05); - color: var(--foreground); -} -.settingsBackButton:focus-visible { - /* PR-SETTINGS-NAV-FOCUS-0 (round 14/15, WAWQAQ msg `f7e9d166`): the - `← 返回应用` link is the only way to leave Settings without a - mouse; without a visible focus ring keyboard-only users couldn't - tell it was selected. Use the same 2px accent outline + - `:focus-visible` recipe as the settings rows. */ - outline: 2px solid var(--accent); - outline-offset: 2px; - color: var(--foreground); -} - -.settingsSidebar header { - min-height: 36px; - display: flex; - align-items: center; - padding: 0 10px; -} - -.settingsSidebar header span { - display: inline-flex; - align-items: center; - gap: 4px; - color: var(--foreground); - font-size: 18px; - font-weight: 700; -} - -.settingsSidebar header .maka-shortcut-kbd { - font-size: 10px; - padding: 0 4px; -} - -.settingsSidebar nav { - min-height: 0; - display: grid; - align-content: start; - gap: 10px; - overflow: auto; - padding: 8px 0 0; -} - -.settingsNavGroup { - display: grid; - gap: 2px; -} - -.settingsNavGroupLabel { - /* PR-SETTINGS-SIDEBAR-SPACIOUS-0 (WAWQAQ msg `f7e9d166` round 2/15): - reference group labels are softer + more spaced out. Larger - leading top padding so each group reads as its own visual zone - instead of jamming against the prior item. */ - display: flex; - align-items: center; - font-size: 11px; - font-weight: 500; - letter-spacing: 0.05em; - text-transform: none; - color: var(--foreground-40); - padding: 18px 12px 6px; -} - -.settingsNavGroupLabel::after { - content: none; -} - -.settingsNavItem { - /* PR-SETTINGS-SIDEBAR-SPACIOUS-0: roomier nav row matching reference. - PR-SETTINGS-CSS-ROOT-CLEANUP-0 (WAWQAQ msg `57de86ae`): the previous - `grid-template-columns: 24px minmax(0,1fr) auto` allocated a trailing - `auto` track for the Beta badge, but on the 11 rows without a - badge the empty auto track still consumed a 12px gap, so the label - ran 12px short. Switched to flex — glyph is fixed-width, label - fills, badge sits right-aligned naturally. No phantom gap. */ - width: calc(100% - 8px); - height: 38px; - min-height: 38px; - display: flex; - align-items: center; - gap: 12px; - border: 0; - border-radius: 7px; - background: transparent; - box-shadow: none; - color: var(--foreground-70); - margin-inline: 4px; - padding: 6px 12px; - text-align: left; - justify-content: initial; - font-size: 14px; - transition: background-color var(--duration-base) var(--ease-out-strong), color var(--duration-base) var(--ease-out-strong); -} - -.settingsNavItem > .settingsNavGlyph { - flex-shrink: 0; -} - -.settingsNavItem > strong { - flex: 1 1 auto; - min-width: 0; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} - -/* PR-SETTINGS-NAV-REGROUP-0 (WAWQAQ msg `a9ef0d5d`): small chip on nav - items that are still in beta — matches reference's pattern of - surfacing maturity inline rather than relegating to a separate - release notes view. */ -.settingsNavBadge { - display: inline-flex; - align-items: center; - height: 18px; - padding: 0 6px; - border-radius: 4px; - background: oklch(from var(--accent) l c h / 0.12); - color: var(--accent); - font-size: 10px; - font-weight: 600; - letter-spacing: 0.04em; - text-transform: none; -} - -/* PR-SETTINGS-CSS-ROOT-CLEANUP-0 (WAWQAQ msg `57de86ae`): the previous - reset listed `[data-active="true"]` in its selector and used - `!important` to wipe shadow. The active rule then had to use its own - `!important` to put a 3-px accent bar back. Two `!important`s fighting - over the same property = specificity war. Drop the active selector - from the reset and remove the `!important` from both places. The - active rule below is the single source of truth for nav shadow. */ -.settingsSidebar .settingsNavItem, -.settingsSidebar .settingsNavItem:hover { - border: 0; - box-shadow: none; - transform: none; -} - -.settingsNavItem:hover { - background: var(--foreground-5); - color: var(--foreground); -} - -.settingsNavItem[data-active="true"] { - /* PR-SETTINGS-NAV-FOCUS-0 (round 14/15): bump the active state from - the muted `--settings-nav-row-selected-bg` token to a slightly - more visible 6.5% foreground overlay + 500 weight. - WAWQAQ msg 49bd00e1: keep the selected row neutral. A leading - accent rail reads like a stray status marker in the Settings nav. */ - background: oklch(from var(--foreground) l c h / 0.065); - color: var(--foreground); - font-weight: 500; - box-shadow: none; -} - -.settingsNavItem:focus-visible { - outline: 2px solid var(--accent); - outline-offset: -2px; - background: oklch(from var(--accent) l c h / 0.04); -} - -.settingsNavItem[data-active="true"] .settingsNavGlyph { - color: var(--foreground); -} - -.settingsNavItem:disabled { - cursor: default; - opacity: 0.45; -} - -.settingsNavGlyph { - /* PR-SETTINGS-SIDEBAR-SPACIOUS-0: slightly bigger glyph track + svg - so the icon doesn't read as a tiny dot. */ - width: 24px; - height: 24px; - display: grid; - place-items: center; - color: var(--foreground-60); -} - -.settingsNavGlyph svg { - width: 17px; - height: 17px; -} - -/* PR-UI-11 (@yuejing 2026-05-22): inactive glyph stays muted; active - * glyph is overridden above to `--accent` for selection visibility. */ - -.settingsNavItem strong { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - font-size: 12px; - font-weight: 600; -} - -.settingsNavItem { - grid-template-columns: 20px minmax(0, 1fr) auto; -} - -.settingsFeatureStatusPage { - display: grid; - align-content: start; - gap: 10px; -} - -/* Status banner at the top of feature settings pages. */ -.settingsFeatureStatusBanner { - display: inline-flex; - align-items: center; - gap: 8px; - padding: 8px 12px; - border: 1px dashed oklch(from var(--info) l c h / 0.32); - border-radius: 10px; - background: oklch(from var(--info) l c h / 0.06); - color: var(--foreground-80); - font-size: 12.5px; - line-height: 1.5; - width: fit-content; - max-width: 100%; -} -.settingsFeatureStatusBanner strong { - color: var(--info-text); - font-weight: 700; - letter-spacing: 0.02em; -} -.settingsFeatureStatusBannerDot { - width: 8px; - height: 8px; - border-radius: 50%; - background: var(--info); - flex: 0 0 auto; -} - -.settingsFeatureStatusHero { - display: grid; - grid-template-columns: 36px minmax(0, 1fr); - align-items: start; - gap: 10px; - padding: 10px 12px; - border: 1px solid var(--border); - border-radius: 8px; - background: var(--foreground-3); -} - -.settingsFeatureStatusIcon { - width: 36px; - height: 36px; - display: grid; - place-items: center; - border-radius: 8px; - background: oklch(from var(--accent) l c h / 0.08); - color: var(--accent); -} - -.settingsFeatureStatusHero h3 { - margin: 0 0 3px; - color: var(--foreground); - font-size: 13px; - font-weight: 600; -} - -.settingsFeatureStatusHero p { - margin: 0; - max-width: 56ch; - color: var(--foreground-70); - font-size: 11px; - line-height: 1.45; -} - -.settingsFeatureStatusList { - margin: 0; - padding: 0 0 0 14px; - display: grid; - gap: 4px; - color: var(--foreground-70); - font-size: 11px; - line-height: 1.45; -} - -.settingsFeatureStatusList li::marker { - color: var(--foreground-40); -} - -.settingsFeatureStatusHeroHeading { - display: flex; - align-items: center; - flex-wrap: wrap; - gap: 8px; - margin: 0 0 6px; -} - -.settingsFeatureStatusHeroHeading h3 { - margin: 0; -} - -/* PR daily-review-bundled (WAWQAQ msg `afbe542d` 2026-06-25 + - @kenji audit finding #6): the Daily Review settings page used to - stack a banner + intro hero card + settings rows + "try it now" - hero card — too much promo chrome for a workbench settings - surface. The unified `.settingsPageFooterActions` is a single - right-aligned action row that the page renders below the rows - (open Daily Review · generate now · deep). Keep the action set - visible and uniform regardless of how many ops the page exposes. */ -.settingsPageFooterActions { - display: flex; - justify-content: flex-end; - flex-wrap: wrap; - gap: 8px; - margin-top: 16px; -} - -/* PR audit2-bundled (@kenji audit #5 msg `e4cfbfb0`): names for the - inline `style={{ marginTop: N }}` patches that were sprinkled around - settings surfaces. Keeps the spacing decision discoverable + locked - in the design token surface instead of buried in JSX. */ -.settingsSurfaceAlert { - margin-top: 12px; -} - -.settingsNoticeAction { - margin-top: 8px; -} - -/* PR daily-review-bundled (@kenji audit finding #5): semantic width - bucket on the row, not a class selector keyed off the input - className. Different settings rows ask for different control - widths (time-pickers want compact, free-text selects want a 320px - cap); keying off the row makes the contract local and obvious. */ -.settingsRow[data-control-width="compact"] > input, -.settingsRow[data-control-width="compact"] > .settingsTimeInput { - max-width: 140px; - justify-self: end; -} - -.settingsRow[data-control-width="select"] > .settingsSelectTrigger { - justify-self: end; -} - -.settingsFeatureStatusBadge { - display: inline-flex; - align-items: center; - padding: 2px 8px; - border-radius: 999px; - background: oklch(from var(--accent) l c h / 0.12); - color: var(--accent); - font-size: 11px; - font-weight: 600; - letter-spacing: 0.02em; - white-space: nowrap; -} - -.settingsLoadingSkeleton { - padding: 8px 0; - max-width: 540px; -} - -.providersLoading { - display: grid; - align-content: start; - gap: 14px; - padding: 8px 4px; -} - -.providersLoadingStrip { - display: grid; - gap: 8px; -} - -.providersLoadingGrid { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(198px, 1fr)); - gap: 10px; -} - -/* PR-SETTINGS-REVIEW-0 (2026-06-23, WAWQAQ msgs `f97ed407` + `8577326c`): - pull the page header into the same centered max-w-3xl column as the - content. Before this, the header sat in `.settingsMainPane` padding - (~34px from pane edge), while the row cards lived in the centered - 768px column (~152px from pane edge at 1280 viewport) — the title - and content were visibly misaligned. Drop the mainpane padding to - thin top/bottom so the header + content can both share the centered - column. */ -/* PR-SETTINGS-RESTORE-SURFACE-0 (WAWQAQ msg `32ed9490` correction): - previous PR over-corrected — I read "no seam" as "no plate", but - reference's content surface is still a lighter-bg plate vs the - sidebar. The seam-between rule is: no visible BORDER line between - sidebar and content, but the content does have its own background - plate + rounded corners + small floating margin. Restore the - surface; just no border. */ -.settingsMainPane { - position: relative; - min-width: 0; - min-height: 0; - display: grid; - grid-template-rows: auto minmax(0, 1fr); - margin: var(--agents-content-area-gap) var(--agents-content-area-gap) var(--agents-content-area-gap) 0; - border: 0; - border-radius: var(--agents-content-area-radius); - background: var(--agents-content-area-bg); - box-shadow: none; - overflow: hidden; - /* Traffic-light-aligned top padding so the page title sits at the - same Y baseline as the sidebar brand. */ - padding: 52px 0 0; -} - -/* PR-SETTINGS-REVIEW-0 fix-2: max-width centering on a grid child - didn't actually align the H2 with the centered column underneath. - Use the same edge math the content column uses - (`calc((100% - 768px) / 2 + 24px)`) so the header content lines up - with row cards regardless of viewport width. */ -.settingsPageHeader { - min-height: 36px; - padding: 0 max(24px, calc((100% - 768px) / 2 + 24px)); - display: flex; - align-items: center; - /* X close button moved to the sidebar `返回应用` — header hosts the - page title only, left-aligned. */ - justify-content: flex-start; - gap: 18px; -} - -.settingsPageHeaderTitleStack { - display: grid; - gap: 6px; -} - -.settingsPageHeader h2 { - /* PR-SETTINGS-PAGE-HEADER-POLISH-0 (round 12/15): tighten the h2 - with negative tracking + slightly softer weight. - PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15): `text-wrap: - balance` so 1-2 word titles don't orphan on long pages and - 2-word titles like 「记忆与回顾」don't break across an awkward - line. */ - margin: 0; - color: var(--foreground); - font-size: 26px; - font-weight: 650; - letter-spacing: -0.012em; - line-height: 1.2; - text-wrap: balance; -} - -/* PR-SETTINGS-PAGE-SUBTITLE-0 (round 4/15) + round 12/15 cap + - round 15/15 `text-wrap: pretty` so the last line isn't a single - orphan word (per baseline-ui typography rule). */ -.settingsPageHeaderDescription { - margin: 0; - max-width: 56ch; - color: var(--foreground-55); - font-size: 14px; - line-height: 1.5; - text-wrap: pretty; -} - -.settingsPageContent { - min-height: 0; - overflow: hidden; -} - -.settingsPageContentViewport { - height: 100%; - overscroll-behavior: contain; -} - -/* PR-SETTINGS-SHELL-OWNS-LAYOUT-0 (2026-06-23, WAWQAQ msg `70c224f4`): - the page chrome (max-width column + side padding + top/bottom gutter) - used to live on each sub-page's own wrapper (settingsStructuredPage, - settingsAboutPage, settingsPermissionPage, settingsHealthPage…), - forcing per-page CSS edits whenever the chrome shifts. The shell - now owns it via `.settingsPageContentInner` — the single - OverlayScrollArea inner div every page renders through. Sub-pages - only manage their own row stack. - - WAWQAQ msg `eafc18a1` correction: reference rows DO have 1px borders - + small radius, not flat. Earlier flat-row recipe (PR-PAGE-BODY-0) - was wrong; this PR reinstates per-row borders with the reference - recipe — 1px subtle border, 8px radius, white-ish bg, 8px gap. */ -.settingsPageContentInner { - max-width: 768px; - margin: 0 auto; - padding: 40px 24px 64px; -} - -/* PR-SETTINGS-CSS-ROOT-CLEANUP-0 (WAWQAQ msg `57de86ae`): the renamed - motion token block introduced in round 15 duplicated the existing - `--ease-out-strong` (cubic-bezier(0.16,1,0.3,1)) already declared in - `maka-tokens.css`. The dup was cargo-culted because the round-15 PR - didn't grep first. Removed — `--ease-out-strong` is now the single - easing token used across the renderer (3000+ consumers). The - settings `:active` rule below uses it directly. */ - -/* PR-SETTINGS-NO-PANE-BORDER-0 (WAWQAQ msg `d0e7dfb3`): nested - card-in-card was the previous problem — `.settingsStructuredPage` - was a card AND it contained `` cards AND orphan - `.settingsFormRow` direct children. Reference shows multiple - GROUPED cards stacked vertically. So `.settingsStructuredPage` is - no longer a card — it's just the vertical container with gap, and - `.settingsRows` is the ONLY card primitive. */ -.settingsStructuredPage { - display: grid; - align-content: start; - gap: 16px; - background: transparent; -} - -/* Nested `.settingsStructuredPage` (merged pages like 外观 stack two - sub-pages, each wrapping in their own `.settingsStructuredPage`): - the inner one just passes through. */ -.settingsStructuredPage .settingsStructuredPage { - gap: 16px; -} - -/* PR-SETTINGS-SWEEP-0: section heading for merged pages. Mirrors - reference's small uppercase sub-section tag. - PR-SETTINGS-REVIEW-0 alignment fix: flush-left with the card stack - (cards carry their own L padding internally), and bump the heading - to 12/2px tracking so it reads as a real sub-section break rather - than a hairline. */ -.settingsSectionHeading { - margin: 24px 2px 10px; - color: var(--foreground-55); - font-size: 12px; - font-weight: 600; - letter-spacing: 0.08em; - text-transform: uppercase; -} -.settingsStructuredPage > .settingsSectionHeading:first-child { - margin-top: 0; -} - - -.settingsEmptyState { - min-height: 240px; - display: grid; - place-items: center; - color: var(--foreground-50); - font-size: 13px; -} - -/* PR-SETTINGS-ROW-SPACIOUS-0 (2026-06-23, WAWQAQ msg `f7e9d166`): - reference rows are MUCH more spacious than maka's. WAWQAQ's screenshot - of QoderWork's preferences card showed rows ~80–90px tall with - noticeable internal padding. Bumped: min-height 56→72, padding - 16/20 → 20/24, gap inside row 16→20, label 14→15px, hint 12→13. */ -.settingsFormRow { - min-height: 72px; - display: flex; - align-items: center; - justify-content: space-between; - gap: 20px; - padding: 20px 24px; - border: 0; - border-bottom: 1px solid oklch(from var(--foreground) l c h / 0.06); - border-radius: 0; - background: transparent; - transition: background var(--duration-base) var(--ease-out-strong); -} - -.settingsFormRow:last-child { - border-bottom: 0; -} - -.settingsFormRow:hover { - background: oklch(from var(--foreground) l c h / 0.025); -} - -/* PR-SETTINGS-MOTION-TYPO-TOKENS-0 (round 15/15) — tactile press - feedback. 12-principles `physics-active-state` + Taste-Skill + - UIDB all converge on `:active { scale(0.98) }` as the cheapest way - to make UI feel handled vs simulated. Applied only when reduced- - motion is not preferred — the @media block above already strips - transition; here we keep `transform` declarations so the - `:active` *snap* still fires (it's instant, not animated). */ -/* Self-review: `.settingsFormRow` and `.settingsRow` are
- containers wrapping //