@tokis/theme 1.0.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 (50) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +51 -0
  3. package/package.json +69 -0
  4. package/src/base/index.css +19 -0
  5. package/src/base/reset.css +76 -0
  6. package/src/base/variables.css +206 -0
  7. package/src/components/accordion.css +124 -0
  8. package/src/components/alert.css +196 -0
  9. package/src/components/app-bar.css +69 -0
  10. package/src/components/avatar.css +199 -0
  11. package/src/components/bottom-nav.css +79 -0
  12. package/src/components/button.css +213 -0
  13. package/src/components/card.css +248 -0
  14. package/src/components/charts.css +38 -0
  15. package/src/components/checkbox.css +158 -0
  16. package/src/components/circular-progress.css +62 -0
  17. package/src/components/codeblock.css +229 -0
  18. package/src/components/command-palette.css +183 -0
  19. package/src/components/confirm-dialog.css +95 -0
  20. package/src/components/context-menu.css +82 -0
  21. package/src/components/dialog.css +149 -0
  22. package/src/components/drawer.css +167 -0
  23. package/src/components/dropdown.css +33 -0
  24. package/src/components/emptystate.css +42 -0
  25. package/src/components/extended.css +663 -0
  26. package/src/components/hover-card.css +29 -0
  27. package/src/components/index.css +40 -0
  28. package/src/components/infinite-scroll.css +45 -0
  29. package/src/components/input.css +201 -0
  30. package/src/components/nav-rail.css +104 -0
  31. package/src/components/navigation.css +273 -0
  32. package/src/components/pagination.css +91 -0
  33. package/src/components/progress.css +192 -0
  34. package/src/components/result.css +58 -0
  35. package/src/components/search-field.css +102 -0
  36. package/src/components/select.css +175 -0
  37. package/src/components/slider.css +115 -0
  38. package/src/components/snackbar.css +234 -0
  39. package/src/components/statistic.css +70 -0
  40. package/src/components/stepper.css +131 -0
  41. package/src/components/switch.css +107 -0
  42. package/src/components/tabs.css +152 -0
  43. package/src/components/timeline.css +125 -0
  44. package/src/components/toggle.css +103 -0
  45. package/src/components/tooltip.css +113 -0
  46. package/src/components/treeview.css +107 -0
  47. package/src/components/virtual-list.css +19 -0
  48. package/src/index.css +6 -0
  49. package/src/utilities/index.css +2 -0
  50. package/src/utilities/layout.css +28 -0
@@ -0,0 +1,91 @@
1
+ .tokis-pagination {
2
+ display: flex;
3
+ align-items: center;
4
+ gap: var(--tokis-spacing-1);
5
+ flex-wrap: wrap;
6
+ }
7
+
8
+ .tokis-pagination__item {
9
+ display: inline-flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ min-width: 36px;
13
+ height: 36px;
14
+ padding: 0 var(--tokis-spacing-2);
15
+ border: 1px solid var(--tokis-color-border);
16
+ border-radius: var(--tokis-radius-md);
17
+ background: var(--tokis-color-surface);
18
+ color: var(--tokis-text-primary);
19
+ font-size: var(--tokis-font-size-sm);
20
+ font-weight: var(--tokis-font-weight-medium);
21
+ cursor: pointer;
22
+ transition:
23
+ background-color var(--tokis-duration-fast) var(--tokis-ease-out),
24
+ border-color var(--tokis-duration-fast) var(--tokis-ease-out),
25
+ color var(--tokis-duration-fast) var(--tokis-ease-out);
26
+ user-select: none;
27
+ text-decoration: none;
28
+ }
29
+
30
+ .tokis-pagination__item:hover:not(:disabled):not(.tokis-pagination__item--disabled) {
31
+ background: var(--tokis-color-surface-hover);
32
+ border-color: var(--tokis-color-border-strong);
33
+ }
34
+
35
+ .tokis-pagination__item:focus-visible {
36
+ outline: 2px solid var(--tokis-color-focus-ring);
37
+ outline-offset: 2px;
38
+ }
39
+
40
+ .tokis-pagination__item--active {
41
+ background: var(--tokis-color-primary);
42
+ border-color: var(--tokis-color-primary);
43
+ color: var(--tokis-text-on-primary);
44
+ cursor: default;
45
+ }
46
+
47
+ .tokis-pagination__item--active:hover {
48
+ background: var(--tokis-color-primary);
49
+ border-color: var(--tokis-color-primary);
50
+ }
51
+
52
+ .tokis-pagination__item--disabled,
53
+ .tokis-pagination__item:disabled {
54
+ opacity: 0.4;
55
+ cursor: not-allowed;
56
+ pointer-events: none;
57
+ }
58
+
59
+ .tokis-pagination__ellipsis {
60
+ display: inline-flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ min-width: 36px;
64
+ height: 36px;
65
+ color: var(--tokis-text-tertiary);
66
+ font-size: var(--tokis-font-size-sm);
67
+ user-select: none;
68
+ }
69
+
70
+ .tokis-pagination__prev,
71
+ .tokis-pagination__next {
72
+ color: var(--tokis-text-secondary);
73
+ }
74
+
75
+ [data-theme='dark'] .tokis-pagination__item {
76
+ background: var(--tokis-color-surface);
77
+ border-color: var(--tokis-color-border);
78
+ color: var(--tokis-text-primary);
79
+ }
80
+
81
+ [data-theme='dark'] .tokis-pagination__item--active {
82
+ background: var(--tokis-color-primary);
83
+ border-color: var(--tokis-color-primary);
84
+ color: var(--tokis-text-on-primary);
85
+ }
86
+
87
+ @media (prefers-reduced-motion: reduce) {
88
+ .tokis-pagination__item {
89
+ transition: none;
90
+ }
91
+ }
@@ -0,0 +1,192 @@
1
+ /* ============================================================
2
+ Tokis — Progress, Skeleton, Spinner
3
+ ============================================================ */
4
+
5
+ /* ── Progress Bar ───────────────────────────────────────────── */
6
+
7
+ .tokis-progress-root { width: 100%; }
8
+
9
+ .tokis-progress-label {
10
+ display: flex;
11
+ justify-content: space-between;
12
+ align-items: center;
13
+ margin-bottom: var(--tokis-spacing-2);
14
+ gap: var(--tokis-spacing-2);
15
+ }
16
+ .tokis-progress-label-text {
17
+ font-size: var(--tokis-font-size-sm);
18
+ font-weight: var(--tokis-font-weight-medium);
19
+ color: var(--tokis-text-primary);
20
+ }
21
+ .tokis-progress-label-value {
22
+ font-size: var(--tokis-font-size-xs);
23
+ color: var(--tokis-text-secondary);
24
+ font-weight: var(--tokis-font-weight-medium);
25
+ font-variant-numeric: tabular-nums;
26
+ }
27
+
28
+ .tokis-progress-track {
29
+ width: 100%;
30
+ background: var(--tokis-color-neutral-200);
31
+ border-radius: var(--tokis-radius-full);
32
+ overflow: hidden;
33
+ height: 8px;
34
+ }
35
+ .tokis-progress-track--sm { height: 4px; }
36
+ .tokis-progress-track--lg { height: 12px; }
37
+
38
+ .tokis-progress-fill {
39
+ height: 100%;
40
+ background: var(--tokis-color-primary);
41
+ border-radius: var(--tokis-radius-full);
42
+ transition: width var(--tokis-duration-slow) var(--tokis-ease-out);
43
+ transform-origin: left;
44
+ }
45
+ .tokis-progress-fill--success { background: var(--tokis-color-success); }
46
+ .tokis-progress-fill--warning { background: var(--tokis-color-warning); }
47
+ .tokis-progress-fill--error { background: var(--tokis-color-error); }
48
+
49
+ .tokis-progress-fill--indeterminate {
50
+ width: 40% !important;
51
+ animation: tokis-progress-indeterminate 1.6s var(--tokis-ease-in-out) infinite;
52
+ position: relative;
53
+ overflow: hidden;
54
+ }
55
+
56
+ .tokis-progress-fill--indeterminate::after {
57
+ content: '';
58
+ position: absolute;
59
+ inset: 0;
60
+ background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.35) 50%, transparent 100%);
61
+ animation: tokis-progress-shimmer 1.5s ease-in-out infinite;
62
+ }
63
+
64
+ @keyframes tokis-progress-indeterminate {
65
+ 0% { transform: translateX(-150%); }
66
+ 100% { transform: translateX(400%); }
67
+ }
68
+
69
+ @keyframes tokis-progress-shimmer {
70
+ from { transform: translateX(-100%); }
71
+ to { transform: translateX(300%); }
72
+ }
73
+
74
+ /* ── Circular Progress ──────────────────────────────────────── */
75
+
76
+ .tokis-progress-circular {
77
+ display: inline-flex;
78
+ align-items: center;
79
+ justify-content: center;
80
+ position: relative;
81
+ }
82
+ .tokis-progress-circular svg {
83
+ transform: rotate(-90deg);
84
+ }
85
+ .tokis-progress-circular__track {
86
+ fill: none;
87
+ stroke: var(--tokis-color-neutral-200);
88
+ stroke-linecap: round;
89
+ }
90
+ .tokis-progress-circular__fill {
91
+ fill: none;
92
+ stroke: var(--tokis-color-primary);
93
+ stroke-linecap: round;
94
+ transition: stroke-dashoffset var(--tokis-duration-slow) var(--tokis-ease-out);
95
+ }
96
+ .tokis-progress-circular__label {
97
+ position: absolute;
98
+ font-size: var(--tokis-font-size-xs);
99
+ font-weight: var(--tokis-font-weight-semibold);
100
+ color: var(--tokis-text-primary);
101
+ font-variant-numeric: tabular-nums;
102
+ }
103
+
104
+ /* ── Skeleton ───────────────────────────────────────────────── */
105
+
106
+ .tokis-skeleton {
107
+ display: block;
108
+ background: var(--tokis-color-neutral-200);
109
+ border-radius: var(--tokis-radius-md);
110
+ overflow: hidden;
111
+ position: relative;
112
+ }
113
+
114
+ .tokis-skeleton::after {
115
+ content: '';
116
+ position: absolute;
117
+ inset: 0;
118
+ background: linear-gradient(
119
+ 90deg,
120
+ transparent 0%,
121
+ rgb(255 255 255 / 0.4) 50%,
122
+ transparent 100%
123
+ );
124
+ background-size: 200% 100%;
125
+ animation: tokis-skeleton-wave 1.8s linear infinite;
126
+ }
127
+
128
+ [data-theme="dark"] .tokis-skeleton::after {
129
+ background: linear-gradient(
130
+ 90deg,
131
+ transparent 0%,
132
+ rgb(255 255 255 / 0.06) 50%,
133
+ transparent 100%
134
+ );
135
+ background-size: 200% 100%;
136
+ }
137
+
138
+ .tokis-skeleton--text {
139
+ height: 1em;
140
+ border-radius: var(--tokis-radius-sm);
141
+ }
142
+ .tokis-skeleton--circle {
143
+ border-radius: var(--tokis-radius-full);
144
+ }
145
+ .tokis-skeleton--rect {
146
+ border-radius: var(--tokis-radius-md);
147
+ }
148
+
149
+ @keyframes tokis-skeleton-wave {
150
+ 0% { background-position: 200% 0; }
151
+ 100% { background-position: -200% 0; }
152
+ }
153
+
154
+ /* ── Spinner ────────────────────────────────────────────────── */
155
+
156
+ .tokis-spinner {
157
+ display: inline-block;
158
+ width: 20px;
159
+ height: 20px;
160
+ border: 2px solid var(--tokis-color-neutral-200);
161
+ border-top-color: var(--tokis-color-primary);
162
+ border-radius: var(--tokis-radius-full);
163
+ animation: tokis-spin var(--tokis-duration-slow) linear infinite;
164
+ flex-shrink: 0;
165
+ }
166
+ .tokis-spinner--sm { width: 14px; height: 14px; border-width: 2px; }
167
+ .tokis-spinner--lg { width: 32px; height: 32px; border-width: 3px; }
168
+ .tokis-spinner--xl { width: 48px; height: 48px; border-width: 4px; }
169
+
170
+ .tokis-spinner--white {
171
+ border-color: rgb(255 255 255 / 0.3);
172
+ border-top-color: var(--tokis-text-inverse);
173
+ }
174
+ .tokis-spinner--muted {
175
+ border-color: var(--tokis-color-neutral-200);
176
+ border-top-color: var(--tokis-text-secondary);
177
+ }
178
+
179
+ @keyframes tokis-spin {
180
+ to { transform: rotate(360deg); }
181
+ }
182
+
183
+ /* ── Reduced motion ─────────────────────────────────────────── */
184
+
185
+ @media (prefers-reduced-motion: reduce) {
186
+ .tokis-progress-fill { transition: none; }
187
+ .tokis-progress-circular__fill { transition: none; }
188
+ .tokis-progress-fill--indeterminate { animation: none; width: 100% !important; }
189
+ .tokis-progress-fill--indeterminate::after { animation: none; }
190
+ .tokis-skeleton::after { animation: none; }
191
+ .tokis-spinner { animation-duration: 1.5s; }
192
+ }
@@ -0,0 +1,58 @@
1
+ /* ── Result ──────────────────────────────────────────────── */
2
+
3
+ .tokis-result {
4
+ display: flex;
5
+ flex-direction: column;
6
+ align-items: center;
7
+ justify-content: center;
8
+ text-align: center;
9
+ padding: var(--tokis-spacing-12) var(--tokis-spacing-6);
10
+ gap: var(--tokis-spacing-4);
11
+ }
12
+
13
+ .tokis-result__icon {
14
+ display: flex;
15
+ align-items: center;
16
+ justify-content: center;
17
+ width: 80px;
18
+ height: 80px;
19
+ border-radius: 50%;
20
+ }
21
+
22
+ .tokis-result__icon--success { color: var(--tokis-color-success); background: var(--tokis-color-success-subtle, rgba(5,150,105,0.1)); }
23
+ .tokis-result__icon--error { color: var(--tokis-color-error); background: var(--tokis-color-error-subtle, rgba(220,38,38,0.1)); }
24
+ .tokis-result__icon--warning { color: var(--tokis-color-warning); background: var(--tokis-color-warning-subtle, rgba(217,119,6,0.1)); }
25
+ .tokis-result__icon--info { color: var(--tokis-color-info); background: var(--tokis-color-info-subtle, rgba(2,132,199,0.1)); }
26
+ .tokis-result__icon--loading { color: var(--tokis-color-primary); background: var(--tokis-color-primary-subtle); }
27
+
28
+ .tokis-result__spin {
29
+ animation: tokis-result-spin 1s linear infinite;
30
+ }
31
+
32
+ @keyframes tokis-result-spin {
33
+ from { transform: rotate(0deg); }
34
+ to { transform: rotate(360deg); }
35
+ }
36
+
37
+ .tokis-result__title {
38
+ font-size: var(--tokis-font-size-xl);
39
+ font-weight: var(--tokis-font-weight-semibold);
40
+ color: var(--tokis-text-primary);
41
+ margin: 0;
42
+ }
43
+
44
+ .tokis-result__description {
45
+ font-size: var(--tokis-font-size-sm);
46
+ color: var(--tokis-text-secondary);
47
+ line-height: var(--tokis-line-height-normal);
48
+ max-width: 400px;
49
+ margin: 0;
50
+ }
51
+
52
+ .tokis-result__extra {
53
+ margin-top: var(--tokis-spacing-4);
54
+ }
55
+
56
+ @media (prefers-reduced-motion: reduce) {
57
+ .tokis-result__spin { animation: none; }
58
+ }
@@ -0,0 +1,102 @@
1
+ /* ── SearchField ─────────────────────────────────────────── */
2
+
3
+ .tokis-search-field {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--tokis-spacing-1);
7
+ }
8
+
9
+ .tokis-search-field__label {
10
+ font-size: var(--tokis-font-size-sm);
11
+ font-weight: var(--tokis-font-weight-medium);
12
+ color: var(--tokis-text-secondary);
13
+ }
14
+
15
+ .tokis-search-field__wrap {
16
+ position: relative;
17
+ display: flex;
18
+ align-items: center;
19
+ }
20
+
21
+ .tokis-search-field__icon {
22
+ position: absolute;
23
+ left: var(--tokis-spacing-3);
24
+ color: var(--tokis-text-tertiary);
25
+ display: flex;
26
+ align-items: center;
27
+ pointer-events: none;
28
+ }
29
+
30
+ .tokis-search-field__input {
31
+ width: 100%;
32
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-3) var(--tokis-spacing-2) calc(var(--tokis-spacing-3) + 20px);
33
+ border: 1px solid var(--tokis-color-border);
34
+ border-radius: var(--tokis-radius-lg);
35
+ background: var(--tokis-color-surface);
36
+ color: var(--tokis-text-primary);
37
+ font-size: var(--tokis-font-size-sm);
38
+ font-family: var(--tokis-font-family);
39
+ outline: none;
40
+ transition: border-color var(--tokis-duration-fast) var(--tokis-ease-out),
41
+ box-shadow var(--tokis-duration-fast) var(--tokis-ease-out);
42
+ appearance: none;
43
+ }
44
+
45
+ .tokis-search-field__input::-webkit-search-cancel-button { display: none; }
46
+
47
+ .tokis-search-field__input::placeholder {
48
+ color: var(--tokis-text-tertiary);
49
+ }
50
+
51
+ .tokis-search-field__input:focus {
52
+ border-color: var(--tokis-color-primary);
53
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
54
+ }
55
+
56
+ .tokis-search-field__spinner {
57
+ position: absolute;
58
+ right: var(--tokis-spacing-3);
59
+ width: 14px;
60
+ height: 14px;
61
+ border: 2px solid var(--tokis-color-border);
62
+ border-top-color: var(--tokis-color-primary);
63
+ border-radius: 50%;
64
+ animation: tokis-search-spin 0.6s linear infinite;
65
+ }
66
+
67
+ .tokis-search-field__clear {
68
+ position: absolute;
69
+ right: var(--tokis-spacing-2);
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ width: 20px;
74
+ height: 20px;
75
+ border: none;
76
+ background: transparent;
77
+ color: var(--tokis-text-tertiary);
78
+ cursor: pointer;
79
+ border-radius: var(--tokis-radius-sm);
80
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out),
81
+ color var(--tokis-duration-fast) var(--tokis-ease-out);
82
+ }
83
+
84
+ .tokis-search-field__clear:hover {
85
+ background: var(--tokis-color-surface-hover);
86
+ color: var(--tokis-text-primary);
87
+ }
88
+
89
+ .tokis-search-field__clear:focus-visible {
90
+ outline: none;
91
+ box-shadow: 0 0 0 2px var(--tokis-color-focus-ring);
92
+ }
93
+
94
+ @keyframes tokis-search-spin {
95
+ to { transform: rotate(360deg); }
96
+ }
97
+
98
+ @media (prefers-reduced-motion: reduce) {
99
+ .tokis-search-field__spinner { animation: none; }
100
+ .tokis-search-field__input,
101
+ .tokis-search-field__clear { transition: none; }
102
+ }
@@ -0,0 +1,175 @@
1
+ /* ============================================================
2
+ Tokis — Select / Dropdown
3
+ ============================================================ */
4
+
5
+ /* ── Trigger ────────────────────────────────────────────────── */
6
+
7
+ .tokis-select-trigger {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ gap: var(--tokis-spacing-2);
12
+ width: 100%;
13
+ height: 40px;
14
+ padding: 0 var(--tokis-spacing-3);
15
+ font-size: var(--tokis-font-size-sm);
16
+ font-family: inherit;
17
+ font-weight: var(--tokis-font-weight-regular);
18
+ color: var(--tokis-text-primary);
19
+ background: var(--tokis-color-surface-raised);
20
+ border: 1px solid var(--tokis-color-border);
21
+ border-radius: var(--tokis-radius-md);
22
+ cursor: pointer;
23
+ transition:
24
+ border-color var(--tokis-duration-fast) var(--tokis-ease-out),
25
+ box-shadow var(--tokis-duration-fast) var(--tokis-ease-out),
26
+ background var(--tokis-duration-fast) var(--tokis-ease-out);
27
+ outline: none;
28
+ user-select: none;
29
+ -webkit-tap-highlight-color: transparent;
30
+ }
31
+
32
+ .tokis-select-trigger:hover:not([disabled]):not([data-disabled="true"]) {
33
+ border-color: var(--tokis-color-border-strong);
34
+ }
35
+
36
+ .tokis-select-trigger[data-open="true"] {
37
+ border-color: var(--tokis-color-primary);
38
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
39
+ }
40
+
41
+ .tokis-select-trigger:focus-visible:not([data-open="true"]) {
42
+ border-color: var(--tokis-color-primary);
43
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
44
+ }
45
+
46
+ .tokis-select-trigger[disabled],
47
+ .tokis-select-trigger[data-disabled="true"] {
48
+ background: var(--tokis-color-neutral-100);
49
+ color: var(--tokis-text-disabled);
50
+ cursor: not-allowed;
51
+ opacity: 1;
52
+ }
53
+
54
+ .tokis-select-trigger__placeholder {
55
+ color: var(--tokis-text-tertiary);
56
+ }
57
+
58
+ .tokis-select-trigger__icon {
59
+ flex-shrink: 0;
60
+ color: var(--tokis-text-tertiary);
61
+ transition: transform var(--tokis-duration-fast) var(--tokis-ease-in-out);
62
+ }
63
+ .tokis-select-trigger[data-open="true"] .tokis-select-trigger__icon {
64
+ transform: rotate(180deg);
65
+ }
66
+
67
+ /* ── Sizes ──────────────────────────────────────────────────── */
68
+
69
+ .tokis-select-trigger--sm { height: 32px; font-size: var(--tokis-font-size-xs); border-radius: var(--tokis-radius-sm); padding: 0 var(--tokis-spacing-2); }
70
+ .tokis-select-trigger--lg { height: 48px; font-size: var(--tokis-font-size-md); border-radius: var(--tokis-radius-lg); padding: 0 var(--tokis-spacing-4); }
71
+
72
+ /* ── Dropdown content ───────────────────────────────────────── */
73
+
74
+ .tokis-select-content {
75
+ background: var(--tokis-color-surface-overlay);
76
+ border: 1px solid var(--tokis-color-border);
77
+ border-radius: var(--tokis-radius-lg);
78
+ box-shadow: var(--tokis-shadow-xl);
79
+ padding: var(--tokis-spacing-1) 0;
80
+ min-width: 160px;
81
+ max-height: 320px;
82
+ overflow-y: auto;
83
+ overflow-x: hidden;
84
+ z-index: var(--tokis-z-dropdown);
85
+ animation: tokis-dropdown-in var(--tokis-duration-fast) var(--tokis-ease-out);
86
+ scrollbar-width: thin;
87
+ scrollbar-color: var(--tokis-color-border) transparent;
88
+ }
89
+ .tokis-select-content::-webkit-scrollbar {
90
+ width: 6px;
91
+ }
92
+ .tokis-select-content::-webkit-scrollbar-track {
93
+ background: transparent;
94
+ }
95
+ .tokis-select-content::-webkit-scrollbar-thumb {
96
+ background: var(--tokis-color-border);
97
+ border-radius: var(--tokis-radius-full);
98
+ }
99
+
100
+ /* ── Item ───────────────────────────────────────────────────── */
101
+
102
+ .tokis-select-item {
103
+ display: flex;
104
+ align-items: center;
105
+ gap: var(--tokis-spacing-2);
106
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-3);
107
+ font-size: var(--tokis-font-size-sm);
108
+ color: var(--tokis-text-primary);
109
+ cursor: pointer;
110
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out);
111
+ outline: none;
112
+ border: none;
113
+ background: none;
114
+ width: 100%;
115
+ text-align: left;
116
+ min-height: 36px;
117
+ }
118
+
119
+ .tokis-select-item:hover,
120
+ .tokis-select-item[data-focused="true"] {
121
+ background: var(--tokis-color-surface-hover);
122
+ }
123
+
124
+ .tokis-select-item[data-selected="true"] {
125
+ color: var(--tokis-color-primary);
126
+ font-weight: var(--tokis-font-weight-medium);
127
+ background: var(--tokis-color-primary-subtle);
128
+ }
129
+ .tokis-select-item[data-selected="true"]:hover {
130
+ background: var(--tokis-color-primary-subtle);
131
+ }
132
+
133
+ .tokis-select-item[data-disabled="true"] {
134
+ opacity: 0.45;
135
+ cursor: not-allowed;
136
+ pointer-events: none;
137
+ }
138
+
139
+ /* ── Group label ────────────────────────────────────────────── */
140
+
141
+ .tokis-select-group-label {
142
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-3) var(--tokis-spacing-1);
143
+ font-size: var(--tokis-font-size-xs);
144
+ font-weight: var(--tokis-font-weight-semibold);
145
+ color: var(--tokis-text-tertiary);
146
+ text-transform: uppercase;
147
+ letter-spacing: var(--tokis-letter-spacing-wide);
148
+ }
149
+
150
+ /* ── Separator ──────────────────────────────────────────────── */
151
+
152
+ .tokis-select-separator {
153
+ height: 1px;
154
+ background: var(--tokis-color-border);
155
+ margin: var(--tokis-spacing-1) 0;
156
+ }
157
+
158
+ /* ── Animation ──────────────────────────────────────────────── */
159
+
160
+ @keyframes tokis-dropdown-in {
161
+ from { opacity: 0; transform: translateY(-4px) scale(0.98); }
162
+ to { opacity: 1; transform: translateY(0) scale(1); }
163
+ }
164
+
165
+ /* ── Reduced motion ─────────────────────────────────────────── */
166
+
167
+ @media (prefers-reduced-motion: reduce) {
168
+ .tokis-select-content {
169
+ animation: none;
170
+ }
171
+ .tokis-select-trigger,
172
+ .tokis-select-trigger__icon {
173
+ transition: none;
174
+ }
175
+ }