react-native-bundle-discovery-ui 2.8.0 → 2.9.1

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 (40) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +12 -255
  3. package/assets/global.css +1606 -105
  4. package/dist/bin.js +63 -20
  5. package/dist/client/fonts.js +45 -0
  6. package/dist/client/issues.js +5 -0
  7. package/dist/client/pages/_common.js +279 -98
  8. package/dist/client/pages/_module.js +347 -0
  9. package/dist/client/pages/default.js +144 -63
  10. package/dist/client/pages/module.js +2 -309
  11. package/dist/client/pages/moduleDiff.js +76 -0
  12. package/dist/client/pages/package.js +172 -154
  13. package/dist/client/prepare.js +15 -0
  14. package/dist/client/queryHelpers.js +487 -91
  15. package/dist/client/sizeHeat.js +7 -0
  16. package/dist/client/views/{_theme.js → _colorScheme.js} +2 -9
  17. package/dist/client/views/_html.js +52 -0
  18. package/dist/client/views/codeDiff.js +66 -0
  19. package/dist/client/views/compare.js +237 -0
  20. package/dist/client/views/importGraph.js +255 -0
  21. package/dist/client/views/insights.js +81 -0
  22. package/dist/client/views/moduleOverview.js +122 -0
  23. package/dist/client/views/packageOverview.js +116 -0
  24. package/dist/client/views/persistedFilterInput.js +27 -0
  25. package/dist/client/views/reportBar.js +89 -0
  26. package/dist/client/views/treemap.js +598 -0
  27. package/dist/discoveryrc.js +27 -7
  28. package/dist/rsdoctor.js +19 -99
  29. package/dist/src-DV3VzcQY.js +1548 -0
  30. package/package.json +9 -5
  31. package/assets/highcharts.css +0 -1
  32. package/dist/client/_virtual/_rolldown/runtime.js +0 -37
  33. package/dist/client/views/foamtree.js +0 -103
  34. package/dist/client/views/highcharts.js +0 -33
  35. package/dist/src-DPAqywOJ.js +0 -201
  36. package/vendors/foamtree.js +0 -9008
  37. package/vendors/high-contrast-dark.js +0 -1
  38. package/vendors/highcharts-exporting.js +0 -13
  39. package/vendors/highcharts-networkgraph.js +0 -1
  40. package/vendors/highcharts.js +0 -10
package/assets/global.css CHANGED
@@ -1,128 +1,1074 @@
1
+ /*
2
+ * Callstack console style: an off-white page, square cards a shade darker,
3
+ * mono labels in capitals and one accent colour (orange) for brand and
4
+ * interaction only. Status colours always come with a word.
5
+ *
6
+ * The UI lives in a shadow root, so the tokens are set on `.discovery-root`,
7
+ * and discovery.js's own dark mode class replaces their values.
8
+ */
9
+
10
+ /* ------------------------------------------------------------------ */
11
+ /* Tokens */
12
+ /* ------------------------------------------------------------------ */
13
+
14
+ .discovery-root {
15
+ --font-sans: "Geist", system-ui, -apple-system, "Segoe UI", sans-serif;
16
+ --font-mono:
17
+ "Geist Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
18
+
19
+ --text-xs: 0.75rem;
20
+ --text-sm: 0.875rem;
21
+ --text-md: 1rem;
22
+ --text-lg: 1.25rem;
23
+ --text-xl: 1.75rem;
24
+ --text-2xl: 2rem;
25
+ --label-tracking: 0.08em;
26
+ --title-tracking: -0.02em;
27
+
28
+ --space-1: 4px;
29
+ --space-2: 8px;
30
+ --space-3: 12px;
31
+ --space-4: 16px;
32
+ --space-6: 24px;
33
+ --space-8: 32px;
34
+ --space-12: 48px;
35
+
36
+ --radius: 0;
37
+ --control-height: 40px;
38
+ --duration: 120ms;
39
+
40
+ --bg: #f8f8f7;
41
+ --surface: #f1f1ef;
42
+ --field: #e9e9e7;
43
+ --chip: #e6e6e3;
44
+ --border: #dededb;
45
+ --border-strong: #85857f;
46
+ --text: #111110;
47
+ --text-muted: #5a5a55;
48
+ --accent: #f76b15;
49
+ --accent-hover: #e2560a;
50
+ --on-accent: #111110;
51
+ --accent-text: #b93d0b;
52
+ --selection: #fed7aa;
53
+
54
+ --status-ok: #15803d;
55
+ --status-warn: #a16207;
56
+ --status-error: #b91c1c;
57
+ --status-idle: #57534e;
58
+ --status-error-soft: #ef4444;
59
+ --status-deprecated: #eab308;
60
+ /* Size heat: a soft amber ramp, the share of amber in each step's fill */
61
+ --heat: #f59e0b;
62
+ --heat-1: 14%;
63
+ --heat-2: 30%;
64
+ --heat-3: 52%;
65
+ }
66
+ .discovery-root.discovery-root-darkmode {
67
+ --bg: #0e0e0f;
68
+ --surface: #161618;
69
+ --field: #1e1e21;
70
+ --chip: #232326;
71
+ --border: #2b2b2f;
72
+ --border-strong: #75757d;
73
+ --text: #f2f2f0;
74
+ --text-muted: #a1a1a8;
75
+ --accent: #ff7a1a;
76
+ --accent-hover: #ff9442;
77
+ --on-accent: #0e0e0f;
78
+ --accent-text: #ff8c42;
79
+ --selection: #7c2d12;
80
+
81
+ --status-ok: #4ade80;
82
+ --status-warn: #facc15;
83
+ --status-error: #f87171;
84
+ --status-idle: #a8a29e;
85
+ --status-error-soft: #f87171;
86
+ --status-deprecated: #facc15;
87
+ --heat: #fbbf24;
88
+ --heat-1: 12%;
89
+ --heat-2: 24%;
90
+ --heat-3: 38%;
91
+ }
92
+
93
+ /* discovery.js variables, in both themes */
94
+ .discovery-root.discovery-root {
95
+ --discovery-font-family: var(--font-sans);
96
+ --discovery-ui-font-family: var(--font-sans);
97
+ --discovery-monospace-font-family: var(--font-mono);
98
+ --discovery-monospace-font-size: var(--text-xs);
99
+ --discovery-background-color: var(--bg);
100
+ --discovery-color: var(--text);
101
+ --discovery-link-color: var(--accent-text);
102
+ --discovery-link-hover-color: var(--accent-text);
103
+ --discovery-link-underline-color: color-mix(
104
+ in srgb,
105
+ var(--accent-text) 40%,
106
+ transparent
107
+ );
108
+ --discovery-input-bg-color: var(--field);
109
+ --discovery-input-color: var(--text);
110
+ --discovery-page-padding-top: var(--space-12);
111
+ --discovery-page-padding-right: var(--space-6);
112
+ --discovery-page-padding-bottom: var(--space-4);
113
+ --discovery-page-padding-left: var(--space-6);
114
+
115
+ font-family: var(--font-sans);
116
+ font-size: var(--text-sm);
117
+ line-height: 1.5;
118
+ background-color: var(--bg);
119
+ color: var(--text);
120
+ transition-duration: var(--duration);
121
+ }
122
+ @media (max-width: 767px) {
123
+ .discovery-root.discovery-root {
124
+ --discovery-page-padding-right: var(--space-4);
125
+ --discovery-page-padding-left: var(--space-4);
126
+ }
127
+ }
128
+ @media (prefers-reduced-motion: reduce) {
129
+ .discovery-root,
130
+ .discovery-root * {
131
+ transition: none !important;
132
+ }
133
+ }
134
+
135
+ /* ------------------------------------------------------------------ */
136
+ /* Base */
137
+ /* ------------------------------------------------------------------ */
138
+
139
+ ::selection {
140
+ background: var(--selection);
141
+ color: var(--text);
142
+ }
143
+ :focus-visible {
144
+ outline: 2px solid var(--accent-text);
145
+ outline-offset: 2px;
146
+ }
147
+ code,
148
+ kbd,
149
+ pre {
150
+ font-family: var(--font-mono);
151
+ }
152
+
153
+ .view-h1,
154
+ .view-h2,
155
+ .view-h3,
156
+ .view-h4,
157
+ .view-h5 {
158
+ font-weight: 600;
159
+ line-height: 1.25;
160
+ letter-spacing: var(--title-tracking);
161
+ }
162
+ .view-h1 {
163
+ font-size: var(--text-xl);
164
+ }
165
+ .view-h2 {
166
+ font-size: var(--text-lg);
167
+ }
168
+ .view-h3,
169
+ .view-h4 {
170
+ font-size: var(--text-md);
171
+ }
172
+ .view-h5 {
173
+ font-size: var(--text-sm);
174
+ }
175
+
176
+ .view-link {
177
+ color: var(--accent-text);
178
+ text-underline-offset: 2px;
179
+ transition: text-decoration-color var(--duration);
180
+ }
181
+
1
182
  hr {
2
- border: 1px solid rgb(222 222 222);
3
- margin-top: 1rem;
4
- margin-bottom: 1rem;
183
+ border: 0;
184
+ border-top: 1px solid var(--border);
185
+ margin-top: var(--space-4);
186
+ margin-bottom: var(--space-4);
187
+ }
188
+
189
+ /* A label: Geist Mono, 500, in capitals */
190
+ .view-tab,
191
+ .view-toggle,
192
+ .view-button,
193
+ .view-nav-button,
194
+ .view-table-header-cell,
195
+ .mo-card-label,
196
+ .mo-ext,
197
+ .rb-chip,
198
+ .cmp-more-btn,
199
+ .cd-fold,
200
+ .treemap-color-by-label {
201
+ font-family: var(--font-mono);
202
+ font-weight: 500;
203
+ letter-spacing: var(--label-tracking);
204
+ text-transform: uppercase;
205
+ }
206
+
207
+ /* ------------------------------------------------------------------ */
208
+ /* discovery.js controls */
209
+ /* ------------------------------------------------------------------ */
210
+
211
+ /* Buttons: secondary by default, outlined in --border-strong */
212
+ .view-button {
213
+ --discovery-view-button-color: var(--text);
214
+ --discovery-view-button-background-color: transparent;
215
+ --discovery-view-button-border-color: var(--border-strong);
216
+ --discovery-view-button-hover-background-color: var(--field);
217
+ --discovery-view-button-hover-border-color: var(--text);
218
+ --discovery-view-button-active-background-color: var(--chip);
219
+ --discovery-view-button-focus-background-color: transparent;
220
+ --discovery-view-button-focus-border-color: var(--border-strong);
221
+ min-height: var(--control-height);
222
+ padding: 0 var(--space-4);
223
+ border-radius: var(--radius);
224
+ font-size: var(--text-xs);
225
+ transition-property: background-color, border-color, color;
226
+ transition-duration: var(--duration);
227
+ }
228
+ .view-button:focus-visible {
229
+ box-shadow: none;
230
+ }
231
+ .view-button-primary,
232
+ .discovery-root-darkmode .view-button-primary {
233
+ --discovery-view-button-color: var(--on-accent);
234
+ --discovery-view-button-background-color: var(--accent);
235
+ --discovery-view-button-border-color: var(--accent);
236
+ --discovery-view-button-hover-background-color: var(--accent-hover);
237
+ --discovery-view-button-hover-border-color: var(--accent-hover);
238
+ --discovery-view-button-active-background-color: var(--accent-hover);
239
+ }
240
+
241
+ /* Inputs */
242
+ .view-input input,
243
+ .view-select {
244
+ min-height: var(--control-height);
245
+ border: 1px solid var(--border-strong);
246
+ border-radius: var(--radius);
247
+ background-color: var(--field);
248
+ color: var(--text);
249
+ transition: border-color var(--duration);
250
+ }
251
+ .view-input input {
252
+ padding: 0 var(--space-3);
253
+ font-size: var(--text-sm);
254
+ }
255
+ .view-input input::placeholder {
256
+ color: var(--text-muted);
257
+ }
258
+ .view-input input:hover,
259
+ .view-select:hover {
260
+ border-color: var(--text);
261
+ background-color: var(--field);
262
+ }
263
+ .view-input input:focus,
264
+ .view-select:focus,
265
+ .view-select.discovery-view-popup-active {
266
+ border-color: var(--border-strong);
267
+ box-shadow: none;
268
+ }
269
+ .view-input input:focus-visible {
270
+ outline: 2px solid var(--accent-text);
271
+ outline-offset: 2px;
272
+ }
273
+ .view-select {
274
+ padding-right: var(--space-8);
275
+ font-family: var(--font-mono);
276
+ }
277
+ /* A chevron in --text, 12px in from the right edge (no image) */
278
+ .view-select::after {
279
+ right: var(--space-3);
280
+ width: 8px;
281
+ height: 5px;
282
+ background-image:
283
+ linear-gradient(45deg, transparent 50%, var(--text) 50%),
284
+ linear-gradient(135deg, var(--text) 50%, transparent 50%);
285
+ background-size: 4px 5px;
286
+ background-position:
287
+ left center,
288
+ right center;
289
+ background-repeat: no-repeat;
290
+ }
291
+
292
+ .view-checkbox > input {
293
+ border: 1px solid var(--border-strong);
294
+ border-radius: var(--radius);
295
+ background-color: var(--field);
296
+ }
297
+ .view-checkbox > input:checked,
298
+ .view-checkbox > input:active {
299
+ border-color: var(--accent);
300
+ background-color: var(--accent);
301
+ }
302
+ .view-checkbox > input:focus-visible {
303
+ box-shadow: none;
304
+ outline: 2px solid var(--accent-text);
305
+ outline-offset: 2px;
306
+ }
307
+
308
+ /* Toggle groups: a segmented control of labels */
309
+ .view-toggle-group {
310
+ align-items: center;
311
+ }
312
+ .view-toggle-group-before {
313
+ color: var(--text-muted);
314
+ font-family: var(--font-mono);
315
+ font-size: var(--text-xs);
316
+ font-weight: 500;
317
+ letter-spacing: var(--label-tracking);
318
+ text-transform: uppercase;
319
+ }
320
+ .view-toggle {
321
+ display: inline-flex;
322
+ align-items: center;
323
+ min-height: 32px;
324
+ padding: 0 var(--space-3);
325
+ border: 1px solid var(--border-strong);
326
+ border-radius: var(--radius);
327
+ background: transparent;
328
+ color: var(--text-muted);
329
+ font-size: var(--text-xs);
330
+ transition-property: background-color, color;
331
+ transition-duration: var(--duration);
332
+ }
333
+ .view-toggle-group .view-toggle + .view-toggle {
334
+ margin-left: -1px;
335
+ }
336
+ .view-toggle:hover {
337
+ background-color: var(--field);
338
+ color: var(--text);
339
+ }
340
+ .view-toggle.checked {
341
+ border-color: var(--accent);
342
+ background-color: var(--accent);
343
+ color: var(--on-accent);
344
+ position: relative;
345
+ z-index: 1;
346
+ }
347
+
348
+ /* Tabs: labels in --text-muted, the current one in --text with an orange underline */
349
+ .view-tabs-buttons {
350
+ --discovery-view-tabs-border: 1px solid var(--border);
351
+ margin-top: 0;
352
+ flex-wrap: nowrap;
353
+ overflow-x: auto;
354
+ scrollbar-width: none;
355
+ }
356
+ .view-tabs-buttons::before {
357
+ width: 0;
358
+ }
359
+ .view-tab {
360
+ display: inline-flex;
361
+ align-items: center;
362
+ gap: var(--space-2);
363
+ height: var(--control-height);
364
+ padding: 0 var(--space-4);
365
+ border-bottom: var(--discovery-view-tabs-border);
366
+ color: var(--text-muted);
367
+ font-size: var(--text-xs);
368
+ transition: color var(--duration);
369
+ }
370
+ .view-tab:hover {
371
+ color: var(--text);
372
+ }
373
+ .view-tab.active {
374
+ padding-bottom: 0;
375
+ border-bottom: 2px solid var(--accent);
376
+ color: var(--text);
377
+ }
378
+ .view-tab.active::before {
379
+ display: none;
380
+ }
381
+
382
+ /* Badges: a small square box with a mono value; their colours are not used */
383
+ .view-badge,
384
+ .view-pill-badge,
385
+ .discovery-root-darkmode .view-badge,
386
+ .discovery-root-darkmode .view-pill-badge {
387
+ display: inline-flex;
388
+ align-items: center;
389
+ padding: 0 var(--space-2);
390
+ border: 1px solid color-mix(in srgb, var(--border-strong) 45%, var(--border));
391
+ border-radius: var(--radius);
392
+ background: var(--bg);
393
+ color: var(--text);
394
+ font-family: var(--font-mono);
395
+ font-size: var(--text-xs);
396
+ font-weight: 500;
397
+ line-height: 18px;
398
+ text-shadow: none;
399
+ vertical-align: 1px;
400
+ }
401
+ .view-badge > .prefix,
402
+ .view-badge > .postfix,
403
+ .view-pill-badge > .prefix,
404
+ .view-pill-badge > .postfix {
405
+ margin-top: 0;
406
+ margin-bottom: 0;
407
+ padding: 0 var(--space-2);
408
+ border-radius: var(--radius);
409
+ background-color: transparent;
410
+ color: var(--text);
411
+ font-weight: 400;
412
+ }
413
+ .view-badge > .prefix,
414
+ .view-pill-badge > .prefix {
415
+ margin-left: calc(-1 * var(--space-2));
416
+ border-right: 1px solid var(--border);
417
+ }
418
+ .view-badge > .postfix,
419
+ .view-pill-badge > .postfix {
420
+ margin-right: calc(-1 * var(--space-2));
421
+ border-left: 1px solid var(--border);
422
+ }
423
+ .view-badge[href]:hover,
424
+ .view-pill-badge[href]:hover {
425
+ background-image: none;
426
+ background-color: var(--field);
427
+ }
428
+ /* A count in a tab */
429
+ .view-tab .view-pill-badge {
430
+ margin-right: 0;
431
+ background: transparent;
432
+ color: inherit;
433
+ letter-spacing: 0;
434
+ }
435
+
436
+ /* Lists and trees: bigger text, readable hover states */
437
+ .view-tree {
438
+ font-size: var(--text-sm);
439
+ line-height: 28px;
440
+ }
441
+ .view-tree-leaf-toggle,
442
+ .view-tree-leaf-toggle:hover {
443
+ color: var(--text-muted);
444
+ }
445
+ .view-link:hover {
446
+ text-decoration-color: currentColor;
447
+ }
448
+ .view-text-match {
449
+ border-bottom: 2px solid var(--accent-text);
450
+ background: var(--selection);
451
+ color: var(--text);
452
+ }
453
+ /* The checked toggle keeps its colours on hover */
454
+ .view-toggle.checked:hover {
455
+ border-color: var(--accent-hover);
456
+ background-color: var(--accent-hover);
457
+ color: var(--on-accent);
458
+ }
459
+ .sort-toggle-group .view-toggle {
460
+ min-height: var(--control-height);
461
+ }
462
+
463
+ /* A file extension: its own colour, as a tint with readable text */
464
+ .view-pill-badge.ext-badge,
465
+ .discovery-root-darkmode .view-pill-badge.ext-badge {
466
+ border-color: color-mix(
467
+ in srgb,
468
+ var(--discovery-view-badge-color) 70%,
469
+ var(--bg)
470
+ );
471
+ background: color-mix(
472
+ in srgb,
473
+ var(--discovery-view-badge-color) 22%,
474
+ var(--bg)
475
+ );
476
+ color: var(--text);
477
+ }
478
+
479
+ /* Problems a developer has to see: duplicated (light red), outdated (amber),
480
+ deprecated (yellow). `--status` colours the edge, the fill and the square */
481
+ .view-pill-badge.badge-danger,
482
+ .view-pill-badge.badge-warn,
483
+ .view-pill-badge.badge-deprecated,
484
+ .discovery-root-darkmode .view-pill-badge.badge-danger,
485
+ .discovery-root-darkmode .view-pill-badge.badge-warn,
486
+ .discovery-root-darkmode .view-pill-badge.badge-deprecated,
487
+ .mo-chip.mo-chip-danger,
488
+ .mo-chip.mo-chip-warn,
489
+ .mo-chip.mo-chip-deprecated {
490
+ --status: var(--status-error-soft);
491
+ border-color: color-mix(in srgb, var(--status) 60%, var(--bg));
492
+ background: color-mix(in srgb, var(--status) 8%, var(--bg));
493
+ color: var(--status-error);
494
+ font-weight: 600;
495
+ }
496
+ .view-pill-badge.badge-warn,
497
+ .discovery-root-darkmode .view-pill-badge.badge-warn,
498
+ .mo-chip.mo-chip-warn {
499
+ --status: var(--status-warn);
500
+ color: var(--status-warn);
501
+ }
502
+ .view-pill-badge.badge-deprecated,
503
+ .discovery-root-darkmode .view-pill-badge.badge-deprecated,
504
+ .mo-chip.mo-chip-deprecated {
505
+ --status: var(--status-deprecated);
506
+ border-color: var(--status);
507
+ background: color-mix(in srgb, var(--status) 22%, var(--bg));
508
+ color: var(--text);
509
+ }
510
+ .view-pill-badge.badge-danger::before,
511
+ .view-pill-badge.badge-warn::before,
512
+ .view-pill-badge.badge-deprecated::before,
513
+ .mo-chip.mo-chip-danger::before,
514
+ .mo-chip.mo-chip-warn::before,
515
+ .mo-chip.mo-chip-deprecated::before {
516
+ content: "";
517
+ flex: none;
518
+ display: inline-block;
519
+ width: 8px;
520
+ height: 8px;
521
+ margin-right: var(--space-1);
522
+ background: var(--status);
523
+ }
524
+
525
+ /* The biggest packages and modules: a soft amber, the bigger the stronger */
526
+ .size-heat,
527
+ .discovery-root-darkmode .view-pill-badge.size-heat {
528
+ --heat-mix: var(--heat-1);
529
+ border: 1px solid color-mix(in srgb, var(--heat) 70%, var(--bg));
530
+ background: color-mix(in srgb, var(--heat) var(--heat-mix), var(--bg));
531
+ color: var(--text);
532
+ font-weight: 600;
5
533
  }
534
+ .size-heat-2,
535
+ .discovery-root-darkmode .view-pill-badge.size-heat-2 {
536
+ --heat-mix: var(--heat-2);
537
+ }
538
+ .size-heat-3,
539
+ .discovery-root-darkmode .view-pill-badge.size-heat-3 {
540
+ --heat-mix: var(--heat-3);
541
+ border-color: var(--heat);
542
+ }
543
+ .in-row-size.size-heat {
544
+ justify-self: end;
545
+ padding: 0 var(--space-2);
546
+ }
547
+
548
+ /* Expandable rows (module trees, package lists, findings) */
549
+ .view-expand > .header {
550
+ --discovery-view-expand-trigger-size: 28px;
551
+ background-color: var(--surface);
552
+ font-size: var(--text-sm);
553
+ line-height: 1.5;
554
+ transition: background-color var(--duration);
555
+ }
556
+ .view-expand > .header:hover {
557
+ background-color: var(--field);
558
+ }
559
+ .view-expand > .header > .header-content {
560
+ padding: var(--space-1) var(--space-2);
561
+ }
562
+ .view-expand > .header > .trigger {
563
+ background-image: none;
564
+ background-color: var(--chip);
565
+ }
566
+ .view-expand > .header > .trigger::before {
567
+ transition: none;
568
+ }
569
+
570
+ /* Tables: labels as headers, roomy rows with a line between them */
571
+ .view-table {
572
+ --table-cell-padding-top: var(--space-4);
573
+ --table-cell-padding-right: var(--space-4);
574
+ --table-cell-padding-bottom: var(--space-4);
575
+ --table-cell-padding-left: var(--space-4);
576
+ border: 1px solid var(--border);
577
+ background: var(--surface);
578
+ font-size: var(--text-sm);
579
+ line-height: 1.5;
580
+ }
581
+ .view-table-header-cell {
582
+ border: 0;
583
+ border-bottom: 1px solid var(--border);
584
+ background-color: var(--surface);
585
+ color: var(--text-muted);
586
+ font-size: var(--text-xs);
587
+ }
588
+ .view-table-header-cell.sortable:hover {
589
+ background-color: var(--field);
590
+ }
591
+ .view-table > tbody > .view-table-row:not(:last-child) > td,
592
+ .view-table > tbody:not(:last-child) > .view-table-row:last-child > td {
593
+ border-bottom: 1px solid var(--border);
594
+ }
595
+ .view-table-cell.number {
596
+ font-family: var(--font-mono);
597
+ }
598
+
599
+ /* Alerts: a card with a status square */
600
+ .view-alert,
601
+ .discovery-root-darkmode .view-alert {
602
+ display: flex;
603
+ align-items: baseline;
604
+ flex-wrap: wrap;
605
+ gap: 0 var(--space-2);
606
+ padding: var(--space-3) var(--space-4);
607
+ border: 1px solid var(--border);
608
+ border-radius: var(--radius);
609
+ background: var(--surface);
610
+ color: var(--text);
611
+ }
612
+ .view-alert-success::before,
613
+ .view-alert-warning::before,
614
+ .view-alert-danger::before {
615
+ content: "";
616
+ flex: none;
617
+ width: 8px;
618
+ height: 8px;
619
+ background: var(--status-ok);
620
+ }
621
+ .view-alert-warning::before {
622
+ background: var(--status-warn);
623
+ }
624
+ .view-alert-danger::before {
625
+ background: var(--status-error);
626
+ }
627
+
628
+ /* Popups and menus */
629
+ .discovery-view-popup {
630
+ border: 1px solid var(--border);
631
+ border-radius: var(--radius);
632
+ box-shadow: none;
633
+ background-color: var(--bg);
634
+ }
635
+ .view-menu-item {
636
+ padding: var(--space-2) var(--space-3);
637
+ }
638
+ .view-menu-item:hover,
639
+ .view-menu-item.discovery-view-popup-active {
640
+ background: var(--field);
641
+ }
642
+ .view-menu-item.selected {
643
+ background: var(--chip);
644
+ }
645
+
646
+ /* Nav buttons in the top right corner */
647
+ .discovery-nav,
648
+ .discovery-root-darkmode .discovery-nav {
649
+ padding: 0;
650
+ border: 1px solid var(--border);
651
+ border-top: 0;
652
+ border-radius: var(--radius);
653
+ background-color: var(--bg);
654
+ -webkit-backdrop-filter: none;
655
+ backdrop-filter: none;
656
+ }
657
+ .discovery-nav > :first-child,
658
+ .discovery-nav > :last-child {
659
+ border-radius: var(--radius);
660
+ }
661
+ .view-nav-button,
662
+ .discovery-root-darkmode .view-nav-button {
663
+ padding: var(--space-1) var(--space-3);
664
+ background-color: transparent;
665
+ color: var(--text-muted);
666
+ font-size: var(--text-xs);
667
+ transition: color var(--duration);
668
+ }
669
+ .view-nav-button + .view-nav-button {
670
+ margin-left: 0;
671
+ border-left: 1px solid var(--border);
672
+ }
673
+ .view-nav-button:hover,
674
+ .view-nav-button:focus,
675
+ .view-nav-button.discovery-view-popup-active {
676
+ background-color: var(--field);
677
+ color: var(--text);
678
+ }
679
+
680
+ /* Source code */
681
+ .view-source {
682
+ border: 1px solid var(--border);
683
+ border-radius: var(--radius);
684
+ background-color: var(--surface);
685
+ }
686
+
687
+ /* ------------------------------------------------------------------ */
688
+ /* Helpers */
689
+ /* ------------------------------------------------------------------ */
6
690
 
7
691
  .inline-block {
8
692
  display: inline-block;
9
693
  }
694
+ .flex-no-wrap {
695
+ flex-wrap: nowrap;
696
+ }
697
+ .width-50p {
698
+ width: 50%;
699
+ }
700
+ .no-margin {
701
+ margin: 0;
702
+ }
703
+ .two-column > * {
704
+ width: 50%;
705
+ }
706
+ .m-v-8 {
707
+ margin-top: var(--space-2);
708
+ margin-bottom: var(--space-2);
709
+ }
710
+ .m-l-0_5em {
711
+ margin-left: var(--space-2);
712
+ }
713
+ .m-r-0_3em {
714
+ margin-right: var(--space-1);
715
+ }
716
+ .i-duplicate {
717
+ display: inline-block;
718
+ padding: 0 var(--space-2);
719
+ border: 1px solid var(--border);
720
+ background: var(--chip);
721
+ color: var(--text);
722
+ font-family: var(--font-mono);
723
+ font-size: var(--text-xs);
724
+ }
725
+ .i-duplicate::before {
726
+ content: "";
727
+ display: inline-block;
728
+ width: 8px;
729
+ height: 8px;
730
+ margin-right: var(--space-1);
731
+ background: var(--status-error);
732
+ }
733
+
734
+ /* An 8px square of a status colour, before the status's word */
735
+ .mo-chip-warn::before,
736
+ .mo-chip-danger::before,
737
+ .rb-chip-ok::before,
738
+ .rb-chip-warn::before,
739
+ .mo-card-danger .mo-card-label::before,
740
+ .mo-card-good .mo-card-label::before,
741
+ .in-severity::before,
742
+ .cmp-warning::before {
743
+ content: "";
744
+ flex: none;
745
+ display: inline-block;
746
+ width: 8px;
747
+ height: 8px;
748
+ margin-right: var(--space-2);
749
+ background: var(--status-idle);
750
+ }
751
+ .mo-chip-warn::before,
752
+ .rb-chip-warn::before,
753
+ .cmp-warning::before,
754
+ .in-finding-medium .in-severity::before {
755
+ background: var(--status-warn);
756
+ }
757
+ .mo-chip-danger::before,
758
+ .mo-card-danger .mo-card-label::before,
759
+ .in-finding-high .in-severity::before {
760
+ background: var(--status-error);
761
+ }
762
+ .rb-chip-ok::before,
763
+ .mo-card-good .mo-card-label::before {
764
+ background: var(--status-ok);
765
+ }
766
+
767
+ /* ------------------------------------------------------------------ */
768
+ /* Default page */
769
+ /* ------------------------------------------------------------------ */
770
+
10
771
  .discovery-content > .page-default {
772
+ box-sizing: border-box;
11
773
  height: 100%;
12
774
  overflow: hidden;
13
- padding-top: 16px;
14
- padding-bottom: 16px;
775
+ padding-top: var(--space-4);
776
+ padding-bottom: var(--space-4);
15
777
  }
16
778
  .view-tabs-content > .view-content-filter > .view-input {
17
- padding-top: 12px;
18
- padding-bottom: 12px;
779
+ padding-top: var(--space-4);
780
+ padding-bottom: var(--space-4);
19
781
  margin: 0;
20
- background-color: var(--discovery-background-color);
782
+ background-color: var(--bg);
21
783
  position: sticky;
22
784
  top: 0;
23
785
  z-index: 1;
24
786
  }
25
787
  .main-tabs {
26
- height: calc(100% - 20px);
27
- margin-top: 12px;
788
+ height: calc(100% - var(--control-height) - var(--space-4));
789
+ margin-top: var(--space-4);
28
790
  }
29
791
  .main-tabs .view-tabs-content {
30
- height: calc(100% - 32px);
792
+ height: calc(100% - var(--control-height) - 1px);
793
+ }
794
+ .view-pill-badge.cmp-tab-delta-good {
795
+ color: var(--status-ok);
796
+ }
797
+ .view-pill-badge.cmp-tab-delta-bad {
798
+ color: var(--status-error);
799
+ }
800
+ .view-pill-badge.cmp-tab-delta-ok {
801
+ color: var(--text-muted);
802
+ }
803
+
804
+ /* Report bar on top of the default page */
805
+ .report-bar {
806
+ display: flex;
807
+ align-items: center;
808
+ gap: var(--space-6);
809
+ height: var(--control-height);
810
+ /* leave room for the discovery.js nav buttons on the right */
811
+ padding-right: 170px;
812
+ font-size: var(--text-sm);
813
+ white-space: nowrap;
814
+ overflow: hidden;
815
+ }
816
+ .rb-build {
817
+ display: flex;
818
+ gap: var(--space-2);
819
+ flex: none;
820
+ }
821
+ .rb-chip {
822
+ display: inline-flex;
823
+ align-items: center;
824
+ height: 28px;
825
+ padding: 0 var(--space-2);
826
+ border: 1px solid var(--border);
827
+ background: var(--surface);
828
+ color: var(--text);
829
+ font-size: var(--text-xs);
830
+ }
831
+ .rb-chip-platform {
832
+ border-color: var(--chip);
833
+ background: var(--chip);
834
+ }
835
+ .rb-chip-warn {
836
+ cursor: help;
837
+ }
838
+ .rb-size {
839
+ display: flex;
840
+ flex: none;
841
+ align-items: center;
842
+ gap: var(--space-3);
843
+ }
844
+ .rb-total {
845
+ font-family: var(--font-mono);
846
+ font-size: var(--text-md);
847
+ font-weight: 500;
848
+ letter-spacing: var(--title-tracking);
849
+ }
850
+ .rb-split {
851
+ display: flex;
852
+ flex: none;
853
+ width: 96px;
854
+ height: 8px;
855
+ overflow: hidden;
856
+ background: var(--border);
857
+ }
858
+ .rb-split-own,
859
+ .rb-dot-own {
860
+ background: var(--accent);
861
+ }
862
+ .rb-split-nm,
863
+ .rb-dot-nm {
864
+ background: var(--border-strong);
865
+ }
866
+ .rb-legend {
867
+ display: flex;
868
+ gap: var(--space-4);
869
+ color: var(--text-muted);
870
+ }
871
+ .rb-legend .rb-chip {
872
+ height: 22px;
873
+ margin-left: var(--space-1);
874
+ letter-spacing: 0;
875
+ }
876
+ .rb-dot {
877
+ display: inline-block;
878
+ width: 8px;
879
+ height: 8px;
880
+ margin-right: var(--space-2);
881
+ }
882
+ /* The least important part: shrinks first */
883
+ .rb-date {
884
+ min-width: 0;
885
+ margin-left: auto;
886
+ overflow: hidden;
887
+ text-overflow: ellipsis;
888
+ color: var(--text-muted);
889
+ font-family: var(--font-mono);
890
+ font-size: var(--text-xs);
891
+ }
892
+ @media (max-width: 1000px) {
893
+ .rb-date {
894
+ display: none;
895
+ }
896
+ }
897
+
898
+ /* Tabs with several sections scroll as a whole */
899
+ .tab-scroll {
900
+ height: 100%;
901
+ overflow: auto;
902
+ padding-top: var(--space-4);
903
+ box-sizing: border-box;
31
904
  }
32
- .foamtree-filter,
33
- .view-foamtree {
905
+ .dup-title {
906
+ display: flex;
907
+ align-items: center;
908
+ gap: var(--space-2);
909
+ margin: var(--space-6) 0 var(--space-3);
910
+ }
911
+ .dup-title:first-child {
912
+ margin-top: 0;
913
+ }
914
+ .dup-empty {
915
+ display: block;
916
+ color: var(--text-muted);
917
+ }
918
+
919
+ /* Sortable list: sort toggles, filter, the list */
920
+ .sortable-content-filter {
921
+ display: grid;
922
+ grid-template-columns: auto 1fr;
923
+ grid-template-rows: auto auto minmax(0, 1fr);
924
+ column-gap: var(--space-4);
925
+ align-items: center;
926
+ height: 100%;
927
+ }
928
+ .sort-toggle-group .view-toggle.checked {
929
+ cursor: pointer;
930
+ }
931
+ .sortable-content-filter > .filtered-size {
932
+ grid-row: 2;
933
+ grid-column: 1 / -1;
934
+ justify-self: start;
935
+ margin-bottom: var(--space-2);
936
+ }
937
+ .sortable-content-filter > .content {
938
+ grid-row: 3;
939
+ grid-column: 1 / -1;
940
+ align-self: stretch;
941
+ }
942
+
943
+ /* ------------------------------------------------------------------ */
944
+ /* Treemap */
945
+ /* ------------------------------------------------------------------ */
946
+
947
+ .treemap-filter,
948
+ .view-treemap {
34
949
  width: 100%;
35
950
  height: 100%;
36
951
  }
37
- .foamtree-filter > .content {
38
- height: calc(100% - 60px);
952
+ .treemap-filter > .content {
953
+ height: calc(100% - 72px);
39
954
  width: 100%;
40
955
  }
41
- .tooltip {
956
+ .treemap-tooltip {
42
957
  position: absolute;
43
958
  z-index: 10;
44
959
  display: none;
45
- background-color: #fff;
46
- border: 1px solid #ccc;
47
- padding: 5px;
48
- border-radius: 5px;
49
- box-shadow: 0 0 5px #ccc;
960
+ max-width: 480px;
961
+ padding: var(--space-2) var(--space-3);
962
+ pointer-events: none;
963
+ overflow-wrap: anywhere;
964
+ border: 1px solid var(--border);
965
+ background-color: var(--bg);
966
+ font-size: var(--text-sm);
50
967
  }
51
- .tooltip-name {
52
- text-transform: capitalize;
968
+ .treemap-header {
969
+ position: absolute;
970
+ left: 0;
971
+ right: 0;
972
+ top: 0;
973
+ height: 26px;
974
+ display: flex;
975
+ align-items: center;
976
+ gap: var(--space-3);
53
977
  }
54
- .flex-no-wrap {
55
- flex-wrap: nowrap;
978
+ .treemap-breadcrumb {
979
+ flex: 1;
980
+ min-width: 0;
981
+ display: flex;
982
+ align-items: center;
983
+ gap: var(--space-1);
984
+ overflow: hidden;
985
+ white-space: nowrap;
56
986
  }
57
- .width-50p {
58
- width: 50%;
987
+ .treemap-controls {
988
+ flex: none;
989
+ display: flex;
990
+ align-items: center;
991
+ gap: var(--space-2);
992
+ font-size: var(--text-xs);
993
+ white-space: nowrap;
59
994
  }
60
- .my-icon {
61
- display: block;
62
- height: 100%;
63
- width: 100%;
995
+ .treemap-legend {
996
+ display: flex;
997
+ gap: var(--space-3);
998
+ color: var(--text-muted);
999
+ font-family: var(--font-mono);
64
1000
  }
65
- .my-icon-inline {
1001
+ .treemap-swatch {
66
1002
  display: inline-block;
67
- vertical-align: middle;
68
- margin-left: 4px;
69
- }
70
- .my-icon-12 {
71
- width: 12px;
72
- height: 12px;
1003
+ width: 8px;
1004
+ height: 8px;
1005
+ margin-right: var(--space-1);
1006
+ vertical-align: 0;
73
1007
  }
74
- .no-margin {
75
- margin: 0;
76
- }
77
- .two-column > * {
78
- width: 50%;
1008
+ .treemap-color-by-label {
1009
+ color: var(--text-muted);
79
1010
  }
80
- .m-v-8 {
81
- margin-top: 8px;
82
- margin-bottom: 8px;
1011
+ .treemap-color-by .view-toggle {
1012
+ min-height: 26px;
1013
+ cursor: pointer;
83
1014
  }
84
- .i-duplicate {
85
- display: inline-block;
86
- background: #da444e;
87
- color: #fff;
88
- border-radius: 0.5em;
89
- padding: 0 0.5em;
1015
+ .treemap-breadcrumb-item {
1016
+ padding: 1px var(--space-2);
1017
+ border: 1px solid var(--border);
1018
+ background: var(--surface);
1019
+ font-family: var(--font-mono);
1020
+ font-size: var(--text-xs);
1021
+ cursor: pointer;
1022
+ transition: background-color var(--duration);
90
1023
  }
91
- .m-l-0_5em {
92
- margin-left: 0.5em;
1024
+ .treemap-breadcrumb-item:hover {
1025
+ background: var(--field);
93
1026
  }
94
- .m-r-0_3em {
95
- margin-right: 0.3em;
1027
+ .treemap-breadcrumb-item:last-child {
1028
+ border-color: var(--chip);
1029
+ background: var(--chip);
1030
+ font-weight: 600;
96
1031
  }
1032
+
1033
+ /* ------------------------------------------------------------------ */
1034
+ /* Copy button, prettify checkbox */
1035
+ /* ------------------------------------------------------------------ */
1036
+
97
1037
  .copy-to-clipboard {
98
- /* from: https://tabler.io/icons/icon/clipboard-copy */
99
- background: url("data:image/svg+xml,%3Csvg%20%20xmlns=%22http://www.w3.org/2000/svg%22%20%20width=%2224%22%20%20height=%2224%22%20%20viewBox=%220%200%2024%2024%22%20%20fill=%22none%22%20%20stroke=%22currentColor%22%20%20stroke-width=%222%22%20%20stroke-linecap=%22round%22%20%20stroke-linejoin=%22round%22%20%20class=%22icon%20icon-tabler%20icons-tabler-outline%20icon-tabler-clipboard-copy%22%3E%3Cpath%20stroke=%22none%22%20d=%22M0%200h24v24H0z%22%20fill=%22none%22/%3E%3Cpath%20d=%22M9%205h-2a2%202%200%200%200%20-2%202v12a2%202%200%200%200%202%202h3m9%20-9v-5a2%202%200%200%200%20-2%20-2h-2%22%20/%3E%3Cpath%20d=%22M13%2017v-1a1%201%200%200%201%201%20-1h1m3%200h1a1%201%200%200%201%201%201v1m0%203v1a1%201%200%200%201%20-1%201h-1m-3%200h-1a1%201%200%200%201%20-1%20-1v-1%22%20/%3E%3Cpath%20d=%22M9%203m0%202a2%202%200%200%201%202%20-2h2a2%202%200%200%201%202%202v0a2%202%200%200%201%20-2%202h-2a2%202%200%200%201%20-2%20-2z%22%20/%3E%3C/svg%3E");
100
- background-repeat: no-repeat;
101
- background-position: center;
102
1038
  display: inline-block;
103
- height: 32px;
104
- width: 32px;
1039
+ height: var(--control-height);
1040
+ width: var(--control-height);
1041
+ padding: 0;
1042
+ }
1043
+ /* The icon, in the button's text colour */
1044
+ .copy-to-clipboard::after {
1045
+ content: "";
1046
+ position: absolute;
1047
+ inset: 0;
1048
+ background-color: currentColor;
1049
+ /* from: https://tabler.io/icons/icon/clipboard-copy */
1050
+ mask:
1051
+ url("data:image/svg+xml,%3Csvg%20%20xmlns=%22http://www.w3.org/2000/svg%22%20%20width=%2224%22%20%20height=%2224%22%20%20viewBox=%220%200%2024%2024%22%20%20fill=%22none%22%20%20stroke=%22currentColor%22%20%20stroke-width=%222%22%20%20stroke-linecap=%22round%22%20%20stroke-linejoin=%22round%22%20%20class=%22icon%20icon-tabler%20icons-tabler-outline%20icon-tabler-clipboard-copy%22%3E%3Cpath%20stroke=%22none%22%20d=%22M0%200h24v24H0z%22%20fill=%22none%22/%3E%3Cpath%20d=%22M9%205h-2a2%202%200%200%200%20-2%202v12a2%202%200%200%200%202%202h3m9%20-9v-5a2%202%200%200%200%20-2%20-2h-2%22%20/%3E%3Cpath%20d=%22M13%2017v-1a1%201%200%200%201%201%20-1h1m3%200h1a1%201%200%200%201%201%201v1m0%203v1a1%201%200%200%201%20-1%201h-1m-3%200h-1a1%201%200%200%201%20-1%20-1v-1%22%20/%3E%3Cpath%20d=%22M9%203m0%202a2%202%200%200%201%202%20-2h2a2%202%200%200%201%202%202v0a2%202%200%200%201%20-2%202h-2a2%202%200%200%201%20-2%20-2z%22%20/%3E%3C/svg%3E")
1052
+ no-repeat center / 18px;
105
1053
  }
106
1054
  .copy-to-clipboard::before {
107
1055
  position: absolute;
108
- top: -8px;
109
- font-size: 0.7rem;
110
- border-radius: 4px;
111
- display: inline-block;
112
- padding: 1px 4px;
113
- color: #fff;
114
- left: 78%;
1056
+ top: calc(-1 * var(--space-6));
1057
+ right: 0;
1058
+ padding: 2px var(--space-2);
1059
+ background: var(--text);
1060
+ color: var(--bg);
1061
+ font-size: var(--text-xs);
1062
+ white-space: nowrap;
115
1063
  opacity: 0;
116
- transition: opacity 0.3s ease-in-out;
1064
+ transition: opacity var(--duration);
117
1065
  }
118
1066
  .copy-to-clipboard.done::before {
119
- content: "Copied!";
120
- background: green;
1067
+ content: "Copied";
121
1068
  opacity: 1;
122
1069
  }
123
1070
  .copy-to-clipboard.err::before {
124
- content: "Error!";
125
- background: red;
1071
+ content: "Copy failed";
126
1072
  opacity: 1;
127
1073
  }
128
1074
  .prettify-checkbox {
@@ -131,41 +1077,596 @@ hr {
131
1077
  margin-top: -26px;
132
1078
  z-index: 1;
133
1079
  }
134
- .ask-chatgpt {
135
- color: var(--discovery-view-button-color, #000);
1080
+
1081
+ /* ------------------------------------------------------------------ */
1082
+ /* Module and package pages */
1083
+ /* ------------------------------------------------------------------ */
1084
+
1085
+ .mo-wrap {
1086
+ position: relative;
1087
+ margin-bottom: var(--space-6);
1088
+ }
1089
+ .mo-copy {
1090
+ position: absolute;
1091
+ top: var(--space-4);
1092
+ right: var(--space-4);
1093
+ }
1094
+ .mo-header {
1095
+ display: flex;
1096
+ gap: var(--space-4);
1097
+ align-items: flex-start;
1098
+ padding: var(--space-6) 64px var(--space-6) var(--space-6);
1099
+ border: 1px solid var(--border);
1100
+ background: var(--surface);
1101
+ }
1102
+ .mo-ext {
1103
+ flex: none;
1104
+ min-width: 48px;
1105
+ box-sizing: border-box;
1106
+ padding: var(--space-2);
1107
+ border: 1px solid var(--border);
1108
+ background: var(--chip);
1109
+ color: var(--text);
1110
+ font-size: var(--text-xs);
1111
+ line-height: 1;
1112
+ text-align: center;
1113
+ }
1114
+ .mo-title {
1115
+ min-width: 0;
1116
+ }
1117
+ .mo-dir {
1118
+ color: var(--text-muted);
1119
+ font: var(--text-sm) / 1.5 var(--font-mono);
1120
+ overflow-wrap: anywhere;
1121
+ }
1122
+ .mo-file {
1123
+ font-size: var(--text-xl);
1124
+ font-weight: 600;
1125
+ line-height: 1.25;
1126
+ letter-spacing: var(--title-tracking);
1127
+ overflow-wrap: anywhere;
1128
+ }
1129
+ .mo-chips {
1130
+ display: flex;
1131
+ flex-wrap: wrap;
1132
+ gap: var(--space-2);
1133
+ margin-top: var(--space-3);
1134
+ }
1135
+ .mo-chip {
1136
+ display: inline-flex;
1137
+ align-items: center;
1138
+ gap: var(--space-1);
1139
+ padding: 2px var(--space-2);
1140
+ border: 1px solid var(--chip);
1141
+ background: var(--chip);
1142
+ color: var(--text);
1143
+ font-family: var(--font-mono);
1144
+ font-size: var(--text-xs);
136
1145
  text-decoration: none;
137
- vertical-align: middle;
1146
+ transition: border-color var(--duration);
1147
+ }
1148
+ .mo-chip b {
1149
+ font-weight: 500;
1150
+ color: var(--text-muted);
1151
+ }
1152
+ a.mo-chip:hover {
1153
+ border-color: var(--border-strong);
1154
+ }
1155
+ .mo-chip-warn,
1156
+ .mo-chip-danger {
1157
+ gap: 0;
1158
+ }
1159
+ .mo-chip-link {
1160
+ border-color: var(--border-strong);
1161
+ background: transparent;
1162
+ }
1163
+ a.mo-chip-link:hover {
1164
+ border-color: var(--text);
1165
+ background: var(--field);
1166
+ }
1167
+
1168
+ /* Stat cards */
1169
+ .mo-cards {
1170
+ display: grid;
1171
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
1172
+ gap: var(--space-4);
1173
+ margin-top: var(--space-4);
1174
+ }
1175
+ .mo-card {
1176
+ padding: var(--space-6);
1177
+ border: 1px solid var(--border);
1178
+ background: var(--surface);
1179
+ }
1180
+ .mo-card-label {
1181
+ display: flex;
1182
+ align-items: center;
1183
+ color: var(--text-muted);
1184
+ font-size: var(--text-xs);
1185
+ }
1186
+ .mo-card-value {
1187
+ margin-top: var(--space-2);
1188
+ font-size: var(--text-xl);
1189
+ font-weight: 500;
1190
+ line-height: 1.25;
1191
+ letter-spacing: var(--title-tracking);
1192
+ font-variant-numeric: tabular-nums;
1193
+ }
1194
+ .mo-card-sub {
1195
+ margin-top: var(--space-1);
1196
+ color: var(--text-muted);
1197
+ font-size: var(--text-sm);
1198
+ }
1199
+ .mo-good,
1200
+ .mo-bad {
1201
+ color: var(--status-ok);
1202
+ font-weight: 500;
1203
+ }
1204
+ .mo-bad {
1205
+ color: var(--status-error);
1206
+ }
1207
+ .mo-bar {
1208
+ height: 4px;
1209
+ margin-top: var(--space-3);
1210
+ overflow: hidden;
1211
+ background: var(--border);
1212
+ }
1213
+ .mo-bar > div {
1214
+ height: 100%;
1215
+ background: var(--accent);
1216
+ }
1217
+ .mo-pane-title {
1218
+ color: var(--text-muted);
1219
+ }
1220
+ .mo-import {
1221
+ display: flex;
1222
+ flex-wrap: wrap;
1223
+ align-items: center;
1224
+ gap: var(--space-2);
1225
+ padding: var(--space-2) var(--space-1);
1226
+ border-bottom: 1px solid var(--border);
1227
+ }
1228
+ .mo-import-specifier {
1229
+ font-family: var(--font-mono);
1230
+ font-weight: 500;
1231
+ }
1232
+ .mo-arrow {
1233
+ color: var(--text-muted);
1234
+ }
1235
+
1236
+ /* Package page */
1237
+ .po-links {
1238
+ margin-top: var(--space-2);
1239
+ align-items: center;
1240
+ }
1241
+ .po-badge {
1242
+ line-height: 0;
1243
+ }
1244
+ .po-badge img {
1245
+ height: 20px;
1246
+ }
1247
+
1248
+ /* Package page: "Why is this in my bundle?" */
1249
+ .why {
1250
+ margin-top: var(--space-4);
1251
+ }
1252
+ .why-hint {
1253
+ display: block;
1254
+ margin: var(--space-4) 0 var(--space-2);
1255
+ color: var(--text-muted);
1256
+ }
1257
+ .why-chain .why-step {
1258
+ position: relative;
1259
+ padding: var(--space-1) 0 var(--space-1) var(--space-6);
1260
+ }
1261
+ .why-chain .why-step::before {
1262
+ content: "↓";
138
1263
  position: absolute;
139
- z-index: 9;
140
- margin-top: 12px;
141
- /* biome-ignore lint/complexity/noImportantStyles: overrides discovery.js styles */
142
- margin-left: 105px !important;
143
- height: 35px;
144
- }
145
- .ask-chatgpt::before {
146
- content: "”";
147
- font-size: 2em;
148
- vertical-align: middle;
149
- font-family: math;
150
- margin-right: 0.2em;
1264
+ left: var(--space-1);
1265
+ color: var(--text-muted);
1266
+ }
1267
+ .why-chain .view-list-item:first-child .why-step::before {
1268
+ content: "";
1269
+ top: 12px;
1270
+ width: 8px;
1271
+ height: 8px;
1272
+ background: var(--text-muted);
1273
+ }
1274
+ .why-step-target {
1275
+ font-weight: 600;
1276
+ }
1277
+
1278
+ /* Module page: "Imported by" graph */
1279
+ .ig {
1280
+ position: relative;
1281
+ min-width: 0;
1282
+ }
1283
+ .ig-legend {
1284
+ display: flex;
1285
+ flex-wrap: wrap;
1286
+ gap: var(--space-1) var(--space-3);
1287
+ margin: var(--space-2) 0;
1288
+ font-size: var(--text-xs);
1289
+ }
1290
+ .ig-dot {
151
1291
  display: inline-block;
152
- height: 15px;
1292
+ width: 8px;
1293
+ height: 8px;
1294
+ margin-right: var(--space-1);
1295
+ vertical-align: 0;
153
1296
  }
154
- /* biome-ignore lint/style/noDescendingSpecificity: order is intentional, kept as is */
155
- .packages-content > .view-input {
156
- padding-left: 265px;
1297
+ .ig-hint {
1298
+ color: var(--text-muted);
157
1299
  }
158
- .copy-before-ask-chatgpt {
159
- width: 95px;
160
- background-position: left center;
161
- padding-left: 25px;
162
- position: absolute;
163
- z-index: 9;
164
- margin-top: 12px;
165
- height: 35px;
1300
+ .ig-svg {
1301
+ display: block;
1302
+ width: 100%;
1303
+ border: 1px solid var(--border);
1304
+ background: var(--surface);
1305
+ cursor: grab;
1306
+ touch-action: none;
1307
+ user-select: none;
166
1308
  }
167
- .bundlejs-badge-img {
168
- line-height: 0;
169
- margin-bottom: -5px;
170
- margin-left: 10px;
1309
+ .ig-svg:active {
1310
+ cursor: grabbing;
1311
+ }
1312
+ .ig-links path {
1313
+ fill: none;
1314
+ stroke: var(--border-strong);
1315
+ stroke-opacity: 0.6;
1316
+ stroke-width: 1.2;
1317
+ }
1318
+ .ig-arrow {
1319
+ fill: var(--border-strong);
1320
+ }
1321
+ .ig-node {
1322
+ cursor: pointer;
1323
+ }
1324
+ .ig-node text {
1325
+ fill: var(--text);
1326
+ font-family: var(--font-mono);
1327
+ font-size: 11px;
1328
+ paint-order: stroke;
1329
+ stroke: var(--surface);
1330
+ stroke-width: 3px;
1331
+ }
1332
+ .ig-has-hover .ig-node:not(.ig-active),
1333
+ .ig-has-hover .ig-links path:not(.ig-active) {
1334
+ opacity: 0.2;
1335
+ }
1336
+ .ig-links path.ig-active {
1337
+ stroke: var(--text);
1338
+ stroke-opacity: 1;
1339
+ stroke-width: 2;
1340
+ }
1341
+
1342
+ /* ------------------------------------------------------------------ */
1343
+ /* Insights tab */
1344
+ /* ------------------------------------------------------------------ */
1345
+
1346
+ .insights .mo-cards {
1347
+ margin-top: 0;
1348
+ }
1349
+
1350
+ /* A panel: a card with a header line over its rows */
1351
+ .in-tops {
1352
+ display: grid;
1353
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
1354
+ gap: var(--space-4);
1355
+ margin-top: var(--space-4);
1356
+ }
1357
+ .in-top {
1358
+ border: 1px solid var(--border);
1359
+ background: var(--surface);
1360
+ }
1361
+ .in-top > .mo-card-label {
1362
+ padding: var(--space-4) var(--space-6);
1363
+ border-bottom: 1px solid var(--border);
1364
+ }
1365
+ .in-row {
1366
+ display: grid;
1367
+ grid-template-columns: minmax(0, 1fr) auto 4.5rem;
1368
+ grid-template-areas: "name size share" "bar bar bar";
1369
+ column-gap: var(--space-3);
1370
+ padding: var(--space-3) var(--space-6);
1371
+ color: inherit;
1372
+ text-decoration: none;
1373
+ font-size: var(--text-sm);
1374
+ transition: background-color var(--duration);
1375
+ }
1376
+ .in-row:not(:last-child) {
1377
+ border-bottom: 1px solid var(--border);
1378
+ }
1379
+ .in-row:hover {
1380
+ background: var(--field);
1381
+ }
1382
+ .in-row-name {
1383
+ grid-area: name;
1384
+ overflow: hidden;
1385
+ text-overflow: ellipsis;
1386
+ white-space: nowrap;
1387
+ }
1388
+ .in-row-name .mo-chip {
1389
+ margin-left: var(--space-1);
1390
+ padding-top: 0;
1391
+ padding-bottom: 0;
1392
+ }
1393
+ .in-row-size,
1394
+ .in-row-share {
1395
+ font-family: var(--font-mono);
1396
+ font-size: var(--text-xs);
1397
+ line-height: 21px;
1398
+ text-align: right;
1399
+ }
1400
+ .in-row-size {
1401
+ grid-area: size;
1402
+ }
1403
+ .in-row-share {
1404
+ grid-area: share;
1405
+ color: var(--text-muted);
1406
+ }
1407
+ .in-row-bar {
1408
+ grid-area: bar;
1409
+ height: 2px;
1410
+ margin-top: var(--space-2);
1411
+ overflow: hidden;
1412
+ background: var(--border);
1413
+ }
1414
+ .in-row-bar > span {
1415
+ display: block;
1416
+ height: 100%;
1417
+ background: var(--accent);
1418
+ }
1419
+
1420
+ /* Recommendations */
1421
+ .in-title {
1422
+ display: flex;
1423
+ align-items: center;
1424
+ gap: var(--space-2);
1425
+ margin: var(--space-8) 0 var(--space-3);
1426
+ }
1427
+ .in-finding {
1428
+ margin-bottom: var(--space-2);
1429
+ border: 1px solid var(--border);
1430
+ background: var(--surface);
1431
+ }
1432
+ .view-list > .view-list-item > .view-expand.in-finding {
1433
+ margin-bottom: var(--space-2);
1434
+ }
1435
+ .in-finding > .header {
1436
+ background: transparent;
1437
+ font-size: var(--text-sm);
1438
+ }
1439
+ .in-finding > .header > .header-content {
1440
+ padding: var(--space-3) var(--space-4);
1441
+ }
1442
+ .in-finding > .header .header-content {
1443
+ display: flex;
1444
+ flex-wrap: wrap;
1445
+ align-items: center;
1446
+ gap: var(--space-2);
1447
+ font-weight: 600;
1448
+ }
1449
+ .in-finding > .header > .trigger {
1450
+ background: transparent;
1451
+ }
1452
+ .in-finding.expanded > .header {
1453
+ border-bottom: 1px solid var(--border);
1454
+ }
1455
+ .in-severity,
1456
+ .in-packages {
1457
+ font-weight: normal;
1458
+ }
1459
+ .in-severity {
1460
+ border-color: var(--border);
1461
+ background: var(--bg);
1462
+ }
1463
+ .in-packages .mo-chip {
1464
+ margin-right: var(--space-1);
1465
+ }
1466
+ .in-finding-content {
1467
+ padding: var(--space-4) var(--space-6) var(--space-6);
1468
+ }
1469
+ .in-pre {
1470
+ white-space: pre-wrap;
1471
+ font-family: var(--font-mono);
1472
+ font-size: var(--text-xs);
1473
+ padding: var(--space-3) var(--space-4);
1474
+ border: 1px solid var(--border);
1475
+ background: var(--field);
1476
+ }
1477
+ .in-affected {
1478
+ margin: var(--space-3) 0;
1479
+ }
1480
+ .in-docs {
1481
+ margin-top: var(--space-3);
1482
+ }
1483
+
1484
+ /* ------------------------------------------------------------------ */
1485
+ /* Compare tab */
1486
+ /* ------------------------------------------------------------------ */
1487
+
1488
+ .compare .mo-cards {
1489
+ /* All five cards in one row, stretched to the full width */
1490
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1491
+ margin-top: var(--space-4);
1492
+ }
1493
+ .cmp-title {
1494
+ display: flex;
1495
+ align-items: center;
1496
+ gap: var(--space-2);
1497
+ color: var(--text-muted);
1498
+ font-size: var(--text-sm);
1499
+ }
1500
+ .cmp-change {
1501
+ display: flex;
1502
+ flex-wrap: wrap;
1503
+ align-items: center;
1504
+ gap: var(--space-1) var(--space-2);
1505
+ margin-top: var(--space-1);
1506
+ }
1507
+ .cmp-pill {
1508
+ padding: 0 var(--space-2);
1509
+ border: 1px solid var(--border);
1510
+ background: var(--bg);
1511
+ color: var(--text);
1512
+ font-family: var(--font-mono);
1513
+ font-size: var(--text-xs);
1514
+ font-weight: 500;
1515
+ }
1516
+ .cmp-pill-up {
1517
+ color: var(--status-error);
1518
+ }
1519
+ .cmp-pill-down {
1520
+ color: var(--status-ok);
1521
+ }
1522
+ .cmp-from {
1523
+ color: var(--text-muted);
1524
+ }
1525
+ .cmp-warning {
1526
+ display: flex;
1527
+ align-items: baseline;
1528
+ margin-top: var(--space-4);
1529
+ padding: var(--space-3) var(--space-4);
1530
+ border: 1px solid var(--border);
1531
+ background: var(--surface);
1532
+ font-size: var(--text-sm);
1533
+ }
1534
+ .cmp-empty {
1535
+ margin-top: var(--space-4);
1536
+ }
1537
+ /* Masonry: sections of different heights fill the columns without gaps */
1538
+ .cmp-sections {
1539
+ columns: 460px;
1540
+ column-gap: var(--space-4);
1541
+ margin: var(--space-4) 0;
1542
+ }
1543
+ .cmp-section {
1544
+ break-inside: avoid;
1545
+ margin-bottom: var(--space-4);
1546
+ }
1547
+ .cmp-row {
1548
+ display: grid;
1549
+ grid-template-columns: minmax(0, 1fr) auto 6rem;
1550
+ column-gap: var(--space-3);
1551
+ align-items: baseline;
1552
+ padding: var(--space-3) var(--space-6);
1553
+ color: inherit;
1554
+ text-decoration: none;
1555
+ font-size: var(--text-sm);
1556
+ transition: background-color var(--duration);
1557
+ }
1558
+ .cmp-section > .cmp-row:not(:last-of-type),
1559
+ .cmp-more > .cmp-row {
1560
+ border-bottom: 1px solid var(--border);
1561
+ }
1562
+ a.cmp-row:hover {
1563
+ background: var(--field);
1564
+ }
1565
+ .cmp-row-name {
1566
+ overflow: hidden;
1567
+ text-overflow: ellipsis;
1568
+ white-space: nowrap;
1569
+ }
1570
+ .cmp-row-detail {
1571
+ max-width: 260px;
1572
+ overflow: hidden;
1573
+ text-overflow: ellipsis;
1574
+ white-space: nowrap;
1575
+ color: var(--text-muted);
1576
+ font-family: var(--font-mono);
1577
+ font-size: var(--text-xs);
1578
+ }
1579
+ .cmp-row-delta {
1580
+ text-align: right;
1581
+ font-family: var(--font-mono);
1582
+ font-size: var(--text-xs);
1583
+ }
1584
+ .cmp-more-btn {
1585
+ display: block;
1586
+ width: calc(100% - 2 * var(--space-6));
1587
+ min-height: var(--control-height);
1588
+ margin: var(--space-3) var(--space-6) var(--space-6);
1589
+ padding: 0 var(--space-4);
1590
+ border: 1px solid var(--border-strong);
1591
+ background: transparent;
1592
+ color: var(--text);
1593
+ font-size: var(--text-xs);
1594
+ cursor: pointer;
1595
+ transition: background-color var(--duration);
1596
+ }
1597
+ .cmp-more-btn:hover {
1598
+ background: var(--field);
1599
+ }
1600
+ @media (max-width: 520px) {
1601
+ .cmp-row-detail {
1602
+ display: none;
1603
+ }
1604
+ }
1605
+
1606
+ /* ------------------------------------------------------------------ */
1607
+ /* Code diff (module-diff page) */
1608
+ /* ------------------------------------------------------------------ */
1609
+
1610
+ .cd-stats {
1611
+ margin: 0 0 var(--space-2);
1612
+ color: var(--text-muted);
1613
+ font-family: var(--font-mono);
1614
+ font-size: var(--text-xs);
1615
+ }
1616
+ .cd-stat-add {
1617
+ color: var(--status-ok);
1618
+ }
1619
+ .cd-stat-del {
1620
+ color: var(--status-error);
1621
+ }
1622
+ .cd-code {
1623
+ overflow: auto;
1624
+ border: 1px solid var(--border);
1625
+ background: var(--surface);
1626
+ font: var(--text-xs) / 1.5 var(--font-mono);
1627
+ }
1628
+ .cd-line {
1629
+ display: grid;
1630
+ grid-template-columns: 4ch 4ch 2ch 1fr;
1631
+ min-width: max-content;
1632
+ }
1633
+ .cd-no {
1634
+ padding-right: var(--space-2);
1635
+ text-align: right;
1636
+ color: var(--text-muted);
1637
+ user-select: none;
1638
+ }
1639
+ .cd-sign {
1640
+ text-align: center;
1641
+ user-select: none;
1642
+ }
1643
+ .cd-text {
1644
+ padding-right: var(--space-3);
1645
+ white-space: pre;
1646
+ }
1647
+ .cd-add {
1648
+ background: color-mix(in srgb, var(--status-ok) 14%, transparent);
1649
+ }
1650
+ .cd-del {
1651
+ background: color-mix(in srgb, var(--status-error) 14%, transparent);
1652
+ }
1653
+ .cd-fold {
1654
+ display: block;
1655
+ width: 100%;
1656
+ padding: var(--space-1) var(--space-2);
1657
+ border: 0;
1658
+ border-top: 1px solid var(--border);
1659
+ border-bottom: 1px solid var(--border);
1660
+ background: var(--field);
1661
+ color: var(--text-muted);
1662
+ font-size: var(--text-xs);
1663
+ text-align: left;
1664
+ cursor: pointer;
1665
+ transition: color var(--duration);
1666
+ }
1667
+ .cd-fold:hover {
1668
+ color: var(--text);
1669
+ }
1670
+ .cd-empty {
1671
+ color: var(--text-muted);
171
1672
  }