@ethlete/components 1.0.0-next.73 → 1.0.0-next.75

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 (47) hide show
  1. package/CHANGELOG.md +76 -0
  2. package/design/form-field.ts +1 -0
  3. package/design/select.ts +1 -1
  4. package/fesm2022/ethlete-components.mjs +1283 -711
  5. package/fesm2022/ethlete-components.mjs.map +1 -1
  6. package/package.json +1 -1
  7. package/src/lib/accordion/accordion.component.css +40 -24
  8. package/src/lib/carousel/carousel-transition-styles.component.css +1 -1
  9. package/src/lib/carousel/carousel.component.css +16 -0
  10. package/src/lib/command-palette/command-palette-item.component.css +4 -0
  11. package/src/lib/command-palette/command-palette.component.css +48 -0
  12. package/src/lib/divider/divider.component.css +7 -3
  13. package/src/lib/forms/cascader/cascader-panel.component.css +4 -6
  14. package/src/lib/forms/color-input/color-picker-panel.component.css +1 -1
  15. package/src/lib/forms/date-time/date-picker-panel.component.css +3 -41
  16. package/src/lib/forms/form-field/form-field-control-suffix-styles.component.css +49 -0
  17. package/src/lib/forms/form-field/form-field-suffix-overlap-styles.component.css +27 -0
  18. package/src/lib/forms/form-field/form-field-text-shell-styles.component.css +9 -12
  19. package/src/lib/forms/rich-text-editor/rich-text-editor-token-popup.component.css +4 -0
  20. package/src/lib/forms/select/select-option-group.component.css +4 -3
  21. package/src/lib/forms/select/select-option-styles.component.css +5 -0
  22. package/src/lib/forms/select/select-panel.component.css +14 -6
  23. package/src/lib/forms/select/select.component.css +77 -10
  24. package/src/lib/loader/progress-bar/progress-bar.component.css +1 -0
  25. package/src/lib/menu/menu-search-styles.component.css +27 -0
  26. package/src/lib/menu/menu.component.css +3 -7
  27. package/src/lib/notification/notification.component.css +4 -0
  28. package/src/lib/overlay/floating-panel-styles.component.css +2 -57
  29. package/src/lib/overlay/floating-tip-styles.component.css +0 -3
  30. package/src/lib/overlay/routing/overlay-router-outlet.component.css +8 -0
  31. package/src/lib/overlay/sidebar/overlay-sidebar.component.css +8 -1
  32. package/src/lib/overlay/strategies/anchored-dialog-styles.component.css +27 -0
  33. package/src/lib/overlay/strategies/dialog-styles.component.css +27 -0
  34. package/src/lib/overlay/strategies/full-screen-dialog-styles.component.css +58 -0
  35. package/src/lib/overlay/strategies/overlay-origin-clone.component.css +29 -0
  36. package/src/lib/overlay/strategies/sheet-styles.component.css +8 -0
  37. package/src/lib/pagination/page-size-select.component.css +0 -96
  38. package/src/lib/pagination/pagination.component.css +1 -22
  39. package/src/lib/progress-steps/progress-step.component.css +6 -0
  40. package/src/lib/scheduler/scheduler-agenda-view.component.css +9 -0
  41. package/src/lib/scheduler/scheduler-time-grid-view.component.css +5 -0
  42. package/src/lib/scrollable/headless/scrollable-buttons.component.css +8 -1
  43. package/src/lib/scrollable/headless/scrollable-footer.css +12 -0
  44. package/src/lib/scrollable/headless/scrollable-masks.component.css +37 -0
  45. package/src/lib/scrollbar/scrollbar.component.css +8 -2
  46. package/types/ethlete-components.d.ts +92 -28
  47. /package/src/lib/loader/spinner/{spinner.component.css → spinner-styles.component.css} +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ethlete/components",
3
- "version": "1.0.0-next.73",
3
+ "version": "1.0.0-next.75",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/ethlete-io/ethdk",
@@ -47,7 +47,6 @@
47
47
  display: block;
48
48
  color: var(--et-surface-color-solid, CanvasText);
49
49
  border-block-end: 1px solid var(--_et-accordion-border-color);
50
- transition: border-color var(--et-accordion-color-duration) ease;
51
50
 
52
51
  /* The hover lives on the trigger and the border on the host, so this has to reach back up with
53
52
  `:has()` - moving the rule onto `.et-accordion-trigger` would silently stop it applying. */
@@ -63,7 +62,10 @@
63
62
  }
64
63
 
65
64
  .et-accordion-heading {
65
+ --_et-accordion-tint-inset: min(4px, var(--et-accordion-padding-block));
66
+
66
67
  display: block;
68
+ padding-block: var(--_et-accordion-tint-inset);
67
69
  }
68
70
 
69
71
  .et-accordion-trigger {
@@ -73,7 +75,8 @@
73
75
  align-items: center;
74
76
  gap: var(--et-accordion-gap);
75
77
  inline-size: 100%;
76
- padding: var(--et-accordion-padding-block) var(--et-accordion-padding-inline);
78
+ padding: calc(var(--et-accordion-padding-block) - var(--_et-accordion-tint-inset))
79
+ var(--et-accordion-padding-inline);
77
80
  border: 0;
78
81
  border-radius: var(--et-accordion-radius);
79
82
  background: transparent;
@@ -82,7 +85,6 @@
82
85
  font-weight: 500;
83
86
  text-align: start;
84
87
  cursor: pointer;
85
- transition: background-color var(--et-accordion-color-duration) ease;
86
88
 
87
89
  @media (hover: hover) {
88
90
  &:hover {
@@ -122,7 +124,6 @@
122
124
  flex: none;
123
125
  color: var(--_et-accordion-secondary-color);
124
126
  font-weight: 400;
125
- transition: color var(--et-accordion-color-duration) ease;
126
127
  }
127
128
 
128
129
  .et-accordion-chevron {
@@ -131,9 +132,6 @@
131
132
  block-size: var(--et-accordion-chevron-size);
132
133
  color: var(--_et-accordion-secondary-color);
133
134
  rotate: 180deg;
134
- transition:
135
- rotate var(--et-accordion-duration) cubic-bezier(0.25, 0, 0.1, 1),
136
- color var(--et-accordion-color-duration) ease;
137
135
  }
138
136
 
139
137
  &[aria-expanded='true'] .et-accordion-chevron {
@@ -145,16 +143,45 @@
145
143
  display: grid;
146
144
  grid-template-rows: 0fr;
147
145
  visibility: hidden;
148
- transition:
149
- grid-template-rows var(--et-accordion-duration) cubic-bezier(0.25, 0, 0.1, 1),
150
- visibility 0s linear var(--et-accordion-duration);
151
146
 
152
147
  &:where([data-open]) {
153
148
  grid-template-rows: 1fr;
154
149
  visibility: visible;
155
- transition:
156
- grid-template-rows var(--et-accordion-duration) cubic-bezier(0.25, 0, 0.1, 1),
157
- visibility 0s linear 0s;
150
+ }
151
+ }
152
+
153
+ .et-accordion:where([data-can-animate]) {
154
+ transition: border-color var(--et-accordion-color-duration) ease;
155
+
156
+ > .et-accordion-heading > .et-accordion-trigger {
157
+ transition: background-color var(--et-accordion-color-duration) ease;
158
+
159
+ .et-accordion-hint,
160
+ .et-accordion-chevron {
161
+ transition: color var(--et-accordion-color-duration) ease;
162
+ }
163
+ }
164
+ }
165
+
166
+ @media (prefers-reduced-motion: no-preference) {
167
+ .et-accordion:where([data-can-animate]) {
168
+ > .et-accordion-panel {
169
+ transition:
170
+ grid-template-rows var(--et-accordion-duration) cubic-bezier(0.25, 0, 0.1, 1),
171
+ visibility 0s linear var(--et-accordion-duration);
172
+
173
+ &:where([data-open]) {
174
+ transition:
175
+ grid-template-rows var(--et-accordion-duration) cubic-bezier(0.25, 0, 0.1, 1),
176
+ visibility 0s linear 0s;
177
+ }
178
+ }
179
+
180
+ > .et-accordion-heading > .et-accordion-trigger > .et-accordion-chevron {
181
+ transition:
182
+ rotate var(--et-accordion-duration) cubic-bezier(0.25, 0, 0.1, 1),
183
+ color var(--et-accordion-color-duration) ease;
184
+ }
158
185
  }
159
186
  }
160
187
 
@@ -171,15 +198,4 @@
171
198
  padding-block-end: var(--et-accordion-padding-block);
172
199
  padding-inline: var(--et-accordion-padding-inline);
173
200
  }
174
-
175
- @media (prefers-reduced-motion: reduce) {
176
- .et-accordion-panel,
177
- .et-accordion-panel:where([data-open]) {
178
- transition: none;
179
- }
180
-
181
- .et-accordion-trigger .et-accordion-chevron {
182
- transition: color var(--et-accordion-color-duration) ease;
183
- }
184
- }
185
201
  }
@@ -9,7 +9,7 @@
9
9
  @property --et-carousel-wipe-shift {
10
10
  syntax: '<length>';
11
11
  inherits: true;
12
- initial-value: 125px;
12
+ initial-value: 0px;
13
13
  }
14
14
 
15
15
  @property --et-carousel-wipe-dim {
@@ -37,11 +37,27 @@
37
37
  gap: var(--et-carousel-gap);
38
38
  }
39
39
 
40
+ /* `overflow-x: auto` forces a clip on the cross axis too; without the bleed it sits on the slide's own
41
+ border, which fractional device pixel ratios then eat. */
40
42
  .et-carousel-track {
43
+ --_et-carousel-track-bleed: 4px;
44
+
41
45
  display: block;
46
+ margin-block: calc(var(--_et-carousel-track-bleed) * -1);
42
47
 
43
48
  & .et-scrollable-container {
44
49
  gap: var(--et-carousel-slide-gap);
50
+ padding-block: var(--_et-carousel-track-bleed);
51
+ }
52
+
53
+ &:where([direction='vertical']) {
54
+ margin-block: 0;
55
+ margin-inline: calc(var(--_et-carousel-track-bleed) * -1);
56
+
57
+ & .et-scrollable-container {
58
+ padding-block: 0;
59
+ padding-inline: var(--_et-carousel-track-bleed);
60
+ }
45
61
  }
46
62
  }
47
63
 
@@ -37,6 +37,10 @@
37
37
  padding-inline: var(--et-command-palette-item-padding-inline);
38
38
  border-radius: var(--et-command-palette-item-border-radius);
39
39
  cursor: pointer;
40
+ transition:
41
+ background 120ms ease,
42
+ color 120ms ease,
43
+ opacity 120ms ease;
40
44
 
41
45
  /* Marks the row the arrow keys reached. Not `:hover`: the pointer and the keyboard drive one
42
46
  highlight, and the component decides which row that is. */
@@ -33,6 +33,7 @@
33
33
  --_et-command-palette-color: var(--et-surface-color-solid, rgb(244 244 245));
34
34
  --_et-command-palette-muted-color: var(--et-surface-color-muted-solid, rgb(255 255 255 / 0.55));
35
35
  --_et-command-palette-border: var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
36
+ position: relative;
36
37
  display: grid;
37
38
  grid-template-rows: auto minmax(0, 1fr);
38
39
  max-block-size: var(--et-command-palette-max-height);
@@ -67,12 +68,32 @@
67
68
  }
68
69
  }
69
70
 
71
+ .et-command-palette-list-wrapper {
72
+ position: relative;
73
+ display: grid;
74
+ min-block-size: 0;
75
+ }
76
+
70
77
  .et-command-palette-list {
78
+ min-block-size: 0;
71
79
  overflow-y: auto;
72
80
  overscroll-behavior: contain;
73
81
  padding: var(--et-command-palette-padding);
74
82
  }
75
83
 
84
+ .et-command-palette-list-content {
85
+ position: relative;
86
+ }
87
+
88
+ /* Outweighs the overlay's own `.et-overlay > :not(…):not(…)` scroll rule on its content root. */
89
+ .et-overlay.et-command-palette-panel > .et-command-palette.et-command-palette--resizing {
90
+ overflow: clip;
91
+
92
+ .et-command-palette-list {
93
+ overflow: clip;
94
+ }
95
+ }
96
+
76
97
  .et-command-palette-group-label {
77
98
  margin: 0;
78
99
  padding-block: 8px 4px;
@@ -84,12 +105,39 @@
84
105
  }
85
106
 
86
107
  .et-command-palette-empty {
108
+ align-self: start;
87
109
  margin: 0;
88
110
  padding-block: 24px;
89
111
  color: var(--_et-command-palette-muted-color);
90
112
  text-align: center;
91
113
  }
92
114
 
115
+ .et-command-palette-swap--enter {
116
+ animation: et-command-palette-fade-in 150ms ease-out;
117
+ }
118
+
119
+ /* Out of flow in the same grid area, so the outgoing content never adds to the height that animates. */
120
+ .et-command-palette-swap--leave {
121
+ position: absolute;
122
+ grid-row: 2;
123
+ grid-column: 1;
124
+ inset: 0;
125
+ pointer-events: none;
126
+ animation: et-command-palette-fade-out 100ms ease-out forwards;
127
+ }
128
+
129
+ @keyframes et-command-palette-fade-in {
130
+ from {
131
+ opacity: 0;
132
+ }
133
+ }
134
+
135
+ @keyframes et-command-palette-fade-out {
136
+ to {
137
+ opacity: 0;
138
+ }
139
+ }
140
+
93
141
  /* Held near the top of the viewport rather than centered: the list grows downwards as the reader
94
142
  types, and a centered panel would shift the row under the pointer on every keystroke. */
95
143
  .et-overlay.et-command-palette-panel {
@@ -20,15 +20,19 @@
20
20
  .et-divider {
21
21
  display: block;
22
22
  flex: none;
23
- background: var(--et-divider-color, var(--et-surface-border-solid, rgb(255 255 255 / 0.1)));
24
- block-size: var(--et-divider-thickness);
23
+ block-size: 0;
24
+ border-block-start: var(--et-divider-thickness) solid
25
+ var(--et-divider-color, var(--et-surface-border-solid, rgb(255 255 255 / 0.1)));
25
26
  margin-block: var(--et-divider-spacing);
26
27
  margin-inline: var(--et-divider-inset);
27
28
 
28
29
  &:where([data-orientation='vertical']) {
29
30
  align-self: stretch;
30
31
  block-size: auto;
31
- inline-size: var(--et-divider-thickness);
32
+ inline-size: 0;
33
+ border-block-start: 0;
34
+ border-inline-start: var(--et-divider-thickness) solid
35
+ var(--et-divider-color, var(--et-surface-border-solid, rgb(255 255 255 / 0.1)));
32
36
  margin-block: var(--et-divider-inset);
33
37
  margin-inline: var(--et-divider-spacing);
34
38
  }
@@ -21,9 +21,6 @@
21
21
  }
22
22
 
23
23
  .et-overlay--cascader {
24
- --et-floating-panel-enter-duration: 140ms;
25
- --et-floating-panel-leave-duration: 100ms;
26
- --et-floating-panel-distance: 0.3rem;
27
24
  }
28
25
 
29
26
  .et-cascader-panel {
@@ -35,7 +32,8 @@
35
32
  var(--et-cascader-panel-max-block-size),
36
33
  var(--et-overlay-max-height, 100vh)
37
34
  );
38
- border-radius: 10px;
35
+ --_et-cascader-row-radius: max(2px, var(--_et-overlay-surface-radius, 10px) - 6px);
36
+ border-radius: var(--_et-overlay-surface-radius, 10px);
39
37
  border: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
40
38
  background: var(--et-surface-background-solid, rgb(32 32 32));
41
39
  color: var(--et-surface-color-solid, rgb(244 244 245));
@@ -126,7 +124,7 @@
126
124
  block-size: 36px;
127
125
  box-sizing: border-box;
128
126
  padding-inline: 10px;
129
- border-radius: 6px;
127
+ border-radius: var(--_et-cascader-row-radius);
130
128
  border: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
131
129
  background: color-mix(in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 6%, transparent);
132
130
  color: inherit;
@@ -212,7 +210,7 @@
212
210
  min-block-size: var(--et-cascader-node-height);
213
211
  padding-inline: 10px;
214
212
  border: none;
215
- border-radius: 6px;
213
+ border-radius: var(--_et-cascader-row-radius);
216
214
  background: transparent;
217
215
  font: inherit;
218
216
  text-align: start;
@@ -44,7 +44,7 @@
44
44
  max-inline-size: calc(100vw - 24px);
45
45
  overflow: hidden;
46
46
  padding: 12px;
47
- border-radius: 10px;
47
+ border-radius: var(--_et-overlay-surface-radius, 10px);
48
48
  border: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
49
49
  background: var(--et-surface-background-solid, rgb(32 32 32));
50
50
  color: var(--et-surface-color-solid, rgb(244 244 245));
@@ -6,49 +6,11 @@
6
6
  }
7
7
 
8
8
  &.et-animation-enter-active {
9
- transition:
10
- transform 140ms ease,
11
- opacity 140ms ease;
9
+ transition: opacity 140ms ease;
12
10
  }
13
11
 
14
12
  &.et-animation-leave-active {
15
- transition:
16
- transform 100ms ease,
17
- opacity 100ms ease;
18
- }
19
- }
20
-
21
- .et-overlay--date-picker[data-overlay-placement^='top'] {
22
- &.et-animation-enter-from,
23
- &.et-animation-leave-to {
24
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0) translateY(0.3rem) !important;
25
- }
26
- }
27
-
28
- .et-overlay--date-picker[data-overlay-placement^='bottom'] {
29
- &.et-animation-enter-from,
30
- &.et-animation-leave-to {
31
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0)
32
- translateY(-0.3rem) !important;
33
- }
34
- }
35
-
36
- @media (prefers-reduced-motion: reduce) {
37
- .et-overlay.et-with-default-animation.et-overlay--date-picker {
38
- &.et-animation-enter-active {
39
- transition: opacity 140ms ease;
40
- }
41
-
42
- &.et-animation-leave-active {
43
- transition: opacity 100ms ease;
44
- }
45
- }
46
-
47
- .et-overlay--date-picker[data-overlay-placement] {
48
- &.et-animation-enter-from,
49
- &.et-animation-leave-to {
50
- transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0) !important;
51
- }
13
+ transition: opacity 100ms ease;
52
14
  }
53
15
  }
54
16
 
@@ -58,7 +20,7 @@
58
20
  max-inline-size: calc(100vw - 24px);
59
21
  overflow: hidden;
60
22
  padding: 12px;
61
- border-radius: 10px;
23
+ border-radius: var(--_et-overlay-surface-radius, 10px);
62
24
  border: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
63
25
  background: var(--et-surface-background-solid, rgb(32 32 32));
64
26
  color: var(--et-surface-color-solid, rgb(244 244 245));
@@ -1,16 +1,48 @@
1
1
  @layer components {
2
2
  .et-input-clear {
3
+ --_et-input-clear-target: 24px;
4
+ --_et-input-clear-gap: var(--et-form-field-control-affix-gap, 8px);
5
+
6
+ position: relative;
7
+ z-index: 1;
3
8
  display: inline-flex;
4
9
  align-items: center;
5
10
  justify-content: center;
6
11
  flex: none;
7
12
  border: none;
13
+ outline: none;
8
14
  background: transparent;
9
15
  color: var(--et-surface-color-muted-solid, currentColor);
10
16
  padding: 0;
11
17
  margin: 0;
12
18
  cursor: pointer;
13
19
  appearance: none;
20
+ touch-action: manipulation;
21
+ transition: color 150ms ease;
22
+
23
+ &::before {
24
+ content: '';
25
+ position: absolute;
26
+ z-index: -1;
27
+ inset: -4px;
28
+ border-radius: 50%;
29
+ background: transparent;
30
+ transition: background-color 150ms ease;
31
+ pointer-events: none;
32
+ }
33
+
34
+ /* Ends halfway into the gap, so a neighbouring picker trigger's own hit area keeps the other half. */
35
+ &::after {
36
+ content: '';
37
+ position: absolute;
38
+ inset-block: calc((var(--_et-input-clear-target) - 100%) / -2);
39
+ inset-inline-end: calc(var(--_et-input-clear-gap) / -2);
40
+ inset-inline-start: calc(100% + var(--_et-input-clear-gap) / 2 - var(--_et-input-clear-target));
41
+ }
42
+
43
+ @media (pointer: coarse) {
44
+ --_et-input-clear-target: 44px;
45
+ }
14
46
 
15
47
  .et-icon {
16
48
  inline-size: var(--et-form-field-affix-icon-size, 16px);
@@ -20,9 +52,22 @@
20
52
  @media (hover: hover) {
21
53
  &:hover {
22
54
  color: var(--et-surface-color-solid, currentColor);
55
+
56
+ &::before {
57
+ background: color-mix(in srgb, var(--et-surface-interaction-solid, currentColor) 20%, transparent);
58
+ }
23
59
  }
24
60
  }
25
61
 
62
+ &:active::before {
63
+ background: color-mix(in srgb, var(--et-surface-interaction-solid, currentColor) 28%, transparent);
64
+ }
65
+
66
+ &:focus-visible::before {
67
+ outline: 2px solid var(--et-theme-color-primary-solid, currentColor);
68
+ outline-offset: 1px;
69
+ }
70
+
26
71
  &.et-input-clear--enter {
27
72
  animation: et-input-clear-in 150ms ease;
28
73
  }
@@ -100,6 +145,10 @@
100
145
  color: var(--et-surface-color-muted-solid, currentColor);
101
146
  }
102
147
  }
148
+
149
+ &::before {
150
+ background: transparent;
151
+ }
103
152
  }
104
153
 
105
154
  @keyframes et-input-clear-in {
@@ -5,6 +5,21 @@
5
5
  .et-form-field-busy-spinner {
6
6
  flex: none;
7
7
  color: var(--et-surface-color-muted-solid, currentColor);
8
+
9
+ &.et-form-field-busy-spinner--enter {
10
+ animation: et-form-field-busy-spinner-in 120ms ease;
11
+ }
12
+
13
+ &.et-form-field-busy-spinner--leave {
14
+ animation: et-form-field-busy-spinner-out 120ms ease forwards;
15
+ }
16
+
17
+ @media (prefers-reduced-motion: reduce) {
18
+ &.et-form-field-busy-spinner--enter,
19
+ &.et-form-field-busy-spinner--leave {
20
+ animation: none;
21
+ }
22
+ }
8
23
  }
9
24
 
10
25
  /* The overlap amount lives on the frame, not on the suffix that consumes it: a focused text
@@ -63,4 +78,16 @@
63
78
  margin-inline-start: calc(-1 * (var(--_et-form-field-suffix-fade) + var(--_et-form-field-suffix-overlap)));
64
79
  }
65
80
  }
81
+
82
+ @keyframes et-form-field-busy-spinner-in {
83
+ from {
84
+ opacity: 0;
85
+ }
86
+ }
87
+
88
+ @keyframes et-form-field-busy-spinner-out {
89
+ to {
90
+ opacity: 0;
91
+ }
92
+ }
66
93
  }
@@ -9,6 +9,7 @@
9
9
  --et-form-field-control-font-size: 12px;
10
10
  --et-form-field-control-min-height: 32px;
11
11
  --et-form-field-label-font-size: 12px;
12
+ --_et-form-field-float-inside-label-inset: 1px;
12
13
  }
13
14
 
14
15
  /* `data-size` is a host binding, so a field the router just created paints one frame without it.
@@ -110,20 +111,16 @@
110
111
 
111
112
  &[data-label-mode='floating-inside'],
112
113
  &[data-label-mode='floating-outside'] {
113
- :is(.et-input-native, .et-number-input-native, .et-textarea-native)::placeholder {
114
+ .et-form-field-control-slot :is(input, textarea)::placeholder,
115
+ :is(.et-select-value, .et-cascader-value)[data-placeholder] {
114
116
  transition: color 150ms ease;
115
117
  }
116
118
 
117
- .et-select-value[data-placeholder] {
118
- transition: color 150ms ease;
119
- }
120
-
121
- &:not([data-label-floated]) :is(.et-input-native, .et-number-input-native, .et-textarea-native)::placeholder {
122
- color: transparent;
123
- }
124
-
125
- &:not([data-label-floated]) .et-select-value[data-placeholder] {
126
- color: transparent;
119
+ &:not([data-label-floated]) {
120
+ .et-form-field-control-slot :is(input, textarea)::placeholder,
121
+ :is(.et-select-value, .et-cascader-value)[data-placeholder] {
122
+ color: transparent;
123
+ }
127
124
  }
128
125
  }
129
126
 
@@ -171,7 +168,7 @@
171
168
  }
172
169
 
173
170
  &[data-label-floated] .et-form-field-label-area--floating {
174
- inset-block-start: 4px;
171
+ inset-block-start: var(--_et-form-field-float-inside-label-inset, 4px);
175
172
  transform: scale(var(--_et-form-field-floating-label-scale));
176
173
  }
177
174
 
@@ -147,6 +147,10 @@
147
147
  color: inherit;
148
148
  }
149
149
 
150
+ .et-rte-token-popup-body-wrapper {
151
+ position: relative;
152
+ }
153
+
150
154
  .et-rte-token-popup-body {
151
155
  max-block-size: var(--_et-rte-popup-max-block-size);
152
156
  padding: 6px;
@@ -13,9 +13,10 @@
13
13
  }
14
14
 
15
15
  /* separate groups with a hairline above all but the first *visible* one — search
16
- filtering hides groups via [data-hidden], and a hidden group must neither draw a
17
- divider nor count as the preceding sibling (hence ~ instead of +) */
18
- &:where(:not([data-hidden])) ~ &:where(:not([data-hidden])) .et-select-option-group-label {
16
+ filtering hides groups via [data-hidden], and a hidden group must not count as the
17
+ preceding sibling (hence ~ instead of +). A hidden group itself still matches, so the
18
+ fade-out copy of its label keeps the divider. */
19
+ &:where(:not([data-hidden])) ~ & .et-select-option-group-label {
19
20
  margin-block-start: 4px;
20
21
  padding-block-start: 8px;
21
22
  border-block-start: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
@@ -95,6 +95,7 @@
95
95
  through the pane's positioning phase (`visibility: hidden`) and paint the check
96
96
  before the panel itself becomes visible */
97
97
  opacity: 0;
98
+ transition: opacity 120ms ease;
98
99
 
99
100
  .et-icon {
100
101
  inline-size: 100%;
@@ -106,6 +107,10 @@
106
107
  opacity: 1;
107
108
  }
108
109
 
110
+ :where(.et-animation-leave-from, .et-animation-leave-active) & .et-select-option-check {
111
+ transition-delay: 100ms;
112
+ }
113
+
109
114
  .et-select-option-label {
110
115
  flex: 1;
111
116
  overflow: hidden;
@@ -12,9 +12,10 @@
12
12
  }
13
13
 
14
14
  .et-overlay--select {
15
- --et-floating-panel-enter-duration: 140ms;
16
- --et-floating-panel-leave-duration: 100ms;
17
- --et-floating-panel-distance: 0.3rem;
15
+ }
16
+
17
+ .et-overlay--select.et-floating-panel[data-overlay-placement].et-animation-leave-to {
18
+ transform: translate3d(var(--et-overlay-anchored-x, 0px), var(--et-overlay-anchored-y, 0px), 0) !important;
18
19
  }
19
20
 
20
21
  .et-select-panel {
@@ -38,6 +39,10 @@
38
39
  /* re-published as an inheriting alias: the registered token is `inherits: false`, so the
39
40
  scroller below could not read a value a consumer sets on the panel element */
40
41
  --_et-select-panel-padding: var(--et-select-panel-padding);
42
+ --et-select-option-border-radius: max(
43
+ 2px,
44
+ var(--_et-overlay-surface-radius, 10px) - var(--_et-select-panel-padding)
45
+ );
41
46
 
42
47
  .et-select-panel-scroller {
43
48
  box-sizing: border-box;
@@ -46,10 +51,13 @@
46
51
  padding: var(--_et-select-panel-padding);
47
52
  }
48
53
 
49
- &.et-select-panel--resizing .et-select-panel-scroller {
54
+ /* A moving option's transform counts as scrollable overflow and would flash a scrollbar. Clip the
55
+ scroller, never the body: the body already has its final height and would cut off the moving options. */
56
+ &.et-select-panel--resizing .et-select-panel-scroller,
57
+ .et-select-panel-scroller:has(> .et-select-panel-body--moving) {
50
58
  overflow: clip;
51
59
  }
52
- border-radius: 10px;
60
+ border-radius: var(--_et-overlay-surface-radius, 10px);
53
61
  border: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
54
62
  background: var(--et-surface-background-solid, rgb(32 32 32));
55
63
  color: var(--et-surface-color-solid, rgb(244 244 245));
@@ -89,7 +97,7 @@
89
97
  block-size: 36px;
90
98
  box-sizing: border-box;
91
99
  padding-inline: 10px;
92
- border-radius: 6px;
100
+ border-radius: var(--et-select-option-border-radius);
93
101
  border: 1px solid var(--et-surface-border-solid, rgb(255 255 255 / 0.1));
94
102
  background: color-mix(in srgb, var(--et-surface-interaction-solid, rgb(255 255 255)) 6%, transparent);
95
103
  color: inherit;