uidex 0.0.1 → 0.1.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 (39) hide show
  1. package/README.md +103 -152
  2. package/claude/audit-command.md +16 -0
  3. package/claude/rules.md +88 -0
  4. package/dist/core/index.cjs +3217 -0
  5. package/dist/core/index.cjs.map +1 -0
  6. package/dist/core/index.d.cts +331 -0
  7. package/dist/core/index.d.ts +331 -0
  8. package/dist/core/index.global.js +3199 -0
  9. package/dist/core/index.global.js.map +1 -0
  10. package/dist/core/index.js +3174 -0
  11. package/dist/core/index.js.map +1 -0
  12. package/dist/core/style.css +964 -0
  13. package/dist/index.cjs +3288 -0
  14. package/dist/index.cjs.map +1 -0
  15. package/dist/index.d.cts +74 -0
  16. package/dist/index.d.ts +74 -0
  17. package/dist/index.js +3251 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/playwright/index.cjs +72 -0
  20. package/dist/playwright/index.cjs.map +1 -0
  21. package/dist/playwright/index.d.cts +62 -0
  22. package/dist/playwright/index.d.ts +62 -0
  23. package/dist/playwright/index.js +39 -0
  24. package/dist/playwright/index.js.map +1 -0
  25. package/dist/playwright/reporter.cjs +88 -0
  26. package/dist/playwright/reporter.cjs.map +1 -0
  27. package/dist/playwright/reporter.d.cts +24 -0
  28. package/dist/playwright/reporter.d.ts +24 -0
  29. package/dist/playwright/reporter.js +57 -0
  30. package/dist/playwright/reporter.js.map +1 -0
  31. package/dist/react/index.cjs +3288 -0
  32. package/dist/react/index.cjs.map +1 -0
  33. package/dist/react/index.d.cts +74 -0
  34. package/dist/react/index.d.ts +74 -0
  35. package/dist/react/index.js +3251 -0
  36. package/dist/react/index.js.map +1 -0
  37. package/dist/scripts/cli.cjs +1167 -0
  38. package/package.json +106 -7
  39. package/uidex.schema.json +93 -0
@@ -0,0 +1,964 @@
1
+ /* Design tokens — :host targets the shadow root, :where(:root) for standalone use */
2
+ /* Theme: shadcn lyra — monochromatic, sharp, monospace */
3
+ :where(:host, :root) {
4
+ /* Colors — dark theme (lyra neutral) */
5
+ --uidex-color-primary: #e5e5e5;
6
+ --uidex-color-primary-hover: #ffffff;
7
+ --uidex-color-bg: #1c1c1c;
8
+ --uidex-color-bg-elevated: #2e2e2e;
9
+ --uidex-color-text: #f9f9f9;
10
+ --uidex-color-text-strong: #ffffff;
11
+ --uidex-color-text-muted: #ababab; /* chrome: labels, counts, placeholders */
12
+ --uidex-color-text-secondary: #ababab; /* content: doc text, descriptions */
13
+ --uidex-color-surface-hover: rgba(255, 255, 255, 0.08);
14
+ --uidex-color-surface-active: rgba(255, 255, 255, 0.12);
15
+ --uidex-color-border: rgba(255, 255, 255, 0.1);
16
+ --uidex-color-border-light: rgba(255, 255, 255, 0.06);
17
+ --uidex-color-backdrop: rgba(0, 0, 0, 0.6);
18
+
19
+ /* Category colors */
20
+ --uidex-color-pages: #60a5fa;
21
+ --uidex-color-features: #a78bfa;
22
+ --uidex-color-components: #34d399;
23
+
24
+ /* Shadows — minimal, border-driven definition */
25
+ --uidex-shadow-sm: none;
26
+ --uidex-shadow-md: 0 0 0 1px var(--uidex-color-border);
27
+ --uidex-shadow-lg: 0 0 0 1px var(--uidex-color-border);
28
+
29
+ /* Border radius — lyra: none */
30
+ --uidex-radius-sm: 0;
31
+ --uidex-radius-md: 0;
32
+ --uidex-radius-lg: 0;
33
+ --uidex-radius-full: 0;
34
+
35
+ /* Z-index — high enough to stay above app UI */
36
+ --uidex-z-container: 2147483644;
37
+ --uidex-z-overlay: 2147483645;
38
+ --uidex-z-modal: 2147483646;
39
+
40
+ /* Typography — mono-first (lyra). Both stacks are mono by default;
41
+ consumers can override --uidex-font-sans to restore a proportional body font. */
42
+ --uidex-font-sans: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
43
+ --uidex-font-mono: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, monospace;
44
+ --uidex-font-size-xs: 11px;
45
+ --uidex-font-size-sm: 12px;
46
+ --uidex-font-size-md: 13px;
47
+ --uidex-font-size-lg: 14px;
48
+
49
+ /* Transitions */
50
+ --uidex-transition-fast: 0.1s ease;
51
+ --uidex-transition-normal: 0.15s ease;
52
+ --uidex-transition-smooth: 0.2s ease;
53
+ }
54
+
55
+ /* ——— Container ——— */
56
+ .uidex-container {
57
+ position: fixed;
58
+ z-index: var(--uidex-z-container);
59
+ pointer-events: auto;
60
+ font-family: var(--uidex-font-sans);
61
+ -webkit-font-smoothing: antialiased;
62
+ -moz-osx-font-smoothing: grayscale;
63
+ }
64
+
65
+ .uidex-bottom-right { bottom: 20px; right: 20px; }
66
+ .uidex-bottom-left { bottom: 20px; left: 20px; }
67
+ .uidex-top-right { top: 20px; right: 20px; }
68
+ .uidex-top-left { top: 20px; left: 20px; }
69
+
70
+ /* ——— Trigger button group ——— */
71
+ .uidex-trigger-group {
72
+ display: flex;
73
+ align-items: center;
74
+ border-radius: 0;
75
+ background: var(--uidex-color-bg);
76
+ border: 1px solid var(--uidex-color-border);
77
+ overflow: hidden;
78
+ user-select: none;
79
+ height: 32px;
80
+ }
81
+
82
+ .uidex-trigger-group:hover {
83
+ border-color: rgba(255, 255, 255, 0.16);
84
+ }
85
+
86
+ .uidex-trigger-btn {
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ gap: 6px;
91
+ height: 100%;
92
+ padding: 0 10px;
93
+ border: none;
94
+ background: transparent;
95
+ color: var(--uidex-color-text-muted);
96
+ font-size: var(--uidex-font-size-sm);
97
+ font-weight: 500;
98
+ font-family: var(--uidex-font-mono);
99
+ cursor: pointer;
100
+ transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast);
101
+ }
102
+
103
+ .uidex-trigger-btn:hover {
104
+ background: var(--uidex-color-surface-hover);
105
+ color: var(--uidex-color-text-strong);
106
+ }
107
+
108
+ .uidex-trigger-btn:active {
109
+ background: var(--uidex-color-surface-active);
110
+ transform: translateY(1px);
111
+ }
112
+
113
+ .uidex-trigger-btn--active {
114
+ color: var(--uidex-color-text-strong);
115
+ background: var(--uidex-color-surface-active);
116
+ }
117
+
118
+ .uidex-trigger-btn--active:hover {
119
+ background: rgba(255, 255, 255, 0.16);
120
+ }
121
+
122
+ .uidex-trigger-divider {
123
+ width: 1px;
124
+ height: 16px;
125
+ background: var(--uidex-color-border);
126
+ flex-shrink: 0;
127
+ }
128
+
129
+ .uidex-trigger-icon {
130
+ width: 14px;
131
+ height: 14px;
132
+ flex-shrink: 0;
133
+ }
134
+
135
+ /* ——— Draggable ——— */
136
+ .uidex-container--dragging {
137
+ transition: none !important;
138
+ }
139
+
140
+ .uidex-container--dragging .uidex-trigger-btn {
141
+ cursor: grabbing !important;
142
+ }
143
+
144
+ /* ——— Inspect mode cursor ——— */
145
+ body.uidex-inspecting,
146
+ body.uidex-inspecting * {
147
+ cursor: crosshair !important;
148
+ }
149
+
150
+ /* ——— Modal ——— */
151
+ .uidex-modal-backdrop {
152
+ position: fixed;
153
+ inset: 0;
154
+ z-index: var(--uidex-z-modal);
155
+ pointer-events: auto;
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: center;
159
+ background: var(--uidex-color-backdrop);
160
+ }
161
+
162
+ .uidex-modal {
163
+ background: var(--uidex-color-bg);
164
+ border: 1px solid var(--uidex-color-border);
165
+ border-radius: 0;
166
+ max-width: calc(100vw - 32px);
167
+ max-height: calc(100vh - 64px);
168
+ font-family: var(--uidex-font-sans);
169
+ }
170
+
171
+ .uidex-modal-header {
172
+ display: flex;
173
+ align-items: center;
174
+ gap: 12px;
175
+ padding: 12px 16px;
176
+ border-bottom: 1px solid var(--uidex-color-border);
177
+ }
178
+
179
+ .uidex-modal-title {
180
+ margin: 0;
181
+ font-size: var(--uidex-font-size-sm);
182
+ font-weight: 600;
183
+ color: var(--uidex-color-text-strong);
184
+ font-family: var(--uidex-font-mono);
185
+ text-transform: uppercase;
186
+ letter-spacing: 0.05em;
187
+ }
188
+
189
+ .uidex-modal-close {
190
+ display: flex;
191
+ align-items: center;
192
+ justify-content: center;
193
+ width: 28px;
194
+ height: 28px;
195
+ border: 1px solid transparent;
196
+ border-radius: 0;
197
+ background: transparent;
198
+ color: var(--uidex-color-text-muted);
199
+ font-size: 18px;
200
+ cursor: pointer;
201
+ transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast), border-color var(--uidex-transition-fast);
202
+ }
203
+
204
+ .uidex-modal-close:hover {
205
+ background: var(--uidex-color-surface-hover);
206
+ border-color: var(--uidex-color-border);
207
+ color: var(--uidex-color-text-strong);
208
+ }
209
+
210
+ .uidex-modal-close:active {
211
+ transform: translateY(1px);
212
+ }
213
+
214
+ .uidex-modal-body {
215
+ padding: 12px 16px;
216
+ }
217
+
218
+ .uidex-modal-section {
219
+ margin-bottom: 12px;
220
+ }
221
+
222
+ .uidex-modal-section:last-child {
223
+ margin-bottom: 0;
224
+ }
225
+
226
+ .uidex-modal-label {
227
+ font-size: var(--uidex-font-size-xs);
228
+ font-weight: 600;
229
+ text-transform: uppercase;
230
+ letter-spacing: 0.06em;
231
+ color: var(--uidex-color-text-muted);
232
+ margin-bottom: 6px;
233
+ }
234
+
235
+ .uidex-modal-section--spaced {
236
+ margin-top: 12px;
237
+ }
238
+
239
+ .uidex-modal-doc {
240
+ margin: 0;
241
+ font-size: var(--uidex-font-size-sm);
242
+ line-height: 1.5;
243
+ color: var(--uidex-color-text-secondary);
244
+ }
245
+
246
+ .uidex-modal-code {
247
+ display: block;
248
+ font-family: var(--uidex-font-mono);
249
+ font-size: var(--uidex-font-size-sm);
250
+ color: var(--uidex-color-text);
251
+ background: var(--uidex-color-bg-elevated);
252
+ padding: 6px 10px;
253
+ border-radius: 0;
254
+ border: 1px solid var(--uidex-color-border);
255
+ word-break: break-all;
256
+ }
257
+
258
+ .uidex-modal-location {
259
+ display: flex;
260
+ align-items: center;
261
+ gap: 8px;
262
+ margin-bottom: 6px;
263
+ }
264
+
265
+ .uidex-modal-location:last-child {
266
+ margin-bottom: 0;
267
+ }
268
+
269
+ .uidex-modal-location .uidex-modal-code {
270
+ flex: 1;
271
+ min-width: 0;
272
+ }
273
+
274
+ .uidex-modal-copy {
275
+ flex-shrink: 0;
276
+ padding: 4px 10px;
277
+ border: 1px solid var(--uidex-color-border);
278
+ border-radius: 0;
279
+ background: var(--uidex-color-bg-elevated);
280
+ color: var(--uidex-color-text-secondary);
281
+ font-size: var(--uidex-font-size-sm);
282
+ font-weight: 500;
283
+ font-family: var(--uidex-font-mono);
284
+ cursor: pointer;
285
+ transition: background-color var(--uidex-transition-fast), color var(--uidex-transition-fast);
286
+ white-space: nowrap;
287
+ }
288
+
289
+ .uidex-modal-copy:hover {
290
+ background: var(--uidex-color-surface-hover);
291
+ color: var(--uidex-color-text-strong);
292
+ }
293
+
294
+ .uidex-modal-copy:active {
295
+ transform: translateY(1px);
296
+ }
297
+
298
+ .uidex-modal-env-item {
299
+ font-size: var(--uidex-font-size-sm);
300
+ color: var(--uidex-color-text-secondary);
301
+ line-height: 1.6;
302
+ }
303
+
304
+ .uidex-empty-message {
305
+ padding: 16px 12px;
306
+ color: var(--uidex-color-text-muted);
307
+ font-size: var(--uidex-font-size-sm);
308
+ text-align: center;
309
+ }
310
+
311
+ /* ——— Panel layout (sidebar modal) ——— */
312
+ .uidex-modal--panel {
313
+ width: calc(100vw - 32px);
314
+ max-width: 720px;
315
+ height: calc(100vh - 64px);
316
+ max-height: 600px;
317
+ display: flex;
318
+ flex-direction: column;
319
+ overflow: hidden;
320
+ }
321
+
322
+ .uidex-panel-body {
323
+ display: flex;
324
+ flex: 1;
325
+ min-height: 0;
326
+ }
327
+
328
+ .uidex-panel-sidebar {
329
+ width: 200px;
330
+ flex-shrink: 0;
331
+ border-right: 1px solid var(--uidex-color-border);
332
+ overflow-y: auto;
333
+ padding: 0;
334
+ scrollbar-width: thin;
335
+ scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
336
+ }
337
+
338
+ .uidex-panel-sidebar::-webkit-scrollbar {
339
+ width: 6px;
340
+ }
341
+
342
+ .uidex-panel-sidebar::-webkit-scrollbar-track {
343
+ background: transparent;
344
+ }
345
+
346
+ .uidex-panel-sidebar::-webkit-scrollbar-thumb {
347
+ background: rgba(255, 255, 255, 0.1);
348
+ border-radius: 0;
349
+ }
350
+
351
+ .uidex-panel-main {
352
+ flex: 1;
353
+ min-width: 0;
354
+ overflow-y: auto;
355
+ padding: 16px 20px;
356
+ scrollbar-width: thin;
357
+ scrollbar-color: rgba(255, 255, 255, 0.1) transparent;
358
+ }
359
+
360
+ .uidex-panel-main::-webkit-scrollbar {
361
+ width: 6px;
362
+ }
363
+
364
+ .uidex-panel-main::-webkit-scrollbar-track {
365
+ background: transparent;
366
+ }
367
+
368
+ .uidex-panel-main::-webkit-scrollbar-thumb {
369
+ background: rgba(255, 255, 255, 0.1);
370
+ border-radius: 0;
371
+ }
372
+
373
+ /* ——— Sidebar navigation ——— */
374
+ .uidex-sidebar-back {
375
+ display: flex;
376
+ align-items: center;
377
+ gap: 6px;
378
+ padding: 6px 8px;
379
+ margin: 0;
380
+ border-bottom: 1px solid var(--uidex-color-border);
381
+ font-size: var(--uidex-font-size-sm);
382
+ font-weight: 600;
383
+ color: var(--uidex-color-text-secondary);
384
+ cursor: pointer;
385
+ transition: color var(--uidex-transition-fast);
386
+ position: sticky;
387
+ top: 0;
388
+ background: var(--uidex-color-bg);
389
+ z-index: 1;
390
+ }
391
+
392
+ .uidex-sidebar-back:hover {
393
+ color: var(--uidex-color-text-strong);
394
+ }
395
+
396
+ .uidex-sidebar-back-arrow {
397
+ font-size: 16px;
398
+ line-height: 1;
399
+ }
400
+
401
+ .uidex-sidebar-root-item {
402
+ display: flex;
403
+ align-items: center;
404
+ gap: 6px;
405
+ padding: 6px 10px;
406
+ border-radius: 0;
407
+ font-size: var(--uidex-font-size-sm);
408
+ font-weight: 500;
409
+ color: var(--uidex-color-text);
410
+ cursor: pointer;
411
+ transition: background-color var(--uidex-transition-fast);
412
+ }
413
+
414
+ .uidex-sidebar-root-item:hover {
415
+ background: var(--uidex-color-surface-hover);
416
+ }
417
+
418
+ .uidex-sidebar-root-label {
419
+ flex: 0 0 auto;
420
+ }
421
+
422
+ .uidex-sidebar-count {
423
+ font-size: var(--uidex-font-size-xs);
424
+ color: var(--uidex-color-text-muted);
425
+ font-weight: 400;
426
+ }
427
+
428
+ .uidex-sidebar-chevron {
429
+ margin-left: auto;
430
+ font-size: 16px;
431
+ line-height: 1;
432
+ color: var(--uidex-color-text-muted);
433
+ }
434
+
435
+ .uidex-sidebar-item {
436
+ padding: 4px 10px;
437
+ border-radius: 0;
438
+ font-size: var(--uidex-font-size-sm);
439
+ color: var(--uidex-color-text);
440
+ cursor: pointer;
441
+ transition: background-color var(--uidex-transition-fast);
442
+ white-space: nowrap;
443
+ overflow: hidden;
444
+ text-overflow: ellipsis;
445
+ }
446
+
447
+ .uidex-sidebar-item:hover {
448
+ background: var(--uidex-color-surface-hover);
449
+ }
450
+
451
+ .uidex-sidebar-item--active {
452
+ background: var(--uidex-color-surface-active);
453
+ color: var(--uidex-color-text-strong);
454
+ }
455
+
456
+ .uidex-sidebar-item--active:hover {
457
+ background: var(--uidex-color-surface-active);
458
+ }
459
+
460
+ .uidex-sidebar-item--dimmed {
461
+ opacity: 0.5;
462
+ }
463
+
464
+ .uidex-sidebar-item--mono {
465
+ font-family: var(--uidex-font-mono);
466
+ }
467
+
468
+ .uidex-sidebar-item--grouped {
469
+ padding-left: 24px;
470
+ }
471
+
472
+ /* Sidebar category colors */
473
+ .uidex-sidebar-item--pages.uidex-sidebar-item--active {
474
+ color: var(--uidex-color-pages);
475
+ }
476
+
477
+ .uidex-sidebar-item--features.uidex-sidebar-item--active {
478
+ color: var(--uidex-color-features);
479
+ }
480
+
481
+ .uidex-sidebar-item--components.uidex-sidebar-item--active {
482
+ color: var(--uidex-color-components);
483
+ }
484
+
485
+ .uidex-sidebar-root-item--pages .uidex-sidebar-root-label {
486
+ color: var(--uidex-color-pages);
487
+ }
488
+
489
+ .uidex-sidebar-root-item--features .uidex-sidebar-root-label {
490
+ color: var(--uidex-color-features);
491
+ }
492
+
493
+ .uidex-sidebar-root-item--components .uidex-sidebar-root-label {
494
+ color: var(--uidex-color-components);
495
+ }
496
+
497
+ /* ——— Sidebar component groups ——— */
498
+ .uidex-sidebar-group-header {
499
+ display: flex;
500
+ align-items: center;
501
+ gap: 4px;
502
+ padding: 4px 10px;
503
+ border-radius: 0;
504
+ font-size: var(--uidex-font-size-sm);
505
+ font-weight: 600;
506
+ color: var(--uidex-color-text);
507
+ cursor: pointer;
508
+ transition: background-color var(--uidex-transition-fast);
509
+ user-select: none;
510
+ }
511
+
512
+ .uidex-sidebar-group-header:hover {
513
+ background: var(--uidex-color-surface-hover);
514
+ }
515
+
516
+ .uidex-sidebar-group-chevron {
517
+ font-size: 14px;
518
+ line-height: 1;
519
+ color: var(--uidex-color-text-muted);
520
+ width: 14px;
521
+ text-align: center;
522
+ flex-shrink: 0;
523
+ transition: transform var(--uidex-transition-normal);
524
+ transform: rotate(0deg);
525
+ }
526
+
527
+ .uidex-sidebar-group-header--expanded .uidex-sidebar-group-chevron {
528
+ transform: rotate(90deg);
529
+ }
530
+
531
+ .uidex-sidebar-group-count {
532
+ margin-left: auto;
533
+ font-size: var(--uidex-font-size-xs);
534
+ font-weight: 400;
535
+ color: var(--uidex-color-text-muted);
536
+ }
537
+
538
+ /* ——— Search ——— */
539
+ .uidex-search-input {
540
+ flex: 1;
541
+ min-width: 0;
542
+ padding: 4px 8px;
543
+ border: 1px solid var(--uidex-color-border);
544
+ border-radius: 0;
545
+ background: transparent;
546
+ color: var(--uidex-color-text);
547
+ font-size: var(--uidex-font-size-sm);
548
+ font-family: var(--uidex-font-mono);
549
+ outline: none;
550
+ box-sizing: border-box;
551
+ }
552
+
553
+ .uidex-search-input::placeholder {
554
+ color: var(--uidex-color-text-muted);
555
+ }
556
+
557
+ .uidex-search-input:focus {
558
+ border-color: rgba(255, 255, 255, 0.3);
559
+ }
560
+
561
+ .uidex-search-group-label {
562
+ padding: 8px 10px 2px;
563
+ font-size: var(--uidex-font-size-xs);
564
+ font-weight: 600;
565
+ text-transform: uppercase;
566
+ letter-spacing: 0.06em;
567
+ color: var(--uidex-color-text-muted);
568
+ }
569
+
570
+ .uidex-search-group-label--pages { color: var(--uidex-color-pages); }
571
+ .uidex-search-group-label--features { color: var(--uidex-color-features); }
572
+ .uidex-search-group-label--components { color: var(--uidex-color-components); }
573
+
574
+ .uidex-search-empty {
575
+ padding: 20px 10px;
576
+ font-size: var(--uidex-font-size-sm);
577
+ color: var(--uidex-color-text-muted);
578
+ text-align: center;
579
+ }
580
+
581
+ .uidex-sidebar-divider {
582
+ height: 1px;
583
+ background: var(--uidex-color-border);
584
+ margin: 4px 10px;
585
+ }
586
+
587
+ .uidex-sidebar-root-item--active {
588
+ background: var(--uidex-color-surface-active);
589
+ }
590
+
591
+ /* ——— Main content ——— */
592
+ .uidex-main-title {
593
+ margin: 0 0 8px;
594
+ font-size: var(--uidex-font-size-lg);
595
+ font-weight: 600;
596
+ color: var(--uidex-color-text-strong);
597
+ }
598
+
599
+ .uidex-main-title--mono {
600
+ font-family: var(--uidex-font-mono);
601
+ color: var(--uidex-color-text-strong);
602
+ }
603
+
604
+ .uidex-main-divider {
605
+ height: 1px;
606
+ background: var(--uidex-color-border);
607
+ margin: 16px 0;
608
+ }
609
+
610
+ .uidex-absent-notice {
611
+ font-size: var(--uidex-font-size-sm);
612
+ color: var(--uidex-color-text-muted);
613
+ font-style: italic;
614
+ margin-bottom: 12px;
615
+ }
616
+
617
+ /* ——— Page content in modal ——— */
618
+ .uidex-page-content {
619
+ font-size: var(--uidex-font-size-sm);
620
+ line-height: 1.6;
621
+ color: var(--uidex-color-text);
622
+ }
623
+
624
+ .uidex-page-content h2,
625
+ .uidex-page-content h3,
626
+ .uidex-page-content h4,
627
+ .uidex-page-content h5,
628
+ .uidex-page-content h6 {
629
+ margin: 12px 0 6px;
630
+ font-size: var(--uidex-font-size-sm);
631
+ font-weight: 600;
632
+ color: var(--uidex-color-text-strong);
633
+ text-transform: uppercase;
634
+ letter-spacing: 0.04em;
635
+ }
636
+
637
+ .uidex-page-content h2 {
638
+ font-size: var(--uidex-font-size-md);
639
+ }
640
+
641
+ .uidex-page-content p {
642
+ margin: 0 0 8px;
643
+ }
644
+
645
+ .uidex-checklist {
646
+ list-style: none;
647
+ margin: 0 0 8px;
648
+ padding-left: 0;
649
+ }
650
+
651
+ .uidex-checklist-item {
652
+ margin-bottom: 4px;
653
+ }
654
+
655
+ .uidex-checklist-label {
656
+ display: flex;
657
+ align-items: baseline;
658
+ gap: 8px;
659
+ cursor: pointer;
660
+ }
661
+
662
+ .uidex-checklist-checkbox {
663
+ flex-shrink: 0;
664
+ margin: 0;
665
+ accent-color: var(--uidex-color-text-strong);
666
+ }
667
+
668
+ /* ——— Chips ——— */
669
+ .uidex-chips {
670
+ display: flex;
671
+ flex-wrap: wrap;
672
+ gap: 4px;
673
+ }
674
+
675
+ .uidex-chip {
676
+ display: inline-block;
677
+ padding: 2px 8px;
678
+ border-radius: 0;
679
+ background: transparent;
680
+ border: 1px solid var(--uidex-color-border);
681
+ font-family: var(--uidex-font-mono);
682
+ font-size: var(--uidex-font-size-xs);
683
+ color: var(--uidex-color-text);
684
+ transition: background-color var(--uidex-transition-fast);
685
+ }
686
+
687
+ .uidex-chip:hover {
688
+ background: var(--uidex-color-surface-hover);
689
+ }
690
+
691
+ .uidex-chip--absent {
692
+ opacity: 0.4;
693
+ }
694
+
695
+ .uidex-chip--pages {
696
+ color: var(--uidex-color-pages);
697
+ border-color: color-mix(in srgb, var(--uidex-color-pages) 30%, transparent);
698
+ }
699
+
700
+ .uidex-chip--features {
701
+ color: var(--uidex-color-features);
702
+ border-color: color-mix(in srgb, var(--uidex-color-features) 30%, transparent);
703
+ }
704
+
705
+ .uidex-chip--components {
706
+ color: var(--uidex-color-components);
707
+ border-color: color-mix(in srgb, var(--uidex-color-components) 30%, transparent);
708
+ }
709
+
710
+ /* ——— Category badges ——— */
711
+ .uidex-badge {
712
+ display: inline-block;
713
+ padding: 2px 8px;
714
+ border-radius: 0;
715
+ border: 1px solid var(--uidex-color-border);
716
+ background: transparent;
717
+ color: var(--uidex-color-text-muted);
718
+ font-size: var(--uidex-font-size-xs);
719
+ font-weight: 600;
720
+ text-transform: uppercase;
721
+ letter-spacing: 0.06em;
722
+ margin-bottom: 12px;
723
+ }
724
+
725
+ .uidex-badge--pages {
726
+ color: var(--uidex-color-pages);
727
+ border-color: color-mix(in srgb, var(--uidex-color-pages) 30%, transparent);
728
+ }
729
+
730
+ .uidex-badge--features {
731
+ color: var(--uidex-color-features);
732
+ border-color: color-mix(in srgb, var(--uidex-color-features) 30%, transparent);
733
+ }
734
+
735
+ .uidex-badge--components {
736
+ color: var(--uidex-color-components);
737
+ border-color: color-mix(in srgb, var(--uidex-color-components) 30%, transparent);
738
+ }
739
+
740
+ /* ——— Feedback modal ——— */
741
+ .uidex-modal--feedback {
742
+ width: calc(100vw - 32px);
743
+ max-width: 400px;
744
+ }
745
+
746
+ .uidex-modal-code--inline {
747
+ border: none;
748
+ background: none;
749
+ padding: 0;
750
+ }
751
+
752
+ .uidex-header-spacer {
753
+ flex: 1;
754
+ }
755
+
756
+ .uidex-chips--spaced {
757
+ margin-bottom: 8px;
758
+ }
759
+
760
+ .uidex-modal-doc--spaced {
761
+ margin-bottom: 12px;
762
+ }
763
+
764
+ /* ——— Feedback form ——— */
765
+ .uidex-form {
766
+ display: flex;
767
+ flex-direction: column;
768
+ gap: 12px;
769
+ }
770
+
771
+ .uidex-form-group {
772
+ display: flex;
773
+ flex-direction: column;
774
+ gap: 4px;
775
+ }
776
+
777
+ .uidex-form-label {
778
+ font-size: var(--uidex-font-size-xs);
779
+ font-weight: 600;
780
+ text-transform: uppercase;
781
+ letter-spacing: 0.06em;
782
+ color: var(--uidex-color-text-muted);
783
+ }
784
+
785
+ .uidex-form-select {
786
+ appearance: none;
787
+ padding: 6px 10px;
788
+ border: 1px solid var(--uidex-color-border);
789
+ border-radius: 0;
790
+ background: transparent;
791
+ color: var(--uidex-color-text);
792
+ font-size: var(--uidex-font-size-sm);
793
+ font-family: var(--uidex-font-mono);
794
+ cursor: pointer;
795
+ outline: none;
796
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23ababab' d='M3 5l3 3 3-3'/%3E%3C/svg%3E");
797
+ background-repeat: no-repeat;
798
+ background-position: right 8px center;
799
+ padding-right: 26px;
800
+ }
801
+
802
+ .uidex-form-select:focus {
803
+ border-color: rgba(255, 255, 255, 0.3);
804
+ }
805
+
806
+ .uidex-form-textarea {
807
+ padding: 8px 10px;
808
+ border: 1px solid var(--uidex-color-border);
809
+ border-radius: 0;
810
+ background: transparent;
811
+ color: var(--uidex-color-text);
812
+ font-size: var(--uidex-font-size-sm);
813
+ font-family: var(--uidex-font-mono);
814
+ line-height: 1.5;
815
+ resize: vertical;
816
+ outline: none;
817
+ min-height: 80px;
818
+ }
819
+
820
+ .uidex-form-textarea::placeholder {
821
+ color: var(--uidex-color-text-muted);
822
+ }
823
+
824
+ .uidex-form-textarea:focus {
825
+ border-color: rgba(255, 255, 255, 0.3);
826
+ }
827
+
828
+ .uidex-form-submit {
829
+ padding: 6px 16px;
830
+ border: 1px solid var(--uidex-color-border);
831
+ border-radius: 0;
832
+ background: var(--uidex-color-primary);
833
+ color: var(--uidex-color-bg);
834
+ font-size: var(--uidex-font-size-sm);
835
+ font-weight: 600;
836
+ font-family: var(--uidex-font-mono);
837
+ cursor: pointer;
838
+ transition: background-color var(--uidex-transition-fast);
839
+ align-self: flex-end;
840
+ }
841
+
842
+ .uidex-form-submit:hover {
843
+ background: var(--uidex-color-primary-hover);
844
+ }
845
+
846
+ .uidex-form-submit:active {
847
+ transform: translateY(1px);
848
+ }
849
+
850
+ .uidex-form-submit:disabled {
851
+ opacity: 0.5;
852
+ cursor: default;
853
+ }
854
+
855
+ /* ——— Form toggle ——— */
856
+ .uidex-form-toggle {
857
+ display: flex;
858
+ align-items: center;
859
+ gap: 8px;
860
+ cursor: pointer;
861
+ }
862
+
863
+ .uidex-form-checkbox {
864
+ flex-shrink: 0;
865
+ margin: 0;
866
+ accent-color: var(--uidex-color-text-strong);
867
+ }
868
+
869
+ .uidex-form-toggle-text {
870
+ font-size: var(--uidex-font-size-sm);
871
+ color: var(--uidex-color-text-secondary);
872
+ }
873
+
874
+ /* ——— Responsive ——— */
875
+ @media (max-width: 600px) {
876
+ .uidex-modal--panel {
877
+ width: auto;
878
+ }
879
+
880
+ .uidex-panel-body {
881
+ flex-direction: column;
882
+ }
883
+
884
+ .uidex-panel-sidebar {
885
+ width: auto;
886
+ max-height: 200px;
887
+ border-right: none;
888
+ border-bottom: 1px solid var(--uidex-color-border);
889
+ }
890
+ }
891
+
892
+ /* ——— Graph ——— */
893
+ .uidex-graph {
894
+ margin-top: 8px;
895
+ }
896
+
897
+ .uidex-graph-svg {
898
+ display: block;
899
+ }
900
+
901
+ .uidex-graph-header {
902
+ font-size: 10px;
903
+ font-weight: 600;
904
+ letter-spacing: 0.08em;
905
+ }
906
+
907
+ .uidex-graph-header--pages { fill: var(--uidex-color-pages); }
908
+ .uidex-graph-header--features { fill: var(--uidex-color-features); }
909
+ .uidex-graph-header--components { fill: var(--uidex-color-components); }
910
+
911
+ .uidex-graph-node {
912
+ cursor: pointer;
913
+ }
914
+
915
+ .uidex-graph-node rect {
916
+ fill: var(--uidex-color-bg-elevated);
917
+ stroke: var(--uidex-color-border);
918
+ stroke-width: 1;
919
+ }
920
+
921
+ .uidex-graph-node:hover rect {
922
+ fill: var(--uidex-color-surface-hover);
923
+ }
924
+
925
+ .uidex-graph-node--page rect { stroke: color-mix(in srgb, var(--uidex-color-pages) 50%, transparent); }
926
+ .uidex-graph-node--feature rect { stroke: color-mix(in srgb, var(--uidex-color-features) 50%, transparent); }
927
+ .uidex-graph-node--component rect { stroke: color-mix(in srgb, var(--uidex-color-components) 50%, transparent); }
928
+
929
+ .uidex-graph-label {
930
+ font-size: 10px;
931
+ font-family: var(--uidex-font-mono);
932
+ fill: var(--uidex-color-text);
933
+ }
934
+
935
+ .uidex-graph-edge {
936
+ fill: none;
937
+ stroke-width: 1;
938
+ opacity: 0.3;
939
+ }
940
+
941
+ .uidex-graph-edge--page { stroke: var(--uidex-color-pages); }
942
+ .uidex-graph-edge--feature { stroke: var(--uidex-color-features); }
943
+
944
+ .uidex-graph-svg.uidex-graph--hover .uidex-graph-edge { opacity: 0.08; }
945
+ .uidex-graph-svg.uidex-graph--hover .uidex-graph-node { opacity: 0.3; }
946
+ .uidex-graph-svg.uidex-graph--hover .uidex-graph-edge--highlighted { opacity: 0.6; stroke-width: 1.5; }
947
+ .uidex-graph-svg.uidex-graph--hover .uidex-graph-node--highlighted { opacity: 1; }
948
+
949
+ .uidex-graph-note {
950
+ font-size: var(--uidex-font-size-sm);
951
+ color: var(--uidex-color-text-muted);
952
+ margin-top: 12px;
953
+ font-style: italic;
954
+ }
955
+
956
+ /* ——— Overlay ———
957
+ NOTE: The overlay renders in document.body (outside the Shadow DOM)
958
+ so all its styles are set inline in overlay.ts. These CSS classes
959
+ are retained only for consumers who import style.css standalone. */
960
+ .uidex-overlay {
961
+ position: fixed;
962
+ pointer-events: none;
963
+ z-index: 2147483645;
964
+ }