@import "@earendil-works/pi-web-ui/app.css"; @font-face { font-family: "B612"; src: url("./fonts/B612-Regular.ttf") format("truetype"); font-style: normal; font-weight: 400; font-display: swap; } @font-face { font-family: "B612"; src: url("./fonts/B612-Bold.ttf") format("truetype"); font-style: normal; font-weight: 700; font-display: swap; } :root { --app-font-family: "B612", sans-serif; --app-font-size: 14px; --app-line-height: 1.45; --app-font-weight-normal: 400; --app-font-weight-strong: 700; --app-radius: 8px; --app-space-1: 4px; --app-space-2: 8px; --app-space-3: 12px; --app-space-4: 16px; --accent-foreground: oklch(45% 0.18 155); --sidebar-width: 300px; font-family: var(--app-font-family); font-size: var(--app-font-size); line-height: var(--app-line-height); } .dark { --accent-foreground: oklch(72% 0.19 155); } html, body { margin: 0; padding: 0; height: 100%; overflow: hidden; } body, button, input, select, textarea, message-editor, message-list, streaming-message-container, theme-toggle { font-family: var(--app-font-family) !important; font-size: var(--app-font-size) !important; line-height: var(--app-line-height) !important; } button, input, select, textarea { font: inherit; } /* Keep the whole UI at one text size even where Tailwind utilities or component defaults request smaller/larger UI text. */ .text-xs, .text-sm, .text-\[10px\], .session-item-title, .session-item-preview, .session-item-meta, .model-button, .model-filter, .thinking-select, .model-option, .model-scope-row, .model-scope-toggle, .status-pill, .tool-count, .empty-state, .error-banner, .sidebar-title, .sidebar-empty, .sidebar-search-input, .sidebar-load-more, .message-load-older { font-size: var(--app-font-size) !important; line-height: var(--app-line-height) !important; } .font-semibold, .sidebar-title, .session-item-title { font-weight: var(--app-font-weight-strong) !important; } #app { height: 100%; display: flex; flex-direction: row; overflow: hidden; } .app-topbar { position: relative; min-height: 50px; flex-wrap: wrap; } .topbar-menu-button { color: var(--foreground); } .topbar-mobile-controls-button { display: none; align-items: center; justify-content: center; padding: 6px; border-radius: var(--app-radius); border: 1px solid var(--border); background: var(--secondary); color: var(--secondary-foreground); cursor: pointer; } .topbar-control-menu { display: contents; } .topbar-skills-link { display: inline-flex; align-items: center; justify-content: center; padding: 5px 10px; border-radius: var(--app-radius); border: 1px solid color-mix(in oklab, var(--accent-foreground) 70%, black); background: color-mix(in oklab, var(--accent-foreground) 86%, black); color: white; text-decoration: none; font-weight: var(--app-font-weight-strong); white-space: nowrap; } .topbar-skills-link:hover, .topbar-skills-link:focus-visible { background: color-mix(in oklab, var(--accent-foreground) 74%, black); color: white; } .file-preview-page { min-height: 100%; width: 100%; overflow: auto; background: var(--background); color: var(--foreground); } .file-preview-header { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0.8rem 1rem; background: var(--primary); color: var(--primary-foreground); } .file-preview-header h1 { margin: 0; font-size: 1rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .file-preview-actions { display: flex; align-items: center; gap: 0.75rem; } .file-preview-header a, .file-preview-header button { color: inherit; } .file-preview-header button { border: 1px solid currentColor; border-radius: 6px; background: transparent; cursor: pointer; font: inherit; padding: 0.35rem 0.6rem; } .file-preview-header button:hover { background: color-mix(in oklab, currentColor 14%, transparent); } .file-preview-path { padding: 0.6rem 1rem; border-bottom: 1px solid var(--border); background: var(--card); font-family: ui-monospace, monospace; overflow: auto; } .file-preview-body { max-width: 980px; margin: 1rem auto; padding: 1.5rem; background: var(--card); border: 1px solid var(--border); border-radius: 8px; } .file-preview-tabs { display: flex; gap: 0.35rem; margin: -0.5rem -0.5rem 1rem; padding: 0.25rem; border-bottom: 1px solid var(--border); } .file-preview-tabs button { border: 1px solid transparent; border-radius: 6px; background: transparent; color: var(--muted-foreground); cursor: pointer; font: inherit; font-weight: 700; padding: 0.4rem 0.65rem; } .file-preview-tabs button:hover, .file-preview-tabs button.active { border-color: var(--border); background: var(--muted); color: var(--foreground); } .file-preview-content { min-width: 0; } .file-preview-pdf { display: block; width: 100%; min-height: 70vh; border: 0; } .file-preview-image { display: block; max-width: 100%; max-height: 75vh; margin: auto; } .file-preview-text { margin: 0; white-space: pre-wrap; word-break: break-word; font-family: ui-monospace, monospace; } .file-preview-copy-error { align-self: center; color: var(--destructive); font-size: 0.8rem; margin-left: auto; } .workspace-file-link { display: inline-flex; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--primary); } /* ── Sidebar ── */ .sidebar-overlay { position: fixed; inset: 0; z-index: 40; background: rgba(0, 0, 0, 0.5); opacity: 0; pointer-events: none; transition: opacity 200ms ease; } .sidebar-overlay.open { opacity: 1; pointer-events: auto; } .sidebar-panel { position: fixed; top: 0; left: 0; bottom: 0; z-index: 50; width: var(--sidebar-width); max-width: 85vw; transform: translateX(-100%); transition: transform 200ms ease; display: flex; flex-direction: column; background: var(--card); border-right: 1px solid var(--border); box-shadow: 4px 0 24px rgba(0, 0, 0, 0.25); } .sidebar-panel.open { transform: translateX(0); } .sidebar-header { display: flex; align-items: center; justify-content: space-between; padding: var(--app-space-3) var(--app-space-4); border-bottom: 1px solid var(--border); flex-shrink: 0; } .sidebar-title { color: var(--foreground); } .icon-button { padding: 6px; border-radius: var(--app-radius); border: none; background: transparent; cursor: pointer; color: var(--foreground); display: flex; } .icon-button:hover { background: var(--accent); } .sidebar-empty { display: flex; align-items: center; justify-content: center; padding: 48px 0; color: var(--muted-foreground); } .sidebar-loading-more { padding: var(--app-space-3) 0; } .sidebar-search { padding: var(--app-space-2) var(--app-space-3); border-bottom: 1px solid var(--border); background: var(--card); } .sidebar-search-input { width: 100%; padding: 7px 9px; border: 1px solid var(--border); border-radius: var(--app-radius); background: var(--background); color: var(--foreground); outline: none; } .sidebar-search-input:focus { border-color: var(--ring); box-shadow: 0 0 0 2px color-mix(in oklab, var(--ring) 22%, transparent); } .sidebar-load-more { display: block; width: calc(100% - 24px); margin: var(--app-space-3) auto; padding: var(--app-space-2); border: 1px solid var(--border); border-radius: var(--app-radius); background: var(--secondary); color: var(--secondary-foreground); cursor: pointer; } .sidebar-load-more:hover { background: var(--accent); } /* Session items */ .session-item-row { display: flex; align-items: stretch; width: 100%; border-bottom: 1px solid var(--border); border-left: 3px solid transparent; transition: background-color 150ms ease; } .session-item-row:hover { background: color-mix(in oklab, var(--accent) 40%, transparent); } .session-item-row.active { background: color-mix(in oklab, var(--accent) 25%, transparent); border-left-color: oklch(65% 0.2 155); } .session-item { display: block; flex: 1 1 auto; min-width: 0; text-align: left; padding: 10px 10px 10px 11px; border: none; background: transparent; cursor: pointer; } .session-action-button { display: flex; align-items: center; justify-content: center; width: 34px; padding: 0; border: none; background: transparent; color: var(--muted-foreground); cursor: pointer; opacity: 0.45; transition: opacity 150ms ease, color 150ms ease, background-color 150ms ease; } .session-item-row:hover .session-action-button, .session-action-button:focus-visible { opacity: 1; } .session-action-button:hover { color: var(--foreground); background: color-mix(in oklab, var(--accent) 50%, transparent); } .session-rename-form { display: flex; align-items: stretch; width: 100%; min-width: 0; padding-left: 8px; } .session-rename-input { flex: 1 1 auto; min-width: 0; margin: 7px 4px 7px 0; padding: 4px 6px; border: 1px solid var(--border); border-radius: 6px; background: var(--background); color: var(--foreground); outline: none; } .session-rename-input:focus { border-color: color-mix(in oklab, var(--primary, oklch(65% 0.2 155)) 70%, var(--border)); } .session-item-title { color: var(--foreground); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .session-item-preview { color: var(--muted-foreground); margin-top: 3px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } .session-item-meta { color: var(--muted-foreground); margin-top: 4px; display: flex; align-items: center; gap: 8px; opacity: 0.7; } .progressive-tool-card { border: 1px solid var(--border); border-radius: 8px; background: var(--card); color: var(--card-foreground); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); overflow: hidden; } .progressive-tool-header { width: 100%; display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; padding: 0.6rem 0.7rem; border: none; background: transparent; color: var(--muted-foreground); font: inherit; font-size: 0.875rem; text-align: left; cursor: pointer; } .progressive-tool-header:hover { color: var(--foreground); background: color-mix(in oklab, var(--accent) 35%, transparent); } .progressive-tool-title { display: inline-flex; align-items: center; gap: 0.5rem; min-width: 0; font-weight: 600; } .progressive-tool-title span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .progressive-tool-call-summary { min-width: 0; color: var(--muted-foreground); font-weight: 400; opacity: 0.85; } .progressive-tool-call-summary::before { content: "—"; margin-right: 0.5rem; opacity: 0.7; } .progressive-tool-state { flex: 0 0 auto; font-size: 0.75rem; opacity: 0.75; } .progressive-tool-status-dot { width: 0.55rem; height: 0.55rem; border-radius: 999px; background: var(--muted-foreground); } .progressive-tool-card.running .progressive-tool-status-dot, .progressive-tool-card.waiting .progressive-tool-status-dot { background: var(--primary, #2563eb); animation: pulse 1.2s ease-in-out infinite; } .progressive-tool-card.complete .progressive-tool-status-dot { background: #16a34a; } .progressive-tool-card.error .progressive-tool-status-dot { background: var(--destructive, #dc2626); } .progressive-tool-body { display: flex; flex-direction: column; gap: 0.65rem; padding: 0 0.7rem 0.7rem; } .progressive-tool-section-label { margin-bottom: 0.25rem; color: var(--muted-foreground); font-size: 0.75rem; font-weight: 600; } @keyframes pulse { 0%, 100% { opacity: 0.45; } 50% { opacity: 1; } } .compaction-notice { display: flex; align-items: center; gap: var(--app-space-2); padding: var(--app-space-2) var(--app-space-4); border-bottom: 1px solid var(--border); color: var(--muted-foreground); } .compaction-notice-complete { opacity: 0.82; } .compaction-spinner { width: 0.8rem; height: 0.8rem; border: 2px solid currentColor; border-right-color: transparent; border-radius: 999px; animation: spin 0.8s linear infinite; } @keyframes spin { to { transform: rotate(360deg); } } .startup-card { max-width: 52rem; margin: auto; padding: clamp(1rem, 4vw, 2rem); border: 1px solid var(--border); border-radius: var(--app-radius); background: var(--card); color: var(--card-foreground); } .startup-card h1, .startup-card h2 { margin: 0; } .startup-card > p { margin: var(--app-space-2) 0 var(--app-space-4); color: var(--muted-foreground); } .startup-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--app-space-4); } .startup-section { margin-top: var(--app-space-4); } .startup-section h2 { margin-bottom: var(--app-space-2); font-size: inherit; } .startup-section dl { margin: 0; } .startup-section dl div { display: grid; grid-template-columns: 9rem minmax(0, 1fr); gap: var(--app-space-2); } .startup-section dt { color: var(--muted-foreground); } .startup-section dd { margin: 0; overflow-wrap: anywhere; } .startup-inline-list { line-height: 1.65; overflow-wrap: anywhere; } .startup-inline-item { font-weight: var(--app-font-weight-strong); color: var(--accent-foreground); cursor: help; } .startup-inline-separator { margin: 0 var(--app-space-1); color: var(--muted-foreground); } .startup-muted { color: var(--muted-foreground); } .choice-request-card { border: 1px solid var(--border); border-radius: 10px; background: var(--card); color: var(--card-foreground); padding: 0.75rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06); } .choice-request-title { font-weight: 600; margin-bottom: 0.6rem; } .choice-request-options { display: grid; gap: 0.5rem; } .choice-request-option { display: flex; flex-direction: column; gap: 0.15rem; align-items: flex-start; border: 1px solid var(--border); border-radius: 8px; background: transparent; color: var(--foreground); padding: 0.55rem 0.65rem; text-align: left; cursor: pointer; } .choice-request-option:hover, .choice-request-option.selected { background: var(--accent); } .choice-request-submit { margin-top: 0.65rem; border: 1px solid var(--border); border-radius: 8px; background: var(--primary); color: var(--primary-foreground); padding: 0.45rem 0.7rem; cursor: pointer; } .choice-request-submit:disabled { cursor: not-allowed; opacity: 0.55; } .choice-request-label { font-weight: 600; } .choice-request-description { color: var(--muted-foreground); font-size: 0.8rem; } .model-option-current { background: color-mix(in oklab, var(--accent) 50%, transparent); } .model-scope-row { display: flex; align-items: center; justify-content: space-between; gap: var(--app-space-2); margin-bottom: var(--app-space-2); color: var(--muted-foreground); } .model-scope-toggle { border: 1px solid var(--border); border-radius: var(--app-radius); background: transparent; color: var(--foreground); cursor: pointer; padding: 2px 8px; } .model-scope-toggle:hover { background: var(--accent); } .message-load-older { align-self: center; padding: var(--app-space-2) var(--app-space-3); border: 1px solid var(--border); border-radius: 999px; background: var(--secondary); color: var(--secondary-foreground); cursor: pointer; } .message-load-older:hover:not(:disabled) { background: var(--accent); } .message-load-older:disabled { opacity: 0.65; cursor: default; } .skills-page { width: 100%; min-height: 100%; display: flex; flex-direction: column; background: var(--background); color: var(--foreground); } .skills-header { display: flex; align-items: center; justify-content: space-between; gap: var(--app-space-4); padding: var(--app-space-4); border-bottom: 1px solid var(--border); } .skills-header h1, .skills-header p, .skills-editor-toolbar h2, .skills-editor-toolbar p, .skills-create h2, .skills-list-section h2 { margin: 0; } .skills-header a { color: white; background: color-mix(in oklab, var(--accent-foreground) 86%, black); border-radius: var(--app-radius); padding: 7px 12px; text-decoration: none; white-space: nowrap; } .skills-layout { flex: 1; min-height: 0; display: grid; grid-template-columns: minmax(260px, 340px) minmax(0, 1fr); } .skills-sidebar { min-height: 0; overflow: auto; border-right: 1px solid var(--border); padding: var(--app-space-3); display: flex; flex-direction: column; gap: var(--app-space-4); } .skills-create, .skills-list-section { display: flex; flex-direction: column; gap: var(--app-space-2); } .skills-create input, .skills-create textarea, .skills-editor { border: 1px solid var(--border); border-radius: var(--app-radius); background: var(--background); color: var(--foreground); padding: var(--app-space-2); } .skills-create button, .skills-editor-actions button { border: 1px solid var(--border); border-radius: var(--app-radius); background: var(--secondary); color: var(--secondary-foreground); padding: var(--app-space-2) var(--app-space-3); cursor: pointer; } .skills-editor-actions .danger { background: color-mix(in oklab, var(--destructive) 18%, var(--secondary)); color: var(--destructive); } .skills-list-item { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; width: 100%; text-align: left; border: 1px solid var(--border); border-radius: var(--app-radius); background: var(--card); color: var(--foreground); padding: var(--app-space-2); cursor: pointer; } .skills-list-item.active { border-color: var(--accent-foreground); background: color-mix(in oklab, var(--accent-foreground) 12%, var(--card)); } .skills-list-item small, .skills-muted, .skills-help, .skills-editor-toolbar p { color: var(--muted-foreground); } .skills-editor-panel { min-height: 0; display: flex; flex-direction: column; padding: var(--app-space-4); gap: var(--app-space-3); } .skills-editor-toolbar { display: flex; justify-content: space-between; gap: var(--app-space-3); align-items: flex-start; } .skills-editor-actions { display: flex; gap: var(--app-space-2); flex-wrap: wrap; justify-content: flex-end; } .skills-readonly-pill { display: inline-flex; align-items: center; padding: var(--app-space-2) var(--app-space-3); border: 1px solid var(--border); border-radius: 999px; background: var(--muted); color: var(--muted-foreground); } .skills-editor { width: 100%; flex: 1; min-height: 320px; font-family: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace !important; white-space: pre; resize: none; } .skills-editor[readonly] { opacity: 0.82; cursor: default; } .skills-alert { padding: var(--app-space-2) var(--app-space-3); border-radius: var(--app-radius); border: 1px solid var(--border); } .skills-alert.error { border-color: var(--destructive); color: var(--destructive); } .skills-alert.success { border-color: var(--accent-foreground); color: var(--accent-foreground); } .skills-diagnostics { color: var(--destructive) !important; } .skills-empty-editor { margin: auto; text-align: center; color: var(--muted-foreground); } @media (max-width: 767px) { html, body, #app { height: 100dvh; } .main-content { width: 100% !important; flex: none !important; } .app-topbar { gap: var(--app-space-2); padding-inline: var(--app-space-2) !important; } .topbar-mobile-controls-button { display: inline-flex; } .topbar-control-menu { display: none; order: 10; width: 100%; align-items: stretch; gap: var(--app-space-2); padding-top: var(--app-space-2); } .topbar-control-menu.open { display: flex; flex-direction: column; } .sidebar-panel { width: min(92vw, 340px); max-width: min(92vw, 340px); } .session-action-button { opacity: 1; } .progressive-tool-header { align-items: flex-start; } .startup-grid { grid-template-columns: 1fr; } .startup-section dl div { grid-template-columns: 1fr; gap: 0; } .topbar-control-menu .relative, .topbar-control-menu .model-button, .topbar-control-menu .thinking-select, .topbar-skills-link { width: 100%; } .topbar-control-menu #model-dropdown { left: 0.5rem; right: 0.5rem; width: auto; } .skills-header, .skills-editor-toolbar { flex-direction: column; align-items: stretch; } .skills-layout { grid-template-columns: 1fr; overflow: auto; } .skills-sidebar { border-right: 0; border-bottom: 1px solid var(--border); overflow: visible; } .skills-editor-panel { min-height: 70vh; } } @media (min-width: 768px) { .sidebar-overlay { display: none; } .sidebar-panel { position: relative; transform: none; box-shadow: none; flex-shrink: 0; width: 0; overflow: hidden; transition: width 200ms ease; border-right: 1px solid var(--border); } .sidebar-panel.open { width: var(--sidebar-width); } .sidebar-panel > .sidebar-inner { width: var(--sidebar-width); min-width: var(--sidebar-width); } }