@galaxy-io/dls 2.7.0 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,31 @@
1
+ import { type AriaAttributes, type CSSProperties } from "react";
2
+ export interface GalaxyAlchemyWordmarkProps extends AriaAttributes {
3
+ /**
4
+ * Height of the wordmark in px, descender included. The width follows the aspect ratio
5
+ * (≈ 2.77 × height).
6
+ * @default 20
7
+ */
8
+ size?: number;
9
+ /**
10
+ * For a wordmark on an inverted fill (`text.primary`): paints `background.base`.
11
+ * @default false
12
+ */
13
+ isInverse?: boolean;
14
+ /**
15
+ * Accessible name. Pass `""` to make it decorative (`aria-hidden`) when the name is already in
16
+ * the surrounding text.
17
+ * @default Alchemy
18
+ */
19
+ ariaLabel?: string;
20
+ /** DOM id on the `<svg>`. */
21
+ id?: string;
22
+ /** Any `data-*` attribute, forwarded to the `<svg>`. */
23
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
24
+ /** Extra class on the `<svg>`. */
25
+ className?: string;
26
+ /** Inline style on the `<svg>`. */
27
+ style?: CSSProperties;
28
+ }
29
+ /** Alchemy's product wordmark, painted `text.primary`. Labelled "Alchemy" unless `ariaLabel=""`. */
30
+ declare const GalaxyAlchemyWordmark: import("react").ForwardRefExoticComponent<GalaxyAlchemyWordmarkProps & import("react").RefAttributes<SVGSVGElement>>;
31
+ export default GalaxyAlchemyWordmark;
@@ -0,0 +1,38 @@
1
+ import { BRAND_MARK_INVERSE_CSS, BRAND_MARK_NEUTRAL_CSS, BRAND_MARK_SVG_CSS, brandMarkAriaProps } from "./brandMark.js";
2
+ import GalaxyAlchemyWordmarkSvg, { GALAXY_ALCHEMY_WORDMARK_VIEW_BOX } from "./internal/svg/GalaxyAlchemyWordmarkSvg.js";
3
+ import { forwardRef } from "react";
4
+ import { jsx } from "react/jsx-runtime";
5
+ import { cx } from "@linaria/core";
6
+ //#region src/brand/GalaxyAlchemyWordmark.tsx
7
+ /**
8
+ * Alchemy's product wordmark: the word "alchemy" in a heavy connected script, as one inline SVG.
9
+ * It behaves exactly like `GalaxyWordmark`: it paints `text.primary`, reads only CSS variables,
10
+ * and is SSR-safe.
11
+ *
12
+ * The artwork is `src/brand/assets/galaxy-alchemy-wordmark.svg`, compiled by `pnpm assets` into
13
+ * the private `GalaxyAlchemyWordmarkSvg`; the aspect ratio comes from its
14
+ * `GALAXY_ALCHEMY_WORDMARK_VIEW_BOX`.
15
+ */
16
+ /** Width ÷ height of the artwork, from its viewBox. */
17
+ var GALAXY_ALCHEMY_WORDMARK_ASPECT_RATIO = GALAXY_ALCHEMY_WORDMARK_VIEW_BOX.width / GALAXY_ALCHEMY_WORDMARK_VIEW_BOX.height;
18
+ /** Alchemy's product wordmark, painted `text.primary`. Labelled "Alchemy" unless `ariaLabel=""`. */
19
+ var GalaxyAlchemyWordmark = forwardRef(function GalaxyAlchemyWordmark({ size = 20, isInverse = false, ariaLabel = "Alchemy", id, className, style, ...rest }, ref) {
20
+ const aria = brandMarkAriaProps(ariaLabel);
21
+ return /* @__PURE__ */ jsx(GalaxyAlchemyWordmarkSvg, {
22
+ ref,
23
+ id,
24
+ role: aria.role,
25
+ "aria-label": aria["aria-label"],
26
+ "aria-hidden": aria["aria-hidden"],
27
+ ...rest,
28
+ width: size * GALAXY_ALCHEMY_WORDMARK_ASPECT_RATIO,
29
+ height: size,
30
+ fill: "currentColor",
31
+ focusable: "false",
32
+ className: cx(BRAND_MARK_SVG_CSS, isInverse ? BRAND_MARK_INVERSE_CSS : BRAND_MARK_NEUTRAL_CSS, className),
33
+ style
34
+ });
35
+ });
36
+ GalaxyAlchemyWordmark.displayName = "GalaxyAlchemyWordmark";
37
+ //#endregion
38
+ export { GalaxyAlchemyWordmark as default };
@@ -1,8 +1,9 @@
1
1
  /* empty css */
2
2
  //#region src/brand/brandMark.ts
3
3
  /**
4
- * @internal Shared by the five brand components (`GalaxyLogomark`, `GalaxyWordmark`,
5
- * `GalaxyFilamentWordmark`, `GalaxyLogomarkAnimation`, `GalaxyLogomark3D`); not documented API.
4
+ * @internal Shared by the six brand components (`GalaxyLogomark`, `GalaxyWordmark`,
5
+ * `GalaxyFilamentWordmark`, `GalaxyAlchemyWordmark`, `GalaxyLogomarkAnimation`,
6
+ * `GalaxyLogomark3D`); not documented API.
6
7
  *
7
8
  * The marks are one inline SVG painted with `fill="currentColor"`, so their color is CSS: exactly
8
9
  * one of the color classes below sets `color` on the mark. One class never overrides another, so
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @internal Generated by `pnpm assets` from `src/brand/assets/galaxy-alchemy-wordmark.svg`.
3
+ * Do not edit: change the SVG and run `pnpm assets`. Every fill is `currentColor` and the
4
+ * root has no size; the public mark that renders this sets both.
5
+ */
6
+ import { type SVGProps } from "react";
7
+ declare const GalaxyAlchemyWordmarkSvg: import("react").ForwardRefExoticComponent<Omit<SVGProps<SVGSVGElement>, "ref"> & import("react").RefAttributes<SVGSVGElement>>;
8
+ export default GalaxyAlchemyWordmarkSvg;
9
+ /** @internal The artwork's viewBox; the public mark derives its width as `size × width / height`. */
10
+ export declare const GALAXY_ALCHEMY_WORDMARK_VIEW_BOX: {
11
+ readonly width: 697;
12
+ readonly height: 252;
13
+ };
@@ -0,0 +1,29 @@
1
+ import { forwardRef } from "react";
2
+ import { jsx } from "react/jsx-runtime";
3
+ //#region src/brand/internal/svg/GalaxyAlchemyWordmarkSvg.tsx
4
+ /**
5
+ * @internal Generated by `pnpm assets` from `src/brand/assets/galaxy-alchemy-wordmark.svg`.
6
+ * Do not edit: change the SVG and run `pnpm assets`. Every fill is `currentColor` and the
7
+ * root has no size; the public mark that renders this sets both.
8
+ */
9
+ var GalaxyAlchemyWordmarkSvg = forwardRef(function GalaxyAlchemyWordmarkSvg(props, ref) {
10
+ return /* @__PURE__ */ jsx("svg", {
11
+ viewBox: "0 0 697 252",
12
+ fill: "currentColor",
13
+ xmlns: "http://www.w3.org/2000/svg",
14
+ ref,
15
+ ...props,
16
+ children: /* @__PURE__ */ jsx("path", {
17
+ d: "M46.56 188.16C-1.52588e-05 184.08 16.8 64.5601 70.56 77.28C75.6 78.48 81.36 83.04 84.24 91.92C93.12 67.92 122.16 72.96 126.24 82.8C115.92 94.8 115.2 124.56 116.4 138C118.32 157.2 128.64 142.8 132.96 117.36C133.68 113.52 143.28 114.48 142.32 119.28C136.8 147.36 130.8 187.92 109.68 187.92C82.8 187.92 83.52 152.16 83.52 140.88C83.52 139.92 82.08 139.92 82.08 140.88C78.96 158.16 72.96 190.56 46.56 188.16ZM71.76 93.6C61.2 94.3199 52.32 140.16 58.56 145.44C66 151.44 79.2 92.88 71.76 93.6ZM198.219 37.2C170.859 38.64 167.259 107.28 169.419 138C170.859 157.2 179.259 142.8 183.099 117.36C183.579 113.52 194.139 114.48 193.179 119.28C188.139 147.36 186.699 186.72 162.219 187.92C135.099 189.36 129.819 150.48 130.539 111.12C131.019 78.48 134.619 45.84 139.419 33.84C151.179 3.35999 196.539 8.40002 198.219 37.2ZM213.855 186.96C190.335 183.84 177.135 156.24 179.055 129.36C180.975 103.2 197.775 77.76 224.655 75.6C254.175 73.4399 260.895 101.28 257.055 114.96C250.095 139.92 218.655 135.6 222.015 110.16C223.215 101.52 229.935 95.28 236.895 96.72C235.935 90.24 229.455 91.2 226.575 93.36C211.695 104.16 214.335 138.72 230.175 143.04C246.975 147.36 260.175 126.24 261.855 117.6C262.575 113.52 271.935 115.44 271.215 119.52C267.615 137.04 253.455 192.48 213.855 186.96ZM325.474 38.16C304.834 43.4401 297.154 71.76 294.514 104.16C294.274 104.64 294.994 104.88 295.234 104.16C303.154 83.04 315.634 74.88 329.074 76.5601C342.994 78.24 351.634 87.12 353.314 98.16C355.954 118.8 345.394 146.64 353.554 148.32C357.634 149.04 363.394 135.36 366.514 117.36C367.234 113.52 376.834 114.48 375.874 119.28C370.354 147.36 362.434 186.96 340.114 187.92C288.994 190.32 323.074 103.92 317.794 100.32C307.714 93.12 298.834 148.08 302.914 177.36C304.834 192.72 263.314 194.88 262.354 180C260.434 149.28 256.114 71.28 267.154 36.96C279.394 0 326.674 7.91998 325.474 38.16ZM401.691 188.16C374.811 187.2 360.891 155.52 362.811 127.68C364.731 101.04 380.811 75.6 406.971 75.36C424.491 75.12 440.091 88.5601 434.571 114.48C430.011 137.52 410.571 144.96 402.411 132.72C401.931 132 401.211 131.28 401.451 132.24C401.691 142.56 410.811 149.76 418.251 149.28C429.051 148.56 436.731 135.84 440.331 117.84C441.051 114.72 449.211 115.92 448.731 119.28C446.091 144.24 435.291 189.6 401.691 188.16ZM412.011 91.2C405.771 94.08 400.971 116.16 403.611 118.56C409.371 123.6 420.651 86.88 412.011 91.2ZM473.587 104.16C481.267 81.6 493.987 76.08 507.427 76.5601C519.667 76.8 527.587 84.72 530.707 93.6C544.148 67.6801 580.388 73.4399 583.747 98.16C586.388 118.8 575.828 146.64 584.227 148.32C588.068 149.04 593.828 135.36 596.948 117.36C597.667 113.52 607.268 114.48 606.307 119.28C600.787 147.36 593.107 186.96 570.547 187.92C519.427 190.32 553.508 103.92 548.227 100.32C538.147 93.12 528.787 140.64 534.547 175.92C536.707 190.56 494.227 196.32 492.547 177.36C488.707 130.32 502.387 104.4 497.107 101.52C486.547 95.04 475.027 141.36 480.547 176.64C483.188 192 444.067 195.6 440.707 180.96C437.347 164.64 435.667 119.52 441.427 84.96C442.147 70.8 477.908 72 475.987 89.28C475.027 94.8 473.347 97.92 472.867 104.16C472.867 104.64 473.587 104.88 473.587 104.16ZM694.247 82.8C667.847 100.8 696.887 160.08 686.567 208.32C681.287 232.56 659.447 251.76 633.287 247.68C613.367 244.56 597.527 224.64 603.527 200.88C611.207 213.12 629.927 215.76 640.487 201.36C650.327 187.92 655.847 160.32 651.767 137.28C651.527 136.56 650.327 136.8 650.087 137.52C647.927 155.28 640.967 190.56 614.327 188.16C578.807 185.04 588.407 122.4 604.967 80.64C609.767 68.4 642.887 74.88 635.927 91.4399C627.527 111.36 621.047 140.88 626.567 145.44C628.967 147.36 631.847 142.32 634.727 134.88C642.167 114.24 642.887 77.52 670.727 74.16C680.807 72.72 691.367 75.84 694.247 82.8Z",
18
+ fill: "currentColor"
19
+ })
20
+ });
21
+ });
22
+ GalaxyAlchemyWordmarkSvg.displayName = "GalaxyAlchemyWordmarkSvg";
23
+ /** @internal The artwork's viewBox; the public mark derives its width as `size × width / height`. */
24
+ var GALAXY_ALCHEMY_WORDMARK_VIEW_BOX = {
25
+ width: 697,
26
+ height: 252
27
+ };
28
+ //#endregion
29
+ export { GALAXY_ALCHEMY_WORDMARK_VIEW_BOX, GalaxyAlchemyWordmarkSvg as default };
@@ -274,7 +274,7 @@ function BarChartInner(props, ref) {
274
274
  y: activeBand.y,
275
275
  width: activeBand.width,
276
276
  height: activeBand.height,
277
- className: "gx-ChartPrimitives-CHART_CURSOR_BAND_CSS-c1iaray"
277
+ className: "gx-ChartPrimitives-CHART_CURSOR_BAND_CSS-cz6jod1"
278
278
  }),
279
279
  geometry.rects.map((rect) => /* @__PURE__ */ jsx("path", {
280
280
  d: roundedRectPath(rect.x, rect.y, rect.width, rect.height, rect.radius, rect.corners),
@@ -0,0 +1,66 @@
1
+ import { type AriaAttributes, type CSSProperties, type ReactNode } from "react";
2
+ /** Tile fill (Constitution V surface set: containers). */
3
+ export declare enum BigNumberVariant {
4
+ /** The canvas fill, `background.base`. */
5
+ BASE = "BASE",
6
+ /** A panel fill, `background.primary`. The default (1.x). */
7
+ PRIMARY = "PRIMARY",
8
+ /** A raised fill, `background.secondary`. */
9
+ SECONDARY = "SECONDARY",
10
+ /** The most elevated fill, `background.tertiary`. */
11
+ TERTIARY = "TERTIARY"
12
+ }
13
+ /**
14
+ * Which slot of a `BigNumberGroup` a tile sits in.
15
+ * @internal
16
+ */
17
+ export declare enum BigNumberGroupSlot {
18
+ /** The lead tiles on the left, on the frame's own surface: no fill, no border. */
19
+ PRIMARY = "PRIMARY",
20
+ /** The scrolling strip on the right: bordered by default, the tile's own fill. */
21
+ SECONDARY = "SECONDARY"
22
+ }
23
+ /**
24
+ * The slot a tile renders in; `null` outside a `BigNumberGroup`. Set by `BigNumberGroup` around
25
+ * each of its two slots.
26
+ * @internal
27
+ */
28
+ export declare const BigNumberGroupContext: import("react").Context<BigNumberGroupSlot | null>;
29
+ export interface BigNumberProps extends AriaAttributes {
30
+ /** What the number means. Small, tertiary, one line above the value. */
31
+ label: string;
32
+ /** The headline figure. A string or number renders as `body_lg` medium with tabular numerals; pass a node for a value with a unit or a custom treatment. */
33
+ value: ReactNode;
34
+ /** One short line under the value: the comparison or context ("+4% vs last week"). */
35
+ description?: string;
36
+ /** Pinned 8px after the number, vertically centered, however wide the tile: a status `Square`, a small `Icon`, a unit. */
37
+ suffix?: ReactNode;
38
+ /** At the far end of the value row, vertically centered: a `Sparkline`, a `Chip`, a delta. */
39
+ trailing?: ReactNode;
40
+ /**
41
+ * Surface fill of the tile. Ignored in a `BigNumberGroup`'s primary slot, which draws no fill.
42
+ * @default BigNumberVariant.PRIMARY
43
+ */
44
+ variant?: BigNumberVariant;
45
+ /**
46
+ * Adds the 1px hairline. Use it for tiles on a page; leave it off inside an already-bordered container. In a `BigNumberGroup`'s strip it defaults to `true`.
47
+ * @default false
48
+ */
49
+ hasBorder?: boolean;
50
+ /**
51
+ * Replaces `value` with a `Skeleton` line and hides `description`, `suffix` and `trailing`; the label stays. Sets `aria-busy`.
52
+ * @default false
53
+ */
54
+ isLoading?: boolean;
55
+ /** DOM id on the root. */
56
+ id?: string;
57
+ /** Any `data-*` attribute, forwarded to the root. */
58
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
59
+ /** Extra class on the root. */
60
+ className?: string;
61
+ /** Inline style on the root; only for setting CSS custom properties. */
62
+ style?: CSSProperties;
63
+ }
64
+ /** A KPI tile: label, headline value, optional description, suffix mark and trailing trend. */
65
+ declare const BigNumber: import("react").ForwardRefExoticComponent<BigNumberProps & import("react").RefAttributes<HTMLElement>>;
66
+ export default BigNumber;
@@ -5,41 +5,64 @@ import Flex, { AlignItems, FlexDirection } from "../layout/Flex.js";
5
5
  import Box, { BoxVariant } from "../layout/Box.js";
6
6
  import FlexItem from "../layout/FlexItem.js";
7
7
  /* empty css */
8
- import { forwardRef } from "react";
8
+ import { createContext, forwardRef, useContext } from "react";
9
9
  import { jsx, jsxs } from "react/jsx-runtime";
10
10
  import { cx } from "@linaria/core";
11
- //#region src/charts/StatChart.tsx
11
+ //#region src/charts/BigNumber.tsx
12
12
  /**
13
- * StatChart is the KPI tile: one number with its label, on a quiet surface, sized so a row of them
13
+ * BigNumber is the KPI tile: one number with its label, on a quiet surface, sized so a row of them
14
14
  * lines up. A `label` ("Active users"), a `value` ("1,284"), an optional `description` under the
15
- * value ("+4% vs last week") and an optional `trailing` slot at the end of the value row for a
15
+ * value ("+4% vs last week"), an optional `suffix` pinned 8px after the number (a status `Square`,
16
+ * a small `Icon`, a unit) and an optional `trailing` slot at the far end of the value row for a
16
17
  * `Sparkline` or a `Chip`. The tile is a `Box`: `variant` picks its surface step and `hasBorder`
17
18
  * adds the hairline. `isLoading` swaps the value for a `Skeleton` line of the same height.
18
19
  *
20
+ * Inside a `BigNumberGroup` the tile takes its slot's defaults through `BigNumberGroupContext`: in
21
+ * the primary slot no fill and no border (the frame's own surface), in the strip a hairline. An
22
+ * explicit `hasBorder` always wins.
23
+ *
19
24
  * It draws no chart itself and imports no chart code (no d3). It is not a card with a header and
20
- * actions (`Widget`) and not a list of label/value pairs (`DescriptionList`).
25
+ * actions (`Widget`) and not a list of label/value pairs (`DescriptionList`). Renamed from 1.x
26
+ * `StatChart`.
21
27
  */
22
28
  /** Tile fill (Constitution V surface set: containers). */
23
- var StatChartVariant = /* @__PURE__ */ function(StatChartVariant) {
29
+ var BigNumberVariant = /* @__PURE__ */ function(BigNumberVariant) {
24
30
  /** The canvas fill, `background.base`. */
25
- StatChartVariant["BASE"] = "BASE";
31
+ BigNumberVariant["BASE"] = "BASE";
26
32
  /** A panel fill, `background.primary`. The default (1.x). */
27
- StatChartVariant["PRIMARY"] = "PRIMARY";
33
+ BigNumberVariant["PRIMARY"] = "PRIMARY";
28
34
  /** A raised fill, `background.secondary`. */
29
- StatChartVariant["SECONDARY"] = "SECONDARY";
35
+ BigNumberVariant["SECONDARY"] = "SECONDARY";
30
36
  /** The most elevated fill, `background.tertiary`. */
31
- StatChartVariant["TERTIARY"] = "TERTIARY";
32
- return StatChartVariant;
37
+ BigNumberVariant["TERTIARY"] = "TERTIARY";
38
+ return BigNumberVariant;
39
+ }({});
40
+ /**
41
+ * Which slot of a `BigNumberGroup` a tile sits in.
42
+ * @internal
43
+ */
44
+ var BigNumberGroupSlot = /* @__PURE__ */ function(BigNumberGroupSlot) {
45
+ /** The lead tiles on the left, on the frame's own surface: no fill, no border. */
46
+ BigNumberGroupSlot["PRIMARY"] = "PRIMARY";
47
+ /** The scrolling strip on the right: bordered by default, the tile's own fill. */
48
+ BigNumberGroupSlot["SECONDARY"] = "SECONDARY";
49
+ return BigNumberGroupSlot;
33
50
  }({});
51
+ /**
52
+ * The slot a tile renders in; `null` outside a `BigNumberGroup`. Set by `BigNumberGroup` around
53
+ * each of its two slots.
54
+ * @internal
55
+ */
56
+ var BigNumberGroupContext = createContext(null);
34
57
  /** Identity by member name: `Box` owns the fill and the hairline. */
35
- var STAT_CHART_VARIANT_TO_BOX_VARIANT_MAP = {
58
+ var BIG_NUMBER_VARIANT_TO_BOX_VARIANT_MAP = {
36
59
  ["BASE"]: BoxVariant.BASE,
37
60
  ["PRIMARY"]: BoxVariant.PRIMARY,
38
61
  ["SECONDARY"]: BoxVariant.SECONDARY,
39
62
  ["TERTIARY"]: BoxVariant.TERTIARY
40
63
  };
41
64
  /** Tiles in a `Flex` row keep their width; in a `Grid` they stretch to the track (1.x). */
42
- var ROOT_CSS = "gx-StatChart-ROOT_CSS-rlaxlp8";
65
+ var ROOT_CSS = "gx-BigNumber-ROOT_CSS-r1lifffw";
43
66
  /** A string or number as the headline figure; a node as given. */
44
67
  function renderValue(value) {
45
68
  if (typeof value === "string" || typeof value === "number") return /* @__PURE__ */ jsx(Text, {
@@ -51,15 +74,17 @@ function renderValue(value) {
51
74
  });
52
75
  return value;
53
76
  }
54
- /** A KPI tile: label, headline value, optional description and trailing trend. */
55
- var StatChart = forwardRef(function StatChart({ label, value, description, trailing, variant = "PRIMARY", hasBorder = false, isLoading = false, id, className, style, ...rest }, ref) {
77
+ /** A KPI tile: label, headline value, optional description, suffix mark and trailing trend. */
78
+ var BigNumber = forwardRef(function BigNumber({ label, value, description, suffix, trailing, variant = "PRIMARY", hasBorder, isLoading = false, id, className, style, ...rest }, ref) {
79
+ const slot = useContext(BigNumberGroupContext);
80
+ const isPrimarySlot = slot === "PRIMARY";
56
81
  return /* @__PURE__ */ jsx(Box, {
57
82
  ...rest,
58
83
  ...isLoading ? { "aria-busy": true } : {},
59
84
  ref,
60
85
  ...id === void 0 ? {} : { id },
61
- variant: STAT_CHART_VARIANT_TO_BOX_VARIANT_MAP[variant],
62
- hasBorder,
86
+ ...isPrimarySlot ? {} : { variant: BIG_NUMBER_VARIANT_TO_BOX_VARIANT_MAP[variant] },
87
+ hasBorder: hasBorder ?? slot === "SECONDARY",
63
88
  radius: Radius.LG,
64
89
  padding: [12, 16],
65
90
  minWidth: 140,
@@ -88,7 +113,19 @@ var StatChart = forwardRef(function StatChart({ label, value, description, trail
88
113
  children: [/* @__PURE__ */ jsx(FlexItem, {
89
114
  grow: 1,
90
115
  minWidth: 0,
91
- children: renderValue(value)
116
+ children: suffix === void 0 || suffix === null || suffix === false ? renderValue(value) : /* @__PURE__ */ jsxs(Flex, {
117
+ alignItems: AlignItems.CENTER,
118
+ gap: 8,
119
+ minWidth: 0,
120
+ children: [/* @__PURE__ */ jsx(FlexItem, {
121
+ minWidth: 0,
122
+ children: renderValue(value)
123
+ }), /* @__PURE__ */ jsx(Flex, {
124
+ alignItems: AlignItems.CENTER,
125
+ shrink: 0,
126
+ children: suffix
127
+ })]
128
+ })
92
129
  }), trailing]
93
130
  }), description ? /* @__PURE__ */ jsx(Text, {
94
131
  size: TextSize.BODY_SM,
@@ -100,6 +137,6 @@ var StatChart = forwardRef(function StatChart({ label, value, description, trail
100
137
  })
101
138
  });
102
139
  });
103
- StatChart.displayName = "StatChart";
140
+ BigNumber.displayName = "BigNumber";
104
141
  //#endregion
105
- export { StatChartVariant, StatChart as default };
142
+ export { BigNumberGroupContext, BigNumberGroupSlot, BigNumberVariant, BigNumber as default };
@@ -0,0 +1,51 @@
1
+ import { type AriaAttributes, type CSSProperties, type ReactNode } from "react";
2
+ /** Frame fill (surface set: containers). Leave `variant` unset for no fill. */
3
+ export declare enum BigNumberGroupVariant {
4
+ /** The canvas fill, `background.base`. */
5
+ BASE = "BASE",
6
+ /** A panel fill, `background.primary`. */
7
+ PRIMARY = "PRIMARY",
8
+ /** A raised fill, `background.secondary`. */
9
+ SECONDARY = "SECONDARY",
10
+ /** The most elevated fill, `background.tertiary`. */
11
+ TERTIARY = "TERTIARY"
12
+ }
13
+ export interface BigNumberGroupProps extends AriaAttributes {
14
+ /** The strip's `BigNumber` tiles, right of `primary`. Bordered by default; each keeps its own `variant`. */
15
+ children?: ReactNode;
16
+ /** One or more lead `BigNumber` tiles on the left, on the frame's own surface with no fill and no border. */
17
+ primary?: ReactNode;
18
+ /**
19
+ * Surface fill of the frame. Unset draws no fill: the parent shows through.
20
+ * @default undefined (no fill)
21
+ */
22
+ variant?: BigNumberGroupVariant;
23
+ /**
24
+ * Adds the 1px hairline around the frame. Leave it off inside an already-bordered container (a `Widget`).
25
+ * @default false
26
+ */
27
+ hasBorder?: boolean;
28
+ /**
29
+ * Span the parent's width; the primary tiles take the spare width and the strip sits at the far end. Off: the frame hugs its tiles.
30
+ * @default false
31
+ */
32
+ fillWidth?: boolean;
33
+ /**
34
+ * Fade the strip toward each edge that has more tiles beyond it.
35
+ * @default false
36
+ */
37
+ hasFadeEdges?: boolean;
38
+ /** Names the scrolling strip (`role="region"`), announced when it takes focus. */
39
+ ariaLabel?: string;
40
+ /** DOM id on the root. */
41
+ id?: string;
42
+ /** Any `data-*` attribute, forwarded to the root. */
43
+ [dataAttribute: `data-${string}`]: string | number | boolean | undefined;
44
+ /** Extra class on the root. */
45
+ className?: string;
46
+ /** Inline style on the root; only for setting CSS custom properties. */
47
+ style?: CSSProperties;
48
+ }
49
+ /** A row of KPI tiles: lead tiles on the left, a sideways-scrolling strip of the rest on the right. */
50
+ declare const BigNumberGroup: import("react").ForwardRefExoticComponent<BigNumberGroupProps & import("react").RefAttributes<HTMLElement>>;
51
+ export default BigNumberGroup;
@@ -0,0 +1,112 @@
1
+ import { Radius } from "../theme/enums.js";
2
+ import Flex, { AlignItems } from "../layout/Flex.js";
3
+ import Box, { BoxVariant } from "../layout/Box.js";
4
+ import ScrollArea from "../layout/ScrollArea.js";
5
+ import FlexItem from "../layout/FlexItem.js";
6
+ import { BigNumberGroupContext, BigNumberGroupSlot } from "./BigNumber.js";
7
+ /* empty css */
8
+ import { forwardRef } from "react";
9
+ import { jsx, jsxs } from "react/jsx-runtime";
10
+ import { cx } from "@linaria/core";
11
+ //#region src/charts/BigNumberGroup.tsx
12
+ /**
13
+ * BigNumberGroup is a row of `BigNumber` tiles in one frame: the lead figure on the left and the
14
+ * breakdown in a strip on the right that scrolls sideways when the row is wider than its parent
15
+ * (the Filament observability summary). `primary` holds one or more tiles on the frame's own
16
+ * surface, borderless; `children` are the strip's tiles, bordered by default and filled with
17
+ * whatever `variant` each was given (`TERTIARY` reads raised). The slots set those defaults through
18
+ * `BigNumberGroupContext`; an explicit `hasBorder` on a tile always wins.
19
+ *
20
+ * The frame is a `Box` (radius `lg`, overflow hidden): `variant` picks its surface step and
21
+ * `hasBorder` adds the hairline. It hugs its tiles by default, so the strip only scrolls when the
22
+ * parent is narrower than the row; `fillWidth` spans the parent and gives the spare width to the
23
+ * primary tiles, pushing the strip to the far end. `hasFadeEdges` fades the strip toward each edge
24
+ * with more tiles beyond it. An overflowing strip is a tab stop (arrow keys scroll it); a strip
25
+ * that fits is not.
26
+ *
27
+ * Not a grid of equal cards (`Grid` of bordered `BigNumber`s), not a card with a header (`Widget`).
28
+ */
29
+ /** Frame fill (surface set: containers). Leave `variant` unset for no fill. */
30
+ var BigNumberGroupVariant = /* @__PURE__ */ function(BigNumberGroupVariant) {
31
+ /** The canvas fill, `background.base`. */
32
+ BigNumberGroupVariant["BASE"] = "BASE";
33
+ /** A panel fill, `background.primary`. */
34
+ BigNumberGroupVariant["PRIMARY"] = "PRIMARY";
35
+ /** A raised fill, `background.secondary`. */
36
+ BigNumberGroupVariant["SECONDARY"] = "SECONDARY";
37
+ /** The most elevated fill, `background.tertiary`. */
38
+ BigNumberGroupVariant["TERTIARY"] = "TERTIARY";
39
+ return BigNumberGroupVariant;
40
+ }({});
41
+ /** Identity by member name: `Box` owns the fill and the hairline. */
42
+ var BIG_NUMBER_GROUP_VARIANT_TO_BOX_VARIANT_MAP = {
43
+ ["BASE"]: BoxVariant.BASE,
44
+ ["PRIMARY"]: BoxVariant.PRIMARY,
45
+ ["SECONDARY"]: BoxVariant.SECONDARY,
46
+ ["TERTIARY"]: BoxVariant.TERTIARY
47
+ };
48
+ /** Hugging: as wide as the tiles, never wider than the parent (then the strip scrolls). */
49
+ var HUG_CSS = "gx-BigNumberGroup-HUG_CSS-h10zwtj7";
50
+ /** A row of KPI tiles: lead tiles on the left, a sideways-scrolling strip of the rest on the right. */
51
+ var BigNumberGroup = forwardRef(function BigNumberGroup({ children, primary, variant, hasBorder = false, fillWidth = false, hasFadeEdges = false, ariaLabel, id, className, style, ...rest }, ref) {
52
+ const hasPrimary = primary !== void 0 && primary !== null && primary !== false;
53
+ return /* @__PURE__ */ jsx(Box, {
54
+ ...rest,
55
+ ref,
56
+ ...id === void 0 ? {} : { id },
57
+ ...variant === void 0 ? {} : { variant: BIG_NUMBER_GROUP_VARIANT_TO_BOX_VARIANT_MAP[variant] },
58
+ hasBorder,
59
+ radius: Radius.LG,
60
+ overflow: "hidden",
61
+ fillWidth,
62
+ className: cx(!fillWidth && HUG_CSS, className),
63
+ ...style === void 0 ? {} : { style },
64
+ children: /* @__PURE__ */ jsxs(Flex, {
65
+ alignItems: AlignItems.CENTER,
66
+ gap: 16,
67
+ padding: [
68
+ 0,
69
+ 0,
70
+ 0,
71
+ 12
72
+ ],
73
+ children: [hasPrimary ? /* @__PURE__ */ jsx(FlexItem, {
74
+ grow: 1,
75
+ shrink: 0,
76
+ children: /* @__PURE__ */ jsx(Flex, {
77
+ gap: 12,
78
+ padding: [12, 0],
79
+ children: /* @__PURE__ */ jsx(BigNumberGroupContext.Provider, {
80
+ value: BigNumberGroupSlot.PRIMARY,
81
+ children: primary
82
+ })
83
+ })
84
+ }) : null, /* @__PURE__ */ jsx(FlexItem, {
85
+ grow: 0,
86
+ shrink: 1,
87
+ minWidth: 0,
88
+ children: /* @__PURE__ */ jsx(ScrollArea, {
89
+ canScrollHorizontally: true,
90
+ hasFadeEdges,
91
+ ...ariaLabel === void 0 ? {} : { ariaLabel },
92
+ children: /* @__PURE__ */ jsx(Flex, {
93
+ gap: 12,
94
+ padding: [
95
+ 12,
96
+ 12,
97
+ 12,
98
+ 0
99
+ ],
100
+ children: /* @__PURE__ */ jsx(BigNumberGroupContext.Provider, {
101
+ value: BigNumberGroupSlot.SECONDARY,
102
+ children
103
+ })
104
+ })
105
+ })
106
+ })]
107
+ })
108
+ });
109
+ });
110
+ BigNumberGroup.displayName = "BigNumberGroup";
111
+ //#endregion
112
+ export { BigNumberGroupVariant, BigNumberGroup as default };
@@ -12,7 +12,7 @@ import { cx } from "@linaria/core";
12
12
  */
13
13
  /** @internal The category hit layer. */
14
14
  function ChartCategoryTargets({ targets, onEnter, onLeave, onSelect }) {
15
- const className = cx(CHART_HIT_TARGET_CSS, onSelect && "gx-ChartPrimitives-CHART_HIT_TARGET_CLICKABLE_CSS-cjirv6a");
15
+ const className = cx(CHART_HIT_TARGET_CSS, onSelect && "gx-ChartPrimitives-CHART_HIT_TARGET_CLICKABLE_CSS-c1armna5");
16
16
  return /* @__PURE__ */ jsx(Fragment, { children: targets.map((target, index) => {
17
17
  const handlers = {
18
18
  onMouseEnter: () => onEnter(index),
@@ -1,4 +1,3 @@
1
- import Skeleton, { SkeletonVariant } from "../feedback/Skeleton.js";
2
1
  import { ChartKind, ChartLegendPlacement } from "./types.js";
3
2
  import { CHART_LEGEND_FILTER_EXTENT, CHART_LEGEND_SIDE_GAP } from "./constants.js";
4
3
  import Chip, { ChipSize } from "../chips/Chip.js";
@@ -18,8 +17,9 @@ import { FunnelSimpleIcon } from "@phosphor-icons/react";
18
17
  /**
19
18
  * @internal The shell every chart renders into: the root (sizing, legend placement, passthrough),
20
19
  * the measured plot box (one tab stop when interactive), the SVG and its inset translate, axes,
21
- * marks, hit targets, the in-chart tooltip, the empty and loading overlays, the live region and
22
- * the legend. On a filterable chart dismissible filter chips follow the legend entries while
20
+ * marks, hit targets, the in-chart tooltip, the empty overlay, the loading pulse (the whole plot
21
+ * fades in and out while the legend holds, so a loading chart still reads as a chart), the live
22
+ * region and the legend. On a filterable chart dismissible filter chips follow the legend entries while
23
23
  * something is pinned. One pin shows a chip per part ("06:00" and "Failed" for one segment): a
24
24
  * chip's × drops that part and keeps the other. Several pins collapse into one "3 filters" chip
25
25
  * (the list in its tooltip) whose × clears them all. It knows nothing about scales or geometry: axes and marks arrive as nodes, and every
@@ -58,8 +58,12 @@ var Overlay = /*#__PURE__*/ styled("div")({
58
58
  class: "gx-ChartFrame-Overlay-o1itt7vl",
59
59
  propsAsIs: false
60
60
  });
61
- /** A standalone `Skeleton RECT` that takes the whole plot box. */
62
- var LOADING_SKELETON_CSS = "gx-ChartFrame-LOADING_SKELETON_CSS-l1oi7u1q";
61
+ /**
62
+ * The loading pulse on the plot box: axes, marks and the plot overlay fade together, 1 → 0.25 → 1
63
+ * on the Skeleton's 2.4s curve, while the legend holds. Under `REDUCED_MOTION` the plot rests at
64
+ * half strength instead. The keyframes are global, so the name is `gx-` prefixed.
65
+ */
66
+ var PLOT_LOADING_CSS = "gx-ChartFrame-PLOT_LOADING_CSS-p1oi7u1q";
63
67
  /**
64
68
  * A chart's own legend (Heatmap's steps) with the filter chip after it. Both carry the legend's 12px
65
69
  * top padding and center on each other, so the chip centers on the legend's text line.
@@ -209,7 +213,6 @@ function ChartFrame({ rootRef, plotRef, id, className, style, rest, dimensions,
209
213
  role: "img",
210
214
  "aria-label": resolvedAriaLabel
211
215
  };
212
- const isSkeleton = isLoading && isEmpty;
213
216
  const isSideLegend = legendPlacement === ChartLegendPlacement.RIGHT;
214
217
  const categoryLabel = (key) => formatCategoryKey?.(key) ?? key;
215
218
  const seriesLabel = (key) => legendItems.find((item) => item.key === key)?.label ?? key;
@@ -244,7 +247,7 @@ function ChartFrame({ rootRef, plotRef, id, className, style, rest, dimensions,
244
247
  tooltip: part.key === "all" ? interaction.selection.map(describePin).join(", ") : "",
245
248
  onDismiss: () => handleFilterDismiss(part.rest)
246
249
  }, part.key));
247
- const legendNode = !hasLegend || isSkeleton ? null : legend ?? /* @__PURE__ */ jsx(ChartLegend, {
250
+ const legendNode = !hasLegend ? null : legend ?? /* @__PURE__ */ jsx(ChartLegend, {
248
251
  items: legendItems,
249
252
  placement: legendPlacement,
250
253
  swatch,
@@ -275,9 +278,9 @@ function ChartFrame({ rootRef, plotRef, id, className, style, rest, dimensions,
275
278
  ...plotAriaRest,
276
279
  ...plotA11yProps,
277
280
  ref: plotRef,
278
- className: cx(isInteractive && PLOT_INTERACTIVE_CSS, plotClassName),
281
+ className: cx(isInteractive && PLOT_INTERACTIVE_CSS, isLoading && PLOT_LOADING_CSS, plotClassName),
279
282
  children: [
280
- isMeasured && !isSkeleton && /* @__PURE__ */ jsx(ChartSvg, {
283
+ isMeasured && /* @__PURE__ */ jsx(ChartSvg, {
281
284
  "aria-hidden": "true",
282
285
  width,
283
286
  height,
@@ -303,17 +306,13 @@ function ChartFrame({ rootRef, plotRef, id, className, style, rest, dimensions,
303
306
  ]
304
307
  })
305
308
  }),
306
- isMeasured && !isSkeleton && plotOverlay,
309
+ isMeasured && plotOverlay,
307
310
  isMeasured && isEmpty && !isLoading && /* @__PURE__ */ jsx(Overlay, { children: /* @__PURE__ */ jsx(EmptyState, {
308
311
  size: EmptyStateSize.SMALL,
309
312
  header: placeholder,
310
313
  role: "status"
311
314
  }) }),
312
- isSkeleton && /* @__PURE__ */ jsx(Skeleton, {
313
- variant: SkeletonVariant.RECT,
314
- className: LOADING_SKELETON_CSS
315
- }),
316
- isMeasured && hasTooltip && !isSkeleton && /* @__PURE__ */ jsx(ChartTooltip, {
315
+ isMeasured && hasTooltip && /* @__PURE__ */ jsx(ChartTooltip, {
317
316
  model: tooltipModel,
318
317
  containerWidth: width,
319
318
  containerHeight: height,
@@ -13,6 +13,11 @@ export declare const CHART_AREA_STACKED_CSS: import("@linaria/core").LinariaClas
13
13
  export declare const CHART_BAR_CSS: import("@linaria/core").LinariaClassName;
14
14
  /** @internal A pie arc. */
15
15
  export declare const CHART_ARC_CSS: import("@linaria/core").LinariaClassName;
16
+ /**
17
+ * @internal The track a loading pie with no slices draws at its radii: the grid hairline bent into
18
+ * a ring, so the pulse has the shape of the chart it is about to be.
19
+ */
20
+ export declare const CHART_PIE_TRACK_CSS: import("@linaria/core").LinariaClassName;
16
21
  /** @internal A point dot, haloed by the canvas so it reads over the line. */
17
22
  export declare const CHART_POINT_CSS: import("@linaria/core").LinariaClassName;
18
23
  /** @internal A filled heatmap cell: its ramp step arrives as `--gx-chart-mark-color`. */