@actioneer/ads 0.5.8 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/components/assistant-ui/composer-harness.js +12 -10
  2. package/components/avatar.d.ts +1 -0
  3. package/components/avatar.js +5 -4
  4. package/components/breadcrumbs.d.ts +3 -1
  5. package/components/breadcrumbs.js +62 -56
  6. package/components/button.js +11 -11
  7. package/components/card.js +19 -18
  8. package/components/chart.d.ts +6 -0
  9. package/components/chart.js +747 -657
  10. package/components/date-range-picker.d.ts +25 -0
  11. package/components/date-range-picker.js +187 -0
  12. package/components/drawer.d.ts +3 -1
  13. package/components/drawer.js +115 -95
  14. package/components/index.d.ts +1 -0
  15. package/components/index.js +499 -497
  16. package/components/modal.d.ts +5 -1
  17. package/components/modal.js +74 -61
  18. package/components/panel.js +31 -28
  19. package/components/pixel-icon.d.ts +4 -0
  20. package/components/pixel-icon.js +210 -163
  21. package/components/segmented.d.ts +1 -0
  22. package/components/segmented.js +31 -28
  23. package/components/select.d.ts +5 -0
  24. package/components/select.js +177 -132
  25. package/components/table.d.ts +7 -0
  26. package/components/table.js +183 -173
  27. package/components/tabs.js +1 -1
  28. package/components/tree.js +86 -58
  29. package/components/viz-charts.js +186 -183
  30. package/demo/components/add-to-artifact.js +131 -107
  31. package/demo/lib/artifact-library.js +37 -29
  32. package/demo/lib/artifact-pin-guard.js +12 -0
  33. package/fonts.css +2 -0
  34. package/lib/icons.d.ts +20 -0
  35. package/lib/icons.js +112 -107
  36. package/llms.txt +23 -3
  37. package/manifest.json +13774 -14
  38. package/package.json +4 -1
  39. package/styles.css +76 -60
  40. package/theme.css +70 -57
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  var c = Object.defineProperty;
3
3
  var l = (r, t, o) => t in r ? c(r, t, { enumerable: !0, configurable: !0, writable: !0, value: o }) : r[t] = o;
4
- var p = (r, t, o) => l(r, typeof t != "symbol" ? t + "" : t, o);
5
- import { jsxs as n, jsx as e } from "react/jsx-runtime";
4
+ var n = (r, t, o) => l(r, typeof t != "symbol" ? t + "" : t, o);
5
+ import { jsxs as p, jsx as e } from "react/jsx-runtime";
6
6
  import { useComposerRuntime as d, useComposer as u } from "@assistant-ui/react";
7
7
  import "clsx";
8
8
  import "tailwind-merge";
@@ -35,6 +35,8 @@ import "../radio.js";
35
35
  import "../switch.js";
36
36
  import "../number-field.js";
37
37
  import "../select.js";
38
+ import "@internationalized/date";
39
+ import "react-aria-components";
38
40
  import "../autocomplete.js";
39
41
  import "../slider.js";
40
42
  import "../segmented.js";
@@ -129,7 +131,7 @@ const m = "application/x-actioneer-harness", S = [
129
131
  instructions: "Write a concise executive brief: lead with the decision or insight, use only decision-relevant evidence, and end with the recommended next action."
130
132
  }
131
133
  ];
132
- function Ai() {
134
+ function Di() {
133
135
  const r = d(), t = u((i) => i.attachments), o = new Set(
134
136
  t.filter((i) => i.contentType === m).map((i) => i.name)
135
137
  ), s = (i) => {
@@ -137,8 +139,8 @@ function Ai() {
137
139
  new File([i.instructions], `${i.label}.harness`, { type: m })
138
140
  );
139
141
  };
140
- return /* @__PURE__ */ n(b, { children: [
141
- /* @__PURE__ */ e(v, { children: /* @__PURE__ */ n(
142
+ return /* @__PURE__ */ p(b, { children: [
143
+ /* @__PURE__ */ e(v, { children: /* @__PURE__ */ p(
142
144
  "button",
143
145
  {
144
146
  type: "button",
@@ -157,7 +159,7 @@ function Ai() {
157
159
  ]
158
160
  }
159
161
  ) }),
160
- /* @__PURE__ */ n(y, { side: "top", align: "start", className: "w-56", autoFocusFirstItem: !1, children: [
162
+ /* @__PURE__ */ p(y, { side: "top", align: "start", className: "w-56", autoFocusFirstItem: !1, children: [
161
163
  /* @__PURE__ */ e(x, { children: "Add a harness" }),
162
164
  S.map((i) => /* @__PURE__ */ e(
163
165
  w,
@@ -172,9 +174,9 @@ function Ai() {
172
174
  ] })
173
175
  ] });
174
176
  }
175
- class Ci {
177
+ class Ei {
176
178
  constructor() {
177
- p(this, "accept", m);
179
+ n(this, "accept", m);
178
180
  }
179
181
  async add(t) {
180
182
  return {
@@ -205,7 +207,7 @@ ${o}
205
207
  }
206
208
  }
207
209
  export {
208
- Ai as ComposerHarness,
210
+ Di as ComposerHarness,
209
211
  m as HARNESS_MIME,
210
- Ci as HarnessAttachmentAdapter
212
+ Ei as HarnessAttachmentAdapter
211
213
  };
@@ -1,5 +1,6 @@
1
1
  import * as React from "react";
2
2
  declare const sizeClasses: {
3
+ readonly xs: "size-5 text-[10px]";
3
4
  readonly sm: "size-8 text-xs";
4
5
  readonly md: "size-10 text-xs";
5
6
  readonly lg: "size-12 text-base";
@@ -1,8 +1,9 @@
1
1
  "use client";
2
- import { jsx as n, jsxs as x } from "react/jsx-runtime";
2
+ import { jsx as n, jsxs as b } from "react/jsx-runtime";
3
3
  import * as f from "react";
4
4
  import { cn as i } from "../lib/cn.js";
5
5
  const g = {
6
+ xs: "size-5 text-[10px]",
6
7
  sm: "size-8 text-xs",
7
8
  md: "size-10 text-xs",
8
9
  lg: "size-12 text-base",
@@ -62,21 +63,21 @@ N.displayName = "Avatar";
62
63
  const y = f.forwardRef(
63
64
  ({ className: r, max: e, size: t = "md", radius: s = "full", children: o, ...a }, c) => {
64
65
  const l = f.Children.toArray(o), d = typeof e == "number" ? l.length - e : 0, p = typeof e == "number" ? l.slice(0, e) : l;
65
- return /* @__PURE__ */ x(
66
+ return /* @__PURE__ */ b(
66
67
  "div",
67
68
  {
68
69
  ref: c,
69
70
  className: i("flex items-center", r),
70
71
  ...a,
71
72
  children: [
72
- p.map((b, u) => /* @__PURE__ */ n(
73
+ p.map((x, u) => /* @__PURE__ */ n(
73
74
  "div",
74
75
  {
75
76
  className: i(
76
77
  "ring-2 ring-background rounded-full",
77
78
  u > 0 && "-ml-2"
78
79
  ),
79
- children: b
80
+ children: x
80
81
  },
81
82
  u
82
83
  )),
@@ -18,9 +18,11 @@ export interface BreadcrumbsProps extends React.HTMLAttributes<HTMLElement> {
18
18
  * overflow menu) — they ride along when the trail is sticky.
19
19
  */
20
20
  actions?: React.ReactNode;
21
+ /** Controls pinned to the true horizontal center of the trail row. */
22
+ center?: React.ReactNode;
21
23
  /**
22
24
  * Supporting metadata stitched inline right after the trail (schema name,
23
- * sync status…). Muted, truncates before the trail does.
25
+ * sync status…). Kept visible while the current trail item truncates first.
24
26
  */
25
27
  meta?: React.ReactNode;
26
28
  }
@@ -1,13 +1,13 @@
1
1
  "use client";
2
- import { jsxs as v, jsx as e, Fragment as k } from "react/jsx-runtime";
2
+ import { jsxs as g, jsx as e, Fragment as B } from "react/jsx-runtime";
3
3
  import * as t from "react";
4
- import { ArrowLeft as B } from "../lib/icons.js";
5
- import { cn as a } from "../lib/cn.js";
6
- const N = t.createContext({
4
+ import { ArrowLeft as y } from "../lib/icons.js";
5
+ import { cn as c } from "../lib/cn.js";
6
+ const w = t.createContext({
7
7
  count: 0
8
- }), w = t.createContext(0);
9
- function R(s) {
10
- let n = (s == null ? void 0 : s.parentElement) ?? null;
8
+ }), k = t.createContext(0);
9
+ function R(o) {
10
+ let n = (o == null ? void 0 : o.parentElement) ?? null;
11
11
  for (; n; ) {
12
12
  const r = getComputedStyle(n).overflowY;
13
13
  if (r === "auto" || r === "scroll") return n;
@@ -15,35 +15,36 @@ function R(s) {
15
15
  }
16
16
  return null;
17
17
  }
18
- const y = t.forwardRef(
18
+ const z = t.forwardRef(
19
19
  ({
20
- className: s,
20
+ className: o,
21
21
  children: n,
22
22
  sticky: r,
23
- onBack: c,
24
- backLabel: g = "Back",
25
- actions: m,
26
- meta: f,
27
- ...p
28
- }, i) => {
29
- const b = t.Children.toArray(n), l = t.useRef(null), u = t.useCallback(
30
- (o) => {
31
- l.current = o, typeof i == "function" ? i(o) : i && (i.current = o);
23
+ onBack: u,
24
+ backLabel: d = "Back",
25
+ actions: f,
26
+ center: b,
27
+ meta: x,
28
+ ...v
29
+ }, a) => {
30
+ const l = t.Children.toArray(n), i = t.useRef(null), h = t.useCallback(
31
+ (s) => {
32
+ i.current = s, typeof a == "function" ? a(s) : a && (a.current = s);
32
33
  },
33
- [i]
34
- ), [x, C] = t.useState(!1);
34
+ [a]
35
+ ), [N, C] = t.useState(!1);
35
36
  return t.useEffect(() => {
36
37
  if (!r) return;
37
- const o = R(l.current), d = o ?? window, h = () => C((o ? o.scrollTop : window.scrollY) > 2);
38
- return h(), d.addEventListener("scroll", h, { passive: !0 }), () => d.removeEventListener("scroll", h);
39
- }, [r]), /* @__PURE__ */ v(
38
+ const s = R(i.current), m = s ?? window, p = () => C((s ? s.scrollTop : window.scrollY) > 2);
39
+ return p(), m.addEventListener("scroll", p, { passive: !0 }), () => m.removeEventListener("scroll", p);
40
+ }, [r]), /* @__PURE__ */ g(
40
41
  "nav",
41
42
  {
42
- ref: u,
43
+ ref: h,
43
44
  "aria-label": "Breadcrumb",
44
- "data-stuck": r ? x ? "true" : "false" : void 0,
45
- className: a(
46
- "flex w-full items-center",
45
+ "data-stuck": r ? N ? "true" : "false" : void 0,
46
+ className: c(
47
+ "relative flex w-full items-center",
47
48
  r && "sticky top-0 z-40 bg-background transition-[border-color] duration-150 ease-out motion-reduce:transition-none",
48
49
  // Sticky offsets resolve against the scrollport's PADDING box, so in
49
50
  // a padded panel the pinned trail sits below a strip the content
@@ -51,66 +52,71 @@ const y = t.forwardRef(
51
52
  // background over that gap (a no-op at rest, where the strip is the
52
53
  // panel's empty padding).
53
54
  r && "before:absolute before:inset-x-0 before:-top-8 before:h-8 before:bg-inherit before:content-['']",
54
- r && (x ? "border-b border-border" : "border-b border-transparent"),
55
- s
55
+ r && (N ? "border-b border-border" : "border-b border-transparent"),
56
+ o
56
57
  ),
57
- ...p,
58
+ ...v,
58
59
  children: [
59
- c && /* @__PURE__ */ e(
60
+ u && /* @__PURE__ */ e(
60
61
  "button",
61
62
  {
62
63
  type: "button",
63
- onClick: c,
64
- "aria-label": g,
65
- className: a(
64
+ onClick: u,
65
+ "aria-label": d,
66
+ className: c(
66
67
  "mr-1 inline-flex size-6 shrink-0 items-center justify-center rounded-sm text-muted-foreground",
67
68
  "transition-colors hover:bg-fill hover:text-foreground",
68
69
  "outline-none focus-visible:ring-3 focus-visible:ring-ring [&_svg]:size-4"
69
70
  ),
70
- children: /* @__PURE__ */ e(B, { "aria-hidden": !0 })
71
+ children: /* @__PURE__ */ e(y, { "aria-hidden": !0 })
71
72
  }
72
73
  ),
73
- /* @__PURE__ */ e("ol", { className: "flex min-w-0 items-center gap-1.5 text-base", children: /* @__PURE__ */ e(N.Provider, { value: { count: b.length }, children: b.map((o, d) => /* @__PURE__ */ e(w.Provider, { value: d, children: o }, d)) }) }),
74
- f && /* @__PURE__ */ e("div", { className: "ml-4 flex min-w-0 shrink items-center gap-3 text-xs text-muted-foreground", children: f }),
75
- m && /* @__PURE__ */ e("div", { className: "ml-auto flex shrink-0 items-center gap-2 pl-4", children: m })
74
+ /* @__PURE__ */ e("ol", { className: "flex min-w-0 shrink items-center gap-1.5 text-base", children: /* @__PURE__ */ e(w.Provider, { value: { count: l.length }, children: l.map((s, m) => /* @__PURE__ */ e(k.Provider, { value: m, children: s }, m)) }) }),
75
+ x && /* @__PURE__ */ e("div", { className: "ml-4 flex shrink-0 items-center gap-3 text-xs text-muted-foreground", children: x }),
76
+ b && /* @__PURE__ */ e("div", { className: "absolute left-1/2 top-1/2 z-50 flex -translate-x-1/2 -translate-y-1/2 items-center", children: b }),
77
+ f && /* @__PURE__ */ e("div", { className: "ml-auto flex shrink-0 items-center gap-2 pl-4", children: f })
76
78
  ]
77
79
  }
78
80
  );
79
81
  }
80
82
  );
81
- y.displayName = "Breadcrumbs";
82
- const E = t.forwardRef(({ className: s, href: n, isCurrent: r, icon: c, children: g, ...m }, f) => {
83
- const { count: p } = t.useContext(N), b = t.useContext(w) === p - 1, l = "inline-flex items-center gap-1.5", u = /* @__PURE__ */ v(k, { children: [
84
- c && /* @__PURE__ */ e("span", { "aria-hidden": !0, className: "flex shrink-0 items-center [&_svg]:size-4", children: c }),
85
- g
86
- ] }), x = r ? /* @__PURE__ */ e(
83
+ z.displayName = "Breadcrumbs";
84
+ const E = t.forwardRef(({ className: o, href: n, isCurrent: r, icon: u, children: d, ...f }, b) => {
85
+ const { count: x } = t.useContext(w), a = t.useContext(k) === x - 1, l = "inline-flex items-center gap-1.5", i = /* @__PURE__ */ g(B, { children: [
86
+ u && /* @__PURE__ */ e("span", { "aria-hidden": !0, className: "flex shrink-0 items-center [&_svg]:size-4", children: u }),
87
+ r ? /* @__PURE__ */ e("span", { className: "min-w-0 truncate", children: d }) : d
88
+ ] }), h = r ? /* @__PURE__ */ e(
87
89
  "span",
88
90
  {
89
91
  "aria-current": "page",
90
- className: a(l, "font-normal text-primary"),
91
- children: u
92
+ className: c(l, "min-w-0 font-normal text-primary"),
93
+ children: i
92
94
  }
93
95
  ) : n ? /* @__PURE__ */ e(
94
96
  "a",
95
97
  {
96
98
  href: n,
97
- className: a(
99
+ className: c(
98
100
  l,
99
101
  "font-normal text-muted-foreground transition-colors hover:text-foreground",
100
102
  "outline-none focus-visible:ring-3 focus-visible:ring-ring rounded-sm"
101
103
  ),
102
- children: u
104
+ children: i
103
105
  }
104
- ) : /* @__PURE__ */ e("span", { className: a(l, "text-muted-foreground"), children: u });
105
- return /* @__PURE__ */ v(
106
+ ) : /* @__PURE__ */ e("span", { className: c(l, "text-muted-foreground"), children: i });
107
+ return /* @__PURE__ */ g(
106
108
  "li",
107
109
  {
108
- ref: f,
109
- className: a("flex items-center gap-1.5", s),
110
- ...m,
110
+ ref: b,
111
+ className: c(
112
+ "flex items-center gap-1.5",
113
+ r ? "min-w-0 shrink" : "shrink-0",
114
+ o
115
+ ),
116
+ ...f,
111
117
  children: [
112
- x,
113
- !b && /* @__PURE__ */ e("span", { "aria-hidden": !0, className: "shrink-0 select-none text-border-strong", children: "/" })
118
+ h,
119
+ !a && /* @__PURE__ */ e("span", { "aria-hidden": !0, className: "shrink-0 select-none text-border-strong", children: "/" })
114
120
  ]
115
121
  }
116
122
  );
@@ -118,5 +124,5 @@ const E = t.forwardRef(({ className: s, href: n, isCurrent: r, icon: c, children
118
124
  E.displayName = "BreadcrumbItem";
119
125
  export {
120
126
  E as BreadcrumbItem,
121
- y as Breadcrumbs
127
+ z as Breadcrumbs
122
128
  };
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsxs as r, jsx as m } from "react/jsx-runtime";
3
- import * as b from "react";
4
- import { cva as v } from "class-variance-authority";
3
+ import * as v from "react";
4
+ import { cva as b } from "class-variance-authority";
5
5
  import { cn as n } from "../lib/cn.js";
6
6
  import { Spinner as f } from "./spinner.js";
7
- const p = v(
7
+ const p = b(
8
8
  [
9
9
  "relative inline-flex items-center justify-center gap-2 whitespace-nowrap",
10
10
  "font-normal select-none",
@@ -21,7 +21,7 @@ const p = v(
21
21
  {
22
22
  variants: {
23
23
  variant: {
24
- solid: "bg-brand text-brand-foreground shadow-[var(--inner-glow-cta)] hover:bg-brand-hover",
24
+ solid: "bg-action-primary text-action-primary-foreground shadow-[var(--inner-glow-cta)] hover:bg-action-primary-hover",
25
25
  secondary: "bg-fill text-fill-foreground shadow-[var(--inner-glow-fill)] hover:bg-muted",
26
26
  outline: "border-border bg-transparent text-foreground hover:border-border-strong hover:bg-muted",
27
27
  ghost: "bg-transparent text-foreground hover:bg-muted",
@@ -41,7 +41,7 @@ const p = v(
41
41
  },
42
42
  defaultVariants: { variant: "solid", size: "md" }
43
43
  }
44
- ), x = b.forwardRef(
44
+ ), x = v.forwardRef(
45
45
  ({
46
46
  className: o,
47
47
  variant: t,
@@ -51,12 +51,12 @@ const p = v(
51
51
  endContent: a,
52
52
  fullWidth: d,
53
53
  disabled: l,
54
- children: g,
55
- ...u
56
- }, c) => /* @__PURE__ */ r(
54
+ children: c,
55
+ ...g
56
+ }, u) => /* @__PURE__ */ r(
57
57
  "button",
58
58
  {
59
- ref: c,
59
+ ref: u,
60
60
  disabled: l || e,
61
61
  "aria-busy": e || void 0,
62
62
  className: n(
@@ -66,7 +66,7 @@ const p = v(
66
66
  e ? "opacity-100" : "disabled:opacity-50",
67
67
  o
68
68
  ),
69
- ...u,
69
+ ...g,
70
70
  children: [
71
71
  e && /* @__PURE__ */ m(
72
72
  f,
@@ -86,7 +86,7 @@ const p = v(
86
86
  ),
87
87
  children: [
88
88
  i,
89
- g,
89
+ c,
90
90
  a
91
91
  ]
92
92
  }
@@ -3,18 +3,19 @@ import { jsx as t } from "react/jsx-runtime";
3
3
  import * as d from "react";
4
4
  import { cn as o } from "../lib/cn.js";
5
5
  const l = d.forwardRef(
6
- ({ className: r, isHoverable: e, isPressable: a, children: s, ...n }, i) => {
6
+ ({ className: r, isHoverable: a, isPressable: e, children: s, ...n }, i) => {
7
7
  const c = o(
8
8
  "bg-card text-card-foreground rounded-xl",
9
- (a || e) && "shadow-elevation transition-[box-shadow,transform] duration-150 ease-out motion-reduce:transition-none",
10
- e && "hover:-translate-y-0.5",
9
+ (e || a) && "shadow-elevation transition-[box-shadow,transform] duration-150 ease-out motion-reduce:transition-none",
10
+ a && "hover:-translate-y-0.5",
11
11
  r
12
12
  );
13
- return a ? /* @__PURE__ */ t(
13
+ return e ? /* @__PURE__ */ t(
14
14
  "button",
15
15
  {
16
16
  ref: i,
17
17
  type: "button",
18
+ "data-slot": "card",
18
19
  className: o(
19
20
  c,
20
21
  "w-full text-left cursor-pointer",
@@ -24,50 +25,50 @@ const l = d.forwardRef(
24
25
  ...n,
25
26
  children: s
26
27
  }
27
- ) : /* @__PURE__ */ t("div", { ref: i, className: c, ...n, children: s });
28
+ ) : /* @__PURE__ */ t("div", { ref: i, "data-slot": "card", className: c, ...n, children: s });
28
29
  }
29
30
  );
30
31
  l.displayName = "Card";
31
- const f = d.forwardRef(({ className: r, ...e }, a) => /* @__PURE__ */ t(
32
+ const f = d.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
32
33
  "div",
33
34
  {
34
- ref: a,
35
+ ref: e,
35
36
  className: o("flex flex-col gap-1 px-5 pt-5", r),
36
- ...e
37
+ ...a
37
38
  }
38
39
  ));
39
40
  f.displayName = "CardHeader";
40
- const m = d.forwardRef(({ className: r, ...e }, a) => /* @__PURE__ */ t(
41
+ const m = d.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
41
42
  "h3",
42
43
  {
43
- ref: a,
44
+ ref: e,
44
45
  className: o("text-base font-medium leading-none", r),
45
- ...e
46
+ ...a
46
47
  }
47
48
  ));
48
49
  m.displayName = "CardTitle";
49
- const p = d.forwardRef(({ className: r, ...e }, a) => /* @__PURE__ */ t(
50
+ const p = d.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t(
50
51
  "p",
51
52
  {
52
- ref: a,
53
+ ref: e,
53
54
  className: o("text-xs text-muted-foreground", r),
54
- ...e
55
+ ...a
55
56
  }
56
57
  ));
57
58
  p.displayName = "CardDescription";
58
- const u = d.forwardRef(({ className: r, ...e }, a) => /* @__PURE__ */ t("div", { ref: a, className: o("px-5 py-4", r), ...e }));
59
+ const u = d.forwardRef(({ className: r, ...a }, e) => /* @__PURE__ */ t("div", { ref: e, className: o("px-5 py-4", r), ...a }));
59
60
  u.displayName = "CardBody";
60
61
  const x = d.forwardRef(
61
- ({ className: r, withBorder: e, ...a }, s) => /* @__PURE__ */ t(
62
+ ({ className: r, withBorder: a, ...e }, s) => /* @__PURE__ */ t(
62
63
  "div",
63
64
  {
64
65
  ref: s,
65
66
  className: o(
66
67
  "flex items-center px-5 pb-5 pt-4",
67
- e && "border-t border-border",
68
+ a && "border-t border-border",
68
69
  r
69
70
  ),
70
- ...a
71
+ ...e
71
72
  }
72
73
  )
73
74
  );
@@ -100,6 +100,8 @@ export interface LineChartProps extends BaseChartProps {
100
100
  curve?: "linear" | "natural" | "step";
101
101
  /** Series keys that render dashed — projections, not observations. */
102
102
  forecastKeys?: string[];
103
+ /** When set, only these series keys animate on mount/update. */
104
+ animatedSeriesKeys?: string[];
103
105
  /**
104
106
  * Print each observation's value above its dot. On by default for a SINGLE
105
107
  * series (the reader shouldn't have to hover to read a number that fits);
@@ -112,6 +114,8 @@ export interface AreaChartProps extends BaseChartProps {
112
114
  stacked?: boolean;
113
115
  /** Series keys that render dashed — projections, not observations. */
114
116
  forecastKeys?: string[];
117
+ /** When set, only these series keys animate on mount/update. */
118
+ animatedSeriesKeys?: string[];
115
119
  /** Print each observation's value above its dot — see {@link LineChartProps.showValues}. */
116
120
  showValues?: boolean;
117
121
  }
@@ -130,6 +134,8 @@ export interface ComboChartProps extends BaseChartProps {
130
134
  stacked?: boolean;
131
135
  /** Line keys that render dashed — projections, not observations. */
132
136
  forecastKeys?: string[];
137
+ /** When set, only these series keys animate on mount/update. */
138
+ animatedSeriesKeys?: string[];
133
139
  }
134
140
  export type ComposedChartProps = ComboChartProps;
135
141
  export interface PieChartProps {