@floegence/floe-webapp-core 0.53.3 → 0.54.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.
Files changed (32) hide show
  1. package/dist/components/ui/InfiniteCanvas.js +111 -100
  2. package/dist/components/ui/SurfaceAnchoredLayer.d.ts +10 -0
  3. package/dist/components/ui/SurfaceAnchoredLayer.js +89 -0
  4. package/dist/components/ui/index.d.ts +1 -0
  5. package/dist/components/workbench/WorkbenchCanvas.d.ts +1 -1
  6. package/dist/components/workbench/WorkbenchCanvas.js +26 -24
  7. package/dist/components/workbench/WorkbenchCanvasField.d.ts +1 -1
  8. package/dist/components/workbench/WorkbenchCanvasField.js +46 -42
  9. package/dist/components/workbench/WorkbenchLayerObjects.d.ts +9 -1
  10. package/dist/components/workbench/WorkbenchLayerObjects.js +896 -707
  11. package/dist/components/workbench/WorkbenchSurface.d.ts +2 -0
  12. package/dist/components/workbench/WorkbenchSurface.js +442 -420
  13. package/dist/components/workbench/index.d.ts +1 -0
  14. package/dist/components/workbench/types.d.ts +6 -3
  15. package/dist/components/workbench/useWorkbenchModel.js +53 -53
  16. package/dist/components/workbench/workbenchCompositionMessages.d.ts +62 -0
  17. package/dist/components/workbench/workbenchCompositionMessages.js +67 -0
  18. package/dist/components/workbench/workbenchHelpers.js +19 -6
  19. package/dist/components/workbench/workbenchOptions.d.ts +4 -4
  20. package/dist/components/workbench/workbenchOptions.js +18 -16
  21. package/dist/full.js +182 -180
  22. package/dist/input-focus.css +39 -5
  23. package/dist/styles/themes/presets.js +5 -5
  24. package/dist/styles.css +1 -1
  25. package/dist/surface.css +16 -3
  26. package/dist/themes/shell-presets.generated.css +6 -6
  27. package/dist/ui.css +4 -23
  28. package/dist/ui.js +86 -84
  29. package/dist/workbench-themes.css +60 -0
  30. package/dist/workbench.css +332 -524
  31. package/dist/workbench.js +24 -22
  32. package/package.json +1 -1
@@ -224,11 +224,15 @@
224
224
  height: 2600px;
225
225
  }
226
226
 
227
+ .workbench-canvas__infinite {
228
+ overflow: clip;
229
+ }
230
+
227
231
  .workbench-canvas__projected-layer {
228
232
  position: absolute;
229
233
  inset: 0;
230
234
  pointer-events: none;
231
- overflow: hidden;
235
+ overflow: clip;
232
236
  z-index: 13;
233
237
  isolation: isolate;
234
238
  }
@@ -338,10 +342,7 @@
338
342
 
339
343
  .workbench-canvas__projected-layer.is-work-layer-locked
340
344
  .workbench-canvas__projected-work-layer
341
- > .workbench-widget,
342
- .workbench-canvas__projected-layer.is-work-layer-locked
343
- .workbench-canvas__projected-work-layer
344
- > .workbench-sticky {
345
+ > .workbench-widget {
345
346
  pointer-events: none;
346
347
  }
347
348
 
@@ -428,6 +429,9 @@
428
429
  .workbench-canvas__field.is-work-layer-muted .workbench-work-layer {
429
430
  pointer-events: none;
430
431
  }
432
+ .workbench-canvas__field.is-work-layer-muted .workbench-sticky {
433
+ pointer-events: auto;
434
+ }
431
435
 
432
436
  /* ------------------------------------------------------------------ */
433
437
  /* Workbench freeform layers */
@@ -446,57 +450,97 @@
446
450
  will-change: transform;
447
451
  }
448
452
 
453
+ :is(
454
+ .workbench-background-region,
455
+ .workbench-layer-swatch--region,
456
+ .workbench-region-material__sample
457
+ ) {
458
+ --workbench-region-face: oklch(from var(--workbench-region-fill) 0.84 0.065 h);
459
+ --workbench-region-edge: oklch(from var(--workbench-region-fill) 0.7 0.032 h);
460
+ --workbench-region-outline: oklch(from var(--workbench-region-fill) 0.56 0.065 h);
461
+ --workbench-region-surface: color-mix(
462
+ in oklab,
463
+ var(--workbench-region-face) var(--workbench-region-strength, 100%),
464
+ var(--wb-canvas, var(--background))
465
+ );
466
+ --workbench-region-ink: color-mix(
467
+ in oklab,
468
+ var(--workbench-region-outline) 20%,
469
+ var(--workbench-region-surface)
470
+ );
471
+ border: 1px solid var(--workbench-region-edge);
472
+ border-radius: 12px;
473
+ background: var(--workbench-region-surface);
474
+ }
475
+ .dark
476
+ :is(
477
+ .workbench-background-region,
478
+ .workbench-layer-swatch--region,
479
+ .workbench-region-material__sample
480
+ ) {
481
+ --workbench-region-face: oklch(from var(--workbench-region-fill) 0.32 0.045 h);
482
+ --workbench-region-edge: oklch(from var(--workbench-region-fill) 0.405 0.025 h);
483
+ --workbench-region-outline: oklch(from var(--workbench-region-fill) 0.58 0.055 h);
484
+ }
449
485
  .workbench-background-region {
450
- border-radius: 0;
451
- background-color: var(--workbench-region-surface, var(--workbench-region-fill));
452
- opacity: 1;
453
- border: none;
454
- box-shadow: none;
455
486
  pointer-events: none;
456
487
  }
457
-
458
488
  .workbench-background-region.is-transforming {
459
489
  will-change: transform;
460
490
  }
461
-
462
491
  .workbench-background-region.is-editable {
463
492
  pointer-events: auto;
464
- cursor: move;
493
+ cursor: grab;
465
494
  }
466
-
467
- .workbench-background-region.is-material-dotted {
468
- background-image: radial-gradient(
469
- circle,
470
- var(--workbench-region-ink) 1.45px,
471
- transparent 1.65px
495
+ :is(
496
+ .workbench-background-region,
497
+ .workbench-layer-swatch--region,
498
+ .workbench-region-material__sample
499
+ ).is-material-frame {
500
+ background: transparent;
501
+ border: 2px dashed var(--workbench-region-outline);
502
+ }
503
+ :is(
504
+ .workbench-background-region,
505
+ .workbench-layer-swatch--region,
506
+ .workbench-region-material__sample
507
+ ).is-material-hatched {
508
+ background-image: repeating-linear-gradient(
509
+ 135deg,
510
+ transparent 0 9px,
511
+ var(--workbench-region-ink) 9px 10px
472
512
  );
473
- background-position: 0 0;
474
- background-size: 11px 11px;
475
513
  }
476
-
477
- .workbench-background-region.is-material-grid {
514
+ :is(
515
+ .workbench-background-region,
516
+ .workbench-layer-swatch--region,
517
+ .workbench-region-material__sample
518
+ ).is-material-dotted {
519
+ background-image: radial-gradient(var(--workbench-region-ink) 1px, transparent 1px);
520
+ background-size: 10px 10px;
521
+ }
522
+ :is(
523
+ .workbench-background-region,
524
+ .workbench-layer-swatch--region,
525
+ .workbench-region-material__sample
526
+ ).is-material-grid {
478
527
  background-image:
479
528
  linear-gradient(var(--workbench-region-ink) 1px, transparent 1px),
480
529
  linear-gradient(90deg, var(--workbench-region-ink) 1px, transparent 1px);
481
- background-size:
482
- 28px 28px,
483
- 28px 28px;
484
- }
485
-
486
- .workbench-background-region.is-material-hatched {
487
- background-image: repeating-linear-gradient(
530
+ background-size: 24px 24px;
531
+ }
532
+ :is(
533
+ .workbench-background-region,
534
+ .workbench-layer-swatch--region,
535
+ .workbench-region-material__sample
536
+ ).is-material-glass {
537
+ background-image: linear-gradient(
488
538
  135deg,
489
- var(--workbench-region-ink) 0 1.2px,
490
- transparent 1.2px 9px
539
+ color-mix(in srgb, white 10%, transparent),
540
+ transparent 60%
491
541
  );
492
542
  }
493
543
 
494
- .workbench-background-region.is-material-glass {
495
- background:
496
- linear-gradient(135deg, var(--workbench-region-highlight), transparent 58%),
497
- var(--workbench-region-surface, var(--workbench-region-fill));
498
- }
499
-
500
544
  .workbench-background-region__toolbar,
501
545
  .workbench-text-annotation__toolbar {
502
546
  position: absolute;
@@ -522,23 +566,30 @@
522
566
  }
523
567
 
524
568
  .workbench-background-region__label {
569
+ --ring: var(--wb-window-active, var(--foreground));
525
570
  position: absolute;
526
- left: 12px;
571
+ left: 10px;
527
572
  top: 10px;
528
- display: inline-flex;
529
- align-items: center;
530
- gap: 6px;
531
- max-width: calc(100% - 24px);
532
- padding: 4px 7px;
533
- border-radius: 6px;
534
- background: color-mix(in srgb, white 56%, transparent);
535
- color: color-mix(in srgb, var(--foreground, #111) 74%, var(--workbench-region-fill));
536
- font-size: 11px;
537
- font-weight: 700;
538
- overflow: hidden;
539
- white-space: nowrap;
540
- text-overflow: ellipsis;
541
- pointer-events: none;
573
+ max-width: calc(100% - 20px);
574
+ min-width: 100px;
575
+ border: 1px solid transparent;
576
+ border-radius: 5px;
577
+ padding: 4px 6px;
578
+ color: var(--foreground);
579
+ background: var(--wb-canvas, var(--background));
580
+ font-size: 13px;
581
+ font-weight: 550;
582
+ cursor: text;
583
+ }
584
+ .workbench-background-region__label.is-empty {
585
+ display: none;
586
+ }
587
+ .workbench-background-region__label [contenteditable] {
588
+ white-space: pre-wrap;
589
+ overflow-wrap: anywhere;
590
+ min-height: 20px;
591
+ user-select: text;
592
+ cursor: text;
542
593
  }
543
594
 
544
595
  .workbench-layer-mini-button,
@@ -548,12 +599,12 @@
548
599
  justify-content: center;
549
600
  flex-shrink: 0;
550
601
  border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
551
- background: color-mix(in srgb, var(--card, #fff) 88%, transparent);
552
602
  color: var(--foreground, #111);
553
603
  cursor: pointer;
554
604
  }
555
605
 
556
606
  .workbench-layer-mini-button {
607
+ background: var(--card);
557
608
  height: 26px;
558
609
  min-width: 26px;
559
610
  padding: 0 8px;
@@ -798,93 +849,38 @@
798
849
  }
799
850
 
800
851
  .workbench-layer-swatch.is-active {
801
- outline: 2px solid color-mix(in srgb, var(--primary, #3b82f6) 64%, transparent);
852
+ outline: 1px solid var(--wb-window-active, var(--foreground));
802
853
  outline-offset: 2px;
803
854
  }
804
855
 
805
856
  .workbench-region-material-group {
806
- display: inline-flex;
807
- align-items: center;
808
- gap: 2px;
809
- height: 26px;
810
- padding: 2px;
811
- border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
812
- border-radius: 8px;
813
- background: color-mix(in srgb, var(--card, #fff) 84%, transparent);
857
+ display: flex;
858
+ flex-wrap: wrap;
859
+ gap: 3px;
860
+ border-left: 1px solid var(--border);
861
+ padding-left: 5px;
814
862
  }
815
-
816
863
  .workbench-region-material {
817
- display: inline-flex;
818
- align-items: center;
819
- justify-content: center;
820
- width: 22px;
821
- height: 20px;
822
- padding: 0;
864
+ display: grid;
865
+ justify-items: center;
866
+ gap: 3px;
867
+ padding: 4px;
823
868
  border: 1px solid transparent;
824
869
  border-radius: 6px;
825
870
  background: transparent;
871
+ color: var(--foreground);
872
+ font-size: 10px;
826
873
  cursor: pointer;
827
874
  }
828
-
829
- .workbench-region-material:hover,
830
875
  .workbench-region-material.is-active {
831
- border-color: color-mix(in srgb, var(--primary, #3b82f6) 50%, transparent);
832
- background: color-mix(in srgb, var(--primary, #3b82f6) 9%, transparent);
876
+ border-color: var(--wb-window-active, var(--foreground));
877
+ background: var(--accent);
833
878
  }
834
-
835
879
  .workbench-region-material__sample {
836
- width: 14px;
837
- height: 14px;
880
+ display: block;
881
+ width: 40px;
882
+ height: 28px;
838
883
  border-radius: 4px;
839
- border: 1px solid color-mix(in srgb, var(--workbench-region-ink) 34%, transparent);
840
- background: var(--workbench-region-fill);
841
- }
842
-
843
- .workbench-region-material.is-dotted .workbench-region-material__sample {
844
- background:
845
- radial-gradient(
846
- circle,
847
- color-mix(in srgb, var(--workbench-region-ink) 72%, transparent) 1px,
848
- transparent 1.12px
849
- ),
850
- var(--workbench-region-fill);
851
- background-size:
852
- 5px 5px,
853
- auto;
854
- }
855
-
856
- .workbench-region-material.is-grid .workbench-region-material__sample {
857
- background:
858
- linear-gradient(
859
- color-mix(in srgb, var(--workbench-region-ink) 64%, transparent) 1px,
860
- transparent 1px
861
- ),
862
- linear-gradient(
863
- 90deg,
864
- color-mix(in srgb, var(--workbench-region-ink) 64%, transparent) 1px,
865
- transparent 1px
866
- ),
867
- var(--workbench-region-fill);
868
- background-size:
869
- 6px 6px,
870
- 6px 6px,
871
- auto;
872
- }
873
-
874
- .workbench-region-material.is-hatched .workbench-region-material__sample {
875
- background:
876
- repeating-linear-gradient(
877
- 135deg,
878
- color-mix(in srgb, var(--workbench-region-ink) 66%, transparent) 0 1px,
879
- transparent 1px 5px
880
- ),
881
- var(--workbench-region-fill);
882
- }
883
-
884
- .workbench-region-material.is-glass .workbench-region-material__sample {
885
- background:
886
- linear-gradient(135deg, color-mix(in srgb, white 65%, transparent), transparent 60%),
887
- color-mix(in srgb, var(--primary, #3b82f6) 12%, transparent);
888
884
  }
889
885
 
890
886
  .workbench-layer-resize {
@@ -926,47 +922,23 @@
926
922
 
927
923
  .workbench-region-visibility-outline {
928
924
  position: absolute;
929
- top: 0;
930
- left: 0;
925
+ inset: 0 auto auto 0;
931
926
  box-sizing: border-box;
932
927
  pointer-events: none;
933
928
  transform-origin: 0 0;
934
- z-index: 1;
935
- border: calc(1.75px * var(--workbench-region-outline-scale, 1)) dashed
936
- color-mix(in srgb, var(--workbench-region-ink) 86%, var(--foreground, #111) 14%);
937
- box-shadow:
938
- 0 0 0 calc(1px * var(--workbench-region-outline-scale, 1))
939
- color-mix(in srgb, var(--background, #fff) 82%, transparent),
940
- 0 0 0 calc(3px * var(--workbench-region-outline-scale, 1))
941
- color-mix(in srgb, var(--workbench-region-ink) 30%, transparent),
942
- 0 10px calc(22px * var(--workbench-region-outline-scale, 1))
943
- color-mix(in srgb, var(--foreground, #000) 12%, transparent);
944
- }
945
-
946
- .workbench-region-visibility-outline.is-selected-region {
947
- z-index: 2;
948
- border-color: color-mix(in srgb, var(--workbench-region-ink) 52%, transparent);
949
- box-shadow: 0 0 0 calc(1px * var(--workbench-region-outline-scale, 1))
950
- color-mix(in srgb, var(--background, #fff) 64%, transparent);
929
+ border: 1px dashed var(--workbench-region-edge, var(--border));
930
+ border-radius: 12px;
951
931
  }
952
-
953
932
  .workbench-layer-control__selection {
954
933
  position: absolute;
955
934
  inset: 0;
956
935
  pointer-events: none;
936
+ border: 1px solid var(--wb-window-active, var(--foreground));
937
+ border-radius: 12px;
957
938
  }
958
-
959
- .workbench-layer-control__selection.is-region {
960
- outline: 2px solid color-mix(in srgb, var(--primary, #3b82f6) 78%, white 8%);
961
- outline-offset: 4px;
962
- box-shadow:
963
- 0 0 0 1px color-mix(in srgb, var(--background, #fff) 72%, transparent),
964
- 0 0 0 6px color-mix(in srgb, var(--primary, #3b82f6) 10%, transparent);
965
- }
966
-
967
939
  .workbench-layer-control__selection.is-text {
968
- outline: 1.5px dashed color-mix(in srgb, var(--primary, #3b82f6) 72%, transparent);
969
- outline-offset: 8px;
940
+ border-style: dashed;
941
+ border-radius: 4px;
970
942
  }
971
943
 
972
944
  .workbench-layer-control .workbench-background-region__toolbar,
@@ -976,97 +948,42 @@
976
948
  }
977
949
 
978
950
  .workbench-text-annotation {
979
- color: var(--workbench-text-color);
951
+ --ring: var(--wb-window-active, var(--border));
952
+ color: var(--workbench-text-ink);
980
953
  pointer-events: none;
981
- cursor: default;
982
- border: 0 !important;
983
- outline: 0 !important;
984
- box-shadow: none !important;
954
+ border: 1px solid transparent;
985
955
  background: transparent;
986
956
  }
987
-
988
957
  .workbench-text-annotation.is-editable {
989
958
  pointer-events: auto;
990
959
  }
991
-
992
- .workbench-text-annotation:focus,
993
- .workbench-text-annotation:focus-visible,
994
- .workbench-text-annotation:focus-within,
995
- .workbench-text-annotation.is-selected,
996
- .workbench-text-annotation.is-selected:focus-within {
997
- border: 0 !important;
998
- outline: 0 !important;
999
- box-shadow: none !important;
1000
- background: transparent;
1001
- }
1002
-
1003
960
  .workbench-layer-move-handle {
1004
- cursor: move;
1005
- }
1006
-
1007
- .workbench-layer-move-handle:active {
1008
- cursor: grabbing;
961
+ cursor: grab;
1009
962
  }
1010
-
1011
963
  .workbench-text-annotation__content {
1012
964
  display: block;
1013
965
  box-sizing: border-box;
1014
966
  width: calc(100% * var(--workbench-text-content-inverse-scale, 1));
1015
967
  height: calc(100% * var(--workbench-text-content-inverse-scale, 1));
1016
- padding: 0;
1017
- border: 0 !important;
1018
- border-radius: 0;
1019
- background: transparent;
1020
- box-shadow: none !important;
1021
968
  font-family: var(--workbench-text-family);
1022
969
  font-size: var(--workbench-text-size);
1023
970
  font-weight: var(--workbench-text-weight);
1024
- line-height: 1.12;
971
+ line-height: 1.3;
1025
972
  text-align: var(--workbench-text-align);
1026
973
  overflow: auto;
1027
974
  white-space: pre-wrap;
1028
- word-break: break-word;
1029
- text-shadow: 0 1px 0 color-mix(in srgb, var(--background, #fff) 64%, transparent);
975
+ overflow-wrap: anywhere;
1030
976
  cursor: text;
1031
- outline: 0 !important;
1032
- color: var(--workbench-text-color);
1033
- -webkit-user-select: text;
977
+ color: var(--workbench-text-ink);
1034
978
  user-select: text;
1035
- caret-color: var(--workbench-text-color);
1036
979
  transform: scale(var(--workbench-text-content-scale, 1));
1037
980
  transform-origin: 0 0;
1038
981
  }
1039
-
1040
- .floe-infinite-canvas .workbench-text-annotation__content,
1041
- .workbench-text-annotation__content:focus,
1042
- .workbench-text-annotation__content:focus-visible,
1043
- .workbench-text-annotation__content:active {
1044
- display: block;
1045
- box-sizing: border-box;
1046
- width: calc(100% * var(--workbench-text-content-inverse-scale, 1));
1047
- height: calc(100% * var(--workbench-text-content-inverse-scale, 1));
1048
- padding: 0;
1049
- border: 0 !important;
1050
- border-radius: 0;
1051
- outline: 0 !important;
1052
- box-shadow: none !important;
1053
- background: transparent;
1054
- font-family: var(--workbench-text-family);
1055
- font-size: var(--workbench-text-size);
1056
- font-weight: var(--workbench-text-weight);
1057
- line-height: 1.12;
1058
- text-align: var(--workbench-text-align);
1059
- overflow: auto;
1060
- white-space: pre-wrap;
1061
- word-break: break-word;
1062
- text-shadow: 0 1px 0 color-mix(in srgb, var(--background, #fff) 64%, transparent);
1063
- cursor: text;
1064
- color: var(--workbench-text-color);
1065
- -webkit-user-select: text;
1066
- user-select: text;
1067
- caret-color: var(--workbench-text-color);
1068
- transform: scale(var(--workbench-text-content-scale, 1));
1069
- transform-origin: 0 0;
982
+ .workbench-text-annotation {
983
+ --workbench-text-ink: oklch(from var(--workbench-text-color) 0.36 c h);
984
+ }
985
+ .dark .workbench-text-annotation {
986
+ --workbench-text-ink: oklch(from var(--workbench-text-color) 0.84 c h);
1070
987
  }
1071
988
 
1072
989
  .workbench-text-annotation__size-input {
@@ -1085,325 +1002,168 @@
1085
1002
  outline: none;
1086
1003
  }
1087
1004
 
1088
- .workbench-sticky {
1089
- --workbench-sticky-accent: #d8b25a;
1090
- --workbench-sticky-surface: #fff2bd;
1091
- --workbench-sticky-surface-strong: #ffe9a6;
1092
- --workbench-sticky-border: color-mix(
1093
- in srgb,
1094
- var(--workbench-sticky-accent) 32%,
1095
- var(--border, #e5e5e5)
1096
- );
1097
- --workbench-sticky-ink: #302616;
1098
- --workbench-sticky-ribbon: #c89734;
1099
- display: flex;
1100
- flex-direction: column;
1101
- overflow: visible;
1102
- cursor: default;
1103
- transform-origin: 0 0;
1005
+ /* Notes and palette samples share one matte material renderer. */
1006
+ [data-note-color] {
1007
+ --note-hue: 85;
1008
+ --note-chroma: 0.038;
1009
+ --note-face: oklch(0.945 var(--note-chroma) var(--note-hue));
1010
+ --note-ink: oklch(0.32 0.025 var(--note-hue));
1011
+ --note-marker: oklch(0.54 0.075 var(--note-hue));
1012
+ --note-edge: oklch(0.79 0.025 var(--note-hue));
1104
1013
  }
1105
-
1106
- .workbench-sticky.is-amber {
1107
- --workbench-sticky-accent: #d8b25a;
1108
- --workbench-sticky-surface: #fff2bd;
1109
- --workbench-sticky-surface-strong: #ffe9a6;
1110
- --workbench-sticky-ink: #5a4200;
1111
- --workbench-sticky-ribbon: #c89734;
1014
+ [data-note-color='sage'] {
1015
+ --note-hue: 155;
1112
1016
  }
1113
-
1114
- .workbench-sticky.is-sage {
1115
- --workbench-sticky-accent: #8fae72;
1116
- --workbench-sticky-surface: #e4f0d7;
1117
- --workbench-sticky-surface-strong: #d8e8c8;
1118
- --workbench-sticky-ink: #273814;
1119
- --workbench-sticky-ribbon: #78945d;
1017
+ [data-note-color='azure'] {
1018
+ --note-hue: 245;
1120
1019
  }
1121
-
1122
- .workbench-sticky.is-azure {
1123
- --workbench-sticky-accent: #7f9fc7;
1124
- --workbench-sticky-surface: #dceafd;
1125
- --workbench-sticky-surface-strong: #cfddf3;
1126
- --workbench-sticky-ink: #1b3050;
1127
- --workbench-sticky-ribbon: #688abc;
1020
+ [data-note-color='coral'] {
1021
+ --note-hue: 42;
1128
1022
  }
1129
-
1130
- .workbench-sticky.is-coral {
1131
- --workbench-sticky-accent: #ce8b70;
1132
- --workbench-sticky-surface: #ffe1d4;
1133
- --workbench-sticky-surface-strong: #ffd3c2;
1134
- --workbench-sticky-ink: #4a1e0d;
1135
- --workbench-sticky-ribbon: #b9785d;
1023
+ [data-note-color='rose'] {
1024
+ --note-hue: 350;
1136
1025
  }
1137
-
1138
- .workbench-sticky.is-rose {
1139
- --workbench-sticky-accent: #be879e;
1140
- --workbench-sticky-surface: #f6dde8;
1141
- --workbench-sticky-surface-strong: #efccd9;
1142
- --workbench-sticky-ink: #401c2c;
1143
- --workbench-sticky-ribbon: #a66f86;
1026
+ [data-note-color='graphite'] {
1027
+ --note-hue: 255;
1028
+ --note-chroma: 0.008;
1029
+ --note-marker: oklch(0.54 0.012 255);
1144
1030
  }
1145
-
1146
- .workbench-sticky.is-graphite {
1147
- --workbench-sticky-accent: oklch(0.5 0.03 250);
1148
- --workbench-sticky-surface: color-mix(in srgb, #2b3038 92%, var(--workbench-sticky-accent) 8%);
1149
- --workbench-sticky-surface-strong: color-mix(
1150
- in srgb,
1151
- #343a44 88%,
1152
- var(--workbench-sticky-accent) 12%
1031
+ .dark [data-note-color] {
1032
+ --note-face: oklch(
1033
+ from var(--background) clamp(0.29, calc(l + 0.08), 0.4) var(--note-chroma) var(--note-hue)
1153
1034
  );
1154
- --workbench-sticky-border: color-mix(in srgb, white 16%, var(--workbench-sticky-accent) 84%);
1155
- --workbench-sticky-ink: #f4f4f5;
1156
- --workbench-sticky-ribbon: color-mix(in srgb, #111827 72%, white 28%);
1157
- }
1158
-
1159
- .workbench-sticky__surface {
1035
+ --note-ink: oklch(0.9 0.016 var(--note-hue));
1036
+ --note-marker: oklch(0.68 0.07 var(--note-hue));
1037
+ --note-edge: oklch(from var(--note-face) calc(l + 0.065) 0.018 var(--note-hue));
1038
+ }
1039
+ .dark [data-note-color='graphite'] {
1040
+ --note-marker: oklch(0.68 0.012 255);
1041
+ }
1042
+ [data-note-material] {
1043
+ --note-fill: var(--note-face);
1044
+ --note-rule: color-mix(in oklab, var(--note-marker) 22%, var(--note-fill));
1045
+ background-color: var(--note-fill);
1046
+ color: var(--note-ink);
1047
+ border: 1px solid var(--note-edge);
1048
+ border-radius: 9px;
1160
1049
  position: relative;
1161
- display: flex;
1162
- flex: 1;
1163
- flex-direction: column;
1164
- width: 100%;
1165
- height: 100%;
1166
- border: 1px solid var(--workbench-sticky-border);
1167
- border-radius: 7px;
1168
- background:
1169
- linear-gradient(180deg, color-mix(in srgb, white 18%, transparent), transparent 34%),
1170
- linear-gradient(
1171
- 135deg,
1172
- var(--workbench-sticky-surface),
1173
- color-mix(in srgb, var(--workbench-sticky-surface) 88%, var(--workbench-sticky-accent) 12%)
1174
- );
1175
- box-shadow:
1176
- 0 16px 28px color-mix(in srgb, var(--foreground, #000) 7%, transparent),
1177
- 0 1px 0 color-mix(in srgb, white 9%, transparent) inset;
1178
1050
  overflow: hidden;
1179
- transition:
1180
- border-color 180ms ease,
1181
- box-shadow 180ms ease,
1182
- transform 180ms cubic-bezier(0.22, 1, 0.36, 1),
1183
- background-color 180ms ease;
1184
1051
  }
1185
-
1186
- .workbench-sticky__surface::before {
1052
+ [data-note-material='tab'] {
1053
+ --note-fill: var(--wb-window, var(--card));
1054
+ --note-ink: var(--foreground);
1055
+ --note-edge: var(--wb-window-edge, var(--border));
1056
+ }
1057
+ [data-note-material='tab']::before {
1187
1058
  content: '';
1188
1059
  position: absolute;
1189
1060
  inset: 0 auto 0 0;
1190
- width: 4px;
1191
- background: var(--workbench-sticky-ribbon);
1192
- opacity: 0.92;
1193
- box-shadow: 1px 0 0 color-mix(in srgb, white 18%, transparent) inset;
1061
+ width: var(--note-stripe, 8px);
1062
+ background: var(--note-marker);
1194
1063
  pointer-events: none;
1195
1064
  }
1196
-
1197
- .workbench-sticky:hover .workbench-sticky__surface,
1198
- .workbench-sticky:focus-within .workbench-sticky__surface {
1199
- border-color: color-mix(in srgb, var(--workbench-sticky-accent) 42%, var(--border, #e5e5e5));
1200
- background:
1201
- linear-gradient(180deg, color-mix(in srgb, white 24%, transparent), transparent 32%),
1065
+ [data-note-material='ruled'] {
1066
+ --note-fill: color-mix(in oklab, var(--note-face) 48%, var(--wb-window, var(--card)));
1067
+ --note-ink: var(--foreground);
1068
+ border-radius: 3px;
1069
+ }
1070
+ [data-note-material='ruled']::before {
1071
+ content: '';
1072
+ position: absolute;
1073
+ inset: 0;
1074
+ pointer-events: none;
1075
+ background-image:
1202
1076
  linear-gradient(
1203
- 135deg,
1204
- var(--workbench-sticky-surface-strong),
1205
- color-mix(
1206
- in srgb,
1207
- var(--workbench-sticky-surface-strong) 82%,
1208
- var(--workbench-sticky-accent) 18%
1209
- )
1077
+ to right,
1078
+ transparent var(--note-margin, 30px),
1079
+ color-mix(in oklab, var(--note-marker) 38%, var(--note-fill)) var(--note-margin, 30px),
1080
+ color-mix(in oklab, var(--note-marker) 38%, var(--note-fill))
1081
+ calc(var(--note-margin, 30px) + 1px),
1082
+ transparent calc(var(--note-margin, 30px) + 1px)
1083
+ ),
1084
+ repeating-linear-gradient(
1085
+ to bottom,
1086
+ transparent 0 calc(var(--note-rule-space, 28px) - 1px),
1087
+ var(--note-rule) calc(var(--note-rule-space, 28px) - 1px) var(--note-rule-space, 28px)
1210
1088
  );
1211
- box-shadow:
1212
- 0 20px 34px color-mix(in srgb, var(--foreground, #000) 10%, transparent),
1213
- 0 1px 0 color-mix(in srgb, white 12%, transparent) inset;
1214
1089
  }
1215
-
1216
- .workbench-sticky.is-selected .workbench-sticky__surface {
1217
- border-color: color-mix(in srgb, var(--primary, #3b82f6) 38%, var(--workbench-sticky-border));
1218
- box-shadow:
1219
- 0 0 0 2px color-mix(in srgb, var(--primary, #3b82f6) 24%, transparent),
1220
- 0 22px 42px -18px color-mix(in srgb, var(--primary, #3b82f6) 26%, transparent),
1221
- 0 1px 0 color-mix(in srgb, white 12%, transparent) inset;
1090
+ .workbench-sticky {
1091
+ display: flex;
1092
+ overflow: visible;
1093
+ transform-origin: 0 0;
1094
+ cursor: grab;
1222
1095
  }
1223
-
1224
- .workbench-sticky.is-dragging .workbench-sticky__surface {
1225
- box-shadow:
1226
- 0 0 0 2px color-mix(in srgb, var(--primary, #3b82f6) 28%, transparent),
1227
- 0 26px 46px color-mix(in srgb, var(--foreground, #000) 14%, transparent),
1228
- 0 1px 0 color-mix(in srgb, white 12%, transparent) inset;
1229
- transition: none;
1096
+ .workbench-sticky__surface {
1097
+ --ring: var(--wb-window-active, var(--border));
1098
+ width: 100%;
1099
+ height: 100%;
1100
+ padding: 26px 22px 22px;
1101
+ box-shadow: 0 3px 7px -5px rgb(0 0 0 / 24%);
1230
1102
  }
1231
-
1232
- .workbench-sticky.is-dragging,
1233
- .workbench-sticky.is-resizing {
1234
- transition: none;
1235
- will-change: transform;
1103
+ .workbench-sticky.is-selected .workbench-sticky__surface {
1104
+ border-color: var(--wb-window-active, var(--foreground));
1236
1105
  }
1237
-
1238
- .workbench-sticky.is-copied .workbench-sticky__surface {
1239
- border-color: color-mix(in srgb, var(--success, #22c55e) 38%, var(--workbench-sticky-border));
1240
- box-shadow:
1241
- 0 0 0 1px color-mix(in srgb, var(--success, #22c55e) 26%, transparent),
1242
- 0 22px 36px color-mix(in srgb, var(--foreground, #000) 12%, transparent),
1243
- 0 1px 0 color-mix(in srgb, white 12%, transparent) inset;
1106
+ .workbench-sticky__surface[data-note-material='ruled'] {
1107
+ padding-left: 42px;
1244
1108
  }
1245
-
1246
- .workbench-sticky__header {
1109
+ .workbench-sticky__body {
1247
1110
  position: relative;
1248
- z-index: 1;
1249
- display: flex;
1250
- align-items: center;
1251
- min-height: 31px;
1252
- padding: 8px 9px 0 10px;
1253
- cursor: move;
1254
- }
1255
-
1256
- .workbench-sticky.is-locked .workbench-sticky__header {
1257
- cursor: default;
1258
- }
1259
-
1260
- .workbench-sticky.is-locked .workbench-sticky__body {
1261
- cursor: default;
1262
- }
1263
-
1264
- .workbench-sticky__grip,
1265
- .workbench-sticky__tool {
1266
- display: inline-flex;
1267
- align-items: center;
1268
- justify-content: center;
1269
- border: none;
1270
- background: transparent;
1271
- color: color-mix(in srgb, var(--workbench-sticky-ink) 58%, var(--muted-foreground, #737373));
1272
- cursor: pointer;
1273
- transition:
1274
- background-color 140ms ease,
1275
- color 140ms ease,
1276
- opacity 140ms ease,
1277
- transform 140ms ease;
1111
+ height: 100%;
1112
+ overflow: auto;
1113
+ font-size: 16px;
1114
+ line-height: 28px;
1115
+ white-space: pre-wrap;
1116
+ overflow-wrap: anywhere;
1117
+ user-select: text;
1118
+ cursor: text;
1278
1119
  }
1279
-
1280
1120
  .workbench-sticky__grip {
1281
- width: 25px;
1282
- height: 25px;
1283
- border-radius: 7px;
1284
- opacity: 0.48;
1285
- cursor: move;
1121
+ position: absolute;
1122
+ top: 3px;
1123
+ right: 4px;
1124
+ z-index: 2;
1125
+ width: 22px;
1126
+ height: 22px;
1127
+ display: grid;
1128
+ place-items: center;
1129
+ border: 0;
1130
+ border-radius: 4px;
1131
+ color: inherit;
1132
+ background: transparent;
1133
+ cursor: grab;
1134
+ opacity: 0;
1286
1135
  }
1287
-
1288
1136
  .workbench-sticky:hover .workbench-sticky__grip,
1289
- .workbench-sticky:focus-within .workbench-sticky__grip,
1290
- .workbench-sticky.is-dragging .workbench-sticky__grip {
1291
- opacity: 0.92;
1292
- }
1293
-
1294
- .workbench-sticky__grip:hover,
1295
- .workbench-sticky__tool:hover {
1296
- color: var(--workbench-sticky-ink);
1297
- background: color-mix(in srgb, var(--background, #fff) 74%, transparent);
1298
- transform: translateY(-1px);
1137
+ .workbench-sticky.is-selected .workbench-sticky__grip {
1138
+ opacity: 0.7;
1299
1139
  }
1300
-
1301
- .workbench-sticky__grip:active,
1302
- .workbench-sticky__tool:active {
1303
- transform: translateY(0);
1304
- }
1305
-
1306
- .workbench-sticky.is-dragging .workbench-sticky__grip,
1307
1140
  .workbench-sticky__grip:active {
1308
1141
  cursor: grabbing;
1309
1142
  }
1310
-
1311
- .workbench-sticky__actions {
1312
- position: absolute;
1313
- top: -10px;
1314
- right: -10px;
1315
- z-index: 5;
1316
- display: flex;
1317
- flex-direction: column;
1318
- align-items: center;
1319
- gap: 4px;
1320
- padding: 4px;
1321
- border: 1px solid
1322
- color-mix(in srgb, var(--workbench-sticky-accent) 18%, var(--workbench-sticky-border));
1323
- border-radius: 999px;
1324
- background: color-mix(in srgb, var(--background, #fff) 80%, transparent);
1325
- backdrop-filter: blur(12px);
1326
- box-shadow:
1327
- 0 14px 26px color-mix(in srgb, var(--foreground, #000) 11%, transparent),
1328
- 0 0 0 1px color-mix(in srgb, white 16%, transparent) inset;
1329
- }
1330
-
1331
1143
  .workbench-sticky__tool {
1332
- width: 27px;
1333
- height: 27px;
1334
- border-radius: 999px;
1335
- border: 1px solid color-mix(in srgb, var(--workbench-sticky-accent) 14%, transparent);
1336
- background: color-mix(in srgb, var(--background, #fff) 66%, transparent);
1337
- box-shadow: 0 1px 0 color-mix(in srgb, white 12%, transparent) inset;
1144
+ display: grid;
1145
+ place-items: center;
1146
+ width: 28px;
1147
+ height: 28px;
1148
+ border: 0;
1149
+ border-radius: 5px;
1150
+ color: var(--foreground);
1151
+ background: transparent;
1152
+ cursor: pointer;
1338
1153
  }
1339
-
1340
1154
  .workbench-sticky__tool.is-danger {
1341
- color: var(--destructive, #ef4444);
1342
- }
1343
-
1344
- .workbench-sticky__tool.is-success {
1345
- color: color-mix(in srgb, var(--success, #22c55e) 84%, var(--workbench-sticky-ink));
1346
- border-color: color-mix(in srgb, var(--success, #22c55e) 34%, var(--workbench-sticky-border));
1347
- background: color-mix(in srgb, var(--success, #22c55e) 12%, var(--background, #fff));
1348
- }
1349
-
1350
- .workbench-sticky__tool.is-danger:hover {
1351
- border-color: color-mix(
1352
- in srgb,
1353
- var(--destructive, #ef4444) 28%,
1354
- var(--workbench-sticky-border)
1355
- );
1356
- background: color-mix(in srgb, var(--destructive, #ef4444) 10%, var(--background, #fff));
1155
+ color: var(--destructive);
1357
1156
  }
1358
-
1359
- .workbench-sticky__color-dot {
1360
- width: 11px;
1361
- height: 11px;
1362
- border-radius: 999px;
1363
- background: var(--workbench-sticky-accent);
1364
- box-shadow:
1365
- 0 0 0 1px color-mix(in srgb, var(--workbench-sticky-ribbon) 54%, transparent),
1366
- 0 1px 0 color-mix(in srgb, white 38%, transparent) inset;
1367
- }
1368
-
1369
- .workbench-sticky__body {
1370
- position: relative;
1371
- z-index: 1;
1372
- flex: 1;
1373
- min-height: 0;
1374
- padding: 2px 16px 15px 18px;
1375
- color: var(--workbench-sticky-ink);
1376
- font-size: 16px;
1377
- line-height: 1.52;
1378
- overflow: auto;
1379
- outline: 0;
1380
- cursor: text;
1381
- white-space: pre-wrap;
1382
- word-break: break-word;
1383
- -webkit-user-select: text;
1384
- user-select: text;
1385
- caret-color: var(--workbench-sticky-ink);
1386
- }
1387
-
1388
- .workbench-sticky__body:focus,
1389
- .workbench-sticky__body:focus-visible {
1390
- outline: 0;
1391
- box-shadow: none;
1392
- }
1393
-
1394
1157
  .workbench-sticky__resize {
1395
- right: -3px;
1396
- bottom: -3px;
1158
+ opacity: 0;
1397
1159
  width: 34px;
1398
1160
  height: 34px;
1399
- border-radius: 10px 0 7px 0;
1400
- background: transparent;
1401
1161
  z-index: 4;
1402
1162
  pointer-events: auto;
1403
- opacity: 0;
1404
- transition: opacity 140ms ease;
1163
+ background: transparent;
1164
+ right: -3px;
1165
+ bottom: -3px;
1405
1166
  }
1406
-
1407
1167
  .workbench-sticky__resize::after {
1408
1168
  content: '';
1409
1169
  position: absolute;
@@ -1411,27 +1171,77 @@
1411
1171
  bottom: 6px;
1412
1172
  width: 10px;
1413
1173
  height: 10px;
1414
- border-radius: 3px 0 4px 0;
1415
- background:
1416
- linear-gradient(
1417
- 135deg,
1418
- transparent 54%,
1419
- color-mix(in srgb, var(--workbench-sticky-ink) 38%, transparent) 55% 62%,
1420
- transparent 63%
1421
- ),
1422
- linear-gradient(
1423
- 135deg,
1424
- transparent 72%,
1425
- color-mix(in srgb, var(--workbench-sticky-ink) 26%, transparent) 73% 80%,
1426
- transparent 81%
1427
- );
1428
- pointer-events: none;
1174
+ border-right: 2px solid var(--muted-foreground);
1175
+ border-bottom: 2px solid var(--muted-foreground);
1429
1176
  }
1430
-
1431
1177
  .workbench-sticky:hover .workbench-sticky__resize,
1432
1178
  .workbench-sticky.is-selected .workbench-sticky__resize {
1433
1179
  opacity: 1;
1434
1180
  }
1181
+ .workbench-note-preview {
1182
+ display: block;
1183
+ width: 21px;
1184
+ height: 25px;
1185
+ --note-stripe: 5px;
1186
+ --note-margin: 7px;
1187
+ --note-rule-space: 8px;
1188
+ pointer-events: none;
1189
+ }
1190
+ .workbench-material-choices {
1191
+ display: flex;
1192
+ gap: 3px;
1193
+ border-left: 1px solid var(--border);
1194
+ padding-left: 5px;
1195
+ }
1196
+ .workbench-style-choice {
1197
+ display: grid;
1198
+ gap: 3px;
1199
+ justify-items: center;
1200
+ padding: 4px;
1201
+ border: 1px solid transparent;
1202
+ border-radius: 6px;
1203
+ background: transparent;
1204
+ color: var(--foreground);
1205
+ cursor: pointer;
1206
+ font-size: 10px;
1207
+ }
1208
+ .workbench-style-choice[aria-pressed='true'] {
1209
+ border-color: var(--wb-window-active, var(--foreground));
1210
+ background: var(--accent);
1211
+ }
1212
+ .workbench-style-choice:hover {
1213
+ background: var(--accent);
1214
+ }
1215
+ .workbench-style-choice.is-material .workbench-note-preview {
1216
+ width: 40px;
1217
+ height: 31px;
1218
+ }
1219
+ .workbench-object-tools {
1220
+ pointer-events: auto;
1221
+ }
1222
+ .workbench-object-tools
1223
+ :is(
1224
+ .workbench-sticky__actions,
1225
+ .workbench-background-region__toolbar,
1226
+ .workbench-text-annotation__toolbar
1227
+ ) {
1228
+ position: relative;
1229
+ inset: auto;
1230
+ transform: none;
1231
+ display: flex;
1232
+ flex-wrap: wrap;
1233
+ align-items: center;
1234
+ gap: 4px;
1235
+ padding: 6px;
1236
+ max-width: 100%;
1237
+ width: max-content;
1238
+ border: 1px solid var(--border);
1239
+ border-radius: 10px;
1240
+ background: var(--card);
1241
+ color: var(--foreground);
1242
+ box-shadow: 0 5px 15px -7px rgb(0 0 0 / 24%);
1243
+ backdrop-filter: none;
1244
+ }
1435
1245
 
1436
1246
  /* ------------------------------------------------------------------ */
1437
1247
  /* Widget */
@@ -1525,21 +1335,19 @@
1525
1335
 
1526
1336
  .workbench-canvas__field.is-work-layer-muted
1527
1337
  .workbench-work-layer
1528
- > :is(.workbench-widget, .workbench-sticky)
1338
+ > .workbench-widget
1529
1339
  :is(.workbench-widget__surface, .workbench-sticky__surface)::after,
1530
1340
  .workbench-canvas__projected-layer.is-work-layer-locked
1531
1341
  .workbench-canvas__projected-work-layer
1532
- > :is(.workbench-widget, .workbench-sticky)
1342
+ > .workbench-widget
1533
1343
  :is(.workbench-widget__surface, .workbench-sticky__surface)::after {
1534
1344
  opacity: 0.84;
1535
1345
  }
1536
1346
 
1537
- .workbench-canvas__field.is-work-layer-muted
1538
- .workbench-work-layer
1539
- > :is(.workbench-widget, .workbench-sticky),
1347
+ .workbench-canvas__field.is-work-layer-muted .workbench-work-layer > .workbench-widget,
1540
1348
  .workbench-canvas__projected-layer.is-work-layer-locked
1541
1349
  .workbench-canvas__projected-work-layer
1542
- > :is(.workbench-widget, .workbench-sticky) {
1350
+ > .workbench-widget {
1543
1351
  box-shadow:
1544
1352
  0 1px 2px color-mix(in srgb, var(--foreground, #000) 2%, transparent),
1545
1353
  0 8px 22px -18px color-mix(in srgb, var(--foreground, #000) 12%, transparent);