@lumen-stack/react 0.12.4 → 0.13.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/dist/styles.css CHANGED
@@ -209,7 +209,9 @@
209
209
  display: inline-flex;
210
210
  align-items: center;
211
211
  justify-content: center;
212
- gap: 6px;
212
+ /* 0 at rest so the collapsed label adds no gap that would shove the grip
213
+ off-centre; restored to 6px only once the label is revealed (below). */
214
+ gap: 0;
213
215
  background: var(--lumen-accent);
214
216
  color: var(--lumen-accent-fg);
215
217
  border: 0;
@@ -217,17 +219,23 @@
217
219
  font: inherit;
218
220
  font-size: var(--lumen-fs-13);
219
221
  font-weight: 500;
220
- box-shadow: var(--lumen-shadow-lg);
222
+ /* A soft ambient shadow to ground the tab + a faint brand glow to lift it.
223
+ The glow tracks --lumen-accent (color-mix) so it follows a host's custom
224
+ accent. Near-symmetric so it reads on every edge. */
225
+ box-shadow:
226
+ 0 2px 10px rgb(0 0 0 / 0.30),
227
+ 0 0 18px color-mix(in oklab, var(--lumen-accent) 32%, transparent);
221
228
  transition:
222
229
  transform var(--lumen-dur) var(--lumen-ease),
223
230
  padding var(--lumen-dur) var(--lumen-ease),
231
+ box-shadow var(--lumen-dur) var(--lumen-ease),
224
232
  opacity var(--lumen-dur-fast) ease;
225
233
  user-select: none;
226
234
  -webkit-tap-highlight-color: transparent;
227
235
  }
228
236
  .lumen-notch-handle {
229
237
  display: block;
230
- background: rgb(255 255 255 / 0.5);
238
+ background: rgb(255 255 255 / 0.7);
231
239
  border-radius: 999px;
232
240
  }
233
241
  .lumen-notch-label {
@@ -235,56 +243,77 @@
235
243
  align-items: center;
236
244
  gap: 6px;
237
245
  white-space: nowrap;
246
+ /* Collapse on BOTH axes at rest so the resting tab is symmetric and the grip
247
+ sits dead-centre. max-width alone hid the text but the label's main-axis
248
+ size still inflated the tab — its line-box height on top/bottom, its
249
+ vertical-text length on left/right — centering the grip in a secretly-tall
250
+ tab (and on the column edges, pushing it to the top). The min-*: 0 is
251
+ required: a flex item's automatic minimum size otherwise refuses to shrink
252
+ below its content, so max-*: 0 would have no effect. */
253
+ min-width: 0;
254
+ min-height: 0;
238
255
  max-width: 0;
256
+ max-height: 0;
239
257
  overflow: hidden;
240
258
  opacity: 0;
241
259
  transition:
242
260
  max-width var(--lumen-dur) var(--lumen-ease),
261
+ max-height var(--lumen-dur) var(--lumen-ease),
243
262
  opacity var(--lumen-dur-fast) ease;
244
263
  }
245
264
  .lumen-notch-expanded .lumen-notch-label,
246
265
  .lumen-notch:hover .lumen-notch-label,
247
266
  .lumen-notch:focus-visible .lumen-notch-label {
248
267
  max-width: 12rem;
268
+ max-height: 12rem;
249
269
  opacity: 1;
250
270
  }
271
+ /* On reveal: restore the handle↔label gap and lift the glow a touch. */
272
+ .lumen-notch-expanded,
273
+ .lumen-notch:hover,
274
+ .lumen-notch:focus-visible {
275
+ gap: 6px;
276
+ box-shadow:
277
+ 0 3px 14px rgb(0 0 0 / 0.34),
278
+ 0 0 26px color-mix(in oklab, var(--lumen-accent) 52%, transparent);
279
+ }
251
280
  .lumen-notch-top {
252
281
  top: 0;
253
282
  left: 50%;
254
- transform: translate(-50%, -8px);
255
- padding: 7px 14px;
283
+ transform: translate(-50%, 0);
284
+ padding: 6px 14px;
256
285
  border-radius: 0 0 999px 999px;
257
286
  }
258
- .lumen-notch-top .lumen-notch-handle { width: 32px; height: 4px; }
287
+ .lumen-notch-top .lumen-notch-handle { width: 28px; height: 3px; }
259
288
  .lumen-notch-top.lumen-notch-expanded,
260
289
  .lumen-notch-top:hover,
261
290
  .lumen-notch-top:focus-visible {
262
291
  transform: translate(-50%, 0);
263
- padding: 9px 16px;
292
+ padding: 8px 16px;
264
293
  }
265
294
  .lumen-notch-bottom {
266
295
  bottom: 0;
267
296
  left: 50%;
268
- transform: translate(-50%, 8px);
269
- padding: 7px 14px;
297
+ transform: translate(-50%, 0);
298
+ padding: 6px 14px;
270
299
  border-radius: 999px 999px 0 0;
271
300
  }
272
- .lumen-notch-bottom .lumen-notch-handle { width: 32px; height: 4px; }
301
+ .lumen-notch-bottom .lumen-notch-handle { width: 28px; height: 3px; }
273
302
  .lumen-notch-bottom.lumen-notch-expanded,
274
303
  .lumen-notch-bottom:hover,
275
304
  .lumen-notch-bottom:focus-visible {
276
305
  transform: translate(-50%, 0);
277
- padding: 9px 16px;
306
+ padding: 8px 16px;
278
307
  }
279
308
  .lumen-notch-right {
280
309
  right: 0;
281
310
  top: 50%;
282
- transform: translate(8px, -50%);
283
- padding: 14px 7px;
311
+ transform: translate(0, -50%);
312
+ padding: 14px 6px;
284
313
  border-radius: 999px 0 0 999px;
285
314
  flex-direction: column;
286
315
  }
287
- .lumen-notch-right .lumen-notch-handle { width: 4px; height: 32px; }
316
+ .lumen-notch-right .lumen-notch-handle { width: 3px; height: 28px; }
288
317
  .lumen-notch-right .lumen-notch-label {
289
318
  writing-mode: vertical-rl;
290
319
  transform: rotate(180deg);
@@ -293,23 +322,23 @@
293
322
  .lumen-notch-right:hover,
294
323
  .lumen-notch-right:focus-visible {
295
324
  transform: translate(0, -50%);
296
- padding: 16px 9px;
325
+ padding: 16px 8px;
297
326
  }
298
327
  .lumen-notch-left {
299
328
  left: 0;
300
329
  top: 50%;
301
- transform: translate(-8px, -50%);
302
- padding: 14px 7px;
330
+ transform: translate(0, -50%);
331
+ padding: 14px 6px;
303
332
  border-radius: 0 999px 999px 0;
304
333
  flex-direction: column;
305
334
  }
306
- .lumen-notch-left .lumen-notch-handle { width: 4px; height: 32px; }
335
+ .lumen-notch-left .lumen-notch-handle { width: 3px; height: 28px; }
307
336
  .lumen-notch-left .lumen-notch-label { writing-mode: vertical-rl; }
308
337
  .lumen-notch-left.lumen-notch-expanded,
309
338
  .lumen-notch-left:hover,
310
339
  .lumen-notch-left:focus-visible {
311
340
  transform: translate(0, -50%);
312
- padding: 16px 9px;
341
+ padding: 16px 8px;
313
342
  }
314
343
 
315
344
  /* ─── Modal shell ────────────────────────────────────────────────── */
@@ -394,8 +423,8 @@
394
423
  }
395
424
  .lumen-modal-grabber::before {
396
425
  content: "";
397
- width: 36px;
398
- height: 4px;
426
+ width: 32px;
427
+ height: 3px;
399
428
  border-radius: 999px;
400
429
  background: var(--lumen-border-strong);
401
430
  }
@@ -503,9 +532,12 @@
503
532
  display: flex;
504
533
  align-items: center;
505
534
  gap: 8px;
506
- padding: 10px 16px;
507
- border-bottom: 1px solid var(--lumen-border);
508
- background: var(--lumen-bg);
535
+ margin: 12px 16px 0;
536
+ padding: 7px 10px;
537
+ border-radius: var(--lumen-r-lg);
538
+ border: 0.5px solid var(--lumen-border);
539
+ background: var(--lumen-bg-elev);
540
+ box-shadow: var(--lumen-shadow-sm);
509
541
  flex-wrap: wrap;
510
542
  flex-shrink: 0;
511
543
  }
@@ -605,12 +637,7 @@
605
637
  position: relative;
606
638
  display: grid;
607
639
  place-items: center;
608
- background:
609
- linear-gradient(45deg, var(--lumen-bg-elev) 25%, transparent 25%) -8px 0 / 16px 16px,
610
- linear-gradient(-45deg, var(--lumen-bg-elev) 25%, transparent 25%) -8px 0 / 16px 16px,
611
- linear-gradient(45deg, transparent 75%, var(--lumen-bg-elev) 75%) 0 8px / 16px 16px,
612
- linear-gradient(-45deg, transparent 75%, var(--lumen-bg-elev) 75%) 0 8px / 16px 16px,
613
- var(--lumen-bg);
640
+ background: transparent;
614
641
  padding: 12px 16px;
615
642
  flex-shrink: 0;
616
643
  }
@@ -618,27 +645,28 @@
618
645
  position: relative;
619
646
  display: inline-block;
620
647
  max-width: 100%;
621
- max-height: 46dvh;
622
- border-radius: var(--lumen-r-md);
648
+ max-height: 54dvh;
649
+ border-radius: var(--lumen-r-lg);
623
650
  overflow: hidden;
624
- box-shadow: var(--lumen-shadow-sm), 0 0 0 1px var(--lumen-border);
651
+ box-shadow: 0 1px 3px rgb(0 0 0 / 0.14), 0 18px 44px -12px rgb(0 0 0 / 0.4),
652
+ 0 0 0 0.5px var(--lumen-border);
625
653
  line-height: 0;
626
654
  }
627
655
  @media (min-width: 640px) {
628
- .lumen-annotate-frame { max-height: 56dvh; }
656
+ .lumen-annotate-frame { max-height: 60dvh; }
629
657
  }
630
658
  .lumen-annotate-frame canvas {
631
659
  display: block;
632
660
  /* Base canvas dictates the rendered box; constrain by both axes so
633
661
  * tall screenshots scale down preserving aspect without nested scroll. */
634
662
  max-width: 100%;
635
- max-height: 46dvh;
663
+ max-height: 54dvh;
636
664
  width: auto;
637
665
  height: auto;
638
666
  object-fit: contain;
639
667
  }
640
668
  @media (min-width: 640px) {
641
- .lumen-annotate-frame canvas { max-height: 56dvh; }
669
+ .lumen-annotate-frame canvas { max-height: 60dvh; }
642
670
  }
643
671
  .lumen-annotate-overlay {
644
672
  /* Absolute over the base canvas instead of CSS-grid stacking. iOS
@@ -658,6 +686,561 @@
658
686
  cursor: copy;
659
687
  }
660
688
 
689
+ /* ─── Stage 2a: fullscreen markup capture surface ────────────────────
690
+ When a capture is ready, the modal goes fullscreen: the screenshot sits
691
+ large in a dark surround (the frame still wraps the canvas so the
692
+ annotation overlay stays pixel-aligned) and the chrome floats over it. */
693
+ .lumen-modal[data-lumen-fs="true"] {
694
+ position: fixed;
695
+ inset: 0;
696
+ width: 100%;
697
+ height: 100%;
698
+ max-width: none;
699
+ max-height: none;
700
+ border-radius: 0;
701
+ }
702
+ /* Desktop: the fullscreen markup is a mobile pattern — center it as a phone-like
703
+ column over the dimmed backdrop instead of stretching edge-to-edge. */
704
+ @media (min-width: 640px) {
705
+ .lumen-modal[data-lumen-fs="true"] {
706
+ inset: auto;
707
+ top: 50%;
708
+ left: 50%;
709
+ transform: translate(-50%, -50%);
710
+ width: min(820px, 92vw);
711
+ height: 88vh;
712
+ max-height: 940px;
713
+ border-radius: 24px;
714
+ overflow: hidden;
715
+ box-shadow: var(--lumen-shadow-lg);
716
+ }
717
+ }
718
+ .lumen-modal[data-lumen-fs="true"] .lumen-modal-grabber,
719
+ .lumen-modal[data-lumen-fs="true"] .lumen-modal-header,
720
+ .lumen-modal[data-lumen-fs="true"] .lumen-stepper,
721
+ .lumen-modal[data-lumen-fs="true"] .lumen-cap-note,
722
+ .lumen-modal[data-lumen-fs="true"] .lumen-modal-footer {
723
+ display: none;
724
+ }
725
+ .lumen-modal[data-lumen-fs="true"] .lumen-modal-body {
726
+ padding: 0;
727
+ position: relative;
728
+ overflow: hidden;
729
+ /* soft surround behind the pre-capture states (record/upload/capturing),
730
+ matching the annotate surround so there's no jump to the markup view */
731
+ background: color-mix(in srgb, var(--lumen-fg) 8%, var(--lumen-bg));
732
+ }
733
+ .lumen-modal[data-lumen-fs="true"] .lumen-pane { position: absolute; inset: 0; }
734
+ /* record prompt / upload picker / "capturing…" centered on the surround */
735
+ .lumen-fs-center {
736
+ position: absolute;
737
+ inset: calc(env(safe-area-inset-top, 0px) + 116px) 20px 24px;
738
+ display: flex;
739
+ flex-direction: column;
740
+ align-items: center;
741
+ justify-content: center;
742
+ gap: 14px;
743
+ text-align: center;
744
+ }
745
+ .lumen-fs-center .lumen-manual-drop,
746
+ .lumen-fs-center .lumen-record-prompt { width: 100%; max-width: 360px; }
747
+ /* method picker (fallback when auto-capture is unavailable) on the surround */
748
+ .lumen-fs-picker { gap: 18px; }
749
+ .lumen-fs-picker-head { display: flex; flex-direction: column; gap: 5px; }
750
+ .lumen-fs-picker-title { font: 700 18px/1.25 var(--lumen-font-ui); color: var(--lumen-fg); }
751
+ .lumen-fs-picker-sub { font: 400 13.5px/1.4 var(--lumen-font-ui); color: var(--lumen-fg-muted); }
752
+ .lumen-fs-picker .lumen-method { width: 100%; max-width: 360px; padding: 0; }
753
+ .lumen-modal[data-lumen-fs="true"] .lumen-annotate {
754
+ position: absolute;
755
+ inset: 0;
756
+ padding: calc(env(safe-area-inset-top, 0px) + 126px) 14px 192px;
757
+ /* Theme-aware soft surround (harmonizes with the sheet — no harsh black):
758
+ light → soft grey, dark → slightly lifted dark. */
759
+ background: color-mix(in srgb, var(--lumen-fg) 8%, var(--lumen-bg));
760
+ place-items: center;
761
+ }
762
+ .lumen-modal[data-lumen-fs="true"] .lumen-annotate-frame {
763
+ max-width: 100%;
764
+ max-height: 100%;
765
+ border-radius: var(--lumen-r-lg);
766
+ box-shadow: 0 10px 36px -10px rgb(0 0 0 / 0.22), 0 0 0 0.5px rgb(0 0 0 / 0.07);
767
+ }
768
+ .lumen-modal[data-lumen-fs="true"] .lumen-annotate-frame canvas {
769
+ max-height: calc(100dvh - 210px);
770
+ }
771
+ /* floating top chrome: ✕ · method switch · Recapture (replaces the old
772
+ method-switch + cap-actions in the fullscreen capture surface) */
773
+ .lumen-modal[data-lumen-fs="true"] .lumen-cap-actions { display: none; }
774
+ .lumen-fs-top {
775
+ position: absolute;
776
+ top: 0;
777
+ left: 0;
778
+ right: 0;
779
+ z-index: 6;
780
+ display: flex;
781
+ flex-direction: column;
782
+ gap: 10px;
783
+ padding: calc(env(safe-area-inset-top, 0px) + 18px) 12px 14px;
784
+ background: transparent;
785
+ }
786
+ .lumen-fs-toprow { display: flex; align-items: center; gap: 8px; }
787
+ .lumen-fs-row-corners { justify-content: space-between; }
788
+ .lumen-fs-row-pill { justify-content: center; }
789
+ .lumen-fs-pill {
790
+ display: inline-flex;
791
+ align-items: center;
792
+ gap: 2px;
793
+ padding: 4px;
794
+ border-radius: 19px;
795
+ background: rgb(20 20 24 / 0.66);
796
+ backdrop-filter: blur(18px) saturate(150%);
797
+ -webkit-backdrop-filter: blur(18px) saturate(150%);
798
+ }
799
+ .lumen-fs-pill-btn {
800
+ width: 38px;
801
+ height: 30px;
802
+ border: 0;
803
+ background: transparent;
804
+ color: rgb(255 255 255 / 0.6);
805
+ border-radius: 15px;
806
+ display: grid;
807
+ place-items: center;
808
+ cursor: pointer;
809
+ }
810
+ .lumen-fs-pill-btn svg { width: 16px; height: 16px; }
811
+ .lumen-fs-pill-btn[aria-pressed="true"] { background: rgb(255 255 255 / 0.2); color: #fff; }
812
+ .lumen-fs-pill-btn.lumen-fs-pentog[data-on="true"] { background: var(--lumen-accent); color: #fff; }
813
+ .lumen-fs-pill-sep { width: 0.5px; height: 20px; background: rgb(255 255 255 / 0.22); margin: 0 3px; }
814
+ /* annotation colour: single swatch button → popover (declutters the palette) */
815
+ .lumen-fs-color { position: relative; display: inline-flex; align-items: center; }
816
+ .lumen-fs-color-btn {
817
+ width: 24px;
818
+ height: 24px;
819
+ border-radius: 50%;
820
+ border: 2px solid rgb(255 255 255 / 0.55);
821
+ padding: 0;
822
+ cursor: pointer;
823
+ background-clip: padding-box;
824
+ }
825
+ .lumen-fs-color-overlay { position: fixed; inset: 0; z-index: 7; }
826
+ .lumen-fs-color-pop {
827
+ position: absolute;
828
+ bottom: 42px;
829
+ left: 50%;
830
+ transform: translateX(-50%);
831
+ z-index: 8;
832
+ display: flex;
833
+ gap: 9px;
834
+ padding: 9px 11px;
835
+ border-radius: 14px;
836
+ background: rgb(26 26 30 / 0.98);
837
+ backdrop-filter: blur(20px) saturate(160%);
838
+ -webkit-backdrop-filter: blur(20px) saturate(160%);
839
+ border: 0.5px solid rgb(255 255 255 / 0.16);
840
+ box-shadow: 0 16px 40px rgb(0 0 0 / 0.5);
841
+ }
842
+ .lumen-fs-color-pop .lumen-swatch {
843
+ width: 26px;
844
+ height: 26px;
845
+ border-color: rgb(255 255 255 / 0.25);
846
+ }
847
+ .lumen-fs-color-pop .lumen-swatch[aria-pressed="true"] {
848
+ box-shadow: 0 0 0 2px rgb(26 26 30), 0 0 0 4px #fff;
849
+ }
850
+ .lumen-fs-recap { position: relative; }
851
+ .lumen-fs-recap-overlay { position: fixed; inset: 0; z-index: 7; }
852
+ .lumen-fs-recap-menu {
853
+ position: absolute;
854
+ right: 0;
855
+ top: 46px;
856
+ width: 252px;
857
+ z-index: 8;
858
+ padding: 6px;
859
+ border-radius: 14px;
860
+ background: rgb(26 26 30 / 0.98);
861
+ backdrop-filter: blur(20px) saturate(160%);
862
+ -webkit-backdrop-filter: blur(20px) saturate(160%);
863
+ border: 0.5px solid rgb(255 255 255 / 0.16);
864
+ box-shadow: 0 18px 44px rgb(0 0 0 / 0.5);
865
+ }
866
+ .lumen-fs-recap-menu button {
867
+ display: flex;
868
+ align-items: flex-start;
869
+ gap: 11px;
870
+ width: 100%;
871
+ padding: 9px 10px;
872
+ border: 0;
873
+ background: transparent;
874
+ border-radius: 9px;
875
+ cursor: pointer;
876
+ text-align: left;
877
+ }
878
+ .lumen-fs-recap-menu button:active { background: rgb(255 255 255 / 0.08); }
879
+ .lumen-fs-mi-ic {
880
+ width: 30px;
881
+ height: 30px;
882
+ flex: none;
883
+ border-radius: 8px;
884
+ background: rgb(255 255 255 / 0.1);
885
+ color: #fff;
886
+ display: grid;
887
+ place-items: center;
888
+ }
889
+ .lumen-fs-mi-ic svg { width: 16px; height: 16px; }
890
+ .lumen-fs-recap-menu b {
891
+ display: block;
892
+ font: 600 13px/1.2 var(--lumen-font-ui);
893
+ color: #fff;
894
+ }
895
+ .lumen-fs-recap-menu small {
896
+ display: block;
897
+ font: 400 11px/1.3 var(--lumen-font-ui);
898
+ color: rgb(255 255 255 / 0.55);
899
+ margin-top: 2px;
900
+ }
901
+ .lumen-fs-chip {
902
+ height: 38px;
903
+ padding: 0 14px;
904
+ border: 0;
905
+ border-radius: 19px;
906
+ background: rgb(20 20 24 / 0.66);
907
+ color: #fff;
908
+ backdrop-filter: blur(18px) saturate(150%);
909
+ -webkit-backdrop-filter: blur(18px) saturate(150%);
910
+ display: inline-flex;
911
+ align-items: center;
912
+ gap: 6px;
913
+ font: 600 14px/1 var(--lumen-font-ui);
914
+ cursor: pointer;
915
+ }
916
+ .lumen-fs-chip svg { width: 15px; height: 15px; }
917
+ .lumen-fs-x { width: 38px; padding: 0; justify-content: center; font-size: 15px; }
918
+ .lumen-fs-mswitch {
919
+ display: inline-flex;
920
+ gap: 2px;
921
+ padding: 4px;
922
+ border-radius: 19px;
923
+ background: rgb(20 20 24 / 0.66);
924
+ backdrop-filter: blur(18px) saturate(150%);
925
+ -webkit-backdrop-filter: blur(18px) saturate(150%);
926
+ }
927
+ .lumen-fs-mswitch button {
928
+ width: 38px;
929
+ height: 30px;
930
+ border: 0;
931
+ background: transparent;
932
+ color: rgb(255 255 255 / 0.6);
933
+ border-radius: 15px;
934
+ display: grid;
935
+ place-items: center;
936
+ cursor: pointer;
937
+ }
938
+ .lumen-fs-mswitch button[aria-pressed="true"] { background: rgb(255 255 255 / 0.2); color: #fff; }
939
+ .lumen-fs-mswitch svg { width: 16px; height: 16px; }
940
+ /* floating glass tool palette */
941
+ .lumen-modal[data-lumen-fs="true"] .lumen-toolbar {
942
+ position: absolute;
943
+ left: 50%;
944
+ bottom: 168px;
945
+ transform: translateX(-50%);
946
+ z-index: 7;
947
+ margin: 0;
948
+ width: auto;
949
+ max-width: calc(100% - 20px);
950
+ justify-content: center;
951
+ flex-wrap: nowrap;
952
+ gap: 6px;
953
+ padding: 7px 9px;
954
+ background: rgb(20 20 24 / 0.82);
955
+ backdrop-filter: blur(22px) saturate(160%);
956
+ -webkit-backdrop-filter: blur(22px) saturate(160%);
957
+ border: 0;
958
+ box-shadow: 0 12px 32px rgb(0 0 0 / 0.45);
959
+ }
960
+ /* one-row palette: 4 colors, tight groups */
961
+ .lumen-modal[data-lumen-fs="true"] .lumen-swatch:nth-child(n+5) { display: none; }
962
+ .lumen-modal[data-lumen-fs="true"] .lumen-swatches { gap: 5px; }
963
+ .lumen-modal[data-lumen-fs="true"] .lumen-segmented { gap: 1px; padding: 0; background: transparent; }
964
+ .lumen-modal[data-lumen-fs="true"] .lumen-segmented,
965
+ .lumen-modal[data-lumen-fs="true"] .lumen-stroke-sizes { background: rgb(255 255 255 / 0.1); border: 0; }
966
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool { color: rgb(255 255 255 / 0.7); padding: 7px; }
967
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool svg { width: 18px; height: 18px; display: block; }
968
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool[disabled] { opacity: 0.4; }
969
+ /* top-left group: ✕ + pen-toggle (show/hide tools) */
970
+ .lumen-fs-topl { display: flex; align-items: center; gap: 8px; }
971
+ .lumen-fs-pentog { width: 38px; padding: 0; justify-content: center; }
972
+ .lumen-fs-pentog[data-on="true"] { background: var(--lumen-accent); color: #fff; }
973
+ .lumen-fs-pentog svg { width: 17px; height: 17px; }
974
+ /* bottom compose: description + voice + Next (replaces the footer in fullscreen) */
975
+ .lumen-fs-compose {
976
+ position: absolute;
977
+ left: 0;
978
+ right: 0;
979
+ bottom: 0;
980
+ z-index: 6;
981
+ background: var(--lumen-bg);
982
+ border-radius: var(--lumen-r-lg) var(--lumen-r-lg) 0 0;
983
+ box-shadow: 0 -0.5px 0 var(--lumen-border), 0 -16px 40px rgb(0 0 0 / 0.4);
984
+ padding: 12px 16px calc(16px + var(--lumen-keyboard-inset, 0px));
985
+ display: flex;
986
+ flex-direction: column;
987
+ gap: 10px;
988
+ }
989
+ .lumen-fs-desc { width: 100%; }
990
+ .lumen-fs-next { height: 48px; }
991
+ .lumen-fs-compose .lumen-voice-capture { margin: 0; padding: 0; }
992
+ /* grabber to minimize the sheet */
993
+ .lumen-fs-grab {
994
+ display: block;
995
+ width: 100%;
996
+ height: 16px;
997
+ padding: 0;
998
+ border: 0;
999
+ background: transparent;
1000
+ cursor: pointer;
1001
+ position: relative;
1002
+ flex: none;
1003
+ margin-top: -4px;
1004
+ }
1005
+ .lumen-fs-grab::before {
1006
+ content: "";
1007
+ position: absolute;
1008
+ top: 4px;
1009
+ left: 50%;
1010
+ transform: translateX(-50%);
1011
+ width: 36px;
1012
+ height: 5px;
1013
+ border-radius: 3px;
1014
+ background: var(--lumen-border-strong);
1015
+ }
1016
+ /* compact voice: mic lives in the field; hide the big idle button + hint */
1017
+ .lumen-fs-field { position: relative; }
1018
+ .lumen-fs-field .lumen-fs-desc { padding-right: 46px; }
1019
+ .lumen-fs-mic {
1020
+ position: absolute;
1021
+ right: 6px;
1022
+ top: 50%;
1023
+ transform: translateY(-50%);
1024
+ width: 34px;
1025
+ height: 34px;
1026
+ border: 0;
1027
+ border-radius: 50%;
1028
+ display: grid;
1029
+ place-items: center;
1030
+ color: var(--lumen-accent);
1031
+ background: color-mix(in srgb, var(--lumen-accent) 14%, transparent);
1032
+ cursor: pointer;
1033
+ }
1034
+ .lumen-fs-mic svg { width: 17px; height: 17px; }
1035
+ .lumen-fs-compose .lumen-voice-capture-btn,
1036
+ .lumen-fs-compose .lumen-voice-capture-hint { display: none; }
1037
+ /* collapse the sheet down to reveal the full capture */
1038
+ .lumen-fs-compose { transition: transform 0.32s var(--lumen-ease); }
1039
+ .lumen-modal[data-lumen-sheet="down"] .lumen-fs-compose {
1040
+ transform: translateY(calc(100% - 26px));
1041
+ }
1042
+ /* Minimizing the sheet must NOT hide the tool palette — only the pen-toggle
1043
+ (toolsHidden) controls that. */
1044
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool[aria-pressed="true"] {
1045
+ background: var(--lumen-accent);
1046
+ color: #fff;
1047
+ box-shadow: none;
1048
+ }
1049
+ .lumen-modal[data-lumen-fs="true"] .lumen-toolbar .lumen-btn-ghost { color: rgb(255 255 255 / 0.85); }
1050
+ .lumen-modal[data-lumen-fs="true"] .lumen-toolbar-sep { background: rgb(255 255 255 / 0.2); }
1051
+ .lumen-modal[data-lumen-fs="true"] .lumen-stroke-size-dot { background: #fff; }
1052
+ /* footer = bottom action bar over the screen */
1053
+ .lumen-modal[data-lumen-fs="true"] .lumen-modal-footer {
1054
+ position: absolute;
1055
+ left: 0;
1056
+ right: 0;
1057
+ bottom: 0;
1058
+ z-index: 5;
1059
+ }
1060
+
1061
+ /* ─── Review & send detent (step 2) — a taller sheet that rises over the
1062
+ dimmed, annotated capture; editable priority/platform/description → Send ── */
1063
+ .lumen-rv-pane { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
1064
+ .lumen-rv-pane > .lumen-rv { pointer-events: auto; }
1065
+ /* On the review step the shared AnnotationLayer is still mounted behind the
1066
+ panel — anchor it to the top so it peeks above the sheet, and freeze it
1067
+ (no accidental drawing while reviewing). */
1068
+ .lumen-modal[data-lumen-review="true"] .lumen-annotate {
1069
+ padding: calc(env(safe-area-inset-top, 0px) + 22px) 14px 0;
1070
+ align-items: start;
1071
+ pointer-events: none;
1072
+ }
1073
+ .lumen-rv-scrim { position: absolute; inset: 0; background: rgb(8 10 18 / 0.5); }
1074
+ .lumen-rv {
1075
+ position: absolute;
1076
+ left: 0;
1077
+ right: 0;
1078
+ bottom: 0;
1079
+ z-index: 6;
1080
+ max-height: 80%;
1081
+ display: flex;
1082
+ flex-direction: column;
1083
+ background: var(--lumen-bg);
1084
+ border-radius: var(--lumen-r-lg) var(--lumen-r-lg) 0 0;
1085
+ box-shadow: 0 -0.5px 0 var(--lumen-border), 0 -16px 50px rgb(0 0 0 / 0.45);
1086
+ padding: 4px 16px calc(16px + var(--lumen-keyboard-inset, 0px));
1087
+ animation: lumen-rv-rise 0.34s var(--lumen-ease);
1088
+ }
1089
+ @keyframes lumen-rv-rise {
1090
+ from { transform: translateY(18px); opacity: 0; }
1091
+ to { transform: translateY(0); opacity: 1; }
1092
+ }
1093
+ .lumen-rv-head {
1094
+ flex: none;
1095
+ display: flex;
1096
+ align-items: center;
1097
+ justify-content: space-between;
1098
+ height: 46px;
1099
+ }
1100
+ .lumen-rv-back {
1101
+ display: inline-flex;
1102
+ align-items: center;
1103
+ gap: 1px;
1104
+ border: 0;
1105
+ background: transparent;
1106
+ cursor: pointer;
1107
+ color: var(--lumen-accent);
1108
+ font: 600 14px/1 var(--lumen-font-ui);
1109
+ padding: 6px 4px 6px 0;
1110
+ }
1111
+ .lumen-rv-back svg { width: 18px; height: 18px; }
1112
+ .lumen-rv-title { font: 600 15px/1 var(--lumen-font-ui); color: var(--lumen-fg); }
1113
+ .lumen-rv-spacer { width: 52px; }
1114
+ .lumen-rv-rows {
1115
+ flex: 1;
1116
+ min-height: 0;
1117
+ overflow-y: auto;
1118
+ -webkit-overflow-scrolling: touch;
1119
+ }
1120
+ .lumen-rv-set {
1121
+ display: flex;
1122
+ flex-direction: column;
1123
+ gap: 9px;
1124
+ padding: 12px 0;
1125
+ border-top: 0.5px solid var(--lumen-border);
1126
+ }
1127
+ .lumen-rv-set:first-child { border-top: 0; padding-top: 4px; }
1128
+ .lumen-rv-k {
1129
+ color: var(--lumen-fg-muted);
1130
+ font: 600 12.5px/1.3 var(--lumen-font-ui);
1131
+ }
1132
+ .lumen-rv-muted { color: var(--lumen-fg-muted); font-weight: 400; }
1133
+ .lumen-rv-desc {
1134
+ width: 100%;
1135
+ min-height: 52px;
1136
+ resize: none;
1137
+ font: 400 15px/1.4 var(--lumen-font-ui);
1138
+ }
1139
+ .lumen-rv-chips, .lumen-rv-prio { display: flex; gap: 7px; flex-wrap: wrap; }
1140
+ .lumen-rv-chip,
1141
+ .lumen-rv-prio-opt {
1142
+ display: inline-flex;
1143
+ align-items: center;
1144
+ gap: 7px;
1145
+ height: 34px;
1146
+ padding: 0 13px;
1147
+ border-radius: 9px;
1148
+ border: 1px solid var(--lumen-border);
1149
+ background: transparent;
1150
+ color: var(--lumen-fg);
1151
+ font: 600 13px/1 var(--lumen-font-ui);
1152
+ cursor: pointer;
1153
+ }
1154
+ .lumen-rv-chip[aria-pressed="true"],
1155
+ .lumen-rv-prio-opt[aria-pressed="true"] {
1156
+ border-color: var(--lumen-accent);
1157
+ background: color-mix(in srgb, var(--lumen-accent) 10%, transparent);
1158
+ color: var(--lumen-accent);
1159
+ }
1160
+ /* Linear-style priority glyphs */
1161
+ .lumen-pri-ic {
1162
+ display: inline-flex;
1163
+ align-items: flex-end;
1164
+ gap: 2px;
1165
+ height: 12px;
1166
+ color: var(--lumen-fg-muted);
1167
+ }
1168
+ .lumen-rv-prio-opt[aria-pressed="true"] .lumen-pri-ic { color: var(--lumen-accent); }
1169
+ .lumen-pri-bars i { width: 3px; border-radius: 1px; background: currentColor; opacity: 0.3; }
1170
+ .lumen-pri-bars i:nth-child(1) { height: 5px; }
1171
+ .lumen-pri-bars i:nth-child(2) { height: 8px; }
1172
+ .lumen-pri-bars i:nth-child(3) { height: 12px; }
1173
+ .lumen-pri-bars[data-level="1"] i:nth-child(1),
1174
+ .lumen-pri-bars[data-level="2"] i:nth-child(1),
1175
+ .lumen-pri-bars[data-level="2"] i:nth-child(2),
1176
+ .lumen-pri-bars[data-level="3"] i { opacity: 1; }
1177
+ .lumen-pri-urgent {
1178
+ width: 14px;
1179
+ height: 14px;
1180
+ border-radius: 4px;
1181
+ background: #f2994a;
1182
+ color: #fff;
1183
+ align-items: center;
1184
+ justify-content: center;
1185
+ font: 800 10px/1 var(--lumen-font-ui);
1186
+ }
1187
+ .lumen-rv-row {
1188
+ display: flex;
1189
+ align-items: center;
1190
+ justify-content: space-between;
1191
+ gap: 12px;
1192
+ padding: 11px 0;
1193
+ border-top: 0.5px solid var(--lumen-border);
1194
+ font: 400 13px/1.3 var(--lumen-font-ui);
1195
+ }
1196
+ .lumen-rv-rk { color: var(--lumen-fg-muted); font-weight: 600; }
1197
+ .lumen-rv-rv {
1198
+ color: var(--lumen-fg);
1199
+ display: inline-flex;
1200
+ align-items: center;
1201
+ gap: 8px;
1202
+ }
1203
+ .lumen-rv-rows .lumen-label { padding: 12px 0 0; border-top: 0.5px solid var(--lumen-border); }
1204
+ /* voice control reads as a neat bordered pill in the review (no oversized icon
1205
+ / no text wrap) — matching the dashed "Attach a video" affordance */
1206
+ .lumen-rv-rows .lumen-audio-row .lumen-btn-ghost {
1207
+ display: inline-flex;
1208
+ align-items: center;
1209
+ gap: 7px;
1210
+ white-space: nowrap;
1211
+ height: 36px;
1212
+ padding: 0 14px;
1213
+ border: 1px solid var(--lumen-border);
1214
+ border-radius: 10px;
1215
+ }
1216
+ .lumen-rv-rows .lumen-audio-row .lumen-btn-ghost svg { width: 17px; height: 17px; flex: none; }
1217
+ .lumen-rv-attachrow { padding: 12px 0 2px; }
1218
+ .lumen-rv-attach {
1219
+ display: inline-flex;
1220
+ align-items: center;
1221
+ gap: 7px;
1222
+ height: 36px;
1223
+ padding: 0 13px;
1224
+ border-radius: 10px;
1225
+ border: 1px dashed color-mix(in srgb, var(--lumen-fg) 28%, transparent);
1226
+ background: transparent;
1227
+ color: var(--lumen-fg-muted);
1228
+ font: 600 13px/1 var(--lumen-font-ui);
1229
+ cursor: pointer;
1230
+ }
1231
+ .lumen-rv-attach svg { width: 15px; height: 15px; }
1232
+ .lumen-rv-attach input { display: none; }
1233
+ .lumen-rv-send {
1234
+ flex: none;
1235
+ height: 50px;
1236
+ margin-top: 12px;
1237
+ display: inline-flex;
1238
+ align-items: center;
1239
+ justify-content: center;
1240
+ gap: 9px;
1241
+ }
1242
+ .lumen-rv-send svg { width: 18px; height: 18px; }
1243
+
661
1244
  /* ─── Comment / speech-bubble annotations (inline-editable, Figma-style) ── */
662
1245
  .lumen-bubble-layer {
663
1246
  position: absolute;