@bpmn-io/form-js-editor 1.26.1 → 2.0.0-alpha.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.
@@ -1,124 +1,81 @@
1
+ @charset "UTF-8";
2
+ /**
3
+ * Semantic tokens, copied from `@bpmn-io/theme` to style the components
4
+ * according to this theme.
5
+ *
6
+ * Names and values of the tokens should stay intact with the `@bpmn-io/theme`
7
+ * source of truth, to ensure matching styles and allow overrides with an
8
+ * alternative theme.
9
+ */
10
+ .bio-theme-parent {
11
+ --bio-surface: hsl(0, 0%, 100%);
12
+ --bio-surface-subtle: hsl(225, 10%, 97%);
13
+ --bio-surface-medium: hsl(225, 10%, 95%);
14
+ --bio-surface-strong: hsl(225, 10%, 90%);
15
+ --bio-text: hsl(225, 10%, 15%);
16
+ --bio-text-subtle: hsl(225, 10%, 35%);
17
+ --bio-text-subtlest: hsl(225, 10%, 55%);
18
+ --bio-border: hsl(225, 10%, 75%);
19
+ --bio-border-input: hsl(225, 10%, 75%);
20
+ --bio-border-subtle: hsl(225, 10%, 85%);
21
+ --bio-border-disabled: hsl(225, 10%, 90%);
22
+ --bio-primary: hsl(205, 100%, 40%);
23
+ --bio-primary-surface: hsl(205, 100%, 95%);
24
+ --bio-danger: hsl(360, 100%, 45%);
25
+ --bio-danger-surface: hsl(360, 100%, 92%);
26
+ --bio-focus: hsl(205, 100%, 40%);
27
+ --bio-shadow: hsla(0, 0%, 0%, 30%);
28
+ }
29
+
1
30
  .fjs-editor-container {
2
- --color-children-selected-border: var(--cds-border-interactive, var(--color-blue-219-100-53));
31
+ --color-children-selected-border: var(--bio-primary);
3
32
  --color-children-selected-background: transparent;
4
- --color-children-hover-border: var(--cds-border-interactive, var(--color-blue-219-100-53-05));
33
+ --color-children-hover-border: color-mix(in srgb, var(--bio-primary) 50%, transparent);
5
34
  --color-context-pad-item-background: transparent;
6
- --color-context-pad-item-fill: var(--cds-icon-secondary, var(--color-grey-225-10-15));
7
- --color-context-pad-item-hover-fill: var(--color-red-360-100-45);
8
- --color-resize-handle-background: var(--cds-border-interactive, var(--color-blue-219-100-53));
9
- --color-resize-handle-border: var(--cds-border-interactive, var(--color-blue-219-100-53));
10
- --color-dragula-background: var(--cds-highlight, var(--color-blue-205-100-95));
11
- --color-dragula-border: var(--cds-border-interactive, var(--color-blue-205-100-45));
12
- --color-dragula-mirror-background: var(--cds-background, var(--color-white));
13
- --color-dragula-mirror-border: var(--cds-border-strong, var(--cds-border-strong-01, var(--color-grey-225-10-90)));
14
- --color-dragula-error-background: var(--color-red-360-100-92);
15
- --color-dragula-error-border: var(--cds-text-error, var(--color-red-360-100-45));
35
+ --color-context-pad-item-fill: var(--bio-text);
36
+ --color-context-pad-item-hover-fill: var(--bio-danger);
37
+ --color-resize-handle-background: var(--bio-primary);
38
+ --color-resize-handle-border: var(--bio-primary);
39
+ --color-dragula-background: var(--bio-primary-surface);
40
+ --color-dragula-border: var(--bio-primary);
41
+ --color-dragula-mirror-background: var(--bio-surface);
42
+ --color-dragula-mirror-border: var(--bio-border-disabled);
43
+ --color-dragula-error-background: var(--bio-danger-surface);
44
+ --color-dragula-error-border: var(--bio-danger);
16
45
  }
17
46
 
18
47
  .fjs-palette-container {
19
- --color-palette-text: var(--cds-text-primary, var(--color-grey-225-10-15));
20
- --color-palette-container-background: var(--cds-background, var(--color-grey-225-10-95));
21
- --color-palette-container-border: var(--cds-border-strong, var(--cds-border-strong-01, var(--color-grey-225-10-80)));
22
- --color-palette-header: var(--cds-text-primary, var(--color-text));
23
- --color-palette-header-background: var(--cds-background, var(--color-grey-225-10-95));
24
- --color-palette-header-border: var(--cds-border-strong, var(--cds-border-strong-01, var(--color-grey-225-10-85)));
48
+ --color-palette-text: var(--bio-text);
49
+ --color-palette-container-background: var(--bio-surface-medium);
50
+ --color-palette-container-border: var(--bio-border);
51
+ --color-palette-header: var(--color-text);
52
+ --color-palette-header-background: var(--bio-surface-medium);
53
+ --color-palette-header-border: var(--bio-border-subtle);
25
54
  --color-palette-search: var(--color-palette-text);
26
- --color-palette-search-icon: var(--cds-icon-secondary, var(--color-grey-225-10-35));
27
- --color-palette-search-icon-hover: var(--cds-icon-primary, var(--color-grey-225-10-15));
28
- --color-palette-search-background: var(--cds-field, var(--cds-field-01, var(--color-white)));
29
- --color-palette-search-border: var(--cds-border-strong, var(--cds-border-strong-01, var(--color-grey-225-10-75)));
30
- --color-palette-search-focus-background: var(--cds-field, var(--cds-field-01, var(--color-blue-205-100-95)));
31
- --color-palette-search-focus-border: var(--cds-focus, var(--color-blue-205-100-50));
32
- --color-palette-search-clear-focus-border: var(--cds-focus, var(--color-grey-225-10-50));
55
+ --color-palette-search-icon: var(--bio-text-subtle);
56
+ --color-palette-search-icon-hover: var(--bio-text);
57
+ --color-palette-search-background: var(--bio-surface);
58
+ --color-palette-search-border: var(--bio-border);
59
+ --color-palette-search-focus-background: var(--bio-primary-surface);
60
+ --color-palette-search-focus-border: var(--bio-focus);
61
+ --color-palette-search-clear-focus-border: var(--bio-border-input);
33
62
  --color-palette-group-title: var(--color-palette-text);
34
63
  --color-palette-field: var(--color-palette-text);
35
- --color-palette-field-background: var(--cds-layer, var(--cds-layer-01, var(--color-white)));
36
- --color-palette-field-border: var(--cds-border-subtle, var(--cds-border-subtle-01, var(--color-grey-225-10-93)));
37
- --color-palette-field-focus: var(--cds-border-interactive, var(--color-blue-205-100-45));
38
- --color-palette-field-hover-background: var(--cds-background-hover, var(--color-grey-225-10-90));
39
- --color-palette-field-hover-border: var(
40
- --cds-border-strong,
41
- var(--cds-border-strong-01, var(--color-grey-225-10-55))
42
- );
64
+ --color-palette-field-background: var(--bio-surface);
65
+ --color-palette-field-border: var(--bio-border-disabled);
66
+ --color-palette-field-focus: var(--bio-primary);
67
+ --color-palette-field-hover-background: var(--bio-surface-strong);
68
+ --color-palette-field-hover-border: var(--bio-border-input);
43
69
  --cursor-palette-field: grab;
44
70
  --palette-width: 270px;
45
71
  }
46
72
 
47
73
  .fjs-properties-container {
48
- --color-properties-container-background: var(--cds-background, var(--color-white));
49
- --color-properties-container-border: var(
50
- --cds-border-strong,
51
- var(--cds-border-strong-01, var(--color-grey-225-10-80))
52
- );
74
+ --color-properties-container-background: var(--bio-surface);
75
+ --color-properties-container-border: var(--bio-border);
53
76
  --properties-panel-width: 300px;
54
77
  }
55
78
 
56
- /**
57
- * Theming overrides
58
- */
59
- .fjs-properties-container .bio-properties-panel {
60
- --text-base-color: var(--cds-text-primary, var(--color-grey-225-10-15));
61
- --text-error-color: var(--cds-text-color, var(--color-red-360-100-45));
62
- --link-color: var(--cds-text-primary, var(--color-blue-205-100-50));
63
- --description-color: var(--cds-text-secondary, var(--color-grey-225-10-35));
64
- --description-code-background-color: var(--cds-layer, var(--cds-layer-01, var(--color-grey-225-10-97)));
65
- --description-code-border-color: var(--cds-border-strong, var(--cds-border-strong-01, var(--color-grey-225-10-85)));
66
- --description-list-item-color: var(--cds-text-secondary, var(--color-grey-225-10-35));
67
- --placeholder-color: var(--cds-text-placeholder, var(--color-grey-225-10-35));
68
- --placeholder-background-color: var(--cds-layer, var(--cds-layer-01, var(--color-grey-225-10-95)));
69
- --header-background-color: var(--cds-layer, var(--cds-layer-01, var(--color-grey-225-10-95)));
70
- --header-icon-fill-color: var(--cds-icon-primary, var(--color-grey-225-10-15));
71
- --header-bottom-border-color: var(--color-grey-225-10-75);
72
- --group-background-color: var(--cds-background, var(--color-white));
73
- --group-bottom-border-color: var(--cds-border-strong, var(--cds-border-strong-01, var(--color-grey-225-10-75)));
74
- --sticky-group-background-color: var(--cds-layer, var(--cds-layer-01, var(--color-grey-225-10-95)));
75
- --sticky-group-bottom-border-color: var(
76
- --cds-border-strong,
77
- var(--cds-border-strong-01, var(--color-grey-225-10-75))
78
- );
79
- --add-entry-fill-color: var(--cds-icon-secondary, var(--color-grey-225-10-35));
80
- --add-entry-hover-fill-color: var(--cds-icon-inverse, var(--color-white));
81
- --add-entry-hover-background-color: var(--cds-interactive, var(--color-blue-205-100-50));
82
- --add-entry-label-color: var(--cds-text-inverse, var(--color-white));
83
- --remove-entry-fill-color: var(--color-red-360-100-45);
84
- --remove-entry-hover-background-color: var(--color-red-360-100-92);
85
- --arrow-fill-color: var(--cds-icon-secondary, var(--color-grey-225-10-35));
86
- --arrow-hover-background-color: var(--cds-layer, var(--cds-layer-01, var(--color-grey-225-10-95)));
87
- --dot-color: var(--cds-text-secondary, var(--color-grey-225-10-35));
88
- --list-badge-color: var(--cds-text-inverse, var(--color-white));
89
- --list-badge-background-color: var(--cds-background-inverse, var(--color-grey-225-10-35));
90
- --input-background-color: var(--cds-field, var(--cds-field-01, var(--color-grey-225-10-97)));
91
- --input-border-color: var(--cds-border-strong, var(--cds-border-strong-01, var(--color-grey-225-10-75)));
92
- --input-focus-background-color: var(--cds-field, var(--cds-field-01, var(--color-blue-205-100-95)));
93
- --input-focus-border-color: var(--cds-focus, var(--color-blue-205-100-50));
94
- --input-error-background-color: var(--cds-field, var(--cds-field-01, var(--color-red-360-100-97)));
95
- --input-error-border-color: var(--cds-text-error, var(--color-red-360-100-45));
96
- --input-error-focus-border-color: var(--cds-text-error, var(--color-red-360-100-45));
97
- --input-disabled-color: var(--cds-text-disabled, var(--color-grey-225-10-55));
98
- --input-disabled-background-color: var(--cds-field, var(--cds-field-01, var(--color-grey-225-10-97)));
99
- --input-disabled-border-color: var(--cds-border-disabled, var(--color-grey-225-10-90));
100
- --toggle-switch-on-background-color: var(--cds-interactive, var(--color-blue-205-100-50));
101
- --toggle-switch-off-background-color: var(--cds-toggle-off, var(--color-grey-225-10-75));
102
- --toggle-switch-switcher-background-color: var(--cds-background, var(--color-white));
103
- --side-line-background-color: var(--cds-text-secondary, var(--color-grey-225-10-35));
104
- --side-line-extension-background-color: var(--cds-text-secondary, var(--color-grey-225-10-35));
105
- --list-entry-dot-background-color: var(--cds-background-inverse, var(--color-grey-225-10-35));
106
- --list-entry-header-button-fill-color: var(--cds-background-inverse, var(--color-grey-225-10-35));
107
- --list-entry-add-entry-empty-background-color: var(--cds-interactive, var(--color-blue-205-100-50));
108
- --list-entry-add-entry-empty-hover-background-color: var(--cds-interactive, var(--color-blue-205-100-45));
109
- --list-entry-add-entry-label-color: var(--cds-text-inverse, var(--color-white));
110
- --list-entry-add-entry-background-color: var(--cds-interactive, var(--color-blue-205-100-50));
111
- --list-entry-add-entry-fill-color: var(--cds-icon-inverse, var(--color-white));
112
- --feel-background-color: transparent;
113
- --feel-active-color: var(--cds-interactive, var(--color-blue-205-100-45));
114
- --feel-inactive-color: var(--cds-icon-secondary, var(--color-grey-225-10-35));
115
- --feel-hover-color: var(--cds-icon-primary, var(--color-grey-225-10-15));
116
- --feel-hover-background-color: var(--cds-layer-02, var(--color-grey-225-10-97));
117
- --feel-active-background-color: transparent;
118
- --feel-required-color: var(--cds-icon-disabled, var(--color-grey-225-10-55));
119
- --feel-indicator-background-color: var(--cds-background-hover, var(--color-grey-225-10-90));
120
- }
121
-
122
79
  .fjs-properties-container .bio-properties-panel-input {
123
80
  color: var(--color-text);
124
81
  }
@@ -258,7 +215,7 @@
258
215
  }
259
216
 
260
217
  .fjs-editor-container .fjs-empty-component .fjs-empty-component-text {
261
- color: var(--cds-text-disabled, var(--color-grey-225-10-55));
218
+ color: var(--color-text-lighter);
262
219
  }
263
220
 
264
221
  @container (width < 100px) {
@@ -342,7 +299,7 @@
342
299
  max-height: calc(100% - 2px);
343
300
  border: 1px solid var(--color-resize-handle-border);
344
301
  border-radius: 50px;
345
- background: var(--color-white);
302
+ background: var(--bio-surface);
346
303
  z-index: 3;
347
304
  }
348
305
 
@@ -380,7 +337,7 @@
380
337
 
381
338
  .fjs-editor-container .fjs-repeat-render-footer {
382
339
  font-size: var(--font-size-label);
383
- background: var(--cds-field, var(--color-background-disabled));
340
+ background: var(--color-background-disabled);
384
341
  color: var(--color-text-light);
385
342
  padding: 3px;
386
343
  display: flex;
@@ -511,12 +468,12 @@
511
468
  color: var(--color-palette-search);
512
469
  border: 1px solid var(--color-palette-search-border);
513
470
  background-color: var(--color-palette-search-background);
514
- border-radius: 2px;
471
+ border-radius: var(--input-border-radius);
515
472
  font-size: 14px;
516
473
  }
517
474
 
518
475
  .fjs-palette-container .fjs-palette-search-container:focus-within {
519
- outline: none;
476
+ outline: var(--outline-definition);
520
477
  background-color: var(--color-palette-search-focus-background);
521
478
  border: 1px solid var(--color-palette-search-focus-border);
522
479
  }
@@ -649,7 +606,7 @@
649
606
  }
650
607
 
651
608
  .fjs-json-editor .cm-placeholder {
652
- color: var(--cds-text-placeholder, var(--color-grey-225-10-35));
609
+ color: var(--color-text-placeholder);
653
610
  }
654
611
 
655
612
  .fjs-json-editor .cm-placeholder > :first-child {
@@ -718,7 +675,7 @@
718
675
 
719
676
  .fjs-editor-container .fjs-form-field-spacer {
720
677
  min-height: 30px;
721
- background: repeating-linear-gradient(45deg, #ffffff, #ffffff 10px, #f5f5f5 10px, #f5f5f5 20px);
678
+ background: repeating-linear-gradient(45deg, var(--bio-surface), var(--bio-surface) 10px, var(--bio-surface-subtle) 10px, var(--bio-surface-subtle) 20px);
722
679
  }
723
680
 
724
681
  .fjs-editor-container .fjs-form-field-html,
@@ -775,7 +732,7 @@
775
732
  background-color: var(--color-dragula-mirror-background) !important;
776
733
  border: solid 1px var(--color-dragula-mirror-border) !important;
777
734
  border-radius: 5px !important;
778
- box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.15) !important;
735
+ box-shadow: 0px 0px 20px var(--bio-shadow) !important;
779
736
  display: flex !important;
780
737
  filter: none !important;
781
738
  flex-direction: row !important;
@@ -795,7 +752,7 @@
795
752
  font-size: 11px;
796
753
  user-select: none;
797
754
  color: var(--color-text);
798
- background: var(--color-white);
755
+ background: var(--bio-surface);
799
756
  }
800
757
 
801
758
  .fjs-field-preview .fjs-field-preview-icon {
@@ -853,111 +810,165 @@
853
810
  }
854
811
 
855
812
  /**
856
- * Theming
813
+ * Semantic tokens, copied from `@bpmn-io/theme` to style the components
814
+ * according to this theme.
815
+ *
816
+ * Names and values of the tokens should stay intact with the `@bpmn-io/theme`
817
+ * source of truth, to ensure matching styles and allow overrides with an
818
+ * alternative theme.
857
819
  */
858
- .bio-properties-panel,
859
- .djs-parent {
860
- --color-grey-225-10-15: hsl(225, 10%, 15%);
861
- --color-grey-225-10-35: hsl(225, 10%, 35%);
862
- --color-grey-225-10-55: hsl(225, 10%, 55%);
863
- --color-grey-225-10-75: hsl(225, 10%, 75%);
864
- --color-grey-225-10-80: hsl(225, 10%, 80%);
865
- --color-grey-225-10-85: hsl(225, 10%, 85%);
866
- --color-grey-225-10-90: hsl(225, 10%, 90%);
867
- --color-grey-225-10-95: hsl(225, 10%, 95%);
868
- --color-grey-225-10-97: hsl(225, 10%, 97%);
869
- --color-grey-0-0-22: hsl(0, 0%, 22%);
870
- --color-blue-205-100-35: hsl(205, 100%, 35%);
871
- --color-blue-205-100-40: hsl(205, 100%, 40%);
872
- --color-green-150-86-44: hsl(150, 86%, 44%);
873
- --color-blue-205-100-45: hsl(205, 100%, 45%);
874
- --color-blue-205-100-50: hsl(205, 100%, 50%);
875
- --color-blue-219-99-53: hsl(219, 99%, 53%);
876
- --color-blue-218-100-74: hsl(218, 100%, 74%);
877
- --color-blue-205-100-85: hsl(205, 100%, 85%);
878
- --color-blue-205-100-95: hsl(205, 100%, 95%);
879
- --color-red-360-100-40: hsl(360, 100%, 40%);
880
- --color-red-360-100-45: hsl(360, 100%, 45%);
881
- --color-red-360-100-92: hsl(360, 100%, 92%);
882
- --color-red-360-100-97: hsl(360, 100%, 97%);
883
- --color-white: white;
884
- --color-black: black;
885
- --color-transparent: transparent;
820
+ .bio-theme-parent {
821
+ --bio-surface: hsl(0, 0%, 100%);
822
+ --bio-surface-overlay: hsl(0, 0%, 100%);
823
+ --bio-surface-subtle: hsl(225, 10%, 97%);
824
+ --bio-surface-medium: hsl(225, 10%, 95%);
825
+ --bio-surface-strong: hsl(225, 10%, 90%);
826
+ --bio-surface-inverted: hsl(0, 0%, 22%);
827
+ --bio-text: hsl(225, 10%, 15%);
828
+ --bio-text-subtle: hsl(225, 10%, 35%);
829
+ --bio-text-subtlest: hsl(225, 10%, 55%);
830
+ --bio-text-on-primary: hsl(0, 0%, 100%);
831
+ --bio-text-on-inverted: hsl(0, 0%, 100%);
832
+ --bio-border: hsl(225, 10%, 75%);
833
+ --bio-border-subtle: hsl(225, 10%, 85%);
834
+ --bio-border-disabled: hsl(225, 10%, 90%);
835
+ --bio-border-input: hsl(225, 10%, 75%);
836
+ --bio-primary: hsl(205, 100%, 40%);
837
+ --bio-primary-hover: hsl(205, 100%, 35%);
838
+ --bio-primary-surface: hsl(205, 100%, 95%);
839
+ --bio-primary-surface-strong: hsl(205, 100%, 85%);
840
+ --bio-neutral: hsl(225, 10%, 35%);
841
+ --bio-danger: hsl(360, 100%, 45%);
842
+ --bio-danger-hover: hsl(360, 100%, 40%);
843
+ --bio-danger-surface: hsl(360, 100%, 92%);
844
+ --bio-danger-surface-subtle: hsl(360, 100%, 97%);
845
+ --bio-warning: hsl(35, 84%, 62%);
846
+ --bio-warning-hover: hsl(35, 84%, 57%);
847
+ --bio-warning-text: hsl(39, 100%, 33%);
848
+ --bio-warning-surface: hsl(38, 100%, 96%);
849
+ --bio-info: hsl(205, 100%, 40%);
850
+ --bio-info-on-inverted: hsl(218, 100%, 74%);
851
+ --bio-focus: hsl(205, 100%, 40%);
852
+ --bio-focus-ring: hsla(205, 100%, 40%, 0.35);
853
+ --bio-focus-ring-danger: hsla(360, 100%, 45%, 0.35);
854
+ --bio-focus-ring-warning: hsla(35, 84%, 62%, 0.35);
855
+ --bio-shadow: hsla(0, 0%, 0%, 30%);
856
+ --bio-shadow-subtle: hsla(0, 0%, 0%, 10%);
857
+ --bio-radius-sm: 2px;
858
+ --bio-radius-lg: 4px;
886
859
  }
887
860
 
888
861
  .bio-properties-panel {
889
- --text-base-color: var(--color-grey-225-10-15);
890
- --text-error-color: var(--color-red-360-100-45);
891
- --link-color: var(--color-blue-205-100-50);
892
- --description-color: var(--color-grey-225-10-35);
893
- --description-code-background-color: var(--color-grey-225-10-97);
894
- --description-code-border-color: var(--color-grey-225-10-85);
895
- --description-list-item-color: var(--color-grey-225-10-35);
896
- --tooltip-underline-color: var(--color-grey-225-10-55);
897
- --placeholder-color: var(--color-grey-225-10-35);
898
- --placeholder-background-color: var(--color-grey-225-10-95);
899
- --header-background-color: var(--color-grey-225-10-95);
900
- --header-icon-fill-color: var(--color-grey-225-10-15);
901
- --header-bottom-border-color: var(--color-grey-225-10-75);
902
- --group-background-color: var(--color-white);
903
- --group-bottom-border-color: var(--color-grey-225-10-75);
904
- --sticky-group-background-color: var(--color-grey-225-10-95);
905
- --sticky-group-bottom-border-color: var(--color-grey-225-10-75);
906
- --add-entry-fill-color: var(--color-grey-225-10-35);
907
- --add-entry-hover-fill-color: var(--color-white);
908
- --add-entry-hover-background-color: var(--color-blue-205-100-50);
909
- --add-entry-label-color: var(--color-white);
910
- --remove-entry-fill-color: var(--color-red-360-100-45);
911
- --remove-entry-hover-background-color: var(--color-red-360-100-92);
912
- --arrow-fill-color: var(--color-grey-225-10-35);
913
- --arrow-hover-background-color: var(--color-grey-225-10-95);
914
- --dot-color: var(--color-grey-225-10-35);
915
- --dot-color-error: var(--color-red-360-100-45);
916
- --list-badge-color: var(--color-white);
917
- --list-badge-background-color: var(--color-grey-225-10-35);
918
- --input-background-color: var(--color-grey-225-10-97);
919
- --input-border-color: var(--color-grey-225-10-75);
920
- --input-focus-background-color: var(--color-blue-205-100-95);
921
- --input-focus-border-color: var(--color-blue-205-100-50);
922
- --focus-outline-color: var(--color-blue-205-100-40);
923
- --input-error-background-color: var(--color-red-360-100-97);
924
- --input-error-border-color: var(--color-red-360-100-45);
925
- --input-error-focus-border-color: var(--color-red-360-100-45);
926
- --input-disabled-color: var(--color-grey-225-10-55);
927
- --input-disabled-background-color: var(--color-grey-225-10-97);
928
- --input-disabled-border-color: var(--color-grey-225-10-90);
929
- --toggle-switch-on-background-color: var(--color-blue-205-100-50);
930
- --toggle-switch-off-background-color: var(--color-grey-225-10-75);
931
- --toggle-switch-switcher-background-color: var(--color-white);
932
- --side-line-background-color: var(--color-grey-225-10-35);
933
- --side-line-extension-background-color: var(--color-grey-225-10-35);
934
- --list-entry-dot-background-color: var(--color-grey-225-10-35);
935
- --list-entry-header-button-fill-color: var(--color-grey-225-10-35);
936
- --list-entry-add-entry-empty-background-color: var(--color-blue-205-100-50);
937
- --list-entry-add-entry-empty-hover-background-color: var(--color-blue-205-100-45);
938
- --list-entry-add-entry-label-color: var(--color-white);
939
- --list-entry-add-entry-background-color: var(--color-blue-205-100-50);
940
- --list-entry-add-entry-fill-color: var(--color-white);
941
- --dropdown-item-background-color: var(--color-white);
942
- --dropdown-item-hover-background-color: var(--color-grey-225-10-95);
943
- --dropdown-separator-background-color: var(--color-grey-225-10-75);
862
+ --text-base-color: var(--bio-text);
863
+ --text-error-color: var(--bio-danger);
864
+ --text-warning-color: var(--bio-warning-text);
865
+ --accent-color: var(--bio-primary);
866
+ --accent-hover-color: var(--bio-primary-hover);
867
+ --link-color: var(--bio-info);
868
+ --description-color: var(--bio-text-subtle);
869
+ --description-code-background-color: var(--bio-surface-subtle);
870
+ --description-code-border-color: var(--bio-border-subtle);
871
+ --description-list-item-color: var(--bio-text-subtle);
872
+ --tooltip-underline-color: var(--bio-text-subtlest);
873
+ --placeholder-color: var(--bio-text-subtle);
874
+ --placeholder-background-color: var(--bio-surface-medium);
875
+ --header-background-color: var(--bio-surface-medium);
876
+ --header-icon-fill-color: var(--bio-text);
877
+ --header-bottom-border-color: var(--bio-border);
878
+ --group-background-color: var(--bio-surface);
879
+ --group-bottom-border-color: var(--bio-border);
880
+ --sticky-group-background-color: var(--bio-surface-medium);
881
+ --sticky-list-entry-background-color: var(--bio-surface);
882
+ --sticky-group-bottom-border-color: var(--bio-border);
883
+ --add-entry-fill-color: var(--bio-text-subtle);
884
+ --add-entry-hover-fill-color: var(--bio-text-on-primary);
885
+ --add-entry-hover-background-color: var(--bio-primary);
886
+ --add-entry-label-color: var(--bio-text-on-primary);
887
+ --remove-entry-fill-color: var(--bio-danger);
888
+ --remove-entry-hover-background-color: var(--bio-danger-surface);
889
+ --arrow-fill-color: var(--bio-text-subtle);
890
+ --arrow-hover-background-color: var(--bio-surface-medium);
891
+ --warning-badge-background-color: var(--bio-warning);
892
+ --warning-badge-color: var(--bio-text);
893
+ --warning-badge-hover-background-color: var(--bio-warning-hover);
894
+ --error-badge-background-color: var(--bio-danger);
895
+ --error-badge-color: var(--bio-text-on-primary);
896
+ --error-badge-hover-background-color: var(--bio-danger-hover);
897
+ --accent-badge-background-color: var(--accent-color);
898
+ --accent-badge-color: var(--bio-text-on-primary);
899
+ --accent-badge-fill-color: var(--bio-text-on-primary);
900
+ --accent-badge-hover-background-color: var(--accent-hover-color);
901
+ --dot-color: var(--bio-neutral);
902
+ --dot-color-error: var(--error-badge-background-color);
903
+ --dot-color-warning: var(--warning-badge-background-color);
904
+ --list-badge-color: var(--bio-text-on-primary);
905
+ --list-badge-background-color: var(--bio-neutral);
906
+ --input-background-color: var(--bio-surface-subtle);
907
+ --input-border-color: var(--bio-border-input);
908
+ --input-border-radius: var(--bio-radius-sm);
909
+ --checkbox-size: 14px;
910
+ --checkbox-border-radius: var(--bio-radius-lg);
911
+ --checkbox-border-color: var(--input-border-color);
912
+ --checkbox-background-color: var(--input-background-color);
913
+ --checkbox-checked-background-color: var(--bio-primary);
914
+ --checkbox-checked-border-color: var(--bio-primary);
915
+ --input-focus-background-color: var(--bio-primary-surface);
916
+ --input-focus-border-color: var(--bio-primary);
917
+ --focus-outline-color: var(--bio-focus);
918
+ /**
919
+ * Focus ring — reusable, themeable primitive shared by inputs, checkboxes,
920
+ * toggles and any control with the `bio-properties-panel-focus-ring` class.
921
+ */
922
+ --focus-ring-color: var(--bio-focus-ring);
923
+ --focus-ring-error-color: var(--bio-focus-ring-danger);
924
+ --focus-ring-warning-color: var(--bio-focus-ring-warning);
925
+ --focus-ring-width: 2px;
926
+ --focus-ring-offset: 0px;
927
+ --focus-ring-offset-color: var(--group-background-color);
928
+ --input-error-background-color: var(--bio-danger-surface-subtle);
929
+ --input-error-border-color: var(--bio-danger);
930
+ --input-error-focus-border-color: var(--bio-danger);
931
+ --input-warning-background-color: var(--bio-warning-surface);
932
+ --input-warning-border-color: var(--bio-warning);
933
+ --input-warning-focus-border-color: var(--bio-warning);
934
+ --input-disabled-color: var(--bio-text-subtlest);
935
+ --input-disabled-background-color: var(--bio-surface-subtle);
936
+ --input-disabled-border-color: var(--bio-border-disabled);
937
+ --toggle-switch-on-background-color: var(--bio-primary);
938
+ --toggle-switch-off-background-color: var(--bio-border-input);
939
+ --toggle-switch-switcher-background-color: var(--bio-surface);
940
+ --side-line-background-color: var(--bio-text-subtle);
941
+ --side-line-extension-background-color: var(--bio-text-subtle);
942
+ --list-entry-dot-background-color: var(--bio-neutral);
943
+ --list-entry-header-button-fill-color: var(--bio-text-subtle);
944
+ --list-entry-add-entry-empty-background-color: var(--bio-primary);
945
+ --list-entry-add-entry-empty-hover-background-color: var(--bio-primary-hover);
946
+ --list-entry-add-entry-label-color: var(--bio-text-on-primary);
947
+ --list-entry-add-entry-background-color: var(--bio-primary);
948
+ --list-entry-add-entry-fill-color: var(--bio-text-on-primary);
949
+ --dropdown-item-background-color: var(--bio-surface-overlay);
950
+ --dropdown-item-hover-background-color: var(--bio-surface-medium);
951
+ --dropdown-separator-background-color: var(--bio-border);
944
952
  --feel-background-color: transparent;
945
- --feel-active-color: var(--color-blue-205-100-45);
946
- --feel-inactive-color: var(--color-grey-225-10-35);
947
- --feel-hover-color: var(--color-grey-225-10-15);
948
- --feel-hover-background-color: var(--color-grey-225-10-97);
953
+ --feel-active-color: var(--accent-color);
954
+ --feel-inactive-color: var(--bio-text-subtle);
955
+ --feel-hover-color: var(--bio-text);
956
+ --feel-hover-background-color: var(--bio-surface-subtle);
949
957
  --feel-active-background-color: transparent;
950
- --feel-required-color: var(--color-grey-225-10-55);
951
- --feel-open-popup-color: hsla(0, 0%, 32%, 1);
952
- --feel-open-popup-background-color: var(--color-white);
953
- --feel-open-popup-hover-color: hsla(219, 99%, 53%, 1);
954
- --feel-indicator-background-color: var(--color-grey-225-10-90);
955
- --feelers-select-color: var(--color-blue-205-100-85);
958
+ --feel-required-color: var(--bio-text-subtlest);
959
+ --feel-open-popup-color: var(--bio-text-subtle);
960
+ --feel-open-popup-background-color: var(--bio-surface-overlay);
961
+ --feel-open-popup-hover-color: var(--bio-primary);
962
+ --feel-indicator-background-color: var(--bio-surface-strong);
963
+ --feelers-select-color: var(--bio-primary-surface-strong);
956
964
  --text-size-base: 14px;
957
965
  --text-size-small: 13px;
958
966
  --text-size-smallest: 12px;
959
967
  --text-line-height: 21px;
960
- --line-height-condensed: 17px;
968
+ --line-height-condensed: 18px;
969
+ --input-height: 28px;
970
+ --description-offset: 5px;
971
+ --label-offset: 3px;
961
972
  --font-family: sans-serif;
962
973
  --font-family-monospace: monospace;
963
974
  display: flex;
@@ -1202,6 +1213,10 @@
1202
1213
  background-color: var(--dot-color);
1203
1214
  }
1204
1215
 
1216
+ .bio-properties-panel-dot--warning {
1217
+ --dot-color: var(--dot-color-warning);
1218
+ }
1219
+
1205
1220
  .bio-properties-panel-dot--error {
1206
1221
  --dot-color: var(--dot-color-error);
1207
1222
  }
@@ -1233,15 +1248,26 @@
1233
1248
  background-color: var(--list-badge-background-color);
1234
1249
  }
1235
1250
 
1251
+ .bio-properties-panel-list-badge--warning {
1252
+ --list-badge-background-color: var(--warning-badge-background-color);
1253
+ --list-badge-color: var(--warning-badge-color);
1254
+ }
1255
+
1236
1256
  .bio-properties-panel-list-badge--error {
1237
- --list-badge-background-color: var(--dot-color-error);
1257
+ --list-badge-background-color: var(--error-badge-background-color);
1258
+ --list-badge-color: var(--error-badge-color);
1259
+ }
1260
+
1261
+ .bio-properties-panel-list-badge--accent {
1262
+ --list-badge-background-color: var(--accent-badge-background-color);
1263
+ --list-badge-color: var(--accent-badge-color);
1238
1264
  }
1239
1265
 
1240
1266
  /**
1241
1267
  * Basic entries
1242
1268
  */
1243
1269
  .bio-properties-panel-entry {
1244
- margin: 2px 32px 6px 12px;
1270
+ margin: 3px 32px 6px 12px;
1245
1271
  }
1246
1272
 
1247
1273
  .bio-properties-panel-entry:last-child {
@@ -1251,7 +1277,7 @@
1251
1277
  .bio-properties-panel-label {
1252
1278
  display: block;
1253
1279
  font-size: var(--text-size-small);
1254
- margin: 2px 0 1px;
1280
+ margin: var(--label-offset) 0;
1255
1281
  }
1256
1282
 
1257
1283
  .bio-properties-panel-description,
@@ -1260,7 +1286,7 @@
1260
1286
  .bio-properties-panel-description div {
1261
1287
  color: var(--description-color);
1262
1288
  display: block;
1263
- margin: 2px 0 4px;
1289
+ margin: var(--description-offset) 0;
1264
1290
  line-height: var(--line-height-condensed);
1265
1291
  font-weight: 400;
1266
1292
  font-size: var(--text-size-small);
@@ -1304,10 +1330,24 @@
1304
1330
 
1305
1331
  .bio-properties-panel-feelers-editor.bio-properties-panel-input {
1306
1332
  padding: 0;
1333
+ min-height: var(--input-height);
1334
+ }
1335
+
1336
+ /**
1337
+ * Normalize the vertical rhythm of the feelers and JSON editors so single-line
1338
+ * editors line up with plain inputs. CodeMirror's default `.cm-content` padding
1339
+ * of `4px 0` would otherwise render them a few pixels taller than the
1340
+ * surrounding controls. (The FEEL editor already zeroes its own content padding
1341
+ * and sizes to the shared baseline, so it is intentionally left untouched.)
1342
+ */
1343
+ .bio-properties-panel-feelers-editor .cm-content,
1344
+ .bio-properties-panel-json-editor .cm-content {
1345
+ padding-top: 3px;
1346
+ padding-bottom: 2px;
1307
1347
  }
1308
1348
 
1309
1349
  .bio-properties-panel-feelers-input .cm-editor {
1310
- min-height: 32px;
1350
+ min-height: var(--input-height);
1311
1351
  max-height: 215px;
1312
1352
  background-color: transparent;
1313
1353
  }
@@ -1320,7 +1360,7 @@
1320
1360
  .bio-properties-panel-input {
1321
1361
  padding: 3px 6px 2px;
1322
1362
  border: 1px solid var(--input-border-color);
1323
- border-radius: 2px;
1363
+ border-radius: var(--input-border-radius);
1324
1364
  background-color: var(--input-background-color);
1325
1365
  font-size: var(--text-size-base);
1326
1366
  font-family: inherit;
@@ -1332,25 +1372,52 @@ textarea.bio-properties-panel-input,
1332
1372
  .bio-properties-panel-input[type=text] {
1333
1373
  display: block;
1334
1374
  width: 100%;
1375
+ min-height: var(--input-height);
1335
1376
  }
1336
1377
 
1337
- textarea.bio-properties-panel-input {
1338
- min-height: 28px;
1339
- }
1340
-
1378
+ /**
1379
+ * Focus ring
1380
+ *
1381
+ * A themeable, reusable focus indicator shared by all controls — inputs,
1382
+ * checkboxes (rendered as custom `appearance: none` controls so the ring
1383
+ * paints and follows their corners) and toggles. To reuse it in a custom
1384
+ * component, add the `bio-properties-panel-focus-ring` class to the focusable
1385
+ * element; when placed inside an entry with `has-error` it switches to the
1386
+ * error color. Tune the look via the `--focus-ring-*` variables (and
1387
+ * `--input-border-radius` / `--checkbox-border-radius` for corners).
1388
+ */
1341
1389
  .bio-properties-panel-input:focus,
1342
- .bio-properties-panel-input:focus-within {
1390
+ .bio-properties-panel-input:focus-within,
1391
+ .bio-properties-panel-toggle-switch__switcher:focus-within,
1392
+ .bio-properties-panel-focus-ring:focus,
1393
+ .bio-properties-panel-focus-ring:focus-within {
1343
1394
  outline: none;
1395
+ box-shadow: 0 0 0 var(--focus-ring-offset) var(--focus-ring-offset-color), 0 0 0 calc(var(--focus-ring-offset) + var(--focus-ring-width)) var(--focus-ring-color);
1396
+ }
1397
+
1398
+ /* keep focus visible where box-shadow is dropped (e.g. Windows High Contrast) */
1399
+ @media (forced-colors: active) {
1400
+ .bio-properties-panel-input:focus,
1401
+ .bio-properties-panel-input:focus-within,
1402
+ .bio-properties-panel-toggle-switch__switcher:focus-within,
1403
+ .bio-properties-panel-focus-ring:focus,
1404
+ .bio-properties-panel-focus-ring:focus-within {
1405
+ outline: 2px solid Highlight;
1406
+ outline-offset: var(--focus-ring-offset);
1407
+ }
1408
+ /* the custom checkmark (SVG background) is not recolored by the OS; fall back
1409
+ to the native checkbox so the checked state stays visible */
1410
+ .bio-properties-panel-input[type=checkbox] {
1411
+ appearance: auto;
1412
+ -webkit-appearance: auto;
1413
+ }
1414
+ }
1415
+ .bio-properties-panel-input:focus:not([type=checkbox]),
1416
+ .bio-properties-panel-input:focus-within {
1344
1417
  background-color: var(--input-focus-background-color);
1345
1418
  border: 1px solid var(--input-focus-border-color);
1346
1419
  }
1347
1420
 
1348
- .bio-properties-panel-textfield:focus-within,
1349
- .bio-properties-panel-feel-entry:focus-within {
1350
- --input-background-color: var(--input-focus-background-color);
1351
- --input-border-color: var(--input-focus-border-color);
1352
- }
1353
-
1354
1421
  .bio-properties-panel-input:disabled {
1355
1422
  border-color: var(--input-disabled-border-color);
1356
1423
  background-color: var(--input-disabled-background-color);
@@ -1366,22 +1433,57 @@ select.bio-properties-panel-input {
1366
1433
  font-family: var(--font-family-monospace);
1367
1434
  }
1368
1435
 
1369
- .bio-properties-panel-input[type=checkbox], .bio-properties-panel-input[type=radio] {
1436
+ .bio-properties-panel-input[type=radio] {
1370
1437
  margin: 0;
1371
1438
  vertical-align: middle;
1372
1439
  }
1373
1440
 
1374
- .bio-properties-panel-input[type=checkbox]:focus {
1375
- outline: auto;
1376
- outline-color: var(--focus-outline-color);
1377
- outline-offset: 2px;
1441
+ /* native radios drop `box-shadow`; keep a visible outline-based focus ring */
1442
+ .bio-properties-panel-input[type=radio]:focus {
1443
+ outline: var(--focus-ring-width) solid var(--focus-ring-color);
1444
+ outline-offset: var(--focus-ring-offset);
1445
+ }
1446
+
1447
+ /**
1448
+ * Checkbox
1449
+ *
1450
+ * Rendered as a custom control (`appearance: none`) following shadcn/ui: native
1451
+ * checkboxes drop `box-shadow`, so the shared focus ring could never paint on
1452
+ * them and fell back to the browser's square outline. As a custom element the
1453
+ * box-shadow ring renders and follows `border-radius`, giving a properly rounded
1454
+ * ring — no checkbox-specific focus rule needed. Themeable via `--checkbox-*`.
1455
+ */
1456
+ .bio-properties-panel-input[type=checkbox] {
1457
+ appearance: none;
1458
+ -webkit-appearance: none;
1459
+ box-sizing: border-box;
1460
+ width: var(--checkbox-size);
1461
+ height: var(--checkbox-size);
1462
+ margin: 0;
1463
+ padding: 0;
1464
+ vertical-align: middle;
1465
+ border: 1px solid var(--checkbox-border-color);
1466
+ border-radius: var(--checkbox-border-radius);
1467
+ background: var(--checkbox-background-color) center/contain no-repeat;
1468
+ cursor: pointer;
1469
+ }
1470
+
1471
+ .bio-properties-panel-input[type=checkbox]:checked {
1472
+ border-color: var(--checkbox-checked-border-color);
1473
+ background-color: var(--checkbox-checked-background-color);
1474
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M13 4.5 6.5 11.5 3 8'/%3E%3C/svg%3E");
1475
+ }
1476
+
1477
+ .bio-properties-panel-input[type=checkbox]:disabled {
1478
+ cursor: not-allowed;
1479
+ border-color: var(--input-disabled-border-color);
1480
+ background-color: var(--input-disabled-background-color);
1378
1481
  }
1379
1482
 
1380
1483
  .bio-properties-panel-checkbox > .bio-properties-panel-label {
1381
1484
  display: inline-block;
1382
1485
  font-size: var(--text-size-base);
1383
1486
  margin-left: 6px;
1384
- margin-top: auto;
1385
1487
  vertical-align: middle;
1386
1488
  }
1387
1489
 
@@ -1397,6 +1499,36 @@ textarea.bio-properties-panel-input {
1397
1499
  resize: vertical;
1398
1500
  }
1399
1501
 
1502
+ textarea.bio-properties-panel-input.auto-resize {
1503
+ /* auto-resizing textareas grow with their content, so manual resizing is pointless */
1504
+ resize: none;
1505
+ field-sizing: content;
1506
+ }
1507
+
1508
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-input,
1509
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-feel-editor__open-popup-placeholder {
1510
+ border-color: var(--input-warning-border-color);
1511
+ background-color: var(--input-warning-background-color);
1512
+ }
1513
+
1514
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-feel-indicator {
1515
+ border-color: var(--input-warning-border-color);
1516
+ }
1517
+
1518
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-input:focus,
1519
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-input:focus-within,
1520
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-feel-indicator:focus {
1521
+ border-color: var(--input-warning-focus-border-color);
1522
+ }
1523
+
1524
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-input:focus,
1525
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-input:focus-within,
1526
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-toggle-switch__switcher:focus-within,
1527
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-focus-ring:focus,
1528
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-focus-ring:focus-within {
1529
+ --focus-ring-color: var(--focus-ring-warning-color);
1530
+ }
1531
+
1400
1532
  .bio-properties-panel-entry.has-error .bio-properties-panel-input,
1401
1533
  .bio-properties-panel-entry.has-error .bio-properties-panel-feel-editor__open-popup-placeholder {
1402
1534
  border-color: var(--input-error-border-color);
@@ -1408,14 +1540,32 @@ textarea.bio-properties-panel-input {
1408
1540
  }
1409
1541
 
1410
1542
  .bio-properties-panel-entry.has-error .bio-properties-panel-input:focus,
1543
+ .bio-properties-panel-entry.has-error .bio-properties-panel-input:focus-within,
1411
1544
  .bio-properties-panel-entry.has-error .bio-properties-panel-feel-indicator:focus {
1412
1545
  border-color: var(--input-error-focus-border-color);
1413
1546
  }
1414
1547
 
1415
- .bio-properties-panel-entry .bio-properties-panel-error {
1416
- color: var(--text-error-color);
1417
- margin: 4px 0;
1548
+ .bio-properties-panel-entry.has-error .bio-properties-panel-input:focus,
1549
+ .bio-properties-panel-entry.has-error .bio-properties-panel-input:focus-within,
1550
+ .bio-properties-panel-entry.has-error .bio-properties-panel-toggle-switch__switcher:focus-within,
1551
+ .bio-properties-panel-entry.has-error .bio-properties-panel-focus-ring:focus,
1552
+ .bio-properties-panel-entry.has-error .bio-properties-panel-focus-ring:focus-within {
1553
+ --focus-ring-color: var(--focus-ring-error-color);
1554
+ }
1555
+
1556
+ .bio-properties-panel-warning,
1557
+ .bio-properties-panel-error {
1558
+ margin: var(--description-offset) 0;
1418
1559
  font-size: var(--text-size-small);
1560
+ line-height: var(--line-height-condensed);
1561
+ }
1562
+
1563
+ .bio-properties-panel-warning {
1564
+ color: var(--text-warning-color);
1565
+ }
1566
+
1567
+ .bio-properties-panel-error {
1568
+ color: var(--text-error-color);
1419
1569
  }
1420
1570
 
1421
1571
  .bio-properties-panel-simple {
@@ -1432,6 +1582,7 @@ textarea.bio-properties-panel-input {
1432
1582
  */
1433
1583
  .bio-properties-panel-json-editor .bio-properties-panel-input {
1434
1584
  padding: 0;
1585
+ min-height: var(--input-height);
1435
1586
  }
1436
1587
 
1437
1588
  .bio-properties-panel-json-editor .cm-editor {
@@ -1491,11 +1642,7 @@ textarea.bio-properties-panel-input {
1491
1642
  position: relative;
1492
1643
  width: 32px;
1493
1644
  height: 16px;
1494
- }
1495
-
1496
- .bio-properties-panel-toggle-switch .bio-properties-panel-toggle-switch__switcher:focus-within {
1497
- outline: 2px solid var(--input-focus-border-color);
1498
- outline-offset: 1px;
1645
+ border-radius: 34px;
1499
1646
  }
1500
1647
 
1501
1648
  .bio-properties-panel-toggle-switch .bio-properties-panel-toggle-switch__switcher input[type=checkbox] {
@@ -1674,7 +1821,7 @@ textarea.bio-properties-panel-input {
1674
1821
  }
1675
1822
 
1676
1823
  .bio-properties-panel-list-entry-header.sticky {
1677
- background-color: var(--color-white);
1824
+ background-color: var(--sticky-list-entry-background-color);
1678
1825
  border-bottom: 1px solid var(--sticky-group-bottom-border-color);
1679
1826
  top: 32px;
1680
1827
  z-index: 9;
@@ -1822,7 +1969,7 @@ textarea.bio-properties-panel-input {
1822
1969
  z-index: 101;
1823
1970
  background-color: var(--dropdown-item-background-color);
1824
1971
  padding: 8px 0;
1825
- box-shadow: 0 1px 4px 0 var(--color-grey-225-10-85), 0 2px 16px 0 var(--color-grey-225-10-75);
1972
+ box-shadow: 0 1px 4px 0 var(--bio-shadow-subtle), 0 2px 16px 0 var(--bio-shadow);
1826
1973
  }
1827
1974
 
1828
1975
  .bio-properties-panel-dropdown-button__menu-item {
@@ -1931,7 +2078,17 @@ textarea.bio-properties-panel-input {
1931
2078
  .bio-properties-panel-feel-container .bio-properties-panel-feel-editor-container > div {
1932
2079
  position: static;
1933
2080
  padding-left: 2.4em !important;
1934
- min-height: 28px;
2081
+ min-height: var(--input-height);
2082
+ }
2083
+
2084
+ /* reserve space on the first line for the open pop-up button, only while the input is focused or hovered */
2085
+ .bio-properties-panel-feel-container .bio-properties-panel-feel-editor-container:is(:hover, :focus-within) .cm-line:first-child::before,
2086
+ .bio-properties-panel-feelers-input .bio-properties-panel-feelers-editor-container:is(:hover, :focus-within) .cm-line:first-child::before,
2087
+ .bio-properties-panel-feel-container .bio-properties-panel-feelers-editor-container:is(:hover, :focus-within) .cm-line:first-child::before {
2088
+ content: "";
2089
+ float: right;
2090
+ width: 1.7em;
2091
+ height: 1.5em;
1935
2092
  }
1936
2093
 
1937
2094
  .bio-properties-panel-feel-indicator {
@@ -1939,7 +2096,7 @@ textarea.bio-properties-panel-input {
1939
2096
  border: 1px solid var(--input-border-color);
1940
2097
  background-color: var(--feel-indicator-background-color);
1941
2098
  border-right: 0px;
1942
- border-radius: 2px 0 0 2px;
2099
+ border-radius: var(--input-border-radius) 0 0 var(--input-border-radius);
1943
2100
  z-index: 1;
1944
2101
  height: 100%;
1945
2102
  width: 2em;
@@ -1947,6 +2104,23 @@ textarea.bio-properties-panel-input {
1947
2104
  padding: 2px 6px;
1948
2105
  }
1949
2106
 
2107
+ /**
2108
+ * `:has()` so the indicator tracks real editor focus only — a plain
2109
+ * `:focus-within` would also match the sibling pop-out button. Degrades to a
2110
+ * neutral border where `:has()` is unsupported.
2111
+ */
2112
+ .bio-properties-panel-feel-container:has(.bio-properties-panel-input:focus-within) .bio-properties-panel-feel-indicator {
2113
+ border-color: var(--input-focus-border-color);
2114
+ }
2115
+
2116
+ .bio-properties-panel-entry.has-warning .bio-properties-panel-feel-container:has(.bio-properties-panel-input:focus-within) .bio-properties-panel-feel-indicator {
2117
+ border-color: var(--input-warning-focus-border-color);
2118
+ }
2119
+
2120
+ .bio-properties-panel-entry.has-error .bio-properties-panel-feel-container:has(.bio-properties-panel-input:focus-within) .bio-properties-panel-feel-indicator {
2121
+ border-color: var(--input-error-focus-border-color);
2122
+ }
2123
+
1950
2124
  .bio-properties-panel-feel-editor-container .cm-scroller {
1951
2125
  overflow: hidden !important;
1952
2126
  }
@@ -2011,12 +2185,13 @@ textarea.bio-properties-panel-input {
2011
2185
  }
2012
2186
 
2013
2187
  .bio-properties-panel-tooltip {
2014
- --tooltip-background-color: var(--color-grey-0-0-22);
2015
- --tooltip-link: var(--color-blue-218-100-74);
2016
- --tooltip-code-background-color: var(--color-grey-225-10-97);
2017
- --tooltip-code-border-color: var(--color-grey-225-10-85);
2188
+ --tooltip-background-color: var(--bio-surface-inverted);
2189
+ --tooltip-color: var(--bio-text-on-inverted);
2190
+ --tooltip-link: var(--bio-info-on-inverted);
2191
+ --tooltip-code-background-color: var(--bio-surface-subtle);
2192
+ --tooltip-code-border-color: var(--bio-border-subtle);
2018
2193
  display: flex;
2019
- color: var(--color-white, white);
2194
+ color: var(--tooltip-color);
2020
2195
  position: fixed;
2021
2196
  z-index: 1001;
2022
2197
  max-width: 300px;
@@ -2089,15 +2264,20 @@ textarea.bio-properties-panel-input {
2089
2264
  transform: rotate(90deg);
2090
2265
  }
2091
2266
 
2267
+ .bio-properties-panel-textarea-container {
2268
+ position: relative;
2269
+ }
2270
+
2092
2271
  .bio-properties-panel-feelers-editor-container .bio-properties-panel-feelers-editor__open-popup-placeholder,
2093
- .bio-properties-panel-feel-editor-container .bio-properties-panel-feel-editor__open-popup-placeholder {
2272
+ .bio-properties-panel-feel-editor-container .bio-properties-panel-feel-editor__open-popup-placeholder,
2273
+ .bio-properties-panel-textarea-container .bio-properties-panel-textarea__open-popup-placeholder {
2094
2274
  display: none;
2095
2275
  justify-content: center;
2096
2276
  flex-direction: column;
2097
2277
  color: hsla(0, 0%, 9%, 0.25);
2098
2278
  padding: 3px 6px 2px;
2099
2279
  border: 1px solid var(--input-border-color);
2100
- border-radius: 2px;
2280
+ border-radius: var(--input-border-radius);
2101
2281
  background-color: var(--input-background-color);
2102
2282
  font-size: var(--text-size-base);
2103
2283
  font-family: inherit;
@@ -2110,18 +2290,29 @@ textarea.bio-properties-panel-input {
2110
2290
  display: none;
2111
2291
  }
2112
2292
 
2293
+ .bio-properties-panel-textarea-container.popupOpen .bio-properties-panel-input {
2294
+ visibility: hidden;
2295
+ }
2296
+
2113
2297
  .bio-properties-panel-feelers-editor-container.popupOpen .bio-properties-panel-feelers-editor__open-popup-placeholder,
2114
- .bio-properties-panel-feel-editor-container.popupOpen .bio-properties-panel-feel-editor__open-popup-placeholder {
2298
+ .bio-properties-panel-feel-editor-container.popupOpen .bio-properties-panel-feel-editor__open-popup-placeholder,
2299
+ .bio-properties-panel-textarea-container.popupOpen .bio-properties-panel-textarea__open-popup-placeholder {
2115
2300
  display: flex;
2116
2301
  }
2117
2302
 
2303
+ .bio-properties-panel-textarea-container.popupOpen .bio-properties-panel-textarea__open-popup-placeholder {
2304
+ position: absolute;
2305
+ inset: 0;
2306
+ justify-content: flex-start;
2307
+ }
2308
+
2118
2309
  .bio-properties-panel-popup {
2119
- --popup-background-color: hsla(0, 0%, 96%, 1);
2120
- --popup-header-background-color: white;
2121
- --popup-font-color: hsla(0, 0%, 0%, 1);
2122
- --popup-title-color: hsla(0, 0%, 0%, 1);
2123
- --feel-popup-close-background-color: hsla(219, 99%, 53%, 1);
2124
- --feel-popup-gutters-background-color: hsla(0, 0%, 90%, 1);
2310
+ --popup-background-color: var(--bio-surface-subtle);
2311
+ --popup-header-background-color: var(--bio-surface);
2312
+ --popup-font-color: var(--bio-text);
2313
+ --popup-title-color: var(--bio-text);
2314
+ --feel-popup-close-background-color: var(--bio-primary);
2315
+ --feel-popup-gutters-background-color: var(--bio-surface-strong);
2125
2316
  position: fixed;
2126
2317
  display: flex;
2127
2318
  flex: auto;
@@ -2138,6 +2329,15 @@ textarea.bio-properties-panel-input {
2138
2329
  font-size: 14px;
2139
2330
  }
2140
2331
 
2332
+ /**
2333
+ * Popups render through a portal outside `.bio-properties-panel`, so re-apply
2334
+ * the global box-sizing reset here.
2335
+ */
2336
+ .bio-properties-panel-popup,
2337
+ .bio-properties-panel-popup * {
2338
+ box-sizing: border-box;
2339
+ }
2340
+
2141
2341
  .bio-properties-panel-popup h1,
2142
2342
  .bio-properties-panel-popup h2,
2143
2343
  .bio-properties-panel-popup h3,
@@ -2189,6 +2389,7 @@ textarea.bio-properties-panel-input {
2189
2389
 
2190
2390
  .bio-properties-panel-popup .bio-properties-panel-popup__title {
2191
2391
  margin-left: 8px;
2392
+ margin-right: auto;
2192
2393
  }
2193
2394
 
2194
2395
  .bio-properties-panel-popup .bio-properties-panel-popup__title::first-letter {
@@ -2238,11 +2439,6 @@ textarea.bio-properties-panel-input {
2238
2439
  right: 8px;
2239
2440
  }
2240
2441
 
2241
- .bio-properties-panel-feel-popup {
2242
- min-height: 400px;
2243
- width: fit-content;
2244
- }
2245
-
2246
2442
  .bio-properties-panel-feel-popup .bio-properties-panel-feel-popup__body {
2247
2443
  display: flex;
2248
2444
  margin: 0;
@@ -2302,36 +2498,42 @@ textarea.bio-properties-panel-input {
2302
2498
  }
2303
2499
 
2304
2500
  .bio-properties-panel-feelers-editor-container .bio-properties-panel-open-feel-popup,
2305
- .bio-properties-panel-feel-container .bio-properties-panel-open-feel-popup {
2501
+ .bio-properties-panel-feel-container .bio-properties-panel-open-feel-popup,
2502
+ .bio-properties-panel-textarea-container .bio-properties-panel-open-feel-popup {
2306
2503
  position: absolute;
2307
- top: 0;
2504
+ top: 4px;
2308
2505
  right: 0;
2309
2506
  line-height: 1;
2310
- padding: 3px 4px;
2311
- margin: 3px;
2507
+ padding: 2px 4px;
2508
+ margin: 0 3px;
2312
2509
  display: none;
2313
2510
  background: none;
2314
2511
  border: none;
2315
- color: var(--feel-open-popup-color);
2512
+ fill: var(--feel-open-popup-color);
2316
2513
  cursor: pointer;
2317
2514
  }
2318
2515
 
2319
2516
  .bio-properties-panel-feelers-editor-container .bio-properties-panel-open-feel-popup svg,
2320
- .bio-properties-panel-feel-container .bio-properties-panel-open-feel-popup svg {
2517
+ .bio-properties-panel-feel-container .bio-properties-panel-open-feel-popup svg,
2518
+ .bio-properties-panel-textarea-container .bio-properties-panel-open-feel-popup svg {
2519
+ display: block;
2321
2520
  width: 16px;
2322
2521
  height: 16px;
2323
2522
  }
2324
2523
 
2325
2524
  .bio-properties-panel-feelers-editor-container:hover .bio-properties-panel-open-feel-popup,
2326
2525
  .bio-properties-panel-feel-container:hover .bio-properties-panel-open-feel-popup,
2526
+ .bio-properties-panel-textarea-container:hover .bio-properties-panel-open-feel-popup,
2327
2527
  .bio-properties-panel-feelers-editor-container:focus-within .bio-properties-panel-open-feel-popup,
2328
- .bio-properties-panel-feel-container:focus-within .bio-properties-panel-open-feel-popup {
2528
+ .bio-properties-panel-feel-container:focus-within .bio-properties-panel-open-feel-popup,
2529
+ .bio-properties-panel-textarea-container:focus-within .bio-properties-panel-open-feel-popup {
2329
2530
  display: block;
2330
2531
  }
2331
2532
 
2332
2533
  .bio-properties-panel-feelers-editor-container .bio-properties-panel-open-feel-popup:hover,
2333
- .bio-properties-panel-feel-container .bio-properties-panel-open-feel-popup:hover {
2334
- color: var(--feel-open-popup-hover-color);
2534
+ .bio-properties-panel-feel-container .bio-properties-panel-open-feel-popup:hover,
2535
+ .bio-properties-panel-textarea-container .bio-properties-panel-open-feel-popup:hover {
2536
+ fill: var(--feel-open-popup-hover-color);
2335
2537
  }
2336
2538
 
2337
2539
  .bio-properties-panel-feel-popup .bio-properties-panel-popup__footer .bio-properties-panel-feel-popup__close-btn {
@@ -2373,6 +2575,15 @@ textarea.bio-properties-panel-input {
2373
2575
  text-align: center;
2374
2576
  }
2375
2577
 
2578
+ .bio-properties-panel-text-popup .bio-properties-panel-input {
2579
+ width: 100%;
2580
+ height: 100%;
2581
+ min-height: 100%;
2582
+ resize: none;
2583
+ border: none;
2584
+ padding: 8px 12px;
2585
+ }
2586
+
2376
2587
  /* Checkbox Group */
2377
2588
  .bio-properties-panel-checkbox-group .bio-properties-panel-checkbox-group-entries > .bio-properties-panel-entry {
2378
2589
  margin: 0;