@webority/theme 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -29
- package/dist/webority-theme.css +1 -1
- package/package.json +2 -2
- package/scss/_components.scss +42 -0
- package/scss/_tokens.scss +15 -1
- package/scss/_variables.scss +17 -0
- package/scss/_wui-aliases.scss +16 -0
- package/scss/_wui-components.scss +19 -3723
- package/scss/wui/_card.scss +37 -0
- package/scss/wui/_choice.scss +746 -0
- package/scss/wui/_controls.scss +810 -0
- package/scss/wui/_data.scss +614 -0
- package/scss/wui/_disclosure.scss +113 -0
- package/scss/wui/_display.scss +508 -0
- package/scss/wui/_flow.scss +410 -0
- package/scss/wui/_media.scss +569 -0
- package/scss/wui/_navigation.scss +284 -0
- package/scss/wui/_overlays.scss +350 -0
- package/scss/wui/_shell.scss +474 -0
- package/scss/wui/_typography.scss +275 -0
- package/scss/wui/_utilities.scss +340 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
// Avatar, file attach, file picker, logo picker.
|
|
2
|
+
//
|
|
3
|
+
// Part of the wui-components layer — see _wui-components.scss for the whole
|
|
4
|
+
// picture and the load order. Order within the layer is LOAD-BEARING: these
|
|
5
|
+
// partials are a split of one stylesheet, not independent modules, so a rule
|
|
6
|
+
// here may be overridden by a later partial. Never reorder the imports.
|
|
7
|
+
|
|
8
|
+
// ── Avatar ──
|
|
9
|
+
// A photo fills the avatar disc edge to edge; the circle is the frame, so
|
|
10
|
+
// the image is cropped to it rather than letterboxed.
|
|
11
|
+
.avatar > .avatar-img {
|
|
12
|
+
width: 100%;
|
|
13
|
+
height: 100%;
|
|
14
|
+
border-radius: inherit;
|
|
15
|
+
object-fit: cover;
|
|
16
|
+
display: block;
|
|
17
|
+
}
|
|
18
|
+
.avatar {
|
|
19
|
+
width: 32px;
|
|
20
|
+
height: 32px;
|
|
21
|
+
border-radius: 999px;
|
|
22
|
+
background: color-mix(in srgb, var(--color-primary) 15%, var(--color-surface));
|
|
23
|
+
color: var(--color-primary);
|
|
24
|
+
font-size: 12px;
|
|
25
|
+
font-weight: 600;
|
|
26
|
+
display: inline-flex;
|
|
27
|
+
align-items: center;
|
|
28
|
+
justify-content: center;
|
|
29
|
+
}
|
|
30
|
+
.avatar-lg {
|
|
31
|
+
width: 48px;
|
|
32
|
+
height: 48px;
|
|
33
|
+
font-size: 16px;
|
|
34
|
+
}
|
|
35
|
+
.avatar-xl {
|
|
36
|
+
width: 64px;
|
|
37
|
+
height: 64px;
|
|
38
|
+
font-size: 22px;
|
|
39
|
+
}
|
|
40
|
+
.avatar-sm {
|
|
41
|
+
width: 24px;
|
|
42
|
+
height: 24px;
|
|
43
|
+
font-size: 10px;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// ── File attach ──
|
|
47
|
+
// Support-form attachment strip: drop zone → attached-image preview.
|
|
48
|
+
.attach-drop {
|
|
49
|
+
display: flex;
|
|
50
|
+
width: 100%;
|
|
51
|
+
align-items: center;
|
|
52
|
+
gap: 12px;
|
|
53
|
+
padding: 12px 14px;
|
|
54
|
+
border: 1px dashed var(--color-border);
|
|
55
|
+
border-radius: var(--radius-lg);
|
|
56
|
+
background: var(--color-surface);
|
|
57
|
+
cursor: pointer;
|
|
58
|
+
transition:
|
|
59
|
+
border-color 0.3s cubic-bezier(0.22, 1, 0.36, 1),
|
|
60
|
+
background 0.3s cubic-bezier(0.22, 1, 0.36, 1);
|
|
61
|
+
}
|
|
62
|
+
.attach-drop:hover {
|
|
63
|
+
border-color: var(--color-primary);
|
|
64
|
+
background: var(--color-primary-soft);
|
|
65
|
+
}
|
|
66
|
+
.attach-drop-icon {
|
|
67
|
+
flex: 0 0 auto;
|
|
68
|
+
width: 36px;
|
|
69
|
+
height: 36px;
|
|
70
|
+
display: inline-flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
justify-content: center;
|
|
73
|
+
border-radius: 999px;
|
|
74
|
+
background: var(--color-primary-soft);
|
|
75
|
+
color: var(--color-primary);
|
|
76
|
+
}
|
|
77
|
+
.attach-drop:hover .attach-drop-icon {
|
|
78
|
+
background: var(--color-surface);
|
|
79
|
+
}
|
|
80
|
+
.attach-drop-copy {
|
|
81
|
+
display: flex;
|
|
82
|
+
flex-direction: column;
|
|
83
|
+
gap: 2px;
|
|
84
|
+
flex: 1;
|
|
85
|
+
min-width: 0;
|
|
86
|
+
}
|
|
87
|
+
.attach-drop-title {
|
|
88
|
+
font-weight: 600;
|
|
89
|
+
font-size: 14px;
|
|
90
|
+
line-height: 1.4;
|
|
91
|
+
color: var(--color-text);
|
|
92
|
+
}
|
|
93
|
+
.attach-drop-hint {
|
|
94
|
+
font-size: 12px;
|
|
95
|
+
// The accepted types and size limit are the only place a user learns what will be
|
|
96
|
+
// rejected — information, not decoration — so it needs AA contrast, which
|
|
97
|
+
// --color-text-subtle does not reach at 12px.
|
|
98
|
+
color: var(--color-text-muted);
|
|
99
|
+
}
|
|
100
|
+
.attach-drop-cta {
|
|
101
|
+
flex: 0 0 auto;
|
|
102
|
+
font-size: 12px;
|
|
103
|
+
font-weight: 600;
|
|
104
|
+
color: var(--color-primary);
|
|
105
|
+
border: 1px solid var(--color-border);
|
|
106
|
+
border-radius: 999px;
|
|
107
|
+
padding: 5px 14px;
|
|
108
|
+
background: var(--color-surface);
|
|
109
|
+
}
|
|
110
|
+
// Attached image renders full width so the user can actually check what
|
|
111
|
+
// they're sending.
|
|
112
|
+
.attach-preview {
|
|
113
|
+
width: 100%;
|
|
114
|
+
border: 1px solid var(--color-border);
|
|
115
|
+
border-radius: var(--radius-lg);
|
|
116
|
+
background: var(--color-surface);
|
|
117
|
+
overflow: hidden;
|
|
118
|
+
}
|
|
119
|
+
.attach-figure {
|
|
120
|
+
position: relative;
|
|
121
|
+
// A lighter elevated surface behind the (contained) image so the
|
|
122
|
+
// letterbox reads as a surface, not near-black — dark mode uses the
|
|
123
|
+
// muted/elevated step instead.
|
|
124
|
+
background: var(--color-bg-muted);
|
|
125
|
+
}
|
|
126
|
+
.attach-figure img {
|
|
127
|
+
display: block;
|
|
128
|
+
width: 100%;
|
|
129
|
+
max-height: 260px;
|
|
130
|
+
object-fit: contain;
|
|
131
|
+
}
|
|
132
|
+
.attach-meta {
|
|
133
|
+
display: flex;
|
|
134
|
+
align-items: baseline;
|
|
135
|
+
justify-content: space-between;
|
|
136
|
+
gap: 12px;
|
|
137
|
+
padding: 10px 14px;
|
|
138
|
+
border-top: 1px solid var(--color-border);
|
|
139
|
+
min-width: 0;
|
|
140
|
+
}
|
|
141
|
+
.attach-name {
|
|
142
|
+
font-size: 13px;
|
|
143
|
+
font-weight: 500;
|
|
144
|
+
color: var(--color-text);
|
|
145
|
+
overflow: hidden;
|
|
146
|
+
text-overflow: ellipsis;
|
|
147
|
+
white-space: nowrap;
|
|
148
|
+
}
|
|
149
|
+
.attach-size {
|
|
150
|
+
font-size: 12px;
|
|
151
|
+
color: var(--color-text-subtle);
|
|
152
|
+
flex: 0 0 auto;
|
|
153
|
+
}
|
|
154
|
+
.attach-remove {
|
|
155
|
+
position: absolute;
|
|
156
|
+
top: 8px;
|
|
157
|
+
right: 8px;
|
|
158
|
+
display: inline-flex;
|
|
159
|
+
align-items: center;
|
|
160
|
+
justify-content: center;
|
|
161
|
+
width: 28px;
|
|
162
|
+
height: 28px;
|
|
163
|
+
border: 0;
|
|
164
|
+
background: rgba(0, 0, 0, 0.62);
|
|
165
|
+
backdrop-filter: blur(10px);
|
|
166
|
+
-webkit-backdrop-filter: blur(10px);
|
|
167
|
+
color: #fff;
|
|
168
|
+
border-radius: 999px;
|
|
169
|
+
cursor: pointer;
|
|
170
|
+
transition: background 0.2s;
|
|
171
|
+
}
|
|
172
|
+
.attach-remove:hover {
|
|
173
|
+
background: var(--color-danger);
|
|
174
|
+
}
|
|
175
|
+
// Iconsax hardcodes both stroke colour and width on its paths, so force
|
|
176
|
+
// white here — otherwise the glyph vanishes into the button in dark mode.
|
|
177
|
+
.attach-remove svg {
|
|
178
|
+
width: 18px;
|
|
179
|
+
height: 18px;
|
|
180
|
+
display: block;
|
|
181
|
+
}
|
|
182
|
+
.attach-remove svg path {
|
|
183
|
+
stroke: #fff;
|
|
184
|
+
stroke-width: 2px;
|
|
185
|
+
}
|
|
186
|
+
@media (prefers-reduced-motion: reduce) {
|
|
187
|
+
.attach-drop,
|
|
188
|
+
.attach-remove {
|
|
189
|
+
transition: none;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// ── File picker ──
|
|
194
|
+
// File input — segmented "Upload" button + placeholder, matches the .input
|
|
195
|
+
// shell.
|
|
196
|
+
.file-input {
|
|
197
|
+
box-sizing: border-box;
|
|
198
|
+
display: flex;
|
|
199
|
+
align-items: stretch;
|
|
200
|
+
width: 100%;
|
|
201
|
+
border-radius: var(--radius-lg);
|
|
202
|
+
corner-shape: squircle;
|
|
203
|
+
border: 1px solid var(--color-border);
|
|
204
|
+
background: var(--color-surface);
|
|
205
|
+
overflow: hidden;
|
|
206
|
+
cursor: pointer;
|
|
207
|
+
transition:
|
|
208
|
+
border-color 0.12s,
|
|
209
|
+
box-shadow 0.12s;
|
|
210
|
+
}
|
|
211
|
+
.file-input:hover {
|
|
212
|
+
border-color: var(--color-border-strong);
|
|
213
|
+
}
|
|
214
|
+
.file-input-btn {
|
|
215
|
+
display: inline-flex;
|
|
216
|
+
align-items: center;
|
|
217
|
+
flex-shrink: 0;
|
|
218
|
+
padding: 12px 20px;
|
|
219
|
+
font-size: 14px;
|
|
220
|
+
font-weight: 600;
|
|
221
|
+
color: var(--color-text);
|
|
222
|
+
background: var(--color-bg-muted);
|
|
223
|
+
border-right: 1px solid var(--color-border);
|
|
224
|
+
}
|
|
225
|
+
.file-input-text {
|
|
226
|
+
display: inline-flex;
|
|
227
|
+
align-items: center;
|
|
228
|
+
min-width: 0;
|
|
229
|
+
padding: 12px 16px;
|
|
230
|
+
font-size: 14px;
|
|
231
|
+
color: var(--color-text-subtle);
|
|
232
|
+
white-space: nowrap;
|
|
233
|
+
overflow: hidden;
|
|
234
|
+
text-overflow: ellipsis;
|
|
235
|
+
}
|
|
236
|
+
.file-input-text.has-file {
|
|
237
|
+
color: var(--color-text);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Tall empty state (AppFilePicker): a drag-and-drop dropzone — dashed
|
|
241
|
+
// border, circular icon badge, click-or-drop copy. Highlights on hover and
|
|
242
|
+
// while a file is dragged over.
|
|
243
|
+
.file-input.file-input-tall {
|
|
244
|
+
position: relative;
|
|
245
|
+
flex-direction: column;
|
|
246
|
+
align-items: center;
|
|
247
|
+
justify-content: center;
|
|
248
|
+
gap: 10px;
|
|
249
|
+
height: 350px;
|
|
250
|
+
padding: 20px;
|
|
251
|
+
text-align: center;
|
|
252
|
+
background: var(--color-bg-subtle);
|
|
253
|
+
border: 1px dashed var(--color-border-strong);
|
|
254
|
+
transition:
|
|
255
|
+
border-color 0.15s ease,
|
|
256
|
+
background-color 0.15s ease;
|
|
257
|
+
}
|
|
258
|
+
.file-input.file-input-tall:hover,
|
|
259
|
+
.file-input.file-input-tall.dragging {
|
|
260
|
+
border-color: var(--color-primary);
|
|
261
|
+
background: var(--color-bg-muted);
|
|
262
|
+
}
|
|
263
|
+
// Fill-label associates click with the hidden file input; children don't
|
|
264
|
+
// steal drag hits.
|
|
265
|
+
.file-input.file-input-tall > .file-input-zone-label {
|
|
266
|
+
position: absolute;
|
|
267
|
+
inset: 0;
|
|
268
|
+
display: flex;
|
|
269
|
+
flex-direction: column;
|
|
270
|
+
align-items: center;
|
|
271
|
+
justify-content: center;
|
|
272
|
+
gap: 10px;
|
|
273
|
+
margin: 0;
|
|
274
|
+
cursor: pointer;
|
|
275
|
+
}
|
|
276
|
+
.file-input.file-input-tall > .file-input-zone-label > * {
|
|
277
|
+
pointer-events: none;
|
|
278
|
+
}
|
|
279
|
+
.file-input.file-input-tall .file-input-icon {
|
|
280
|
+
display: inline-flex;
|
|
281
|
+
align-items: center;
|
|
282
|
+
justify-content: center;
|
|
283
|
+
width: 54px;
|
|
284
|
+
height: 54px;
|
|
285
|
+
border-radius: 50%;
|
|
286
|
+
background: var(--color-primary-soft);
|
|
287
|
+
color: var(--color-primary);
|
|
288
|
+
transition: transform 0.15s ease;
|
|
289
|
+
}
|
|
290
|
+
.file-input.file-input-tall.dragging .file-input-icon {
|
|
291
|
+
transform: translateY(-2px) scale(1.06);
|
|
292
|
+
}
|
|
293
|
+
.file-input-title {
|
|
294
|
+
font-size: 14px;
|
|
295
|
+
font-weight: 600;
|
|
296
|
+
color: var(--color-text);
|
|
297
|
+
}
|
|
298
|
+
.file-input-title .browse {
|
|
299
|
+
color: var(--color-primary);
|
|
300
|
+
}
|
|
301
|
+
.file-input.file-input-tall .file-input-text {
|
|
302
|
+
padding: 0;
|
|
303
|
+
font-size: 12px;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Large preview shown once an image exists; hover reveals a "Change image"
|
|
307
|
+
// overlay.
|
|
308
|
+
.file-preview {
|
|
309
|
+
position: relative;
|
|
310
|
+
box-sizing: border-box;
|
|
311
|
+
display: block;
|
|
312
|
+
width: 100%;
|
|
313
|
+
height: 350px;
|
|
314
|
+
border-radius: var(--radius-lg);
|
|
315
|
+
corner-shape: squircle;
|
|
316
|
+
border: 1px solid var(--color-border);
|
|
317
|
+
overflow: hidden;
|
|
318
|
+
cursor: pointer;
|
|
319
|
+
background: var(--color-bg-subtle);
|
|
320
|
+
transition: border-color 0.12s;
|
|
321
|
+
}
|
|
322
|
+
.file-preview:hover {
|
|
323
|
+
border-color: var(--color-border-strong);
|
|
324
|
+
}
|
|
325
|
+
.file-preview.error {
|
|
326
|
+
border-color: var(--color-danger);
|
|
327
|
+
}
|
|
328
|
+
// Open-picker control fills the shell (remove button is a sibling, not
|
|
329
|
+
// nested).
|
|
330
|
+
.file-preview-open {
|
|
331
|
+
display: block;
|
|
332
|
+
box-sizing: border-box;
|
|
333
|
+
width: 100%;
|
|
334
|
+
height: 100%;
|
|
335
|
+
padding: 0;
|
|
336
|
+
border: none;
|
|
337
|
+
background: transparent;
|
|
338
|
+
cursor: pointer;
|
|
339
|
+
position: relative;
|
|
340
|
+
font: inherit;
|
|
341
|
+
color: inherit;
|
|
342
|
+
text-align: left;
|
|
343
|
+
}
|
|
344
|
+
.file-preview-img {
|
|
345
|
+
display: block;
|
|
346
|
+
width: 100%;
|
|
347
|
+
height: 100%;
|
|
348
|
+
object-fit: cover;
|
|
349
|
+
transition: transform 0.25s ease;
|
|
350
|
+
}
|
|
351
|
+
// Gentle zoom on hover so the field feels interactive.
|
|
352
|
+
.file-preview:hover .file-preview-img {
|
|
353
|
+
transform: scale(1.03);
|
|
354
|
+
}
|
|
355
|
+
.file-preview-overlay {
|
|
356
|
+
position: absolute;
|
|
357
|
+
inset: 0;
|
|
358
|
+
display: flex;
|
|
359
|
+
align-items: center;
|
|
360
|
+
justify-content: center;
|
|
361
|
+
// Subtle dim so the glassy CTA reads on any image, without hiding it.
|
|
362
|
+
background: rgba(16, 24, 40, 0.22);
|
|
363
|
+
opacity: 0;
|
|
364
|
+
transition: opacity 0.15s ease;
|
|
365
|
+
}
|
|
366
|
+
.file-preview:hover .file-preview-overlay,
|
|
367
|
+
.file-preview:focus-within .file-preview-overlay {
|
|
368
|
+
opacity: 1;
|
|
369
|
+
}
|
|
370
|
+
// The "Change image" call-to-action as a glassy pill button.
|
|
371
|
+
.file-preview-cta {
|
|
372
|
+
display: inline-flex;
|
|
373
|
+
align-items: center;
|
|
374
|
+
gap: 8px;
|
|
375
|
+
padding: 9px 18px;
|
|
376
|
+
background: rgba(255, 255, 255, 0.96);
|
|
377
|
+
color: var(--color-text);
|
|
378
|
+
font-size: 14px;
|
|
379
|
+
font-weight: 600;
|
|
380
|
+
border-radius: 999px;
|
|
381
|
+
box-shadow: var(--shadow-overlay);
|
|
382
|
+
}
|
|
383
|
+
.file-preview-remove {
|
|
384
|
+
position: absolute;
|
|
385
|
+
top: 8px;
|
|
386
|
+
right: 8px;
|
|
387
|
+
z-index: 2;
|
|
388
|
+
box-sizing: border-box;
|
|
389
|
+
display: inline-flex;
|
|
390
|
+
align-items: center;
|
|
391
|
+
justify-content: center;
|
|
392
|
+
width: 30px;
|
|
393
|
+
height: 30px;
|
|
394
|
+
padding: 0;
|
|
395
|
+
border: 2px solid transparent;
|
|
396
|
+
border-radius: 50%;
|
|
397
|
+
background: rgba(16, 24, 40, 0.55);
|
|
398
|
+
color: #fff;
|
|
399
|
+
cursor: pointer;
|
|
400
|
+
opacity: 0;
|
|
401
|
+
transition:
|
|
402
|
+
border-color 0.12s,
|
|
403
|
+
opacity 0.15s ease;
|
|
404
|
+
}
|
|
405
|
+
.file-preview:hover .file-preview-remove,
|
|
406
|
+
.file-preview:focus-within .file-preview-remove {
|
|
407
|
+
opacity: 1;
|
|
408
|
+
}
|
|
409
|
+
// Hovering the cross: keep it plain — just a slightly deeper disc, no
|
|
410
|
+
// coloured ring.
|
|
411
|
+
.file-preview-remove:hover {
|
|
412
|
+
background: rgba(16, 24, 40, 0.78);
|
|
413
|
+
color: #fff;
|
|
414
|
+
}
|
|
415
|
+
|
|
416
|
+
// ── Logo picker ──
|
|
417
|
+
// Round dropzone uploader (workspace/brand logo) and the settings-page photo
|
|
418
|
+
// ring share this same interactive-uploader pattern.
|
|
419
|
+
.set-uploader {
|
|
420
|
+
display: inline-flex;
|
|
421
|
+
padding: 0;
|
|
422
|
+
border: none;
|
|
423
|
+
background: transparent;
|
|
424
|
+
font: inherit;
|
|
425
|
+
color: inherit;
|
|
426
|
+
cursor: pointer;
|
|
427
|
+
}
|
|
428
|
+
.set-uploader:disabled {
|
|
429
|
+
cursor: progress;
|
|
430
|
+
}
|
|
431
|
+
.set-uploader-img {
|
|
432
|
+
width: 100%;
|
|
433
|
+
height: 100%;
|
|
434
|
+
border-radius: 50%;
|
|
435
|
+
object-fit: cover;
|
|
436
|
+
}
|
|
437
|
+
.set-uploader-ring {
|
|
438
|
+
position: relative;
|
|
439
|
+
width: 120px;
|
|
440
|
+
height: 120px;
|
|
441
|
+
border-radius: 50%;
|
|
442
|
+
padding: 8px;
|
|
443
|
+
border: 1px dashed color-mix(in srgb, var(--color-border-strong) 75%, transparent);
|
|
444
|
+
cursor: pointer;
|
|
445
|
+
transition: border-color 0.18s;
|
|
446
|
+
}
|
|
447
|
+
.set-uploader-ring:hover,
|
|
448
|
+
.set-uploader:hover .set-uploader-ring,
|
|
449
|
+
.set-uploader:focus-visible .set-uploader-ring {
|
|
450
|
+
border-color: var(--color-primary);
|
|
451
|
+
}
|
|
452
|
+
.set-uploader-logo {
|
|
453
|
+
width: 100%;
|
|
454
|
+
height: 100%;
|
|
455
|
+
border-radius: 50%;
|
|
456
|
+
display: grid;
|
|
457
|
+
place-items: center;
|
|
458
|
+
font-size: 38px;
|
|
459
|
+
font-weight: 700;
|
|
460
|
+
letter-spacing: -0.02em;
|
|
461
|
+
color: var(--color-primary);
|
|
462
|
+
background: var(--color-primary-soft);
|
|
463
|
+
}
|
|
464
|
+
.set-uploader-overlay {
|
|
465
|
+
position: absolute;
|
|
466
|
+
inset: 8px;
|
|
467
|
+
border-radius: 50%;
|
|
468
|
+
display: flex;
|
|
469
|
+
flex-direction: column;
|
|
470
|
+
align-items: center;
|
|
471
|
+
justify-content: center;
|
|
472
|
+
gap: 4px;
|
|
473
|
+
background: rgba(20, 26, 33, 0.62);
|
|
474
|
+
color: #fff;
|
|
475
|
+
font-size: 11px;
|
|
476
|
+
font-weight: 600;
|
|
477
|
+
opacity: 0;
|
|
478
|
+
transition: opacity 0.18s;
|
|
479
|
+
}
|
|
480
|
+
.set-uploader-ring:hover .set-uploader-overlay,
|
|
481
|
+
.set-uploader:hover .set-uploader-overlay,
|
|
482
|
+
.set-uploader:focus-visible .set-uploader-overlay {
|
|
483
|
+
opacity: 1;
|
|
484
|
+
}
|
|
485
|
+
// While uploading: keep the overlay (spinner) visible and signal it's not
|
|
486
|
+
// clickable.
|
|
487
|
+
.set-uploader-overlay.is-loading {
|
|
488
|
+
opacity: 1;
|
|
489
|
+
}
|
|
490
|
+
.set-uploader[aria-busy="true"] {
|
|
491
|
+
cursor: progress;
|
|
492
|
+
}
|
|
493
|
+
.set-uploader-hint {
|
|
494
|
+
margin: 18px auto 0;
|
|
495
|
+
max-width: 240px;
|
|
496
|
+
font-size: 12px;
|
|
497
|
+
line-height: 1.5;
|
|
498
|
+
color: var(--color-text-subtle);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Minimals-style rounded logo dropzone (workspace branding form).
|
|
502
|
+
.logo-upload {
|
|
503
|
+
display: flex;
|
|
504
|
+
align-items: center;
|
|
505
|
+
gap: 20px;
|
|
506
|
+
flex-wrap: wrap;
|
|
507
|
+
}
|
|
508
|
+
.logo-dropzone {
|
|
509
|
+
position: relative;
|
|
510
|
+
width: 104px;
|
|
511
|
+
height: 104px;
|
|
512
|
+
flex: none;
|
|
513
|
+
border-radius: var(--radius-lg);
|
|
514
|
+
border: 1.5px dashed var(--color-border-strong);
|
|
515
|
+
background: var(--color-bg-subtle);
|
|
516
|
+
display: grid;
|
|
517
|
+
place-items: center;
|
|
518
|
+
overflow: hidden;
|
|
519
|
+
cursor: pointer;
|
|
520
|
+
padding: 6px;
|
|
521
|
+
transition:
|
|
522
|
+
border-color 0.15s ease,
|
|
523
|
+
background 0.15s ease;
|
|
524
|
+
}
|
|
525
|
+
.logo-dropzone:hover,
|
|
526
|
+
.logo-dropzone:focus-visible {
|
|
527
|
+
border-color: var(--color-primary);
|
|
528
|
+
background: var(--color-primary-soft);
|
|
529
|
+
outline: none;
|
|
530
|
+
}
|
|
531
|
+
.logo-dropzone.has-image {
|
|
532
|
+
border-style: solid;
|
|
533
|
+
background: var(--color-surface);
|
|
534
|
+
}
|
|
535
|
+
.logo-dropzone-empty {
|
|
536
|
+
display: grid;
|
|
537
|
+
place-items: center;
|
|
538
|
+
color: var(--color-text-subtle);
|
|
539
|
+
}
|
|
540
|
+
.logo-dropzone-img {
|
|
541
|
+
max-width: 100%;
|
|
542
|
+
max-height: 100%;
|
|
543
|
+
object-fit: contain;
|
|
544
|
+
border-radius: var(--radius);
|
|
545
|
+
}
|
|
546
|
+
// hover overlay (camera + label), like the Minimals avatar uploader
|
|
547
|
+
.logo-dropzone-overlay {
|
|
548
|
+
position: absolute;
|
|
549
|
+
inset: 0;
|
|
550
|
+
display: flex;
|
|
551
|
+
flex-direction: column;
|
|
552
|
+
align-items: center;
|
|
553
|
+
justify-content: center;
|
|
554
|
+
gap: 4px;
|
|
555
|
+
background: var(--color-scrim);
|
|
556
|
+
color: var(--color-on-scrim);
|
|
557
|
+
font-size: 12px;
|
|
558
|
+
font-weight: 600;
|
|
559
|
+
opacity: 0;
|
|
560
|
+
transition: opacity 0.15s ease;
|
|
561
|
+
}
|
|
562
|
+
.logo-dropzone:hover .logo-dropzone-overlay,
|
|
563
|
+
.logo-dropzone:focus-visible .logo-dropzone-overlay {
|
|
564
|
+
opacity: 1;
|
|
565
|
+
}
|
|
566
|
+
.logo-upload-body {
|
|
567
|
+
flex: 1;
|
|
568
|
+
min-width: 200px;
|
|
569
|
+
}
|