@lumen-stack/react 0.1.3

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.
@@ -0,0 +1,787 @@
1
+ /* @lumen/react styles
2
+ *
3
+ * Token-driven, dark-first, Linear/Vercel-inspired. All tokens are
4
+ * --lumen-* prefixed and overridable by the host. No external deps.
5
+ */
6
+
7
+ :root {
8
+ /* Spacing scale (4-based) */
9
+ --lumen-s-1: 4px;
10
+ --lumen-s-2: 8px;
11
+ --lumen-s-3: 12px;
12
+ --lumen-s-4: 16px;
13
+ --lumen-s-5: 24px;
14
+ --lumen-s-6: 32px;
15
+
16
+ /* Radii */
17
+ --lumen-r-sm: 6px;
18
+ --lumen-r-md: 10px;
19
+ --lumen-r-lg: 14px;
20
+
21
+ /* Type */
22
+ --lumen-font-ui:
23
+ "Inter var", "Inter", -apple-system, BlinkMacSystemFont, "SF Pro Text",
24
+ "Segoe UI", Roboto, ui-sans-serif, system-ui, sans-serif;
25
+ --lumen-fs-12: 12px;
26
+ --lumen-fs-13: 13px;
27
+ --lumen-fs-14: 14px;
28
+ --lumen-fs-16: 16px;
29
+ --lumen-lh-tight: 1.25;
30
+
31
+ /* Motion */
32
+ --lumen-ease: cubic-bezier(0.22, 1, 0.36, 1);
33
+ --lumen-dur-fast: 140ms;
34
+ --lumen-dur: 220ms;
35
+
36
+ /* Color — dark-first defaults */
37
+ --lumen-bg: #0a0a0b;
38
+ --lumen-bg-elev: #131316;
39
+ --lumen-bg-hover: rgb(255 255 255 / 0.04);
40
+ --lumen-bg-active: rgb(255 255 255 / 0.08);
41
+ --lumen-fg: #ededed;
42
+ --lumen-fg-muted: #a1a1aa;
43
+ --lumen-fg-subtle: #71717a;
44
+ --lumen-border: #26262a;
45
+ --lumen-border-strong: #3f3f46;
46
+ --lumen-accent: #fafafa;
47
+ --lumen-accent-fg: #0a0a0b;
48
+ --lumen-danger: #ef4444;
49
+ --lumen-focus-ring: rgb(96 165 250 / 0.6);
50
+ --lumen-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
51
+ --lumen-shadow-lg: 0 24px 64px -12px rgb(0 0 0 / 0.7),
52
+ 0 1px 0 rgb(255 255 255 / 0.04) inset;
53
+
54
+ /* Backwards-compat aliases (older CSS classes still reference these) */
55
+ --lumen-primary: var(--lumen-accent);
56
+ --lumen-primary-fg: var(--lumen-accent-fg);
57
+ --lumen-muted: var(--lumen-fg-muted);
58
+ --lumen-radius: var(--lumen-r-md);
59
+ --lumen-shadow: var(--lumen-shadow-lg);
60
+ }
61
+
62
+ @media (prefers-color-scheme: light) {
63
+ :root {
64
+ --lumen-bg: #ffffff;
65
+ --lumen-bg-elev: #fafafa;
66
+ --lumen-bg-hover: rgb(0 0 0 / 0.04);
67
+ --lumen-bg-active: rgb(0 0 0 / 0.07);
68
+ --lumen-fg: #0a0a0b;
69
+ --lumen-fg-muted: #52525b;
70
+ --lumen-fg-subtle: #a1a1aa;
71
+ --lumen-border: #e4e4e7;
72
+ --lumen-border-strong: #d4d4d8;
73
+ --lumen-accent: #0a0a0b;
74
+ --lumen-accent-fg: #ffffff;
75
+ --lumen-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.06);
76
+ --lumen-shadow-lg: 0 24px 64px -12px rgb(0 0 0 / 0.18);
77
+ }
78
+ }
79
+
80
+ :root[data-lumen-theme="dark"] {
81
+ --lumen-bg: #0a0a0b;
82
+ --lumen-bg-elev: #131316;
83
+ --lumen-bg-hover: rgb(255 255 255 / 0.04);
84
+ --lumen-bg-active: rgb(255 255 255 / 0.08);
85
+ --lumen-fg: #ededed;
86
+ --lumen-fg-muted: #a1a1aa;
87
+ --lumen-fg-subtle: #71717a;
88
+ --lumen-border: #26262a;
89
+ --lumen-border-strong: #3f3f46;
90
+ --lumen-accent: #fafafa;
91
+ --lumen-accent-fg: #0a0a0b;
92
+ --lumen-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.4);
93
+ --lumen-shadow-lg: 0 24px 64px -12px rgb(0 0 0 / 0.7),
94
+ 0 1px 0 rgb(255 255 255 / 0.04) inset;
95
+ }
96
+ :root[data-lumen-theme="light"] {
97
+ --lumen-bg: #ffffff;
98
+ --lumen-bg-elev: #fafafa;
99
+ --lumen-bg-hover: rgb(0 0 0 / 0.04);
100
+ --lumen-bg-active: rgb(0 0 0 / 0.07);
101
+ --lumen-fg: #0a0a0b;
102
+ --lumen-fg-muted: #52525b;
103
+ --lumen-fg-subtle: #a1a1aa;
104
+ --lumen-border: #e4e4e7;
105
+ --lumen-border-strong: #d4d4d8;
106
+ --lumen-accent: #0a0a0b;
107
+ --lumen-accent-fg: #ffffff;
108
+ --lumen-shadow-sm: 0 1px 2px rgb(0 0 0 / 0.06);
109
+ --lumen-shadow-lg: 0 24px 64px -12px rgb(0 0 0 / 0.18);
110
+ }
111
+
112
+ /* ─── Buttons ────────────────────────────────────────────────────── */
113
+ .lumen-btn,
114
+ .lumen-btn-primary,
115
+ .lumen-btn-ghost,
116
+ .lumen-btn-outline {
117
+ display: inline-flex;
118
+ align-items: center;
119
+ justify-content: center;
120
+ gap: 6px;
121
+ border: 1px solid transparent;
122
+ border-radius: var(--lumen-r-md);
123
+ padding: 8px 14px;
124
+ font-family: var(--lumen-font-ui);
125
+ font-size: var(--lumen-fs-13);
126
+ font-weight: 500;
127
+ line-height: var(--lumen-lh-tight);
128
+ cursor: pointer;
129
+ transition:
130
+ background-color var(--lumen-dur-fast) var(--lumen-ease),
131
+ border-color var(--lumen-dur-fast) var(--lumen-ease),
132
+ color var(--lumen-dur-fast) var(--lumen-ease),
133
+ transform var(--lumen-dur-fast) var(--lumen-ease);
134
+ -webkit-tap-highlight-color: transparent;
135
+ }
136
+ .lumen-btn:disabled,
137
+ .lumen-btn-primary:disabled,
138
+ .lumen-btn-ghost:disabled,
139
+ .lumen-btn-outline:disabled {
140
+ opacity: 0.5;
141
+ cursor: not-allowed;
142
+ }
143
+ .lumen-btn-primary {
144
+ background: var(--lumen-accent);
145
+ color: var(--lumen-accent-fg);
146
+ }
147
+ .lumen-btn-primary:hover:not(:disabled) {
148
+ transform: translateY(-0.5px);
149
+ }
150
+ .lumen-btn-primary:active:not(:disabled) {
151
+ transform: translateY(0.5px);
152
+ }
153
+ .lumen-btn-ghost,
154
+ .lumen-btn-outline {
155
+ background: transparent;
156
+ color: var(--lumen-fg);
157
+ border-color: var(--lumen-border);
158
+ }
159
+ .lumen-btn-ghost:hover:not(:disabled),
160
+ .lumen-btn-outline:hover:not(:disabled) {
161
+ background: var(--lumen-bg-hover);
162
+ border-color: var(--lumen-border-strong);
163
+ }
164
+ .lumen-btn-floating {
165
+ border-radius: 999px;
166
+ padding: 12px 18px;
167
+ box-shadow: var(--lumen-shadow-lg);
168
+ }
169
+
170
+ /* ─── Edge notch trigger (unchanged styling, retokenized) ────────── */
171
+ .lumen-notch {
172
+ position: fixed;
173
+ display: inline-flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ gap: 6px;
177
+ background: var(--lumen-accent);
178
+ color: var(--lumen-accent-fg);
179
+ border: 0;
180
+ cursor: pointer;
181
+ font: inherit;
182
+ font-size: var(--lumen-fs-13);
183
+ font-weight: 500;
184
+ box-shadow: var(--lumen-shadow-lg);
185
+ transition:
186
+ transform var(--lumen-dur) var(--lumen-ease),
187
+ padding var(--lumen-dur) var(--lumen-ease),
188
+ opacity var(--lumen-dur-fast) ease;
189
+ user-select: none;
190
+ -webkit-tap-highlight-color: transparent;
191
+ }
192
+ .lumen-notch-handle {
193
+ display: block;
194
+ background: rgb(255 255 255 / 0.5);
195
+ border-radius: 999px;
196
+ }
197
+ .lumen-notch-label {
198
+ display: inline-flex;
199
+ align-items: center;
200
+ gap: 6px;
201
+ white-space: nowrap;
202
+ max-width: 0;
203
+ overflow: hidden;
204
+ opacity: 0;
205
+ transition:
206
+ max-width var(--lumen-dur) var(--lumen-ease),
207
+ opacity var(--lumen-dur-fast) ease;
208
+ }
209
+ .lumen-notch-expanded .lumen-notch-label,
210
+ .lumen-notch:hover .lumen-notch-label,
211
+ .lumen-notch:focus-visible .lumen-notch-label {
212
+ max-width: 12rem;
213
+ opacity: 1;
214
+ }
215
+ .lumen-notch-top {
216
+ top: 0;
217
+ left: 50%;
218
+ transform: translate(-50%, -8px);
219
+ padding: 7px 14px;
220
+ border-radius: 0 0 999px 999px;
221
+ }
222
+ .lumen-notch-top .lumen-notch-handle { width: 32px; height: 4px; }
223
+ .lumen-notch-top.lumen-notch-expanded,
224
+ .lumen-notch-top:hover,
225
+ .lumen-notch-top:focus-visible {
226
+ transform: translate(-50%, 0);
227
+ padding: 9px 16px;
228
+ }
229
+ .lumen-notch-bottom {
230
+ bottom: 0;
231
+ left: 50%;
232
+ transform: translate(-50%, 8px);
233
+ padding: 7px 14px;
234
+ border-radius: 999px 999px 0 0;
235
+ }
236
+ .lumen-notch-bottom .lumen-notch-handle { width: 32px; height: 4px; }
237
+ .lumen-notch-bottom.lumen-notch-expanded,
238
+ .lumen-notch-bottom:hover,
239
+ .lumen-notch-bottom:focus-visible {
240
+ transform: translate(-50%, 0);
241
+ padding: 9px 16px;
242
+ }
243
+ .lumen-notch-right {
244
+ right: 0;
245
+ top: 50%;
246
+ transform: translate(8px, -50%);
247
+ padding: 14px 7px;
248
+ border-radius: 999px 0 0 999px;
249
+ flex-direction: column;
250
+ }
251
+ .lumen-notch-right .lumen-notch-handle { width: 4px; height: 32px; }
252
+ .lumen-notch-right .lumen-notch-label {
253
+ writing-mode: vertical-rl;
254
+ transform: rotate(180deg);
255
+ }
256
+ .lumen-notch-right.lumen-notch-expanded,
257
+ .lumen-notch-right:hover,
258
+ .lumen-notch-right:focus-visible {
259
+ transform: translate(0, -50%);
260
+ padding: 16px 9px;
261
+ }
262
+ .lumen-notch-left {
263
+ left: 0;
264
+ top: 50%;
265
+ transform: translate(-8px, -50%);
266
+ padding: 14px 7px;
267
+ border-radius: 0 999px 999px 0;
268
+ flex-direction: column;
269
+ }
270
+ .lumen-notch-left .lumen-notch-handle { width: 4px; height: 32px; }
271
+ .lumen-notch-left .lumen-notch-label { writing-mode: vertical-rl; }
272
+ .lumen-notch-left.lumen-notch-expanded,
273
+ .lumen-notch-left:hover,
274
+ .lumen-notch-left:focus-visible {
275
+ transform: translate(0, -50%);
276
+ padding: 16px 9px;
277
+ }
278
+
279
+ /* ─── Modal shell ────────────────────────────────────────────────── */
280
+ .lumen-modal-backdrop {
281
+ position: fixed;
282
+ inset: 0;
283
+ z-index: 2147483647;
284
+ /* New stacking + containment context so host-app transforms, filters,
285
+ or stacking contexts (e.g. fixed sticky headers, MUI Dialog) can't
286
+ visually slice through the modal. */
287
+ isolation: isolate;
288
+ contain: layout style;
289
+ background: rgb(0 0 0 / 0.55);
290
+ display: flex;
291
+ align-items: stretch;
292
+ justify-content: center;
293
+ padding: 0;
294
+ font-family: var(--lumen-font-ui);
295
+ color: var(--lumen-fg);
296
+ animation: lumen-backdrop-in var(--lumen-dur) var(--lumen-ease);
297
+ /* Reset properties most likely inherited from host frameworks
298
+ (Tailwind/Bootstrap reset rules, MUI CssBaseline). */
299
+ box-sizing: border-box;
300
+ line-height: 1.5;
301
+ text-align: left;
302
+ letter-spacing: normal;
303
+ }
304
+ .lumen-modal-backdrop *,
305
+ .lumen-modal-backdrop *::before,
306
+ .lumen-modal-backdrop *::after {
307
+ box-sizing: border-box;
308
+ }
309
+ @supports (backdrop-filter: blur(1px)) {
310
+ .lumen-modal-backdrop {
311
+ background: rgb(0 0 0 / 0.35);
312
+ backdrop-filter: blur(8px) saturate(120%);
313
+ -webkit-backdrop-filter: blur(8px) saturate(120%);
314
+ }
315
+ }
316
+
317
+ .lumen-modal {
318
+ position: relative;
319
+ background: var(--lumen-bg);
320
+ color: var(--lumen-fg);
321
+ width: 100%;
322
+ max-width: 100%;
323
+ max-height: 92dvh;
324
+ margin-top: auto;
325
+ display: flex;
326
+ flex-direction: column;
327
+ border-radius: var(--lumen-r-lg) var(--lumen-r-lg) 0 0;
328
+ border: 1px solid var(--lumen-border);
329
+ border-bottom: 0;
330
+ box-shadow: var(--lumen-shadow-lg);
331
+ overflow: hidden;
332
+ padding-bottom: env(safe-area-inset-bottom, 0);
333
+ animation: lumen-sheet-in var(--lumen-dur) var(--lumen-ease);
334
+ will-change: transform;
335
+ }
336
+
337
+ .lumen-modal-grabber {
338
+ position: relative;
339
+ width: 100%;
340
+ display: flex;
341
+ justify-content: center;
342
+ padding: 8px 0 4px;
343
+ cursor: grab;
344
+ touch-action: none;
345
+ }
346
+ .lumen-modal-grabber::before {
347
+ content: "";
348
+ width: 36px;
349
+ height: 4px;
350
+ border-radius: 999px;
351
+ background: var(--lumen-border-strong);
352
+ }
353
+ .lumen-modal-grabber:active { cursor: grabbing; }
354
+
355
+ @media (min-width: 640px) {
356
+ .lumen-modal-backdrop {
357
+ align-items: center;
358
+ padding: var(--lumen-s-4);
359
+ padding-top: max(env(safe-area-inset-top, 0px), var(--lumen-s-4));
360
+ padding-bottom: max(env(safe-area-inset-bottom, 0px), var(--lumen-s-4));
361
+ }
362
+ .lumen-modal {
363
+ max-width: 760px;
364
+ max-height: min(86dvh, 820px);
365
+ margin: auto;
366
+ border-radius: var(--lumen-r-lg);
367
+ border: 1px solid var(--lumen-border);
368
+ padding-bottom: 0;
369
+ animation: lumen-modal-in var(--lumen-dur) var(--lumen-ease);
370
+ }
371
+ .lumen-modal-grabber { display: none; }
372
+ }
373
+
374
+ @keyframes lumen-backdrop-in {
375
+ from { opacity: 0; }
376
+ to { opacity: 1; }
377
+ }
378
+ @keyframes lumen-sheet-in {
379
+ from { transform: translateY(100%); }
380
+ to { transform: translateY(0); }
381
+ }
382
+ @keyframes lumen-modal-in {
383
+ from { transform: translateY(8px) scale(0.98); opacity: 0; }
384
+ to { transform: translateY(0) scale(1); opacity: 1; }
385
+ }
386
+ @media (prefers-reduced-motion: reduce) {
387
+ .lumen-modal-backdrop,
388
+ .lumen-modal { animation: none; }
389
+ }
390
+
391
+ /* ─── Header / Body / Footer ─────────────────────────────────────── */
392
+ .lumen-modal-header {
393
+ display: flex;
394
+ align-items: center;
395
+ justify-content: space-between;
396
+ padding: 14px 16px;
397
+ border-bottom: 1px solid var(--lumen-border);
398
+ background: var(--lumen-bg);
399
+ flex-shrink: 0;
400
+ }
401
+ .lumen-modal-title {
402
+ display: inline-flex;
403
+ align-items: center;
404
+ gap: 8px;
405
+ font-size: var(--lumen-fs-14);
406
+ font-weight: 600;
407
+ letter-spacing: -0.005em;
408
+ margin: 0;
409
+ color: var(--lumen-fg);
410
+ }
411
+ .lumen-modal-title-dot {
412
+ width: 8px;
413
+ height: 8px;
414
+ border-radius: 2px;
415
+ background: var(--lumen-fg);
416
+ transform: rotate(45deg);
417
+ }
418
+ .lumen-icon-btn {
419
+ background: transparent;
420
+ border: 0;
421
+ color: var(--lumen-fg-muted);
422
+ font-size: 18px;
423
+ line-height: 1;
424
+ cursor: pointer;
425
+ padding: 6px 8px;
426
+ border-radius: var(--lumen-r-sm);
427
+ transition: background-color var(--lumen-dur-fast) ease,
428
+ color var(--lumen-dur-fast) ease;
429
+ }
430
+ .lumen-icon-btn:hover {
431
+ background: var(--lumen-bg-hover);
432
+ color: var(--lumen-fg);
433
+ }
434
+
435
+ .lumen-modal-body {
436
+ flex: 1 1 auto;
437
+ min-height: 0;
438
+ overflow-y: auto;
439
+ overscroll-behavior: contain;
440
+ display: flex;
441
+ flex-direction: column;
442
+ }
443
+ .lumen-modal[data-lumen-drawing="true"] .lumen-modal-body {
444
+ overflow: hidden;
445
+ }
446
+
447
+ /* ─── Annotation toolbar ─────────────────────────────────────────── */
448
+ .lumen-toolbar {
449
+ display: flex;
450
+ align-items: center;
451
+ gap: 8px;
452
+ padding: 10px 16px;
453
+ border-bottom: 1px solid var(--lumen-border);
454
+ background: var(--lumen-bg);
455
+ flex-wrap: wrap;
456
+ flex-shrink: 0;
457
+ }
458
+ .lumen-segmented {
459
+ display: inline-flex;
460
+ align-items: center;
461
+ padding: 2px;
462
+ background: var(--lumen-bg-elev);
463
+ border: 1px solid var(--lumen-border);
464
+ border-radius: var(--lumen-r-md);
465
+ }
466
+ .lumen-tool {
467
+ appearance: none;
468
+ background: transparent;
469
+ border: 0;
470
+ border-radius: var(--lumen-r-sm);
471
+ padding: 6px 10px;
472
+ font: inherit;
473
+ font-size: var(--lumen-fs-12);
474
+ font-weight: 500;
475
+ color: var(--lumen-fg-muted);
476
+ cursor: pointer;
477
+ display: inline-flex;
478
+ align-items: center;
479
+ gap: 6px;
480
+ transition: background-color var(--lumen-dur-fast) ease,
481
+ color var(--lumen-dur-fast) ease;
482
+ }
483
+ .lumen-tool:hover { color: var(--lumen-fg); }
484
+ .lumen-tool[aria-pressed="true"] {
485
+ background: var(--lumen-bg);
486
+ color: var(--lumen-fg);
487
+ box-shadow: var(--lumen-shadow-sm);
488
+ }
489
+
490
+ .lumen-toolbar-spacer { flex: 1 1 auto; }
491
+ .lumen-toolbar-sep {
492
+ width: 1px;
493
+ height: 18px;
494
+ background: var(--lumen-border);
495
+ margin: 0 4px;
496
+ }
497
+ .lumen-swatches {
498
+ display: inline-flex;
499
+ align-items: center;
500
+ gap: 4px;
501
+ }
502
+ .lumen-swatch {
503
+ width: 18px;
504
+ height: 18px;
505
+ border-radius: 999px;
506
+ border: 1px solid var(--lumen-border);
507
+ cursor: pointer;
508
+ padding: 0;
509
+ background-clip: padding-box;
510
+ transition: transform var(--lumen-dur-fast) var(--lumen-ease),
511
+ box-shadow var(--lumen-dur-fast) ease;
512
+ }
513
+ .lumen-swatch:hover { transform: scale(1.1); }
514
+ .lumen-swatch[aria-pressed="true"] {
515
+ box-shadow: 0 0 0 2px var(--lumen-bg), 0 0 0 3.5px var(--lumen-fg);
516
+ }
517
+ .lumen-stroke-sizes {
518
+ display: inline-flex;
519
+ align-items: center;
520
+ gap: 2px;
521
+ padding: 2px;
522
+ background: var(--lumen-bg-elev);
523
+ border: 1px solid var(--lumen-border);
524
+ border-radius: var(--lumen-r-md);
525
+ }
526
+ .lumen-stroke-size {
527
+ width: 26px;
528
+ height: 22px;
529
+ border: 0;
530
+ background: transparent;
531
+ border-radius: var(--lumen-r-sm);
532
+ cursor: pointer;
533
+ display: inline-flex;
534
+ align-items: center;
535
+ justify-content: center;
536
+ transition: background-color var(--lumen-dur-fast) ease;
537
+ }
538
+ .lumen-stroke-size:hover { background: var(--lumen-bg-hover); }
539
+ .lumen-stroke-size[aria-pressed="true"] {
540
+ background: var(--lumen-bg);
541
+ box-shadow: var(--lumen-shadow-sm);
542
+ }
543
+ .lumen-stroke-size-dot {
544
+ display: block;
545
+ border-radius: 999px;
546
+ background: var(--lumen-fg);
547
+ }
548
+
549
+ /* ─── Annotation canvas container ────────────────────────────────── */
550
+ .lumen-annotate {
551
+ position: relative;
552
+ display: grid;
553
+ place-items: center;
554
+ background:
555
+ linear-gradient(45deg, var(--lumen-bg-elev) 25%, transparent 25%) -8px 0 / 16px 16px,
556
+ linear-gradient(-45deg, var(--lumen-bg-elev) 25%, transparent 25%) -8px 0 / 16px 16px,
557
+ linear-gradient(45deg, transparent 75%, var(--lumen-bg-elev) 75%) 0 8px / 16px 16px,
558
+ linear-gradient(-45deg, transparent 75%, var(--lumen-bg-elev) 75%) 0 8px / 16px 16px,
559
+ var(--lumen-bg);
560
+ padding: 12px 16px;
561
+ flex-shrink: 0;
562
+ }
563
+ .lumen-annotate-frame {
564
+ position: relative;
565
+ max-width: 100%;
566
+ max-height: 46dvh;
567
+ border-radius: var(--lumen-r-md);
568
+ overflow: hidden;
569
+ box-shadow: var(--lumen-shadow-sm), 0 0 0 1px var(--lumen-border);
570
+ display: grid;
571
+ /* Both canvases share grid cell 1/1 and inherit our max constraints. */
572
+ grid-template-columns: minmax(0, max-content);
573
+ grid-template-rows: minmax(0, max-content);
574
+ justify-content: center;
575
+ }
576
+ @media (min-width: 640px) {
577
+ .lumen-annotate-frame { max-height: 56dvh; }
578
+ }
579
+ .lumen-annotate-frame canvas {
580
+ grid-area: 1 / 1;
581
+ display: block;
582
+ /* Constrain by both axes so tall screenshots scale down preserving
583
+ * aspect ratio without nested scroll. */
584
+ max-width: 100%;
585
+ max-height: 46dvh;
586
+ width: auto;
587
+ height: auto;
588
+ object-fit: contain;
589
+ }
590
+ @media (min-width: 640px) {
591
+ .lumen-annotate-frame canvas { max-height: 56dvh; }
592
+ }
593
+ .lumen-annotate-overlay {
594
+ touch-action: none;
595
+ cursor: crosshair;
596
+ }
597
+
598
+ /* ─── Form ────────────────────────────────────────────────────────── */
599
+ .lumen-form {
600
+ display: grid;
601
+ gap: 12px;
602
+ padding: 16px;
603
+ }
604
+ .lumen-label {
605
+ display: flex;
606
+ flex-direction: column;
607
+ gap: 6px;
608
+ font-size: var(--lumen-fs-13);
609
+ }
610
+ .lumen-label > span {
611
+ color: var(--lumen-fg-muted);
612
+ font-weight: 500;
613
+ letter-spacing: -0.005em;
614
+ }
615
+ .lumen-input,
616
+ select.lumen-input,
617
+ textarea.lumen-input {
618
+ width: 100%;
619
+ border: 1px solid var(--lumen-border);
620
+ border-radius: var(--lumen-r-md);
621
+ background: var(--lumen-bg-elev);
622
+ color: var(--lumen-fg);
623
+ padding: 9px 12px;
624
+ font: inherit;
625
+ font-size: var(--lumen-fs-14);
626
+ line-height: 1.4;
627
+ transition: border-color var(--lumen-dur-fast) ease,
628
+ box-shadow var(--lumen-dur-fast) ease;
629
+ }
630
+ .lumen-input::placeholder,
631
+ textarea.lumen-input::placeholder { color: var(--lumen-fg-subtle); }
632
+ .lumen-input:hover { border-color: var(--lumen-border-strong); }
633
+ .lumen-input:focus,
634
+ .lumen-input:focus-visible {
635
+ outline: none;
636
+ border-color: var(--lumen-border-strong);
637
+ box-shadow: 0 0 0 3px var(--lumen-focus-ring);
638
+ }
639
+ textarea.lumen-input { resize: vertical; min-height: 76px; }
640
+
641
+ .lumen-category {
642
+ display: grid;
643
+ grid-template-columns: repeat(3, 1fr);
644
+ gap: 6px;
645
+ }
646
+ .lumen-category-opt {
647
+ appearance: none;
648
+ background: var(--lumen-bg-elev);
649
+ border: 1px solid var(--lumen-border);
650
+ border-radius: var(--lumen-r-md);
651
+ color: var(--lumen-fg-muted);
652
+ padding: 8px 12px;
653
+ font: inherit;
654
+ font-size: var(--lumen-fs-13);
655
+ font-weight: 500;
656
+ cursor: pointer;
657
+ transition: all var(--lumen-dur-fast) ease;
658
+ }
659
+ .lumen-category-opt:hover {
660
+ color: var(--lumen-fg);
661
+ border-color: var(--lumen-border-strong);
662
+ }
663
+ .lumen-category-opt[aria-pressed="true"] {
664
+ background: var(--lumen-bg);
665
+ color: var(--lumen-fg);
666
+ border-color: var(--lumen-fg);
667
+ box-shadow: var(--lumen-shadow-sm);
668
+ }
669
+
670
+ .lumen-audio-row {
671
+ display: flex;
672
+ flex-wrap: wrap;
673
+ align-items: center;
674
+ gap: 8px;
675
+ }
676
+ .lumen-recording {
677
+ display: inline-flex;
678
+ align-items: center;
679
+ gap: 8px;
680
+ font-size: var(--lumen-fs-13);
681
+ color: var(--lumen-fg);
682
+ font-variant-numeric: tabular-nums;
683
+ }
684
+ .lumen-rec-dot {
685
+ display: inline-block;
686
+ width: 8px;
687
+ height: 8px;
688
+ border-radius: 999px;
689
+ background: var(--lumen-danger);
690
+ box-shadow: 0 0 0 0 rgb(239 68 68 / 0.6);
691
+ animation: lumen-pulse 1.4s ease-in-out infinite;
692
+ }
693
+ @keyframes lumen-pulse {
694
+ 0% { box-shadow: 0 0 0 0 rgb(239 68 68 / 0.6); }
695
+ 70% { box-shadow: 0 0 0 8px rgb(239 68 68 / 0); }
696
+ 100% { box-shadow: 0 0 0 0 rgb(239 68 68 / 0); }
697
+ }
698
+ .lumen-audio-meta {
699
+ font-size: var(--lumen-fs-13);
700
+ color: var(--lumen-fg-muted);
701
+ }
702
+
703
+ /* ─── Footer ─────────────────────────────────────────────────────── */
704
+ .lumen-modal-footer {
705
+ border-top: 1px solid var(--lumen-border);
706
+ padding: 12px 16px;
707
+ display: flex;
708
+ flex-direction: column;
709
+ gap: 8px;
710
+ background: var(--lumen-bg);
711
+ flex-shrink: 0;
712
+ }
713
+ .lumen-modal-actions {
714
+ display: flex;
715
+ justify-content: flex-end;
716
+ gap: 8px;
717
+ }
718
+ .lumen-progress {
719
+ height: 4px;
720
+ background: var(--lumen-border);
721
+ border-radius: 999px;
722
+ overflow: hidden;
723
+ }
724
+ .lumen-progress-fill {
725
+ height: 100%;
726
+ background: var(--lumen-fg);
727
+ transition: width 100ms linear;
728
+ }
729
+
730
+ .lumen-status {
731
+ padding: 32px 16px;
732
+ text-align: center;
733
+ color: var(--lumen-fg-muted);
734
+ font-size: var(--lumen-fs-14);
735
+ }
736
+ .lumen-spinner {
737
+ display: inline-block;
738
+ width: 14px;
739
+ height: 14px;
740
+ border: 2px solid var(--lumen-border-strong);
741
+ border-top-color: var(--lumen-fg);
742
+ border-radius: 999px;
743
+ animation: lumen-spin 700ms linear infinite;
744
+ vertical-align: -2px;
745
+ margin-right: 8px;
746
+ }
747
+ @keyframes lumen-spin {
748
+ to { transform: rotate(360deg); }
749
+ }
750
+
751
+ .lumen-manual-capture {
752
+ display: grid;
753
+ gap: 12px;
754
+ padding: 16px;
755
+ }
756
+ .lumen-manual-capture .lumen-status {
757
+ padding: 4px 0;
758
+ }
759
+ .lumen-manual-drop {
760
+ position: relative;
761
+ display: flex;
762
+ align-items: center;
763
+ justify-content: center;
764
+ min-height: 144px;
765
+ border: 1.5px dashed var(--lumen-border-strong);
766
+ border-radius: var(--lumen-r-md);
767
+ color: var(--lumen-fg-muted);
768
+ cursor: pointer;
769
+ font-size: var(--lumen-fs-14);
770
+ background: var(--lumen-bg-elev);
771
+ transition: background-color var(--lumen-dur-fast) ease,
772
+ border-color var(--lumen-dur-fast) ease,
773
+ color var(--lumen-dur-fast) ease;
774
+ }
775
+ .lumen-manual-drop:hover {
776
+ background: var(--lumen-bg-hover);
777
+ color: var(--lumen-fg);
778
+ border-color: var(--lumen-fg-muted);
779
+ }
780
+ .lumen-manual-drop input {
781
+ position: absolute;
782
+ width: 1px;
783
+ height: 1px;
784
+ overflow: hidden;
785
+ clip: rect(0 0 0 0);
786
+ white-space: nowrap;
787
+ }