torch-glare 2.5.2 → 2.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/apps/lib/components/ActionButton.tsx +39 -6
  2. package/apps/lib/components/Badge.tsx +5 -2
  3. package/apps/lib/components/BadgeField.tsx +1 -1
  4. package/apps/lib/components/Button.tsx +4 -4
  5. package/apps/lib/components/Calendar.tsx +7 -17
  6. package/apps/lib/components/ColorPicker.tsx +1 -1
  7. package/apps/lib/components/DataViews/data-views.tsx +1 -1
  8. package/apps/lib/components/DataViews/filters/filters.tsx +1 -1
  9. package/apps/lib/components/DataViews/header.tsx +5 -2
  10. package/apps/lib/components/DataViews/panel/section.tsx +3 -1
  11. package/apps/lib/components/DataViews/views/board-view.tsx +3 -1
  12. package/apps/lib/components/DataViews/views/inbox-view.tsx +4 -1
  13. package/apps/lib/components/DataViews/views/pane-views.tsx +5 -1
  14. package/apps/lib/components/DataViews/views/table-view.tsx +67 -8
  15. package/apps/lib/components/DataViews/views/tree-view.tsx +5 -3
  16. package/apps/lib/components/Drawer.tsx +18 -1
  17. package/apps/lib/components/FormBuilder/context.ts +9 -1
  18. package/apps/lib/components/FormBuilder/submit.tsx +11 -2
  19. package/apps/lib/components/FormBuilder/types.ts +5 -1
  20. package/apps/lib/components/FormRenderer/form-renderer.tsx +15 -3
  21. package/apps/lib/components/FormRenderer/stepper.tsx +35 -14
  22. package/apps/lib/components/FormRenderer/types.ts +1 -1
  23. package/apps/lib/components/Input.tsx +19 -4
  24. package/apps/lib/components/Popover.tsx +93 -55
  25. package/apps/lib/components/SearchableSelect.tsx +12 -11
  26. package/apps/lib/components/SearchableTree.tsx +10 -11
  27. package/apps/lib/components/SearchableTreeDialog.tsx +10 -11
  28. package/apps/lib/components/SectionBlock.tsx +14 -2
  29. package/apps/lib/components/Select.tsx +35 -11
  30. package/apps/lib/components/SimpleSelect.tsx +2 -2
  31. package/apps/lib/components/SlideDatePicker.tsx +17 -4
  32. package/apps/lib/components/Stepper.tsx +329 -180
  33. package/apps/lib/components/Switch.tsx +2 -2
  34. package/apps/lib/components/Table.tsx +55 -30
  35. package/apps/lib/components/Textarea.tsx +29 -4
  36. package/apps/lib/components/TreeDropDown.tsx +18 -6
  37. package/apps/lib/components/TreeFolder/TreeFolder.tsx +61 -61
  38. package/apps/lib/registry.json +7 -16
  39. package/apps/lib/tsconfig.tsbuildinfo +1 -1
  40. package/docs/components/action-button.md +3 -1
  41. package/docs/components/data-views/index.md +7 -0
  42. package/docs/components/form-builder.md +4 -2
  43. package/docs/components/form-renderer.md +1 -1
  44. package/docs/components/stepper.md +119 -24
  45. package/docs/components/table.md +33 -0
  46. package/docs/how-to/forms-with-form-builder.md +3 -1
  47. package/docs/reference/tailwind-plugins.md +42 -0
  48. package/docs/tutorials/getting-started.md +32 -11
  49. package/package.json +1 -1
  50. package/apps/lib/components/FormStepper.tsx +0 -272
  51. package/docs/components/form-stepper.md +0 -250
@@ -18,7 +18,21 @@ const Table = React.forwardRef<
18
18
  <table
19
19
  data-theme={theme}
20
20
  ref={ref}
21
- className={cn("overflow-hidden w-auto [border-collapse:separate] border-spacing-0", className)}
21
+ // `overflow-hidden` is the default, and it is load-bearing twice over: the table is `w-auto`,
22
+ // so one wider than its container would otherwise push the whole page wide and put a horizontal
23
+ // scrollbar on the layout; and callers that give the table a radius rely on it to clip the
24
+ // square header band out of the rounded corners.
25
+ //
26
+ // The cost is that it makes the table its own scroll container, and `TableHeader`'s `sticky`
27
+ // resolves against the *nearest* scrollport — so inside a clipping table the header pins to a
28
+ // box that never scrolls, i.e. does nothing. That is the right default: a header only benefits
29
+ // from sticking when the table sits in a scroller, and such a caller passes `overflow-visible`
30
+ // (tailwind-merge lets theirs win) to bind it to that scroller instead. Only do that where the
31
+ // scroller is `min-w-0`, or the width problem above comes back — `DataViews`' table view is the
32
+ // worked example.
33
+ //
34
+ // `[border-collapse:separate]` is what lets the header cells keep their borders while stuck.
35
+ className={cn("overflow-visible w-auto [border-collapse:separate] border-spacing-0", className)}
22
36
  {...props}
23
37
  >
24
38
  {props.children}
@@ -34,9 +48,20 @@ const TableHeader = React.forwardRef<
34
48
  ref={ref}
35
49
  // The header band is one continuous bar, not a per-cell background — a background on each
36
50
  // `<th>` would paint over the half of the previous column's resize handle that overhangs
37
- // the boundary.
51
+ // the boundary. That is also why `sticky` sits here rather than on the `<th>`s: per-cell
52
+ // sticky would leave this background behind and let rows show through it.
53
+ //
54
+ // `z-20` clears the `z-10` on the resize handle and sort button inside the cells. In a table
55
+ // that never scrolls vertically, `sticky` keeps the element in flow and changes nothing.
56
+ //
57
+ // The band's token is translucent (`#0003`), so once rows do slide under it they read through.
58
+ // Making it opaque is deliberately NOT done here: it would mean naming one surface colour, and
59
+ // this header paints over whatever its caller sits on — forcing a surface would visibly recolour
60
+ // every table not on that one. A caller whose table actually scrolls supplies the opaque
61
+ // background itself, where the surface is known; `DataViews`' table view is the worked example.
38
62
  className={cn(
39
63
  "bg-background-presentation-form-header backdrop-blur-[8px]",
64
+ "sticky top-0 z-20",
40
65
  "shadow-[0px_4px_8px_0px_rgba(0,0,0,0.15)]",
41
66
  className,
42
67
  )}
@@ -108,28 +133,28 @@ const MIN_COLUMN_WIDTH = 40;
108
133
  const TableHead = React.forwardRef<
109
134
  HTMLTableCellElement,
110
135
  React.ThHTMLAttributes<HTMLTableCellElement> &
111
- TableHeadVariantsProps &
112
- React.ButtonHTMLAttributes<HTMLButtonElement> & {
113
- sortType?: "asc" | "desc" | undefined;
114
- onSort?: () => void;
115
- /** Column name for the sort button's accessible label. */
116
- sortLabel?: string;
117
- /**
118
- * Called with the new width (px) while the column is being drag-resized. Pass it to take
119
- * **control** of the width — the header then renders `style.width` and expects you to
120
- * feed the new value back. Required whenever the table needs a definite width
121
- * (`table-layout: fixed`), because only the owner of every column width can total them.
122
- * Omit for uncontrolled resizing, where the header keeps the width itself.
123
- */
124
- onResize?: (width: number) => void;
125
- /**
126
- * Classes for the inner layout box (the flex row holding the label and sort toggle).
127
- * `className` and every other prop go to the `<th>` — reach for this only when you need
128
- * to restyle the content box itself, e.g. its typography or colour.
129
- */
130
- contentClassName?: string;
131
- isDummy?: boolean;
132
- }
136
+ TableHeadVariantsProps &
137
+ React.ButtonHTMLAttributes<HTMLButtonElement> & {
138
+ sortType?: "asc" | "desc" | undefined;
139
+ onSort?: () => void;
140
+ /** Column name for the sort button's accessible label. */
141
+ sortLabel?: string;
142
+ /**
143
+ * Called with the new width (px) while the column is being drag-resized. Pass it to take
144
+ * **control** of the width — the header then renders `style.width` and expects you to
145
+ * feed the new value back. Required whenever the table needs a definite width
146
+ * (`table-layout: fixed`), because only the owner of every column width can total them.
147
+ * Omit for uncontrolled resizing, where the header keeps the width itself.
148
+ */
149
+ onResize?: (width: number) => void;
150
+ /**
151
+ * Classes for the inner layout box (the flex row holding the label and sort toggle).
152
+ * `className` and every other prop go to the `<th>` — reach for this only when you need
153
+ * to restyle the content box itself, e.g. its typography or colour.
154
+ */
155
+ contentClassName?: string;
156
+ isDummy?: boolean;
157
+ }
133
158
  >(
134
159
  (
135
160
  {
@@ -287,11 +312,11 @@ const TableCell = React.forwardRef<
287
312
  // Never fade a dummy cell — its content is a centred checkbox or drag handle, not
288
313
  // clippable text.
289
314
  fade &&
290
- !isDummy && [
291
- "[mask-image:linear-gradient(to_right,black_0%,black_0%,black_75%,transparent_100%)]",
292
- "rtl:[mask-image:linear-gradient(to_left,black_0%,black_0%,black_75%,transparent_100%)]",
293
- "[&:has(input)]:[mask-image:none]",
294
- ],
315
+ !isDummy && [
316
+ "[mask-image:linear-gradient(to_right,black_0%,black_0%,black_75%,transparent_100%)]",
317
+ "rtl:[mask-image:linear-gradient(to_left,black_0%,black_0%,black_75%,transparent_100%)]",
318
+ "[&:has(input)]:[mask-image:none]",
319
+ ],
295
320
  { "min-w-fit justify-center": isDummy },
296
321
  childrenClassName,
297
322
  )}
@@ -307,7 +332,7 @@ const TableCheckbox = React.forwardRef<
307
332
  React.ButtonHTMLAttributes<HTMLButtonElement> & {
308
333
  id: string;
309
334
  }
310
- // eslint-disable-next-line @typescript-eslint/no-unused-vars -- id destructured to exclude it from the props spread onto Checkbox
335
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars -- id destructured to exclude it from the props spread onto Checkbox
311
336
  >(({ className, id, ...props }, ref) => {
312
337
  return (
313
338
  <div className={cn(["flex items-center justify-center"], className)}>
@@ -7,12 +7,19 @@ import { cva, VariantProps } from "class-variance-authority";
7
7
  const textareaStyles = cva(
8
8
  [
9
9
  "border",
10
- "rounded-[8px]",
10
+ // `radius/xl` (12px). Figma's TextArea-Field has two sizes — S is `radius/lg` (8px) and M is
11
+ // `radius/xl` — and this component has no size variant: it renders its `Label` wrapper at
12
+ // `size="M"` below, so M is the size it actually is. Supporting S properly needs a real `size`
13
+ // prop, which is an API change rather than a radius one.
14
+ "rounded-radius-xl",
11
15
  "px-[8px]",
12
16
  "py-[12px]",
13
17
  "outline-none",
14
18
  "typography-body-large-regular",
15
- "!min-h-[36px]",
19
+ // A floor for the empty field — without one, `field-sizing: content` collapses it to a single
20
+ // 50px line. No `!` — twMerge does not dedupe an important class against a plain one, so `!`
21
+ // here would make the height impossible to override from a caller's `className`.
22
+ "min-h-[200px]",
16
23
  "transition-[border,background-color,color,caret-color,box-shadow]",
17
24
  "ease-in-out",
18
25
  "duration-150",
@@ -29,7 +36,7 @@ const textareaStyles = cva(
29
36
  "disabled:text-border-presentation-action-disabled",
30
37
  "disabled:cursor-not-allowed",
31
38
  "disabled:placeholder-border-presentation-action-disabled",
32
- "field-sizing-content w-full min-w-[100px] max-w-[100%]",
39
+ "w-full min-w-[100px] max-w-[100%]",
33
40
  ],
34
41
  {
35
42
  variants: {
@@ -54,6 +61,14 @@ interface TextareaProps
54
61
  secondaryLabel?: string; // Additional label text
55
62
  direction?: "row" | "column";
56
63
  theme?: "dark" | "light" | "default";
64
+ /**
65
+ * Grow the field to fit its content as the user types, instead of scrolling inside a fixed box.
66
+ * On by default, via CSS `field-sizing: content`. Set a `max-h-*` on the field to cap the growth —
67
+ * past the cap it scrolls. Note `rows` has no effect while this is on: the browser sizes the field
68
+ * from its content, so an empty field starts at one line. Pass `autoResize={false}` for the old
69
+ * fixed-height box with a drag handle.
70
+ */
71
+ autoResize?: boolean;
57
72
  }
58
73
 
59
74
  // Textarea component definition
@@ -68,6 +83,7 @@ const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
68
83
  direction = "row",
69
84
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
70
85
  theme, // excluded from ...props spread
86
+ autoResize = true,
71
87
  ...props
72
88
  },
73
89
  ref,
@@ -82,7 +98,16 @@ const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(
82
98
  size={"M"}
83
99
  className={cn(className)}
84
100
  >
85
- <textarea className={cn(textareaStyles({ state }))} ref={ref} {...props} />
101
+ <textarea
102
+ // Auto-grow is pure CSS. Written as an arbitrary *property* rather than as
103
+ // `field-sizing-content`: that utility only exists in Tailwind v4 and this project is on
104
+ // v3, where it compiled to no rule at all and left the computed `field-sizing` at `fixed`.
105
+ // The drag handle goes away with it — the height is content-driven, and a manual drag
106
+ // would pin it and silently stop the growing.
107
+ className={cn(textareaStyles({ state }), autoResize && "[field-sizing:content] resize-none")}
108
+ ref={ref}
109
+ {...props}
110
+ />
86
111
  </Label>
87
112
  );
88
113
  },
@@ -6,9 +6,9 @@ import { HTMLAttributes, ReactNode, useEffect, useState } from "react";
6
6
  const TreeDropDownVariants = cva(
7
7
  [
8
8
  "cursor-pointer flex px-[6px] h-[40px] gap-2 justify-start items-center w-full",
9
- "text-content-system-global-primary border-l-[2px] rtl:border-r-[2px] border-transparent outline-none",
9
+ "text-content-system-global-primary border-s-[2px] border-transparent outline-none",
10
10
  "hover:bg-white-alpha-075 hover:border-black-300 hover:text-content-system-action-primary-hover hover:gap-[14px]",
11
- "rounded-r-[4px] text-start whitespace-nowrap transition-all duration-150 ease-in-out",
11
+ "rounded-e-[4px] text-start whitespace-nowrap transition-all duration-150 ease-in-out",
12
12
  ],
13
13
  {
14
14
  variants: {
@@ -20,19 +20,31 @@ const TreeDropDownVariants = cva(
20
20
  true: "hover:gap-[8px]",
21
21
  },
22
22
  },
23
+ // The active row is a fixed dark slab, so its colours are pinned locally rather than taken from
24
+ // the theme. Previously the fill was theme-invariant while the text was not: on a light-themed
25
+ // page the row rendered near-black with near-black text, and the label was unreadable. The
26
+ // values below are exactly what the dark sidebar already rendered, so its look is unchanged.
23
27
  compoundVariants: [
24
28
  {
25
29
  active: true,
26
30
  variant: "default",
27
31
  className: [
28
- "bg-background-system-action-primary-hover border-border-system-action-primary-hover [&_button]:bg-purple-alpha-15 hover:bg-background-system-action-primary-hover hover:border-border-system-action-primary-hover",
32
+ "bg-purple-1000 border-purple-600 [&_button]:bg-purple-alpha-15",
33
+ "hover:bg-purple-1000 hover:border-purple-600",
34
+ // Descendants carry their own theme-driven text colours (headings, badges), so the
35
+ // foreground has to be forced here or it follows the page instead of the slab.
36
+ "text-content-presentation-global-primary-light",
37
+ "[&_*]:!text-content-presentation-global-primary-light",
29
38
  ],
30
39
  },
31
40
  {
32
41
  active: true,
33
42
  variant: "secondary",
34
43
  className: [
35
- "bg-wavy-navy-1000 border-border-system-action-field-hover-selected [&_button]:bg-blue-sparkle-alpha-15 hover:bg-wavy-navy-1000 hover:border-border-system-action-field-hover-selected",
44
+ "bg-wavy-navy-1000 border-blue-sparkle-600 [&_button]:bg-blue-sparkle-alpha-15",
45
+ "hover:bg-wavy-navy-1000 hover:border-blue-sparkle-600",
46
+ "text-content-presentation-global-primary-light",
47
+ "[&_*]:!text-content-presentation-global-primary-light",
36
48
  ],
37
49
  },
38
50
  ],
@@ -86,14 +98,14 @@ export const TreeDropDown = ({
86
98
  </div>
87
99
  <div
88
100
  className={cn(
89
- "mt-0 pl-[22px] relative overflow-auto scrollbar-hide transition-all duration-500 ease-in-out",
101
+ "mt-0 ps-[22px] relative overflow-auto scrollbar-hide transition-all duration-500 ease-in-out",
90
102
  {
91
103
  "max-h-[20000px] mt-1": isActive,
92
104
  "max-h-0": !isActive,
93
105
  },
94
106
  )}
95
107
  >
96
- <span className="h-full w-[1px] bg-border-system-global-primary absolute left-[21px] top-0 rounded-sm z-10" />
108
+ <span className="h-full w-[1px] bg-border-system-global-primary absolute start-[21px] top-0 rounded-sm z-10" />
97
109
  <div className={cn("h-full flex flex-col gap-1 w-full", childrenContainerClassName)}>
98
110
  {props.children}
99
111
  </div>
@@ -311,68 +311,68 @@ export const TreeFolder = forwardRef<TreeFolderHandle, TreeFolderProps>(
311
311
 
312
312
  <TreeFolderStyles />
313
313
  <DndContext {...contextProps}>
314
- <div ref={scrollRef} role="tree" className="tf-scroll flex-1 min-h-0 overflow-auto">
315
- {isEmpty ? (
316
- (emptyState ?? (
317
- <div className="text-xs text-content-presentation-global-tertiary p-3">
318
- Nothing here yet.
314
+ <div ref={scrollRef} role="tree" className="tf-scroll flex-1 min-h-0 overflow-auto pt-[6px]">
315
+ {isEmpty ? (
316
+ (emptyState ?? (
317
+ <div className="text-xs text-content-presentation-global-tertiary p-3">
318
+ Nothing here yet.
319
+ </div>
320
+ ))
321
+ ) : (
322
+ <div className="min-w-max" style={stripStyle}>
323
+ <DragList ids={ids} makeRoom={false}>
324
+ {visibleRows.map((row, idx) => {
325
+ const prevRow = visibleRows[idx - 1];
326
+ const nextRow = visibleRows[idx + 1];
327
+ const isSelected = selectedId === row.node.id;
328
+ const isDescendant = isDescendantOfSelected(row.node.id) && !isSelected;
329
+ const inBand = isSelected || isDescendant;
330
+
331
+ // Neighbour-aware band rounding: a row is "in-band" if it's the selected
332
+ // node itself or one of its descendants. The Set lookup handles deep nesting.
333
+ const prevInBand =
334
+ inBand &&
335
+ !!prevRow &&
336
+ (prevRow.node.id === selectedId || descendantIdSet.has(prevRow.node.id));
337
+ const nextInBand =
338
+ inBand &&
339
+ !!nextRow &&
340
+ (nextRow.node.id === selectedId || descendantIdSet.has(nextRow.node.id));
341
+
342
+ const isDragging = dragIdSet.has(row.node.id);
343
+ const isDropTargetInside =
344
+ dropTarget?.rowId === row.node.id && dropTarget.position === "inside";
345
+ const isDropBefore =
346
+ dropTarget?.rowId === row.node.id && dropTarget.position === "before";
347
+ const isDropAfter =
348
+ dropTarget?.rowId === row.node.id && dropTarget.position === "after";
349
+
350
+ return (
351
+ <TreeFolderRow
352
+ key={row.node.id}
353
+ row={row}
354
+ rowHeight={rowHeight}
355
+ indent={indent}
356
+ iconFor={iconFor}
357
+ isSelected={isSelected}
358
+ isAncestor={isAncestorFn(row.node.id) && !isSelected}
359
+ isDescendantOfSelected={isDescendant}
360
+ isPrevInBand={prevInBand}
361
+ isNextInBand={nextInBand}
362
+ isDragging={isDragging}
363
+ isDropTargetInside={isDropTargetInside}
364
+ isDropBefore={isDropBefore}
365
+ isDropAfter={isDropAfter}
366
+ dndEnabled={dndEnabled}
367
+ onSelect={handleSelect}
368
+ onToggle={handleToggle}
369
+ />
370
+ );
371
+ })}
372
+ </DragList>
319
373
  </div>
320
- ))
321
- ) : (
322
- <div className="min-w-max" style={stripStyle}>
323
- <DragList ids={ids} makeRoom={false}>
324
- {visibleRows.map((row, idx) => {
325
- const prevRow = visibleRows[idx - 1];
326
- const nextRow = visibleRows[idx + 1];
327
- const isSelected = selectedId === row.node.id;
328
- const isDescendant = isDescendantOfSelected(row.node.id) && !isSelected;
329
- const inBand = isSelected || isDescendant;
330
-
331
- // Neighbour-aware band rounding: a row is "in-band" if it's the selected
332
- // node itself or one of its descendants. The Set lookup handles deep nesting.
333
- const prevInBand =
334
- inBand &&
335
- !!prevRow &&
336
- (prevRow.node.id === selectedId || descendantIdSet.has(prevRow.node.id));
337
- const nextInBand =
338
- inBand &&
339
- !!nextRow &&
340
- (nextRow.node.id === selectedId || descendantIdSet.has(nextRow.node.id));
341
-
342
- const isDragging = dragIdSet.has(row.node.id);
343
- const isDropTargetInside =
344
- dropTarget?.rowId === row.node.id && dropTarget.position === "inside";
345
- const isDropBefore =
346
- dropTarget?.rowId === row.node.id && dropTarget.position === "before";
347
- const isDropAfter =
348
- dropTarget?.rowId === row.node.id && dropTarget.position === "after";
349
-
350
- return (
351
- <TreeFolderRow
352
- key={row.node.id}
353
- row={row}
354
- rowHeight={rowHeight}
355
- indent={indent}
356
- iconFor={iconFor}
357
- isSelected={isSelected}
358
- isAncestor={isAncestorFn(row.node.id) && !isSelected}
359
- isDescendantOfSelected={isDescendant}
360
- isPrevInBand={prevInBand}
361
- isNextInBand={nextInBand}
362
- isDragging={isDragging}
363
- isDropTargetInside={isDropTargetInside}
364
- isDropBefore={isDropBefore}
365
- isDropAfter={isDropAfter}
366
- dndEnabled={dndEnabled}
367
- onSelect={handleSelect}
368
- onToggle={handleToggle}
369
- />
370
- );
371
- })}
372
- </DragList>
373
- </div>
374
- )}
375
- </div>
374
+ )}
375
+ </div>
376
376
  </DndContext>
377
377
  </div>
378
378
  );
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.5.2",
2
+ "version": "2.5.4",
3
3
  "generatedBy": "scripts/bin/generateRegistry",
4
4
  "npmVersions": {
5
5
  "@dnd-kit/core": "^6.3.1",
@@ -186,7 +186,7 @@
186
186
  "react-day-picker"
187
187
  ],
188
188
  "registryDependencies": [
189
- "components/Button",
189
+ "components/ActionButton",
190
190
  "components/SimpleSelect",
191
191
  "utils/cn"
192
192
  ]
@@ -457,25 +457,13 @@
457
457
  "components/Button",
458
458
  "components/Drawer",
459
459
  "components/FormBuilder",
460
- "components/FormStepper",
461
460
  "components/HeaderBar",
462
461
  "components/SectionBlock",
462
+ "components/Stepper",
463
463
  "components/TabFormItem",
464
464
  "utils/cn"
465
465
  ]
466
466
  },
467
- {
468
- "name": "FormStepper",
469
- "type": "components",
470
- "path": "components/FormStepper.tsx",
471
- "npmDependencies": [
472
- "class-variance-authority"
473
- ],
474
- "registryDependencies": [
475
- "utils/cn",
476
- "utils/types"
477
- ]
478
- },
479
467
  {
480
468
  "name": "FormSummary",
481
469
  "type": "components",
@@ -714,6 +702,7 @@
714
702
  "class-variance-authority"
715
703
  ],
716
704
  "registryDependencies": [
705
+ "components/ActionButton",
717
706
  "components/Button",
718
707
  "components/DropdownMenu",
719
708
  "components/Input",
@@ -743,6 +732,7 @@
743
732
  "path": "components/SearchableTree.tsx",
744
733
  "npmDependencies": [],
745
734
  "registryDependencies": [
735
+ "components/ActionButton",
746
736
  "components/Button",
747
737
  "components/Input",
748
738
  "components/Popover",
@@ -757,6 +747,7 @@
757
747
  "path": "components/SearchableTreeDialog.tsx",
758
748
  "npmDependencies": [],
759
749
  "registryDependencies": [
750
+ "components/ActionButton",
760
751
  "components/Button",
761
752
  "components/Dialog",
762
753
  "components/Input",
@@ -793,7 +784,7 @@
793
784
  "class-variance-authority"
794
785
  ],
795
786
  "registryDependencies": [
796
- "components/Button",
787
+ "components/ActionButton",
797
788
  "components/DropdownMenu",
798
789
  "components/Tooltip",
799
790
  "utils/cn",