@x-plat/design-system 0.5.30 → 0.5.32

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.
@@ -2416,6 +2416,40 @@ var AxisLabels = import_react6.default.memo(({ labels, count, chartW, height })
2416
2416
  }) });
2417
2417
  });
2418
2418
  AxisLabels.displayName = "AxisLabels";
2419
+ var useCrosshair = (seriesPoints, entries, labels, chartH) => {
2420
+ const [activeIndex, setActiveIndex] = import_react6.default.useState(null);
2421
+ const [mouseX, setMouseX] = import_react6.default.useState(null);
2422
+ const handleMouseMove = import_react6.default.useCallback((e) => {
2423
+ const svg = e.currentTarget;
2424
+ const rect = svg.getBoundingClientRect();
2425
+ const mx = (e.clientX - rect.left) / rect.width * svg.viewBox.baseVal.width;
2426
+ setMouseX(mx);
2427
+ if (seriesPoints.length === 0 || seriesPoints[0].length === 0) return;
2428
+ const points = seriesPoints[0];
2429
+ let closest = 0;
2430
+ let minDist = Math.abs(points[0].x - mx);
2431
+ for (let i = 1; i < points.length; i++) {
2432
+ const dist = Math.abs(points[i].x - mx);
2433
+ if (dist < minDist) {
2434
+ minDist = dist;
2435
+ closest = i;
2436
+ }
2437
+ }
2438
+ setActiveIndex(closest);
2439
+ }, [seriesPoints]);
2440
+ const handleMouseLeave = import_react6.default.useCallback(() => {
2441
+ setActiveIndex(null);
2442
+ setMouseX(null);
2443
+ }, []);
2444
+ const tooltipContent = import_react6.default.useMemo(() => {
2445
+ if (activeIndex === null) return "";
2446
+ return entries.map(([key], di) => {
2447
+ const p = seriesPoints[di]?.[activeIndex];
2448
+ return p ? `${key}: ${p.v}` : "";
2449
+ }).filter(Boolean).join(" / ");
2450
+ }, [activeIndex, entries, seriesPoints]);
2451
+ return { activeIndex, mouseX, handleMouseMove, handleMouseLeave, tooltipContent };
2452
+ };
2419
2453
  var LineChart = import_react6.default.memo(({ data, labels, width, height, animate, onHover, onMove, onLeave }) => {
2420
2454
  const entries = import_react6.default.useMemo(() => Object.entries(data), [data]);
2421
2455
  const maxVal = import_react6.default.useMemo(() => {
@@ -2435,8 +2469,9 @@ var LineChart = import_react6.default.memo(({ data, labels, width, height, anima
2435
2469
  ),
2436
2470
  [entries, count, chartW, chartH, maxVal]
2437
2471
  );
2438
- const showPoints = count <= 100;
2439
2472
  const lineRefs = import_react6.default.useRef([]);
2473
+ const clipRef = import_react6.default.useRef(null);
2474
+ const { activeIndex, mouseX, handleMouseMove, handleMouseLeave, tooltipContent } = useCrosshair(seriesPoints, entries, labels, chartH);
2440
2475
  import_react6.default.useEffect(() => {
2441
2476
  if (!animate) return;
2442
2477
  lineRefs.current.forEach((el) => {
@@ -2449,61 +2484,110 @@ var LineChart = import_react6.default.memo(({ data, labels, width, height, anima
2449
2484
  el.style.strokeDashoffset = "0";
2450
2485
  });
2451
2486
  });
2452
- }, [animate, seriesPoints]);
2453
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("svg", { viewBox: `0 0 ${width} ${height}`, className: "chart-svg", children: [
2454
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(GridLines, { width, height, chartH, maxVal }),
2455
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(AxisLabels, { labels, count, chartW, height }),
2456
- entries.map(([key], di) => {
2457
- const palette = getPalette(LINE_BAR_PALETTES, di, key);
2458
- const color = palette[2];
2459
- const areaColor = palette[0];
2460
- const points = seriesPoints[di];
2461
- const gradientId = `line-gradient-${di}`;
2462
- const polyPoints = points.map((p) => `${p.x},${p.y}`).join(" ");
2463
- const areaD = `M ${points[0].x},${points[0].y} ${points.map((p) => `L ${p.x},${p.y}`).join(" ")} L ${points[points.length - 1].x},${PADDING.top + chartH} L ${points[0].x},${PADDING.top + chartH} Z`;
2464
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("g", { children: [
2465
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
2466
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.2" }),
2467
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0" })
2468
- ] }) }),
2469
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2470
- "path",
2487
+ if (clipRef.current) {
2488
+ clipRef.current.setAttribute("width", "0");
2489
+ requestAnimationFrame(() => {
2490
+ if (clipRef.current) {
2491
+ clipRef.current.style.transition = "width 1200ms ease-out 200ms";
2492
+ clipRef.current.setAttribute("width", `${width}`);
2493
+ }
2494
+ });
2495
+ }
2496
+ }, [animate, seriesPoints, width]);
2497
+ const guideX = mouseX != null && mouseX >= PADDING.left && mouseX <= width - PADDING.right ? mouseX : null;
2498
+ const activeX = activeIndex !== null ? seriesPoints[0]?.[activeIndex]?.x : null;
2499
+ const lineClipId = "line-area-clip";
2500
+ return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
2501
+ "svg",
2502
+ {
2503
+ viewBox: `0 0 ${width} ${height}`,
2504
+ className: "chart-svg",
2505
+ onMouseMove: (e) => {
2506
+ handleMouseMove(e);
2507
+ onMove(e);
2508
+ },
2509
+ onMouseLeave: () => {
2510
+ handleMouseLeave();
2511
+ onLeave();
2512
+ },
2513
+ children: [
2514
+ animate && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("clipPath", { id: lineClipId, children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("rect", { ref: clipRef, x: "0", y: "0", width: animate ? 0 : width, height }) }) }),
2515
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(GridLines, { width, height, chartH, maxVal }),
2516
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(AxisLabels, { labels, count, chartW, height }),
2517
+ entries.map(([key], di) => {
2518
+ const palette = getPalette(LINE_BAR_PALETTES, di, key);
2519
+ const color = palette[2];
2520
+ const areaColor = palette[0];
2521
+ const points = seriesPoints[di];
2522
+ const gradientId = `line-gradient-${di}`;
2523
+ const polyPoints = points.map((p) => `${p.x},${p.y}`).join(" ");
2524
+ const areaD = `M ${points[0].x},${points[0].y} ${points.map((p) => `L ${p.x},${p.y}`).join(" ")} L ${points[points.length - 1].x},${PADDING.top + chartH} L ${points[0].x},${PADDING.top + chartH} Z`;
2525
+ return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("g", { children: [
2526
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
2527
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.2" }),
2528
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0" })
2529
+ ] }) }),
2530
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2531
+ "path",
2532
+ {
2533
+ d: areaD,
2534
+ fill: `url(#${gradientId})`,
2535
+ clipPath: animate ? `url(#${lineClipId})` : void 0
2536
+ }
2537
+ ),
2538
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2539
+ "polyline",
2540
+ {
2541
+ ref: (el) => {
2542
+ lineRefs.current[di] = el;
2543
+ },
2544
+ points: polyPoints,
2545
+ fill: "none",
2546
+ stroke: color,
2547
+ strokeWidth: "2"
2548
+ }
2549
+ ),
2550
+ activeIndex !== null && points[activeIndex] && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2551
+ "circle",
2552
+ {
2553
+ cx: points[activeIndex].x,
2554
+ cy: points[activeIndex].y,
2555
+ r: "5",
2556
+ fill: color,
2557
+ className: "chart-point-active"
2558
+ }
2559
+ )
2560
+ ] }, di);
2561
+ }),
2562
+ guideX !== null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2563
+ "line",
2471
2564
  {
2472
- d: areaD,
2473
- fill: `url(#${gradientId})`,
2474
- className: "chart-area",
2475
- style: animate ? { animationDelay: "600ms" } : { opacity: 1 }
2565
+ x1: guideX,
2566
+ y1: PADDING.top,
2567
+ x2: guideX,
2568
+ y2: PADDING.top + chartH,
2569
+ className: "chart-crosshair"
2476
2570
  }
2477
2571
  ),
2572
+ activeIndex !== null && activeX !== null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("foreignObject", { x: activeX - 100, y: 0, width: "200", height: PADDING.top, children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "chart-crosshair-label", children: [
2573
+ labels[activeIndex],
2574
+ " \u2014 ",
2575
+ tooltipContent
2576
+ ] }) }),
2478
2577
  /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2479
- "polyline",
2578
+ "rect",
2480
2579
  {
2481
- ref: (el) => {
2482
- lineRefs.current[di] = el;
2483
- },
2484
- points: polyPoints,
2485
- fill: "none",
2486
- stroke: color,
2487
- strokeWidth: "2"
2580
+ x: PADDING.left,
2581
+ y: PADDING.top,
2582
+ width: chartW,
2583
+ height: chartH,
2584
+ fill: "transparent",
2585
+ style: { cursor: "crosshair" }
2488
2586
  }
2489
- ),
2490
- showPoints && points.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2491
- "circle",
2492
- {
2493
- cx: p.x,
2494
- cy: p.y,
2495
- r: "4",
2496
- fill: color,
2497
- className: "chart-point",
2498
- onMouseEnter: (e) => onHover(e, `${key}: ${labels[i]} \u2014 ${p.v}`),
2499
- onMouseMove: onMove,
2500
- onMouseLeave: onLeave
2501
- },
2502
- i
2503
- ))
2504
- ] }, di);
2505
- })
2506
- ] });
2587
+ )
2588
+ ]
2589
+ }
2590
+ );
2507
2591
  });
2508
2592
  LineChart.displayName = "LineChart";
2509
2593
  var CurveChart = import_react6.default.memo(({ data, labels, width, height, animate, onHover, onMove, onLeave }) => {
@@ -2525,8 +2609,9 @@ var CurveChart = import_react6.default.memo(({ data, labels, width, height, anim
2525
2609
  ),
2526
2610
  [entries, count, chartW, chartH, maxVal]
2527
2611
  );
2528
- const showPoints = count <= 100;
2529
2612
  const lineRefs = import_react6.default.useRef([]);
2613
+ const curveClipRef = import_react6.default.useRef(null);
2614
+ const { activeIndex, mouseX, handleMouseMove, handleMouseLeave, tooltipContent } = useCrosshair(seriesPoints, entries, labels, chartH);
2530
2615
  import_react6.default.useEffect(() => {
2531
2616
  if (!animate) return;
2532
2617
  lineRefs.current.forEach((el) => {
@@ -2539,61 +2624,110 @@ var CurveChart = import_react6.default.memo(({ data, labels, width, height, anim
2539
2624
  el.style.strokeDashoffset = "0";
2540
2625
  });
2541
2626
  });
2542
- }, [animate, seriesPoints]);
2543
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("svg", { viewBox: `0 0 ${width} ${height}`, className: "chart-svg", children: [
2544
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(GridLines, { width, height, chartH, maxVal }),
2545
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(AxisLabels, { labels, count, chartW, height }),
2546
- entries.map(([key], di) => {
2547
- const palette = getPalette(LINE_BAR_PALETTES, di, key);
2548
- const color = palette[2];
2549
- const areaColor = palette[0];
2550
- const points = seriesPoints[di];
2551
- const gradientId = `curve-gradient-${di}`;
2552
- const linePath = toSmoothPath(points);
2553
- const areaPath = linePath + ` L ${points[points.length - 1].x} ${PADDING.top + chartH} L ${points[0].x} ${PADDING.top + chartH} Z`;
2554
- return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("g", { children: [
2555
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
2556
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.4" }),
2557
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0.02" })
2558
- ] }) }),
2559
- /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2560
- "path",
2627
+ if (curveClipRef.current) {
2628
+ curveClipRef.current.setAttribute("width", "0");
2629
+ requestAnimationFrame(() => {
2630
+ if (curveClipRef.current) {
2631
+ curveClipRef.current.style.transition = "width 1200ms ease-out 200ms";
2632
+ curveClipRef.current.setAttribute("width", `${width}`);
2633
+ }
2634
+ });
2635
+ }
2636
+ }, [animate, seriesPoints, width]);
2637
+ const guideX = mouseX != null && mouseX >= PADDING.left && mouseX <= width - PADDING.right ? mouseX : null;
2638
+ const activeX = activeIndex !== null ? seriesPoints[0]?.[activeIndex]?.x : null;
2639
+ const curveClipId = "curve-area-clip";
2640
+ return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)(
2641
+ "svg",
2642
+ {
2643
+ viewBox: `0 0 ${width} ${height}`,
2644
+ className: "chart-svg",
2645
+ onMouseMove: (e) => {
2646
+ handleMouseMove(e);
2647
+ onMove(e);
2648
+ },
2649
+ onMouseLeave: () => {
2650
+ handleMouseLeave();
2651
+ onLeave();
2652
+ },
2653
+ children: [
2654
+ animate && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("clipPath", { id: curveClipId, children: /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("rect", { ref: curveClipRef, x: "0", y: "0", width: animate ? 0 : width, height }) }) }),
2655
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(GridLines, { width, height, chartH, maxVal }),
2656
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(AxisLabels, { labels, count, chartW, height }),
2657
+ entries.map(([key], di) => {
2658
+ const palette = getPalette(LINE_BAR_PALETTES, di, key);
2659
+ const color = palette[2];
2660
+ const areaColor = palette[0];
2661
+ const points = seriesPoints[di];
2662
+ const gradientId = `curve-gradient-${di}`;
2663
+ const linePath = toSmoothPath(points);
2664
+ const areaPath = linePath + ` L ${points[points.length - 1].x} ${PADDING.top + chartH} L ${points[0].x} ${PADDING.top + chartH} Z`;
2665
+ return /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("g", { children: [
2666
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("defs", { children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("linearGradient", { id: gradientId, x1: "0", y1: "0", x2: "0", y2: "1", children: [
2667
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "0%", stopColor: areaColor, stopOpacity: "0.4" }),
2668
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("stop", { offset: "100%", stopColor: areaColor, stopOpacity: "0.02" })
2669
+ ] }) }),
2670
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2671
+ "path",
2672
+ {
2673
+ d: areaPath,
2674
+ fill: `url(#${gradientId})`,
2675
+ clipPath: animate ? `url(#${curveClipId})` : void 0
2676
+ }
2677
+ ),
2678
+ /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2679
+ "path",
2680
+ {
2681
+ ref: (el) => {
2682
+ lineRefs.current[di] = el;
2683
+ },
2684
+ d: linePath,
2685
+ fill: "none",
2686
+ stroke: color,
2687
+ strokeWidth: "2"
2688
+ }
2689
+ ),
2690
+ activeIndex !== null && points[activeIndex] && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2691
+ "circle",
2692
+ {
2693
+ cx: points[activeIndex].x,
2694
+ cy: points[activeIndex].y,
2695
+ r: "5",
2696
+ fill: color,
2697
+ className: "chart-point-active"
2698
+ }
2699
+ )
2700
+ ] }, di);
2701
+ }),
2702
+ guideX !== null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2703
+ "line",
2561
2704
  {
2562
- d: areaPath,
2563
- fill: `url(#${gradientId})`,
2564
- className: "chart-area",
2565
- style: animate ? { animationDelay: "600ms" } : { opacity: 1 }
2705
+ x1: guideX,
2706
+ y1: PADDING.top,
2707
+ x2: guideX,
2708
+ y2: PADDING.top + chartH,
2709
+ className: "chart-crosshair"
2566
2710
  }
2567
2711
  ),
2712
+ activeIndex !== null && activeX !== null && /* @__PURE__ */ (0, import_jsx_runtime307.jsx)("foreignObject", { x: activeX - 100, y: 0, width: "200", height: PADDING.top, children: /* @__PURE__ */ (0, import_jsx_runtime307.jsxs)("div", { className: "chart-crosshair-label", children: [
2713
+ labels[activeIndex],
2714
+ " \u2014 ",
2715
+ tooltipContent
2716
+ ] }) }),
2568
2717
  /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2569
- "path",
2718
+ "rect",
2570
2719
  {
2571
- ref: (el) => {
2572
- lineRefs.current[di] = el;
2573
- },
2574
- d: linePath,
2575
- fill: "none",
2576
- stroke: color,
2577
- strokeWidth: "2"
2720
+ x: PADDING.left,
2721
+ y: PADDING.top,
2722
+ width: chartW,
2723
+ height: chartH,
2724
+ fill: "transparent",
2725
+ style: { cursor: "crosshair" }
2578
2726
  }
2579
- ),
2580
- showPoints && points.map((p, i) => /* @__PURE__ */ (0, import_jsx_runtime307.jsx)(
2581
- "circle",
2582
- {
2583
- cx: p.x,
2584
- cy: p.y,
2585
- r: "4",
2586
- fill: color,
2587
- className: "chart-point",
2588
- onMouseEnter: (e) => onHover(e, `${key}: ${labels[i]} \u2014 ${p.v}`),
2589
- onMouseMove: onMove,
2590
- onMouseLeave: onLeave
2591
- },
2592
- i
2593
- ))
2594
- ] }, di);
2595
- })
2596
- ] });
2727
+ )
2728
+ ]
2729
+ }
2730
+ );
2597
2731
  });
2598
2732
  CurveChart.displayName = "CurveChart";
2599
2733
  var BarChart = import_react6.default.memo(({ data, labels, width, height, animate, onHover, onMove, onLeave }) => {
@@ -5088,6 +5222,7 @@ var TableRow = import_react37.default.memo((props) => {
5088
5222
  const {
5089
5223
  children,
5090
5224
  type = "secondary",
5225
+ color,
5091
5226
  isHover,
5092
5227
  onClick
5093
5228
  } = props;
@@ -5104,11 +5239,17 @@ var TableRow = import_react37.default.memo((props) => {
5104
5239
  {
5105
5240
  className: clsx_default(
5106
5241
  rowBorderUse ? "table-bottom-border" : null,
5107
- type,
5242
+ color != null ? "categorical" : type,
5243
+ color === "neutral" && "cat-neutral",
5108
5244
  isHover && "hover",
5109
5245
  onClick && "clickable"
5110
5246
  ),
5111
5247
  onClick,
5248
+ style: color != null && color !== "neutral" ? {
5249
+ "--cat-fill": `var(--semantic-categorical-${color}-fill)`,
5250
+ "--cat-text": `var(--semantic-categorical-${color}-text)`,
5251
+ "--cat-bg": `var(--semantic-categorical-${color}-bg)`
5252
+ } : void 0,
5112
5253
  children
5113
5254
  }
5114
5255
  ) });
@@ -1999,6 +1999,24 @@
1999
1999
  .lib-xplat-chart .chart-area {
2000
2000
  opacity: 1;
2001
2001
  }
2002
+ .lib-xplat-chart .chart-crosshair {
2003
+ stroke: var(--semantic-border-subtle);
2004
+ stroke-width: 1;
2005
+ stroke-dasharray: 4 2;
2006
+ pointer-events: none;
2007
+ }
2008
+ .lib-xplat-chart .chart-point-active {
2009
+ pointer-events: none;
2010
+ transition: cx 0.05s, cy 0.05s;
2011
+ }
2012
+ .lib-xplat-chart .chart-crosshair-label {
2013
+ font-size: 11px;
2014
+ font-weight: 500;
2015
+ color: var(--semantic-text-strong);
2016
+ text-align: center;
2017
+ white-space: nowrap;
2018
+ overflow: visible;
2019
+ }
2002
2020
  .lib-xplat-chart .chart-tooltip {
2003
2021
  position: absolute;
2004
2022
  transform: translate(-50%, -100%);
@@ -3844,6 +3862,10 @@
3844
3862
  height: 100%;
3845
3863
  position: relative;
3846
3864
  overflow: auto;
3865
+ scrollbar-width: none;
3866
+ }
3867
+ .lib-xplat-table-wrapper::-webkit-scrollbar {
3868
+ display: none;
3847
3869
  }
3848
3870
  .lib-xplat-table-wrapper.sm > .lib-xplat-table > thead > tr > th,
3849
3871
  .lib-xplat-table-wrapper.sm > .lib-xplat-table > thead > tr > td,
@@ -4022,6 +4044,40 @@
4022
4044
  color: var(--semantic-text-inverse);
4023
4045
  background-color: var(--semantic-surface-info-strong);
4024
4046
  }
4047
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical,
4048
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical {
4049
+ background-color: var(--cat-fill);
4050
+ }
4051
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical > td,
4052
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical > th,
4053
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical > td,
4054
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical > th {
4055
+ color: var(--semantic-text-inverse);
4056
+ background-color: var(--cat-fill);
4057
+ }
4058
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical.hover:hover > td,
4059
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical.hover:hover > th,
4060
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical.hover:hover > td,
4061
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical.hover:hover > th {
4062
+ background-color: var(--cat-text);
4063
+ }
4064
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical.cat-neutral,
4065
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical.cat-neutral {
4066
+ background-color: var(--semantic-surface-neutral-strong);
4067
+ }
4068
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical.cat-neutral > td,
4069
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical.cat-neutral > th,
4070
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical.cat-neutral > td,
4071
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical.cat-neutral > th {
4072
+ color: var(--semantic-text-inverse);
4073
+ background-color: var(--semantic-surface-neutral-strong);
4074
+ }
4075
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical.cat-neutral.hover:hover > td,
4076
+ .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.categorical.cat-neutral.hover:hover > th,
4077
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical.cat-neutral.hover:hover > td,
4078
+ .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.categorical.cat-neutral.hover:hover > th {
4079
+ background-color: var(--semantic-surface-neutral-disabled);
4080
+ }
4025
4081
  .lib-xplat-table-wrapper > .lib-xplat-table > thead > tr.clickable,
4026
4082
  .lib-xplat-table-wrapper > .lib-xplat-table > tbody > tr.clickable {
4027
4083
  cursor: pointer;