@lumen-stack/react 0.12.5 → 0.14.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
@@ -532,9 +532,12 @@
532
532
  display: flex;
533
533
  align-items: center;
534
534
  gap: 8px;
535
- padding: 10px 16px;
536
- border-bottom: 1px solid var(--lumen-border);
537
- 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);
538
541
  flex-wrap: wrap;
539
542
  flex-shrink: 0;
540
543
  }
@@ -634,12 +637,7 @@
634
637
  position: relative;
635
638
  display: grid;
636
639
  place-items: center;
637
- background:
638
- linear-gradient(45deg, var(--lumen-bg-elev) 25%, transparent 25%) -8px 0 / 16px 16px,
639
- linear-gradient(-45deg, var(--lumen-bg-elev) 25%, transparent 25%) -8px 0 / 16px 16px,
640
- linear-gradient(45deg, transparent 75%, var(--lumen-bg-elev) 75%) 0 8px / 16px 16px,
641
- linear-gradient(-45deg, transparent 75%, var(--lumen-bg-elev) 75%) 0 8px / 16px 16px,
642
- var(--lumen-bg);
640
+ background: transparent;
643
641
  padding: 12px 16px;
644
642
  flex-shrink: 0;
645
643
  }
@@ -647,27 +645,28 @@
647
645
  position: relative;
648
646
  display: inline-block;
649
647
  max-width: 100%;
650
- max-height: 46dvh;
651
- border-radius: var(--lumen-r-md);
648
+ max-height: 54dvh;
649
+ border-radius: var(--lumen-r-lg);
652
650
  overflow: hidden;
653
- 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);
654
653
  line-height: 0;
655
654
  }
656
655
  @media (min-width: 640px) {
657
- .lumen-annotate-frame { max-height: 56dvh; }
656
+ .lumen-annotate-frame { max-height: 60dvh; }
658
657
  }
659
658
  .lumen-annotate-frame canvas {
660
659
  display: block;
661
660
  /* Base canvas dictates the rendered box; constrain by both axes so
662
661
  * tall screenshots scale down preserving aspect without nested scroll. */
663
662
  max-width: 100%;
664
- max-height: 46dvh;
663
+ max-height: 54dvh;
665
664
  width: auto;
666
665
  height: auto;
667
666
  object-fit: contain;
668
667
  }
669
668
  @media (min-width: 640px) {
670
- .lumen-annotate-frame canvas { max-height: 56dvh; }
669
+ .lumen-annotate-frame canvas { max-height: 60dvh; }
671
670
  }
672
671
  .lumen-annotate-overlay {
673
672
  /* Absolute over the base canvas instead of CSS-grid stacking. iOS
@@ -687,6 +686,583 @@
687
686
  cursor: copy;
688
687
  }
689
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
+ /* Mobile: the capture takes (almost) the full height and the compose sheet
757
+ overlaps its lower edge — drag the grabber to push the sheet down and see
758
+ the rest. Desktop restores a full reserve below (landscape fits with a
759
+ gap, no overlap needed). */
760
+ padding: calc(env(safe-area-inset-top, 0px) + 126px) 14px
761
+ calc(env(safe-area-inset-bottom, 0px) + 20px);
762
+ /* Theme-aware soft surround (harmonizes with the sheet — no harsh black):
763
+ light → soft grey, dark → slightly lifted dark. */
764
+ background: color-mix(in srgb, var(--lumen-fg) 8%, var(--lumen-bg));
765
+ place-items: center;
766
+ }
767
+ @media (min-width: 640px) {
768
+ .lumen-modal[data-lumen-fs="true"] .lumen-annotate { padding-bottom: 192px; }
769
+ }
770
+ .lumen-modal[data-lumen-fs="true"] .lumen-annotate-frame {
771
+ max-width: 100%;
772
+ max-height: 100%;
773
+ border-radius: var(--lumen-r-lg);
774
+ box-shadow: 0 10px 36px -10px rgb(0 0 0 / 0.22), 0 0 0 0.5px rgb(0 0 0 / 0.07);
775
+ }
776
+ /* Bound the canvas to the SAME available height as the frame — the modal
777
+ minus the top chrome (126px) and the bottom compose sheet (192px) — so a
778
+ tall screenshot scales down (object-fit: contain) instead of overflowing
779
+ the frame and getting clipped. Mobile = full-bleed modal (100dvh); desktop
780
+ = the centred 88vh column (capped at the 940px modal). */
781
+ .lumen-modal[data-lumen-fs="true"] .lumen-annotate-frame canvas {
782
+ /* Mobile: nearly the full height — the sheet overlaps the lower edge. */
783
+ max-height: calc(
784
+ 100dvh - 154px - env(safe-area-inset-top, 0px) - env(safe-area-inset-bottom, 0px)
785
+ );
786
+ }
787
+ @media (min-width: 640px) {
788
+ .lumen-modal[data-lumen-fs="true"] .lumen-annotate-frame canvas {
789
+ /* Desktop: fit above the sheet (landscape captures, no overlap needed). */
790
+ max-height: min(calc(88vh - 322px), 618px);
791
+ }
792
+ }
793
+ /* floating top chrome: ✕ · method switch · Recapture (replaces the old
794
+ method-switch + cap-actions in the fullscreen capture surface) */
795
+ .lumen-modal[data-lumen-fs="true"] .lumen-cap-actions { display: none; }
796
+ .lumen-fs-top {
797
+ position: absolute;
798
+ top: 0;
799
+ left: 0;
800
+ right: 0;
801
+ z-index: 6;
802
+ display: flex;
803
+ flex-direction: column;
804
+ gap: 10px;
805
+ padding: calc(env(safe-area-inset-top, 0px) + 18px) 12px 14px;
806
+ background: transparent;
807
+ }
808
+ .lumen-fs-toprow { display: flex; align-items: center; gap: 8px; }
809
+ .lumen-fs-row-corners { justify-content: space-between; }
810
+ .lumen-fs-row-pill { justify-content: center; }
811
+ .lumen-fs-pill {
812
+ display: inline-flex;
813
+ align-items: center;
814
+ gap: 2px;
815
+ padding: 4px;
816
+ border-radius: 19px;
817
+ background: rgb(20 20 24 / 0.66);
818
+ backdrop-filter: blur(18px) saturate(150%);
819
+ -webkit-backdrop-filter: blur(18px) saturate(150%);
820
+ }
821
+ .lumen-fs-pill-btn {
822
+ width: 38px;
823
+ height: 30px;
824
+ border: 0;
825
+ background: transparent;
826
+ color: rgb(255 255 255 / 0.6);
827
+ border-radius: 15px;
828
+ display: grid;
829
+ place-items: center;
830
+ cursor: pointer;
831
+ }
832
+ .lumen-fs-pill-btn svg { width: 16px; height: 16px; }
833
+ .lumen-fs-pill-btn[aria-pressed="true"] { background: rgb(255 255 255 / 0.2); color: #fff; }
834
+ .lumen-fs-pill-btn.lumen-fs-pentog[data-on="true"] { background: var(--lumen-accent); color: #fff; }
835
+ .lumen-fs-pill-sep { width: 0.5px; height: 20px; background: rgb(255 255 255 / 0.22); margin: 0 3px; }
836
+ /* annotation colour: single swatch button → popover (declutters the palette) */
837
+ .lumen-fs-color { position: relative; display: inline-flex; align-items: center; }
838
+ .lumen-fs-color-btn {
839
+ width: 24px;
840
+ height: 24px;
841
+ border-radius: 50%;
842
+ border: 2px solid rgb(255 255 255 / 0.55);
843
+ padding: 0;
844
+ cursor: pointer;
845
+ background-clip: padding-box;
846
+ }
847
+ .lumen-fs-color-overlay { position: fixed; inset: 0; z-index: 7; }
848
+ .lumen-fs-color-pop {
849
+ position: absolute;
850
+ bottom: 42px;
851
+ left: 50%;
852
+ transform: translateX(-50%);
853
+ z-index: 8;
854
+ display: flex;
855
+ gap: 9px;
856
+ padding: 9px 11px;
857
+ border-radius: 14px;
858
+ background: rgb(26 26 30 / 0.98);
859
+ backdrop-filter: blur(20px) saturate(160%);
860
+ -webkit-backdrop-filter: blur(20px) saturate(160%);
861
+ border: 0.5px solid rgb(255 255 255 / 0.16);
862
+ box-shadow: 0 16px 40px rgb(0 0 0 / 0.5);
863
+ }
864
+ .lumen-fs-color-pop .lumen-swatch {
865
+ width: 26px;
866
+ height: 26px;
867
+ border-color: rgb(255 255 255 / 0.25);
868
+ }
869
+ .lumen-fs-color-pop .lumen-swatch[aria-pressed="true"] {
870
+ box-shadow: 0 0 0 2px rgb(26 26 30), 0 0 0 4px #fff;
871
+ }
872
+ .lumen-fs-recap { position: relative; }
873
+ .lumen-fs-recap-overlay { position: fixed; inset: 0; z-index: 7; }
874
+ .lumen-fs-recap-menu {
875
+ position: absolute;
876
+ right: 0;
877
+ top: 46px;
878
+ width: 252px;
879
+ z-index: 8;
880
+ padding: 6px;
881
+ border-radius: 14px;
882
+ background: rgb(26 26 30 / 0.98);
883
+ backdrop-filter: blur(20px) saturate(160%);
884
+ -webkit-backdrop-filter: blur(20px) saturate(160%);
885
+ border: 0.5px solid rgb(255 255 255 / 0.16);
886
+ box-shadow: 0 18px 44px rgb(0 0 0 / 0.5);
887
+ }
888
+ .lumen-fs-recap-menu button {
889
+ display: flex;
890
+ align-items: flex-start;
891
+ gap: 11px;
892
+ width: 100%;
893
+ padding: 9px 10px;
894
+ border: 0;
895
+ background: transparent;
896
+ border-radius: 9px;
897
+ cursor: pointer;
898
+ text-align: left;
899
+ }
900
+ .lumen-fs-recap-menu button:active { background: rgb(255 255 255 / 0.08); }
901
+ .lumen-fs-mi-ic {
902
+ width: 30px;
903
+ height: 30px;
904
+ flex: none;
905
+ border-radius: 8px;
906
+ background: rgb(255 255 255 / 0.1);
907
+ color: #fff;
908
+ display: grid;
909
+ place-items: center;
910
+ }
911
+ .lumen-fs-mi-ic svg { width: 16px; height: 16px; }
912
+ .lumen-fs-recap-menu b {
913
+ display: block;
914
+ font: 600 13px/1.2 var(--lumen-font-ui);
915
+ color: #fff;
916
+ }
917
+ .lumen-fs-recap-menu small {
918
+ display: block;
919
+ font: 400 11px/1.3 var(--lumen-font-ui);
920
+ color: rgb(255 255 255 / 0.55);
921
+ margin-top: 2px;
922
+ }
923
+ .lumen-fs-chip {
924
+ height: 38px;
925
+ padding: 0 14px;
926
+ border: 0;
927
+ border-radius: 19px;
928
+ background: rgb(20 20 24 / 0.66);
929
+ color: #fff;
930
+ backdrop-filter: blur(18px) saturate(150%);
931
+ -webkit-backdrop-filter: blur(18px) saturate(150%);
932
+ display: inline-flex;
933
+ align-items: center;
934
+ gap: 6px;
935
+ font: 600 14px/1 var(--lumen-font-ui);
936
+ cursor: pointer;
937
+ }
938
+ .lumen-fs-chip svg { width: 15px; height: 15px; }
939
+ .lumen-fs-x { width: 38px; padding: 0; justify-content: center; font-size: 15px; }
940
+ .lumen-fs-mswitch {
941
+ display: inline-flex;
942
+ gap: 2px;
943
+ padding: 4px;
944
+ border-radius: 19px;
945
+ background: rgb(20 20 24 / 0.66);
946
+ backdrop-filter: blur(18px) saturate(150%);
947
+ -webkit-backdrop-filter: blur(18px) saturate(150%);
948
+ }
949
+ .lumen-fs-mswitch button {
950
+ width: 38px;
951
+ height: 30px;
952
+ border: 0;
953
+ background: transparent;
954
+ color: rgb(255 255 255 / 0.6);
955
+ border-radius: 15px;
956
+ display: grid;
957
+ place-items: center;
958
+ cursor: pointer;
959
+ }
960
+ .lumen-fs-mswitch button[aria-pressed="true"] { background: rgb(255 255 255 / 0.2); color: #fff; }
961
+ .lumen-fs-mswitch svg { width: 16px; height: 16px; }
962
+ /* floating glass tool palette */
963
+ .lumen-modal[data-lumen-fs="true"] .lumen-toolbar {
964
+ position: absolute;
965
+ left: 50%;
966
+ bottom: 168px;
967
+ transform: translateX(-50%);
968
+ z-index: 7;
969
+ margin: 0;
970
+ width: auto;
971
+ max-width: calc(100% - 20px);
972
+ justify-content: center;
973
+ flex-wrap: nowrap;
974
+ gap: 6px;
975
+ padding: 7px 9px;
976
+ background: rgb(20 20 24 / 0.82);
977
+ backdrop-filter: blur(22px) saturate(160%);
978
+ -webkit-backdrop-filter: blur(22px) saturate(160%);
979
+ border: 0;
980
+ box-shadow: 0 12px 32px rgb(0 0 0 / 0.45);
981
+ }
982
+ /* one-row palette: 4 colors, tight groups */
983
+ .lumen-modal[data-lumen-fs="true"] .lumen-swatch:nth-child(n+5) { display: none; }
984
+ .lumen-modal[data-lumen-fs="true"] .lumen-swatches { gap: 5px; }
985
+ .lumen-modal[data-lumen-fs="true"] .lumen-segmented { gap: 1px; padding: 0; background: transparent; }
986
+ .lumen-modal[data-lumen-fs="true"] .lumen-segmented,
987
+ .lumen-modal[data-lumen-fs="true"] .lumen-stroke-sizes { background: rgb(255 255 255 / 0.1); border: 0; }
988
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool { color: rgb(255 255 255 / 0.7); padding: 7px; }
989
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool svg { width: 18px; height: 18px; display: block; }
990
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool[disabled] { opacity: 0.4; }
991
+ /* top-left group: ✕ + pen-toggle (show/hide tools) */
992
+ .lumen-fs-topl { display: flex; align-items: center; gap: 8px; }
993
+ .lumen-fs-pentog { width: 38px; padding: 0; justify-content: center; }
994
+ .lumen-fs-pentog[data-on="true"] { background: var(--lumen-accent); color: #fff; }
995
+ .lumen-fs-pentog svg { width: 17px; height: 17px; }
996
+ /* bottom compose: description + voice + Next (replaces the footer in fullscreen) */
997
+ .lumen-fs-compose {
998
+ position: absolute;
999
+ left: 0;
1000
+ right: 0;
1001
+ bottom: 0;
1002
+ z-index: 6;
1003
+ background: var(--lumen-bg);
1004
+ border-radius: var(--lumen-r-lg) var(--lumen-r-lg) 0 0;
1005
+ box-shadow: 0 -0.5px 0 var(--lumen-border), 0 -16px 40px rgb(0 0 0 / 0.4);
1006
+ padding: 12px 16px calc(16px + var(--lumen-keyboard-inset, 0px));
1007
+ display: flex;
1008
+ flex-direction: column;
1009
+ gap: 10px;
1010
+ }
1011
+ .lumen-fs-desc { width: 100%; }
1012
+ .lumen-fs-next { height: 48px; }
1013
+ .lumen-fs-compose .lumen-voice-capture { margin: 0; padding: 0; }
1014
+ /* grabber to minimize the sheet */
1015
+ .lumen-fs-grab {
1016
+ display: block;
1017
+ width: 100%;
1018
+ height: 16px;
1019
+ padding: 0;
1020
+ border: 0;
1021
+ background: transparent;
1022
+ cursor: pointer;
1023
+ position: relative;
1024
+ flex: none;
1025
+ margin-top: -4px;
1026
+ }
1027
+ .lumen-fs-grab::before {
1028
+ content: "";
1029
+ position: absolute;
1030
+ top: 4px;
1031
+ left: 50%;
1032
+ transform: translateX(-50%);
1033
+ width: 36px;
1034
+ height: 5px;
1035
+ border-radius: 3px;
1036
+ background: var(--lumen-border-strong);
1037
+ }
1038
+ /* compact voice: mic lives in the field; hide the big idle button + hint */
1039
+ .lumen-fs-field { position: relative; }
1040
+ .lumen-fs-field .lumen-fs-desc { padding-right: 46px; }
1041
+ .lumen-fs-mic {
1042
+ position: absolute;
1043
+ right: 6px;
1044
+ top: 50%;
1045
+ transform: translateY(-50%);
1046
+ width: 34px;
1047
+ height: 34px;
1048
+ border: 0;
1049
+ border-radius: 50%;
1050
+ display: grid;
1051
+ place-items: center;
1052
+ color: var(--lumen-accent);
1053
+ background: color-mix(in srgb, var(--lumen-accent) 14%, transparent);
1054
+ cursor: pointer;
1055
+ }
1056
+ .lumen-fs-mic svg { width: 17px; height: 17px; }
1057
+ .lumen-fs-compose .lumen-voice-capture-btn,
1058
+ .lumen-fs-compose .lumen-voice-capture-hint { display: none; }
1059
+ /* collapse the sheet down to reveal the full capture */
1060
+ .lumen-fs-compose { transition: transform 0.32s var(--lumen-ease); }
1061
+ .lumen-modal[data-lumen-sheet="down"] .lumen-fs-compose {
1062
+ transform: translateY(calc(100% - 26px));
1063
+ }
1064
+ /* Minimizing the sheet must NOT hide the tool palette — only the pen-toggle
1065
+ (toolsHidden) controls that. */
1066
+ .lumen-modal[data-lumen-fs="true"] .lumen-tool[aria-pressed="true"] {
1067
+ background: var(--lumen-accent);
1068
+ color: #fff;
1069
+ box-shadow: none;
1070
+ }
1071
+ .lumen-modal[data-lumen-fs="true"] .lumen-toolbar .lumen-btn-ghost { color: rgb(255 255 255 / 0.85); }
1072
+ .lumen-modal[data-lumen-fs="true"] .lumen-toolbar-sep { background: rgb(255 255 255 / 0.2); }
1073
+ .lumen-modal[data-lumen-fs="true"] .lumen-stroke-size-dot { background: #fff; }
1074
+ /* footer = bottom action bar over the screen */
1075
+ .lumen-modal[data-lumen-fs="true"] .lumen-modal-footer {
1076
+ position: absolute;
1077
+ left: 0;
1078
+ right: 0;
1079
+ bottom: 0;
1080
+ z-index: 5;
1081
+ }
1082
+
1083
+ /* ─── Review & send detent (step 2) — a taller sheet that rises over the
1084
+ dimmed, annotated capture; editable priority/platform/description → Send ── */
1085
+ .lumen-rv-pane { position: absolute; inset: 0; overflow: hidden; pointer-events: none; }
1086
+ .lumen-rv-pane > .lumen-rv { pointer-events: auto; }
1087
+ /* On the review step the shared AnnotationLayer is still mounted behind the
1088
+ panel — anchor it to the top so it peeks above the sheet, and freeze it
1089
+ (no accidental drawing while reviewing). */
1090
+ .lumen-modal[data-lumen-review="true"] .lumen-annotate {
1091
+ padding: calc(env(safe-area-inset-top, 0px) + 22px) 14px 0;
1092
+ align-items: start;
1093
+ pointer-events: none;
1094
+ }
1095
+ .lumen-rv-scrim { position: absolute; inset: 0; background: rgb(8 10 18 / 0.5); }
1096
+ .lumen-rv {
1097
+ position: absolute;
1098
+ left: 0;
1099
+ right: 0;
1100
+ bottom: 0;
1101
+ z-index: 6;
1102
+ max-height: 80%;
1103
+ display: flex;
1104
+ flex-direction: column;
1105
+ background: var(--lumen-bg);
1106
+ border-radius: var(--lumen-r-lg) var(--lumen-r-lg) 0 0;
1107
+ box-shadow: 0 -0.5px 0 var(--lumen-border), 0 -16px 50px rgb(0 0 0 / 0.45);
1108
+ padding: 4px 16px calc(16px + var(--lumen-keyboard-inset, 0px));
1109
+ animation: lumen-rv-rise 0.34s var(--lumen-ease);
1110
+ }
1111
+ @keyframes lumen-rv-rise {
1112
+ from { transform: translateY(18px); opacity: 0; }
1113
+ to { transform: translateY(0); opacity: 1; }
1114
+ }
1115
+ .lumen-rv-head {
1116
+ flex: none;
1117
+ display: flex;
1118
+ align-items: center;
1119
+ justify-content: space-between;
1120
+ height: 46px;
1121
+ }
1122
+ .lumen-rv-back {
1123
+ display: inline-flex;
1124
+ align-items: center;
1125
+ gap: 1px;
1126
+ border: 0;
1127
+ background: transparent;
1128
+ cursor: pointer;
1129
+ color: var(--lumen-accent);
1130
+ font: 600 14px/1 var(--lumen-font-ui);
1131
+ padding: 6px 4px 6px 0;
1132
+ }
1133
+ .lumen-rv-back svg { width: 18px; height: 18px; }
1134
+ .lumen-rv-title { font: 600 15px/1 var(--lumen-font-ui); color: var(--lumen-fg); }
1135
+ .lumen-rv-spacer { width: 52px; }
1136
+ .lumen-rv-rows {
1137
+ flex: 1;
1138
+ min-height: 0;
1139
+ overflow-y: auto;
1140
+ -webkit-overflow-scrolling: touch;
1141
+ }
1142
+ .lumen-rv-set {
1143
+ display: flex;
1144
+ flex-direction: column;
1145
+ gap: 9px;
1146
+ padding: 12px 0;
1147
+ border-top: 0.5px solid var(--lumen-border);
1148
+ }
1149
+ .lumen-rv-set:first-child { border-top: 0; padding-top: 4px; }
1150
+ .lumen-rv-k {
1151
+ color: var(--lumen-fg-muted);
1152
+ font: 600 12.5px/1.3 var(--lumen-font-ui);
1153
+ }
1154
+ .lumen-rv-muted { color: var(--lumen-fg-muted); font-weight: 400; }
1155
+ .lumen-rv-desc {
1156
+ width: 100%;
1157
+ min-height: 52px;
1158
+ resize: none;
1159
+ font: 400 15px/1.4 var(--lumen-font-ui);
1160
+ }
1161
+ .lumen-rv-chips, .lumen-rv-prio { display: flex; gap: 7px; flex-wrap: wrap; }
1162
+ .lumen-rv-chip,
1163
+ .lumen-rv-prio-opt {
1164
+ display: inline-flex;
1165
+ align-items: center;
1166
+ gap: 7px;
1167
+ height: 34px;
1168
+ padding: 0 13px;
1169
+ border-radius: 9px;
1170
+ border: 1px solid var(--lumen-border);
1171
+ background: transparent;
1172
+ color: var(--lumen-fg);
1173
+ font: 600 13px/1 var(--lumen-font-ui);
1174
+ cursor: pointer;
1175
+ }
1176
+ .lumen-rv-chip[aria-pressed="true"],
1177
+ .lumen-rv-prio-opt[aria-pressed="true"] {
1178
+ border-color: var(--lumen-accent);
1179
+ background: color-mix(in srgb, var(--lumen-accent) 10%, transparent);
1180
+ color: var(--lumen-accent);
1181
+ }
1182
+ /* Linear-style priority glyphs */
1183
+ .lumen-pri-ic {
1184
+ display: inline-flex;
1185
+ align-items: flex-end;
1186
+ gap: 2px;
1187
+ height: 12px;
1188
+ color: var(--lumen-fg-muted);
1189
+ }
1190
+ .lumen-rv-prio-opt[aria-pressed="true"] .lumen-pri-ic { color: var(--lumen-accent); }
1191
+ .lumen-pri-bars i { width: 3px; border-radius: 1px; background: currentColor; opacity: 0.3; }
1192
+ .lumen-pri-bars i:nth-child(1) { height: 5px; }
1193
+ .lumen-pri-bars i:nth-child(2) { height: 8px; }
1194
+ .lumen-pri-bars i:nth-child(3) { height: 12px; }
1195
+ .lumen-pri-bars[data-level="1"] i:nth-child(1),
1196
+ .lumen-pri-bars[data-level="2"] i:nth-child(1),
1197
+ .lumen-pri-bars[data-level="2"] i:nth-child(2),
1198
+ .lumen-pri-bars[data-level="3"] i { opacity: 1; }
1199
+ .lumen-pri-urgent {
1200
+ width: 14px;
1201
+ height: 14px;
1202
+ border-radius: 4px;
1203
+ background: #f2994a;
1204
+ color: #fff;
1205
+ align-items: center;
1206
+ justify-content: center;
1207
+ font: 800 10px/1 var(--lumen-font-ui);
1208
+ }
1209
+ .lumen-rv-row {
1210
+ display: flex;
1211
+ align-items: center;
1212
+ justify-content: space-between;
1213
+ gap: 12px;
1214
+ padding: 11px 0;
1215
+ border-top: 0.5px solid var(--lumen-border);
1216
+ font: 400 13px/1.3 var(--lumen-font-ui);
1217
+ }
1218
+ .lumen-rv-rk { color: var(--lumen-fg-muted); font-weight: 600; }
1219
+ .lumen-rv-rv {
1220
+ color: var(--lumen-fg);
1221
+ display: inline-flex;
1222
+ align-items: center;
1223
+ gap: 8px;
1224
+ }
1225
+ .lumen-rv-rows .lumen-label { padding: 12px 0 0; border-top: 0.5px solid var(--lumen-border); }
1226
+ /* voice control reads as a neat bordered pill in the review (no oversized icon
1227
+ / no text wrap) — matching the dashed "Attach a video" affordance */
1228
+ .lumen-rv-rows .lumen-audio-row .lumen-btn-ghost {
1229
+ display: inline-flex;
1230
+ align-items: center;
1231
+ gap: 7px;
1232
+ white-space: nowrap;
1233
+ height: 36px;
1234
+ padding: 0 14px;
1235
+ border: 1px solid var(--lumen-border);
1236
+ border-radius: 10px;
1237
+ }
1238
+ .lumen-rv-rows .lumen-audio-row .lumen-btn-ghost svg { width: 17px; height: 17px; flex: none; }
1239
+ .lumen-rv-attachrow { padding: 12px 0 2px; }
1240
+ .lumen-rv-attach {
1241
+ display: inline-flex;
1242
+ align-items: center;
1243
+ gap: 7px;
1244
+ height: 36px;
1245
+ padding: 0 13px;
1246
+ border-radius: 10px;
1247
+ border: 1px dashed color-mix(in srgb, var(--lumen-fg) 28%, transparent);
1248
+ background: transparent;
1249
+ color: var(--lumen-fg-muted);
1250
+ font: 600 13px/1 var(--lumen-font-ui);
1251
+ cursor: pointer;
1252
+ }
1253
+ .lumen-rv-attach svg { width: 15px; height: 15px; }
1254
+ .lumen-rv-attach input { display: none; }
1255
+ .lumen-rv-send {
1256
+ flex: none;
1257
+ height: 50px;
1258
+ margin-top: 12px;
1259
+ display: inline-flex;
1260
+ align-items: center;
1261
+ justify-content: center;
1262
+ gap: 9px;
1263
+ }
1264
+ .lumen-rv-send svg { width: 18px; height: 18px; }
1265
+
690
1266
  /* ─── Comment / speech-bubble annotations (inline-editable, Figma-style) ── */
691
1267
  .lumen-bubble-layer {
692
1268
  position: absolute;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumen-stack/react",
3
- "version": "0.12.5",
3
+ "version": "0.14.0",
4
4
  "description": "React SDK for Lumen — screenshot capture, annotation, and feedback widget.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -39,7 +39,7 @@
39
39
  "react-dom": ">=18"
40
40
  },
41
41
  "dependencies": {
42
- "@lumen-stack/core": "^0.13.2",
42
+ "@lumen-stack/core": "^0.14.0",
43
43
  "html2canvas-pro": "^1.5.8",
44
44
  "sonner": "^1.7.1"
45
45
  },