tyrell-components 1.0.0-TC30 → 1.0.0-TC32

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 (117) hide show
  1. package/css/tyrell.css +48 -12
  2. package/dist/tyrell.css +48 -12
  3. package/dist/tyrell.js +1 -1
  4. package/lib/components/calendar-month.d.ts +17 -0
  5. package/lib/components/calendar-month.d.ts.map +1 -1
  6. package/lib/components/calendar-month.js +121 -7
  7. package/lib/components/calendar-month.js.map +1 -1
  8. package/lib/components/calendar.d.ts +3 -1
  9. package/lib/components/calendar.d.ts.map +1 -1
  10. package/lib/components/calendar.js +19 -9
  11. package/lib/components/calendar.js.map +1 -1
  12. package/lib/components/checkbox.d.ts +4 -3
  13. package/lib/components/checkbox.d.ts.map +1 -1
  14. package/lib/components/checkbox.js +23 -35
  15. package/lib/components/checkbox.js.map +1 -1
  16. package/lib/components/copy.d.ts +4 -3
  17. package/lib/components/copy.d.ts.map +1 -1
  18. package/lib/components/copy.js +22 -21
  19. package/lib/components/copy.js.map +1 -1
  20. package/lib/components/date-picker.d.ts +5 -1
  21. package/lib/components/date-picker.d.ts.map +1 -1
  22. package/lib/components/date-picker.js +113 -32
  23. package/lib/components/date-picker.js.map +1 -1
  24. package/lib/components/input.d.ts +3 -2
  25. package/lib/components/input.d.ts.map +1 -1
  26. package/lib/components/input.js +24 -21
  27. package/lib/components/input.js.map +1 -1
  28. package/lib/components/modal.d.ts.map +1 -1
  29. package/lib/components/modal.js +22 -3
  30. package/lib/components/modal.js.map +1 -1
  31. package/lib/components/popup.d.ts.map +1 -1
  32. package/lib/components/popup.js +14 -0
  33. package/lib/components/popup.js.map +1 -1
  34. package/lib/components/radio.d.ts +5 -2
  35. package/lib/components/radio.d.ts.map +1 -1
  36. package/lib/components/radio.js +16 -5
  37. package/lib/components/radio.js.map +1 -1
  38. package/lib/components/select.d.ts +75 -5
  39. package/lib/components/select.d.ts.map +1 -1
  40. package/lib/components/select.js +282 -47
  41. package/lib/components/select.js.map +1 -1
  42. package/lib/components/selected-tags.d.ts +1 -1
  43. package/lib/components/selected-tags.js +1 -1
  44. package/lib/components/switch.d.ts +4 -3
  45. package/lib/components/switch.d.ts.map +1 -1
  46. package/lib/components/switch.js +17 -29
  47. package/lib/components/switch.js.map +1 -1
  48. package/lib/components/tabs.d.ts.map +1 -1
  49. package/lib/components/tabs.js +18 -2
  50. package/lib/components/tabs.js.map +1 -1
  51. package/lib/components/tooltip.d.ts +4 -2
  52. package/lib/components/tooltip.d.ts.map +1 -1
  53. package/lib/components/tooltip.js +109 -70
  54. package/lib/components/tooltip.js.map +1 -1
  55. package/lib/components/wizard.d.ts.map +1 -1
  56. package/lib/components/wizard.js +22 -3
  57. package/lib/components/wizard.js.map +1 -1
  58. package/lib/styles/button.d.ts.map +1 -1
  59. package/lib/styles/button.js +10 -6
  60. package/lib/styles/button.js.map +1 -1
  61. package/lib/styles/calendar-month.d.ts +3 -1
  62. package/lib/styles/calendar-month.d.ts.map +1 -1
  63. package/lib/styles/calendar-month.js +63 -8
  64. package/lib/styles/calendar-month.js.map +1 -1
  65. package/lib/styles/checkbox.d.ts +3 -1
  66. package/lib/styles/checkbox.d.ts.map +1 -1
  67. package/lib/styles/checkbox.js +31 -53
  68. package/lib/styles/checkbox.js.map +1 -1
  69. package/lib/styles/copy.d.ts +3 -1
  70. package/lib/styles/copy.d.ts.map +1 -1
  71. package/lib/styles/copy.js +27 -4
  72. package/lib/styles/copy.js.map +1 -1
  73. package/lib/styles/date-picker.d.ts +3 -1
  74. package/lib/styles/date-picker.d.ts.map +1 -1
  75. package/lib/styles/date-picker.js +52 -98
  76. package/lib/styles/date-picker.js.map +1 -1
  77. package/lib/styles/input.d.ts +3 -1
  78. package/lib/styles/input.d.ts.map +1 -1
  79. package/lib/styles/input.js +58 -119
  80. package/lib/styles/input.js.map +1 -1
  81. package/lib/styles/multiselect.d.ts +3 -1
  82. package/lib/styles/multiselect.d.ts.map +1 -1
  83. package/lib/styles/multiselect.js +26 -2
  84. package/lib/styles/multiselect.js.map +1 -1
  85. package/lib/styles/radio.d.ts +3 -1
  86. package/lib/styles/radio.d.ts.map +1 -1
  87. package/lib/styles/radio.js +23 -20
  88. package/lib/styles/radio.js.map +1 -1
  89. package/lib/styles/select-base.d.ts +9 -0
  90. package/lib/styles/select-base.d.ts.map +1 -0
  91. package/lib/styles/select-base.js +929 -0
  92. package/lib/styles/select-base.js.map +1 -0
  93. package/lib/styles/select.d.ts +3 -3
  94. package/lib/styles/select.d.ts.map +1 -1
  95. package/lib/styles/select.js +20 -18
  96. package/lib/styles/select.js.map +1 -1
  97. package/lib/styles/switch.d.ts +3 -1
  98. package/lib/styles/switch.d.ts.map +1 -1
  99. package/lib/styles/switch.js +23 -8
  100. package/lib/styles/switch.js.map +1 -1
  101. package/lib/styles/tooltip.d.ts +4 -2
  102. package/lib/styles/tooltip.d.ts.map +1 -1
  103. package/lib/styles/tooltip.js +4 -119
  104. package/lib/styles/tooltip.js.map +1 -1
  105. package/lib/utils/icons.d.ts +10 -0
  106. package/lib/utils/icons.d.ts.map +1 -0
  107. package/lib/utils/icons.js +10 -0
  108. package/lib/utils/icons.js.map +1 -0
  109. package/lib/utils/loader-registry.d.ts +2 -2
  110. package/lib/utils/loader-registry.js +2 -2
  111. package/lib/utils/positioning.d.ts +27 -0
  112. package/lib/utils/positioning.d.ts.map +1 -1
  113. package/lib/utils/positioning.js +20 -3
  114. package/lib/utils/positioning.js.map +1 -1
  115. package/lib/version.d.ts +1 -1
  116. package/lib/version.js +1 -1
  117. package/package.json +1 -1
@@ -2,6 +2,43 @@
2
2
  * Calendar Month Styles
3
3
  * Improved design with better visual hierarchy and size variants
4
4
  */
5
+ import { FLAVORS } from "../types/common.js";
6
+ /* Flavor rules set --calendar-month-* local vars, wired in as the fallback
7
+ BEHIND every existing --ty-calendar-* public override (so those keep
8
+ working exactly as before) and AHEAD of the hardcoded primary default.
9
+ Doubles as the per-instance override API for a specific flavor: e.g.
10
+ `ty-calendar-month { --calendar-month-accent: ... }`. Fallback flavor
11
+ `fb` is used for custom flavors so missing tokens degrade to neutral. */
12
+ const calendarMonthFlavor = (f, fb) => {
13
+ const color = (s) => fb
14
+ ? `var(--ty-color-${f}${s}, var(--ty-color-${fb}${s}))`
15
+ : `var(--ty-color-${f}${s})`;
16
+ const bg = (s) => fb
17
+ ? `var(--ty-bg-${f}${s}, var(--ty-bg-${fb}${s}))`
18
+ : `var(--ty-bg-${f}${s})`;
19
+ return `
20
+ :host([flavor="${f}"]) {
21
+ --calendar-month-accent: ${color("")};
22
+ --calendar-month-selected-bg: ${bg("")};
23
+ --calendar-month-selected-color: ${color("-strong")};
24
+ --calendar-month-selected-hover-bg: ${bg("-bold")};
25
+ }
26
+ :host([flavor="${f}+"]) {
27
+ --calendar-month-accent: ${color("-strong")};
28
+ --calendar-month-selected-bg: ${bg("-bold")};
29
+ --calendar-month-selected-color: ${color("-strong")};
30
+ --calendar-month-selected-hover-bg: ${bg("-bold")};
31
+ }
32
+ :host([flavor="${f}-"]) {
33
+ --calendar-month-accent: ${color("-soft")};
34
+ --calendar-month-selected-bg: ${bg("-soft")};
35
+ --calendar-month-selected-color: ${color("")};
36
+ --calendar-month-selected-hover-bg: ${bg("")};
37
+ }
38
+ `;
39
+ };
40
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
41
+ export const calendarMonthCustomFlavorCss = (base) => calendarMonthFlavor(base, "neutral");
5
42
  export const calendarMonthStyles = `
6
43
  /* ============================================================================
7
44
  Theming Tokens
@@ -117,6 +154,14 @@ export const calendarMonthStyles = `
117
154
  border-color: var(--ty-calendar-day-hover-border, transparent);
118
155
  }
119
156
 
157
+ /* Keyboard focus ring (roving tabindex — see calendar-month.ts's render()).
158
+ :focus-visible, not :focus, so mouse/pointerdown activation doesn't flash
159
+ a ring; only Tab-in / arrow-key navigation does. */
160
+ .calendar-day-cell:focus-visible {
161
+ outline: none;
162
+ box-shadow: 0 0 0 2px var(--calendar-month-accent, var(--ty-color-primary));
163
+ }
164
+
120
165
  /* ============================================================================
121
166
  Day States
122
167
  ============================================================================ */
@@ -125,7 +170,7 @@ export const calendarMonthStyles = `
125
170
  selected pill wins when today is picked */
126
171
  .calendar-day-cell.today {
127
172
  background-color: var(--ty-calendar-today-bg, transparent);
128
- color: var(--ty-calendar-today-color, var(--ty-calendar-today-accent, var(--ty-color-primary)));
173
+ color: var(--ty-calendar-today-color, var(--ty-calendar-today-accent, var(--calendar-month-accent, var(--ty-color-primary))));
129
174
  border-color: var(--ty-calendar-today-border, transparent);
130
175
  font-weight: 600;
131
176
  }
@@ -135,10 +180,15 @@ export const calendarMonthStyles = `
135
180
  color: var(--ty-calendar-weekend-color, var(--ty-calendar-day-color, var(--ty-text)));
136
181
  }
137
182
 
138
- /* Other Month - Muted */
183
+ /* Other Month - Muted.
184
+ Was color: var(--ty-color-neutral-faint) at opacity 0.5 — -faint alone is
185
+ only ~2.5:1 against the content surface (already under the 4.5:1 AA text
186
+ minimum), and blending it toward the background via opacity made it
187
+ worse (~1.5:1 in light mode). --ty-calendar-other-month-color is its own
188
+ token (tyrell.css :root / html.dark) calibrated to actually pass, with
189
+ opacity dropped rather than layered on top. */
139
190
  .calendar-day-cell.other-month {
140
- color: var(--ty-calendar-other-month-color, var(--ty-color-neutral-faint));
141
- opacity: var(--ty-calendar-other-month-opacity, 0.5);
191
+ color: var(--ty-calendar-other-month-color, #6b7280);
142
192
  }
143
193
 
144
194
  .calendar-day-cell.other-month:hover {
@@ -157,14 +207,14 @@ export const calendarMonthStyles = `
157
207
 
158
208
  /* Selected: the one strong element in the grid */
159
209
  .calendar-day-cell.selected {
160
- background-color: var(--ty-calendar-selected-bg, var(--ty-bg-primary));
161
- color: var(--ty-calendar-selected-color, var(--ty-color-primary-strong));
162
- border-color: var(--ty-calendar-selected-border, var(--ty-calendar-accent, transparent));
210
+ background-color: var(--ty-calendar-selected-bg, var(--calendar-month-selected-bg, var(--ty-bg-primary)));
211
+ color: var(--ty-calendar-selected-color, var(--calendar-month-selected-color, var(--ty-color-primary-strong)));
212
+ border-color: var(--ty-calendar-selected-border, var(--ty-calendar-accent, var(--calendar-month-accent, transparent)));
163
213
  font-weight: 600;
164
214
  }
165
215
 
166
216
  .calendar-day-cell.selected:hover {
167
- background-color: var(--ty-calendar-selected-hover-bg, var(--ty-bg-primary-bold));
217
+ background-color: var(--ty-calendar-selected-hover-bg, var(--calendar-month-selected-hover-bg, var(--ty-bg-primary-bold)));
168
218
  border-color: var(--ty-calendar-selected-hover-border, transparent);
169
219
  }
170
220
 
@@ -249,5 +299,10 @@ export const calendarMonthStyles = `
249
299
  justify-content: center;
250
300
  box-sizing: border-box;
251
301
  }
302
+
303
+ /* ============================================================================
304
+ Flavor Variants (set --calendar-month-*, consumed above)
305
+ ============================================================================ */
306
+ ${FLAVORS.map((f) => calendarMonthFlavor(f)).join("")}
252
307
  `;
253
308
  //# sourceMappingURL=calendar-month.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"calendar-month.js","sourceRoot":"","sources":["../../src/styles/calendar-month.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuPlC,CAAC"}
1
+ {"version":3,"file":"calendar-month.js","sourceRoot":"","sources":["../../src/styles/calendar-month.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;;;2EAK2E;AAC3E,MAAM,mBAAmB,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IACrD,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAC1B,EAAE;QACA,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI;QACvD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CACvB,EAAE;QACA,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI;QACjD,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B,OAAO;iBACQ,CAAC;6BACW,KAAK,CAAC,EAAE,CAAC;kCACJ,EAAE,CAAC,EAAE,CAAC;qCACH,KAAK,CAAC,SAAS,CAAC;wCACb,EAAE,CAAC,OAAO,CAAC;;iBAElC,CAAC;6BACW,KAAK,CAAC,SAAS,CAAC;kCACX,EAAE,CAAC,OAAO,CAAC;qCACR,KAAK,CAAC,SAAS,CAAC;wCACb,EAAE,CAAC,OAAO,CAAC;;iBAElC,CAAC;6BACW,KAAK,CAAC,OAAO,CAAC;kCACT,EAAE,CAAC,OAAO,CAAC;qCACR,KAAK,CAAC,EAAE,CAAC;wCACN,EAAE,CAAC,EAAE,CAAC;;CAE7C,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEnG,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwQjC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACpD,CAAC"}
@@ -5,5 +5,7 @@
5
5
  * carries the state. Full flavor color when checked, faint when unchecked,
6
6
  * dash at mid-opacity when indeterminate, grayscale when disabled.
7
7
  */
8
- export declare const checkboxStyles = "\n:host {\n display: inline-flex;\n width: auto;\n vertical-align: middle;\n}\n\n.checkbox-container {\n display: inline-flex;\n align-items: center;\n outline: none;\n transition: all 0.15s ease-in-out;\n user-select: none;\n cursor: pointer;\n border-radius: 6px;\n gap: var(--ty-spacing-1);\n color: var(--ty-text-faint);\n}\n\n.checkbox-container[aria-checked=\"true\"] {\n color: var(--ty-text);\n}\n\n/* Visible focus ring (keyboard) \u2014 .focused is toggled by the component */\n.checkbox-container.focused,\n.checkbox-container:focus-visible {\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 25%, transparent);\n}\n\n.checkbox-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n color: inherit;\n transition: color 0.15s ease-in-out;\n pointer-events: none;\n /* Let the container handle the click */\n}\n\n/* ===== SIZES ===== */\n\n.checkbox-container svg {\n width: 16px;\n height: 16px;\n}\n\n.checkbox-container.xs svg {\n width: 12px;\n height: 12px;\n}\n\n.checkbox-container.sm svg {\n width: 14px;\n height: 14px;\n}\n\n.checkbox-container.lg svg {\n width: 20px;\n height: 20px;\n}\n\n.checkbox-container.xl svg {\n width: 24px;\n height: 24px;\n}\n\n/* ===== SEMANTIC FLAVORS ===== */\n\n.checkbox-container.primary {\n color: var(--ty-color-primary-soft);\n}\n\n.checkbox-container.primary[aria-checked=\"true\"] {\n color: var(--ty-color-primary);\n}\n\n.checkbox-container.secondary {\n color: var(--ty-color-secondary-soft);\n}\n\n.checkbox-container.secondary[aria-checked=\"true\"] {\n color: var(--ty-color-secondary);\n}\n\n.checkbox-container.success {\n color: var(--ty-color-success-soft);\n}\n\n.checkbox-container.success[aria-checked=\"true\"] {\n color: var(--ty-color-success);\n}\n\n.checkbox-container.danger {\n color: var(--ty-color-danger-soft);\n}\n\n.checkbox-container.danger[aria-checked=\"true\"] {\n color: var(--ty-color-danger);\n}\n\n.checkbox-container.warning {\n color: var(--ty-color-warning-soft);\n}\n\n.checkbox-container.warning[aria-checked=\"true\"] {\n color: var(--ty-color-warning);\n}\n\n.checkbox-container.neutral {\n color: var(--ty-color-neutral-soft);\n}\n\n.checkbox-container.neutral[aria-checked=\"true\"] {\n color: var(--ty-color-neutral);\n}\n\n/* ===== STATES ===== */\n\n/* Clean tick: no box outline, just the checkmark. Inactive = faint tick. */\n.checkbox-container:not([aria-checked=\"true\"]) {\n opacity: 0.35;\n}\n\n/* Indeterminate (dash) sits between unchecked and checked */\n.checkbox-container[aria-checked=\"mixed\"] {\n opacity: 0.7;\n}\n\n/* Disabled must stay distinguishable from merely-unchecked: grayscale kills\n the flavor color, and disabled-unchecked drops below the unchecked 0.35. */\n.checkbox-container.disabled {\n pointer-events: none;\n cursor: not-allowed;\n opacity: 0.5;\n filter: grayscale(1);\n}\n\n.checkbox-container.disabled:not([aria-checked=\"true\"]) {\n opacity: 0.2;\n}\n\n/* Error state */\n.checkbox-container.error .checkbox-icon {\n color: var(--ty-color-danger);\n}\n\n.checkbox-container.error:focus {\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);\n}\n";
8
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
9
+ export declare const checkboxCustomFlavorCss: (base: string) => string;
10
+ export declare const checkboxStyles: string;
9
11
  //# sourceMappingURL=checkbox.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/styles/checkbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,cAAc,spGAqJ1B,CAAC"}
1
+ {"version":3,"file":"checkbox.d.ts","sourceRoot":"","sources":["../../src/styles/checkbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH,8EAA8E;AAC9E,eAAO,MAAM,uBAAuB,GAAI,MAAM,MAAM,WAAoC,CAAC;AAEzF,eAAO,MAAM,cAAc,QA0G1B,CAAC"}
@@ -5,6 +5,27 @@
5
5
  * carries the state. Full flavor color when checked, faint when unchecked,
6
6
  * dash at mid-opacity when indeterminate, grayscale when disabled.
7
7
  */
8
+ import { FLAVORS } from "../types/common.js";
9
+ /* Flavor rules only set --checkbox-color (checked) / --checkbox-color-off
10
+ (unchecked) / --checkbox-ring (focus ring); the base rules below consume
11
+ them. Doubles as the per-instance override API: `ty-checkbox {
12
+ --checkbox-color: … }`. --checkbox-ring pre-resolves the color-mix() here
13
+ (rather than inlining a nested var(...,fallback) as a color-mix argument
14
+ directly in the box-shadow rule) — that nested form fails at
15
+ computed-value time in some engines. Fallback flavor `fb` is used for
16
+ custom flavors so missing tokens degrade to neutral. */
17
+ const checkboxFlavor = (f, fb) => {
18
+ const tok = (s) => fb
19
+ ? `var(--ty-color-${f}${s}, var(--ty-color-${fb}${s}))`
20
+ : `var(--ty-color-${f}${s})`;
21
+ return `
22
+ :host([flavor="${f}"]) { --checkbox-color: ${tok("")}; --checkbox-color-off: ${tok("-soft")}; --checkbox-ring: color-mix(in oklab, ${tok("")} 25%, transparent); }
23
+ :host([flavor="${f}+"]) { --checkbox-color: ${tok("-strong")}; --checkbox-color-off: ${tok("-soft")}; --checkbox-ring: color-mix(in oklab, ${tok("-strong")} 25%, transparent); }
24
+ :host([flavor="${f}-"]) { --checkbox-color: ${tok("-soft")}; --checkbox-color-off: ${tok("-faint")}; --checkbox-ring: color-mix(in oklab, ${tok("-soft")} 25%, transparent); }
25
+ `;
26
+ };
27
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
28
+ export const checkboxCustomFlavorCss = (base) => checkboxFlavor(base, "neutral");
8
29
  export const checkboxStyles = `
9
30
  :host {
10
31
  display: inline-flex;
@@ -21,17 +42,21 @@ export const checkboxStyles = `
21
42
  cursor: pointer;
22
43
  border-radius: 6px;
23
44
  gap: var(--ty-spacing-1);
24
- color: var(--ty-text-faint);
45
+ /* Default (no flavor attribute) is neutral — defaults don't reflect to the
46
+ host attribute, so the fallbacks here carry the default look. */
47
+ color: var(--checkbox-color-off, var(--ty-color-neutral-soft));
25
48
  }
26
49
 
27
50
  .checkbox-container[aria-checked="true"] {
28
- color: var(--ty-text);
51
+ color: var(--checkbox-color, var(--ty-color-neutral));
29
52
  }
30
53
 
31
- /* Visible focus ring (keyboard) — .focused is toggled by the component */
54
+ /* Visible focus ring (keyboard) — .focused is toggled by the component.
55
+ Matches the checked-state color so a danger checkbox gets a red ring,
56
+ not a fixed primary one. */
32
57
  .checkbox-container.focused,
33
58
  .checkbox-container:focus-visible {
34
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 25%, transparent);
59
+ box-shadow: 0 0 0 3px var(--checkbox-ring, color-mix(in oklab, var(--ty-color-primary) 25%, transparent));
35
60
  }
36
61
 
37
62
  .checkbox-icon {
@@ -71,55 +96,8 @@ export const checkboxStyles = `
71
96
  height: 24px;
72
97
  }
73
98
 
74
- /* ===== SEMANTIC FLAVORS ===== */
75
-
76
- .checkbox-container.primary {
77
- color: var(--ty-color-primary-soft);
78
- }
79
-
80
- .checkbox-container.primary[aria-checked="true"] {
81
- color: var(--ty-color-primary);
82
- }
83
-
84
- .checkbox-container.secondary {
85
- color: var(--ty-color-secondary-soft);
86
- }
87
-
88
- .checkbox-container.secondary[aria-checked="true"] {
89
- color: var(--ty-color-secondary);
90
- }
91
-
92
- .checkbox-container.success {
93
- color: var(--ty-color-success-soft);
94
- }
95
-
96
- .checkbox-container.success[aria-checked="true"] {
97
- color: var(--ty-color-success);
98
- }
99
-
100
- .checkbox-container.danger {
101
- color: var(--ty-color-danger-soft);
102
- }
103
-
104
- .checkbox-container.danger[aria-checked="true"] {
105
- color: var(--ty-color-danger);
106
- }
107
-
108
- .checkbox-container.warning {
109
- color: var(--ty-color-warning-soft);
110
- }
111
-
112
- .checkbox-container.warning[aria-checked="true"] {
113
- color: var(--ty-color-warning);
114
- }
115
-
116
- .checkbox-container.neutral {
117
- color: var(--ty-color-neutral-soft);
118
- }
119
-
120
- .checkbox-container.neutral[aria-checked="true"] {
121
- color: var(--ty-color-neutral);
122
- }
99
+ /* ===== SEMANTIC FLAVORS (set --checkbox-color[-off], consumed above) ===== */
100
+ ${FLAVORS.map((f) => checkboxFlavor(f)).join("")}
123
101
 
124
102
  /* ===== STATES ===== */
125
103
 
@@ -1 +1 @@
1
- {"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../src/styles/checkbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqJ7B,CAAC"}
1
+ {"version":3,"file":"checkbox.js","sourceRoot":"","sources":["../../src/styles/checkbox.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;;;;;0DAO0D;AAC1D,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAChD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CACxB,EAAE;QACA,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI;QACvD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,OAAO;iBACQ,CAAC,4BAA4B,GAAG,CAAC,EAAE,CAAC,2BAA2B,GAAG,CAAC,OAAO,CAAC,0CAA0C,GAAG,CAAC,EAAE,CAAC;iBAC5H,CAAC,4BAA4B,GAAG,CAAC,SAAS,CAAC,2BAA2B,GAAG,CAAC,OAAO,CAAC,0CAA0C,GAAG,CAAC,SAAS,CAAC;iBAC1I,CAAC,4BAA4B,GAAG,CAAC,OAAO,CAAC,2BAA2B,GAAG,CAAC,QAAQ,CAAC,0CAA0C,GAAG,CAAC,OAAO,CAAC;CACvJ,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEzF,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuE5B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmC/C,CAAC"}
@@ -3,5 +3,7 @@
3
3
  * Read-only field with copy-to-clipboard functionality
4
4
  * Extends input styles with copy-specific styling
5
5
  */
6
- export declare const copyStyles = "\n/* Copy field value display */\n.copy-field-value {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n user-select: none;\n padding: 0;\n margin: 0;\n background: transparent;\n border: none;\n color: inherit;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n/* Multiline variant */\n.copy-field-value.multiline {\n white-space: pre-wrap;\n word-break: break-word;\n max-height: 200px;\n overflow-y: auto;\n}\n\n/* Keep the copy button pinned to the top-right when content wraps to multiple lines */\n.input-wrapper:has(.copy-field-value.multiline) {\n align-items: flex-start;\n padding-top: 8px;\n padding-bottom: 8px;\n}\n\n/* Horizontal scroll variant - scroll long content instead of clipping with ellipsis */\n.copy-field-value.horizontal-scroll {\n overflow-x: auto;\n overflow-y: hidden;\n text-overflow: clip;\n white-space: nowrap;\n}\n\n/* Multiline + horizontal scroll (e.g. code blocks): preserve lines, scroll both axes */\n.copy-field-value.multiline.horizontal-scroll {\n white-space: pre;\n word-break: normal;\n overflow-y: auto;\n}\n\n/* Hide scrollbars on scrollable value - content still scrolls, chrome stays clean */\n.copy-field-value.multiline,\n.copy-field-value.horizontal-scroll {\n scrollbar-width: none; /* Firefox */\n}\n.copy-field-value.multiline::-webkit-scrollbar,\n.copy-field-value.horizontal-scroll::-webkit-scrollbar {\n display: none; /* Chrome/Safari */\n}\n\n/* Code format */\n.copy-field-value {\n font-size: 0.8em;\n}\n\n/* Hover state - primary soft background */\n.input-wrapper:not(.disabled):hover {\n background: var(--ty-bg-primary-soft);\n transition: background 0.2s ease;\n}\n\n/* Copy button */\n.copy-button {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n cursor: pointer;\n border: none;\n background: transparent;\n color: var(--ty-text-soft);\n transition: color 0.2s ease, transform 0.2s ease;\n padding: 0;\n margin: 0;\n}\n\n.copy-button:hover:not(.disabled) {\n color: var(--ty-text);\n transform: scale(1.1);\n}\n\n.copy-button.success {\n color: var(--ty-color-success);\n animation: copy-feedback 0.3s ease;\n}\n\n.copy-button.error {\n color: var(--ty-color-danger);\n animation: copy-feedback 0.3s ease;\n}\n\n@keyframes copy-feedback {\n 0%, 100% { transform: scale(1); }\n 50% { transform: scale(1.2); }\n}\n\n.copy-button svg {\n width: 18px;\n height: 18px;\n}\n\n.input-wrapper.disabled .copy-button {\n cursor: not-allowed;\n opacity: 0.5;\n}\n\n.input-wrapper.disabled {\n cursor: not-allowed;\n}\n";
6
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
7
+ export declare const copyCustomFlavorCss: (base: string) => string;
8
+ export declare const copyStyles: string;
7
9
  //# sourceMappingURL=copy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/styles/copy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,UAAU,6mFAuHtB,CAAA"}
1
+ {"version":3,"file":"copy.d.ts","sourceRoot":"","sources":["../../src/styles/copy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwBH,8EAA8E;AAC9E,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM,WAAgC,CAAC;AAEjF,eAAO,MAAM,UAAU,QA0HtB,CAAA"}
@@ -3,6 +3,26 @@
3
3
  * Read-only field with copy-to-clipboard functionality
4
4
  * Extends input styles with copy-specific styling
5
5
  */
6
+ import { FLAVORS } from "../types/common.js";
7
+ /* Flavor rules only set --copy-color (button), --copy-color-hover, and
8
+ --copy-bg-hover (wrapper hover); the base rules below consume them.
9
+ Doubles as the per-instance override API. Fallback flavor `fb` is used
10
+ for custom flavors so missing tokens degrade to neutral. */
11
+ const copyFlavor = (f, fb) => {
12
+ const c = (s) => fb
13
+ ? `var(--ty-color-${f}${s}, var(--ty-color-${fb}${s}))`
14
+ : `var(--ty-color-${f}${s})`;
15
+ const bg = (s) => fb
16
+ ? `var(--ty-bg-${f}${s}, var(--ty-bg-${fb}${s}))`
17
+ : `var(--ty-bg-${f}${s})`;
18
+ return `
19
+ :host([flavor="${f}"]) { --copy-color: ${c("")}; --copy-color-hover: ${c("-strong")}; --copy-bg-hover: ${bg("-soft")}; }
20
+ :host([flavor="${f}+"]) { --copy-color: ${c("-strong")}; --copy-color-hover: ${c("-strong")}; --copy-bg-hover: ${bg("-soft")}; }
21
+ :host([flavor="${f}-"]) { --copy-color: ${c("-soft")}; --copy-color-hover: ${c("")}; --copy-bg-hover: ${bg("-soft")}; }
22
+ `;
23
+ };
24
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
25
+ export const copyCustomFlavorCss = (base) => copyFlavor(base, "neutral");
6
26
  export const copyStyles = `
7
27
  /* Copy field value display */
8
28
  .copy-field-value {
@@ -66,9 +86,9 @@ export const copyStyles = `
66
86
  font-size: 0.8em;
67
87
  }
68
88
 
69
- /* Hover state - primary soft background */
89
+ /* Hover state — flavor-soft background (primary by default) */
70
90
  .input-wrapper:not(.disabled):hover {
71
- background: var(--ty-bg-primary-soft);
91
+ background: var(--copy-bg-hover, var(--ty-bg-primary-soft));
72
92
  transition: background 0.2s ease;
73
93
  }
74
94
 
@@ -83,14 +103,14 @@ export const copyStyles = `
83
103
  cursor: pointer;
84
104
  border: none;
85
105
  background: transparent;
86
- color: var(--ty-text-soft);
106
+ color: var(--copy-color, var(--ty-text-soft));
87
107
  transition: color 0.2s ease, transform 0.2s ease;
88
108
  padding: 0;
89
109
  margin: 0;
90
110
  }
91
111
 
92
112
  .copy-button:hover:not(.disabled) {
93
- color: var(--ty-text);
113
+ color: var(--copy-color-hover, var(--ty-text));
94
114
  transform: scale(1.1);
95
115
  }
96
116
 
@@ -122,5 +142,8 @@ export const copyStyles = `
122
142
  .input-wrapper.disabled {
123
143
  cursor: not-allowed;
124
144
  }
145
+
146
+ /* ===== SEMANTIC FLAVORS (set --copy-*, consumed above) ===== */
147
+ ${FLAVORS.map((f) => copyFlavor(f)).join("")}
125
148
  `;
126
149
  //# sourceMappingURL=copy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/styles/copy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuHzB,CAAA"}
1
+ {"version":3,"file":"copy.js","sourceRoot":"","sources":["../../src/styles/copy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;8DAG8D;AAC9D,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAC5C,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CACtB,EAAE;QACA,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,IAAI;QACvD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CACvB,EAAE;QACA,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,iBAAiB,EAAE,GAAG,CAAC,IAAI;QACjD,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B,OAAO;iBACQ,CAAC,wBAAwB,CAAC,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC,OAAO,CAAC;iBACpG,CAAC,wBAAwB,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC,OAAO,CAAC;iBAC3G,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC,EAAE,CAAC,sBAAsB,EAAE,CAAC,OAAO,CAAC;CAClH,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAEjF,MAAM,CAAC,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyHxB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CAC3C,CAAA"}
@@ -2,5 +2,7 @@
2
2
  * Date Picker Component Styles
3
3
  * PORTED FROM: cljs/ty/components/date_picker.css
4
4
  */
5
- export declare const datePickerStyles = "\n/* Date Picker Component Styles */\n:host {\n display: block;\n width: auto;\n min-width: 200px;\n\n /* ==========================================================================\n Theming Tokens \u2014 Date Picker Stub\n Thin shim over --ty-input-*. Override these to retheme just the date-picker\n trigger without affecting other inputs.\n ========================================================================== */\n --ty-date-picker-bg: var(--ty-input-bg);\n --ty-date-picker-color: var(--ty-input-color);\n --ty-date-picker-placeholder: var(--ty-input-placeholder);\n --ty-date-picker-border: var(--ty-input-border);\n --ty-date-picker-border-hover: var(--ty-input-border-hover);\n --ty-date-picker-border-focus: var(--ty-input-border-focus);\n --ty-date-picker-shadow-focus: var(--ty-input-shadow-focus);\n --ty-date-picker-disabled-bg: var(--ty-input-disabled-bg);\n --ty-date-picker-disabled-color: var(--ty-input-disabled-color);\n --ty-date-picker-radius: var(--ty-radius-md);\n\n /* ==========================================================================\n Theming Tokens \u2014 Calendar Popup Surface\n Shared with ty-calendar / ty-calendar-month theming.\n ========================================================================== */\n --ty-calendar-surface-bg: var(--ty-surface-floating);\n --ty-calendar-surface-border: var(--ty-input-border);\n --ty-calendar-surface-shadow: var(--ty-shadow-lg, 0 4px 20px rgba(0, 0, 0, 0.08), 0 1px 3px rgba(0, 0, 0, 0.1));\n --ty-calendar-surface-radius: var(--ty-radius-lg);\n\n /* ==========================================================================\n Theming Tokens \u2014 Time Section\n ========================================================================== */\n --ty-calendar-time-bg: transparent;\n --ty-calendar-time-border: var(--ty-border-faint);\n --ty-calendar-time-label-color: var(--ty-color-neutral);\n --ty-calendar-time-input-color: var(--ty-input-color);\n --ty-calendar-time-placeholder-color: var(--ty-input-placeholder);\n --ty-calendar-time-icon-color: var(--ty-color-neutral-soft);\n}\n\n/* Container structure (reuses dropdown patterns) */\n.dropdown-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n}\n\n.ty-field-label {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-medium);\n color: var(--ty-label-color);\n margin-bottom: 6px;\n padding-left: 12px;\n display: flex;\n align-items: center;\n}\n\n.required-icon {\n display: inline-flex;\n align-items: center;\n color: #ef4444;\n width: 12px;\n height: 12px;\n vertical-align: middle;\n margin-left: 4px;\n}\n\n.dropdown-wrapper {\n position: relative;\n display: block;\n width: 100%;\n}\n\n/* Start-slot icon (leading content inside the date-picker stub) */\n.date-picker-stub ::slotted([slot=\"start\"]) {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n margin-right: 0.5rem;\n color: var(--ty-color-text-soft);\n}\n\n.date-picker-stub ::slotted(ty-icon[slot=\"start\"]) {\n width: 1em;\n height: 1em;\n}\n\n/* Date picker stub (styled like dropdown) */\n.date-picker-stub {\n width: 100%;\n cursor: pointer;\n box-sizing: border-box;\n position: relative;\n display: flex;\n align-items: center;\n background: var(--ty-date-picker-bg);\n color: var(--ty-date-picker-color);\n border: 1px solid var(--ty-date-picker-border);\n border-radius: var(--ty-date-picker-radius);\n font-family: var(--ty-font-sans);\n font-size: var(--ty-font-sm);\n font-weight: var(--ty-font-normal);\n line-height: var(--ty-line-height-tight);\n min-height: var(--ty-size-md);\n padding: var(--ty-spacing-2) var(--ty-spacing-3);\n padding-right: calc(var(--ty-spacing-3) + 1rem + var(--ty-spacing-2));\n transition: var(--ty-transition-all), opacity 0.2s ease;\n outline: none;\n}\n\n.date-picker-stub:hover:not([disabled]):not(.open) {\n border-color: var(--ty-date-picker-border-hover);\n}\n\n.date-picker-stub[disabled] {\n background-color: var(--ty-date-picker-disabled-bg);\n color: var(--ty-date-picker-disabled-color);\n cursor: not-allowed;\n opacity: 0.6;\n}\n\n.date-picker-stub:focus,\n.date-picker-stub.open {\n border-color: var(--ty-date-picker-border-focus);\n box-shadow: 0 0 0 3px var(--ty-date-picker-shadow-focus);\n}\n\n/* Size variants */\n.date-picker-stub.xs {\n min-height: var(--ty-size-xs);\n font-size: var(--ty-font-xs);\n padding: var(--ty-spacing-1) var(--ty-spacing-2);\n padding-right: calc(var(--ty-spacing-2) + 0.875rem + var(--ty-spacing-1));\n}\n\n.date-picker-stub.sm {\n min-height: var(--ty-size-sm);\n font-size: var(--ty-font-xs);\n padding: var(--ty-spacing-1) var(--ty-spacing-2);\n padding-right: calc(var(--ty-spacing-2) + 0.875rem + var(--ty-spacing-1));\n}\n\n.date-picker-stub.lg {\n min-height: var(--ty-size-lg);\n font-size: var(--ty-font-base);\n padding: var(--ty-spacing-2) var(--ty-spacing-4);\n padding-right: calc(var(--ty-spacing-4) + 1.125rem + var(--ty-spacing-2));\n}\n\n.date-picker-stub.xl {\n min-height: var(--ty-size-xl);\n font-size: var(--ty-font-lg);\n padding: var(--ty-spacing-3) var(--ty-spacing-4);\n padding-right: calc(var(--ty-spacing-4) + 1.25rem + var(--ty-spacing-3));\n}\n\n/* Flavor variants */\n/* Primary - Main brand focus state */\n.date-picker-stub.primary {\n border-color: var(--ty-input-primary-border, var(--ty-color-primary));\n}\n\n.date-picker-stub.primary:hover:not([disabled]) {\n border-color: var(--ty-color-primary-bold);\n}\n\n.date-picker-stub.primary:focus,\n.date-picker-stub.primary.open {\n border-color: var(--ty-color-primary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 15%, transparent);\n}\n\n/* Secondary - Supporting action focus state */\n.date-picker-stub.secondary {\n border-color: var(--ty-input-secondary-border, var(--ty-color-secondary));\n}\n\n.date-picker-stub.secondary:hover:not([disabled]) {\n border-color: var(--ty-color-secondary-bold);\n}\n\n.date-picker-stub.secondary:focus,\n.date-picker-stub.secondary.open {\n border-color: var(--ty-color-secondary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-secondary) 15%, transparent);\n}\n\n/* Success - Valid/confirmed input state */\n.date-picker-stub.success {\n border-color: var(--ty-input-success-border, var(--ty-color-success));\n}\n\n.date-picker-stub.success:hover:not([disabled]) {\n border-color: var(--ty-color-success-bold);\n}\n\n.date-picker-stub.success:focus,\n.date-picker-stub.success.open {\n border-color: var(--ty-color-success-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-success) 15%, transparent);\n}\n\n/* Danger - Error/invalid input state */\n.date-picker-stub.danger {\n border-color: var(--ty-input-danger-border, var(--ty-color-danger));\n}\n\n.date-picker-stub.danger:hover:not([disabled]) {\n border-color: var(--ty-color-danger-bold);\n}\n\n.date-picker-stub.danger:focus,\n.date-picker-stub.danger.open {\n border-color: var(--ty-color-danger-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);\n}\n\n/* Warning - Caution/attention needed input state */\n.date-picker-stub.warning {\n border-color: var(--ty-input-warning-border, var(--ty-color-warning));\n}\n\n.date-picker-stub.warning:hover:not([disabled]) {\n border-color: var(--ty-color-warning-bold);\n}\n\n.date-picker-stub.warning:focus,\n.date-picker-stub.warning.open {\n border-color: var(--ty-color-warning-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-warning) 15%, transparent);\n}\n\n/* Text content */\n.stub-text {\n flex: 1;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n user-select: none;\n color: inherit;\n pointer-events: none;\n}\n\n.stub-text.placeholder {\n color: var(--ty-date-picker-placeholder);\n}\n\n/* Icons */\n.stub-icons {\n display: flex;\n align-items: center;\n gap: var(--ty-spacing-1);\n position: absolute;\n right: var(--ty-spacing-3);\n top: 50%;\n transform: translateY(-50%);\n height: 1rem;\n pointer-events: none;\n z-index: 2;\n}\n\n.stub-clear {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n padding: 0;\n border: none;\n background: none;\n color: var(--ty-color-neutral-soft);\n cursor: pointer;\n border-radius: var(--ty-radius-sm);\n transition: all 0.15s ease;\n pointer-events: auto;\n}\n\n.stub-clear:hover {\n color: var(--ty-color-negative);\n background-color: var(--ty-bg-negative-faint);\n}\n\n.stub-arrow {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 1rem;\n height: 1rem;\n color: var(--ty-color-neutral-soft);\n}\n\n.date-picker-stub:hover .stub-arrow {\n color: var(--ty-color-neutral);\n}\n\n.date-picker-stub:focus .stub-arrow,\n.date-picker-stub.open .stub-arrow {\n color: var(--ty-date-picker-border-focus);\n}\n\n/* Calendar dialog (showModal positioning system) */\n.calendar-dialog {\n position: fixed;\n flex-direction: column;\n max-width: 90vw;\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n box-sizing: border-box;\n padding: var(--calendar-padding, 8px);\n\n /* Hidden by default */\n opacity: 0;\n transition: opacity 200ms ease;\n\n transform: translate(var(--calendar-offset-x, 0px), var(--calendar-offset-y, 0px));\n top: -1000px;\n left: -1000px;\n}\n\n/* Direction-based positioning with CSS classes */\n.calendar-dialog.position-below {\n left: var(--calendar-x);\n top: var(--calendar-y);\n}\n\n.calendar-dialog.position-above {\n left: var(--calendar-x);\n bottom: var(--calendar-y);\n top: auto;\n flex-direction: column-reverse;\n}\n\n.calendar-dialog.open {\n opacity: 1;\n}\n\n.calendar-dialog::backdrop {\n background: transparent\n}\n\n/* Calendar content container */\n.calendar-content {\n background-color: var(--ty-calendar-surface-bg);\n border: 1px solid var(--ty-calendar-surface-border);\n border-radius: var(--ty-calendar-surface-radius);\n box-shadow: var(--ty-calendar-surface-shadow);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n align-items: center;\n}\n\n/* Native date input for mobile */\n/* Native input is invisible \u2014 used only to trigger the OS picker */\n.native-date-input {\n position: absolute;\n inset: 0;\n opacity: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n border: none;\n cursor: pointer;\n z-index: 1;\n}\n\n.native-date-input::-webkit-calendar-picker-indicator {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n cursor: pointer;\n}\n\n/* Time input section */\n.time-section {\n display: flex;\n min-height: 2.5rem;\n align-items: center;\n justify-content: center;\n gap: 0.5rem;\n padding: 0.5rem 1rem;\n border-top: 1px solid var(--ty-calendar-time-border);\n background-color: var(--ty-calendar-time-bg);\n width: 100%;\n box-sizing: border-box;\n position: relative;\n}\n\n.time-label {\n font-size: var(--ty-font-sm);\n font-weight: 500;\n color: var(--ty-calendar-time-label-color);\n flex-shrink: 0;\n}\n\n.time-input {\n width: 3.5rem;\n border: 1px solid var(--ty-input-border);\n border-radius: var(--ty-radius-sm);\n background: var(--ty-input-bg);\n color: var(--ty-calendar-time-input-color);\n font-family: var(--ty-font-sans);\n font-size: var(--ty-font-sm);\n font-variant-numeric: tabular-nums;\n text-align: center;\n padding: 0.25rem 0.375rem;\n outline: none;\n transition: var(--ty-transition-all);\n}\n\n.time-input:focus {\n border-color: var(--ty-input-border-focus);\n box-shadow: 0 0 0 3px var(--ty-input-shadow-focus);\n}\n\n.time-input::placeholder {\n color: var(--ty-calendar-time-placeholder-color);\n}\n\n.time-icon {\n display: flex;\n align-items: center;\n color: var(--ty-calendar-time-icon-color);\n width: 1rem;\n height: 1rem;\n flex-shrink: 0;\n}\n";
5
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
6
+ export declare const datePickerCustomFlavorCss: (base: string) => string;
7
+ export declare const datePickerStyles: string;
6
8
  //# sourceMappingURL=date-picker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/styles/date-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,gBAAgB,41XAwb5B,CAAC"}
1
+ {"version":3,"file":"date-picker.d.ts","sourceRoot":"","sources":["../../src/styles/date-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAsCH,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB,GAAI,MAAM,MAAM,WAAsC,CAAC;AAE7F,eAAO,MAAM,gBAAgB,QAuW5B,CAAC"}
@@ -2,12 +2,48 @@
2
2
  * Date Picker Component Styles
3
3
  * PORTED FROM: cljs/ty/components/date_picker.css
4
4
  */
5
+ import { FLAVORS } from "../types/common.js";
6
+ /* Flavor rules only set --date-picker-accent (border), -accent-bold
7
+ (hover/focus border), and -ring (focus shadow); the stub base rules
8
+ consume them. Doubles as the per-instance override API. Neutral is
9
+ skipped — the 'default' flavor is the unstyled --ty-date-picker-* chrome.
10
+ Fallback flavor `fb` is used for custom flavors (suffixed tokens fall
11
+ back to the custom base color, then neutral). */
12
+ const datePickerFlavor = (f, fb) => {
13
+ const c = (s) => fb
14
+ ? s
15
+ ? `var(--ty-color-${f}${s}, var(--ty-color-${f}, var(--ty-color-${fb}${s})))`
16
+ : `var(--ty-color-${f}, var(--ty-color-${fb}))`
17
+ : s
18
+ ? `var(--ty-color-${f}${s}, var(--ty-color-${f}))`
19
+ : `var(--ty-color-${f})`;
20
+ return `
21
+ :host([flavor="${f}"]) {
22
+ --date-picker-accent: var(--ty-input-${f}-border, ${c("-soft")});
23
+ --date-picker-accent-bold: ${c("")};
24
+ --date-picker-ring: color-mix(in oklab, ${c("")} 15%, transparent);
25
+ }
26
+ :host([flavor="${f}+"]) {
27
+ --date-picker-accent: ${c("")};
28
+ --date-picker-accent-bold: ${c("-strong")};
29
+ --date-picker-ring: color-mix(in oklab, ${c("-strong")} 15%, transparent);
30
+ }
31
+ :host([flavor="${f}-"]) {
32
+ --date-picker-accent: ${c("-faint")};
33
+ --date-picker-accent-bold: ${c("-soft")};
34
+ --date-picker-ring: color-mix(in oklab, ${c("-soft")} 15%, transparent);
35
+ }
36
+ `;
37
+ };
38
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
39
+ export const datePickerCustomFlavorCss = (base) => datePickerFlavor(base, "neutral");
5
40
  export const datePickerStyles = `
6
41
  /* Date Picker Component Styles */
7
42
  :host {
8
43
  display: block;
9
44
  width: auto;
10
45
  min-width: 200px;
46
+ font-family: var(--ty-font-sans);
11
47
 
12
48
  /* ==========================================================================
13
49
  Theming Tokens — Date Picker Stub
@@ -106,7 +142,7 @@ export const datePickerStyles = `
106
142
  align-items: center;
107
143
  background: var(--ty-date-picker-bg);
108
144
  color: var(--ty-date-picker-color);
109
- border: 1px solid var(--ty-date-picker-border);
145
+ border: 1px solid var(--date-picker-accent, var(--ty-date-picker-border));
110
146
  border-radius: var(--ty-date-picker-radius);
111
147
  font-family: var(--ty-font-sans);
112
148
  font-size: var(--ty-font-sm);
@@ -120,7 +156,7 @@ export const datePickerStyles = `
120
156
  }
121
157
 
122
158
  .date-picker-stub:hover:not([disabled]):not(.open) {
123
- border-color: var(--ty-date-picker-border-hover);
159
+ border-color: var(--date-picker-accent-bold, var(--ty-date-picker-border-hover));
124
160
  }
125
161
 
126
162
  .date-picker-stub[disabled] {
@@ -132,18 +168,11 @@ export const datePickerStyles = `
132
168
 
133
169
  .date-picker-stub:focus,
134
170
  .date-picker-stub.open {
135
- border-color: var(--ty-date-picker-border-focus);
136
- box-shadow: 0 0 0 3px var(--ty-date-picker-shadow-focus);
171
+ border-color: var(--date-picker-accent-bold, var(--ty-date-picker-border-focus));
172
+ box-shadow: 0 0 0 3px var(--date-picker-ring, var(--ty-date-picker-shadow-focus));
137
173
  }
138
174
 
139
175
  /* Size variants */
140
- .date-picker-stub.xs {
141
- min-height: var(--ty-size-xs);
142
- font-size: var(--ty-font-xs);
143
- padding: var(--ty-spacing-1) var(--ty-spacing-2);
144
- padding-right: calc(var(--ty-spacing-2) + 0.875rem + var(--ty-spacing-1));
145
- }
146
-
147
176
  .date-picker-stub.sm {
148
177
  min-height: var(--ty-size-sm);
149
178
  font-size: var(--ty-font-xs);
@@ -158,88 +187,8 @@ export const datePickerStyles = `
158
187
  padding-right: calc(var(--ty-spacing-4) + 1.125rem + var(--ty-spacing-2));
159
188
  }
160
189
 
161
- .date-picker-stub.xl {
162
- min-height: var(--ty-size-xl);
163
- font-size: var(--ty-font-lg);
164
- padding: var(--ty-spacing-3) var(--ty-spacing-4);
165
- padding-right: calc(var(--ty-spacing-4) + 1.25rem + var(--ty-spacing-3));
166
- }
167
-
168
- /* Flavor variants */
169
- /* Primary - Main brand focus state */
170
- .date-picker-stub.primary {
171
- border-color: var(--ty-input-primary-border, var(--ty-color-primary));
172
- }
173
-
174
- .date-picker-stub.primary:hover:not([disabled]) {
175
- border-color: var(--ty-color-primary-bold);
176
- }
177
-
178
- .date-picker-stub.primary:focus,
179
- .date-picker-stub.primary.open {
180
- border-color: var(--ty-color-primary-bold);
181
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 15%, transparent);
182
- }
183
-
184
- /* Secondary - Supporting action focus state */
185
- .date-picker-stub.secondary {
186
- border-color: var(--ty-input-secondary-border, var(--ty-color-secondary));
187
- }
188
-
189
- .date-picker-stub.secondary:hover:not([disabled]) {
190
- border-color: var(--ty-color-secondary-bold);
191
- }
192
-
193
- .date-picker-stub.secondary:focus,
194
- .date-picker-stub.secondary.open {
195
- border-color: var(--ty-color-secondary-bold);
196
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-secondary) 15%, transparent);
197
- }
198
-
199
- /* Success - Valid/confirmed input state */
200
- .date-picker-stub.success {
201
- border-color: var(--ty-input-success-border, var(--ty-color-success));
202
- }
203
-
204
- .date-picker-stub.success:hover:not([disabled]) {
205
- border-color: var(--ty-color-success-bold);
206
- }
207
-
208
- .date-picker-stub.success:focus,
209
- .date-picker-stub.success.open {
210
- border-color: var(--ty-color-success-bold);
211
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-success) 15%, transparent);
212
- }
213
-
214
- /* Danger - Error/invalid input state */
215
- .date-picker-stub.danger {
216
- border-color: var(--ty-input-danger-border, var(--ty-color-danger));
217
- }
218
-
219
- .date-picker-stub.danger:hover:not([disabled]) {
220
- border-color: var(--ty-color-danger-bold);
221
- }
222
-
223
- .date-picker-stub.danger:focus,
224
- .date-picker-stub.danger.open {
225
- border-color: var(--ty-color-danger-bold);
226
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);
227
- }
228
-
229
- /* Warning - Caution/attention needed input state */
230
- .date-picker-stub.warning {
231
- border-color: var(--ty-input-warning-border, var(--ty-color-warning));
232
- }
233
-
234
- .date-picker-stub.warning:hover:not([disabled]) {
235
- border-color: var(--ty-color-warning-bold);
236
- }
237
-
238
- .date-picker-stub.warning:focus,
239
- .date-picker-stub.warning.open {
240
- border-color: var(--ty-color-warning-bold);
241
- box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-warning) 15%, transparent);
242
- }
190
+ /* Flavor variants — set --date-picker-accent*, consumed by the stub rules above */
191
+ ${FLAVORS.filter((f) => f !== "neutral").map((f) => datePickerFlavor(f)).join("")}
243
192
 
244
193
  /* Text content */
245
194
  .stub-text {
@@ -287,8 +236,13 @@ export const datePickerStyles = `
287
236
  }
288
237
 
289
238
  .stub-clear:hover {
290
- color: var(--ty-color-negative);
291
- background-color: var(--ty-bg-negative-faint);
239
+ /* Clear is a destructive utility action, not the field's semantic flavor
240
+ — it stays neutral at rest and always warns danger-red on hover,
241
+ regardless of the field's own flavor. (--ty-color-negative/
242
+ --ty-bg-negative-faint used here previously don't exist as tokens —
243
+ this silently fell back to unstyled inherited color.) */
244
+ color: var(--ty-color-danger);
245
+ background-color: var(--ty-bg-danger-soft);
292
246
  }
293
247
 
294
248
  .stub-arrow {
@@ -297,16 +251,16 @@ export const datePickerStyles = `
297
251
  justify-content: center;
298
252
  width: 1rem;
299
253
  height: 1rem;
300
- color: var(--ty-color-neutral-soft);
254
+ color: var(--date-picker-accent, var(--ty-color-neutral-soft));
301
255
  }
302
256
 
303
257
  .date-picker-stub:hover .stub-arrow {
304
- color: var(--ty-color-neutral);
258
+ color: var(--date-picker-accent-bold, var(--ty-color-neutral));
305
259
  }
306
260
 
307
261
  .date-picker-stub:focus .stub-arrow,
308
262
  .date-picker-stub.open .stub-arrow {
309
- color: var(--ty-date-picker-border-focus);
263
+ color: var(--date-picker-accent-bold, var(--ty-date-picker-border-focus));
310
264
  }
311
265
 
312
266
  /* Calendar dialog (showModal positioning system) */
@@ -1 +1 @@
1
- {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../../src/styles/date-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwb/B,CAAC"}
1
+ {"version":3,"file":"date-picker.js","sourceRoot":"","sources":["../../src/styles/date-picker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;;;mDAKmD;AACnD,MAAM,gBAAgB,GAAG,CAAC,CAAS,EAAE,EAAW,EAAE,EAAE;IAClD,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CACtB,EAAE;QACA,CAAC,CAAC,CAAC;YACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,GAAG,CAAC,KAAK;YAC7E,CAAC,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,IAAI;QACjD,CAAC,CAAC,CAAC;YACD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI;YAClD,CAAC,CAAC,kBAAkB,CAAC,GAAG,CAAC;IAC/B,OAAO;iBACQ,CAAC;yCACuB,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;+BACjC,CAAC,CAAC,EAAE,CAAC;4CACQ,CAAC,CAAC,EAAE,CAAC;;iBAEhC,CAAC;0BACQ,CAAC,CAAC,EAAE,CAAC;+BACA,CAAC,CAAC,SAAS,CAAC;4CACC,CAAC,CAAC,SAAS,CAAC;;iBAEvC,CAAC;0BACQ,CAAC,CAAC,QAAQ,CAAC;+BACN,CAAC,CAAC,OAAO,CAAC;4CACG,CAAC,CAAC,OAAO,CAAC;;CAErD,CAAC;AACF,CAAC,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAE7F,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuJ9B,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgNhF,CAAC"}
@@ -3,5 +3,7 @@
3
3
  * PORTED FROM: clj/ty/components/input.css
4
4
  * Phase A: Regular input styles only (no checkbox, no numeric formatting)
5
5
  */
6
- export declare const inputStyles = "\n:host {\n display: block;\n font-family: var(--ty-font-sans);\n width: 100%;\n}\n\n:host([size=\"xl\"]) {\n font-size: 20px;\n}\n\n\n:host([size=\"xs\"]) {\n font-size: 12px;\n}\n\n\n:host([size=\"sm\"]) {\n font-size: 14px;\n}\n\n:host([size=\"lg\"]) {\n font-size: 18px;\n}\n\n.input-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n}\n\n/* ===== LABEL STYLING ===== */\n\n.ty-field-label {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-medium);\n color: var(--ty-label-color);\n margin-bottom: 6px;\n padding-left: 12px;\n display: flex;\n align-items: center;\n}\n\n/* Required indicator - using SVG icon */\n.required-icon {\n display: inline-flex;\n align-items: center;\n color: var(--ty-color-danger);\n width: 12px;\n height: 12px;\n margin-left: 4px;\n vertical-align: middle;\n}\n\n.required-icon svg {\n width: 100%;\n height: 100%;\n}\n\n/* ===== INPUT WRAPPER WITH SLOTS ===== */\n\n.input-wrapper {\n display: flex;\n align-items: center;\n gap: 0.5rem; /* No gap by default */\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--input-border, var(--ty-input-border));\n border-radius: var(--ty-radius-base);\n background: var(--input-bg, var(--input-bg, var(--ty-input-bg)));\n transition: all 0.15s ease-in-out;\n \n /* Default size (md) */\n min-height: 40px;\n padding: 0 12px;\n}\n\n/* Wrapper states */\n.input-wrapper:hover:not(.disabled) {\n border-color: var(--input-border-hover, var(--ty-input-border-hover));\n}\n\n.input-wrapper.focused {\n border-color: var(--input-border-focus, var(--ty-input-border-focus));\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n.input-wrapper.disabled {\n cursor: not-allowed;\n opacity: 0.5;\n background: var(--input-disabled-bg, var(--ty-input-disabled-bg));\n border-color: var(--input-disabled-border, var(--ty-input-disabled-border));\n}\n\n/* ===== SLOT STYLING ===== */\n\n/* Style slotted content directly (no wrappers needed) */\n::slotted([slot=\"start\"]),\n::slotted([slot=\"end\"]) {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n color: var(--ty-color-text-soft);\n}\n\n/* Password reveal toggle (rendered for type=\"password\") */\n.password-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n padding: 0;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--input-placeholder, var(--ty-input-placeholder));\n transition: color 0.15s ease-in-out;\n}\n.password-toggle:hover {\n color: var(--input-color, var(--ty-input-color));\n}\n.password-toggle:focus-visible {\n outline: 2px solid var(--ty-color-primary);\n outline-offset: 2px;\n border-radius: 2px;\n}\n.password-toggle svg {\n width: 1rem;\n height: 1rem;\n}\n\n/* Icon sizing for slotted icons */\n::slotted(ty-icon) {\n width: 1em;\n height: 1em;\n flex-shrink: 0;\n}\n\n/* ===== ERROR MESSAGE STYLING ===== */\n\n.error-message {\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n color: var(--ty-color-danger);\n margin-top: 4px;\n padding-left: 12px;\n}\n\n/* Error state for wrapper */\n.input-wrapper.error {\n border-color: var(--ty-color-danger);\n background: var(--ty-bg-danger-soft);\n}\n\n.input-wrapper.error.focused {\n border-color: var(--ty-color-danger-bold);\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n/* ===== INPUT BASE STYLING ===== */\n\ninput {\n /* Reset and base styles \u2014 Linear-paired typography */\n flex: 1;\n min-width: 0;\n box-sizing: border-box;\n border: none;\n outline: none;\n background: transparent;\n color: var(--input-color, var(--ty-input-color));\n font-family: inherit;\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-normal);\n padding: 0;\n margin: 0;\n}\n\n/* Remove number input spinner arrows */\ninput[type=\"number\"]::-webkit-outer-spin-button,\ninput[type=\"number\"]::-webkit-inner-spin-button {\n -webkit-appearance: none;\n margin: 0;\n}\n\ninput[type=\"number\"] {\n -moz-appearance: textfield;\n}\n\n/* Disabled state */\ninput:disabled {\n cursor: not-allowed;\n color: var(--input-disabled-color, var(--ty-input-disabled-color));\n}\n\n/* Placeholder styling */\ninput::placeholder {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n font-weight: 400;\n}\n\n/* ===== SIZE MODIFIERS ===== */\n\n/* Extra Small */\n.input-wrapper.xs {\n min-height: 32px;\n padding: 0 8px;\n border-radius: var(--ty-input-radius-xs, var(--ty-radius-base));\n}\n\n.input-wrapper.xs input {\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n}\n\n/* Small */\n.input-wrapper.sm {\n min-height: 36px;\n padding: 0 10px;\n border-radius: var(--ty-input-radius-sm, var(--ty-radius-base));\n}\n\n.input-wrapper.sm input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\n/* Medium (default) */\n.input-wrapper.md {\n min-height: 40px;\n padding: 0 12px;\n border-radius: var(--ty-input-radius-md, var(--ty-radius-base));\n}\n\n.input-wrapper.md input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\n/* Large */\n.input-wrapper.lg {\n min-height: 44px;\n padding: 0 14px;\n border-radius: var(--ty-input-radius-lg, var(--ty-radius-base));\n}\n\n.input-wrapper.lg input {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n}\n\n/* Extra Large */\n.input-wrapper.xl {\n min-height: 48px;\n padding: 0 16px;\n border-radius: var(--ty-input-radius-xl, var(--ty-radius-base));\n}\n\n.input-wrapper.xl input {\n font-size: var(--ty-font-lg);\n line-height: var(--ty-leading-lg);\n letter-spacing: var(--ty-tracking-lg);\n}\n\n/* ===== SEMANTIC FLAVOR MODIFIERS ===== */\n\n/* Primary */\n.input-wrapper.primary {\n border-color: var(--ty-input-primary-border, var(--ty-color-primary));\n}\n\n.input-wrapper.primary:hover:not(.disabled) {\n border-color: var(--ty-color-primary-bold);\n}\n\n.input-wrapper.primary.focused {\n border-color: var(--ty-color-primary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-primary) 15%, transparent);\n}\n\n/* Secondary */\n.input-wrapper.secondary {\n border-color: var(--ty-input-secondary-border, var(--ty-color-secondary));\n}\n\n.input-wrapper.secondary.focused {\n border-color: var(--ty-color-secondary-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-secondary) 15%, transparent);\n}\n\n/* Success */\n.input-wrapper.success {\n border-color: var(--ty-input-success-border);\n}\n\n.input-wrapper.success:hover:not(.disabled) {\n border-color: var(--ty-color-success-bold);\n}\n\n.input-wrapper.success.focused {\n border-color: var(--ty-color-success-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-success) 15%, transparent);\n}\n\n/* Danger */\n.input-wrapper.danger {\n border-color: var(--ty-input-danger-border);\n}\n\n.input-wrapper.danger:hover:not(.disabled) {\n border-color: var(--ty-color-danger-bold);\n}\n\n.input-wrapper.danger.focused {\n border-color: var(--ty-color-danger-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-danger) 15%, transparent);\n}\n\n/* Warning */\n.input-wrapper.warning {\n border-color: var(--ty-input-warning-border);\n}\n\n.input-wrapper.warning:hover:not(.disabled) {\n border-color: var(--ty-color-warning-bold);\n}\n\n.input-wrapper.warning.focused {\n border-color: var(--ty-color-warning-bold);\n box-shadow: 0 0 0 3px color-mix(in oklab, var(--ty-color-warning) 15%, transparent);\n}\n\n/* Neutral (default) */\n.input-wrapper.neutral.focused {\n border-color: var(--input-border-focus, var(--ty-input-border-focus));\n box-shadow: 0 0 0 3px var(--input-shadow-focus, var(--ty-input-shadow-focus));\n}\n\n/* ===== ACCESSIBILITY ENHANCEMENTS ===== */\n\ninput:focus-visible {\n outline: none;\n}\n\n/* High contrast mode support */\n@media (prefers-contrast: high) {\n .input-wrapper {\n border-width: 2px;\n }\n}\n\n/* Reduced motion support */\n@media (prefers-reduced-motion: reduce) {\n .input-wrapper {\n transition: none;\n }\n}\n\n/* ===== RESPONSIVE BEHAVIOR ===== */\n\n@media (max-width: 640px) {\n .input-wrapper.lg {\n min-height: 40px;\n padding: 0 12px;\n }\n\n .input-wrapper.lg input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n }\n\n .input-wrapper.xl {\n min-height: 44px;\n padding: 0 14px;\n }\n\n .input-wrapper.xl input {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n }\n}\n\n@media (max-width: 480px) {\n .input-wrapper.xl {\n min-height: 40px;\n padding: 0 12px;\n }\n\n .input-wrapper.xl input {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n }\n}\n";
6
+ /** Rules for one custom (non-built-in) flavor — see utils/flavor-sheet.ts. */
7
+ export declare const inputCustomFlavorCss: (base: string) => string;
8
+ export declare const inputStyles: string;
7
9
  //# sourceMappingURL=input.d.ts.map