@devalok/shilp-sutra 0.44.1 → 0.45.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.
Files changed (142) hide show
  1. package/AGENTS.md +13 -11
  2. package/BREAKING.json +209 -27
  3. package/MIGRATION.md +34 -0
  4. package/README.md +12 -0
  5. package/dist/_chunks/badge-group.js +1 -0
  6. package/dist/_chunks/badge-group.js.map +1 -1
  7. package/dist/_chunks/block-shell.js +25 -0
  8. package/dist/_chunks/block-shell.js.map +1 -0
  9. package/dist/_chunks/chat.js +153 -150
  10. package/dist/_chunks/chat.js.map +1 -1
  11. package/dist/_chunks/document-preview.js +1 -1
  12. package/dist/_chunks/image-preview.js +4 -4
  13. package/dist/_chunks/mention.js +5 -0
  14. package/dist/_chunks/mention.js.map +1 -0
  15. package/dist/_chunks/shared.js +65 -78
  16. package/dist/_chunks/shared.js.map +1 -1
  17. package/dist/_chunks/success.js +108 -106
  18. package/dist/_chunks/success.js.map +1 -1
  19. package/dist/ai/blocks/block-shell.d.ts +19 -0
  20. package/dist/ai/blocks/block-shell.d.ts.map +1 -0
  21. package/dist/ai/blocks/block-table.d.ts.map +1 -1
  22. package/dist/ai/blocks/confirm.d.ts.map +1 -1
  23. package/dist/ai/blocks/error.d.ts.map +1 -1
  24. package/dist/ai/blocks/error.js +5 -5
  25. package/dist/ai/blocks/error.js.map +1 -1
  26. package/dist/ai/blocks/success.d.ts.map +1 -1
  27. package/dist/ai/blocks/text.d.ts.map +1 -1
  28. package/dist/ai/blocks/text.js +4 -3
  29. package/dist/ai/blocks/text.js.map +1 -1
  30. package/dist/composed/activity-feed.d.ts.map +1 -1
  31. package/dist/composed/activity-feed.js +14 -12
  32. package/dist/composed/activity-feed.js.map +1 -1
  33. package/dist/composed/file-preview/audio-preview.d.ts.map +1 -1
  34. package/dist/composed/file-preview/shared.d.ts +10 -0
  35. package/dist/composed/file-preview/shared.d.ts.map +1 -1
  36. package/dist/composed/file-preview/video-preview.d.ts.map +1 -1
  37. package/dist/composed/file-preview.js +151 -188
  38. package/dist/composed/file-preview.js.map +1 -1
  39. package/dist/composed/master-detail.d.ts.map +1 -1
  40. package/dist/composed/master-detail.js +13 -4
  41. package/dist/composed/master-detail.js.map +1 -1
  42. package/dist/composed/rich-chat-input.d.ts.map +1 -1
  43. package/dist/composed/rich-chat-input.js +514 -503
  44. package/dist/composed/rich-chat-input.js.map +1 -1
  45. package/dist/composed/rich-text-editor.d.ts.map +1 -1
  46. package/dist/composed/rich-text-editor.js +144 -143
  47. package/dist/composed/rich-text-editor.js.map +1 -1
  48. package/dist/composed/schedule-view.d.ts.map +1 -1
  49. package/dist/composed/schedule-view.js +52 -39
  50. package/dist/composed/schedule-view.js.map +1 -1
  51. package/dist/shell/notification-preferences.d.ts.map +1 -1
  52. package/dist/shell/notification-preferences.js +115 -114
  53. package/dist/shell/notification-preferences.js.map +1 -1
  54. package/dist/ui/badge-group.d.ts.map +1 -1
  55. package/dist/ui/card.d.ts +66 -16
  56. package/dist/ui/card.d.ts.map +1 -1
  57. package/dist/ui/card.js +85 -60
  58. package/dist/ui/card.js.map +1 -1
  59. package/dist/ui/chat/message.d.ts.map +1 -1
  60. package/dist/ui/color-input.d.ts.map +1 -1
  61. package/dist/ui/color-input.js +18 -18
  62. package/dist/ui/color-input.js.map +1 -1
  63. package/dist/ui/data-table-body.d.ts.map +1 -1
  64. package/dist/ui/data-table-body.js +94 -64
  65. package/dist/ui/data-table-body.js.map +1 -1
  66. package/dist/ui/data-table-card.d.ts.map +1 -1
  67. package/dist/ui/data-table-card.js +50 -43
  68. package/dist/ui/data-table-card.js.map +1 -1
  69. package/dist/ui/data-table-context.d.ts +0 -4
  70. package/dist/ui/data-table-context.d.ts.map +1 -1
  71. package/dist/ui/data-table-context.js +8 -12
  72. package/dist/ui/data-table-context.js.map +1 -1
  73. package/dist/ui/data-table-header.d.ts.map +1 -1
  74. package/dist/ui/data-table-header.js +2 -2
  75. package/dist/ui/data-table-header.js.map +1 -1
  76. package/dist/ui/data-table.d.ts.map +1 -1
  77. package/dist/ui/data-table.js +185 -182
  78. package/dist/ui/data-table.js.map +1 -1
  79. package/dist/ui/index.d.ts +3 -2
  80. package/dist/ui/index.d.ts.map +1 -1
  81. package/dist/ui/index.js +59 -58
  82. package/dist/ui/index.js.map +1 -1
  83. package/dist/ui/lib/mention.d.ts +11 -0
  84. package/dist/ui/lib/mention.d.ts.map +1 -0
  85. package/dist/ui/segmented-control.js +4 -4
  86. package/dist/ui/segmented-control.js.map +1 -1
  87. package/dist/ui/separator.d.ts +6 -5
  88. package/dist/ui/separator.d.ts.map +1 -1
  89. package/dist/ui/separator.js +7 -10
  90. package/dist/ui/separator.js.map +1 -1
  91. package/dist/ui/split-button.d.ts.map +1 -1
  92. package/dist/ui/split-button.js +62 -129
  93. package/dist/ui/split-button.js.map +1 -1
  94. package/dist/ui/stat-card.d.ts +7 -0
  95. package/dist/ui/stat-card.d.ts.map +1 -1
  96. package/dist/ui/stat-card.js +144 -126
  97. package/dist/ui/stat-card.js.map +1 -1
  98. package/dist/ui/table-row-link.d.ts +45 -0
  99. package/dist/ui/table-row-link.d.ts.map +1 -0
  100. package/dist/ui/table-row-link.js +16 -0
  101. package/dist/ui/table-row-link.js.map +1 -0
  102. package/dist/ui/table.d.ts +49 -5
  103. package/dist/ui/table.d.ts.map +1 -1
  104. package/dist/ui/table.js +39 -29
  105. package/dist/ui/table.js.map +1 -1
  106. package/dist/ui/toast-types.d.ts +10 -0
  107. package/dist/ui/toast-types.d.ts.map +1 -1
  108. package/dist/ui/toast.d.ts +6 -2
  109. package/dist/ui/toast.d.ts.map +1 -1
  110. package/dist/ui/toast.js +56 -54
  111. package/dist/ui/toast.js.map +1 -1
  112. package/docs/components/composed/content-card.md +2 -0
  113. package/docs/components/ui/button.md +3 -3
  114. package/docs/components/ui/card.md +27 -10
  115. package/docs/components/ui/chat.md +1 -1
  116. package/docs/components/ui/color-input.md +2 -2
  117. package/docs/components/ui/data-table.md +8 -1
  118. package/docs/components/ui/segmented-control.md +2 -2
  119. package/docs/components/ui/separator.md +3 -1
  120. package/docs/components/ui/split-button.md +3 -0
  121. package/docs/components/ui/stat-card.md +10 -2
  122. package/docs/components/ui/table-row-link.md +41 -0
  123. package/docs/components/ui/table.md +69 -0
  124. package/docs/components/ui/toast.md +10 -6
  125. package/docs/recipes/install-next-app-router.md +1 -1
  126. package/docs/recipes/troubleshoot.md +1 -1
  127. package/llms.txt +159 -781
  128. package/make-kit/components/card.md +54 -16
  129. package/make-kit/components/table.md +45 -7
  130. package/make-kit/foundations/spacing.md +3 -1
  131. package/make-kit/foundations/surfaces.md +1 -1
  132. package/mcp-manifest.json +12349 -0
  133. package/mcp-manifest.schema.json +232 -0
  134. package/package.json +8 -3
  135. package/skill/README.md +0 -1
  136. package/skill/SKILL.md +9 -8
  137. package/skill/references/components.md +159 -781
  138. package/skill/references/setup-next-app-router.md +1 -1
  139. package/skill/references/troubleshoot.md +1 -1
  140. package/llms-full.txt +0 -7198
  141. package/llms-quick.txt +0 -251
  142. package/skill/references/components-full.md +0 -7200
@@ -11,23 +11,24 @@ import { Table as f, TableBody as p, TableCaption as m, TableCell as h, TableHea
11
11
  import { Separator as y } from "../ui/separator.js";
12
12
  import { StatCard as b } from "../ui/stat-card.js";
13
13
  import { n as x } from "./motion-provider.js";
14
- import * as S from "react";
15
- import { jsx as C, jsxs as w } from "react/jsx-runtime";
16
- import { IconCircle as T, IconCircleCheck as E, IconCircleX as D } from "@tabler/icons-react";
17
- import { motion as O } from "framer-motion";
14
+ import { t as S } from "./block-shell.js";
15
+ import * as C from "react";
16
+ import { jsx as w, jsxs as T } from "react/jsx-runtime";
17
+ import { IconCircle as E, IconCircleCheck as D, IconCircleX as O } from "@tabler/icons-react";
18
+ import { motion as k } from "framer-motion";
18
19
  //#region src/ai/blocks/block-table.tsx
19
- function k(e, t) {
20
+ function A(e, t) {
20
21
  if (t.variant === "badge") {
21
22
  if (e && typeof e == "object" && "label" in e) {
22
23
  let t = e;
23
- return /* @__PURE__ */ C(o, {
24
+ return /* @__PURE__ */ w(o, {
24
25
  variant: "subtle",
25
26
  size: "sm",
26
27
  color: t.color,
27
28
  children: t.label
28
29
  });
29
30
  }
30
- return /* @__PURE__ */ C(o, {
31
+ return /* @__PURE__ */ w(o, {
31
32
  variant: "subtle",
32
33
  size: "sm",
33
34
  children: String(e ?? "")
@@ -35,7 +36,7 @@ function k(e, t) {
35
36
  }
36
37
  return String(e ?? "");
37
38
  }
38
- function A(e, t, n) {
39
+ function j(e, t, n) {
39
40
  return !t || !n ? e : [...e].sort((e, r) => {
40
41
  let i = e[t], a = r[t], o = String(i ?? ""), s = String(a ?? ""), c = Number(i), l = Number(a);
41
42
  if (!Number.isNaN(c) && !Number.isNaN(l)) return n === "asc" ? c - l : l - c;
@@ -43,21 +44,22 @@ function A(e, t, n) {
43
44
  return n === "asc" ? u : -u;
44
45
  });
45
46
  }
46
- var j = S.memo(function({ data: e, confidence: n }) {
47
- let { reducedMotion: i } = x(), [a, o] = S.useState(null), [s, c] = S.useState(null), l = S.useCallback((t) => {
47
+ var M = C.memo(function({ data: e, confidence: n }) {
48
+ let { reducedMotion: i } = x(), [a, o] = C.useState(null), [s, c] = C.useState(null), l = C.useCallback((t) => {
48
49
  e.sortable && (a === t ? s === "asc" ? c("desc") : s === "desc" && (o(null), c(null)) : (o(t), c("asc")));
49
50
  }, [
50
51
  e.sortable,
51
52
  a,
52
53
  s
53
- ]), u = e.columns ?? [], d = A(e.rows ?? [], a, s);
54
- return /* @__PURE__ */ C("div", {
55
- className: r("overflow-x-auto", n === "low" && "border-l-2 border-warning-7 pl-3"),
56
- children: /* @__PURE__ */ w(f, { children: [
57
- e.caption && /* @__PURE__ */ C(m, { children: e.caption }),
58
- /* @__PURE__ */ C(_, { children: /* @__PURE__ */ C(v, { children: u.map((t) => {
54
+ ]), u = e.columns ?? [], d = j(e.rows ?? [], a, s);
55
+ return /* @__PURE__ */ w(S, {
56
+ confidence: n,
57
+ className: "overflow-x-auto",
58
+ children: /* @__PURE__ */ T(f, { children: [
59
+ e.caption && /* @__PURE__ */ w(m, { children: e.caption }),
60
+ /* @__PURE__ */ w(_, { children: /* @__PURE__ */ w(v, { children: u.map((t) => {
59
61
  let n = a === t.key, i = e.sortable ? n ? s === "asc" ? "ascending" : "descending" : "none" : void 0;
60
- return /* @__PURE__ */ C(g, {
62
+ return /* @__PURE__ */ w(g, {
61
63
  role: "columnheader",
62
64
  className: r(t.variant === "number" && "text-right", e.sortable && "cursor-pointer select-none"),
63
65
  tabIndex: e.sortable ? 0 : void 0,
@@ -66,15 +68,15 @@ var j = S.memo(function({ data: e, confidence: n }) {
66
68
  (e.key === "Enter" || e.key === " ") && (e.preventDefault(), l(t.key));
67
69
  } : void 0,
68
70
  "aria-sort": i,
69
- children: /* @__PURE__ */ w("span", {
71
+ children: /* @__PURE__ */ T("span", {
70
72
  className: "inline-flex items-center gap-1",
71
73
  children: [
72
74
  t.label,
73
- n && s === "asc" && /* @__PURE__ */ C("span", {
75
+ n && s === "asc" && /* @__PURE__ */ w("span", {
74
76
  "aria-hidden": "true",
75
77
  children: "▲"
76
78
  }),
77
- n && s === "desc" && /* @__PURE__ */ C("span", {
79
+ n && s === "desc" && /* @__PURE__ */ w("span", {
78
80
  "aria-hidden": "true",
79
81
  children: "▼"
80
82
  })
@@ -82,9 +84,9 @@ var j = S.memo(function({ data: e, confidence: n }) {
82
84
  })
83
85
  }, t.key);
84
86
  }) }) }),
85
- /* @__PURE__ */ C(p, { children: d.map((e, n) => {
87
+ /* @__PURE__ */ w(p, { children: d.map((e, n) => {
86
88
  let a = typeof e.id == "string" || typeof e.id == "number" ? String(e.id) : `row-${n}`;
87
- return /* @__PURE__ */ C(i ? "tr" : O.tr, {
89
+ return /* @__PURE__ */ w(i ? "tr" : k.tr, {
88
90
  className: "hover:bg-surface-raised-hover transition-colors",
89
91
  ...i ? {} : {
90
92
  initial: {
@@ -100,54 +102,54 @@ var j = S.memo(function({ data: e, confidence: n }) {
100
102
  delay: n * .03
101
103
  }
102
104
  },
103
- children: u.map((t) => /* @__PURE__ */ C(h, {
105
+ children: u.map((t) => /* @__PURE__ */ w(h, {
104
106
  className: r("text-ds-sm py-ds-02b px-ds-04", t.variant === "number" && "text-right tabular-nums font-medium"),
105
- children: k(e[t.key], t)
107
+ children: A(e[t.key], t)
106
108
  }, t.key))
107
109
  }, a);
108
110
  }) })
109
111
  ] })
110
112
  });
111
113
  });
112
- j.displayName = "BlockTable";
114
+ M.displayName = "BlockTable";
113
115
  //#endregion
114
116
  //#region src/ai/blocks/confirm.tsx
115
- var M = S.memo(function({ data: e, confidence: t, onAction: n }) {
116
- let i = S.useCallback(() => {
117
+ var N = C.memo(function({ data: e, confidence: t, onAction: n }) {
118
+ let r = C.useCallback(() => {
117
119
  n?.(e.actionId, "confirm");
118
- }, [e.actionId, n]), a = S.useCallback(() => {
120
+ }, [e.actionId, n]), i = C.useCallback(() => {
119
121
  n?.(e.actionId, "cancel");
120
122
  }, [e.actionId, n]);
121
- return /* @__PURE__ */ w("div", {
122
- className: r(t === "low" && "border-l-2 border-warning-7 pl-3"),
123
+ return /* @__PURE__ */ T(S, {
124
+ confidence: t,
123
125
  children: [
124
- e.description && /* @__PURE__ */ C("p", {
126
+ e.description && /* @__PURE__ */ w("p", {
125
127
  className: "text-ds-sm text-surface-fg-muted mb-3",
126
128
  children: e.description
127
129
  }),
128
- /* @__PURE__ */ w("div", {
130
+ /* @__PURE__ */ T("div", {
129
131
  className: "flex items-center gap-3",
130
- children: [/* @__PURE__ */ C(s, {
132
+ children: [/* @__PURE__ */ w(s, {
131
133
  variant: "solid",
132
134
  color: e.destructive ? "error" : void 0,
133
- onClick: i,
135
+ onClick: r,
134
136
  children: e.label
135
- }), /* @__PURE__ */ C(s, {
137
+ }), /* @__PURE__ */ w(s, {
136
138
  variant: "ghost",
137
- onClick: a,
139
+ onClick: i,
138
140
  children: "Cancel"
139
141
  })]
140
142
  }),
141
- e.rationale && /* @__PURE__ */ w(c, {
143
+ e.rationale && /* @__PURE__ */ T(c, {
142
144
  className: "mt-3",
143
- children: [/* @__PURE__ */ C(u, {
145
+ children: [/* @__PURE__ */ w(u, {
144
146
  asChild: !0,
145
- children: /* @__PURE__ */ C("button", {
147
+ children: /* @__PURE__ */ w("button", {
146
148
  type: "button",
147
149
  className: "text-ds-xs text-surface-fg-subtle underline cursor-pointer",
148
150
  children: "Why this action?"
149
151
  })
150
- }), /* @__PURE__ */ C(l, { children: /* @__PURE__ */ C("p", {
152
+ }), /* @__PURE__ */ w(l, { children: /* @__PURE__ */ w("p", {
151
153
  className: "text-ds-sm text-surface-fg-muted mt-2 p-3 bg-surface-raised rounded-surface",
152
154
  children: e.rationale
153
155
  }) })]
@@ -155,35 +157,35 @@ var M = S.memo(function({ data: e, confidence: t, onAction: n }) {
155
157
  ]
156
158
  });
157
159
  });
158
- M.displayName = "ConfirmBlock";
160
+ N.displayName = "ConfirmBlock";
159
161
  //#endregion
160
162
  //#region src/ai/blocks/divider.tsx
161
- var N = S.memo(function(e) {
163
+ var P = C.memo(function(e) {
162
164
  let { reducedMotion: t } = x();
163
- return t ? /* @__PURE__ */ C(y, {}) : /* @__PURE__ */ C(O.div, {
165
+ return t ? /* @__PURE__ */ w(y, {}) : /* @__PURE__ */ w(k.div, {
164
166
  initial: { scaleX: 0 },
165
167
  animate: { scaleX: 1 },
166
168
  style: { originX: .5 },
167
169
  transition: n.elegant,
168
- children: /* @__PURE__ */ C(y, {})
170
+ children: /* @__PURE__ */ w(y, {})
169
171
  });
170
172
  });
171
- N.displayName = "DividerBlock";
173
+ P.displayName = "DividerBlock";
172
174
  //#endregion
173
175
  //#region src/ai/blocks/info.tsx
174
- var P = S.memo(function({ data: e }) {
175
- return /* @__PURE__ */ C(a, {
176
+ var F = C.memo(function({ data: e }) {
177
+ return /* @__PURE__ */ w(a, {
176
178
  color: "info",
177
179
  variant: "subtle",
178
180
  role: "status",
179
181
  children: e.message
180
182
  });
181
183
  });
182
- P.displayName = "InfoBlock";
184
+ F.displayName = "InfoBlock";
183
185
  //#endregion
184
186
  //#region src/ai/blocks/loading.tsx
185
- function F() {
186
- return /* @__PURE__ */ C(O.span, {
187
+ function I() {
188
+ return /* @__PURE__ */ w(k.span, {
187
189
  className: "inline-block h-4 w-4 rounded-pill border-2 border-current border-t-transparent text-accent-9",
188
190
  animate: { rotate: 360 },
189
191
  transition: {
@@ -195,59 +197,59 @@ function F() {
195
197
  "data-testid": "step-spinner"
196
198
  });
197
199
  }
198
- function I({ status: e }) {
200
+ function L({ status: e }) {
199
201
  switch (e) {
200
- case "done": return /* @__PURE__ */ C("span", {
202
+ case "done": return /* @__PURE__ */ w("span", {
201
203
  "data-testid": "step-icon-done",
202
- children: /* @__PURE__ */ C(i, {
203
- icon: E,
204
+ children: /* @__PURE__ */ w(i, {
205
+ icon: D,
204
206
  size: "sm",
205
207
  className: "text-success-11"
206
208
  })
207
209
  });
208
- case "active": return /* @__PURE__ */ C(F, {});
209
- case "error": return /* @__PURE__ */ C("span", {
210
+ case "active": return /* @__PURE__ */ w(I, {});
211
+ case "error": return /* @__PURE__ */ w("span", {
210
212
  "data-testid": "step-icon-error",
211
- children: /* @__PURE__ */ C(i, {
212
- icon: D,
213
+ children: /* @__PURE__ */ w(i, {
214
+ icon: O,
213
215
  size: "sm",
214
216
  className: "text-error-11"
215
217
  })
216
218
  });
217
- default: return /* @__PURE__ */ C("span", {
219
+ default: return /* @__PURE__ */ w("span", {
218
220
  "data-testid": "step-icon-pending",
219
- children: /* @__PURE__ */ C(i, {
220
- icon: T,
221
+ children: /* @__PURE__ */ w(i, {
222
+ icon: E,
221
223
  size: "sm",
222
224
  className: "text-surface-fg-subtle opacity-50"
223
225
  })
224
226
  });
225
227
  }
226
228
  }
227
- var L = S.memo(function({ data: t }) {
229
+ var R = C.memo(function({ data: t }) {
228
230
  let { reducedMotion: n } = x(), i = n;
229
231
  if (t.lines != null) {
230
232
  let e = Math.max(1, t.lines);
231
- return /* @__PURE__ */ w("div", {
233
+ return /* @__PURE__ */ T("div", {
232
234
  role: "status",
233
235
  "aria-busy": "true",
234
236
  "aria-label": "Loading",
235
237
  className: "flex flex-col gap-2",
236
- children: [Array.from({ length: e }).map((t, n) => /* @__PURE__ */ C(d, {
238
+ children: [Array.from({ length: e }).map((t, n) => /* @__PURE__ */ w(d, {
237
239
  animation: "shimmer",
238
240
  className: r("h-4", n === e - 1 ? "w-3/5" : "w-full")
239
- }, n)), /* @__PURE__ */ C("span", {
241
+ }, n)), /* @__PURE__ */ w("span", {
240
242
  className: "sr-only",
241
243
  children: "Loading"
242
244
  })]
243
245
  });
244
246
  }
245
- return t.steps ? /* @__PURE__ */ w("div", {
247
+ return t.steps ? /* @__PURE__ */ T("div", {
246
248
  role: "status",
247
249
  "aria-busy": "true",
248
250
  "aria-label": "Processing",
249
251
  className: "flex flex-col gap-2",
250
- children: [t.steps.map((t, n) => /* @__PURE__ */ w(O.div, {
252
+ children: [t.steps.map((t, n) => /* @__PURE__ */ T(k.div, {
251
253
  className: "flex items-center gap-2",
252
254
  initial: i ? void 0 : {
253
255
  opacity: 0,
@@ -261,44 +263,44 @@ var L = S.memo(function({ data: t }) {
261
263
  duration: e.moderate01b,
262
264
  delay: n * .06
263
265
  },
264
- children: [/* @__PURE__ */ C(I, { status: t.status }), /* @__PURE__ */ C("span", {
266
+ children: [/* @__PURE__ */ w(L, { status: t.status }), /* @__PURE__ */ w("span", {
265
267
  className: r("text-ds-sm", t.status === "done" || t.status === "active" ? "text-surface-fg" : "text-surface-fg-subtle"),
266
268
  children: t.label
267
269
  })]
268
- }, t.id)), /* @__PURE__ */ C("span", {
270
+ }, t.id)), /* @__PURE__ */ w("span", {
269
271
  className: "sr-only",
270
272
  children: "Processing"
271
273
  })]
272
- }) : /* @__PURE__ */ C("div", {
274
+ }) : /* @__PURE__ */ w("div", {
273
275
  role: "status",
274
276
  "aria-busy": "true",
275
277
  "aria-label": "Loading",
276
- children: /* @__PURE__ */ C("span", {
278
+ children: /* @__PURE__ */ w("span", {
277
279
  className: "sr-only",
278
280
  children: "Loading"
279
281
  })
280
282
  });
281
283
  });
282
- L.displayName = "LoadingBlock";
284
+ R.displayName = "LoadingBlock";
283
285
  //#endregion
284
286
  //#region src/ai/blocks/stat-row.tsx
285
- var R = S.memo(function({ data: e }) {
287
+ var z = C.memo(function({ data: e }) {
286
288
  let { reducedMotion: n } = x(), r = e.stats ?? [];
287
- return r.length === 0 ? null : /* @__PURE__ */ C("div", {
289
+ return r.length === 0 ? null : /* @__PURE__ */ w("div", {
288
290
  className: "flex flex-wrap gap-ds-05",
289
291
  children: r.map((e, r) => {
290
292
  let i = e.change ? {
291
293
  value: e.change.value,
292
294
  direction: e.change.direction
293
295
  } : void 0;
294
- return n ? /* @__PURE__ */ C("div", {
296
+ return n ? /* @__PURE__ */ w("div", {
295
297
  className: "flex-1 min-w-[140px]",
296
- children: /* @__PURE__ */ C(b, {
298
+ children: /* @__PURE__ */ w(b, {
297
299
  label: e.label,
298
300
  value: e.value,
299
301
  delta: i
300
302
  })
301
- }, e.label) : /* @__PURE__ */ C(O.div, {
303
+ }, e.label) : /* @__PURE__ */ w(k.div, {
302
304
  className: "flex-1 min-w-[140px]",
303
305
  initial: {
304
306
  opacity: 0,
@@ -312,7 +314,7 @@ var R = S.memo(function({ data: e }) {
312
314
  ...t.responsive,
313
315
  delay: r * .08
314
316
  },
315
- children: /* @__PURE__ */ C(b, {
317
+ children: /* @__PURE__ */ w(b, {
316
318
  label: e.label,
317
319
  value: e.value,
318
320
  delta: i
@@ -321,47 +323,47 @@ var R = S.memo(function({ data: e }) {
321
323
  })
322
324
  });
323
325
  });
324
- R.displayName = "StatRowBlock";
326
+ z.displayName = "StatRowBlock";
325
327
  //#endregion
326
328
  //#region src/ai/blocks/success.tsx
327
- var z = 5e3, B = S.memo(function({ data: e, blockId: t, confidence: n, onAction: i }) {
328
- let { reducedMotion: o } = x(), c = o, l = e.undoTimeout ?? z, [u, d] = S.useState(l), [f, p] = S.useState(!!e.undoable);
329
- S.useEffect(() => {
329
+ var B = 5e3, V = C.memo(function({ data: e, blockId: t, confidence: n, onAction: r }) {
330
+ let { reducedMotion: i } = x(), o = i, c = e.undoTimeout ?? B, [l, u] = C.useState(c), [d, f] = C.useState(!!e.undoable);
331
+ C.useEffect(() => {
330
332
  if (!e.undoable) return;
331
333
  let t = setInterval(() => {
332
- d((e) => {
334
+ u((e) => {
333
335
  let n = e - 100;
334
- return n <= 0 ? (clearInterval(t), p(!1), 0) : n;
336
+ return n <= 0 ? (clearInterval(t), f(!1), 0) : n;
335
337
  });
336
338
  }, 100);
337
339
  return () => clearInterval(t);
338
- }, [e.undoable, l]);
339
- let m = S.useCallback(() => {
340
- i?.(t || "unknown", "undo");
341
- }, [t, i]), h = Math.ceil(u / 1e3), g = 2 * Math.PI * 9;
342
- return /* @__PURE__ */ w("div", {
343
- className: r(n === "low" && "border-l-2 border-warning-7 pl-3"),
344
- children: [/* @__PURE__ */ C(a, {
340
+ }, [e.undoable, c]);
341
+ let p = C.useCallback(() => {
342
+ r?.(t || "unknown", "undo");
343
+ }, [t, r]), m = Math.ceil(l / 1e3), h = 2 * Math.PI * 9;
344
+ return /* @__PURE__ */ T(S, {
345
+ confidence: n,
346
+ children: [/* @__PURE__ */ w(a, {
345
347
  color: "success",
346
348
  variant: "subtle",
347
349
  title: e.title,
348
350
  children: e.message
349
- }), f && e.undoable && /* @__PURE__ */ C("div", {
351
+ }), d && e.undoable && /* @__PURE__ */ w("div", {
350
352
  className: "mt-2 flex items-center gap-2",
351
- children: /* @__PURE__ */ C(s, {
353
+ children: /* @__PURE__ */ w(s, {
352
354
  variant: "ghost",
353
355
  size: "sm",
354
- onClick: m,
355
- "aria-label": `Undo action, ${h} seconds remaining`,
356
- children: /* @__PURE__ */ w("span", {
356
+ onClick: p,
357
+ "aria-label": `Undo action, ${m} seconds remaining`,
358
+ children: /* @__PURE__ */ T("span", {
357
359
  className: "flex items-center gap-1.5",
358
- children: [/* @__PURE__ */ w("svg", {
360
+ children: [/* @__PURE__ */ T("svg", {
359
361
  width: 20,
360
362
  height: 20,
361
363
  viewBox: "0 0 20 20",
362
364
  className: "shrink-0 -rotate-90",
363
365
  "aria-hidden": "true",
364
- children: [/* @__PURE__ */ C("circle", {
366
+ children: [/* @__PURE__ */ w("circle", {
365
367
  cx: 20 / 2,
366
368
  cy: 20 / 2,
367
369
  r: 9,
@@ -369,18 +371,18 @@ var z = 5e3, B = S.memo(function({ data: e, blockId: t, confidence: n, onAction:
369
371
  stroke: "currentColor",
370
372
  strokeWidth: 2,
371
373
  opacity: .2
372
- }), /* @__PURE__ */ C(O.circle, {
374
+ }), /* @__PURE__ */ w(k.circle, {
373
375
  cx: 20 / 2,
374
376
  cy: 20 / 2,
375
377
  r: 9,
376
378
  fill: "none",
377
379
  stroke: "currentColor",
378
380
  strokeWidth: 2,
379
- strokeDasharray: g,
380
- initial: c ? void 0 : { strokeDashoffset: 0 },
381
- animate: { strokeDashoffset: g },
382
- transition: c ? { duration: 0 } : {
383
- duration: l / 1e3,
381
+ strokeDasharray: h,
382
+ initial: o ? void 0 : { strokeDashoffset: 0 },
383
+ animate: { strokeDashoffset: h },
384
+ transition: o ? { duration: 0 } : {
385
+ duration: c / 1e3,
384
386
  ease: "linear"
385
387
  }
386
388
  })]
@@ -390,6 +392,6 @@ var z = 5e3, B = S.memo(function({ data: e, blockId: t, confidence: n, onAction:
390
392
  })]
391
393
  });
392
394
  });
393
- B.displayName = "SuccessBlock";
395
+ V.displayName = "SuccessBlock";
394
396
  //#endregion
395
- export { N as a, P as i, R as n, M as o, L as r, j as s, B as t };
397
+ export { P as a, F as i, z as n, N as o, R as r, M as s, V as t };
@@ -1 +1 @@
1
- {"version":3,"file":"success.js","names":[],"sources":["../../src/ai/blocks/block-table.tsx","../../src/ai/blocks/confirm.tsx","../../src/ai/blocks/divider.tsx","../../src/ai/blocks/info.tsx","../../src/ai/blocks/loading.tsx","../../src/ai/blocks/stat-row.tsx","../../src/ai/blocks/success.tsx"],"sourcesContent":["'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { Badge } from '../../ui/badge'\nimport { springs } from '../../ui/lib/motion'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../../ui/table'\nimport type { BlockComponentProps, BlockTableColumn,BlockTableData } from '../types'\n\ntype SortDir = 'asc' | 'desc' | null\n\nfunction renderCellValue(value: unknown, column: BlockTableColumn) {\n if (column.variant === 'badge') {\n if (value && typeof value === 'object' && 'label' in value) {\n const badgeObj = value as { label: string; color: string }\n return (\n <Badge variant=\"subtle\" size=\"sm\" color={badgeObj.color as 'default'}>\n {badgeObj.label}\n </Badge>\n )\n }\n return (\n <Badge variant=\"subtle\" size=\"sm\">\n {String(value ?? '')}\n </Badge>\n )\n }\n\n return String(value ?? '')\n}\n\nfunction sortRows(\n rows: Record<string, unknown>[],\n sortKey: string | null,\n sortDir: SortDir,\n): Record<string, unknown>[] {\n if (!sortKey || !sortDir) return rows\n return [...rows].sort((a, b) => {\n const aVal = a[sortKey]\n const bVal = b[sortKey]\n const aStr = String(aVal ?? '')\n const bStr = String(bVal ?? '')\n const aNum = Number(aVal)\n const bNum = Number(bVal)\n\n // If both are numeric, sort numerically\n if (!Number.isNaN(aNum) && !Number.isNaN(bNum)) {\n return sortDir === 'asc' ? aNum - bNum : bNum - aNum\n }\n\n // Otherwise sort lexicographically\n const cmp = aStr.localeCompare(bStr)\n return sortDir === 'asc' ? cmp : -cmp\n })\n}\n\nconst BlockTable = React.memo(function BlockTable({\n data,\n confidence,\n}: BlockComponentProps<BlockTableData>) {\n const { reducedMotion } = useMotion()\n const [sortKey, setSortKey] = React.useState<string | null>(null)\n const [sortDir, setSortDir] = React.useState<SortDir>(null)\n\n const handleHeaderClick = React.useCallback(\n (key: string) => {\n if (!data.sortable) return\n if (sortKey !== key) {\n setSortKey(key)\n setSortDir('asc')\n } else if (sortDir === 'asc') {\n setSortDir('desc')\n } else if (sortDir === 'desc') {\n setSortKey(null)\n setSortDir(null)\n }\n },\n [data.sortable, sortKey, sortDir],\n )\n\n const columns = data.columns ?? []\n const sortedRows = sortRows(data.rows ?? [], sortKey, sortDir)\n\n return (\n <div\n className={cn(\n 'overflow-x-auto',\n confidence === 'low' && 'border-l-2 border-warning-7 pl-3',\n )}\n >\n <Table>\n {data.caption && <TableCaption>{data.caption}</TableCaption>}\n <TableHeader>\n <TableRow>\n {columns.map((col) => {\n const isSorted = sortKey === col.key\n const ariaSort = data.sortable\n ? isSorted\n ? sortDir === 'asc'\n ? ('ascending' as const)\n : ('descending' as const)\n : ('none' as const)\n : undefined\n\n return (\n <TableHead\n key={col.key}\n role=\"columnheader\"\n className={cn(\n col.variant === 'number' && 'text-right',\n data.sortable && 'cursor-pointer select-none',\n )}\n tabIndex={data.sortable ? 0 : undefined}\n onClick={\n data.sortable\n ? () => handleHeaderClick(col.key)\n : undefined\n }\n onKeyDown={\n data.sortable\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleHeaderClick(col.key)\n }\n }\n : undefined\n }\n aria-sort={ariaSort}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSorted && sortDir === 'asc' && (\n <span aria-hidden=\"true\">&#9650;</span>\n )}\n {isSorted && sortDir === 'desc' && (\n <span aria-hidden=\"true\">&#9660;</span>\n )}\n </span>\n </TableHead>\n )\n })}\n </TableRow>\n </TableHeader>\n <TableBody>\n {sortedRows.map((row, rowIndex) => {\n const rowKey =\n typeof row.id === 'string' || typeof row.id === 'number'\n ? String(row.id)\n : `row-${rowIndex}`\n\n const RowWrapper = reducedMotion ? 'tr' : motion.tr\n\n const motionProps = reducedMotion\n ? {}\n : {\n initial: { opacity: 0, y: 6 } as const,\n animate: { opacity: 1, y: 0 } as const,\n transition: { ...springs.responsive, delay: rowIndex * 0.03 },\n }\n\n return (\n <RowWrapper\n key={rowKey}\n className=\"hover:bg-surface-raised-hover transition-colors\"\n {...motionProps}\n >\n {columns.map((col) => (\n <TableCell\n key={col.key}\n className={cn(\n 'text-ds-sm py-ds-02b px-ds-04',\n col.variant === 'number' &&\n 'text-right tabular-nums font-medium',\n )}\n >\n {renderCellValue(row[col.key], col)}\n </TableCell>\n ))}\n </RowWrapper>\n )\n })}\n </TableBody>\n </Table>\n </div>\n )\n})\n\nBlockTable.displayName = 'BlockTable'\n\nexport { BlockTable }\n","'use client'\n\nimport * as React from 'react'\n\nimport { Button } from '../../ui/button'\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../../ui/collapsible'\nimport { cn } from '../../ui/lib/utils'\nimport type { BlockComponentProps, ConfirmBlockData } from '../types'\n\nconst ConfirmBlock = React.memo(function ConfirmBlock({\n data,\n confidence,\n onAction,\n}: BlockComponentProps<ConfirmBlockData>) {\n const handleConfirm = React.useCallback(() => {\n onAction?.(data.actionId, 'confirm')\n }, [data.actionId, onAction])\n\n const handleCancel = React.useCallback(() => {\n onAction?.(data.actionId, 'cancel')\n }, [data.actionId, onAction])\n\n return (\n <div\n className={cn(\n confidence === 'low' && 'border-l-2 border-warning-7 pl-3',\n )}\n >\n {data.description && (\n <p className=\"text-ds-sm text-surface-fg-muted mb-3\">\n {data.description}\n </p>\n )}\n\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"solid\"\n color={data.destructive ? 'error' : undefined}\n onClick={handleConfirm}\n >\n {data.label}\n </Button>\n <Button variant=\"ghost\" onClick={handleCancel}>\n Cancel\n </Button>\n </div>\n\n {data.rationale && (\n <Collapsible className=\"mt-3\">\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"text-ds-xs text-surface-fg-subtle underline cursor-pointer\"\n >\n Why this action?\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <p className=\"text-ds-sm text-surface-fg-muted mt-2 p-3 bg-surface-raised rounded-surface\">\n {data.rationale}\n </p>\n </CollapsibleContent>\n </Collapsible>\n )}\n </div>\n )\n})\n\nConfirmBlock.displayName = 'ConfirmBlock'\n\nexport { ConfirmBlock }\n","'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { tweens } from '../../ui/lib/motion'\nimport { Separator } from '../../ui/separator'\nimport type { BlockComponentProps } from '../types'\n\nconst DividerBlock = React.memo(function DividerBlock(\n _props: BlockComponentProps<Record<string, never>>,\n) {\n const { reducedMotion } = useMotion()\n\n if (reducedMotion) {\n return <Separator />\n }\n\n return (\n <motion.div\n initial={{ scaleX: 0 }}\n animate={{ scaleX: 1 }}\n style={{ originX: 0.5 }}\n transition={tweens.elegant}\n >\n <Separator />\n </motion.div>\n )\n})\n\nDividerBlock.displayName = 'DividerBlock'\n\nexport { DividerBlock }\n","'use client'\n\nimport * as React from 'react'\n\nimport { Alert } from '../../ui/alert'\nimport type { BlockComponentProps } from '../types'\n\nconst InfoBlock = React.memo(function InfoBlock({\n data,\n}: BlockComponentProps<{ message: string }>) {\n return (\n <Alert color=\"info\" variant=\"subtle\" role=\"status\">\n {data.message}\n </Alert>\n )\n})\n\nInfoBlock.displayName = 'InfoBlock'\n\nexport { InfoBlock }\n","'use client'\n\nimport {\n IconCircle,\n IconCircleCheck,\n IconCircleX,\n} from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { Icon } from '../../ui/icon'\nimport { durations } from '../../ui/lib/motion'\nimport { cn } from '../../ui/lib/utils'\nimport { Skeleton } from '../../ui/skeleton'\nimport type { BlockComponentProps, LoadingBlockData, ProcessingStep } from '../types'\n\n/** Spinning indicator for active steps */\nfunction StepSpinner() {\n return (\n <motion.span\n className=\"inline-block h-4 w-4 rounded-pill border-2 border-current border-t-transparent text-accent-9\"\n animate={{ rotate: 360 }}\n transition={{ repeat: Infinity, duration: 1, ease: 'linear' }}\n aria-hidden=\"true\"\n data-testid=\"step-spinner\"\n />\n )\n}\n\n/** Icon for a processing step based on its status */\nfunction StepIcon({ status }: { status: ProcessingStep['status'] }) {\n switch (status) {\n case 'done':\n return (\n <span data-testid=\"step-icon-done\">\n <Icon icon={IconCircleCheck} size=\"sm\" className=\"text-success-11\" />\n </span>\n )\n case 'active':\n return <StepSpinner />\n case 'error':\n return (\n <span data-testid=\"step-icon-error\">\n <Icon icon={IconCircleX} size=\"sm\" className=\"text-error-11\" />\n </span>\n )\n case 'pending':\n default:\n return (\n <span data-testid=\"step-icon-pending\">\n <Icon icon={IconCircle} size=\"sm\" className=\"text-surface-fg-subtle opacity-50\" />\n </span>\n )\n }\n}\n\nconst LoadingBlock = React.memo(function LoadingBlock({\n data,\n}: BlockComponentProps<LoadingBlockData>) {\n const { reducedMotion } = useMotion()\n const isReduced = reducedMotion\n\n // Mode A: Skeleton lines\n if (data.lines != null) {\n const lineCount = Math.max(1, data.lines)\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n className=\"flex flex-col gap-2\"\n >\n {Array.from({ length: lineCount }).map((_, i) => (\n <Skeleton\n key={i}\n animation=\"shimmer\"\n className={cn(\n 'h-4',\n i === lineCount - 1 ? 'w-3/5' : 'w-full',\n )}\n />\n ))}\n <span className=\"sr-only\">Loading</span>\n </div>\n )\n }\n\n // Mode B: Processing steps\n if (data.steps) {\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Processing\"\n className=\"flex flex-col gap-2\"\n >\n {data.steps.map((step, index) => (\n <motion.div\n key={step.id}\n className=\"flex items-center gap-2\"\n initial={isReduced ? undefined : { opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={\n isReduced\n ? { duration: 0 }\n : { duration: durations.moderate01b, delay: index * 0.06 }\n }\n >\n <StepIcon status={step.status} />\n <span\n className={cn(\n 'text-ds-sm',\n step.status === 'done' || step.status === 'active'\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {step.label}\n </span>\n </motion.div>\n ))}\n <span className=\"sr-only\">Processing</span>\n </div>\n )\n }\n\n // Fallback: empty status container\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading\">\n <span className=\"sr-only\">Loading</span>\n </div>\n )\n})\n\nLoadingBlock.displayName = 'LoadingBlock'\n\nexport { LoadingBlock }\n","'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { springs } from '../../ui/lib/motion'\nimport { StatCard } from '../../ui/stat-card'\nimport type { BlockComponentProps, StatRowBlockData } from '../types'\n\nconst StatRowBlock = React.memo(function StatRowBlock({\n data,\n}: BlockComponentProps<StatRowBlockData>) {\n const { reducedMotion } = useMotion()\n const stats = data.stats ?? []\n\n if (stats.length === 0) return null\n\n return (\n <div className=\"flex flex-wrap gap-ds-05\">\n {stats.map((stat, index) => {\n const delta = stat.change\n ? {\n value: stat.change.value,\n direction: stat.change.direction,\n }\n : undefined\n\n if (reducedMotion) {\n return (\n <div key={stat.label} className=\"flex-1 min-w-[140px]\">\n <StatCard\n label={stat.label}\n value={stat.value}\n delta={delta}\n />\n </div>\n )\n }\n\n return (\n <motion.div\n key={stat.label}\n className=\"flex-1 min-w-[140px]\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ ...springs.responsive, delay: index * 0.08 }}\n >\n <StatCard\n label={stat.label}\n value={stat.value}\n delta={delta}\n />\n </motion.div>\n )\n })}\n </div>\n )\n})\n\nStatRowBlock.displayName = 'StatRowBlock'\n\nexport { StatRowBlock }\n","'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { Alert } from '../../ui/alert'\nimport { Button } from '../../ui/button'\nimport { cn } from '../../ui/lib/utils'\nimport type { BlockComponentProps, SuccessBlockData } from '../types'\n\nconst DEFAULT_UNDO_TIMEOUT = 5000\n\nconst SuccessBlock = React.memo(function SuccessBlock({\n data,\n blockId,\n confidence,\n onAction,\n}: BlockComponentProps<SuccessBlockData>) {\n const { reducedMotion } = useMotion()\n const isReduced = reducedMotion\n const undoTimeout = data.undoTimeout ?? DEFAULT_UNDO_TIMEOUT\n const [remaining, setRemaining] = React.useState(undoTimeout)\n const [showUndo, setShowUndo] = React.useState(!!data.undoable)\n\n React.useEffect(() => {\n if (!data.undoable) return\n\n const interval = setInterval(() => {\n setRemaining((prev) => {\n const next = prev - 100\n if (next <= 0) {\n clearInterval(interval)\n setShowUndo(false)\n return 0\n }\n return next\n })\n }, 100)\n\n return () => clearInterval(interval)\n }, [data.undoable, undoTimeout])\n\n const handleUndo = React.useCallback(() => {\n onAction?.(blockId || 'unknown', 'undo')\n }, [blockId, onAction])\n\n const remainingSeconds = Math.ceil(remaining / 1000)\n\n // Countdown ring dimensions\n const ringSize = 20\n const ringStroke = 2\n const ringRadius = (ringSize - ringStroke) / 2\n const ringCircumference = 2 * Math.PI * ringRadius\n\n return (\n <div\n className={cn(\n confidence === 'low' && 'border-l-2 border-warning-7 pl-3',\n )}\n >\n <Alert\n color=\"success\"\n variant=\"subtle\"\n title={data.title}\n >\n {data.message}\n </Alert>\n\n {showUndo && data.undoable && (\n <div className=\"mt-2 flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleUndo}\n aria-label={`Undo action, ${remainingSeconds} seconds remaining`}\n >\n <span className=\"flex items-center gap-1.5\">\n <svg\n width={ringSize}\n height={ringSize}\n viewBox={`0 0 ${ringSize} ${ringSize}`}\n className=\"shrink-0 -rotate-90\"\n aria-hidden=\"true\"\n >\n <circle\n cx={ringSize / 2}\n cy={ringSize / 2}\n r={ringRadius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={ringStroke}\n opacity={0.2}\n />\n <motion.circle\n cx={ringSize / 2}\n cy={ringSize / 2}\n r={ringRadius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={ringStroke}\n strokeDasharray={ringCircumference}\n initial={isReduced ? undefined : { strokeDashoffset: 0 }}\n animate={{\n strokeDashoffset: ringCircumference,\n }}\n transition={\n isReduced\n ? { duration: 0 }\n : {\n duration: undoTimeout / 1000,\n ease: 'linear',\n }\n }\n />\n </svg>\n Undo\n </span>\n </Button>\n </div>\n )}\n\n </div>\n )\n})\n\nSuccessBlock.displayName = 'SuccessBlock'\n\nexport { SuccessBlock }\n"],"mappings":";;;;;;;;;;;;;;;;;AAsBA,SAAS,EAAgB,GAAgB,GAA0B;AACjE,KAAI,EAAO,YAAY,SAAS;AAC9B,MAAI,KAAS,OAAO,KAAU,YAAY,WAAW,GAAO;GAC1D,IAAM,IAAW;AACjB,UACE,kBAAC,GAAD;IAAO,SAAQ;IAAS,MAAK;IAAK,OAAO,EAAS;cAC/C,EAAS;IACJ,CAAA;;AAGZ,SACE,kBAAC,GAAD;GAAO,SAAQ;GAAS,MAAK;aAC1B,OAAO,KAAS,GAAG;GACd,CAAA;;AAIZ,QAAO,OAAO,KAAS,GAAG;;AAG5B,SAAS,EACP,GACA,GACA,GAC2B;AAE3B,QADI,CAAC,KAAW,CAAC,IAAgB,IAC1B,CAAC,GAAG,EAAK,CAAC,MAAM,GAAG,MAAM;EAC9B,IAAM,IAAO,EAAE,IACT,IAAO,EAAE,IACT,IAAO,OAAO,KAAQ,GAAG,EACzB,IAAO,OAAO,KAAQ,GAAG,EACzB,IAAO,OAAO,EAAK,EACnB,IAAO,OAAO,EAAK;AAGzB,MAAI,CAAC,OAAO,MAAM,EAAK,IAAI,CAAC,OAAO,MAAM,EAAK,CAC5C,QAAO,MAAY,QAAQ,IAAO,IAAO,IAAO;EAIlD,IAAM,IAAM,EAAK,cAAc,EAAK;AACpC,SAAO,MAAY,QAAQ,IAAM,CAAC;GAClC;;AAGJ,IAAM,IAAa,EAAM,KAAK,SAAoB,EAChD,SACA,iBACsC;CACtC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,CAAC,GAAS,KAAc,EAAM,SAAwB,KAAK,EAC3D,CAAC,GAAS,KAAc,EAAM,SAAkB,KAAK,EAErD,IAAoB,EAAM,aAC7B,MAAgB;AACV,IAAK,aACN,MAAY,IAGL,MAAY,QACrB,EAAW,OAAO,GACT,MAAY,WACrB,EAAW,KAAK,EAChB,EAAW,KAAK,KANhB,EAAW,EAAI,EACf,EAAW,MAAM;IAQrB;EAAC,EAAK;EAAU;EAAS;EAAQ,CAClC,EAEK,IAAU,EAAK,WAAW,EAAE,EAC5B,IAAa,EAAS,EAAK,QAAQ,EAAE,EAAE,GAAS,EAAQ;AAE9D,QACE,kBAAC,OAAD;EACE,WAAW,EACT,mBACA,MAAe,SAAS,mCACzB;YAED,kBAAC,GAAD,EAAA,UAAA;GACG,EAAK,WAAW,kBAAC,GAAD,EAAA,UAAe,EAAK,SAAuB,CAAA;GAC5D,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,MAAQ;IACpB,IAAM,IAAW,MAAY,EAAI,KAC3B,IAAW,EAAK,WAClB,IACE,MAAY,QACT,cACA,eACF,SACH,KAAA;AAEJ,WACE,kBAAC,GAAD;KAEE,MAAK;KACL,WAAW,EACT,EAAI,YAAY,YAAY,cAC5B,EAAK,YAAY,6BAClB;KACD,UAAU,EAAK,WAAW,IAAI,KAAA;KAC9B,SACE,EAAK,iBACK,EAAkB,EAAI,IAAI,GAChC,KAAA;KAEN,WACE,EAAK,YACA,MAA2B;AAC1B,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,EAAkB,EAAI,IAAI;SAG9B,KAAA;KAEN,aAAW;eAEX,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACG,EAAI;OACJ,KAAY,MAAY,SACvB,kBAAC,QAAD;QAAM,eAAY;kBAAO;QAAc,CAAA;OAExC,KAAY,MAAY,UACvB,kBAAC,QAAD;QAAM,eAAY;kBAAO;QAAc,CAAA;OAEpC;;KACG,EAjCL,EAAI,IAiCC;KAEd,EACO,CAAA,EACC,CAAA;GACd,kBAAC,GAAD,EAAA,UACG,EAAW,KAAK,GAAK,MAAa;IACjC,IAAM,IACJ,OAAO,EAAI,MAAO,YAAY,OAAO,EAAI,MAAO,WAC5C,OAAO,EAAI,GAAG,GACd,OAAO;AAYb,WACE,kBAXiB,IAAgB,OAAO,EAAO,IAW/C;KAEE,WAAU;KACV,GAZgB,IAChB,EAAE,GACF;MACE,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG;MAC7B,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG;MAC7B,YAAY;OAAE,GAAG,EAAQ;OAAY,OAAO,IAAW;OAAM;MAC9D;eAQA,EAAQ,KAAK,MACZ,kBAAC,GAAD;MAEE,WAAW,EACT,iCACA,EAAI,YAAY,YACd,sCACH;gBAEA,EAAgB,EAAI,EAAI,MAAM,EAAI;MACzB,EARL,EAAI,IAQC,CACZ;KACS,EAhBN,EAgBM;KAEf,EACQ,CAAA;GACN,EAAA,CAAA;EACJ,CAAA;EAER;AAEF,EAAW,cAAc;;;AC1LzB,IAAM,IAAe,EAAM,KAAK,SAAsB,EACpD,SACA,eACA,eACwC;CACxC,IAAM,IAAgB,EAAM,kBAAkB;AAC5C,MAAW,EAAK,UAAU,UAAU;IACnC,CAAC,EAAK,UAAU,EAAS,CAAC,EAEvB,IAAe,EAAM,kBAAkB;AAC3C,MAAW,EAAK,UAAU,SAAS;IAClC,CAAC,EAAK,UAAU,EAAS,CAAC;AAE7B,QACE,kBAAC,OAAD;EACE,WAAW,EACT,MAAe,SAAS,mCACzB;YAHH;GAKG,EAAK,eACJ,kBAAC,KAAD;IAAG,WAAU;cACV,EAAK;IACJ,CAAA;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,SAAQ;KACR,OAAO,EAAK,cAAc,UAAU,KAAA;KACpC,SAAS;eAER,EAAK;KACC,CAAA,EACT,kBAAC,GAAD;KAAQ,SAAQ;KAAQ,SAAS;eAAc;KAEtC,CAAA,CACL;;GAEL,EAAK,aACJ,kBAAC,GAAD;IAAa,WAAU;cAAvB,CACE,kBAAC,GAAD;KAAoB,SAAA;eAClB,kBAAC,UAAD;MACE,MAAK;MACL,WAAU;gBACX;MAEQ,CAAA;KACU,CAAA,EACrB,kBAAC,GAAD,EAAA,UACE,kBAAC,KAAD;KAAG,WAAU;eACV,EAAK;KACJ,CAAA,EACe,CAAA,CACT;;GAEZ;;EAER;AAEF,EAAa,cAAc;;;AC9D3B,IAAM,IAAe,EAAM,KAAK,SAC9B,GACA;CACA,IAAM,EAAE,qBAAkB,GAAW;AAMrC,QAJI,IACK,kBAAC,GAAD,EAAa,CAAA,GAIpB,kBAAC,EAAO,KAAR;EACE,SAAS,EAAE,QAAQ,GAAG;EACtB,SAAS,EAAE,QAAQ,GAAG;EACtB,OAAO,EAAE,SAAS,IAAK;EACvB,YAAY,EAAO;YAEnB,kBAAC,GAAD,EAAa,CAAA;EACF,CAAA;EAEf;AAEF,EAAa,cAAc;;;ACxB3B,IAAM,IAAY,EAAM,KAAK,SAAmB,EAC9C,WAC2C;AAC3C,QACE,kBAAC,GAAD;EAAO,OAAM;EAAO,SAAQ;EAAS,MAAK;YACvC,EAAK;EACA,CAAA;EAEV;AAEF,EAAU,cAAc;;;ACCxB,SAAS,IAAc;AACrB,QACE,kBAAC,EAAO,MAAR;EACE,WAAU;EACV,SAAS,EAAE,QAAQ,KAAK;EACxB,YAAY;GAAE,QAAQ;GAAU,UAAU;GAAG,MAAM;GAAU;EAC7D,eAAY;EACZ,eAAY;EACZ,CAAA;;AAKN,SAAS,EAAS,EAAE,aAAgD;AAClE,SAAQ,GAAR;EACE,KAAK,OACH,QACE,kBAAC,QAAD;GAAM,eAAY;aAChB,kBAAC,GAAD;IAAM,MAAM;IAAiB,MAAK;IAAK,WAAU;IAAoB,CAAA;GAChE,CAAA;EAEX,KAAK,SACH,QAAO,kBAAC,GAAD,EAAe,CAAA;EACxB,KAAK,QACH,QACE,kBAAC,QAAD;GAAM,eAAY;aAChB,kBAAC,GAAD;IAAM,MAAM;IAAa,MAAK;IAAK,WAAU;IAAkB,CAAA;GAC1D,CAAA;EAGX,QACE,QACE,kBAAC,QAAD;GAAM,eAAY;aAChB,kBAAC,GAAD;IAAM,MAAM;IAAY,MAAK;IAAK,WAAU;IAAsC,CAAA;GAC7E,CAAA;;;AAKf,IAAM,IAAe,EAAM,KAAK,SAAsB,EACpD,WACwC;CACxC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,IAAY;AAGlB,KAAI,EAAK,SAAS,MAAM;EACtB,IAAM,IAAY,KAAK,IAAI,GAAG,EAAK,MAAM;AACzC,SACE,kBAAC,OAAD;GACE,MAAK;GACL,aAAU;GACV,cAAW;GACX,WAAU;aAJZ,CAMG,MAAM,KAAK,EAAE,QAAQ,GAAW,CAAC,CAAC,KAAK,GAAG,MACzC,kBAAC,GAAD;IAEE,WAAU;IACV,WAAW,EACT,OACA,MAAM,IAAY,IAAI,UAAU,SACjC;IACD,EANK,EAML,CACF,EACF,kBAAC,QAAD;IAAM,WAAU;cAAU;IAAc,CAAA,CACpC;;;AA4CV,QAvCI,EAAK,QAEL,kBAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cAAW;EACX,WAAU;YAJZ,CAMG,EAAK,MAAM,KAAK,GAAM,MACrB,kBAAC,EAAO,KAAR;GAEE,WAAU;GACV,SAAS,IAAY,KAAA,IAAY;IAAE,SAAS;IAAG,GAAG;IAAI;GACtD,SAAS;IAAE,SAAS;IAAG,GAAG;IAAG;GAC7B,YACE,IACI,EAAE,UAAU,GAAG,GACf;IAAE,UAAU,EAAU;IAAa,OAAO,IAAQ;IAAM;aARhE,CAWE,kBAAC,GAAD,EAAU,QAAQ,EAAK,QAAU,CAAA,EACjC,kBAAC,QAAD;IACE,WAAW,EACT,cACA,EAAK,WAAW,UAAU,EAAK,WAAW,WACtC,oBACA,yBACL;cAEA,EAAK;IACD,CAAA,CACI;KArBN,EAAK,GAqBC,CACb,EACF,kBAAC,QAAD;GAAM,WAAU;aAAU;GAAiB,CAAA,CACvC;MAMR,kBAAC,OAAD;EAAK,MAAK;EAAS,aAAU;EAAO,cAAW;YAC7C,kBAAC,QAAD;GAAM,WAAU;aAAU;GAAc,CAAA;EACpC,CAAA;EAER;AAEF,EAAa,cAAc;;;AC7H3B,IAAM,IAAe,EAAM,KAAK,SAAsB,EACpD,WACwC;CACxC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,IAAQ,EAAK,SAAS,EAAE;AAI9B,QAFI,EAAM,WAAW,IAAU,OAG7B,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAM,KAAK,GAAM,MAAU;GAC1B,IAAM,IAAQ,EAAK,SACf;IACE,OAAO,EAAK,OAAO;IACnB,WAAW,EAAK,OAAO;IACxB,GACD,KAAA;AAcJ,UAZI,IAEA,kBAAC,OAAD;IAAsB,WAAU;cAC9B,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,OAAO,EAAK;KACL;KACP,CAAA;IACE,EANI,EAAK,MAMT,GAKR,kBAAC,EAAO,KAAR;IAEE,WAAU;IACV,SAAS;KAAE,SAAS;KAAG,GAAG;KAAG;IAC7B,SAAS;KAAE,SAAS;KAAG,GAAG;KAAG;IAC7B,YAAY;KAAE,GAAG,EAAQ;KAAY,OAAO,IAAQ;KAAM;cAE1D,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,OAAO,EAAK;KACL;KACP,CAAA;IACS,EAXN,EAAK,MAWC;IAEf;EACE,CAAA;EAER;AAEF,EAAa,cAAc;;;ACjD3B,IAAM,IAAuB,KAEvB,IAAe,EAAM,KAAK,SAAsB,EACpD,SACA,YACA,eACA,eACwC;CACxC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,IAAY,GACZ,IAAc,EAAK,eAAe,GAClC,CAAC,GAAW,KAAgB,EAAM,SAAS,EAAY,EACvD,CAAC,GAAU,KAAe,EAAM,SAAS,CAAC,CAAC,EAAK,SAAS;AAE/D,GAAM,gBAAgB;AACpB,MAAI,CAAC,EAAK,SAAU;EAEpB,IAAM,IAAW,kBAAkB;AACjC,MAAc,MAAS;IACrB,IAAM,IAAO,IAAO;AAMpB,WALI,KAAQ,KACV,cAAc,EAAS,EACvB,EAAY,GAAM,EACX,KAEF;KACP;KACD,IAAI;AAEP,eAAa,cAAc,EAAS;IACnC,CAAC,EAAK,UAAU,EAAY,CAAC;CAEhC,IAAM,IAAa,EAAM,kBAAkB;AACzC,MAAW,KAAW,WAAW,OAAO;IACvC,CAAC,GAAS,EAAS,CAAC,EAEjB,IAAmB,KAAK,KAAK,IAAY,IAAK,EAM9C,IAAoB,IAAI,KAAK,KAAK;AAExC,QACE,kBAAC,OAAD;EACE,WAAW,EACT,MAAe,SAAS,mCACzB;YAHH,CAKE,kBAAC,GAAD;GACE,OAAM;GACN,SAAQ;GACR,OAAO,EAAK;aAEX,EAAK;GACA,CAAA,EAEP,KAAY,EAAK,YAChB,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,SAAS;IACT,cAAY,gBAAgB,EAAiB;cAE7C,kBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,OAAD;MACE,OAAO;MACP,QAAQ;MACR,SAAS;MACT,WAAU;MACV,eAAY;gBALd,CAOE,kBAAC,UAAD;OACE,IAAI,KAAW;OACf,IAAI,KAAW;OACf,GAAG;OACH,MAAK;OACL,QAAO;OACP,aAAa;OACb,SAAS;OACT,CAAA,EACF,kBAAC,EAAO,QAAR;OACE,IAAI,KAAW;OACf,IAAI,KAAW;OACf,GAAG;OACH,MAAK;OACL,QAAO;OACP,aAAa;OACb,iBAAiB;OACjB,SAAS,IAAY,KAAA,IAAY,EAAE,kBAAkB,GAAG;OACxD,SAAS,EACP,kBAAkB,GACnB;OACD,YACE,IACI,EAAE,UAAU,GAAG,GACf;QACE,UAAU,IAAc;QACxB,MAAM;QACP;OAEP,CAAA,CACE;gBAED;;IACA,CAAA;GACL,CAAA,CAGJ;;EAER;AAEF,EAAa,cAAc"}
1
+ {"version":3,"file":"success.js","names":[],"sources":["../../src/ai/blocks/block-table.tsx","../../src/ai/blocks/confirm.tsx","../../src/ai/blocks/divider.tsx","../../src/ai/blocks/info.tsx","../../src/ai/blocks/loading.tsx","../../src/ai/blocks/stat-row.tsx","../../src/ai/blocks/success.tsx"],"sourcesContent":["'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { Badge } from '../../ui/badge'\nimport { springs } from '../../ui/lib/motion'\nimport { cn } from '../../ui/lib/utils'\nimport {\n Table,\n TableBody,\n TableCaption,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../../ui/table'\nimport type { BlockComponentProps, BlockTableColumn,BlockTableData } from '../types'\nimport { BlockShell } from './block-shell'\n\ntype SortDir = 'asc' | 'desc' | null\n\nfunction renderCellValue(value: unknown, column: BlockTableColumn) {\n if (column.variant === 'badge') {\n if (value && typeof value === 'object' && 'label' in value) {\n const badgeObj = value as { label: string; color: string }\n return (\n <Badge variant=\"subtle\" size=\"sm\" color={badgeObj.color as 'default'}>\n {badgeObj.label}\n </Badge>\n )\n }\n return (\n <Badge variant=\"subtle\" size=\"sm\">\n {String(value ?? '')}\n </Badge>\n )\n }\n\n return String(value ?? '')\n}\n\nfunction sortRows(\n rows: Record<string, unknown>[],\n sortKey: string | null,\n sortDir: SortDir,\n): Record<string, unknown>[] {\n if (!sortKey || !sortDir) return rows\n return [...rows].sort((a, b) => {\n const aVal = a[sortKey]\n const bVal = b[sortKey]\n const aStr = String(aVal ?? '')\n const bStr = String(bVal ?? '')\n const aNum = Number(aVal)\n const bNum = Number(bVal)\n\n // If both are numeric, sort numerically\n if (!Number.isNaN(aNum) && !Number.isNaN(bNum)) {\n return sortDir === 'asc' ? aNum - bNum : bNum - aNum\n }\n\n // Otherwise sort lexicographically\n const cmp = aStr.localeCompare(bStr)\n return sortDir === 'asc' ? cmp : -cmp\n })\n}\n\nconst BlockTable = React.memo(function BlockTable({\n data,\n confidence,\n}: BlockComponentProps<BlockTableData>) {\n const { reducedMotion } = useMotion()\n const [sortKey, setSortKey] = React.useState<string | null>(null)\n const [sortDir, setSortDir] = React.useState<SortDir>(null)\n\n const handleHeaderClick = React.useCallback(\n (key: string) => {\n if (!data.sortable) return\n if (sortKey !== key) {\n setSortKey(key)\n setSortDir('asc')\n } else if (sortDir === 'asc') {\n setSortDir('desc')\n } else if (sortDir === 'desc') {\n setSortKey(null)\n setSortDir(null)\n }\n },\n [data.sortable, sortKey, sortDir],\n )\n\n const columns = data.columns ?? []\n const sortedRows = sortRows(data.rows ?? [], sortKey, sortDir)\n\n return (\n <BlockShell confidence={confidence} className=\"overflow-x-auto\">\n <Table>\n {data.caption && <TableCaption>{data.caption}</TableCaption>}\n <TableHeader>\n <TableRow>\n {columns.map((col) => {\n const isSorted = sortKey === col.key\n const ariaSort = data.sortable\n ? isSorted\n ? sortDir === 'asc'\n ? ('ascending' as const)\n : ('descending' as const)\n : ('none' as const)\n : undefined\n\n return (\n <TableHead\n key={col.key}\n role=\"columnheader\"\n className={cn(\n col.variant === 'number' && 'text-right',\n data.sortable && 'cursor-pointer select-none',\n )}\n tabIndex={data.sortable ? 0 : undefined}\n onClick={\n data.sortable\n ? () => handleHeaderClick(col.key)\n : undefined\n }\n onKeyDown={\n data.sortable\n ? (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleHeaderClick(col.key)\n }\n }\n : undefined\n }\n aria-sort={ariaSort}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSorted && sortDir === 'asc' && (\n <span aria-hidden=\"true\">&#9650;</span>\n )}\n {isSorted && sortDir === 'desc' && (\n <span aria-hidden=\"true\">&#9660;</span>\n )}\n </span>\n </TableHead>\n )\n })}\n </TableRow>\n </TableHeader>\n <TableBody>\n {sortedRows.map((row, rowIndex) => {\n const rowKey =\n typeof row.id === 'string' || typeof row.id === 'number'\n ? String(row.id)\n : `row-${rowIndex}`\n\n const RowWrapper = reducedMotion ? 'tr' : motion.tr\n\n const motionProps = reducedMotion\n ? {}\n : {\n initial: { opacity: 0, y: 6 } as const,\n animate: { opacity: 1, y: 0 } as const,\n transition: { ...springs.responsive, delay: rowIndex * 0.03 },\n }\n\n return (\n <RowWrapper\n key={rowKey}\n className=\"hover:bg-surface-raised-hover transition-colors\"\n {...motionProps}\n >\n {columns.map((col) => (\n <TableCell\n key={col.key}\n className={cn(\n 'text-ds-sm py-ds-02b px-ds-04',\n col.variant === 'number' &&\n 'text-right tabular-nums font-medium',\n )}\n >\n {renderCellValue(row[col.key], col)}\n </TableCell>\n ))}\n </RowWrapper>\n )\n })}\n </TableBody>\n </Table>\n </BlockShell>\n )\n})\n\nBlockTable.displayName = 'BlockTable'\n\nexport { BlockTable }\n","'use client'\n\nimport * as React from 'react'\n\nimport { Button } from '../../ui/button'\nimport {\n Collapsible,\n CollapsibleContent,\n CollapsibleTrigger,\n} from '../../ui/collapsible'\nimport type { BlockComponentProps, ConfirmBlockData } from '../types'\nimport { BlockShell } from './block-shell'\n\nconst ConfirmBlock = React.memo(function ConfirmBlock({\n data,\n confidence,\n onAction,\n}: BlockComponentProps<ConfirmBlockData>) {\n const handleConfirm = React.useCallback(() => {\n onAction?.(data.actionId, 'confirm')\n }, [data.actionId, onAction])\n\n const handleCancel = React.useCallback(() => {\n onAction?.(data.actionId, 'cancel')\n }, [data.actionId, onAction])\n\n return (\n <BlockShell confidence={confidence}>\n {data.description && (\n <p className=\"text-ds-sm text-surface-fg-muted mb-3\">\n {data.description}\n </p>\n )}\n\n <div className=\"flex items-center gap-3\">\n <Button\n variant=\"solid\"\n color={data.destructive ? 'error' : undefined}\n onClick={handleConfirm}\n >\n {data.label}\n </Button>\n <Button variant=\"ghost\" onClick={handleCancel}>\n Cancel\n </Button>\n </div>\n\n {data.rationale && (\n <Collapsible className=\"mt-3\">\n <CollapsibleTrigger asChild>\n <button\n type=\"button\"\n className=\"text-ds-xs text-surface-fg-subtle underline cursor-pointer\"\n >\n Why this action?\n </button>\n </CollapsibleTrigger>\n <CollapsibleContent>\n <p className=\"text-ds-sm text-surface-fg-muted mt-2 p-3 bg-surface-raised rounded-surface\">\n {data.rationale}\n </p>\n </CollapsibleContent>\n </Collapsible>\n )}\n </BlockShell>\n )\n})\n\nConfirmBlock.displayName = 'ConfirmBlock'\n\nexport { ConfirmBlock }\n","'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { tweens } from '../../ui/lib/motion'\nimport { Separator } from '../../ui/separator'\nimport type { BlockComponentProps } from '../types'\n\nconst DividerBlock = React.memo(function DividerBlock(\n _props: BlockComponentProps<Record<string, never>>,\n) {\n const { reducedMotion } = useMotion()\n\n if (reducedMotion) {\n return <Separator />\n }\n\n return (\n <motion.div\n initial={{ scaleX: 0 }}\n animate={{ scaleX: 1 }}\n style={{ originX: 0.5 }}\n transition={tweens.elegant}\n >\n <Separator />\n </motion.div>\n )\n})\n\nDividerBlock.displayName = 'DividerBlock'\n\nexport { DividerBlock }\n","'use client'\n\nimport * as React from 'react'\n\nimport { Alert } from '../../ui/alert'\nimport type { BlockComponentProps } from '../types'\n\nconst InfoBlock = React.memo(function InfoBlock({\n data,\n}: BlockComponentProps<{ message: string }>) {\n return (\n <Alert color=\"info\" variant=\"subtle\" role=\"status\">\n {data.message}\n </Alert>\n )\n})\n\nInfoBlock.displayName = 'InfoBlock'\n\nexport { InfoBlock }\n","'use client'\n\nimport {\n IconCircle,\n IconCircleCheck,\n IconCircleX,\n} from '@tabler/icons-react'\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { Icon } from '../../ui/icon'\nimport { durations } from '../../ui/lib/motion'\nimport { cn } from '../../ui/lib/utils'\nimport { Skeleton } from '../../ui/skeleton'\nimport type { BlockComponentProps, LoadingBlockData, ProcessingStep } from '../types'\n\n/** Spinning indicator for active steps */\nfunction StepSpinner() {\n return (\n <motion.span\n className=\"inline-block h-4 w-4 rounded-pill border-2 border-current border-t-transparent text-accent-9\"\n animate={{ rotate: 360 }}\n transition={{ repeat: Infinity, duration: 1, ease: 'linear' }}\n aria-hidden=\"true\"\n data-testid=\"step-spinner\"\n />\n )\n}\n\n/** Icon for a processing step based on its status */\nfunction StepIcon({ status }: { status: ProcessingStep['status'] }) {\n switch (status) {\n case 'done':\n return (\n <span data-testid=\"step-icon-done\">\n <Icon icon={IconCircleCheck} size=\"sm\" className=\"text-success-11\" />\n </span>\n )\n case 'active':\n return <StepSpinner />\n case 'error':\n return (\n <span data-testid=\"step-icon-error\">\n <Icon icon={IconCircleX} size=\"sm\" className=\"text-error-11\" />\n </span>\n )\n case 'pending':\n default:\n return (\n <span data-testid=\"step-icon-pending\">\n <Icon icon={IconCircle} size=\"sm\" className=\"text-surface-fg-subtle opacity-50\" />\n </span>\n )\n }\n}\n\nconst LoadingBlock = React.memo(function LoadingBlock({\n data,\n}: BlockComponentProps<LoadingBlockData>) {\n const { reducedMotion } = useMotion()\n const isReduced = reducedMotion\n\n // Mode A: Skeleton lines\n if (data.lines != null) {\n const lineCount = Math.max(1, data.lines)\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n className=\"flex flex-col gap-2\"\n >\n {Array.from({ length: lineCount }).map((_, i) => (\n <Skeleton\n key={i}\n animation=\"shimmer\"\n className={cn(\n 'h-4',\n i === lineCount - 1 ? 'w-3/5' : 'w-full',\n )}\n />\n ))}\n <span className=\"sr-only\">Loading</span>\n </div>\n )\n }\n\n // Mode B: Processing steps\n if (data.steps) {\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Processing\"\n className=\"flex flex-col gap-2\"\n >\n {data.steps.map((step, index) => (\n <motion.div\n key={step.id}\n className=\"flex items-center gap-2\"\n initial={isReduced ? undefined : { opacity: 0, x: -8 }}\n animate={{ opacity: 1, x: 0 }}\n transition={\n isReduced\n ? { duration: 0 }\n : { duration: durations.moderate01b, delay: index * 0.06 }\n }\n >\n <StepIcon status={step.status} />\n <span\n className={cn(\n 'text-ds-sm',\n step.status === 'done' || step.status === 'active'\n ? 'text-surface-fg'\n : 'text-surface-fg-subtle',\n )}\n >\n {step.label}\n </span>\n </motion.div>\n ))}\n <span className=\"sr-only\">Processing</span>\n </div>\n )\n }\n\n // Fallback: empty status container\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading\">\n <span className=\"sr-only\">Loading</span>\n </div>\n )\n})\n\nLoadingBlock.displayName = 'LoadingBlock'\n\nexport { LoadingBlock }\n","'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { springs } from '../../ui/lib/motion'\nimport { StatCard } from '../../ui/stat-card'\nimport type { BlockComponentProps, StatRowBlockData } from '../types'\n\nconst StatRowBlock = React.memo(function StatRowBlock({\n data,\n}: BlockComponentProps<StatRowBlockData>) {\n const { reducedMotion } = useMotion()\n const stats = data.stats ?? []\n\n if (stats.length === 0) return null\n\n return (\n <div className=\"flex flex-wrap gap-ds-05\">\n {stats.map((stat, index) => {\n const delta = stat.change\n ? {\n value: stat.change.value,\n direction: stat.change.direction,\n }\n : undefined\n\n if (reducedMotion) {\n return (\n <div key={stat.label} className=\"flex-1 min-w-[140px]\">\n <StatCard\n label={stat.label}\n value={stat.value}\n delta={delta}\n />\n </div>\n )\n }\n\n return (\n <motion.div\n key={stat.label}\n className=\"flex-1 min-w-[140px]\"\n initial={{ opacity: 0, y: 8 }}\n animate={{ opacity: 1, y: 0 }}\n transition={{ ...springs.responsive, delay: index * 0.08 }}\n >\n <StatCard\n label={stat.label}\n value={stat.value}\n delta={delta}\n />\n </motion.div>\n )\n })}\n </div>\n )\n})\n\nStatRowBlock.displayName = 'StatRowBlock'\n\nexport { StatRowBlock }\n","'use client'\n\nimport { motion } from 'framer-motion'\nimport * as React from 'react'\n\nimport { useMotion } from '../../motion/motion-provider'\nimport { Alert } from '../../ui/alert'\nimport { Button } from '../../ui/button'\nimport type { BlockComponentProps, SuccessBlockData } from '../types'\nimport { BlockShell } from './block-shell'\n\nconst DEFAULT_UNDO_TIMEOUT = 5000\n\nconst SuccessBlock = React.memo(function SuccessBlock({\n data,\n blockId,\n confidence,\n onAction,\n}: BlockComponentProps<SuccessBlockData>) {\n const { reducedMotion } = useMotion()\n const isReduced = reducedMotion\n const undoTimeout = data.undoTimeout ?? DEFAULT_UNDO_TIMEOUT\n const [remaining, setRemaining] = React.useState(undoTimeout)\n const [showUndo, setShowUndo] = React.useState(!!data.undoable)\n\n React.useEffect(() => {\n if (!data.undoable) return\n\n const interval = setInterval(() => {\n setRemaining((prev) => {\n const next = prev - 100\n if (next <= 0) {\n clearInterval(interval)\n setShowUndo(false)\n return 0\n }\n return next\n })\n }, 100)\n\n return () => clearInterval(interval)\n }, [data.undoable, undoTimeout])\n\n const handleUndo = React.useCallback(() => {\n onAction?.(blockId || 'unknown', 'undo')\n }, [blockId, onAction])\n\n const remainingSeconds = Math.ceil(remaining / 1000)\n\n // Countdown ring dimensions\n const ringSize = 20\n const ringStroke = 2\n const ringRadius = (ringSize - ringStroke) / 2\n const ringCircumference = 2 * Math.PI * ringRadius\n\n return (\n <BlockShell confidence={confidence}>\n <Alert\n color=\"success\"\n variant=\"subtle\"\n title={data.title}\n >\n {data.message}\n </Alert>\n\n {showUndo && data.undoable && (\n <div className=\"mt-2 flex items-center gap-2\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleUndo}\n aria-label={`Undo action, ${remainingSeconds} seconds remaining`}\n >\n <span className=\"flex items-center gap-1.5\">\n <svg\n width={ringSize}\n height={ringSize}\n viewBox={`0 0 ${ringSize} ${ringSize}`}\n className=\"shrink-0 -rotate-90\"\n aria-hidden=\"true\"\n >\n <circle\n cx={ringSize / 2}\n cy={ringSize / 2}\n r={ringRadius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={ringStroke}\n opacity={0.2}\n />\n <motion.circle\n cx={ringSize / 2}\n cy={ringSize / 2}\n r={ringRadius}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={ringStroke}\n strokeDasharray={ringCircumference}\n initial={isReduced ? undefined : { strokeDashoffset: 0 }}\n animate={{\n strokeDashoffset: ringCircumference,\n }}\n transition={\n isReduced\n ? { duration: 0 }\n : {\n duration: undoTimeout / 1000,\n ease: 'linear',\n }\n }\n />\n </svg>\n Undo\n </span>\n </Button>\n </div>\n )}\n\n </BlockShell>\n )\n})\n\nSuccessBlock.displayName = 'SuccessBlock'\n\nexport { SuccessBlock }\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuBA,SAAS,EAAgB,GAAgB,GAA0B;AACjE,KAAI,EAAO,YAAY,SAAS;AAC9B,MAAI,KAAS,OAAO,KAAU,YAAY,WAAW,GAAO;GAC1D,IAAM,IAAW;AACjB,UACE,kBAAC,GAAD;IAAO,SAAQ;IAAS,MAAK;IAAK,OAAO,EAAS;cAC/C,EAAS;IACJ,CAAA;;AAGZ,SACE,kBAAC,GAAD;GAAO,SAAQ;GAAS,MAAK;aAC1B,OAAO,KAAS,GAAG;GACd,CAAA;;AAIZ,QAAO,OAAO,KAAS,GAAG;;AAG5B,SAAS,EACP,GACA,GACA,GAC2B;AAE3B,QADI,CAAC,KAAW,CAAC,IAAgB,IAC1B,CAAC,GAAG,EAAK,CAAC,MAAM,GAAG,MAAM;EAC9B,IAAM,IAAO,EAAE,IACT,IAAO,EAAE,IACT,IAAO,OAAO,KAAQ,GAAG,EACzB,IAAO,OAAO,KAAQ,GAAG,EACzB,IAAO,OAAO,EAAK,EACnB,IAAO,OAAO,EAAK;AAGzB,MAAI,CAAC,OAAO,MAAM,EAAK,IAAI,CAAC,OAAO,MAAM,EAAK,CAC5C,QAAO,MAAY,QAAQ,IAAO,IAAO,IAAO;EAIlD,IAAM,IAAM,EAAK,cAAc,EAAK;AACpC,SAAO,MAAY,QAAQ,IAAM,CAAC;GAClC;;AAGJ,IAAM,IAAa,EAAM,KAAK,SAAoB,EAChD,SACA,iBACsC;CACtC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,CAAC,GAAS,KAAc,EAAM,SAAwB,KAAK,EAC3D,CAAC,GAAS,KAAc,EAAM,SAAkB,KAAK,EAErD,IAAoB,EAAM,aAC7B,MAAgB;AACV,IAAK,aACN,MAAY,IAGL,MAAY,QACrB,EAAW,OAAO,GACT,MAAY,WACrB,EAAW,KAAK,EAChB,EAAW,KAAK,KANhB,EAAW,EAAI,EACf,EAAW,MAAM;IAQrB;EAAC,EAAK;EAAU;EAAS;EAAQ,CAClC,EAEK,IAAU,EAAK,WAAW,EAAE,EAC5B,IAAa,EAAS,EAAK,QAAQ,EAAE,EAAE,GAAS,EAAQ;AAE9D,QACE,kBAAC,GAAD;EAAwB;EAAY,WAAU;YAC5C,kBAAC,GAAD,EAAA,UAAA;GACG,EAAK,WAAW,kBAAC,GAAD,EAAA,UAAe,EAAK,SAAuB,CAAA;GAC5D,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UACG,EAAQ,KAAK,MAAQ;IACpB,IAAM,IAAW,MAAY,EAAI,KAC3B,IAAW,EAAK,WAClB,IACE,MAAY,QACT,cACA,eACF,SACH,KAAA;AAEJ,WACE,kBAAC,GAAD;KAEE,MAAK;KACL,WAAW,EACT,EAAI,YAAY,YAAY,cAC5B,EAAK,YAAY,6BAClB;KACD,UAAU,EAAK,WAAW,IAAI,KAAA;KAC9B,SACE,EAAK,iBACK,EAAkB,EAAI,IAAI,GAChC,KAAA;KAEN,WACE,EAAK,YACA,MAA2B;AAC1B,OAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,SACjC,EAAE,gBAAgB,EAClB,EAAkB,EAAI,IAAI;SAG9B,KAAA;KAEN,aAAW;eAEX,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACG,EAAI;OACJ,KAAY,MAAY,SACvB,kBAAC,QAAD;QAAM,eAAY;kBAAO;QAAc,CAAA;OAExC,KAAY,MAAY,UACvB,kBAAC,QAAD;QAAM,eAAY;kBAAO;QAAc,CAAA;OAEpC;;KACG,EAjCL,EAAI,IAiCC;KAEd,EACO,CAAA,EACC,CAAA;GACd,kBAAC,GAAD,EAAA,UACG,EAAW,KAAK,GAAK,MAAa;IACjC,IAAM,IACJ,OAAO,EAAI,MAAO,YAAY,OAAO,EAAI,MAAO,WAC5C,OAAO,EAAI,GAAG,GACd,OAAO;AAYb,WACE,kBAXiB,IAAgB,OAAO,EAAO,IAW/C;KAEE,WAAU;KACV,GAZgB,IAChB,EAAE,GACF;MACE,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG;MAC7B,SAAS;OAAE,SAAS;OAAG,GAAG;OAAG;MAC7B,YAAY;OAAE,GAAG,EAAQ;OAAY,OAAO,IAAW;OAAM;MAC9D;eAQA,EAAQ,KAAK,MACZ,kBAAC,GAAD;MAEE,WAAW,EACT,iCACA,EAAI,YAAY,YACd,sCACH;gBAEA,EAAgB,EAAI,EAAI,MAAM,EAAI;MACzB,EARL,EAAI,IAQC,CACZ;KACS,EAhBN,EAgBM;KAEf,EACQ,CAAA;GACN,EAAA,CAAA;EACG,CAAA;EAEf;AAEF,EAAW,cAAc;;;ACtLzB,IAAM,IAAe,EAAM,KAAK,SAAsB,EACpD,SACA,eACA,eACwC;CACxC,IAAM,IAAgB,EAAM,kBAAkB;AAC5C,MAAW,EAAK,UAAU,UAAU;IACnC,CAAC,EAAK,UAAU,EAAS,CAAC,EAEvB,IAAe,EAAM,kBAAkB;AAC3C,MAAW,EAAK,UAAU,SAAS;IAClC,CAAC,EAAK,UAAU,EAAS,CAAC;AAE7B,QACE,kBAAC,GAAD;EAAwB;YAAxB;GACG,EAAK,eACJ,kBAAC,KAAD;IAAG,WAAU;cACV,EAAK;IACJ,CAAA;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD;KACE,SAAQ;KACR,OAAO,EAAK,cAAc,UAAU,KAAA;KACpC,SAAS;eAER,EAAK;KACC,CAAA,EACT,kBAAC,GAAD;KAAQ,SAAQ;KAAQ,SAAS;eAAc;KAEtC,CAAA,CACL;;GAEL,EAAK,aACJ,kBAAC,GAAD;IAAa,WAAU;cAAvB,CACE,kBAAC,GAAD;KAAoB,SAAA;eAClB,kBAAC,UAAD;MACE,MAAK;MACL,WAAU;gBACX;MAEQ,CAAA;KACU,CAAA,EACrB,kBAAC,GAAD,EAAA,UACE,kBAAC,KAAD;KAAG,WAAU;eACV,EAAK;KACJ,CAAA,EACe,CAAA,CACT;;GAEL;;EAEf;AAEF,EAAa,cAAc;;;AC1D3B,IAAM,IAAe,EAAM,KAAK,SAC9B,GACA;CACA,IAAM,EAAE,qBAAkB,GAAW;AAMrC,QAJI,IACK,kBAAC,GAAD,EAAa,CAAA,GAIpB,kBAAC,EAAO,KAAR;EACE,SAAS,EAAE,QAAQ,GAAG;EACtB,SAAS,EAAE,QAAQ,GAAG;EACtB,OAAO,EAAE,SAAS,IAAK;EACvB,YAAY,EAAO;YAEnB,kBAAC,GAAD,EAAa,CAAA;EACF,CAAA;EAEf;AAEF,EAAa,cAAc;;;ACxB3B,IAAM,IAAY,EAAM,KAAK,SAAmB,EAC9C,WAC2C;AAC3C,QACE,kBAAC,GAAD;EAAO,OAAM;EAAO,SAAQ;EAAS,MAAK;YACvC,EAAK;EACA,CAAA;EAEV;AAEF,EAAU,cAAc;;;ACCxB,SAAS,IAAc;AACrB,QACE,kBAAC,EAAO,MAAR;EACE,WAAU;EACV,SAAS,EAAE,QAAQ,KAAK;EACxB,YAAY;GAAE,QAAQ;GAAU,UAAU;GAAG,MAAM;GAAU;EAC7D,eAAY;EACZ,eAAY;EACZ,CAAA;;AAKN,SAAS,EAAS,EAAE,aAAgD;AAClE,SAAQ,GAAR;EACE,KAAK,OACH,QACE,kBAAC,QAAD;GAAM,eAAY;aAChB,kBAAC,GAAD;IAAM,MAAM;IAAiB,MAAK;IAAK,WAAU;IAAoB,CAAA;GAChE,CAAA;EAEX,KAAK,SACH,QAAO,kBAAC,GAAD,EAAe,CAAA;EACxB,KAAK,QACH,QACE,kBAAC,QAAD;GAAM,eAAY;aAChB,kBAAC,GAAD;IAAM,MAAM;IAAa,MAAK;IAAK,WAAU;IAAkB,CAAA;GAC1D,CAAA;EAGX,QACE,QACE,kBAAC,QAAD;GAAM,eAAY;aAChB,kBAAC,GAAD;IAAM,MAAM;IAAY,MAAK;IAAK,WAAU;IAAsC,CAAA;GAC7E,CAAA;;;AAKf,IAAM,IAAe,EAAM,KAAK,SAAsB,EACpD,WACwC;CACxC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,IAAY;AAGlB,KAAI,EAAK,SAAS,MAAM;EACtB,IAAM,IAAY,KAAK,IAAI,GAAG,EAAK,MAAM;AACzC,SACE,kBAAC,OAAD;GACE,MAAK;GACL,aAAU;GACV,cAAW;GACX,WAAU;aAJZ,CAMG,MAAM,KAAK,EAAE,QAAQ,GAAW,CAAC,CAAC,KAAK,GAAG,MACzC,kBAAC,GAAD;IAEE,WAAU;IACV,WAAW,EACT,OACA,MAAM,IAAY,IAAI,UAAU,SACjC;IACD,EANK,EAML,CACF,EACF,kBAAC,QAAD;IAAM,WAAU;cAAU;IAAc,CAAA,CACpC;;;AA4CV,QAvCI,EAAK,QAEL,kBAAC,OAAD;EACE,MAAK;EACL,aAAU;EACV,cAAW;EACX,WAAU;YAJZ,CAMG,EAAK,MAAM,KAAK,GAAM,MACrB,kBAAC,EAAO,KAAR;GAEE,WAAU;GACV,SAAS,IAAY,KAAA,IAAY;IAAE,SAAS;IAAG,GAAG;IAAI;GACtD,SAAS;IAAE,SAAS;IAAG,GAAG;IAAG;GAC7B,YACE,IACI,EAAE,UAAU,GAAG,GACf;IAAE,UAAU,EAAU;IAAa,OAAO,IAAQ;IAAM;aARhE,CAWE,kBAAC,GAAD,EAAU,QAAQ,EAAK,QAAU,CAAA,EACjC,kBAAC,QAAD;IACE,WAAW,EACT,cACA,EAAK,WAAW,UAAU,EAAK,WAAW,WACtC,oBACA,yBACL;cAEA,EAAK;IACD,CAAA,CACI;KArBN,EAAK,GAqBC,CACb,EACF,kBAAC,QAAD;GAAM,WAAU;aAAU;GAAiB,CAAA,CACvC;MAMR,kBAAC,OAAD;EAAK,MAAK;EAAS,aAAU;EAAO,cAAW;YAC7C,kBAAC,QAAD;GAAM,WAAU;aAAU;GAAc,CAAA;EACpC,CAAA;EAER;AAEF,EAAa,cAAc;;;AC7H3B,IAAM,IAAe,EAAM,KAAK,SAAsB,EACpD,WACwC;CACxC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,IAAQ,EAAK,SAAS,EAAE;AAI9B,QAFI,EAAM,WAAW,IAAU,OAG7B,kBAAC,OAAD;EAAK,WAAU;YACZ,EAAM,KAAK,GAAM,MAAU;GAC1B,IAAM,IAAQ,EAAK,SACf;IACE,OAAO,EAAK,OAAO;IACnB,WAAW,EAAK,OAAO;IACxB,GACD,KAAA;AAcJ,UAZI,IAEA,kBAAC,OAAD;IAAsB,WAAU;cAC9B,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,OAAO,EAAK;KACL;KACP,CAAA;IACE,EANI,EAAK,MAMT,GAKR,kBAAC,EAAO,KAAR;IAEE,WAAU;IACV,SAAS;KAAE,SAAS;KAAG,GAAG;KAAG;IAC7B,SAAS;KAAE,SAAS;KAAG,GAAG;KAAG;IAC7B,YAAY;KAAE,GAAG,EAAQ;KAAY,OAAO,IAAQ;KAAM;cAE1D,kBAAC,GAAD;KACE,OAAO,EAAK;KACZ,OAAO,EAAK;KACL;KACP,CAAA;IACS,EAXN,EAAK,MAWC;IAEf;EACE,CAAA;EAER;AAEF,EAAa,cAAc;;;ACjD3B,IAAM,IAAuB,KAEvB,IAAe,EAAM,KAAK,SAAsB,EACpD,SACA,YACA,eACA,eACwC;CACxC,IAAM,EAAE,qBAAkB,GAAW,EAC/B,IAAY,GACZ,IAAc,EAAK,eAAe,GAClC,CAAC,GAAW,KAAgB,EAAM,SAAS,EAAY,EACvD,CAAC,GAAU,KAAe,EAAM,SAAS,CAAC,CAAC,EAAK,SAAS;AAE/D,GAAM,gBAAgB;AACpB,MAAI,CAAC,EAAK,SAAU;EAEpB,IAAM,IAAW,kBAAkB;AACjC,MAAc,MAAS;IACrB,IAAM,IAAO,IAAO;AAMpB,WALI,KAAQ,KACV,cAAc,EAAS,EACvB,EAAY,GAAM,EACX,KAEF;KACP;KACD,IAAI;AAEP,eAAa,cAAc,EAAS;IACnC,CAAC,EAAK,UAAU,EAAY,CAAC;CAEhC,IAAM,IAAa,EAAM,kBAAkB;AACzC,MAAW,KAAW,WAAW,OAAO;IACvC,CAAC,GAAS,EAAS,CAAC,EAEjB,IAAmB,KAAK,KAAK,IAAY,IAAK,EAM9C,IAAoB,IAAI,KAAK,KAAK;AAExC,QACE,kBAAC,GAAD;EAAwB;YAAxB,CACE,kBAAC,GAAD;GACE,OAAM;GACN,SAAQ;GACR,OAAO,EAAK;aAEX,EAAK;GACA,CAAA,EAEP,KAAY,EAAK,YAChB,kBAAC,OAAD;GAAK,WAAU;aACb,kBAAC,GAAD;IACE,SAAQ;IACR,MAAK;IACL,SAAS;IACT,cAAY,gBAAgB,EAAiB;cAE7C,kBAAC,QAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,OAAD;MACE,OAAO;MACP,QAAQ;MACR,SAAS;MACT,WAAU;MACV,eAAY;gBALd,CAOE,kBAAC,UAAD;OACE,IAAI,KAAW;OACf,IAAI,KAAW;OACf,GAAG;OACH,MAAK;OACL,QAAO;OACP,aAAa;OACb,SAAS;OACT,CAAA,EACF,kBAAC,EAAO,QAAR;OACE,IAAI,KAAW;OACf,IAAI,KAAW;OACf,GAAG;OACH,MAAK;OACL,QAAO;OACP,aAAa;OACb,iBAAiB;OACjB,SAAS,IAAY,KAAA,IAAY,EAAE,kBAAkB,GAAG;OACxD,SAAS,EACP,kBAAkB,GACnB;OACD,YACE,IACI,EAAE,UAAU,GAAG,GACf;QACE,UAAU,IAAc;QACxB,MAAM;QACP;OAEP,CAAA,CACE;gBAED;;IACA,CAAA;GACL,CAAA,CAGG;;EAEf;AAEF,EAAa,cAAc"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import * as React from 'react';
3
+ export interface BlockShellProps {
4
+ confidence?: 'high' | 'medium' | 'low';
5
+ className?: string;
6
+ children: React.ReactNode;
7
+ }
8
+ /**
9
+ * Shared wrapper for AI block renderers. Owns the low-confidence treatment so it
10
+ * lives in ONE place instead of a copy-pasted rail across every block.
11
+ *
12
+ * Low confidence = a faint warning wash (`bg-warning-2`, the DS "Subtle
13
+ * background" step) + a "Low confidence" chip pinned top-right. NOT a colored
14
+ * left rail (the AI tell removed from Card in v0.44.0). `pt-ds-07` reserves
15
+ * clearance so the chip never overlaps content in prose/table blocks.
16
+ */
17
+ declare const BlockShell: React.MemoExoticComponent<({ confidence, className, children, }: BlockShellProps) => import("react/jsx-runtime").JSX.Element>;
18
+ export { BlockShell };
19
+ //# sourceMappingURL=block-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-shell.d.ts","sourceRoot":"","sources":["../../../src/ai/blocks/block-shell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAK9B,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B;AAED;;;;;;;;GAQG;AACH,QAAA,MAAM,UAAU,mEAIb,eAAe,6CAmBhB,CAAA;AAIF,OAAO,EAAE,UAAU,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"block-table.d.ts","sourceRoot":"","sources":["../../../src/ai/blocks/block-table.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B,OAAO,KAAK,EAAE,mBAAmB,EAAmB,cAAc,EAAE,MAAM,UAAU,CAAA;AAiDpF,QAAA,MAAM,UAAU,oDAGb,mBAAmB,CAAC,cAAc,CAAC,6CA+HpC,CAAA;AAIF,OAAO,EAAE,UAAU,EAAE,CAAA"}
1
+ {"version":3,"file":"block-table.d.ts","sourceRoot":"","sources":["../../../src/ai/blocks/block-table.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAe9B,OAAO,KAAK,EAAE,mBAAmB,EAAmB,cAAc,EAAE,MAAM,UAAU,CAAA;AAkDpF,QAAA,MAAM,UAAU,oDAGb,mBAAmB,CAAC,cAAc,CAAC,6CA0HpC,CAAA;AAIF,OAAO,EAAE,UAAU,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../src/ai/blocks/confirm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAS9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAErE,QAAA,MAAM,YAAY,8DAIf,mBAAmB,CAAC,gBAAgB,CAAC,6CAqDtC,CAAA;AAIF,OAAO,EAAE,YAAY,EAAE,CAAA"}
1
+ {"version":3,"file":"confirm.d.ts","sourceRoot":"","sources":["../../../src/ai/blocks/confirm.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAQ9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAGrE,QAAA,MAAM,YAAY,8DAIf,mBAAmB,CAAC,gBAAgB,CAAC,6CAiDtC,CAAA;AAIF,OAAO,EAAE,YAAY,EAAE,CAAA"}