@tale-ui/react-styles 0.0.3

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.
@@ -0,0 +1,103 @@
1
+ /*
2
+ * Checkbox — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Checkbox exposes:
6
+ * Root: [data-checked] [data-unchecked] [data-indeterminate]
7
+ * [data-disabled] [data-readonly] [data-required]
8
+ * [data-valid] [data-invalid] [data-focused]
9
+ * Indicator: [data-checked] [data-unchecked] [data-indeterminate]
10
+ *
11
+ * Usage:
12
+ * <Checkbox.Root className="tale-checkbox">
13
+ * <Checkbox.Indicator className="tale-checkbox__indicator">
14
+ * ✓
15
+ * </Checkbox.Indicator>
16
+ * </Checkbox.Root>
17
+ */
18
+
19
+ /* ─── Root — the clickable hit area ──────────────────────────────────────── */
20
+
21
+ .tale-checkbox {
22
+ display: inline-flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ width: 1.8rem;
26
+ height: 1.8rem;
27
+ border-radius: 0.4rem;
28
+ border: 1.5px solid var(--neutral-40);
29
+ background-color: var(--neutral-10);
30
+ cursor: pointer;
31
+ outline: none;
32
+ transition:
33
+ background-color 0.15s ease,
34
+ border-color 0.15s ease,
35
+ box-shadow 0.15s ease;
36
+ flex-shrink: 0;
37
+ }
38
+
39
+ .tale-checkbox:focus-visible {
40
+ box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color-60);
41
+ }
42
+
43
+ /* ─── Checked state ───────────────────────────────────────────────────────── */
44
+
45
+ .tale-checkbox[data-checked] {
46
+ background-color: var(--color-60);
47
+ border-color: var(--color-60);
48
+ }
49
+
50
+ .tale-checkbox[data-checked]:hover:not([data-disabled]) {
51
+ background-color: var(--color-50);
52
+ border-color: var(--color-50);
53
+ }
54
+
55
+ /* ─── Indeterminate state ─────────────────────────────────────────────────── */
56
+
57
+ .tale-checkbox[data-indeterminate] {
58
+ background-color: var(--color-60);
59
+ border-color: var(--color-60);
60
+ }
61
+
62
+ /* ─── Hover (unchecked) ───────────────────────────────────────────────────── */
63
+
64
+ .tale-checkbox:hover:not([data-disabled]):not([data-checked]):not([data-indeterminate]) {
65
+ border-color: var(--neutral-60);
66
+ background-color: var(--neutral-14);
67
+ }
68
+
69
+ /* ─── Invalid state ───────────────────────────────────────────────────────── */
70
+
71
+ .tale-checkbox[data-invalid] {
72
+ border-color: var(--red-60);
73
+ }
74
+
75
+ /* ─── Disabled state ──────────────────────────────────────────────────────── */
76
+
77
+ .tale-checkbox[data-disabled] {
78
+ opacity: 0.45;
79
+ cursor: not-allowed;
80
+ pointer-events: none;
81
+ }
82
+
83
+ /* ─── Indicator — icon/checkmark container ────────────────────────────────── */
84
+
85
+ .tale-checkbox__indicator {
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ width: 1.2rem;
90
+ height: 1.2rem;
91
+ color: var(--neutral-100);
92
+ pointer-events: none;
93
+ }
94
+
95
+ .tale-checkbox__indicator[data-unchecked]:not([data-indeterminate]) {
96
+ visibility: hidden;
97
+ }
98
+
99
+ .tale-checkbox__indicator svg {
100
+ width: 100%;
101
+ height: 100%;
102
+ display: block;
103
+ }
@@ -0,0 +1,64 @@
1
+ /*
2
+ * Collapsible — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Collapsible exposes:
6
+ * Root: [data-open] [data-disabled]
7
+ * Panel: [data-open] [data-closed] [data-starting-style] [data-ending-style]
8
+ * Trigger: (no data attributes, it's a button)
9
+ *
10
+ * Usage:
11
+ * <Collapsible.Root className="tale-collapsible">
12
+ * <Collapsible.Trigger className="tale-collapsible__trigger">Toggle</Collapsible.Trigger>
13
+ * <Collapsible.Panel className="tale-collapsible__panel">Content</Collapsible.Panel>
14
+ * </Collapsible.Root>
15
+ */
16
+
17
+ /* ─── Root ─────────────────────────────────────────────────────────────────── */
18
+
19
+ .tale-collapsible {
20
+ width: 100%;
21
+ }
22
+
23
+ /* ─── Trigger ──────────────────────────────────────────────────────────────── */
24
+
25
+ .tale-collapsible__trigger {
26
+ display: inline-flex;
27
+ align-items: center;
28
+ gap: var(--space-3xs);
29
+ padding: var(--space-3xs) var(--space-xs);
30
+ border: 1px solid var(--neutral-22);
31
+ border-radius: 0.6rem;
32
+ background-color: var(--neutral-14);
33
+ color: var(--neutral-90);
34
+ font-family: var(--label-font-family);
35
+ font-size: var(--label-m-font-size);
36
+ font-weight: var(--label-font-weight);
37
+ cursor: pointer;
38
+ outline: none;
39
+ transition: background-color 0.15s ease, border-color 0.15s ease;
40
+ }
41
+
42
+ .tale-collapsible__trigger:hover {
43
+ background-color: var(--neutral-18);
44
+ border-color: var(--neutral-28);
45
+ }
46
+
47
+ .tale-collapsible__trigger:focus-visible {
48
+ box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color-60);
49
+ }
50
+
51
+ /* ─── Panel ────────────────────────────────────────────────────────────────── */
52
+
53
+ .tale-collapsible__panel {
54
+ overflow: hidden;
55
+ color: var(--neutral-80);
56
+ font-family: var(--body-font-family);
57
+ font-size: var(--text-m-font-size);
58
+ line-height: 1.6;
59
+ margin-top: var(--space-3xs);
60
+ }
61
+
62
+ .tale-collapsible__panel[data-closed]:not([data-starting-style]) {
63
+ display: none;
64
+ }
@@ -0,0 +1,190 @@
1
+ /*
2
+ * Combobox — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Combobox exposes:
6
+ * Input: [data-focused] [data-popup-open] (standard text input)
7
+ * Popup: [data-open] [data-closed] [data-starting-style] [data-ending-style]
8
+ * [data-side] [data-align]
9
+ * Item: [data-highlighted] [data-selected] [data-disabled]
10
+ * Chip: (multi-select selected values)
11
+ *
12
+ * Usage:
13
+ * <Combobox.Root>
14
+ * <Combobox.Input className="tale-combobox__input" />
15
+ * <Combobox.Portal>
16
+ * <Combobox.Positioner>
17
+ * <Combobox.Popup className="tale-combobox__popup">
18
+ * <Combobox.List>
19
+ * <Combobox.Item className="tale-combobox__item" value="a">Option A</Combobox.Item>
20
+ * <Combobox.Empty className="tale-combobox__empty">No results</Combobox.Empty>
21
+ * </Combobox.List>
22
+ * </Combobox.Popup>
23
+ * </Combobox.Positioner>
24
+ * </Combobox.Portal>
25
+ * </Combobox.Root>
26
+ */
27
+
28
+ /* ─── Input ────────────────────────────────────────────────────────────────── */
29
+
30
+ .tale-combobox__input {
31
+ display: block;
32
+ width: 100%;
33
+ min-height: 3.6rem;
34
+ padding: var(--space-3xs) var(--space-xs);
35
+ border: 1px solid var(--neutral-26);
36
+ border-radius: 0.6rem;
37
+ background-color: var(--neutral-10);
38
+ color: var(--neutral-90);
39
+ font-family: var(--body-font-family);
40
+ font-size: var(--text-m-font-size);
41
+ outline: none;
42
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
43
+ }
44
+
45
+ .tale-combobox__input::placeholder {
46
+ color: var(--neutral-50);
47
+ }
48
+
49
+ .tale-combobox__input:hover {
50
+ border-color: var(--neutral-40);
51
+ }
52
+
53
+ .tale-combobox__input:focus,
54
+ .tale-combobox__input[data-popup-open] {
55
+ border-color: var(--color-60);
56
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-60) 20%, transparent);
57
+ }
58
+
59
+ /* ─── Popup ────────────────────────────────────────────────────────────────── */
60
+
61
+ .tale-combobox__popup {
62
+ background-color: var(--neutral-10);
63
+ border: 1px solid var(--neutral-20);
64
+ border-radius: 0.8rem;
65
+ box-shadow:
66
+ 0 2px 4px rgba(0, 0, 0, 0.06),
67
+ 0 8px 24px rgba(0, 0, 0, 0.08);
68
+ padding: var(--space-4xs);
69
+ outline: none;
70
+ max-height: 28rem;
71
+ overflow-y: auto;
72
+ transition: opacity 0.15s ease, transform 0.15s ease;
73
+ }
74
+
75
+ .tale-combobox__popup[data-starting-style],
76
+ .tale-combobox__popup[data-ending-style] {
77
+ opacity: 0;
78
+ transform: scale(0.97);
79
+ }
80
+
81
+ /* ─── Item ─────────────────────────────────────────────────────────────────── */
82
+
83
+ .tale-combobox__item {
84
+ display: flex;
85
+ align-items: center;
86
+ gap: var(--space-2xs);
87
+ padding: var(--space-2xs) var(--space-xs);
88
+ border-radius: 0.5rem;
89
+ color: var(--neutral-80);
90
+ font-family: var(--body-font-family);
91
+ font-size: var(--text-m-font-size);
92
+ cursor: pointer;
93
+ outline: none;
94
+ transition: background-color 0.1s ease, color 0.1s ease;
95
+ user-select: none;
96
+ }
97
+
98
+ .tale-combobox__item[data-highlighted] {
99
+ background-color: var(--neutral-14);
100
+ color: var(--neutral-90);
101
+ }
102
+
103
+ .tale-combobox__item[data-selected] {
104
+ color: var(--color-60);
105
+ font-weight: var(--label-font-weight);
106
+ }
107
+
108
+ .tale-combobox__item[data-disabled] {
109
+ opacity: 0.45;
110
+ cursor: not-allowed;
111
+ pointer-events: none;
112
+ }
113
+
114
+ /* ─── Item indicator ───────────────────────────────────────────────────────── */
115
+
116
+ .tale-combobox__item-indicator {
117
+ width: 1.4rem;
118
+ height: 1.4rem;
119
+ flex-shrink: 0;
120
+ color: var(--color-60);
121
+ margin-left: auto;
122
+ }
123
+
124
+ /* ─── Empty state ──────────────────────────────────────────────────────────── */
125
+
126
+ .tale-combobox__empty {
127
+ padding: var(--space-m);
128
+ text-align: center;
129
+ color: var(--neutral-50);
130
+ font-family: var(--body-font-family);
131
+ font-size: var(--text-m-font-size);
132
+ cursor: default;
133
+ }
134
+
135
+ /* ─── Group label ──────────────────────────────────────────────────────────── */
136
+
137
+ .tale-combobox__group-label {
138
+ padding: var(--space-4xs) var(--space-xs);
139
+ color: var(--neutral-50);
140
+ font-family: var(--label-font-family);
141
+ font-size: var(--label-s-font-size);
142
+ font-weight: var(--label-font-weight);
143
+ text-transform: uppercase;
144
+ letter-spacing: 0.05em;
145
+ cursor: default;
146
+ }
147
+
148
+ /* ─── Chips (multi-select) ─────────────────────────────────────────────────── */
149
+
150
+ .tale-combobox__chips {
151
+ display: flex;
152
+ flex-wrap: wrap;
153
+ gap: var(--space-4xs);
154
+ padding: var(--space-4xs);
155
+ }
156
+
157
+ .tale-combobox__chip {
158
+ display: inline-flex;
159
+ align-items: center;
160
+ gap: var(--space-4xs);
161
+ padding: var(--space-4xs) var(--space-3xs);
162
+ background-color: var(--neutral-18);
163
+ border: 1px solid var(--neutral-26);
164
+ border-radius: 0.4rem;
165
+ color: var(--neutral-80);
166
+ font-family: var(--label-font-family);
167
+ font-size: var(--label-s-font-size);
168
+ font-weight: var(--label-font-weight);
169
+ }
170
+
171
+ .tale-combobox__chip-remove {
172
+ display: flex;
173
+ align-items: center;
174
+ justify-content: center;
175
+ width: 1.6rem;
176
+ height: 1.6rem;
177
+ border: none;
178
+ border-radius: 0.3rem;
179
+ background-color: transparent;
180
+ color: var(--neutral-60);
181
+ cursor: pointer;
182
+ outline: none;
183
+ transition: background-color 0.1s ease, color 0.1s ease;
184
+ padding: 0;
185
+ }
186
+
187
+ .tale-combobox__chip-remove:hover {
188
+ background-color: var(--neutral-26);
189
+ color: var(--neutral-90);
190
+ }
package/src/dialog.css ADDED
@@ -0,0 +1,128 @@
1
+ /*
2
+ * Dialog — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Dialog exposes:
6
+ * Popup: [data-open] [data-closed] [data-starting-style] [data-ending-style]
7
+ * [data-nested] [data-nested-dialog-open]
8
+ * Backdrop: [data-open] [data-closed] [data-starting-style] [data-ending-style]
9
+ *
10
+ * Usage:
11
+ * <Dialog.Root>
12
+ * <Dialog.Trigger className="tale-button tale-button--primary">Open</Dialog.Trigger>
13
+ * <Dialog.Portal>
14
+ * <Dialog.Backdrop className="tale-dialog__backdrop" />
15
+ * <Dialog.Popup className="tale-dialog__popup">
16
+ * <Dialog.Title className="tale-dialog__title">Title</Dialog.Title>
17
+ * <Dialog.Description className="tale-dialog__description">…</Dialog.Description>
18
+ * <Dialog.Close className="tale-button tale-button--neutral">Close</Dialog.Close>
19
+ * </Dialog.Popup>
20
+ * </Dialog.Portal>
21
+ * </Dialog.Root>
22
+ */
23
+
24
+ /* ─── Backdrop ─────────────────────────────────────────────────────────────── */
25
+
26
+ .tale-dialog__backdrop {
27
+ position: fixed;
28
+ inset: 0;
29
+ background-color: rgba(0, 0, 0, 0.5);
30
+ z-index: 100;
31
+ transition: opacity 0.2s ease;
32
+ }
33
+
34
+ .tale-dialog__backdrop[data-starting-style],
35
+ .tale-dialog__backdrop[data-ending-style] {
36
+ opacity: 0;
37
+ }
38
+
39
+ /* ─── Popup ────────────────────────────────────────────────────────────────── */
40
+
41
+ .tale-dialog__popup {
42
+ position: fixed;
43
+ top: 50%;
44
+ left: 50%;
45
+ transform: translate(-50%, -50%);
46
+ z-index: 101;
47
+ width: min(90vw, 48rem);
48
+ max-height: min(90vh, 64rem);
49
+ overflow-y: auto;
50
+ background-color: var(--neutral-10);
51
+ border: 1px solid var(--neutral-20);
52
+ border-radius: 1.2rem;
53
+ box-shadow:
54
+ 0 4px 6px -1px rgba(0, 0, 0, 0.1),
55
+ 0 20px 40px -4px rgba(0, 0, 0, 0.15);
56
+ padding: var(--space-xl);
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: var(--space-m);
60
+ outline: none;
61
+ transition: opacity 0.2s ease, transform 0.2s ease;
62
+ }
63
+
64
+ .tale-dialog__popup[data-starting-style],
65
+ .tale-dialog__popup[data-ending-style] {
66
+ opacity: 0;
67
+ transform: translate(-50%, calc(-50% - 0.8rem));
68
+ }
69
+
70
+ /* ─── Title ────────────────────────────────────────────────────────────────── */
71
+
72
+ .tale-dialog__title {
73
+ margin: 0;
74
+ color: var(--neutral-95);
75
+ font-family: var(--label-font-family);
76
+ font-size: var(--label-l-font-size);
77
+ font-weight: var(--label-font-weight);
78
+ line-height: 1.3;
79
+ }
80
+
81
+ /* ─── Description ──────────────────────────────────────────────────────────── */
82
+
83
+ .tale-dialog__description {
84
+ margin: 0;
85
+ color: var(--neutral-70);
86
+ font-family: var(--body-font-family);
87
+ font-size: var(--text-m-font-size);
88
+ line-height: 1.6;
89
+ }
90
+
91
+ /* ─── Close button ─────────────────────────────────────────────────────────── */
92
+
93
+ .tale-dialog__close {
94
+ position: absolute;
95
+ top: var(--space-s);
96
+ right: var(--space-s);
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ width: 3.2rem;
101
+ height: 3.2rem;
102
+ border: none;
103
+ border-radius: 0.6rem;
104
+ background-color: transparent;
105
+ color: var(--neutral-60);
106
+ cursor: pointer;
107
+ outline: none;
108
+ transition: background-color 0.15s ease, color 0.15s ease;
109
+ }
110
+
111
+ .tale-dialog__close:hover {
112
+ background-color: var(--neutral-14);
113
+ color: var(--neutral-90);
114
+ }
115
+
116
+ .tale-dialog__close:focus-visible {
117
+ box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color-60);
118
+ }
119
+
120
+ /* ─── Actions row ──────────────────────────────────────────────────────────── */
121
+
122
+ .tale-dialog__actions {
123
+ display: flex;
124
+ align-items: center;
125
+ justify-content: flex-end;
126
+ gap: var(--space-xs);
127
+ margin-top: var(--space-xs);
128
+ }
package/src/drawer.css ADDED
@@ -0,0 +1,98 @@
1
+ /*
2
+ * Drawer — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Base-ui Drawer exposes:
6
+ * Popup: [data-open] [data-closed] [data-starting-style] [data-ending-style]
7
+ * [data-expanded] [data-swiping] [data-swipe-direction]
8
+ * [data-nested-drawer-open]
9
+ * Backdrop: [data-open] [data-closed] [data-starting-style] [data-ending-style]
10
+ *
11
+ * Usage:
12
+ * <Drawer.Root>
13
+ * <Drawer.Trigger className="tale-button tale-button--neutral">Open Drawer</Drawer.Trigger>
14
+ * <Drawer.Portal>
15
+ * <Drawer.Backdrop className="tale-drawer__backdrop" />
16
+ * <Drawer.Popup className="tale-drawer__popup">
17
+ * <Drawer.Title className="tale-drawer__title">Drawer</Drawer.Title>
18
+ * <Drawer.Description className="tale-drawer__description">…</Drawer.Description>
19
+ * <Drawer.Close className="tale-button tale-button--neutral">Close</Drawer.Close>
20
+ * </Drawer.Popup>
21
+ * </Drawer.Portal>
22
+ * </Drawer.Root>
23
+ */
24
+
25
+ /* ─── Backdrop ─────────────────────────────────────────────────────────────── */
26
+
27
+ .tale-drawer__backdrop {
28
+ position: fixed;
29
+ inset: 0;
30
+ background-color: rgba(0, 0, 0, 0.4);
31
+ z-index: 100;
32
+ transition: opacity 0.3s ease;
33
+ }
34
+
35
+ .tale-drawer__backdrop[data-starting-style],
36
+ .tale-drawer__backdrop[data-ending-style] {
37
+ opacity: 0;
38
+ }
39
+
40
+ /* ─── Popup — defaults to bottom sheet ────────────────────────────────────── */
41
+
42
+ .tale-drawer__popup {
43
+ position: fixed;
44
+ bottom: 0;
45
+ left: 0;
46
+ right: 0;
47
+ z-index: 101;
48
+ background-color: var(--neutral-10);
49
+ border-top: 1px solid var(--neutral-20);
50
+ border-radius: 1.6rem 1.6rem 0 0;
51
+ box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.12);
52
+ padding: var(--space-xl) var(--space-xl) max(var(--space-xl), env(safe-area-inset-bottom));
53
+ display: flex;
54
+ flex-direction: column;
55
+ gap: var(--space-m);
56
+ outline: none;
57
+ max-height: 90vh;
58
+ overflow-y: auto;
59
+ transition: transform 0.3s cubic-bezier(0.32, 0.72, 0, 1);
60
+ touch-action: none;
61
+ }
62
+
63
+ .tale-drawer__popup[data-starting-style],
64
+ .tale-drawer__popup[data-ending-style] {
65
+ transform: translateY(100%);
66
+ }
67
+
68
+ /* ─── Handle bar ───────────────────────────────────────────────────────────── */
69
+
70
+ .tale-drawer__handle {
71
+ width: 4rem;
72
+ height: 0.4rem;
73
+ border-radius: 9999px;
74
+ background-color: var(--neutral-30);
75
+ align-self: center;
76
+ flex-shrink: 0;
77
+ margin-bottom: var(--space-2xs);
78
+ }
79
+
80
+ /* ─── Title ────────────────────────────────────────────────────────────────── */
81
+
82
+ .tale-drawer__title {
83
+ margin: 0;
84
+ color: var(--neutral-95);
85
+ font-family: var(--label-font-family);
86
+ font-size: var(--label-l-font-size);
87
+ font-weight: var(--label-font-weight);
88
+ }
89
+
90
+ /* ─── Description ──────────────────────────────────────────────────────────── */
91
+
92
+ .tale-drawer__description {
93
+ margin: 0;
94
+ color: var(--neutral-70);
95
+ font-family: var(--body-font-family);
96
+ font-size: var(--text-m-font-size);
97
+ line-height: 1.6;
98
+ }
package/src/field.css ADDED
@@ -0,0 +1,65 @@
1
+ /*
2
+ * Field — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Field provides label, description, and error message for a form control.
6
+ * Base-ui Field exposes on the Root:
7
+ * [data-disabled] [data-valid] [data-invalid] [data-touched]
8
+ * [data-dirty] [data-filled] [data-focused]
9
+ *
10
+ * Usage:
11
+ * <Field.Root className="tale-field">
12
+ * <Field.Label className="tale-field__label">Email</Field.Label>
13
+ * <Input className="tale-input" />
14
+ * <Field.Description className="tale-field__description">Enter your email</Field.Description>
15
+ * <Field.Error className="tale-field__error" />
16
+ * </Field.Root>
17
+ */
18
+
19
+ /* ─── Root ─────────────────────────────────────────────────────────────────── */
20
+
21
+ .tale-field {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: var(--space-3xs);
25
+ width: 100%;
26
+ }
27
+
28
+ /* ─── Label ────────────────────────────────────────────────────────────────── */
29
+
30
+ .tale-field__label {
31
+ color: var(--neutral-85);
32
+ font-family: var(--label-font-family);
33
+ font-size: var(--label-m-font-size);
34
+ font-weight: var(--label-font-weight);
35
+ line-height: 1.3;
36
+ cursor: default;
37
+ }
38
+
39
+ .tale-field[data-disabled] .tale-field__label {
40
+ opacity: 0.45;
41
+ }
42
+
43
+ /* ─── Description ──────────────────────────────────────────────────────────── */
44
+
45
+ .tale-field__description {
46
+ color: var(--neutral-60);
47
+ font-family: var(--body-font-family);
48
+ font-size: var(--text-s-font-size);
49
+ line-height: 1.5;
50
+ }
51
+
52
+ /* ─── Error message ────────────────────────────────────────────────────────── */
53
+
54
+ .tale-field__error {
55
+ color: var(--red-60);
56
+ font-family: var(--body-font-family);
57
+ font-size: var(--text-s-font-size);
58
+ line-height: 1.4;
59
+ }
60
+
61
+ /* ─── Invalid state indicators ─────────────────────────────────────────────── */
62
+
63
+ .tale-field[data-invalid] .tale-field__label {
64
+ color: var(--red-60);
65
+ }
@@ -0,0 +1,40 @@
1
+ /*
2
+ * Fieldset — @tale-ui/react
3
+ *
4
+ * Styled with @tale-ui/core design tokens.
5
+ * Fieldset groups related form controls under a legend.
6
+ * Base-ui Fieldset exposes: [data-disabled]
7
+ *
8
+ * Usage:
9
+ * <Fieldset.Root className="tale-fieldset">
10
+ * <Fieldset.Legend className="tale-fieldset__legend">Preferences</Fieldset.Legend>
11
+ * {children}
12
+ * </Fieldset.Root>
13
+ */
14
+
15
+ /* ─── Root ─────────────────────────────────────────────────────────────────── */
16
+
17
+ .tale-fieldset {
18
+ display: flex;
19
+ flex-direction: column;
20
+ gap: var(--space-m);
21
+ border: 1px solid var(--neutral-20);
22
+ border-radius: 0.8rem;
23
+ padding: var(--space-m) var(--space-l);
24
+ margin: 0;
25
+ }
26
+
27
+ .tale-fieldset[data-disabled] {
28
+ opacity: 0.45;
29
+ }
30
+
31
+ /* ─── Legend ───────────────────────────────────────────────────────────────── */
32
+
33
+ .tale-fieldset__legend {
34
+ color: var(--neutral-90);
35
+ font-family: var(--label-font-family);
36
+ font-size: var(--label-m-font-size);
37
+ font-weight: var(--label-font-weight);
38
+ padding: 0 var(--space-2xs);
39
+ float: none;
40
+ }