@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,40 @@
1
+ @import "./button.css";
2
+ @import "./input.css";
3
+ @import "./checkbox.css";
4
+ @import "./switch.css";
5
+ @import "./select.css";
6
+ @import "./slider.css";
7
+ @import "./dialog.css";
8
+ @import "./drawer.css";
9
+ @import "./tabs.css";
10
+ @import "./accordion.css";
11
+ @import "./tooltip.css";
12
+ @import "./avatar.css";
13
+ @import "./alert.css";
14
+ @import "./progress.css";
15
+ @import "./card.css";
16
+ @import "./navigation.css";
17
+ @import "./extended.css";
18
+ @import "./codeblock.css";
19
+ @import "./snackbar.css";
20
+ @import "./pagination.css";
21
+ @import "./timeline.css";
22
+ @import "./treeview.css";
23
+ @import "./statistic.css";
24
+ @import "./emptystate.css";
25
+ @import "./result.css";
26
+ @import "./stepper.css";
27
+ @import "./bottom-nav.css";
28
+ @import "./nav-rail.css";
29
+ @import "./app-bar.css";
30
+ @import "./circular-progress.css";
31
+ @import "./confirm-dialog.css";
32
+ @import "./hover-card.css";
33
+ @import "./context-menu.css";
34
+ @import "./dropdown.css";
35
+ @import "./command-palette.css";
36
+ @import "./search-field.css";
37
+ @import "./toggle.css";
38
+ @import "./charts.css";
39
+ @import "./virtual-list.css";
40
+ @import "./infinite-scroll.css";
@@ -0,0 +1,45 @@
1
+ /* ── InfiniteScroll ──────────────────────────────────────── */
2
+
3
+ .tokis-infinite-scroll {
4
+ display: flex;
5
+ flex-direction: column;
6
+ }
7
+
8
+ .tokis-infinite-scroll__loading {
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ padding: var(--tokis-spacing-6);
13
+ }
14
+
15
+ .tokis-infinite-scroll__spinner {
16
+ display: inline-block;
17
+ width: 24px;
18
+ height: 24px;
19
+ border: 2px solid var(--tokis-color-border);
20
+ border-top-color: var(--tokis-color-primary);
21
+ border-radius: 50%;
22
+ animation: tokis-inf-spin 0.6s linear infinite;
23
+ }
24
+
25
+ @keyframes tokis-inf-spin {
26
+ to { transform: rotate(360deg); }
27
+ }
28
+
29
+ .tokis-infinite-scroll__end {
30
+ display: flex;
31
+ align-items: center;
32
+ justify-content: center;
33
+ padding: var(--tokis-spacing-4);
34
+ color: var(--tokis-text-tertiary);
35
+ font-size: var(--tokis-font-size-sm);
36
+ }
37
+
38
+ .tokis-infinite-scroll__sentinel {
39
+ height: 1px;
40
+ pointer-events: none;
41
+ }
42
+
43
+ @media (prefers-reduced-motion: reduce) {
44
+ .tokis-infinite-scroll__spinner { animation: none; }
45
+ }
@@ -0,0 +1,201 @@
1
+ /* ============================================================
2
+ Tokis — Input / TextField
3
+ ============================================================ */
4
+
5
+ .tokis-field {
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: var(--tokis-spacing-1);
9
+ width: 100%;
10
+ }
11
+
12
+ .tokis-label {
13
+ font-size: var(--tokis-font-size-sm);
14
+ font-weight: var(--tokis-font-weight-medium);
15
+ color: var(--tokis-text-primary);
16
+ line-height: 1.5;
17
+ }
18
+ .tokis-label--required::after {
19
+ content: ' *';
20
+ color: var(--tokis-color-error);
21
+ }
22
+
23
+ .tokis-helper-text {
24
+ font-size: var(--tokis-font-size-xs);
25
+ color: var(--tokis-text-secondary);
26
+ line-height: 1.4;
27
+ }
28
+ .tokis-helper-text--error { color: var(--tokis-color-error); }
29
+
30
+ /* ── Wrapper ────────────────────────────────────────────────── */
31
+
32
+ .tokis-input-wrapper {
33
+ position: relative;
34
+ display: flex;
35
+ align-items: center;
36
+ }
37
+
38
+ /* ── Input ──────────────────────────────────────────────────── */
39
+
40
+ .tokis-input {
41
+ width: 100%;
42
+ height: 40px;
43
+ padding: 0 var(--tokis-spacing-3);
44
+ font-size: var(--tokis-font-size-sm);
45
+ font-family: inherit;
46
+ color: var(--tokis-text-primary);
47
+ background: var(--tokis-color-surface-raised);
48
+ border: 1px solid var(--tokis-color-border);
49
+ border-radius: var(--tokis-radius-md);
50
+ transition:
51
+ border-color var(--tokis-duration-fast) var(--tokis-ease-out),
52
+ box-shadow var(--tokis-duration-fast) var(--tokis-ease-out);
53
+ outline: none;
54
+ appearance: none;
55
+ }
56
+ .tokis-input::placeholder { color: var(--tokis-text-tertiary); }
57
+
58
+ .tokis-input:hover:not(:disabled):not([aria-invalid="true"]):not(:focus) {
59
+ border-color: var(--tokis-color-border-strong);
60
+ }
61
+
62
+ .tokis-input:focus-visible:not(:disabled) {
63
+ border-color: var(--tokis-color-primary);
64
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
65
+ }
66
+
67
+ /* Legacy :focus for non-focus-visible browsers */
68
+ .tokis-input:focus:not(:focus-visible):not(:disabled) {
69
+ border-color: var(--tokis-color-primary);
70
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
71
+ }
72
+
73
+ .tokis-input:disabled {
74
+ background: var(--tokis-color-neutral-100);
75
+ color: var(--tokis-text-disabled);
76
+ cursor: not-allowed;
77
+ opacity: 1;
78
+ }
79
+
80
+ .tokis-input[aria-invalid="true"] {
81
+ border-color: var(--tokis-color-error);
82
+ }
83
+ .tokis-input[aria-invalid="true"]:focus,
84
+ .tokis-input[aria-invalid="true"]:focus-visible {
85
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring-error);
86
+ }
87
+
88
+ /* ── Sizes ──────────────────────────────────────────────────── */
89
+
90
+ .tokis-input--sm {
91
+ height: 32px;
92
+ font-size: var(--tokis-font-size-xs);
93
+ border-radius: var(--tokis-radius-sm);
94
+ padding: 0 var(--tokis-spacing-2);
95
+ }
96
+ .tokis-input--lg {
97
+ height: 48px;
98
+ font-size: var(--tokis-font-size-md);
99
+ border-radius: var(--tokis-radius-lg);
100
+ padding: 0 var(--tokis-spacing-4);
101
+ }
102
+
103
+ /* ── Adornments ─────────────────────────────────────────────── */
104
+
105
+ .tokis-input--with-start { padding-left: 38px; }
106
+ .tokis-input--with-end { padding-right: 38px; }
107
+
108
+ .tokis-input-adornment {
109
+ position: absolute;
110
+ display: flex;
111
+ align-items: center;
112
+ justify-content: center;
113
+ color: var(--tokis-text-tertiary);
114
+ width: 38px;
115
+ height: 100%;
116
+ pointer-events: none;
117
+ flex-shrink: 0;
118
+ }
119
+ .tokis-input-adornment--start { left: 0; }
120
+ .tokis-input-adornment--end { right: 0; pointer-events: auto; }
121
+
122
+ /* ── Password Toggle ────────────────────────────────────────── */
123
+
124
+ .tokis-input-password-toggle {
125
+ position: absolute;
126
+ right: 0;
127
+ display: flex;
128
+ align-items: center;
129
+ justify-content: center;
130
+ width: 38px;
131
+ height: 100%;
132
+ background: none;
133
+ border: none;
134
+ color: var(--tokis-text-tertiary);
135
+ cursor: pointer;
136
+ padding: 0;
137
+ transition: color var(--tokis-duration-fast) var(--tokis-ease-out);
138
+ flex-shrink: 0;
139
+ outline: none;
140
+ border-radius: 0 var(--tokis-radius-md) var(--tokis-radius-md) 0;
141
+ }
142
+ .tokis-input-password-toggle:hover { color: var(--tokis-text-secondary); }
143
+ .tokis-input-password-toggle:focus-visible {
144
+ color: var(--tokis-color-primary);
145
+ box-shadow: inset 0 0 0 2px var(--tokis-color-focus-ring);
146
+ }
147
+
148
+ /* ── Textarea ───────────────────────────────────────────────── */
149
+
150
+ .tokis-textarea {
151
+ width: 100%;
152
+ min-height: 88px;
153
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-3);
154
+ font-size: var(--tokis-font-size-sm);
155
+ font-family: inherit;
156
+ color: var(--tokis-text-primary);
157
+ background: var(--tokis-color-surface-raised);
158
+ border: 1px solid var(--tokis-color-border);
159
+ border-radius: var(--tokis-radius-md);
160
+ resize: vertical;
161
+ transition:
162
+ border-color var(--tokis-duration-fast) var(--tokis-ease-out),
163
+ box-shadow var(--tokis-duration-fast) var(--tokis-ease-out);
164
+ outline: none;
165
+ line-height: var(--tokis-line-height-normal);
166
+ appearance: none;
167
+ }
168
+ .tokis-textarea::placeholder { color: var(--tokis-text-tertiary); }
169
+
170
+ .tokis-textarea:hover:not(:disabled):not([aria-invalid="true"]):not(:focus) {
171
+ border-color: var(--tokis-color-border-strong);
172
+ }
173
+
174
+ .tokis-textarea:focus,
175
+ .tokis-textarea:focus-visible {
176
+ border-color: var(--tokis-color-primary);
177
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
178
+ }
179
+
180
+ .tokis-textarea[aria-invalid="true"] {
181
+ border-color: var(--tokis-color-error);
182
+ }
183
+ .tokis-textarea[aria-invalid="true"]:focus,
184
+ .tokis-textarea[aria-invalid="true"]:focus-visible {
185
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring-error);
186
+ }
187
+
188
+ .tokis-textarea:disabled {
189
+ background: var(--tokis-color-neutral-100);
190
+ color: var(--tokis-text-disabled);
191
+ cursor: not-allowed;
192
+ }
193
+
194
+ /* ── Reduced motion ─────────────────────────────────────────── */
195
+
196
+ @media (prefers-reduced-motion: reduce) {
197
+ .tokis-input,
198
+ .tokis-textarea {
199
+ transition: none;
200
+ }
201
+ }
@@ -0,0 +1,104 @@
1
+ /* ── NavigationRail ──────────────────────────────────────── */
2
+
3
+ .tokis-nav-rail {
4
+ display: flex;
5
+ flex-direction: column;
6
+ width: 72px;
7
+ background: var(--tokis-color-surface);
8
+ border-right: 1px solid var(--tokis-color-border);
9
+ height: 100%;
10
+ align-items: stretch;
11
+ }
12
+
13
+ .tokis-nav-rail__header {
14
+ padding: var(--tokis-spacing-4) var(--tokis-spacing-2) var(--tokis-spacing-2);
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: center;
18
+ border-bottom: 1px solid var(--tokis-color-border);
19
+ }
20
+
21
+ .tokis-nav-rail__items {
22
+ flex: 1;
23
+ display: flex;
24
+ flex-direction: column;
25
+ padding: var(--tokis-spacing-2) 0;
26
+ gap: var(--tokis-spacing-1);
27
+ overflow-y: auto;
28
+ }
29
+
30
+ .tokis-nav-rail__item {
31
+ display: flex;
32
+ flex-direction: column;
33
+ align-items: center;
34
+ gap: 3px;
35
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-1);
36
+ background: transparent;
37
+ border: none;
38
+ cursor: pointer;
39
+ color: var(--tokis-text-tertiary);
40
+ transition: color var(--tokis-duration-fast) var(--tokis-ease-out),
41
+ background var(--tokis-duration-fast) var(--tokis-ease-out);
42
+ font-family: var(--tokis-font-family);
43
+ border-radius: var(--tokis-radius-md);
44
+ margin: 0 var(--tokis-spacing-1);
45
+ }
46
+
47
+ .tokis-nav-rail__item:hover {
48
+ background: var(--tokis-color-surface-hover);
49
+ color: var(--tokis-text-secondary);
50
+ }
51
+
52
+ .tokis-nav-rail__item--active {
53
+ color: var(--tokis-color-primary);
54
+ background: var(--tokis-color-primary-subtle);
55
+ }
56
+
57
+ .tokis-nav-rail__item:focus-visible {
58
+ outline: none;
59
+ box-shadow: 0 0 0 2px var(--tokis-color-focus-ring);
60
+ }
61
+
62
+ .tokis-nav-rail__icon {
63
+ position: relative;
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ width: 24px;
68
+ height: 24px;
69
+ }
70
+
71
+ .tokis-nav-rail__badge {
72
+ position: absolute;
73
+ top: -4px;
74
+ right: -8px;
75
+ min-width: 16px;
76
+ height: 16px;
77
+ padding: 0 4px;
78
+ background: var(--tokis-color-error);
79
+ color: #fff;
80
+ font-size: 10px;
81
+ font-weight: var(--tokis-font-weight-bold);
82
+ border-radius: var(--tokis-radius-full);
83
+ display: flex;
84
+ align-items: center;
85
+ justify-content: center;
86
+ }
87
+
88
+ .tokis-nav-rail__label {
89
+ font-size: 10px;
90
+ font-weight: var(--tokis-font-weight-medium);
91
+ text-align: center;
92
+ }
93
+
94
+ .tokis-nav-rail__footer {
95
+ padding: var(--tokis-spacing-2);
96
+ border-top: 1px solid var(--tokis-color-border);
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ }
101
+
102
+ @media (prefers-reduced-motion: reduce) {
103
+ .tokis-nav-rail__item { transition: none; }
104
+ }
@@ -0,0 +1,273 @@
1
+ /* ============================================================
2
+ Tokis — Menu, Breadcrumbs, Pagination, Link, Typography
3
+ ============================================================ */
4
+
5
+ /* ── Menu ───────────────────────────────────────────────────── */
6
+
7
+ .tokis-menu-content {
8
+ background: var(--tokis-color-surface-overlay);
9
+ border: 1px solid var(--tokis-color-border);
10
+ border-radius: var(--tokis-radius-xl);
11
+ box-shadow: var(--tokis-shadow-xl);
12
+ padding: var(--tokis-spacing-1) 0;
13
+ min-width: 180px;
14
+ z-index: var(--tokis-z-dropdown);
15
+ animation: tokis-dropdown-in var(--tokis-duration-fast) var(--tokis-ease-out);
16
+ outline: none;
17
+ overflow: hidden;
18
+ }
19
+
20
+ .tokis-menu-item {
21
+ display: flex;
22
+ align-items: center;
23
+ gap: var(--tokis-spacing-2);
24
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-3);
25
+ font-size: var(--tokis-font-size-sm);
26
+ color: var(--tokis-text-primary);
27
+ cursor: pointer;
28
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out);
29
+ outline: none;
30
+ background: none;
31
+ border: none;
32
+ width: 100%;
33
+ text-align: left;
34
+ min-height: 36px;
35
+ -webkit-tap-highlight-color: transparent;
36
+ }
37
+ .tokis-menu-item:hover,
38
+ .tokis-menu-item[data-focused="true"] {
39
+ background: var(--tokis-color-surface-hover);
40
+ }
41
+ .tokis-menu-item:focus-visible {
42
+ background: var(--tokis-color-surface-hover);
43
+ outline: 2px solid var(--tokis-color-primary);
44
+ outline-offset: -2px;
45
+ }
46
+
47
+ .tokis-menu-item--destructive { color: var(--tokis-color-error); }
48
+ .tokis-menu-item--destructive:hover,
49
+ .tokis-menu-item--destructive[data-focused="true"] {
50
+ background: var(--tokis-color-error-subtle);
51
+ }
52
+
53
+ .tokis-menu-item[data-disabled="true"] {
54
+ opacity: 0.45;
55
+ cursor: not-allowed;
56
+ pointer-events: none;
57
+ }
58
+
59
+ .tokis-menu-item__icon {
60
+ flex-shrink: 0;
61
+ color: var(--tokis-text-tertiary);
62
+ width: 16px;
63
+ height: 16px;
64
+ display: inline-flex;
65
+ align-items: center;
66
+ justify-content: center;
67
+ }
68
+ .tokis-menu-item__label { flex: 1; }
69
+ .tokis-menu-item__shortcut {
70
+ font-size: var(--tokis-font-size-xs);
71
+ color: var(--tokis-text-tertiary);
72
+ margin-left: auto;
73
+ padding-left: var(--tokis-spacing-4);
74
+ font-variant-numeric: tabular-nums;
75
+ }
76
+ .tokis-menu-item__indicator {
77
+ flex-shrink: 0;
78
+ color: var(--tokis-color-primary);
79
+ width: 16px;
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ }
84
+
85
+ .tokis-menu-separator {
86
+ height: 1px;
87
+ background: var(--tokis-color-border);
88
+ margin: var(--tokis-spacing-1) 0;
89
+ }
90
+ .tokis-menu-group-label {
91
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-3) var(--tokis-spacing-1);
92
+ font-size: var(--tokis-font-size-xs);
93
+ font-weight: var(--tokis-font-weight-semibold);
94
+ color: var(--tokis-text-tertiary);
95
+ text-transform: uppercase;
96
+ letter-spacing: var(--tokis-letter-spacing-wide);
97
+ user-select: none;
98
+ }
99
+
100
+ @keyframes tokis-dropdown-in {
101
+ from { opacity: 0; transform: translateY(-6px) scale(0.97); }
102
+ to { opacity: 1; transform: translateY(0) scale(1); }
103
+ }
104
+
105
+ /* ── Breadcrumbs ────────────────────────────────────────────── */
106
+
107
+ .tokis-breadcrumbs {
108
+ display: flex;
109
+ align-items: center;
110
+ flex-wrap: wrap;
111
+ gap: 0;
112
+ list-style: none;
113
+ margin: 0;
114
+ padding: 0;
115
+ }
116
+ .tokis-breadcrumbs-item {
117
+ display: inline-flex;
118
+ align-items: center;
119
+ font-size: var(--tokis-font-size-sm);
120
+ color: var(--tokis-text-secondary);
121
+ }
122
+ .tokis-breadcrumbs-item--current {
123
+ color: var(--tokis-text-primary);
124
+ font-weight: var(--tokis-font-weight-medium);
125
+ }
126
+ .tokis-breadcrumbs-separator {
127
+ color: var(--tokis-text-tertiary);
128
+ margin: 0 var(--tokis-spacing-1);
129
+ font-size: var(--tokis-font-size-xs);
130
+ user-select: none;
131
+ }
132
+ .tokis-breadcrumbs-link {
133
+ color: inherit;
134
+ text-decoration: none;
135
+ cursor: pointer;
136
+ border-radius: var(--tokis-radius-xs);
137
+ outline: none;
138
+ transition: color var(--tokis-duration-fast) var(--tokis-ease-out);
139
+ padding: 0 1px;
140
+ }
141
+ .tokis-breadcrumbs-link:hover {
142
+ color: var(--tokis-text-primary);
143
+ text-decoration: underline;
144
+ text-underline-offset: 2px;
145
+ }
146
+ .tokis-breadcrumbs-link:focus-visible {
147
+ box-shadow: 0 0 0 2px var(--tokis-color-focus-ring);
148
+ color: var(--tokis-text-primary);
149
+ }
150
+
151
+ /* ── Pagination ─────────────────────────────────────────────── */
152
+
153
+ .tokis-pagination {
154
+ display: flex;
155
+ align-items: center;
156
+ gap: var(--tokis-spacing-1);
157
+ }
158
+
159
+ .tokis-pagination-item {
160
+ display: inline-flex;
161
+ align-items: center;
162
+ justify-content: center;
163
+ width: 36px;
164
+ height: 36px;
165
+ border-radius: var(--tokis-radius-md);
166
+ font-size: var(--tokis-font-size-sm);
167
+ font-weight: var(--tokis-font-weight-medium);
168
+ font-family: inherit;
169
+ color: var(--tokis-text-secondary);
170
+ cursor: pointer;
171
+ border: 1px solid transparent;
172
+ transition:
173
+ background var(--tokis-duration-fast) var(--tokis-ease-out),
174
+ color var(--tokis-duration-fast) var(--tokis-ease-out),
175
+ border-color var(--tokis-duration-fast) var(--tokis-ease-out);
176
+ background: none;
177
+ outline: none;
178
+ -webkit-tap-highlight-color: transparent;
179
+ font-variant-numeric: tabular-nums;
180
+ }
181
+ .tokis-pagination-item:hover {
182
+ background: var(--tokis-color-surface-hover);
183
+ color: var(--tokis-text-primary);
184
+ border-color: var(--tokis-color-border);
185
+ }
186
+ .tokis-pagination-item:focus-visible {
187
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
188
+ }
189
+ .tokis-pagination-item--active {
190
+ background: var(--tokis-color-primary);
191
+ color: var(--tokis-text-on-primary);
192
+ border-color: var(--tokis-color-primary);
193
+ }
194
+ .tokis-pagination-item--active:hover {
195
+ background: var(--tokis-color-primary-hover);
196
+ border-color: var(--tokis-color-primary-hover);
197
+ }
198
+ .tokis-pagination-item--disabled {
199
+ opacity: 0.4;
200
+ cursor: not-allowed;
201
+ pointer-events: none;
202
+ }
203
+
204
+ .tokis-pagination-ellipsis {
205
+ display: inline-flex;
206
+ align-items: center;
207
+ justify-content: center;
208
+ width: 36px;
209
+ height: 36px;
210
+ color: var(--tokis-text-tertiary);
211
+ user-select: none;
212
+ }
213
+
214
+ /* ── Link ───────────────────────────────────────────────────── */
215
+
216
+ .tokis-link {
217
+ color: var(--tokis-text-link);
218
+ text-decoration: underline;
219
+ text-decoration-color: transparent;
220
+ text-underline-offset: 3px;
221
+ cursor: pointer;
222
+ border-radius: var(--tokis-radius-xs);
223
+ outline: none;
224
+ transition:
225
+ text-decoration-color var(--tokis-duration-fast) var(--tokis-ease-out),
226
+ color var(--tokis-duration-fast) var(--tokis-ease-out);
227
+ }
228
+ .tokis-link:hover {
229
+ text-decoration-color: currentColor;
230
+ }
231
+ .tokis-link:focus-visible {
232
+ box-shadow: 0 0 0 2px var(--tokis-color-focus-ring);
233
+ text-decoration-color: currentColor;
234
+ }
235
+ .tokis-link--external::after {
236
+ content: ' ↗';
237
+ font-size: 0.8em;
238
+ opacity: 0.7;
239
+ }
240
+
241
+ /* ── Typography ─────────────────────────────────────────────── */
242
+
243
+ .tokis-text {
244
+ color: var(--tokis-text-primary);
245
+ line-height: var(--tokis-line-height-normal);
246
+ }
247
+ .tokis-text--secondary { color: var(--tokis-text-secondary); }
248
+ .tokis-text--tertiary { color: var(--tokis-text-tertiary); }
249
+ .tokis-text--error { color: var(--tokis-text-error); }
250
+ .tokis-text--success { color: var(--tokis-text-success); }
251
+ .tokis-text--warning { color: var(--tokis-text-warning); }
252
+ .tokis-text--truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; display: block; }
253
+ .tokis-text--balance { text-wrap: balance; }
254
+
255
+ .tokis-code {
256
+ font-family: var(--tokis-font-family-mono);
257
+ font-size: 0.875em;
258
+ background: var(--tokis-color-neutral-100);
259
+ color: var(--tokis-color-secondary);
260
+ padding: 1px 6px;
261
+ border-radius: var(--tokis-radius-sm);
262
+ border: 1px solid var(--tokis-color-border);
263
+ }
264
+
265
+ /* ── Reduced motion ─────────────────────────────────────────── */
266
+
267
+ @media (prefers-reduced-motion: reduce) {
268
+ .tokis-menu-content { animation: none; }
269
+ .tokis-menu-item { transition: none; }
270
+ .tokis-pagination-item { transition: none; }
271
+ .tokis-link { transition: none; }
272
+ .tokis-breadcrumbs-link { transition: none; }
273
+ }