@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,62 @@
1
+ /* ── CircularProgress ────────────────────────────────────── */
2
+
3
+ .tokis-circular-progress {
4
+ position: relative;
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ }
9
+
10
+ .tokis-circular-progress__track {
11
+ stroke: var(--tokis-color-border);
12
+ }
13
+
14
+ .tokis-circular-progress__fill {
15
+ stroke: var(--tokis-color-primary);
16
+ transition: stroke-dashoffset 0.5s var(--tokis-ease-out);
17
+ }
18
+
19
+ /* Variants */
20
+ .tokis-circular-progress--success .tokis-circular-progress__fill { stroke: var(--tokis-color-success); }
21
+ .tokis-circular-progress--warning .tokis-circular-progress__fill { stroke: var(--tokis-color-warning); }
22
+ .tokis-circular-progress--error .tokis-circular-progress__fill { stroke: var(--tokis-color-error); }
23
+
24
+ /* Indeterminate spin */
25
+ .tokis-circular-progress--indeterminate svg {
26
+ animation: tokis-cprogress-spin 1.4s linear infinite;
27
+ }
28
+
29
+ .tokis-circular-progress--indeterminate .tokis-circular-progress__fill {
30
+ transition: none;
31
+ animation: tokis-cprogress-dash 1.4s ease-in-out infinite;
32
+ }
33
+
34
+ @keyframes tokis-cprogress-spin {
35
+ from { transform: rotate(-90deg); }
36
+ to { transform: rotate(270deg); }
37
+ }
38
+
39
+ @keyframes tokis-cprogress-dash {
40
+ 0% { stroke-dashoffset: var(--tokis-cprogress-circumference, 220); }
41
+ 50% { stroke-dashoffset: calc(var(--tokis-cprogress-circumference, 220) * 0.25); }
42
+ 100% { stroke-dashoffset: var(--tokis-cprogress-circumference, 220); }
43
+ }
44
+
45
+ /* Label (center) */
46
+ .tokis-circular-progress__label {
47
+ position: absolute;
48
+ inset: 0;
49
+ display: flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ font-size: var(--tokis-font-size-xs);
53
+ font-weight: var(--tokis-font-weight-semibold);
54
+ color: var(--tokis-text-primary);
55
+ pointer-events: none;
56
+ }
57
+
58
+ @media (prefers-reduced-motion: reduce) {
59
+ .tokis-circular-progress--indeterminate svg { animation: none; }
60
+ .tokis-circular-progress--indeterminate .tokis-circular-progress__fill { animation: none; }
61
+ .tokis-circular-progress__fill { transition: none; }
62
+ }
@@ -0,0 +1,229 @@
1
+ /* ============================================================
2
+ Tokis — CodeBlock Component
3
+ Syntax-highlighted code display with copy button
4
+ ============================================================ */
5
+
6
+ .tokis-codeblock {
7
+ position: relative;
8
+ border-radius: var(--tokis-radius-lg);
9
+ border: 1px solid #2d333b;
10
+ background: #161b22;
11
+ overflow: hidden;
12
+ font-family: var(--tokis-font-family-mono);
13
+ font-size: var(--tokis-font-size-sm);
14
+ line-height: 1;
15
+ }
16
+
17
+ [data-theme='dark'] .tokis-codeblock {
18
+ background: #0d1117;
19
+ border-color: #30363d;
20
+ }
21
+
22
+ /* ── Header ─────────────────────────────────────────── */
23
+ .tokis-codeblock__header {
24
+ display: flex;
25
+ align-items: center;
26
+ justify-content: space-between;
27
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-4);
28
+ border-bottom: 1px solid #2d333b;
29
+ background: #1c2128;
30
+ min-height: 40px;
31
+ }
32
+
33
+ [data-theme='dark'] .tokis-codeblock__header {
34
+ background: #161b22;
35
+ border-color: #30363d;
36
+ }
37
+
38
+ .tokis-codeblock__lang {
39
+ font-size: var(--tokis-font-size-xs);
40
+ color: var(--tokis-text-tertiary);
41
+ text-transform: lowercase;
42
+ letter-spacing: var(--tokis-letter-spacing-wide);
43
+ font-family: var(--tokis-font-family-mono);
44
+ font-weight: var(--tokis-font-weight-medium);
45
+ }
46
+
47
+ [data-theme='dark'] .tokis-codeblock__lang {
48
+ color: #8b949e;
49
+ }
50
+
51
+ /* ── Copy Button ─────────────────────────────────────── */
52
+ .tokis-codeblock__copy {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: var(--tokis-spacing-1);
56
+ padding: 3px var(--tokis-spacing-2);
57
+ border: 1px solid var(--tokis-color-border);
58
+ border-radius: var(--tokis-radius-sm);
59
+ background: transparent;
60
+ color: var(--tokis-text-tertiary);
61
+ font-size: var(--tokis-font-size-xs);
62
+ cursor: pointer;
63
+ transition: all var(--tokis-duration-fast) var(--tokis-ease-out);
64
+ font-family: var(--tokis-font-family);
65
+ line-height: 1.5;
66
+ }
67
+
68
+ .tokis-codeblock__copy:hover {
69
+ background: var(--tokis-color-surface-raised);
70
+ color: var(--tokis-text-primary);
71
+ border-color: var(--tokis-color-border-strong);
72
+ }
73
+
74
+ .tokis-codeblock__copy--copied {
75
+ color: var(--tokis-color-success);
76
+ border-color: var(--tokis-color-success);
77
+ }
78
+
79
+ [data-theme='dark'] .tokis-codeblock__copy {
80
+ border-color: #30363d;
81
+ color: #8b949e;
82
+ }
83
+
84
+ [data-theme='dark'] .tokis-codeblock__copy:hover {
85
+ background: #21262d;
86
+ color: #c9d1d9;
87
+ border-color: #6e7681;
88
+ }
89
+
90
+ [data-theme='dark'] .tokis-codeblock__copy--copied {
91
+ color: var(--tokis-color-success);
92
+ border-color: var(--tokis-color-success);
93
+ }
94
+
95
+ /* ── Body ─────────────────────────────────────────────── */
96
+ .tokis-codeblock__body {
97
+ display: flex;
98
+ overflow: auto;
99
+ -webkit-overflow-scrolling: touch;
100
+ max-height: 600px;
101
+ }
102
+
103
+ /* ── Line Numbers ──────────────────────────────────────── */
104
+ .tokis-codeblock__lines {
105
+ display: flex;
106
+ flex-direction: column;
107
+ padding: var(--tokis-spacing-4) var(--tokis-spacing-3);
108
+ color: var(--tokis-text-tertiary);
109
+ font-size: var(--tokis-font-size-sm);
110
+ line-height: 1.6;
111
+ border-right: 1px solid var(--tokis-color-border);
112
+ min-width: 2.5rem;
113
+ text-align: right;
114
+ user-select: none;
115
+ flex-shrink: 0;
116
+ }
117
+
118
+ .tokis-codeblock__line-num {
119
+ display: block;
120
+ line-height: 1.6;
121
+ }
122
+
123
+ [data-theme='dark'] .tokis-codeblock__lines {
124
+ border-right-color: #30363d;
125
+ color: #6e7681;
126
+ }
127
+
128
+ /* ── Pre / Code ─────────────────────────────────────────── */
129
+ .tokis-codeblock__pre {
130
+ margin: 0;
131
+ padding: var(--tokis-spacing-4);
132
+ overflow: visible;
133
+ flex: 1;
134
+ min-width: 0;
135
+ background: transparent;
136
+ }
137
+
138
+ .tokis-codeblock__code {
139
+ display: block;
140
+ color: #e6edf3;
141
+ line-height: 1.6;
142
+ font-size: var(--tokis-font-size-sm);
143
+ tab-size: 2;
144
+ white-space: pre;
145
+ font-family: var(--tokis-font-family-mono);
146
+ }
147
+
148
+ [data-theme='dark'] .tokis-codeblock__code {
149
+ color: #c9d1d9;
150
+ }
151
+
152
+ /* ── Explicit theme overrides (data-codeblock-theme) ──── */
153
+
154
+ /* Force dark GitHub style */
155
+ [data-codeblock-theme='dark'].tokis-codeblock,
156
+ [data-codeblock-theme='dark'] .tokis-codeblock {
157
+ background: #161b22;
158
+ border-color: #2d333b;
159
+ }
160
+
161
+ [data-codeblock-theme='dark'] .tokis-codeblock__header {
162
+ background: #1c2128;
163
+ border-color: #2d333b;
164
+ }
165
+
166
+ [data-codeblock-theme='dark'] .tokis-codeblock__code {
167
+ color: #e6edf3;
168
+ }
169
+
170
+ [data-codeblock-theme='dark'] .tokis-codeblock__copy {
171
+ border-color: #30363d;
172
+ color: #8b949e;
173
+ }
174
+
175
+ [data-codeblock-theme='dark'] .tokis-codeblock__copy:hover {
176
+ background: #21262d;
177
+ color: #c9d1d9;
178
+ border-color: #6e7681;
179
+ }
180
+
181
+ [data-codeblock-theme='dark'] .tokis-codeblock__lines {
182
+ border-color: #30363d;
183
+ color: #6e7681;
184
+ }
185
+
186
+ /* Force light GitHub style */
187
+ [data-codeblock-theme='light'].tokis-codeblock {
188
+ background: #f6f8fa;
189
+ border-color: #d0d7de;
190
+ }
191
+
192
+ [data-codeblock-theme='light'] .tokis-codeblock__header {
193
+ background: #ffffff;
194
+ border-color: #d0d7de;
195
+ }
196
+
197
+ [data-codeblock-theme='light'] .tokis-codeblock__code {
198
+ color: #24292f;
199
+ }
200
+
201
+ [data-codeblock-theme='light'] .tokis-codeblock__copy {
202
+ border-color: #d0d7de;
203
+ color: #57606a;
204
+ }
205
+
206
+ [data-codeblock-theme='light'] .tokis-codeblock__copy:hover {
207
+ background: #eaeef2;
208
+ color: #24292f;
209
+ border-color: #8c959f;
210
+ }
211
+
212
+ [data-codeblock-theme='light'] .tokis-codeblock__lines {
213
+ border-color: #d0d7de;
214
+ color: #8c959f;
215
+ }
216
+
217
+ /* Syntax token colors for light theme — applied via hljs or manual spans */
218
+ [data-codeblock-theme='light'] .hljs-keyword,
219
+ [data-codeblock-theme='light'] .hljs-selector-tag { color: #cf222e; }
220
+ [data-codeblock-theme='light'] .hljs-string,
221
+ [data-codeblock-theme='light'] .hljs-attr { color: #0a3069; }
222
+ [data-codeblock-theme='light'] .hljs-comment { color: #6e7781; font-style: italic; }
223
+ [data-codeblock-theme='light'] .hljs-type,
224
+ [data-codeblock-theme='light'] .hljs-built_in { color: #953800; }
225
+ [data-codeblock-theme='light'] .hljs-number,
226
+ [data-codeblock-theme='light'] .hljs-literal { color: #0550ae; }
227
+ [data-codeblock-theme='light'] .hljs-title,
228
+ [data-codeblock-theme='light'] .hljs-function .hljs-title { color: #8250df; }
229
+ [data-codeblock-theme='light'] .hljs-tag { color: #116329; }
@@ -0,0 +1,183 @@
1
+ /* ── CommandPalette ──────────────────────────────────────── */
2
+
3
+ .tokis-command-palette-backdrop {
4
+ position: fixed;
5
+ inset: 0;
6
+ background: rgba(0, 0, 0, 0.5);
7
+ z-index: calc(var(--tokis-z-modal) - 1);
8
+ animation: tokis-cp-backdrop-in var(--tokis-duration-fast) var(--tokis-ease-out);
9
+ }
10
+
11
+ @keyframes tokis-cp-backdrop-in {
12
+ from { opacity: 0; }
13
+ to { opacity: 1; }
14
+ }
15
+
16
+ .tokis-command-palette {
17
+ position: fixed;
18
+ top: 20vh;
19
+ left: 50%;
20
+ transform: translateX(-50%);
21
+ z-index: var(--tokis-z-modal);
22
+ width: min(560px, calc(100vw - var(--tokis-spacing-8)));
23
+ background: var(--tokis-color-surface-overlay);
24
+ border: 1px solid var(--tokis-color-border);
25
+ border-radius: var(--tokis-radius-2xl);
26
+ box-shadow: var(--tokis-shadow-xl), 0 0 0 1px rgba(0,0,0,0.04);
27
+ overflow: hidden;
28
+ animation: tokis-cp-in var(--tokis-duration-fast) var(--tokis-ease-spring);
29
+ }
30
+
31
+ @keyframes tokis-cp-in {
32
+ from { opacity: 0; transform: translateX(-50%) translateY(-8px) scale(0.97); }
33
+ to { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); }
34
+ }
35
+
36
+ /* Search */
37
+ .tokis-command-palette__search {
38
+ display: flex;
39
+ align-items: center;
40
+ gap: var(--tokis-spacing-3);
41
+ padding: var(--tokis-spacing-4) var(--tokis-spacing-4);
42
+ border-bottom: 1px solid var(--tokis-color-border);
43
+ }
44
+
45
+ .tokis-command-palette__search-icon {
46
+ flex-shrink: 0;
47
+ color: var(--tokis-text-tertiary);
48
+ display: flex;
49
+ align-items: center;
50
+ }
51
+
52
+ .tokis-command-palette__input {
53
+ flex: 1;
54
+ border: none;
55
+ background: transparent;
56
+ font-size: var(--tokis-font-size-base);
57
+ color: var(--tokis-text-primary);
58
+ font-family: var(--tokis-font-family);
59
+ outline: none;
60
+ }
61
+
62
+ .tokis-command-palette__input::placeholder {
63
+ color: var(--tokis-text-tertiary);
64
+ }
65
+
66
+ /* List */
67
+ .tokis-command-palette__list {
68
+ max-height: 380px;
69
+ overflow-y: auto;
70
+ padding: var(--tokis-spacing-2) 0;
71
+ scrollbar-width: thin;
72
+ scrollbar-color: var(--tokis-color-border) transparent;
73
+ }
74
+
75
+ .tokis-command-palette__empty {
76
+ padding: var(--tokis-spacing-6) var(--tokis-spacing-4);
77
+ text-align: center;
78
+ color: var(--tokis-text-tertiary);
79
+ font-size: var(--tokis-font-size-sm);
80
+ }
81
+
82
+ .tokis-command-palette__group {
83
+ padding: 0;
84
+ }
85
+
86
+ .tokis-command-palette__group-label {
87
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-4) var(--tokis-spacing-1);
88
+ font-size: 11px;
89
+ font-weight: var(--tokis-font-weight-semibold);
90
+ text-transform: uppercase;
91
+ letter-spacing: 0.06em;
92
+ color: var(--tokis-text-tertiary);
93
+ }
94
+
95
+ .tokis-command-palette__item {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: var(--tokis-spacing-3);
99
+ width: 100%;
100
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-4);
101
+ background: transparent;
102
+ border: none;
103
+ cursor: pointer;
104
+ text-align: left;
105
+ font-family: var(--tokis-font-family);
106
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out);
107
+ }
108
+
109
+ .tokis-command-palette__item:hover,
110
+ .tokis-command-palette__item--active {
111
+ background: var(--tokis-color-primary-subtle);
112
+ }
113
+
114
+ .tokis-command-palette__item:focus-visible {
115
+ outline: none;
116
+ background: var(--tokis-color-primary-subtle);
117
+ }
118
+
119
+ .tokis-command-palette__item-icon {
120
+ flex-shrink: 0;
121
+ width: 28px;
122
+ height: 28px;
123
+ display: flex;
124
+ align-items: center;
125
+ justify-content: center;
126
+ border-radius: var(--tokis-radius-md);
127
+ background: var(--tokis-color-surface);
128
+ color: var(--tokis-text-secondary);
129
+ }
130
+
131
+ .tokis-command-palette__item-content {
132
+ flex: 1;
133
+ min-width: 0;
134
+ display: flex;
135
+ flex-direction: column;
136
+ gap: 1px;
137
+ }
138
+
139
+ .tokis-command-palette__item-label {
140
+ font-size: var(--tokis-font-size-sm);
141
+ font-weight: var(--tokis-font-weight-medium);
142
+ color: var(--tokis-text-primary);
143
+ white-space: nowrap;
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
146
+ }
147
+
148
+ .tokis-command-palette__item-desc {
149
+ font-size: var(--tokis-font-size-xs);
150
+ color: var(--tokis-text-tertiary);
151
+ white-space: nowrap;
152
+ overflow: hidden;
153
+ text-overflow: ellipsis;
154
+ }
155
+
156
+ .tokis-command-palette__shortcut {
157
+ flex-shrink: 0;
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 2px;
161
+ }
162
+
163
+ .tokis-command-palette__kbd {
164
+ display: inline-flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ min-width: 20px;
168
+ height: 20px;
169
+ padding: 0 4px;
170
+ border: 1px solid var(--tokis-color-border);
171
+ border-radius: var(--tokis-radius-sm);
172
+ background: var(--tokis-color-surface);
173
+ font-size: 11px;
174
+ font-family: var(--tokis-font-family-mono);
175
+ color: var(--tokis-text-tertiary);
176
+ line-height: 1;
177
+ }
178
+
179
+ @media (prefers-reduced-motion: reduce) {
180
+ .tokis-command-palette-backdrop,
181
+ .tokis-command-palette { animation: none; }
182
+ .tokis-command-palette__item { transition: none; }
183
+ }
@@ -0,0 +1,95 @@
1
+ /* ── ConfirmDialog ───────────────────────────────────────── */
2
+
3
+ .tokis-confirm-dialog__actions {
4
+ display: flex;
5
+ justify-content: flex-end;
6
+ gap: var(--tokis-spacing-3);
7
+ flex-wrap: wrap;
8
+ }
9
+
10
+ .tokis-confirm-dialog__cancel {
11
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-4);
12
+ border: 1px solid var(--tokis-color-border);
13
+ border-radius: var(--tokis-radius-md);
14
+ background: var(--tokis-color-surface);
15
+ color: var(--tokis-text-secondary);
16
+ font-size: var(--tokis-font-size-sm);
17
+ font-weight: var(--tokis-font-weight-medium);
18
+ font-family: var(--tokis-font-family);
19
+ cursor: pointer;
20
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out),
21
+ color var(--tokis-duration-fast) var(--tokis-ease-out);
22
+ }
23
+
24
+ .tokis-confirm-dialog__cancel:hover {
25
+ background: var(--tokis-color-surface-hover);
26
+ color: var(--tokis-text-primary);
27
+ }
28
+
29
+ .tokis-confirm-dialog__cancel:focus-visible {
30
+ outline: none;
31
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
32
+ }
33
+
34
+ .tokis-confirm-dialog__cancel:disabled {
35
+ opacity: 0.5;
36
+ cursor: not-allowed;
37
+ }
38
+
39
+ .tokis-confirm-dialog__confirm {
40
+ display: inline-flex;
41
+ align-items: center;
42
+ gap: var(--tokis-spacing-2);
43
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-4);
44
+ border: none;
45
+ border-radius: var(--tokis-radius-md);
46
+ background: var(--tokis-color-primary);
47
+ color: var(--tokis-text-on-primary);
48
+ font-size: var(--tokis-font-size-sm);
49
+ font-weight: var(--tokis-font-weight-semibold);
50
+ font-family: var(--tokis-font-family);
51
+ cursor: pointer;
52
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out);
53
+ }
54
+
55
+ .tokis-confirm-dialog__confirm:hover {
56
+ background: var(--tokis-color-primary-hover, color-mix(in srgb, var(--tokis-color-primary) 85%, #000));
57
+ }
58
+
59
+ .tokis-confirm-dialog__confirm:focus-visible {
60
+ outline: none;
61
+ box-shadow: 0 0 0 3px var(--tokis-color-focus-ring);
62
+ }
63
+
64
+ .tokis-confirm-dialog__confirm:disabled {
65
+ opacity: 0.6;
66
+ cursor: not-allowed;
67
+ }
68
+
69
+ .tokis-confirm-dialog__confirm--destructive {
70
+ background: var(--tokis-color-error);
71
+ }
72
+
73
+ .tokis-confirm-dialog__confirm--destructive:hover {
74
+ background: color-mix(in srgb, var(--tokis-color-error) 85%, #000);
75
+ }
76
+
77
+ .tokis-confirm-dialog__spinner {
78
+ display: inline-block;
79
+ width: 14px;
80
+ height: 14px;
81
+ border: 2px solid rgba(255, 255, 255, 0.4);
82
+ border-top-color: #fff;
83
+ border-radius: 50%;
84
+ animation: tokis-confirm-spin 0.6s linear infinite;
85
+ }
86
+
87
+ @keyframes tokis-confirm-spin {
88
+ to { transform: rotate(360deg); }
89
+ }
90
+
91
+ @media (prefers-reduced-motion: reduce) {
92
+ .tokis-confirm-dialog__spinner { animation: none; }
93
+ .tokis-confirm-dialog__cancel,
94
+ .tokis-confirm-dialog__confirm { transition: none; }
95
+ }
@@ -0,0 +1,82 @@
1
+ /* ── ContextMenu ─────────────────────────────────────────── */
2
+
3
+ .tokis-context-menu {
4
+ z-index: var(--tokis-z-dropdown);
5
+ background: var(--tokis-color-surface-overlay);
6
+ border: 1px solid var(--tokis-color-border);
7
+ border-radius: var(--tokis-radius-lg);
8
+ box-shadow: var(--tokis-shadow-xl);
9
+ padding: var(--tokis-spacing-1);
10
+ min-width: 180px;
11
+ max-width: 280px;
12
+ animation: tokis-context-menu-in var(--tokis-duration-fast) var(--tokis-ease-out);
13
+ outline: none;
14
+ }
15
+
16
+ @keyframes tokis-context-menu-in {
17
+ from { opacity: 0; transform: scale(0.95); }
18
+ to { opacity: 1; transform: scale(1); }
19
+ }
20
+
21
+ .tokis-context-menu__item {
22
+ display: flex;
23
+ align-items: center;
24
+ gap: var(--tokis-spacing-2);
25
+ width: 100%;
26
+ padding: var(--tokis-spacing-2) var(--tokis-spacing-3);
27
+ background: transparent;
28
+ border: none;
29
+ border-radius: var(--tokis-radius-md);
30
+ font-size: var(--tokis-font-size-sm);
31
+ font-family: var(--tokis-font-family);
32
+ color: var(--tokis-text-primary);
33
+ cursor: pointer;
34
+ text-align: left;
35
+ transition: background var(--tokis-duration-fast) var(--tokis-ease-out);
36
+ }
37
+
38
+ .tokis-context-menu__item:hover {
39
+ background: var(--tokis-color-surface-hover);
40
+ }
41
+
42
+ .tokis-context-menu__item:focus-visible {
43
+ outline: none;
44
+ background: var(--tokis-color-surface-hover);
45
+ box-shadow: inset 0 0 0 2px var(--tokis-color-focus-ring);
46
+ }
47
+
48
+ .tokis-context-menu__item--destructive {
49
+ color: var(--tokis-color-error);
50
+ }
51
+
52
+ .tokis-context-menu__item--disabled {
53
+ opacity: 0.4;
54
+ cursor: not-allowed;
55
+ }
56
+
57
+ .tokis-context-menu__icon {
58
+ flex-shrink: 0;
59
+ color: var(--tokis-text-tertiary);
60
+ display: flex;
61
+ align-items: center;
62
+ }
63
+
64
+ .tokis-context-menu__separator {
65
+ height: 1px;
66
+ background: var(--tokis-color-border);
67
+ margin: var(--tokis-spacing-1) 0;
68
+ }
69
+
70
+ .tokis-context-menu__label {
71
+ padding: var(--tokis-spacing-1) var(--tokis-spacing-3);
72
+ font-size: 11px;
73
+ font-weight: var(--tokis-font-weight-semibold);
74
+ text-transform: uppercase;
75
+ letter-spacing: 0.06em;
76
+ color: var(--tokis-text-tertiary);
77
+ }
78
+
79
+ @media (prefers-reduced-motion: reduce) {
80
+ .tokis-context-menu { animation: none; }
81
+ .tokis-context-menu__item { transition: none; }
82
+ }