From db6e7a1bf895c762be4a3807708e0de0af368c4a Mon Sep 17 00:00:00 2001 From: Augustin Date: Tue, 28 Apr 2026 16:02:36 +0200 Subject: [PATCH] feat(ui): comprehensive responsive CSS for all breakpoints MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add 4 responsive breakpoints (1200px, 1024px, 768px, 480px) covering every component: header nav scrollable on mobile, dashboard grid adapts from 3→2→1 columns, studio feed/input/tool blocks scale down, shell AI panel stacks vertically, config cards stack labels, and all typography/buttons/padding scale progressively for small screens. 🤗 Generated with Crush Assisted-by: GLM-5.1 via Crush --- web/src/styles/global.css | 387 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 371 insertions(+), 16 deletions(-) diff --git a/web/src/styles/global.css b/web/src/styles/global.css index 69da706..7aa4060 100644 --- a/web/src/styles/global.css +++ b/web/src/styles/global.css @@ -1376,25 +1376,380 @@ input::placeholder { color: var(--text-disabled); } .hljs-number { color: var(--warning) !important; } /* ── Responsive / Mobile ── */ -@media (max-width: 768px) { - :root { --sidebar-w: 100%; --header-h: 46px; } - .header { padding: 0 12px; gap: 8px; } - .header-nav { margin-left: 12px; gap: 2px; } - .nav-tab { padding: 6px 10px; font-size: 12px; } - .header-brand { gap: 6px; } - .header-logo { font-size: 15px; letter-spacing: 2px; } - .studio-feed { padding: 12px 8px; } - .studio-input-area { padding: 8px 8px 4px; } - .feed-item { padding: 6px 8px; } - .feed-avatar { width: 24px; height: 24px; } - .dash-grid { grid-template-columns: 1fr; grid-template-rows: auto; height: auto; overflow: auto; } - .dash-span-2 { grid-column: span 1; } + +/* ── Large tablets / small laptops ── */ +@media (max-width: 1200px) { + .dash-grid { + grid-template-columns: repeat(2, 1fr); + grid-template-rows: auto; + height: auto; + overflow: auto; + } + .dash-span-2 { grid-column: span 2; } + .shell-ai-col { width: 280px; max-width: 280px; } + .config-profile-center { max-width: 100%; } + .config-ai-tools-grid { grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); } + .skill-tiles { grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); } +} + +/* ── Tablets portrait ── */ +@media (max-width: 1024px) { + :root { --sidebar-w: 240px; } + .header { padding: 0 16px; gap: 8px; } + .header-nav { margin-left: 16px; } + .nav-tab { padding: 6px 12px; font-size: 12px; } + .nav-tab .tab-icon { display: none; } + .dash-grid { + grid-template-columns: 1fr 1fr; + grid-template-rows: auto; + height: auto; + overflow: auto; + gap: 10px; + padding: 12px; + } + .dash-span-2 { grid-column: span 2; } + .studio-feed { padding: 16px 12px; } + .studio-input-area { padding: 10px 12px 6px; } + .config-panel-body { padding: 12px 16px 16px; } + .config-card-row { gap: 10px; } + .config-card-label { width: 110px; } + .shell-ai-col { width: 260px; max-width: 260px; } + .shell-analysis-modal { width: 90vw; } + .shell-modal { min-width: 320px; } .grid-2 { grid-template-columns: 1fr; } .split-horizontal { flex-direction: column; } .split-right { width: 100%; border-left: none; border-top: 1px solid var(--border); max-height: 300px; } - .shell-ai-col { width: 100%; max-width: 100%; border-left: none; border-top: 1px solid var(--border); max-height: 50vh; } - .config-card-row { flex-wrap: wrap; gap: 8px; } - .config-card-label { width: 100%; } +} + +/* ── Mobile landscape / small tablets ── */ +@media (max-width: 768px) { + :root { --sidebar-w: 100%; --header-h: 46px; } + + /* Header */ + .header { + padding: 0 10px; + gap: 6px; + flex-wrap: nowrap; + overflow: hidden; + } + .header-brand { gap: 4px; flex-shrink: 0; } + .header-logo { font-size: 14px; letter-spacing: 2px; } + .header-logo-img { width: 18px !important; height: 18px !important; } + .header-version { display: none; } + .header-nav { + margin-left: 8px; + gap: 2px; + overflow-x: auto; + scrollbar-width: none; + flex: 1; + min-width: 0; + } + .header-nav::-webkit-scrollbar { display: none; } + .nav-tab { + padding: 5px 8px; + font-size: 11px; + white-space: nowrap; + flex-shrink: 0; + } + .header-spacer { display: none; } + .header-clock { font-size: 10px; flex-shrink: 0; } + .header-indicators { gap: 6px; flex-shrink: 0; } + + /* Statusbar */ + .statusbar { padding: 0 8px; font-size: 10px; } + .statusbar-sudo { font-size: 9px; padding: 1px 4px; } + .statusbar-shortcut { display: none; } + .statusbar-right { display: none; } + + /* Dashboard */ + .dash-grid { + grid-template-columns: 1fr; + grid-template-rows: auto; + height: auto; + overflow: auto; + gap: 8px; + padding: 10px; + } + .dash-span-2 { grid-column: span 1; } + .dash-card { padding: 10px 12px; } + .dash-quota-list, + .dash-consumption-list, + .dash-proc-list { max-height: 200px; } + .dash-cmd-card .dash-cmd-list { max-height: 160px; } + + /* Studio */ + .studio-feed { padding: 10px 6px; gap: 2px; } + .studio-feed-scroll-wrap { } + .studio-input-area { padding: 8px 6px 4px; } + .studio-input-row textarea { min-height: 36px; padding: 8px 10px; font-size: 13px; } + .studio-send-btn, .studio-stop-btn, .studio-attach-btn { width: 36px; height: 36px; } + .studio-token-bar { gap: 6px; margin-bottom: 6px; } + .studio-image-previews { gap: 6px; padding: 6px 4px; } + .studio-image-preview { width: 80px; height: 80px; } + .studio-scroll-btns { right: 8px; bottom: 8px; } + + /* Feed items */ + .feed-item { padding: 4px 6px; gap: 6px; } + .feed-avatar { width: 22px; height: 22px; font-size: 12px; } + .feed-header { gap: 4px; flex-wrap: wrap; } + .feed-rank-badge { font-size: 8px; padding: 0 4px; } + .feed-role { font-size: 10px; } + .feed-time { font-size: 9px; } + .feed-content { font-size: 13px; } + .feed-content table { font-size: 11px; } + .feed-content th, .feed-content td { padding: 3px 6px; } + .feed-images { gap: 4px; } + .feed-image { max-width: 160px; max-height: 120px; } + + /* Thinking blocks */ + .feed-thinking-block { max-height: 120px; } + .feed-thinking-content { max-height: 60px; font-size: 11px; } + + /* Tool blocks */ + .studio-tool-args { font-size: 11px; } + .studio-tool-result { max-height: 150px; } + .studio-tool-result pre { font-size: 11px; } + + /* Code blocks */ + .studio-code-block pre { padding: 8px 10px; font-size: 12px; } + .studio-code-header { } + .studio-code-lang { font-size: 10px; padding: 3px 8px; } + + /* Messages */ + .message { max-width: 95%; padding: 10px 12px; font-size: 13px; } + + /* Shell / Terminal */ + .shell-layout { flex-direction: column; } + .shell-terminal-col { min-height: 200px; } + .shell-tabs-bar { height: 32px; padding: 0 6px; } + .shell-tab { padding: 3px 8px; font-size: 11px; max-width: 120px; } + .shell-tab-name { max-width: 70px; } + .shell-ai-col { + width: 100%; + max-width: 100%; + border-left: none; + border-top: 1px solid var(--border); + max-height: 45vh; + flex-shrink: 1; + } + .ai-panel-messages { padding: 8px; } + .ai-message { padding: 6px 8px; font-size: 12px; } + .ai-panel-input input { font-size: 12px; padding: 5px 8px; } + .shell-search-input { width: 140px; } + .shell-analysis-modal { max-width: 95vw; } + .shell-modal { min-width: 280px; max-width: 95vw; } + .shell-modal-row { grid-template-columns: 1fr; gap: 6px; } + .shell-new-tab-menu { min-width: 220px; } + + /* Config */ + .config-tabs-bar { padding: 8px 12px; gap: 2px; overflow-x: auto; scrollbar-width: none; } + .config-tabs-bar::-webkit-scrollbar { display: none; } + .config-panel-body { padding: 10px 12px 12px; } + .config-card { padding: 14px 16px; } + .config-card-row { flex-wrap: wrap; gap: 6px; } + .config-card-label { width: 100%; margin-bottom: 2px; } + .config-card-value { width: 100%; } + .config-form-input { font-size: 12px; padding: 6px 10px; } + .provider-card-top { flex-wrap: wrap; } + .provider-card-meta { flex-wrap: wrap; gap: 8px; } + .provider-card-actions { width: 100%; justify-content: flex-end; } + .provider-setup-token-row { flex-direction: column; gap: 8px; } + .provider-setup-token-actions { width: 100%; } + .config-update-controls { flex-direction: column; gap: 8px; } + .config-update-info { flex-wrap: wrap; gap: 6px; } + .config-ai-tools-grid { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; } + .config-ai-tool-card { padding: 10px; min-height: 100px; } + + /* Skills */ + .skill-tiles { grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px; } + .skill-tile { padding: 10px; } + .skill-detail-panel { width: 95%; max-height: 90vh; } + + /* Grids */ + .grid-2 { grid-template-columns: 1fr; padding: 10px; } + .split-horizontal { flex-direction: column; } + .split-right { width: 100%; border-left: none; border-top: 1px solid var(--border); max-height: 300px; } + + /* Onboarding */ + .onboarding-overlay { padding: 12px; } +} + +/* ── Mobile portrait ── */ +@media (max-width: 480px) { + :root { --header-h: 42px; } + + /* Header */ + .header { padding: 0 6px; gap: 4px; } + .header-brand { gap: 2px; } + .header-logo { font-size: 12px; letter-spacing: 1px; } + .header-logo-img { width: 16px !important; height: 16px !important; } + .header-nav { margin-left: 4px; gap: 1px; } + .nav-tab { padding: 4px 6px; font-size: 10px; gap: 0; } + .nav-tab .tab-icon { display: none; } + .header-clock { font-size: 9px; } + .header-indicators { gap: 4px; } + .indicator { width: 6px; height: 6px; } + + /* Statusbar */ + .statusbar { height: 24px; padding: 0 6px; } + .statusbar-sudo { font-size: 8px; padding: 0 3px; } + + /* Dashboard */ + .dash-grid { padding: 6px; gap: 6px; } + .dash-card { padding: 8px 10px; } + .dash-label { font-size: 10px; } + .dash-count { font-size: 9px; } + .dash-tool-tag { font-size: 10px; padding: 2px 5px; } + .dash-quota-name { font-size: 10px; min-width: 60px; } + .dash-consumption-name { font-size: 10px; } + .dash-consumption-day { font-size: 8px; } + .dash-proc-name { font-size: 10px; } + .dash-cmd-text { font-size: 10px; } + .dash-cmd-freq-name { font-size: 10px; width: 70px; } + .dash-svc-name { font-size: 10px; } + + /* Studio */ + .studio-feed { padding: 6px 4px; } + .studio-input-area { padding: 6px 4px 3px; } + .studio-input-row { gap: 4px; } + .studio-input-row textarea { min-height: 32px; padding: 6px 8px; font-size: 12px; } + .studio-send-btn, .studio-stop-btn, .studio-attach-btn { width: 32px; height: 32px; } + .studio-send-btn svg, .studio-stop-btn svg, .studio-attach-btn svg { width: 14px; height: 14px; } + .studio-image-preview { width: 60px; height: 60px; } + .studio-image-remove { width: 18px; height: 18px; font-size: 11px; top: 2px; right: 2px; } + .studio-input-hint { font-size: 9px; } + .studio-scroll-btn { width: 28px; height: 28px; } + .studio-scroll-btn svg { width: 12px; height: 12px; } + .studio-copy-btn { font-size: 9px; padding: 2px 6px; } + + /* Feed */ + .feed-item { padding: 3px 4px; gap: 4px; } + .feed-avatar { width: 20px; height: 20px; font-size: 11px; } + .feed-body { min-width: 0; } + .feed-header { gap: 3px; margin-bottom: 1px; } + .feed-rank-badge { font-size: 7px; padding: 0 3px; } + .feed-role { font-size: 9px; } + .feed-time { font-size: 8px; } + .feed-content { font-size: 12px; line-height: 1.4; } + .feed-content h1 { font-size: 16px; } + .feed-content h2 { font-size: 14px; } + .feed-content h3 { font-size: 13px; } + .feed-content h4 { font-size: 12px; } + .feed-content table { font-size: 10px; } + .feed-content th, .feed-content td { padding: 2px 4px; } + .feed-image { max-width: 120px; max-height: 90px; } + .feed-system-text { font-size: 11px; } + + /* Thinking */ + .feed-thinking-header { padding: 4px 6px; font-size: 9px; } + .feed-thinking-content { padding: 4px 6px; font-size: 10px; max-height: 50px; } + + /* Tool blocks */ + .studio-tool-header { padding: 4px 6px; gap: 4px; font-size: 11px; } + .studio-tool-name { font-size: 11px; } + .studio-tool-args { padding: 4px 6px; font-size: 10px; } + .studio-tool-result { max-height: 120px; } + .studio-tool-result pre { padding: 4px 6px; font-size: 10px; } + + /* Code */ + .studio-code-block pre { padding: 6px 8px; font-size: 11px; } + .studio-code-lang { font-size: 9px; padding: 2px 6px; } + + /* Markdown content */ + .feed-content blockquote { padding: 3px 8px; } + .feed-content ul, .feed-content ol { padding-left: 14px; } + .msg-bullet, .msg-step { font-size: 12px; } + .msg-h1 { font-size: 16px; } + .msg-h2 { font-size: 14px; } + .msg-h3 { font-size: 13px; } + .msg-h4 { font-size: 12px; } + .inline-code { font-size: 11px; padding: 1px 4px; } + + /* Messages */ + .message { max-width: 98%; padding: 8px 10px; font-size: 12px; line-height: 1.4; } + .chat-input-bar { padding: 10px 8px; gap: 6px; } + .chat-input-bar input { font-size: 13px; } + + /* Shell */ + .shell-tabs-bar { height: 28px; padding: 0 4px; gap: 2px; } + .shell-tab { padding: 2px 6px; font-size: 10px; max-width: 90px; } + .shell-tab-name { max-width: 50px; font-size: 10px; } + .shell-tab-index { font-size: 8px; padding: 0 2px; } + .shell-tab-close { width: 14px; height: 14px; } + .shell-new-tab-btn { padding: 2px 6px; font-size: 10px; } + .shell-zoom-badge { font-size: 9px; padding: 1px 4px; } + .shell-search-bar { top: 4px; right: 4px; padding: 3px 4px; gap: 2px; } + .shell-search-input { width: 100px; font-size: 11px; padding: 2px 4px; } + .shell-search-nav { width: 20px; height: 20px; } + .shell-search-close { width: 20px; height: 20px; } + .shell-ai-col { max-height: 40vh; } + .ai-panel-header { padding: 8px 10px; font-size: 12px; } + .ai-panel-messages { padding: 6px; gap: 4px; } + .ai-message { padding: 5px 6px; font-size: 11px; } + .ai-panel-input { padding: 6px 8px; gap: 4px; } + .ai-panel-input input { font-size: 11px; padding: 4px 6px; } + .shell-analysis-modal { max-width: 98vw; max-height: 85vh; } + .shell-analysis-modal-header { padding: 10px 12px; font-size: 13px; } + .shell-analysis-modal-body { padding: 12px; font-size: 13px; } + .shell-modal { min-width: 260px; } + .shell-modal-header { padding: 12px 14px; font-size: 13px; } + .shell-modal-body { padding: 12px 14px; gap: 8px; } + .shell-new-tab-menu { min-width: 200px; max-height: 300px; } + .shell-menu-item { padding: 5px 8px; font-size: 11px; } + + /* Config */ + .config-tabs-bar { padding: 6px 8px; gap: 1px; } + .nav-tab { padding: 4px 6px; font-size: 10px; } + .config-panel-body { padding: 8px 8px 8px; } + .config-card { padding: 10px 12px; margin-bottom: 10px; border-radius: var(--radius); } + .config-card-row { padding: 6px 0; gap: 4px; } + .config-card-label { width: 100%; font-size: 11px; } + .config-card-value { font-size: 12px; } + .config-form-label { font-size: 10px; } + .config-form-input { font-size: 11px; padding: 5px 8px; } + .provider-card-v2 { padding: 10px 12px; } + .provider-card-name { font-size: 12px; } + .provider-card-meta { font-size: 10px; gap: 6px; flex-wrap: wrap; } + .provider-card-model { margin-top: 8px; padding-top: 8px; gap: 4px; } + .provider-card-model-value { font-size: 12px; } + .provider-setup-hint { font-size: 11px; padding: 8px 10px; } + .config-update-row { padding: 6px 10px; flex-wrap: wrap; gap: 4px; } + .config-update-name { font-size: 11px; min-width: auto; } + .config-update-versions { font-size: 10px; } + .config-ai-tools-grid { grid-template-columns: 1fr 1fr; gap: 6px; } + .config-ai-tool-card { padding: 8px; min-height: 80px; } + .config-ai-tool-name { font-size: 11px; } + .config-ai-tool-desc { font-size: 10px; } + .config-toast { padding: 8px 16px; font-size: 12px; bottom: 30px; } + + /* Skills */ + .skill-tiles { grid-template-columns: 1fr 1fr; gap: 6px; } + .skill-tile { padding: 8px; } + .skill-tile-name { font-size: 12px; } + .skill-tile-desc { font-size: 10px; -webkit-line-clamp: 2; } + .skill-detail-panel { width: 98%; max-height: 95vh; } + .skill-detail-header { padding: 12px 14px; } + .skill-detail-name { font-size: 14px; } + .skill-detail-body { padding: 14px; } + .skill-detail-content { font-size: 10px; padding: 8px; max-height: 200px; } + + /* Buttons */ + button { font-size: 12px; padding: 6px 12px; } + button.sm { font-size: 11px; padding: 3px 8px; } + input, textarea { font-size: 12px; padding: 6px 10px; } + + /* Cards */ + .card { padding: 12px; border-radius: var(--radius); } + .card-header { font-size: 10px; margin-bottom: 10px; } + .badge { font-size: 10px; padding: 1px 6px; } + .chip { font-size: 11px; padding: 4px 8px; } + + /* Empty states */ + .empty-state { padding: 24px 12px; font-size: 12px; } + + /* KaTeX */ + .katex { font-size: 0.85em; } + .katex-display { margin: 8px 0; overflow-x: auto; } } .config-ai-tools-grid {