@ktfth/stickjs 3.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.
@@ -0,0 +1,825 @@
1
+ /*!
2
+ * Stick UI — design tokens + component styles
3
+ * https://github.com/kaiquekandykoga/Stickjs
4
+ *
5
+ * This file is OPTIONAL. Without it, data-stick behavior works identically.
6
+ * Import for styled components. Customize by overriding --stk-* variables on :root.
7
+ * Target: < 5KB gzipped.
8
+ */
9
+
10
+ /* ── Tokens ─────────────────────────────────────────── */
11
+ :root {
12
+ /* Colors */
13
+ --stk-bg: #ffffff;
14
+ --stk-fg: #09090b;
15
+ --stk-muted: #71717a;
16
+ --stk-muted-fg: #f4f4f5;
17
+ --stk-border: #e4e4e7;
18
+ --stk-ring: #18181b;
19
+ --stk-primary: #18181b;
20
+ --stk-primary-fg: #fafafa;
21
+ --stk-destructive: #ef4444;
22
+ --stk-destructive-fg: #fafafa;
23
+ --stk-success: #22c55e;
24
+ --stk-success-fg: #fafafa;
25
+ --stk-warning: #f59e0b;
26
+ --stk-warning-fg: #09090b;
27
+
28
+ /* Radius */
29
+ --stk-radius-sm: 4px;
30
+ --stk-radius-md: 8px;
31
+ --stk-radius-lg: 12px;
32
+ --stk-radius-full: 9999px;
33
+
34
+ /* Spacing */
35
+ --stk-space-1: 4px;
36
+ --stk-space-2: 8px;
37
+ --stk-space-3: 12px;
38
+ --stk-space-4: 16px;
39
+ --stk-space-5: 20px;
40
+ --stk-space-6: 24px;
41
+ --stk-space-8: 32px;
42
+
43
+ /* Typography */
44
+ --stk-font: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
45
+ --stk-font-mono: ui-monospace, 'Cascadia Code', 'Fira Code', monospace;
46
+ --stk-text-xs: 0.75rem;
47
+ --stk-text-sm: 0.875rem;
48
+ --stk-text-base: 1rem;
49
+ --stk-text-lg: 1.125rem;
50
+ --stk-leading: 1.5;
51
+
52
+ /* Transitions */
53
+ --stk-duration: 150ms;
54
+ --stk-duration-slow: 300ms;
55
+ --stk-easing: cubic-bezier(0.4, 0, 0.2, 1);
56
+
57
+ /* Shadows */
58
+ --stk-shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
59
+ --stk-shadow-md: 0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1);
60
+ --stk-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1);
61
+
62
+ /* Z-index scale */
63
+ --stk-z-dropdown: 50;
64
+ --stk-z-sticky: 100;
65
+ --stk-z-modal: 200;
66
+ --stk-z-toast: 300;
67
+ --stk-z-tooltip: 400;
68
+ }
69
+
70
+ /* ── Dark mode ──────────────────────────────────────── */
71
+ @media (prefers-color-scheme: dark) {
72
+ :root:not([data-theme="light"]) {
73
+ --stk-bg: #09090b;
74
+ --stk-fg: #fafafa;
75
+ --stk-muted: #a1a1aa;
76
+ --stk-muted-fg: #27272a;
77
+ --stk-border: #27272a;
78
+ --stk-ring: #d4d4d8;
79
+ --stk-primary: #fafafa;
80
+ --stk-primary-fg: #18181b;
81
+ --stk-shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
82
+ --stk-shadow-md: 0 4px 6px -1px rgba(0,0,0,0.4);
83
+ --stk-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.5);
84
+ }
85
+ }
86
+ [data-theme="dark"] {
87
+ --stk-bg: #09090b;
88
+ --stk-fg: #fafafa;
89
+ --stk-muted: #a1a1aa;
90
+ --stk-muted-fg: #27272a;
91
+ --stk-border: #27272a;
92
+ --stk-ring: #d4d4d8;
93
+ --stk-primary: #fafafa;
94
+ --stk-primary-fg: #18181b;
95
+ --stk-shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
96
+ --stk-shadow-md: 0 4px 6px -1px rgba(0,0,0,0.4);
97
+ --stk-shadow-lg: 0 10px 15px -3px rgba(0,0,0,0.5);
98
+ }
99
+
100
+ /* ── Transition classes (used by data-stick-transition) ── */
101
+ .fade-enter-active {
102
+ animation: stk-fade-in var(--stk-duration) var(--stk-easing);
103
+ }
104
+ .fade-leave-active {
105
+ animation: stk-fade-out var(--stk-duration) var(--stk-easing);
106
+ }
107
+ @keyframes stk-fade-in {
108
+ from { opacity: 0; }
109
+ to { opacity: 1; }
110
+ }
111
+ @keyframes stk-fade-out {
112
+ from { opacity: 1; }
113
+ to { opacity: 0; }
114
+ }
115
+
116
+ .slide-enter-active {
117
+ animation: stk-slide-in var(--stk-duration) var(--stk-easing);
118
+ }
119
+ .slide-leave-active {
120
+ animation: stk-slide-out var(--stk-duration) var(--stk-easing);
121
+ }
122
+ @keyframes stk-slide-in {
123
+ from { opacity: 0; transform: translateY(-4px); }
124
+ to { opacity: 1; transform: translateY(0); }
125
+ }
126
+ @keyframes stk-slide-out {
127
+ from { opacity: 1; transform: translateY(0); }
128
+ to { opacity: 0; transform: translateY(-4px); }
129
+ }
130
+
131
+ /* ── Base component reset ───────────────────────────── */
132
+ [class^="stk-"],
133
+ [class*=" stk-"] {
134
+ box-sizing: border-box;
135
+ font-family: var(--stk-font);
136
+ line-height: var(--stk-leading);
137
+ }
138
+
139
+ /* ── Button base ────────────────────────────────────── */
140
+ .stk-btn {
141
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--stk-space-2);
142
+ padding: var(--stk-space-2) var(--stk-space-4);
143
+ border-radius: var(--stk-radius-md); font-size: var(--stk-text-sm); font-weight: 500;
144
+ cursor: pointer; transition: all var(--stk-duration) var(--stk-easing);
145
+ border: 1px solid var(--stk-border); background: var(--stk-bg); color: var(--stk-fg);
146
+ text-decoration: none;
147
+ }
148
+ .stk-btn:hover { background: var(--stk-muted-fg); }
149
+ .stk-btn:focus-visible { outline: 2px solid var(--stk-ring); outline-offset: 2px; }
150
+ .stk-btn-primary { background: var(--stk-primary); color: var(--stk-primary-fg); border-color: var(--stk-primary); }
151
+ .stk-btn-primary:hover { background: var(--stk-primary); opacity: 0.9; }
152
+ .stk-btn-destructive { background: var(--stk-destructive); color: var(--stk-destructive-fg); border-color: var(--stk-destructive); }
153
+ .stk-btn-destructive:hover { background: var(--stk-destructive); opacity: 0.9; }
154
+ .stk-btn-ghost { background: transparent; border-color: transparent; }
155
+ .stk-btn-ghost:hover { background: var(--stk-muted-fg); }
156
+ .stk-btn-sm { padding: var(--stk-space-1) var(--stk-space-2); font-size: var(--stk-text-xs); }
157
+ .stk-btn-lg { padding: var(--stk-space-3) var(--stk-space-6); font-size: var(--stk-text-base); }
158
+
159
+ /* ── Accordion ──────────────────────────────────────── */
160
+ .stk-accordion { display: flex; flex-direction: column; }
161
+ .stk-accordion-item { border-bottom: 1px solid var(--stk-border); }
162
+ .stk-accordion-trigger {
163
+ display: flex; align-items: center; justify-content: space-between;
164
+ width: 100%; padding: var(--stk-space-4); background: none; border: none;
165
+ font-size: var(--stk-text-base); font-weight: 500; color: var(--stk-fg);
166
+ cursor: pointer; text-align: left;
167
+ transition: background var(--stk-duration) var(--stk-easing);
168
+ }
169
+ .stk-accordion-trigger:hover { background: var(--stk-muted-fg); }
170
+ .stk-accordion-trigger:focus-visible { outline: 2px solid var(--stk-ring); outline-offset: -2px; }
171
+ .stk-accordion-trigger::after {
172
+ content: ''; width: 10px; height: 10px; flex-shrink: 0;
173
+ border-right: 2px solid var(--stk-muted); border-bottom: 2px solid var(--stk-muted);
174
+ transform: rotate(45deg); transition: transform var(--stk-duration) var(--stk-easing);
175
+ margin-right: var(--stk-space-1);
176
+ }
177
+ .stk-accordion-trigger[aria-expanded="true"]::after { transform: rotate(-135deg); }
178
+ .stk-accordion-content { padding: 0 var(--stk-space-4) var(--stk-space-4); color: var(--stk-muted); font-size: var(--stk-text-sm); }
179
+
180
+ /* ── Tabs ───────────────────────────────────────────── */
181
+ .stk-tabs { display: flex; flex-direction: column; }
182
+ .stk-tab-list { display: flex; gap: 0; border-bottom: 1px solid var(--stk-border); }
183
+ .stk-tab {
184
+ padding: var(--stk-space-2) var(--stk-space-4); background: none; border: none;
185
+ border-bottom: 2px solid transparent; margin-bottom: -1px;
186
+ font-size: var(--stk-text-sm); font-weight: 500; color: var(--stk-muted);
187
+ cursor: pointer; transition: all var(--stk-duration) var(--stk-easing);
188
+ }
189
+ .stk-tab:hover { color: var(--stk-fg); }
190
+ .stk-tab:focus-visible { outline: 2px solid var(--stk-ring); outline-offset: -2px; }
191
+ .stk-tab[aria-selected="true"] { color: var(--stk-fg); border-bottom-color: var(--stk-primary); }
192
+ .stk-tab-panel { padding: var(--stk-space-4) 0; font-size: var(--stk-text-sm); color: var(--stk-fg); }
193
+
194
+ /* ── Toggle / Switch ────────────────────────────────── */
195
+ .stk-toggle {
196
+ display: inline-flex; align-items: center; gap: var(--stk-space-2);
197
+ cursor: pointer; user-select: none; background: none; border: none;
198
+ padding: var(--stk-space-1); color: var(--stk-fg);
199
+ }
200
+ .stk-toggle:focus-visible { outline: 2px solid var(--stk-ring); outline-offset: 2px; border-radius: var(--stk-radius-full); }
201
+ .stk-toggle-track {
202
+ width: 36px; height: 20px; border-radius: var(--stk-radius-full);
203
+ background: var(--stk-border); transition: background var(--stk-duration) var(--stk-easing);
204
+ position: relative; flex-shrink: 0;
205
+ }
206
+ .stk-toggle-track::after {
207
+ content: ''; position: absolute; top: 2px; left: 2px;
208
+ width: 16px; height: 16px; border-radius: 50%;
209
+ background: var(--stk-bg); box-shadow: var(--stk-shadow-sm);
210
+ transition: transform var(--stk-duration) var(--stk-easing);
211
+ }
212
+ .stk-toggle[aria-checked="true"] .stk-toggle-track { background: var(--stk-primary); }
213
+ .stk-toggle[aria-checked="true"] .stk-toggle-track::after { transform: translateX(16px); }
214
+ .stk-toggle-label { font-size: var(--stk-text-sm); }
215
+
216
+ /* ── Notification Banner ────────────────────────────── */
217
+ .stk-notification {
218
+ display: flex; align-items: center; gap: var(--stk-space-3);
219
+ padding: var(--stk-space-3) var(--stk-space-4);
220
+ border-radius: var(--stk-radius-md); font-size: var(--stk-text-sm);
221
+ border: 1px solid var(--stk-border); background: var(--stk-bg); color: var(--stk-fg);
222
+ }
223
+ .stk-notification-info { border-left: 3px solid var(--stk-primary); }
224
+ .stk-notification-success { border-left: 3px solid var(--stk-success); }
225
+ .stk-notification-warning { border-left: 3px solid var(--stk-warning); }
226
+ .stk-notification-error { border-left: 3px solid var(--stk-destructive); }
227
+ .stk-notification-content { flex: 1; }
228
+ .stk-notification-dismiss {
229
+ background: none; border: none; padding: var(--stk-space-1); cursor: pointer;
230
+ color: var(--stk-muted); font-size: var(--stk-text-lg); line-height: 1;
231
+ transition: color var(--stk-duration) var(--stk-easing);
232
+ }
233
+ .stk-notification-dismiss:hover { color: var(--stk-fg); }
234
+ .stk-notification[hidden] { display: none; }
235
+
236
+ /* ── Loading Skeleton ───────────────────────────────── */
237
+ .stk-skeleton {
238
+ background: linear-gradient(90deg, var(--stk-muted-fg) 25%, var(--stk-border) 50%, var(--stk-muted-fg) 75%);
239
+ background-size: 200% 100%;
240
+ animation: stk-shimmer 1.5s infinite;
241
+ border-radius: var(--stk-radius-md);
242
+ }
243
+ .stk-skeleton-text { height: 1em; margin: var(--stk-space-2) 0; }
244
+ .stk-skeleton-heading { height: 1.5em; width: 60%; margin: var(--stk-space-2) 0; }
245
+ .stk-skeleton-avatar { width: 40px; height: 40px; border-radius: var(--stk-radius-full); }
246
+ .stk-skeleton-card { height: 120px; }
247
+ @keyframes stk-shimmer {
248
+ 0% { background-position: 200% 0; }
249
+ 100% { background-position: -200% 0; }
250
+ }
251
+
252
+ /* ── Toast ──────────────────────────────────────────── */
253
+ .stk-toast-zone {
254
+ position: fixed; bottom: var(--stk-space-4); right: var(--stk-space-4);
255
+ display: flex; flex-direction: column-reverse; gap: var(--stk-space-2);
256
+ z-index: var(--stk-z-toast); pointer-events: none;
257
+ }
258
+ .stk-toast {
259
+ display: flex; align-items: center; gap: var(--stk-space-2);
260
+ padding: var(--stk-space-3) var(--stk-space-4);
261
+ background: var(--stk-fg); color: var(--stk-bg); border-radius: var(--stk-radius-md);
262
+ font-size: var(--stk-text-sm); box-shadow: var(--stk-shadow-lg);
263
+ pointer-events: auto; animation: stk-toast-in var(--stk-duration-slow) var(--stk-easing);
264
+ }
265
+ .stk-toast-exit { animation: stk-toast-out var(--stk-duration) var(--stk-easing) forwards; }
266
+ .stk-toast-success { background: var(--stk-success); color: var(--stk-success-fg); }
267
+ .stk-toast-error { background: var(--stk-destructive); color: var(--stk-destructive-fg); }
268
+ .stk-toast-warning { background: var(--stk-warning); color: var(--stk-warning-fg); }
269
+ .stk-toast-info { background: var(--stk-primary); color: var(--stk-primary-fg); }
270
+ .stk-toast-message { flex: 1; }
271
+ .stk-toast-dismiss {
272
+ background: none; border: none; color: inherit; cursor: pointer;
273
+ font-size: var(--stk-text-lg); line-height: 1; opacity: 0.7; pointer-events: auto;
274
+ }
275
+ .stk-toast-dismiss:hover { opacity: 1; }
276
+ @keyframes stk-toast-in {
277
+ from { opacity: 0; transform: translateY(8px) scale(0.95); }
278
+ to { opacity: 1; transform: translateY(0) scale(1); }
279
+ }
280
+ @keyframes stk-toast-out {
281
+ from { opacity: 1; transform: translateY(0) scale(1); }
282
+ to { opacity: 0; transform: translateY(8px) scale(0.95); }
283
+ }
284
+
285
+ /* ── Dropdown ───────────────────────────────────────── */
286
+ .stk-dropdown { position: relative; display: inline-block; }
287
+ .stk-dropdown-menu {
288
+ position: absolute; top: 100%; left: 0; margin-top: var(--stk-space-1);
289
+ min-width: 160px; padding: var(--stk-space-1) 0;
290
+ background: var(--stk-bg); border: 1px solid var(--stk-border);
291
+ border-radius: var(--stk-radius-md); box-shadow: var(--stk-shadow-md);
292
+ z-index: var(--stk-z-dropdown);
293
+ animation: stk-slide-in var(--stk-duration) var(--stk-easing);
294
+ }
295
+ .stk-dropdown-item {
296
+ display: block; width: 100%; padding: var(--stk-space-2) var(--stk-space-3);
297
+ background: none; border: none; text-align: left; cursor: pointer;
298
+ font-size: var(--stk-text-sm); color: var(--stk-fg);
299
+ transition: background var(--stk-duration) var(--stk-easing);
300
+ }
301
+ .stk-dropdown-item:hover,
302
+ .stk-dropdown-item:focus { background: var(--stk-muted-fg); outline: none; }
303
+ .stk-dropdown-item-danger { color: var(--stk-destructive); }
304
+ .stk-dropdown-item-danger:hover { background: var(--stk-destructive); color: var(--stk-destructive-fg); }
305
+ .stk-dropdown-separator { height: 1px; background: var(--stk-border); margin: var(--stk-space-1) 0; }
306
+
307
+ /* ── Tooltip ────────────────────────────────────────── */
308
+ .stk-tooltip {
309
+ padding: var(--stk-space-1) var(--stk-space-2);
310
+ background: var(--stk-fg); color: var(--stk-bg);
311
+ font-size: var(--stk-text-xs); font-family: var(--stk-font);
312
+ border-radius: var(--stk-radius-sm);
313
+ white-space: nowrap; pointer-events: none;
314
+ animation: stk-fade-in var(--stk-duration) var(--stk-easing);
315
+ box-shadow: var(--stk-shadow-sm);
316
+ }
317
+
318
+ /* ── Dialog ─────────────────────────────────────────── */
319
+ .stk-dialog {
320
+ border: none; border-radius: var(--stk-radius-lg); padding: 0;
321
+ box-shadow: var(--stk-shadow-lg); max-width: 420px; width: 90%;
322
+ background: var(--stk-bg); color: var(--stk-fg);
323
+ animation: stk-dialog-in var(--stk-duration-slow) var(--stk-easing);
324
+ margin: auto; /* restore centering overridden by CSS resets */
325
+ }
326
+ .stk-dialog::backdrop { background: rgba(0,0,0,0.5); }
327
+ .stk-dialog-header {
328
+ display: flex; align-items: center; justify-content: space-between;
329
+ padding: var(--stk-space-4) var(--stk-space-6);
330
+ border-bottom: 1px solid var(--stk-border);
331
+ }
332
+ .stk-dialog-title { font-size: var(--stk-text-lg); font-weight: 600; margin: 0; }
333
+ .stk-dialog-close {
334
+ background: none; border: none; padding: var(--stk-space-1); cursor: pointer;
335
+ color: var(--stk-muted); font-size: var(--stk-text-lg); line-height: 1;
336
+ transition: color var(--stk-duration) var(--stk-easing);
337
+ }
338
+ .stk-dialog-close:hover { color: var(--stk-fg); }
339
+ .stk-dialog-body { padding: var(--stk-space-4) var(--stk-space-6); font-size: var(--stk-text-sm); }
340
+ .stk-dialog-footer {
341
+ display: flex; justify-content: flex-end; gap: var(--stk-space-2);
342
+ padding: var(--stk-space-4) var(--stk-space-6);
343
+ border-top: 1px solid var(--stk-border);
344
+ }
345
+ @keyframes stk-dialog-in {
346
+ from { opacity: 0; transform: scale(0.95); }
347
+ to { opacity: 1; transform: scale(1); }
348
+ }
349
+
350
+ /* ── Toggle Group ───────────────────────────────────── */
351
+ .stk-toggle-group {
352
+ display: inline-flex; border: 1px solid var(--stk-border); border-radius: var(--stk-radius-md);
353
+ overflow: hidden;
354
+ }
355
+ .stk-toggle-group-item {
356
+ padding: var(--stk-space-2) var(--stk-space-3); background: var(--stk-bg);
357
+ border: none; border-right: 1px solid var(--stk-border);
358
+ font-size: var(--stk-text-sm); color: var(--stk-fg); cursor: pointer;
359
+ transition: all var(--stk-duration) var(--stk-easing);
360
+ }
361
+ .stk-toggle-group-item:last-child { border-right: none; }
362
+ .stk-toggle-group-item:hover { background: var(--stk-muted-fg); }
363
+ .stk-toggle-group-item:focus-visible { outline: 2px solid var(--stk-ring); outline-offset: -2px; }
364
+ .stk-toggle-group-item[aria-pressed="true"] {
365
+ background: var(--stk-primary); color: var(--stk-primary-fg);
366
+ }
367
+
368
+ /* ── Command Palette ───────────────────────────────── */
369
+ .stk-command-palette-overlay {
370
+ position: fixed; inset: 0;
371
+ background: rgba(0,0,0,0.5);
372
+ z-index: calc(var(--stk-z-modal) + 10);
373
+ display: flex; justify-content: center;
374
+ padding-top: 20vh;
375
+ animation: stk-fade-in var(--stk-duration) var(--stk-easing);
376
+ }
377
+ .stk-command-palette-overlay[hidden] { display: none; }
378
+
379
+ .stk-command-palette {
380
+ width: 90%; max-width: 520px;
381
+ max-height: 400px;
382
+ background: var(--stk-bg);
383
+ border: 1px solid var(--stk-border);
384
+ border-radius: var(--stk-radius-lg);
385
+ box-shadow: var(--stk-shadow-lg);
386
+ display: flex; flex-direction: column;
387
+ overflow: hidden;
388
+ animation: stk-dialog-in var(--stk-duration-slow) var(--stk-easing);
389
+ align-self: flex-start;
390
+ }
391
+
392
+ .stk-command-palette-input {
393
+ width: 100%; padding: var(--stk-space-4) var(--stk-space-5);
394
+ background: transparent; border: none;
395
+ border-bottom: 1px solid var(--stk-border);
396
+ font-family: var(--stk-font); font-size: var(--stk-text-base);
397
+ color: var(--stk-fg); outline: none;
398
+ }
399
+ .stk-command-palette-input::placeholder { color: var(--stk-muted); }
400
+
401
+ .stk-command-palette-list {
402
+ overflow-y: auto; flex: 1;
403
+ padding: var(--stk-space-2) 0;
404
+ max-height: 320px;
405
+ }
406
+
407
+ .stk-command-palette-group {
408
+ padding: var(--stk-space-2) var(--stk-space-4) var(--stk-space-1);
409
+ font-size: var(--stk-text-xs); font-weight: 600;
410
+ color: var(--stk-muted); text-transform: uppercase;
411
+ letter-spacing: 0.05em;
412
+ user-select: none;
413
+ }
414
+
415
+ .stk-command-palette-item {
416
+ display: flex; align-items: center; justify-content: space-between;
417
+ padding: var(--stk-space-2) var(--stk-space-4);
418
+ font-size: var(--stk-text-sm); color: var(--stk-fg);
419
+ cursor: pointer; border-radius: 0;
420
+ transition: background var(--stk-duration) var(--stk-easing);
421
+ margin: 0 var(--stk-space-2);
422
+ border-radius: var(--stk-radius-sm);
423
+ }
424
+ .stk-command-palette-item:hover,
425
+ .stk-command-palette-item[aria-selected="true"] {
426
+ background: var(--stk-muted-fg);
427
+ }
428
+
429
+ .stk-command-palette-label { flex: 1; }
430
+
431
+ .stk-command-palette-shortcut {
432
+ font-family: var(--stk-font-mono); font-size: var(--stk-text-xs);
433
+ color: var(--stk-muted);
434
+ background: var(--stk-muted-fg);
435
+ padding: var(--stk-space-1) var(--stk-space-2);
436
+ border-radius: var(--stk-radius-sm);
437
+ border: 1px solid var(--stk-border);
438
+ line-height: 1; white-space: nowrap;
439
+ margin-left: var(--stk-space-3);
440
+ }
441
+
442
+ .stk-command-palette-empty {
443
+ padding: var(--stk-space-6) var(--stk-space-4);
444
+ text-align: center; color: var(--stk-muted);
445
+ font-size: var(--stk-text-sm);
446
+ }
447
+
448
+ /* ── Data Table ────────────────────────────────────── */
449
+ .stk-table-wrapper {
450
+ overflow-x: auto;
451
+ border: 1px solid var(--stk-border);
452
+ border-radius: var(--stk-radius-md);
453
+ background: var(--stk-bg);
454
+ }
455
+
456
+ .stk-table {
457
+ width: 100%;
458
+ border-collapse: collapse;
459
+ text-align: left;
460
+ font-size: var(--stk-text-sm);
461
+ color: var(--stk-fg);
462
+ }
463
+
464
+ .stk-table th {
465
+ padding: var(--stk-space-3) var(--stk-space-4);
466
+ font-weight: 500;
467
+ color: var(--stk-muted);
468
+ font-size: var(--stk-text-xs);
469
+ text-transform: uppercase;
470
+ letter-spacing: 0.05em;
471
+ border-bottom: 1px solid var(--stk-border);
472
+ background: var(--stk-bg);
473
+ white-space: nowrap;
474
+ user-select: none;
475
+ }
476
+
477
+ .stk-table td {
478
+ padding: var(--stk-space-3) var(--stk-space-4);
479
+ border-bottom: 1px solid var(--stk-border);
480
+ vertical-align: middle;
481
+ }
482
+
483
+ .stk-table tbody tr:last-child td { border-bottom: none; }
484
+
485
+ .stk-table tbody tr:hover {
486
+ background: var(--stk-muted-fg);
487
+ transition: background var(--stk-duration) var(--stk-easing);
488
+ }
489
+
490
+ /* Sortable headers */
491
+ .stk-table th[data-stk-sortable] {
492
+ cursor: pointer;
493
+ transition: color var(--stk-duration) var(--stk-easing);
494
+ }
495
+ .stk-table th[data-stk-sortable]:hover { color: var(--stk-fg); }
496
+
497
+ .stk-table th[data-stk-sortable]::after {
498
+ content: '\2195'; /* up-down arrow */
499
+ display: inline-block;
500
+ margin-left: var(--stk-space-1);
501
+ opacity: 0.35;
502
+ font-size: 0.75em;
503
+ transition: opacity var(--stk-duration) var(--stk-easing);
504
+ }
505
+ .stk-table th[data-stk-sortable]:hover::after { opacity: 0.6; }
506
+
507
+ .stk-table th[aria-sort="ascending"]::after {
508
+ content: '\2191'; /* up arrow */
509
+ opacity: 1;
510
+ }
511
+ .stk-table th[aria-sort="descending"]::after {
512
+ content: '\2193'; /* down arrow */
513
+ opacity: 1;
514
+ }
515
+
516
+ /* Toolbar (filter + controls above table) */
517
+ .stk-table-toolbar {
518
+ display: flex;
519
+ align-items: center;
520
+ gap: var(--stk-space-3);
521
+ padding: var(--stk-space-3) var(--stk-space-4);
522
+ border-bottom: 1px solid var(--stk-border);
523
+ flex-wrap: wrap;
524
+ }
525
+
526
+ .stk-table-filter {
527
+ padding: var(--stk-space-2) var(--stk-space-3);
528
+ border: 1px solid var(--stk-border);
529
+ border-radius: var(--stk-radius-md);
530
+ font-size: var(--stk-text-sm);
531
+ font-family: var(--stk-font);
532
+ color: var(--stk-fg);
533
+ background: var(--stk-bg);
534
+ min-width: 200px;
535
+ transition: border-color var(--stk-duration) var(--stk-easing),
536
+ box-shadow var(--stk-duration) var(--stk-easing);
537
+ }
538
+ .stk-table-filter::placeholder { color: var(--stk-muted); }
539
+ .stk-table-filter:focus {
540
+ outline: none;
541
+ border-color: var(--stk-ring);
542
+ box-shadow: 0 0 0 2px rgba(24,24,27,0.1);
543
+ }
544
+
545
+ /* Pagination bar */
546
+ .stk-table-pagination {
547
+ display: flex;
548
+ align-items: center;
549
+ justify-content: space-between;
550
+ gap: var(--stk-space-3);
551
+ padding: var(--stk-space-3) var(--stk-space-4);
552
+ border-top: 1px solid var(--stk-border);
553
+ flex-wrap: wrap;
554
+ }
555
+
556
+ .stk-table-page-info {
557
+ font-size: var(--stk-text-sm);
558
+ color: var(--stk-muted);
559
+ }
560
+
561
+ .stk-table-page-nav {
562
+ display: flex;
563
+ align-items: center;
564
+ gap: var(--stk-space-2);
565
+ }
566
+
567
+ .stk-table-page-num {
568
+ font-size: var(--stk-text-sm);
569
+ color: var(--stk-muted);
570
+ min-width: 80px;
571
+ text-align: center;
572
+ }
573
+
574
+ .stk-table-page-btn {
575
+ display: inline-flex;
576
+ align-items: center;
577
+ justify-content: center;
578
+ padding: var(--stk-space-1) var(--stk-space-3);
579
+ border: 1px solid var(--stk-border);
580
+ border-radius: var(--stk-radius-md);
581
+ background: var(--stk-bg);
582
+ color: var(--stk-fg);
583
+ font-size: var(--stk-text-sm);
584
+ font-family: var(--stk-font);
585
+ cursor: pointer;
586
+ transition: all var(--stk-duration) var(--stk-easing);
587
+ }
588
+ .stk-table-page-btn:hover:not(:disabled) { background: var(--stk-muted-fg); }
589
+ .stk-table-page-btn:focus-visible { outline: 2px solid var(--stk-ring); outline-offset: 2px; }
590
+ .stk-table-page-btn:disabled {
591
+ opacity: 0.4;
592
+ cursor: not-allowed;
593
+ }
594
+
595
+ /* Page size selector */
596
+ .stk-table-page-size {
597
+ padding: var(--stk-space-1) var(--stk-space-2);
598
+ border: 1px solid var(--stk-border);
599
+ border-radius: var(--stk-radius-md);
600
+ font-size: var(--stk-text-sm);
601
+ font-family: var(--stk-font);
602
+ color: var(--stk-fg);
603
+ background: var(--stk-bg);
604
+ cursor: pointer;
605
+ }
606
+ .stk-table-page-size:focus-visible { outline: 2px solid var(--stk-ring); outline-offset: 2px; }
607
+
608
+ /* ── Stepper / Wizard ─────────────────────────────── */
609
+ .stk-stepper {
610
+ display: flex; flex-direction: column; gap: var(--stk-space-6);
611
+ font-family: var(--stk-font);
612
+ }
613
+
614
+ .stk-stepper-header {
615
+ display: flex; align-items: center; gap: 0;
616
+ padding: 0 var(--stk-space-4);
617
+ }
618
+
619
+ .stk-stepper-indicator {
620
+ display: inline-flex; align-items: center; justify-content: center;
621
+ width: 32px; height: 32px; flex-shrink: 0;
622
+ border-radius: var(--stk-radius-full);
623
+ border: 2px solid var(--stk-border);
624
+ background: var(--stk-bg); color: var(--stk-muted);
625
+ font-size: var(--stk-text-sm); font-weight: 600;
626
+ transition: all var(--stk-duration) var(--stk-easing);
627
+ position: relative;
628
+ }
629
+
630
+ .stk-stepper-indicator[aria-current="step"] {
631
+ border-color: var(--stk-primary);
632
+ background: var(--stk-primary);
633
+ color: var(--stk-primary-fg);
634
+ }
635
+
636
+ .stk-stepper-indicator[data-stk-step-complete] {
637
+ border-color: var(--stk-primary);
638
+ background: var(--stk-primary);
639
+ color: var(--stk-primary-fg);
640
+ }
641
+
642
+ /* Checkmark for completed steps */
643
+ .stk-stepper-indicator[data-stk-step-complete]::after {
644
+ content: '';
645
+ display: block;
646
+ width: 6px; height: 10px;
647
+ border: solid var(--stk-primary-fg);
648
+ border-width: 0 2px 2px 0;
649
+ transform: rotate(45deg);
650
+ margin-top: -2px;
651
+ }
652
+ /* Hide the number text when showing checkmark */
653
+ .stk-stepper-indicator[data-stk-step-complete] { font-size: 0; }
654
+
655
+ .stk-stepper-indicator-label {
656
+ position: absolute; top: 100%; left: 50%;
657
+ transform: translateX(-50%);
658
+ margin-top: var(--stk-space-2);
659
+ font-size: var(--stk-text-xs); font-weight: 500;
660
+ color: var(--stk-muted); white-space: nowrap;
661
+ }
662
+ .stk-stepper-indicator[aria-current="step"] .stk-stepper-indicator-label {
663
+ color: var(--stk-fg);
664
+ }
665
+
666
+ .stk-stepper-connector {
667
+ flex: 1; height: 2px;
668
+ background: var(--stk-border);
669
+ transition: background var(--stk-duration) var(--stk-easing);
670
+ }
671
+ .stk-stepper-connector[data-complete] {
672
+ background: var(--stk-primary);
673
+ }
674
+
675
+ .stk-stepper-body {
676
+ padding: 0 var(--stk-space-4);
677
+ }
678
+
679
+ .stk-stepper-step {
680
+ animation: stk-fade-in var(--stk-duration-slow) var(--stk-easing);
681
+ }
682
+
683
+ .stk-stepper-footer {
684
+ display: flex; justify-content: space-between; align-items: center;
685
+ padding: 0 var(--stk-space-4);
686
+ gap: var(--stk-space-3);
687
+ }
688
+
689
+ /* Invalid required field animation */
690
+ .stk-stepper-invalid {
691
+ outline: 2px solid var(--stk-destructive) !important;
692
+ outline-offset: 1px;
693
+ animation: stk-stepper-shake 0.4s var(--stk-easing);
694
+ }
695
+
696
+ @keyframes stk-stepper-shake {
697
+ 0%, 100% { transform: translateX(0); }
698
+ 20% { transform: translateX(-4px); }
699
+ 40% { transform: translateX(4px); }
700
+ 60% { transform: translateX(-2px); }
701
+ 80% { transform: translateX(2px); }
702
+ }
703
+
704
+ /* Input base style (shared by stepper forms) */
705
+ .stk-stepper .stk-input {
706
+ display: block; width: 100%;
707
+ padding: var(--stk-space-2) var(--stk-space-3);
708
+ border: 1px solid var(--stk-border);
709
+ border-radius: var(--stk-radius-md);
710
+ font-size: var(--stk-text-sm); font-family: var(--stk-font);
711
+ color: var(--stk-fg); background: var(--stk-bg);
712
+ transition: border-color var(--stk-duration) var(--stk-easing),
713
+ box-shadow var(--stk-duration) var(--stk-easing);
714
+ }
715
+ .stk-stepper .stk-input::placeholder { color: var(--stk-muted); }
716
+ .stk-stepper .stk-input:focus {
717
+ outline: none;
718
+ border-color: var(--stk-ring);
719
+ box-shadow: 0 0 0 2px rgba(24,24,27,0.1);
720
+ }
721
+
722
+ .stk-stepper .stk-label {
723
+ display: block;
724
+ font-size: var(--stk-text-sm); font-weight: 500;
725
+ color: var(--stk-fg);
726
+ margin-bottom: var(--stk-space-1);
727
+ }
728
+
729
+ /* ── Autocomplete ──────────────────────────────────── */
730
+ .stk-autocomplete {
731
+ position: relative;
732
+ display: inline-block;
733
+ }
734
+
735
+ .stk-autocomplete-input {
736
+ display: block;
737
+ width: 100%;
738
+ padding: var(--stk-space-2) var(--stk-space-3);
739
+ border: 1px solid var(--stk-border);
740
+ border-radius: var(--stk-radius-md);
741
+ font-size: var(--stk-text-sm);
742
+ font-family: var(--stk-font);
743
+ color: var(--stk-fg);
744
+ background: var(--stk-bg);
745
+ min-width: 200px;
746
+ transition: border-color var(--stk-duration) var(--stk-easing),
747
+ box-shadow var(--stk-duration) var(--stk-easing);
748
+ }
749
+ .stk-autocomplete-input::placeholder { color: var(--stk-muted); }
750
+ .stk-autocomplete-input:focus {
751
+ outline: none;
752
+ border-color: var(--stk-ring);
753
+ box-shadow: 0 0 0 2px rgba(24,24,27,0.1);
754
+ }
755
+
756
+ .stk-autocomplete-dropdown {
757
+ position: absolute;
758
+ top: 100%;
759
+ left: 0;
760
+ right: 0;
761
+ margin-top: var(--stk-space-1);
762
+ max-height: 240px;
763
+ overflow-y: auto;
764
+ padding: var(--stk-space-1) 0;
765
+ background: var(--stk-bg);
766
+ border: 1px solid var(--stk-border);
767
+ border-radius: var(--stk-radius-md);
768
+ box-shadow: var(--stk-shadow-md);
769
+ z-index: var(--stk-z-dropdown);
770
+ animation: stk-slide-in var(--stk-duration) var(--stk-easing);
771
+ }
772
+ .stk-autocomplete-dropdown[hidden] { display: none; }
773
+
774
+ .stk-autocomplete-item {
775
+ display: block;
776
+ width: 100%;
777
+ padding: var(--stk-space-2) var(--stk-space-3);
778
+ font-size: var(--stk-text-sm);
779
+ color: var(--stk-fg);
780
+ cursor: pointer;
781
+ border-radius: 0;
782
+ margin: 0 var(--stk-space-1);
783
+ width: calc(100% - var(--stk-space-2));
784
+ border-radius: var(--stk-radius-sm);
785
+ transition: background var(--stk-duration) var(--stk-easing);
786
+ }
787
+ .stk-autocomplete-item:hover,
788
+ .stk-autocomplete-item[aria-selected="true"] {
789
+ background: var(--stk-muted-fg);
790
+ }
791
+
792
+ .stk-autocomplete-item mark {
793
+ background: transparent;
794
+ color: var(--stk-fg);
795
+ font-weight: 700;
796
+ }
797
+
798
+ .stk-autocomplete-empty {
799
+ padding: var(--stk-space-4) var(--stk-space-3);
800
+ text-align: center;
801
+ color: var(--stk-muted);
802
+ font-size: var(--stk-text-sm);
803
+ }
804
+
805
+ .stk-autocomplete-loading {
806
+ padding: var(--stk-space-4) var(--stk-space-3);
807
+ text-align: center;
808
+ color: var(--stk-muted);
809
+ font-size: var(--stk-text-sm);
810
+ }
811
+ .stk-autocomplete-loading::before {
812
+ content: '';
813
+ display: inline-block;
814
+ width: 14px;
815
+ height: 14px;
816
+ margin-right: var(--stk-space-2);
817
+ border: 2px solid var(--stk-border);
818
+ border-top-color: var(--stk-primary);
819
+ border-radius: 50%;
820
+ animation: stk-ac-spin 0.6s linear infinite;
821
+ vertical-align: middle;
822
+ }
823
+ @keyframes stk-ac-spin {
824
+ to { transform: rotate(360deg); }
825
+ }