GAL / UI /style.pixel.css
Clarkoer's picture
fix bugs and error handling
2f664d2
:root{
--bg: #0d1b0f; /* deep garden night */
--panel: #18361d; /* foliage panel */
--panel-2: #204b27; /* darker panel */
--accent: #7cd26f; /* leaf green */
--accent-2: #ffd36e; /* sun gold */
--accent-3: #ff8a5b; /* flower orange */
--ink: #f2ffef; /* light text */
--muted: #a6c3a9; /* muted text */
--wood: #5a3f2e; /* wood bar */
--shadow: rgba(0,0,0,.25);
--radius: 12px;
--pixel-font: 'Press Start 2P', system-ui, sans-serif;
/* RGB components for theme-aware rgba() */
--accent-rgb: 124,210,111;
--accent-2-rgb: 255,211,110;
--accent-3-rgb: 255,138,91;
--btn-start-rgb: 42,90,53;
/* Button / gradient */
--btn-start: #2a5a35;
--btn-end: #1a3a21;
--btn-hover-start: #35744a;
--btn-hover-end: #224b2b;
/* Editor (Monaco) */
--editor-bg: #18361d;
--editor-line: #204b27;
/* AI chat accent (separate from compiler) */
--chat-accent: #7cd26f;
--chat-accent-rgb: 124,210,111;
}
/* Monaco Editor Line Highlighting */
.current-line-highlight {
background: rgba(var(--accent-rgb), 0.03) !important;
border-left: none !important;
}
.current-line-glyph {
background: transparent !important;
width: 0px !important;
}
/* Error line highlighting in Monaco */
.error-line-highlight {
background: rgba(255, 50, 30, 0.45) !important;
border-left: 3px solid #ff3322 !important;
box-shadow: inset 0 0 0 9999px rgba(255, 50, 30, 0.15);
}
.error-line-glyph {
background: #ff3322 !important;
width: 4px !important;
margin-left: 2px;
border-radius: 2px;
}
/* Unmatched bracket highlighting */
.bracket-mismatch {
color: #ff3322 !important;
font-weight: bold;
text-decoration: wavy underline #ff3322;
background: rgba(255, 50, 30, 0.2);
border-radius: 2px;
}
/* Base */
body{
font-family: 'Baloo 2', Arial, sans-serif;
margin: 0;
padding: 0;
background: radial-gradient(1400px 700px at 80% -20%, rgba(var(--accent-rgb),.18), transparent),
radial-gradient(1000px 600px at 0% 100%, rgba(var(--accent-2-rgb),.15), transparent),
radial-gradient(800px 800px at 50% 50%, rgba(var(--accent-rgb),.08), transparent),
linear-gradient(135deg, #0a150c 0%, var(--bg) 50%, var(--panel-2) 100%);
color: var(--ink);
display: flex;
flex-direction: column;
height: 100vh;
height: 100dvh;
max-height: 100vh;
max-height: 100dvh;
overflow: hidden;
position: relative;
}
body::before {
content: '';
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background:
radial-gradient(circle at 20% 30%, rgba(var(--accent-rgb),.05) 0%, transparent 25%),
radial-gradient(circle at 80% 70%, rgba(var(--accent-2-rgb),.05) 0%, transparent 25%);
pointer-events: none;
animation: breathe 8s ease-in-out infinite alternate;
}
@keyframes breathe {
0% {
opacity: 0.5;
transform: scale(1);
}
100% {
opacity: 0.8;
transform: scale(1.02);
}
}
img, canvas{ image-rendering: pixelated; }
/* Scrollbar */
::-webkit-scrollbar{ width: 12px; height: 12px; background: rgba(15,32,20,.4); border-radius: 6px; }
::-webkit-scrollbar-thumb{
background:linear-gradient(135deg, #35543b 0%, #2a4530 100%);
border-radius: 6px;
border: 2px solid rgba(var(--btn-start-rgb),.6);
box-shadow: 0 2px 8px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.1);
}
::-webkit-scrollbar-thumb:hover{
background:linear-gradient(135deg, #4a6d4f 0%, #35543b 100%);
box-shadow: 0 2px 12px rgba(0,0,0,.4), inset 0 1px 0 rgba(255,255,255,.15);
}
::-webkit-scrollbar-corner{ display: none; }
/* Navbar */
.navbar{
display: flex; align-items: center; justify-content: space-between;
background: linear-gradient(135deg, rgba(90,63,46,.98) 0%, rgba(70,50,35,.95) 100%);
padding: 14px 24px; max-height: 5%;
box-shadow: 0 4px 24px rgba(0,0,0,.5),
inset 0 1px 0 rgba(255,255,255,.12);
border-bottom: 3px solid #3f2c20;
backdrop-filter: blur(10px);
position: relative;
z-index: 100;
}
.navbar::after {
content: '';
position: absolute;
bottom: -3px;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg,
transparent 0%,
rgba(var(--accent-rgb),.4) 20%,
rgba(var(--accent-rgb),.6) 50%,
rgba(var(--accent-rgb),.4) 80%,
transparent 100%);
animation: shimmer 3s ease-in-out infinite;
}
@keyframes shimmer {
0%, 100% { opacity: 0.5; }
50% { opacity: 1; }
}
/* Toolbar */
.toolbar{
display:flex;
align-items:center;
justify-content:space-between;
padding:10px 20px;
background:linear-gradient(135deg, var(--btn-start) 0%, var(--btn-end) 100%);
border-bottom:3px solid var(--btn-start);
box-shadow: 0 4px 16px rgba(0,0,0,.4),
inset 0 1px 0 rgba(var(--accent-rgb),.15);
position: relative;
z-index: 90;
}
.toolbar-left{ flex:1; display:flex; align-items:center; }
.toolbar-right{ display:flex; gap:8px; }
.current-file-name {
font-family: var(--pixel-font);
font-size: 11px;
font-weight: 700;
color: #b6ffb6;
background: linear-gradient(135deg, rgba(15,32,20,.7) 0%, rgba(10,24,14,.85) 100%);
border: 1px solid rgba(var(--accent-rgb),.3);
border-radius: 6px;
padding: 7px 14px 7px 30px;
max-width: 280px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
letter-spacing: .4px;
text-shadow: 0 0 8px rgba(var(--accent-rgb),.4), 0 1px 3px rgba(0,0,0,.5);
position: relative;
box-shadow: 0 2px 8px rgba(0,0,0,.25), inset 0 1px 0 rgba(255,255,255,.05);
transition: all .3s ease;
}
.current-file-name::before {
content: '\1F4C4';
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
font-size: 12px;
filter: drop-shadow(0 0 3px rgba(var(--accent-rgb),.4));
}
.current-file-name:hover {
border-color: rgba(var(--accent-rgb),.5);
text-shadow: 0 0 12px rgba(var(--accent-rgb),.6), 0 1px 3px rgba(0,0,0,.5);
box-shadow: 0 3px 12px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.08), 0 0 15px rgba(var(--accent-rgb),.08);
}
.app-title{ font-family: var(--pixel-font); letter-spacing:.5px; color: var(--ink); opacity:.9; text-shadow: 0 2px 4px rgba(0,0,0,.3); }
.tb-btn{
border:2px solid rgba(var(--btn-start-rgb),.8);
background:linear-gradient(135deg, #15301e 0%, #102417 100%);
color:var(--ink);
padding:10px 16px;
border-radius:6px;
cursor:pointer;
font-weight:800;
font-family:var(--pixel-font);
font-size:11px;
transition: all .3s ease;
box-shadow: 0 3px 10px rgba(0,0,0,.3),
inset 0 1px 0 rgba(255,255,255,.08);
position: relative;
overflow: hidden;
}
.tb-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb),.2), transparent);
transition: left .5s ease;
}
.tb-btn:hover::before {
left: 100%;
}
.tb-btn:hover{
background:linear-gradient(135deg, var(--btn-end) 0%, #15301e 100%);
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(0,0,0,.4),
inset 0 1px 0 rgba(255,255,255,.12);
border-color: rgba(var(--accent-rgb),.6);
}
.tb-btn:active{
transform: translateY(0);
box-shadow: 0 2px 6px rgba(0,0,0,.3);
}
/* ── File popup menu ── */
.file-menu-wrap {
position: relative;
display: inline-block;
}
.file-popup {
position: absolute;
top: calc(100% + 6px);
left: 0;
min-width: 180px;
background: linear-gradient(135deg, #152a18 0%, #0f1d12 100%);
border: 2px solid rgba(var(--accent-rgb),.35);
border-radius: 8px;
padding: 6px 0;
box-shadow: 0 10px 32px rgba(0,0,0,.55), 0 0 0 1px rgba(0,0,0,.3);
z-index: 999;
animation: filePopIn .15s ease-out;
}
.file-popup.hidden { display: none; }
@keyframes filePopIn {
from { opacity: 0; transform: translateY(-6px) scale(.96); }
to { opacity: 1; transform: translateY(0) scale(1); }
}
.file-popup-item {
display: block;
width: 100%;
border: none;
background: transparent;
color: #d1f5c4;
font-family: var(--pixel-font);
font-size: 11px;
font-weight: 700;
padding: 10px 18px;
text-align: left;
cursor: pointer;
transition: background .15s, color .15s;
}
.file-popup-item:hover {
background: rgba(var(--accent-rgb),.15);
color: #fff;
}
.file-popup-item.danger {
color: #ff6b5a;
}
.file-popup-item.danger:hover {
background: rgba(255,80,60,.15);
color: #ff4433;
}
.file-popup-divider {
height: 1px;
margin: 4px 12px;
background: rgba(var(--accent-rgb),.2);
}
.tb-run{
background:linear-gradient(135deg, var(--accent) 0%, #49a25c 100%);
color:#0f1d12;
border-color:#2e6f3e;
text-shadow: 0 1px 2px rgba(255,255,255,.4);
box-shadow: 0 3px 12px rgba(var(--accent-rgb),.4),
inset 0 1px 0 rgba(255,255,255,.2);
}
.tb-run:hover{
background:linear-gradient(135deg, #8ee280 0%, #55b86a 100%);
box-shadow: 0 6px 20px rgba(var(--accent-rgb),.6),
inset 0 1px 0 rgba(255,255,255,.3);
}
/* ═══════════════════════════════════════════
IDE LAYOUT — Title Bar, Tab Bar, Status Bar
═══════════════════════════════════════════ */
/* ── IDE Title Bar ── */
.ide-titlebar {
display: flex;
align-items: center;
justify-content: space-between;
height: 48px;
min-height: 48px;
background: linear-gradient(180deg, #1a2e1d 0%, #111f14 100%);
padding: 0 14px;
border-bottom: 1px solid rgba(var(--btn-start-rgb),.5);
z-index: 100;
flex-shrink: 0;
position: relative;
}
.ide-titlebar-left {
display: flex;
align-items: center;
gap: 2px;
z-index: 2;
}
.ide-titlebar-center {
position: absolute;
left: 50%;
transform: translateX(-50%);
display: flex;
align-items: center;
gap: 8px;
pointer-events: none;
}
.ide-titlebar-right {
display: flex;
align-items: center;
gap: 8px;
z-index: 2;
}
.ide-logo {
height: 36px;
width: auto;
margin-right: 6px;
}
.ide-title {
font-family: var(--pixel-font);
font-size: 9px;
color: var(--muted);
letter-spacing: .5px;
opacity: .65;
}
.ide-center-logo {
height: 50px;
width: auto;
object-fit: contain;
pointer-events: none;
filter: drop-shadow(0 1px 4px rgba(0,0,0,.4));
}
.ide-menu-btn {
background: linear-gradient(135deg, var(--btn-start) 0%, var(--btn-end) 100%);
border: 1px solid rgba(var(--accent-rgb),.35);
color: var(--ink);
font-family: var(--pixel-font);
font-size: 10px;
padding: 6px 14px;
cursor: pointer;
border-radius: 4px;
transition: background .15s, color .15s, border-color .15s;
letter-spacing: .3px;
font-weight: 700;
}
.ide-menu-btn:hover {
background: linear-gradient(135deg, var(--btn-hover-start) 0%, var(--btn-hover-end) 100%);
border-color: rgba(var(--accent-rgb),.6);
color: #8ee280;
}
/* ── IDE Tab Bar ── */
.ide-tabbar {
display: flex;
align-items: stretch;
height: 20px;
min-height: 20px;
background: #0b160d;
border-bottom: 1px solid rgba(var(--btn-start-rgb),.35);
flex-shrink: 0;
overflow-x: auto;
overflow-y: hidden;
}
.ide-tab {
display: flex;
align-items: center;
gap: 4px;
padding: 0 10px;
background: transparent;
border-right: 1px solid rgba(var(--btn-start-rgb),.2);
cursor: default;
white-space: nowrap;
min-width: 0;
position: relative;
}
.ide-tab.active {
background: var(--panel);
border-bottom: 2px solid var(--accent);
}
.ide-tab-icon {
font-size: 13px;
line-height: 1;
}
.ide-tabbar-fill {
flex: 1;
background: transparent;
}
/* Override current-file-name when inside tab */
.ide-tab .current-file-name {
background: transparent;
border: none;
padding: 0;
box-shadow: none;
font-size: 10px;
font-weight: 700;
color: var(--ink);
text-shadow: none;
letter-spacing: .3px;
max-width: 220px;
}
.unsaved-dot {
display: none;
width: 8px;
height: 8px;
border-radius: 50%;
background: #f5c842;
flex-shrink: 0;
margin-left: 2px;
box-shadow: 0 0 4px #f5c842;
}
.unsaved-dot.visible {
display: inline-block;
animation: unsaved-glow 1.5s ease-in-out infinite;
}
@keyframes unsaved-glow {
0%, 100% { box-shadow: 0 0 4px #f5c842; opacity: 1; }
50% { box-shadow: 0 0 10px #f5c842, 0 0 18px #f5c84266; opacity: .75; }
}
.ide-tab .current-file-name::before {
display: none;
}
.ide-tab .current-file-name:hover {
border: none;
box-shadow: none;
text-shadow: none;
}
/* ── IDE Status Bar ── */
.ide-statusbar {
display: flex;
align-items: center;
justify-content: space-between;
height: 32px;
min-height: 32px;
background: linear-gradient(180deg, #162e1b 0%, #0e1f12 100%);
border-top: 1px solid rgba(var(--btn-start-rgb),.4);
padding: 0 14px;
flex-shrink: 0;
z-index: 100;
}
.ide-statusbar-left {
display: flex;
gap: 10px;
align-items: center;
}
.ide-statusbar-right {
display: flex;
gap: 8px;
align-items: center;
}
.ide-status-lang {
font-family: var(--pixel-font);
font-size: 10px;
color: var(--muted);
letter-spacing: .3px;
}
/* Status chips compact for statusbar */
.ide-statusbar .status-chip {
padding: 4px 10px;
font-size: 10px;
border-width: 1px;
border-radius: 4px;
}
/* ── IDE Run Button (compact for titlebar) ── */
.ide-run-icon {
font-size: 10px;
margin-right: 2px;
}
.ide-titlebar .run-dropdown .btn-primary {
min-width: 140px;
padding: 6px 28px;
font-size: 10px;
border-radius: 6px 0 0 6px;
}
.ide-titlebar .btn-dropdown-toggle {
padding: 6px 10px;
font-size: 9px;
border-radius: 0 6px 6px 0;
}
/* Workspace layout */
.workspace{ display:flex; gap:0; padding:12px; flex:1; min-height:0; overflow:hidden; }
/* Sidebar drag-resize handle */
.sidebarResizer{ width:6px; background:linear-gradient(180deg, #35543b, #2a4530); cursor:ew-resize; border-radius:2px; flex-shrink:0; transition: background .2s ease; position:relative; z-index:5; margin:0 3px; }
.sidebarResizer:hover, .sidebarResizer.active{ background:linear-gradient(180deg, var(--accent), #49a25c); }
.sidebarResizer::after{ content:''; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); width:2px; height:30px; background:rgba(var(--accent-rgb),.5); border-radius:1px; }
.sidebar{
width: 520px;
min-width: 200px;
max-width: 70%;
flex-shrink: 0;
background:linear-gradient(135deg, rgba(24,54,29,.95) 0%, rgba(18,40,22,.95) 100%);
outline:2px solid rgba(var(--btn-start-rgb),.9);
padding:16px;
box-shadow:0 6px 24px rgba(0,0,0,.4),
inset 0 1px 0 rgba(var(--accent-rgb),.1);
border-radius:8px;
backdrop-filter: blur(6px);
overflow-y:auto;
position: relative;
}
.sidebar::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2px;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb),.4), transparent);
animation: slideGlow 3s ease-in-out infinite;
}
@keyframes slideGlow {
0%, 100% { opacity: 0.3; }
50% { opacity: 0.8; }
}
.workspace-main{ flex:1; display:flex; flex-direction:column; gap:8px; overflow:hidden; height:100%; min-height:0; min-width:0; width:100%; max-width:100%; box-sizing:border-box; }
.sd-section{ font-family:var(--pixel-font); font-size:11px; color:var(--accent-2); margin:12px 0 8px; text-transform:uppercase; letter-spacing:.8px; text-shadow: 0 1px 2px rgba(0,0,0,.3); }
.explorer-list, .themes-list{ list-style:none; padding:0; margin:0; }
.explorer-list li, .themes-list li{ padding:8px 10px; border-left:3px solid transparent; cursor:pointer; transition: all .2s ease; border-radius:3px; margin-bottom:2px; }
.explorer-list li:hover, .themes-list li:hover{ background:rgba(26,58,33,.8); border-left-color:var(--accent); transform: translateX(2px); }
.themes-list .active{ background:linear-gradient(90deg, rgba(34,75,43,.9) 0%, rgba(26,58,33,.7) 100%); border-left-color:var(--accent); box-shadow: inset 0 1px 3px rgba(0,0,0,.2); }
.navbar img{ margin-right: 10px; }
.logoContainer{ display:flex; justify-content:flex-end; align-items:center; }
.logo-img{ height: 96px; width: auto; max-width: 260px; object-fit: contain; }
.logoName{ text-shadow: 2px 2px 0 #3a271c; margin: 0 0 0 8px; }
/* Mode Selector - OLD (replaced with dropdown) */
/*
.mode-selector {
display: flex;
gap: 6px;
align-items: center;
background: linear-gradient(135deg, rgba(13,27,15,.95) 0%, rgba(18,36,20,.9) 100%);
padding: 6px;
border-radius: 10px;
border: 2px solid rgba(var(--accent-rgb),.15);
box-shadow: 0 4px 16px rgba(0,0,0,.6),
inset 0 1px 0 rgba(var(--accent-rgb),.1);
position: relative;
overflow: hidden;
backdrop-filter: blur(8px);
}
.mode-radio {
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
font-family: var(--pixel-font);
font-size: 11px;
color: rgba(166,195,169,.7);
padding: 10px 18px;
border-radius: 7px;
transition: all .4s cubic-bezier(0.34, 1.56, 0.64, 1);
position: relative;
z-index: 1;
min-width: 85px;
background: transparent;
border: 2px solid transparent;
user-select: none;
}
.mode-radio:hover {
color: rgba(166,195,169,.95);
background: rgba(var(--accent-rgb),.08);
border-color: rgba(var(--accent-rgb),.2);
transform: translateY(-1px);
}
.mode-radio input[type="radio"] {
position: absolute;
opacity: 0;
cursor: pointer;
width: 0;
height: 0;
}
.mode-radio input[type="radio"]:checked ~ span {
color: var(--accent);
font-weight: bold;
letter-spacing: 0.5px;
animation: modeGlow 0.5s ease-out;
}
.mode-radio input[type="radio"]:checked {
accent-color: var(--accent);
}
.mode-radio:has(input:checked) {
color: var(--accent);
background: rgba(var(--accent-rgb),.12);
border-color: rgba(var(--accent-rgb),.4);
transform: scale(1.03);
}
@keyframes modeGlow {
0% {
text-shadow: 0 0 4px rgba(var(--accent-rgb),.4);
}
50% {
text-shadow: 0 2px 6px rgba(0,0,0,.6);
}
100% {
text-shadow: 0 2px 4px rgba(0,0,0,.5);
}
}
*/
/* Sidebar tokens table */
.side-tokens{ max-height: 90%; overflow:auto; margin-top:8px; border-radius:6px; outline:2px solid rgba(var(--btn-start-rgb),.6); box-shadow:0 2px 10px rgba(0,0,0,.25), inset 0 1px 0 rgba(255,255,255,.05); background:linear-gradient(135deg, rgba(24,54,29,.9), rgba(18,40,22,.9)); }
.side-token-table{ width:100%; border-collapse:separate; border-spacing:0; color: #e8ffe4; font-size:12px; }
.side-token-table thead th{ position:sticky; top:0; z-index:2; background:linear-gradient(135deg, var(--btn-end), #153018); padding:8px; font-family:var(--pixel-font); font-size:10px; letter-spacing:.5px; text-align:left; color: #ffd36e; font-weight: bold; border: 1px solid rgba(var(--btn-start-rgb),.6); box-shadow: 0 2px 4px rgba(0,0,0,.3); }
.side-token-table td{ padding:6px 8px; border: 1px solid rgba(var(--btn-start-rgb),.4); word-break:break-word; font-weight: bold; color: #e8ffe4; }
.side-token-table td:first-child{ color: #f2ffef; }
.side-token-table td:nth-child(2){ color: #89cff0; }
.side-token-table td:nth-child(3){ color: #ffa86a; }
.side-token-table tr:nth-child(even){ background:rgba(16,36,20,.7); }
.side-token-table tr:nth-child(odd){ background:rgba(20,44,26,.7); }
.side-token-table tr:hover{ background:rgba(var(--btn-start-rgb),.55) !important; transition: background .15s ease; }
/* Make Token Type (3rd column) a bit smaller to fit */
.side-token-table th:nth-child(3), .side-token-table td:nth-child(3){
font-size: 11px;
white-space: normal;
overflow-wrap: anywhere;
}
/* Dropdown + Buttons */
.button-group{
display:inline-flex;
border-radius:6px;
overflow:hidden;
box-shadow:0 4px 16px rgba(0,0,0,.4);
}
.button-group button{
padding:12px 16px;
border:none;
background:linear-gradient(135deg, rgba(24,54,29,.95) 0%, rgba(18,40,22,.95) 100%);
color:var(--ink);
cursor:pointer;
font-size:13px;
font-weight:800;
font-family:var(--pixel-font);
letter-spacing:.6px;
transition: all .3s ease;
position: relative;
}
.button-group button::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(135deg, rgba(var(--accent-rgb),.1), transparent);
opacity: 0;
transition: opacity .3s ease;
}
.button-group button:hover::before {
opacity: 1;
}
.button-group button:hover{
background:linear-gradient(135deg, rgba(32,75,43,.95) 0%, rgba(26,58,33,.95) 100%);
}
.button-group .dropdown-toggle{ border-left:2px solid rgba(var(--accent-rgb),0.2); }
.nav-links{
list-style:none;
padding:0;
margin:0;
position:absolute;
background:linear-gradient(135deg, rgba(32,75,43,.98) 0%, rgba(26,58,33,.98) 100%);
width:auto;
z-index:10;
box-shadow:0 10px 30px rgba(0,0,0,.5);
transition:all .3s ease;
outline:2px solid rgba(var(--accent-rgb),.6);
border-radius:6px;
overflow:hidden;
backdrop-filter:blur(10px);
}
.nav-links li a{
display:block;
padding:12px 18px;
text-decoration:none;
color:var(--ink);
font-family:var(--pixel-font);
font-size:11px;
transition: all .3s ease;
position: relative;
}
.nav-links li a::before {
content: '';
position: absolute;
left: 0;
top: 0;
width: 3px;
height: 100%;
background: linear-gradient(180deg, var(--accent), #49a25c);
transform: scaleY(0);
transition: transform .3s ease;
}
.nav-links li a:hover::before {
transform: scaleY(1);
}
.nav-links li a:hover{
background:rgba(var(--btn-start-rgb),.6);
padding-left: 22px;
}
.hidden{ display:none; }
/* Layout */
.mainCont{ display:flex; height:55%; padding:0; gap:8px; position:relative; flex-shrink:0; min-height:0; }
.textFieldCont{
display:flex;
width:100%;
min-width:50%;
background:linear-gradient(135deg, rgba(24,54,29,.95) 0%, rgba(18,40,22,.95) 100%);
border-radius:8px;
outline:2px solid rgba(var(--btn-start-rgb),.9);
padding:10px;
box-shadow:0 6px 24px rgba(0,0,0,.4),
inset 0 1px 0 rgba(var(--accent-rgb),.1);
position:relative;
height:auto;
backdrop-filter: blur(6px);
transition: all .3s ease;
}
.textFieldCont:hover{
box-shadow:0 8px 32px rgba(0,0,0,.5),
inset 0 1px 0 rgba(var(--accent-rgb),.15);
outline-color: rgba(var(--accent-rgb),.7);
}
.editor-header{ display:flex; align-items:center; justify-content:space-between; background:linear-gradient(135deg, rgba(26,58,33,.7), rgba(16,36,23,.6)); border-radius:4px; padding:6px 8px; margin-bottom:8px; border:1px solid rgba(var(--btn-start-rgb),.5); }
.editor-tabs{ display:flex; gap:6px; }
.tab{ padding:6px 10px; border-radius:4px; border:1px solid transparent; font-family:var(--pixel-font); font-size:10px; color:var(--ink); background:transparent; cursor:pointer; transition:all .2s ease; }
.tab:hover{ background:rgba(26,58,33,.55); }
.tab.active{ background:linear-gradient(135deg, var(--btn-hover-end), var(--btn-end)); border-color:var(--btn-start); box-shadow: inset 0 1px 2px rgba(0,0,0,.25); }
.editor-actions .tab-btn{ padding:6px 8px; border:1px solid var(--btn-start); border-radius:4px; background:linear-gradient(135deg, #15301e, #102417); color:var(--ink); font-family:var(--pixel-font); font-size:10px; cursor:pointer; }
.editor-body{ height: calc(100% - 36px); }
.widthResizer{ width:4px; background:linear-gradient(135deg, #35543b, #2a4530); cursor:ew-resize; position:relative; height:10%; top:45%; border-radius:2px; transition: background .2s ease; }
.widthResizer:hover{ background:linear-gradient(135deg, #4a6d4f, #35543b); }
.heightResizer{ width:100%; height:6px; background:linear-gradient(180deg, #35543b, #2a4530); cursor:ns-resize; border-radius:2px; flex-shrink:0; transition: background .2s ease; position:relative; z-index:5; }
.heightResizer:hover, .heightResizer.active{ background:linear-gradient(180deg, var(--accent), #49a25c); }
.heightResizer::after{ content:''; position:absolute; left:50%; top:50%; transform:translate(-50%,-50%); width:30px; height:2px; background:rgba(var(--accent-rgb),.5); border-radius:1px; }
.outputCont{ flex:1; display:flex; flex-direction:column; overflow-y:auto; border-radius:6px; overflow-x:hidden; }
/* Mobile tokens section - visible by default, hidden on desktop */
.mobile-tokens{
display: none;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 92%;
max-width: 500px;
height: 65vh;
max-height: 600px;
overflow: hidden;
border-radius: 12px;
background: rgba(24,54,29,.98);
outline: 3px solid rgba(var(--accent-rgb),.6);
box-shadow: 0 10px 50px rgba(0,0,0,.7), 0 0 0 1px rgba(var(--accent-rgb),.3);
z-index: 1000;
flex-direction: column;
will-change: transform;
}
.mobile-tokens.show {
display: flex !important;
}
.mobile-tokens-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px 16px;
background: linear-gradient(135deg, #2a4c30 0%, #234026 100%);
border-bottom: 2px solid rgba(var(--btn-start-rgb),.8);
}
.mobile-tokens-title {
font-family: var(--pixel-font);
font-size: 12px;
letter-spacing: 0.8px;
color: var(--accent-2);
margin: 0;
text-shadow: 0 1px 2px rgba(0,0,0,.3);
}
.mobile-tokens-close {
background: linear-gradient(135deg, #ff8a5b 0%, #c95f36 100%);
color: #fff;
border: 2px solid #8c3b21;
border-radius: 6px;
width: 36px;
height: 36px;
font-size: 20px;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all .2s ease;
box-shadow: 0 2px 8px rgba(0,0,0,.4);
text-shadow: 0 1px 2px rgba(0,0,0,.3);
}
.mobile-tokens-close:hover {
background: linear-gradient(135deg, #ffa070 0%, #d76f45 100%);
transform: scale(1.05);
}
.mobile-tokens-close:active {
transform: scale(0.95);
box-shadow: 0 1px 4px rgba(0,0,0,.3);
}
.mobile-tokens .tokenTable {
background: transparent;
outline: none;
box-shadow: none;
font-size: 13px;
height: 100%;
overflow-y: auto;
display: block;
min-width: unset;
}
.mobile-tokens .tokenTable thead {
display: table;
width: 100%;
table-layout: fixed;
}
.mobile-tokens .tokenTable tbody {
display: block;
overflow-y: auto;
height: calc(65vh - 90px);
max-height: 510px;
-webkit-overflow-scrolling: touch;
}
.mobile-tokens .tokenTable tr {
display: table;
width: 100%;
table-layout: fixed;
}
.mobile-tokens .tokenTable th {
font-size: 10px;
padding: 10px 8px;
background: linear-gradient(135deg, #2a4c30 0%, #234026 100%);
}
.mobile-tokens .tokenTable td {
padding: 10px 8px;
word-break: break-word;
}
/* Overlay backdrop when table is shown */
.mobile-tokens-backdrop {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.85);
z-index: 999;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.mobile-tokens-backdrop.show {
display: block !important;
}
/* ── Mobile Status Popup ── */
.mobile-status-fab {
display: none;
position: fixed;
bottom: 16px;
right: 16px;
width: 48px;
height: 48px;
border-radius: 50%;
background: linear-gradient(135deg, var(--btn-start), var(--btn-end));
border: 2px solid rgba(var(--accent-rgb),.5);
color: var(--accent);
font-size: 20px;
cursor: pointer;
z-index: 998;
box-shadow: 0 4px 16px rgba(0,0,0,.5), 0 0 0 1px rgba(var(--accent-rgb),.2);
align-items: center;
justify-content: center;
transition: all .2s ease;
}
.mobile-status-fab:active {
transform: scale(0.92);
box-shadow: 0 2px 8px rgba(0,0,0,.4);
}
.mobile-status-fab-icon {
font-size: 14px;
line-height: 1;
}
.mobile-status-backdrop {
display: none;
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.85);
z-index: 999;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
}
.mobile-status-backdrop.show {
display: block !important;
}
.mobile-status-popup {
display: none;
position: fixed;
bottom: 80px;
right: 16px;
width: 220px;
max-width: 80vw;
border-radius: 12px;
background: rgba(24,54,29,.98);
outline: 3px solid rgba(var(--accent-rgb),.6);
box-shadow: 0 10px 50px rgba(0,0,0,.7), 0 0 0 1px rgba(var(--accent-rgb),.3);
z-index: 1000;
flex-direction: column;
overflow: hidden;
}
.mobile-status-popup.show {
display: flex !important;
}
.mobile-status-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px 14px;
background: linear-gradient(135deg, #2a4c30 0%, #234026 100%);
border-bottom: 2px solid rgba(var(--btn-start-rgb),.8);
}
.mobile-status-title {
font-family: var(--pixel-font);
font-size: 11px;
letter-spacing: 0.8px;
color: var(--accent-2);
margin: 0;
text-shadow: 0 1px 2px rgba(0,0,0,.3);
}
.mobile-status-close {
background: linear-gradient(135deg, #ff8a5b 0%, #c95f36 100%);
color: #fff;
border: 2px solid #8c3b21;
border-radius: 6px;
width: 28px;
height: 28px;
font-size: 16px;
font-weight: bold;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all .2s ease;
box-shadow: 0 2px 8px rgba(0,0,0,.4);
}
.mobile-status-close:active {
transform: scale(0.95);
}
.mobile-status-body {
display: flex;
flex-direction: column;
gap: 8px;
padding: 12px 14px;
}
.mobile-status-chip {
font-family: var(--pixel-font);
font-size: 11px;
padding: 8px 12px;
border-radius: 6px;
background: rgba(var(--btn-start-rgb),.3);
border: 1px solid rgba(var(--btn-start-rgb),.5);
color: var(--muted);
letter-spacing: .3px;
text-align: center;
}
.mobile-status-chip.ok {
background: linear-gradient(135deg, var(--accent) 0%, #49a25c 100%);
color: #0f1d12;
border-color: #2e6f3e;
box-shadow: 0 2px 8px rgba(var(--accent-rgb),.3);
}
.mobile-status-chip.err {
background: linear-gradient(135deg, #ff8a5b 0%, #c95f36 100%);
color: #2b0c06;
border-color: #8c3b21;
box-shadow: 0 2px 8px rgba(255,138,91,.3);
}
/* Mobile lexeme toggle button in navbar - hidden on desktop */
.mobile-lexeme-nav-toggle {
display: none;
}
.btn-toggle-lexemes {
background: linear-gradient(135deg, var(--accent) 0%, #49a25c 100%);
color: #0f1d12;
border: 2px solid #2e6f3e;
border-radius: 6px;
padding: 10px 16px;
font-family: var(--pixel-font);
font-size: 11px;
font-weight: 800;
cursor: pointer;
box-shadow: 0 2px 8px rgba(0,0,0,.3);
transition: all .2s ease;
display: flex;
align-items: center;
gap: 6px;
text-shadow: 0 1px 1px rgba(255,255,255,.2);
}
.btn-toggle-lexemes:hover {
background: linear-gradient(135deg, #8ee280 0%, #55b86a 100%);
transform: translateY(-1px);
}
.btn-toggle-lexemes:active {
transform: translateY(0);
box-shadow: 0 1px 4px rgba(0,0,0,.3);
}
#lexeme-toggle-icon {
font-size: 10px;
}
/* Hide mobile elements on desktop */
@media (min-width: 769px) {
.mobile-tokens { display: none !important; }
.mobile-tokens-backdrop { display: none !important; }
.mobile-lexeme-nav-toggle { display: none !important; }
.mobile-status-fab { display: none !important; }
.mobile-status-popup { display: none !important; }
.mobile-status-backdrop { display: none !important; }
}
/* Show on mobile screens */
@media (max-width: 768px) {
html {
overflow-x: hidden !important;
max-width: 100vw;
}
.mobile-lexeme-nav-toggle {
display: flex !important;
align-items: center;
justify-content: center;
}
/* Mobile performance optimizations */
* {
-webkit-tap-highlight-color: rgba(var(--accent-rgb),0.2);
box-sizing: border-box;
}
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
touch-action: manipulation;
overflow-x: hidden !important;
max-width: 100vw;
height: 100vh;
height: -webkit-fill-available;
height: 100dvh;
max-height: 100vh;
max-height: -webkit-fill-available;
max-height: 100dvh;
}
/* Reduce expensive effects on mobile */
.workspace, .sidebar, .textFieldCont, .terminalCont, .tokenTable {
backdrop-filter: none !important;
}
body::before {
display: none !important;
}
/* Simplify shadows on mobile */
.navbar, .toolbar, .textFieldCont, .terminalCont {
box-shadow: 0 2px 8px rgba(0,0,0,.2) !important;
}
/* Prevent text selection on interactive elements */
button, .btn, .tb-btn, .term-btn {
-webkit-user-select: none;
user-select: none;
}
}
/* Token Table */
.tokenTable{
border-collapse:collapse;
width:100%;
min-width:600px;
background:linear-gradient(135deg, rgba(24,54,29,.95) 0%, rgba(18,40,22,.95) 100%);
color: white;
border-radius:8px;
outline:2px solid rgba(var(--btn-start-rgb),.9);
box-shadow:0 6px 24px rgba(0,0,0,.4),
inset 0 1px 0 rgba(var(--accent-rgb),.1);
overflow:hidden;
}
.tokenTable th{
background:linear-gradient(135deg, var(--btn-end) 0%, #153018 100%);
color: #ffd36e;
text-align:center;
padding:12px 14px;
font-family:var(--pixel-font);
font-size:11px;
letter-spacing:.6px;
text-shadow: 0 1px 3px rgba(0,0,0,.4);
font-weight: bold;
border: 1px solid rgba(var(--btn-start-rgb),.7);
position: sticky;
top: 0;
z-index: 2;
}
.tokenTable th::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 100%;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb),.5), transparent);
}
.tokenTable td{
text-align:left;
padding:10px 14px;
font-size:14px;
word-break:break-word;
border: 1px solid rgba(var(--btn-start-rgb),.4);
font-weight: bold;
transition: background .15s ease;
color: #e8ffe4;
}
.tokenTable td:first-child{ color: #f2ffef; }
.tokenTable td:nth-child(2){ color: #89cff0; }
.tokenTable td:nth-child(3){ color: #ffa86a; }
.tokenTable tr:nth-child(even){ background:rgba(16,36,20,.75); }
.tokenTable tr:nth-child(odd){ background:rgba(20,44,26,.75); }
.tokenTable tr:hover{
background:rgba(var(--btn-start-rgb),.6) !important;
}
/* Make Token Type (3rd column) smaller to aid fit */
.tokenTable th:nth-child(3), .tokenTable td:nth-child(3){
font-size: 12px;
white-space: normal;
overflow-wrap: anywhere;
}
/* Terminal */
.terminalCont{
width:100%;
max-width:100%;
height:40%;
min-height:200px;
flex-shrink:0;
background:linear-gradient(135deg, rgba(24,54,29,.95) 0%, rgba(18,40,22,.95) 100%);
border-radius:8px;
border:2px solid rgba(var(--btn-start-rgb),.9);
color:var(--ink);
margin:0;
display:flex;
flex-direction:column;
overflow:hidden;
box-shadow:0 6px 24px rgba(0,0,0,.4),
inset 0 1px 0 rgba(var(--accent-rgb),.1);
backdrop-filter: blur(6px);
position:relative;
box-sizing:border-box;
}
.terminal-header{
display:flex;
align-items:center;
justify-content:space-between;
gap:10px;
padding:8px 12px;
border-bottom:2px solid rgba(var(--btn-start-rgb),.7);
background:linear-gradient(135deg, rgba(26,58,33,.8), rgba(16,36,23,.7));
box-shadow: 0 2px 10px rgba(0,0,0,.2);
flex-shrink: 0;
}
.panel-tabs{ display:flex; gap:6px; }
.panel-tabs .tab{ padding:6px 10px; border-radius:4px; border:1px solid transparent; font-family:var(--pixel-font); font-size:10px; color:var(--ink); background:transparent; cursor:pointer; transition:all .2s ease; }
.panel-tabs .tab:hover{ background:rgba(26,58,33,.55); }
.panel-tabs .tab.active{ background:linear-gradient(135deg, var(--btn-hover-end), var(--btn-end)); border-color:var(--btn-start); box-shadow: inset 0 1px 2px rgba(0,0,0,.25); }
.term-title{
font-family:var(--pixel-font);
font-size:11px;
letter-spacing:.9px;
color:var(--accent-2);
display:flex;
align-items:center;
gap:10px;
text-shadow: 0 1px 3px rgba(0,0,0,.4);
}
.dot{
width:10px;
height:10px;
border-radius:50%;
display:inline-block;
animation: pulse 2s ease-in-out infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.1); opacity: 0.8; }
}
.dot-green{
background:var(--accent);
box-shadow:0 0 8px rgba(var(--accent-rgb),.7),
inset 0 0 4px rgba(255,255,255,.3);
}
.term-actions{ display:flex; gap:8px; }
.term-btn{
padding:7px 12px;
border:2px solid rgba(var(--btn-start-rgb),.8);
border-radius:5px;
cursor:pointer;
font-family:var(--pixel-font);
font-size:10px;
font-weight:800;
color:var(--ink);
background:linear-gradient(135deg, #15301e, #102417);
box-shadow:0 3px 10px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.08);
transition:all .3s ease;
}
.term-btn:hover{
transform: translateY(-2px);
background:linear-gradient(135deg, var(--btn-end), #15301e);
box-shadow:0 5px 15px rgba(0,0,0,.4),
inset 0 1px 0 rgba(255,255,255,.12);
border-color: rgba(var(--accent-rgb),.6);
}
.term-btn[aria-pressed="true"]{
background:linear-gradient(135deg, var(--accent), #49a25c);
color:#0f1d12;
border-color:#2e6f3e;
box-shadow:0 3px 12px rgba(var(--accent-rgb),.5),
inset 0 1px 0 rgba(255,255,255,.2);
}
.term-btn.danger{
background:linear-gradient(135deg, #5b2a1e, #3a1b14);
border-color:#8c3b21;
box-shadow:0 3px 10px rgba(255,138,91,.3);
}
.term-btn.danger:hover{
background:linear-gradient(135deg, #7a3a2a, #5b2a1e);
box-shadow:0 5px 15px rgba(255,138,91,.5);
}
/* Status chips inside terminal */
.term-status{ display:flex; flex-wrap:nowrap; gap:6px; align-items:center; padding:6px 8px; border-bottom:2px solid rgba(var(--btn-start-rgb),.4); background:linear-gradient(135deg, rgba(18,40,22,.7), rgba(12,28,17,.7)); }
.term-status .status-chip{ padding:4px 8px; font-size:10px; white-space:nowrap; }
.terminal-body{ flex:1; padding:12px; position:relative; overflow:auto; border:2px solid rgba(var(--btn-start-rgb),.6); border-radius:6px; box-shadow: inset 0 2px 6px rgba(0,0,0,.5); background:linear-gradient(135deg,var(--panel-2),#0a1a0e 60%); }
#terminal{
height:100%; width:100%; background:#0a1a0e; color:var(--ink);
border:none; border-radius:4px;
padding:0; overflow:hidden; box-shadow: inset 0 2px 8px rgba(0,0,0,.4);
font-family: 'Courier New', monospace; font-size:14px; line-height:1.4;
}
.panel-placeholder{ position:absolute; inset:12px; background:linear-gradient(135deg, rgba(24,54,29,.6), rgba(18,40,22,.6)); color:var(--muted); border:1px dashed rgba(var(--btn-start-rgb),.6); border-radius:6px; display:flex; align-items:center; justify-content:center; font-family:var(--pixel-font); font-size:10px; letter-spacing:.6px; }
.token-value{ white-space:pre; }
/* Analysis status row */
.analysis-status{ display:flex; gap:12px; align-items:center; padding:10px 16px; height:auto; flex-shrink:0; }
.status-chip{ padding:6px 12px; border:2px solid rgba(var(--btn-start-rgb),.8); background:linear-gradient(135deg, rgba(16,36,23,.95) 0%, rgba(12,28,17,.95) 100%); border-radius:4px; font-family:var(--pixel-font); font-size:10px; color:var(--ink); box-shadow: 0 2px 6px rgba(0,0,0,.2), inset 0 1px 0 rgba(255,255,255,.05); text-align: center; white-space: nowrap; box-sizing: border-box; }
.status-chip.ok{ background:linear-gradient(135deg, var(--accent) 0%, #49a25c 100%); color:#0f1d12; border-color:#2e6f3e; box-shadow: 0 2px 8px rgba(var(--accent-rgb),.3), inset 0 1px 0 rgba(255,255,255,.2); }
.status-chip.err{ background:linear-gradient(135deg, #ff8a5b 0%, #c95f36 100%); color:#2b0c06; border-color:#8c3b21; box-shadow: 0 2px 8px rgba(255,138,91,.3), inset 0 1px 0 rgba(255,255,255,.2); }
/* Accessibility */
.sr-only{ position:absolute !important; width:1px !important; height:1px !important; padding:0 !important; margin:-1px !important; overflow:hidden !important; clip:rect(0,0,0,0) !important; white-space:nowrap !important; border:0 !important; }
/* HUD */
.hud{ display:flex; align-items:center; gap:14px; }
.coin-badge{ background:linear-gradient(135deg, #ffd36e 0%, #ffb800 100%); color:#3a271c; font-weight:800; padding:6px 12px; border-radius:6px; border:2px solid #f3a300; box-shadow: 0 3px 10px rgba(var(--accent-2-rgb),.4), inset 0 1px 0 rgba(255,231,169,.6); min-width:50px; text-align:center; font-family:var(--pixel-font); transition: transform .2s ease; }
.coin-badge:hover{ transform: scale(1.05); }
.energy-wrap{ display:flex; align-items:center; gap:10px; }
.energy-bar{ width:170px; height:16px; background:#0a1a0e; border-radius:8px; padding:2px; border:2px solid #2d5d38; box-shadow: inset 0 2px 6px rgba(0,0,0,.4), 0 2px 8px rgba(0,0,0,.2); }
.energy-fill{ height:100%; background:linear-gradient(90deg, var(--accent) 0%, #b6ff85 100%); border-radius:6px; box-shadow:0 0 12px rgba(var(--accent-rgb),.6), inset 0 1px 0 rgba(255,255,255,.3); transition: width .3s ease; }
.energy-label{ color:var(--ink); font-weight:700; font-family:var(--pixel-font); font-size:12px; text-shadow: 0 1px 2px rgba(0,0,0,.3); }
/* Status Bar */
.statusbar{ position:fixed; bottom:0; left:0; right:0; height:28px; background:linear-gradient(180deg, #15301e, var(--panel-2)); border-top:3px solid var(--btn-start); color:var(--ink); display:flex; align-items:center; justify-content:space-between; padding:0 12px; font-size:12px; }
.sb-left{ opacity:.85; }
.sb-right{ opacity:.85; }
/* Decorative leaves removed */
/* Buttons */
.btn{
border-radius:6px;
padding:12px 20px;
border:2px solid rgba(var(--btn-start-rgb),.8);
background:linear-gradient(135deg, var(--btn-end) 0%, #15301e 100%);
color:var(--ink);
font-weight:800;
cursor:pointer;
font-family:var(--pixel-font);
font-size:11px;
transition: all .3s ease;
box-shadow: 0 4px 12px rgba(0,0,0,.3), inset 0 1px 0 rgba(255,255,255,.08);
position: relative;
overflow: hidden;
}
.btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(var(--accent-rgb),.25), transparent);
transition: left .5s ease;
}
.btn:hover::before {
left: 100%;
}
.btn:hover{
background:linear-gradient(135deg, var(--btn-hover-end) 0%, var(--btn-end) 100%);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0,0,0,.4),
inset 0 1px 0 rgba(255,255,255,.12);
border-color: rgba(var(--accent-rgb),.7);
}
.btn:active{
transform: translateY(0);
box-shadow: 0 2px 8px rgba(0,0,0,.3);
}
.btn-primary{
background:linear-gradient(135deg, var(--btn-start) 0%, var(--btn-end) 100%);
border-color:var(--btn-end);
color:var(--accent);
text-shadow:0 1px 2px rgba(0,0,0,.5);
box-shadow: 0 4px 16px rgba(0,0,0,.4),
inset 0 1px 0 rgba(var(--accent-rgb),.15);
min-width: 140px;
padding: 10px 32px;
}
.btn-primary:hover{
background:linear-gradient(135deg, var(--btn-hover-start) 0%, var(--btn-hover-end) 100%);
box-shadow: 0 6px 24px rgba(0,0,0,.5),
inset 0 1px 0 rgba(var(--accent-rgb),.25);
color:#8ee280;
}
/* Run dropdown button group */
.run-dropdown {
position: relative;
display: flex;
gap: 0;
}
.run-dropdown .btn-primary {
border-radius: 8px 0 0 8px;
min-width: 120px;
}
.btn-dropdown-toggle {
background: linear-gradient(135deg, var(--btn-start) 0%, var(--btn-end) 100%);
border: 2px solid var(--btn-end);
border-left: 1px solid rgba(var(--accent-rgb),0.2);
border-radius: 0 8px 8px 0;
color: var(--accent);
font-family: 'Press Start 2P', monospace;
font-size: 10px;
padding: 10px 12px;
cursor: pointer;
text-shadow: 0 1px 2px rgba(0,0,0,.5);
box-shadow: 0 4px 16px rgba(0,0,0,.4), inset 0 1px 0 rgba(var(--accent-rgb),.15);
transition: all 0.2s ease;
}
.btn-dropdown-toggle:hover {
background: linear-gradient(135deg, var(--btn-hover-start) 0%, var(--btn-hover-end) 100%);
color: #8ee280;
box-shadow: 0 6px 24px rgba(0,0,0,.5), inset 0 1px 0 rgba(var(--accent-rgb),.25);
}
.run-dropdown-menu {
position: absolute;
top: 100%;
right: 0;
margin-top: 8px;
background: linear-gradient(135deg, var(--btn-start) 0%, var(--btn-end) 100%);
border: 2px solid var(--btn-end);
border-radius: 8px;
min-width: 160px;
box-shadow: 0 8px 32px rgba(0,0,0,.6);
z-index: 1000;
overflow: hidden;
}
.run-dropdown-menu.hidden {
display: none;
}
.run-dropdown-item {
padding: 12px 20px;
color: var(--accent);
font-family: 'Press Start 2P', monospace;
font-size: 10px;
cursor: pointer;
transition: all 0.2s ease;
border-bottom: 1px solid rgba(var(--accent-rgb),0.1);
}
.run-dropdown-item:last-child {
border-bottom: none;
}
.run-dropdown-item:hover {
background: rgba(var(--accent-rgb),0.15);
color: #8ee280;
}
/* Utility */
.garden-wood{ border-bottom: 3px solid #3f2c20; }
/* Responsive spacing adjustments */
@media (max-height: 700px){ .mainCont{ padding-bottom: 10px; } }
/* ===== MOBILE OPTIMIZATIONS ===== */
/* Tablet breakpoint: 769px - 1024px */
@media (max-width: 1024px) and (min-width: 769px) {
.workspace {
gap: 8px;
}
.sidebar {
width: 280px;
min-width: 200px;
}
.ide-logo {
height: 24px;
}
.side-token-table {
font-size: 11px;
}
}
/* Mobile: avoid duplicate lexeme tables by hiding sidebar and using single column */
@media (max-width: 768px){
/* Disable animations for performance */
*, *::before, *::after {
animation-duration: 0.01s !important;
transition-duration: 0.15s !important;
}
body::before {
display: none;
}
.coin-badge{ font-size:10px; padding:3px 8px; }
.workspace {
flex-direction: column;
flex: 1;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
padding: 8px;
gap: 8px;
max-width: 100vw;
box-sizing: border-box;
}
.sidebar { display: none !important; }
.sidebarResizer { display: none !important; }
.workspace-main {
overflow: hidden;
height: auto;
gap: 8px;
max-width: 100%;
width: 100%;
}
/* Adjust main container for mobile */
.mainCont {
flex-direction: column;
height: auto;
min-height: 250px;
padding: 0;
max-width: 100%;
overflow: hidden;
}
.textFieldCont {
width: 100%;
min-width: 100%;
height: 45vh;
min-height: 200px;
max-height: 350px;
margin-bottom: 0;
padding: 6px;
}
.widthResizer { display: none; }
/* Hide desktop token table on mobile */
.outputCont { display:none !important; }
/* Terminal adjustments for mobile */
.terminalCont {
height: 35vh;
min-height: 180px;
max-height: 300px;
flex-shrink: 0;
border-radius: 6px;
overflow: hidden;
width: 100%;
max-width: 100%;
box-sizing: border-box;
}
.terminal-header {
max-width: 100%;
overflow: hidden;
}
.terminal-body {
min-height: 120px;
max-height: 200px;
padding: 8px;
}
#terminal {
font-size: 11px;
line-height: 1.3;
}
/* Adjust table for mobile viewing */
.tokenTable {
font-size: 11px;
min-width: unset;
width: 100%;
}
.tokenTable th {
font-size: 9px;
padding: 8px 6px;
letter-spacing: 0.2px;
}
.tokenTable td {
font-size: 11px;
padding: 6px;
}
/* Mobile tokens modal optimization */
.mobile-tokens {
width: 95%;
max-width: none;
height: 60vh;
max-height: none;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 12px;
}
.mobile-tokens .tokenTable {
min-width: unset;
}
.mobile-tokens .tokenTable tbody {
height: calc(60vh - 100px);
max-height: none;
}
.mobile-tokens-header {
padding: 10px 12px;
}
/* ===== IDE TITLEBAR MOBILE ===== */
.ide-titlebar {
height: 36px;
min-height: 36px;
padding: 0 6px;
gap: 6px;
}
.ide-logo {
height: 22px;
}
.ide-titlebar-center {
display: none;
}
.ide-menu-btn {
padding: 4px 6px;
font-size: 9px;
flex-shrink: 0;
}
/* Center lexeme toggle */
.mobile-lexeme-nav-toggle {
flex: 0 1 auto;
display: flex;
justify-content: center;
min-width: 0;
overflow: hidden;
}
.btn-toggle-lexemes {
padding: 4px 8px;
font-size: 8px;
min-height: 28px;
white-space: nowrap;
gap: 3px;
overflow: hidden;
text-overflow: ellipsis;
}
#lexeme-toggle-icon {
font-size: 7px;
}
/* Run dropdown mobile */
.run-dropdown {
flex: 0 0 auto;
}
.ide-titlebar .run-dropdown .btn-primary {
min-width: 60px;
padding: 6px 8px;
font-size: 8px;
min-height: 32px;
}
.ide-run-icon {
display: none;
}
#run-mode-text {
font-size: 8px;
}
.ide-titlebar .btn-dropdown-toggle {
padding: 6px 6px;
font-size: 8px;
min-height: 32px;
}
.run-dropdown-menu {
min-width: 140px;
right: 0;
left: auto;
position: fixed;
top: auto;
margin-top: 4px;
z-index: 9999;
}
.run-dropdown-item {
padding: 14px 16px;
font-size: 10px;
-webkit-tap-highlight-color: rgba(var(--accent-rgb),0.3);
cursor: pointer;
}
/* ===== IDE TABBAR MOBILE ===== */
.ide-tabbar {
height: 30px;
min-height: 30px;
}
.ide-tab {
padding: 0 10px;
}
.ide-tab-icon {
font-size: 11px;
}
.ide-tab .current-file-name {
font-size: 9px;
max-width: 140px;
}
/* ===== TERMINAL HEADER MOBILE ===== */
.terminal-header {
flex-wrap: nowrap;
gap: 6px;
padding: 6px 8px;
}
.term-title {
font-size: 9px;
gap: 6px;
}
.dot {
width: 8px;
height: 8px;
}
.term-actions {
gap: 4px;
flex-shrink: 0;
}
.term-btn {
padding: 6px 10px;
font-size: 8px;
min-height: 28px;
}
/* ===== IDE STATUSBAR MOBILE ===== */
.ide-statusbar {
height: 22px;
min-height: 22px;
padding: 0 6px;
flex-shrink: 0;
position: fixed;
bottom: 0;
left: 0;
right: 0;
z-index: 100;
}
.ide-statusbar .status-chip {
font-size: 7px;
padding: 2px 5px;
}
.ide-status-lang {
font-size: 7px;
}
.mobile-status-fab {
display: none !important;
}
.mobile-status-popup {
display: none !important;
}
.mobile-status-backdrop {
display: none !important;
}
/* ===== FILE MENU MOBILE ===== */
.file-menu-wrap {
position: static;
}
.file-popup {
position: fixed;
top: auto;
bottom: 0;
left: 0;
right: 0;
min-width: 100vw;
border-radius: 16px 16px 0 0;
padding: 10px 0 env(safe-area-inset-bottom, 12px);
animation: filePopUpMobile .2s ease-out;
}
@keyframes filePopUpMobile {
from { opacity: 0; transform: translateY(40px); }
to { opacity: 1; transform: translateY(0); }
}
.file-popup-item {
padding: 16px 24px;
font-size: 13px;
min-height: 44px;
display: flex;
align-items: center;
}
.file-popup-divider {
margin: 4px 16px;
}
}
/* ===== SMALL MOBILE (max 480px) ===== */
@media (max-width: 480px) {
.ide-titlebar {
height: 32px;
min-height: 32px;
padding: 0 6px;
}
.ide-logo {
height: 18px;
}
.ide-menu-btn {
padding: 4px 6px;
font-size: 8px;
}
.btn-toggle-lexemes {
padding: 6px 8px;
font-size: 8px;
}
.ide-titlebar .run-dropdown .btn-primary {
min-width: 50px;
padding: 6px 6px;
font-size: 8px;
}
.ide-titlebar .btn-dropdown-toggle {
padding: 6px 6px;
font-size: 8px;
}
.ide-tabbar {
height: 26px;
min-height: 26px;
}
.ide-tab {
padding: 0 8px;
}
.ide-tab .current-file-name {
max-width: 100px;
font-size: 8px;
}
.ide-tab-icon {
font-size: 10px;
}
.ide-statusbar .status-chip {
font-size: 6px;
padding: 2px 4px;
}
.textFieldCont {
height: 40vh;
min-height: 180px;
padding: 4px;
}
.terminalCont {
height: 30vh;
min-height: 150px;
}
.mobile-tokens {
width: 98%;
height: 70vh;
top: 48%;
border-radius: 8px;
}
.mobile-tokens-header {
padding: 8px 10px;
}
.mobile-tokens-title {
font-size: 10px;
}
.mobile-tokens-close {
width: 28px;
height: 28px;
font-size: 14px;
}
.tokenTable th {
font-size: 8px;
padding: 6px 4px;
}
.tokenTable td {
font-size: 10px;
padding: 4px;
}
.term-btn {
padding: 4px 6px;
font-size: 7px;
}
#terminal {
font-size: 10px;
}
}
/* ===== LANDSCAPE MOBILE ===== */
@media (max-width: 768px) and (orientation: landscape) {
.workspace {
flex: 1;
min-height: 0;
}
.textFieldCont {
height: 50vh;
min-height: 150px;
max-height: 250px;
}
.terminalCont {
height: 40vh;
min-height: 120px;
max-height: 200px;
}
.mobile-tokens {
height: 80vh;
width: 90%;
top: 50%;
}
.mobile-tokens .tokenTable tbody {
height: calc(80vh - 100px);
}
}
/* ===== TOUCH FRIENDLY ENHANCEMENTS ===== */
@media (hover: none) and (pointer: coarse) {
/* Larger touch targets */
.ide-menu-btn,
.term-btn,
.btn,
.btn-primary,
.btn-dropdown-toggle,
.btn-toggle-lexemes {
min-height: 44px;
min-width: 44px;
}
.run-dropdown-item {
padding: 14px 16px;
}
/* Remove hover effects that cause issues on touch */
.ide-menu-btn:hover,
.term-btn:hover,
.btn:hover {
transform: none;
}
.file-popup-item {
min-height: 44px;
}
/* Better scroll behavior */
.workspace,
.mobile-tokens .tokenTable tbody,
.terminal-body {
-webkit-overflow-scrolling: touch;
scroll-behavior: smooth;
}
}
/* ===== AI CHAT PANEL ===== */
.btn-chat-toggle {
display: flex;
align-items: center;
gap: 4px;
font-family: var(--pixel-font);
font-size: 11px;
background: linear-gradient(135deg, var(--btn-start) 0%, var(--btn-end) 100%);
border: 2px solid rgba(var(--btn-start-rgb),.8);
border-radius: 5px;
padding: 4px 18px;
cursor: pointer;
transition: all .3s ease;
box-shadow: 0 3px 8px rgba(0,0,0,.3), inset 0 1px 0 rgba(var(--accent-rgb),.15);
white-space: nowrap;
}
.btn-chat-toggle:hover {
background: linear-gradient(135deg, var(--btn-hover-start) 0%, var(--btn-hover-end) 100%);
border-color: rgba(var(--accent-rgb),.7);
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(0,0,0,.4), inset 0 1px 0 rgba(var(--accent-rgb),.25);
}
.btn-chat-toggle:active {
transform: translateY(0);
box-shadow: 0 2px 8px rgba(0,0,0,.3);
}
.chat-btn-text {
color: var(--accent);
font-size: 8px;
font-weight: 800;
text-shadow: 0 1px 2px rgba(0,0,0,.5);
}
/* Chat backdrop (mobile) */
.chat-backdrop {
display: none;
position: fixed;
inset: 0;
background: rgba(0,0,0,.5);
z-index: 998;
}
.chat-backdrop.show {
display: block;
}
/* ── Chat Panel (Copilot-style) ────────────────────────── */
.chat-panel {
position: fixed;
right: -420px;
top: 0;
bottom: 0;
width: 420px;
max-width: 100vw;
background: var(--bg);
border-left: 1px solid rgba(var(--accent-rgb),.15);
box-shadow: -2px 0 16px rgba(0,0,0,.4);
z-index: 999;
display: flex;
flex-direction: column;
transition: right .3s cubic-bezier(.4,0,.2,1);
box-sizing: border-box;
}
.chat-panel.open {
right: 0;
}
/* Header */
.chat-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
background: linear-gradient(180deg, var(--panel) 0%, rgba(24,54,29,.95) 100%);
border-bottom: 1px solid rgba(var(--accent-rgb),.18);
flex-shrink: 0;
min-height: 52px;
box-sizing: border-box;
}
.chat-header-left {
display: flex;
flex-direction: column;
gap: 2px;
}
.chat-title {
font-family: var(--pixel-font);
font-size: 10px;
color: var(--accent);
letter-spacing: .5px;
}
.chat-subtitle {
font-family: 'Baloo 2', sans-serif;
font-size: 11px;
color: var(--muted);
letter-spacing: .2px;
opacity: .75;
}
.chat-header-actions {
display: flex;
gap: 4px;
}
.chat-header-btn {
background: transparent;
border: 1px solid transparent;
color: var(--muted);
font-size: 14px;
width: 28px;
height: 28px;
border-radius: 4px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all .15s ease;
}
.chat-header-btn:hover {
background: rgba(var(--accent-rgb),.08);
color: var(--ink);
border-color: rgba(var(--accent-rgb),.2);
}
/* Messages container — KEY: min-height:0 enables flex scroll */
.chat-messages {
flex: 1 1 0;
min-height: 0;
overflow-y: auto;
overflow-x: hidden;
padding: 0;
display: flex;
flex-direction: column;
}
/* Individual message row */
.chat-msg {
padding: 12px 20px;
border-bottom: 1px solid rgba(var(--accent-rgb),.06);
display: flex;
gap: 12px;
align-items: flex-start;
width: 100%;
box-sizing: border-box;
animation: chatMsgIn .25s ease-out;
}
@keyframes chatMsgIn {
from { opacity: 0; transform: translateY(6px); }
to { opacity: 1; transform: translateY(0); }
}
.chat-msg.user {
background: rgba(var(--accent-rgb),.08);
border-left: 3px solid rgba(var(--accent-rgb),.25);
}
.chat-msg.assistant {
background: rgba(13,27,15,.3);
border-left: 3px solid rgba(var(--accent-rgb),.08);
}
/* Avatar icon */
.chat-avatar {
width: 28px;
height: 28px;
border-radius: 6px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: 15px;
line-height: 1;
margin-top: 1px;
}
.chat-msg.user .chat-avatar {
background: rgba(var(--accent-2-rgb),.12);
color: var(--accent-2);
}
.chat-msg.assistant .chat-avatar {
background: rgba(var(--accent-rgb),.18);
color: var(--accent);
}
/* Message content */
.chat-bubble {
flex: 1;
min-width: 0;
font-family: 'Baloo 2', sans-serif;
font-size: 14px;
line-height: 1.6;
color: var(--ink);
word-wrap: break-word;
overflow-wrap: break-word;
word-break: break-word;
padding: 0;
}
.chat-msg.user .chat-bubble {
color: var(--ink);
font-size: 13.5px;
}
.chat-msg.assistant .chat-bubble {
color: #ddf0de;
}
/* Paragraphs inside bubble */
.chat-bubble p {
margin: 0 0 5px 0;
}
.chat-bubble p:last-child {
margin-bottom: 0;
}
/* Lists inside assistant messages */
.chat-bubble ol,
.chat-bubble ul {
margin: 4px 0;
padding-left: 18px;
}
.chat-bubble li {
margin-bottom: 2px;
line-height: 1.5;
}
/* Code blocks */
.chat-bubble .code-block-wrap {
position: relative;
margin: 6px 0;
border-radius: 8px;
overflow: hidden;
border: 1px solid rgba(var(--accent-rgb),.12);
background: #0a140c;
}
.chat-bubble .code-block-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 4px 10px;
background: rgba(var(--accent-rgb),.06);
border-bottom: 1px solid rgba(var(--accent-rgb),.08);
min-height: 26px;
}
.chat-bubble .code-block-lang {
font-family: 'Baloo 2', sans-serif;
font-size: 10px;
color: var(--muted);
text-transform: uppercase;
letter-spacing: .5px;
}
.chat-copy-btn {
background: transparent;
border: 1px solid rgba(var(--accent-rgb),.15);
border-radius: 4px;
color: var(--muted);
font-size: 10.5px;
padding: 2px 8px;
cursor: pointer;
transition: all .15s ease;
font-family: 'Baloo 2', sans-serif;
}
.chat-copy-btn:hover {
background: rgba(var(--accent-rgb),.12);
color: var(--ink);
border-color: rgba(var(--accent-rgb),.3);
}
.chat-copy-btn.copied {
color: var(--accent);
border-color: var(--accent);
}
.chat-bubble .code-block-wrap pre {
margin: 0;
border: none;
border-radius: 0;
padding: 10px 12px;
background: transparent;
}
.chat-bubble pre {
background: #0a140c;
border: 1px solid rgba(var(--accent-rgb),.12);
border-radius: 8px;
padding: 10px 12px;
margin: 6px 0;
overflow-x: auto;
max-width: 100%;
box-sizing: border-box;
font-family: 'Consolas', 'Courier New', monospace;
font-size: 12.5px;
line-height: 1.5;
color: var(--accent);
white-space: pre;
position: relative;
}
/* Subtle horizontal scrollbar inside code blocks */
.chat-bubble pre::-webkit-scrollbar {
height: 4px;
}
.chat-bubble pre::-webkit-scrollbar-track {
background: transparent;
}
.chat-bubble pre::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb),.12);
border-radius: 2px;
}
.chat-bubble pre::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb),.22);
}
.chat-bubble code {
font-family: 'Consolas', 'Courier New', monospace;
font-size: 12px;
background: rgba(var(--accent-rgb),.08);
padding: 2px 5px;
border-radius: 3px;
color: var(--accent);
}
.chat-bubble pre code {
background: transparent;
padding: 0;
font-size: 12px;
}
/* Strong / emphasis inside chat */
.chat-bubble strong {
color: #fff;
font-weight: 700;
letter-spacing: .1px;
}
.chat-bubble em {
color: var(--muted);
}
/* Fallback mode badge */
.chat-fallback-badge {
display: inline-block;
font-size: 10px;
color: #f5c842;
background: rgba(245, 200, 66, 0.1);
border: 1px solid rgba(245, 200, 66, 0.3);
border-radius: 4px;
padding: 3px 8px;
margin-bottom: 8px;
letter-spacing: 0.3px;
}
/* Message type tags */
.chat-msg-tags {
display: flex;
gap: 5px;
flex-wrap: wrap;
margin-bottom: 6px;
}
.chat-tag {
font-family: var(--pixel-font);
font-size: 7px;
padding: 2px 7px;
border-radius: 3px;
letter-spacing: .5px;
text-transform: uppercase;
font-weight: 400;
line-height: 1.4;
}
.chat-tag.tag-syntax { background: rgba(var(--accent-rgb),.12); color: var(--accent); border: 1px solid rgba(var(--accent-rgb),.2); }
.chat-tag.tag-semantic { background: rgba(var(--accent-2-rgb),.1); color: var(--accent-2); border: 1px solid rgba(var(--accent-2-rgb),.2); }
.chat-tag.tag-code { background: rgba(138,180,255,.1); color: #8ab4ff; border: 1px solid rgba(138,180,255,.2); }
.chat-tag.tag-fix { background: rgba(255,138,91,.1); color: var(--accent-3); border: 1px solid rgba(255,138,91,.2); }
.chat-tag.tag-info { background: rgba(166,195,169,.08); color: var(--muted); border: 1px solid rgba(166,195,169,.15); }
/* Action buttons under replies */
.chat-actions {
display: flex;
gap: 6px;
flex-wrap: wrap;
margin-top: 8px;
padding-top: 8px;
border-top: 1px solid rgba(var(--accent-rgb),.06);
}
.chat-action-btn {
font-family: 'Baloo 2', sans-serif;
font-size: 11px;
color: var(--muted);
background: rgba(var(--accent-rgb),.04);
border: 1px solid rgba(var(--accent-rgb),.12);
border-radius: 6px;
padding: 4px 10px;
cursor: pointer;
transition: all .15s ease;
display: flex;
align-items: center;
gap: 4px;
}
.chat-action-btn:hover {
background: rgba(var(--accent-rgb),.1);
color: var(--ink);
border-color: rgba(var(--accent-rgb),.3);
}
.chat-action-btn .action-icon {
font-size: 12px;
}
/* Retry action shown only when a chat request fails */
.chat-msg-error .chat-bubble {
color: var(--accent-3);
}
.chat-error-content {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
.chat-error-text {
color: var(--accent-3) !important;
}
.chat-retry-btn {
height: 30px;
padding: 0 10px;
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--accent);
background: rgba(var(--accent-rgb), .08);
border: 1px solid rgba(var(--accent-rgb), .28);
border-radius: 6px;
font-family: 'Baloo 2', sans-serif;
font-size: 12px;
cursor: pointer;
transition: background .15s ease, border-color .15s ease, color .15s ease;
}
.chat-retry-btn svg {
width: 14px;
height: 14px;
fill: none;
stroke: currentColor;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
}
.chat-retry-btn:hover:not(:disabled) {
color: var(--ink);
background: rgba(var(--accent-rgb), .16);
border-color: rgba(var(--accent-rgb), .52);
}
.chat-retry-btn:disabled {
opacity: .42;
cursor: not-allowed;
}
/* Typing indicator */
.chat-typing {
display: flex;
gap: 4px;
padding: 4px 0;
align-items: center;
}
.chat-typing span {
width: 6px;
height: 6px;
background: var(--accent);
border-radius: 50%;
animation: chatBounce .6s infinite alternate;
opacity: .4;
}
.chat-typing span:nth-child(2) { animation-delay: .2s; }
.chat-typing span:nth-child(3) { animation-delay: .4s; }
@keyframes chatBounce {
to { opacity: 1; transform: translateY(-3px); }
}
/* Thinking indicator — multi-phase */
.chat-thinking {
display: flex;
flex-direction: column;
gap: 6px;
padding: 8px 0;
max-width: 240px;
}
.chat-thinking-status {
display: flex;
align-items: center;
gap: 8px;
font-family: var(--pixel-font);
font-size: 8px;
color: rgba(var(--accent-rgb), .8);
animation: thinkFadeIn .3s ease;
}
.chat-thinking-status .think-icon {
width: 16px;
height: 16px;
border: 2px solid rgba(var(--accent-rgb), .3);
border-top-color: var(--accent);
border-radius: 50%;
animation: thinkSpin .8s linear infinite;
flex-shrink: 0;
}
.chat-thinking-status .think-text {
opacity: 1;
transition: opacity .3s ease;
}
.chat-thinking-status.fading .think-text {
opacity: 0;
}
.chat-thinking-progress {
height: 2px;
background: rgba(var(--accent-rgb), .1);
border-radius: 1px;
overflow: hidden;
}
.chat-thinking-progress-bar {
height: 100%;
background: linear-gradient(90deg, var(--accent), rgba(var(--accent-rgb), .4));
border-radius: 1px;
width: 0%;
animation: thinkProgress 2s ease-out forwards;
}
@keyframes thinkSpin {
to { transform: rotate(360deg); }
}
@keyframes thinkFadeIn {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes thinkProgress {
0% { width: 0%; }
30% { width: 45%; }
60% { width: 70%; }
90% { width: 85%; }
100% { width: 95%; }
}
/* Input area */
.chat-input-area {
padding: 12px 16px 14px;
border-top: 1px solid rgba(var(--accent-rgb),.15);
flex-shrink: 0;
background: linear-gradient(0deg, var(--panel) 0%, rgba(24,54,29,.95) 100%);
}
.chat-context-hint {
margin-bottom: 8px;
}
.chat-context-hint label {
font-family: 'Baloo 2', sans-serif;
font-size: 11px;
color: var(--muted);
cursor: pointer;
display: flex;
align-items: center;
gap: 6px;
}
.chat-context-hint input[type="checkbox"] {
accent-color: var(--accent);
}
.chat-input-row {
display: flex;
gap: 8px;
align-items: flex-end;
}
.chat-input-wrap {
flex: 1;
display: flex;
align-items: center;
background: var(--bg);
border: 1px solid rgba(var(--accent-rgb),.2);
border-radius: 8px;
transition: border-color .2s ease, box-shadow .2s ease;
min-height: 38px;
}
.chat-input-wrap:focus-within {
border-color: var(--accent);
box-shadow: 0 0 0 2px rgba(var(--accent-rgb),.12), 0 0 12px rgba(var(--accent-rgb),.08);
}
.chat-input-icon {
padding-left: 10px;
font-size: 14px;
opacity: .45;
flex-shrink: 0;
pointer-events: none;
display: flex;
align-items: center;
line-height: 1;
}
.chat-input {
flex: 1;
background: transparent;
border: none;
padding: 9px 12px 9px 8px;
color: var(--ink);
font-family: 'Baloo 2', sans-serif;
font-size: 13.5px;
resize: none;
max-height: 120px;
outline: none;
box-sizing: border-box;
}
.chat-input::placeholder {
color: rgba(166,195,169,.4);
}
.chat-send-btn {
width: 38px;
height: 38px;
background: linear-gradient(135deg, #3a8f45, #2a6a32);
border: 1px solid rgba(var(--accent-rgb),.3);
border-radius: 8px;
color: #fff;
font-size: 13px;
cursor: pointer;
flex-shrink: 0;
transition: all .2s ease;
display: flex;
align-items: center;
justify-content: center;
}
.chat-send-btn:hover {
background: linear-gradient(135deg, #4aaf55, #3a8f45);
box-shadow: 0 0 12px rgba(var(--accent-rgb),.25);
transform: translateY(-1px);
}
.chat-send-btn:disabled {
opacity: .4;
cursor: not-allowed;
transform: none;
box-shadow: none;
}
/* Scrollbar */
.chat-messages::-webkit-scrollbar {
width: 6px;
}
.chat-messages::-webkit-scrollbar-track {
background: transparent;
}
.chat-messages::-webkit-scrollbar-thumb {
background: rgba(var(--accent-rgb),.15);
border-radius: 3px;
}
.chat-messages::-webkit-scrollbar-thumb:hover {
background: rgba(var(--accent-rgb),.3);
}
/* ── Empty state / Welcome ──────────────────────────── */
.chat-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
padding: 24px 24px 20px;
text-align: center;
animation: fadeInUp .4s ease-out;
gap: 0;
}
@keyframes fadeInUp {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
.chat-watermark {
margin-bottom: 8px;
opacity: .12;
}
.chat-watermark-logo {
width: 180px;
height: 180px;
object-fit: contain;
image-rendering: pixelated;
filter: drop-shadow(0 0 8px rgba(var(--accent-rgb),.08));
}
.chat-welcome-title {
font-family: 'Baloo 2', sans-serif;
font-size: 16px;
font-weight: 700;
color: var(--ink);
margin-bottom: 2px;
}
.chat-welcome-sub {
font-family: 'Baloo 2', sans-serif;
font-size: 12.5px;
color: var(--muted);
margin-bottom: 8px;
}
.chat-welcome-topics {
display: flex;
flex-wrap: wrap;
gap: 6px;
justify-content: center;
margin-bottom: 16px;
}
.chat-welcome-topics span {
font-family: 'Baloo 2', sans-serif;
font-size: 11px;
color: rgba(166,195,169,.7);
background: rgba(var(--accent-rgb),.04);
border: 1px solid rgba(var(--accent-rgb),.08);
border-radius: 20px;
padding: 3px 10px;
letter-spacing: .2px;
}
/* Suggestion chips (action buttons) */
.chat-suggestion-chips {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: center;
max-width: 340px;
}
.chat-chip {
font-family: 'Baloo 2', sans-serif;
font-size: 12px;
color: var(--accent);
background: rgba(var(--accent-rgb),.08);
border: 1px solid rgba(var(--accent-rgb),.25);
border-radius: 8px;
padding: 7px 14px;
cursor: pointer;
transition: all .2s ease;
white-space: nowrap;
font-weight: 600;
letter-spacing: .1px;
}
.chat-chip:hover {
background: rgba(var(--accent-rgb),.18);
border-color: rgba(var(--accent-rgb),.5);
box-shadow: 0 2px 12px rgba(var(--accent-rgb),.15);
transform: translateY(-1px);
color: #fff;
}
/* Mobile */
@media (max-width: 768px) {
.chat-panel {
width: 100vw;
right: -100vw;
border-left: none;
box-shadow: none;
}
.chat-panel.open {
right: 0;
}
/* Full-height using safe viewport units */
.chat-panel {
top: 0;
bottom: 0;
height: 100vh;
height: 100dvh;
}
/* Larger touch targets */
.chat-header {
padding: 12px 14px;
min-height: 48px;
}
.chat-header-btn {
width: 36px;
height: 36px;
font-size: 16px;
}
/* Messages area fills available space */
.chat-messages {
flex: 1 1 0;
min-height: 0;
}
.chat-msg {
padding: 12px 14px;
}
.chat-bubble {
font-size: 14.5px;
}
.chat-bubble pre {
font-size: 11px;
padding: 8px;
}
.chat-chip {
font-size: 11.5px;
padding: 6px 12px;
}
.chat-welcome-title {
font-size: 16px;
}
/* Input area — safe area padding for phones with notches/gesture bars */
.chat-input-area {
padding: 10px 14px calc(10px + env(safe-area-inset-bottom, 0px));
}
.chat-input {
font-size: 16px; /* prevents iOS zoom on focus */
padding: 10px 12px;
}
.chat-send-btn {
width: 42px;
height: 42px;
font-size: 14px;
}
/* Hide backdrop on mobile — panel is full screen */
.chat-backdrop.show {
display: none;
}
}