@divami-artefacts/ai-design-system 1.0.5 → 1.0.7

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.
package/dist/index.js CHANGED
@@ -430,85 +430,139 @@ function ie({ rows: e = [], className: t, colors: r }) {
430
430
  });
431
431
  }
432
432
  //#endregion
433
+ //#region src/components/common/ToggleButton.tsx
434
+ function ae({ expanded: e, onToggle: t, labelExpanded: n = "View Less", labelCollapsed: r = "View More", "data-testid": i }) {
435
+ return /* @__PURE__ */ c("button", {
436
+ type: "button",
437
+ "data-testid": i,
438
+ onClick: t,
439
+ style: {
440
+ display: "flex",
441
+ width: 90,
442
+ height: 20,
443
+ justifyContent: "center",
444
+ alignItems: "center",
445
+ gap: 4,
446
+ boxSizing: "border-box",
447
+ border: "none",
448
+ borderRadius: 6,
449
+ color: "#FFAE43",
450
+ fontSize: 14,
451
+ fontFamily: "'Satoshi Variable', 'DM Sans', sans-serif",
452
+ fontStyle: "normal",
453
+ fontWeight: 400,
454
+ lineHeight: "19.5px",
455
+ textAlign: "center",
456
+ cursor: "pointer",
457
+ userSelect: "none"
458
+ },
459
+ children: [e ? n : r, /* @__PURE__ */ s("svg", {
460
+ width: "10",
461
+ height: "10",
462
+ viewBox: "0 0 10 10",
463
+ fill: "none",
464
+ style: { transform: e ? "rotate(180deg)" : "rotate(0deg)" },
465
+ children: /* @__PURE__ */ s("path", {
466
+ d: "M2 3.5L5 6.5L8 3.5",
467
+ stroke: "currentColor",
468
+ strokeWidth: "1.5",
469
+ strokeLinecap: "round",
470
+ strokeLinejoin: "round"
471
+ })
472
+ })]
473
+ });
474
+ }
475
+ //#endregion
433
476
  //#region src/components/commitmentRace/CommitmentRace.tsx
434
- var F = 680, I = 300, ae = [
477
+ var F = 680, I = 42, oe = 10, se = 24, ce = 24, le = 8, ue = [
435
478
  u.green,
436
479
  u.blue,
437
480
  u.cyan,
438
481
  u.amber,
439
482
  u.red
440
483
  ];
441
- function oe({ contractors: e = [], "data-testid": t }) {
442
- let r = a(null), i = a(0), o = a(/* @__PURE__ */ new Map()), l = [...e].sort((e, t) => (t.percentage ?? 0) - (e.percentage ?? 0)), { hoveredRef: d, tooltip: p, hitZonesRef: h } = C(r, {
484
+ function de(e) {
485
+ let t = Math.abs(e), n = e < 0 ? "-" : "";
486
+ return t >= 1e6 ? `${n}£${(t / 1e6).toFixed(1)}M` : t >= 1e3 ? `${n}£${(t / 1e3).toFixed(1)}K` : `${n}£${t.toFixed(0)}`;
487
+ }
488
+ function fe({ contractors: e = [], "data-testid": t }) {
489
+ let r = a(null), l = a(0), d = a(/* @__PURE__ */ new Map()), [p, h] = o(!1), g = i(() => [...e].sort((e, t) => (t.percentage ?? 0) - (e.percentage ?? 0)), [e]), x = i(() => p ? g : g.slice(0, le), [g, p]), T = x.length, D = se + ce + T * I + Math.max(0, T - 1) * oe, { hoveredRef: O, tooltip: k, hitZonesRef: A } = C(r, {
443
490
  width: F,
444
- height: I
491
+ height: D
445
492
  });
446
493
  return n(() => {
447
494
  let e = r.current;
448
495
  if (!e) return;
449
- let t = _(e, F, I);
450
- i.current = 0;
451
- let n = F * .13, a = F * .08, s = I * .08, c = I * .14, p = F - n - a, g, x = () => {
452
- i.current++;
453
- let e = i.current;
454
- t.clearRect(0, 0, F, I), h.current = [], o.current.forEach((e, t) => {
455
- let n = t === d.current ? 1 : 0, r = e + (n - e) * .12;
456
- Math.abs(r - n) < .005 ? n === 0 ? o.current.delete(t) : o.current.set(t, 1) : o.current.set(t, r);
457
- }), d.current && !o.current.has(d.current) && o.current.set(d.current, 0), y(t, F, I, e, 40, m(u.blue, .04)), l.forEach((r, i) => {
458
- let a = ae[i % ae.length], l = o.current.get(r.id) ?? 0, u = s + i * (c + 10);
459
- t.fillStyle = m(a, .04 + l * .04), t.beginPath(), t.roundRect(n, u, p, c, 3), t.fill(), t.strokeStyle = m(a, .08), t.lineWidth = 1, t.setLineDash([4, 4]), t.beginPath(), t.moveTo(n, u + c / 2), t.lineTo(n + p, u + c / 2), t.stroke(), t.setLineDash([]);
460
- let d = (r.percentage ?? 0) / 100, g = n + p * Math.min(d, d * E(Math.min(1, e * .005)));
461
- if (g > n + 4) {
462
- let e = t.createLinearGradient(n, 0, g, 0);
463
- e.addColorStop(0, m(a, .02)), e.addColorStop(1, m(a, .25 + l * .15)), t.fillStyle = e, t.beginPath(), t.roundRect(n, u + 2, g - n, c - 4, 2), t.fill();
496
+ let t = _(e, F, D);
497
+ l.current = 0;
498
+ let n = F * .13, i = F * .08, a = F - n - i, o, s = () => {
499
+ l.current++;
500
+ let e = l.current;
501
+ t.clearRect(0, 0, F, D), A.current = [], d.current.forEach((e, t) => {
502
+ let n = t === O.current ? 1 : 0, r = e + (n - e) * .12;
503
+ Math.abs(r - n) < .005 ? n === 0 ? d.current.delete(t) : d.current.set(t, 1) : d.current.set(t, r);
504
+ }), O.current && !d.current.has(O.current) && d.current.set(O.current, 0), y(t, F, D, e, 40, m(u.blue, .04)), x.forEach((r, i) => {
505
+ let o = ue[i % ue.length], s = d.current.get(r.id) ?? 0, c = se + i * (I + oe);
506
+ t.fillStyle = m(o, .04 + s * .04), t.beginPath(), t.roundRect(n, c, a, I, 3), t.fill(), t.strokeStyle = m(o, .08), t.lineWidth = 1, t.setLineDash([4, 4]), t.beginPath(), t.moveTo(n, c + I / 2), t.lineTo(n + a, c + I / 2), t.stroke(), t.setLineDash([]);
507
+ let l = (r.percentage ?? 0) / 100, u = n + a * Math.min(l, l * E(Math.min(1, e * .005)));
508
+ if (u > n + 4) {
509
+ let e = t.createLinearGradient(n, 0, u, 0);
510
+ e.addColorStop(0, m(o, .02)), e.addColorStop(1, m(o, .25 + s * .15)), t.fillStyle = e, t.beginPath(), t.roundRect(n, c + 2, u - n, I - 4, 2), t.fill();
464
511
  }
465
- v(t, g, u + c / 2, 18 + l * 8, a, .3 + l * .2), t.beginPath(), t.arc(g, u + c / 2, 5 + l * 2, 0, Math.PI * 2), t.fillStyle = m(a, .9), t.fill(), w(h.current, r.id, g, u + c / 2, 14, {
512
+ v(t, u, c + I / 2, 18 + s * 8, o, .3 + s * .2), t.beginPath(), t.arc(u, c + I / 2, 5 + s * 2, 0, Math.PI * 2), t.fillStyle = m(o, .9), t.fill();
513
+ let p = {
466
514
  label: r.name,
467
515
  value: `${r.percentage ?? 0}% commitment`,
468
- sublabel: `Base: £${r.base ?? 0}M · Variations: £${r.variation ?? 0}M`,
469
- color: a
470
- }), t.font = "bold " + f.font, t.fillStyle = m(a, .9 + l * .1), t.textAlign = "left", t.textBaseline = "middle", t.fillText(`${r.percentage ?? 0}%`, g + 10, u + c / 2), t.font = `${l > 0 ? "bold " : ""}` + f.font, t.fillStyle = l > 0 ? a : f.color, t.textAlign = "right", t.fillText(r.abbreviation ?? r.name.slice(0, 6), n - 8, u + c / 2);
471
- }), t.strokeStyle = m(u.t3, .3), t.lineWidth = 1, t.setLineDash([]), t.beginPath(), t.moveTo(n + p, s), t.lineTo(n + p, s + (l.length - 1) * (c + 10) + c), t.stroke(), b(t, F, I, e, .015), g = requestAnimationFrame(x);
516
+ sublabel: `Base: ${de(r.base ?? 0)} · Variations: ${de(r.variation ?? 0)}`,
517
+ color: o
518
+ };
519
+ w(A.current, r.id, u, c + I / 2, 14, p), t.font = "bold " + f.font, t.fillStyle = m(o, .9 + s * .1), t.textAlign = "left", t.textBaseline = "middle", t.fillText(`${r.percentage ?? 0}%`, u + 10, c + I / 2), t.font = `${s > 0 ? "bold " : ""}` + f.font, t.fillStyle = s > 0 ? o : f.color, t.textAlign = "right", t.fillText(r.abbreviation ?? r.name.slice(0, 6), n - 8, c + I / 2);
520
+ }), t.strokeStyle = m(u.t3, .3), t.lineWidth = 1, t.setLineDash([]), t.beginPath(), t.moveTo(n + a, se), t.lineTo(n + a, se + (T - 1) * (I + oe) + I), t.stroke(), b(t, F, D, e, .015), o = requestAnimationFrame(s);
472
521
  };
473
- return x(), () => cancelAnimationFrame(g);
474
- }, [l]), /* @__PURE__ */ c("div", {
522
+ return s(), () => cancelAnimationFrame(o);
523
+ }, [x, D]), /* @__PURE__ */ c("div", {
475
524
  "data-testid": t,
476
- style: {
477
- position: "relative",
478
- width: F,
479
- height: I
480
- },
481
- children: [/* @__PURE__ */ s("canvas", {
482
- ref: r,
483
- role: "img",
484
- "aria-label": "Commitment race — contractors ranked by commitment percentage",
485
- style: {
486
- width: F,
487
- height: I,
488
- display: "block",
489
- borderRadius: 8
490
- }
491
- }), /* @__PURE__ */ s(S, {
492
- ...p,
493
- parentW: F,
494
- parentH: I
525
+ style: { width: F },
526
+ children: [/* @__PURE__ */ c("div", {
527
+ style: { position: "relative" },
528
+ children: [/* @__PURE__ */ s("canvas", {
529
+ ref: r,
530
+ role: "img",
531
+ "aria-label": "Commitment race — contractors ranked by commitment percentage",
532
+ style: {
533
+ width: F,
534
+ height: D,
535
+ display: "block",
536
+ borderRadius: 8
537
+ }
538
+ }), /* @__PURE__ */ s(S, {
539
+ ...k,
540
+ parentW: F,
541
+ parentH: D
542
+ })]
543
+ }), e.length > le && /* @__PURE__ */ s("div", {
544
+ style: { marginTop: 8 },
545
+ children: /* @__PURE__ */ s(ae, {
546
+ expanded: p,
547
+ onToggle: () => h((e) => !e)
548
+ })
495
549
  })]
496
550
  });
497
551
  }
498
552
  //#endregion
499
553
  //#region src/components/compensationGauge/CompensationGauge.tsx
500
- var se = 480, ce = 340;
501
- function le({ pct: e, confirmed: t, total: r, "data-testid": i }) {
554
+ var pe = 480, me = 340;
555
+ function he({ pct: e, confirmed: t, total: r, "data-testid": i }) {
502
556
  let o = a(null), c = a(0);
503
557
  return n(() => {
504
558
  let n = o.current;
505
559
  if (!n) return;
506
- let i = _(n, se, ce);
560
+ let i = _(n, pe, me);
507
561
  c.current = 0;
508
- let a = se / 2, s = Math.PI, l = 2 * Math.PI, d = Math.PI, p, h = () => {
562
+ let a = pe / 2, s = Math.PI, l = 2 * Math.PI, d = Math.PI, p, h = () => {
509
563
  c.current++;
510
564
  let n = c.current;
511
- i.clearRect(0, 0, se, ce);
565
+ i.clearRect(0, 0, pe, me);
512
566
  let o = E(Math.min(n / 80, 1)), g = k(Math.min(n / 72, 1));
513
567
  i.beginPath(), i.arc(a, 220, 120, s, l), i.strokeStyle = m(u.bd, .35), i.lineWidth = 46, i.stroke(), [
514
568
  {
@@ -568,16 +622,16 @@ function le({ pct: e, confirmed: t, total: r, "data-testid": i }) {
568
622
  "data-testid": i,
569
623
  style: {
570
624
  position: "relative",
571
- width: se,
572
- height: ce
625
+ width: pe,
626
+ height: me
573
627
  },
574
628
  children: /* @__PURE__ */ s("canvas", {
575
629
  ref: o,
576
630
  role: "img",
577
631
  "aria-label": `Compensation event gauge — ${e}% of NCEs confirmed as compensation events`,
578
632
  style: {
579
- width: se,
580
- height: ce,
633
+ width: pe,
634
+ height: me,
581
635
  display: "block"
582
636
  }
583
637
  })
@@ -585,7 +639,7 @@ function le({ pct: e, confirmed: t, total: r, "data-testid": i }) {
585
639
  }
586
640
  //#endregion
587
641
  //#region src/canvas/useCanvasLoop.ts
588
- function ue(e, t, r, i, o = !0, s = {}) {
642
+ function ge(e, t, r, i, o = !0, s = {}) {
589
643
  let c = a(0), { easing: l = E, durationFrames: u = 48 } = s;
590
644
  n(() => {
591
645
  let n = e.current;
@@ -617,29 +671,29 @@ function ue(e, t, r, i, o = !0, s = {}) {
617
671
  }
618
672
  //#endregion
619
673
  //#region src/components/contractBars/ContractBars.tsx
620
- var L = 780, R = 234, de = 130, fe = 52, pe = [
674
+ var L = 780, _e = 234, ve = 130, ye = 52, be = [
621
675
  u.blue,
622
676
  u.cyan,
623
677
  u.amber,
624
678
  u.purple,
625
679
  u.green
626
- ], me = [
680
+ ], xe = [
627
681
  "Base Value",
628
682
  "Variations",
629
683
  "Commitment"
630
- ], he = [
684
+ ], Se = [
631
685
  "Base",
632
686
  "Var",
633
687
  "Commit"
634
688
  ];
635
- function ge({ contractors: e = [], "data-testid": t }) {
689
+ function Ce({ contractors: e = [], "data-testid": t }) {
636
690
  let n = a(null), r = a(/* @__PURE__ */ new Map()), { hoveredRef: o, tooltip: l, hitZonesRef: d } = C(n, {
637
691
  width: L,
638
- height: R
692
+ height: _e
639
693
  }), f = i(() => {
640
694
  let t = Math.max(...e.map((e) => e.base ?? 0)), n = Math.max(...e.map((e) => e.variation ?? 0));
641
695
  return e.map((e, r) => {
642
- let i = L * (.12 + r * .19), a = de, o = Math.min(L * .075, fe), s = pe[r % pe.length], c = [
696
+ let i = L * (.12 + r * .19), a = ve, o = Math.min(L * .075, ye), s = be[r % be.length], c = [
643
697
  (e.base ?? 0) / (t || 1) * 100,
644
698
  (e.variation ?? 0) / (n || 1) * 100,
645
699
  e.percentage ?? 0
@@ -648,10 +702,10 @@ function ge({ contractors: e = [], "data-testid": t }) {
648
702
  `£${e.variation ?? 0}M`,
649
703
  `${e.percentage ?? 0}%`
650
704
  ], u = c.map((e, t) => {
651
- let n = -Math.PI / 2 + t / me.length * Math.PI * 2, r = e / 100, s = o * Math.max(.08, r);
705
+ let n = -Math.PI / 2 + t / xe.length * Math.PI * 2, r = e / 100, s = o * Math.max(.08, r);
652
706
  return {
653
- name: me[t],
654
- short: he[t],
707
+ name: xe[t],
708
+ short: Se[t],
655
709
  label: l[t],
656
710
  val: Math.round(e),
657
711
  x: i + Math.cos(n) * s,
@@ -671,8 +725,8 @@ function ge({ contractors: e = [], "data-testid": t }) {
671
725
  };
672
726
  });
673
727
  }, [e]);
674
- return ue(n, L, R, (e, t, n) => {
675
- M(r.current, o.current), d.current = [], y(e, L, R, n, 30), f.forEach((t, i) => {
728
+ return ge(n, L, _e, (e, t, n) => {
729
+ M(r.current, o.current), d.current = [], y(e, L, _e, n, 30), f.forEach((t, i) => {
676
730
  let a = t.color, o = `constellation-${i}`, s = r.current.get(o) ?? 0;
677
731
  e.beginPath(), e.arc(t.cx, t.cy, t.baseR + 5, 0, Math.PI * 2), e.strokeStyle = m(u.bd, .08 + .08 * s), e.lineWidth = .5, e.stroke(), e.beginPath(), t.stars.forEach((t, n) => {
678
732
  n === 0 ? e.moveTo(t.x, t.y) : e.lineTo(t.x, t.y);
@@ -680,25 +734,25 @@ function ge({ contractors: e = [], "data-testid": t }) {
680
734
  let c = A(n, .05, 5e-4) * .3 + .7, l = 3.5 * c, u = `star-${i}-${s}`, f = r.current.get(u) ?? 0, p = e.createRadialGradient(o.x, o.y, 0, o.x, o.y, l * 4);
681
735
  p.addColorStop(0, m(a, (.2 + .1 * f) * c)), p.addColorStop(1, m(a, 0)), e.fillStyle = p, e.beginPath(), e.arc(o.x, o.y, l * 4, 0, Math.PI * 2), e.fill(), e.beginPath(), e.arc(o.x, o.y, l + f * 2, 0, Math.PI * 2), e.fillStyle = m(a, (.8 + .2 * f) * c), e.fill();
682
736
  let h = Math.sin(o.angle) < -.3;
683
- e.textAlign = "center", e.textBaseline = "middle", h ? (e.font = "8px 'DM Sans', sans-serif", e.fillStyle = m(a, .5 + .15 * f), e.fillText(o.short, o.x, o.y - 24), e.font = "bold 11px 'JetBrains Mono', monospace", e.fillStyle = m(a, .8 + .15 * f), e.fillText(o.label, o.x, o.y - 11)) : (e.font = "8px 'DM Sans', sans-serif", e.fillStyle = m(a, .5 + .15 * f), e.fillText(o.short, o.x, o.y + 11), e.font = "bold 11px 'JetBrains Mono', monospace", e.fillStyle = m(a, .8 + .15 * f), e.fillText(o.label, o.x, o.y + 24)), w(d.current, u, o.x, o.y, l * 4 + 2, {
737
+ e.textAlign = "center", e.textBaseline = "middle", h ? (e.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = m(a, .5 + .15 * f), e.fillText(o.short, o.x, o.y - 24), e.font = "500 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = m(a, .8 + .15 * f), e.fillText(o.label, o.x, o.y - 11)) : (e.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = m(a, .5 + .15 * f), e.fillText(o.short, o.x, o.y + 11), e.font = "500 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = m(a, .8 + .15 * f), e.fillText(o.label, o.x, o.y + 24)), w(d.current, u, o.x, o.y, l * 4 + 2, {
684
738
  label: o.name,
685
739
  value: o.label,
686
740
  sublabel: t.abbreviation ?? t.name.slice(0, 6),
687
741
  color: a
688
742
  });
689
- }), s > 0 && v(e, t.cx, t.cy, 16 * s, a, .15 * s), e.beginPath(), e.arc(t.cx, t.cy, t.baseR + 12, 0, Math.PI * 2), e.strokeStyle = m(a, .1 + A(n, .03, 5e-4) * .05), e.lineWidth = 1, e.stroke(), e.font = "bold 11px 'DM Sans', sans-serif", e.textAlign = "center", e.textBaseline = "alphabetic", e.fillStyle = m(u.t2, .65 + s * .25), e.fillText(t.abbreviation ?? t.name.slice(0, 6), t.cx, t.cy + t.baseR + 26), w(d.current, o, t.cx, t.cy, t.baseR + 5, {
743
+ }), s > 0 && v(e, t.cx, t.cy, 16 * s, a, .15 * s), e.beginPath(), e.arc(t.cx, t.cy, t.baseR + 12, 0, Math.PI * 2), e.strokeStyle = m(a, .1 + A(n, .03, 5e-4) * .05), e.lineWidth = 1, e.stroke(), e.font = "500 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.textAlign = "center", e.textBaseline = "alphabetic", e.fillStyle = m(u.t2, .65 + s * .25), e.fillText(t.abbreviation ?? t.name.slice(0, 6), t.cx, t.cy + t.baseR + 26), w(d.current, o, t.cx, t.cy, t.baseR + 5, {
690
744
  label: t.name,
691
745
  value: `£${t.total ?? 0}M total`,
692
746
  sublabel: `${t.percentage ?? 0}% committed · scatter ${t.scatter.toFixed(1)}`,
693
747
  color: a
694
748
  });
695
- }), e.font = "11px 'DM Sans', sans-serif", e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = m(u.t4, .55), e.fillText("▲ top = Base value · ▼▸ lower-right = Variations · ◂▼ lower-left = Commitment % · hover stars for details", L / 2, R - 14), b(e, L, R, n, .012);
749
+ }), e.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.textAlign = "center", e.textBaseline = "middle", e.fillStyle = u.t2, e.fillText("▲ top = Base value · ▼▸ lower-right = Variations · ◂▼ lower-left = Commitment % · hover stars for details", L / 2, _e - 14), b(e, L, _e, n, .012);
696
750
  }, !0), /* @__PURE__ */ c("div", {
697
751
  "data-testid": t,
698
752
  style: {
699
753
  position: "relative",
700
754
  width: L,
701
- height: R
755
+ height: _e
702
756
  },
703
757
  children: [/* @__PURE__ */ s("canvas", {
704
758
  ref: n,
@@ -706,121 +760,133 @@ function ge({ contractors: e = [], "data-testid": t }) {
706
760
  "aria-label": "Contract value breakdown per contractor — multi-KPI constellation chart",
707
761
  style: {
708
762
  width: L,
709
- height: R,
763
+ height: _e,
710
764
  display: "block"
711
765
  }
712
766
  }), /* @__PURE__ */ s(S, {
713
767
  ...l,
714
768
  parentW: L,
715
- parentH: R
769
+ parentH: _e
716
770
  })]
717
771
  });
718
772
  }
719
773
  //#endregion
720
774
  //#region src/components/contractValueOrb/ContractValueOrb.tsx
721
- var _e = 680, ve = 220, ye = [
775
+ var we = 680, Te = 220, Ee = 8, De = [
722
776
  u.blue,
723
777
  u.cyan,
724
778
  u.amber,
725
779
  u.purple,
726
780
  u.green
727
- ], z = {
781
+ ], R = {
728
782
  left: 8,
729
- right: 64,
783
+ right: 80,
730
784
  top: 16,
731
785
  bottom: 38
732
- }, be = 88, B = 18;
733
- function xe({ data: e, "data-testid": t }) {
734
- let n = a(null), r = a(/* @__PURE__ */ new Map()), { hoveredRef: i, tooltip: o, hitZonesRef: l } = C(n, {
735
- width: _e,
736
- height: ve
737
- }), { contractors: d = [], totals: h } = e, g = d.length, _ = Math.max(...d.map((e) => e.total ?? 0), 1), y = _e - z.left - be - z.right, b = g > 1 ? (ve - z.top - z.bottom - g * B) / (g - 1) : 0;
738
- return ue(n, _e, ve, (e, t) => {
739
- M(r.current, i.current), l.current = [], d.forEach((n, i) => {
740
- let a = ye[i % ye.length], o = j(t, i, g, D), s = z.top + i * (B + b), c = z.left + be, d = r.current.get(n.id) ?? 0, p = (n.base ?? 0) / _ * y * o, h = (n.total ?? 0) / _ * y * o, x = h - p;
741
- e.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = d > 0 ? a : f.color, e.textAlign = "right", e.textBaseline = "middle", e.fillText(n.abbreviation ?? n.name.slice(0, 6), c - 8, s + B / 2), e.fillStyle = m(u.bd, .25), e.beginPath(), e.roundRect(c, s, y, B, 4), e.fill(), p > 0 && (d > 0 && v(e, c + p / 2, s + B / 2, p * .3, a, .1 * d), e.fillStyle = m(a, .5 + d * .15), e.beginPath(), e.roundRect(c, s, p, B, 4), e.fill()), x > 2 && (e.fillStyle = m(a, .22 + d * .08), e.beginPath(), e.roundRect(c + p, s, x, B, [
786
+ }, Oe = 88, z = 18;
787
+ function ke(e) {
788
+ let t = Math.abs(e), n = e < 0 ? "-" : "";
789
+ return t >= 1e6 ? `${n}£${(t / 1e6).toFixed(1)}M` : t >= 1e3 ? `${n}£${(t / 1e3).toFixed(1)}K` : `${n}£${t.toFixed(0)}`;
790
+ }
791
+ function Ae({ data: e, "data-testid": t }) {
792
+ let n = a(null), r = a(/* @__PURE__ */ new Map()), [i, l] = o(!1), { contractors: d = [], totals: h } = e, g = [...d].sort((e, t) => (t.total ?? 0) - (e.total ?? 0)), _ = i ? g : g.slice(0, Ee), y = _.length, b = Math.max(...g.map((e) => Math.abs(e.total ?? 0)), 1), x = Math.max(Te, R.top + R.bottom + y * z + Math.max(0, y - 1) * 8), w = we - R.left - Oe - R.right, E = y > 1 ? (x - R.top - R.bottom - y * z) / (y - 1) : 0, { hoveredRef: O, tooltip: k, hitZonesRef: A } = C(n, {
793
+ width: we,
794
+ height: x
795
+ });
796
+ return ge(n, we, x, (e, t) => {
797
+ M(r.current, O.current), A.current = [], _.forEach((n, i) => {
798
+ let a = De[i % De.length], o = j(t, i, y, D), s = R.top + i * (z + E), c = R.left + Oe, l = r.current.get(n.id) ?? 0, d = Math.max(n.base ?? 0, 0), p = Math.max(n.total ?? 0, 0), h = d / b * w * o, g = p / b * w * o, _ = g - h;
799
+ e.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = l > 0 ? a : f.color, e.textAlign = "right", e.textBaseline = "middle", e.fillText(n.abbreviation ?? n.name.slice(0, 6), c - 8, s + z / 2), e.fillStyle = m(u.bd, .25), e.beginPath(), e.roundRect(c, s, w, z, 4), e.fill(), h > 0 && (l > 0 && v(e, c + h / 2, s + z / 2, h * .3, a, .1 * l), e.fillStyle = m(a, .5 + l * .15), e.beginPath(), e.roundRect(c, s, h, z, 4), e.fill()), _ > 2 && (e.fillStyle = m(a, .22 + l * .08), e.beginPath(), e.roundRect(c + h, s, _, z, [
742
800
  0,
743
801
  4,
744
802
  4,
745
803
  0
746
- ]), e.fill(), e.setLineDash([2, 3]), e.strokeStyle = m(a, .55), e.lineWidth = 1, e.beginPath(), e.moveTo(c + p, s + 3), e.lineTo(c + p, s + B - 3), e.stroke(), e.setLineDash([])), d > 0 && h > 0 && (e.strokeStyle = m(a, .5 * d), e.lineWidth = 1, e.setLineDash([]), e.beginPath(), e.roundRect(c, s, h, B, 4), e.stroke()), o > .35 && (e.globalAlpha = Math.min(1, (o - .35) / .4), e.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = d > 0 ? a : u.t2, e.textAlign = "left", e.textBaseline = "middle", e.fillText(`£${n.total ?? 0}M`, c + h + 6, s + B / 2), e.globalAlpha = 1), T(l.current, n.id, c, s, Math.max(h, 1), B, {
804
+ ]), e.fill(), e.setLineDash([2, 3]), e.strokeStyle = m(a, .55), e.lineWidth = 1, e.beginPath(), e.moveTo(c + h, s + 3), e.lineTo(c + h, s + z - 3), e.stroke(), e.setLineDash([])), l > 0 && g > 0 && (e.strokeStyle = m(a, .5 * l), e.lineWidth = 1, e.setLineDash([]), e.beginPath(), e.roundRect(c, s, g, z, 4), e.stroke()), o > .35 && (e.globalAlpha = Math.min(1, (o - .35) / .4), e.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", e.fillStyle = l > 0 ? a : u.t1, e.textAlign = "left", e.textBaseline = "middle", e.fillText(ke(n.total ?? 0), c + g + 6, s + z / 2), e.globalAlpha = 1), T(A.current, n.id, c, s, Math.max(g, 1), z, {
747
805
  label: n.name,
748
- value: `£${n.total ?? 0}M total`,
749
- sublabel: `Base £${n.base ?? 0}M + Var £${n.variation ?? 0}M · ${n.percentage ?? 0}% committed`,
806
+ value: `${ke(n.total ?? 0)} total`,
807
+ sublabel: `Base ${ke(n.base ?? 0)} + Var ${ke(n.variation ?? 0)} · ${n.percentage ?? 0}% committed`,
750
808
  color: a
751
809
  });
752
810
  });
753
- let n = ve - 14;
754
- e.textBaseline = "middle", e.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.textAlign = "left", e.fillStyle = m(u.cyan, .5), e.beginPath(), e.roundRect(z.left + be, n - 3, 14, 6, 2), e.fill(), e.fillStyle = p.color, e.fillText("base value", z.left + be + 18, n), e.fillStyle = m(u.cyan, .22), e.beginPath(), e.roundRect(z.left + be + 94, n - 3, 14, 6, 2), e.fill(), e.setLineDash([2, 3]), e.strokeStyle = m(u.cyan, .5), e.lineWidth = .5, e.beginPath(), e.moveTo(z.left + be + 101, n - 3), e.lineTo(z.left + be + 101, n + 3), e.stroke(), e.setLineDash([]), e.fillStyle = p.color, e.fillText("approved variations", z.left + be + 112, n), e.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.textAlign = "right", e.fillStyle = p.color, e.fillText(`Portfolio: £${h?.total ?? 0}M`, _e - 8, n);
811
+ let n = x - 14;
812
+ e.textBaseline = "middle", e.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.textAlign = "left", e.fillStyle = m(u.cyan, .5), e.beginPath(), e.roundRect(R.left + Oe, n - 3, 14, 6, 2), e.fill(), e.fillStyle = p.color, e.fillText("base value", R.left + Oe + 18, n), e.fillStyle = m(u.cyan, .22), e.beginPath(), e.roundRect(R.left + Oe + 94, n - 3, 14, 6, 2), e.fill(), e.setLineDash([2, 3]), e.strokeStyle = m(u.cyan, .5), e.lineWidth = .5, e.beginPath(), e.moveTo(R.left + Oe + 101, n - 3), e.lineTo(R.left + Oe + 101, n + 3), e.stroke(), e.setLineDash([]), e.fillStyle = p.color, e.fillText("approved variations", R.left + Oe + 112, n), e.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", e.textAlign = "right", e.fillStyle = p.color, e.fillText(`Portfolio: ${ke(h?.total ?? 0)}`, we - 8, n);
755
813
  }, !0, { easing: D }), /* @__PURE__ */ c("div", {
756
814
  "data-testid": t,
757
815
  style: {
758
- position: "relative",
759
- width: _e,
760
- height: ve
816
+ width: we,
817
+ transition: "all 0.25s ease"
761
818
  },
762
- children: [/* @__PURE__ */ s("canvas", {
763
- ref: n,
764
- role: "img",
765
- "aria-label": "Total contract value per contractor — horizontal bar chart",
766
- style: {
767
- width: _e,
768
- height: ve,
769
- display: "block",
770
- borderRadius: 8
771
- }
772
- }), /* @__PURE__ */ s(S, {
773
- ...o,
774
- parentW: _e,
775
- parentH: ve
819
+ children: [/* @__PURE__ */ c("div", {
820
+ style: { position: "relative" },
821
+ children: [/* @__PURE__ */ s("canvas", {
822
+ ref: n,
823
+ role: "img",
824
+ "aria-label": "Total contract value per contractor — horizontal bar chart",
825
+ style: {
826
+ width: we,
827
+ height: x,
828
+ display: "block",
829
+ borderRadius: 8
830
+ }
831
+ }), /* @__PURE__ */ s(S, {
832
+ ...k,
833
+ parentW: we,
834
+ parentH: x
835
+ })]
836
+ }), d.length > Ee && /* @__PURE__ */ s("div", {
837
+ style: { marginTop: 8 },
838
+ children: /* @__PURE__ */ s(ae, {
839
+ expanded: i,
840
+ onToggle: () => l((e) => !e)
841
+ })
776
842
  })]
777
843
  });
778
844
  }
779
845
  //#endregion
780
846
  //#region src/components/contractorRank/ContractorRank.tsx
781
- var Se = 780, V = 240, Ce = 12, we = 10, Te = [
847
+ var B = 780, V = 240, je = 12, Me = 10, Ne = [
782
848
  "Highest exposure",
783
849
  "Elevated risk",
784
850
  "Moderate exposure",
785
851
  "Moderate exposure",
786
852
  "Low exposure"
787
853
  ];
788
- function Ee({ contractors: e = [], "data-testid": t }) {
854
+ function Pe({ contractors: e = [], "data-testid": t }) {
789
855
  let r = a(null), i = a(0), o = a(/* @__PURE__ */ new Map()), { hoveredRef: l, tooltip: p, hitZonesRef: h } = C(r, {
790
- width: Se,
856
+ width: B,
791
857
  height: V
792
858
  }), g = [...e].sort((e, t) => (t.count ?? 0) - (e.count ?? 0)).slice(0, 5), y = g.reduce((e, t) => e + (t.count ?? 0), 0);
793
859
  return n(() => {
794
860
  let e = r.current;
795
861
  if (!e) return;
796
- let t = _(e, Se, V);
862
+ let t = _(e, B, V);
797
863
  i.current = 0;
798
- let n = Math.min(5, g.length), a = (Se - 2 * Ce - (n - 1) * we) / n, s = V * .84, c = V * .08, p, x = () => {
864
+ let n = Math.min(5, g.length), a = (B - 2 * je - (n - 1) * Me) / n, s = V * .84, c = V * .08, p, x = () => {
799
865
  i.current++;
800
866
  let e = i.current;
801
- t.clearRect(0, 0, Se, V), h.current = [], o.current.forEach((e, t) => {
867
+ t.clearRect(0, 0, B, V), h.current = [], o.current.forEach((e, t) => {
802
868
  let n = t === l.current ? 1 : 0, r = e + (n - e) * .12;
803
869
  Math.abs(r - n) < .005 ? n === 0 ? o.current.delete(t) : o.current.set(t, 1) : o.current.set(t, r);
804
870
  }), l.current && !o.current.has(l.current) && o.current.set(l.current, 0), g.forEach((n, r) => {
805
- let i = r === 0, l = r === 0 ? u.red : r === 1 ? u.amber : d[r % d.length], p = Ce + r * (a + we), g = o.current.get(n.id) ?? 0, _ = g * 8, b = p - _ / 2, x = a + _, S = i ? A(e, .04, 3e-4) * .06 + .06 : 0;
871
+ let i = r === 0, l = r === 0 ? u.red : r === 1 ? u.amber : d[r % d.length], p = je + r * (a + Me), g = o.current.get(n.id) ?? 0, _ = g * 8, b = p - _ / 2, x = a + _, S = i ? A(e, .04, 3e-4) * .06 + .06 : 0;
806
872
  t.fillStyle = m(l, .08 + g * .07), t.beginPath(), t.roundRect(b, c, x, s, 6), t.fill(), t.strokeStyle = m(l, .2 + g * .4 + S), t.lineWidth = i ? 1.5 : 1, t.stroke(), (g > .01 || i) && v(t, b + x / 2, c + s / 2, x * .55, l, S + g * .14), t.font = "bold " + f.font, t.textAlign = "left", t.textBaseline = "top", t.fillStyle = m(l, .5 + g * .35), t.fillText(`#${r + 1}`, b + 7, c + 6);
807
873
  let C = Math.min(a * .28, s * .32, 72), w = b + x / 2, E = c + s * .38, D = t.createRadialGradient(w, E - C * .2, 0, w, E, C);
808
874
  D.addColorStop(0, m(l, .5 + g * .2)), D.addColorStop(1, m(l, .2 + g * .1)), t.beginPath(), t.arc(w, E, C, 0, Math.PI * 2), t.fillStyle = D, t.fill(), t.strokeStyle = m(l, .4 + g * .3), t.lineWidth = 1, t.stroke(), t.font = "bold " + f.font, t.textAlign = "center", t.textBaseline = "middle", t.fillStyle = m(u.t1, .9), t.fillText(n.abbreviation ?? n.name.slice(0, 6), w, E), t.font = "bold 14px 'Satoshi Variable', 'DM Sans', sans-serif", t.textBaseline = "alphabetic", t.fillStyle = m(l, .9 + g * .1), t.fillText(String(n.count ?? 0), w, c + s * .76), t.font = f.font, t.fillStyle = f.color, t.fillText("open EWs", w, c + s * .88);
809
- let O = Math.round((n.count ?? 0) / (y || 1) * 100), k = Te[r] ?? "Low exposure";
875
+ let O = Math.round((n.count ?? 0) / (y || 1) * 100), k = Ne[r] ?? "Low exposure";
810
876
  T(h.current, n.id, p, c, a, s, {
811
877
  label: n.name,
812
878
  value: `${n.count ?? 0} open · ${O}% of total`,
813
879
  sublabel: `Rank #${r + 1} · ${k}`,
814
880
  color: l
815
881
  });
816
- }), b(t, Se, V, e, .015), p = requestAnimationFrame(x);
882
+ }), b(t, B, V, e, .015), p = requestAnimationFrame(x);
817
883
  };
818
884
  return x(), () => cancelAnimationFrame(p);
819
885
  }, [g, y]), /* @__PURE__ */ c("div", {
820
886
  "data-testid": t,
821
887
  style: {
822
888
  position: "relative",
823
- width: Se,
889
+ width: B,
824
890
  height: V
825
891
  },
826
892
  children: [/* @__PURE__ */ s("canvas", {
@@ -828,14 +894,14 @@ function Ee({ contractors: e = [], "data-testid": t }) {
828
894
  role: "img",
829
895
  "aria-label": "Contractor rank — open EW count per contractor",
830
896
  style: {
831
- width: Se,
897
+ width: B,
832
898
  height: V,
833
899
  display: "block",
834
900
  borderRadius: 8
835
901
  }
836
902
  }), /* @__PURE__ */ s(S, {
837
903
  ...p,
838
- parentW: Se,
904
+ parentW: B,
839
905
  parentH: V
840
906
  })]
841
907
  });
@@ -843,7 +909,7 @@ function Ee({ contractors: e = [], "data-testid": t }) {
843
909
  //#endregion
844
910
  //#region src/components/ewCategory/EWCategory.tsx
845
911
  var H = 680, U = 260;
846
- function De({ categories: e = [], "data-testid": t }) {
912
+ function Fe({ categories: e = [], "data-testid": t }) {
847
913
  let r = a(null), i = a(0), o = a(/* @__PURE__ */ new Map()), { hoveredRef: l, tooltip: d, hitZonesRef: f } = C(r, {
848
914
  width: H,
849
915
  height: U
@@ -906,7 +972,7 @@ function De({ categories: e = [], "data-testid": t }) {
906
972
  }
907
973
  //#endregion
908
974
  //#region src/components/lineChart/LineChart.tsx
909
- function Oe({ rows: e = [], className: t, colors: n }) {
975
+ function Ie({ rows: e = [], className: t, colors: n }) {
910
976
  return /* @__PURE__ */ s(te, {
911
977
  rows: e,
912
978
  variant: "line",
@@ -916,7 +982,7 @@ function Oe({ rows: e = [], className: t, colors: n }) {
916
982
  }
917
983
  //#endregion
918
984
  //#region src/components/constants.ts
919
- var ke = [
985
+ var Le = [
920
986
  "#36BFFA",
921
987
  "#16B364",
922
988
  "#D444F1",
@@ -925,7 +991,7 @@ var ke = [
925
991
  "#7A5AF8",
926
992
  "#EF6820",
927
993
  "#D92D20"
928
- ], Ae = {
994
+ ], Re = {
929
995
  nodes: [
930
996
  {
931
997
  id: "supplier-x",
@@ -968,8 +1034,8 @@ var ke = [
968
1034
  };
969
1035
  //#endregion
970
1036
  //#region src/components/miniBars/MiniBars.tsx
971
- function je({ rows: e = [], className: t, colors: n }) {
972
- let r = n?.slices ?? ke;
1037
+ function ze({ rows: e = [], className: t, colors: n }) {
1038
+ let r = n?.slices ?? Le;
973
1039
  return /* @__PURE__ */ s("div", {
974
1040
  className: ["d3-mini-bars", t].filter(Boolean).join(" "),
975
1041
  children: e.map(([e, t, n], i) => /* @__PURE__ */ c("div", {
@@ -995,7 +1061,7 @@ function je({ rows: e = [], className: t, colors: n }) {
995
1061
  width: Math.max(0, Math.min(100, t)),
996
1062
  height: "12",
997
1063
  rx: "6",
998
- className: `d3-mini-fill tone-${i % ke.length}`,
1064
+ className: `d3-mini-fill tone-${i % Le.length}`,
999
1065
  fill: r[i % r.length]
1000
1066
  })]
1001
1067
  })
@@ -1007,24 +1073,24 @@ function je({ rows: e = [], className: t, colors: n }) {
1007
1073
  }
1008
1074
  //#endregion
1009
1075
  //#region src/components/nceTree/NCETree.tsx
1010
- var Me = 680, Ne = 320;
1011
- function Pe({ total: e = 0, byContractor: t = [], "data-testid": r }) {
1076
+ var Be = 680, Ve = 320;
1077
+ function He({ total: e = 0, byContractor: t = [], "data-testid": r }) {
1012
1078
  let i = a(null), o = a(/* @__PURE__ */ new Map()), l = a(0), { hoveredRef: p, tooltip: h, hitZonesRef: g } = C(i, {
1013
- width: Me,
1014
- height: Ne
1079
+ width: Be,
1080
+ height: Ve
1015
1081
  });
1016
1082
  return n(() => {
1017
1083
  let n = i.current;
1018
1084
  if (!n) return;
1019
- let r = _(n, Me, Ne);
1085
+ let r = _(n, Be, Ve);
1020
1086
  l.current = 0;
1021
- let a = Ne / 2, s = Me - 80, c = Math.max(...t.map((e) => e.count ?? 0)), h = (Ne - 60) / (t.length - 1), y = t.map((e, t) => ({
1087
+ let a = Ve / 2, s = Be - 80, c = Math.max(...t.map((e) => e.count ?? 0)), h = (Ve - 60) / (t.length - 1), y = t.map((e, t) => ({
1022
1088
  x: s,
1023
1089
  y: 30 + t * h
1024
1090
  })), b, x = () => {
1025
1091
  l.current++;
1026
1092
  let n = l.current;
1027
- r.clearRect(0, 0, Me, Ne);
1093
+ r.clearRect(0, 0, Be, Ve);
1028
1094
  let i = E(Math.min(n / 72, 1));
1029
1095
  M(o.current, p.current), g.current = [], v(r, 88, a, 48 * i, u.blue, .15 * i), t.forEach((n, l) => {
1030
1096
  let p = d[l % d.length], h = j(i, l, t.length, E), _ = y[l], b = o.current.get(n.id) ?? 0, x = Math.max(1.5, (n.count ?? 0) / c * 6);
@@ -1051,42 +1117,42 @@ function Pe({ total: e = 0, byContractor: t = [], "data-testid": r }) {
1051
1117
  "data-testid": r,
1052
1118
  style: {
1053
1119
  position: "relative",
1054
- width: Me,
1055
- height: Ne
1120
+ width: Be,
1121
+ height: Ve
1056
1122
  },
1057
1123
  children: [/* @__PURE__ */ s("canvas", {
1058
1124
  ref: i,
1059
1125
  role: "img",
1060
1126
  "aria-label": "NCE fault tree — NCEs per contractor as branching tree",
1061
1127
  style: {
1062
- width: Me,
1063
- height: Ne,
1128
+ width: Be,
1129
+ height: Ve,
1064
1130
  display: "block"
1065
1131
  }
1066
1132
  }), /* @__PURE__ */ s(S, {
1067
1133
  ...h,
1068
- parentW: Me,
1069
- parentH: Ne
1134
+ parentW: Be,
1135
+ parentH: Ve
1070
1136
  })]
1071
1137
  });
1072
1138
  }
1073
1139
  //#endregion
1074
1140
  //#region src/components/pieChart/PieChart.tsx
1075
- var Fe = 192, Ie = Fe, Le = Fe + 80;
1076
- function Re({ rows: e = [], variant: t, className: r, colors: i }) {
1141
+ var Ue = 192, We = Ue, Ge = Ue + 80;
1142
+ function Ke({ rows: e = [], variant: t, className: r, colors: i }) {
1077
1143
  let o = a(null), f = a(/* @__PURE__ */ new Map()), p = a(0), h = i?.slices ?? d, { hoveredRef: y, tooltip: b, hitZonesRef: x } = C(o, {
1078
- width: Ie,
1079
- height: Le
1144
+ width: We,
1145
+ height: Ge
1080
1146
  });
1081
1147
  return n(() => {
1082
1148
  let n = o.current;
1083
1149
  if (!n) return;
1084
- let r = _(n, Ie, Le);
1150
+ let r = _(n, We, Ge);
1085
1151
  p.current = 0;
1086
- let i = Ie / 2, a = Fe / 2, s = Fe * .4, c = t === "donut" ? Fe * .21 : 0, l = e.reduce((e, t) => e + (t.pricing ?? 0), 0) || 1, d, b = () => {
1152
+ let i = We / 2, a = Ue / 2, s = Ue * .4, c = t === "donut" ? Ue * .21 : 0, l = e.reduce((e, t) => e + (t.pricing ?? 0), 0) || 1, d, b = () => {
1087
1153
  p.current++;
1088
1154
  let n = p.current;
1089
- r.clearRect(0, 0, Ie, Le);
1155
+ r.clearRect(0, 0, We, Ge);
1090
1156
  let o = 1 - (1 - Math.min(n / 48, 1)) ** 3;
1091
1157
  M(f.current, y.current), x.current = [];
1092
1158
  let _ = -Math.PI / 2;
@@ -1100,10 +1166,10 @@ function Re({ rows: e = [], variant: t, className: r, colors: i }) {
1100
1166
  let O = A(n, .03, 3e-4), k = s + b * 6 + (b > 0 ? O * 2 : 0);
1101
1167
  r.beginPath(), r.moveTo(i + Math.cos(_) * c, a + Math.sin(_) * c), r.arc(i, a, k, _, g), c > 0 ? r.arc(i, a, c, g, _, !0) : r.lineTo(i, a), r.closePath(), r.fillStyle = m(y, .7 + b * .2), r.fill(), r.strokeStyle = m(u.bg, .8), r.lineWidth = 1.5, r.stroke(), _ = g;
1102
1168
  }), t === "donut" && e.length > 0 && v(r, i, a, c * .8, u.blue, .06);
1103
- let S = Fe + 12;
1169
+ let S = Ue + 12;
1104
1170
  e.forEach((e, t) => {
1105
1171
  let n = h[t % h.length], i = (e.pricing ?? 0) / l, a = f.current.get(e.id ?? `sl-${t}`) ?? 0, o = S + t * 18;
1106
- r.beginPath(), r.arc(8, o, 4, 0, Math.PI * 2), r.fillStyle = m(n, .8 + a * .2), r.fill(), r.font = "9px 'JetBrains Mono', monospace", r.fillStyle = m(u.t2, .7 + a * .2), r.textAlign = "left", r.fillText(e.vendor, 18, o + 3.5), r.font = "bold 9px 'JetBrains Mono', monospace", r.fillStyle = g(u.t3, n, a), r.textAlign = "right", r.fillText(`${e.pricing ?? 0} (${Math.round(i * 100)}%)`, Ie - 4, o + 3.5);
1172
+ r.beginPath(), r.arc(8, o, 4, 0, Math.PI * 2), r.fillStyle = m(n, .8 + a * .2), r.fill(), r.font = "9px 'JetBrains Mono', monospace", r.fillStyle = m(u.t2, .7 + a * .2), r.textAlign = "left", r.fillText(e.vendor, 18, o + 3.5), r.font = "bold 9px 'JetBrains Mono', monospace", r.fillStyle = g(u.t3, n, a), r.textAlign = "right", r.fillText(`${e.pricing ?? 0} (${Math.round(i * 100)}%)`, We - 4, o + 3.5);
1107
1173
  }), d = requestAnimationFrame(b);
1108
1174
  };
1109
1175
  return b(), () => cancelAnimationFrame(d);
@@ -1117,30 +1183,30 @@ function Re({ rows: e = [], variant: t, className: r, colors: i }) {
1117
1183
  children: /* @__PURE__ */ c("div", {
1118
1184
  style: {
1119
1185
  position: "relative",
1120
- width: Ie,
1121
- height: Le
1186
+ width: We,
1187
+ height: Ge
1122
1188
  },
1123
1189
  children: [/* @__PURE__ */ s("canvas", {
1124
1190
  ref: o,
1125
1191
  role: "img",
1126
1192
  "aria-label": `${t} chart`,
1127
1193
  style: {
1128
- width: Ie,
1129
- height: Le,
1194
+ width: We,
1195
+ height: Ge,
1130
1196
  display: "block",
1131
1197
  borderRadius: 8
1132
1198
  }
1133
1199
  }), /* @__PURE__ */ s(S, {
1134
1200
  ...b,
1135
- parentW: Ie,
1136
- parentH: Le
1201
+ parentW: We,
1202
+ parentH: Ge
1137
1203
  })]
1138
1204
  })
1139
1205
  });
1140
1206
  }
1141
1207
  //#endregion
1142
1208
  //#region src/components/sankey/SankeySvg.tsx
1143
- function ze(e, t, n, r) {
1209
+ function qe(e, t, n, r) {
1144
1210
  let i = new Set(t.map((e) => e.source)), a = new Set(t.map((e) => e.target)), o = /* @__PURE__ */ new Map(), s = [];
1145
1211
  for (e.forEach((e) => {
1146
1212
  i.has(e.id) && !a.has(e.id) && s.push({
@@ -1185,8 +1251,8 @@ function ze(e, t, n, r) {
1185
1251
  });
1186
1252
  }), f;
1187
1253
  }
1188
- function Be({ nodes: e, links: t, width: r = 960, height: o = 280, ariaLabel: f, selectedEntity: p, className: h, colors: g }) {
1189
- let y = a(null), x = a(/* @__PURE__ */ new Map()), E = a(0), D = a([]), O = g?.nodes ?? d, k = g?.links ?? u.bd, j = g?.activeLinks ?? u.blue, ee = g?.activeNodes ?? u.blue, N = i(() => ze(e, t, r, o), [
1254
+ function Je({ nodes: e, links: t, width: r = 960, height: o = 280, ariaLabel: f, selectedEntity: p, className: h, colors: g }) {
1255
+ let y = a(null), x = a(/* @__PURE__ */ new Map()), E = a(0), D = a([]), O = g?.nodes ?? d, k = g?.links ?? u.bd, j = g?.activeLinks ?? u.blue, ee = g?.activeNodes ?? u.blue, N = i(() => qe(e, t, r, o), [
1190
1256
  e,
1191
1257
  t,
1192
1258
  r,
@@ -1286,7 +1352,7 @@ function Be({ nodes: e, links: t, width: r = 960, height: o = 280, ariaLabel: f,
1286
1352
  }
1287
1353
  //#endregion
1288
1354
  //#region src/canvas/CausalFlowCanvas.tsx
1289
- var Ve = [
1355
+ var Ye = [
1290
1356
  {
1291
1357
  x: .13,
1292
1358
  y: .48
@@ -1319,7 +1385,7 @@ var Ve = [
1319
1385
  x: .92,
1320
1386
  y: .22
1321
1387
  }
1322
- ], He = [
1388
+ ], Xe = [
1323
1389
  u.blue,
1324
1390
  u.cyan,
1325
1391
  u.orange,
@@ -1328,7 +1394,7 @@ var Ve = [
1328
1394
  u.green,
1329
1395
  u.amber,
1330
1396
  u.t2
1331
- ], Ue = [
1397
+ ], Ze = [
1332
1398
  26,
1333
1399
  24,
1334
1400
  24,
@@ -1338,21 +1404,21 @@ var Ve = [
1338
1404
  22,
1339
1405
  22
1340
1406
  ];
1341
- function We(e, t) {
1407
+ function Qe(e, t) {
1342
1408
  let n = 1 - t;
1343
1409
  return {
1344
1410
  x: n * n * n * e.p0.x + 3 * n * n * t * e.p1.x + 3 * n * t * t * e.p2.x + t * t * t * e.p3.x,
1345
1411
  y: n * n * n * e.p0.y + 3 * n * n * t * e.p1.y + 3 * n * t * t * e.p2.y + t * t * t * e.p3.y
1346
1412
  };
1347
1413
  }
1348
- function Ge(e, t) {
1414
+ function $e(e, t) {
1349
1415
  let n = 1 - t, r = 3 * n * n * (e.p1.x - e.p0.x) + 6 * n * t * (e.p2.x - e.p1.x) + 3 * t * t * (e.p3.x - e.p2.x), i = 3 * n * n * (e.p1.y - e.p0.y) + 6 * n * t * (e.p2.y - e.p1.y) + 3 * t * t * (e.p3.y - e.p2.y), a = Math.sqrt(r * r + i * i) || 1;
1350
1416
  return {
1351
1417
  x: -i / a,
1352
1418
  y: r / a
1353
1419
  };
1354
1420
  }
1355
- function Ke(e, t) {
1421
+ function et(e, t) {
1356
1422
  let n = t.x - e.x, r = t.y - e.y;
1357
1423
  return {
1358
1424
  p0: {
@@ -1373,7 +1439,7 @@ function Ke(e, t) {
1373
1439
  }
1374
1440
  };
1375
1441
  }
1376
- function qe({ nodes: e, links: t, width: r = 960, height: o = 280, selectedEntity: l }) {
1442
+ function tt({ nodes: e, links: t, width: r = 960, height: o = 280, selectedEntity: l }) {
1377
1443
  let d = a(null), f = a(0), p = a([]), { hoveredRef: h, tooltip: x, hitZonesRef: T } = C(d, {
1378
1444
  width: r,
1379
1445
  height: o
@@ -1381,15 +1447,15 @@ function qe({ nodes: e, links: t, width: r = 960, height: o = 280, selectedEntit
1381
1447
  let t = /* @__PURE__ */ new Map();
1382
1448
  return e.forEach((e, n) => t.set(e.id, n)), t;
1383
1449
  }, [e]), O = i(() => t.length > 0 ? Math.max(...t.map((e) => e.value)) : 100, [t]), k = (e) => O > 1 ? e / 100 : e, j = i(() => e.map((e, t) => {
1384
- let n = Ve[t % Ve.length];
1450
+ let n = Ye[t % Ye.length];
1385
1451
  return {
1386
1452
  id: e.id,
1387
1453
  label: e.name,
1388
1454
  sub: e.valueLabel ?? "",
1389
1455
  x: n.x * r,
1390
1456
  y: n.y * o,
1391
- r: Ue[t % Ue.length],
1392
- color: He[t % He.length]
1457
+ r: Ze[t % Ze.length],
1458
+ color: Xe[t % Xe.length]
1393
1459
  };
1394
1460
  }), [
1395
1461
  e,
@@ -1411,7 +1477,7 @@ function qe({ nodes: e, links: t, width: r = 960, height: o = 280, selectedEntit
1411
1477
  if (t.clearRect(0, 0, r, o), T.current = [], y(t, r, o, e, 50, m(u.blue, .05)), M.forEach((e, n) => {
1412
1478
  let r = j[e.fromIdx], i = j[e.toIdx];
1413
1479
  if (!r || !i) return;
1414
- let a = !!l && (r.id === l || i.id === l), o = g(r.color, i.color, .5), s = a ? .18 : .05, c = a ? .25 : .1, d = Ke(r, i);
1480
+ let a = !!l && (r.id === l || i.id === l), o = g(r.color, i.color, .5), s = a ? .18 : .05, c = a ? .25 : .1, d = et(r, i);
1415
1481
  t.beginPath(), t.moveTo(d.p0.x, d.p0.y), t.bezierCurveTo(d.p1.x, d.p1.y, d.p2.x, d.p2.y, d.p3.x, d.p3.y), t.strokeStyle = m(o, s), t.lineWidth = 16, t.lineCap = "round", t.stroke(), t.strokeStyle = m(o, c), t.lineWidth = 1.5, t.stroke();
1416
1482
  for (let t = 0; t < e.conf * 2.5; t++) Math.random() < .45 && p.current.push({
1417
1483
  edgeIdx: n,
@@ -1420,7 +1486,7 @@ function qe({ nodes: e, links: t, width: r = 960, height: o = 280, selectedEntit
1420
1486
  off: (Math.random() - .5) * 13,
1421
1487
  sz: .7 + Math.random() * 2
1422
1488
  });
1423
- let f = We(d, .5), h = `${Math.round(e.conf * 100)}%`;
1489
+ let f = Qe(d, .5), h = `${Math.round(e.conf * 100)}%`;
1424
1490
  t.font = "bold 12px 'JetBrains Mono', monospace", t.textBaseline = "middle";
1425
1491
  let _ = t.measureText(h).width + 14;
1426
1492
  t.fillStyle = "rgba(10,16,24,0.88)", t.beginPath(), t.roundRect(f.x - _ / 2, f.y - 11, _, 22, 6), t.fill(), t.strokeStyle = m(u.cyan, .25), t.lineWidth = 1, t.stroke(), t.fillStyle = m(u.cyan, .9), t.textAlign = "center", t.fillText(h, f.x, f.y);
@@ -1430,7 +1496,7 @@ function qe({ nodes: e, links: t, width: r = 960, height: o = 280, selectedEntit
1430
1496
  if (!n) return !1;
1431
1497
  let r = j[n.fromIdx], i = j[n.toIdx];
1432
1498
  if (!r || !i) return !1;
1433
- let a = Ke(r, i), o = We(a, e.t), s = Ge(a, e.t), c = o.x + s.x * e.off, l = o.y + s.y * e.off, u = Math.sin(e.t * Math.PI) * .7, d = g(r.color, i.color, e.t);
1499
+ let a = et(r, i), o = Qe(a, e.t), s = $e(a, e.t), c = o.x + s.x * e.off, l = o.y + s.y * e.off, u = Math.sin(e.t * Math.PI) * .7, d = g(r.color, i.color, e.t);
1434
1500
  return v(t, c, l, e.sz * 3, d, u * .1), t.beginPath(), t.arc(c, l, e.sz, 0, Math.PI * 2), t.fillStyle = m(d, u), t.fill(), !0;
1435
1501
  }), p.current.length > 350 && (p.current = p.current.slice(-350)), j.forEach((n, r) => {
1436
1502
  let i = l === n.id, a = h.current === `node-${r}`, o = A(e, .03, 3e-4) * .1 + 1, s = n.r * o * (i ? 1.15 : 1);
@@ -1487,10 +1553,10 @@ function qe({ nodes: e, links: t, width: r = 960, height: o = 280, selectedEntit
1487
1553
  }
1488
1554
  //#endregion
1489
1555
  //#region src/components/sankey/ProcessSankey.tsx
1490
- function Je({ selectedEntity: e, colors: t }) {
1491
- return /* @__PURE__ */ s(qe, {
1492
- nodes: Ae.nodes,
1493
- links: Ae.links,
1556
+ function nt({ selectedEntity: e, colors: t }) {
1557
+ return /* @__PURE__ */ s(tt, {
1558
+ nodes: Re.nodes,
1559
+ links: Re.links,
1494
1560
  width: 960,
1495
1561
  height: 280,
1496
1562
  selectedEntity: e
@@ -1498,7 +1564,7 @@ function Je({ selectedEntity: e, colors: t }) {
1498
1564
  }
1499
1565
  //#endregion
1500
1566
  //#region src/components/sankey/RankingSankey.tsx
1501
- function Ye({ rows: e = [], className: t, colors: n }) {
1567
+ function rt({ rows: e = [], className: t, colors: n }) {
1502
1568
  let { nodes: r, links: a } = i(() => {
1503
1569
  let t = e.slice(0, 5);
1504
1570
  return {
@@ -1516,7 +1582,7 @@ function Ye({ rows: e = [], className: t, colors: n }) {
1516
1582
  }))
1517
1583
  };
1518
1584
  }, [e]);
1519
- return /* @__PURE__ */ s(Be, {
1585
+ return /* @__PURE__ */ s(Je, {
1520
1586
  nodes: r,
1521
1587
  links: a,
1522
1588
  width: 760,
@@ -1528,20 +1594,20 @@ function Ye({ rows: e = [], className: t, colors: n }) {
1528
1594
  }
1529
1595
  //#endregion
1530
1596
  //#region src/components/quotationBalance/QuotationBalance.tsx
1531
- var Xe = 500, Ze = 320;
1532
- function Qe({ accepted: e, submitted: t, "data-testid": r }) {
1597
+ var it = 500, at = 320;
1598
+ function ot({ accepted: e, submitted: t, "data-testid": r }) {
1533
1599
  let i = a(null), o = a(0);
1534
1600
  return n(() => {
1535
1601
  let n = i.current;
1536
1602
  if (!n) return;
1537
- let r = _(n, Xe, Ze);
1603
+ let r = _(n, it, at);
1538
1604
  o.current = 0;
1539
- let a = Xe / 2, s = Math.max(e.value, t.value), c = (e.value - t.value) / s * 14, l, d = () => {
1605
+ let a = it / 2, s = Math.max(e.value, t.value), c = (e.value - t.value) / s * 14, l, d = () => {
1540
1606
  o.current++;
1541
1607
  let n = o.current;
1542
- r.clearRect(0, 0, Xe, Ze);
1608
+ r.clearRect(0, 0, it, at);
1543
1609
  let i = E(Math.min(n / 80, 1)), p = c * k(Math.min(n / 80, 1)) * Math.PI / 180;
1544
- r.strokeStyle = m(u.bd, .5 * i), r.lineWidth = 2, r.beginPath(), r.moveTo(a, 100), r.lineTo(a, Ze - 80), r.stroke(), r.beginPath(), r.arc(a, 100, 5 * i, 0, Math.PI * 2), r.fillStyle = u.t2, r.fill();
1610
+ r.strokeStyle = m(u.bd, .5 * i), r.lineWidth = 2, r.beginPath(), r.moveTo(a, 100), r.lineTo(a, at - 80), r.stroke(), r.beginPath(), r.arc(a, 100, 5 * i, 0, Math.PI * 2), r.fillStyle = u.t2, r.fill();
1545
1611
  let h = {
1546
1612
  x: a - Math.cos(p) * 160,
1547
1613
  y: 100 + Math.sin(-p) * 160
@@ -1567,23 +1633,23 @@ function Qe({ accepted: e, submitted: t, "data-testid": r }) {
1567
1633
  6
1568
1634
  ]), r.fill(), r.stroke(), r.strokeStyle = m(u.t3, .35 * i), r.lineWidth = 1, [-90 / 3, 90 / 3].forEach((e) => {
1569
1635
  r.beginPath(), r.moveTo(g.x + e, g.y + 4), r.lineTo(g.x + e, x), r.stroke();
1570
- }), i > .5 && (r.globalAlpha = Math.min(1, (i - .5) / .5), r.font = "bold 14px 'JetBrains Mono', monospace", r.fillStyle = u.amber, r.textAlign = "center", r.fillText(t.label, g.x, x + b + 18), r.font = f.font, r.fillStyle = f.color, r.fillText("Submitted", g.x, x + b + 32), r.fillText(`${t.count} quotations`, g.x, x + b + 44), r.globalAlpha = 1), i > .85 && Math.abs(c) > 1 && (r.globalAlpha = Math.min(1, (i - .85) / .15) * .6, r.font = f.font, r.fillStyle = f.color, r.textAlign = "center", r.fillText(`${Math.abs(c).toFixed(1)}° tilt toward accepted`, a, Ze - 12), r.globalAlpha = 1), l = requestAnimationFrame(d);
1636
+ }), i > .5 && (r.globalAlpha = Math.min(1, (i - .5) / .5), r.font = "bold 14px 'JetBrains Mono', monospace", r.fillStyle = u.amber, r.textAlign = "center", r.fillText(t.label, g.x, x + b + 18), r.font = f.font, r.fillStyle = f.color, r.fillText("Submitted", g.x, x + b + 32), r.fillText(`${t.count} quotations`, g.x, x + b + 44), r.globalAlpha = 1), i > .85 && Math.abs(c) > 1 && (r.globalAlpha = Math.min(1, (i - .85) / .15) * .6, r.font = f.font, r.fillStyle = f.color, r.textAlign = "center", r.fillText(`${Math.abs(c).toFixed(1)}° tilt toward accepted`, a, at - 12), r.globalAlpha = 1), l = requestAnimationFrame(d);
1571
1637
  };
1572
1638
  return d(), () => cancelAnimationFrame(l);
1573
1639
  }, [e, t]), /* @__PURE__ */ s("div", {
1574
1640
  "data-testid": r,
1575
1641
  style: {
1576
1642
  position: "relative",
1577
- width: Xe,
1578
- height: Ze
1643
+ width: it,
1644
+ height: at
1579
1645
  },
1580
1646
  children: /* @__PURE__ */ s("canvas", {
1581
1647
  ref: i,
1582
1648
  role: "img",
1583
1649
  "aria-label": "Quotation balance — accepted vs submitted quotation value",
1584
1650
  style: {
1585
- width: Xe,
1586
- height: Ze,
1651
+ width: it,
1652
+ height: at,
1587
1653
  display: "block"
1588
1654
  }
1589
1655
  })
@@ -1591,25 +1657,25 @@ function Qe({ accepted: e, submitted: t, "data-testid": r }) {
1591
1657
  }
1592
1658
  //#endregion
1593
1659
  //#region src/components/quotationTrend/QuotationTrend.tsx
1594
- var $e = 680, W = 280;
1595
- function et({ trend: e = [], "data-testid": t }) {
1660
+ var st = 680, W = 280;
1661
+ function ct({ trend: e = [], "data-testid": t }) {
1596
1662
  let r = a(null), i = a(/* @__PURE__ */ new Map()), o = a(0), { hoveredRef: l, tooltip: d, hitZonesRef: p } = C(r, {
1597
- width: $e,
1663
+ width: st,
1598
1664
  height: W
1599
1665
  });
1600
1666
  return n(() => {
1601
1667
  let t = r.current;
1602
1668
  if (!t) return;
1603
- let n = _(t, $e, W);
1669
+ let n = _(t, st, W);
1604
1670
  o.current = 0;
1605
- let a = $e - 54 - 28, s = W - 30 - 54, c = Math.max(...e.map((e) => e.count), 1), d = e.length, h = d > 1 ? a / (d - 1) : a, g = e.map((e, t) => ({
1671
+ let a = st - 54 - 28, s = W - 30 - 54, c = Math.max(...e.map((e) => e.count), 1), d = e.length, h = d > 1 ? a / (d - 1) : a, g = e.map((e, t) => ({
1606
1672
  x: 54 + t * h,
1607
1673
  y: 30 + s - e.count / c * s,
1608
1674
  point: e
1609
1675
  })), y, b = () => {
1610
1676
  o.current++;
1611
1677
  let e = o.current;
1612
- n.clearRect(0, 0, $e, W);
1678
+ n.clearRect(0, 0, st, W);
1613
1679
  let t = E(Math.min(e / 72, 1));
1614
1680
  M(i.current, l.current), p.current = [], [
1615
1681
  .25,
@@ -1661,7 +1727,7 @@ function et({ trend: e = [], "data-testid": t }) {
1661
1727
  children: /* @__PURE__ */ c("div", {
1662
1728
  style: {
1663
1729
  position: "relative",
1664
- width: $e,
1730
+ width: st,
1665
1731
  height: W
1666
1732
  },
1667
1733
  children: [/* @__PURE__ */ s("canvas", {
@@ -1669,13 +1735,13 @@ function et({ trend: e = [], "data-testid": t }) {
1669
1735
  role: "img",
1670
1736
  "aria-label": "Trend chart — count over time",
1671
1737
  style: {
1672
- width: $e,
1738
+ width: st,
1673
1739
  height: W,
1674
1740
  display: "block"
1675
1741
  }
1676
1742
  }), /* @__PURE__ */ s(S, {
1677
1743
  ...d,
1678
- parentW: $e,
1744
+ parentW: st,
1679
1745
  parentH: W
1680
1746
  })]
1681
1747
  })
@@ -1683,16 +1749,16 @@ function et({ trend: e = [], "data-testid": t }) {
1683
1749
  }
1684
1750
  //#endregion
1685
1751
  //#region src/components/trend/Trend.tsx
1686
- var tt = 680, G = 280, nt = 54, rt = 28, it = 64, at = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", ot = 12;
1687
- function st({ trend: e = [], "data-testid": t }) {
1752
+ var lt = 680, G = 280, ut = 54, dt = 28, ft = 64, pt = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", mt = 12;
1753
+ function ht({ trend: e = [], "data-testid": t }) {
1688
1754
  let r = a(null), o = a(/* @__PURE__ */ new Map()), l = a(0), d = i(() => {
1689
- if (e.length <= 1) return it;
1755
+ if (e.length <= 1) return ft;
1690
1756
  let t = document.createElement("canvas").getContext("2d");
1691
- if (!t) return it;
1692
- t.font = at;
1757
+ if (!t) return ft;
1758
+ t.font = pt;
1693
1759
  let n = Math.max(...e.map((e) => t.measureText(e.week).width));
1694
- return Math.max(it, n + ot);
1695
- }, [e]), p = Math.max(tt, nt + rt + Math.max(0, e.length - 1) * d), { hoveredRef: h, tooltip: g, hitZonesRef: y } = C(r, {
1760
+ return Math.max(ft, n + mt);
1761
+ }, [e]), p = Math.max(lt, ut + dt + Math.max(0, e.length - 1) * d), { hoveredRef: h, tooltip: g, hitZonesRef: y } = C(r, {
1696
1762
  width: p,
1697
1763
  height: G
1698
1764
  });
@@ -1701,7 +1767,7 @@ function st({ trend: e = [], "data-testid": t }) {
1701
1767
  if (!t) return;
1702
1768
  let n = _(t, p, G);
1703
1769
  l.current = 0;
1704
- let i = nt, a = rt, s = p - i - a, c = G - 30 - 54, g = Math.max(...e.map((e) => e.count), 1), b = e.length, S = b > 1 ? Math.max(s / (b - 1), d) : s, C = e.map((e, t) => ({
1770
+ let i = ut, a = dt, s = p - i - a, c = G - 30 - 54, g = Math.max(...e.map((e) => e.count), 1), b = e.length, S = b > 1 ? Math.max(s / (b - 1), d) : s, C = e.map((e, t) => ({
1705
1771
  x: i + t * S,
1706
1772
  y: 30 + c - e.count / g * c,
1707
1773
  point: e
@@ -1746,7 +1812,7 @@ function st({ trend: e = [], "data-testid": t }) {
1746
1812
  color: u.cyan
1747
1813
  }), i > 0 && x(n, e.x, 30, 30 + c, m(u.cyan, .15 * i));
1748
1814
  let s = e.point.count === g;
1749
- (i > 0 || s) && v(n, e.x, e.y, 14, u.cyan, (s ? .3 : 0) + i * .25), n.beginPath(), n.arc(e.x, e.y, i > 0 ? 5 : 3.5, 0, Math.PI * 2), n.fillStyle = m(u.cyan, i > 0 ? 1 : .8), n.fill(), (i > 0 || s) && (n.font = at, n.fillStyle = u.cyan, n.textAlign = "center", n.fillText(String(e.point.count), e.x, e.y - 10)), n.font = at, n.fillStyle = i > 0 ? u.cyan : f.color, n.textAlign = "center", n.fillText(e.point.week, e.x, G - 54 + 14);
1815
+ (i > 0 || s) && v(n, e.x, e.y, 14, u.cyan, (s ? .3 : 0) + i * .25), n.beginPath(), n.arc(e.x, e.y, i > 0 ? 5 : 3.5, 0, Math.PI * 2), n.fillStyle = m(u.cyan, i > 0 ? 1 : .8), n.fill(), (i > 0 || s) && (n.font = pt, n.fillStyle = u.cyan, n.textAlign = "center", n.fillText(String(e.point.count), e.x, e.y - 10)), n.font = pt, n.fillStyle = i > 0 ? u.cyan : f.color, n.textAlign = "center", n.fillText(e.point.week, e.x, G - 54 + 14);
1750
1816
  }), T = requestAnimationFrame(D);
1751
1817
  };
1752
1818
  return D(), () => cancelAnimationFrame(T);
@@ -1786,31 +1852,31 @@ function st({ trend: e = [], "data-testid": t }) {
1786
1852
  }
1787
1853
  //#endregion
1788
1854
  //#region src/components/severityBands/SeverityBands.tsx
1789
- var K = 680, ct = 240, lt = {
1855
+ var K = 680, gt = 240, _t = {
1790
1856
  Critical: u.red,
1791
1857
  High: u.orange,
1792
1858
  Medium: u.amber,
1793
1859
  Low: u.green
1794
1860
  };
1795
- function ut({ severities: e = [], "data-testid": t }) {
1861
+ function vt({ severities: e = [], "data-testid": t }) {
1796
1862
  let r = a(null), i = a(/* @__PURE__ */ new Map()), o = a(0), { hoveredRef: l, tooltip: d, hitZonesRef: p } = C(r, {
1797
1863
  width: K,
1798
- height: ct
1864
+ height: gt
1799
1865
  });
1800
1866
  return n(() => {
1801
1867
  let t = r.current;
1802
1868
  if (!t) return;
1803
- let n = _(t, K, ct);
1869
+ let n = _(t, K, gt);
1804
1870
  o.current = 0;
1805
- let a = e.reduce((e, t) => e + t.count, 0), s = K - 28 - 28, c = ct - 50 - 52, d = e.map((e) => e.count / a * s), h, g = () => {
1871
+ let a = e.reduce((e, t) => e + t.count, 0), s = K - 28 - 28, c = gt - 50 - 52, d = e.map((e) => e.count / a * s), h, g = () => {
1806
1872
  o.current++;
1807
1873
  let t = o.current;
1808
- n.clearRect(0, 0, K, ct);
1874
+ n.clearRect(0, 0, K, gt);
1809
1875
  let r = D(Math.min(t / 60, 1));
1810
1876
  M(i.current, l.current), p.current = [], n.strokeStyle = m(u.bd, .2), n.lineWidth = 1, n.beginPath(), n.rect(28, 50, s, c), n.stroke(), n.strokeStyle = m(u.t4, .15), n.lineWidth = 1, n.setLineDash([4, 4]), n.beginPath(), n.moveTo(K / 2, 50), n.lineTo(K / 2, 50 + c), n.stroke(), n.setLineDash([]);
1811
1877
  let _ = 28;
1812
1878
  e.forEach((e, t) => {
1813
- let o = lt[e.severity] ?? u.blue, s = d[t];
1879
+ let o = _t[e.severity] ?? u.blue, s = d[t];
1814
1880
  s * r;
1815
1881
  let l = i.current.get(e.severity) ?? 0, h = _ + s / 2, g = s * .85;
1816
1882
  h - g / 2;
@@ -1835,7 +1901,7 @@ function ut({ severities: e = [], "data-testid": t }) {
1835
1901
  style: {
1836
1902
  position: "relative",
1837
1903
  width: K,
1838
- height: ct
1904
+ height: gt
1839
1905
  },
1840
1906
  children: [/* @__PURE__ */ s("canvas", {
1841
1907
  ref: r,
@@ -1843,24 +1909,24 @@ function ut({ severities: e = [], "data-testid": t }) {
1843
1909
  "aria-label": "Early Warning severity distribution — prism spectrum bands",
1844
1910
  style: {
1845
1911
  width: K,
1846
- height: ct,
1912
+ height: gt,
1847
1913
  display: "block"
1848
1914
  }
1849
1915
  }), /* @__PURE__ */ s(S, {
1850
1916
  ...d,
1851
1917
  parentW: K,
1852
- parentH: ct
1918
+ parentH: gt
1853
1919
  })]
1854
1920
  });
1855
1921
  }
1856
1922
  //#endregion
1857
1923
  //#region src/components/statusArc/StatusArc.tsx
1858
- var q = 460, J = 300, dt = {
1924
+ var q = 460, J = 300, yt = {
1859
1925
  Open: u.red,
1860
1926
  Submitted: u.amber,
1861
1927
  Closed: u.green
1862
1928
  };
1863
- function ft({ segments: e = [], title: t, "data-testid": r }) {
1929
+ function bt({ segments: e = [], title: t, "data-testid": r }) {
1864
1930
  let i = a(null), o = a(0), l = a(/* @__PURE__ */ new Map()), { hoveredRef: d, tooltip: p, hitZonesRef: h } = C(i, {
1865
1931
  width: q,
1866
1932
  height: J
@@ -1877,14 +1943,14 @@ function ft({ segments: e = [], title: t, "data-testid": r }) {
1877
1943
  let n = t === d.current ? 1 : 0, r = e + (n - e) * .12;
1878
1944
  Math.abs(r - n) < .005 ? n === 0 ? l.current.delete(t) : l.current.set(t, 1) : l.current.set(t, r);
1879
1945
  }), d.current && !l.current.has(d.current) && l.current.set(d.current, 0), y(n, q, J, t, 40, m(u.blue, .04)), e.forEach((e, i) => {
1880
- let o = i / 3 * Math.PI * 2 - Math.PI / 2, c = r + Math.cos(o) * s, l = a + Math.sin(o) * s, d = dt[e.status] ?? u.blue, h = 2 + e.count / p * 8;
1946
+ let o = i / 3 * Math.PI * 2 - Math.PI / 2, c = r + Math.cos(o) * s, l = a + Math.sin(o) * s, d = yt[e.status] ?? u.blue, h = 2 + e.count / p * 8;
1881
1947
  n.beginPath(), n.moveTo(r, a), n.lineTo(c, l), n.strokeStyle = m(d, .08), n.lineWidth = h * 2, n.stroke(), n.beginPath(), n.moveTo(r, a), n.lineTo(c, l), n.strokeStyle = m(d, .25), n.lineWidth = 1, n.stroke();
1882
1948
  let g = (t * .005 + i * .33) % 1, _ = r + (c - r) * g, y = a + (l - a) * g;
1883
1949
  v(n, _, y, 6, d, .4), n.beginPath(), n.arc(_, y, 2, 0, Math.PI * 2), n.fillStyle = m(d, .8), n.fill();
1884
1950
  let b = (r + c) / 2, x = (a + l) / 2;
1885
1951
  n.font = "bold " + f.font, n.textAlign = "center", n.textBaseline = "middle", n.fillStyle = m(d, .85), n.fillText(String(e.count), b, x);
1886
1952
  }), e.forEach((e, t) => {
1887
- let i = t / 3 * Math.PI * 2 - Math.PI / 2, o = r + Math.cos(i) * s, d = a + Math.sin(i) * s, g = dt[e.status] ?? u.blue, _ = 10 + e.count / p * 18, y = l.current.get(e.status) ?? 0;
1953
+ let i = t / 3 * Math.PI * 2 - Math.PI / 2, o = r + Math.cos(i) * s, d = a + Math.sin(i) * s, g = yt[e.status] ?? u.blue, _ = 10 + e.count / p * 18, y = l.current.get(e.status) ?? 0;
1888
1954
  v(n, o, d, _ * 2.5, g, .2 + y * .15);
1889
1955
  let b = n.createRadialGradient(o, d - _ * .2, 0, o, d, _);
1890
1956
  b.addColorStop(0, m(g, .8 + y * .2)), b.addColorStop(1, m(g, .4 + y * .1)), n.beginPath(), n.arc(o, d, _, 0, Math.PI * 2), n.fillStyle = b, n.fill(), n.font = "bold " + f.font, n.textAlign = "center", n.textBaseline = "middle", n.fillStyle = m(u.t1, .9), n.fillText(e.status, o, d), w(h.current, e.status, o, d, _ + 6, {
@@ -1930,8 +1996,8 @@ function ft({ segments: e = [], title: t, "data-testid": r }) {
1930
1996
  }
1931
1997
  //#endregion
1932
1998
  //#region src/components/trendChart/TrendChart.tsx
1933
- var pt = 280, Y = 96;
1934
- function mt({ points: e = [], className: t, colors: r }) {
1999
+ var Y = 280, X = 96;
2000
+ function xt({ points: e = [], className: t, colors: r }) {
1935
2001
  let o = a(null), d = a(/* @__PURE__ */ new Map()), f = a(0), p = i(() => e.map(([e, t]) => {
1936
2002
  let n = String(t).match(/-?\d+(\.\d+)?/);
1937
2003
  return {
@@ -1939,18 +2005,18 @@ function mt({ points: e = [], className: t, colors: r }) {
1939
2005
  value: n ? Number(n[0]) : 0
1940
2006
  };
1941
2007
  }), [e]), { mouseRef: h, hoveredRef: g, tooltip: y, hitZonesRef: b } = C(o, {
1942
- width: pt,
1943
- height: Y
2008
+ width: Y,
2009
+ height: X
1944
2010
  });
1945
2011
  return n(() => {
1946
2012
  let e = o.current;
1947
2013
  if (!e) return;
1948
- let t = _(e, pt, Y);
2014
+ let t = _(e, Y, X);
1949
2015
  f.current = 0;
1950
2016
  let n = r?.line ?? u.blue, i = r?.point ?? u.blue, a = r?.axisLine ?? u.bd, s, c = () => {
1951
2017
  f.current++;
1952
2018
  let e = f.current;
1953
- if (t.clearRect(0, 0, pt, Y), p.length < 2) {
2019
+ if (t.clearRect(0, 0, Y, X), p.length < 2) {
1954
2020
  s = requestAnimationFrame(c);
1955
2021
  return;
1956
2022
  }
@@ -1959,9 +2025,9 @@ function mt({ points: e = [], className: t, colors: r }) {
1959
2025
  right: 12,
1960
2026
  top: 16,
1961
2027
  bottom: 20
1962
- }, o = pt - r.left - r.right, l = Y - r.top - r.bottom, _ = p.map((e) => e.value), y = Math.min(..._), S = Math.max(..._) - y || 1, C = (e) => r.left + e / (p.length - 1) * o, T = (e) => r.top + (1 - (e - y) / S) * l, E = 1 - (1 - Math.min(e / 48, 1)) ** 3, D = Math.max(2, Math.floor(E * p.length));
1963
- if (M(d.current, g.current), b.current = [], t.strokeStyle = m(a, .3), t.lineWidth = .5, t.setLineDash([]), t.beginPath(), t.moveTo(r.left, Y - r.bottom), t.lineTo(pt - r.right, Y - r.bottom), t.stroke(), t.font = "9px 'JetBrains Mono', monospace", t.fillStyle = m(u.t4, .9), t.textAlign = "center", p.forEach((e, n) => {
1964
- t.fillText(e.label.replace("Day ", "D"), C(n), Y - 4);
2028
+ }, o = Y - r.left - r.right, l = X - r.top - r.bottom, _ = p.map((e) => e.value), y = Math.min(..._), S = Math.max(..._) - y || 1, C = (e) => r.left + e / (p.length - 1) * o, T = (e) => r.top + (1 - (e - y) / S) * l, E = 1 - (1 - Math.min(e / 48, 1)) ** 3, D = Math.max(2, Math.floor(E * p.length));
2029
+ if (M(d.current, g.current), b.current = [], t.strokeStyle = m(a, .3), t.lineWidth = .5, t.setLineDash([]), t.beginPath(), t.moveTo(r.left, X - r.bottom), t.lineTo(Y - r.right, X - r.bottom), t.stroke(), t.font = "9px 'JetBrains Mono', monospace", t.fillStyle = m(u.t4, .9), t.textAlign = "center", p.forEach((e, n) => {
2030
+ t.fillText(e.label.replace("Day ", "D"), C(n), X - 4);
1965
2031
  }), h.current.over && g.current) {
1966
2032
  let e = parseInt(g.current.split("-")[1]);
1967
2033
  isNaN(e) || x(t, C(e), r.top, r.top + l);
@@ -1997,110 +2063,120 @@ function mt({ points: e = [], className: t, colors: r }) {
1997
2063
  children: /* @__PURE__ */ c("div", {
1998
2064
  style: {
1999
2065
  position: "relative",
2000
- width: pt,
2001
- height: Y
2066
+ width: Y,
2067
+ height: X
2002
2068
  },
2003
2069
  children: [/* @__PURE__ */ s("canvas", {
2004
2070
  ref: o,
2005
2071
  role: "img",
2006
2072
  "aria-label": "trend chart",
2007
2073
  style: {
2008
- width: pt,
2009
- height: Y,
2074
+ width: Y,
2075
+ height: X,
2010
2076
  display: "block",
2011
2077
  borderRadius: 8
2012
2078
  }
2013
2079
  }), /* @__PURE__ */ s(S, {
2014
2080
  ...y,
2015
- parentW: pt,
2016
- parentH: Y
2081
+ parentW: Y,
2082
+ parentH: X
2017
2083
  })]
2018
2084
  })
2019
2085
  });
2020
2086
  }
2021
2087
  //#endregion
2022
2088
  //#region src/components/variationSplit/VariationSplit.tsx
2023
- var ht = 680, gt = 320;
2024
- function _t({ contractors: e = [], "data-testid": t }) {
2025
- let r = a(null), i = a(/* @__PURE__ */ new Map()), o = a(0), { hoveredRef: l, tooltip: f, hitZonesRef: h } = C(r, {
2026
- width: ht,
2027
- height: gt
2089
+ var St = 680, Ct = 8, wt = 26, Tt = 14, Et = 16, Dt = 32;
2090
+ function Ot({ contractors: e = [], "data-testid": t }) {
2091
+ let r = a(null), l = a(/* @__PURE__ */ new Map()), f = a(0), [h, g] = o(!1), y = i(() => h ? e : e.slice(0, Ct), [e, h]), b = Et + Dt + y.length * (wt + Tt) - Tt, { hoveredRef: x, tooltip: w, hitZonesRef: E } = C(r, {
2092
+ width: St,
2093
+ height: b
2028
2094
  });
2029
2095
  return n(() => {
2030
- let t = r.current;
2031
- if (!t) return;
2032
- let n = _(t, ht, gt);
2033
- o.current = 0;
2034
- let a = ht - 60 - 28, s = Math.max(...e.map((e) => (e.implemented ?? 0) + (e.unimplemented ?? 0))), c = e.length * 40 - 14, f = 16 + (gt - 16 - 32 - c) / 2, g, y = () => {
2035
- o.current++;
2036
- let t = o.current;
2037
- n.clearRect(0, 0, ht, gt);
2038
- let r = D(Math.min(t / 60, 1));
2039
- M(i.current, l.current), h.current = [], e.forEach((t, o) => {
2040
- let c = d[o % d.length], l = j(r, o, e.length, D), p = f + o * 40, g = (t.implemented ?? 0) + (t.unimplemented ?? 0), _ = (t.implemented ?? 0) / s * a * l, y = (t.unimplemented ?? 0) / s * a * l, b = `${t.id}-impl`, x = `${t.id}-un`, S = i.current.get(b) ?? 0, C = i.current.get(x) ?? 0;
2041
- T(h.current, b, 60, p, _ || 1, 26, {
2042
- label: `${t.name} Implemented`,
2043
- value: `${t.implemented ?? 0} variations`,
2044
- sublabel: `${Math.round((t.implemented ?? 0) / (g || 1) * 100)}% complete`,
2096
+ let e = r.current;
2097
+ if (!e) return;
2098
+ let t = _(e, St, b);
2099
+ f.current = 0;
2100
+ let n = Et, i = Dt, a = wt, o = Tt, s = St - 60 - 28, c = Math.max(...y.map((e) => (e.implemented ?? 0) + (e.unimplemented ?? 0))), h = y.length * (a + o) - o, g = n + (b - n - i - h) / 2, S, C = () => {
2101
+ f.current++;
2102
+ let e = f.current;
2103
+ t.clearRect(0, 0, St, b);
2104
+ let n = D(Math.min(e / 60, 1));
2105
+ M(l.current, x.current), E.current = [], y.forEach((e, r) => {
2106
+ d[r % d.length];
2107
+ let i = j(n, r, y.length, D), f = g + r * (a + o), p = (e.implemented ?? 0) + (e.unimplemented ?? 0), h = (e.implemented ?? 0) / c * s * i, _ = (e.unimplemented ?? 0) / c * s * i, b = `${e.id}-impl`, x = `${e.id}-un`, S = l.current.get(b) ?? 0, C = l.current.get(x) ?? 0;
2108
+ T(E.current, b, 60, f, h || 1, a, {
2109
+ label: `${e.name} Implemented`,
2110
+ value: `${e.implemented ?? 0} variations`,
2111
+ sublabel: `${Math.round((e.implemented ?? 0) / (p || 1) * 100)}% complete`,
2045
2112
  color: u.green
2046
- }), T(h.current, x, 60 + _, p, y || 1, 26, {
2047
- label: `${t.name} — Unimplemented`,
2048
- value: `${t.unimplemented ?? 0} variations`,
2049
- sublabel: `${Math.round((t.unimplemented ?? 0) / (g || 1) * 100)}% pending`,
2113
+ }), T(E.current, x, 60 + h, f, _ || 1, a, {
2114
+ label: `${e.name} — Unimplemented`,
2115
+ value: `${e.unimplemented ?? 0} variations`,
2116
+ sublabel: `${Math.round((e.unimplemented ?? 0) / (p || 1) * 100)}% pending`,
2050
2117
  color: u.amber
2051
- }), n.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", n.fillStyle = m(c, .85), n.textAlign = "right", n.fillText(t.abbreviation ?? t.name.slice(0, 6), 52, p + 26 / 2 + 4), n.fillStyle = m(u.bd, .15), n.beginPath(), n.roundRect(60, p, g / s * a, 26, 4), n.fill(), _ > 0 && (S > 0 && v(n, 60 + _ / 2, p + 26 / 2, _ * .3, u.green, .12 * S), n.fillStyle = m(u.green, .6 + S * .2), n.beginPath(), n.roundRect(60, p, _, 26, [
2118
+ }), t.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", t.fillStyle = u.t2, t.textAlign = "right", t.fillText(e.abbreviation ?? e.name.slice(0, 6), 52, f + a / 2 + 4), t.fillStyle = m(u.bd, .15), t.beginPath(), t.roundRect(60, f, p / c * s, a, 4), t.fill(), h > 0 && (S > 0 && v(t, 60 + h / 2, f + a / 2, h * .3, u.green, .12 * S), t.fillStyle = m(u.green, .6 + S * .2), t.beginPath(), t.roundRect(60, f, h, a, [
2052
2119
  4,
2053
2120
  0,
2054
2121
  0,
2055
2122
  4
2056
- ]), n.fill(), _ > 28 && l > .5 && (n.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", n.fillStyle = S > 0 ? u.green : m(u.t1, .8), n.textAlign = "center", n.fillText(String(t.implemented ?? 0), 60 + _ / 2, p + 26 / 2 + 4))), y > 0 && (C > 0 && v(n, 60 + _ + y / 2, p + 26 / 2, y * .3, u.amber, .12 * C), n.fillStyle = m(u.amber, .18 + C * .18), n.strokeStyle = m(u.amber, .3 + C * .3), n.lineWidth = 1, n.beginPath(), n.roundRect(60 + _, p, y, 26, [
2123
+ ]), t.fill(), h > 28 && i > .5 && (t.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", t.fillStyle = S > 0 ? u.green : u.t2, t.textAlign = "center", t.fillText(String(e.implemented ?? 0), 60 + h / 2, f + a / 2 + 4))), _ > 0 && (C > 0 && v(t, 60 + h + _ / 2, f + a / 2, _ * .3, u.amber, .12 * C), t.fillStyle = m(u.amber, .18 + C * .18), t.strokeStyle = m(u.amber, .3 + C * .3), t.lineWidth = 1, t.beginPath(), t.roundRect(60 + h, f, _, a, [
2057
2124
  0,
2058
2125
  4,
2059
2126
  4,
2060
2127
  0
2061
- ]), n.fill(), n.stroke(), y > 28 && l > .5 && (n.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", n.fillStyle = C > 0 ? u.amber : m(u.t3, .8), n.textAlign = "center", n.fillText(String(t.unimplemented ?? 0), 60 + _ + y / 2, p + 26 / 2 + 4))), _ > 0 && y > 0 && (n.strokeStyle = m(u.bg, .7), n.lineWidth = 2, n.beginPath(), n.moveTo(60 + _, p), n.lineTo(60 + _, p + 26), n.stroke());
2128
+ ]), t.fill(), t.stroke(), _ > 28 && i > .5 && (t.font = "500 14px 'Satoshi Variable', 'DM Sans', sans-serif", t.fillStyle = C > 0 ? u.amber : u.t2, t.textAlign = "center", t.fillText(String(e.unimplemented ?? 0), 60 + h + _ / 2, f + a / 2 + 4))), h > 0 && _ > 0 && (t.strokeStyle = m(u.bg, .7), t.lineWidth = 2, t.beginPath(), t.moveTo(60 + h, f), t.lineTo(60 + h, f + a), t.stroke());
2062
2129
  });
2063
- let _ = f + c + 24, b = 60 + a / 2;
2064
- n.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", n.textAlign = "right", n.fillStyle = u.green, n.fillText("■ Implemented", b - 10, _), n.textAlign = "left", n.fillStyle = p.color, n.fillText("■ Unimplemented", b + 10, _), g = requestAnimationFrame(y);
2130
+ let r = g + h + 24, i = 60 + s / 2;
2131
+ t.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", t.textAlign = "right", t.fillStyle = u.green, t.fillText("■ Implemented", i - 10, r), t.textAlign = "left", t.fillStyle = p.color, t.fillText("■ Unimplemented", i + 10, r), S = requestAnimationFrame(C);
2065
2132
  };
2066
- return y(), () => cancelAnimationFrame(g);
2067
- }, [e]), /* @__PURE__ */ c("div", {
2133
+ return C(), () => cancelAnimationFrame(S);
2134
+ }, [y, b]), /* @__PURE__ */ c("div", {
2068
2135
  "data-testid": t,
2069
- style: {
2070
- position: "relative",
2071
- width: ht,
2072
- height: gt
2073
- },
2074
- children: [/* @__PURE__ */ s("canvas", {
2075
- ref: r,
2076
- role: "img",
2077
- "aria-label": "Implemented vs unimplemented variations per contractor — split bar",
2136
+ style: { width: St },
2137
+ children: [/* @__PURE__ */ c("div", {
2078
2138
  style: {
2079
- width: ht,
2080
- height: gt,
2081
- display: "block"
2082
- }
2083
- }), /* @__PURE__ */ s(S, {
2084
- ...f,
2085
- parentW: ht,
2086
- parentH: gt
2139
+ position: "relative",
2140
+ width: St,
2141
+ height: b
2142
+ },
2143
+ children: [/* @__PURE__ */ s("canvas", {
2144
+ ref: r,
2145
+ role: "img",
2146
+ "aria-label": "Implemented vs unimplemented variations per contractor — split bar",
2147
+ style: {
2148
+ width: St,
2149
+ height: b,
2150
+ display: "block"
2151
+ }
2152
+ }), /* @__PURE__ */ s(S, {
2153
+ ...w,
2154
+ parentW: St,
2155
+ parentH: b
2156
+ })]
2157
+ }), e.length > Ct && /* @__PURE__ */ s("div", {
2158
+ style: { marginTop: 8 },
2159
+ children: /* @__PURE__ */ s(ae, {
2160
+ expanded: h,
2161
+ onToggle: () => g((e) => !e)
2162
+ })
2087
2163
  })]
2088
2164
  });
2089
2165
  }
2090
2166
  //#endregion
2091
2167
  //#region src/components/weeklyFlow/WeeklyFlow.tsx
2092
- var vt = 800, yt = 360;
2093
- function bt({ contractors: e = [], "data-testid": t }) {
2168
+ var kt = 800, At = 360;
2169
+ function jt({ contractors: e = [], "data-testid": t }) {
2094
2170
  let r = a(null), i = a(/* @__PURE__ */ new Map()), o = a(0), { hoveredRef: l, tooltip: f, hitZonesRef: p } = C(r, {
2095
- width: vt,
2096
- height: yt
2171
+ width: kt,
2172
+ height: At
2097
2173
  });
2098
2174
  return n(() => {
2099
2175
  let t = r.current;
2100
2176
  if (!t) return;
2101
- let n = _(t, vt, yt);
2177
+ let n = _(t, kt, At);
2102
2178
  o.current = 0;
2103
- let a = e.reduce((e, t) => e + (t.base ?? 0), 0), s = e.reduce((e, t) => e + (t.variation ?? 0), 0), c = e.reduce((e, t) => e + (t.total ?? 0), 0), f = yt - 20 - 26, h = f - 6 * (e.length - 1), g = 20, y = e.map((e, t) => {
2179
+ let a = e.reduce((e, t) => e + (t.base ?? 0), 0), s = e.reduce((e, t) => e + (t.variation ?? 0), 0), c = e.reduce((e, t) => e + (t.total ?? 0), 0), f = At - 20 - 26, h = f - 6 * (e.length - 1), g = 20, y = e.map((e, t) => {
2104
2180
  let n = Math.max(24, (e.total ?? 0) / (c || 1) * h), r = {
2105
2181
  x: 100 - 110 / 2,
2106
2182
  y: g,
@@ -2128,16 +2204,16 @@ function bt({ contractors: e = [], "data-testid": t }) {
2128
2204
  }, k, A = () => {
2129
2205
  o.current++;
2130
2206
  let t = o.current;
2131
- n.clearRect(0, 0, vt, yt);
2207
+ n.clearRect(0, 0, kt, At);
2132
2208
  let r = E(Math.min(t / 80, 1));
2133
2209
  if (M(i.current, l.current), p.current = [], e.forEach((t, o) => {
2134
2210
  let c = y[o], l = j(r, o, e.length, E), u = i.current.get(t.id) ?? 0;
2135
2211
  if (l < .01) return;
2136
2212
  let d = (t.base ?? 0) / (t.total || 1), f = (t.variation ?? 0) / (t.total || 1), p = c.h * d, m = c.h * f, h = c.y + p / 2, g = c.y + p + m / 2, _ = Math.max(2, (t.base ?? 0) / a * x), v = Math.max(2, (t.variation ?? 0) / s * S), b = w.y + e.slice(0, o).reduce((e, t) => e + (t.base ?? 0) / a * x, 0) + _ / 2, C = D.y + e.slice(0, o).reduce((e, t) => e + (t.variation ?? 0) / s * S, 0) + v / 2, T = u * .2 + .18;
2137
- xt(n, c.x + 110, h, 420 - 110 / 2, b, _ * l, c.color, T), xt(n, c.x + 110, g, 420 - 110 / 2, C, v * l, c.color, T * .75);
2213
+ Mt(n, c.x + 110, h, 420 - 110 / 2, b, _ * l, c.color, T), Mt(n, c.x + 110, g, 420 - 110 / 2, C, v * l, c.color, T * .75);
2138
2214
  }), r > .3) {
2139
2215
  let e = Math.min(1, (r - .3) / .7), t = O.y + a / c * f / 2, i = O.y + f - s / c * f / 2;
2140
- xt(n, 475, w.cy, 720 - 110 / 2, t, x * e, u.blue, .25 * e), xt(n, 475, D.cy, 720 - 110 / 2, i, S * e, u.amber, .22 * e);
2216
+ Mt(n, 475, w.cy, 720 - 110 / 2, t, x * e, u.blue, .25 * e), Mt(n, 475, D.cy, 720 - 110 / 2, i, S * e, u.amber, .22 * e);
2141
2217
  }
2142
2218
  if ([
2143
2219
  "Contractors",
@@ -2149,7 +2225,7 @@ function bt({ contractors: e = [], "data-testid": t }) {
2149
2225
  420,
2150
2226
  720
2151
2227
  ][t];
2152
- n.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", n.fillStyle = m(u.t3, .5), n.textAlign = "center", n.fillText(e, r, yt - 8);
2228
+ n.font = "400 12px 'Satoshi Variable', 'DM Sans', sans-serif", n.fillStyle = m(u.t3, .5), n.textAlign = "center", n.fillText(e, r, At - 8);
2153
2229
  }), e.forEach((t, a) => {
2154
2230
  let o = y[a], s = j(r, a, e.length, E), c = i.current.get(t.id) ?? 0;
2155
2231
  T(p.current, t.id, o.x, o.y, 110, o.h, {
@@ -2173,33 +2249,33 @@ function bt({ contractors: e = [], "data-testid": t }) {
2173
2249
  "data-testid": t,
2174
2250
  style: {
2175
2251
  position: "relative",
2176
- width: vt,
2177
- height: yt
2252
+ width: kt,
2253
+ height: At
2178
2254
  },
2179
2255
  children: [/* @__PURE__ */ s("canvas", {
2180
2256
  ref: r,
2181
2257
  role: "img",
2182
2258
  "aria-label": "Weekly report flow — base value and variations per contractor flowing to total commitment",
2183
2259
  style: {
2184
- width: vt,
2185
- height: yt,
2260
+ width: kt,
2261
+ height: At,
2186
2262
  display: "block"
2187
2263
  }
2188
2264
  }), /* @__PURE__ */ s(S, {
2189
2265
  ...f,
2190
- parentW: vt,
2191
- parentH: yt
2266
+ parentW: kt,
2267
+ parentH: At
2192
2268
  })]
2193
2269
  });
2194
2270
  }
2195
- function xt(e, t, n, r, i, a, o, s) {
2271
+ function Mt(e, t, n, r, i, a, o, s) {
2196
2272
  let c = (t + r) / 2;
2197
2273
  e.beginPath(), e.moveTo(t, n - a / 2), e.bezierCurveTo(c, n - a / 2, c, i - a / 2, r, i - a / 2), e.lineTo(r, i + a / 2), e.bezierCurveTo(c, i + a / 2, c, n + a / 2, t, n + a / 2), e.closePath(), e.fillStyle = m(o, s), e.fill();
2198
2274
  }
2199
2275
  //#endregion
2200
2276
  //#region src/components/visualizationRenderer/VisualizationRenderer.tsx
2201
- function St({ config: e, className: t }) {
2202
- return e.type === "line" ? /* @__PURE__ */ s(Oe, {
2277
+ function Nt({ config: e, className: t }) {
2278
+ return e.type === "line" ? /* @__PURE__ */ s(Ie, {
2203
2279
  rows: e.rows,
2204
2280
  className: t
2205
2281
  }) : e.type === "area" ? /* @__PURE__ */ s(ne, {
@@ -2208,77 +2284,77 @@ function St({ config: e, className: t }) {
2208
2284
  }) : e.type === "bar" ? /* @__PURE__ */ s(ie, {
2209
2285
  rows: e.rows,
2210
2286
  className: t
2211
- }) : e.type === "pie" ? /* @__PURE__ */ s(Re, {
2287
+ }) : e.type === "pie" ? /* @__PURE__ */ s(Ke, {
2212
2288
  rows: e.rows,
2213
2289
  variant: "pie",
2214
2290
  className: t
2215
- }) : e.type === "donut" ? /* @__PURE__ */ s(Re, {
2291
+ }) : e.type === "donut" ? /* @__PURE__ */ s(Ke, {
2216
2292
  rows: e.rows,
2217
2293
  variant: "donut",
2218
2294
  className: t
2219
- }) : e.type === "sankey" ? /* @__PURE__ */ s(Ye, {
2295
+ }) : e.type === "sankey" ? /* @__PURE__ */ s(rt, {
2220
2296
  rows: e.rows,
2221
2297
  className: t
2222
- }) : e.type === "flow" ? /* @__PURE__ */ s(Je, {
2298
+ }) : e.type === "flow" ? /* @__PURE__ */ s(nt, {
2223
2299
  selectedEntity: e.selectedEntity,
2224
2300
  className: t
2225
- }) : e.type === "trend" ? /* @__PURE__ */ s(mt, {
2301
+ }) : e.type === "trend" ? /* @__PURE__ */ s(xt, {
2226
2302
  points: e.points,
2227
2303
  className: t
2228
- }) : e.type === "mini-bars" ? /* @__PURE__ */ s(je, {
2304
+ }) : e.type === "mini-bars" ? /* @__PURE__ */ s(ze, {
2229
2305
  rows: e.rows,
2230
2306
  className: t
2231
- }) : e.type === "contract-value-orb" ? /* @__PURE__ */ s(xe, { data: e.data }) : e.type === "contract-bars" ? /* @__PURE__ */ s(ge, { contractors: e.contractors }) : e.type === "commitment-race" ? /* @__PURE__ */ s(oe, { contractors: e.contractors }) : e.type === "status-arc" ? /* @__PURE__ */ s(ft, {
2307
+ }) : e.type === "contract-value-orb" ? /* @__PURE__ */ s(Ae, { data: e.data }) : e.type === "contract-bars" ? /* @__PURE__ */ s(Ce, { contractors: e.contractors }) : e.type === "commitment-race" ? /* @__PURE__ */ s(fe, { contractors: e.contractors }) : e.type === "status-arc" ? /* @__PURE__ */ s(bt, {
2232
2308
  segments: e.segments,
2233
2309
  title: e.title
2234
- }) : e.type === "ew-category" ? /* @__PURE__ */ s(De, { categories: e.categories }) : e.type === "contractor-rank" ? /* @__PURE__ */ s(Ee, { contractors: e.contractors }) : e.type === "severity-bands" ? /* @__PURE__ */ s(ut, { severities: e.severities }) : e.type === "nce-tree" ? /* @__PURE__ */ s(Pe, {
2310
+ }) : e.type === "ew-category" ? /* @__PURE__ */ s(Fe, { categories: e.categories }) : e.type === "contractor-rank" ? /* @__PURE__ */ s(Pe, { contractors: e.contractors }) : e.type === "severity-bands" ? /* @__PURE__ */ s(vt, { severities: e.severities }) : e.type === "nce-tree" ? /* @__PURE__ */ s(He, {
2235
2311
  total: e.total,
2236
2312
  byContractor: e.byContractor
2237
- }) : e.type === "compensation-gauge" ? /* @__PURE__ */ s(le, {
2313
+ }) : e.type === "compensation-gauge" ? /* @__PURE__ */ s(he, {
2238
2314
  pct: e.pct,
2239
2315
  confirmed: e.confirmed,
2240
2316
  total: e.total
2241
- }) : e.type === "variation-split" ? /* @__PURE__ */ s(_t, { contractors: e.contractors }) : e.type === "quotation-balance" ? /* @__PURE__ */ s(Qe, {
2317
+ }) : e.type === "variation-split" ? /* @__PURE__ */ s(Ot, { contractors: e.contractors }) : e.type === "quotation-balance" ? /* @__PURE__ */ s(ot, {
2242
2318
  accepted: e.accepted,
2243
2319
  submitted: e.submitted
2244
- }) : e.type === "quotation-trend" ? /* @__PURE__ */ s(et, { trend: e.trend }) : e.type === "trend-view" ? /* @__PURE__ */ s(st, { trend: e.trend }) : e.type === "weekly-flow" ? /* @__PURE__ */ s(bt, { contractors: e.contractors }) : /* @__PURE__ */ s("div", {
2320
+ }) : e.type === "quotation-trend" ? /* @__PURE__ */ s(ct, { trend: e.trend }) : e.type === "trend-view" ? /* @__PURE__ */ s(ht, { trend: e.trend }) : e.type === "weekly-flow" ? /* @__PURE__ */ s(jt, { contractors: e.contractors }) : /* @__PURE__ */ s("div", {
2245
2321
  className: "viz-empty",
2246
2322
  children: "Visualization unavailable"
2247
2323
  });
2248
2324
  }
2249
2325
  //#endregion
2250
2326
  //#region src/utils/mounts.tsx
2251
- var Ct = [];
2252
- function wt(e) {
2327
+ var Pt = [];
2328
+ function Ft(e) {
2253
2329
  try {
2254
2330
  return JSON.parse(decodeURIComponent(e));
2255
2331
  } catch {
2256
2332
  return null;
2257
2333
  }
2258
2334
  }
2259
- function Tt() {
2260
- for (; Ct.length;) {
2261
- let e = Ct.pop();
2335
+ function It() {
2336
+ for (; Pt.length;) {
2337
+ let e = Pt.pop();
2262
2338
  e && e.unmount();
2263
2339
  }
2264
2340
  }
2265
- function Et() {
2266
- Tt(), document.querySelectorAll("[data-d3-viz]").forEach((t) => {
2341
+ function Lt() {
2342
+ It(), document.querySelectorAll("[data-d3-viz]").forEach((t) => {
2267
2343
  let n = t.dataset.d3Viz;
2268
2344
  if (!n) return;
2269
- let r = wt(n);
2345
+ let r = Ft(n);
2270
2346
  if (!r) return;
2271
2347
  let i = e(t);
2272
- Ct.push(i), i.render(/* @__PURE__ */ s(St, { config: r }));
2348
+ Pt.push(i), i.render(/* @__PURE__ */ s(Nt, { config: r }));
2273
2349
  });
2274
2350
  }
2275
- function Dt(e) {
2351
+ function Rt(e) {
2276
2352
  return encodeURIComponent(JSON.stringify(e));
2277
2353
  }
2278
2354
  //#endregion
2279
2355
  //#region src/components/donutChart/DonutChart.tsx
2280
- function Ot({ rows: e = [], className: t, colors: n }) {
2281
- return /* @__PURE__ */ s(Re, {
2356
+ function zt({ rows: e = [], className: t, colors: n }) {
2357
+ return /* @__PURE__ */ s(Ke, {
2282
2358
  rows: e,
2283
2359
  variant: "donut",
2284
2360
  className: t,
@@ -2287,7 +2363,7 @@ function Ot({ rows: e = [], className: t, colors: n }) {
2287
2363
  }
2288
2364
  //#endregion
2289
2365
  //#region src/components/keyHighlights/KeyHighlights.tsx
2290
- var X = {
2366
+ var Z = {
2291
2367
  bg: u.sf,
2292
2368
  border: u.bd,
2293
2369
  t1: u.t1,
@@ -2297,7 +2373,7 @@ var X = {
2297
2373
  red: u.red,
2298
2374
  amber: u.amber,
2299
2375
  green: u.green
2300
- }, Z = "'JetBrains Mono', monospace", Q = "'Satoshi Variable', 'DM Sans', sans-serif", kt = {
2376
+ }, Q = "'Satoshi Variable', 'DM Sans', sans-serif", Bt = {
2301
2377
  color: "#F7F7F7",
2302
2378
  fontFamily: Q,
2303
2379
  fontSize: 24,
@@ -2310,7 +2386,7 @@ var X = {
2310
2386
  fontWeight: 400,
2311
2387
  lineHeight: "20px"
2312
2388
  };
2313
- function At({ chips: e = [] }) {
2389
+ function Vt({ chips: e = [] }) {
2314
2390
  return /* @__PURE__ */ s("div", {
2315
2391
  style: {
2316
2392
  display: "flex",
@@ -2319,19 +2395,21 @@ function At({ chips: e = [] }) {
2319
2395
  },
2320
2396
  children: e.map((e, t) => /* @__PURE__ */ c("div", {
2321
2397
  style: {
2322
- flex: 1,
2398
+ width: 260,
2399
+ height: 120,
2323
2400
  display: "flex",
2324
2401
  alignItems: "baseline",
2325
2402
  gap: 8,
2326
2403
  padding: "8px 12px",
2327
- background: X.bg,
2328
- border: `1px solid ${X.border}`,
2329
- borderRadius: 5
2404
+ background: Z.bg,
2405
+ border: `1px solid ${Z.border}`,
2406
+ borderRadius: 5,
2407
+ boxSizing: "border-box"
2330
2408
  },
2331
2409
  children: [/* @__PURE__ */ s("span", {
2332
2410
  style: {
2333
- ...kt,
2334
- color: e.color ?? X.t1
2411
+ ...Bt,
2412
+ color: e.color ?? Z.t1
2335
2413
  },
2336
2414
  children: e.value
2337
2415
  }), /* @__PURE__ */ s("span", {
@@ -2344,7 +2422,7 @@ function At({ chips: e = [] }) {
2344
2422
  }, t))
2345
2423
  });
2346
2424
  }
2347
- function jt({ items: e = [] }) {
2425
+ function Ht({ items: e = [] }) {
2348
2426
  return /* @__PURE__ */ s("div", {
2349
2427
  style: {
2350
2428
  display: "flex",
@@ -2352,29 +2430,33 @@ function jt({ items: e = [] }) {
2352
2430
  },
2353
2431
  children: e.map((e, t) => /* @__PURE__ */ c("div", {
2354
2432
  style: {
2355
- flex: 1,
2356
- padding: "12px 16px",
2357
- border: `1px solid ${X.border}`,
2358
- background: X.bg,
2359
- textAlign: "left"
2433
+ display: "flex",
2434
+ flexDirection: "column",
2435
+ justifyContent: "center",
2436
+ alignItems: "flex-start",
2437
+ width: 260,
2438
+ height: 120,
2439
+ padding: 24,
2440
+ gap: 8,
2441
+ flexShrink: 0,
2442
+ border: `1px solid ${Z.border}`,
2443
+ background: Z.bg,
2444
+ boxSizing: "border-box"
2360
2445
  },
2361
2446
  children: [/* @__PURE__ */ s("div", {
2362
2447
  style: {
2363
- ...kt,
2364
- color: e.color ?? X.t1
2448
+ ...Bt,
2449
+ color: e.color ?? Z.t1
2365
2450
  },
2366
2451
  children: e.value
2367
2452
  }), /* @__PURE__ */ s("div", {
2368
- style: {
2369
- ...$,
2370
- marginTop: 5
2371
- },
2453
+ style: { ...$ },
2372
2454
  children: e.label
2373
2455
  })]
2374
2456
  }, t))
2375
2457
  });
2376
2458
  }
2377
- function Mt({ items: e = [] }) {
2459
+ function Ut({ items: e = [] }) {
2378
2460
  return /* @__PURE__ */ s("div", {
2379
2461
  style: {
2380
2462
  display: "flex",
@@ -2387,18 +2469,16 @@ function Mt({ items: e = [] }) {
2387
2469
  alignItems: "center",
2388
2470
  gap: 12,
2389
2471
  padding: "9px 14px",
2390
- background: X.bg,
2391
- border: `1px solid ${X.border}`,
2392
- borderLeft: `3px solid ${e.color ?? X.t2}`,
2393
- borderRadius: 6
2472
+ background: Z.bg,
2473
+ border: `1px solid ${Z.border}`
2394
2474
  },
2395
2475
  children: [
2396
2476
  /* @__PURE__ */ s("span", {
2397
2477
  style: {
2398
- fontSize: 11,
2478
+ fontSize: 14,
2399
2479
  fontWeight: 600,
2400
- color: e.color ?? X.t2,
2401
- background: (e.color ?? X.t2) + "22",
2480
+ color: e.color ?? Z.t2,
2481
+ background: (e.color ?? Z.t2) + "22",
2402
2482
  padding: "2px 8px",
2403
2483
  borderRadius: 4,
2404
2484
  fontFamily: Q,
@@ -2408,8 +2488,8 @@ function Mt({ items: e = [] }) {
2408
2488
  }),
2409
2489
  /* @__PURE__ */ s("span", {
2410
2490
  style: {
2411
- ...kt,
2412
- color: e.color ?? X.t1,
2491
+ ...Bt,
2492
+ color: e.color ?? Z.t1,
2413
2493
  minWidth: 70,
2414
2494
  flexShrink: 0
2415
2495
  },
@@ -2426,7 +2506,7 @@ function Mt({ items: e = [] }) {
2426
2506
  }, t))
2427
2507
  });
2428
2508
  }
2429
- function Nt({ items: e = [] }) {
2509
+ function Wt({ items: e = [] }) {
2430
2510
  return /* @__PURE__ */ s("div", {
2431
2511
  style: {
2432
2512
  display: "flex",
@@ -2434,33 +2514,38 @@ function Nt({ items: e = [] }) {
2434
2514
  },
2435
2515
  children: e.map((e, t) => /* @__PURE__ */ c("div", {
2436
2516
  style: {
2437
- flex: 1,
2438
- padding: "14px 16px",
2439
- background: X.bg,
2440
- border: `1px solid ${e.color ? e.color + "30" : X.border}`
2517
+ display: "flex",
2518
+ flexDirection: "column",
2519
+ justifyContent: "center",
2520
+ alignItems: "flex-start",
2521
+ width: 260,
2522
+ height: 120,
2523
+ padding: 24,
2524
+ gap: 8,
2525
+ flexShrink: 0,
2526
+ background: Z.bg,
2527
+ border: `1px solid ${e.color ? e.color + "30" : Z.border}`,
2528
+ boxSizing: "border-box"
2441
2529
  },
2442
2530
  children: [/* @__PURE__ */ s("div", {
2443
2531
  style: {
2444
- ...kt,
2445
- color: e.color ?? X.t1
2532
+ ...Bt,
2533
+ color: e.color ?? Z.t1
2446
2534
  },
2447
2535
  children: e.value
2448
2536
  }), /* @__PURE__ */ s("div", {
2449
- style: {
2450
- ...$,
2451
- marginTop: 6
2452
- },
2537
+ style: { ...$ },
2453
2538
  children: e.label
2454
2539
  })]
2455
2540
  }, t))
2456
2541
  });
2457
2542
  }
2458
- var Pt = {
2459
- red: X.red,
2460
- amber: X.amber,
2461
- green: X.green
2543
+ var Gt = {
2544
+ red: Z.red,
2545
+ amber: Z.amber,
2546
+ green: Z.green
2462
2547
  };
2463
- function Ft({ items: e = [] }) {
2548
+ function Kt({ items: e = [] }) {
2464
2549
  return /* @__PURE__ */ s("div", {
2465
2550
  style: {
2466
2551
  display: "flex",
@@ -2468,7 +2553,7 @@ function Ft({ items: e = [] }) {
2468
2553
  gap: 5
2469
2554
  },
2470
2555
  children: e.map((e, t) => {
2471
- let n = Pt[e.severity];
2556
+ let n = Gt[e.severity];
2472
2557
  return /* @__PURE__ */ c("div", {
2473
2558
  style: {
2474
2559
  display: "flex",
@@ -2476,7 +2561,7 @@ function Ft({ items: e = [] }) {
2476
2561
  gap: 10,
2477
2562
  padding: "10px 14px",
2478
2563
  background: u.sf,
2479
- border: `1px solid ${X.border}`
2564
+ border: `1px solid ${Z.border}`
2480
2565
  },
2481
2566
  children: [/* @__PURE__ */ s("span", { style: {
2482
2567
  width: 7,
@@ -2493,7 +2578,7 @@ function Ft({ items: e = [] }) {
2493
2578
  })
2494
2579
  });
2495
2580
  }
2496
- function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2581
+ function qt({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2497
2582
  let a = t - e;
2498
2583
  return /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ c("div", {
2499
2584
  style: {
@@ -2516,9 +2601,9 @@ function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2516
2601
  position: "absolute",
2517
2602
  top: 43,
2518
2603
  left: 0,
2519
- fontSize: 9,
2520
- color: X.t4,
2521
- fontFamily: Z
2604
+ fontSize: 14,
2605
+ color: Z.t4,
2606
+ fontFamily: Q
2522
2607
  },
2523
2608
  children: [e, n]
2524
2609
  }),
@@ -2527,9 +2612,9 @@ function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2527
2612
  position: "absolute",
2528
2613
  top: 43,
2529
2614
  right: 0,
2530
- fontSize: 9,
2531
- color: X.t4,
2532
- fontFamily: Z
2615
+ fontSize: 14,
2616
+ color: Z.t4,
2617
+ fontFamily: Q
2533
2618
  },
2534
2619
  children: [t, n]
2535
2620
  }),
@@ -2550,7 +2635,7 @@ function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2550
2635
  },
2551
2636
  children: [/* @__PURE__ */ s("div", {
2552
2637
  style: {
2553
- fontSize: 9,
2638
+ fontSize: 14,
2554
2639
  color: o,
2555
2640
  fontFamily: Q,
2556
2641
  whiteSpace: "nowrap"
@@ -2558,10 +2643,10 @@ function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2558
2643
  children: t.name
2559
2644
  }), /* @__PURE__ */ c("div", {
2560
2645
  style: {
2561
- fontSize: 9,
2646
+ fontSize: 14,
2562
2647
  fontWeight: 700,
2563
2648
  color: o,
2564
- fontFamily: Z,
2649
+ fontFamily: Q,
2565
2650
  whiteSpace: "nowrap"
2566
2651
  },
2567
2652
  children: [t.val, n]
@@ -2582,7 +2667,7 @@ function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2582
2667
  },
2583
2668
  children: [/* @__PURE__ */ s("div", {
2584
2669
  style: {
2585
- fontSize: 9,
2670
+ fontSize: 14,
2586
2671
  color: o,
2587
2672
  fontFamily: Q,
2588
2673
  whiteSpace: "nowrap"
@@ -2590,10 +2675,10 @@ function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2590
2675
  children: t.name
2591
2676
  }), /* @__PURE__ */ c("div", {
2592
2677
  style: {
2593
- fontSize: 9,
2678
+ fontSize: 14,
2594
2679
  fontWeight: 700,
2595
2680
  color: o,
2596
- fontFamily: Z,
2681
+ fontFamily: Q,
2597
2682
  whiteSpace: "nowrap"
2598
2683
  },
2599
2684
  children: [t.val, n]
@@ -2603,9 +2688,9 @@ function It({ min: e, max: t, unit: n, dots: r = [], chips: i = [] }) {
2603
2688
  }, r);
2604
2689
  })
2605
2690
  ]
2606
- }), i && i.length > 0 && /* @__PURE__ */ s(At, { chips: i })] });
2691
+ }), i && i.length > 0 && /* @__PURE__ */ s(Vt, { chips: i })] });
2607
2692
  }
2608
- function Lt({ leftPct: e, leftLabel: t, leftValue: n, leftColor: r, rightPct: i, rightLabel: a, rightValue: o, rightColor: l, chips: d }) {
2693
+ function Jt({ leftPct: e, leftLabel: t, leftValue: n, leftColor: r, rightPct: i, rightLabel: a, rightValue: o, rightColor: l, chips: d }) {
2609
2694
  let f = r ?? u.blue, p = l ?? u.cyan;
2610
2695
  return /* @__PURE__ */ c("div", { children: [
2611
2696
  /* @__PURE__ */ c("div", {
@@ -2628,10 +2713,10 @@ function Lt({ leftPct: e, leftLabel: t, leftValue: n, leftColor: r, rightPct: i,
2628
2713
  },
2629
2714
  children: /* @__PURE__ */ s("span", {
2630
2715
  style: {
2631
- fontSize: 12,
2716
+ fontSize: 14,
2632
2717
  fontWeight: 700,
2633
2718
  color: f,
2634
- fontFamily: Z
2719
+ fontFamily: Q
2635
2720
  },
2636
2721
  children: n
2637
2722
  })
@@ -2651,10 +2736,10 @@ function Lt({ leftPct: e, leftLabel: t, leftValue: n, leftColor: r, rightPct: i,
2651
2736
  },
2652
2737
  children: /* @__PURE__ */ s("span", {
2653
2738
  style: {
2654
- fontSize: 12,
2739
+ fontSize: 14,
2655
2740
  fontWeight: 700,
2656
2741
  color: p,
2657
- fontFamily: Z
2742
+ fontFamily: Q
2658
2743
  },
2659
2744
  children: o
2660
2745
  })
@@ -2670,7 +2755,7 @@ function Lt({ leftPct: e, leftLabel: t, leftValue: n, leftColor: r, rightPct: i,
2670
2755
  style: { width: `${e}%` },
2671
2756
  children: /* @__PURE__ */ c("span", {
2672
2757
  style: {
2673
- fontSize: 10,
2758
+ fontSize: 14,
2674
2759
  color: f,
2675
2760
  fontFamily: Q
2676
2761
  },
@@ -2687,7 +2772,7 @@ function Lt({ leftPct: e, leftLabel: t, leftValue: n, leftColor: r, rightPct: i,
2687
2772
  },
2688
2773
  children: /* @__PURE__ */ c("span", {
2689
2774
  style: {
2690
- fontSize: 10,
2775
+ fontSize: 14,
2691
2776
  color: p,
2692
2777
  fontFamily: Q
2693
2778
  },
@@ -2699,10 +2784,10 @@ function Lt({ leftPct: e, leftLabel: t, leftValue: n, leftColor: r, rightPct: i,
2699
2784
  })
2700
2785
  })]
2701
2786
  }),
2702
- d && d.length > 0 && /* @__PURE__ */ s(At, { chips: d })
2787
+ d && d.length > 0 && /* @__PURE__ */ s(Vt, { chips: d })
2703
2788
  ] });
2704
2789
  }
2705
- function Rt({ pct: e, label: t, color: n, chips: r }) {
2790
+ function Yt({ pct: e, label: t, color: n, chips: r }) {
2706
2791
  let i = n ?? u.blue, a = 2 * Math.PI * 30, o = a * (1 - e / 100);
2707
2792
  return /* @__PURE__ */ c("div", {
2708
2793
  style: {
@@ -2749,10 +2834,10 @@ function Rt({ pct: e, label: t, color: n, chips: r }) {
2749
2834
  },
2750
2835
  children: /* @__PURE__ */ c("div", {
2751
2836
  style: {
2752
- fontSize: 15,
2837
+ fontSize: 14,
2753
2838
  fontWeight: 700,
2754
2839
  color: i,
2755
- fontFamily: Z
2840
+ fontFamily: Q
2756
2841
  },
2757
2842
  children: [e, "%"]
2758
2843
  })
@@ -2777,14 +2862,14 @@ function Rt({ pct: e, label: t, color: n, chips: r }) {
2777
2862
  alignItems: "baseline",
2778
2863
  gap: 8,
2779
2864
  padding: "7px 10px",
2780
- background: X.bg,
2781
- border: `1px solid ${X.border}`,
2865
+ background: Z.bg,
2866
+ border: `1px solid ${Z.border}`,
2782
2867
  borderRadius: 5
2783
2868
  },
2784
2869
  children: [/* @__PURE__ */ s("span", {
2785
2870
  style: {
2786
- ...kt,
2787
- color: e.color ?? X.t1
2871
+ ...Bt,
2872
+ color: e.color ?? Z.t1
2788
2873
  },
2789
2874
  children: e.value
2790
2875
  }), /* @__PURE__ */ s("span", {
@@ -2796,16 +2881,16 @@ function Rt({ pct: e, label: t, color: n, chips: r }) {
2796
2881
  })]
2797
2882
  });
2798
2883
  }
2799
- var zt = {
2884
+ var Xt = {
2800
2885
  green: "#34D39918",
2801
2886
  amber: "#FBBF2418",
2802
2887
  red: "#F0606018"
2803
- }, Bt = {
2888
+ }, Zt = {
2804
2889
  green: "#34D399",
2805
2890
  amber: "#FBBF24",
2806
2891
  red: "#F06060"
2807
2892
  };
2808
- function Vt({ items: e = [] }) {
2893
+ function Qt({ items: e = [] }) {
2809
2894
  return /* @__PURE__ */ s("div", {
2810
2895
  style: {
2811
2896
  display: "flex",
@@ -2818,18 +2903,16 @@ function Vt({ items: e = [] }) {
2818
2903
  alignItems: "center",
2819
2904
  gap: 10,
2820
2905
  padding: "8px 12px",
2821
- background: X.bg,
2822
- border: `1px solid ${X.border}`,
2823
- borderLeft: `3px solid ${e.color ?? X.t2}`,
2824
- borderRadius: 6
2906
+ background: Z.bg,
2907
+ border: `1px solid ${Z.border}`
2825
2908
  },
2826
2909
  children: [
2827
2910
  /* @__PURE__ */ s("span", {
2828
2911
  style: {
2829
- fontSize: 11,
2912
+ fontSize: 14,
2830
2913
  fontWeight: 600,
2831
- color: e.color ?? X.t2,
2832
- background: (e.color ?? X.t2) + "1A",
2914
+ color: e.color ?? Z.t2,
2915
+ background: (e.color ?? Z.t2) + "1A",
2833
2916
  padding: "2px 7px",
2834
2917
  borderRadius: 4,
2835
2918
  fontFamily: Q,
@@ -2850,17 +2933,17 @@ function Vt({ items: e = [] }) {
2850
2933
  children: /* @__PURE__ */ s("div", { style: {
2851
2934
  height: "100%",
2852
2935
  width: `${e.pct}%`,
2853
- background: e.color ?? X.t2,
2936
+ background: e.color ?? Z.t2,
2854
2937
  borderRadius: 2,
2855
2938
  opacity: .75
2856
2939
  } })
2857
2940
  }),
2858
2941
  /* @__PURE__ */ s("span", {
2859
2942
  style: {
2860
- fontSize: 13,
2943
+ fontSize: 14,
2861
2944
  fontWeight: 700,
2862
- color: e.color ?? X.t1,
2863
- fontFamily: Z,
2945
+ color: e.color ?? Z.t1,
2946
+ fontFamily: Q,
2864
2947
  flexShrink: 0,
2865
2948
  minWidth: 52,
2866
2949
  textAlign: "right"
@@ -2869,10 +2952,10 @@ function Vt({ items: e = [] }) {
2869
2952
  }),
2870
2953
  e.badge && e.badgeSeverity && /* @__PURE__ */ s("span", {
2871
2954
  style: {
2872
- fontSize: 10,
2955
+ fontSize: 14,
2873
2956
  fontWeight: 600,
2874
- color: Bt[e.badgeSeverity],
2875
- background: zt[e.badgeSeverity],
2957
+ color: Zt[e.badgeSeverity],
2958
+ background: Xt[e.badgeSeverity],
2876
2959
  padding: "2px 7px",
2877
2960
  borderRadius: 4,
2878
2961
  fontFamily: Q,
@@ -2895,12 +2978,12 @@ function Vt({ items: e = [] }) {
2895
2978
  }, t))
2896
2979
  });
2897
2980
  }
2898
- var Ht = {
2899
- red: X.red,
2900
- amber: X.amber,
2901
- green: X.green
2981
+ var $t = {
2982
+ red: Z.red,
2983
+ amber: Z.amber,
2984
+ green: Z.green
2902
2985
  };
2903
- function Ut({ items: e = [] }) {
2986
+ function en({ items: e = [] }) {
2904
2987
  return /* @__PURE__ */ s("div", {
2905
2988
  style: {
2906
2989
  display: "flex",
@@ -2908,7 +2991,7 @@ function Ut({ items: e = [] }) {
2908
2991
  gap: 5
2909
2992
  },
2910
2993
  children: e.map((e, t) => {
2911
- let n = Ht[e.severity];
2994
+ let n = $t[e.severity];
2912
2995
  return /* @__PURE__ */ c("div", {
2913
2996
  style: {
2914
2997
  display: "flex",
@@ -2938,7 +3021,7 @@ function Ut({ items: e = [] }) {
2938
3021
  }),
2939
3022
  /* @__PURE__ */ s("span", {
2940
3023
  style: {
2941
- fontSize: 10,
3024
+ fontSize: 14,
2942
3025
  fontWeight: 600,
2943
3026
  color: n,
2944
3027
  background: n + "20",
@@ -2962,7 +3045,7 @@ function Ut({ items: e = [] }) {
2962
3045
  })
2963
3046
  });
2964
3047
  }
2965
- function Wt({ columns: e = [], rows: t = [] }) {
3048
+ function tn({ columns: e = [], rows: t = [] }) {
2966
3049
  return /* @__PURE__ */ c("div", {
2967
3050
  style: {
2968
3051
  display: "flex",
@@ -2975,14 +3058,14 @@ function Wt({ columns: e = [], rows: t = [] }) {
2975
3058
  alignItems: "center",
2976
3059
  gap: 10,
2977
3060
  padding: "0 12px 6px",
2978
- borderBottom: `1px solid ${X.border}`
3061
+ borderBottom: `1px solid ${Z.border}`
2979
3062
  },
2980
3063
  children: [/* @__PURE__ */ s("div", { style: { minWidth: 64 } }), e.map((e, t) => /* @__PURE__ */ s("div", {
2981
3064
  style: {
2982
3065
  flex: 1,
2983
- fontSize: 9,
3066
+ fontSize: 14,
2984
3067
  fontWeight: 600,
2985
- color: X.t4,
3068
+ color: Z.t2,
2986
3069
  fontFamily: Q,
2987
3070
  textTransform: "uppercase",
2988
3071
  letterSpacing: .6
@@ -2995,17 +3078,15 @@ function Wt({ columns: e = [], rows: t = [] }) {
2995
3078
  alignItems: "center",
2996
3079
  gap: 10,
2997
3080
  padding: "8px 12px",
2998
- background: X.bg,
2999
- border: `1px solid ${X.border}`,
3000
- borderLeft: `3px solid ${e.color ?? X.t4}`,
3001
- borderRadius: 6
3081
+ background: Z.bg,
3082
+ border: `1px solid ${Z.border}`
3002
3083
  },
3003
3084
  children: [/* @__PURE__ */ s("span", {
3004
3085
  style: {
3005
- fontSize: 11,
3086
+ fontSize: 14,
3006
3087
  fontWeight: 600,
3007
- color: e.color ?? X.t2,
3008
- background: (e.color ?? X.t4) + "1A",
3088
+ color: Z.t2,
3089
+ background: (e.color ?? Z.t4) + "1A",
3009
3090
  padding: "2px 8px",
3010
3091
  borderRadius: 4,
3011
3092
  fontFamily: Q,
@@ -3017,20 +3098,19 @@ function Wt({ columns: e = [], rows: t = [] }) {
3017
3098
  }), e.cells.map((t, n) => /* @__PURE__ */ s("span", {
3018
3099
  style: {
3019
3100
  flex: 1,
3020
- fontSize: 13,
3101
+ fontSize: 14,
3021
3102
  fontWeight: 700,
3022
- color: e.color ?? X.t1,
3023
- fontFamily: Z
3103
+ color: e.color ?? Z.t1,
3104
+ fontFamily: Q
3024
3105
  },
3025
3106
  children: t
3026
3107
  }, n))]
3027
3108
  }, t))]
3028
3109
  });
3029
3110
  }
3030
- function Gt({ text: e }) {
3111
+ function nn({ text: e }) {
3031
3112
  return /* @__PURE__ */ c("div", {
3032
3113
  style: {
3033
- marginTop: 10,
3034
3114
  padding: "8px 12px",
3035
3115
  border: `1px solid ${u.bd}`,
3036
3116
  borderLeft: "4px solid #FFAE43",
@@ -3053,22 +3133,22 @@ function Gt({ text: e }) {
3053
3133
  })]
3054
3134
  });
3055
3135
  }
3056
- function Kt({ block: e }) {
3136
+ function rn({ block: e }) {
3057
3137
  if (!e) return null;
3058
3138
  let t = (() => {
3059
3139
  switch (e.type) {
3060
- case "stats": return /* @__PURE__ */ s(jt, { items: e.items });
3061
- case "ranked": return /* @__PURE__ */ s(Mt, { items: e.items });
3062
- case "chips": return /* @__PURE__ */ s(Nt, { items: e.items });
3063
- case "badges": return /* @__PURE__ */ s(Ft, { items: e.items });
3064
- case "dot-strip": return /* @__PURE__ */ s(It, {
3140
+ case "stats": return /* @__PURE__ */ s(Ht, { items: e.items });
3141
+ case "ranked": return /* @__PURE__ */ s(Ut, { items: e.items });
3142
+ case "chips": return /* @__PURE__ */ s(Wt, { items: e.items });
3143
+ case "badges": return /* @__PURE__ */ s(Kt, { items: e.items });
3144
+ case "dot-strip": return /* @__PURE__ */ s(qt, {
3065
3145
  min: e.min,
3066
3146
  max: e.max,
3067
3147
  unit: e.unit,
3068
3148
  dots: e.dots,
3069
3149
  chips: e.chips
3070
3150
  });
3071
- case "proportion": return /* @__PURE__ */ s(Lt, {
3151
+ case "proportion": return /* @__PURE__ */ s(Jt, {
3072
3152
  leftPct: e.leftPct,
3073
3153
  leftLabel: e.leftLabel,
3074
3154
  leftValue: e.leftValue,
@@ -3079,22 +3159,29 @@ function Kt({ block: e }) {
3079
3159
  rightColor: e.rightColor,
3080
3160
  chips: e.chips
3081
3161
  });
3082
- case "ring": return /* @__PURE__ */ s(Rt, {
3162
+ case "ring": return /* @__PURE__ */ s(Yt, {
3083
3163
  pct: e.pct,
3084
3164
  label: e.label,
3085
3165
  color: e.color,
3086
3166
  chips: e.chips
3087
3167
  });
3088
- case "scorecard-rows": return /* @__PURE__ */ s(Vt, { items: e.items });
3089
- case "flags-list": return /* @__PURE__ */ s(Ut, { items: e.items });
3090
- case "comparison-rows": return /* @__PURE__ */ s(Wt, {
3168
+ case "scorecard-rows": return /* @__PURE__ */ s(Qt, { items: e.items });
3169
+ case "flags-list": return /* @__PURE__ */ s(en, { items: e.items });
3170
+ case "comparison-rows": return /* @__PURE__ */ s(tn, {
3091
3171
  columns: e.columns,
3092
3172
  rows: e.rows
3093
3173
  });
3094
3174
  default: return null;
3095
3175
  }
3096
3176
  })();
3097
- return e.takeaway ? /* @__PURE__ */ c("div", { children: [t, /* @__PURE__ */ s(Gt, { text: e.takeaway })] }) : t;
3177
+ return e.takeaway ? /* @__PURE__ */ c("div", {
3178
+ style: {
3179
+ display: "flex",
3180
+ flexDirection: "column",
3181
+ gap: 24
3182
+ },
3183
+ children: [t, /* @__PURE__ */ s(nn, { text: e.takeaway })]
3184
+ }) : t;
3098
3185
  }
3099
3186
  //#endregion
3100
- export { ne as AreaChart, ie as BarChart, l as ChartFrame, Ot as DonutChart, Kt as KeyHighlights, Oe as LineChart, je as MiniBars, Re as PieChart, Je as ProcessSankey, Ye as RankingSankey, Be as SankeySvg, te as SeriesChart, st as Trend, mt as TrendChart, St as VisualizationRenderer, Tt as cleanupVisualizationMounts, Et as hydrateVisualizationMounts, Dt as serializeVisualizationConfig };
3187
+ export { ne as AreaChart, ie as BarChart, l as ChartFrame, zt as DonutChart, rn as KeyHighlights, Ie as LineChart, ze as MiniBars, Ke as PieChart, nt as ProcessSankey, rt as RankingSankey, Je as SankeySvg, te as SeriesChart, ht as Trend, xt as TrendChart, Nt as VisualizationRenderer, It as cleanupVisualizationMounts, Lt as hydrateVisualizationMounts, Rt as serializeVisualizationConfig };