uidex 0.2.4 → 0.4.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 (65) hide show
  1. package/README.md +253 -353
  2. package/dist/cli/cli.cjs +3324 -0
  3. package/dist/cli/cli.cjs.map +1 -0
  4. package/dist/cloud/index.cjs +169 -0
  5. package/dist/cloud/index.cjs.map +1 -0
  6. package/dist/cloud/index.js +140 -0
  7. package/dist/cloud/index.js.map +1 -0
  8. package/dist/headless/index.cjs +4143 -0
  9. package/dist/headless/index.cjs.map +1 -0
  10. package/dist/headless/index.d.cts +220 -0
  11. package/dist/headless/index.d.ts +220 -0
  12. package/dist/headless/index.js +4130 -0
  13. package/dist/headless/index.js.map +1 -0
  14. package/dist/index.cjs +8704 -9883
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.d.cts +968 -146
  17. package/dist/index.d.ts +968 -146
  18. package/dist/index.js +8327 -9492
  19. package/dist/index.js.map +1 -1
  20. package/dist/playwright/index.cjs +164 -24
  21. package/dist/playwright/index.cjs.map +1 -1
  22. package/dist/playwright/index.d.cts +30 -53
  23. package/dist/playwright/index.d.ts +30 -53
  24. package/dist/playwright/index.js +148 -21
  25. package/dist/playwright/index.js.map +1 -1
  26. package/dist/playwright/reporter.cjs +62 -28
  27. package/dist/playwright/reporter.cjs.map +1 -1
  28. package/dist/playwright/reporter.d.cts +24 -12
  29. package/dist/playwright/reporter.d.ts +24 -12
  30. package/dist/playwright/reporter.js +62 -28
  31. package/dist/playwright/reporter.js.map +1 -1
  32. package/dist/react/index.cjs +8706 -9883
  33. package/dist/react/index.cjs.map +1 -1
  34. package/dist/react/index.d.cts +720 -146
  35. package/dist/react/index.d.ts +720 -146
  36. package/dist/react/index.js +8518 -9629
  37. package/dist/react/index.js.map +1 -1
  38. package/dist/scan/index.cjs +3360 -0
  39. package/dist/scan/index.cjs.map +1 -0
  40. package/dist/scan/index.d.cts +378 -0
  41. package/dist/scan/index.d.ts +378 -0
  42. package/dist/scan/index.js +3303 -0
  43. package/dist/scan/index.js.map +1 -0
  44. package/package.json +67 -60
  45. package/templates/claude/audit.md +43 -0
  46. package/templates/claude/rules.md +227 -0
  47. package/claude/audit-command.md +0 -46
  48. package/claude/rules.md +0 -167
  49. package/dist/api/index.cjs +0 -254
  50. package/dist/api/index.cjs.map +0 -1
  51. package/dist/api/index.d.cts +0 -236
  52. package/dist/api/index.d.ts +0 -236
  53. package/dist/api/index.js +0 -226
  54. package/dist/api/index.js.map +0 -1
  55. package/dist/core/index.cjs +0 -11045
  56. package/dist/core/index.cjs.map +0 -1
  57. package/dist/core/index.d.cts +0 -424
  58. package/dist/core/index.d.ts +0 -424
  59. package/dist/core/index.global.js +0 -66516
  60. package/dist/core/index.global.js.map +0 -1
  61. package/dist/core/index.js +0 -10995
  62. package/dist/core/index.js.map +0 -1
  63. package/dist/core/style.css +0 -1529
  64. package/dist/scripts/cli.cjs +0 -3904
  65. package/uidex.schema.json +0 -93
@@ -1,1529 +0,0 @@
1
- /* ============================================================
2
- Design tokens — COSS defaults + uidex category colors
3
- :host for Shadow DOM, :where(:root) for standalone use.
4
- Dark theme default. Light theme via :host(.light).
5
- ============================================================ */
6
-
7
- :where(:host, :root) {
8
- --background: #141414;
9
- --foreground: #f5f5f5;
10
- --card: #181818;
11
- --card-foreground: #f5f5f5;
12
- --popover: #1e1e1e;
13
- --popover-foreground: #f5f5f5;
14
- --primary: #f5f5f5;
15
- --primary-foreground: #262626;
16
- --secondary: rgba(255, 255, 255, 0.04);
17
- --secondary-foreground: #f5f5f5;
18
- --muted: rgba(255, 255, 255, 0.04);
19
- --muted-foreground: #7f7f7f;
20
- --accent: rgba(255, 255, 255, 0.04);
21
- --accent-foreground: #f5f5f5;
22
- --destructive: #f87171;
23
- --destructive-foreground: #f87171;
24
- --border: rgba(255, 255, 255, 0.06);
25
- --input: rgba(255, 255, 255, 0.08);
26
- --ring: #737373;
27
- --info: #60a5fa;
28
- --radius: 0.625rem;
29
- --radius-sm: 6px;
30
- --radius-md: 8px;
31
- --radius-lg: 10px;
32
- --radius-xl: 14px;
33
- --radius-2xl: 16px;
34
- --font-sans: ui-sans-serif, system-ui, -apple-system,
35
- BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
36
- --font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo,
37
- Consolas, monospace;
38
-
39
- /* Uidex category colors */
40
- --uidex-component: #34d399;
41
- --uidex-feature: #a78bfa;
42
- --uidex-block: #c084fc;
43
- }
44
-
45
- /* ——— Light theme ——— */
46
- :host(.light) {
47
- --background: #ffffff;
48
- --foreground: #262626;
49
- --card: #ffffff;
50
- --card-foreground: #262626;
51
- --popover: #ffffff;
52
- --popover-foreground: #262626;
53
- --primary: #262626;
54
- --primary-foreground: #fafafa;
55
- --secondary: rgba(0, 0, 0, 0.04);
56
- --secondary-foreground: #262626;
57
- --muted: rgba(0, 0, 0, 0.04);
58
- --muted-foreground: #6b6b6b;
59
- --accent: rgba(0, 0, 0, 0.04);
60
- --accent-foreground: #262626;
61
- --destructive: #ef4444;
62
- --destructive-foreground: #b91c1c;
63
- --border: rgba(0, 0, 0, 0.08);
64
- --input: rgba(0, 0, 0, 0.1);
65
- --ring: #a3a3a3;
66
- --info: #3b82f6;
67
- --warning: #f59e0b;
68
- --warning-foreground: #92400e;
69
- --success: #10b981;
70
- --success-foreground: #065f46;
71
- --info-foreground: #1e40af;
72
- --purple: #8b5cf6;
73
- --purple-foreground: #5b21b6;
74
- }
75
-
76
- /* ============================================================
77
- Reset — match Tailwind preflight (border-box + no margin)
78
- ============================================================ */
79
-
80
- *,
81
- *::before,
82
- *::after {
83
- box-sizing: border-box;
84
- }
85
-
86
- /* ============================================================
87
- Icon
88
- ============================================================ */
89
-
90
- .uidex-icon {
91
- flex-shrink: 0;
92
- pointer-events: none;
93
- }
94
-
95
- /* ============================================================
96
- Button — mirrors COSS button.tsx variants
97
- ============================================================ */
98
-
99
- .uidex-btn {
100
- position: relative;
101
- display: inline-flex;
102
- align-items: center;
103
- justify-content: center;
104
- gap: 8px;
105
- border-radius: var(--radius-lg);
106
- border: 1px solid transparent;
107
- font-size: 14px;
108
- font-weight: 500;
109
- font-family: var(--font-sans);
110
- white-space: nowrap;
111
- cursor: pointer;
112
- outline: none;
113
- transition:
114
- background-color 0.2s ease-in-out,
115
- color 0.2s ease-in-out,
116
- box-shadow 0.2s ease-in-out,
117
- border-color 0.2s ease-in-out;
118
- -webkit-font-smoothing: antialiased;
119
- }
120
-
121
- .uidex-btn::before {
122
- content: '';
123
- position: absolute;
124
- inset: 0;
125
- pointer-events: none;
126
- border-radius: calc(var(--radius-lg) - 1px);
127
- }
128
-
129
- .uidex-btn:focus-visible {
130
- outline: 2px solid var(--ring);
131
- outline-offset: 1px;
132
- }
133
-
134
- .uidex-btn:disabled {
135
- opacity: 0.64;
136
- pointer-events: none;
137
- }
138
-
139
- /* Default variant — primary fill */
140
- .uidex-btn--default {
141
- border-color: var(--primary);
142
- background: var(--primary);
143
- color: var(--primary-foreground);
144
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05),
145
- 0 1px 2px color-mix(in srgb, var(--primary) 24%, transparent);
146
- }
147
-
148
- .uidex-btn--default::before {
149
- box-shadow: inset 0 1px color-mix(in srgb, var(--primary-foreground) 16%, transparent);
150
- }
151
-
152
- .uidex-btn--default:hover {
153
- opacity: 0.9;
154
- }
155
-
156
- .uidex-btn--default:active {
157
- box-shadow: none;
158
- }
159
-
160
- .uidex-btn--default:active::before {
161
- box-shadow: inset 0 1px rgba(0, 0, 0, 0.08);
162
- }
163
-
164
- /* Ghost variant */
165
- .uidex-btn--ghost {
166
- background: transparent;
167
- color: var(--foreground);
168
- }
169
-
170
- .uidex-btn--ghost::before {
171
- display: none;
172
- }
173
-
174
- .uidex-btn--ghost:hover {
175
- background: var(--accent);
176
- }
177
-
178
- /* Outline variant */
179
- .uidex-btn--outline {
180
- border-color: var(--input);
181
- background: var(--popover);
182
- color: var(--foreground);
183
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
184
- }
185
-
186
- .uidex-btn--outline::before {
187
- box-shadow: 0 -1px var(--border);
188
- }
189
-
190
- .uidex-btn--outline:hover {
191
- background: var(--input);
192
- }
193
-
194
- .uidex-btn--outline:active {
195
- box-shadow: none;
196
- }
197
-
198
- /* Destructive variant */
199
- .uidex-btn--destructive {
200
- border-color: var(--destructive);
201
- background: var(--destructive);
202
- color: #ffffff;
203
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
204
- }
205
-
206
- .uidex-btn--destructive::before {
207
- box-shadow: inset 0 1px color-mix(in srgb, var(--primary-foreground) 16%, transparent);
208
- }
209
-
210
- .uidex-btn--destructive:hover {
211
- opacity: 0.9;
212
- }
213
-
214
- /* Button sizes */
215
- .uidex-btn--size-default {
216
- height: 36px;
217
- padding: 0 12px;
218
- }
219
-
220
- .uidex-btn--size-sm {
221
- height: 32px;
222
- padding: 0 10px;
223
- gap: 6px;
224
- }
225
-
226
- .uidex-btn--size-xs {
227
- height: 28px;
228
- padding: 0 8px;
229
- gap: 4px;
230
- font-size: 12px;
231
- border-radius: var(--radius-md);
232
- }
233
-
234
- .uidex-btn--size-xs::before {
235
- border-radius: calc(var(--radius-md) - 1px);
236
- }
237
-
238
- .uidex-btn--size-icon {
239
- width: 36px;
240
- height: 36px;
241
- padding: 0;
242
- }
243
-
244
- .uidex-btn--size-icon-sm {
245
- width: 32px;
246
- height: 32px;
247
- padding: 0;
248
- }
249
-
250
- .uidex-btn--size-icon-xs {
251
- width: 24px;
252
- height: 24px;
253
- padding: 0;
254
- border-radius: var(--radius-md);
255
- }
256
-
257
- .uidex-btn--size-icon-xs .uidex-icon {
258
- width: 14px;
259
- height: 14px;
260
- }
261
-
262
- .uidex-btn .uidex-icon {
263
- width: 16px;
264
- height: 16px;
265
- opacity: 0.8;
266
- }
267
-
268
- .uidex-btn--size-xs .uidex-icon {
269
- width: 14px;
270
- height: 14px;
271
- }
272
-
273
- /* ============================================================
274
- Dialog — mirrors COSS dialog.tsx
275
- ============================================================ */
276
-
277
- .uidex-dialog-backdrop {
278
- position: fixed;
279
- inset: 0;
280
- z-index: 2147483646;
281
- pointer-events: auto;
282
- display: flex;
283
- align-items: center;
284
- justify-content: center;
285
- background: rgba(0, 0, 0, 0.32);
286
- backdrop-filter: blur(4px);
287
- -webkit-backdrop-filter: blur(4px);
288
- opacity: 0;
289
- transition: opacity 0.2s ease-in-out;
290
- }
291
-
292
- .uidex-dialog-backdrop--open {
293
- opacity: 1;
294
- }
295
-
296
- .uidex-dialog {
297
- position: relative;
298
- display: flex;
299
- flex-direction: column;
300
- background: var(--popover);
301
- color: var(--popover-foreground);
302
- border: 1px solid var(--border);
303
- border-radius: var(--radius-2xl);
304
- max-width: calc(100vw - 32px);
305
- max-height: calc(100vh - 64px);
306
- font-family: var(--font-sans);
307
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -2px rgba(0, 0, 0, 0.05);
308
- overflow: hidden;
309
- -webkit-font-smoothing: antialiased;
310
- opacity: 0;
311
- transform: scale(0.98);
312
- transform-origin: center;
313
- will-change: transform;
314
- transition:
315
- opacity 0.2s ease-in-out,
316
- transform 0.2s ease-in-out;
317
- }
318
-
319
- .uidex-dialog--open {
320
- opacity: 1;
321
- transform: none;
322
- }
323
-
324
- .uidex-dialog::before {
325
- content: '';
326
- position: absolute;
327
- inset: 0;
328
- pointer-events: none;
329
- border-radius: calc(var(--radius-2xl) - 1px);
330
- box-shadow: 0 -1px var(--border);
331
- }
332
-
333
- /* Panel variant — sidebar layout */
334
- .uidex-dialog--panel {
335
- width: calc(100vw - 32px);
336
- max-width: 720px;
337
- height: calc(100vh - 64px);
338
- max-height: 600px;
339
- }
340
-
341
- /* Feedback variant — single column */
342
- .uidex-dialog--feedback {
343
- width: calc(100vw - 32px);
344
- max-width: 400px;
345
- }
346
-
347
- .uidex-dialog-header {
348
- display: flex;
349
- align-items: center;
350
- gap: 8px;
351
- padding: 16px 24px;
352
- padding-right: 48px;
353
- border-bottom: 1px solid var(--border);
354
- }
355
-
356
- .uidex-dialog-title {
357
- margin: 0;
358
- font-size: 20px;
359
- font-weight: 600;
360
- line-height: 1;
361
- color: var(--foreground);
362
- font-family: var(--font-sans);
363
- }
364
-
365
- .uidex-dialog-body {
366
- flex: 1;
367
- min-height: 0;
368
- overflow-y: auto;
369
- scrollbar-width: thin;
370
- scrollbar-color: rgba(128, 128, 128, 0.2) transparent;
371
- }
372
-
373
- .uidex-dialog-body::-webkit-scrollbar {
374
- width: 6px;
375
- }
376
-
377
- .uidex-dialog-body::-webkit-scrollbar-track {
378
- background: transparent;
379
- }
380
-
381
- .uidex-dialog-body::-webkit-scrollbar-thumb {
382
- background: rgba(128, 128, 128, 0.2);
383
- border-radius: 9999px;
384
- }
385
-
386
- .uidex-dialog-footer {
387
- display: flex;
388
- align-items: center;
389
- justify-content: flex-end;
390
- gap: 8px;
391
- padding: 16px 24px;
392
- border-top: 1px solid var(--border);
393
- background: var(--muted);
394
- border-radius: 0 0 calc(var(--radius-2xl) - 1px)
395
- calc(var(--radius-2xl) - 1px);
396
- }
397
-
398
- .uidex-dialog-close {
399
- position: absolute;
400
- right: 8px;
401
- top: 8px;
402
- z-index: 1;
403
- }
404
-
405
- /* ——— Panel body layout (sidebar + main) ——— */
406
- .uidex-panel-body {
407
- display: flex;
408
- flex: 1;
409
- min-height: 0;
410
- }
411
-
412
- .uidex-panel-sidebar {
413
- width: 200px;
414
- flex-shrink: 0;
415
- border-right: 1px solid var(--border);
416
- overflow-y: auto;
417
- padding: 0;
418
- scrollbar-width: thin;
419
- scrollbar-color: rgba(128, 128, 128, 0.2) transparent;
420
- }
421
-
422
- .uidex-panel-sidebar::-webkit-scrollbar {
423
- width: 6px;
424
- }
425
-
426
- .uidex-panel-sidebar::-webkit-scrollbar-track {
427
- background: transparent;
428
- }
429
-
430
- .uidex-panel-sidebar::-webkit-scrollbar-thumb {
431
- background: rgba(128, 128, 128, 0.2);
432
- border-radius: 9999px;
433
- }
434
-
435
- .uidex-panel-main {
436
- flex: 1;
437
- min-width: 0;
438
- overflow-y: auto;
439
- padding: 24px;
440
- scrollbar-width: thin;
441
- scrollbar-color: rgba(128, 128, 128, 0.2) transparent;
442
- }
443
-
444
- .uidex-panel-main::-webkit-scrollbar {
445
- width: 6px;
446
- }
447
-
448
- .uidex-panel-main::-webkit-scrollbar-track {
449
- background: transparent;
450
- }
451
-
452
- .uidex-panel-main::-webkit-scrollbar-thumb {
453
- background: rgba(128, 128, 128, 0.2);
454
- border-radius: 9999px;
455
- }
456
-
457
- .uidex-control--flex-fill {
458
- flex: 1;
459
- min-width: 0;
460
- }
461
-
462
- .uidex-dialog-body--padded {
463
- padding: 12px 16px;
464
- }
465
-
466
- /* ============================================================
467
- Control wrapper — shared base for input, textarea, select
468
- ============================================================ */
469
-
470
- .uidex-control {
471
- position: relative;
472
- display: inline-flex;
473
- width: 100%;
474
- border-radius: var(--radius-lg);
475
- border: 1px solid var(--input);
476
- background: var(--background);
477
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
478
- transition:
479
- border-color 0.2s ease-in-out,
480
- box-shadow 0.2s ease-in-out;
481
- }
482
-
483
- .uidex-control::before {
484
- content: '';
485
- position: absolute;
486
- inset: 0;
487
- pointer-events: none;
488
- border-radius: calc(var(--radius-lg) - 1px);
489
- box-shadow: 0 -1px var(--border);
490
- }
491
-
492
- .uidex-control:focus-within {
493
- border-color: var(--ring);
494
- outline: 3px solid color-mix(in srgb, var(--ring) 24%, transparent);
495
- outline-offset: -1px;
496
- box-shadow: none;
497
- }
498
-
499
- .uidex-control:focus-within::before {
500
- box-shadow: none;
501
- }
502
-
503
- /* ——— Input ——— */
504
-
505
- .uidex-input {
506
- width: 100%;
507
- min-width: 0;
508
- height: 30px;
509
- padding: 0 10px;
510
- border: none;
511
- border-radius: inherit;
512
- background: transparent;
513
- color: var(--foreground);
514
- font-size: 14px;
515
- font-family: var(--font-sans);
516
- outline: none;
517
- line-height: 30px;
518
- }
519
-
520
- .uidex-input::placeholder {
521
- color: var(--muted-foreground);
522
- opacity: 0.72;
523
- }
524
-
525
- .uidex-control--sm .uidex-input {
526
- height: 26px;
527
- line-height: 26px;
528
- padding: 0 8px;
529
- }
530
-
531
- /* ——— Textarea ——— */
532
-
533
- .uidex-textarea {
534
- width: 100%;
535
- min-width: 0;
536
- padding: 8px 10px;
537
- border: none;
538
- border-radius: inherit;
539
- background: transparent;
540
- color: var(--foreground);
541
- font-size: 14px;
542
- font-family: var(--font-sans);
543
- outline: none;
544
- line-height: 1.5;
545
- resize: vertical;
546
- min-height: 80px;
547
- }
548
-
549
- .uidex-textarea::placeholder {
550
- color: var(--muted-foreground);
551
- opacity: 0.72;
552
- }
553
-
554
- /* ——— Select ——— */
555
-
556
- .uidex-select {
557
- width: 100%;
558
- height: 30px;
559
- padding: 0 26px 0 10px;
560
- border: none;
561
- border-radius: inherit;
562
- background: transparent;
563
- color: var(--foreground);
564
- font-size: 14px;
565
- font-family: var(--font-sans);
566
- outline: none;
567
- appearance: none;
568
- cursor: pointer;
569
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 256 256'%3E%3Cpath fill='%237f7f7f' d='M213.66,101.66l-80,80a8,8,0,0,1-11.32,0l-80-80a8,8,0,0,1,11.32-11.32L128,164.69l74.34-74.35a8,8,0,0,1,11.32,11.32Z'/%3E%3C/svg%3E");
570
- background-repeat: no-repeat;
571
- background-position: right 6px center;
572
- background-size: 16px;
573
- }
574
-
575
- /* ============================================================
576
- Badge — mirrors COSS badge.tsx
577
- ============================================================ */
578
-
579
- .uidex-badge {
580
- display: inline-flex;
581
- align-items: center;
582
- justify-content: center;
583
- gap: 4px;
584
- height: 18px;
585
- min-width: 18px;
586
- padding: 0 4px;
587
- border-radius: var(--radius-sm);
588
- border: 1px solid transparent;
589
- font-size: 12px;
590
- font-weight: 500;
591
- font-family: var(--font-sans);
592
- white-space: nowrap;
593
- }
594
-
595
- .uidex-badge--sm {
596
- height: 16px;
597
- min-width: 16px;
598
- font-size: 10px;
599
- }
600
-
601
- .uidex-badge--default {
602
- background: var(--primary);
603
- color: var(--primary-foreground);
604
- }
605
-
606
- .uidex-badge--outline {
607
- border-color: var(--input);
608
- background: var(--background);
609
- color: var(--foreground);
610
- }
611
-
612
- .uidex-badge--pages {
613
- color: var(--info);
614
- border-color: color-mix(
615
- in srgb,
616
- var(--info) 30%,
617
- transparent
618
- );
619
- }
620
-
621
- .uidex-badge--features {
622
- color: var(--uidex-feature);
623
- border-color: color-mix(
624
- in srgb,
625
- var(--uidex-feature) 30%,
626
- transparent
627
- );
628
- }
629
-
630
- .uidex-badge--components {
631
- color: var(--uidex-component);
632
- border-color: color-mix(
633
- in srgb,
634
- var(--uidex-component) 30%,
635
- transparent
636
- );
637
- }
638
-
639
- .uidex-badge--blocks {
640
- color: var(--uidex-block);
641
- border-color: color-mix(
642
- in srgb,
643
- var(--uidex-block) 30%,
644
- transparent
645
- );
646
- }
647
-
648
- .uidex-badge--spaced {
649
- margin-bottom: 12px;
650
- }
651
-
652
- /* ============================================================
653
- Chip — small clickable tags
654
- ============================================================ */
655
-
656
- .uidex-chip {
657
- display: inline-flex;
658
- align-items: center;
659
- padding: 2px 6px;
660
- border-radius: var(--radius-sm);
661
- border: 1px solid var(--border);
662
- background: transparent;
663
- font-family: var(--font-sans);
664
- font-size: 12px;
665
- color: var(--foreground);
666
- transition: background-color 0.2s ease-in-out;
667
- }
668
-
669
- .uidex-chip:hover {
670
- background: var(--accent);
671
- }
672
-
673
- .uidex-chip--dimmed {
674
- opacity: 0.4;
675
- }
676
-
677
- .uidex-chip--pages {
678
- color: var(--info);
679
- border-color: color-mix(
680
- in srgb,
681
- var(--info) 30%,
682
- transparent
683
- );
684
- }
685
-
686
- .uidex-chip--features {
687
- color: var(--uidex-feature);
688
- border-color: color-mix(
689
- in srgb,
690
- var(--uidex-feature) 30%,
691
- transparent
692
- );
693
- }
694
-
695
- .uidex-chip--components {
696
- color: var(--uidex-component);
697
- border-color: color-mix(
698
- in srgb,
699
- var(--uidex-component) 30%,
700
- transparent
701
- );
702
- }
703
-
704
- .uidex-chip--blocks {
705
- color: var(--uidex-block);
706
- border-color: color-mix(
707
- in srgb,
708
- var(--uidex-block) 30%,
709
- transparent
710
- );
711
- }
712
-
713
- .uidex-chip-group {
714
- display: flex;
715
- flex-wrap: wrap;
716
- gap: 4px;
717
- }
718
-
719
- .uidex-chip-group--spaced {
720
- margin-bottom: 8px;
721
- }
722
-
723
- /* ============================================================
724
- Separator
725
- ============================================================ */
726
-
727
- .uidex-separator {
728
- background: var(--border);
729
- height: 1px;
730
- width: 100%;
731
- flex-shrink: 0;
732
- }
733
-
734
- .uidex-separator--vertical {
735
- width: 1px;
736
- height: auto;
737
- align-self: stretch;
738
- }
739
-
740
- /* ============================================================
741
- Code block
742
- ============================================================ */
743
-
744
- .uidex-code {
745
- display: block;
746
- font-family: var(--font-mono);
747
- font-size: 14px;
748
- color: var(--foreground);
749
- background: var(--card);
750
- padding: 6px 10px;
751
- border-radius: var(--radius-md);
752
- border: 1px solid var(--border);
753
- word-break: break-all;
754
- }
755
-
756
- .uidex-code--inline {
757
- display: inline;
758
- border: none;
759
- background: none;
760
- padding: 0;
761
- word-break: normal;
762
- }
763
-
764
- /* ============================================================
765
- Label — section heading, muted small text
766
- ============================================================ */
767
-
768
- .uidex-label {
769
- font-size: 12px;
770
- font-weight: 500;
771
- color: var(--muted-foreground);
772
- margin-bottom: 6px;
773
- }
774
-
775
- /* ============================================================
776
- Field — form label + control wrapper
777
- ============================================================ */
778
-
779
- .uidex-field {
780
- display: flex;
781
- flex-direction: column;
782
- gap: 4px;
783
- }
784
-
785
- .uidex-field-label {
786
- font-size: 14px;
787
- font-weight: 500;
788
- color: var(--muted-foreground);
789
- }
790
-
791
- /* ============================================================
792
- Form
793
- ============================================================ */
794
-
795
- .uidex-form {
796
- display: flex;
797
- flex-direction: column;
798
- gap: 12px;
799
- }
800
-
801
- /* ============================================================
802
- Toggle — checkbox + label
803
- ============================================================ */
804
-
805
- .uidex-toggle {
806
- display: inline-flex;
807
- align-items: flex-start;
808
- gap: 8px;
809
- cursor: pointer;
810
- }
811
-
812
- .uidex-toggle-checkbox,
813
- .uidex-checklist-checkbox {
814
- -webkit-appearance: none;
815
- appearance: none;
816
- flex-shrink: 0;
817
- margin: 0;
818
- width: 16px;
819
- height: 16px;
820
- border: 1px solid var(--input);
821
- border-radius: 4px;
822
- background: var(--background);
823
- cursor: pointer;
824
- position: relative;
825
- transition: background-color 0.15s ease-in-out,
826
- border-color 0.15s ease-in-out;
827
- }
828
-
829
- .uidex-toggle-checkbox:checked,
830
- .uidex-checklist-checkbox:checked {
831
- background: var(--primary);
832
- border-color: var(--primary);
833
- }
834
-
835
- .uidex-toggle-checkbox:checked::after,
836
- .uidex-checklist-checkbox:checked::after {
837
- content: '';
838
- position: absolute;
839
- inset: 0;
840
- background: var(--primary-foreground);
841
- -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5.252 12.7 10.2 18.63 18.748 5.37'/%3E%3C/svg%3E");
842
- mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='currentColor' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M5.252 12.7 10.2 18.63 18.748 5.37'/%3E%3C/svg%3E");
843
- -webkit-mask-size: 12px;
844
- mask-size: 12px;
845
- -webkit-mask-repeat: no-repeat;
846
- mask-repeat: no-repeat;
847
- -webkit-mask-position: center;
848
- mask-position: center;
849
- }
850
-
851
- .uidex-toggle-checkbox:focus-visible,
852
- .uidex-checklist-checkbox:focus-visible {
853
- outline: 2px solid var(--ring);
854
- outline-offset: 1px;
855
- }
856
-
857
- .uidex-toggle-text {
858
- font-size: 14px;
859
- line-height: 16px;
860
- font-weight: 500;
861
- color: var(--foreground);
862
- }
863
-
864
- /* ============================================================
865
- Section — content grouping
866
- ============================================================ */
867
-
868
- .uidex-section {
869
- margin-bottom: 12px;
870
- }
871
-
872
- .uidex-section:last-child {
873
- margin-bottom: 0;
874
- }
875
-
876
- .uidex-section--spaced {
877
- margin-top: 12px;
878
- }
879
-
880
- /* ============================================================
881
- Container — fixed position for trigger group
882
- ============================================================ */
883
-
884
- .uidex-container {
885
- position: fixed;
886
- z-index: 2147483644;
887
- pointer-events: auto;
888
- font-family: var(--font-sans);
889
- -webkit-font-smoothing: antialiased;
890
- -moz-osx-font-smoothing: grayscale;
891
- }
892
-
893
- .uidex-bottom-right {
894
- bottom: 20px;
895
- right: 20px;
896
- }
897
- .uidex-bottom-left {
898
- bottom: 20px;
899
- left: 20px;
900
- }
901
- .uidex-top-right {
902
- top: 20px;
903
- right: 20px;
904
- }
905
- .uidex-top-left {
906
- top: 20px;
907
- left: 20px;
908
- }
909
-
910
- /* ============================================================
911
- Trigger button group — COSS outline button group
912
- ============================================================ */
913
-
914
- .uidex-trigger-group {
915
- position: relative;
916
- display: flex;
917
- align-items: center;
918
- border-radius: var(--radius-lg);
919
- background: var(--popover);
920
- border: 1px solid var(--input);
921
- overflow: hidden;
922
- user-select: none;
923
- height: 32px;
924
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
925
- }
926
-
927
- .uidex-trigger-group::before {
928
- content: '';
929
- position: absolute;
930
- inset: 0;
931
- pointer-events: none;
932
- border-radius: calc(var(--radius-lg) - 1px);
933
- box-shadow: 0 -1px var(--border);
934
- }
935
-
936
- .uidex-trigger-btn {
937
- display: flex;
938
- align-items: center;
939
- justify-content: center;
940
- gap: 6px;
941
- height: 100%;
942
- padding: 0 10px;
943
- border: none;
944
- background: transparent;
945
- color: var(--muted-foreground);
946
- font-size: 14px;
947
- font-weight: 500;
948
- font-family: var(--font-sans);
949
- cursor: pointer;
950
- outline: none;
951
- transition:
952
- background-color 0.2s ease-in-out,
953
- color 0.2s ease-in-out;
954
- }
955
-
956
- .uidex-trigger-btn:hover {
957
- background: var(--accent);
958
- color: var(--foreground);
959
- }
960
-
961
- .uidex-trigger-btn:active {
962
- background: var(--input);
963
- }
964
-
965
- .uidex-trigger-btn--active {
966
- color: var(--foreground);
967
- background: var(--input);
968
- }
969
-
970
- .uidex-trigger-btn--active:hover {
971
- background: var(--accent);
972
- }
973
-
974
- .uidex-trigger-btn:focus-visible {
975
- outline: 2px solid var(--ring);
976
- outline-offset: -2px;
977
- }
978
-
979
- .uidex-trigger-icon {
980
- width: 14px;
981
- height: 14px;
982
- flex-shrink: 0;
983
- opacity: 0.8;
984
- }
985
-
986
- .uidex-trigger-divider {
987
- width: 1px;
988
- height: 16px;
989
- background: var(--border);
990
- flex-shrink: 0;
991
- }
992
-
993
- /* Draggable */
994
- .uidex-container--dragging {
995
- transition: none !important;
996
- }
997
-
998
- .uidex-container--dragging .uidex-trigger-btn {
999
- cursor: grabbing !important;
1000
- }
1001
-
1002
- /* ============================================================
1003
- Inspect mode cursor
1004
- ============================================================ */
1005
-
1006
- body.uidex-inspecting,
1007
- body.uidex-inspecting * {
1008
- cursor: crosshair !important;
1009
- }
1010
-
1011
- /* ============================================================
1012
- Sidebar navigation
1013
- ============================================================ */
1014
-
1015
- .uidex-sidebar-back {
1016
- display: flex;
1017
- align-items: center;
1018
- gap: 8px;
1019
- padding: 8px;
1020
- margin: 0;
1021
- border-bottom: 1px solid var(--border);
1022
- font-size: 14px;
1023
- font-weight: 600;
1024
- color: var(--muted-foreground);
1025
- cursor: pointer;
1026
- transition: color 0.2s ease-in-out;
1027
- position: sticky;
1028
- top: 0;
1029
- background: var(--popover);
1030
- z-index: 1;
1031
- }
1032
-
1033
- .uidex-sidebar-back:hover {
1034
- color: var(--foreground);
1035
- }
1036
-
1037
- .uidex-sidebar-back-icon {
1038
- width: 16px;
1039
- height: 16px;
1040
- flex-shrink: 0;
1041
- }
1042
-
1043
- .uidex-sidebar-root-item {
1044
- display: flex;
1045
- align-items: center;
1046
- gap: 8px;
1047
- padding: 8px;
1048
- margin: 0 4px;
1049
- border-radius: var(--radius-lg);
1050
- min-height: 32px;
1051
- font-size: 14px;
1052
- font-weight: 500;
1053
- color: var(--foreground);
1054
- cursor: pointer;
1055
- transition: background-color 0.2s ease-in-out;
1056
- }
1057
-
1058
- .uidex-sidebar-root-item:hover {
1059
- background: var(--accent);
1060
- }
1061
-
1062
- .uidex-sidebar-root-item--active {
1063
- background: var(--input);
1064
- }
1065
-
1066
- .uidex-sidebar-root-label {
1067
- flex: 0 0 auto;
1068
- }
1069
-
1070
- .uidex-sidebar-count {
1071
- font-size: 12px;
1072
- color: var(--muted-foreground);
1073
- font-weight: 400;
1074
- }
1075
-
1076
- .uidex-sidebar-chevron {
1077
- margin-left: auto;
1078
- color: var(--muted-foreground);
1079
- }
1080
-
1081
- .uidex-sidebar-chevron .uidex-icon {
1082
- width: 16px;
1083
- height: 16px;
1084
- }
1085
-
1086
- .uidex-sidebar-item {
1087
- display: flex;
1088
- align-items: center;
1089
- padding: 8px;
1090
- margin: 0 4px;
1091
- border-radius: var(--radius-lg);
1092
- min-height: 32px;
1093
- font-size: 14px;
1094
- color: var(--foreground);
1095
- cursor: pointer;
1096
- transition: background-color 0.2s ease-in-out;
1097
- white-space: nowrap;
1098
- overflow: hidden;
1099
- text-overflow: ellipsis;
1100
- }
1101
-
1102
- .uidex-sidebar-item:hover {
1103
- background: var(--accent);
1104
- }
1105
-
1106
- .uidex-sidebar-item--active {
1107
- background: var(--input);
1108
- color: var(--foreground);
1109
- font-weight: 500;
1110
- }
1111
-
1112
- .uidex-sidebar-item--active:hover {
1113
- background: var(--input);
1114
- }
1115
-
1116
- .uidex-sidebar-item--dimmed {
1117
- opacity: 0.5;
1118
- }
1119
-
1120
- .uidex-sidebar-item--mono {
1121
- font-family: var(--font-mono);
1122
- }
1123
-
1124
- .uidex-sidebar-item--grouped {
1125
- padding-left: 28px;
1126
- }
1127
-
1128
- /* Sidebar category colors */
1129
- .uidex-sidebar-item--pages.uidex-sidebar-item--active {
1130
- color: var(--info);
1131
- }
1132
-
1133
- .uidex-sidebar-item--features.uidex-sidebar-item--active {
1134
- color: var(--uidex-feature);
1135
- }
1136
-
1137
- .uidex-sidebar-item--components.uidex-sidebar-item--active {
1138
- color: var(--uidex-component);
1139
- }
1140
-
1141
- .uidex-sidebar-item--blocks.uidex-sidebar-item--active {
1142
- color: var(--uidex-block);
1143
- }
1144
-
1145
- .uidex-sidebar-root-item--pages .uidex-sidebar-root-label {
1146
- color: var(--info);
1147
- }
1148
-
1149
- .uidex-sidebar-root-item--features .uidex-sidebar-root-label {
1150
- color: var(--uidex-feature);
1151
- }
1152
-
1153
- .uidex-sidebar-root-item--components .uidex-sidebar-root-label {
1154
- color: var(--uidex-component);
1155
- }
1156
-
1157
- .uidex-sidebar-root-item--blocks .uidex-sidebar-root-label {
1158
- color: var(--uidex-block);
1159
- }
1160
-
1161
- .uidex-sidebar-item--block {
1162
- color: var(--uidex-block);
1163
- font-style: italic;
1164
- }
1165
-
1166
- .uidex-sidebar-item--block.uidex-sidebar-item--active {
1167
- color: var(--uidex-block);
1168
- }
1169
-
1170
- /* Sidebar component groups */
1171
- .uidex-sidebar-group-header {
1172
- display: flex;
1173
- align-items: center;
1174
- gap: 8px;
1175
- padding: 8px;
1176
- margin: 0 4px;
1177
- border-radius: var(--radius-lg);
1178
- min-height: 32px;
1179
- font-size: 14px;
1180
- font-weight: 600;
1181
- color: var(--foreground);
1182
- cursor: pointer;
1183
- transition: background-color 0.2s ease-in-out;
1184
- user-select: none;
1185
- }
1186
-
1187
- .uidex-sidebar-group-header:hover {
1188
- background: var(--accent);
1189
- }
1190
-
1191
- .uidex-sidebar-group-chevron {
1192
- font-size: 16px;
1193
- line-height: 1;
1194
- color: var(--muted-foreground);
1195
- width: 16px;
1196
- text-align: center;
1197
- flex-shrink: 0;
1198
- transition: transform 0.2s ease-in-out;
1199
- transform: rotate(0deg);
1200
- }
1201
-
1202
- .uidex-sidebar-group-header--expanded .uidex-sidebar-group-chevron {
1203
- transform: rotate(90deg);
1204
- }
1205
-
1206
- .uidex-sidebar-group-count {
1207
- margin-left: auto;
1208
- font-size: 12px;
1209
- font-weight: 400;
1210
- color: var(--muted-foreground);
1211
- }
1212
-
1213
- /* ============================================================
1214
- Search
1215
- ============================================================ */
1216
-
1217
- /* ============================================================
1218
- Main content
1219
- ============================================================ */
1220
-
1221
- .uidex-main-title {
1222
- margin: 0 0 8px;
1223
- font-size: 20px;
1224
- font-weight: 600;
1225
- line-height: 1;
1226
- color: var(--foreground);
1227
- }
1228
-
1229
- .uidex-main-title--mono {
1230
- font-family: var(--font-mono);
1231
- }
1232
-
1233
- .uidex-absent-notice {
1234
- font-size: 14px;
1235
- color: var(--muted-foreground);
1236
- font-style: italic;
1237
- margin-bottom: 12px;
1238
- }
1239
-
1240
- /* ============================================================
1241
- Page markdown content
1242
- ============================================================ */
1243
-
1244
- .uidex-page-content {
1245
- font-size: 14px;
1246
- line-height: 1.6;
1247
- color: var(--foreground);
1248
- }
1249
-
1250
- .uidex-page-content h2,
1251
- .uidex-page-content h3,
1252
- .uidex-page-content h4,
1253
- .uidex-page-content h5,
1254
- .uidex-page-content h6 {
1255
- margin: 12px 0 6px;
1256
- font-size: 14px;
1257
- font-weight: 600;
1258
- color: var(--foreground);
1259
- }
1260
-
1261
- .uidex-page-content h2 {
1262
- font-size: 16px;
1263
- }
1264
-
1265
- .uidex-page-content p {
1266
- margin: 0 0 8px;
1267
- }
1268
-
1269
- .uidex-checklist {
1270
- list-style: none;
1271
- margin: 0 0 8px;
1272
- padding-left: 0;
1273
- }
1274
-
1275
- .uidex-checklist-item {
1276
- margin-bottom: 4px;
1277
- }
1278
-
1279
- .uidex-checklist-label {
1280
- display: inline-flex;
1281
- align-items: flex-start;
1282
- gap: 8px;
1283
- cursor: pointer;
1284
- font-size: 14px;
1285
- line-height: 16px;
1286
- font-weight: 500;
1287
- color: var(--foreground);
1288
- }
1289
-
1290
- /* checkbox styles in shared .uidex-toggle-checkbox / .uidex-checklist-checkbox block above */
1291
-
1292
- /* ============================================================
1293
- Empty state
1294
- ============================================================ */
1295
-
1296
- .uidex-empty-message {
1297
- padding: 16px 12px;
1298
- color: var(--muted-foreground);
1299
- font-size: 14px;
1300
- text-align: center;
1301
- }
1302
-
1303
- /* ============================================================
1304
- Input group — mirrors COSS InputGroup (input + inline addon)
1305
- ============================================================ */
1306
-
1307
- .uidex-input-group {
1308
- display: inline-flex;
1309
- width: 100%;
1310
- min-width: 0;
1311
- align-items: center;
1312
- border-radius: var(--radius-lg);
1313
- border: 1px solid var(--input);
1314
- background: var(--background);
1315
- font-size: 14px;
1316
- color: var(--foreground);
1317
- margin-bottom: 6px;
1318
- box-shadow: 0 -1px var(--border);
1319
- }
1320
-
1321
- .uidex-input-group:last-child {
1322
- margin-bottom: 0;
1323
- }
1324
-
1325
- .uidex-input-group-text {
1326
- flex: 1;
1327
- min-width: 0;
1328
- height: 30px;
1329
- padding: 0 11px;
1330
- font-size: 14px;
1331
- line-height: 30px;
1332
- word-break: break-all;
1333
- overflow: hidden;
1334
- text-overflow: ellipsis;
1335
- white-space: nowrap;
1336
- }
1337
-
1338
- .uidex-input-group-addon {
1339
- display: flex;
1340
- align-items: center;
1341
- justify-content: center;
1342
- padding-right: 7px;
1343
- flex-shrink: 0;
1344
- }
1345
-
1346
- /* ============================================================
1347
- Environment info
1348
- ============================================================ */
1349
-
1350
- .uidex-env-item {
1351
- font-size: 14px;
1352
- color: var(--muted-foreground);
1353
- line-height: 1.6;
1354
- }
1355
-
1356
- /* ============================================================
1357
- Doc/description text
1358
- ============================================================ */
1359
-
1360
- .uidex-doc {
1361
- margin: 0;
1362
- font-size: 14px;
1363
- line-height: 1.5;
1364
- color: var(--muted-foreground);
1365
- }
1366
-
1367
- .uidex-doc--spaced {
1368
- margin-bottom: 12px;
1369
- }
1370
-
1371
- /* ============================================================
1372
- Header spacer (flex grow to push close button right)
1373
- ============================================================ */
1374
-
1375
- .uidex-header-spacer {
1376
- flex: 1;
1377
- }
1378
-
1379
- /* ============================================================
1380
- Graph visualization
1381
- ============================================================ */
1382
-
1383
- .uidex-graph {
1384
- margin-top: 8px;
1385
- }
1386
-
1387
- .uidex-graph-svg {
1388
- display: block;
1389
- }
1390
-
1391
- .uidex-graph-header {
1392
- font-size: 10px;
1393
- font-weight: 600;
1394
- }
1395
-
1396
- .uidex-graph-header--pages {
1397
- fill: var(--info);
1398
- }
1399
- .uidex-graph-header--features {
1400
- fill: var(--uidex-feature);
1401
- }
1402
- .uidex-graph-header--blocks {
1403
- fill: var(--uidex-block);
1404
- }
1405
- .uidex-graph-header--components {
1406
- fill: var(--uidex-component);
1407
- }
1408
-
1409
- .uidex-graph-node {
1410
- cursor: pointer;
1411
- }
1412
-
1413
- .uidex-graph-node rect {
1414
- fill: var(--card);
1415
- stroke: var(--border);
1416
- stroke-width: 1;
1417
- rx: 6;
1418
- ry: 6;
1419
- }
1420
-
1421
- .uidex-graph-node:hover rect {
1422
- fill: var(--accent);
1423
- }
1424
-
1425
- .uidex-graph-node--page rect {
1426
- stroke: color-mix(
1427
- in srgb,
1428
- var(--info) 50%,
1429
- transparent
1430
- );
1431
- }
1432
- .uidex-graph-node--feature rect {
1433
- stroke: color-mix(
1434
- in srgb,
1435
- var(--uidex-feature) 50%,
1436
- transparent
1437
- );
1438
- }
1439
- .uidex-graph-node--block rect {
1440
- stroke: color-mix(
1441
- in srgb,
1442
- var(--uidex-block) 50%,
1443
- transparent
1444
- );
1445
- }
1446
- .uidex-graph-node--component rect {
1447
- stroke: color-mix(
1448
- in srgb,
1449
- var(--uidex-component) 50%,
1450
- transparent
1451
- );
1452
- }
1453
-
1454
- .uidex-graph-label {
1455
- font-size: 10px;
1456
- font-family: var(--font-mono);
1457
- fill: var(--foreground);
1458
- }
1459
-
1460
- .uidex-graph-edge {
1461
- fill: none;
1462
- stroke-width: 1;
1463
- opacity: 0.3;
1464
- }
1465
-
1466
- .uidex-graph-edge--page {
1467
- stroke: var(--info);
1468
- }
1469
- .uidex-graph-edge--feature {
1470
- stroke: var(--uidex-feature);
1471
- }
1472
- .uidex-graph-edge--block {
1473
- stroke: var(--uidex-block);
1474
- stroke-dasharray: 4 3;
1475
- }
1476
-
1477
- .uidex-graph-svg.uidex-graph--hover .uidex-graph-edge {
1478
- opacity: 0.08;
1479
- }
1480
- .uidex-graph-svg.uidex-graph--hover .uidex-graph-node {
1481
- opacity: 0.3;
1482
- }
1483
- .uidex-graph-svg.uidex-graph--hover .uidex-graph-edge--highlighted {
1484
- opacity: 0.6;
1485
- stroke-width: 1.5;
1486
- }
1487
- .uidex-graph-svg.uidex-graph--hover .uidex-graph-node--highlighted {
1488
- opacity: 1;
1489
- }
1490
-
1491
- .uidex-graph-note {
1492
- font-size: 14px;
1493
- color: var(--muted-foreground);
1494
- margin-top: 12px;
1495
- font-style: italic;
1496
- }
1497
-
1498
- /* ============================================================
1499
- Responsive
1500
- ============================================================ */
1501
-
1502
- @media (max-width: 600px) {
1503
- .uidex-dialog--panel {
1504
- width: auto;
1505
- }
1506
-
1507
- .uidex-panel-body {
1508
- flex-direction: column;
1509
- }
1510
-
1511
- .uidex-panel-sidebar {
1512
- width: auto;
1513
- max-height: 200px;
1514
- border-right: none;
1515
- border-bottom: 1px solid var(--border);
1516
- }
1517
- }
1518
-
1519
- /* ============================================================
1520
- Overlay — renders in document.body outside Shadow DOM.
1521
- All styles set inline in overlay.ts. These classes retained
1522
- for consumers who import style.css standalone.
1523
- ============================================================ */
1524
-
1525
- .uidex-overlay {
1526
- position: fixed;
1527
- pointer-events: none;
1528
- z-index: 2147483645;
1529
- }