@reforma/components 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -35,13 +35,19 @@ interface SortableListBaseProps<T> {
35
35
  items: readonly T[];
36
36
  getKey?: (item: T, path: readonly number[]) => string;
37
37
  getTextValue: (item: T) => string;
38
- onChange: (items: T[]) => void;
38
+ /** `move` is the dragged item and its index among its new siblings. */
39
+ onChange: (items: T[], move: {
40
+ item: T;
41
+ index: number;
42
+ }) => void;
39
43
  children: (item: T, props: SortableListItemRenderProps<T>) => ReactNode;
40
44
  canDrop?: (context: SortableListDropContext<T>) => boolean;
41
45
  getDragHandleOptions?: (item: T, context: SortableListItemContext<T>) => SortableListDragHandleOptions;
42
46
  className?: string;
43
47
  gap?: 'sm' | 'md';
44
48
  nestedGap?: 'sm' | 'md';
49
+ /** `false` drops the grip: the whole item starts a drag. Default `true`. */
50
+ handle?: boolean;
45
51
  'aria-label': string;
46
52
  }
47
53
  interface FlatSortableListProps {
@@ -56,12 +62,12 @@ interface NestedSortableListProps<T> {
56
62
  }
57
63
  export type SortableListProps<T> = SortableListBaseProps<T> & (FlatSortableListProps | NestedSortableListProps<T>);
58
64
  /**
59
- * Sortable collection with a dedicated pointer handle and optional child groups.
65
+ * Sortable collection with a pointer handle (or whole-item drag) and optional child groups.
60
66
  *
61
67
  * The rendered item is the complete draggable surface. Child collections can
62
68
  * accept moves when the caller's drop rules allow it.
63
69
  */
64
- export declare function SortableList<T>({ items, getKey: getItemKey, getTextValue, getChildren, setChildren, canHaveChildren, onChange, children, canDrop, getDragHandleOptions, className, gap, nestedGap, 'aria-label': ariaLabel, }: SortableListProps<T>): import("react").JSX.Element;
70
+ export declare function SortableList<T>({ items, getKey: getItemKey, getTextValue, getChildren, setChildren, canHaveChildren, onChange, children, canDrop, getDragHandleOptions, className, gap, nestedGap, handle, 'aria-label': ariaLabel, }: SortableListProps<T>): import("react").JSX.Element;
65
71
  export declare namespace SortableList {
66
72
  var displayName: string;
67
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SortableList.d.ts","sourceRoot":"","sources":["../../src/SortableList/SortableList.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SortableList.d.ts","sourceRoot":"","sources":["../../src/SortableList/SortableList.tsx"],"names":[],"mappings":"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"}
@@ -1,192 +1,203 @@
1
- import { DragDropProvider as Z, PointerSensor as G, DragOverlay as ee, useDroppable as ne } from "@dnd-kit/react";
2
- import { isSortable as _, useSortable as te } from "@dnd-kit/react/sortable";
3
- import { DotsDrag as re } from "@reforma/icons/14";
4
- import { cn as ie } from "@reforma/lib";
5
- import { useRef as j, useCallback as oe, useMemo as ae } from "react";
6
- import { For as F } from "../For/For.js";
1
+ import { DragDropProvider as ee, PointerSensor as ne, DragOverlay as te, useDroppable as re } from "@dnd-kit/react";
2
+ import { isSortable as _, useSortable as ie } from "@dnd-kit/react/sortable";
3
+ import { DotsDrag as oe } from "@reforma/icons/14";
4
+ import { cn as ae } from "@reforma/lib";
5
+ import { useCallback as le, useMemo as se, useState as de } from "react";
6
+ import { For as j } from "../For/For.js";
7
+ import { Show as ce } from "../Show/Show.js";
7
8
  import f from "./SortableList.module.css.js";
8
- import { buildSortableTree as le, moveSortableTreeNodeToIndex as se, restoreSortableTree as ce, findSortableTreeNode as $ } from "./sortableTree.js";
9
- import { jsxs as w, jsx as o } from "react/jsx-runtime";
10
- const A = "reforma-sortable:root", D = "reforma-sortable:children:", de = "reforma-sortable:item", ue = "reforma-sortable:collection", fe = [G], me = "sortable:primitive:";
11
- function ge({
9
+ import { buildSortableTree as ue, moveSortableTreeNodeToIndex as fe, restoreSortableTree as me, findSortableTreeNode as $ } from "./sortableTree.js";
10
+ import { jsxs as A, jsx as o } from "react/jsx-runtime";
11
+ const H = "reforma-sortable:root", D = "reforma-sortable:children:", ve = "reforma-sortable:item", pe = "reforma-sortable:collection", ge = [ne], he = "sortable:primitive:", w = /* @__PURE__ */ new WeakMap();
12
+ let F = 0;
13
+ function be({
12
14
  items: e,
13
15
  getKey: n,
14
16
  getTextValue: t,
15
17
  getChildren: r,
16
18
  setChildren: i,
17
19
  canHaveChildren: a,
18
- onChange: u,
19
- children: h,
20
- canDrop: m,
20
+ onChange: c,
21
+ children: m,
22
+ canDrop: v,
21
23
  getDragHandleOptions: x,
22
24
  className: P,
23
- gap: y = "md",
24
- nestedGap: s = y,
25
- "aria-label": S
25
+ gap: b = "md",
26
+ nestedGap: S = b,
27
+ handle: u = !0,
28
+ "aria-label": I
26
29
  }) {
27
- const g = j({
28
- nextId: 0,
29
- objectKeys: /* @__PURE__ */ new WeakMap()
30
- }), T = oe((c, v) => {
31
- const C = n?.(c, v);
32
- if (C != null)
33
- return C;
34
- if (typeof c != "object" || c == null)
35
- return `${me}${v.join(".")}`;
36
- const d = g.current.objectKeys.get(c);
30
+ const y = le((s, g) => {
31
+ const E = n?.(s, g);
32
+ if (E != null)
33
+ return E;
34
+ if (typeof s != "object" || s == null)
35
+ return `${he}${g.join(".")}`;
36
+ const d = w.get(s);
37
37
  if (d)
38
38
  return d;
39
- const b = `sortable:item:${g.current.nextId}`;
40
- return g.current.nextId += 1, g.current.objectKeys.set(c, b), b;
41
- }, [n]), p = ae(() => le(e, {
42
- getKey: T,
39
+ const h = `sortable:item:${F}`;
40
+ return F += 1, w.set(s, h), h;
41
+ }, [n]), p = se(() => ue(e, {
42
+ getKey: y,
43
43
  getTextValue: t,
44
44
  getChildren: r,
45
45
  canHaveChildren: a
46
- }), [a, r, T, t, e]), I = j({
46
+ }), [a, r, y, t, e]), [N, Q] = de({
47
47
  items: e,
48
48
  revision: 0
49
49
  });
50
- I.current.items !== e && (I.current = {
50
+ N.items !== e && Q({
51
51
  items: e,
52
- revision: I.current.revision + 1
52
+ revision: N.revision + 1
53
53
  });
54
- function J(c) {
54
+ function U(s) {
55
55
  const {
56
- canceled: v,
57
- operation: C
58
- } = c, {
56
+ canceled: g,
57
+ operation: E
58
+ } = s, {
59
59
  source: d,
60
- target: b
61
- } = C;
62
- if (v || !d || !_(d))
60
+ target: h
61
+ } = E;
62
+ if (g || !d || !_(d))
63
63
  return;
64
- const E = O(d)?.node;
65
- if (!E)
64
+ const T = O(d)?.node;
65
+ if (!T)
66
66
  return;
67
- const N = q(b), L = N?.kind === "node" ? N.node : null;
67
+ const C = J(h), L = C?.kind === "node" ? C.node : null;
68
68
  let l;
69
- if (N?.kind === "collection" ? l = {
70
- parentNode: N.parentNode,
71
- index: N.parentNode?.children.length ?? p.length,
69
+ if (C?.kind === "collection" ? l = {
70
+ parentNode: C.parentNode,
71
+ index: C.parentNode?.children.length ?? p.length,
72
72
  dropPosition: "end"
73
- } : L && b && _(b) ? l = ve(p, b.group, d.index, L) : l = null, !l)
73
+ } : L && h && _(h) ? l = xe(p, h.group, d.index, L) : l = null, !l)
74
74
  return;
75
- const Q = W(E, l.parentNode, L, l.dropPosition);
76
- if (!X(E, l.parentNode) || m && !m(Q))
75
+ const Z = X(T, l.parentNode, L, l.dropPosition);
76
+ if (!z(T, l.parentNode) || v && !v(Z))
77
77
  return;
78
- const K = V(d.initialGroup), R = l.parentNode?.id ?? null;
78
+ const K = q(d.initialGroup), R = l.parentNode?.id ?? null;
79
79
  if (K !== void 0 && K === R && d.initialIndex === l.index)
80
80
  return;
81
- const U = se(p, E.id, R, l.index);
82
- u(ce(U, i));
81
+ const G = fe(p, T.id, R, l.index);
82
+ c(me(G, i), {
83
+ item: T.value,
84
+ index: l.index
85
+ });
83
86
  }
84
- return /* @__PURE__ */ w(Z, {
85
- sensors: fe,
86
- onDragEnd: J,
87
- children: [/* @__PURE__ */ o(H, {
88
- nodes: p,
89
- rootNodes: p,
90
- parentNode: null,
91
- renderItem: h,
92
- canDrop: m,
93
- getDragHandleOptions: x,
94
- className: P,
95
- gap: y,
96
- nestedGap: s,
97
- ariaLabel: S
98
- }), /* @__PURE__ */ o(ee, {
99
- className: f.dragOverlay,
100
- dropAnimation: {
101
- duration: 160,
102
- easing: "cubic-bezier(0.25, 1, 0.5, 1)"
103
- },
104
- children: (c) => {
105
- const v = O(c)?.node;
106
- return v ? /* @__PURE__ */ o(M, {
107
- node: v,
108
- renderItem: h,
109
- nestedGap: s
110
- }) : null;
111
- }
112
- })]
113
- }, I.current.revision);
87
+ return /* @__PURE__ */ A(
88
+ ee,
89
+ {
90
+ sensors: ge,
91
+ onDragEnd: U,
92
+ children: [/* @__PURE__ */ o(M, {
93
+ nodes: p,
94
+ rootNodes: p,
95
+ parentNode: null,
96
+ renderItem: m,
97
+ canDrop: v,
98
+ getDragHandleOptions: x,
99
+ className: P,
100
+ gap: b,
101
+ nestedGap: S,
102
+ handle: u,
103
+ ariaLabel: I
104
+ }), /* @__PURE__ */ o(te, {
105
+ className: f.dragOverlay,
106
+ dropAnimation: {
107
+ duration: 160,
108
+ easing: "cubic-bezier(0.25, 1, 0.5, 1)"
109
+ },
110
+ children: (s) => {
111
+ const g = O(s)?.node;
112
+ return g ? /* @__PURE__ */ o(Y, {
113
+ node: g,
114
+ renderItem: m,
115
+ nestedGap: S
116
+ }) : null;
117
+ }
118
+ })]
119
+ },
120
+ r ? N.revision : void 0
121
+ );
114
122
  }
115
- function H({
123
+ function M({
116
124
  nodes: e,
117
125
  rootNodes: n,
118
126
  parentNode: t,
119
127
  renderItem: r,
120
128
  canDrop: i,
121
129
  getDragHandleOptions: a,
122
- className: u,
123
- gap: h,
124
- nestedGap: m,
125
- ariaLabel: x
130
+ className: c,
131
+ gap: m,
132
+ nestedGap: v,
133
+ handle: x,
134
+ ariaLabel: P
126
135
  }) {
127
136
  const {
128
- ref: P,
129
- isDropTarget: y
130
- } = ne({
131
- id: be(t),
132
- type: ue,
137
+ ref: b,
138
+ isDropTarget: S
139
+ } = re({
140
+ id: Pe(t),
141
+ type: pe,
133
142
  data: {
134
143
  kind: "collection",
135
144
  parentNode: t
136
145
  },
137
146
  disabled: e.length > 0,
138
147
  collisionPriority: 1,
139
- accept: (s) => B(s, t, null, "end", i)
148
+ accept: (u) => W(u, t, null, "end", i)
140
149
  });
141
150
  return /* @__PURE__ */ o("div", {
142
- ref: P,
151
+ ref: b,
143
152
  role: "list",
144
- className: ie(f.list, u),
145
- "data-gap": h,
146
- "data-drop-target": y || void 0,
147
- "aria-label": x,
148
- children: /* @__PURE__ */ o(F, {
153
+ className: ae(f.list, c),
154
+ "data-gap": m,
155
+ "data-drop-target": S || void 0,
156
+ "aria-label": P,
157
+ children: /* @__PURE__ */ o(j, {
149
158
  each: e,
150
- children: (s) => /* @__PURE__ */ o(pe, {
151
- node: s,
159
+ children: (u) => /* @__PURE__ */ o(Se, {
160
+ node: u,
152
161
  rootNodes: n,
153
162
  renderItem: r,
154
163
  canDrop: i,
155
164
  getDragHandleOptions: a,
156
- nestedGap: m
157
- }, s.id)
165
+ nestedGap: v,
166
+ handle: x
167
+ }, u.id)
158
168
  })
159
169
  });
160
170
  }
161
- function pe({
171
+ function Se({
162
172
  node: e,
163
173
  rootNodes: n,
164
174
  renderItem: t,
165
175
  canDrop: r,
166
176
  getDragHandleOptions: i,
167
- nestedGap: a
177
+ nestedGap: a,
178
+ handle: c
168
179
  }) {
169
- const u = Y(e), {
170
- alignment: h = "center",
171
- edgeOffset: m = "none",
172
- variant: x = "plain"
173
- } = i?.(e.value, u) ?? {}, {
174
- handleRef: P,
175
- ref: y,
176
- targetRef: s,
177
- isDragging: S,
178
- isDropTarget: g
179
- } = te({
180
+ const m = B(e), {
181
+ alignment: v = "center",
182
+ edgeOffset: x = "none",
183
+ variant: P = "plain"
184
+ } = i?.(e.value, m) ?? {}, {
185
+ handleRef: b,
186
+ ref: S,
187
+ targetRef: u,
188
+ isDragging: I,
189
+ isDropTarget: y
190
+ } = ie({
180
191
  id: e.id,
181
192
  index: e.index,
182
- group: z(he(n, e)),
183
- type: de,
193
+ group: V(ye(n, e)),
194
+ type: ve,
184
195
  data: {
185
196
  kind: "node",
186
197
  node: e
187
198
  },
188
- accept: (p) => B(p, e.parent == null ? null : k(n, e), e, "before", r)
189
- }), T = e.canHaveChildren ? /* @__PURE__ */ o(H, {
199
+ accept: (N) => W(N, e.parent == null ? null : k(n, e), e, "before", r)
200
+ }), p = e.canHaveChildren ? /* @__PURE__ */ o(M, {
190
201
  nodes: e.children,
191
202
  rootNodes: n,
192
203
  parentNode: e,
@@ -195,44 +206,48 @@ function pe({
195
206
  getDragHandleOptions: i,
196
207
  gap: a,
197
208
  nestedGap: a,
209
+ handle: c,
198
210
  ariaLabel: `${e.textValue} items`
199
211
  }) : null;
200
- return /* @__PURE__ */ w("div", {
201
- ref: y,
212
+ return /* @__PURE__ */ A("div", {
213
+ ref: S,
202
214
  role: "listitem",
203
215
  className: f.item,
204
216
  "data-level": e.level,
205
- "data-dragging": S || void 0,
206
- "data-drop-target": g || void 0,
217
+ "data-dragging": I || void 0,
218
+ "data-drop-target": y || void 0,
207
219
  children: [/* @__PURE__ */ o("div", {
208
- ref: s,
220
+ ref: u,
209
221
  className: f.dropTarget,
210
222
  "data-container": e.canHaveChildren || void 0,
211
223
  "aria-hidden": !0
212
- }), /* @__PURE__ */ o("span", {
213
- ref: P,
214
- className: f.dragHandle,
215
- "data-alignment": h,
216
- "data-edge-offset": m,
217
- "data-variant": x,
218
- "aria-hidden": !0,
219
- children: /* @__PURE__ */ o(re, {
224
+ }), /* @__PURE__ */ o(ce, {
225
+ when: c,
226
+ children: /* @__PURE__ */ o("span", {
227
+ ref: b,
228
+ className: f.dragHandle,
229
+ "data-alignment": v,
230
+ "data-edge-offset": x,
231
+ "data-variant": P,
220
232
  "aria-hidden": !0,
221
- width: 14,
222
- height: 14
233
+ children: /* @__PURE__ */ o(oe, {
234
+ "aria-hidden": !0,
235
+ width: 14,
236
+ height: 14
237
+ })
223
238
  })
224
239
  }), /* @__PURE__ */ o("div", {
225
240
  className: f.content,
226
241
  children: t(e.value, {
227
- ...u,
228
- nestedItems: T,
229
- isDragging: S,
230
- isDropTarget: g
242
+ ...m,
243
+ nestedItems: p,
244
+ isDragging: I,
245
+ isDropTarget: y
231
246
  })
232
247
  })]
233
248
  });
234
249
  }
235
- function M({
250
+ function Y({
236
251
  node: e,
237
252
  renderItem: n,
238
253
  nestedGap: t
@@ -240,9 +255,9 @@ function M({
240
255
  const r = e.canHaveChildren ? /* @__PURE__ */ o("div", {
241
256
  className: f.previewList,
242
257
  "data-gap": t,
243
- children: /* @__PURE__ */ o(F, {
258
+ children: /* @__PURE__ */ o(j, {
244
259
  each: e.children,
245
- children: (i) => /* @__PURE__ */ o(M, {
260
+ children: (i) => /* @__PURE__ */ o(Y, {
246
261
  node: i,
247
262
  renderItem: n,
248
263
  nestedGap: t
@@ -252,14 +267,14 @@ function M({
252
267
  return /* @__PURE__ */ o("div", {
253
268
  className: f.dragPreviewItem,
254
269
  children: n(e.value, {
255
- ...Y(e),
270
+ ...B(e),
256
271
  nestedItems: r,
257
272
  isDragging: !1,
258
273
  isDropTarget: !1
259
274
  })
260
275
  });
261
276
  }
262
- function Y(e) {
277
+ function B(e) {
263
278
  return {
264
279
  level: e.level,
265
280
  parent: e.parent,
@@ -271,11 +286,11 @@ function Y(e) {
271
286
  canHaveChildren: e.canHaveChildren
272
287
  };
273
288
  }
274
- function B(e, n, t, r, i) {
289
+ function W(e, n, t, r, i) {
275
290
  const a = O(e)?.node;
276
- return !a || !X(a, n) ? !1 : i?.(W(a, n, t, r)) ?? !0;
291
+ return !a || !z(a, n) ? !1 : i?.(X(a, n, t, r)) ?? !0;
277
292
  }
278
- function W(e, n, t, r) {
293
+ function X(e, n, t, r) {
279
294
  return {
280
295
  items: [e.value],
281
296
  target: t?.value ?? null,
@@ -286,36 +301,36 @@ function W(e, n, t, r) {
286
301
  dropPosition: r
287
302
  };
288
303
  }
289
- function X(e, n) {
304
+ function z(e, n) {
290
305
  return n == null || n.id !== e.id && $(e.children, n.id) == null;
291
306
  }
292
- function ve(e, n, t, r) {
293
- const i = V(n);
307
+ function xe(e, n, t, r) {
308
+ const i = q(n);
294
309
  if (i === void 0)
295
310
  return null;
296
311
  const a = i == null ? null : $(e, i);
297
312
  if (i != null && !a)
298
313
  return null;
299
- const u = r != null && t > r.index;
314
+ const c = r != null && t > r.index;
300
315
  return {
301
316
  parentNode: a,
302
317
  index: t,
303
- dropPosition: u ? "after" : "before"
318
+ dropPosition: c ? "after" : "before"
304
319
  };
305
320
  }
306
- function be(e) {
307
- return z(e?.id ?? null);
308
- }
309
- function z(e) {
310
- return e == null ? A : `${D}${e}`;
321
+ function Pe(e) {
322
+ return V(e?.id ?? null);
311
323
  }
312
324
  function V(e) {
313
- if (e === A)
325
+ return e == null ? H : `${D}${e}`;
326
+ }
327
+ function q(e) {
328
+ if (e === H)
314
329
  return null;
315
330
  if (typeof e == "string" && e.startsWith(D))
316
331
  return e.slice(D.length);
317
332
  }
318
- function he(e, n) {
333
+ function ye(e, n) {
319
334
  return k(e, n)?.id ?? null;
320
335
  }
321
336
  function k(e, n) {
@@ -328,7 +343,7 @@ function k(e, n) {
328
343
  }
329
344
  return null;
330
345
  }
331
- function q(e) {
346
+ function J(e) {
332
347
  const n = e?.data;
333
348
  return n?.kind === "node" && "node" in n ? {
334
349
  kind: "node",
@@ -339,11 +354,11 @@ function q(e) {
339
354
  } : null;
340
355
  }
341
356
  function O(e) {
342
- const n = q(e);
357
+ const n = J(e);
343
358
  return n?.kind === "node" ? n : null;
344
359
  }
345
- ge.displayName = "SortableList";
360
+ be.displayName = "SortableList";
346
361
  export {
347
- ge as SortableList
362
+ be as SortableList
348
363
  };
349
364
  //# sourceMappingURL=SortableList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SortableList.js","sources":["../../src/SortableList/SortableList.tsx"],"sourcesContent":["import {\n DragDropProvider,\n DragOverlay,\n PointerSensor,\n useDroppable,\n type DragEndEvent,\n} from '@dnd-kit/react';\nimport { isSortable, useSortable } from '@dnd-kit/react/sortable';\nimport { DotsDrag } from '@reforma/icons/14';\nimport { cn } from '@reforma/lib';\nimport { useCallback, useMemo, useRef } from 'react';\n\nimport { For } from '../For';\nimport styles from './SortableList.module.css';\nimport {\n buildSortableTree,\n findSortableTreeNode,\n moveSortableTreeNodeToIndex,\n restoreSortableTree,\n type SortableTreeNode,\n} from './sortableTree';\n\nimport type { ReactElement, ReactNode } from 'react';\n\nexport type SortableListDragHandleAlignment = 'center' | 'top';\nexport type SortableListDragHandleEdgeOffset = 'none' | 'sm' | 'md';\nexport type SortableListDragHandleVariant = 'plain' | 'surface';\n\nexport interface SortableListDragHandleOptions {\n alignment?: SortableListDragHandleAlignment;\n edgeOffset?: SortableListDragHandleEdgeOffset;\n variant?: SortableListDragHandleVariant;\n}\n\nexport interface SortableListItemContext<T> {\n level: number;\n parent: T | null;\n index: number;\n siblingCount: number;\n isFirst: boolean;\n isLast: boolean;\n hasChildren: boolean;\n canHaveChildren: boolean;\n}\n\nexport interface SortableListItemRenderProps<T> extends SortableListItemContext<T> {\n nestedItems: ReactNode;\n isDragging: boolean;\n isDropTarget: boolean;\n}\n\nexport interface SortableListDropContext<T> {\n items: readonly T[];\n target: T | null;\n sourceParent: T | null;\n sourceLevel: number;\n parent: T | null;\n targetLevel: number;\n dropPosition: 'on' | 'before' | 'after' | 'end';\n}\n\ninterface SortableListBaseProps<T> {\n items: readonly T[];\n getKey?: (item: T, path: readonly number[]) => string;\n getTextValue: (item: T) => string;\n onChange: (items: T[]) => void;\n children: (item: T, props: SortableListItemRenderProps<T>) => ReactNode;\n canDrop?: (context: SortableListDropContext<T>) => boolean;\n getDragHandleOptions?: (\n item: T,\n context: SortableListItemContext<T>\n ) => SortableListDragHandleOptions;\n className?: string;\n gap?: 'sm' | 'md';\n nestedGap?: 'sm' | 'md';\n 'aria-label': string;\n}\n\ninterface FlatSortableListProps {\n getChildren?: never;\n setChildren?: never;\n canHaveChildren?: never;\n}\n\ninterface NestedSortableListProps<T> {\n getChildren: (item: T) => readonly T[];\n setChildren: (item: T, children: T[]) => T;\n canHaveChildren?: (item: T) => boolean;\n}\n\nexport type SortableListProps<T> = SortableListBaseProps<T>\n & (FlatSortableListProps | NestedSortableListProps<T>);\n\ninterface SortableNodeData<T> {\n kind: 'node';\n node: SortableTreeNode<T>;\n}\n\ninterface SortableCollectionData<T> {\n kind: 'collection';\n parentNode: SortableTreeNode<T> | null;\n}\n\ninterface SortableCollectionProps<T> {\n nodes: readonly SortableTreeNode<T>[];\n rootNodes: readonly SortableTreeNode<T>[];\n parentNode: SortableTreeNode<T> | null;\n renderItem: (item: T, props: SortableListItemRenderProps<T>) => ReactNode;\n canDrop?: (context: SortableListDropContext<T>) => boolean;\n getDragHandleOptions?: (\n item: T,\n context: SortableListItemContext<T>\n ) => SortableListDragHandleOptions;\n className?: string;\n gap: 'sm' | 'md';\n nestedGap: 'sm' | 'md';\n ariaLabel: string;\n}\n\ninterface SortableItemProps<T> extends Omit<SortableCollectionProps<T>, 'nodes' | 'className' | 'gap' | 'ariaLabel' | 'parentNode'> {\n node: SortableTreeNode<T>;\n}\n\ninterface SortableDestination<T> {\n parentNode: SortableTreeNode<T> | null;\n index: number;\n dropPosition: 'before' | 'after' | 'end';\n}\n\nconst ROOT_COLLECTION_ID = 'reforma-sortable:root';\nconst CHILD_COLLECTION_PREFIX = 'reforma-sortable:children:';\nconst SORTABLE_ITEM_TYPE = 'reforma-sortable:item';\nconst SORTABLE_COLLECTION_TYPE = 'reforma-sortable:collection';\nconst POINTER_SENSORS = [PointerSensor];\nconst PRIMITIVE_KEY_PREFIX = 'sortable:primitive:';\n\n/**\n * Sortable collection with a dedicated pointer handle and optional child groups.\n *\n * The rendered item is the complete draggable surface. Child collections can\n * accept moves when the caller's drop rules allow it.\n */\nexport function SortableList<T>({\n items,\n getKey: getItemKey,\n getTextValue,\n getChildren,\n setChildren,\n canHaveChildren,\n onChange,\n children,\n canDrop,\n getDragHandleOptions,\n className,\n gap = 'md',\n nestedGap = gap,\n 'aria-label': ariaLabel,\n}: SortableListProps<T>) {\n const keyState = useRef({\n nextId: 0,\n objectKeys: new WeakMap<object, string>(),\n });\n const getNodeKey = useCallback((item: T, path: readonly number[]) => {\n const itemKey = getItemKey?.(item, path);\n\n if (itemKey != null) {\n return itemKey;\n }\n\n if (typeof item !== 'object' || item == null) {\n return `${ PRIMITIVE_KEY_PREFIX }${ path.join('.') }`;\n }\n\n const existingKey = keyState.current.objectKeys.get(item);\n\n if (existingKey) {\n return existingKey;\n }\n\n const key = `sortable:item:${ keyState.current.nextId }`;\n\n keyState.current.nextId += 1;\n keyState.current.objectKeys.set(item, key);\n\n return key;\n }, [getItemKey]);\n const nodes = useMemo(() => buildSortableTree(items, {\n getKey: getNodeKey,\n getTextValue,\n getChildren,\n canHaveChildren,\n }), [canHaveChildren, getChildren, getNodeKey, getTextValue, items]);\n const renderState = useRef({ items, revision: 0 });\n\n if (renderState.current.items !== items) {\n renderState.current = {\n items,\n revision: renderState.current.revision + 1,\n };\n }\n\n function handleDragEnd(event: DragEndEvent) {\n const { canceled, operation } = event;\n const { source, target } = operation;\n\n if (canceled || !source || !isSortable(source)) {\n return;\n }\n\n const sourceNode = nodeData<T>(source)?.node;\n\n if (!sourceNode) {\n return;\n }\n\n const targetData = entityData<T>(target);\n const targetNode = targetData?.kind === 'node' ? targetData.node : null;\n let destination: SortableDestination<T> | null;\n\n if (targetData?.kind === 'collection') {\n destination = {\n parentNode: targetData.parentNode,\n index: targetData.parentNode?.children.length ?? nodes.length,\n dropPosition: 'end' as const,\n };\n }\n else if (targetNode\n && target\n && isSortable(target)) {\n destination = destinationFromSortable(\n nodes,\n target.group,\n source.index,\n targetNode\n );\n }\n else {\n destination = null;\n }\n\n if (!destination) {\n return;\n }\n\n const context = createDropContext(\n sourceNode,\n destination.parentNode,\n targetNode,\n destination.dropPosition\n );\n\n if (!canMoveToParent(sourceNode, destination.parentNode)\n || (canDrop && !canDrop(context))) {\n return;\n }\n\n const initialParentKey = parentKeyFromCollectionId(source.initialGroup);\n const destinationParentKey = destination.parentNode?.id ?? null;\n const isSamePosition = initialParentKey !== undefined\n && initialParentKey === destinationParentKey\n && source.initialIndex === destination.index;\n\n if (isSamePosition) {\n return;\n }\n\n const movedNodes = moveSortableTreeNodeToIndex(\n nodes,\n sourceNode.id,\n destinationParentKey,\n destination.index\n );\n\n onChange(restoreSortableTree(movedNodes, setChildren));\n }\n\n return (\n <DragDropProvider\n key={ renderState.current.revision }\n sensors={ POINTER_SENSORS }\n onDragEnd={ handleDragEnd }\n >\n <SortableCollection\n nodes={ nodes }\n rootNodes={ nodes }\n parentNode={ null }\n renderItem={ children }\n canDrop={ canDrop }\n getDragHandleOptions={ getDragHandleOptions }\n className={ className }\n gap={ gap }\n nestedGap={ nestedGap }\n ariaLabel={ ariaLabel }\n />\n\n <DragOverlay\n className={ styles.dragOverlay }\n dropAnimation={ {\n duration: 160,\n easing: 'cubic-bezier(0.25, 1, 0.5, 1)',\n } }\n >\n { (source) => {\n const node = nodeData<T>(source)?.node;\n\n return node\n ? (\n <SortablePreview\n node={ node }\n renderItem={ children }\n nestedGap={ nestedGap }\n />\n )\n : null;\n } }\n </DragOverlay>\n </DragDropProvider>\n );\n}\n\nfunction SortableCollection<T>({\n nodes,\n rootNodes,\n parentNode,\n renderItem,\n canDrop,\n getDragHandleOptions,\n className,\n gap,\n nestedGap,\n ariaLabel,\n}: SortableCollectionProps<T>) {\n const { ref, isDropTarget } = useDroppable<SortableCollectionData<T>>({\n id: collectionId(parentNode),\n type: SORTABLE_COLLECTION_TYPE,\n data: { kind: 'collection', parentNode },\n disabled: nodes.length > 0,\n collisionPriority: 1,\n accept: source => canAcceptDrop(\n source,\n parentNode,\n null,\n 'end',\n canDrop\n ),\n });\n\n return (\n <div\n ref={ ref }\n role=\"list\"\n className={ cn(styles.list, className) }\n data-gap={ gap }\n data-drop-target={ isDropTarget || undefined }\n aria-label={ ariaLabel }\n >\n <For each={ nodes }>\n { node => (\n <SortableItem\n key={ node.id }\n node={ node }\n rootNodes={ rootNodes }\n renderItem={ renderItem }\n canDrop={ canDrop }\n getDragHandleOptions={ getDragHandleOptions }\n nestedGap={ nestedGap }\n />\n ) }\n </For>\n </div>\n );\n}\n\nfunction SortableItem<T>({\n node,\n rootNodes,\n renderItem,\n canDrop,\n getDragHandleOptions,\n nestedGap,\n}: SortableItemProps<T>) {\n const context = itemContext(node);\n const {\n alignment = 'center',\n edgeOffset = 'none',\n variant = 'plain',\n } = getDragHandleOptions?.(node.value, context) ?? {};\n const {\n handleRef,\n ref,\n targetRef,\n isDragging,\n isDropTarget,\n } = useSortable<SortableNodeData<T>>({\n id: node.id,\n index: node.index,\n group: collectionIdFromParentKey(nodeParentKey(rootNodes, node)),\n type: SORTABLE_ITEM_TYPE,\n data: { kind: 'node', node },\n accept: source => canAcceptDrop(\n source,\n node.parent == null\n ? null\n : findParentNode(rootNodes, node),\n node,\n 'before',\n canDrop\n ),\n });\n const nestedItems = node.canHaveChildren\n ? (\n <SortableCollection\n nodes={ node.children }\n rootNodes={ rootNodes }\n parentNode={ node }\n renderItem={ renderItem }\n canDrop={ canDrop }\n getDragHandleOptions={ getDragHandleOptions }\n gap={ nestedGap }\n nestedGap={ nestedGap }\n ariaLabel={ `${ node.textValue } items` }\n />\n )\n : null;\n\n return (\n <div\n ref={ ref }\n role=\"listitem\"\n className={ styles.item }\n data-level={ node.level }\n data-dragging={ isDragging || undefined }\n data-drop-target={ isDropTarget || undefined }\n >\n <div\n ref={ targetRef }\n className={ styles.dropTarget }\n data-container={ node.canHaveChildren || undefined }\n aria-hidden\n />\n\n <span\n ref={ handleRef }\n className={ styles.dragHandle }\n data-alignment={ alignment }\n data-edge-offset={ edgeOffset }\n data-variant={ variant }\n aria-hidden\n >\n <DotsDrag aria-hidden width={ 14 } height={ 14 } />\n </span>\n\n <div className={ styles.content }>\n { renderItem(node.value, {\n ...context,\n nestedItems,\n isDragging,\n isDropTarget,\n }) }\n </div>\n </div>\n );\n}\n\nfunction SortablePreview<T>({\n node,\n renderItem,\n nestedGap,\n}: {\n node: SortableTreeNode<T>;\n renderItem: (item: T, props: SortableListItemRenderProps<T>) => ReactNode;\n nestedGap: 'sm' | 'md';\n}): ReactElement {\n const nestedItems = node.canHaveChildren\n ? (\n <div className={ styles.previewList } data-gap={ nestedGap }>\n <For each={ node.children }>\n { child => (\n <SortablePreview\n key={ child.id }\n node={ child }\n renderItem={ renderItem }\n nestedGap={ nestedGap }\n />\n ) }\n </For>\n </div>\n )\n : null;\n\n return (\n <div className={ styles.dragPreviewItem }>\n { renderItem(node.value, {\n ...itemContext(node),\n nestedItems,\n isDragging: false,\n isDropTarget: false,\n }) }\n </div>\n );\n}\n\nfunction itemContext<T>(node: SortableTreeNode<T>): SortableListItemContext<T> {\n return {\n level: node.level,\n parent: node.parent,\n index: node.index,\n siblingCount: node.siblingCount,\n isFirst: node.index === 0,\n isLast: node.index === node.siblingCount - 1,\n hasChildren: node.children.length > 0,\n canHaveChildren: node.canHaveChildren,\n };\n}\n\nfunction canAcceptDrop<T>(\n source: { data: Record<string, unknown> },\n parentNode: SortableTreeNode<T> | null,\n targetNode: SortableTreeNode<T> | null,\n dropPosition: SortableListDropContext<T>['dropPosition'],\n canDrop?: (context: SortableListDropContext<T>) => boolean\n): boolean {\n const sourceNode = nodeData<T>(source)?.node;\n\n if (!sourceNode || !canMoveToParent(sourceNode, parentNode)) {\n return false;\n }\n\n return canDrop?.(\n createDropContext(sourceNode, parentNode, targetNode, dropPosition)\n ) ?? true;\n}\n\nfunction createDropContext<T>(\n sourceNode: SortableTreeNode<T>,\n parentNode: SortableTreeNode<T> | null,\n targetNode: SortableTreeNode<T> | null,\n dropPosition: SortableListDropContext<T>['dropPosition']\n): SortableListDropContext<T> {\n return {\n items: [sourceNode.value],\n target: targetNode?.value ?? null,\n sourceParent: sourceNode.parent,\n sourceLevel: sourceNode.level,\n parent: parentNode?.value ?? null,\n targetLevel: parentNode ? parentNode.level + 1 : 1,\n dropPosition,\n };\n}\n\nfunction canMoveToParent<T>(\n sourceNode: SortableTreeNode<T>,\n parentNode: SortableTreeNode<T> | null\n): boolean {\n return parentNode == null\n || (parentNode.id !== sourceNode.id\n && findSortableTreeNode(sourceNode.children, parentNode.id) == null);\n}\n\nfunction destinationFromSortable<T>(\n nodes: readonly SortableTreeNode<T>[],\n group: string | number | undefined,\n index: number,\n targetNode: SortableTreeNode<T> | null\n): SortableDestination<T> | null {\n const parentKey = parentKeyFromCollectionId(group);\n\n if (parentKey === undefined) {\n return null;\n }\n\n const parentNode = parentKey == null\n ? null\n : findSortableTreeNode(nodes, parentKey);\n\n if (parentKey != null && !parentNode) {\n return null;\n }\n\n const isAfterTarget = targetNode != null && index > targetNode.index;\n\n return {\n parentNode,\n index,\n dropPosition: isAfterTarget ? 'after' : 'before',\n };\n}\n\nfunction collectionId<T>(parentNode: SortableTreeNode<T> | null): string {\n return collectionIdFromParentKey(parentNode?.id ?? null);\n}\n\nfunction collectionIdFromParentKey(parentKey: string | null): string {\n return parentKey == null\n ? ROOT_COLLECTION_ID\n : `${ CHILD_COLLECTION_PREFIX }${ parentKey }`;\n}\n\nfunction parentKeyFromCollectionId(\n collectionId: string | number | undefined\n): string | null | undefined {\n if (collectionId === ROOT_COLLECTION_ID) {\n return null;\n }\n\n if (typeof collectionId === 'string'\n && collectionId.startsWith(CHILD_COLLECTION_PREFIX)) {\n return collectionId.slice(CHILD_COLLECTION_PREFIX.length);\n }\n\n return undefined;\n}\n\nfunction nodeParentKey<T>(\n nodes: readonly SortableTreeNode<T>[],\n target: SortableTreeNode<T>\n): string | null {\n return findParentNode(nodes, target)?.id ?? null;\n}\n\nfunction findParentNode<T>(\n nodes: readonly SortableTreeNode<T>[],\n target: SortableTreeNode<T>\n): SortableTreeNode<T> | null {\n for (const node of nodes) {\n if (node.children.some(child => child.id === target.id)) {\n return node;\n }\n\n const parent = findParentNode(node.children, target);\n\n if (parent) {\n return parent;\n }\n }\n\n return null;\n}\n\nfunction entityData<T>(\n entity: { data: Record<string, unknown> } | null\n): SortableNodeData<T> | SortableCollectionData<T> | null {\n const data = entity?.data;\n\n if (data?.kind === 'node' && 'node' in data) {\n return {\n kind: 'node',\n node: data.node as SortableTreeNode<T>,\n };\n }\n\n if (data?.kind === 'collection' && 'parentNode' in data) {\n return {\n kind: 'collection',\n parentNode: data.parentNode as SortableTreeNode<T> | null,\n };\n }\n\n return null;\n}\n\nfunction nodeData<T>(\n entity: { data: Record<string, unknown> } | null\n): SortableNodeData<T> | null {\n const data = entityData<T>(entity);\n\n return data?.kind === 'node' ? data : null;\n}\n\nSortableList.displayName = 'SortableList';\n"],"names":["ROOT_COLLECTION_ID","CHILD_COLLECTION_PREFIX","SORTABLE_ITEM_TYPE","SORTABLE_COLLECTION_TYPE","POINTER_SENSORS","PointerSensor","PRIMITIVE_KEY_PREFIX","SortableList","items","getItemKey","getTextValue","getChildren","setChildren","canHaveChildren","onChange","children","canDrop","getDragHandleOptions","className","gap","nestedGap","ariaLabel","keyState","useRef","getNodeKey","useCallback","item","path","itemKey","existingKey","key","nodes","useMemo","buildSortableTree","renderState","handleDragEnd","event","canceled","operation","source","target","isSortable","sourceNode","nodeData","targetData","entityData","targetNode","destination","destinationFromSortable","context","createDropContext","canMoveToParent","initialParentKey","parentKeyFromCollectionId","destinationParentKey","movedNodes","moveSortableTreeNodeToIndex","restoreSortableTree","DragDropProvider","_jsx","SortableCollection","DragOverlay","styles","node","SortablePreview","rootNodes","parentNode","renderItem","ref","isDropTarget","useDroppable","collectionId","canAcceptDrop","cn","For","SortableItem","itemContext","alignment","edgeOffset","variant","handleRef","targetRef","isDragging","useSortable","collectionIdFromParentKey","nodeParentKey","findParentNode","nestedItems","DotsDrag","child","dropPosition","findSortableTreeNode","group","index","parentKey","isAfterTarget","parent","entity","data"],"mappings":"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"}
1
+ {"version":3,"file":"SortableList.js","sources":["../../src/SortableList/SortableList.tsx"],"sourcesContent":["import {\n DragDropProvider,\n DragOverlay,\n PointerSensor,\n useDroppable,\n type DragEndEvent,\n} from '@dnd-kit/react';\nimport { isSortable, useSortable } from '@dnd-kit/react/sortable';\nimport { DotsDrag } from '@reforma/icons/14';\nimport { cn } from '@reforma/lib';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport { For } from '../For';\nimport { Show } from '../Show';\nimport styles from './SortableList.module.css';\nimport {\n buildSortableTree,\n findSortableTreeNode,\n moveSortableTreeNodeToIndex,\n restoreSortableTree,\n type SortableTreeNode,\n} from './sortableTree';\n\nimport type { ReactElement, ReactNode } from 'react';\n\nexport type SortableListDragHandleAlignment = 'center' | 'top';\nexport type SortableListDragHandleEdgeOffset = 'none' | 'sm' | 'md';\nexport type SortableListDragHandleVariant = 'plain' | 'surface';\n\nexport interface SortableListDragHandleOptions {\n alignment?: SortableListDragHandleAlignment;\n edgeOffset?: SortableListDragHandleEdgeOffset;\n variant?: SortableListDragHandleVariant;\n}\n\nexport interface SortableListItemContext<T> {\n level: number;\n parent: T | null;\n index: number;\n siblingCount: number;\n isFirst: boolean;\n isLast: boolean;\n hasChildren: boolean;\n canHaveChildren: boolean;\n}\n\nexport interface SortableListItemRenderProps<T> extends SortableListItemContext<T> {\n nestedItems: ReactNode;\n isDragging: boolean;\n isDropTarget: boolean;\n}\n\nexport interface SortableListDropContext<T> {\n items: readonly T[];\n target: T | null;\n sourceParent: T | null;\n sourceLevel: number;\n parent: T | null;\n targetLevel: number;\n dropPosition: 'on' | 'before' | 'after' | 'end';\n}\n\ninterface SortableListBaseProps<T> {\n items: readonly T[];\n getKey?: (item: T, path: readonly number[]) => string;\n getTextValue: (item: T) => string;\n /** `move` is the dragged item and its index among its new siblings. */\n onChange: (items: T[], move: { item: T; index: number }) => void;\n children: (item: T, props: SortableListItemRenderProps<T>) => ReactNode;\n canDrop?: (context: SortableListDropContext<T>) => boolean;\n getDragHandleOptions?: (\n item: T,\n context: SortableListItemContext<T>\n ) => SortableListDragHandleOptions;\n className?: string;\n gap?: 'sm' | 'md';\n nestedGap?: 'sm' | 'md';\n /** `false` drops the grip: the whole item starts a drag. Default `true`. */\n handle?: boolean;\n 'aria-label': string;\n}\n\ninterface FlatSortableListProps {\n getChildren?: never;\n setChildren?: never;\n canHaveChildren?: never;\n}\n\ninterface NestedSortableListProps<T> {\n getChildren: (item: T) => readonly T[];\n setChildren: (item: T, children: T[]) => T;\n canHaveChildren?: (item: T) => boolean;\n}\n\nexport type SortableListProps<T> = SortableListBaseProps<T>\n & (FlatSortableListProps | NestedSortableListProps<T>);\n\ninterface SortableNodeData<T> {\n kind: 'node';\n node: SortableTreeNode<T>;\n}\n\ninterface SortableCollectionData<T> {\n kind: 'collection';\n parentNode: SortableTreeNode<T> | null;\n}\n\ninterface SortableCollectionProps<T> {\n nodes: readonly SortableTreeNode<T>[];\n rootNodes: readonly SortableTreeNode<T>[];\n parentNode: SortableTreeNode<T> | null;\n renderItem: (item: T, props: SortableListItemRenderProps<T>) => ReactNode;\n canDrop?: (context: SortableListDropContext<T>) => boolean;\n getDragHandleOptions?: (\n item: T,\n context: SortableListItemContext<T>\n ) => SortableListDragHandleOptions;\n className?: string;\n gap: 'sm' | 'md';\n nestedGap: 'sm' | 'md';\n handle: boolean;\n ariaLabel: string;\n}\n\ninterface SortableItemProps<T> extends Omit<SortableCollectionProps<T>, 'nodes' | 'className' | 'gap' | 'ariaLabel' | 'parentNode'> {\n node: SortableTreeNode<T>;\n}\n\ninterface SortableDestination<T> {\n parentNode: SortableTreeNode<T> | null;\n index: number;\n dropPosition: 'before' | 'after' | 'end';\n}\n\nconst ROOT_COLLECTION_ID = 'reforma-sortable:root';\nconst CHILD_COLLECTION_PREFIX = 'reforma-sortable:children:';\nconst SORTABLE_ITEM_TYPE = 'reforma-sortable:item';\nconst SORTABLE_COLLECTION_TYPE = 'reforma-sortable:collection';\nconst POINTER_SENSORS = [PointerSensor];\nconst PRIMITIVE_KEY_PREFIX = 'sortable:primitive:';\n\n/** Keys for items without `getKey`: stable per object, unique across lists. */\nconst objectKeys = new WeakMap<object, string>();\nlet nextObjectKey = 0;\n\n/**\n * Sortable collection with a pointer handle (or whole-item drag) and optional child groups.\n *\n * The rendered item is the complete draggable surface. Child collections can\n * accept moves when the caller's drop rules allow it.\n */\nexport function SortableList<T>({\n items,\n getKey: getItemKey,\n getTextValue,\n getChildren,\n setChildren,\n canHaveChildren,\n onChange,\n children,\n canDrop,\n getDragHandleOptions,\n className,\n gap = 'md',\n nestedGap = gap,\n handle = true,\n 'aria-label': ariaLabel,\n}: SortableListProps<T>) {\n const getNodeKey = useCallback((item: T, path: readonly number[]) => {\n const itemKey = getItemKey?.(item, path);\n\n if (itemKey != null) {\n return itemKey;\n }\n\n if (typeof item !== 'object' || item == null) {\n return `${ PRIMITIVE_KEY_PREFIX }${ path.join('.') }`;\n }\n\n const existingKey = objectKeys.get(item);\n\n if (existingKey) {\n return existingKey;\n }\n\n const key = `sortable:item:${ nextObjectKey }`;\n\n nextObjectKey += 1;\n objectKeys.set(item, key);\n\n return key;\n }, [getItemKey]);\n const nodes = useMemo(() => buildSortableTree(items, {\n getKey: getNodeKey,\n getTextValue,\n getChildren,\n canHaveChildren,\n }), [canHaveChildren, getChildren, getNodeKey, getTextValue, items]);\n const [renderState, setRenderState] = useState({ items, revision: 0 });\n\n if (renderState.items !== items) {\n setRenderState({ items, revision: renderState.revision + 1 });\n }\n\n function handleDragEnd(event: DragEndEvent) {\n const { canceled, operation } = event;\n const { source, target } = operation;\n\n if (canceled || !source || !isSortable(source)) {\n return;\n }\n\n const sourceNode = nodeData<T>(source)?.node;\n\n if (!sourceNode) {\n return;\n }\n\n const targetData = entityData<T>(target);\n const targetNode = targetData?.kind === 'node' ? targetData.node : null;\n let destination: SortableDestination<T> | null;\n\n if (targetData?.kind === 'collection') {\n destination = {\n parentNode: targetData.parentNode,\n index: targetData.parentNode?.children.length ?? nodes.length,\n dropPosition: 'end' as const,\n };\n }\n else if (targetNode\n && target\n && isSortable(target)) {\n destination = destinationFromSortable(\n nodes,\n target.group,\n source.index,\n targetNode\n );\n }\n else {\n destination = null;\n }\n\n if (!destination) {\n return;\n }\n\n const context = createDropContext(\n sourceNode,\n destination.parentNode,\n targetNode,\n destination.dropPosition\n );\n\n if (!canMoveToParent(sourceNode, destination.parentNode)\n || (canDrop && !canDrop(context))) {\n return;\n }\n\n const initialParentKey = parentKeyFromCollectionId(source.initialGroup);\n const destinationParentKey = destination.parentNode?.id ?? null;\n const isSamePosition = initialParentKey !== undefined\n && initialParentKey === destinationParentKey\n && source.initialIndex === destination.index;\n\n if (isSamePosition) {\n return;\n }\n\n const movedNodes = moveSortableTreeNodeToIndex(\n nodes,\n sourceNode.id,\n destinationParentKey,\n destination.index\n );\n\n onChange(restoreSortableTree(movedNodes, setChildren), {\n item: sourceNode.value,\n index: destination.index,\n });\n }\n\n return (\n <DragDropProvider\n // A cross-parent drop moves DOM nodes React does not own: remount nested trees on change.\n // Flat lists reconcile the optimistic order in place; a remount would cut the drop animation.\n key={ getChildren ? renderState.revision : undefined }\n sensors={ POINTER_SENSORS }\n onDragEnd={ handleDragEnd }\n >\n <SortableCollection\n nodes={ nodes }\n rootNodes={ nodes }\n parentNode={ null }\n renderItem={ children }\n canDrop={ canDrop }\n getDragHandleOptions={ getDragHandleOptions }\n className={ className }\n gap={ gap }\n nestedGap={ nestedGap }\n handle={ handle }\n ariaLabel={ ariaLabel }\n />\n\n <DragOverlay\n className={ styles.dragOverlay }\n dropAnimation={ {\n duration: 160,\n easing: 'cubic-bezier(0.25, 1, 0.5, 1)',\n } }\n >\n { (source) => {\n const node = nodeData<T>(source)?.node;\n\n return node\n ? (\n <SortablePreview\n node={ node }\n renderItem={ children }\n nestedGap={ nestedGap }\n />\n )\n : null;\n } }\n </DragOverlay>\n </DragDropProvider>\n );\n}\n\nfunction SortableCollection<T>({\n nodes,\n rootNodes,\n parentNode,\n renderItem,\n canDrop,\n getDragHandleOptions,\n className,\n gap,\n nestedGap,\n handle,\n ariaLabel,\n}: SortableCollectionProps<T>) {\n const { ref, isDropTarget } = useDroppable<SortableCollectionData<T>>({\n id: collectionId(parentNode),\n type: SORTABLE_COLLECTION_TYPE,\n data: { kind: 'collection', parentNode },\n disabled: nodes.length > 0,\n collisionPriority: 1,\n accept: source => canAcceptDrop(\n source,\n parentNode,\n null,\n 'end',\n canDrop\n ),\n });\n\n return (\n <div\n ref={ ref }\n role=\"list\"\n className={ cn(styles.list, className) }\n data-gap={ gap }\n data-drop-target={ isDropTarget || undefined }\n aria-label={ ariaLabel }\n >\n <For each={ nodes }>\n { node => (\n <SortableItem\n key={ node.id }\n node={ node }\n rootNodes={ rootNodes }\n renderItem={ renderItem }\n canDrop={ canDrop }\n getDragHandleOptions={ getDragHandleOptions }\n nestedGap={ nestedGap }\n handle={ handle }\n />\n ) }\n </For>\n </div>\n );\n}\n\nfunction SortableItem<T>({\n node,\n rootNodes,\n renderItem,\n canDrop,\n getDragHandleOptions,\n nestedGap,\n handle,\n}: SortableItemProps<T>) {\n const context = itemContext(node);\n const {\n alignment = 'center',\n edgeOffset = 'none',\n variant = 'plain',\n } = getDragHandleOptions?.(node.value, context) ?? {};\n const {\n handleRef,\n ref,\n targetRef,\n isDragging,\n isDropTarget,\n } = useSortable<SortableNodeData<T>>({\n id: node.id,\n index: node.index,\n group: collectionIdFromParentKey(nodeParentKey(rootNodes, node)),\n type: SORTABLE_ITEM_TYPE,\n data: { kind: 'node', node },\n accept: source => canAcceptDrop(\n source,\n node.parent == null\n ? null\n : findParentNode(rootNodes, node),\n node,\n 'before',\n canDrop\n ),\n });\n const nestedItems = node.canHaveChildren\n ? (\n <SortableCollection\n nodes={ node.children }\n rootNodes={ rootNodes }\n parentNode={ node }\n renderItem={ renderItem }\n canDrop={ canDrop }\n getDragHandleOptions={ getDragHandleOptions }\n gap={ nestedGap }\n nestedGap={ nestedGap }\n handle={ handle }\n ariaLabel={ `${ node.textValue } items` }\n />\n )\n : null;\n\n return (\n <div\n ref={ ref }\n role=\"listitem\"\n className={ styles.item }\n data-level={ node.level }\n data-dragging={ isDragging || undefined }\n data-drop-target={ isDropTarget || undefined }\n >\n <div\n ref={ targetRef }\n className={ styles.dropTarget }\n data-container={ node.canHaveChildren || undefined }\n aria-hidden\n />\n\n <Show when={ handle }>\n <span\n ref={ handleRef }\n className={ styles.dragHandle }\n data-alignment={ alignment }\n data-edge-offset={ edgeOffset }\n data-variant={ variant }\n aria-hidden\n >\n <DotsDrag aria-hidden width={ 14 } height={ 14 } />\n </span>\n </Show>\n\n <div className={ styles.content }>\n { renderItem(node.value, {\n ...context,\n nestedItems,\n isDragging,\n isDropTarget,\n }) }\n </div>\n </div>\n );\n}\n\nfunction SortablePreview<T>({\n node,\n renderItem,\n nestedGap,\n}: {\n node: SortableTreeNode<T>;\n renderItem: (item: T, props: SortableListItemRenderProps<T>) => ReactNode;\n nestedGap: 'sm' | 'md';\n}): ReactElement {\n const nestedItems = node.canHaveChildren\n ? (\n <div className={ styles.previewList } data-gap={ nestedGap }>\n <For each={ node.children }>\n { child => (\n <SortablePreview\n key={ child.id }\n node={ child }\n renderItem={ renderItem }\n nestedGap={ nestedGap }\n />\n ) }\n </For>\n </div>\n )\n : null;\n\n return (\n <div className={ styles.dragPreviewItem }>\n { renderItem(node.value, {\n ...itemContext(node),\n nestedItems,\n isDragging: false,\n isDropTarget: false,\n }) }\n </div>\n );\n}\n\nfunction itemContext<T>(node: SortableTreeNode<T>): SortableListItemContext<T> {\n return {\n level: node.level,\n parent: node.parent,\n index: node.index,\n siblingCount: node.siblingCount,\n isFirst: node.index === 0,\n isLast: node.index === node.siblingCount - 1,\n hasChildren: node.children.length > 0,\n canHaveChildren: node.canHaveChildren,\n };\n}\n\nfunction canAcceptDrop<T>(\n source: { data: Record<string, unknown> },\n parentNode: SortableTreeNode<T> | null,\n targetNode: SortableTreeNode<T> | null,\n dropPosition: SortableListDropContext<T>['dropPosition'],\n canDrop?: (context: SortableListDropContext<T>) => boolean\n): boolean {\n const sourceNode = nodeData<T>(source)?.node;\n\n if (!sourceNode || !canMoveToParent(sourceNode, parentNode)) {\n return false;\n }\n\n return canDrop?.(\n createDropContext(sourceNode, parentNode, targetNode, dropPosition)\n ) ?? true;\n}\n\nfunction createDropContext<T>(\n sourceNode: SortableTreeNode<T>,\n parentNode: SortableTreeNode<T> | null,\n targetNode: SortableTreeNode<T> | null,\n dropPosition: SortableListDropContext<T>['dropPosition']\n): SortableListDropContext<T> {\n return {\n items: [sourceNode.value],\n target: targetNode?.value ?? null,\n sourceParent: sourceNode.parent,\n sourceLevel: sourceNode.level,\n parent: parentNode?.value ?? null,\n targetLevel: parentNode ? parentNode.level + 1 : 1,\n dropPosition,\n };\n}\n\nfunction canMoveToParent<T>(\n sourceNode: SortableTreeNode<T>,\n parentNode: SortableTreeNode<T> | null\n): boolean {\n return parentNode == null\n || (parentNode.id !== sourceNode.id\n && findSortableTreeNode(sourceNode.children, parentNode.id) == null);\n}\n\nfunction destinationFromSortable<T>(\n nodes: readonly SortableTreeNode<T>[],\n group: string | number | undefined,\n index: number,\n targetNode: SortableTreeNode<T> | null\n): SortableDestination<T> | null {\n const parentKey = parentKeyFromCollectionId(group);\n\n if (parentKey === undefined) {\n return null;\n }\n\n const parentNode = parentKey == null\n ? null\n : findSortableTreeNode(nodes, parentKey);\n\n if (parentKey != null && !parentNode) {\n return null;\n }\n\n const isAfterTarget = targetNode != null && index > targetNode.index;\n\n return {\n parentNode,\n index,\n dropPosition: isAfterTarget ? 'after' : 'before',\n };\n}\n\nfunction collectionId<T>(parentNode: SortableTreeNode<T> | null): string {\n return collectionIdFromParentKey(parentNode?.id ?? null);\n}\n\nfunction collectionIdFromParentKey(parentKey: string | null): string {\n return parentKey == null\n ? ROOT_COLLECTION_ID\n : `${ CHILD_COLLECTION_PREFIX }${ parentKey }`;\n}\n\nfunction parentKeyFromCollectionId(\n collectionId: string | number | undefined\n): string | null | undefined {\n if (collectionId === ROOT_COLLECTION_ID) {\n return null;\n }\n\n if (typeof collectionId === 'string'\n && collectionId.startsWith(CHILD_COLLECTION_PREFIX)) {\n return collectionId.slice(CHILD_COLLECTION_PREFIX.length);\n }\n\n return undefined;\n}\n\nfunction nodeParentKey<T>(\n nodes: readonly SortableTreeNode<T>[],\n target: SortableTreeNode<T>\n): string | null {\n return findParentNode(nodes, target)?.id ?? null;\n}\n\nfunction findParentNode<T>(\n nodes: readonly SortableTreeNode<T>[],\n target: SortableTreeNode<T>\n): SortableTreeNode<T> | null {\n for (const node of nodes) {\n if (node.children.some(child => child.id === target.id)) {\n return node;\n }\n\n const parent = findParentNode(node.children, target);\n\n if (parent) {\n return parent;\n }\n }\n\n return null;\n}\n\nfunction entityData<T>(\n entity: { data: Record<string, unknown> } | null\n): SortableNodeData<T> | SortableCollectionData<T> | null {\n const data = entity?.data;\n\n if (data?.kind === 'node' && 'node' in data) {\n return {\n kind: 'node',\n node: data.node as SortableTreeNode<T>,\n };\n }\n\n if (data?.kind === 'collection' && 'parentNode' in data) {\n return {\n kind: 'collection',\n parentNode: data.parentNode as SortableTreeNode<T> | null,\n };\n }\n\n return null;\n}\n\nfunction nodeData<T>(\n entity: { data: Record<string, unknown> } | null\n): SortableNodeData<T> | null {\n const data = entityData<T>(entity);\n\n return data?.kind === 'node' ? data : null;\n}\n\nSortableList.displayName = 'SortableList';\n"],"names":["ROOT_COLLECTION_ID","CHILD_COLLECTION_PREFIX","SORTABLE_ITEM_TYPE","SORTABLE_COLLECTION_TYPE","POINTER_SENSORS","PointerSensor","PRIMITIVE_KEY_PREFIX","objectKeys","nextObjectKey","SortableList","items","getItemKey","getTextValue","getChildren","setChildren","canHaveChildren","onChange","children","canDrop","getDragHandleOptions","className","gap","nestedGap","handle","ariaLabel","getNodeKey","useCallback","item","path","itemKey","existingKey","key","nodes","useMemo","buildSortableTree","renderState","setRenderState","useState","handleDragEnd","event","canceled","operation","source","target","isSortable","sourceNode","nodeData","targetData","entityData","targetNode","destination","destinationFromSortable","context","createDropContext","canMoveToParent","initialParentKey","parentKeyFromCollectionId","destinationParentKey","movedNodes","moveSortableTreeNodeToIndex","restoreSortableTree","_jsxs","DragDropProvider","_jsx","SortableCollection","DragOverlay","styles","node","SortablePreview","rootNodes","parentNode","renderItem","ref","isDropTarget","useDroppable","collectionId","canAcceptDrop","cn","For","SortableItem","itemContext","alignment","edgeOffset","variant","handleRef","targetRef","isDragging","useSortable","collectionIdFromParentKey","nodeParentKey","findParentNode","nestedItems","Show","DotsDrag","child","dropPosition","findSortableTreeNode","group","index","parentKey","isAfterTarget","parent","entity","data"],"mappings":"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"}
@@ -13,7 +13,7 @@ export type ComposerBannerStatusProps = HTMLAttributes<HTMLDivElement> & {
13
13
  onAction?: () => void;
14
14
  /** Action button tint. Default `secondary`. */
15
15
  actionColor?: ButtonColor;
16
- /** Press anywhere on the row except the action. */
16
+ /** Press anywhere on the row except the action. The action then shows on hover or focus. */
17
17
  onPress?: () => void;
18
18
  icon?: ReactNode;
19
19
  };
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerBanner.d.ts","sourceRoot":"","sources":["../../../src/chat/ComposerBanner/ComposerBanner.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAMxD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,GAAG;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,KAAK,CAAC,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,KAAK,EACL,IAAI,EACJ,GAAG,KAAK,EACX,EAAE,mBAAmB,+BAYrB;AAED,MAAM,MAAM,yBAAyB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACrE,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,EACjC,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,WAAyB,EACzB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACX,EAAE,yBAAyB,+BAsC3B"}
1
+ {"version":3,"file":"ComposerBanner.d.ts","sourceRoot":"","sources":["../../../src/chat/ComposerBanner/ComposerBanner.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAMxD,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,GAAG;IAC9E,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,yDAAyD;IACzD,KAAK,CAAC,EAAE,QAAQ,CAAC;CACpB,CAAC;AAEF,qDAAqD;AACrD,wBAAgB,cAAc,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,KAAK,EACL,IAAI,EACJ,GAAG,KAAK,EACX,EAAE,mBAAmB,+BAYrB;AAED,MAAM,MAAM,yBAAyB,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACrE,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,uEAAuE;AACvE,wBAAgB,oBAAoB,CAAC,EACjC,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,WAAyB,EACzB,OAAO,EACP,IAAI,EACJ,SAAS,EACT,GAAG,KAAK,EACX,EAAE,yBAAyB,+BAsC3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"ComposerBanner.js","sources":["../../../src/chat/ComposerBanner/ComposerBanner.tsx"],"sourcesContent":["import { cn } from '@reforma/lib';\n\nimport { Button, type ButtonColor } from '../../Button';\nimport { Pressable } from '../../Pressable';\nimport { Show } from '../../Show';\nimport { Text } from '../../Text';\nimport styles from './ComposerBanner.module.css';\n\nimport type { HTMLAttributes, ReactNode } from 'react';\n\nexport type ComposerBannerProps = Omit<HTMLAttributes<HTMLDivElement>, 'color'> & {\n children?: ReactNode;\n /** Plate tint. Default is the muted interrupt chrome. */\n color?: 'danger';\n};\n\n/** Shared plate above the composer — chrome only. */\nexport function ComposerBanner({\n children,\n className,\n color,\n role,\n ...props\n}: ComposerBannerProps) {\n return (\n <div\n data-slot=\"composer-banner\"\n data-color={ color }\n role={ role ?? (color === 'danger' ? 'alert' : undefined) }\n className={ cn(styles.root, className) }\n { ...props }\n >\n { children }\n </div>\n );\n}\n\nexport type ComposerBannerStatusProps = HTMLAttributes<HTMLDivElement> & {\n children: ReactNode;\n action: string;\n onAction?: () => void;\n /** Action button tint. Default `secondary`. */\n actionColor?: ButtonColor;\n /** Press anywhere on the row except the action. */\n onPress?: () => void;\n icon?: ReactNode;\n};\n\n/** One status row inside {@link ComposerBanner} — message + action. */\nexport function ComposerBannerStatus({\n children,\n action,\n onAction,\n actionColor = 'secondary',\n onPress,\n icon,\n className,\n ...props\n}: ComposerBannerStatusProps) {\n const message = (\n <>\n <Show when={ icon }>\n <span className={ styles.icon }>\n { icon }\n </span>\n </Show>\n <Text variant=\"xs\" className={ styles.text }>\n { children }\n </Text>\n </>\n );\n\n return (\n <div className={ cn(styles.status, className) } data-pressable={ onPress ? true : undefined } { ...props }>\n <Show when={ onPress } fallback={ message }>\n { press => (\n <Pressable onPress={ press }>\n <span role=\"button\" tabIndex={ 0 } className={ styles.press }>\n { message }\n </span>\n </Pressable>\n ) }\n </Show>\n\n <Button\n size=\"xs\"\n variant=\"ghost\"\n color={ actionColor }\n className={ styles.action }\n isDisabled={ !onAction }\n onPress={ onAction }\n >\n { action }\n </Button>\n </div>\n );\n}\n"],"names":["ComposerBanner","children","className","color","role","props","cn","styles","ComposerBannerStatus","action","onAction","actionColor","onPress","icon","message","_Fragment","_jsx","Show","Text","press","Pressable","Button"],"mappings":";;;;;;;AAQO,SAASA,EAAe;AAAA,EAC7B,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AACD,2BAAyB,OAAO;AAAA,IAC9B,aAAa;AAAA,IACb,cAAcF;AAAA,IACd,MAAMC,MAASD,MAAU,WAAW,UAAU;AAAA,IAC9C,WAAWG,EAAGC,EAAO,MAAML,CAAS;AAAA,IACpC,GAAGG;AAAA,IACH,UAAAJ;AAAA,EAAA,CACD;AACH;AAEO,SAASO,EAAqB;AAAA,EACnC,UAAAP;AAAA,EACA,QAAAQ;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAX;AAAA,EACA,GAAGG;AACL,GAAG;AACD,QAAMS,sBAA6BC,GAAW;AAAA,IAC5C,UAAU,CAAcC,gBAAAA,EAAKC,GAAM;AAAA,MACjC,MAAMJ;AAAA,MACN,4BAA4B,QAAQ;AAAA,QAClC,WAAWN,EAAO;AAAA,QAClB,UAAUM;AAAA,MAAA,CACX;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKE,GAAM;AAAA,MAC1B,SAAS;AAAA,MACT,WAAWX,EAAO;AAAA,MAClB,UAAAN;AAAA,IAAA,CACD,CAAC;AAAA,EAAA,CACH;AACD,2BAA0B,OAAO;AAAA,IAC/B,WAAWK,EAAGC,EAAO,QAAQL,CAAS;AAAA,IACtC,kBAAkBU,IAAU,KAAO;AAAA,IACnC,GAAGP;AAAA,IACH,UAAU,CAAcW,gBAAAA,EAAKC,GAAM;AAAA,MACjC,MAAML;AAAA,MACN,UAAUE;AAAA,MACV,UAAU,CAAAK,MAAsBH,gBAAAA,EAAKI,GAAW;AAAA,QAC9C,SAASD;AAAA,QACT,4BAA4B,QAAQ;AAAA,UAClC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,WAAWZ,EAAO;AAAA,UAClB,UAAUO;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBE,gBAAAA,EAAKK,GAAQ;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAOV;AAAA,MACP,WAAWJ,EAAO;AAAA,MAClB,YAAY,CAACG;AAAA,MACb,SAASA;AAAA,MACT,UAAUD;AAAA,IAAA,CACX,CAAC;AAAA,EAAA,CACH;AACH;"}
1
+ {"version":3,"file":"ComposerBanner.js","sources":["../../../src/chat/ComposerBanner/ComposerBanner.tsx"],"sourcesContent":["import { cn } from '@reforma/lib';\n\nimport { Button, type ButtonColor } from '../../Button';\nimport { Pressable } from '../../Pressable';\nimport { Show } from '../../Show';\nimport { Text } from '../../Text';\nimport styles from './ComposerBanner.module.css';\n\nimport type { HTMLAttributes, ReactNode } from 'react';\n\nexport type ComposerBannerProps = Omit<HTMLAttributes<HTMLDivElement>, 'color'> & {\n children?: ReactNode;\n /** Plate tint. Default is the muted interrupt chrome. */\n color?: 'danger';\n};\n\n/** Shared plate above the composer — chrome only. */\nexport function ComposerBanner({\n children,\n className,\n color,\n role,\n ...props\n}: ComposerBannerProps) {\n return (\n <div\n data-slot=\"composer-banner\"\n data-color={ color }\n role={ role ?? (color === 'danger' ? 'alert' : undefined) }\n className={ cn(styles.root, className) }\n { ...props }\n >\n { children }\n </div>\n );\n}\n\nexport type ComposerBannerStatusProps = HTMLAttributes<HTMLDivElement> & {\n children: ReactNode;\n action: string;\n onAction?: () => void;\n /** Action button tint. Default `secondary`. */\n actionColor?: ButtonColor;\n /** Press anywhere on the row except the action. The action then shows on hover or focus. */\n onPress?: () => void;\n icon?: ReactNode;\n};\n\n/** One status row inside {@link ComposerBanner} — message + action. */\nexport function ComposerBannerStatus({\n children,\n action,\n onAction,\n actionColor = 'secondary',\n onPress,\n icon,\n className,\n ...props\n}: ComposerBannerStatusProps) {\n const message = (\n <>\n <Show when={ icon }>\n <span className={ styles.icon }>\n { icon }\n </span>\n </Show>\n <Text variant=\"xs\" className={ styles.text }>\n { children }\n </Text>\n </>\n );\n\n return (\n <div className={ cn(styles.status, className) } data-pressable={ onPress ? true : undefined } { ...props }>\n <Show when={ onPress } fallback={ message }>\n { press => (\n <Pressable onPress={ press }>\n <span role=\"button\" tabIndex={ 0 } className={ styles.press }>\n { message }\n </span>\n </Pressable>\n ) }\n </Show>\n\n <Button\n size=\"xs\"\n variant=\"ghost\"\n color={ actionColor }\n className={ styles.action }\n isDisabled={ !onAction }\n onPress={ onAction }\n >\n { action }\n </Button>\n </div>\n );\n}\n"],"names":["ComposerBanner","children","className","color","role","props","cn","styles","ComposerBannerStatus","action","onAction","actionColor","onPress","icon","message","_Fragment","_jsx","Show","Text","press","Pressable","Button"],"mappings":";;;;;;;AAQO,SAASA,EAAe;AAAA,EAC7B,UAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,MAAAC;AAAA,EACA,GAAGC;AACL,GAAG;AACD,2BAAyB,OAAO;AAAA,IAC9B,aAAa;AAAA,IACb,cAAcF;AAAA,IACd,MAAMC,MAASD,MAAU,WAAW,UAAU;AAAA,IAC9C,WAAWG,EAAGC,EAAO,MAAML,CAAS;AAAA,IACpC,GAAGG;AAAA,IACH,UAAAJ;AAAA,EAAA,CACD;AACH;AAEO,SAASO,EAAqB;AAAA,EACnC,UAAAP;AAAA,EACA,QAAAQ;AAAA,EACA,UAAAC;AAAA,EACA,aAAAC,IAAc;AAAA,EACd,SAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAX;AAAA,EACA,GAAGG;AACL,GAAG;AACD,QAAMS,sBAA6BC,GAAW;AAAA,IAC5C,UAAU,CAAcC,gBAAAA,EAAKC,GAAM;AAAA,MACjC,MAAMJ;AAAA,MACN,4BAA4B,QAAQ;AAAA,QAClC,WAAWN,EAAO;AAAA,QAClB,UAAUM;AAAA,MAAA,CACX;AAAA,IAAA,CACF,GAAgBG,gBAAAA,EAAKE,GAAM;AAAA,MAC1B,SAAS;AAAA,MACT,WAAWX,EAAO;AAAA,MAClB,UAAAN;AAAA,IAAA,CACD,CAAC;AAAA,EAAA,CACH;AACD,2BAA0B,OAAO;AAAA,IAC/B,WAAWK,EAAGC,EAAO,QAAQL,CAAS;AAAA,IACtC,kBAAkBU,IAAU,KAAO;AAAA,IACnC,GAAGP;AAAA,IACH,UAAU,CAAcW,gBAAAA,EAAKC,GAAM;AAAA,MACjC,MAAML;AAAA,MACN,UAAUE;AAAA,MACV,UAAU,CAAAK,MAAsBH,gBAAAA,EAAKI,GAAW;AAAA,QAC9C,SAASD;AAAA,QACT,4BAA4B,QAAQ;AAAA,UAClC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,WAAWZ,EAAO;AAAA,UAClB,UAAUO;AAAA,QAAA,CACX;AAAA,MAAA,CACF;AAAA,IAAA,CACF,GAAgBE,gBAAAA,EAAKK,GAAQ;AAAA,MAC5B,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAOV;AAAA,MACP,WAAWJ,EAAO;AAAA,MAClB,YAAY,CAACG;AAAA,MACb,SAASA;AAAA,MACT,UAAUD;AAAA,IAAA,CACX,CAAC;AAAA,EAAA,CACH;AACH;"}
@@ -1 +1 @@
1
- @layer components{.ComposerBanner_root_HyjFf2{display:flex;flex-direction:column;margin:0 var(--spacing-md);border-top-right-radius:calc(var(--radius-md) * var(--squircle-radius-factor));border-top-left-radius:calc(var(--radius-md) * var(--squircle-radius-factor));min-width:0;corner-shape:superellipse(var(--squircle-value)) superellipse(var(--squircle-value)) square square;background-color:var(--color-secondary-muted-light);overflow:hidden}.dark .ComposerBanner_root_HyjFf2:not([data-color]){background-color:var(--color-light-700)}.ComposerBanner_root_HyjFf2[data-color=danger]{background-color:var(--color-danger-muted-light);color:var(--color-danger-text)}.ComposerBanner_status_EIdxnS+.ComposerBanner_status_EIdxnS{position:relative}.ComposerBanner_status_EIdxnS+.ComposerBanner_status_EIdxnS:before{position:absolute;top:0;right:var(--spacing-sm);left:var(--spacing-sm);border-top:1px solid var(--color-secondary-muted-border);content:""}.ComposerBanner_root_HyjFf2[data-color=danger] .ComposerBanner_status_EIdxnS+.ComposerBanner_status_EIdxnS:before{border-top-color:var(--color-danger-muted-border)}.ComposerBanner_status_EIdxnS{display:flex;justify-content:space-between;align-items:center;gap:var(--spacing-sm);padding:var(--spacing-sm) var(--spacing-sm) var(--spacing-sm) var(--spacing-lg);word-wrap:break-word}.ComposerBanner_icon_5Md4lZ{display:flex;flex-shrink:0;color:var(--color-secondary-muted-text)}.ComposerBanner_text_UFktfG{flex:1;max-height:3lh;overflow:hidden}.ComposerBanner_status_EIdxnS[data-pressable]{position:relative}.ComposerBanner_press_FFVYdF{display:flex;flex:1;align-items:center;gap:var(--spacing-sm);cursor:pointer;outline:none;min-width:0}.ComposerBanner_press_FFVYdF:after{position:absolute;inset:0;content:""}.ComposerBanner_press_FFVYdF:focus-visible:after{outline:var(--spacing-4) solid var(--color-primary-muted-border);outline-offset:calc(var(--spacing-4) * -1)}.ComposerBanner_status_EIdxnS[data-pressable]:hover{background-color:var(--color-secondary-muted)}.ComposerBanner_action_EUqshm{position:relative}}
1
+ @layer components{.ComposerBanner_root_HyjFf2{display:flex;flex-direction:column;margin:0 var(--spacing-md);border-top-right-radius:calc(var(--radius-md) * var(--squircle-radius-factor));border-top-left-radius:calc(var(--radius-md) * var(--squircle-radius-factor));min-width:0;corner-shape:superellipse(var(--squircle-value)) superellipse(var(--squircle-value)) square square;background-color:var(--color-secondary-muted-light);overflow:hidden}.dark .ComposerBanner_root_HyjFf2:not([data-color]){background-color:var(--color-light-700)}.ComposerBanner_root_HyjFf2[data-color=danger]{background-color:var(--color-danger-muted-light);color:var(--color-danger-text)}.ComposerBanner_status_EIdxnS+.ComposerBanner_status_EIdxnS{position:relative}.ComposerBanner_status_EIdxnS+.ComposerBanner_status_EIdxnS:before{position:absolute;top:0;right:var(--spacing-sm);left:var(--spacing-sm);border-top:1px solid var(--color-secondary-muted-border);content:""}.ComposerBanner_root_HyjFf2[data-color=danger] .ComposerBanner_status_EIdxnS+.ComposerBanner_status_EIdxnS:before{border-top-color:var(--color-danger-muted-border)}.ComposerBanner_status_EIdxnS{display:flex;justify-content:space-between;align-items:center;gap:var(--spacing-sm);padding:var(--spacing-sm) var(--spacing-sm) var(--spacing-sm) var(--spacing-lg);word-wrap:break-word}.ComposerBanner_icon_5Md4lZ{display:flex;flex-shrink:0;color:var(--color-secondary-muted-text)}.ComposerBanner_text_UFktfG{flex:1;max-height:3lh;overflow:hidden}.ComposerBanner_status_EIdxnS[data-pressable]{position:relative;isolation:isolate;min-height:calc(var(--spacing-30) + var(--spacing-xs) * 2)}.ComposerBanner_status_EIdxnS[data-pressable]:after{position:absolute;z-index:-1;inset:var(--spacing-xs);border-radius:calc(var(--radius-sm) * var(--squircle-radius-factor));content:"";corner-shape:superellipse(var(--squircle-value));transition:background-color var(--transition-duration-fast);pointer-events:none}.ComposerBanner_status_EIdxnS[data-pressable]:hover:after{background-color:var(--color-secondary-muted-light)}@media(hover:hover){.ComposerBanner_status_EIdxnS[data-pressable] .ComposerBanner_action_EUqshm{opacity:0;transition:opacity var(--transition-duration-fast)}.ComposerBanner_status_EIdxnS[data-pressable]:hover .ComposerBanner_action_EUqshm,.ComposerBanner_status_EIdxnS[data-pressable]:focus-within .ComposerBanner_action_EUqshm{opacity:1}}.ComposerBanner_press_FFVYdF{display:flex;flex:1;align-items:center;gap:var(--spacing-sm);cursor:pointer;outline:none;min-width:0}.ComposerBanner_press_FFVYdF:after{position:absolute;inset:0;content:""}.ComposerBanner_press_FFVYdF:focus-visible:after{outline:var(--spacing-4) solid var(--color-primary-muted-border);outline-offset:calc(var(--spacing-4) * -1)}.ComposerBanner_action_EUqshm{position:relative}}
@@ -1,16 +1,16 @@
1
- const o = "ComposerBanner_root_HyjFf2", s = "ComposerBanner_status_EIdxnS", t = "ComposerBanner_icon_5Md4lZ", n = "ComposerBanner_text_UFktfG", e = "ComposerBanner_press_FFVYdF", r = "ComposerBanner_action_EUqshm", a = {
1
+ const o = "ComposerBanner_root_HyjFf2", s = "ComposerBanner_status_EIdxnS", t = "ComposerBanner_icon_5Md4lZ", n = "ComposerBanner_text_UFktfG", e = "ComposerBanner_action_EUqshm", r = "ComposerBanner_press_FFVYdF", a = {
2
2
  root: o,
3
3
  status: s,
4
4
  icon: t,
5
5
  text: n,
6
- press: e,
7
- action: r
6
+ action: e,
7
+ press: r
8
8
  };
9
9
  export {
10
- r as action,
10
+ e as action,
11
11
  a as default,
12
12
  t as icon,
13
- e as press,
13
+ r as press,
14
14
  o as root,
15
15
  s as status,
16
16
  n as text
@@ -1 +1 @@
1
- {"version":3,"file":"BashTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqKlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,sCAkFhD"}
1
+ {"version":3,"file":"BashTool.d.ts","sourceRoot":"","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAqKlD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,sCAyEhD"}
@@ -1,16 +1,15 @@
1
- import { Completed as k, Oclock as x, Terminal as y } from "@reforma/icons/14";
2
- import { isStaticToolUIPart as S, getToolName as w } from "@reforma/types";
3
- import { useMemo as l } from "react";
4
- import { Show as T } from "../../../Show/Show.js";
5
- import { TerminalContent as C } from "../../../Terminal/Terminal.js";
1
+ import { Completed as b, Oclock as k, Terminal as y } from "@reforma/icons/14";
2
+ import { isStaticToolUIPart as w, getToolName as C } from "@reforma/types";
3
+ import { useMemo as u } from "react";
4
+ import { Show as h } from "../../../Show/Show.js";
5
+ import { TerminalContent as S } from "../../../Terminal/Terminal.js";
6
6
  import { Text as O } from "../../../Text/Text.js";
7
7
  import { Approval as R, ApprovalRequest as j, ApprovalButtons as A } from "../../Approval/Approval.js";
8
8
  import { getToolFailureRowState as P, isToolInvocationInProgress as $ } from "../helpers.js";
9
9
  import { ToolShell as F, ToolShellHeader as I, ToolShellContent as N, ToolShellFooter as q } from "../shell/ToolShell.js";
10
- import { ToolSummaryBadges as D } from "../shell/ToolSummaryBadge.js";
11
- import u from "./BashTool.module.css.js";
12
- import { jsxs as B, jsx as s } from "react/jsx-runtime";
13
- function H(t) {
10
+ import g from "./BashTool.module.css.js";
11
+ import { jsxs as T, jsx as s } from "react/jsx-runtime";
12
+ function D(t) {
14
13
  const r = t?.input;
15
14
  if (r == null || typeof r != "object")
16
15
  return {
@@ -27,7 +26,7 @@ function H(t) {
27
26
  background: o.background === !0
28
27
  };
29
28
  }
30
- function L(t) {
29
+ function H(t) {
31
30
  if (!t)
32
31
  return {
33
32
  stdout: "",
@@ -48,28 +47,28 @@ function L(t) {
48
47
  signal: c
49
48
  };
50
49
  }
51
- function m(t) {
50
+ function l(t) {
52
51
  return t.command === "" && (t.background || t.id != null);
53
52
  }
54
- function M(t) {
55
- return t.background || m(t);
53
+ function L(t) {
54
+ return t.background || l(t);
56
55
  }
57
- function _(t, r) {
58
- return m(t) && r.status !== "running";
56
+ function M(t, r) {
57
+ return l(t) && r.status !== "running";
59
58
  }
60
- function z(t, r) {
61
- return m(t) ? r.status === "running" ? "Background task" : "Background task finished" : t.description !== "" ? t.description : t.command !== "" ? t.command : "Bash";
59
+ function _(t, r) {
60
+ return l(t) ? r.status === "running" ? "Background task" : "Background task finished" : t.description !== "" ? t.description : t.command !== "" ? t.command : "Bash";
62
61
  }
63
- function b(t) {
62
+ function B(t) {
64
63
  const r = [];
65
64
  return typeof t.exitCode == "number" && r.push(`exit ${t.exitCode}`), t.signal && r.push(`signal ${t.signal}`), r.length === 0 && t.status && t.status !== "running" && r.push(t.status), r.join(`
66
65
  `);
67
66
  }
68
- const E = "\x1B[32m$\x1B[0m";
69
- function U(t) {
67
+ const z = "\x1B[32m$\x1B[0m";
68
+ function E(t) {
70
69
  return t.split("\x1B").join("");
71
70
  }
72
- function W(t) {
71
+ function U(t) {
73
72
  const {
74
73
  stdout: r = "",
75
74
  stderr: o = ""
@@ -79,58 +78,53 @@ function W(t) {
79
78
  `) && (n += `
80
79
  `), n += `\x1B[31m${o}\x1B[0m`), n;
81
80
  }
82
- function G(t, r) {
83
- const o = W(r), e = [t.command === "" ? b(r) : "", o].filter((i) => i !== "").join(`
81
+ function W(t, r) {
82
+ const o = U(r), e = [t.command === "" ? B(r) : "", o].filter((i) => i !== "").join(`
84
83
  `);
85
- return t.command === "" ? e : `${E} ${U(t.command)}
84
+ return t.command === "" ? e : `${z} ${E(t.command)}
86
85
  ` + e;
87
86
  }
88
- function st(t) {
87
+ function rt(t) {
89
88
  const {
90
89
  onToolApprovalResponse: r
91
- } = t, o = S(t.part) && w(t.part) === "Bash" ? t.part : null, n = l(() => H(o), [o]), e = l(() => L(o), [o]), a = l(() => G(n, e), [n, e]);
90
+ } = t, o = w(t.part) && C(t.part) === "Bash" ? t.part : null, n = u(() => D(o), [o]), e = u(() => H(o), [o]), a = u(() => W(n, e), [n, e]);
92
91
  if (!o)
93
92
  return null;
94
- const i = o.state, c = P(o), d = o.approval, f = $(i, !0), v = !!(e.stdout || e.stderr || b(e)), p = n.command !== "" || v, g = _(n, e), h = M(n) && !g;
95
- return /* @__PURE__ */ B(F, {
96
- collapsible: p,
93
+ const i = o.state, c = P(o), d = o.approval, m = $(i, !0), v = !!(e.stdout || e.stderr || B(e)), f = n.command !== "" || v, p = M(n, e), x = L(n) && !p;
94
+ return /* @__PURE__ */ T(F, {
95
+ collapsible: f,
97
96
  "data-slot": "bash-tool",
98
97
  children: [/* @__PURE__ */ s(I, {
99
98
  state: i,
100
99
  statusDetail: c.tooltip,
101
- title: z(n, e),
100
+ title: _(n, e),
102
101
  truncateTitle: !0,
103
- icon: g ? /* @__PURE__ */ s(k, {
102
+ icon: p ? /* @__PURE__ */ s(b, {
104
103
  "aria-hidden": !0
105
- }) : h ? /* @__PURE__ */ s(x, {
104
+ }) : x ? /* @__PURE__ */ s(k, {
106
105
  "aria-hidden": !0
107
106
  }) : /* @__PURE__ */ s(y, {
108
107
  "aria-hidden": !0
109
- }),
110
- beforeTitle: h ? /* @__PURE__ */ s(D, {
111
- className: u.badge,
112
- labels: ["background"],
113
- "aria-label": "Background"
114
- }) : void 0
115
- }), /* @__PURE__ */ s(T, {
116
- when: p,
108
+ })
109
+ }), /* @__PURE__ */ s(h, {
110
+ when: f,
117
111
  children: /* @__PURE__ */ s(N, {
118
- className: u.content,
119
- children: /* @__PURE__ */ s(C, {
120
- autoScroll: f,
121
- isStreaming: f,
112
+ className: g.content,
113
+ children: /* @__PURE__ */ s(S, {
114
+ autoScroll: m,
115
+ isStreaming: m,
122
116
  output: a,
123
- className: u.terminalPanel
117
+ className: g.terminalPanel
124
118
  })
125
119
  })
126
- }), /* @__PURE__ */ s(T, {
120
+ }), /* @__PURE__ */ s(h, {
127
121
  when: i === "approval-requested",
128
122
  children: /* @__PURE__ */ s(q, {
129
123
  children: /* @__PURE__ */ s(R, {
130
124
  approval: d,
131
125
  state: i,
132
126
  onToolApprovalResponse: r,
133
- children: /* @__PURE__ */ B(j, {
127
+ children: /* @__PURE__ */ T(j, {
134
128
  children: [/* @__PURE__ */ s(O, {
135
129
  children: "Confirm you want to run this command"
136
130
  }), /* @__PURE__ */ s(A, {})]
@@ -141,6 +135,6 @@ function st(t) {
141
135
  });
142
136
  }
143
137
  export {
144
- st as BashTool
138
+ rt as BashTool
145
139
  };
146
140
  //# sourceMappingURL=BashTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BashTool.js","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"sourcesContent":["import { Completed, Oclock, Terminal } from '@reforma/icons/14';\nimport { getToolName, isStaticToolUIPart } from '@reforma/types';\nimport { useMemo } from 'react';\n\nimport { Show } from '../../../Show';\nimport { TerminalContent } from '../../../Terminal';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport {\n getToolFailureRowState,\n isToolInvocationInProgress,\n} from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n ToolSummaryBadges,\n} from '../shell';\nimport styles from './BashTool.module.css';\n\nimport type { ToolUIPart } from 'ai';\nimport type { ToolRendererProps } from '../types';\n\ntype ParsedBashInput = {\n command: string;\n description: string;\n cwd?: string;\n id?: string;\n background: boolean;\n};\n\nfunction parseBashInput(part: ToolUIPart | null): ParsedBashInput {\n const input = part?.input;\n\n if (input == null || typeof input !== 'object') {\n return {\n command: '',\n description: '',\n background: false,\n };\n }\n\n const o = input as Record<string, unknown>;\n const command = typeof o.command === 'string' ? o.command : '';\n const description = typeof o.description === 'string' ? o.description.trim() : '';\n const cwd = typeof o.cwd === 'string' ? o.cwd.trim() : undefined;\n const id = typeof o.id === 'string' ? o.id.trim() : '';\n\n return {\n command,\n description,\n cwd: cwd !== '' ? cwd : undefined,\n id: id !== '' ? id : undefined,\n background: o.background === true,\n };\n}\n\ntype ParsedBashOutput = {\n stdout?: string;\n stderr?: string;\n status?: string;\n exitCode?: number;\n signal?: string;\n};\n\nfunction parseBashOutput(part: ToolUIPart | null): ParsedBashOutput {\n if (!part) {\n return {\n stdout: '',\n stderr: '',\n };\n }\n\n const isError = part.state === 'output-error';\n const output = (part.output ?? '') as ParsedBashOutput | string;\n\n if (typeof output === 'string') {\n return {\n stdout: output,\n stderr: isError ? part.errorText : '',\n };\n }\n\n const record = output as Record<string, unknown>;\n const stdout = typeof record.stdout === 'string' ? record.stdout : undefined;\n const stderr = typeof record.stderr === 'string' ? record.stderr : undefined;\n const status = typeof record.status === 'string' ? record.status : undefined;\n const signal = typeof record.signal === 'string' ? record.signal : undefined;\n const exitCode = typeof record.exitCode === 'number' ? record.exitCode : undefined;\n\n return {\n stdout,\n stderr,\n status,\n exitCode,\n signal,\n };\n}\n\n/** A poll or finished job: id, no command. The launch itself still has a command. */\nfunction isBackgroundResult(input: ParsedBashInput): boolean {\n return input.command === '' && (input.background || input.id != null);\n}\n\nfunction isBackgroundBash(input: ParsedBashInput): boolean {\n return input.background || isBackgroundResult(input);\n}\n\n/** Poll that already left the running state. Still-running work keeps the clock and badge. */\nfunction isFinishedBackgroundResult(input: ParsedBashInput, output: ParsedBashOutput): boolean {\n return isBackgroundResult(input) && output.status !== 'running';\n}\n\nfunction bashTitle(input: ParsedBashInput, output: ParsedBashOutput): string {\n if (isBackgroundResult(input)) {\n return output.status === 'running' ? 'Background task' : 'Background task finished';\n }\n\n if (input.description !== '') {\n return input.description;\n }\n\n if (input.command !== '') {\n return input.command;\n }\n\n return 'Bash';\n}\n\nfunction backgroundResultNote(output: ParsedBashOutput): string {\n const lines: string[] = [];\n\n if (typeof output.exitCode === 'number') {\n lines.push(`exit ${ output.exitCode }`);\n }\n\n if (output.signal) {\n lines.push(`signal ${ output.signal }`);\n }\n\n if (lines.length === 0 && output.status && output.status !== 'running') {\n lines.push(output.status);\n }\n\n return lines.join('\\n');\n}\n\n/** Green `$` */\nconst BASH_PROMPT_DOLLAR = '\\x1b[32m$\\x1b[0m';\n\n/** Avoid breaking the ANSI stream if the command string ever contained escape bytes. */\nfunction sanitizeCommandForTerminalPrompt(command: string): string {\n return command.split('\\u001b').join('');\n}\n\n/** stdout + stderr (stderr wrapped in ANSI red). */\nfunction bashOutputForTerminal(parsed: ParsedBashOutput): string {\n const { stdout = '', stderr = '' } = parsed;\n let s = stdout;\n\n if (stderr) {\n if (s !== '' && !s.endsWith('\\n')) {\n s += '\\n';\n }\n\n s += `\\x1b[31m${ stderr }\\x1b[0m`;\n }\n\n return s;\n}\n\n/** `$ command` when there is one, then stdout/stderr. A result poll has no command. */\nfunction printToTerminal(input: ParsedBashInput, output: ParsedBashOutput): string {\n const body = bashOutputForTerminal(output);\n const note = input.command === '' ? backgroundResultNote(output) : '';\n const outputText = [note, body].filter(part => part !== '').join('\\n');\n\n if (input.command === '') {\n return outputText;\n }\n\n const line = `${ BASH_PROMPT_DOLLAR } ${ sanitizeCommandForTerminalPrompt(input.command) }\\n`;\n\n return line + outputText;\n}\n\nexport function BashTool(props: ToolRendererProps) {\n const { onToolApprovalResponse } = props;\n\n const part = (isStaticToolUIPart(props.part) && getToolName(props.part) === 'Bash')\n ? props.part\n : null;\n\n const parsedInput = useMemo(() => parseBashInput(part), [part]);\n const parsedOutput = useMemo(() => parseBashOutput(part), [part]);\n\n const printOutput = useMemo(\n () => printToTerminal(parsedInput, parsedOutput),\n [parsedInput, parsedOutput]\n );\n\n if (!part) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const approval = part.approval;\n const live = isToolInvocationInProgress(state, true);\n\n const hasOutput = Boolean(parsedOutput.stdout || parsedOutput.stderr || backgroundResultNote(parsedOutput));\n const showTerminal = parsedInput.command !== '' || hasOutput;\n const finished = isFinishedBackgroundResult(parsedInput, parsedOutput);\n const background = isBackgroundBash(parsedInput) && !finished;\n\n return (\n <ToolShell\n collapsible={ showTerminal }\n data-slot=\"bash-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ bashTitle(parsedInput, parsedOutput) }\n truncateTitle\n icon={ finished\n ? <Completed aria-hidden />\n : background\n ? <Oclock aria-hidden />\n : <Terminal aria-hidden /> }\n beforeTitle={ background\n ? (\n <ToolSummaryBadges\n className={ styles.badge }\n labels={ ['background'] }\n aria-label=\"Background\"\n />\n )\n : undefined }\n />\n\n <Show when={ showTerminal }>\n <ToolShellContent className={ styles.content }>\n <TerminalContent\n autoScroll={ live }\n isStreaming={ live }\n output={ printOutput }\n className={ styles.terminalPanel }\n />\n </ToolShellContent>\n </Show>\n\n <Show when={ state === 'approval-requested' }>\n <ToolShellFooter>\n <Approval\n approval={ approval }\n state={ state }\n onToolApprovalResponse={ onToolApprovalResponse }\n >\n <ApprovalRequest>\n <Text>Confirm you want to run this command</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["parseBashInput","part","input","command","description","cwd","id","parseBashOutput","isError","output","record","stdout","stderr","status","signal","exitCode","isBackgroundResult","isBackgroundBash","isFinishedBackgroundResult","bashTitle","backgroundResultNote","lines","BASH_PROMPT_DOLLAR","sanitizeCommandForTerminalPrompt","bashOutputForTerminal","parsed","s","printToTerminal","body","outputText","BashTool","props","onToolApprovalResponse","isStaticToolUIPart","getToolName","parsedInput","useMemo","parsedOutput","printOutput","state","failure","getToolFailureRowState","approval","live","isToolInvocationInProgress","hasOutput","showTerminal","finished","background","ToolShell","_jsx","ToolShellHeader","Completed","Oclock","Terminal","ToolSummaryBadges","styles","Show","ToolShellContent","TerminalContent","ToolShellFooter","Approval","ApprovalRequest","Text","ApprovalButtons"],"mappings":"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"}
1
+ {"version":3,"file":"BashTool.js","sources":["../../../../src/chat/Tool/bash/BashTool.tsx"],"sourcesContent":["import { Completed, Oclock, Terminal } from '@reforma/icons/14';\nimport { getToolName, isStaticToolUIPart } from '@reforma/types';\nimport { useMemo } from 'react';\n\nimport { Show } from '../../../Show';\nimport { TerminalContent } from '../../../Terminal';\nimport { Text } from '../../../Text';\nimport {\n Approval,\n ApprovalButtons,\n ApprovalRequest,\n} from '../../Approval';\nimport {\n getToolFailureRowState,\n isToolInvocationInProgress,\n} from '../helpers';\nimport {\n ToolShell,\n ToolShellContent,\n ToolShellFooter,\n ToolShellHeader,\n} from '../shell';\nimport styles from './BashTool.module.css';\n\nimport type { ToolUIPart } from 'ai';\nimport type { ToolRendererProps } from '../types';\n\ntype ParsedBashInput = {\n command: string;\n description: string;\n cwd?: string;\n id?: string;\n background: boolean;\n};\n\nfunction parseBashInput(part: ToolUIPart | null): ParsedBashInput {\n const input = part?.input;\n\n if (input == null || typeof input !== 'object') {\n return {\n command: '',\n description: '',\n background: false,\n };\n }\n\n const o = input as Record<string, unknown>;\n const command = typeof o.command === 'string' ? o.command : '';\n const description = typeof o.description === 'string' ? o.description.trim() : '';\n const cwd = typeof o.cwd === 'string' ? o.cwd.trim() : undefined;\n const id = typeof o.id === 'string' ? o.id.trim() : '';\n\n return {\n command,\n description,\n cwd: cwd !== '' ? cwd : undefined,\n id: id !== '' ? id : undefined,\n background: o.background === true,\n };\n}\n\ntype ParsedBashOutput = {\n stdout?: string;\n stderr?: string;\n status?: string;\n exitCode?: number;\n signal?: string;\n};\n\nfunction parseBashOutput(part: ToolUIPart | null): ParsedBashOutput {\n if (!part) {\n return {\n stdout: '',\n stderr: '',\n };\n }\n\n const isError = part.state === 'output-error';\n const output = (part.output ?? '') as ParsedBashOutput | string;\n\n if (typeof output === 'string') {\n return {\n stdout: output,\n stderr: isError ? part.errorText : '',\n };\n }\n\n const record = output as Record<string, unknown>;\n const stdout = typeof record.stdout === 'string' ? record.stdout : undefined;\n const stderr = typeof record.stderr === 'string' ? record.stderr : undefined;\n const status = typeof record.status === 'string' ? record.status : undefined;\n const signal = typeof record.signal === 'string' ? record.signal : undefined;\n const exitCode = typeof record.exitCode === 'number' ? record.exitCode : undefined;\n\n return {\n stdout,\n stderr,\n status,\n exitCode,\n signal,\n };\n}\n\n/** A poll or finished job: id, no command. The launch itself still has a command. */\nfunction isBackgroundResult(input: ParsedBashInput): boolean {\n return input.command === '' && (input.background || input.id != null);\n}\n\nfunction isBackgroundBash(input: ParsedBashInput): boolean {\n return input.background || isBackgroundResult(input);\n}\n\n/** Poll that already left the running state. Still-running work keeps the clock and badge. */\nfunction isFinishedBackgroundResult(input: ParsedBashInput, output: ParsedBashOutput): boolean {\n return isBackgroundResult(input) && output.status !== 'running';\n}\n\nfunction bashTitle(input: ParsedBashInput, output: ParsedBashOutput): string {\n if (isBackgroundResult(input)) {\n return output.status === 'running' ? 'Background task' : 'Background task finished';\n }\n\n if (input.description !== '') {\n return input.description;\n }\n\n if (input.command !== '') {\n return input.command;\n }\n\n return 'Bash';\n}\n\nfunction backgroundResultNote(output: ParsedBashOutput): string {\n const lines: string[] = [];\n\n if (typeof output.exitCode === 'number') {\n lines.push(`exit ${ output.exitCode }`);\n }\n\n if (output.signal) {\n lines.push(`signal ${ output.signal }`);\n }\n\n if (lines.length === 0 && output.status && output.status !== 'running') {\n lines.push(output.status);\n }\n\n return lines.join('\\n');\n}\n\n/** Green `$` */\nconst BASH_PROMPT_DOLLAR = '\\x1b[32m$\\x1b[0m';\n\n/** Avoid breaking the ANSI stream if the command string ever contained escape bytes. */\nfunction sanitizeCommandForTerminalPrompt(command: string): string {\n return command.split('\\u001b').join('');\n}\n\n/** stdout + stderr (stderr wrapped in ANSI red). */\nfunction bashOutputForTerminal(parsed: ParsedBashOutput): string {\n const { stdout = '', stderr = '' } = parsed;\n let s = stdout;\n\n if (stderr) {\n if (s !== '' && !s.endsWith('\\n')) {\n s += '\\n';\n }\n\n s += `\\x1b[31m${ stderr }\\x1b[0m`;\n }\n\n return s;\n}\n\n/** `$ command` when there is one, then stdout/stderr. A result poll has no command. */\nfunction printToTerminal(input: ParsedBashInput, output: ParsedBashOutput): string {\n const body = bashOutputForTerminal(output);\n const note = input.command === '' ? backgroundResultNote(output) : '';\n const outputText = [note, body].filter(part => part !== '').join('\\n');\n\n if (input.command === '') {\n return outputText;\n }\n\n const line = `${ BASH_PROMPT_DOLLAR } ${ sanitizeCommandForTerminalPrompt(input.command) }\\n`;\n\n return line + outputText;\n}\n\nexport function BashTool(props: ToolRendererProps) {\n const { onToolApprovalResponse } = props;\n\n const part = (isStaticToolUIPart(props.part) && getToolName(props.part) === 'Bash')\n ? props.part\n : null;\n\n const parsedInput = useMemo(() => parseBashInput(part), [part]);\n const parsedOutput = useMemo(() => parseBashOutput(part), [part]);\n\n const printOutput = useMemo(\n () => printToTerminal(parsedInput, parsedOutput),\n [parsedInput, parsedOutput]\n );\n\n if (!part) {\n return null;\n }\n\n const state = part.state;\n const failure = getToolFailureRowState(part);\n const approval = part.approval;\n const live = isToolInvocationInProgress(state, true);\n\n const hasOutput = Boolean(parsedOutput.stdout || parsedOutput.stderr || backgroundResultNote(parsedOutput));\n const showTerminal = parsedInput.command !== '' || hasOutput;\n const finished = isFinishedBackgroundResult(parsedInput, parsedOutput);\n const background = isBackgroundBash(parsedInput) && !finished;\n\n return (\n <ToolShell\n collapsible={ showTerminal }\n data-slot=\"bash-tool\"\n >\n <ToolShellHeader\n state={ state }\n statusDetail={ failure.tooltip }\n title={ bashTitle(parsedInput, parsedOutput) }\n truncateTitle\n icon={ finished\n ? <Completed aria-hidden />\n : background\n ? <Oclock aria-hidden />\n : <Terminal aria-hidden /> }\n />\n\n <Show when={ showTerminal }>\n <ToolShellContent className={ styles.content }>\n <TerminalContent\n autoScroll={ live }\n isStreaming={ live }\n output={ printOutput }\n className={ styles.terminalPanel }\n />\n </ToolShellContent>\n </Show>\n\n <Show when={ state === 'approval-requested' }>\n <ToolShellFooter>\n <Approval\n approval={ approval }\n state={ state }\n onToolApprovalResponse={ onToolApprovalResponse }\n >\n <ApprovalRequest>\n <Text>Confirm you want to run this command</Text>\n <ApprovalButtons />\n </ApprovalRequest>\n </Approval>\n </ToolShellFooter>\n </Show>\n </ToolShell>\n );\n}\n"],"names":["parseBashInput","part","input","command","description","cwd","id","parseBashOutput","isError","output","record","stdout","stderr","status","signal","exitCode","isBackgroundResult","isBackgroundBash","isFinishedBackgroundResult","bashTitle","backgroundResultNote","lines","BASH_PROMPT_DOLLAR","sanitizeCommandForTerminalPrompt","bashOutputForTerminal","parsed","s","printToTerminal","body","outputText","BashTool","props","onToolApprovalResponse","isStaticToolUIPart","getToolName","parsedInput","useMemo","parsedOutput","printOutput","state","failure","getToolFailureRowState","approval","live","isToolInvocationInProgress","hasOutput","showTerminal","finished","background","ToolShell","_jsx","ToolShellHeader","Completed","Oclock","Terminal","Show","ToolShellContent","styles","TerminalContent","ToolShellFooter","Approval","ApprovalRequest","Text","ApprovalButtons"],"mappings":"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"}
@@ -1 +1 @@
1
- .BashTool_badge_s9MHpv{flex-shrink:0}.BashTool_content_jQUS2j{padding:0}.BashTool_terminalPanel_bCKi82{--terminal-max-body-height: none}
1
+ .BashTool_content_jQUS2j{padding:0}.BashTool_terminalPanel_bCKi82{--terminal-max-body-height: none}
@@ -1,12 +1,10 @@
1
- const n = "BashTool_badge_s9MHpv", t = "BashTool_content_jQUS2j", e = "BashTool_terminalPanel_bCKi82", a = {
2
- badge: n,
3
- content: t,
4
- terminalPanel: e
1
+ const n = "BashTool_content_jQUS2j", t = "BashTool_terminalPanel_bCKi82", e = {
2
+ content: n,
3
+ terminalPanel: t
5
4
  };
6
5
  export {
7
- n as badge,
8
- t as content,
9
- a as default,
10
- e as terminalPanel
6
+ n as content,
7
+ e as default,
8
+ t as terminalPanel
11
9
  };
12
10
  //# sourceMappingURL=BashTool.module.css.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BashTool.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
1
+ {"version":3,"file":"BashTool.module.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@reforma/components",
3
3
  "description": "A components library for Reforma",
4
4
  "type": "module",
5
- "version": "0.5.0",
5
+ "version": "0.6.0",
6
6
  "license": "UNLICENSED",
7
7
  "author": "Reforma, Inc. <dev@reforma.ai>",
8
8
  "repository": {
@@ -72,7 +72,7 @@
72
72
  "@reforma/constants": "1.1.0",
73
73
  "@reforma/icons": "0.1.0",
74
74
  "@reforma/lib": "0.1.7",
75
- "@reforma/types": "1.5.0",
75
+ "@reforma/types": "1.6.0",
76
76
  "@shikijs/transformers": "^4.0.2",
77
77
  "@streamdown/cjk": "1.0.3",
78
78
  "@streamdown/code": "1.1.1",