tyrell-components 1.0.0-TC52 → 1.0.0-TC53
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.
- package/css/tyrell-theme.css +25 -2
- package/css/tyrell.css +4 -0
- package/dist/tyrell-colors-static.css +1 -316
- package/dist/tyrell-theme.css +1 -1443
- package/dist/tyrell.css +1 -1390
- package/dist/tyrell.js +1 -1
- package/lib/base/ty-component.js +196 -196
- package/lib/components/button.d.ts +1 -1
- package/lib/components/button.js +260 -259
- package/lib/components/calendar-month.d.ts +2 -2
- package/lib/components/calendar-month.js +426 -416
- package/lib/components/calendar-navigation.js +238 -238
- package/lib/components/calendar.js +605 -602
- package/lib/components/checkbox.d.ts +1 -1
- package/lib/components/checkbox.js +273 -272
- package/lib/components/copy.d.ts +1 -1
- package/lib/components/copy.js +279 -278
- package/lib/components/date-picker.d.ts +1 -1
- package/lib/components/date-picker.js +1103 -1108
- package/lib/components/file-upload.js +404 -404
- package/lib/components/icon.js +141 -141
- package/lib/components/input.d.ts +1 -1
- package/lib/components/input.js +593 -596
- package/lib/components/modal.js +319 -319
- package/lib/components/option.js +167 -167
- package/lib/components/popup.js +233 -233
- package/lib/components/radio.d.ts +2 -2
- package/lib/components/radio.js +407 -406
- package/lib/components/resize-observer.js +67 -67
- package/lib/components/scroll-container.js +294 -294
- package/lib/components/select.d.ts +1 -1
- package/lib/components/select.js +1524 -1532
- package/lib/components/selected-tags.js +184 -184
- package/lib/components/step.js +62 -62
- package/lib/components/switch.d.ts +1 -1
- package/lib/components/switch.js +214 -213
- package/lib/components/tab.js +62 -62
- package/lib/components/tabs.js +507 -507
- package/lib/components/tag.d.ts +1 -1
- package/lib/components/tag.js +236 -235
- package/lib/components/textarea.d.ts +1 -1
- package/lib/components/textarea.js +457 -456
- package/lib/components/tooltip.js +283 -283
- package/lib/components/wizard.js +384 -384
- package/lib/icons/heroicons/micro.js +392 -392
- package/lib/icons/heroicons/mini.js +382 -382
- package/lib/icons/heroicons/outline.js +337 -337
- package/lib/icons/heroicons/solid.js +407 -407
- package/lib/icons/lucide.js +22843 -22843
- package/lib/icons/material/filled.js +9653 -9653
- package/lib/icons/material/outlined.js +10271 -10271
- package/lib/icons/material/round.js +10495 -10495
- package/lib/icons/material/sharp.js +9905 -9905
- package/lib/icons/material/two-tone.js +12792 -12792
- package/lib/index.js +21 -21
- package/lib/styles/button.js +176 -288
- package/lib/styles/calendar-month.js +123 -183
- package/lib/styles/calendar-navigation.js +60 -79
- package/lib/styles/calendar.js +8 -9
- package/lib/styles/checkbox.js +45 -72
- package/lib/styles/copy.js +67 -91
- package/lib/styles/custom-scrollbar.js +80 -100
- package/lib/styles/date-picker.js +261 -331
- package/lib/styles/field-size.d.ts +6 -0
- package/lib/styles/field-size.js +91 -0
- package/lib/styles/file-upload.js +139 -169
- package/lib/styles/icon.js +92 -156
- package/lib/styles/input.js +125 -241
- package/lib/styles/modal.js +67 -102
- package/lib/styles/option.d.ts +1 -1
- package/lib/styles/option.js +47 -67
- package/lib/styles/popup.js +34 -65
- package/lib/styles/radio.js +69 -96
- package/lib/styles/resize-observer.js +2 -5
- package/lib/styles/scroll-container.js +100 -130
- package/lib/styles/select-base.js +525 -778
- package/lib/styles/select.js +140 -228
- package/lib/styles/step.js +22 -29
- package/lib/styles/switch.js +34 -55
- package/lib/styles/tab.js +22 -29
- package/lib/styles/tabs.js +171 -252
- package/lib/styles/tag.js +135 -188
- package/lib/styles/textarea.d.ts +1 -1
- package/lib/styles/textarea.js +205 -271
- package/lib/styles/tooltip.js +3 -3
- package/lib/styles/wizard.js +170 -226
- package/lib/types/common.d.ts +2 -0
- package/lib/types/common.js +6 -5
- package/lib/utils/calendar-utils.js +100 -100
- package/lib/utils/custom-scrollbar.js +272 -272
- package/lib/utils/flavor-sheet.js +14 -14
- package/lib/utils/icon-registry.js +127 -127
- package/lib/utils/loader-registry.js +3 -3
- package/lib/utils/locale.js +34 -34
- package/lib/utils/mobile.js +1 -1
- package/lib/utils/number-format.js +54 -54
- package/lib/utils/positioning.js +212 -212
- package/lib/utils/property-capture.js +36 -36
- package/lib/utils/property-manager.js +125 -125
- package/lib/utils/resize-observer.js +23 -23
- package/lib/utils/scroll-lock.js +57 -57
- package/lib/utils/styles.js +17 -17
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +4 -4
package/lib/styles/tag.js
CHANGED
|
@@ -2,278 +2,225 @@ import { FLAVORS } from '../types/common.js';
|
|
|
2
2
|
const COLOR_FLAVORS = FLAVORS.filter((f) => f !== 'neutral');
|
|
3
3
|
const tagFlavor = (f) => `
|
|
4
4
|
:host([flavor="${f}"]) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
--tag-bg: var(--ty-bg-${f});
|
|
6
|
+
--tag-color: var(--ty-color-${f});
|
|
7
|
+
--tag-border-color: var(--ty-border-${f});
|
|
8
8
|
}
|
|
9
9
|
:host([flavor="${f}+"]) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
--tag-bg: var(--ty-bg-${f}-bold);
|
|
11
|
+
--tag-color: var(--ty-color-${f}-strong);
|
|
12
|
+
--tag-border-color: var(--ty-color-${f});
|
|
13
13
|
}
|
|
14
14
|
:host([flavor="${f}-"]) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
--tag-bg: var(--ty-bg-${f}-soft);
|
|
16
|
+
--tag-color: var(--ty-color-${f});
|
|
17
|
+
--tag-border-color: var(--ty-border-${f});
|
|
18
18
|
}
|
|
19
19
|
:host([flavor="${f}"]) .tag-container[tabindex]:hover,
|
|
20
20
|
:host([flavor="${f}+"]) .tag-container[tabindex]:hover,
|
|
21
21
|
:host([flavor="${f}-"]) .tag-container[tabindex]:hover {
|
|
22
|
-
|
|
22
|
+
background: var(--ty-bg-${f}-bold);
|
|
23
23
|
}
|
|
24
24
|
:host([flavor="${f}"]) .tag-container[tabindex]:focus,
|
|
25
25
|
:host([flavor="${f}+"]) .tag-container[tabindex]:focus,
|
|
26
26
|
:host([flavor="${f}-"]) .tag-container[tabindex]:focus {
|
|
27
|
-
|
|
27
|
+
box-shadow: 0 0 0 3px var(--ty-color-${f}-faint);
|
|
28
28
|
}
|
|
29
29
|
`;
|
|
30
30
|
export const tagStyles = `
|
|
31
31
|
:host([hidden]) {
|
|
32
|
-
|
|
32
|
+
display: none !important;
|
|
33
33
|
}
|
|
34
|
-
|
|
35
34
|
.tag-container {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
transition: var(--ty-transition-all);
|
|
58
|
-
|
|
59
|
-
/* Colors via custom properties — override on :host for full control */
|
|
60
|
-
background: var(--tag-bg, transparent);
|
|
61
|
-
color: var(--tag-color, var(--ty-text));
|
|
62
|
-
border: 1px solid;
|
|
63
|
-
border-color: var(--tag-border-color, var(--ty-border));
|
|
64
|
-
}
|
|
65
|
-
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: center;
|
|
37
|
+
justify-content: center;
|
|
38
|
+
gap: var(--ty-spacing-1);
|
|
39
|
+
border-radius: var(--ty-radius-full);
|
|
40
|
+
font-weight: var(--ty-weight-label, 440);
|
|
41
|
+
text-align: center;
|
|
42
|
+
white-space: nowrap;
|
|
43
|
+
user-select: none;
|
|
44
|
+
box-sizing: border-box;
|
|
45
|
+
padding: 0 0.625rem;
|
|
46
|
+
font-size: var(--ty-font-xs);
|
|
47
|
+
line-height: var(--ty-leading-xs);
|
|
48
|
+
letter-spacing: var(--ty-tracking-xs);
|
|
49
|
+
min-height: 28px;
|
|
50
|
+
transition: var(--ty-transition-all);
|
|
51
|
+
background: var(--tag-bg, transparent);
|
|
52
|
+
color: var(--tag-color, var(--ty-text));
|
|
53
|
+
border: 1px solid;
|
|
54
|
+
border-color: var(--tag-border-color, var(--ty-border));
|
|
55
|
+
}
|
|
66
56
|
:host([pill="false"]) .tag-container,
|
|
67
57
|
:host([not-pill]) .tag-container {
|
|
68
|
-
|
|
69
|
-
/* 6px instead of full pill */
|
|
58
|
+
border-radius: var(--ty-radius-md);
|
|
70
59
|
}
|
|
71
|
-
|
|
72
|
-
/* Tags with value attribute but NOT selected should be clickable */
|
|
73
60
|
:host([value]:not([selected])) .tag-container:not([aria-disabled="true"]) {
|
|
74
|
-
|
|
61
|
+
cursor: pointer;
|
|
75
62
|
}
|
|
76
|
-
|
|
77
63
|
:host([selected]) .tag-container:not([aria-disabled="true"]) {
|
|
78
|
-
|
|
64
|
+
cursor: initial;
|
|
79
65
|
}
|
|
80
|
-
|
|
81
66
|
.tag-container[tabindex]:not([aria-disabled="true"]):hover {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
67
|
+
background: var(--ty-bg-neutral-soft);
|
|
68
|
+
transform: translateY(-1px);
|
|
69
|
+
box-shadow: var(--ty-shadow-sm);
|
|
85
70
|
}
|
|
86
|
-
|
|
87
71
|
.tag-container[tabindex]:not([aria-disabled="true"]):active {
|
|
88
|
-
|
|
89
|
-
|
|
72
|
+
transform: translateY(0);
|
|
73
|
+
box-shadow: var(--ty-shadow-sm);
|
|
90
74
|
}
|
|
91
|
-
|
|
92
75
|
.tag-container[tabindex]:focus {
|
|
93
|
-
|
|
76
|
+
outline: none;
|
|
94
77
|
}
|
|
95
|
-
|
|
96
78
|
.tag-container[aria-disabled="true"] {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
79
|
+
opacity: 0.6;
|
|
80
|
+
cursor: not-allowed;
|
|
81
|
+
pointer-events: none;
|
|
100
82
|
}
|
|
101
|
-
|
|
102
83
|
.tag-start,
|
|
103
84
|
.tag-content,
|
|
104
85
|
.tag-end {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
86
|
+
display: flex;
|
|
87
|
+
align-items: center;
|
|
88
|
+
justify-content: center;
|
|
89
|
+
flex-shrink: 0;
|
|
109
90
|
}
|
|
110
|
-
|
|
111
91
|
.tag-content {
|
|
112
|
-
|
|
113
|
-
|
|
92
|
+
flex: 1;
|
|
93
|
+
min-width: 0;
|
|
114
94
|
}
|
|
115
|
-
|
|
116
95
|
.tag-dismiss {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
96
|
+
display: inline-flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
justify-content: center;
|
|
99
|
+
padding: 0;
|
|
100
|
+
background: none;
|
|
101
|
+
border: none;
|
|
102
|
+
color: currentColor;
|
|
103
|
+
cursor: pointer;
|
|
104
|
+
border-radius: var(--ty-radius-full);
|
|
105
|
+
transition: var(--ty-transition-all);
|
|
106
|
+
opacity: 0.7;
|
|
107
|
+
flex-shrink: 0;
|
|
108
|
+
width: var(--ty-spacing-4);
|
|
109
|
+
height: var(--ty-spacing-4);
|
|
110
|
+
}
|
|
134
111
|
.tag-dismiss:hover {
|
|
135
|
-
|
|
136
|
-
|
|
112
|
+
opacity: 1;
|
|
113
|
+
background: rgba(0, 0, 0, 0.1);
|
|
137
114
|
}
|
|
138
|
-
|
|
139
115
|
.tag-dismiss svg {
|
|
140
|
-
|
|
141
|
-
|
|
116
|
+
width: 100%;
|
|
117
|
+
height: 100%;
|
|
142
118
|
}
|
|
143
|
-
|
|
144
119
|
:host([size="xs"]) .tag-container {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
120
|
+
padding: 0 0.375rem;
|
|
121
|
+
font-size: var(--ty-font-xs);
|
|
122
|
+
line-height: var(--ty-leading-xs);
|
|
123
|
+
letter-spacing: var(--ty-tracking-xs);
|
|
124
|
+
min-height: 20px;
|
|
150
125
|
}
|
|
151
|
-
|
|
152
126
|
:host([size="xs"]) .tag-dismiss {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
127
|
+
width: var(--ty-spacing-3);
|
|
128
|
+
height: var(--ty-spacing-3);
|
|
129
|
+
margin-left: var(--ty-spacing-2);
|
|
156
130
|
}
|
|
157
|
-
|
|
158
131
|
:host([size="sm"]) .tag-container {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
132
|
+
padding: 0 var(--ty-spacing-2);
|
|
133
|
+
font-size: var(--ty-font-xs);
|
|
134
|
+
line-height: var(--ty-leading-xs);
|
|
135
|
+
letter-spacing: var(--ty-tracking-xs);
|
|
136
|
+
min-height: 24px;
|
|
164
137
|
}
|
|
165
|
-
|
|
166
138
|
:host([size="sm"]) .tag-dismiss {
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
139
|
+
width: var(--ty-spacing-3);
|
|
140
|
+
height: var(--ty-spacing-3);
|
|
141
|
+
margin-left: var(--ty-spacing-2);
|
|
170
142
|
}
|
|
171
|
-
|
|
172
|
-
/* MD is the default — no explicit [size="md"] selector needed */
|
|
173
|
-
|
|
174
143
|
:host([size="lg"]) .tag-container {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
144
|
+
padding: 0 var(--ty-spacing-3);
|
|
145
|
+
font-size: var(--ty-font-sm);
|
|
146
|
+
line-height: var(--ty-leading-sm);
|
|
147
|
+
letter-spacing: var(--ty-tracking-sm);
|
|
148
|
+
min-height: 32px;
|
|
180
149
|
}
|
|
181
|
-
|
|
182
150
|
:host([size="lg"]) .tag-dismiss {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
151
|
+
width: var(--ty-spacing-5);
|
|
152
|
+
height: var(--ty-spacing-5);
|
|
153
|
+
margin-left: var(--ty-spacing-4);
|
|
186
154
|
}
|
|
187
|
-
|
|
188
155
|
:host([size="xl"]) .tag-container {
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
156
|
+
padding: 0 0.875rem;
|
|
157
|
+
font-size: var(--ty-font-sm);
|
|
158
|
+
line-height: var(--ty-leading-sm);
|
|
159
|
+
letter-spacing: var(--ty-tracking-sm);
|
|
160
|
+
min-height: 36px;
|
|
194
161
|
}
|
|
195
|
-
|
|
196
162
|
:host([size="xl"]) .tag-dismiss {
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/* Each flavor sets --tag-bg / --tag-color / --tag-border-color on :host.
|
|
203
|
-
Append '+' to flavor for a stronger shade (mild background, strong color),
|
|
204
|
-
or '-' for a softer shade (soft background, base color).
|
|
205
|
-
Generated per flavor above; neutral diverges (text/border tokens) and
|
|
206
|
-
stays hand-written below. */
|
|
207
|
-
|
|
163
|
+
width: var(--ty-spacing-5);
|
|
164
|
+
height: var(--ty-spacing-5);
|
|
165
|
+
margin-left: var(--ty-spacing-4);
|
|
166
|
+
}
|
|
208
167
|
${COLOR_FLAVORS.map(tagFlavor).join('')}
|
|
209
168
|
:host([flavor="neutral"]) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
169
|
+
--tag-color: var(--ty-text-bold);
|
|
170
|
+
--tag-bg: var(--ty-bg-neutral-soft);
|
|
171
|
+
--tag-border-color: var(--ty-border-bold);
|
|
213
172
|
}
|
|
214
|
-
|
|
215
173
|
:host([flavor="neutral+"]) {
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
174
|
+
--tag-bg: var(--ty-bg-neutral-bold);
|
|
175
|
+
--tag-color: var(--ty-text-bold);
|
|
176
|
+
--tag-border-color: var(--ty-border-strong);
|
|
219
177
|
}
|
|
220
178
|
:host([flavor="neutral-"]) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
179
|
+
--tag-bg: var(--ty-bg-neutral-soft);
|
|
180
|
+
--tag-color: var(--ty-text-soft);
|
|
181
|
+
--tag-border-color: var(--ty-border);
|
|
224
182
|
}
|
|
225
183
|
:host([flavor="neutral"]) .tag-container[tabindex]:hover,
|
|
226
184
|
:host([flavor="neutral+"]) .tag-container[tabindex]:hover,
|
|
227
185
|
:host([flavor="neutral-"]) .tag-container[tabindex]:hover {
|
|
228
|
-
|
|
186
|
+
background: var(--ty-bg-neutral-soft);
|
|
229
187
|
}
|
|
230
188
|
:host([flavor="neutral"]) .tag-container[tabindex]:focus,
|
|
231
189
|
:host([flavor="neutral+"]) .tag-container[tabindex]:focus,
|
|
232
190
|
:host([flavor="neutral-"]) .tag-container[tabindex]:focus {
|
|
233
|
-
|
|
191
|
+
box-shadow: 0 0 0 3px var(--ty-border-soft);
|
|
234
192
|
}
|
|
235
|
-
|
|
236
193
|
.tag-start ::slotted(*),
|
|
237
194
|
.tag-content ::slotted(*),
|
|
238
195
|
.tag-end ::slotted(*) {
|
|
239
|
-
|
|
240
|
-
|
|
196
|
+
display: flex;
|
|
197
|
+
align-items: center;
|
|
241
198
|
}
|
|
242
|
-
|
|
243
199
|
.tag-start ::slotted(ty-icon),
|
|
244
200
|
.tag-end ::slotted(ty-icon) {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
201
|
+
width: 1em;
|
|
202
|
+
height: 1em;
|
|
203
|
+
flex-shrink: 0;
|
|
248
204
|
}
|
|
249
|
-
|
|
250
205
|
.tag-end ::slotted(.count) {
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
line-height: var(--ty-line-height-none);
|
|
265
|
-
flex-shrink: 0;
|
|
266
|
-
}
|
|
267
|
-
|
|
206
|
+
display: inline-flex;
|
|
207
|
+
align-items: center;
|
|
208
|
+
justify-content: center;
|
|
209
|
+
min-width: var(--ty-spacing-6);
|
|
210
|
+
height: var(--ty-spacing-5);
|
|
211
|
+
padding: 0 var(--ty-spacing-2);
|
|
212
|
+
background: rgba(0, 0, 0, 0.1);
|
|
213
|
+
border-radius: var(--ty-radius-full);
|
|
214
|
+
font-size: var(--ty-font-xs);
|
|
215
|
+
font-weight: var(--ty-font-semibold);
|
|
216
|
+
line-height: var(--ty-line-height-none);
|
|
217
|
+
flex-shrink: 0;
|
|
218
|
+
}
|
|
268
219
|
.tag-content {
|
|
269
|
-
|
|
270
|
-
|
|
220
|
+
overflow: hidden;
|
|
221
|
+
text-overflow: ellipsis;
|
|
271
222
|
}
|
|
272
|
-
|
|
273
223
|
:host([data-type="user"]) .tag-container {
|
|
274
|
-
|
|
275
|
-
/* 80px for user tags */
|
|
224
|
+
min-width: var(--ty-spacing-20);
|
|
276
225
|
}
|
|
277
|
-
|
|
278
|
-
/* Dark mode is handled automatically by the centralized variables */
|
|
279
226
|
`;
|
package/lib/styles/textarea.d.ts
CHANGED
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Styles for ty-textarea component
|
|
3
3
|
* Enhanced textarea with auto-resize functionality
|
|
4
4
|
*/
|
|
5
|
-
export declare const textareaStyles = "\n:host {\n display: block;\n font-family: inherit;\n width: 100%;\n}\n\n.textarea-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n position: relative;\n /* For absolute positioned dummy element */\n}\n\n/* Bordered container \u2014 owns the border + active state (composer layout):\n header (top slot) \u00B7 textarea (borderless) \u00B7 footer (bottom slot). */\n.textarea-wrapper {\n position: relative;\n width: 100%;\n display: flex;\n flex-direction: column;\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(--ty-input-bg));\n transition: var(--ty-local-transition, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out);\n}\n\n/* Active ring tied to the TEXTAREA specifically (not :focus-within) so tabbing\n to a footer button doesn't make the whole field look focused. */\n.textarea-wrapper:has(textarea:focus) {\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/* Error + disabled reflected from the inner textarea (both in shadow DOM, so\n :has is reliable here \u2014 unlike slotted content). */\n.textarea-wrapper:has(textarea.error) {\n border-color: var(--ty-color-danger);\n background: var(--ty-bg-danger-soft);\n}\n.textarea-wrapper:has(textarea.error):has(textarea:focus) {\n border-color: var(--ty-color-danger-bold);\n}\n.textarea-wrapper:has(textarea:disabled) {\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/* Scroll region wraps just the textarea so the custom scrollbar never overlaps\n the header/footer. */\n.textarea-scroll {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n}\n\n/* Custom scrollbar track positioned to the scroll region (textarea edges) */\n.textarea-scroll .ty-scrollbar-track-y {\n top: 2px;\n right: 2px;\n bottom: 2px;\n border-radius: 0 4px 4px 0;\n}\n\n/* Header / footer slot regions \u2014 zero footprint until they have content\n (the component toggles .has-content via slotchange). footer defaults to\n space-between so \"tools \u2026 submit\" works; a single wide button fills it. */\n.textarea-header,\n.textarea-footer {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.textarea-footer { justify-content: space-between; }\n.textarea-header.has-content {\n padding: 6px 10px;\n border-bottom: 1px solid var(--ty-textarea-divider, var(--input-border, var(--ty-input-border)));\n}\n.textarea-footer.has-content {\n padding: 6px 10px;\n border-top: 1px solid var(--ty-textarea-divider, var(--input-border, var(--ty-input-border)));\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}\n\n.required-icon {\n display: inline-flex;\n align-items: center;\n color: var(--ty-color-danger);\n width: 12px;\n height: 12px;\n vertical-align: middle;\n}\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 is reflected on .textarea-wrapper (see above). */\n\ntextarea {\n font-family: inherit;\n /* Borderless \u2014 the .textarea-wrapper owns the border/background now. */\n box-sizing: border-box;\n width: 100%;\n flex: 1 1 auto;\n border: none;\n background: transparent;\n color: var(--input-color, var(--ty-input-color));\n font-family: inherit;\n /* Linear-paired typography */\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 outline: none;\n\n min-height: 80px;\n padding: 12px 12px;\n\n overflow: hidden;\n /* Hide scrollbars since we're auto-resizing */\n resize: none;\n\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n/* Hide native scrollbar for webkit when custom scrollbar is active\n (scrollbar-width: none handles Firefox; this handles Chrome/Safari) */\n:host([data-custom-scroll]) textarea::-webkit-scrollbar {\n display: none;\n}\n\n/* Disabled \u2014 visual state lives on the wrapper; just the cursor/text here. */\ntextarea:disabled {\n cursor: not-allowed;\n color: var(--input-disabled-color, var(--ty-input-disabled-color));\n}\n\ntextarea::placeholder {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n font-weight: 400;\n}\n\ntextarea.resize-both {\n resize: both;\n}\n\ntextarea.resize-horizontal {\n resize: horizontal;\n}\n\ntextarea.resize-vertical {\n resize: vertical;\n}\n\ntextarea.resize-none {\n resize: none;\n}\n\n/* Auto-resize mode (default) disables manual resize */\ntextarea:not(.resize-both):not(.resize-horizontal):not(.resize-vertical) {\n resize: none;\n}\n\n.textarea-dummy {\n /* Hidden element that measures text height */\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n visibility: hidden !important;\n white-space: pre-wrap !important;\n word-break: break-word !important;\n box-sizing: border-box !important;\n overflow: hidden !important;\n pointer-events: none !important;\n z-index: -1 !important;\n\n word-wrap: break-word !important;\n overflow-wrap: break-word !important;\n}\n\ntextarea.xs {\n min-height: 64px;\n padding: 8px 10px;\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n}\n\ntextarea.sm {\n min-height: 72px;\n padding: 10px 10px;\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\ntextarea.md {\n min-height: 80px;\n padding: 12px 12px;\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\ntextarea.lg {\n min-height: 96px;\n padding: 14px 14px;\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n}\n\ntextarea.xl {\n min-height: 112px;\n padding: 16px 16px;\n font-size: var(--ty-font-lg);\n line-height: var(--ty-leading-lg);\n letter-spacing: var(--ty-tracking-lg);\n}\n\ntextarea:focus-visible {\n outline: none;\n /* We use box-shadow instead */\n}\n\n@media (prefers-contrast: high) {\n textarea {\n border-width: 2px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n textarea {\n transition: none;\n }\n\n .textarea-dummy {\n transition: none;\n }\n}\n\n@container (max-width: 480px) {\n textarea.lg {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px 12px;\n min-height: 80px;\n }\n\n textarea.xl {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n padding: 14px 14px;\n min-height: 96px;\n }\n}\n\n@container (max-width: 320px) {\n textarea.xl {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px 12px;\n min-height: 80px;\n }\n}\n\n/* Fallback for browsers without container query support */\n@media (max-width: 640px) {\n textarea.lg {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px 12px;\n min-height: 80px;\n }\n\n textarea.xl {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n padding: 14px 14px;\n min-height: 96px;\n }\n}\n\n@media (max-width: 480px) {\n textarea.xl {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px 12px;\n min-height: 80px;\n }\n}\n\ntextarea {\n transition: var(--ty-local-transition,\n border-color 0.15s ease-in-out,\n box-shadow 0.15s ease-in-out,\n background-color 0.15s ease-in-out,\n height 0.1s ease-out);\n}\n\n/* Disable height transition on focus to avoid jarring effect */\ntextarea:focus {\n transition: var(--ty-local-transition,\n border-color 0.15s ease-in-out,\n box-shadow 0.15s ease-in-out,\n background-color 0.15s ease-in-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n textarea {\n transition: none;\n }\n}\n";
|
|
5
|
+
export declare const textareaStyles = "\n\n:host {\n --ty-field-height: var(--ty-size-sm, 2rem);\n --ty-field-pad-x: 10px;\n --ty-field-font: var(--ty-font-sm);\n --ty-field-leading: 20px;\n --ty-field-tracking: var(--ty-tracking-sm);\n --ty-field-label-font: var(--ty-font-xs);\n --ty-field-label-leading: var(--ty-leading-xs);\n --ty-field-label-gap: 5px;\n /* Text that sits OUTSIDE the field box (label, error message) has to line up\n with the value INSIDE it. The value is inset by the wrapper's 1px border\n plus --ty-field-pad-x; outside text only ever cleared the padding, so it\n started exactly 1px to the left of the value it labelled \u2014 at every rung,\n on every field. Resolved per rung: the calc reads whichever --ty-field-pad-x\n is winning on the host. */\n --ty-field-outer-pad-x: calc(var(--ty-field-pad-x) + 1px);\n --ty-field-control: 24px;\n --ty-field-icon: 16px;\n}\n\n:host([size=\"xs\"]) {\n --ty-field-height: var(--ty-size-xs, 1.75rem);\n --ty-field-pad-x: 8px;\n --ty-field-font: var(--ty-font-xs);\n --ty-field-leading: 16px;\n --ty-field-tracking: var(--ty-tracking-xs);\n --ty-field-label-font: var(--ty-font-xs);\n --ty-field-label-leading: var(--ty-leading-xs);\n --ty-field-label-gap: 4px;\n --ty-field-control: 20px;\n --ty-field-icon: 14px;\n}\n\n:host([size=\"md\"]) {\n --ty-field-height: var(--ty-size-md, 2.25rem);\n --ty-field-pad-x: 12px;\n --ty-field-font: var(--ty-font-sm);\n --ty-field-leading: 20px;\n --ty-field-tracking: var(--ty-tracking-sm);\n --ty-field-label-font: var(--ty-font-sm);\n --ty-field-label-leading: var(--ty-leading-sm);\n --ty-field-label-gap: 6px;\n --ty-field-control: 28px;\n --ty-field-icon: 18px;\n}\n\n:host([size=\"lg\"]) {\n --ty-field-height: var(--ty-size-lg, 2.5rem);\n --ty-field-pad-x: 14px;\n --ty-field-font: var(--ty-font-base);\n --ty-field-leading: 24px;\n --ty-field-tracking: var(--ty-tracking-base);\n --ty-field-label-font: var(--ty-font-sm);\n --ty-field-label-leading: var(--ty-leading-sm);\n --ty-field-label-gap: 6px;\n --ty-field-control: 32px;\n --ty-field-icon: 20px;\n}\n\n:host([size=\"xl\"]) {\n --ty-field-height: var(--ty-size-xl, 2.75rem);\n --ty-field-pad-x: 16px;\n --ty-field-font: var(--ty-font-lg);\n --ty-field-leading: 28px;\n --ty-field-tracking: var(--ty-tracking-base);\n --ty-field-label-font: var(--ty-font-base);\n --ty-field-label-leading: var(--ty-leading-base);\n --ty-field-label-gap: 8px;\n --ty-field-control: 36px;\n --ty-field-icon: 22px;\n}\n\n/* Narrow viewports drop the two biggest rungs one step \u2014 same ladder, no\n component-specific overrides.\n\n A stepped-down rung must carry the WHOLE rung: --ty-field-control is the\n in-field button box (ty-copy's copy button, the date-picker's icon), and it\n sets the wrapper's content height. Leave it at the original rung and the\n field ends up taller than --ty-field-height \u2014 the ladder silently breaks on\n exactly one component. */\n@media (max-width: 640px) {\n :host([size=\"lg\"]) {\n --ty-field-height: var(--ty-size-md, 2.25rem);\n --ty-field-pad-x: 12px;\n --ty-field-font: var(--ty-font-sm);\n --ty-field-leading: 20px;\n --ty-field-control: 28px;\n --ty-field-icon: 18px;\n }\n\n :host([size=\"xl\"]) {\n --ty-field-height: var(--ty-size-lg, 2.5rem);\n --ty-field-pad-x: 14px;\n --ty-field-font: var(--ty-font-base);\n --ty-field-leading: 24px;\n --ty-field-control: 32px;\n --ty-field-icon: 20px;\n }\n}\n\n@media (max-width: 480px) {\n :host([size=\"xl\"]) {\n --ty-field-height: var(--ty-size-md, 2.25rem);\n --ty-field-pad-x: 12px;\n --ty-field-font: var(--ty-font-sm);\n --ty-field-leading: 20px;\n --ty-field-control: 28px;\n --ty-field-icon: 18px;\n }\n}\n\n:host {\n display: block;\n font-family: inherit;\n width: 100%;\n}\n\n.textarea-container {\n display: flex;\n flex-direction: column;\n width: 100%;\n box-sizing: border-box;\n position: relative;\n /* For absolute positioned dummy element */\n}\n\n/* Bordered container \u2014 owns the border + active state (composer layout):\n header (top slot) \u00B7 textarea (borderless) \u00B7 footer (bottom slot). */\n.textarea-wrapper {\n position: relative;\n width: 100%;\n display: flex;\n flex-direction: column;\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(--ty-input-bg));\n transition: var(--ty-local-transition, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out);\n}\n\n/* Active ring tied to the TEXTAREA specifically (not :focus-within) so tabbing\n to a footer button doesn't make the whole field look focused. */\n.textarea-wrapper:has(textarea:focus) {\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/* Error + disabled reflected from the inner textarea (both in shadow DOM, so\n :has is reliable here \u2014 unlike slotted content). */\n.textarea-wrapper:has(textarea.error) {\n border-color: var(--ty-color-danger);\n background: var(--ty-bg-danger-soft);\n}\n.textarea-wrapper:has(textarea.error):has(textarea:focus) {\n border-color: var(--ty-color-danger-bold);\n}\n.textarea-wrapper:has(textarea:disabled) {\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/* Scroll region wraps just the textarea so the custom scrollbar never overlaps\n the header/footer. */\n.textarea-scroll {\n position: relative;\n flex: 1 1 auto;\n min-height: 0;\n display: flex;\n}\n\n/* Custom scrollbar track positioned to the scroll region (textarea edges) */\n.textarea-scroll .ty-scrollbar-track-y {\n top: 2px;\n right: 2px;\n bottom: 2px;\n border-radius: 0 4px 4px 0;\n}\n\n/* Header / footer slot regions \u2014 zero footprint until they have content\n (the component toggles .has-content via slotchange). footer defaults to\n space-between so \"tools \u2026 submit\" works; a single wide button fills it. */\n.textarea-header,\n.textarea-footer {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.textarea-footer { justify-content: space-between; }\n.textarea-header.has-content {\n padding: 6px 10px;\n border-bottom: 1px solid var(--ty-textarea-divider, var(--input-border, var(--ty-input-border)));\n}\n.textarea-footer.has-content {\n padding: 6px 10px;\n border-top: 1px solid var(--ty-textarea-divider, var(--input-border, var(--ty-input-border)));\n}\n\n.ty-field-label {\n font-size: var(--ty-field-label-font);\n line-height: var(--ty-field-label-leading);\n letter-spacing: var(--ty-tracking-sm);\n font-weight: var(--ty-font-medium);\n color: var(--ty-label-color);\n margin-bottom: var(--ty-field-label-gap);\n padding-left: var(--ty-field-outer-pad-x);\n}\n\n.required-icon {\n display: inline-flex;\n align-items: center;\n color: var(--ty-color-danger);\n width: 12px;\n height: 12px;\n vertical-align: middle;\n}\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: var(--ty-field-outer-pad-x);\n}\n\n/* Error state is reflected on .textarea-wrapper (see above). */\n\ntextarea {\n font-family: inherit;\n /* Borderless \u2014 the .textarea-wrapper owns the border/background now. */\n box-sizing: border-box;\n width: 100%;\n flex: 1 1 auto;\n border: none;\n background: transparent;\n color: var(--input-color, var(--ty-input-color));\n font-family: inherit;\n /* Linear-paired typography */\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 outline: none;\n\n min-height: 80px;\n padding: 12px 12px;\n\n overflow: hidden;\n /* Hide scrollbars since we're auto-resizing */\n resize: none;\n\n white-space: pre-wrap;\n word-wrap: break-word;\n}\n\n/* Hide native scrollbar for webkit when custom scrollbar is active\n (scrollbar-width: none handles Firefox; this handles Chrome/Safari) */\n:host([data-custom-scroll]) textarea::-webkit-scrollbar {\n display: none;\n}\n\n/* Disabled \u2014 visual state lives on the wrapper; just the cursor/text here. */\ntextarea:disabled {\n cursor: not-allowed;\n color: var(--input-disabled-color, var(--ty-input-disabled-color));\n}\n\ntextarea::placeholder {\n color: var(--input-placeholder, var(--ty-input-placeholder));\n font-weight: 400;\n}\n\ntextarea.resize-both {\n resize: both;\n}\n\ntextarea.resize-horizontal {\n resize: horizontal;\n}\n\ntextarea.resize-vertical {\n resize: vertical;\n}\n\ntextarea.resize-none {\n resize: none;\n}\n\n/* Auto-resize mode (default) disables manual resize */\ntextarea:not(.resize-both):not(.resize-horizontal):not(.resize-vertical) {\n resize: none;\n}\n\n.textarea-dummy {\n /* Hidden element that measures text height */\n position: absolute !important;\n top: 0 !important;\n left: 0 !important;\n visibility: hidden !important;\n white-space: pre-wrap !important;\n word-break: break-word !important;\n box-sizing: border-box !important;\n overflow: hidden !important;\n pointer-events: none !important;\n z-index: -1 !important;\n\n word-wrap: break-word !important;\n overflow-wrap: break-word !important;\n}\n\ntextarea.xs {\n min-height: 64px;\n padding: 8px var(--ty-field-pad-x);\n font-size: var(--ty-font-xs);\n line-height: var(--ty-leading-xs);\n letter-spacing: var(--ty-tracking-xs);\n}\n\ntextarea.sm {\n min-height: 72px;\n padding: 10px var(--ty-field-pad-x);\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\ntextarea.md {\n min-height: 80px;\n padding: 12px var(--ty-field-pad-x);\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n}\n\ntextarea.lg {\n min-height: 96px;\n padding: 14px var(--ty-field-pad-x);\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n}\n\ntextarea.xl {\n min-height: 112px;\n padding: 16px var(--ty-field-pad-x);\n font-size: var(--ty-font-lg);\n line-height: var(--ty-leading-lg);\n letter-spacing: var(--ty-tracking-lg);\n}\n\ntextarea:focus-visible {\n outline: none;\n /* We use box-shadow instead */\n}\n\n@media (prefers-contrast: high) {\n textarea {\n border-width: 2px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n textarea {\n transition: none;\n }\n\n .textarea-dummy {\n transition: none;\n }\n}\n\n@container (max-width: 480px) {\n textarea.lg {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px var(--ty-field-pad-x);\n min-height: 80px;\n }\n\n textarea.xl {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n padding: 14px var(--ty-field-pad-x);\n min-height: 96px;\n }\n}\n\n@container (max-width: 320px) {\n textarea.xl {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px var(--ty-field-pad-x);\n min-height: 80px;\n }\n}\n\n/* Fallback for browsers without container query support */\n@media (max-width: 640px) {\n textarea.lg {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px var(--ty-field-pad-x);\n min-height: 80px;\n }\n\n textarea.xl {\n font-size: var(--ty-font-base);\n line-height: var(--ty-leading-base);\n letter-spacing: var(--ty-tracking-base);\n padding: 14px var(--ty-field-pad-x);\n min-height: 96px;\n }\n}\n\n@media (max-width: 480px) {\n textarea.xl {\n font-size: var(--ty-font-sm);\n line-height: var(--ty-leading-sm);\n letter-spacing: var(--ty-tracking-sm);\n padding: 12px var(--ty-field-pad-x);\n min-height: 80px;\n }\n}\n\ntextarea {\n transition: var(--ty-local-transition,\n border-color 0.15s ease-in-out,\n box-shadow 0.15s ease-in-out,\n background-color 0.15s ease-in-out,\n height 0.1s ease-out);\n}\n\n/* Disable height transition on focus to avoid jarring effect */\ntextarea:focus {\n transition: var(--ty-local-transition,\n border-color 0.15s ease-in-out,\n box-shadow 0.15s ease-in-out,\n background-color 0.15s ease-in-out);\n}\n\n@media (prefers-reduced-motion: reduce) {\n textarea {\n transition: none;\n }\n}\n";
|