@tale-ui/react-styles 0.0.3 → 0.1.1
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/README.md +84 -0
- package/package.json +3 -3
- package/src/_primitives.css +199 -0
- package/src/alert-dialog.css +2 -2
- package/src/autocomplete.css +4 -71
- package/src/button.css +5 -5
- package/src/checkbox.css +2 -2
- package/src/combobox.css +4 -82
- package/src/dialog.css +2 -2
- package/src/index.css +1 -0
- package/src/input.css +3 -21
- package/src/menu.css +6 -78
- package/src/number-field.css +3 -3
- package/src/popover.css +3 -25
- package/src/radio.css +1 -1
- package/src/select.css +6 -89
- package/src/slider.css +4 -17
- package/src/switch.css +24 -10
- package/src/toast.css +8 -8
- package/src/tooltip.css +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# @tale-ui/react-styles
|
|
2
|
+
|
|
3
|
+
Opinionated CSS for `@tale-ui/react` components. Built entirely on `@tale-ui/core` design tokens (`--neutral-*`, `--color-*`, `--space-*`, `--text-*`).
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @tale-ui/react-styles
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
This automatically pulls in `@tale-ui/core` (the design-token layer).
|
|
12
|
+
|
|
13
|
+
## Usage
|
|
14
|
+
|
|
15
|
+
### All components (recommended)
|
|
16
|
+
|
|
17
|
+
```ts
|
|
18
|
+
import '@tale-ui/react-styles'; // tokens + every component stylesheet
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### Per-component (tree-shakeable CSS)
|
|
22
|
+
|
|
23
|
+
```ts
|
|
24
|
+
import '@tale-ui/core'; // tokens — required when using per-component imports
|
|
25
|
+
import '@tale-ui/react-styles/button';
|
|
26
|
+
import '@tale-ui/react-styles/dialog';
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Available per-component exports
|
|
30
|
+
|
|
31
|
+
`accordion` · `alert-dialog` · `autocomplete` · `avatar` · `button` · `checkbox` · `collapsible` · `combobox` · `dialog` · `drawer` · `field` · `fieldset` · `form` · `input` · `menu` · `meter` · `navigation-menu` · `number-field` · `popover` · `preview-card` · `progress` · `radio` · `scroll-area` · `select` · `separator` · `slider` · `switch` · `tabs` · `toast` · `toggle` · `toolbar` · `tooltip`
|
|
32
|
+
|
|
33
|
+
## Architecture
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
@tale-ui/core (tokens, foundations, layout, themes)
|
|
37
|
+
↓
|
|
38
|
+
_primitives.css (shared declarations for field controls, popups, items, etc.)
|
|
39
|
+
↓
|
|
40
|
+
{component}.css (only the differentiating styles for each component)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### `_primitives.css`
|
|
44
|
+
|
|
45
|
+
Grouped selectors for declarations that are byte-for-byte identical across multiple components. Five groups:
|
|
46
|
+
|
|
47
|
+
1. **Field controls** — `.tale-input`, `.tale-select__trigger`, `.tale-combobox__input`, `.tale-autocomplete__input` (shared border, padding, font, focus ring)
|
|
48
|
+
2. **Dropdown popups** — `.tale-select__popup`, `.tale-combobox__popup`, `.tale-menu__popup`, etc. (shared background, border-radius, shadow, animation)
|
|
49
|
+
3. **Dropdown items** — `.tale-select__item`, `.tale-menu__item`, etc. (shared layout, hover, disabled states)
|
|
50
|
+
4. **Group labels** — `.tale-select__group-label`, `.tale-menu__group-label`, etc.
|
|
51
|
+
5. **Misc** — separators, popup arrows, item indicators
|
|
52
|
+
|
|
53
|
+
### Individual component files
|
|
54
|
+
|
|
55
|
+
Each file contains only the styles that differ from the shared primitives. For example, `menu.css` adds menu-specific padding and submenu trigger arrow, but inherits popup background, border-radius, and shadow from `_primitives.css`.
|
|
56
|
+
|
|
57
|
+
## CSS Class Naming
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
.tale-{component} — root element
|
|
61
|
+
.tale-{component}--{variant} — variant modifier
|
|
62
|
+
.tale-{component}__{element} — child element (BEM)
|
|
63
|
+
.tale-{component}[data-disabled] — state via data attribute
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Examples:
|
|
67
|
+
```css
|
|
68
|
+
.tale-button /* root */
|
|
69
|
+
.tale-button--primary /* variant */
|
|
70
|
+
.tale-button--sm /* size */
|
|
71
|
+
.tale-select__trigger /* child element */
|
|
72
|
+
.tale-select__item[data-highlighted] /* state */
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Contributing a New Component Style
|
|
76
|
+
|
|
77
|
+
1. Create `src/{component}.css` with a header comment documenting the component's data attributes and usage
|
|
78
|
+
2. Check `_primitives.css` — if your component shares declarations with existing groups (field controls, popups, items), add its selector to the relevant group instead of duplicating
|
|
79
|
+
3. Add `@import './{component}.css'` to `src/index.css` in the appropriate category section
|
|
80
|
+
4. Add `"./{component}": "./src/{component}.css"` to `package.json` exports
|
|
81
|
+
|
|
82
|
+
## License
|
|
83
|
+
|
|
84
|
+
MIT
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tale-ui/react-styles",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "CSS styles for @tale-ui/react components, built on @tale-ui/core design tokens.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
|
-
"url": "git+https://github.com/Tale-UI/
|
|
7
|
+
"url": "git+https://github.com/Tale-UI/core.git",
|
|
8
8
|
"directory": "packages/styles"
|
|
9
9
|
},
|
|
10
10
|
"license": "MIT",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"./toolbar": "./src/toolbar.css"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@tale-ui/core": "
|
|
49
|
+
"@tale-ui/core": "1.1.7"
|
|
50
50
|
},
|
|
51
51
|
"sideEffects": [
|
|
52
52
|
"**/*.css"
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* _primitives.css — Shared style primitives for @tale-ui/react-styles
|
|
3
|
+
*
|
|
4
|
+
* Grouped selectors for declarations that are byte-for-byte identical across
|
|
5
|
+
* multiple components. Component files retain only their differentiating styles.
|
|
6
|
+
*
|
|
7
|
+
* Imported first in index.css so component files can override via cascade.
|
|
8
|
+
*
|
|
9
|
+
* Groups:
|
|
10
|
+
* 1. Field control — Input, Select trigger, Combobox input, Autocomplete input
|
|
11
|
+
* 2. Dropdown popup — Select, Combobox, Autocomplete, Menu, Popover
|
|
12
|
+
* 3. Dropdown item — Select, Combobox, Autocomplete, Menu (all item variants)
|
|
13
|
+
* 4. Group label — Select, Combobox, Autocomplete, Menu
|
|
14
|
+
* 5. Misc — Separator, Popup arrow, Item indicator
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/* ─── Focus ring tokens ────────────────────────────────────────────────────── */
|
|
18
|
+
|
|
19
|
+
:root {
|
|
20
|
+
--focus-ring-color: var(--neutral-50);
|
|
21
|
+
--focus-ring-glow: color-mix(in srgb, var(--neutral-60) 15%, transparent);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
25
|
+
1. FIELD CONTROL
|
|
26
|
+
══════════════════════════════════════════════════════════════════════════ */
|
|
27
|
+
|
|
28
|
+
.tale-input,
|
|
29
|
+
.tale-select__trigger,
|
|
30
|
+
.tale-combobox__input,
|
|
31
|
+
.tale-autocomplete__input {
|
|
32
|
+
min-height: 3.6rem;
|
|
33
|
+
padding: var(--space-3xs) var(--space-xs);
|
|
34
|
+
border: 1px solid var(--neutral-26);
|
|
35
|
+
border-radius: 0.6rem;
|
|
36
|
+
background-color: var(--neutral-10);
|
|
37
|
+
color: var(--neutral-90);
|
|
38
|
+
font-family: var(--body-font-family);
|
|
39
|
+
font-size: var(--text-m-font-size);
|
|
40
|
+
outline: none;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Focus ring */
|
|
44
|
+
.tale-input:focus,
|
|
45
|
+
.tale-input[data-focused],
|
|
46
|
+
.tale-select__trigger:focus-visible,
|
|
47
|
+
.tale-select__trigger[data-popup-open],
|
|
48
|
+
.tale-combobox__input:focus,
|
|
49
|
+
.tale-combobox__input[data-popup-open],
|
|
50
|
+
.tale-autocomplete__input:focus {
|
|
51
|
+
border-color: var(--focus-ring-color);
|
|
52
|
+
box-shadow: 0 0 0 3px var(--focus-ring-glow);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Placeholder (select uses .tale-select__value[data-placeholder] instead) */
|
|
56
|
+
.tale-input::placeholder,
|
|
57
|
+
.tale-combobox__input::placeholder,
|
|
58
|
+
.tale-autocomplete__input::placeholder {
|
|
59
|
+
color: var(--neutral-50);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
63
|
+
2. DROPDOWN POPUP
|
|
64
|
+
══════════════════════════════════════════════════════════════════════════ */
|
|
65
|
+
|
|
66
|
+
.tale-select__popup,
|
|
67
|
+
.tale-combobox__popup,
|
|
68
|
+
.tale-autocomplete__popup,
|
|
69
|
+
.tale-menu__popup,
|
|
70
|
+
.tale-popover__popup {
|
|
71
|
+
background-color: var(--neutral-10);
|
|
72
|
+
border: 1px solid var(--neutral-20);
|
|
73
|
+
border-radius: 0.8rem;
|
|
74
|
+
box-shadow:
|
|
75
|
+
0 2px 4px rgba(0, 0, 0, 0.06),
|
|
76
|
+
0 8px 24px rgba(0, 0, 0, 0.08);
|
|
77
|
+
outline: none;
|
|
78
|
+
overflow: hidden;
|
|
79
|
+
transition: opacity 0.15s ease, transform 0.15s ease;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Enter/leave animation */
|
|
83
|
+
.tale-select__popup[data-starting-style],
|
|
84
|
+
.tale-select__popup[data-ending-style],
|
|
85
|
+
.tale-combobox__popup[data-starting-style],
|
|
86
|
+
.tale-combobox__popup[data-ending-style],
|
|
87
|
+
.tale-autocomplete__popup[data-starting-style],
|
|
88
|
+
.tale-autocomplete__popup[data-ending-style],
|
|
89
|
+
.tale-menu__popup[data-starting-style],
|
|
90
|
+
.tale-menu__popup[data-ending-style],
|
|
91
|
+
.tale-popover__popup[data-starting-style],
|
|
92
|
+
.tale-popover__popup[data-ending-style] {
|
|
93
|
+
opacity: 0;
|
|
94
|
+
transform: scale(0.97);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
98
|
+
3. DROPDOWN ITEM
|
|
99
|
+
══════════════════════════════════════════════════════════════════════════ */
|
|
100
|
+
|
|
101
|
+
.tale-select__item,
|
|
102
|
+
.tale-combobox__item,
|
|
103
|
+
.tale-autocomplete__item,
|
|
104
|
+
.tale-menu__item,
|
|
105
|
+
.tale-menu__checkbox-item,
|
|
106
|
+
.tale-menu__radio-item,
|
|
107
|
+
.tale-menu__link-item,
|
|
108
|
+
.tale-menu__submenu-trigger {
|
|
109
|
+
box-sizing: border-box;
|
|
110
|
+
display: flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
gap: var(--space-2xs);
|
|
113
|
+
padding: var(--space-2xs) var(--space-xs);
|
|
114
|
+
border-radius: 0.5rem;
|
|
115
|
+
color: var(--neutral-80);
|
|
116
|
+
font-family: var(--body-font-family);
|
|
117
|
+
font-size: var(--text-m-font-size);
|
|
118
|
+
cursor: pointer;
|
|
119
|
+
outline: none;
|
|
120
|
+
transition: background-color 0.1s ease, color 0.1s ease;
|
|
121
|
+
user-select: none;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* Highlighted */
|
|
125
|
+
.tale-select__item[data-highlighted],
|
|
126
|
+
.tale-combobox__item[data-highlighted],
|
|
127
|
+
.tale-autocomplete__item[data-highlighted],
|
|
128
|
+
.tale-menu__item[data-highlighted],
|
|
129
|
+
.tale-menu__checkbox-item[data-highlighted],
|
|
130
|
+
.tale-menu__radio-item[data-highlighted],
|
|
131
|
+
.tale-menu__link-item[data-highlighted],
|
|
132
|
+
.tale-menu__submenu-trigger[data-highlighted] {
|
|
133
|
+
background-color: var(--neutral-14);
|
|
134
|
+
color: var(--neutral-90);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/* Disabled */
|
|
138
|
+
.tale-select__item[data-disabled],
|
|
139
|
+
.tale-combobox__item[data-disabled],
|
|
140
|
+
.tale-autocomplete__item[data-disabled],
|
|
141
|
+
.tale-menu__item[data-disabled],
|
|
142
|
+
.tale-menu__checkbox-item[data-disabled],
|
|
143
|
+
.tale-menu__radio-item[data-disabled],
|
|
144
|
+
.tale-menu__link-item[data-disabled],
|
|
145
|
+
.tale-menu__submenu-trigger[data-disabled] {
|
|
146
|
+
opacity: 0.45;
|
|
147
|
+
cursor: not-allowed;
|
|
148
|
+
pointer-events: none;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
152
|
+
4. GROUP LABEL
|
|
153
|
+
══════════════════════════════════════════════════════════════════════════ */
|
|
154
|
+
|
|
155
|
+
.tale-select__group-label,
|
|
156
|
+
.tale-combobox__group-label,
|
|
157
|
+
.tale-autocomplete__group-label,
|
|
158
|
+
.tale-menu__group-label {
|
|
159
|
+
padding: var(--space-4xs) var(--space-xs);
|
|
160
|
+
color: var(--neutral-50);
|
|
161
|
+
font-family: var(--label-font-family);
|
|
162
|
+
font-size: var(--label-s-font-size);
|
|
163
|
+
font-weight: var(--label-font-weight);
|
|
164
|
+
text-transform: uppercase;
|
|
165
|
+
letter-spacing: 0.05em;
|
|
166
|
+
cursor: default;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* ═══════════════════════════════════════════════════════════════════════════
|
|
170
|
+
5. MISC
|
|
171
|
+
══════════════════════════════════════════════════════════════════════════ */
|
|
172
|
+
|
|
173
|
+
/* Separator */
|
|
174
|
+
.tale-select__separator,
|
|
175
|
+
.tale-menu__separator {
|
|
176
|
+
height: 1px;
|
|
177
|
+
background-color: var(--neutral-18);
|
|
178
|
+
margin: var(--space-4xs) 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/* Popup arrow */
|
|
182
|
+
.tale-menu__arrow,
|
|
183
|
+
.tale-popover__arrow {
|
|
184
|
+
width: 1rem;
|
|
185
|
+
height: 0.5rem;
|
|
186
|
+
fill: var(--neutral-10);
|
|
187
|
+
stroke: var(--neutral-20);
|
|
188
|
+
stroke-width: 1;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/* Item indicator (select + combobox — menu's indicator omits margin-left: auto) */
|
|
192
|
+
.tale-select__item-indicator,
|
|
193
|
+
.tale-combobox__item-indicator {
|
|
194
|
+
width: 1.4rem;
|
|
195
|
+
height: 1.4rem;
|
|
196
|
+
flex-shrink: 0;
|
|
197
|
+
color: var(--color-60);
|
|
198
|
+
margin-left: auto;
|
|
199
|
+
}
|
package/src/alert-dialog.css
CHANGED
|
@@ -56,10 +56,10 @@
|
|
|
56
56
|
box-shadow:
|
|
57
57
|
0 4px 6px -1px rgba(0, 0, 0, 0.1),
|
|
58
58
|
0 20px 40px -4px rgba(0, 0, 0, 0.15);
|
|
59
|
-
padding: var(--space-
|
|
59
|
+
padding: var(--space-s);
|
|
60
60
|
display: flex;
|
|
61
61
|
flex-direction: column;
|
|
62
|
-
gap: var(--space-
|
|
62
|
+
gap: var(--space-xs);
|
|
63
63
|
outline: none;
|
|
64
64
|
transition: opacity 0.2s ease, transform 0.2s ease;
|
|
65
65
|
}
|
package/src/autocomplete.css
CHANGED
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
* </Autocomplete.Positioner>
|
|
17
17
|
* </Autocomplete.Portal>
|
|
18
18
|
* </Autocomplete.Root>
|
|
19
|
+
*
|
|
20
|
+
* Shared field-control, popup, item, group-label primitives
|
|
21
|
+
* are defined in _primitives.css.
|
|
19
22
|
*/
|
|
20
23
|
|
|
21
24
|
/* ─── Input ────────────────────────────────────────────────────────────────── */
|
|
@@ -23,86 +26,29 @@
|
|
|
23
26
|
.tale-autocomplete__input {
|
|
24
27
|
display: block;
|
|
25
28
|
width: 100%;
|
|
26
|
-
min-height: 3.6rem;
|
|
27
|
-
padding: var(--space-3xs) var(--space-xs);
|
|
28
|
-
border: 1px solid var(--neutral-26);
|
|
29
|
-
border-radius: 0.6rem;
|
|
30
|
-
background-color: var(--neutral-10);
|
|
31
|
-
color: var(--neutral-90);
|
|
32
|
-
font-family: var(--body-font-family);
|
|
33
|
-
font-size: var(--text-m-font-size);
|
|
34
|
-
outline: none;
|
|
35
29
|
transition: border-color 0.15s ease, box-shadow 0.15s ease;
|
|
36
30
|
}
|
|
37
31
|
|
|
38
|
-
.tale-autocomplete__input::placeholder {
|
|
39
|
-
color: var(--neutral-50);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
32
|
.tale-autocomplete__input:hover {
|
|
43
33
|
border-color: var(--neutral-40);
|
|
44
34
|
}
|
|
45
35
|
|
|
46
|
-
.tale-autocomplete__input:focus {
|
|
47
|
-
border-color: var(--color-60);
|
|
48
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-60) 20%, transparent);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
36
|
/* ─── Popup ────────────────────────────────────────────────────────────────── */
|
|
52
37
|
|
|
53
38
|
.tale-autocomplete__popup {
|
|
54
|
-
background-color: var(--neutral-10);
|
|
55
|
-
border: 1px solid var(--neutral-20);
|
|
56
|
-
border-radius: 0.8rem;
|
|
57
|
-
box-shadow:
|
|
58
|
-
0 2px 4px rgba(0, 0, 0, 0.06),
|
|
59
|
-
0 8px 24px rgba(0, 0, 0, 0.08);
|
|
60
39
|
padding: var(--space-4xs);
|
|
61
|
-
|
|
40
|
+
min-width: var(--anchor-width);
|
|
62
41
|
max-height: 28rem;
|
|
63
42
|
overflow-y: auto;
|
|
64
|
-
transition: opacity 0.15s ease, transform 0.15s ease;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
.tale-autocomplete__popup[data-starting-style],
|
|
68
|
-
.tale-autocomplete__popup[data-ending-style] {
|
|
69
|
-
opacity: 0;
|
|
70
|
-
transform: scale(0.97);
|
|
71
43
|
}
|
|
72
44
|
|
|
73
45
|
/* ─── Item ─────────────────────────────────────────────────────────────────── */
|
|
74
46
|
|
|
75
|
-
.tale-autocomplete__item {
|
|
76
|
-
display: flex;
|
|
77
|
-
align-items: center;
|
|
78
|
-
gap: var(--space-2xs);
|
|
79
|
-
padding: var(--space-2xs) var(--space-xs);
|
|
80
|
-
border-radius: 0.5rem;
|
|
81
|
-
color: var(--neutral-80);
|
|
82
|
-
font-family: var(--body-font-family);
|
|
83
|
-
font-size: var(--text-m-font-size);
|
|
84
|
-
cursor: pointer;
|
|
85
|
-
outline: none;
|
|
86
|
-
transition: background-color 0.1s ease, color 0.1s ease;
|
|
87
|
-
user-select: none;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
.tale-autocomplete__item[data-highlighted] {
|
|
91
|
-
background-color: var(--neutral-14);
|
|
92
|
-
color: var(--neutral-90);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
47
|
.tale-autocomplete__item[data-selected] {
|
|
96
48
|
color: var(--color-60);
|
|
97
49
|
font-weight: var(--label-font-weight);
|
|
98
50
|
}
|
|
99
51
|
|
|
100
|
-
.tale-autocomplete__item[data-disabled] {
|
|
101
|
-
opacity: 0.45;
|
|
102
|
-
cursor: not-allowed;
|
|
103
|
-
pointer-events: none;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
52
|
/* ─── Empty state ──────────────────────────────────────────────────────────── */
|
|
107
53
|
|
|
108
54
|
.tale-autocomplete__empty {
|
|
@@ -113,16 +59,3 @@
|
|
|
113
59
|
font-size: var(--text-m-font-size);
|
|
114
60
|
cursor: default;
|
|
115
61
|
}
|
|
116
|
-
|
|
117
|
-
/* ─── Group label ──────────────────────────────────────────────────────────── */
|
|
118
|
-
|
|
119
|
-
.tale-autocomplete__group-label {
|
|
120
|
-
padding: var(--space-4xs) var(--space-xs);
|
|
121
|
-
color: var(--neutral-50);
|
|
122
|
-
font-family: var(--label-font-family);
|
|
123
|
-
font-size: var(--label-s-font-size);
|
|
124
|
-
font-weight: var(--label-font-weight);
|
|
125
|
-
text-transform: uppercase;
|
|
126
|
-
letter-spacing: 0.05em;
|
|
127
|
-
cursor: default;
|
|
128
|
-
}
|
package/src/button.css
CHANGED
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
|
|
63
63
|
.tale-button--primary {
|
|
64
64
|
background-color: var(--color-60);
|
|
65
|
-
color: var(--
|
|
65
|
+
color: var(--color-60-fg);
|
|
66
66
|
border-color: transparent;
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -111,17 +111,17 @@
|
|
|
111
111
|
/* ─── Danger variant — destructive actions ────────────────────────────────── */
|
|
112
112
|
|
|
113
113
|
.tale-button--danger {
|
|
114
|
-
background-color: var(--
|
|
115
|
-
color:
|
|
114
|
+
background-color: var(--error-60);
|
|
115
|
+
color: var(--error-60-fg);
|
|
116
116
|
border-color: transparent;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
.tale-button--danger:hover:not([data-disabled]) {
|
|
120
|
-
background-color: var(--
|
|
120
|
+
background-color: var(--error-50);
|
|
121
121
|
}
|
|
122
122
|
|
|
123
123
|
.tale-button--danger:active:not([data-disabled]) {
|
|
124
|
-
background-color: var(--
|
|
124
|
+
background-color: var(--error-40);
|
|
125
125
|
}
|
|
126
126
|
|
|
127
127
|
/* ─── Size modifiers ──────────────────────────────────────────────────────── */
|
package/src/checkbox.css
CHANGED
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
.tale-checkbox:focus-visible {
|
|
40
|
-
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color
|
|
40
|
+
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--focus-ring-color);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
/* ─── Checked state ───────────────────────────────────────────────────────── */
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
justify-content: center;
|
|
89
89
|
width: 1.2rem;
|
|
90
90
|
height: 1.2rem;
|
|
91
|
-
color: var(--
|
|
91
|
+
color: var(--color-60-fg);
|
|
92
92
|
pointer-events: none;
|
|
93
93
|
}
|
|
94
94
|
|
package/src/combobox.css
CHANGED
|
@@ -23,6 +23,9 @@
|
|
|
23
23
|
* </Combobox.Positioner>
|
|
24
24
|
* </Combobox.Portal>
|
|
25
25
|
* </Combobox.Root>
|
|
26
|
+
*
|
|
27
|
+
* Shared field-control, popup, item, group-label, item-indicator primitives
|
|
28
|
+
* are defined in _primitives.css.
|
|
26
29
|
*/
|
|
27
30
|
|
|
28
31
|
/* ─── Input ────────────────────────────────────────────────────────────────── */
|
|
@@ -30,97 +33,29 @@
|
|
|
30
33
|
.tale-combobox__input {
|
|
31
34
|
display: block;
|
|
32
35
|
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
36
|
transition: border-color 0.15s ease, box-shadow 0.15s ease;
|
|
43
37
|
}
|
|
44
38
|
|
|
45
|
-
.tale-combobox__input::placeholder {
|
|
46
|
-
color: var(--neutral-50);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
39
|
.tale-combobox__input:hover {
|
|
50
40
|
border-color: var(--neutral-40);
|
|
51
41
|
}
|
|
52
42
|
|
|
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
43
|
/* ─── Popup ────────────────────────────────────────────────────────────────── */
|
|
60
44
|
|
|
61
45
|
.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
46
|
padding: var(--space-4xs);
|
|
69
|
-
|
|
47
|
+
min-width: var(--anchor-width);
|
|
70
48
|
max-height: 28rem;
|
|
71
49
|
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
50
|
}
|
|
80
51
|
|
|
81
52
|
/* ─── Item ─────────────────────────────────────────────────────────────────── */
|
|
82
53
|
|
|
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
54
|
.tale-combobox__item[data-selected] {
|
|
104
55
|
color: var(--color-60);
|
|
105
56
|
font-weight: var(--label-font-weight);
|
|
106
57
|
}
|
|
107
58
|
|
|
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
59
|
/* ─── Empty state ──────────────────────────────────────────────────────────── */
|
|
125
60
|
|
|
126
61
|
.tale-combobox__empty {
|
|
@@ -132,19 +67,6 @@
|
|
|
132
67
|
cursor: default;
|
|
133
68
|
}
|
|
134
69
|
|
|
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
70
|
/* ─── Chips (multi-select) ─────────────────────────────────────────────────── */
|
|
149
71
|
|
|
150
72
|
.tale-combobox__chips {
|
package/src/dialog.css
CHANGED
|
@@ -53,10 +53,10 @@
|
|
|
53
53
|
box-shadow:
|
|
54
54
|
0 4px 6px -1px rgba(0, 0, 0, 0.1),
|
|
55
55
|
0 20px 40px -4px rgba(0, 0, 0, 0.15);
|
|
56
|
-
padding: var(--space-
|
|
56
|
+
padding: var(--space-s);
|
|
57
57
|
display: flex;
|
|
58
58
|
flex-direction: column;
|
|
59
|
-
gap: var(--space-
|
|
59
|
+
gap: var(--space-xs);
|
|
60
60
|
outline: none;
|
|
61
61
|
transition: opacity 0.2s ease, transform 0.2s ease;
|
|
62
62
|
}
|
package/src/index.css
CHANGED
package/src/input.css
CHANGED
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
*
|
|
9
9
|
* Usage:
|
|
10
10
|
* <Input className="tale-input" />
|
|
11
|
+
*
|
|
12
|
+
* Shared field-control base (border, bg, font, focus ring, placeholder)
|
|
13
|
+
* is defined in _primitives.css.
|
|
11
14
|
*/
|
|
12
15
|
|
|
13
16
|
/* ─── Base ─────────────────────────────────────────────────────────────────── */
|
|
@@ -15,34 +18,13 @@
|
|
|
15
18
|
.tale-input {
|
|
16
19
|
display: block;
|
|
17
20
|
width: 100%;
|
|
18
|
-
min-height: 3.6rem;
|
|
19
|
-
padding: var(--space-3xs) var(--space-xs);
|
|
20
|
-
border: 1px solid var(--neutral-26);
|
|
21
|
-
border-radius: 0.6rem;
|
|
22
|
-
background-color: var(--neutral-10);
|
|
23
|
-
color: var(--neutral-90);
|
|
24
|
-
font-family: var(--body-font-family);
|
|
25
|
-
font-size: var(--text-m-font-size);
|
|
26
21
|
line-height: 1.5;
|
|
27
|
-
outline: none;
|
|
28
22
|
transition:
|
|
29
23
|
border-color 0.15s ease,
|
|
30
24
|
box-shadow 0.15s ease,
|
|
31
25
|
background-color 0.15s ease;
|
|
32
26
|
}
|
|
33
27
|
|
|
34
|
-
.tale-input::placeholder {
|
|
35
|
-
color: var(--neutral-50);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* ─── Focus ───────────────────────────────────────────────────────────────── */
|
|
39
|
-
|
|
40
|
-
.tale-input:focus,
|
|
41
|
-
.tale-input[data-focused] {
|
|
42
|
-
border-color: var(--color-60);
|
|
43
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-60) 20%, transparent);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
28
|
/* ─── Hover ───────────────────────────────────────────────────────────────── */
|
|
47
29
|
|
|
48
30
|
.tale-input:hover:not(:focus):not([data-disabled]):not([data-invalid]) {
|
package/src/menu.css
CHANGED
|
@@ -23,49 +23,27 @@
|
|
|
23
23
|
* </Menu.Positioner>
|
|
24
24
|
* </Menu.Portal>
|
|
25
25
|
* </Menu.Root>
|
|
26
|
+
*
|
|
27
|
+
* Shared popup, item, group-label, separator, arrow primitives
|
|
28
|
+
* are defined in _primitives.css.
|
|
26
29
|
*/
|
|
27
30
|
|
|
28
31
|
/* ─── Popup ────────────────────────────────────────────────────────────────── */
|
|
29
32
|
|
|
30
33
|
.tale-menu__popup {
|
|
31
|
-
background-color: var(--neutral-10);
|
|
32
|
-
border: 1px solid var(--neutral-20);
|
|
33
|
-
border-radius: 0.8rem;
|
|
34
|
-
box-shadow:
|
|
35
|
-
0 2px 4px rgba(0, 0, 0, 0.06),
|
|
36
|
-
0 8px 24px rgba(0, 0, 0, 0.08);
|
|
37
34
|
padding: var(--space-4xs);
|
|
38
|
-
outline: none;
|
|
39
35
|
min-width: 16rem;
|
|
40
|
-
max-width:
|
|
41
|
-
|
|
36
|
+
max-width: 32rem;
|
|
37
|
+
width: max-content;
|
|
42
38
|
}
|
|
43
39
|
|
|
44
|
-
|
|
45
|
-
.tale-menu__popup[data-ending-style] {
|
|
46
|
-
opacity: 0;
|
|
47
|
-
transform: scale(0.97);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/* ─── Item (base styles shared by Item, CheckboxItem, RadioItem) ────────────── */
|
|
40
|
+
/* ─── Item (button/anchor resets not shared with select/combobox items) ─────── */
|
|
51
41
|
|
|
52
42
|
.tale-menu__item,
|
|
53
43
|
.tale-menu__checkbox-item,
|
|
54
44
|
.tale-menu__radio-item,
|
|
55
45
|
.tale-menu__link-item,
|
|
56
46
|
.tale-menu__submenu-trigger {
|
|
57
|
-
display: flex;
|
|
58
|
-
align-items: center;
|
|
59
|
-
gap: var(--space-2xs);
|
|
60
|
-
padding: var(--space-2xs) var(--space-xs);
|
|
61
|
-
border-radius: 0.5rem;
|
|
62
|
-
color: var(--neutral-80);
|
|
63
|
-
font-family: var(--body-font-family);
|
|
64
|
-
font-size: var(--text-m-font-size);
|
|
65
|
-
cursor: pointer;
|
|
66
|
-
outline: none;
|
|
67
|
-
transition: background-color 0.1s ease, color 0.1s ease;
|
|
68
|
-
user-select: none;
|
|
69
47
|
border: none;
|
|
70
48
|
background: none;
|
|
71
49
|
width: 100%;
|
|
@@ -73,25 +51,6 @@
|
|
|
73
51
|
text-decoration: none;
|
|
74
52
|
}
|
|
75
53
|
|
|
76
|
-
.tale-menu__item[data-highlighted],
|
|
77
|
-
.tale-menu__checkbox-item[data-highlighted],
|
|
78
|
-
.tale-menu__radio-item[data-highlighted],
|
|
79
|
-
.tale-menu__link-item[data-highlighted],
|
|
80
|
-
.tale-menu__submenu-trigger[data-highlighted] {
|
|
81
|
-
background-color: var(--neutral-14);
|
|
82
|
-
color: var(--neutral-90);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
.tale-menu__item[data-disabled],
|
|
86
|
-
.tale-menu__checkbox-item[data-disabled],
|
|
87
|
-
.tale-menu__radio-item[data-disabled],
|
|
88
|
-
.tale-menu__link-item[data-disabled],
|
|
89
|
-
.tale-menu__submenu-trigger[data-disabled] {
|
|
90
|
-
opacity: 0.45;
|
|
91
|
-
cursor: not-allowed;
|
|
92
|
-
pointer-events: none;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
54
|
/* ─── Checkbox/Radio item indicator ────────────────────────────────────────── */
|
|
96
55
|
|
|
97
56
|
.tale-menu__item-indicator {
|
|
@@ -109,37 +68,6 @@
|
|
|
109
68
|
color: var(--neutral-50);
|
|
110
69
|
}
|
|
111
70
|
|
|
112
|
-
/* ─── Group label ──────────────────────────────────────────────────────────── */
|
|
113
|
-
|
|
114
|
-
.tale-menu__group-label {
|
|
115
|
-
padding: var(--space-4xs) var(--space-xs);
|
|
116
|
-
color: var(--neutral-50);
|
|
117
|
-
font-family: var(--label-font-family);
|
|
118
|
-
font-size: var(--label-s-font-size);
|
|
119
|
-
font-weight: var(--label-font-weight);
|
|
120
|
-
text-transform: uppercase;
|
|
121
|
-
letter-spacing: 0.05em;
|
|
122
|
-
cursor: default;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/* ─── Separator ────────────────────────────────────────────────────────────── */
|
|
126
|
-
|
|
127
|
-
.tale-menu__separator {
|
|
128
|
-
height: 1px;
|
|
129
|
-
background-color: var(--neutral-18);
|
|
130
|
-
margin: var(--space-4xs) 0;
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
/* ─── Arrow ────────────────────────────────────────────────────────────────── */
|
|
134
|
-
|
|
135
|
-
.tale-menu__arrow {
|
|
136
|
-
width: 1rem;
|
|
137
|
-
height: 0.5rem;
|
|
138
|
-
fill: var(--neutral-10);
|
|
139
|
-
stroke: var(--neutral-20);
|
|
140
|
-
stroke-width: 1;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
71
|
/* ─── Menubar — horizontal trigger bar ─────────────────────────────────────── */
|
|
144
72
|
|
|
145
73
|
.tale-menubar {
|
package/src/number-field.css
CHANGED
|
@@ -37,8 +37,8 @@
|
|
|
37
37
|
}
|
|
38
38
|
|
|
39
39
|
.tale-number-field__group:focus-within {
|
|
40
|
-
border-color: var(--color
|
|
41
|
-
box-shadow: 0 0 0 3px
|
|
40
|
+
border-color: var(--focus-ring-color);
|
|
41
|
+
box-shadow: 0 0 0 3px var(--focus-ring-glow);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
.tale-number-field__group:hover:not(:focus-within) {
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
|
|
107
107
|
.tale-number-field__decrement:focus-visible,
|
|
108
108
|
.tale-number-field__increment:focus-visible {
|
|
109
|
-
box-shadow: inset 0 0 0 2px var(--color
|
|
109
|
+
box-shadow: inset 0 0 0 2px var(--focus-ring-color);
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
/* ─── Disabled state ──────────────────────────────────────────────────────── */
|
package/src/popover.css
CHANGED
|
@@ -19,28 +19,16 @@
|
|
|
19
19
|
* </Popover.Positioner>
|
|
20
20
|
* </Popover.Portal>
|
|
21
21
|
* </Popover.Root>
|
|
22
|
+
*
|
|
23
|
+
* Shared popup base, popup animation, and arrow are defined in _primitives.css.
|
|
22
24
|
*/
|
|
23
25
|
|
|
24
26
|
/* ─── Popup ────────────────────────────────────────────────────────────────── */
|
|
25
27
|
|
|
26
28
|
.tale-popover__popup {
|
|
27
29
|
position: relative;
|
|
28
|
-
|
|
29
|
-
border: 1px solid var(--neutral-20);
|
|
30
|
-
border-radius: 0.8rem;
|
|
31
|
-
box-shadow:
|
|
32
|
-
0 2px 4px rgba(0, 0, 0, 0.06),
|
|
33
|
-
0 8px 24px rgba(0, 0, 0, 0.08);
|
|
34
|
-
padding: var(--space-m);
|
|
30
|
+
padding: var(--space-xs);
|
|
35
31
|
max-width: 32rem;
|
|
36
|
-
outline: none;
|
|
37
|
-
transition: opacity 0.15s ease, transform 0.15s ease;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.tale-popover__popup[data-starting-style],
|
|
41
|
-
.tale-popover__popup[data-ending-style] {
|
|
42
|
-
opacity: 0;
|
|
43
|
-
transform: scale(0.97);
|
|
44
32
|
}
|
|
45
33
|
|
|
46
34
|
/* ─── Title ────────────────────────────────────────────────────────────────── */
|
|
@@ -92,13 +80,3 @@
|
|
|
92
80
|
.tale-popover__close:focus-visible {
|
|
93
81
|
box-shadow: 0 0 0 2px var(--color-60);
|
|
94
82
|
}
|
|
95
|
-
|
|
96
|
-
/* ─── Arrow ────────────────────────────────────────────────────────────────── */
|
|
97
|
-
|
|
98
|
-
.tale-popover__arrow {
|
|
99
|
-
width: 1rem;
|
|
100
|
-
height: 0.5rem;
|
|
101
|
-
fill: var(--neutral-10);
|
|
102
|
-
stroke: var(--neutral-20);
|
|
103
|
-
stroke-width: 1;
|
|
104
|
-
}
|
package/src/radio.css
CHANGED
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
.tale-radio:focus-visible {
|
|
38
|
-
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color
|
|
38
|
+
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--focus-ring-color);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/* ─── Checked state ───────────────────────────────────────────────────────── */
|
package/src/select.css
CHANGED
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
* </Select.Positioner>
|
|
26
26
|
* </Select.Portal>
|
|
27
27
|
* </Select.Root>
|
|
28
|
+
*
|
|
29
|
+
* Shared field-control, popup, item, group-label, separator, item-indicator
|
|
30
|
+
* primitives are defined in _primitives.css.
|
|
28
31
|
*/
|
|
29
32
|
|
|
30
33
|
/* ─── Trigger ──────────────────────────────────────────────────────────────── */
|
|
@@ -35,16 +38,7 @@
|
|
|
35
38
|
justify-content: space-between;
|
|
36
39
|
gap: var(--space-xs);
|
|
37
40
|
min-width: 16rem;
|
|
38
|
-
min-height: 3.6rem;
|
|
39
|
-
padding: var(--space-3xs) var(--space-xs);
|
|
40
|
-
border: 1px solid var(--neutral-26);
|
|
41
|
-
border-radius: 0.6rem;
|
|
42
|
-
background-color: var(--neutral-10);
|
|
43
|
-
color: var(--neutral-90);
|
|
44
|
-
font-family: var(--body-font-family);
|
|
45
|
-
font-size: var(--text-m-font-size);
|
|
46
41
|
cursor: pointer;
|
|
47
|
-
outline: none;
|
|
48
42
|
transition: border-color 0.15s ease, box-shadow 0.15s ease;
|
|
49
43
|
}
|
|
50
44
|
|
|
@@ -52,12 +46,6 @@
|
|
|
52
46
|
border-color: var(--neutral-40);
|
|
53
47
|
}
|
|
54
48
|
|
|
55
|
-
.tale-select__trigger:focus-visible,
|
|
56
|
-
.tale-select__trigger[data-popup-open] {
|
|
57
|
-
border-color: var(--color-60);
|
|
58
|
-
box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-60) 20%, transparent);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
49
|
.tale-select__trigger[data-disabled] {
|
|
62
50
|
opacity: 0.45;
|
|
63
51
|
cursor: not-allowed;
|
|
@@ -87,25 +75,11 @@
|
|
|
87
75
|
/* ─── Popup ────────────────────────────────────────────────────────────────── */
|
|
88
76
|
|
|
89
77
|
.tale-select__popup {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
border-radius: 0.8rem;
|
|
93
|
-
box-shadow:
|
|
94
|
-
0 2px 4px rgba(0, 0, 0, 0.06),
|
|
95
|
-
0 8px 24px rgba(0, 0, 0, 0.08);
|
|
96
|
-
outline: none;
|
|
97
|
-
overflow: hidden;
|
|
98
|
-
min-width: var(--available-width, 16rem);
|
|
78
|
+
padding: var(--space-4xs);
|
|
79
|
+
min-width: var(--anchor-width, 16rem);
|
|
99
80
|
max-height: 28rem;
|
|
100
81
|
overflow-y: auto;
|
|
101
|
-
|
|
102
|
-
transition: opacity 0.15s ease, transform 0.15s ease;
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
.tale-select__popup[data-starting-style],
|
|
106
|
-
.tale-select__popup[data-ending-style] {
|
|
107
|
-
opacity: 0;
|
|
108
|
-
transform: scale(0.97);
|
|
82
|
+
overflow: hidden;
|
|
109
83
|
}
|
|
110
84
|
|
|
111
85
|
/* ─── List ─────────────────────────────────────────────────────────────────── */
|
|
@@ -118,70 +92,13 @@
|
|
|
118
92
|
|
|
119
93
|
/* ─── Item ─────────────────────────────────────────────────────────────────── */
|
|
120
94
|
|
|
121
|
-
.tale-select__item {
|
|
122
|
-
display: flex;
|
|
123
|
-
align-items: center;
|
|
124
|
-
gap: var(--space-2xs);
|
|
125
|
-
padding: var(--space-2xs) var(--space-xs);
|
|
126
|
-
border-radius: 0.5rem;
|
|
127
|
-
color: var(--neutral-80);
|
|
128
|
-
font-family: var(--body-font-family);
|
|
129
|
-
font-size: var(--text-m-font-size);
|
|
130
|
-
cursor: pointer;
|
|
131
|
-
outline: none;
|
|
132
|
-
transition: background-color 0.1s ease, color 0.1s ease;
|
|
133
|
-
user-select: none;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
.tale-select__item[data-highlighted] {
|
|
137
|
-
background-color: var(--neutral-14);
|
|
138
|
-
color: var(--neutral-90);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
95
|
.tale-select__item[data-selected] {
|
|
142
96
|
color: var(--color-60);
|
|
143
97
|
font-weight: var(--label-font-weight);
|
|
144
98
|
}
|
|
145
99
|
|
|
146
|
-
.tale-select__item[data-disabled] {
|
|
147
|
-
opacity: 0.45;
|
|
148
|
-
cursor: not-allowed;
|
|
149
|
-
pointer-events: none;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
100
|
/* ─── Item text ────────────────────────────────────────────────────────────── */
|
|
153
101
|
|
|
154
102
|
.tale-select__item-text {
|
|
155
103
|
flex: 1;
|
|
156
104
|
}
|
|
157
|
-
|
|
158
|
-
/* ─── Item indicator (checkmark) ───────────────────────────────────────────── */
|
|
159
|
-
|
|
160
|
-
.tale-select__item-indicator {
|
|
161
|
-
width: 1.4rem;
|
|
162
|
-
height: 1.4rem;
|
|
163
|
-
flex-shrink: 0;
|
|
164
|
-
color: var(--color-60);
|
|
165
|
-
margin-left: auto;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
/* ─── Group label ──────────────────────────────────────────────────────────── */
|
|
169
|
-
|
|
170
|
-
.tale-select__group-label {
|
|
171
|
-
padding: var(--space-4xs) var(--space-xs);
|
|
172
|
-
color: var(--neutral-50);
|
|
173
|
-
font-family: var(--label-font-family);
|
|
174
|
-
font-size: var(--label-s-font-size);
|
|
175
|
-
font-weight: var(--label-font-weight);
|
|
176
|
-
text-transform: uppercase;
|
|
177
|
-
letter-spacing: 0.05em;
|
|
178
|
-
cursor: default;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/* ─── Separator ────────────────────────────────────────────────────────────── */
|
|
182
|
-
|
|
183
|
-
.tale-select__separator {
|
|
184
|
-
height: 1px;
|
|
185
|
-
background-color: var(--neutral-18);
|
|
186
|
-
margin: var(--space-4xs) 0;
|
|
187
|
-
}
|
package/src/slider.css
CHANGED
|
@@ -59,7 +59,6 @@
|
|
|
59
59
|
height: 0.4rem;
|
|
60
60
|
border-radius: 9999px;
|
|
61
61
|
background-color: var(--neutral-22);
|
|
62
|
-
overflow: hidden;
|
|
63
62
|
}
|
|
64
63
|
|
|
65
64
|
.tale-slider[data-orientation="vertical"] .tale-slider__track {
|
|
@@ -98,33 +97,21 @@
|
|
|
98
97
|
width: 1.8rem;
|
|
99
98
|
height: 1.8rem;
|
|
100
99
|
border-radius: 50%;
|
|
101
|
-
background-color: var(--neutral-
|
|
100
|
+
background-color: var(--neutral-10);
|
|
102
101
|
border: 2px solid var(--color-60);
|
|
103
102
|
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.15);
|
|
104
|
-
top: 50%;
|
|
105
|
-
transform: translateY(-50%);
|
|
106
103
|
outline: none;
|
|
107
|
-
transition: box-shadow 0.15s ease, border-color 0.15s ease,
|
|
104
|
+
transition: box-shadow 0.15s ease, border-color 0.15s ease, scale 0.1s ease;
|
|
108
105
|
cursor: grab;
|
|
109
106
|
}
|
|
110
107
|
|
|
111
108
|
.tale-slider__thumb:focus-visible {
|
|
112
|
-
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color
|
|
109
|
+
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--focus-ring-color);
|
|
113
110
|
}
|
|
114
111
|
|
|
115
112
|
.tale-slider__thumb[data-dragging] {
|
|
116
113
|
cursor: grabbing;
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
.tale-slider[data-orientation="vertical"] .tale-slider__thumb {
|
|
121
|
-
left: 50%;
|
|
122
|
-
top: auto;
|
|
123
|
-
transform: translateX(-50%);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
.tale-slider[data-orientation="vertical"] .tale-slider__thumb[data-dragging] {
|
|
127
|
-
transform: translateX(-50%) scale(1.15);
|
|
114
|
+
scale: 1.15;
|
|
128
115
|
}
|
|
129
116
|
|
|
130
117
|
/* ─── Disabled state ──────────────────────────────────────────────────────── */
|
package/src/switch.css
CHANGED
|
@@ -17,14 +17,19 @@
|
|
|
17
17
|
/* ─── Root — pill-shaped track ────────────────────────────────────────────── */
|
|
18
18
|
|
|
19
19
|
.tale-switch {
|
|
20
|
+
--tale-switch-track-width: 4rem;
|
|
21
|
+
--tale-switch-track-height: 2.2rem;
|
|
22
|
+
--tale-switch-thumb-size: 1.4rem;
|
|
23
|
+
--tale-switch-thumb-offset: 0.2rem;
|
|
24
|
+
|
|
25
|
+
position: relative;
|
|
20
26
|
display: inline-flex;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
height: 2.2rem;
|
|
27
|
+
width: var(--tale-switch-track-width);
|
|
28
|
+
height: var(--tale-switch-track-height);
|
|
24
29
|
border-radius: 9999px;
|
|
25
30
|
border: 1.5px solid var(--neutral-30);
|
|
26
31
|
background-color: var(--neutral-20);
|
|
27
|
-
padding: 0
|
|
32
|
+
padding: 0;
|
|
28
33
|
cursor: pointer;
|
|
29
34
|
outline: none;
|
|
30
35
|
transition:
|
|
@@ -35,7 +40,7 @@
|
|
|
35
40
|
}
|
|
36
41
|
|
|
37
42
|
.tale-switch:focus-visible {
|
|
38
|
-
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--color
|
|
43
|
+
box-shadow: 0 0 0 2px var(--neutral-100), 0 0 0 4px var(--focus-ring-color);
|
|
39
44
|
}
|
|
40
45
|
|
|
41
46
|
/* ─── Checked (on) state ──────────────────────────────────────────────────── */
|
|
@@ -74,17 +79,26 @@
|
|
|
74
79
|
/* ─── Thumb — sliding circle ──────────────────────────────────────────────── */
|
|
75
80
|
|
|
76
81
|
.tale-switch__thumb {
|
|
77
|
-
|
|
78
|
-
|
|
82
|
+
position: absolute;
|
|
83
|
+
inset-inline-start: var(--tale-switch-thumb-offset);
|
|
84
|
+
inset-block-start: 50%;
|
|
85
|
+
width: var(--tale-switch-thumb-size);
|
|
86
|
+
height: var(--tale-switch-thumb-size);
|
|
79
87
|
border-radius: 50%;
|
|
80
88
|
background-color: var(--neutral-80);
|
|
81
89
|
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
|
|
82
90
|
transition: transform 0.2s ease, background-color 0.2s ease;
|
|
83
|
-
transform:
|
|
91
|
+
transform: translate(0, -50%);
|
|
84
92
|
flex-shrink: 0;
|
|
85
93
|
}
|
|
86
94
|
|
|
87
95
|
.tale-switch__thumb[data-checked] {
|
|
88
|
-
transform:
|
|
89
|
-
|
|
96
|
+
transform: translate(
|
|
97
|
+
calc(
|
|
98
|
+
var(--tale-switch-track-width) - (var(--tale-switch-thumb-offset) * 2) -
|
|
99
|
+
var(--tale-switch-thumb-size)
|
|
100
|
+
),
|
|
101
|
+
-50%
|
|
102
|
+
);
|
|
103
|
+
background-color: var(--color-60-fg);
|
|
90
104
|
}
|
package/src/toast.css
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
display: flex;
|
|
26
26
|
flex-direction: column-reverse;
|
|
27
27
|
gap: var(--space-2xs);
|
|
28
|
-
padding: var(--space-
|
|
28
|
+
padding: var(--space-xs);
|
|
29
29
|
pointer-events: none;
|
|
30
30
|
|
|
31
31
|
/* Default: bottom-right */
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
display: flex;
|
|
43
43
|
align-items: flex-start;
|
|
44
44
|
gap: var(--space-xs);
|
|
45
|
-
padding: var(--space-
|
|
45
|
+
padding: var(--space-2xs) var(--space-s);
|
|
46
46
|
background-color: var(--neutral-14);
|
|
47
47
|
border: 1px solid var(--neutral-22);
|
|
48
48
|
border-radius: 1rem;
|
|
@@ -65,18 +65,18 @@
|
|
|
65
65
|
/* ─── Type variants ───────────────────────────────────────────────────────── */
|
|
66
66
|
|
|
67
67
|
.tale-toast__root[data-type="success"] {
|
|
68
|
-
border-color: var(--
|
|
69
|
-
border-left: 4px solid var(--
|
|
68
|
+
border-color: var(--success-60);
|
|
69
|
+
border-left: 4px solid var(--success-60);
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
.tale-toast__root[data-type="error"] {
|
|
73
|
-
border-color: var(--
|
|
74
|
-
border-left: 4px solid var(--
|
|
73
|
+
border-color: var(--error-60);
|
|
74
|
+
border-left: 4px solid var(--error-60);
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
.tale-toast__root[data-type="warning"] {
|
|
78
|
-
border-color: var(--
|
|
79
|
-
border-left: 4px solid var(--
|
|
78
|
+
border-color: var(--warning-60);
|
|
79
|
+
border-left: 4px solid var(--warning-60);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
/* ─── Title ────────────────────────────────────────────────────────────────── */
|
package/src/tooltip.css
CHANGED