1
2* {
3 box-sizing: border-box;
4 margin: 0;
5 padding: 0;
6 user-select: none;
7 -webkit-user-select: none;
8}
9
10:root {
11 --bg-dark: #0f172a;
12 --bg-surface: #1e293b;
13 --bg-surface-hover: #334155;
14 --bg-glass: rgba(30, 41, 59, 0.75);
15
16 --accent-primary: #6366f1;
17 --accent-primary-hover: #4f46e5;
18 --accent-secondary: #ec4899;
19 --accent-glow: rgba(99, 102, 241, 0.35);
20
21 --text-main: #f8fafc;
22 --text-muted: #94a3b8;
23 --text-dim: #64748b;
24
25 --border-color: rgba(255, 255, 255, 0.1);
26 --border-focus: rgba(99, 102, 241, 0.6);
27
28 --radius-sm: 6px;
29 --radius-md: 10px;
30 --radius-lg: 16px;
31
32 --shadow-lg: 0 20px 30px -10px rgba(0, 0, 0, 0.5);
33 --shadow-glow: 0 0 15px var(--accent-glow);
34}
35
36body {
37 background-color: var(--bg-dark);
38 color: var(--text-main);
39 font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
40 height: 100vh;
41 overflow: hidden;
42 display: flex;
43 flex-direction: column;
44}
45
46
47.app-container {
48 display: flex;
49 flex-direction: column;
50 height: 100vh;
51}
52
53
54.header {
55 height: 56px;
56 background: var(--bg-glass);
57 backdrop-filter: blur(16px);
58 border-bottom: 1px solid var(--border-color);
59 display: flex;
60 align-items: center;
61 justify-content: space-between;
62 padding: 0 1.25rem;
63 z-index: 50;
64}
65
66.brand {
67 display: flex;
68 align-items: center;
69 gap: 0.75rem;
70}
71
72.brand-icon {
73 width: 28px;
74 height: 28px;
75 background: linear-gradient(135deg, var(--accent-primary), var(--accent-secondary));
76 border-radius: var(--radius-sm);
77 display: flex;
78 align-items: center;
79 justify-content: center;
80 box-shadow: var(--shadow-glow);
81}
82
83.brand-icon svg {
84 width: 18px;
85 height: 18px;
86 fill: white;
87}
88
89.brand-title {
90 font-size: 1.15rem;
91 font-weight: 700;
92 letter-spacing: -0.5px;
93 background: linear-gradient(135deg, #ffffff, #c7d2fe);
94 -webkit-background-clip: text;
95 -webkit-text-fill-color: transparent;
96}
97
98.brand-badge {
99 font-size: 0.7rem;
100 background: rgba(99, 102, 241, 0.2);
101 color: #a5b4fc;
102 border: 1px solid rgba(99, 102, 241, 0.4);
103 padding: 0.15rem 0.4rem;
104 border-radius: 4px;
105 font-weight: 600;
106}
107
108.header-actions {
109 display: flex;
110 align-items: center;
111 gap: 0.5rem;
112}
113
114
115.workspace {
116 flex: 1;
117 display: flex;
118 overflow: hidden;
119}
120
121
122.sidebar {
123 width: 280px;
124 background: var(--bg-glass);
125 backdrop-filter: blur(12px);
126 border-right: 1px solid var(--border-color);
127 display: flex;
128 flex-direction: column;
129 padding: 1.25rem;
130 gap: 1.5rem;
131 overflow-y: auto;
132 z-index: 20;
133}
134
135.section-title {
136 font-size: 0.75rem;
137 font-weight: 700;
138 text-transform: uppercase;
139 letter-spacing: 0.08em;
140 color: var(--text-muted);
141 margin-bottom: 0.75rem;
142}
143
144
145.tools-grid {
146 display: flex;
147 grid-template-columns: repeat(4, 1fr);
148 gap: 0.5rem;
149}
150
151.tool-btn {
152 aspect-ratio: 1;
153 background: var(--bg-surface);
154 border: 1px solid var(--border-color);
155 border-radius: var(--radius-md);
156 color: var(--text-muted);
157 display: flex;
158 flex-direction: column;
159 align-items: center;
160 justify-content: center;
161 gap: 0.25rem;
162 cursor: pointer;
163 transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
164 position: relative;
165}
166
167.tool-btn svg {
168 width: 20px;
169 height: 20px;
170 fill: currentColor;
171}
172
173.tool-btn:hover {
174 background: var(--bg-surface-hover);
175 color: var(--text-main);
176 border-color: rgba(255, 255, 255, 0.2);
177}
178
179.tool-btn.active {
180 background: var(--accent-primary);
181 color: white;
182 border-color: var(--accent-primary);
183 box-shadow: var(--shadow-glow);
184}
185
186.tool-shortcut {
187 font-size: 0.65rem;
188 font-weight: 600;
189 opacity: 0.7;
190}
191
192
193.color-preview-box {
194 display: flex;
195 align-items: center;
196 gap: 1rem;
197 background: var(--bg-surface);
198 border: 1px solid var(--border-color);
199 padding: 0.75rem;
200 border-radius: var(--radius-md);
201}
202
203.color-swatches-overlap {
204 position: relative;
205 width: 52px;
206 height: 52px;
207}
208
209.color-swatch-large {
210 width: 36px;
211 height: 36px;
212 border-radius: var(--radius-sm);
213 border: 2px solid white;
214 box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
215 position: absolute;
216 cursor: pointer;
217 transition: transform 0.15s;
218}
219
220.color-swatch-large:hover {
221 transform: scale(1.05);
222}
223
224.color-primary {
225 top: 0;
226 left: 0;
227 z-index: 2;
228}
229
230.color-secondary {
231 bottom: 0;
232 right: 0;
233 z-index: 1;
234}
235
236.swap-btn {
237 background: none;
238 border: none;
239 color: var(--text-muted);
240 cursor: pointer;
241 padding: 0.25rem;
242 border-radius: 4px;
243 display: flex;
244 align-items: center;
245 justify-content: center;
246 transition: color 0.2s, transform 0.2s;
247}
248
249.swap-btn:hover {
250 color: var(--text-main);
251 transform: rotate(180deg);
252}
253
254.color-picker-control {
255 display: flex;
256 flex-direction: column;
257 gap: 0.4rem;
258 flex: 1;
259}
260
261.color-hex-label {
262 font-family: monospace;
263 font-size: 0.85rem;
264 color: var(--text-main);
265 font-weight: 600;
266}
267
268.custom-picker-row {
269 display: flex;
270 align-items: center;
271 gap: 0.5rem;
272}
273
274input[type="color"] {
275 -webkit-appearance: none;
276 border: none;
277 width: 32px;
278 height: 28px;
279 border-radius: 4px;
280 cursor: pointer;
281 background: none;
282}
283
284input[type="color"]::-webkit-color-swatch-wrapper {
285 padding: 0;
286}
287
288input[type="color"]::-webkit-color-swatch {
289 border: 1px solid var(--border-color);
290 border-radius: 4px;
291}
292
293
294.palette-grid {
295 display: grid;
296 grid-template-columns: repeat(8, 1fr);
297 gap: 0.35rem;
298}
299
300.palette-swatch {
301 aspect-ratio: 1;
302 border-radius: 4px;
303 cursor: pointer;
304 border: 1px solid rgba(0, 0, 0, 0.4);
305 transition: transform 0.15s, box-shadow 0.15s;
306 position: relative;
307}
308
309.palette-swatch:hover {
310 transform: scale(1.2);
311 z-index: 10;
312 box-shadow: 0 0 8px rgba(0, 0, 0, 0.5);
313}
314
315.palette-swatch.active-primary {
316 outline: 2px solid white;
317 outline-offset: 1px;
318 z-index: 5;
319}
320
321
322.viewport-area {
323 flex: 1;
324 display: flex;
325 flex-direction: column;
326 background: #090d16;
327 position: relative;
328}
329
330.viewport-toolbar {
331 height: 48px;
332 background: rgba(15, 23, 42, 0.8);
333 backdrop-filter: blur(8px);
334 border-bottom: 1px solid var(--border-color);
335 display: flex;
336 align-items: center;
337 justify-content: space-between;
338 padding: 0 1rem;
339 z-index: 15;
340}
341
342.toolbar-group {
343 display: flex;
344 align-items: center;
345 gap: 0.5rem;
346}
347
348.canvas-scroll-container {
349 flex: 1;
350 display: flex;
351 align-items: center;
352 justify-content: center;
353 overflow: auto;
354 padding: 2rem;
355 position: relative;
356}
357
358.canvas-wrapper {
359 position: relative;
360 box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.7);
361 border-radius: 4px;
362 overflow: hidden;
363 border: 1px solid rgba(255, 255, 255, 0.15);
364}
365
366canvas#pixelCanvas {
367 display: block;
368 image-rendering: pixelated;
369 image-rendering: crisp-edges;
370 cursor: crosshair;
371}
372
373
374canvas.tool-pencil { cursor: crosshair; }
375canvas.tool-eraser { cursor: cell; }
376canvas.tool-fill { cursor: copy; }
377canvas.tool-eyedropper { cursor: pointer; }
378
379
380.viewport-footer {
381 height: 32px;
382 background: var(--bg-glass);
383 border-top: 1px solid var(--border-color);
384 display: flex;
385 align-items: center;
386 justify-content: space-between;
387 padding: 0 1rem;
388 font-size: 0.75rem;
389 color: var(--text-muted);
390}
391
392.status-item {
393 display: flex;
394 align-items: center;
395 gap: 0.4rem;
396}
397
398
399.btn {
400 background: var(--bg-surface);
401 border: 1px solid var(--border-color);
402 color: var(--text-main);
403 padding: 0.4rem 0.8rem;
404 border-radius: var(--radius-sm);
405 font-size: 0.85rem;
406 font-weight: 500;
407 cursor: pointer;
408 display: inline-flex;
409 align-items: center;
410 gap: 0.4rem;
411 transition: all 0.2s;
412}
413
414.btn svg {
415 width: 16px;
416 height: 16px;
417 fill: currentColor;
418}
419
420.btn:hover:not(:disabled) {
421 background: var(--bg-surface-hover);
422 border-color: rgba(255, 255, 255, 0.2);
423}
424
425.btn:disabled {
426 opacity: 0.4;
427 cursor: not-allowed;
428}
429
430.btn-primary {
431 background: var(--accent-primary);
432 border-color: var(--accent-primary);
433 color: white;
434}
435
436.btn-primary:hover:not(:disabled) {
437 background: var(--accent-primary-hover);
438 box-shadow: var(--shadow-glow);
439}
440
441.btn-icon-only {
442 padding: 0.4rem;
443}
444
445.btn-active {
446 background: rgba(99, 102, 241, 0.2);
447 border-color: var(--accent-primary);
448 color: #a5b4fc;
449}
450
451
452.modal-overlay {
453 position: fixed;
454 top: 0;
455 left: 0;
456 width: 100vw;
457 height: 100vh;
458 background: rgba(0, 0, 0, 0.75);
459 backdrop-filter: blur(8px);
460 display: flex;
461 align-items: center;
462 justify-content: center;
463 z-index: 100;
464 opacity: 0;
465 pointer-events: none;
466 transition: opacity 0.2s ease;
467}
468
469.modal-overlay.active {
470 opacity: 1;
471 pointer-events: auto;
472}
473
474.modal-card {
475 background: var(--bg-surface);
476 border: 1px solid var(--border-color);
477 border-radius: var(--radius-lg);
478 width: 480px;
479 max-width: 90vw;
480 padding: 1.5rem;
481 box-shadow: var(--shadow-lg);
482}
483
484.modal-header {
485 display: flex;
486 justify-content: space-between;
487 align-items: center;
488 margin-bottom: 1.25rem;
489}
490
491.modal-title {
492 font-size: 1.2rem;
493 font-weight: 700;
494}
495
496.shortcut-list {
497 display: flex;
498 flex-direction: column;
499 gap: 0.75rem;
500}
501
502.shortcut-row {
503 display: flex;
504 justify-content: space-between;
505 align-items: center;
506 font-size: 0.9rem;
507 color: var(--text-muted);
508}
509
510kbd {
511 background: var(--bg-dark);
512 border: 1px solid var(--border-color);
513 border-radius: 4px;
514 padding: 0.15rem 0.5rem;
515 font-family: monospace;
516 font-size: 0.8rem;
517 color: var(--text-main);
518 box-shadow: 0 2px 0 rgba(0,0,0,0.5);
519}
520
Discussion
No comments yet. Start the discussion. Recorded by @patrick-toulme.