@youcan/celeste 0.17.1 → 0.18.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 (52) hide show
  1. package/ai/README.md +1 -1
  2. package/ai/component-registry.json +2 -2
  3. package/ai/icons.json +2 -2
  4. package/ai/tokens.json +8 -5
  5. package/dist/celeste.css +390 -329
  6. package/dist/cjs/chunks/ComboboxItem.cjs +6 -0
  7. package/dist/cjs/chunks/badge.cjs +1 -1
  8. package/dist/cjs/chunks/button.cjs +1 -1
  9. package/dist/cjs/chunks/combobox-item.cjs +63 -7
  10. package/dist/cjs/chunks/combobox-list.cjs +1 -1
  11. package/dist/cjs/chunks/combobox-trigger.cjs +1 -1
  12. package/dist/cjs/chunks/combobox.cjs +2 -2
  13. package/dist/cjs/chunks/compact-button.cjs +1 -1
  14. package/dist/cjs/chunks/components.cjs +1 -1
  15. package/dist/cjs/chunks/fancy-button.cjs +1 -1
  16. package/dist/cjs/chunks/link-button.cjs +1 -1
  17. package/dist/cjs/chunks/social-button.cjs +1 -1
  18. package/dist/cjs/chunks/text-input-affix.cjs +1 -1
  19. package/dist/cjs/chunks/text-input-button.cjs +1 -1
  20. package/dist/cjs/chunks/text-input.cjs +2 -1
  21. package/dist/cjs/index.cjs +1 -1
  22. package/dist/es/chunks/ComboboxItem.js +1 -1
  23. package/dist/es/chunks/badge.js +1 -1
  24. package/dist/es/chunks/button.js +1 -1
  25. package/dist/es/chunks/combobox-item.js +65 -9
  26. package/dist/es/chunks/combobox-list.js +1 -1
  27. package/dist/es/chunks/combobox-trigger.js +1 -1
  28. package/dist/es/chunks/combobox.js +2 -2
  29. package/dist/es/chunks/compact-button.js +1 -1
  30. package/dist/es/chunks/components.js +1 -1
  31. package/dist/es/chunks/fancy-button.js +1 -1
  32. package/dist/es/chunks/link-button.js +1 -1
  33. package/dist/es/chunks/social-button.js +1 -1
  34. package/dist/es/chunks/text-input-affix.js +1 -1
  35. package/dist/es/chunks/text-input-button.js +1 -1
  36. package/dist/es/chunks/text-input.js +2 -1
  37. package/dist/es/index.js +1 -1
  38. package/package.json +3 -3
  39. package/src/components/badge/badge.vue +1 -1
  40. package/src/components/button/button.vue +5 -5
  41. package/src/components/button/compact-button.vue +1 -1
  42. package/src/components/button/fancy-button.vue +6 -6
  43. package/src/components/button/link-button.vue +5 -5
  44. package/src/components/button/social-button.vue +2 -2
  45. package/src/components/combobox/combobox-item.vue +15 -7
  46. package/src/components/combobox/combobox-list.vue +2 -2
  47. package/src/components/combobox/combobox-trigger.vue +38 -0
  48. package/src/components/combobox/combobox.vue +2 -0
  49. package/src/components/text-input/stories/text-input.stories.ts +53 -3
  50. package/src/components/text-input/text-input-affix.vue +7 -3
  51. package/src/components/text-input/text-input-button.vue +6 -2
  52. package/src/components/text-input/text-input.vue +45 -34
@@ -68,7 +68,7 @@ $size-map: (
68
68
  $intent-map: (
69
69
  'primary': (
70
70
  'fill': (
71
- fg: var(--color-text-white-0),
71
+ fg: var(--color-static-white),
72
72
  bg: var(--color-primary-base),
73
73
  border: var(--color-primary-base),
74
74
  shadow: none,
@@ -120,7 +120,7 @@ $intent-map: (
120
120
  ),
121
121
  'error': (
122
122
  'fill': (
123
- fg: var(--color-text-white-0),
123
+ fg: var(--color-static-white),
124
124
  bg: var(--color-state-error-base),
125
125
  border: var(--color-state-error-base),
126
126
  shadow: none,
@@ -148,7 +148,7 @@ $intent-map: (
148
148
  $hover-map: (
149
149
  'primary': (
150
150
  'fill': (
151
- fg: var(--color-text-white-0),
151
+ fg: var(--color-static-white),
152
152
  bg: var(--color-primary-darker),
153
153
  border: var(--color-primary-darker),
154
154
  ),
@@ -192,7 +192,7 @@ $hover-map: (
192
192
  ),
193
193
  'error': (
194
194
  'fill': (
195
- fg: var(--color-text-white-0),
195
+ fg: var(--color-static-white),
196
196
  bg: var(--color-red-700),
197
197
  border: var(--color-red-700),
198
198
  ),
@@ -270,7 +270,7 @@ $hover-map: (
270
270
  color: map.get($hover-values, fg);
271
271
  }
272
272
 
273
- &:focus:not(:disabled) {
273
+ &:focus-visible:not(:disabled) {
274
274
  outline: none;
275
275
  box-shadow: if(
276
276
  $intent == 'neutral',
@@ -73,7 +73,7 @@ const props = withDefaults(defineProps<CompactButtonProps>(), {
73
73
  color: var(--color-icon-strong-950);
74
74
  }
75
75
 
76
- &:focus {
76
+ &:focus-visible {
77
77
  border-color: transparent;
78
78
  outline: none;
79
79
  background-color: var(--color-bg-weak-50);
@@ -107,7 +107,7 @@ $intent-map: (
107
107
  height: 20px;
108
108
  }
109
109
 
110
- &:focus {
110
+ &:focus-visible {
111
111
  outline: none;
112
112
  }
113
113
 
@@ -129,7 +129,7 @@ $intent-map: (
129
129
  linear-gradient(180deg, var(--celeste-fbutton-bg-start) 0%, var(--celeste-fbutton-bg-end) 100%),
130
130
  #{map.get($v, bg)};
131
131
  box-shadow: var(--shadow-fancy-buttons-#{$k});
132
- color: var(--color-text-white-0);
132
+ color: if($k == 'neutral', var(--color-text-white-0), var(--color-static-white));
133
133
 
134
134
  &::before {
135
135
  content: '';
@@ -148,7 +148,7 @@ $intent-map: (
148
148
  --celeste-fbutton-bg-end: rgb(255 255 255 / 0%);
149
149
  }
150
150
 
151
- &:focus {
151
+ &:focus-visible {
152
152
  --celeste-fbutton-bg-start: rgb(255 255 255 / 24%);
153
153
  --celeste-fbutton-bg-end: rgb(255 255 255 / 0%);
154
154
 
@@ -167,13 +167,13 @@ $intent-map: (
167
167
  &:hover {
168
168
  background: var(--color-bg-weak-50);
169
169
  box-shadow: none;
170
- color: var(--text-strong-950);
170
+ color: var(--color-text-strong-950);
171
171
  }
172
172
 
173
- &:focus {
173
+ &:focus-visible {
174
174
  background: var(--color-bg-weak-50);
175
175
  box-shadow: var(--shadow-buttons-important-focus);
176
- color: var(--text-strong-950);
176
+ color: var(--color-text-strong-950);
177
177
  }
178
178
  }
179
179
  }
@@ -57,7 +57,7 @@ const props = withDefaults(defineProps<LinkButtonProps>(), {
57
57
  }
58
58
 
59
59
  &:hover,
60
- &:focus {
60
+ &:focus-visible {
61
61
  outline: none;
62
62
  text-decoration: underline;
63
63
  }
@@ -92,7 +92,7 @@ const props = withDefaults(defineProps<LinkButtonProps>(), {
92
92
  color: var(--color-primary-base);
93
93
 
94
94
  &:hover,
95
- &:focus {
95
+ &:focus-visible {
96
96
  color: var(--color-primary-darker);
97
97
  }
98
98
  }
@@ -101,7 +101,7 @@ const props = withDefaults(defineProps<LinkButtonProps>(), {
101
101
  color: var(--color-text-strong-950);
102
102
 
103
103
  &:hover,
104
- &:focus {
104
+ &:focus-visible {
105
105
  color: var(--color-text-strong-950);
106
106
  }
107
107
  }
@@ -110,7 +110,7 @@ const props = withDefaults(defineProps<LinkButtonProps>(), {
110
110
  color: var(--color-text-sub-600);
111
111
 
112
112
  &:hover,
113
- &:focus {
113
+ &:focus-visible {
114
114
  color: var(--color-text-sub-600);
115
115
  }
116
116
  }
@@ -119,7 +119,7 @@ const props = withDefaults(defineProps<LinkButtonProps>(), {
119
119
  color: var(--color-state-error-base);
120
120
 
121
121
  &:hover,
122
- &:focus {
122
+ &:focus-visible {
123
123
  color: var(--color-red-700);
124
124
  }
125
125
  }
@@ -87,7 +87,7 @@ $brand-map: (
87
87
  padding-inline-end: var(--spacing-6);
88
88
  }
89
89
 
90
- &:focus {
90
+ &:focus-visible {
91
91
  outline: none;
92
92
  box-shadow: var(--shadow-buttons-important-focus);
93
93
  }
@@ -100,7 +100,7 @@ $brand-map: (
100
100
  border-color: var(--color-stroke-soft-200);
101
101
  background-color: var(--color-bg-white-0);
102
102
  box-shadow: var(--shadow-regular-xs);
103
- color: var(--text-strong-950);
103
+ color: var(--color-text-strong-950);
104
104
 
105
105
  &:hover {
106
106
  border-color: transparent;
@@ -2,7 +2,7 @@
2
2
  import type { ComboboxItemEmits } from 'reka-ui';
3
3
  import type { HTMLAttributes } from 'vue';
4
4
  import clsx from 'clsx';
5
- import { ComboboxItem, useForwardPropsEmits } from 'reka-ui';
5
+ import { ComboboxItem, ComboboxItemIndicator, useForwardPropsEmits } from 'reka-ui';
6
6
  import { computed } from 'vue';
7
7
  import Checkbox from '../checkbox/checkbox.vue';
8
8
 
@@ -48,7 +48,6 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
48
48
  props.class,
49
49
  'celeste-dropdown-item',
50
50
  { 'celeste-dropdown-item-disabled': disabled },
51
- { 'celeste-dropdown-item-selected': selected },
52
51
  { 'celeste-dropdown-item-focused': focused },
53
52
  )"
54
53
  >
@@ -83,7 +82,9 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
83
82
  <div v-if="$slots.suffix" class="celeste-dropdown-item-suffix">
84
83
  <slot name="suffix" />
85
84
  </div>
86
- <i v-if="selected" class="i-celeste-check-fill" />
85
+ <ComboboxItemIndicator as-child>
86
+ <i class="celeste-dropdown-item-indicator i-celeste-check-line" />
87
+ </ComboboxItemIndicator>
87
88
  </div>
88
89
  </ComboboxItem>
89
90
  </template>
@@ -91,8 +92,10 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
91
92
  <style lang="scss" scoped>
92
93
  .celeste-dropdown-item {
93
94
  display: flex;
95
+ position: relative;
94
96
  align-items: center;
95
97
  padding: var(--spacing-8);
98
+ padding-inline-end: var(--spacing-36);
96
99
  transition-property: background-color;
97
100
  transition-duration: var(--animation-fast);
98
101
  transition-timing-function: ease-out;
@@ -159,6 +162,15 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
159
162
  color: var(--color-icon-sub-600);
160
163
  }
161
164
 
165
+ &-indicator {
166
+ position: absolute;
167
+ top: 50%;
168
+ width: 20px;
169
+ height: 20px;
170
+ transform: translateY(-50%);
171
+ inset-inline-end: var(--spacing-8);
172
+ }
173
+
162
174
  &-disabled {
163
175
  color: var(--color-text-disabled-300);
164
176
  cursor: not-allowed;
@@ -174,10 +186,6 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
174
186
  }
175
187
  }
176
188
 
177
- &-selected {
178
- background: var(--color-bg-weak-50);
179
- }
180
-
181
189
  .celeste-dropdown-item-info {
182
190
  display: flex;
183
191
  flex: 1 0 0;
@@ -39,14 +39,14 @@ const forwarded = useForwardPropsEmits(delegatedProps, emits);
39
39
  div:deep(.celeste-dropdown-content) {
40
40
  --dropdown-height: 300px;
41
41
  --dropdown-min-width: var(--reka-combobox-trigger-width, 300px);
42
- --dropdown-width: max(var(--reka-popper-anchor-width), 300px);
43
42
 
44
43
  display: flex;
45
44
  z-index: 50;
46
45
  box-sizing: border-box;
47
46
  flex-direction: column;
48
- width: var(--dropdown-width);
47
+ width: max-content;
49
48
  min-width: var(--dropdown-min-width);
49
+ max-width: max(var(--reka-popper-anchor-width), 320px);
50
50
  max-height: var(--dropdown-height);
51
51
  margin-top: var(--spacing-10);
52
52
  padding: var(--spacing-8);
@@ -197,6 +197,19 @@ const forwarded = useForwardProps(delegatedProps);
197
197
  border: none;
198
198
  border-radius: 0;
199
199
  box-shadow: none;
200
+ gap: 0;
201
+
202
+ :deep(.celeste-dropdown-anchor-trigger-prefix) {
203
+ margin-inline-end: var(--spacing-8);
204
+ }
205
+
206
+ :deep(.celeste-dropdown-trigger) {
207
+ margin-inline-start: var(--spacing-2);
208
+ }
209
+
210
+ &.celeste-dropdown-anchor-trigger-filled:not([data-disabled]) :deep(.celeste-dropdown-trigger i) {
211
+ color: var(--color-icon-sub-600);
212
+ }
200
213
 
201
214
  &:deep(.celeste-dropdown-trigger-label) {
202
215
  flex: inherit;
@@ -206,6 +219,31 @@ const forwarded = useForwardProps(delegatedProps);
206
219
  &[data-state='open'] {
207
220
  box-shadow: none;
208
221
  }
222
+
223
+ &:focus-visible {
224
+ background: var(--color-bg-weak-50);
225
+ }
226
+
227
+ &.celeste-dropdown-anchor-trigger-size-md {
228
+ padding-inline: var(--spacing-10) var(--spacing-8);
229
+ }
230
+
231
+ &.celeste-dropdown-anchor-trigger-size-sm {
232
+ padding-inline: var(--spacing-8);
233
+ }
234
+
235
+ &.celeste-dropdown-anchor-trigger-size-xs {
236
+ padding-inline: var(--spacing-8) var(--spacing-6);
237
+
238
+ :deep(.celeste-dropdown-anchor-trigger-prefix) {
239
+ margin-inline-end: var(--spacing-6);
240
+ }
241
+
242
+ :deep(.celeste-dropdown-anchor-trigger-prefix :is(i, .selected-dropdown-image)) {
243
+ width: 16px;
244
+ height: 16px;
245
+ }
246
+ }
209
247
  }
210
248
 
211
249
  &.celeste-dropdown-anchor-trigger-type-inline {
@@ -253,6 +253,7 @@ const filteredOptions = computed(() => props.ignoreFilter
253
253
  align-items: center;
254
254
  justify-content: center;
255
255
  width: 20px;
256
+ max-width: none;
256
257
  height: 20px;
257
258
  object-fit: cover;
258
259
  border-radius: var(--radius-full);
@@ -274,6 +275,7 @@ const filteredOptions = computed(() => props.ignoreFilter
274
275
  overflow: hidden;
275
276
  text-overflow: ellipsis;
276
277
  white-space: nowrap;
278
+ unicode-bidi: plaintext;
277
279
  }
278
280
  }
279
281
 
@@ -73,15 +73,21 @@ export const Size: Story = {
73
73
  template: `
74
74
  <div style="display: grid; gap: 20px; justify-content: center;">
75
75
  <TextInput v-bind="args" style="width: 300px" size="md">
76
- <i class="i-celeste-user-6-line" />
76
+ <template #leadingIcon>
77
+ <i class="i-celeste-user-6-line" />
78
+ </template>
77
79
  </TextInput>
78
80
 
79
81
  <TextInput v-bind="args" style="width: 300px" size="sm">
80
- <i class="i-celeste-user-6-line" />
82
+ <template #leadingIcon>
83
+ <i class="i-celeste-user-6-line" />
84
+ </template>
81
85
  </TextInput>
82
86
 
83
87
  <TextInput v-bind="args" style="width: 300px" size="xs">
84
- <i class="i-celeste-user-6-line" />
88
+ <template #leadingIcon>
89
+ <i class="i-celeste-user-6-line" />
90
+ </template>
85
91
  </TextInput>
86
92
  </div>
87
93
  `,
@@ -361,3 +367,47 @@ export const WithTrailingCombobox: Story = {
361
367
  `,
362
368
  }),
363
369
  };
370
+
371
+ function flag(color: string): string {
372
+ return `data:image/svg+xml,${encodeURIComponent(`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><circle cx="10" cy="10" r="10" fill="${color}"/></svg>`)}`;
373
+ }
374
+
375
+ const COUNTRIES = [
376
+ { value: 'MA', label: 'Morocco (+212)', shortLabel: '+212', image: flag('#c1272d') },
377
+ { value: 'FR', label: 'France (+33)', shortLabel: '+33', image: flag('#002654') },
378
+ { value: 'US', label: 'United States (+1)', shortLabel: '+1', image: flag('#3c3b6e') },
379
+ ];
380
+
381
+ export const Phone: Story = {
382
+ args: {
383
+ type: 'tel',
384
+ placeholder: '610-101010',
385
+ },
386
+
387
+ render: args => ({
388
+ components: { TextInput, Combobox },
389
+ setup() {
390
+ const country = ref(COUNTRIES[0]);
391
+ const phone = ref('+212610101010');
392
+
393
+ return { args, COUNTRIES, country, phone };
394
+ },
395
+ template: `
396
+ <div style="display: grid; gap: 20px; width: 360px;">
397
+ <TextInput v-for="size in ['md', 'sm', 'xs']" :key="size" v-bind="args" v-model="phone" :size="size">
398
+ <template #leadingNode>
399
+ <Combobox
400
+ v-model="country"
401
+ searchable
402
+ :options="COUNTRIES"
403
+ :size="size"
404
+ value-by="value"
405
+ label-by="shortLabel"
406
+ type="compact-input"
407
+ />
408
+ </template>
409
+ </TextInput>
410
+ </div>
411
+ `,
412
+ }),
413
+ };
@@ -27,18 +27,22 @@ const delegatedProps = useDelegatedProps(props, 'class');
27
27
  flex-shrink: 0;
28
28
  align-items: center;
29
29
  color: var(--celeste-text-input-affix-color);
30
+ unicode-bidi: plaintext;
30
31
 
31
32
  &[inline='false'] {
32
- padding-inline: var(--spacing-10);
33
+ padding-inline: var(--input-affix-padding);
33
34
  background-color: var(--celeste-text-input-affix-background-color);
34
35
  }
35
36
 
36
37
  &[askbd='true'] {
38
+ box-sizing: border-box;
37
39
  width: fit-content;
38
- height: fit-content;
39
- padding: var(--spacing-2) calc(var(--spacing-8) - var(--spacing-2));
40
+ height: 20px;
41
+ padding-inline: var(--spacing-6);
40
42
  border: 1px solid var(--color-stroke-soft-200);
41
43
  border-radius: var(--radius-4);
44
+ background-color: var(--color-bg-white-0);
45
+ color: var(--celeste-text-input-muted-color);
42
46
  font: var(--subheading-xs);
43
47
  }
44
48
  }
@@ -37,10 +37,14 @@ const delegatedProps = useDelegatedProps(props, 'class');
37
37
  }
38
38
 
39
39
  &[inline='false'] {
40
- padding: var(--spacing-10);
40
+ padding-inline: var(--spacing-14);
41
41
  border-end-start-radius: 0;
42
42
  border-start-start-radius: 0;
43
43
 
44
+ &:has(> :only-child:is(i)) {
45
+ padding-inline: var(--spacing-10);
46
+ }
47
+
44
48
  &:is(.celeste-button-intent-neutral, .celeste-button-variant-stroke):not(:disabled) {
45
49
  background-color: var(--color-bg-white-0);
46
50
 
@@ -53,7 +57,7 @@ const delegatedProps = useDelegatedProps(props, 'class');
53
57
  &[inline='true'] {
54
58
  width: 20px;
55
59
  height: 20px;
56
- color: var(--celeste-text-input-icon-color) !important;
60
+ color: var(--celeste-text-input-muted-color) !important;
57
61
 
58
62
  &:hover {
59
63
  background-color: transparent !important;
@@ -80,6 +80,7 @@ function clearInput() {
80
80
  >
81
81
  <TextInputButton
82
82
  v-if="showClearButton"
83
+ inline
83
84
  type="button"
84
85
  aria-label="Clear search"
85
86
  @click="clearInput"
@@ -97,8 +98,9 @@ function clearInput() {
97
98
  .celeste-text-input-wrapper {
98
99
  --celeste-text-input-border-color: var(--color-stroke-soft-200);
99
100
  --celeste-text-input-drop-shadow: var(--shadow-regular-xs);
100
- --celeste-text-input-icon-color: var(--color-text-soft-400);
101
- --celeste-text-input-affix-color: var(--color-text-soft-400);
101
+ --celeste-text-input-icon-color: var(--color-text-sub-600);
102
+ --celeste-text-input-affix-color: var(--color-text-sub-600);
103
+ --celeste-text-input-muted-color: var(--color-text-soft-400);
102
104
  --celeste-text-input-placeholder-color: var(--color-text-soft-400);
103
105
  --celeste-text-input-affix-background-color: var(--color-bg-white-0);
104
106
 
@@ -106,12 +108,10 @@ function clearInput() {
106
108
  box-sizing: border-box;
107
109
  align-items: center;
108
110
  height: var(--input-height);
109
- padding-inline: calc(var(--input-padding) + var(--spacing-2)) var(--input-padding);
111
+ padding-inline: var(--input-padding);
110
112
  transition: all var(--animation-fast) ease-out;
111
113
  border: 1px solid var(--celeste-text-input-border-color);
112
114
  border-radius: var(--input-radius);
113
- outline: 2px solid transparent;
114
- outline-offset: 2px;
115
115
  background-color: var(--color-bg-white-0);
116
116
  box-shadow: var(--celeste-text-input-drop-shadow);
117
117
  color: var(--color-text-strong-950);
@@ -119,24 +119,27 @@ function clearInput() {
119
119
  gap: var(--input-gap);
120
120
 
121
121
  &[size='xs'] {
122
- --input-gap: 8px;
122
+ --input-gap: var(--spacing-6);
123
123
  --input-height: 32px;
124
124
  --input-radius: var(--radius-8);
125
- --input-padding: calc(var(--spacing-8) - var(--spacing-2));
125
+ --input-padding: var(--spacing-8);
126
+ --input-affix-padding: var(--spacing-10);
126
127
  }
127
128
 
128
129
  &[size='sm'] {
129
- --input-gap: 6px;
130
+ --input-gap: var(--spacing-8);
130
131
  --input-height: 36px;
131
132
  --input-radius: var(--radius-8);
132
- --input-padding: var(--spacing-8);
133
+ --input-padding: var(--spacing-10);
134
+ --input-affix-padding: var(--spacing-10);
133
135
  }
134
136
 
135
137
  &[size='md'] {
136
- --input-gap: 6px;
138
+ --input-gap: var(--spacing-8);
137
139
  --input-height: 40px;
138
140
  --input-radius: var(--radius-10);
139
- --input-padding: var(--spacing-10);
141
+ --input-padding: var(--spacing-12);
142
+ --input-affix-padding: var(--spacing-12);
140
143
  }
141
144
 
142
145
  &[has-error='true'] {
@@ -158,6 +161,12 @@ function clearInput() {
158
161
  color: var(--celeste-text-input-placeholder-color);
159
162
  }
160
163
 
164
+ &[type='tel'] {
165
+ direction: ltr;
166
+ text-align: -webkit-match-parent;
167
+ text-align: match-parent;
168
+ }
169
+
161
170
  // Hide default webkit search cancel button
162
171
  &[type='search'] {
163
172
  &::-webkit-search-cancel-button {
@@ -199,18 +208,36 @@ function clearInput() {
199
208
  padding-inline-end: 0;
200
209
  }
201
210
 
211
+ &:has(.celeste-text-input:placeholder-shown) {
212
+ --celeste-text-input-icon-color: var(--color-text-soft-400);
213
+ --celeste-text-input-affix-color: var(--color-text-soft-400);
214
+ }
215
+
216
+ &:hover:not(:has(.celeste-text-input:focus)) {
217
+ --celeste-text-input-drop-shadow: none;
218
+
219
+ &:not([has-error='true'], :has(.celeste-text-input-node)) {
220
+ --celeste-text-input-border-color: transparent;
221
+ }
222
+
223
+ &:not(:has(.celeste-text-input-node:hover)) {
224
+ --celeste-text-input-icon-color: var(--color-text-sub-600);
225
+ --celeste-text-input-placeholder-color: var(--color-text-sub-600);
226
+
227
+ background-color: var(--color-bg-weak-50);
228
+ }
229
+ }
230
+
202
231
  &:has(.celeste-text-input:focus) {
203
232
  --celeste-text-input-border-color: var(--color-stroke-strong-950);
233
+ --celeste-text-input-drop-shadow: var(--shadow-buttons-important-focus);
204
234
  --celeste-text-input-placeholder-color: var(--color-text-sub-600);
205
235
  --celeste-text-input-icon-color: var(--color-text-sub-600);
206
236
  --celeste-text-input-affix-color: var(--color-text-sub-600);
207
237
 
208
- outline-color: var(--color-stroke-soft-200);
209
-
210
238
  &[has-error='true'] {
211
239
  --celeste-text-input-border-color: var(--color-state-error-base);
212
-
213
- outline-color: var(--color-state-error-lighter);
240
+ --celeste-text-input-drop-shadow: var(--shadow-buttons-error-focus);
214
241
  }
215
242
  }
216
243
 
@@ -229,35 +256,17 @@ function clearInput() {
229
256
  --celeste-text-input-drop-shadow: none;
230
257
  --celeste-text-input-affix-background-color: var(--color-bg-weak-50);
231
258
  --celeste-text-input-affix-color: var(--color-text-disabled-300);
259
+ --celeste-text-input-muted-color: var(--color-text-disabled-300);
232
260
  --celeste-text-input-placeholder-color: var(--color-text-disabled-300);
233
261
  --celeste-text-input-icon-color: var(--color-text-disabled-300);
234
262
 
235
263
  background-color: var(--color-bg-weak-50);
236
- box-shadow: none;
237
264
  color: var(--color-text-disabled-300);
238
265
  pointer-events: none;
239
266
 
240
267
  .celeste-text-input::placeholder {
241
268
  color: currentcolor;
242
269
  }
243
-
244
- .celeste-text-input-clear-button {
245
- color: var(--color-text-disabled-300);
246
- pointer-events: none;
247
- }
248
- }
249
-
250
- &:has(.celeste-text-input:hover:not(:focus, :disabled)) {
251
- &:not(:has(.celeste-text-input-node)) {
252
- --celeste-text-input-border-color: transparent;
253
- }
254
-
255
- &:not(:has(.celeste-text-input-node:hover)) {
256
- --celeste-text-input-icon-color: var(--color-text-sub-600);
257
- --celeste-text-input-placeholder-color: var(--color-text-sub-600);
258
-
259
- background-color: var(--color-bg-weak-50);
260
- }
261
270
  }
262
271
 
263
272
  .celeste-text-input-icon {
@@ -274,6 +283,7 @@ function clearInput() {
274
283
  }
275
284
 
276
285
  :deep(.celeste-text-input-node.celeste-text-input-leading-node) {
286
+ margin-inline-end: calc(var(--input-padding) - var(--input-gap));
277
287
  border-inline-end: 1px solid var(--color-stroke-soft-200);
278
288
  border-start-start-radius: var(--input-radius);
279
289
  border-start-end-radius: 0;
@@ -282,6 +292,7 @@ function clearInput() {
282
292
  }
283
293
 
284
294
  :deep(.celeste-text-input-node.celeste-text-input-trailing-node) {
295
+ margin-inline-start: calc(var(--input-padding) - var(--input-gap));
285
296
  border-inline-start: 1px solid var(--color-stroke-soft-200);
286
297
  border-start-start-radius: 0;
287
298
  border-start-end-radius: var(--input-radius);