Monorepo for Aesthetic.Computer aesthetic.computer
at main 378 lines 8.6 kB view raw
1/* KidLisp Editor - UI Components */ 2 3/* ============================================ 4 TABS 5 ============================================ */ 6 7.tab { 8 padding: 0 16px; 9 cursor: pointer; 10 border-right: 1px solid var(--border-color); 11 height: 100%; 12 display: flex; 13 align-items: center; 14 background: var(--bg-secondary); 15 color: var(--text-tertiary); 16 transition: all 0.2s; 17} 18 19@media (hover: hover) { 20 .tab:hover { filter: brightness(1.1); } 21 #examples-tab:hover { background: rgba(59, 130, 246, 0.35); } 22 #keeps-tab:hover { background: rgba(205, 92, 155, 0.35); } 23 #reference-tab:hover { background: rgba(34, 197, 94, 0.35); } 24} 25 26.tab.active { 27 color: var(--text-primary); 28 border-bottom: 1px solid var(--bg-primary); 29 margin-bottom: -1px; 30 position: relative; 31 z-index: 1; 32 font-weight: 600; 33} 34 35/* Color-coded tabs */ 36#examples-tab { 37 background: var(--tab-examples-bg); 38 color: #1e40af; 39} 40#examples-tab.active { 41 background: var(--tab-examples-active); 42 color: #1e3a8a; 43} 44 45#keeps-tab { 46 background: var(--tab-keeps-bg); 47 color: #9d174d; 48} 49#keeps-tab.active { 50 background: var(--tab-keeps-active); 51 color: #831843; 52} 53 54#reference-tab { 55 background: var(--tab-reference-bg); 56 color: #166534; 57} 58#reference-tab.active { 59 background: var(--tab-reference-active); 60 color: #14532d; 61} 62 63/* ============================================ 64 DROPDOWNS (Generic) 65 ============================================ */ 66 67/* Shared dropdown styles */ 68[data-dropdown] { 69 position: relative; 70} 71 72[data-dropdown-menu] { 73 display: none; 74 position: absolute; 75 top: 100%; 76 background: var(--bg-primary); 77 border: 1px solid var(--border-color); 78 border-radius: 8px; 79 box-shadow: 0 8px 24px rgba(0,0,0,0.4); 80 z-index: 99999; 81 padding: 4px 0; 82 margin-top: 4px; 83} 84 85[data-dropdown].open [data-dropdown-menu] { 86 display: block; 87} 88 89/* ============================================ 90 LANGUAGE DROPDOWN 91 ============================================ */ 92 93.language-tab { 94 border-left: 1px solid var(--border-color); 95 border-right: 1px solid var(--border-color); 96 display: flex; 97 align-items: center; 98 gap: 6px; 99 cursor: pointer; 100 position: relative; 101 overflow: visible; 102} 103 104@media (hover: hover) { 105 .language-tab:hover { 106 background: var(--bg-primary); 107 color: var(--text-primary); 108 } 109} 110 111.lang-flag { font-size: 14px; } 112.lang-text { font-size: 12px; min-width: 50px; } 113.lang-arrow { font-size: 12px; opacity: 0.6; } 114 115.language-dropdown { 116 position: absolute; 117 top: 100%; 118 right: 0; 119 background: var(--bg-tertiary); 120 border: 1px solid var(--border-color); 121 border-radius: 4px; 122 box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 123 z-index: 99999; 124 min-width: 120px; 125 margin-top: 2px; 126} 127 128.lang-option { 129 padding: 8px 12px; 130 cursor: pointer; 131 font-size: 12px; 132 transition: all 0.2s; 133} 134 135@media (hover: hover) { 136 .lang-option:hover { 137 background: rgba(205, 92, 155, 0.1); 138 color: var(--ac-purple); 139 } 140} 141 142.lang-option:first-child { border-radius: 4px 4px 0 0; } 143.lang-option:last-child { border-radius: 0 0 4px 4px; } 144 145.language-tab.cycling .lang-flag, 146.language-tab.cycling .lang-text { 147 animation: langFade 0.3s ease-in-out; 148} 149 150@keyframes langFade { 151 0% { opacity: 1; } 152 50% { opacity: 0.3; } 153 100% { opacity: 1; } 154} 155 156/* ============================================ 157 PLATFORM SELECTOR 158 ============================================ */ 159 160.platform-selector { 161 display: flex; 162 align-items: center; 163 gap: 4px; 164 cursor: pointer; 165 padding: 4px 8px; 166 border-radius: 4px; 167 transition: background 0.2s; 168 position: relative; 169} 170 171.platform-selector:hover { 172 background: rgba(0, 0, 0, 0.1); 173} 174 175@media (prefers-color-scheme: dark) { 176 .platform-selector:hover { background: rgba(255, 255, 255, 0.1); } 177} 178 179[data-theme="dark"] .platform-selector:hover { 180 background: rgba(255, 255, 255, 0.1); 181} 182 183.platform-icon { font-size: 14px; } 184.platform-arrow { font-size: 8px; color: var(--text-tertiary); margin-left: 2px; } 185 186.platform-dropdown { 187 position: fixed; 188 background: var(--bg-primary); 189 border: 1px solid var(--border-color); 190 border-radius: 8px; 191 box-shadow: 0 8px 24px rgba(0,0,0,0.4); 192 min-width: 220px; 193 z-index: 99999; 194 padding: 4px 0; 195 /* Use visibility + opacity for smooth open without flash */ 196 visibility: hidden; 197 opacity: 0; 198 pointer-events: none; 199 transition: opacity 0.15s ease, visibility 0.15s ease; 200} 201 202.platform-selector.open .platform-dropdown { 203 visibility: visible; 204 opacity: 1; 205 pointer-events: auto; 206} 207 208.platform-option { 209 display: flex; 210 align-items: center; 211 gap: 8px; 212 padding: 10px 14px; 213 cursor: pointer; 214 transition: background 0.15s; 215} 216 217.platform-option:hover { background: var(--bg-secondary); } 218.platform-option.active { background: rgba(205, 92, 155, 0.15); } 219.platform-option.active:hover { background: rgba(205, 92, 155, 0.25); } 220 221.platform-opt-icon { font-size: 16px; width: 24px; text-align: center; } 222.platform-opt-name { font-size: 13px; color: var(--text-primary); flex: 1; } 223 224.platform-status { 225 font-size: 9px; 226 padding: 2px 6px; 227 border-radius: 4px; 228 text-transform: uppercase; 229 font-weight: bold; 230} 231 232.platform-option.coming-soon { opacity: 0.5; } 233.platform-option.coming-soon .platform-status { 234 background: rgba(59, 130, 246, 0.2); 235 color: rgb(59, 130, 246); 236} 237 238.platform-option.experimental { opacity: 0.4; } 239.platform-option.experimental .platform-status { 240 background: rgba(234, 179, 8, 0.2); 241 color: rgb(180, 140, 0); 242} 243 244@media (prefers-color-scheme: dark) { 245 .platform-option.coming-soon .platform-status { color: rgb(147, 197, 253); } 246 .platform-option.experimental .platform-status { color: rgb(253, 224, 71); } 247} 248 249[data-theme="dark"] .platform-option.coming-soon .platform-status { color: rgb(147, 197, 253); } 250[data-theme="dark"] .platform-option.experimental .platform-status { color: rgb(253, 224, 71); } 251 252.platform-divider { 253 height: 1px; 254 background: var(--border-color); 255 margin: 4px 0; 256} 257 258/* ============================================ 259 USER MENU (Header) 260 ============================================ */ 261 262.header-login-btn { 263 margin-left: auto; 264 padding: 4px 12px; 265 background: linear-gradient(135deg, var(--ac-purple) 0%, rgb(175, 62, 125) 100%); 266 color: white; 267 border: none; 268 border-radius: 4px; 269 font-size: 11px; 270 font-weight: bold; 271 cursor: pointer; 272 transition: all 0.2s; 273} 274 275.header-login-btn:hover { 276 transform: translateY(-1px); 277 box-shadow: 0 2px 8px rgba(205, 92, 155, 0.3); 278} 279 280.header-user-menu { 281 margin-left: auto; 282 position: relative; 283 display: flex; 284 align-items: center; 285 gap: 4px; 286 cursor: pointer; 287 padding: 4px 10px; 288 border-radius: 4px; 289 transition: background 0.2s; 290} 291 292.header-user-menu:hover { background: var(--bg-tertiary); } 293 294.header-user-handle { font-size: 12px; color: var(--text-secondary); } 295.header-menu-arrow { font-size: 8px; color: var(--text-tertiary); } 296 297.header-user-dropdown { 298 display: none; 299 position: absolute; 300 top: 100%; 301 right: 0; 302 background: var(--bg-primary); 303 border: 1px solid var(--border-color); 304 border-radius: 4px; 305 box-shadow: 0 4px 12px rgba(0,0,0,0.15); 306 min-width: 100px; 307 z-index: 10000; 308} 309 310.header-user-menu.open .header-user-dropdown { 311 display: block; 312} 313 314.header-logout-btn { 315 width: 100%; 316 padding: 8px 12px; 317 background: none; 318 border: none; 319 text-align: left; 320 font-size: 12px; 321 color: var(--text-primary); 322 cursor: pointer; 323} 324 325.header-logout-btn:hover { background: var(--bg-tertiary); } 326 327/* ============================================ 328 THEME TOGGLE 329 ============================================ */ 330 331#theme-toggle { 332 width: 32px; 333 height: 32px; 334 border: none; 335 border-radius: 4px; 336 background: transparent; 337 cursor: pointer; 338 display: flex; 339 align-items: center; 340 justify-content: center; 341 font-size: 16px; 342 transition: opacity 0.2s; 343 padding: 0; 344 opacity: 0.6; 345 user-select: none; 346 -webkit-tap-highlight-color: transparent; 347} 348 349@media (hover: hover) { 350 #theme-toggle:hover { opacity: 1; } 351} 352 353#theme-toggle:active { opacity: 0.4; } 354 355/* ============================================ 356 TOAST NOTIFICATIONS 357 ============================================ */ 358 359.kidlisp-toast { 360 position: fixed; 361 bottom: 20px; 362 left: 50%; 363 transform: translateX(-50%); 364 padding: 12px 24px; 365 border-radius: 8px; 366 color: white; 367 font-family: var(--font-mono); 368 font-size: 14px; 369 z-index: 10000; 370 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); 371 opacity: 0; 372 transition: opacity 0.3s ease; 373} 374 375.toast-info { background: #8b5cf6; } 376.toast-warning { background: #f59e0b; } 377.toast-error { background: #ef4444; } 378.toast-success { background: #22c55e; }