@sewadah/selaras 0.8.0 → 0.10.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 (77) hide show
  1. package/README.md +12 -1
  2. package/dist/agent/catalog.json +1 -1
  3. package/dist/module.json +1 -1
  4. package/dist/runtime/components/Autocomplete.vue +6 -0
  5. package/dist/runtime/components/Checkbox.d.vue.ts +6 -4
  6. package/dist/runtime/components/Checkbox.vue +30 -22
  7. package/dist/runtime/components/Checkbox.vue.d.ts +6 -4
  8. package/dist/runtime/components/DatePicker.d.vue.ts +27 -27
  9. package/dist/runtime/components/DatePicker.vue +58 -99
  10. package/dist/runtime/components/DatePicker.vue.d.ts +27 -27
  11. package/dist/runtime/components/Editable.d.vue.ts +91 -0
  12. package/dist/runtime/components/Editable.vue +257 -0
  13. package/dist/runtime/components/Editable.vue.d.ts +91 -0
  14. package/dist/runtime/components/Input.d.vue.ts +7 -4
  15. package/dist/runtime/components/Input.vue +41 -25
  16. package/dist/runtime/components/Input.vue.d.ts +7 -4
  17. package/dist/runtime/components/Select.vue +6 -0
  18. package/dist/runtime/components/Textarea.d.vue.ts +7 -4
  19. package/dist/runtime/components/Textarea.vue +42 -28
  20. package/dist/runtime/components/Textarea.vue.d.ts +7 -4
  21. package/dist/runtime/components/Toolbar.d.vue.ts +25 -0
  22. package/dist/runtime/components/Toolbar.vue +35 -0
  23. package/dist/runtime/components/Toolbar.vue.d.ts +25 -0
  24. package/dist/runtime/components/ToolbarButton.d.vue.ts +20 -0
  25. package/dist/runtime/components/ToolbarButton.vue +46 -0
  26. package/dist/runtime/components/ToolbarButton.vue.d.ts +20 -0
  27. package/dist/runtime/components/ToolbarSeparator.d.vue.ts +10 -0
  28. package/dist/runtime/components/ToolbarSeparator.vue +22 -0
  29. package/dist/runtime/components/ToolbarSeparator.vue.d.ts +10 -0
  30. package/dist/runtime/components/ToolbarToggleGroup.d.vue.ts +37 -0
  31. package/dist/runtime/components/ToolbarToggleGroup.vue +44 -0
  32. package/dist/runtime/components/ToolbarToggleGroup.vue.d.ts +37 -0
  33. package/dist/runtime/internal/ComboboxSelectBase.d.vue.ts +7 -63
  34. package/dist/runtime/internal/ComboboxSelectBase.vue +58 -54
  35. package/dist/runtime/internal/ComboboxSelectBase.vue.d.ts +7 -63
  36. package/dist/runtime/internal/FieldClearButton.d.vue.ts +21 -0
  37. package/dist/runtime/internal/FieldClearButton.vue +30 -0
  38. package/dist/runtime/internal/FieldClearButton.vue.d.ts +21 -0
  39. package/dist/runtime/internal/ListboxOption.d.vue.ts +2 -1
  40. package/dist/runtime/internal/ListboxOption.vue +3 -2
  41. package/dist/runtime/internal/ListboxOption.vue.d.ts +2 -1
  42. package/dist/runtime/theme/date-picker.d.ts +27 -0
  43. package/dist/runtime/theme/date-picker.js +6 -3
  44. package/dist/runtime/theme/editable.d.ts +155 -0
  45. package/dist/runtime/theme/editable.js +25 -0
  46. package/dist/runtime/theme/field-clear-button.d.ts +56 -0
  47. package/dist/runtime/theme/field-clear-button.js +15 -0
  48. package/dist/runtime/theme/input.d.ts +6 -9
  49. package/dist/runtime/theme/input.js +7 -12
  50. package/dist/runtime/theme/listbox.js +1 -1
  51. package/dist/runtime/theme/select.d.ts +15 -0
  52. package/dist/runtime/theme/select.js +13 -10
  53. package/dist/runtime/theme/textarea.d.ts +6 -9
  54. package/dist/runtime/theme/textarea.js +6 -4
  55. package/dist/runtime/theme/toolbar-button.d.ts +65 -0
  56. package/dist/runtime/theme/toolbar-button.js +21 -0
  57. package/dist/runtime/theme/toolbar-separator.d.ts +35 -0
  58. package/dist/runtime/theme/toolbar-separator.js +8 -0
  59. package/dist/runtime/theme/toolbar-toggle-group.d.ts +74 -0
  60. package/dist/runtime/theme/toolbar-toggle-group.js +13 -0
  61. package/dist/runtime/theme/toolbar.d.ts +35 -0
  62. package/dist/runtime/theme/toolbar.js +11 -0
  63. package/dist/runtime/theme-config.d.ts +36 -0
  64. package/dist/runtime/types/index.d.ts +6 -0
  65. package/dist/runtime/utils/field-adornments.d.ts +14 -0
  66. package/dist/runtime/utils/field-adornments.js +36 -0
  67. package/dist/runtime/utils/field-clear.d.ts +9 -0
  68. package/dist/runtime/utils/field-clear.js +7 -0
  69. package/dist/runtime/utils/icons.d.ts +1 -0
  70. package/dist/runtime/utils/icons.js +1 -0
  71. package/dist/runtime/utils/messages.d.ts +4 -0
  72. package/dist/runtime/utils/messages.js +4 -0
  73. package/dist/runtime/utils/select-contracts.d.ts +3 -0
  74. package/dist/runtime/utils/toolbar.d.ts +9 -0
  75. package/dist/runtime/utils/toolbar.js +1 -0
  76. package/package.json +13 -5
  77. package/skills/selaras/SKILL.md +11 -7
@@ -2,12 +2,18 @@ export declare const datePickerTheme: import("tailwind-variants").TVReturnType<{
2
2
  size: {
3
3
  sm: {
4
4
  field: string;
5
+ buttonClear: string;
6
+ triggerIcon: string;
5
7
  };
6
8
  md: {
7
9
  field: string;
10
+ buttonClear: string;
11
+ triggerIcon: string;
8
12
  };
9
13
  lg: {
10
14
  field: string;
15
+ buttonClear: string;
16
+ triggerIcon: string;
11
17
  };
12
18
  };
13
19
  invalid: {
@@ -25,6 +31,9 @@ export declare const datePickerTheme: import("tailwind-variants").TVReturnType<{
25
31
  field: string;
26
32
  segment: string;
27
33
  separator: string;
34
+ clear: string;
35
+ buttonClear: string;
36
+ triggerIcon: string;
28
37
  content: string;
29
38
  mobileContent: string;
30
39
  header: string;
@@ -42,12 +51,18 @@ export declare const datePickerTheme: import("tailwind-variants").TVReturnType<{
42
51
  size: {
43
52
  sm: {
44
53
  field: string;
54
+ buttonClear: string;
55
+ triggerIcon: string;
45
56
  };
46
57
  md: {
47
58
  field: string;
59
+ buttonClear: string;
60
+ triggerIcon: string;
48
61
  };
49
62
  lg: {
50
63
  field: string;
64
+ buttonClear: string;
65
+ triggerIcon: string;
51
66
  };
52
67
  };
53
68
  invalid: {
@@ -65,6 +80,9 @@ export declare const datePickerTheme: import("tailwind-variants").TVReturnType<{
65
80
  field: string;
66
81
  segment: string;
67
82
  separator: string;
83
+ clear: string;
84
+ buttonClear: string;
85
+ triggerIcon: string;
68
86
  content: string;
69
87
  mobileContent: string;
70
88
  header: string;
@@ -82,12 +100,18 @@ export declare const datePickerTheme: import("tailwind-variants").TVReturnType<{
82
100
  size: {
83
101
  sm: {
84
102
  field: string;
103
+ buttonClear: string;
104
+ triggerIcon: string;
85
105
  };
86
106
  md: {
87
107
  field: string;
108
+ buttonClear: string;
109
+ triggerIcon: string;
88
110
  };
89
111
  lg: {
90
112
  field: string;
113
+ buttonClear: string;
114
+ triggerIcon: string;
91
115
  };
92
116
  };
93
117
  invalid: {
@@ -105,6 +129,9 @@ export declare const datePickerTheme: import("tailwind-variants").TVReturnType<{
105
129
  field: string;
106
130
  segment: string;
107
131
  separator: string;
132
+ clear: string;
133
+ buttonClear: string;
134
+ triggerIcon: string;
108
135
  content: string;
109
136
  mobileContent: string;
110
137
  header: string;
@@ -18,6 +18,9 @@ export const datePickerTheme = tv({
18
18
  // Between the two segment groups in range mode - a plain en dash, not an
19
19
  // arrow glyph, so there's nothing directional to mirror under RTL.
20
20
  separator: "px-0.5 text-[var(--selaras-resolved-text-muted)]",
21
+ clear: "shrink-0",
22
+ buttonClear: "absolute top-1/2 -translate-y-1/2",
23
+ triggerIcon: "shrink-0",
21
24
  // Copied from theme/dropdown.ts's `content` - the more complete of this
22
25
  // library's two floating-panel precedents (directional slide-in, not
23
26
  // just fade/zoom).
@@ -55,9 +58,9 @@ export const datePickerTheme = tv({
55
58
  },
56
59
  variants: {
57
60
  size: {
58
- sm: { field: "h-8 px-2.5 text-sm" },
59
- md: { field: "h-10 px-3 text-sm" },
60
- lg: { field: "h-11 px-3.5 text-base" }
61
+ sm: { field: "h-8 px-2.5 text-sm", buttonClear: "end-8", triggerIcon: "size-4" },
62
+ md: { field: "h-10 px-3 text-sm", buttonClear: "end-10", triggerIcon: "size-4.5" },
63
+ lg: { field: "h-11 px-3.5 text-base", buttonClear: "end-11", triggerIcon: "size-5" }
61
64
  },
62
65
  invalid: {
63
66
  true: { field: "ring-[var(--_selaras-color-border)] hover:ring-[var(--_selaras-color-border)] focus-within:ring-[var(--_selaras-color-focus)]" }
@@ -0,0 +1,155 @@
1
+ export declare const editableTheme: import("tailwind-variants").TVReturnType<{
2
+ size: {
3
+ sm: {
4
+ preview: string;
5
+ input: string;
6
+ };
7
+ md: {
8
+ preview: string;
9
+ input: string;
10
+ controls: string;
11
+ };
12
+ lg: {
13
+ preview: string;
14
+ input: string;
15
+ controls: string;
16
+ };
17
+ };
18
+ color: {
19
+ primary: "";
20
+ secondary: "";
21
+ neutral: "";
22
+ success: "";
23
+ danger: "";
24
+ warning: "";
25
+ info: "";
26
+ };
27
+ multiline: {
28
+ true: {
29
+ preview: string;
30
+ input: string;
31
+ };
32
+ };
33
+ empty: {
34
+ true: {
35
+ preview: string;
36
+ };
37
+ };
38
+ invalid: {
39
+ true: {
40
+ input: string;
41
+ };
42
+ };
43
+ }, {
44
+ root: string;
45
+ area: string;
46
+ preview: string;
47
+ input: string;
48
+ controls: string;
49
+ edit: string;
50
+ submit: string;
51
+ cancel: string;
52
+ }, undefined, {
53
+ size: {
54
+ sm: {
55
+ preview: string;
56
+ input: string;
57
+ };
58
+ md: {
59
+ preview: string;
60
+ input: string;
61
+ controls: string;
62
+ };
63
+ lg: {
64
+ preview: string;
65
+ input: string;
66
+ controls: string;
67
+ };
68
+ };
69
+ color: {
70
+ primary: "";
71
+ secondary: "";
72
+ neutral: "";
73
+ success: "";
74
+ danger: "";
75
+ warning: "";
76
+ info: "";
77
+ };
78
+ multiline: {
79
+ true: {
80
+ preview: string;
81
+ input: string;
82
+ };
83
+ };
84
+ empty: {
85
+ true: {
86
+ preview: string;
87
+ };
88
+ };
89
+ invalid: {
90
+ true: {
91
+ input: string;
92
+ };
93
+ };
94
+ }, {
95
+ root: string;
96
+ area: string;
97
+ preview: string;
98
+ input: string;
99
+ controls: string;
100
+ edit: string;
101
+ submit: string;
102
+ cancel: string;
103
+ }, import("tailwind-variants").TVReturnTypeLike<{
104
+ size: {
105
+ sm: {
106
+ preview: string;
107
+ input: string;
108
+ };
109
+ md: {
110
+ preview: string;
111
+ input: string;
112
+ controls: string;
113
+ };
114
+ lg: {
115
+ preview: string;
116
+ input: string;
117
+ controls: string;
118
+ };
119
+ };
120
+ color: {
121
+ primary: "";
122
+ secondary: "";
123
+ neutral: "";
124
+ success: "";
125
+ danger: "";
126
+ warning: "";
127
+ info: "";
128
+ };
129
+ multiline: {
130
+ true: {
131
+ preview: string;
132
+ input: string;
133
+ };
134
+ };
135
+ empty: {
136
+ true: {
137
+ preview: string;
138
+ };
139
+ };
140
+ invalid: {
141
+ true: {
142
+ input: string;
143
+ };
144
+ };
145
+ }, {
146
+ root: string;
147
+ area: string;
148
+ preview: string;
149
+ input: string;
150
+ controls: string;
151
+ edit: string;
152
+ submit: string;
153
+ cancel: string;
154
+ }>>;
155
+ export type EditableThemeSlots = keyof (typeof editableTheme)['slots'];
@@ -0,0 +1,25 @@
1
+ import { tv } from "tailwind-variants";
2
+ export const editableTheme = tv({
3
+ slots: {
4
+ root: "relative inline-flex w-full items-start gap-2",
5
+ area: "relative min-w-0 flex-1",
6
+ preview: "flex w-full items-center rounded-[var(--selaras-resolved-radius-md)] bg-transparent text-start text-[var(--selaras-resolved-text-default)] outline-none transition-colors hover:bg-[var(--selaras-resolved-surface-elevated)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--_selaras-color-focus)] disabled:opacity-50 disabled:cursor-not-allowed",
7
+ input: "w-full rounded-[var(--selaras-resolved-radius-md)] bg-[var(--selaras-resolved-surface-default)] text-[var(--selaras-resolved-text-default)] ring-1 ring-inset ring-[var(--selaras-resolved-border-default)] placeholder:text-[var(--selaras-resolved-text-muted)] outline-none transition-[color,background-color,box-shadow] not-focus:hover:ring-[var(--selaras-resolved-border-hover)] hover:bg-[var(--selaras-resolved-surface-elevated)] focus:ring-2 focus:ring-[var(--_selaras-color-focus)] disabled:opacity-50 disabled:pointer-events-none",
8
+ controls: "flex shrink-0 items-center gap-1",
9
+ edit: "",
10
+ submit: "",
11
+ cancel: ""
12
+ },
13
+ variants: {
14
+ size: {
15
+ sm: { preview: "min-h-8 px-2.5 text-sm", input: "h-8 px-2.5 text-sm" },
16
+ md: { preview: "min-h-10 px-3 text-sm", input: "h-10 px-3 text-sm", controls: "py-1" },
17
+ lg: { preview: "min-h-11 px-3.5 text-base", input: "h-11 px-3.5 text-base", controls: "py-0.5" }
18
+ },
19
+ color: { primary: "", secondary: "", neutral: "", success: "", danger: "", warning: "", info: "" },
20
+ multiline: { true: { preview: "whitespace-pre-wrap break-words py-2", input: "h-auto py-2" } },
21
+ empty: { true: { preview: "text-[var(--selaras-resolved-text-muted)]" } },
22
+ invalid: { true: { input: "ring-[var(--_selaras-color-border)] focus:ring-[var(--_selaras-color-focus)]" } }
23
+ },
24
+ defaultVariants: { size: "md", color: "primary" }
25
+ });
@@ -0,0 +1,56 @@
1
+ export declare const fieldClearButtonTheme: import("tailwind-variants").TVReturnType<{
2
+ size: {
3
+ sm: {
4
+ base: string;
5
+ icon: string;
6
+ };
7
+ md: {
8
+ base: string;
9
+ icon: string;
10
+ };
11
+ lg: {
12
+ base: string;
13
+ icon: string;
14
+ };
15
+ };
16
+ }, {
17
+ base: string;
18
+ icon: string;
19
+ }, undefined, {
20
+ size: {
21
+ sm: {
22
+ base: string;
23
+ icon: string;
24
+ };
25
+ md: {
26
+ base: string;
27
+ icon: string;
28
+ };
29
+ lg: {
30
+ base: string;
31
+ icon: string;
32
+ };
33
+ };
34
+ }, {
35
+ base: string;
36
+ icon: string;
37
+ }, import("tailwind-variants").TVReturnTypeLike<{
38
+ size: {
39
+ sm: {
40
+ base: string;
41
+ icon: string;
42
+ };
43
+ md: {
44
+ base: string;
45
+ icon: string;
46
+ };
47
+ lg: {
48
+ base: string;
49
+ icon: string;
50
+ };
51
+ };
52
+ }, {
53
+ base: string;
54
+ icon: string;
55
+ }>>;
56
+ export type FieldClearButtonThemeSlots = keyof (typeof fieldClearButtonTheme)['slots'];
@@ -0,0 +1,15 @@
1
+ import { tv } from "tailwind-variants";
2
+ export const fieldClearButtonTheme = tv({
3
+ slots: {
4
+ base: "shrink-0 rounded-full text-[var(--selaras-resolved-text-muted)] hover:bg-[var(--selaras-resolved-border-default)] hover:text-[var(--selaras-resolved-text-default)] active:bg-[var(--selaras-resolved-border-hover)] focus-visible:outline-offset-0",
5
+ icon: "shrink-0"
6
+ },
7
+ variants: {
8
+ size: {
9
+ sm: { base: "size-6", icon: "size-4" },
10
+ md: { base: "size-7", icon: "size-4.5" },
11
+ lg: { base: "size-8", icon: "size-5" }
12
+ }
13
+ },
14
+ defaultVariants: { size: "md" }
15
+ });
@@ -4,19 +4,16 @@ export declare const inputTheme: import("tailwind-variants").TVReturnType<{
4
4
  base: string;
5
5
  leadingIcon: string;
6
6
  trailingIcon: string;
7
- clear: string;
8
7
  };
9
8
  md: {
10
9
  base: string;
11
10
  leadingIcon: string;
12
11
  trailingIcon: string;
13
- clear: string;
14
12
  };
15
13
  lg: {
16
14
  base: string;
17
15
  leadingIcon: string;
18
16
  trailingIcon: string;
19
- clear: string;
20
17
  };
21
18
  };
22
19
  color: {
@@ -42,6 +39,8 @@ export declare const inputTheme: import("tailwind-variants").TVReturnType<{
42
39
  }, {
43
40
  root: string;
44
41
  base: string;
42
+ leading: string;
43
+ trailing: string;
45
44
  leadingIcon: string;
46
45
  trailingIcon: string;
47
46
  clear: string;
@@ -51,19 +50,16 @@ export declare const inputTheme: import("tailwind-variants").TVReturnType<{
51
50
  base: string;
52
51
  leadingIcon: string;
53
52
  trailingIcon: string;
54
- clear: string;
55
53
  };
56
54
  md: {
57
55
  base: string;
58
56
  leadingIcon: string;
59
57
  trailingIcon: string;
60
- clear: string;
61
58
  };
62
59
  lg: {
63
60
  base: string;
64
61
  leadingIcon: string;
65
62
  trailingIcon: string;
66
- clear: string;
67
63
  };
68
64
  };
69
65
  color: {
@@ -89,6 +85,8 @@ export declare const inputTheme: import("tailwind-variants").TVReturnType<{
89
85
  }, {
90
86
  root: string;
91
87
  base: string;
88
+ leading: string;
89
+ trailing: string;
92
90
  leadingIcon: string;
93
91
  trailingIcon: string;
94
92
  clear: string;
@@ -98,19 +96,16 @@ export declare const inputTheme: import("tailwind-variants").TVReturnType<{
98
96
  base: string;
99
97
  leadingIcon: string;
100
98
  trailingIcon: string;
101
- clear: string;
102
99
  };
103
100
  md: {
104
101
  base: string;
105
102
  leadingIcon: string;
106
103
  trailingIcon: string;
107
- clear: string;
108
104
  };
109
105
  lg: {
110
106
  base: string;
111
107
  leadingIcon: string;
112
108
  trailingIcon: string;
113
- clear: string;
114
109
  };
115
110
  };
116
111
  color: {
@@ -136,6 +131,8 @@ export declare const inputTheme: import("tailwind-variants").TVReturnType<{
136
131
  }, {
137
132
  root: string;
138
133
  base: string;
134
+ leading: string;
135
+ trailing: string;
139
136
  leadingIcon: string;
140
137
  trailingIcon: string;
141
138
  clear: string;
@@ -10,25 +10,20 @@ export const inputTheme = tv({
10
10
  // hardcoded here - hover's own color stays neutral regardless of
11
11
  // `color`, matching every other component's own hover state.
12
12
  base: "w-full rounded-[var(--selaras-resolved-radius-md)] bg-[var(--selaras-resolved-surface-default)] text-[var(--selaras-resolved-text-default)] ring-1 ring-inset ring-[var(--selaras-resolved-border-default)] placeholder:text-[var(--selaras-resolved-text-muted)] outline-none transition-[color,background-color,box-shadow] not-focus:hover:ring-[var(--selaras-resolved-border-hover)] hover:bg-[var(--selaras-resolved-surface-elevated)] focus:ring-2 focus:ring-[var(--_selaras-color-focus)] disabled:opacity-50 disabled:pointer-events-none",
13
+ leading: "absolute top-1/2 -translate-y-1/2 start-0 m-0 flex min-w-0 items-center gap-1 border-0 p-0 ps-2.5 text-sm text-[var(--selaras-resolved-text-muted)] disabled:opacity-50",
14
+ trailing: "absolute top-1/2 -translate-y-1/2 end-0 m-0 flex min-w-0 items-center gap-1 border-0 p-0 pe-1 text-sm text-[var(--selaras-resolved-text-muted)] disabled:opacity-50",
13
15
  leadingIcon: "absolute start-2.5 shrink-0 text-[var(--selaras-resolved-text-muted)]",
14
16
  trailingIcon: "absolute end-2.5 shrink-0 text-[var(--selaras-resolved-text-muted)]",
15
17
  // A separate slot from trailingIcon (not reused) - that one is a
16
18
  // decorative, non-interactive icon; this is a real dismiss button.
17
- // Rendered as an <SButton> (ghost/neutral) - real chrome, focus ring
18
- // and rounded-full (this dismiss-glyph family reads better circular
19
- // than the library's usual rounded-md) come from Button's own theme;
20
- // this slot only positions it and shrinks it below the input's full
21
- // height (Button's own size steps match that height exactly, which
22
- // once centered still touches both edges with zero margin) - explicit
23
- // top-1/2 -translate-y-1/2 centering, not the root's items-center,
24
- // since position:absolute drops it out of that flex flow.
25
- clear: "absolute end-1 top-1/2 -translate-y-1/2 shrink-0 rounded-full"
19
+ // The shared clear control owns its target size, icon, and feedback.
20
+ clear: "absolute end-1 top-1/2 -translate-y-1/2"
26
21
  },
27
22
  variants: {
28
23
  size: {
29
- sm: { base: "h-8 px-2.5 text-sm", leadingIcon: "size-4", trailingIcon: "size-4", clear: "size-7" },
30
- md: { base: "h-10 px-3 text-sm", leadingIcon: "size-4.5", trailingIcon: "size-4.5", clear: "size-9" },
31
- lg: { base: "h-11 px-3.5 text-base", leadingIcon: "size-5", trailingIcon: "size-5", clear: "size-10" }
24
+ sm: { base: "h-8 px-2.5 text-sm", leadingIcon: "size-4", trailingIcon: "size-4" },
25
+ md: { base: "h-10 px-3 text-sm", leadingIcon: "size-4.5", trailingIcon: "size-4.5" },
26
+ lg: { base: "h-11 px-3.5 text-base", leadingIcon: "size-5", trailingIcon: "size-5" }
32
27
  },
33
28
  // Focus-ring color only - the resting ring stays --selaras-resolved-border-default regardless
34
29
  // of `color`, matching a Nuxt-ecosystem component kit's own Input
@@ -15,7 +15,7 @@ export const listboxTheme = tv({
15
15
  itemContent: "flex min-w-0 flex-1 flex-col gap-0.5",
16
16
  icon: "size-4 shrink-0",
17
17
  indicator: "ms-auto flex size-4 shrink-0 items-center justify-center text-[var(--_selaras-color-indicator)]",
18
- checkbox: "pointer-events-none flex size-4 shrink-0 items-center justify-center rounded-[var(--selaras-resolved-radius-sm)] border border-[var(--selaras-resolved-border-default)] data-[state=checked]:border-[var(--_selaras-color-fill)] data-[state=checked]:bg-[var(--_selaras-color-fill)] data-[state=checked]:text-[var(--_selaras-color-on-fill)]",
18
+ checkbox: "pointer-events-none shrink-0",
19
19
  empty: "px-3 py-6 text-center text-sm text-[var(--selaras-resolved-text-muted)]"
20
20
  },
21
21
  variants: {
@@ -2,12 +2,15 @@ export declare const selectTheme: import("tailwind-variants").TVReturnType<{
2
2
  size: {
3
3
  sm: {
4
4
  trigger: string;
5
+ icon: string;
5
6
  };
6
7
  md: {
7
8
  trigger: string;
9
+ icon: string;
8
10
  };
9
11
  lg: {
10
12
  trigger: string;
13
+ icon: string;
11
14
  };
12
15
  };
13
16
  color: {
@@ -29,6 +32,8 @@ export declare const selectTheme: import("tailwind-variants").TVReturnType<{
29
32
  }, {
30
33
  root: string;
31
34
  trigger: string;
35
+ leading: string;
36
+ trailing: string;
32
37
  value: string;
33
38
  chipOverflow: string;
34
39
  icon: string;
@@ -49,12 +54,15 @@ export declare const selectTheme: import("tailwind-variants").TVReturnType<{
49
54
  size: {
50
55
  sm: {
51
56
  trigger: string;
57
+ icon: string;
52
58
  };
53
59
  md: {
54
60
  trigger: string;
61
+ icon: string;
55
62
  };
56
63
  lg: {
57
64
  trigger: string;
65
+ icon: string;
58
66
  };
59
67
  };
60
68
  color: {
@@ -76,6 +84,8 @@ export declare const selectTheme: import("tailwind-variants").TVReturnType<{
76
84
  }, {
77
85
  root: string;
78
86
  trigger: string;
87
+ leading: string;
88
+ trailing: string;
79
89
  value: string;
80
90
  chipOverflow: string;
81
91
  icon: string;
@@ -96,12 +106,15 @@ export declare const selectTheme: import("tailwind-variants").TVReturnType<{
96
106
  size: {
97
107
  sm: {
98
108
  trigger: string;
109
+ icon: string;
99
110
  };
100
111
  md: {
101
112
  trigger: string;
113
+ icon: string;
102
114
  };
103
115
  lg: {
104
116
  trigger: string;
117
+ icon: string;
105
118
  };
106
119
  };
107
120
  color: {
@@ -123,6 +136,8 @@ export declare const selectTheme: import("tailwind-variants").TVReturnType<{
123
136
  }, {
124
137
  root: string;
125
138
  trigger: string;
139
+ leading: string;
140
+ trailing: string;
126
141
  value: string;
127
142
  chipOverflow: string;
128
143
  icon: string;
@@ -8,6 +8,8 @@ export const selectTheme = tv({
8
8
  // let the plain gray hover ring beat the primary one in the cascade,
9
9
  // since they're all equal-specificity pseudo-class/attribute selectors.
10
10
  trigger: "inline-flex w-full min-h-10 flex-wrap items-center gap-1.5 rounded-[var(--selaras-resolved-radius-md)] bg-[var(--selaras-resolved-surface-default)] px-3 py-1.5 text-sm ring-1 ring-inset ring-[var(--selaras-resolved-border-default)] outline-none transition-[color,background-color,box-shadow] not-focus:not-focus-within:not-data-[state=open]:hover:ring-[var(--selaras-resolved-border-hover)] hover:bg-[var(--selaras-resolved-surface-elevated)] focus:ring-2 focus:ring-[var(--_selaras-color-focus)] focus-within:ring-2 focus-within:ring-[var(--_selaras-color-focus)] data-[state=open]:ring-2 data-[state=open]:ring-[var(--_selaras-color-focus)] disabled:opacity-50 disabled:pointer-events-none",
11
+ leading: "absolute start-0 top-1/2 -translate-y-1/2 m-0 flex min-w-0 items-center gap-1 border-0 p-0 ps-2.5 text-sm text-[var(--selaras-resolved-text-muted)] disabled:opacity-50",
12
+ trailing: "absolute end-0 top-1/2 -translate-y-1/2 m-0 flex min-w-0 items-center gap-1 border-0 p-0 pe-1 text-sm text-[var(--selaras-resolved-text-muted)] disabled:opacity-50",
11
13
  value: "flex-1 truncate text-start text-[var(--selaras-resolved-text-default)] data-[placeholder]:text-[var(--selaras-resolved-text-muted)]",
12
14
  // Both chip display branches render a real Chip (see
13
15
  // ComboboxSelectBase.vue) instead of hand-rolled markup, styled/
@@ -21,13 +23,14 @@ export const selectTheme = tv({
21
23
  // soft (the same pairing Chip's own soft variant uses) clears 6.5:1.
22
24
  chipOverflow: "inline-flex items-center rounded-[var(--selaras-resolved-radius-sm)] bg-[var(--_selaras-color-subtle)] px-2 py-0.5 text-xs text-[var(--_selaras-color-text)]",
23
25
  icon: "shrink-0 text-[var(--selaras-resolved-text-muted)]",
24
- // Rendered as an <SButton> (ghost/neutral) - real chrome, focus ring
25
- // and touch target come from Button's own theme; only rounded-full
26
- // (this dismiss-glyph family reads better circular) stays here.
27
- clear: "shrink-0 rounded-full",
28
- dropdown: "shrink-0 rounded-[var(--selaras-resolved-radius-sm)] p-0.5 text-[var(--selaras-resolved-text-muted)] transition-colors hover:bg-[var(--selaras-resolved-border-default)] hover:text-[var(--selaras-resolved-text-default)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--_selaras-color-focus)]",
29
- searchWrapper: "flex items-center gap-2 border-b border-[var(--selaras-resolved-border-default)] px-2",
30
- searchInput: "h-9 min-w-16 flex-1 bg-transparent text-sm text-[var(--selaras-resolved-text-default)] outline-none placeholder:text-[var(--selaras-resolved-text-muted)]",
26
+ // Layout only; FieldClearButton owns the shared interaction treatment.
27
+ clear: "",
28
+ dropdown: "inline-flex shrink-0 items-center justify-center rounded-[var(--selaras-resolved-radius-sm)] p-0.5 text-[var(--selaras-resolved-text-muted)] transition-colors hover:bg-[var(--selaras-resolved-border-default)] hover:text-[var(--selaras-resolved-text-default)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--_selaras-color-focus)]",
29
+ searchWrapper: "box-content flex h-9 items-center gap-2 border-b border-[var(--selaras-resolved-border-default)] px-2",
30
+ // The popup owns its search row height. Inside a trigger, stretch the
31
+ // editor into the available space instead of adding a fixed input
32
+ // height to the trigger's vertical padding.
33
+ searchInput: "min-w-16 flex-1 self-stretch bg-transparent text-sm text-[var(--selaras-resolved-text-default)] outline-none placeholder:text-[var(--selaras-resolved-text-muted)]",
31
34
  content: "z-[var(--selaras-resolved-z-dropdown)] max-h-72 min-w-[var(--reka-combobox-trigger-width)] overflow-hidden rounded-[var(--selaras-resolved-radius-md)] bg-[var(--selaras-resolved-surface-default)] shadow-[var(--selaras-resolved-shadow-md)] ring-1 ring-[var(--selaras-resolved-border-default)] data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
32
35
  // The `adaptive` path's own content wrapper - none of `content`'s
33
36
  // own popover chrome (ring/shadow/rounded/animate-in, sized off the
@@ -47,9 +50,9 @@ export const selectTheme = tv({
47
50
  },
48
51
  variants: {
49
52
  size: {
50
- sm: { trigger: "min-h-8 text-sm" },
51
- md: { trigger: "min-h-10" },
52
- lg: { trigger: "min-h-11 text-base" }
53
+ sm: { trigger: "min-h-8 py-1 text-sm", icon: "size-4" },
54
+ md: { trigger: "min-h-10", icon: "size-4.5" },
55
+ lg: { trigger: "min-h-11 text-base", icon: "size-5" }
53
56
  },
54
57
  // Registered custom roles have no finite Tailwind Variants branch. Keep
55
58
  // the semantic focus styling in the base slot so every registered role