trace-css 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +0 -3
  3. package/dist/trace.classless.conditional.css +1534 -0
  4. package/dist/trace.classless.conditional.min.css +1 -0
  5. package/dist/trace.classless.css +1532 -0
  6. package/dist/trace.classless.min.css +1 -0
  7. package/dist/trace.conditional.css +2138 -0
  8. package/dist/trace.conditional.min.css +1 -0
  9. package/dist/trace.css +2136 -0
  10. package/dist/trace.min.css +1 -0
  11. package/dist/tracecss.classless.conditional.css +1534 -0
  12. package/dist/tracecss.classless.conditional.min.css +1 -0
  13. package/dist/tracecss.classless.css +1532 -0
  14. package/dist/tracecss.classless.min.css +1 -0
  15. package/dist/tracecss.conditional.css +2138 -0
  16. package/dist/tracecss.conditional.min.css +1 -0
  17. package/dist/tracecss.css +2136 -0
  18. package/dist/tracecss.min.css +1 -0
  19. package/package.json +55 -4
  20. package/src/classless.css +16 -0
  21. package/src/content/link.css +75 -0
  22. package/src/content/table.css +108 -0
  23. package/src/content/table.extensions.css +45 -0
  24. package/src/content/typography.css +201 -0
  25. package/src/elements/button.css +168 -0
  26. package/src/elements/button.extensions.css +171 -0
  27. package/src/elements/icon.extensions.css +22 -0
  28. package/src/elements/loader.css +73 -0
  29. package/src/elements/loader.extensions.css +27 -0
  30. package/src/forms/checkbox.css +146 -0
  31. package/src/forms/checkbox.extensions.css +9 -0
  32. package/src/forms/file.css +39 -0
  33. package/src/forms/input.css +199 -0
  34. package/src/forms/input.extensions.css +171 -0
  35. package/src/forms/radio.css +112 -0
  36. package/src/forms/radio.extensions.css +9 -0
  37. package/src/forms/range.css +170 -0
  38. package/src/forms/range.extensions.css +13 -0
  39. package/src/forms/select.css +160 -0
  40. package/src/forms/select.extensions.css +107 -0
  41. package/src/forms/switch.css +156 -0
  42. package/src/forms/switch.extensions.css +122 -0
  43. package/src/forms/textarea.css +133 -0
  44. package/src/forms/textarea.extensions.css +15 -0
  45. package/src/foundation.css +35 -0
  46. package/src/index.css +14 -0
  47. package/src/variables.css +112 -0
@@ -0,0 +1,160 @@
1
+ @layer trace.elements {
2
+ :where(:root) {
3
+ --trace-select-font-size: 1rem;
4
+ --trace-select-line-height: 1.5rem;
5
+ --trace-select-padding-block: 0.375rem;
6
+ --trace-select-padding-inline: 0.625rem;
7
+ --trace-select-radius: var(--trace-radius-control);
8
+ --trace-select-text: var(--trace-text);
9
+ --trace-select-border: light-dark(
10
+ var(--trace-primary),
11
+ var(--trace-secondary)
12
+ );
13
+ --trace-select-focus: light-dark(
14
+ var(--trace-primary-light),
15
+ var(--trace-secondary-light)
16
+ );
17
+ --trace-select-error: var(--trace-danger);
18
+ --trace-select-shadow: var(--trace-shadow);
19
+ --trace-select-arrow: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23646b79' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
20
+ --trace-select-arrow-offset: var(--trace-select-padding-inline);
21
+ --trace-select-arrow-size: 1.25em;
22
+ }
23
+
24
+ :where(select) {
25
+ --_trace-select-border: var(--trace-select-border);
26
+ display: block;
27
+ box-sizing: border-box;
28
+ inline-size: 100%;
29
+ min-inline-size: 0;
30
+ margin: 0;
31
+ padding: var(--trace-select-padding-block)
32
+ var(--trace-select-padding-inline);
33
+ border: 2px solid var(--_trace-select-border);
34
+ border-radius: var(--trace-select-radius);
35
+ background: var(--trace-select-bg, var(--trace-control-bg));
36
+ color: var(--trace-select-text);
37
+ font-family: var(--trace-font-body);
38
+ font-size: var(--trace-select-font-size);
39
+ line-height: var(--trace-select-line-height);
40
+ text-align: start;
41
+ appearance: auto;
42
+ cursor: pointer;
43
+ transition:
44
+ border-color 200ms ease-in-out,
45
+ box-shadow 200ms ease-in-out;
46
+
47
+ &:hover:not(:disabled):not(:focus) {
48
+ box-shadow: var(--trace-select-shadow);
49
+ }
50
+
51
+ &:focus {
52
+ --_trace-select-border: var(--trace-select-focus);
53
+ outline: 2px solid transparent;
54
+ outline-offset: 2px;
55
+ box-shadow: 0 0 0 4px
56
+ color-mix(in srgb, var(--trace-select-focus), transparent 70%);
57
+ }
58
+
59
+ &[aria-invalid="true"] {
60
+ --_trace-select-border: var(--trace-select-error);
61
+ }
62
+
63
+ &:user-invalid {
64
+ --_trace-select-border: var(--trace-select-error);
65
+ }
66
+
67
+ &:disabled {
68
+ opacity: 0.5;
69
+ cursor: not-allowed;
70
+ box-shadow: none;
71
+ }
72
+
73
+ @media (prefers-reduced-motion: reduce) {
74
+ transition: none;
75
+ }
76
+ }
77
+ :where(
78
+ select:not([multiple]):not([size]),
79
+ select:not([multiple])[size="0"],
80
+ select:not([multiple])[size="1"]
81
+ ) {
82
+ appearance: none;
83
+ padding-inline-end: calc(
84
+ var(--trace-select-arrow-offset) + var(--trace-select-arrow-size) +
85
+ var(--trace-select-padding-inline)
86
+ );
87
+ background-image: var(--trace-select-arrow);
88
+ background-repeat: no-repeat;
89
+ background-size: var(--trace-select-arrow-size)
90
+ var(--trace-select-arrow-size);
91
+ background-position: right var(--trace-select-arrow-offset) center;
92
+
93
+ &:dir(rtl) {
94
+ background-position: left var(--trace-select-arrow-offset) center;
95
+ }
96
+
97
+ @media (forced-colors: active) {
98
+ appearance: auto;
99
+ background-image: none;
100
+ }
101
+ }
102
+ :where(select option, select optgroup) {
103
+ background-color: var(--trace-select-bg, var(--trace-control-bg));
104
+ color: var(--trace-select-text);
105
+ }
106
+
107
+ :where(select[multiple], select[size]:not([size="1"])) {
108
+ cursor: default;
109
+ }
110
+
111
+ :where(label:has(> select)) {
112
+ display: grid;
113
+ gap: 0.25rem;
114
+ min-inline-size: 0;
115
+
116
+ color: var(--trace-select-text);
117
+ cursor: pointer;
118
+
119
+ & > small {
120
+ margin: 0;
121
+ line-height: 1.5;
122
+ }
123
+
124
+ &:has(> select:disabled) {
125
+ color: color-mix(in srgb, var(--trace-select-text), transparent 50%);
126
+ cursor: not-allowed;
127
+ }
128
+
129
+ &:has(> select[aria-invalid="true"]) > small:last-child {
130
+ color: var(--trace-select-error);
131
+ }
132
+
133
+ &:has(> select:user-invalid) > small:last-child {
134
+ color: var(--trace-select-error);
135
+ }
136
+ }
137
+
138
+ :where(label:has(> select) + small) {
139
+ display: block;
140
+ margin-block-start: 0.25rem;
141
+ line-height: 1.5;
142
+ }
143
+
144
+ :where(label:has(> select[aria-invalid="true"]) + small) {
145
+ color: var(--trace-select-error);
146
+ }
147
+
148
+ :where(label:has(> select:user-invalid) + small) {
149
+ color: var(--trace-select-error);
150
+ }
151
+
152
+ :where(label[for]:has(+ select:disabled)) {
153
+ opacity: 0.5;
154
+ cursor: not-allowed;
155
+ }
156
+
157
+ :where(select[aria-invalid="true"] + small, select:user-invalid + small) {
158
+ color: var(--trace-select-error);
159
+ }
160
+ }
@@ -0,0 +1,107 @@
1
+ @layer trace.extensions {
2
+ :where(label:has(> .trace-select > select)) {
3
+ display: grid;
4
+ gap: 0.25rem;
5
+ min-inline-size: 0;
6
+ color: var(--trace-select-text);
7
+ cursor: pointer;
8
+ & > small {
9
+ margin: 0;
10
+ line-height: 1.5;
11
+ }
12
+ &:has(> .trace-select > select:disabled) {
13
+ color: color-mix(in srgb, var(--trace-select-text), transparent 50%);
14
+ cursor: not-allowed;
15
+ }
16
+ &:has(
17
+ > .trace-select > select[aria-invalid="true"],
18
+ > .trace-select > select:user-invalid
19
+ )
20
+ > small:last-child {
21
+ color: var(--trace-select-error);
22
+ }
23
+ }
24
+ :where(label:has(> .trace-select > select) + small) {
25
+ display: block;
26
+ margin-block-start: 0.25rem;
27
+ line-height: 1.5;
28
+ }
29
+ :where(
30
+ label:has(
31
+ > .trace-select > select[aria-invalid="true"],
32
+ > .trace-select > select:user-invalid
33
+ )
34
+ + small
35
+ ) {
36
+ color: var(--trace-select-error);
37
+ }
38
+ :where(.trace-select) {
39
+ --_trace-select-arrow-color: var(--trace-select-border);
40
+ position: relative;
41
+ display: grid;
42
+ min-inline-size: 0;
43
+ font-size: var(--trace-select-font-size);
44
+
45
+ &:has(> select.trace-small) {
46
+ --trace-select-padding-inline: 0.5rem;
47
+ font-size: 0.875rem;
48
+ }
49
+
50
+ &:has(> select.trace-large) {
51
+ --trace-select-padding-inline: 0.75rem;
52
+ font-size: 1.125rem;
53
+ }
54
+
55
+ &:has(> select:focus) {
56
+ --_trace-select-arrow-color: var(--trace-select-focus);
57
+ }
58
+
59
+ &:has(> select[aria-invalid="true"], > select:user-invalid) {
60
+ --_trace-select-arrow-color: var(--trace-select-error);
61
+ }
62
+ }
63
+
64
+ :where(
65
+ .trace-select:has(> select:not([multiple]):not([size])),
66
+ .trace-select:has(> select:not([multiple])[size="0"]),
67
+ .trace-select:has(> select:not([multiple])[size="1"])
68
+ )::after {
69
+ content: "";
70
+ position: absolute;
71
+ inset-inline-end: var(--trace-select-arrow-offset);
72
+ inset-block: 0;
73
+ margin-block: auto;
74
+ inline-size: var(--trace-select-arrow-size);
75
+ block-size: var(--trace-select-arrow-size);
76
+ background-color: var(--_trace-select-arrow-color);
77
+ mask: var(--trace-select-arrow) center / contain no-repeat;
78
+ pointer-events: none;
79
+ }
80
+
81
+ :where(.trace-select > select) {
82
+ background-image: none;
83
+ }
84
+
85
+ :where(.trace-select:has(> select:disabled))::after {
86
+ opacity: 0.5;
87
+ }
88
+
89
+ @media (forced-colors: active) {
90
+ :where(.trace-select)::after {
91
+ display: none;
92
+ }
93
+ }
94
+ :where(select.trace-small) {
95
+ --trace-select-font-size: 0.875rem;
96
+ --trace-select-line-height: 1.25rem;
97
+ --trace-select-padding-block: 0.25rem;
98
+ --trace-select-padding-inline: 0.5rem;
99
+ }
100
+
101
+ :where(select.trace-large) {
102
+ --trace-select-font-size: 1.125rem;
103
+ --trace-select-line-height: 1.75rem;
104
+ --trace-select-padding-block: 0.5rem;
105
+ --trace-select-padding-inline: 0.75rem;
106
+ }
107
+ }
@@ -0,0 +1,156 @@
1
+ @layer trace.elements {
2
+ :where(:root) {
3
+ --trace-switch-width: 2.125rem;
4
+ --trace-switch-height: 1.25rem;
5
+ --trace-switch-dot-size: 0.75rem;
6
+ --trace-switch-dot-active-size: 0.875rem;
7
+ --trace-switch-padding: 0.125rem;
8
+ --trace-switch-color: light-dark(
9
+ var(--trace-primary),
10
+ var(--trace-secondary)
11
+ );
12
+ --trace-switch-radius: var(--trace-radius-sm);
13
+ }
14
+
15
+ :where(input[type="checkbox"][role="switch"]) {
16
+ appearance: none;
17
+ -webkit-appearance: none;
18
+ position: relative;
19
+ display: inline-block;
20
+ box-sizing: border-box;
21
+ flex-shrink: 0;
22
+ inline-size: var(--trace-switch-width);
23
+ block-size: var(--trace-switch-height);
24
+ margin: 2px;
25
+ padding: var(--trace-switch-padding);
26
+ border: 2px solid var(--trace-switch-color);
27
+ border-radius: var(--trace-switch-radius);
28
+ background-color: var(--trace-switch-bg, var(--trace-control-bg));
29
+ background-image: radial-gradient(
30
+ ellipse at center,
31
+ var(--trace-switch-color) 50%,
32
+ transparent 50%
33
+ );
34
+ background-repeat: no-repeat;
35
+ background-size: 200% 300%;
36
+ background-position: right -100% top 50%;
37
+ vertical-align: middle;
38
+ overflow: hidden;
39
+ cursor: pointer;
40
+ transition:
41
+ transform 250ms ease-in-out,
42
+ background-position 250ms ease-in-out;
43
+ }
44
+
45
+ :where(input[type="checkbox"][role="switch"])::before {
46
+ content: "";
47
+ position: absolute;
48
+ inset-inline-start: var(--trace-switch-padding);
49
+ inset-block-start: var(--trace-switch-padding);
50
+ inline-size: var(--trace-switch-dot-size);
51
+ block-size: var(--trace-switch-dot-size);
52
+ border-radius: 2px;
53
+ background-color: var(--trace-switch-color);
54
+ transition:
55
+ inset-inline-start 200ms ease-in-out,
56
+ inline-size 200ms ease-in-out,
57
+ background-color 200ms ease-in-out;
58
+ }
59
+
60
+ :where(input[type="checkbox"][role="switch"]:checked) {
61
+ background-position: right 40% top 50%;
62
+ }
63
+
64
+ :where(input[type="checkbox"][role="switch"]:checked)::before {
65
+ inset-inline-start: calc(
66
+ 100% - var(--trace-switch-dot-size) - var(--trace-switch-padding)
67
+ );
68
+ background-color: var(
69
+ --trace-switch-dot-checked,
70
+ var(--trace-switch-bg, var(--trace-control-bg))
71
+ );
72
+ }
73
+
74
+ :where(input[type="checkbox"][role="switch"]:dir(rtl)) {
75
+ background-position: left -100% top 50%;
76
+ }
77
+
78
+ :where(input[type="checkbox"][role="switch"]:dir(rtl):checked) {
79
+ background-position: left 40% top 50%;
80
+ }
81
+
82
+ :where(input[type="checkbox"][role="switch"]:focus-visible) {
83
+ outline: 2px solid var(--trace-switch-color);
84
+ outline-offset: 2px;
85
+ }
86
+
87
+ :where(label:has(> input[type="checkbox"][role="switch"])) {
88
+ display: inline-flex;
89
+ align-items: center;
90
+ gap: 0.5rem;
91
+ cursor: pointer;
92
+ }
93
+
94
+ :where(
95
+ input[type="checkbox"][role="switch"]:active:not(:disabled),
96
+ label:active > input[type="checkbox"][role="switch"]:not(:disabled)
97
+ ) {
98
+ transform: scale(0.9);
99
+ }
100
+
101
+ :where(
102
+ input[type="checkbox"][role="switch"]:active:not(:disabled),
103
+ label:active > input[type="checkbox"][role="switch"]:not(:disabled)
104
+ )::before {
105
+ inline-size: var(--trace-switch-dot-active-size);
106
+ }
107
+
108
+ :where(
109
+ input[type="checkbox"][role="switch"]:active:checked:not(:disabled),
110
+ label:active > input[type="checkbox"][role="switch"]:checked:not(:disabled)
111
+ )::before {
112
+ inset-inline-start: calc(
113
+ 100% - var(--trace-switch-dot-active-size) - var(--trace-switch-padding)
114
+ );
115
+ }
116
+
117
+ :where(input[type="checkbox"][role="switch"]:disabled) {
118
+ opacity: 0.5;
119
+ cursor: not-allowed;
120
+ }
121
+
122
+ :where(label:has(> input[type="checkbox"][role="switch"]:disabled)) {
123
+ cursor: not-allowed;
124
+ }
125
+
126
+ :where(label > input[type="checkbox"][role="switch"]:disabled ~ span) {
127
+ opacity: 0.5;
128
+ }
129
+
130
+ @media (prefers-reduced-motion: reduce) {
131
+ :where(input[type="checkbox"][role="switch"]) {
132
+ transition: none;
133
+ transform: none;
134
+ }
135
+
136
+ :where(input[type="checkbox"][role="switch"])::before {
137
+ transition: none;
138
+ transform: none;
139
+ }
140
+ }
141
+
142
+ @media (forced-colors: active) {
143
+ :where(input[type="checkbox"][role="switch"]) {
144
+ appearance: auto;
145
+ -webkit-appearance: auto;
146
+ background: none;
147
+ }
148
+
149
+ :where(input[type="checkbox"][role="switch"])::before {
150
+ content: none;
151
+ }
152
+ }
153
+ :where(input[type="checkbox"][role="switch"][aria-invalid="true"]) {
154
+ --trace-switch-color: var(--trace-danger);
155
+ }
156
+ }
@@ -0,0 +1,122 @@
1
+ @layer trace.extensions {
2
+ :where(label:has(> .trace-switch > input[type="checkbox"][role="switch"])) {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: 0.5rem;
6
+ cursor: pointer;
7
+ }
8
+
9
+ :where(
10
+ label:has(> .trace-switch > input[type="checkbox"][role="switch"]:disabled)
11
+ ) {
12
+ cursor: not-allowed;
13
+ }
14
+
15
+ :where(.trace-switch) {
16
+ position: relative;
17
+ display: inline-flex;
18
+ flex-shrink: 0;
19
+ vertical-align: middle;
20
+ transition: transform 250ms ease-in-out;
21
+ }
22
+
23
+ :where(.trace-switch > .trace-icon) {
24
+ --trace-icon-size: var(--trace-switch-icon-size, 0.75rem);
25
+ position: absolute;
26
+ inset-inline-end: calc(4px + var(--trace-switch-padding));
27
+ inset-block: 0;
28
+ margin-block: auto;
29
+ color: var(--trace-switch-color);
30
+ pointer-events: none;
31
+ transition: color 200ms ease-in-out;
32
+ }
33
+
34
+ :where(.trace-switch:has(> input:checked) > .trace-icon) {
35
+ inset-inline-start: calc(4px + var(--trace-switch-padding));
36
+ inset-inline-end: auto;
37
+ color: var(
38
+ --trace-switch-dot-checked,
39
+ var(--trace-switch-bg, var(--trace-control-bg))
40
+ );
41
+ }
42
+
43
+ :where(
44
+ .trace-switch:has(> input:disabled) > .trace-icon,
45
+ label > .trace-switch:has(> input:disabled) ~ span
46
+ ) {
47
+ opacity: 0.5;
48
+ }
49
+
50
+ :where(.trace-switch:has(> input:disabled)) {
51
+ cursor: not-allowed;
52
+ }
53
+
54
+ :where(.trace-switch > input[type="checkbox"][role="switch"]) {
55
+ transform: none;
56
+ }
57
+
58
+ :where(
59
+ .trace-switch:has(> input:active:not(:disabled)),
60
+ label:active > .trace-switch:has(> input:not(:disabled))
61
+ ) {
62
+ transform: scale(0.9);
63
+ }
64
+
65
+ :where(
66
+ label:active > .trace-switch > input[role="switch"]:not(:disabled)
67
+ )::before {
68
+ inline-size: var(--trace-switch-dot-active-size);
69
+ }
70
+
71
+ :where(
72
+ label:active > .trace-switch > input[role="switch"]:checked:not(:disabled)
73
+ )::before {
74
+ inset-inline-start: calc(
75
+ 100% - var(--trace-switch-dot-active-size) - var(--trace-switch-padding)
76
+ );
77
+ }
78
+
79
+ @media (prefers-reduced-motion: reduce) {
80
+ :where(.trace-switch) {
81
+ transition: none;
82
+ transform: none;
83
+ }
84
+
85
+ :where(.trace-switch > .trace-icon) {
86
+ transition: none;
87
+ transform: none;
88
+ }
89
+ }
90
+
91
+ @media (forced-colors: active) {
92
+ :where(.trace-switch > .trace-icon) {
93
+ display: none;
94
+ }
95
+ }
96
+
97
+ :where(.trace-switch:has(> input[aria-invalid="true"])) {
98
+ --trace-switch-color: var(--trace-danger);
99
+ }
100
+
101
+ :where(.trace-switch:has(> input.trace-small) > .trace-icon) {
102
+ display: none;
103
+ }
104
+
105
+ :where(.trace-switch:has(> input.trace-large)) {
106
+ --trace-switch-icon-size: 1rem;
107
+ }
108
+
109
+ :where(input[type="checkbox"][role="switch"].trace-small) {
110
+ --trace-switch-width: 1.75rem;
111
+ --trace-switch-height: 1rem;
112
+ --trace-switch-dot-size: 0.5rem;
113
+ --trace-switch-dot-active-size: 0.625rem;
114
+ }
115
+
116
+ :where(input[type="checkbox"][role="switch"].trace-large) {
117
+ --trace-switch-width: 2.625rem;
118
+ --trace-switch-height: 1.5rem;
119
+ --trace-switch-dot-size: 1rem;
120
+ --trace-switch-dot-active-size: 1.125rem;
121
+ }
122
+ }
@@ -0,0 +1,133 @@
1
+ @layer trace.elements {
2
+ :where(:root) {
3
+ --trace-textarea-font-size: 1rem;
4
+ --trace-textarea-line-height: 1.5rem;
5
+ --trace-textarea-padding-block: 0.375rem;
6
+ --trace-textarea-padding-inline: 0.625rem;
7
+ --trace-textarea-radius: var(--trace-radius-control);
8
+ --trace-textarea-text: var(--trace-text);
9
+ --trace-textarea-border: light-dark(
10
+ var(--trace-primary),
11
+ var(--trace-secondary)
12
+ );
13
+ --trace-textarea-focus: light-dark(
14
+ var(--trace-primary-light),
15
+ var(--trace-secondary-light)
16
+ );
17
+ --trace-textarea-placeholder: light-dark(
18
+ var(--trace-neutral),
19
+ var(--trace-neutral-light)
20
+ );
21
+ --trace-textarea-error: var(--trace-danger);
22
+ --trace-textarea-shadow: var(--trace-shadow);
23
+ }
24
+
25
+ :where(textarea) {
26
+ --_trace-textarea-border: var(--trace-textarea-border);
27
+ display: block;
28
+ box-sizing: border-box;
29
+ inline-size: 100%;
30
+ min-inline-size: 0;
31
+ margin: 0;
32
+ padding: var(--trace-textarea-padding-block)
33
+ var(--trace-textarea-padding-inline);
34
+ border: 2px solid var(--_trace-textarea-border);
35
+ border-radius: var(--trace-textarea-radius);
36
+ background: var(--trace-textarea-bg, var(--trace-control-bg));
37
+ color: var(--trace-textarea-text);
38
+ caret-color: var(--trace-textarea-focus);
39
+ font-family: var(--trace-font-body);
40
+ font-size: var(--trace-textarea-font-size);
41
+ line-height: var(--trace-textarea-line-height);
42
+ text-align: start;
43
+ resize: vertical;
44
+ cursor: text;
45
+ transition:
46
+ border-color 200ms ease-in-out,
47
+ box-shadow 200ms ease-in-out;
48
+
49
+ &::placeholder {
50
+ color: var(--trace-textarea-placeholder);
51
+ opacity: 1;
52
+ }
53
+
54
+ &:hover:not(:disabled):not([readonly]):not(:focus) {
55
+ box-shadow: var(--trace-textarea-shadow);
56
+ }
57
+
58
+ &:focus {
59
+ --_trace-textarea-border: var(--trace-textarea-focus);
60
+ outline: 2px solid transparent;
61
+ outline-offset: 2px;
62
+ box-shadow: 0 0 0 4px
63
+ color-mix(in srgb, var(--trace-textarea-focus), transparent 70%);
64
+ }
65
+
66
+ &[aria-invalid="true"] {
67
+ --_trace-textarea-border: var(--trace-textarea-error);
68
+ }
69
+
70
+ &:user-invalid {
71
+ --_trace-textarea-border: var(--trace-textarea-error);
72
+ }
73
+
74
+ &[readonly] {
75
+ cursor: default;
76
+ }
77
+
78
+ &:disabled {
79
+ opacity: 0.5;
80
+ cursor: not-allowed;
81
+ box-shadow: none;
82
+ }
83
+
84
+ @media (prefers-reduced-motion: reduce) {
85
+ transition: none;
86
+ }
87
+ }
88
+
89
+ :where(label:has(> textarea)) {
90
+ display: grid;
91
+ gap: 0.25rem;
92
+ min-inline-size: 0;
93
+
94
+ color: var(--trace-textarea-text);
95
+ cursor: pointer;
96
+
97
+ & > small {
98
+ margin: 0;
99
+ line-height: 1.5;
100
+ }
101
+
102
+ &:has(> textarea:disabled) {
103
+ color: color-mix(in srgb, var(--trace-textarea-text), transparent 50%);
104
+ cursor: not-allowed;
105
+ }
106
+
107
+ &:has(> textarea[aria-invalid="true"], > textarea:user-invalid)
108
+ > small:last-child {
109
+ color: var(--trace-textarea-error);
110
+ }
111
+ }
112
+
113
+ :where(label:has(> textarea) + small) {
114
+ display: block;
115
+ margin-block-start: 0.25rem;
116
+ line-height: 1.5;
117
+ }
118
+
119
+ :where(
120
+ label:has(> textarea[aria-invalid="true"], > textarea:user-invalid) + small
121
+ ) {
122
+ color: var(--trace-textarea-error);
123
+ }
124
+
125
+ :where(label[for]:has(+ textarea:disabled)) {
126
+ opacity: 0.5;
127
+ cursor: not-allowed;
128
+ }
129
+
130
+ :where(textarea[aria-invalid="true"] + small, textarea:user-invalid + small) {
131
+ color: var(--trace-textarea-error);
132
+ }
133
+ }
@@ -0,0 +1,15 @@
1
+ @layer trace.extensions {
2
+ :where(textarea.trace-small) {
3
+ --trace-textarea-font-size: 0.875rem;
4
+ --trace-textarea-line-height: 1.25rem;
5
+ --trace-textarea-padding-block: 0.25rem;
6
+ --trace-textarea-padding-inline: 0.5rem;
7
+ }
8
+
9
+ :where(textarea.trace-large) {
10
+ --trace-textarea-font-size: 1.125rem;
11
+ --trace-textarea-line-height: 1.75rem;
12
+ --trace-textarea-padding-block: 0.5rem;
13
+ --trace-textarea-padding-inline: 0.75rem;
14
+ }
15
+ }