/* web-cad v6 – Design Tokens, Typography, Base (with Drawer tokens) */ :root { --font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; --font-mono: 'JetBrains Mono', 'SF Mono', 'Fira Code', ui-monospace, monospace; --fs-xs: 11px; --fs-sm: 12px; --fs-md: 13px; --fs-lg: 14px; --fs-xl: 16px; --fs-2xl: 20px; --color-primary: #2563eb; --color-primary-hover: #1d4ed8; --color-primary-light: #dbeafe; --color-primary-50: #eff6ff; --color-bg: #f8fafc; --color-surface: #ffffff; --color-surface-2: #f1f5f9; --color-surface-3: #e2e8f0; --color-border: #e2e8f0; --color-border-strong: #cbd5e1; --color-text: #0f172a; --color-text-muted: #64748b; --color-text-faint: #94a3b8; --color-success: #10b981; --color-warning: #f59e0b; --color-error: #ef4444; --color-ki: #8b5cf6; --color-ki-light: #ede9fe; --color-canvas-bg: #0f172a; --color-canvas-bg-2: #1e293b; --color-grid-minor: rgba(255,255,255,0.06); --color-grid-major: rgba(255,255,255,0.12); --color-grid-axis: rgba(96,165,250,0.28); --color-online: #10b981; --radius-xs: 3px; --radius-sm: 4px; --radius-md: 6px; --radius-lg: 8px; --radius-xl: 12px; --spacing-xs: 4px; --spacing-sm: 6px; --spacing-md: 10px; --spacing-lg: 14px; --spacing-xl: 20px; /* Layout */ --topbar-h: 38px; --ribbon-h: 72px; --leftbar-w: 200px; --rightbar-w: 300px; --cmdline-h: 56px; --status-h: 26px; --canvas-toolbar-h: 38px; /* Mobile-specific */ --mobile-right-tab-w: 56px; --mobile-topbar-h: 44px; --mobile-ribbon-h: 48px; --drawer-w: min(320px, 88vw); --shadow-sm: 0 1px 2px 0 rgba(15,23,42,0.04); --shadow-md: 0 2px 6px -1px rgba(15,23,42,0.08), 0 1px 3px -1px rgba(15,23,42,0.06); --shadow-lg: 0 10px 20px -4px rgba(15,23,42,0.10), 0 4px 8px -2px rgba(15,23,42,0.06); --shadow-drawer: -8px 0 24px -4px rgba(15,23,42,0.18); --t-fast: 120ms cubic-bezier(.2,.0,.2,1); --t-base: 200ms cubic-bezier(.2,.0,.2,1); --t-drawer: 280ms cubic-bezier(.32, .72, 0, 1); } [data-theme="dark"] { --color-bg: #0b0e14; --color-surface: #11151c; --color-surface-2: #161b24; --color-surface-3: #1d2330; --color-border: #232a36; --color-border-strong: #2f3849; --color-text: #e2e8f0; --color-text-muted: #94a3b8; --color-text-faint: #64748b; --color-primary-light: #1e3a8a; --color-primary-50: #172554; --color-ki-light: #2e1065; --shadow-sm: 0 1px 2px 0 rgba(0,0,0,0.3); --shadow-md: 0 2px 6px -1px rgba(0,0,0,0.4); --shadow-lg: 0 10px 20px -4px rgba(0,0,0,0.5); --shadow-drawer: -8px 0 24px -4px rgba(0,0,0,0.6); } * { box-sizing: border-box; } *::before, *::after { box-sizing: border-box; } html, body { height: 100%; margin: 0; font-family: var(--font-sans); font-size: var(--fs-md); background: var(--color-bg); color: var(--color-text); -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; line-height: 1.5; overflow: hidden; /* iOS safe areas */ padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); } body { position: fixed; inset: 0; width: 100%; } button { font-family: inherit; font-size: inherit; cursor: pointer; background: transparent; border: none; color: inherit; padding: 0; -webkit-tap-highlight-color: transparent; } input, select, textarea { font-family: inherit; font-size: inherit; } a { color: var(--color-primary); text-decoration: none; } a:hover { text-decoration: underline; } ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: transparent; } ::-webkit-scrollbar-thumb { background: var(--color-border-strong); border-radius: 10px; border: 2px solid var(--color-bg); } ::-webkit-scrollbar-thumb:hover { background: var(--color-text-faint); } *:focus-visible { outline: 2px solid var(--color-primary); outline-offset: 2px; border-radius: var(--radius-sm); } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0; } .skip-link { position: absolute; top: -40px; left: 8px; background: var(--color-primary); color: white; padding: 8px 12px; border-radius: var(--radius-md); z-index: 1000; font-weight: 500; } .skip-link:focus { top: 8px; } /* Scrim (drawer backdrop) */ .scrim { position: fixed; inset: 0; background: rgba(15, 23, 42, 0.5); z-index: 90; opacity: 0; visibility: hidden; transition: opacity var(--t-drawer), visibility 0s linear var(--t-drawer); } .scrim.show { opacity: 1; visibility: visible; transition: opacity var(--t-drawer), visibility 0s linear 0s; } /* web-cad v6 – Editor Layout (topbar, ribbon, sidebars, canvas, footer) + MOBILE responsive */ /* ============================================================ APP GRID (desktop default) ============================================================ */ .app { display: grid; grid-template-rows: var(--topbar-h) var(--ribbon-h) 1fr var(--cmdline-h) var(--status-h); grid-template-columns: 100%; height: 100vh; height: 100dvh; overflow: hidden; background: var(--color-bg); } /* ============================================================ TOPBAR ============================================================ */ .topbar { background: var(--color-surface); border-bottom: 1px solid var(--color-border); display: flex; align-items: center; justify-content: space-between; padding: 0 var(--spacing-md); height: var(--topbar-h); z-index: 30; flex-shrink: 0; } .topbar-left, .topbar-right { display: flex; align-items: center; gap: var(--spacing-sm); } .app-logo { width: 24px; height: 24px; background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-ki) 100%); border-radius: var(--radius-sm); display: grid; place-items: center; color: white; } .app-logo svg { width: 14px; height: 14px; } .app-name { font-weight: 700; font-size: var(--fs-lg); letter-spacing: -0.2px; } .project-name { display: flex; align-items: center; gap: var(--spacing-xs); font-weight: 500; color: var(--color-text); padding: 4px 8px; border-radius: var(--radius-sm); transition: background var(--t-fast); background: transparent; border: none; } .project-name:hover { background: var(--color-surface-2); } .project-name .caret { color: var(--color-text-faint); } .saved-badge { font-size: var(--fs-xs); color: var(--color-text-muted); padding: 2px 8px; background: var(--color-surface-2); border-radius: 999px; display: inline-flex; align-items: center; gap: 4px; } .saved-badge::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--color-success); } .icon-btn-top { width: 30px; height: 30px; display: grid; place-items: center; border-radius: var(--radius-sm); color: var(--color-text-muted); transition: all var(--t-fast); } .icon-btn-top:hover { background: var(--color-surface-2); color: var(--color-text); } .icon-btn-top svg { width: 16px; height: 16px; } .icon-btn-top.danger { color: var(--color-error); } .lang-select { height: 28px; padding: 0 8px; border: 1px solid var(--color-border); background: var(--color-surface); border-radius: var(--radius-sm); font-size: var(--fs-sm); color: var(--color-text); cursor: pointer; } .avatar { width: 28px; height: 28px; border-radius: 50%; background: linear-gradient(135deg, #f59e0b, #ef4444); color: white; display: grid; place-items: center; font-weight: 600; font-size: var(--fs-xs); cursor: pointer; } /* Hamburger button (mobile only, HIDDEN by default) */ .hamburger-btn { display: none; width: 36px; height: 36px; border-radius: var(--radius-sm); align-items: center; justify-content: center; color: var(--color-text); } .hamburger-btn:hover { background: var(--color-surface-2); } .hamburger-btn svg { width: 20px; height: 20px; } /* Right vertical tab bar (mobile only, HIDDEN by default on desktop) */ .right-tab-bar { display: none; } /* Drawers + scrim (mobile only, HIDDEN by default on desktop) */ .drawer { display: none; } .scrim { display: none; } /* ============================================================ RIBBON ============================================================ */ .ribbon { background: var(--color-surface); border-bottom: 1px solid var(--color-border); display: flex; flex-direction: column; height: var(--ribbon-h); z-index: 25; flex-shrink: 0; } .ribbon-tabs { display: flex; height: 30px; border-bottom: 1px solid var(--color-border); padding: 0 var(--spacing-sm); gap: 2px; overflow-x: auto; scrollbar-width: none; } .ribbon-tabs::-webkit-scrollbar { display: none; } .ribbon-tab { display: flex; align-items: center; gap: 6px; padding: 0 12px; height: 100%; font-size: var(--fs-sm); color: var(--color-text-muted); border-bottom: 2px solid transparent; margin-bottom: -1px; transition: all var(--t-fast); font-weight: 500; flex-shrink: 0; } .ribbon-tab:hover { color: var(--color-text); background: var(--color-surface-2); } .ribbon-tab.active { color: var(--color-primary); border-bottom-color: var(--color-primary); } .ribbon-tab svg { width: 14px; height: 14px; } .ribbon-content { flex: 1; display: flex; align-items: center; padding: 0 var(--spacing-md); gap: var(--spacing-lg); overflow-x: auto; scrollbar-width: thin; } .ribbon-group { display: flex; flex-direction: column; align-items: center; height: 100%; padding: 4px 0; position: relative; } .ribbon-group-btns { display: flex; align-items: center; gap: 2px; flex: 1; } .ribbon-group-label { font-size: 10px; color: var(--color-text-faint); text-transform: uppercase; letter-spacing: 0.4px; border-top: 1px solid var(--color-border); width: 100%; text-align: center; padding-top: 3px; margin-top: 2px; } .ribbon-divider { width: 1px; height: 60%; background: var(--color-border); align-self: center; flex-shrink: 0; } .ribbon-btn { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; min-width: 44px; height: 38px; padding: 4px 6px; border-radius: var(--radius-sm); color: var(--color-text); font-size: 10px; font-weight: 500; transition: all var(--t-fast); flex-shrink: 0; } .ribbon-btn:hover { background: var(--color-primary-50); color: var(--color-primary); } [data-theme="dark"] .ribbon-btn:hover { background: var(--color-surface-3); color: var(--color-primary); } .ribbon-btn:active { transform: scale(0.97); } .ribbon-btn svg { width: 18px; height: 18px; } /* ============================================================ MAIN AREA (desktop 3-column) ============================================================ */ .main { display: grid; grid-template-columns: var(--leftbar-w) 1fr var(--rightbar-w); min-height: 0; background: var(--color-bg); overflow: hidden; position: relative; } .main.left-collapsed { grid-template-columns: 0 1fr var(--rightbar-w); } .main.right-collapsed { grid-template-columns: var(--leftbar-w) 1fr 0; } .main.both-collapsed { grid-template-columns: 0 1fr 0; } /* ============================================================ LEFT SIDEBAR (Desktop tool palette 2-col) ============================================================ */ .leftbar { background: var(--color-surface); border-right: 1px solid var(--color-border); display: flex; flex-direction: column; overflow: hidden; min-width: 0; } .leftbar-header { padding: var(--spacing-md) var(--spacing-md) var(--spacing-sm); border-bottom: 1px solid var(--color-border); display: flex; align-items: center; justify-content: space-between; } .leftbar-title { font-size: var(--fs-xs); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-muted); } .leftbar-toggle { width: 22px; height: 22px; display: grid; place-items: center; border-radius: var(--radius-xs); color: var(--color-text-muted); transition: all var(--t-fast); } .leftbar-toggle:hover { background: var(--color-surface-2); color: var(--color-text); } .leftbar-toggle svg { width: 14px; height: 14px; } .tool-section { padding: var(--spacing-sm) var(--spacing-sm); border-bottom: 1px solid var(--color-border); } .tool-section-label { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-faint); padding: 0 6px 6px; } .tool-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; } .tool-btn { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 3px; padding: 8px 4px; border-radius: var(--radius-md); color: var(--color-text-muted); transition: all var(--t-fast); position: relative; min-height: 56px; } .tool-btn:hover { background: var(--color-surface-2); color: var(--color-text); } .tool-btn.active { background: var(--color-primary); color: white; box-shadow: 0 2px 4px -1px rgba(37,99,235,0.4); } .tool-btn svg { width: 20px; height: 20px; stroke-width: 1.8; } .tool-btn-label { font-size: 10px; font-weight: 500; line-height: 1; white-space: nowrap; } .tool-btn-kbd { position: absolute; top: 2px; right: 4px; font-size: 9px; font-weight: 600; color: var(--color-text-faint); background: var(--color-surface-2); border-radius: 2px; padding: 0 3px; font-family: var(--font-mono); opacity: 0; transition: opacity var(--t-fast); } .tool-btn:hover .tool-btn-kbd { opacity: 1; } .tool-btn.active .tool-btn-kbd { color: rgba(255,255,255,0.7); background: rgba(255,255,255,0.15); } .leftbar-footer { margin-top: auto; padding: var(--spacing-sm); border-top: 1px solid var(--color-border); display: flex; justify-content: space-around; } .leftbar-footer-btn { width: 32px; height: 32px; display: grid; place-items: center; border-radius: var(--radius-sm); color: var(--color-text-muted); transition: all var(--t-fast); } .leftbar-footer-btn:hover { background: var(--color-surface-2); color: var(--color-text); } .leftbar-footer-btn svg { width: 16px; height: 16px; } /* ============================================================ CANVAS AREA ============================================================ */ .canvas-area { position: relative; background: var(--color-canvas-bg); overflow: hidden; min-width: 0; display: flex; flex-direction: column; } .canvas-toolbar { position: absolute; bottom: 12px; left: 50%; transform: translateX(-50%); z-index: 5; display: flex; align-items: center; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-lg); box-shadow: var(--shadow-lg); height: var(--canvas-toolbar-h); padding: 0 4px; gap: 2px; } .canvas-toolbar-btn { width: 32px; height: 32px; display: grid; place-items: center; border-radius: var(--radius-sm); color: var(--color-text); transition: all var(--t-fast); } .canvas-toolbar-btn:hover { background: var(--color-surface-2); } .canvas-toolbar-btn.active { background: var(--color-primary); color: white; } .canvas-toolbar-btn svg { width: 16px; height: 16px; } .canvas-toolbar-divider { width: 1px; height: 18px; background: var(--color-border); margin: 0 4px; } .canvas-zoom-display { font-size: var(--fs-sm); font-weight: 600; font-family: var(--font-mono); padding: 0 8px; color: var(--color-text); min-width: 52px; text-align: center; } .canvas-coords { position: absolute; top: 12px; left: 12px; z-index: 5; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 6px 10px; font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--color-text); box-shadow: var(--shadow-sm); display: flex; align-items: center; gap: 12px; } .canvas-coords-label { color: var(--color-text-muted); margin-right: 4px; } .canvas-coords-val { font-weight: 600; } .canvas-view-tabs { position: absolute; top: 12px; right: 12px; z-index: 5; display: flex; background: var(--color-surface); border: 1px solid var(--color-border); border-radius: var(--radius-md); overflow: hidden; box-shadow: var(--shadow-sm); } .canvas-view-tab { padding: 6px 10px; font-size: var(--fs-xs); font-weight: 600; color: var(--color-text-muted); border-right: 1px solid var(--color-border); transition: all var(--t-fast); } .canvas-view-tab:last-child { border-right: none; } .canvas-view-tab:hover { background: var(--color-surface-2); color: var(--color-text); } .canvas-view-tab.active { background: var(--color-primary); color: white; } .canvas-svg { flex: 1; width: 100%; height: 100%; display: block; cursor: crosshair; } /* ============================================================ RIGHT SIDEBAR (Desktop tabs + content) ============================================================ */ .rightbar { background: var(--color-surface); border-left: 1px solid var(--color-border); display: flex; flex-direction: column; overflow: hidden; min-width: 0; } .rightbar-tabs { display: grid; grid-template-columns: repeat(4, 1fr); border-bottom: 1px solid var(--color-border); background: var(--color-surface-2); } .rightbar-tab { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 8px 4px; font-size: 10px; font-weight: 500; color: var(--color-text-muted); border-bottom: 2px solid transparent; transition: all var(--t-fast); position: relative; } .rightbar-tab:hover { color: var(--color-text); background: var(--color-surface); } .rightbar-tab.active { color: var(--color-primary); background: var(--color-surface); border-bottom-color: var(--color-primary); } .rightbar-tab svg { width: 18px; height: 18px; } .rightbar-tab-badge { position: absolute; top: 4px; right: 8px; background: var(--color-ki); color: white; font-size: 9px; font-weight: 700; border-radius: 999px; padding: 1px 5px; line-height: 1.3; } .rightbar-content { flex: 1; overflow-y: auto; padding: var(--spacing-md); } .rightbar-panel { display: none; } .rightbar-panel.active { display: block; } .panel-section { margin-bottom: var(--spacing-lg); } .panel-section-title { font-size: var(--fs-xs); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-muted); margin-bottom: var(--spacing-sm); display: flex; align-items: center; justify-content: space-between; } /* Property rows */ .prop-row { display: grid; grid-template-columns: 90px 1fr; align-items: center; margin-bottom: var(--spacing-sm); gap: var(--spacing-sm); } .prop-label { font-size: var(--fs-sm); color: var(--color-text-muted); } .prop-input, .prop-select { height: 30px; padding: 0 8px; border: 1px solid var(--color-border); background: var(--color-surface); border-radius: var(--radius-sm); font-size: var(--fs-sm); color: var(--color-text); width: 100%; font-family: inherit; } .prop-input:focus, .prop-select:focus { outline: none; border-color: var(--color-primary); box-shadow: 0 0 0 3px var(--color-primary-light); } .prop-color-row { display: flex; align-items: center; gap: 6px; } .prop-color-swatch { width: 22px; height: 22px; border-radius: var(--radius-sm); border: 1px solid var(--color-border-strong); flex-shrink: 0; } .prop-swatch-input { width: 30px; height: 22px; padding: 0; border: 1px solid var(--color-border); border-radius: var(--radius-sm); background: transparent; cursor: pointer; } /* Layer Manager */ .layer-list { display: flex; flex-direction: column; gap: 2px; } .layer-item { display: grid; grid-template-columns: 18px 18px 18px 1fr auto; align-items: center; gap: 6px; padding: 6px 8px; border-radius: var(--radius-sm); font-size: var(--fs-sm); transition: background var(--t-fast); } .layer-item:hover { background: var(--color-surface-2); } .layer-item.active { background: var(--color-primary-50); color: var(--color-primary); } [data-theme="dark"] .layer-item.active { background: var(--color-surface-3); } .layer-item-name { font-weight: 500; } .layer-item-count { font-size: 10px; color: var(--color-text-faint); font-family: var(--font-mono); } .layer-vis-btn, .layer-lock-btn, .layer-color-btn { width: 18px; height: 18px; display: grid; place-items: center; color: var(--color-text-muted); border-radius: var(--radius-xs); transition: all var(--t-fast); } .layer-vis-btn:hover, .layer-lock-btn:hover { background: var(--color-surface-3); color: var(--color-text); } .layer-vis-btn.off { color: var(--color-text-faint); opacity: 0.4; } .layer-vis-btn svg, .layer-lock-btn svg { width: 12px; height: 12px; } .layer-color-btn { padding: 0; border: 1px solid var(--color-border); } .add-layer-btn { display: flex; align-items: center; justify-content: center; gap: 6px; width: 100%; height: 30px; margin-top: var(--spacing-sm); border: 1px dashed var(--color-border-strong); border-radius: var(--radius-sm); color: var(--color-text-muted); font-size: var(--fs-sm); transition: all var(--t-fast); } .add-layer-btn:hover { border-color: var(--color-primary); color: var(--color-primary); background: var(--color-primary-50); } [data-theme="dark"] .add-layer-btn:hover { background: var(--color-surface-3); } .add-layer-btn svg { width: 14px; height: 14px; } /* Block Library */ .lib-search { position: relative; margin-bottom: var(--spacing-md); } .lib-search input { width: 100%; height: 32px; padding: 0 8px 0 30px; border: 1px solid var(--color-border); background: var(--color-surface-2); border-radius: var(--radius-sm); font-size: var(--fs-sm); color: var(--color-text); } .lib-search input:focus { outline: none; background: var(--color-surface); border-color: var(--color-primary); } .lib-search-icon { position: absolute; left: 8px; top: 50%; transform: translateY(-50%); color: var(--color-text-faint); } .lib-search-icon svg { width: 14px; height: 14px; } .lib-categories { display: flex; gap: 4px; flex-wrap: wrap; margin-bottom: var(--spacing-md); } .lib-cat { padding: 4px 10px; font-size: var(--fs-xs); font-weight: 500; border-radius: 999px; background: var(--color-surface-2); color: var(--color-text-muted); transition: all var(--t-fast); } .lib-cat:hover { background: var(--color-surface-3); color: var(--color-text); } .lib-cat.active { background: var(--color-primary); color: white; } .lib-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } .lib-item { background: var(--color-surface-2); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 8px; display: flex; flex-direction: column; align-items: center; gap: 4px; cursor: grab; transition: all var(--t-fast); } .lib-item:hover { border-color: var(--color-primary); background: var(--color-primary-50); transform: translateY(-1px); box-shadow: var(--shadow-sm); } [data-theme="dark"] .lib-item:hover { background: var(--color-surface-3); } .lib-item-icon { width: 100%; aspect-ratio: 1; display: grid; place-items: center; background: var(--color-surface); border-radius: var(--radius-sm); color: var(--color-text); } .lib-item-icon svg { width: 28px; height: 28px; } .lib-item-name { font-size: var(--fs-xs); font-weight: 500; text-align: center; color: var(--color-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; } /* KI Copilot */ .ki-header { display: flex; align-items: center; gap: 8px; margin-bottom: var(--spacing-md); padding-bottom: var(--spacing-sm); border-bottom: 1px solid var(--color-border); } .ki-avatar { width: 32px; height: 32px; border-radius: 50%; background: linear-gradient(135deg, var(--color-ki) 0%, var(--color-primary) 100%); color: white; display: grid; place-items: center; } .ki-avatar svg { width: 16px; height: 16px; } .ki-title { font-weight: 600; font-size: var(--fs-md); } .ki-status { margin-left: auto; font-size: var(--fs-xs); color: var(--color-success); display: flex; align-items: center; gap: 4px; } .ki-status::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: var(--color-success); } .ki-suggestions { display: flex; flex-direction: column; gap: 4px; margin-bottom: var(--spacing-md); } .ki-suggestion-title { font-size: var(--fs-xs); font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; color: var(--color-text-muted); margin-bottom: 4px; } .ki-chip { display: flex; align-items: center; gap: 6px; padding: 8px 10px; background: var(--color-ki-light); color: var(--color-ki); border-radius: var(--radius-md); font-size: var(--fs-sm); text-align: left; transition: all var(--t-fast); border: 1px solid transparent; } .ki-chip:hover { background: var(--color-ki); color: white; border-color: var(--color-ki); } [data-theme="dark"] .ki-chip { background: var(--color-ki-light); } .ki-chip svg { width: 14px; height: 14px; flex-shrink: 0; } .ki-chat { display: flex; flex-direction: column; gap: 8px; margin-bottom: var(--spacing-md); } .ki-msg { display: flex; gap: 6px; align-items: flex-start; } .ki-msg-bubble { padding: 8px 10px; border-radius: var(--radius-md); font-size: var(--fs-sm); line-height: 1.4; max-width: 100%; } .ki-msg.user .ki-msg-bubble { background: var(--color-primary); color: white; border-bottom-right-radius: 2px; } .ki-msg.assistant .ki-msg-bubble { background: var(--color-surface-2); color: var(--color-text); border-bottom-left-radius: 2px; } .ki-msg.assistant .ki-msg-bubble strong { color: var(--color-ki); } .ki-typing-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--color-text-muted); animation: ki-typing 1.4s infinite ease-in-out; } .ki-typing-dot:nth-child(2) { animation-delay: 0.2s; } .ki-typing-dot:nth-child(3) { animation-delay: 0.4s; } @keyframes ki-typing { 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); } 30% { opacity: 1; transform: scale(1); } } .ki-send-btn:disabled { opacity: 0.5; cursor: not-allowed; } .ki-input-wrap { position: relative; display: flex; align-items: center; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); padding: 0 4px 0 10px; transition: border-color var(--t-fast); } .ki-input-wrap:focus-within { border-color: var(--color-ki); box-shadow: 0 0 0 3px var(--color-ki-light); } .ki-input { flex: 1; height: 34px; background: transparent; border: none; outline: none; font-size: var(--fs-sm); color: var(--color-text); } .ki-input::placeholder { color: var(--color-text-faint); } .ki-voice-btn, .ki-send-btn { width: 28px; height: 28px; display: grid; place-items: center; border-radius: var(--radius-sm); color: var(--color-text-muted); transition: all var(--t-fast); } .ki-voice-btn:hover { background: var(--color-surface-2); color: var(--color-ki); } .ki-send-btn { background: var(--color-ki); color: white; } .ki-send-btn:hover { background: var(--color-primary); } .ki-voice-btn svg, .ki-send-btn svg { width: 14px; height: 14px; } /* ============================================================ COMMAND LINE + STATUS BAR ============================================================ */ .cmdline { background: var(--color-surface); border-top: 1px solid var(--color-border); display: flex; align-items: stretch; height: var(--cmdline-h); font-family: var(--font-mono); font-size: var(--fs-sm); z-index: 20; flex-shrink: 0; } .cmdline-history { flex: 1; padding: 6px 12px; overflow-y: auto; display: flex; flex-direction: column-reverse; border-right: 1px solid var(--color-border); background: var(--color-surface-2); } .cmdline-history-entry { display: flex; gap: 8px; padding: 1px 0; line-height: 1.4; } .cmdline-history-entry .prefix { color: var(--color-primary); font-weight: 600; } .cmdline-history-entry.info .prefix { color: var(--color-text-muted); } .cmdline-history-entry.warn .prefix { color: var(--color-warning); } .cmdline-history-entry.error .prefix { color: var(--color-error); } .cmdline-history-entry .text { color: var(--color-text); } .cmdline-input-wrap { display: flex; align-items: center; flex: 1.4; padding: 0 12px; gap: 8px; } .cmdline-prompt { color: var(--color-primary); font-weight: 700; font-size: var(--fs-md); } .cmdline-input { flex: 1; background: transparent; border: none; outline: none; font-family: var(--font-mono); font-size: var(--fs-sm); color: var(--color-text); } .cmdline-input::placeholder { color: var(--color-text-faint); } .statusbar { background: var(--color-surface-2); border-top: 1px solid var(--color-border); display: flex; align-items: center; height: var(--status-h); padding: 0 var(--spacing-md); font-size: var(--fs-xs); color: var(--color-text-muted); z-index: 20; flex-shrink: 0; overflow: hidden; } .status-item { display: flex; align-items: center; gap: 4px; padding: 0 10px; height: 100%; border-right: 1px solid var(--color-border); transition: all var(--t-fast); cursor: pointer; white-space: nowrap; } .status-item:first-child { padding-left: 0; } .status-item:last-child { border-right: none; margin-left: auto; padding-right: 0; } .status-item:hover { background: var(--color-surface-3); color: var(--color-text); } .status-item.active { color: var(--color-primary); } .status-item svg { width: 12px; height: 12px; } .status-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--color-online); display: inline-block; } /* ============================================================ RESPONSIVE: TABLET (≤1024px) — narrow sidebars, no labels ============================================================ */ @media (max-width: 1280px) { :root { --rightbar-w: 280px; --leftbar-w: 180px; } .ribbon-group-label { display: none; } .prop-row { grid-template-columns: 80px 1fr; } } @media (max-width: 1024px) { :root { --leftbar-w: 64px; --rightbar-w: 240px; } /* Tools collapse to icon-only on tablet */ .leftbar-title, .tool-section-label, .tool-btn-label { display: none; } .tool-grid { grid-template-columns: 1fr 1fr; gap: 2px; } .tool-btn { padding: 10px 4px; } .leftbar-header { justify-content: center; padding: 6px; } .leftbar-toggle { display: none; } .ribbon-group-label { display: none; } .canvas-view-tabs { display: none; } .rightbar-tab span { display: none; } .rightbar-tab { padding: 10px 2px; } .rightbar-tab svg { width: 20px; height: 20px; } } /* ============================================================ RESPONSIVE: MOBILE (≤768px) — vertical right tab bar + drawers ============================================================ */ @media (max-width: 768px) { :root { --topbar-h: var(--mobile-topbar-h); --ribbon-h: var(--mobile-ribbon-h); --cmdline-h: 44px; --status-h: 32px; } /* Topbar: hamburger left, project center, notifications right */ .hamburger-btn { display: flex; } .app-name, .saved-badge, .lang-select, .topbar > .topbar-right > *:not(.hamburger-btn):not(.icon-btn-top[aria-label="Benachrichtigungen"]):not(.avatar) { display: none; } .topbar { padding: 0 8px; gap: 6px; } .topbar-left { flex: 1; min-width: 0; } .project-name { padding: 4px 6px; min-width: 0; flex: 1; } .project-name > span:not(.caret) { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .project-name .caret { display: none; } .icon-btn-top { width: 34px; height: 34px; } /* Ribbon: tab strip + scrollable icon buttons only */ .ribbon-tab span { display: none; } .ribbon-tab { padding: 0 12px; } .ribbon-tab svg { width: 16px; height: 16px; } .ribbon-content { padding: 0 8px; gap: 8px; overflow-x: auto; } .ribbon-group { display: none; } .ribbon-group.compact-mobile { display: flex; flex-direction: row; align-items: center; height: 100%; padding: 0; gap: 2px; flex: 1; min-width: 0; } .ribbon-group.compact-mobile .ribbon-group-btns { flex: 1; justify-content: space-around; } .ribbon-divider { display: none; } .ribbon-btn { min-width: 36px; } .ribbon-btn span { display: none; } /* Main area: NO left/right desktop columns, canvas + right tab bar */ .main { grid-template-columns: 1fr var(--mobile-right-tab-w); } .leftbar, .rightbar { display: none; } /* Right tab bar (vertical icon bar, ALWAYS visible on mobile) */ .right-tab-bar { display: flex; flex-direction: column; background: var(--color-surface); border-left: 1px solid var(--color-border); z-index: 15; } .right-tab-btn { flex: 1; min-height: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; padding: 6px 2px; color: var(--color-text-muted); border-bottom: 1px solid var(--color-border); border-left: 3px solid transparent; transition: all var(--t-fast); position: relative; font-size: 9px; font-weight: 500; } .right-tab-btn svg { width: 18px; height: 18px; } .right-tab-btn:hover { background: var(--color-surface-2); color: var(--color-text); } .right-tab-btn.active { color: var(--color-primary); background: var(--color-primary-50); border-left-color: var(--color-primary); } [data-theme="dark"] .right-tab-btn.active { background: var(--color-surface-3); } .right-tab-btn-badge { position: absolute; top: 4px; right: 4px; background: var(--color-ki); color: white; font-size: 9px; font-weight: 700; border-radius: 999px; padding: 1px 4px; line-height: 1.2; } .right-tab-btn:last-child { border-bottom: none; } /* Drawers (slide-in panels) */ .drawer { position: fixed; top: 0; bottom: 0; width: var(--drawer-w); max-width: 88vw; background: var(--color-surface); z-index: 100; display: flex; flex-direction: column; box-shadow: var(--shadow-drawer); transition: transform var(--t-drawer); will-change: transform; } .drawer-left { left: 0; transform: translateX(-100%); border-right: 1px solid var(--color-border); } .drawer-right { right: 0; transform: translateX(100%); border-left: 1px solid var(--color-border); } .drawer.open { transform: translateX(0); } .drawer-header { height: var(--mobile-topbar-h); display: flex; align-items: center; padding: 0 12px; border-bottom: 1px solid var(--color-border); background: var(--color-surface-2); gap: 8px; flex-shrink: 0; } .drawer-title { font-weight: 600; font-size: var(--fs-md); flex: 1; color: var(--color-text); } .drawer-close { width: 32px; height: 32px; display: grid; place-items: center; border-radius: var(--radius-sm); color: var(--color-text-muted); } .drawer-close:hover { background: var(--color-surface-3); color: var(--color-text); } .drawer-close svg { width: 18px; height: 18px; } .drawer-body { flex: 1; overflow-y: auto; padding: var(--spacing-md); } /* Left drawer content: tool palette */ .drawer-left .drawer-body { padding: var(--spacing-sm); } .drawer-left .tool-section { padding: 8px; } .drawer-left .tool-grid { grid-template-columns: repeat(4, 1fr); gap: 4px; } .drawer-left .tool-btn { padding: 10px 4px; } .drawer-left .tool-btn-kbd { display: none; } .drawer-left .tool-btn-label { display: block; } .drawer-left .tool-section-label { display: block; padding: 0 6px 6px; } /* Right drawer content: panel with mini tabs (Werkzeug/Layer/Bibliothek/KI) */ .drawer-right .drawer-tabs { display: flex; border-bottom: 1px solid var(--color-border); background: var(--color-surface-2); flex-shrink: 0; } .drawer-right .drawer-tab { flex: 1; display: flex; align-items: center; justify-content: center; gap: 4px; padding: 10px 6px; font-size: var(--fs-xs); font-weight: 500; color: var(--color-text-muted); border-bottom: 2px solid transparent; transition: all var(--t-fast); } .drawer-right .drawer-tab svg { width: 14px; height: 14px; } .drawer-right .drawer-tab.active { color: var(--color-primary); background: var(--color-surface); border-bottom-color: var(--color-primary); } .drawer-right .drawer-body { padding: var(--spacing-md); } /* Canvas: fill area, compact overlays */ .canvas-coords { font-size: 10px; padding: 4px 8px; top: 8px; left: 8px; } .canvas-toolbar { bottom: 8px; padding: 0 2px; gap: 0; } .canvas-toolbar-btn { width: 28px; height: 28px; } .canvas-toolbar-divider { margin: 0 2px; } .canvas-zoom-display { font-size: 11px; min-width: 40px; padding: 0 4px; } /* Footer compact */ .cmdline-history { display: none; } .cmdline-input-wrap { padding: 0 8px; } .cmdline-input { font-size: var(--fs-xs); } .statusbar { font-size: 10px; padding: 0 4px; } .status-item { padding: 0 6px; } .status-item span:not(.status-dot) { display: none; } .status-item .status-text-mobile { display: inline !important; } .status-dot { display: inline-block; } /* only show dot + Online indicator + a few key items */ .status-item.hide-mobile { display: none; } /* SVG canvas: ensure it's scrollable/zoomable on touch */ .canvas-svg { touch-action: pinch-zoom pan-x pan-y; } } /* Very small screens (<480px) */ @media (max-width: 480px) { :root { --mobile-right-tab-w: 52px; } .ribbon-content { padding: 0 4px; } .right-tab-btn svg { width: 16px; height: 16px; } .right-tab-btn { font-size: 8px; padding: 4px 2px; } .topbar { padding: 0 4px; } .statusbar { font-size: 9px; padding: 0 2px; } } /* Body lock when drawer open */ body.drawer-open { overflow: hidden; } /* ===================== TREE COMPONENT (Layer + Library) ===================== */ .tree { padding: 4px 0; font-size: 12px; user-select: none; } .tree-node { position: relative; } .tree-row { display: flex; align-items: center; gap: 4px; padding: 4px 8px 4px 4px; border-radius: 4px; cursor: pointer; min-height: 26px; color: var(--color-text); transition: background-color .12s; } .tree-row:hover { background: var(--color-surface-2, rgba(0,0,0,0.04)); } .tree-row.active { background: rgba(37, 99, 235, 0.10); color: var(--color-primary, #2563eb); font-weight: 500; } .tree-toggle { width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; flex-shrink: 0; color: var(--color-text-muted); background: none; border: none; cursor: pointer; padding: 0; border-radius: 3px; transition: background-color .12s; } .tree-toggle:hover { background: rgba(0,0,0,0.08); color: var(--color-text); } .tree-toggle svg { width: 12px; height: 12px; transition: transform .15s; } .tree-toggle-leaf { visibility: hidden; cursor: default; } .tree-toggle-leaf:hover { background: none; } .tree-node[aria-expanded="true"] > .tree-row > .tree-toggle svg { transform: rotate(0deg); } .tree-node[aria-expanded="false"] > .tree-row > .tree-toggle svg { transform: rotate(-90deg); } .tree-icon { display: flex; align-items: center; justify-content: center; width: 18px; height: 18px; flex-shrink: 0; } .tree-icon svg { width: 14px; height: 14px; } .tree-name { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 12px; } .tree-count { font-size: 10px; color: var(--color-text-muted); background: var(--color-surface-2, rgba(0,0,0,0.05)); padding: 1px 6px; border-radius: 8px; flex-shrink: 0; font-variant-numeric: tabular-nums; } .tree-children { padding-left: 16px; border-left: 1px dashed var(--color-border, #e2e8f0); margin-left: 11px; } .tree-children[hidden] { display: none; } /* Library drag hint */ .lib-drag-hint { font-size: 14px; color: var(--color-text-muted); cursor: grab; user-select: none; flex-shrink: 0; opacity: 0; transition: opacity .15s; } .tree-row:hover .lib-drag-hint { opacity: 0.7; } .lib-draggable.dragging { opacity: 0.4; } /* Tree scrollable container */ .rightbar-panel .tree { max-height: calc(100vh - 360px); overflow-y: auto; padding-right: 4px; } /* Mobile drawer: same tree styling */ .drawer-right .tree { padding: 8px 4px; font-size: 13px; } .drawer-right .tree-name { font-size: 13px; } .drawer-right .tree-row { min-height: 30px; padding: 6px 10px; } /* ─── Plugin Manager ──────────────────────────────────── */ .plugin-manager { padding: 8px; } .plugin-manager-header { display: flex; justify-content: space-between; align-items: center; padding: 4px 8px 12px; border-bottom: 1px solid var(--color-border); margin-bottom: 8px; } .plugin-card { border: 1px solid var(--color-border); border-radius: 6px; margin-bottom: 6px; overflow: hidden; transition: border-color 0.2s; } .plugin-card.enabled { border-color: var(--color-primary); } .plugin-card.expanded .plugin-card-body { display: block; } .plugin-card-header { display: flex; align-items: center; gap: 10px; padding: 10px 12px; cursor: pointer; user-select: none; } .plugin-icon { width: 20px; height: 20px; flex-shrink: 0; display: flex; align-items: center; } .plugin-icon svg { width: 18px; height: 18px; } .plugin-info { flex: 1; min-width: 0; } .plugin-name { font-size: 13px; font-weight: 600; color: var(--color-text); } .plugin-meta { font-size: 11px; color: var(--color-text-muted); margin-top: 2px; } .plugin-card-body { display: none; padding: 0 12px 12px; border-top: 1px solid var(--color-border); } .plugin-description { font-size: 12px; color: var(--color-text-muted); margin: 8px 0 4px; line-height: 1.4; } .plugin-author { font-size: 11px; color: var(--color-text-muted); } .plugin-toggle { width: 36px; height: 20px; border-radius: 10px; border: none; cursor: pointer; position: relative; background: var(--color-border); transition: background 0.2s; flex-shrink: 0; } .plugin-toggle.on { background: var(--color-primary); } .plugin-toggle-knob { position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; transition: transform 0.2s; } .plugin-toggle.on .plugin-toggle-knob { transform: translateX(16px); }