@actioneer/ads 1.0.7 → 1.0.9

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 (87) hide show
  1. package/DESIGN.md +119 -91
  2. package/README.md +19 -1
  3. package/components/ai-elements/chart.js +20 -20
  4. package/components/ai-elements/inline-citation.js +50 -50
  5. package/components/ai-elements/message.js +1 -1
  6. package/components/ai-elements/tool.js +5 -5
  7. package/components/alert.d.ts +3 -2
  8. package/components/alert.js +25 -25
  9. package/components/answer.js +1 -1
  10. package/components/assistant-ui/action-bar.js +1 -1
  11. package/components/assistant-ui/attachment.js +68 -49
  12. package/components/assistant-ui/composer-add-context.js +1 -1
  13. package/components/assistant-ui/composer-harness.js +5 -4
  14. package/components/assistant-ui/composer-trigger-popover.js +1 -1
  15. package/components/assistant-ui/composer.js +13 -13
  16. package/components/assistant-ui/message-timing.js +6 -6
  17. package/components/assistant-ui/selection-toolbar.js +5 -5
  18. package/components/assistant-ui/sources.js +15 -15
  19. package/components/assistant-ui/tooltip-icon-button.js +18 -14
  20. package/components/audio-waveform.d.ts +21 -8
  21. package/components/audio-waveform.js +371 -94
  22. package/components/autocomplete.js +9 -9
  23. package/components/breadcrumbs.js +36 -42
  24. package/components/button.d.ts +16 -1
  25. package/components/button.js +86 -73
  26. package/components/card.js +1 -1
  27. package/components/chart.d.ts +31 -4
  28. package/components/chart.js +900 -666
  29. package/components/chip.d.ts +2 -1
  30. package/components/chip.js +56 -51
  31. package/components/command-palette.js +12 -12
  32. package/components/connector-card.d.ts +1 -2
  33. package/components/connector-card.js +17 -17
  34. package/components/date-range-picker.js +1 -2
  35. package/components/drawer.js +9 -10
  36. package/components/dropdown.js +1 -1
  37. package/components/empty-state.d.ts +2 -0
  38. package/components/empty-state.js +17 -15
  39. package/components/field.js +9 -10
  40. package/components/file-dropzone.d.ts +6 -3
  41. package/components/file-dropzone.js +72 -60
  42. package/components/filters.d.ts +37 -0
  43. package/components/filters.js +129 -0
  44. package/components/index.d.ts +1 -0
  45. package/components/index.js +447 -444
  46. package/components/infinite-canvas.js +9 -9
  47. package/components/modal.d.ts +2 -1
  48. package/components/modal.js +102 -91
  49. package/components/page-body.js +8 -8
  50. package/components/popover.d.ts +6 -1
  51. package/components/popover.js +75 -65
  52. package/components/progress-circle.d.ts +1 -1
  53. package/components/progress-circle.js +57 -48
  54. package/components/segmented.d.ts +1 -0
  55. package/components/segmented.js +34 -36
  56. package/components/select.js +2 -2
  57. package/components/selection-action-bar.js +32 -31
  58. package/components/setting-row.js +10 -10
  59. package/components/sidebar.d.ts +15 -0
  60. package/components/sidebar.js +186 -149
  61. package/components/slider.js +5 -5
  62. package/components/stepper.d.ts +1 -1
  63. package/components/stepper.js +1 -1
  64. package/components/switch.js +10 -10
  65. package/components/table.d.ts +10 -2
  66. package/components/table.js +380 -366
  67. package/components/tabs.d.ts +6 -1
  68. package/components/tabs.js +32 -29
  69. package/components/timeline.js +3 -3
  70. package/components/toast.js +53 -56
  71. package/components/ui/button.js +4 -4
  72. package/components/ui/dialog.js +1 -1
  73. package/components/viz-charts.js +263 -221
  74. package/demo/components/add-to-artifact.js +3 -2
  75. package/examples/README.md +31 -0
  76. package/examples/agents-screen.tsx +477 -0
  77. package/examples/campaign-analysis-screen.tsx +138 -0
  78. package/examples/campaigns-screen.tsx +439 -0
  79. package/examples/settings-screen.tsx +90 -0
  80. package/examples/workspace-header.tsx +71 -0
  81. package/lib/icons.d.ts +8 -0
  82. package/lib/icons.js +171 -118
  83. package/llms.txt +93 -29
  84. package/manifest.json +1660 -113
  85. package/package.json +1 -1
  86. package/styles.css +55 -68
  87. package/theme.css +50 -59
@@ -1,7 +1,7 @@
1
1
  import { VariantProps } from 'class-variance-authority';
2
2
  import * as React from "react";
3
3
  declare const chipVariants: (props?: ({
4
- variant?: "outline" | "solid" | null | undefined;
4
+ variant?: "outline" | "solid" | "plain" | null | undefined;
5
5
  color?: "success" | "warning" | "danger" | "info" | "default" | "primary" | null | undefined;
6
6
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;
7
7
  export type ChipInteraction = "actionable" | "non-actionable";
@@ -19,6 +19,7 @@ export interface ChipProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, "
19
19
  onClose?: () => void;
20
20
  startContent?: React.ReactNode;
21
21
  avatar?: React.ReactNode;
22
+ /** Leading square tone dot. Always on for `variant="plain"`. */
22
23
  showDot?: boolean;
23
24
  }
24
25
  export declare const Chip: React.ForwardRefExoticComponent<ChipProps & React.RefAttributes<HTMLSpanElement>>;
@@ -1,16 +1,19 @@
1
1
  "use client";
2
- import { jsxs as x, Fragment as h, jsx as a } from "react/jsx-runtime";
3
- import * as y from "react";
4
- import { cva as N } from "class-variance-authority";
5
- import { Close as w } from "../lib/icons.js";
2
+ import { jsxs as v, Fragment as h, jsx as e } from "react/jsx-runtime";
3
+ import * as N from "react";
4
+ import { cva as w } from "class-variance-authority";
5
+ import { Close as y } from "../lib/icons.js";
6
6
  import { cn as i } from "../lib/cn.js";
7
- const k = N(
7
+ const k = w(
8
8
  "inline-flex h-6 items-center gap-1 whitespace-nowrap rounded-[4px] border px-2 py-0 text-s font-medium leading-[var(--text-s--line-height)]",
9
9
  {
10
10
  variants: {
11
11
  variant: {
12
12
  solid: "",
13
- outline: ""
13
+ outline: "",
14
+ // Status text for table cells and detail panels: no container, an 8px
15
+ // tone dot, and a 14px Regular primary label. The dot carries the tone.
16
+ plain: "h-auto gap-2 rounded-none border-0 bg-transparent px-0 text-m font-normal leading-[var(--text-m--line-height)] text-on-white-primary"
14
17
  },
15
18
  color: {
16
19
  default: "",
@@ -23,15 +26,15 @@ const k = N(
23
26
  },
24
27
  compoundVariants: [
25
28
  // solid — the default tinted surface
26
- { variant: "solid", color: "default", className: "border-wg6 bg-wg2 text-muted-foreground" },
27
- { variant: "solid", color: "primary", className: "border-brand bg-action-primary-soft text-brand-text" },
28
- { variant: "solid", color: "success", className: "border-success-400 bg-success-50 text-success-700" },
29
+ { variant: "solid", color: "default", className: "border-wg4 bg-wg2 text-muted-foreground" },
30
+ { variant: "solid", color: "primary", className: "border-t6 bg-action-primary-soft text-brand-text" },
31
+ { variant: "solid", color: "success", className: "border-success-300 bg-success-50 text-success-700" },
29
32
  { variant: "solid", color: "warning", className: "border-warning-300 bg-warning-50 text-warning-700" },
30
33
  { variant: "solid", color: "danger", className: "border-danger-300 bg-danger-50 text-danger-700" },
31
34
  { variant: "solid", color: "info", className: "border-info-300 bg-info-50 text-info-700" },
32
35
  // outline
33
- { variant: "outline", color: "default", className: "border-border-strong bg-card text-foreground" },
34
- { variant: "outline", color: "primary", className: "border-brand bg-card text-brand-text" },
36
+ { variant: "outline", color: "default", className: "border-border bg-card text-foreground" },
37
+ { variant: "outline", color: "primary", className: "border-t7 bg-card text-brand-text" },
35
38
  { variant: "outline", color: "success", className: "border-success-400 bg-success-50 text-success-700" },
36
39
  { variant: "outline", color: "warning", className: "border-warning-400 bg-warning-50 text-warning-700" },
37
40
  { variant: "outline", color: "danger", className: "border-danger-400 bg-danger-50 text-danger-700" },
@@ -46,74 +49,76 @@ const k = N(
46
49
  warning: "bg-warning",
47
50
  danger: "bg-danger",
48
51
  info: "bg-info"
49
- }, j = y.forwardRef(
52
+ }, j = N.forwardRef(
50
53
  ({
51
- className: g,
52
- variant: u = "solid",
53
- color: t = "default",
54
+ className: u,
55
+ variant: a = "solid",
56
+ color: o = "default",
54
57
  interaction: m,
55
58
  isPressable: f = !1,
56
- onClose: e,
57
- startContent: o,
58
- avatar: r,
59
+ onClose: r,
60
+ startContent: s,
61
+ avatar: n,
59
62
  showDot: p = !1,
60
- children: v,
61
- ...s
62
- }, c) => {
63
- const n = e ? "actionable" : m ?? (f ? "actionable" : "non-actionable"), l = n === "actionable" && !e, d = i(
64
- k({ variant: u, color: t }),
65
- r && "pl-1",
66
- e && "pr-1.5",
67
- l && "cursor-pointer select-none shadow-100 outline-none transition-[background,border,color,box-shadow,transform] duration-150 ease-out data-[interaction=actionable]:border-action-primary data-[interaction=actionable]:bg-card data-[interaction=actionable]:text-action-primary-text hover:-translate-y-px hover:bg-action-primary-soft hover:shadow-200 active:translate-y-0 active:scale-[0.97] active:bg-action-primary-soft aria-pressed:border-brand! aria-pressed:bg-action-primary-soft! aria-pressed:text-brand-text! focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background motion-reduce:transition-none motion-reduce:hover:translate-y-0 motion-reduce:active:scale-100",
68
- g
69
- ), b = /* @__PURE__ */ x(h, { children: [
70
- r && /* @__PURE__ */ a("span", { className: "-ml-0.5 inline-flex shrink-0", children: r }),
71
- p && /* @__PURE__ */ a(
63
+ children: x,
64
+ ...c
65
+ }, l) => {
66
+ const t = r ? "actionable" : m ?? (f ? "actionable" : "non-actionable"), d = t === "actionable" && !r, g = i(
67
+ k({ variant: a, color: o }),
68
+ n && "pl-1",
69
+ r && "pr-1",
70
+ d && "cursor-pointer select-none outline-none transition-[background,border,color,box-shadow,transform] duration-150 ease-out data-[interaction=actionable]:border-action-primary data-[interaction=actionable]:bg-card data-[interaction=actionable]:text-action-primary-text hover:-translate-y-px hover:bg-action-primary-soft active:translate-y-0 active:scale-[0.97] active:bg-action-primary-soft aria-pressed:border-brand! aria-pressed:bg-action-primary-soft! aria-pressed:text-brand-text! focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background motion-reduce:transition-none motion-reduce:hover:translate-y-0 motion-reduce:active:scale-100",
71
+ u
72
+ ), b = /* @__PURE__ */ v(h, { children: [
73
+ n && /* @__PURE__ */ e("span", { className: "-ml-0.5 inline-flex shrink-0", children: n }),
74
+ (p || a === "plain") && /* @__PURE__ */ e(
72
75
  "span",
73
76
  {
74
77
  "aria-hidden": !0,
75
78
  className: i(
76
- "size-1.5",
79
+ a === "plain" ? "size-2 shrink-0" : "size-1.5",
77
80
  "rounded-dot",
78
- z[t ?? "default"]
81
+ z[o ?? "default"]
79
82
  )
80
83
  }
81
84
  ),
82
- o && /* @__PURE__ */ a("span", { className: "inline-flex shrink-0 [&_svg]:size-3.5", children: o }),
83
- v,
84
- e && /* @__PURE__ */ a(
85
+ s && /* @__PURE__ */ e("span", { className: "inline-flex shrink-0 [&_svg]:size-3.5", children: s }),
86
+ x,
87
+ r && /* @__PURE__ */ e(
85
88
  "button",
86
89
  {
87
90
  type: "button",
88
91
  "aria-label": "Remove",
89
- onClick: e,
92
+ onClick: r,
90
93
  className: i(
91
- "inline-flex size-4 shrink-0 items-center justify-center rounded-full",
92
- "opacity-60 transition-opacity hover:opacity-100",
93
- "outline-none focus-visible:ring-3 focus-visible:ring-ring",
94
- "[&_svg]:size-3"
94
+ // A 16px container tinted from the chip's own ink so the remove
95
+ // control reads as a button: 10% at rest, 20% on hover/press.
96
+ "inline-flex size-4 shrink-0 items-center justify-center rounded-xs",
97
+ "bg-current/10 transition-[background-color,transform] duration-150 ease-out hover:bg-current/20 active:scale-[0.97] active:bg-current/20",
98
+ "outline-none focus-visible:ring-3 focus-visible:ring-ring motion-reduce:transition-none",
99
+ "[&_svg]:size-2.5"
95
100
  ),
96
- children: /* @__PURE__ */ a(w, { "aria-hidden": !0 })
101
+ children: /* @__PURE__ */ e(y, { "aria-hidden": !0, weight: "bold" })
97
102
  }
98
103
  )
99
104
  ] });
100
- return l ? /* @__PURE__ */ a(
105
+ return d ? /* @__PURE__ */ e(
101
106
  "button",
102
107
  {
103
- ref: c,
108
+ ref: l,
104
109
  type: "button",
105
- "data-interaction": n,
106
- className: d,
107
- ...s,
110
+ "data-interaction": t,
111
+ className: g,
112
+ ...c,
108
113
  children: b
109
114
  }
110
- ) : /* @__PURE__ */ a(
115
+ ) : /* @__PURE__ */ e(
111
116
  "span",
112
117
  {
113
- ref: c,
114
- "data-interaction": n,
115
- className: d,
116
- ...s,
118
+ ref: l,
119
+ "data-interaction": t,
120
+ className: g,
121
+ ...c,
117
122
  children: b
118
123
  }
119
124
  );
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsxs as u, jsx as a } from "react/jsx-runtime";
2
+ import { jsxs as d, jsx as a } from "react/jsx-runtime";
3
3
  import * as o from "react";
4
4
  import { createPortal as S } from "react-dom";
5
5
  import { Search as q } from "../lib/icons.js";
@@ -25,7 +25,7 @@ function L({
25
25
  for (const t of l)
26
26
  r.has(t.group) || (r.set(t.group, []), e.push(t.group)), r.get(t.group).push(t);
27
27
  return e.map((t) => ({ group: t, items: r.get(t) }));
28
- }, [l]), d = l[c];
28
+ }, [l]), u = l[c];
29
29
  o.useEffect(() => {
30
30
  x(0);
31
31
  }, [m, s]), o.useEffect(() => {
@@ -43,15 +43,15 @@ function L({
43
43
  };
44
44
  }, [s]), o.useEffect(() => {
45
45
  var e, r;
46
- !s || !d || (r = (e = g.current) == null ? void 0 : e.querySelector(`[data-index="${c}"]`)) == null || r.scrollIntoView({ block: "nearest" });
47
- }, [s, d, c]);
46
+ !s || !u || (r = (e = g.current) == null ? void 0 : e.querySelector(`[data-index="${c}"]`)) == null || r.scrollIntoView({ block: "nearest" });
47
+ }, [s, u, c]);
48
48
  const k = (e) => {
49
49
  i(!1), R(e);
50
50
  }, I = (e) => {
51
- e.key === "Escape" ? (e.preventDefault(), i(!1)) : e.key === "ArrowDown" ? (e.preventDefault(), x((r) => Math.min(r + 1, l.length - 1))) : e.key === "ArrowUp" ? (e.preventDefault(), x((r) => Math.max(r - 1, 0))) : e.key === "Enter" && d && (e.preventDefault(), k(d));
51
+ e.key === "Escape" ? (e.preventDefault(), i(!1)) : e.key === "ArrowDown" ? (e.preventDefault(), x((r) => Math.min(r + 1, l.length - 1))) : e.key === "ArrowUp" ? (e.preventDefault(), x((r) => Math.max(r - 1, 0))) : e.key === "Enter" && u && (e.preventDefault(), k(u));
52
52
  };
53
53
  return s ? S(
54
- /* @__PURE__ */ u("div", { className: "fixed inset-0 z-50 flex items-start justify-center px-4 pt-[15vh]", children: [
54
+ /* @__PURE__ */ d("div", { className: "fixed inset-0 z-50 flex items-start justify-center px-4 pt-[15vh]", children: [
55
55
  /* @__PURE__ */ a(
56
56
  "div",
57
57
  {
@@ -60,7 +60,7 @@ function L({
60
60
  onClick: () => i(!1)
61
61
  }
62
62
  ),
63
- /* @__PURE__ */ u(
63
+ /* @__PURE__ */ d(
64
64
  "div",
65
65
  {
66
66
  role: "dialog",
@@ -68,13 +68,13 @@ function L({
68
68
  "aria-label": D,
69
69
  className: v(
70
70
  "relative flex w-full max-w-lg flex-col overflow-hidden",
71
- "rounded-xl bg-elevated text-foreground shadow-elevation",
71
+ "rounded-xl bg-elevated text-foreground",
72
72
  E
73
73
  ),
74
74
  onKeyDown: I,
75
75
  children: [
76
76
  /* @__PURE__ */ a(C, { origin: "top" }),
77
- /* @__PURE__ */ u("div", { className: "flex items-center gap-2.5 px-4 py-3", children: [
77
+ /* @__PURE__ */ d("div", { className: "flex items-center gap-2.5 px-4 py-3", children: [
78
78
  /* @__PURE__ */ a(q, { "aria-hidden": !0, className: "size-4 shrink-0 text-muted-foreground" }),
79
79
  /* @__PURE__ */ a(
80
80
  "input",
@@ -83,7 +83,7 @@ function L({
83
83
  role: "combobox",
84
84
  "aria-expanded": "true",
85
85
  "aria-controls": f,
86
- "aria-activedescendant": d ? `${f}-${c}` : void 0,
86
+ "aria-activedescendant": u ? `${f}-${c}` : void 0,
87
87
  "aria-autocomplete": "list",
88
88
  value: m,
89
89
  onChange: (e) => N(e.target.value),
@@ -100,11 +100,11 @@ function L({
100
100
  role: "listbox",
101
101
  "aria-label": "Results",
102
102
  className: "max-h-80 overflow-y-auto p-1.5 pt-0",
103
- children: l.length === 0 ? /* @__PURE__ */ a("p", { className: "px-2.5 py-6 text-center text-s text-muted-foreground", children: A }) : M.map(({ group: e, items: r }) => /* @__PURE__ */ u("div", { role: "group", "aria-label": e, children: [
103
+ children: l.length === 0 ? /* @__PURE__ */ a("p", { className: "px-2.5 py-6 text-center text-s text-muted-foreground", children: A }) : M.map(({ group: e, items: r }) => /* @__PURE__ */ d("div", { role: "group", "aria-label": e, children: [
104
104
  e && /* @__PURE__ */ a("div", { className: "px-2.5 pb-1 pt-2.5 text-s font-normal text-muted-foreground select-none", children: e }),
105
105
  r.map((t) => {
106
106
  const n = l.indexOf(t), h = n === c;
107
- return /* @__PURE__ */ u(
107
+ return /* @__PURE__ */ d(
108
108
  "div",
109
109
  {
110
110
  id: `${f}-${n}`,
@@ -4,8 +4,7 @@ import * as React from "react";
4
4
  * screen. Structure: identity row (logo + name + schema + connection status),
5
5
  * a tinted health strip, and a recessed footer with a usage metric + action.
6
6
  *
7
- * The clickable state retains the flat `shadow-elevation` compatibility hook;
8
- * add a numbered elevation utility only after an explicit user request. The
7
+ * The clickable state stays flat. The
9
8
  * health strip uses a soft status tint and the footer
10
9
  * steps down to `bg-muted`.
11
10
  */
@@ -1,5 +1,5 @@
1
1
  "use client";
2
- import { jsxs as r, Fragment as f, jsx as t } from "react/jsx-runtime";
2
+ import { jsxs as i, Fragment as f, jsx as t } from "react/jsx-runtime";
3
3
  import * as g from "react";
4
4
  import { Chip as x } from "./chip.js";
5
5
  import { Database as b, ChevronRight as p } from "../lib/icons.js";
@@ -17,11 +17,11 @@ function y(s) {
17
17
  let a;
18
18
  if (n < 7) a = `${n} days ago`;
19
19
  else if (n < 30) {
20
- const i = Math.round(n / 7);
21
- a = `${i} week${i > 1 ? "s" : ""} ago`;
20
+ const r = Math.round(n / 7);
21
+ a = `${r} week${r > 1 ? "s" : ""} ago`;
22
22
  } else {
23
- const i = Math.round(n / 30);
24
- a = `${i} month${i > 1 ? "s" : ""} ago`;
23
+ const r = Math.round(n / 30);
24
+ a = `${r} month${r > 1 ? "s" : ""} ago`;
25
25
  }
26
26
  return `Last sync from ${a}`;
27
27
  }
@@ -31,7 +31,7 @@ function N({
31
31
  label: n
32
32
  }) {
33
33
  const a = n ?? (s ? e ? y(e) : "Connected" : "Disconnected");
34
- return s ? /* @__PURE__ */ r("span", { className: "inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-xs text-tertiary", children: [
34
+ return s ? /* @__PURE__ */ i("span", { className: "inline-flex shrink-0 items-center gap-1.5 whitespace-nowrap text-xs text-tertiary", children: [
35
35
  /* @__PURE__ */ t("span", { "aria-hidden": !0, className: "size-2 rounded-dot bg-success" }),
36
36
  a
37
37
  ] }) : /* @__PURE__ */ t(
@@ -67,11 +67,11 @@ function v({ strip: s }) {
67
67
  );
68
68
  }
69
69
  const w = g.forwardRef(
70
- ({ className: s, card: e, onOpen: n, ...a }, i) => {
70
+ ({ className: s, card: e, onOpen: n, ...a }, r) => {
71
71
  var m;
72
- const c = !!n, h = ((m = e.action) == null ? void 0 : m.tone) === "reconnect", l = /* @__PURE__ */ r(f, { children: [
73
- /* @__PURE__ */ r("div", { className: "rounded-t-xl p-[var(--card-padding)]", children: [
74
- /* @__PURE__ */ r("div", { className: "mb-5 flex items-center gap-3.5", children: [
72
+ const c = !!n, h = ((m = e.action) == null ? void 0 : m.tone) === "reconnect", l = /* @__PURE__ */ i(f, { children: [
73
+ /* @__PURE__ */ i("div", { className: "rounded-t-xl p-[var(--card-padding)]", children: [
74
+ /* @__PURE__ */ i("div", { className: "mb-5 flex items-center gap-3.5", children: [
75
75
  e.logo ? /* @__PURE__ */ t(
76
76
  "img",
77
77
  {
@@ -80,8 +80,8 @@ const w = g.forwardRef(
80
80
  className: "size-10 shrink-0 rounded-md object-contain"
81
81
  }
82
82
  ) : /* @__PURE__ */ t("span", { className: "grid size-10 shrink-0 place-items-center rounded-md bg-muted text-secondary", children: /* @__PURE__ */ t(b, { className: "size-5", "aria-hidden": !0 }) }),
83
- /* @__PURE__ */ r("div", { className: "min-w-0 flex-1", children: [
84
- /* @__PURE__ */ r("div", { className: "flex items-baseline justify-between gap-3", children: [
83
+ /* @__PURE__ */ i("div", { className: "min-w-0 flex-1", children: [
84
+ /* @__PURE__ */ i("div", { className: "flex items-baseline justify-between gap-3", children: [
85
85
  /* @__PURE__ */ t("div", { className: "min-w-0 truncate text-base font-medium leading-tight text-foreground", children: e.name }),
86
86
  /* @__PURE__ */ t(
87
87
  N,
@@ -96,7 +96,7 @@ const w = g.forwardRef(
96
96
  ] }),
97
97
  /* @__PURE__ */ t(v, { strip: e.strip })
98
98
  ] }),
99
- /* @__PURE__ */ r("div", { className: "flex items-center justify-between gap-3 rounded-b-xl bg-ink-100 px-[var(--card-padding)] py-3", children: [
99
+ /* @__PURE__ */ i("div", { className: "flex items-center justify-between gap-3 rounded-b-xl bg-ink-100 px-[var(--card-padding)] py-3", children: [
100
100
  /* @__PURE__ */ t(
101
101
  "span",
102
102
  {
@@ -105,7 +105,7 @@ const w = g.forwardRef(
105
105
  children: e.footer.text
106
106
  }
107
107
  ),
108
- e.action && /* @__PURE__ */ r(
108
+ e.action && /* @__PURE__ */ i(
109
109
  "span",
110
110
  {
111
111
  className: o(
@@ -126,13 +126,13 @@ const w = g.forwardRef(
126
126
  // aliasing under transform is a real browser gotcha; forcing a
127
127
  // compositor layer fixes it deterministically).
128
128
  "rounded-xl bg-card text-card-foreground transform-gpu [will-change:transform] [backface-visibility:hidden]",
129
- c && "shadow-elevation transition-[transform,box-shadow] duration-150 ease-out motion-reduce:transition-none",
129
+ c && "transition-[transform,box-shadow] duration-150 ease-out motion-reduce:transition-none",
130
130
  s
131
131
  );
132
132
  return c ? /* @__PURE__ */ t(
133
133
  "button",
134
134
  {
135
- ref: i,
135
+ ref: r,
136
136
  type: "button",
137
137
  onClick: () => n == null ? void 0 : n(e),
138
138
  className: o(
@@ -143,7 +143,7 @@ const w = g.forwardRef(
143
143
  ...a,
144
144
  children: l
145
145
  }
146
- ) : /* @__PURE__ */ t("div", { ref: i, className: d, ...a, children: l });
146
+ ) : /* @__PURE__ */ t("div", { ref: r, className: d, ...a, children: l });
147
147
  }
148
148
  );
149
149
  w.displayName = "ConnectorCard";
@@ -105,7 +105,6 @@ function se({
105
105
  }),
106
106
  "[--glow-border-rest:var(--input)]",
107
107
  "[--glow-border-active:var(--field-focus)]",
108
- "[--glow-inset:var(--inner-glow-field)]",
109
108
  "data-[value-set]:text-on-white-primary!",
110
109
  "data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
111
110
  ),
@@ -163,7 +162,7 @@ function se({
163
162
  {
164
163
  placement: "bottom end",
165
164
  offset: 6,
166
- className: "z-50 w-72 rounded-md border border-input bg-popover p-3 text-popover-foreground shadow-elevation outline-none entering:animate-in entering:fade-in entering:zoom-in-95 exiting:animate-out exiting:fade-out exiting:zoom-out-95",
165
+ className: "z-50 w-72 rounded-md border border-input bg-popover p-3 text-popover-foreground outline-none entering:animate-in entering:fade-in entering:zoom-in-95 exiting:animate-out exiting:fade-out exiting:zoom-out-95",
167
166
  children: /* @__PURE__ */ t(E, { className: "outline-none", children: /* @__PURE__ */ d(T, { className: "w-full", visibleDuration: { months: 1 }, children: [
168
167
  /* @__PURE__ */ d("header", { className: "mb-3 flex items-center justify-between gap-2", children: [
169
168
  /* @__PURE__ */ t(
@@ -10,8 +10,7 @@ import { springSheet as l, drawerOffset as h, drawerBackdropVariants as F } from
10
10
  const k = j(
11
11
  [
12
12
  "relative flex flex-col",
13
- "bg-elevated text-foreground",
14
- "shadow-elevation"
13
+ "bg-elevated text-foreground"
15
14
  ],
16
15
  {
17
16
  variants: {
@@ -80,9 +79,9 @@ function G({
80
79
  open: t,
81
80
  onOpenChange: e,
82
81
  side: r,
83
- size: v,
82
+ size: x,
84
83
  className: c,
85
- children: x,
84
+ children: v,
86
85
  "aria-label": g
87
86
  }) {
88
87
  const d = r ?? "right", m = a.useRef(null), s = a.useRef(null);
@@ -129,7 +128,7 @@ function G({
129
128
  "aria-modal": "true",
130
129
  "aria-label": g,
131
130
  tabIndex: -1,
132
- className: n(k({ side: d, size: v }), "relative outline-none", c),
131
+ className: n(k({ side: d, size: x }), "relative outline-none", c),
133
132
  children: [
134
133
  /* @__PURE__ */ i(
135
134
  D,
@@ -138,7 +137,7 @@ function G({
138
137
  className: "right-4 top-4"
139
138
  }
140
139
  ),
141
- x
140
+ v
142
141
  ]
143
142
  },
144
143
  "panel"
@@ -151,14 +150,14 @@ function L({
151
150
  open: t,
152
151
  onOpenChange: e,
153
152
  dismissible: r = !0,
154
- side: v,
153
+ side: x,
155
154
  size: c,
156
- containerClassName: x,
155
+ containerClassName: v,
157
156
  className: g,
158
157
  children: d,
159
158
  "aria-label": m
160
159
  }) {
161
- const s = v ?? "right", p = c ?? "md", f = a.useRef(null);
160
+ const s = x ?? "right", p = c ?? "md", f = a.useRef(null);
162
161
  return a.useEffect(() => {
163
162
  if (!t || !r) return;
164
163
  const u = (o) => {
@@ -174,7 +173,7 @@ function L({
174
173
  className: n(
175
174
  "shrink-0 overflow-hidden",
176
175
  s === "bottom" ? "w-full" : "h-full",
177
- x
176
+ v
178
177
  ),
179
178
  children: /* @__PURE__ */ y(
180
179
  w.aside,
@@ -120,7 +120,7 @@ function V({
120
120
  },
121
121
  className: R(
122
122
  "relative z-50 min-w-44 rounded-lg border border-menu-stroke bg-elevated p-1",
123
- "text-foreground shadow-elevation outline-none",
123
+ "text-foreground outline-none",
124
124
  r
125
125
  ),
126
126
  ...d,
@@ -7,6 +7,8 @@ import * as React from "react";
7
7
  * - `illustration`: a larger soft graphic for a full empty *screen*, with a
8
8
  * bigger title and more breathing room — the calm, centred pattern.
9
9
  *
10
+ * Both registers sit in a dashed WG5 outline with an 8px radius and no fill.
11
+ *
10
12
  * Pass one or the other; `illustration` wins when both are present. The
11
13
  * built-in illustrations (`EmptyDocuments`, `EmptySearch`, `EmptyConnections`,
12
14
  * `EmptyInsights`) share one soft language — neutral-gray cards, a single ink
@@ -1,23 +1,25 @@
1
1
  "use client";
2
2
  import { jsxs as t, jsx as e } from "react/jsx-runtime";
3
3
  import * as x from "react";
4
- import { Inbox as f } from "../lib/icons.js";
4
+ import { Inbox as g } from "../lib/icons.js";
5
5
  import { cn as s } from "../lib/cn.js";
6
- const g = x.forwardRef(
7
- ({ className: r, icon: d, illustration: i, title: n, description: c, action: o, ...m }, h) => {
6
+ const f = x.forwardRef(
7
+ ({ className: r, icon: c, illustration: i, title: n, description: d, action: o, ...m }, h) => {
8
8
  const l = i != null;
9
9
  return /* @__PURE__ */ t(
10
10
  "div",
11
11
  {
12
12
  ref: h,
13
13
  className: s(
14
- "flex flex-col items-center px-6 text-center",
14
+ // No fill: the empty state is outlined by a dashed WG5 edge on
15
+ // whatever surface it sits on.
16
+ "flex flex-col items-center rounded-lg border border-dashed border-border-strong px-6 text-center",
15
17
  l ? "gap-5 py-16" : "gap-3 py-12",
16
18
  r
17
19
  ),
18
20
  ...m,
19
21
  children: [
20
- l ? i : /* @__PURE__ */ e("span", { className: "inline-flex items-center justify-center rounded-full bg-muted p-3 text-muted-foreground [&_svg]:size-6", children: d ?? /* @__PURE__ */ e(f, { "aria-hidden": !0 }) }),
22
+ l ? i : /* @__PURE__ */ e("span", { className: "inline-flex items-center justify-center rounded-full bg-muted p-3 text-muted-foreground [&_svg]:size-6", children: c ?? /* @__PURE__ */ e(g, { "aria-hidden": !0 }) }),
21
23
  /* @__PURE__ */ t("div", { className: "flex flex-col gap-1.5", children: [
22
24
  /* @__PURE__ */ e(
23
25
  "p",
@@ -28,14 +30,14 @@ const g = x.forwardRef(
28
30
  children: n
29
31
  }
30
32
  ),
31
- c && /* @__PURE__ */ e(
33
+ d && /* @__PURE__ */ e(
32
34
  "p",
33
35
  {
34
36
  className: s(
35
37
  "max-w-sm text-muted-foreground",
36
38
  l ? "text-sm" : "text-xs"
37
39
  ),
38
- children: c
40
+ children: d
39
41
  }
40
42
  )
41
43
  ] }),
@@ -45,7 +47,7 @@ const g = x.forwardRef(
45
47
  );
46
48
  }
47
49
  );
48
- g.displayName = "EmptyState";
50
+ f.displayName = "EmptyState";
49
51
  const a = "h-28 w-auto";
50
52
  function y({ className: r }) {
51
53
  return /* @__PURE__ */ t("svg", { viewBox: "0 0 140 120", role: "img", "aria-hidden": !0, className: s(a, r), children: [
@@ -82,7 +84,7 @@ function y({ className: r }) {
82
84
  ] });
83
85
  }
84
86
  y.displayName = "EmptyDocuments";
85
- function N({ className: r }) {
87
+ function u({ className: r }) {
86
88
  return /* @__PURE__ */ t("svg", { viewBox: "0 0 140 120", role: "img", "aria-hidden": !0, className: s(a, r), children: [
87
89
  /* @__PURE__ */ e(
88
90
  "rect",
@@ -125,8 +127,8 @@ function N({ className: r }) {
125
127
  ] })
126
128
  ] });
127
129
  }
128
- N.displayName = "EmptySearch";
129
- function u({ className: r }) {
130
+ u.displayName = "EmptySearch";
131
+ function N({ className: r }) {
130
132
  return /* @__PURE__ */ t("svg", { viewBox: "0 0 140 120", role: "img", "aria-hidden": !0, className: s(a, r), children: [
131
133
  /* @__PURE__ */ e(
132
134
  "path",
@@ -153,7 +155,7 @@ function u({ className: r }) {
153
155
  )
154
156
  ] });
155
157
  }
156
- u.displayName = "EmptyConnections";
158
+ N.displayName = "EmptyConnections";
157
159
  function p({ className: r }) {
158
160
  return /* @__PURE__ */ t("svg", { viewBox: "0 0 140 120", role: "img", "aria-hidden": !0, className: s(a, r), children: [
159
161
  /* @__PURE__ */ e("rect", { x: "34", y: "88", width: "72", height: "3", rx: "1.5", className: "fill-border-strong" }),
@@ -164,9 +166,9 @@ function p({ className: r }) {
164
166
  }
165
167
  p.displayName = "EmptyInsights";
166
168
  export {
167
- u as EmptyConnections,
169
+ N as EmptyConnections,
168
170
  y as EmptyDocuments,
169
171
  p as EmptyInsights,
170
- N as EmptySearch,
171
- g as EmptyState
172
+ u as EmptySearch,
173
+ f as EmptyState
172
174
  };
@@ -22,12 +22,11 @@ const L = i(
22
22
  R({ on: "all", color: "brand", intensity: "medium", animate: !0 }),
23
23
  "[--glow-border-rest:var(--input)]",
24
24
  "[--glow-border-hover:var(--input)]",
25
- "[--glow-border-active:var(--field-focus)]",
26
- "[--glow-inset:var(--inner-glow-field)]"
27
- ), w = a.forwardRef(({ className: r, children: e, required: o, ...t }, d) => /* @__PURE__ */ v(
25
+ "[--glow-border-active:var(--field-focus)]"
26
+ ), w = a.forwardRef(({ className: r, children: e, required: o, ...t }, n) => /* @__PURE__ */ v(
28
27
  "label",
29
28
  {
30
- ref: d,
29
+ ref: n,
31
30
  className: i(
32
31
  "flex items-center gap-1 text-m font-medium text-secondary select-none",
33
32
  "peer-disabled:cursor-not-allowed peer-disabled:opacity-60",
@@ -63,18 +62,18 @@ const h = a.forwardRef(
63
62
  );
64
63
  h.displayName = "FieldError";
65
64
  const D = a.forwardRef(
66
- ({ className: r, label: e, description: o, error: t, required: d, htmlFor: g, errorId: s, descriptionId: c, children: n, ...N }, F) => {
65
+ ({ className: r, label: e, description: o, error: t, required: n, htmlFor: g, errorId: s, descriptionId: c, children: d, ...N }, F) => {
67
66
  const m = a.useId(), p = s ?? `${m}-error`, f = c ?? `${m}-description`, u = t ? p : o ? f : void 0, E = s == null && c == null;
68
- let x = n;
69
- if (E && u && a.isValidElement(n)) {
70
- const b = n.props;
71
- x = a.cloneElement(n, {
67
+ let x = d;
68
+ if (E && u && a.isValidElement(d)) {
69
+ const b = d.props;
70
+ x = a.cloneElement(d, {
72
71
  "aria-describedby": [b["aria-describedby"], u].filter(Boolean).join(" ") || void 0,
73
72
  "aria-invalid": b["aria-invalid"] ?? (t ? !0 : void 0)
74
73
  });
75
74
  }
76
75
  return /* @__PURE__ */ v("div", { ref: F, className: i("flex flex-col gap-1.5", r), ...N, children: [
77
- e && /* @__PURE__ */ l(w, { htmlFor: g, required: d, children: e }),
76
+ e && /* @__PURE__ */ l(w, { htmlFor: g, required: n, children: e }),
78
77
  x,
79
78
  t ? /* @__PURE__ */ l(h, { id: p, children: t }) : o ? /* @__PURE__ */ l(y, { id: f, children: o }) : null
80
79
  ] });
@@ -5,11 +5,14 @@ import * as React from "react";
5
5
  * `<input type="file">`.
6
6
  *
7
7
  * A dashed edge is the one sanctioned stroke here: it is the affordance
8
- * ("something goes in this hole"), not decoration. The zone is actionable, so
9
- * it takes hover, focus and press feedback; while a file is dragged over it
10
- * the fill deepens rather than the stroke thickening, so nothing jumps.
8
+ * ("something goes in this hole"), not decoration. The empty zone is a White
9
+ * surface with a dashed WG5 edge and an outlined icon tile; hover warms it to
10
+ * WG1, and a drag-over turns it pale teal with a teal edge, so nothing jumps.
11
+ * Once files are chosen it becomes a solid-edged row: file tile, name and
12
+ * size, with Replace and Clear on the right.
11
13
  */
12
14
  declare const fileDropzoneVariants: (props?: ({
15
+ hasFiles?: boolean | null | undefined;
13
16
  isDragging?: boolean | null | undefined;
14
17
  isDisabled?: boolean | null | undefined;
15
18
  } & import('class-variance-authority/types').ClassProp) | undefined) => string;