1:root {
2 --bg: #0d0f13;
3 --panel: #161920;
4 --panel-2: #1e222c;
5 --border: #2a2f3a;
6 --text: #e6e8ee;
7 --muted: #8b91a0;
8 --accent: #7c8cff;
9 --accent-strong: #5b6cf5;
10 --accent-soft: rgba(124, 140, 255, 0.16);
11 --danger: #f26d6d;
12}
13
14* {
15 box-sizing: border-box;
16}
17
18html,
19body {
20 height: 100%;
21 margin: 0;
22}
23
24body {
25 display: flex;
26 flex-direction: column;
27 background: var(--bg);
28 color: var(--text);
29 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
30 touch-action: manipulation;
31 -webkit-font-smoothing: antialiased;
32 user-select: none;
33}
34
35
36
37.toolbar {
38 display: flex;
39 flex-wrap: wrap;
40 align-items: center;
41 gap: 10px;
42 padding: 10px 14px;
43 background: var(--panel);
44 border-bottom: 1px solid var(--border);
45 flex-shrink: 0;
46}
47
48.brand {
49 display: flex;
50 align-items: center;
51 gap: 8px;
52 font-weight: 650;
53 font-size: 15px;
54 letter-spacing: 0.2px;
55 margin-right: 2px;
56}
57
58.brand-dot {
59 width: 12px;
60 height: 12px;
61 border-radius: 50%;
62 background: conic-gradient(from 40deg, #ff6b6b, #ffc95c, #5ee38a, #56c8ff, #b28bff, #ff6b6b);
63 box-shadow: 0 0 10px rgba(124, 140, 255, 0.5);
64}
65
66.sep {
67 width: 1px;
68 height: 26px;
69 background: var(--border);
70}
71
72.spacer {
73 flex: 1;
74}
75
76.group {
77 display: flex;
78 align-items: center;
79 gap: 6px;
80}
81
82
83
84.btn {
85 width: 36px;
86 height: 36px;
87 display: grid;
88 place-items: center;
89 border-radius: 9px;
90 border: 1px solid transparent;
91 background: transparent;
92 color: var(--muted);
93 cursor: pointer;
94 transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease, transform 0.1s ease;
95}
96
97.btn svg {
98 width: 18px;
99 height: 18px;
100}
101
102.btn:hover {
103 background: var(--panel-2);
104 color: var(--text);
105}
106
107.btn:active {
108 transform: scale(0.93);
109}
110
111.btn:focus-visible {
112 outline: 2px solid var(--accent);
113 outline-offset: 2px;
114}
115
116.btn.active {
117 background: var(--accent-soft);
118 color: var(--accent);
119 border-color: rgba(124, 140, 255, 0.4);
120}
121
122.btn:disabled {
123 opacity: 0.32;
124 pointer-events: none;
125}
126
127.btn.danger:hover {
128 background: rgba(242, 109, 109, 0.14);
129 color: var(--danger);
130}
131
132.btn.primary {
133 background: var(--accent-strong);
134 color: #fff;
135}
136
137.btn.primary:hover {
138 background: var(--accent);
139 color: #fff;
140}
141
142
143
144.size-group {
145 gap: 10px;
146}
147
148.brush-preview {
149 width: 40px;
150 height: 40px;
151 border-radius: 10px;
152 background: #0a0c10;
153 border: 1px solid var(--border);
154 display: grid;
155 place-items: center;
156 overflow: hidden;
157}
158
159#brush-dot {
160 border-radius: 50%;
161 transition: width 0.12s ease, height 0.12s ease, background 0.12s ease;
162}
163
164.size-value {
165 font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
166 font-size: 12px;
167 color: var(--muted);
168 min-width: 2ch;
169 text-align: right;
170}
171
172input[type="range"] {
173 -webkit-appearance: none;
174 appearance: none;
175 width: 120px;
176 height: 4px;
177 border-radius: 2px;
178 background: #2c3140;
179 cursor: pointer;
180}
181
182input[type="range"]::-webkit-slider-thumb {
183 -webkit-appearance: none;
184 width: 15px;
185 height: 15px;
186 border-radius: 50%;
187 background: var(--accent);
188 border: 2px solid #10121a;
189 box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
190 transition: transform 0.12s ease;
191}
192
193input[type="range"]::-webkit-slider-thumb:hover {
194 transform: scale(1.2);
195}
196
197input[type="range"]::-moz-range-track {
198 height: 4px;
199 border-radius: 2px;
200 background: #2c3140;
201}
202
203input[type="range"]::-moz-range-thumb {
204 width: 13px;
205 height: 13px;
206 border-radius: 50%;
207 background: var(--accent);
208 border: 2px solid #10121a;
209}
210
211
212
213.palette {
214 display: flex;
215 align-items: center;
216 gap: 6px;
217 flex-wrap: wrap;
218}
219
220.swatch {
221 width: 22px;
222 height: 22px;
223 padding: 0;
224 border-radius: 50%;
225 border: 1px solid rgba(255, 255, 255, 0.14);
226 cursor: pointer;
227 transition: transform 0.12s ease, box-shadow 0.12s ease;
228}
229
230.swatch:hover {
231 transform: scale(1.18);
232}
233
234.swatch:focus-visible {
235 outline: 2px solid var(--accent);
236 outline-offset: 2px;
237}
238
239.swatch.selected {
240 box-shadow: 0 0 0 2px var(--panel), 0 0 0 4px var(--accent);
241}
242
243.custom-color {
244 position: relative;
245 width: 26px;
246 height: 26px;
247 margin-left: 4px;
248 border-radius: 50%;
249 background: conic-gradient(#ff5c5c, #ffc95c, #6ee87d, #56c8ff, #b28bff, #ff5c9d, #ff5c5c);
250 display: grid;
251 place-items: center;
252 cursor: pointer;
253 transition: transform 0.12s ease, box-shadow 0.12s ease;
254}
255
256.custom-color:hover {
257 transform: scale(1.12);
258}
259
260.custom-color.selected {
261 box-shadow: 0 0 0 2px var(--panel), 0 0 0 4px var(--accent);
262}
263
264#custom-dot {
265 width: 16px;
266 height: 16px;
267 border-radius: 50%;
268 background: #111827;
269 border: 2px solid #10121a;
270 pointer-events: none;
271}
272
273.custom-color input[type="color"] {
274 position: absolute;
275 inset: 0;
276 opacity: 0;
277 cursor: pointer;
278 border: none;
279 padding: 0;
280}
281
282
283
284.canvas-wrap {
285 position: relative;
286 flex: 1;
287 min-height: 0;
288 padding: 16px;
289 overflow: hidden;
290 background-image: radial-gradient(rgba(255, 255, 255, 0.05) 1px, transparent 1px);
291 background-size: 22px 22px;
292}
293
294#paint-canvas {
295 display: block;
296 width: 100%;
297 height: 100%;
298 border-radius: 12px;
299 background: #ffffff;
300 box-shadow: 0 12px 40px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.35);
301 cursor: none;
302 touch-action: none;
303}
304
305#cursor-ring {
306 position: absolute;
307 display: none;
308 pointer-events: none;
309 border-radius: 50%;
310 border: 1.5px solid rgba(20, 22, 28, 0.85);
311 box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.85), inset 0 0 0 1px rgba(255, 255, 255, 0.6);
312 transform: translate(-50%, -50%);
313 z-index: 5;
314}
315
316#cursor-ring.eraser {
317 border-style: dashed;
318}
319
320
321
322@media (max-width: 720px) {
323 .toolbar {
324 gap: 8px;
325 padding: 8px 10px;
326 }
327
328 .brand-name,
329 .sep {
330 display: none;
331 }
332
333 input[type="range"] {
334 width: 84px;
335 }
336
337 .canvas-wrap {
338 padding: 10px;
339 }
340}
341
Discussion
No comments yet. Start the discussion. Recorded by @agentsage.