@ponchia/ui 0.6.4 → 0.6.6

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.
@@ -263,16 +263,69 @@ export declare const cls: {
263
263
  readonly reportMeta: 'ui-report__meta';
264
264
  readonly reportToc: 'ui-report__toc';
265
265
  readonly reportSummary: 'ui-report__summary';
266
+ readonly reportDecision: 'ui-report__decision';
267
+ readonly reportDecisionKicker: 'ui-report__decision-kicker';
268
+ readonly reportDecisionTitle: 'ui-report__decision-title';
269
+ readonly reportDecisionBody: 'ui-report__decision-body';
270
+ readonly reportDecisionMeta: 'ui-report__decision-meta';
271
+ readonly reportDecisionGrid: 'ui-report__decision-grid';
272
+ readonly reportDecisionItem: 'ui-report__decision-item';
273
+ readonly reportDecisionLabel: 'ui-report__decision-label';
274
+ readonly reportDecisionValue: 'ui-report__decision-value';
266
275
  readonly reportSection: 'ui-report__section';
267
276
  readonly reportSectionUnnumbered: 'ui-report__section--unnumbered';
268
277
  readonly reportSectionHead: 'ui-report__section-head';
269
278
  readonly reportFinding: 'ui-report__finding';
279
+ readonly reportFindingCritical: 'ui-report__finding--critical';
280
+ readonly reportFindingMajor: 'ui-report__finding--major';
281
+ readonly reportFindingMinor: 'ui-report__finding--minor';
282
+ readonly reportFindingResolved: 'ui-report__finding--resolved';
283
+ readonly reportFindingTitle: 'ui-report__finding-title';
284
+ readonly reportFindingClaim: 'ui-report__finding-claim';
285
+ readonly reportFindingImpact: 'ui-report__finding-impact';
286
+ readonly reportFindingRemediation: 'ui-report__finding-remediation';
287
+ readonly reportFindingEvidence: 'ui-report__finding-evidence';
288
+ readonly reportFindingCaveat: 'ui-report__finding-caveat';
270
289
  readonly reportEvidence: 'ui-report__evidence';
271
290
  readonly reportFigure: 'ui-report__figure';
272
291
  readonly reportCaption: 'ui-report__caption';
273
292
  readonly reportSources: 'ui-report__sources';
274
293
  readonly reportAppendix: 'ui-report__appendix';
275
294
  readonly reportFootnotes: 'ui-report__footnotes';
295
+ readonly reportActions: 'ui-report__actions';
296
+ readonly reportAction: 'ui-report__action';
297
+ readonly reportActionStatus: 'ui-report__action-status';
298
+ readonly reportActionTitle: 'ui-report__action-title';
299
+ readonly reportActionOwner: 'ui-report__action-owner';
300
+ readonly reportActionDue: 'ui-report__action-due';
301
+ readonly reportActionPriority: 'ui-report__action-priority';
302
+ readonly reportActionCriteria: 'ui-report__action-criteria';
303
+ readonly reportActionSource: 'ui-report__action-source';
304
+ readonly claim: 'ui-claim';
305
+ readonly claimSupported: 'ui-claim--supported';
306
+ readonly claimPartial: 'ui-claim--partial';
307
+ readonly claimDisputed: 'ui-claim--disputed';
308
+ readonly claimUnsupported: 'ui-claim--unsupported';
309
+ readonly claimUnknown: 'ui-claim--unknown';
310
+ readonly claimStatement: 'ui-claim__statement';
311
+ readonly claimStatus: 'ui-claim__status';
312
+ readonly claimScope: 'ui-claim__scope';
313
+ readonly claimBasis: 'ui-claim__basis';
314
+ readonly claimLimits: 'ui-claim__limits';
315
+ readonly claimRefs: 'ui-claim__refs';
316
+ readonly claimCaveat: 'ui-claim__caveat';
317
+ readonly evidenceGrid: 'ui-evidence-grid';
318
+ readonly evidenceLedger: 'ui-evidence-ledger';
319
+ readonly evidenceItem: 'ui-evidence-item';
320
+ readonly evidenceItemTitle: 'ui-evidence-item__title';
321
+ readonly evidenceItemMeta: 'ui-evidence-item__meta';
322
+ readonly evidenceItemBody: 'ui-evidence-item__body';
323
+ readonly evidenceItemKind: 'ui-evidence-item__kind';
324
+ readonly evidenceItemMethod: 'ui-evidence-item__method';
325
+ readonly evidenceItemWindow: 'ui-evidence-item__window';
326
+ readonly evidenceItemValue: 'ui-evidence-item__value';
327
+ readonly evidenceItemSource: 'ui-evidence-item__source';
328
+ readonly evidenceItemCaveat: 'ui-evidence-item__caveat';
276
329
  readonly compare: 'ui-compare';
277
330
  readonly compare2up: 'ui-compare--2up';
278
331
  readonly compareCol: 'ui-compare__col';
@@ -585,6 +638,14 @@ export interface CompareOpts {
585
638
  /** Pin exactly two equal columns (hard before/after) instead of the auto-fitting set. */
586
639
  cols?: 2;
587
640
  }
641
+ export interface ReportFindingOpts {
642
+ /** Severity/status band. Pair with an author-written label; tone is not the only signal. */
643
+ severity?: 'critical' | 'major' | 'minor' | 'resolved';
644
+ }
645
+ export interface ClaimOpts {
646
+ /** Evidence status. Pair with written status text; tone is only a scanning aid. */
647
+ status?: 'supported' | 'partial' | 'disputed' | 'unsupported' | 'unknown';
648
+ }
588
649
  export interface ChipOpts {
589
650
  accent?: boolean;
590
651
  }
@@ -787,6 +848,8 @@ export interface Ui {
787
848
  num(opts?: NumOpts): string;
788
849
  delta(opts?: DeltaOpts): string;
789
850
  compare(opts?: CompareOpts): string;
851
+ reportFinding(opts?: ReportFindingOpts): string;
852
+ claim(opts?: ClaimOpts): string;
790
853
  chip(opts?: ChipOpts): string;
791
854
  link(opts?: LinkOpts): string;
792
855
  dot(opts?: DotOpts): string;
package/classes/index.js CHANGED
@@ -279,16 +279,69 @@ export const cls = Object.freeze({
279
279
  reportMeta: 'ui-report__meta',
280
280
  reportToc: 'ui-report__toc',
281
281
  reportSummary: 'ui-report__summary',
282
+ reportDecision: 'ui-report__decision',
283
+ reportDecisionKicker: 'ui-report__decision-kicker',
284
+ reportDecisionTitle: 'ui-report__decision-title',
285
+ reportDecisionBody: 'ui-report__decision-body',
286
+ reportDecisionMeta: 'ui-report__decision-meta',
287
+ reportDecisionGrid: 'ui-report__decision-grid',
288
+ reportDecisionItem: 'ui-report__decision-item',
289
+ reportDecisionLabel: 'ui-report__decision-label',
290
+ reportDecisionValue: 'ui-report__decision-value',
282
291
  reportSection: 'ui-report__section',
283
292
  reportSectionUnnumbered: 'ui-report__section--unnumbered',
284
293
  reportSectionHead: 'ui-report__section-head',
285
294
  reportFinding: 'ui-report__finding',
295
+ reportFindingCritical: 'ui-report__finding--critical',
296
+ reportFindingMajor: 'ui-report__finding--major',
297
+ reportFindingMinor: 'ui-report__finding--minor',
298
+ reportFindingResolved: 'ui-report__finding--resolved',
299
+ reportFindingTitle: 'ui-report__finding-title',
300
+ reportFindingClaim: 'ui-report__finding-claim',
301
+ reportFindingImpact: 'ui-report__finding-impact',
302
+ reportFindingRemediation: 'ui-report__finding-remediation',
303
+ reportFindingEvidence: 'ui-report__finding-evidence',
304
+ reportFindingCaveat: 'ui-report__finding-caveat',
286
305
  reportEvidence: 'ui-report__evidence',
287
306
  reportFigure: 'ui-report__figure',
288
307
  reportCaption: 'ui-report__caption',
289
308
  reportSources: 'ui-report__sources',
290
309
  reportAppendix: 'ui-report__appendix',
291
310
  reportFootnotes: 'ui-report__footnotes',
311
+ reportActions: 'ui-report__actions',
312
+ reportAction: 'ui-report__action',
313
+ reportActionStatus: 'ui-report__action-status',
314
+ reportActionTitle: 'ui-report__action-title',
315
+ reportActionOwner: 'ui-report__action-owner',
316
+ reportActionDue: 'ui-report__action-due',
317
+ reportActionPriority: 'ui-report__action-priority',
318
+ reportActionCriteria: 'ui-report__action-criteria',
319
+ reportActionSource: 'ui-report__action-source',
320
+ claim: 'ui-claim',
321
+ claimSupported: 'ui-claim--supported',
322
+ claimPartial: 'ui-claim--partial',
323
+ claimDisputed: 'ui-claim--disputed',
324
+ claimUnsupported: 'ui-claim--unsupported',
325
+ claimUnknown: 'ui-claim--unknown',
326
+ claimStatement: 'ui-claim__statement',
327
+ claimStatus: 'ui-claim__status',
328
+ claimScope: 'ui-claim__scope',
329
+ claimBasis: 'ui-claim__basis',
330
+ claimLimits: 'ui-claim__limits',
331
+ claimRefs: 'ui-claim__refs',
332
+ claimCaveat: 'ui-claim__caveat',
333
+ evidenceGrid: 'ui-evidence-grid',
334
+ evidenceLedger: 'ui-evidence-ledger',
335
+ evidenceItem: 'ui-evidence-item',
336
+ evidenceItemTitle: 'ui-evidence-item__title',
337
+ evidenceItemMeta: 'ui-evidence-item__meta',
338
+ evidenceItemBody: 'ui-evidence-item__body',
339
+ evidenceItemKind: 'ui-evidence-item__kind',
340
+ evidenceItemMethod: 'ui-evidence-item__method',
341
+ evidenceItemWindow: 'ui-evidence-item__window',
342
+ evidenceItemValue: 'ui-evidence-item__value',
343
+ evidenceItemSource: 'ui-evidence-item__source',
344
+ evidenceItemCaveat: 'ui-evidence-item__caveat',
292
345
  compare: 'ui-compare',
293
346
  compare2up: 'ui-compare--2up',
294
347
  compareCol: 'ui-compare__col',
@@ -721,6 +774,31 @@ const meterTone = (tone) =>
721
774
  tone,
722
775
  );
723
776
 
777
+ const reportFindingSeverity = (severity) =>
778
+ toneClass(
779
+ 'reportFinding',
780
+ {
781
+ critical: cls.reportFindingCritical,
782
+ major: cls.reportFindingMajor,
783
+ minor: cls.reportFindingMinor,
784
+ resolved: cls.reportFindingResolved,
785
+ },
786
+ severity,
787
+ );
788
+
789
+ const claimStatus = (status) =>
790
+ toneClass(
791
+ 'claim',
792
+ {
793
+ supported: cls.claimSupported,
794
+ partial: cls.claimPartial,
795
+ disputed: cls.claimDisputed,
796
+ unsupported: cls.claimUnsupported,
797
+ unknown: cls.claimUnknown,
798
+ },
799
+ status,
800
+ );
801
+
724
802
  export const ui = {
725
803
  button: ({ variant, icon, size } = {}) =>
726
804
  j(
@@ -745,6 +823,8 @@ export const ui = {
745
823
  invert && cls.deltaInvert,
746
824
  ),
747
825
  compare: ({ cols } = {}) => j(cls.compare, cols === 2 && cls.compare2up),
826
+ reportFinding: ({ severity } = {}) => j(cls.reportFinding, reportFindingSeverity(severity)),
827
+ claim: ({ status } = {}) => j(cls.claim, claimStatus(status)),
748
828
  chip: ({ accent } = {}) => j(cls.chip, accent && cls.chipAccent),
749
829
  link: ({ arrow, cta } = {}) => j(cls.link, arrow && cls.linkArrow, cta && cls.linkCta),
750
830
  dot: ({ tone, live } = {}) => j(cls.dot, dotTone(tone), live && cls.dotLive),
package/css/report.css CHANGED
@@ -30,6 +30,24 @@
30
30
  counter-reset: report-section;
31
31
  }
32
32
 
33
+ .ui-report > *,
34
+ .ui-report__cover > *,
35
+ .ui-report__head > *,
36
+ .ui-report__toc > *,
37
+ .ui-report__summary > *,
38
+ .ui-report__decision > *,
39
+ .ui-report__finding > *,
40
+ .ui-report__evidence > *,
41
+ .ui-report__section > *,
42
+ .ui-report__figure > *,
43
+ .ui-claim > *,
44
+ .ui-evidence-grid > *,
45
+ .ui-evidence-ledger > *,
46
+ .ui-compare > *,
47
+ .ui-compare__col > * {
48
+ min-inline-size: 0;
49
+ }
50
+
33
51
  .ui-report__cover {
34
52
  align-content: end;
35
53
  border-block-end: 1px solid var(--line);
@@ -142,8 +160,204 @@
142
160
  border-inline-start: 2px solid var(--accent);
143
161
  }
144
162
 
163
+ .ui-report__decision {
164
+ background: var(--panel);
165
+ border: 1px solid color-mix(in srgb, var(--accent) 40%, var(--line));
166
+ border-inline-start: 3px solid var(--accent);
167
+ border-radius: var(--radius-md);
168
+ display: grid;
169
+ gap: var(--space-sm);
170
+ padding: var(--space-md);
171
+ }
172
+
173
+ .ui-report__decision-kicker {
174
+ color: var(--accent-text);
175
+ font-family: var(--mono);
176
+ font-size: var(--text-2xs);
177
+ letter-spacing: var(--tracking-wide);
178
+ margin: 0;
179
+ text-transform: uppercase;
180
+ }
181
+
182
+ .ui-report__decision-title {
183
+ color: var(--text);
184
+ font-family: var(--display);
185
+ font-size: var(--text-lg);
186
+ font-weight: var(--display-weight);
187
+ letter-spacing: 0;
188
+ line-height: 1.18;
189
+ margin: 0;
190
+ text-transform: uppercase;
191
+ text-wrap: balance;
192
+ }
193
+
194
+ .ui-report__decision-body {
195
+ color: var(--text-soft);
196
+ line-height: 1.6;
197
+ margin: 0;
198
+ max-inline-size: var(--report-measure);
199
+ }
200
+
201
+ .ui-report__decision-meta {
202
+ color: var(--text-dim);
203
+ display: flex;
204
+ flex-wrap: wrap;
205
+ font-family: var(--mono);
206
+ font-size: var(--text-2xs);
207
+ gap: 0.45rem 0.75rem;
208
+ letter-spacing: 0;
209
+ }
210
+
211
+ .ui-report__decision-grid {
212
+ border-block-start: 1px solid var(--line);
213
+ display: grid;
214
+ gap: 0;
215
+ }
216
+
217
+ .ui-report__decision-item {
218
+ align-items: start;
219
+ border-block-end: 1px solid var(--line);
220
+ display: grid;
221
+ gap: var(--space-xs);
222
+ grid-template-columns: minmax(8rem, 14rem) minmax(0, 1fr);
223
+ padding-block: var(--space-xs);
224
+ }
225
+
226
+ .ui-report__decision-label,
227
+ .ui-report__decision-value {
228
+ margin: 0;
229
+ }
230
+
231
+ .ui-report__decision-label {
232
+ color: var(--text-dim);
233
+ font-family: var(--mono);
234
+ font-size: var(--text-2xs);
235
+ letter-spacing: var(--tracking-wide);
236
+ text-transform: uppercase;
237
+ }
238
+
239
+ .ui-report__decision-value {
240
+ color: var(--text-soft);
241
+ line-height: 1.5;
242
+ }
243
+
145
244
  .ui-report__finding {
146
- border-inline-start: 2px solid var(--line-strong);
245
+ --report-finding-tone: var(--line-strong);
246
+
247
+ border-inline-start: 2px solid var(--report-finding-tone);
248
+ }
249
+
250
+ .ui-report__finding--critical {
251
+ --report-finding-tone: var(--danger);
252
+ }
253
+
254
+ .ui-report__finding--major {
255
+ --report-finding-tone: var(--warning);
256
+ }
257
+
258
+ .ui-report__finding--minor {
259
+ --report-finding-tone: var(--info);
260
+ }
261
+
262
+ .ui-report__finding--resolved {
263
+ --report-finding-tone: var(--success);
264
+ }
265
+
266
+ .ui-report__finding-title,
267
+ .ui-report__finding-claim,
268
+ .ui-report__finding-impact,
269
+ .ui-report__finding-remediation,
270
+ .ui-report__finding-evidence,
271
+ .ui-report__finding-caveat {
272
+ margin: 0;
273
+ }
274
+
275
+ .ui-report__finding-title {
276
+ color: var(--text);
277
+ font-size: var(--text-md);
278
+ font-weight: 650;
279
+ line-height: 1.25;
280
+ }
281
+
282
+ .ui-report__finding-claim {
283
+ color: var(--text);
284
+ line-height: 1.6;
285
+ }
286
+
287
+ .ui-report__finding-impact,
288
+ .ui-report__finding-remediation,
289
+ .ui-report__finding-evidence {
290
+ color: var(--text-soft);
291
+ line-height: 1.55;
292
+ }
293
+
294
+ .ui-report__finding-caveat {
295
+ color: var(--text-dim);
296
+ font-size: var(--text-sm);
297
+ line-height: 1.55;
298
+ }
299
+
300
+ .ui-claim {
301
+ --claim-tone: var(--accent);
302
+
303
+ background: var(--panel-soft);
304
+ border: 1px solid var(--line);
305
+ border-inline-start: 2px solid var(--claim-tone);
306
+ border-radius: var(--radius-md);
307
+ display: grid;
308
+ gap: var(--space-xs);
309
+ padding: var(--space-sm);
310
+ }
311
+
312
+ .ui-claim--supported {
313
+ --claim-tone: var(--success);
314
+ }
315
+
316
+ .ui-claim--partial {
317
+ --claim-tone: var(--warning);
318
+ }
319
+
320
+ .ui-claim--disputed,
321
+ .ui-claim--unsupported {
322
+ --claim-tone: var(--danger);
323
+ }
324
+
325
+ .ui-claim--unknown {
326
+ --claim-tone: var(--info);
327
+ }
328
+
329
+ .ui-claim__statement,
330
+ .ui-claim__status,
331
+ .ui-claim__scope,
332
+ .ui-claim__basis,
333
+ .ui-claim__limits,
334
+ .ui-claim__refs,
335
+ .ui-claim__caveat {
336
+ margin: 0;
337
+ }
338
+
339
+ .ui-claim__statement {
340
+ color: var(--text);
341
+ font-weight: 650;
342
+ line-height: 1.45;
343
+ }
344
+
345
+ .ui-claim__status,
346
+ .ui-claim__scope,
347
+ .ui-claim__refs {
348
+ color: var(--text-dim);
349
+ font-family: var(--mono);
350
+ font-size: var(--text-2xs);
351
+ letter-spacing: 0;
352
+ text-transform: uppercase;
353
+ }
354
+
355
+ .ui-claim__basis,
356
+ .ui-claim__limits,
357
+ .ui-claim__caveat {
358
+ color: var(--text-soft);
359
+ font-size: var(--text-sm);
360
+ line-height: 1.55;
147
361
  }
148
362
 
149
363
  .ui-report__evidence {
@@ -208,6 +422,142 @@
208
422
  text-transform: uppercase;
209
423
  }
210
424
 
425
+ .ui-evidence-grid {
426
+ display: grid;
427
+ gap: var(--space-sm);
428
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
429
+ }
430
+
431
+ .ui-evidence-item {
432
+ background: var(--panel-soft);
433
+ border: 1px solid var(--line);
434
+ border-radius: var(--radius-md);
435
+ display: grid;
436
+ gap: 0.35rem;
437
+ padding: var(--space-sm);
438
+ }
439
+
440
+ .ui-evidence-item__title {
441
+ color: var(--text);
442
+ font-size: var(--text-sm);
443
+ font-weight: 600;
444
+ margin: 0;
445
+ }
446
+
447
+ .ui-evidence-item__meta {
448
+ color: var(--text-dim);
449
+ font-family: var(--mono);
450
+ font-size: var(--text-2xs);
451
+ letter-spacing: 0;
452
+ }
453
+
454
+ .ui-evidence-item__body {
455
+ color: var(--text-soft);
456
+ font-size: var(--text-sm);
457
+ line-height: 1.55;
458
+ margin: 0;
459
+ }
460
+
461
+ .ui-evidence-item__kind,
462
+ .ui-evidence-item__method,
463
+ .ui-evidence-item__window,
464
+ .ui-evidence-item__value,
465
+ .ui-evidence-item__source,
466
+ .ui-evidence-item__caveat {
467
+ margin: 0;
468
+ }
469
+
470
+ .ui-evidence-item__kind,
471
+ .ui-evidence-item__method,
472
+ .ui-evidence-item__window,
473
+ .ui-evidence-item__source {
474
+ color: var(--text-dim);
475
+ font-family: var(--mono);
476
+ font-size: var(--text-2xs);
477
+ letter-spacing: 0;
478
+ text-transform: uppercase;
479
+ }
480
+
481
+ .ui-evidence-item__value {
482
+ color: var(--text);
483
+ font-size: var(--text-md);
484
+ font-weight: 650;
485
+ }
486
+
487
+ .ui-evidence-item__caveat {
488
+ color: var(--text-dim);
489
+ font-size: var(--text-sm);
490
+ line-height: 1.5;
491
+ }
492
+
493
+ .ui-evidence-ledger {
494
+ display: grid;
495
+ gap: var(--space-sm);
496
+ }
497
+
498
+ .ui-report__actions {
499
+ border-block-start: 1px solid var(--line);
500
+ display: grid;
501
+ gap: 0;
502
+ }
503
+
504
+ .ui-report__action {
505
+ align-items: start;
506
+ border-block-end: 1px solid var(--line);
507
+ display: grid;
508
+ gap: var(--space-xs);
509
+ grid-template-columns: minmax(0, 1fr) auto;
510
+ padding-block: var(--space-sm);
511
+ }
512
+
513
+ .ui-report__action-status {
514
+ align-self: start;
515
+ color: var(--text-dim);
516
+ font-family: var(--mono);
517
+ font-size: var(--text-2xs);
518
+ letter-spacing: var(--tracking-wide);
519
+ text-transform: uppercase;
520
+ }
521
+
522
+ .ui-report__action-title,
523
+ .ui-report__action-owner,
524
+ .ui-report__action-due,
525
+ .ui-report__action-priority,
526
+ .ui-report__action-criteria,
527
+ .ui-report__action-source {
528
+ margin: 0;
529
+ }
530
+
531
+ .ui-report__action-title {
532
+ color: var(--text);
533
+ font-weight: 650;
534
+ line-height: 1.45;
535
+ }
536
+
537
+ .ui-report__action-owner,
538
+ .ui-report__action-due,
539
+ .ui-report__action-priority,
540
+ .ui-report__action-source {
541
+ color: var(--text-dim);
542
+ font-family: var(--mono);
543
+ font-size: var(--text-2xs);
544
+ letter-spacing: 0;
545
+ text-transform: uppercase;
546
+ }
547
+
548
+ .ui-report__action-criteria {
549
+ color: var(--text-soft);
550
+ font-size: var(--text-sm);
551
+ line-height: 1.5;
552
+ }
553
+
554
+ @media (max-width: 32rem) {
555
+ .ui-report__decision-item,
556
+ .ui-report__action {
557
+ grid-template-columns: 1fr;
558
+ }
559
+ }
560
+
211
561
  .ui-report__sources,
212
562
  .ui-report__appendix,
213
563
  .ui-report__footnotes {
@@ -343,13 +693,44 @@
343
693
  min-block-size: auto;
344
694
  }
345
695
 
696
+ /* Chromium-class print engines overprint grid rows across page breaks
697
+ (fragmented grid tracks restart at the page top, on top of the running
698
+ content). Demote ONLY the vertical document-flow wrappers to block flow
699
+ and emulate their gap with margins; multi-column grids (.ui-compare,
700
+ .ui-meter__row, .ui-report__decision-item, .ui-evidence-grid, …) keep
701
+ grid — their content is break-inside-avoided as a unit instead. */
702
+ .ui-report,
703
+ .ui-report__section,
704
+ .ui-report__figure,
705
+ .ui-report__actions,
706
+ .ui-evidence-ledger {
707
+ display: block;
708
+ }
709
+
710
+ .ui-report > * + * {
711
+ margin-block-start: var(--report-gap);
712
+ }
713
+
714
+ .ui-report__section > * + * {
715
+ margin-block-start: var(--space-md);
716
+ }
717
+
718
+ .ui-report__figure > * + *,
719
+ .ui-evidence-ledger > * + * {
720
+ margin-block-start: var(--space-sm);
721
+ }
722
+
346
723
  .ui-report__cover,
347
724
  .ui-report__head,
348
- .ui-report__section,
725
+ .ui-report__decision,
349
726
  .ui-report__summary,
350
727
  .ui-report__finding,
351
728
  .ui-report__evidence,
352
- .ui-report__figure {
729
+ .ui-report__figure,
730
+ .ui-report__toc,
731
+ .ui-claim,
732
+ .ui-evidence-item,
733
+ .ui-report__action {
353
734
  break-inside: avoid;
354
735
  }
355
736
 
package/css/sources.css CHANGED
@@ -117,11 +117,13 @@
117
117
  gap: var(--space-sm);
118
118
  list-style: none;
119
119
  margin: 0;
120
+ min-inline-size: 0;
120
121
  padding: 0;
121
122
  }
122
123
 
123
124
  .ui-source-list__item {
124
125
  margin: 0;
126
+ min-inline-size: 0;
125
127
  }
126
128
 
127
129
  /* --- Source card — a single source preview. --- */
@@ -132,15 +134,28 @@
132
134
  border-radius: var(--radius-md);
133
135
  display: grid;
134
136
  gap: 0.3rem;
137
+ min-inline-size: 0;
135
138
  padding: 0.75rem 0.9rem;
136
139
  print-color-adjust: exact;
137
140
  }
138
141
 
142
+ .ui-source-card:target,
143
+ .ui-source-card.is-source-active {
144
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--src-tone) 22%, transparent);
145
+ outline: 2px solid var(--src-tone);
146
+ outline-offset: 2px;
147
+ }
148
+
149
+ .ui-source-card > * {
150
+ min-inline-size: 0;
151
+ }
152
+
139
153
  .ui-source-card__title {
140
154
  color: var(--text);
141
155
  font-size: var(--text-sm);
142
156
  font-weight: 600;
143
157
  margin: 0;
158
+ overflow-wrap: break-word;
144
159
  }
145
160
 
146
161
  .ui-source-card__origin {
@@ -148,17 +163,20 @@
148
163
  font-family: var(--mono);
149
164
  font-size: var(--text-2xs);
150
165
  letter-spacing: var(--tracking-wide);
166
+ overflow-wrap: anywhere;
151
167
  }
152
168
 
153
169
  .ui-source-card__time {
154
170
  color: var(--text-dim);
155
171
  font-family: var(--mono);
156
172
  font-size: var(--text-2xs);
173
+ overflow-wrap: anywhere;
157
174
  }
158
175
 
159
176
  .ui-source-card__excerpt {
160
177
  color: var(--text-soft);
161
178
  margin: 0;
179
+ overflow-wrap: anywhere;
162
180
  }
163
181
 
164
182
  .ui-source-card__actions {
package/css/tokens.css CHANGED
@@ -282,8 +282,15 @@
282
282
  --shadow-raised: 0 0 0 1px var(--text);
283
283
  }
284
284
 
285
+ :root[data-contrast='high'] {
286
+ --line: var(--line-strong);
287
+ --text-dim: var(--text-soft);
288
+ --focus-ring: var(--accent);
289
+ --shadow-raised: 0 0 0 1px var(--text);
290
+ }
291
+
285
292
  @media (prefers-contrast: more) {
286
- :root {
293
+ :root:root {
287
294
  --line: var(--line-strong);
288
295
  --text-dim: var(--text-soft);
289
296
  --focus-ring: var(--accent);