@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,115 @@
1
+ /* ============================================================
2
+ Tokis — Slider / Range Input
3
+ ============================================================ */
4
+
5
+ .tokis-slider-root {
6
+ position: relative;
7
+ width: 100%;
8
+ cursor: pointer;
9
+ user-select: none;
10
+ touch-action: none;
11
+ }
12
+
13
+ /* ── Track wrapper (positions both track and thumb) ──────────── */
14
+
15
+ .tokis-slider-track-wrapper {
16
+ position: relative;
17
+ width: 100%;
18
+ height: 24px;
19
+ display: flex;
20
+ align-items: center;
21
+ }
22
+
23
+ .tokis-slider-root[data-disabled="true"] {
24
+ opacity: 0.45;
25
+ cursor: not-allowed;
26
+ pointer-events: none;
27
+ }
28
+
29
+ /* ── Track ──────────────────────────────────────────────────── */
30
+
31
+ .tokis-slider-track {
32
+ position: relative;
33
+ width: 100%;
34
+ height: 4px;
35
+ background: var(--tokis-color-neutral-200);
36
+ border-radius: var(--tokis-radius-full);
37
+ overflow: hidden;
38
+ flex-shrink: 0;
39
+ }
40
+
41
+ .tokis-slider-range {
42
+ position: absolute;
43
+ height: 100%;
44
+ background: var(--tokis-color-primary);
45
+ border-radius: var(--tokis-radius-full);
46
+ }
47
+
48
+ /* ── Thumb ──────────────────────────────────────────────────── */
49
+
50
+ .tokis-slider-thumb {
51
+ position: absolute;
52
+ top: 50%;
53
+ width: 18px;
54
+ height: 18px;
55
+ border-radius: var(--tokis-radius-full);
56
+ background: var(--tokis-color-surface-raised);
57
+ border: 2px solid var(--tokis-color-primary);
58
+ box-shadow: var(--tokis-shadow-sm);
59
+ transform: translateX(-50%) translateY(-50%);
60
+ transition:
61
+ box-shadow var(--tokis-duration-fast) var(--tokis-ease-out),
62
+ transform var(--tokis-duration-fast) var(--tokis-ease-out);
63
+ outline: none;
64
+ cursor: grab;
65
+ will-change: transform;
66
+ }
67
+
68
+ .tokis-slider-thumb:hover {
69
+ transform: translateX(-50%) translateY(-50%) scale(1.2);
70
+ box-shadow:
71
+ var(--tokis-shadow-sm),
72
+ 0 0 0 6px var(--tokis-color-focus-ring);
73
+ }
74
+
75
+ .tokis-slider-thumb:active {
76
+ cursor: grabbing;
77
+ transform: translateX(-50%) translateY(-50%) scale(1.1);
78
+ }
79
+
80
+ .tokis-slider-thumb:focus-visible {
81
+ box-shadow:
82
+ var(--tokis-shadow-sm),
83
+ 0 0 0 4px var(--tokis-color-focus-ring);
84
+ }
85
+
86
+ /* ── Marks ──────────────────────────────────────────────────── */
87
+
88
+ .tokis-slider-marks {
89
+ display: flex;
90
+ justify-content: space-between;
91
+ margin-top: var(--tokis-spacing-2);
92
+ }
93
+
94
+ .tokis-slider-mark-label {
95
+ font-size: var(--tokis-font-size-xs);
96
+ color: var(--tokis-text-tertiary);
97
+ }
98
+
99
+ /* ── Sizes ──────────────────────────────────────────────────── */
100
+
101
+ .tokis-slider-root--sm .tokis-slider-track-wrapper { height: 16px; }
102
+ .tokis-slider-root--sm .tokis-slider-track { height: 2px; }
103
+ .tokis-slider-root--sm .tokis-slider-thumb { width: 14px; height: 14px; }
104
+
105
+ .tokis-slider-root--lg .tokis-slider-track-wrapper { height: 32px; }
106
+ .tokis-slider-root--lg .tokis-slider-track { height: 6px; }
107
+ .tokis-slider-root--lg .tokis-slider-thumb { width: 22px; height: 22px; }
108
+
109
+ /* ── Reduced motion ─────────────────────────────────────────── */
110
+
111
+ @media (prefers-reduced-motion: reduce) {
112
+ .tokis-slider-thumb {
113
+ transition: none;
114
+ }
115
+ }
@@ -0,0 +1,234 @@
1
+ /* ============================================================
2
+ Tokis — Snackbar / Toast
3
+ Positioned notification toasts rendered via Portal
4
+ ============================================================ */
5
+
6
+ /* ── Container ───────────────────────────────────────────── */
7
+
8
+ .tokis-snackbar-container {
9
+ position: fixed;
10
+ bottom: var(--tokis-spacing-6);
11
+ right: var(--tokis-spacing-6);
12
+ z-index: var(--tokis-z-toast);
13
+ display: flex;
14
+ flex-direction: column;
15
+ gap: var(--tokis-spacing-2);
16
+ pointer-events: none;
17
+ max-width: 400px;
18
+ width: calc(100vw - var(--tokis-spacing-6) * 2);
19
+ }
20
+
21
+ /* Placement variants */
22
+ .tokis-snackbar-container--bottom-left {
23
+ right: auto;
24
+ left: var(--tokis-spacing-6);
25
+ }
26
+
27
+ .tokis-snackbar-container--bottom-center {
28
+ right: auto;
29
+ left: 50%;
30
+ transform: translateX(-50%);
31
+ }
32
+
33
+ .tokis-snackbar-container--top-right {
34
+ bottom: auto;
35
+ top: var(--tokis-spacing-6);
36
+ }
37
+
38
+ .tokis-snackbar-container--top-center {
39
+ bottom: auto;
40
+ top: var(--tokis-spacing-6);
41
+ right: auto;
42
+ left: 50%;
43
+ transform: translateX(-50%);
44
+ }
45
+
46
+ /* ── Snackbar Toast ──────────────────────────────────────── */
47
+
48
+ .tokis-snackbar {
49
+ display: flex;
50
+ align-items: flex-start;
51
+ gap: var(--tokis-spacing-3);
52
+ padding: var(--tokis-spacing-3) var(--tokis-spacing-4);
53
+ border-radius: var(--tokis-radius-lg);
54
+ pointer-events: auto;
55
+ min-width: 280px;
56
+ box-shadow: var(--tokis-shadow-xl);
57
+ border: 1px solid;
58
+ border-left: 3px solid transparent;
59
+ animation: tokis-snackbar-in var(--tokis-duration-normal) var(--tokis-ease-spring) both;
60
+
61
+ /* Glass-effect dark surface for light theme */
62
+ background: rgba(17, 24, 39, 0.95);
63
+ border-color: rgba(255, 255, 255, 0.08);
64
+ color: var(--tokis-color-neutral-100);
65
+ backdrop-filter: blur(12px);
66
+ -webkit-backdrop-filter: blur(12px);
67
+ }
68
+
69
+ [data-theme='dark'] .tokis-snackbar {
70
+ /* Glass-effect light surface for dark theme */
71
+ background: rgba(249, 250, 251, 0.95);
72
+ border-color: rgba(0, 0, 0, 0.08);
73
+ color: var(--tokis-color-neutral-900);
74
+ }
75
+
76
+ /* ── Variants ────────────────────────────────────────────── */
77
+
78
+ .tokis-snackbar--success {
79
+ background: rgba(17, 24, 39, 0.97);
80
+ border-color: rgba(255, 255, 255, 0.08);
81
+ border-left-color: var(--tokis-color-success);
82
+ color: var(--tokis-color-neutral-100);
83
+ }
84
+
85
+ [data-theme='dark'] .tokis-snackbar--success {
86
+ background: rgba(249, 250, 251, 0.97);
87
+ border-color: rgba(0, 0, 0, 0.08);
88
+ border-left-color: var(--tokis-color-success);
89
+ color: var(--tokis-color-neutral-900);
90
+ }
91
+
92
+ .tokis-snackbar--error {
93
+ background: rgba(17, 24, 39, 0.97);
94
+ border-color: rgba(255, 255, 255, 0.08);
95
+ border-left-color: var(--tokis-color-error);
96
+ color: var(--tokis-color-neutral-100);
97
+ }
98
+
99
+ [data-theme='dark'] .tokis-snackbar--error {
100
+ background: rgba(249, 250, 251, 0.97);
101
+ border-color: rgba(0, 0, 0, 0.08);
102
+ border-left-color: var(--tokis-color-error);
103
+ color: var(--tokis-color-neutral-900);
104
+ }
105
+
106
+ .tokis-snackbar--warning {
107
+ background: rgba(17, 24, 39, 0.97);
108
+ border-color: rgba(255, 255, 255, 0.08);
109
+ border-left-color: var(--tokis-color-warning);
110
+ color: var(--tokis-color-neutral-100);
111
+ }
112
+
113
+ [data-theme='dark'] .tokis-snackbar--warning {
114
+ background: rgba(249, 250, 251, 0.97);
115
+ border-color: rgba(0, 0, 0, 0.08);
116
+ border-left-color: var(--tokis-color-warning);
117
+ color: var(--tokis-color-neutral-900);
118
+ }
119
+
120
+ /* ── Body ────────────────────────────────────────────────── */
121
+
122
+ .tokis-snackbar__body {
123
+ flex: 1;
124
+ min-width: 0;
125
+ display: flex;
126
+ flex-direction: column;
127
+ gap: var(--tokis-spacing-1);
128
+ }
129
+
130
+ .tokis-snackbar__title {
131
+ font-size: var(--tokis-font-size-sm);
132
+ font-weight: var(--tokis-font-weight-semibold);
133
+ line-height: 1.4;
134
+ }
135
+
136
+ .tokis-snackbar__body > div {
137
+ font-size: var(--tokis-font-size-sm);
138
+ line-height: 1.5;
139
+ opacity: 0.85;
140
+ }
141
+
142
+ /* ── Action Button ───────────────────────────────────────── */
143
+
144
+ .tokis-snackbar__action {
145
+ display: inline-flex;
146
+ align-items: center;
147
+ background: rgb(255 255 255 / 0.1);
148
+ border: 1px solid rgb(255 255 255 / 0.2);
149
+ border-radius: var(--tokis-radius-md);
150
+ padding: var(--tokis-spacing-1) var(--tokis-spacing-3);
151
+ margin-top: var(--tokis-spacing-2);
152
+ font-size: var(--tokis-font-size-xs);
153
+ font-weight: var(--tokis-font-weight-semibold);
154
+ font-family: var(--tokis-font-family);
155
+ cursor: pointer;
156
+ color: currentColor;
157
+ white-space: nowrap;
158
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out),
159
+ border-color var(--tokis-duration-fast) var(--tokis-ease-out);
160
+ }
161
+
162
+ [data-theme='dark'] .tokis-snackbar__action {
163
+ background: rgb(0 0 0 / 0.1);
164
+ border-color: rgb(0 0 0 / 0.15);
165
+ }
166
+
167
+ .tokis-snackbar__action:hover {
168
+ background: rgb(255 255 255 / 0.18);
169
+ border-color: rgb(255 255 255 / 0.35);
170
+ }
171
+
172
+ [data-theme='dark'] .tokis-snackbar__action:hover {
173
+ background: rgb(0 0 0 / 0.15);
174
+ border-color: rgb(0 0 0 / 0.25);
175
+ }
176
+
177
+ .tokis-snackbar__action:focus-visible {
178
+ outline: none;
179
+ box-shadow: 0 0 0 2px var(--tokis-color-focus-ring);
180
+ }
181
+
182
+ /* ── Close Button ────────────────────────────────────────── */
183
+
184
+ .tokis-snackbar__close {
185
+ flex-shrink: 0;
186
+ background: transparent;
187
+ border: none;
188
+ padding: 2px;
189
+ cursor: pointer;
190
+ color: currentColor;
191
+ opacity: 0.6;
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ border-radius: var(--tokis-radius-sm);
196
+ transition: opacity var(--tokis-duration-fast) var(--tokis-ease-out),
197
+ background var(--tokis-duration-fast) var(--tokis-ease-out);
198
+ margin-top: 1px;
199
+ }
200
+
201
+ .tokis-snackbar__close:hover {
202
+ opacity: 1;
203
+ background: rgb(255 255 255 / 0.1);
204
+ }
205
+
206
+ [data-theme='dark'] .tokis-snackbar__close:hover {
207
+ background: rgb(0 0 0 / 0.1);
208
+ }
209
+
210
+ .tokis-snackbar__close:focus-visible {
211
+ outline: none;
212
+ box-shadow: 0 0 0 2px var(--tokis-color-focus-ring);
213
+ }
214
+
215
+ /* ── Animation ───────────────────────────────────────────── */
216
+
217
+ @keyframes tokis-snackbar-in {
218
+ from {
219
+ opacity: 0;
220
+ transform: translateY(12px) scale(0.97);
221
+ }
222
+ to {
223
+ opacity: 1;
224
+ transform: translateY(0) scale(1);
225
+ }
226
+ }
227
+
228
+ /* ── Reduced motion ──────────────────────────────────────── */
229
+
230
+ @media (prefers-reduced-motion: reduce) {
231
+ .tokis-snackbar {
232
+ animation: none;
233
+ }
234
+ }
@@ -0,0 +1,70 @@
1
+ /* ── Statistic ───────────────────────────────────────────── */
2
+
3
+ .tokis-statistic {
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--tokis-spacing-1);
7
+ }
8
+
9
+ .tokis-statistic__label {
10
+ font-size: var(--tokis-font-size-sm);
11
+ color: var(--tokis-text-secondary);
12
+ font-weight: var(--tokis-font-weight-medium);
13
+ }
14
+
15
+ .tokis-statistic__value-row {
16
+ display: flex;
17
+ align-items: baseline;
18
+ gap: var(--tokis-spacing-1);
19
+ flex-wrap: wrap;
20
+ }
21
+
22
+ .tokis-statistic__prefix {
23
+ font-size: var(--tokis-font-size-lg);
24
+ color: var(--tokis-text-secondary);
25
+ font-weight: var(--tokis-font-weight-medium);
26
+ }
27
+
28
+ .tokis-statistic__value {
29
+ font-size: var(--tokis-font-size-3xl);
30
+ font-weight: var(--tokis-font-weight-bold);
31
+ color: var(--tokis-text-primary);
32
+ line-height: 1;
33
+ }
34
+
35
+ .tokis-statistic__suffix {
36
+ font-size: var(--tokis-font-size-lg);
37
+ color: var(--tokis-text-secondary);
38
+ font-weight: var(--tokis-font-weight-medium);
39
+ }
40
+
41
+ .tokis-statistic__trend {
42
+ display: inline-flex;
43
+ align-items: center;
44
+ gap: 2px;
45
+ font-size: var(--tokis-font-size-sm);
46
+ font-weight: var(--tokis-font-weight-semibold);
47
+ padding: 2px var(--tokis-spacing-2);
48
+ border-radius: var(--tokis-radius-full);
49
+ }
50
+
51
+ .tokis-statistic__trend--up {
52
+ color: var(--tokis-color-success);
53
+ background: var(--tokis-color-success-subtle, rgba(5, 150, 105, 0.1));
54
+ }
55
+
56
+ .tokis-statistic__trend--down {
57
+ color: var(--tokis-color-error);
58
+ background: var(--tokis-color-error-subtle, rgba(220, 38, 38, 0.1));
59
+ }
60
+
61
+ .tokis-statistic__trend--neutral {
62
+ color: var(--tokis-text-tertiary);
63
+ background: var(--tokis-color-surface);
64
+ }
65
+
66
+ .tokis-statistic__desc {
67
+ font-size: var(--tokis-font-size-xs);
68
+ color: var(--tokis-text-tertiary);
69
+ margin-top: var(--tokis-spacing-1);
70
+ }
@@ -0,0 +1,131 @@
1
+ /* ── Stepper ─────────────────────────────────────────────── */
2
+
3
+ .tokis-stepper {
4
+ list-style: none;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ .tokis-stepper--horizontal {
10
+ display: flex;
11
+ align-items: flex-start;
12
+ }
13
+
14
+ .tokis-stepper--vertical {
15
+ display: flex;
16
+ flex-direction: column;
17
+ }
18
+
19
+ /* Step */
20
+ .tokis-stepper__step {
21
+ position: relative;
22
+ display: flex;
23
+ flex: 1;
24
+ }
25
+
26
+ .tokis-stepper--vertical .tokis-stepper__step {
27
+ flex: none;
28
+ flex-direction: column;
29
+ }
30
+
31
+ .tokis-stepper__step-inner {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: var(--tokis-spacing-3);
35
+ }
36
+
37
+ .tokis-stepper--vertical .tokis-stepper__step-inner {
38
+ align-items: flex-start;
39
+ }
40
+
41
+ /* Circle */
42
+ .tokis-stepper__circle {
43
+ flex-shrink: 0;
44
+ width: 32px;
45
+ height: 32px;
46
+ border-radius: 50%;
47
+ display: flex;
48
+ align-items: center;
49
+ justify-content: center;
50
+ font-size: var(--tokis-font-size-sm);
51
+ font-weight: var(--tokis-font-weight-semibold);
52
+ border: 2px solid;
53
+ transition: all var(--tokis-duration-normal) var(--tokis-ease-out);
54
+ }
55
+
56
+ .tokis-stepper__circle--completed {
57
+ background: var(--tokis-color-success);
58
+ border-color: var(--tokis-color-success);
59
+ color: #fff;
60
+ }
61
+
62
+ .tokis-stepper__circle--active {
63
+ background: var(--tokis-color-primary);
64
+ border-color: var(--tokis-color-primary);
65
+ color: var(--tokis-text-on-primary);
66
+ }
67
+
68
+ .tokis-stepper__circle--pending {
69
+ background: var(--tokis-color-surface);
70
+ border-color: var(--tokis-color-border);
71
+ color: var(--tokis-text-tertiary);
72
+ }
73
+
74
+ .tokis-stepper__circle--error {
75
+ background: var(--tokis-color-error);
76
+ border-color: var(--tokis-color-error);
77
+ color: #fff;
78
+ }
79
+
80
+ /* Connector */
81
+ .tokis-stepper__connector {
82
+ flex: 1;
83
+ height: 2px;
84
+ background: var(--tokis-color-border);
85
+ margin: 0 var(--tokis-spacing-2);
86
+ margin-top: 15px;
87
+ align-self: flex-start;
88
+ transition: background var(--tokis-duration-normal) var(--tokis-ease-out);
89
+ }
90
+
91
+ .tokis-stepper__connector--completed {
92
+ background: var(--tokis-color-success);
93
+ }
94
+
95
+ .tokis-stepper--vertical .tokis-stepper__connector {
96
+ width: 2px;
97
+ height: auto;
98
+ min-height: 24px;
99
+ margin: var(--tokis-spacing-1) 0 var(--tokis-spacing-1) 15px;
100
+ align-self: auto;
101
+ }
102
+
103
+ /* Text */
104
+ .tokis-stepper__text {
105
+ min-width: 0;
106
+ }
107
+
108
+ .tokis-stepper__label {
109
+ font-size: var(--tokis-font-size-sm);
110
+ font-weight: var(--tokis-font-weight-semibold);
111
+ color: var(--tokis-text-primary);
112
+ line-height: 1.4;
113
+ white-space: nowrap;
114
+ }
115
+
116
+ .tokis-stepper__step--pending .tokis-stepper__label {
117
+ color: var(--tokis-text-tertiary);
118
+ font-weight: var(--tokis-font-weight-medium);
119
+ }
120
+
121
+ .tokis-stepper__desc {
122
+ font-size: var(--tokis-font-size-xs);
123
+ color: var(--tokis-text-secondary);
124
+ margin-top: 2px;
125
+ line-height: 1.4;
126
+ }
127
+
128
+ @media (prefers-reduced-motion: reduce) {
129
+ .tokis-stepper__circle,
130
+ .tokis-stepper__connector { transition: none; }
131
+ }
@@ -0,0 +1,107 @@
1
+ /* ============================================================
2
+ Tokis — Switch (Toggle)
3
+ ============================================================ */
4
+
5
+ .tokis-switch-root {
6
+ display: inline-flex;
7
+ align-items: flex-start;
8
+ gap: var(--tokis-spacing-3);
9
+ cursor: pointer;
10
+ user-select: none;
11
+ }
12
+
13
+ .tokis-switch-root[data-disabled="true"] {
14
+ opacity: 0.45;
15
+ cursor: not-allowed;
16
+ pointer-events: none;
17
+ }
18
+
19
+ /* ── Track ──────────────────────────────────────────────────── */
20
+
21
+ .tokis-switch-track {
22
+ position: relative;
23
+ width: 44px;
24
+ height: 24px;
25
+ margin-top: 2px;
26
+ background: var(--tokis-color-neutral-300);
27
+ border-radius: var(--tokis-radius-full);
28
+ transition:
29
+ background var(--tokis-duration-normal) var(--tokis-ease-in-out),
30
+ box-shadow var(--tokis-duration-fast) var(--tokis-ease-out);
31
+ flex-shrink: 0;
32
+ outline: none;
33
+ }
34
+
35
+ .tokis-switch-track:focus-visible {
36
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
37
+ }
38
+
39
+ .tokis-switch-track[data-checked="true"] {
40
+ background: var(--tokis-color-primary);
41
+ }
42
+
43
+ /* ── Thumb ──────────────────────────────────────────────────── */
44
+
45
+ .tokis-switch-thumb {
46
+ position: absolute;
47
+ top: 3px;
48
+ left: 3px;
49
+ width: 18px;
50
+ height: 18px;
51
+ border-radius: var(--tokis-radius-full);
52
+ background: var(--tokis-text-inverse);
53
+ box-shadow: var(--tokis-shadow-sm);
54
+ transition: transform var(--tokis-duration-normal) var(--tokis-ease-spring);
55
+ pointer-events: none;
56
+ }
57
+
58
+ .tokis-switch-track[data-checked="true"] .tokis-switch-thumb {
59
+ transform: translateX(20px);
60
+ }
61
+
62
+ /* ── Sizes ──────────────────────────────────────────────────── */
63
+
64
+ .tokis-switch-root--sm .tokis-switch-track {
65
+ width: 32px;
66
+ height: 18px;
67
+ }
68
+ .tokis-switch-root--sm .tokis-switch-thumb {
69
+ width: 12px;
70
+ height: 12px;
71
+ top: 3px;
72
+ left: 3px;
73
+ }
74
+ .tokis-switch-root--sm .tokis-switch-track[data-checked="true"] .tokis-switch-thumb {
75
+ transform: translateX(14px);
76
+ }
77
+
78
+ /* ── Label ──────────────────────────────────────────────────── */
79
+
80
+ .tokis-switch-content {
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: 2px;
84
+ }
85
+
86
+ .tokis-switch-label {
87
+ font-size: var(--tokis-font-size-sm);
88
+ color: var(--tokis-text-primary);
89
+ line-height: 1.5;
90
+ display: block;
91
+ }
92
+
93
+ .tokis-switch-description {
94
+ font-size: var(--tokis-font-size-xs);
95
+ color: var(--tokis-text-tertiary);
96
+ margin: 0;
97
+ line-height: 1.4;
98
+ }
99
+
100
+ /* ── Reduced motion ─────────────────────────────────────────── */
101
+
102
+ @media (prefers-reduced-motion: reduce) {
103
+ .tokis-switch-track,
104
+ .tokis-switch-thumb {
105
+ transition: none;
106
+ }
107
+ }