@arbidocs/blocks 0.4.83 → 0.4.85

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 (124) hide show
  1. package/dist/MailBodyEditor-5PIQLYVY.js +217 -0
  2. package/dist/MailBodyEditor-5PIQLYVY.js.map +1 -0
  3. package/dist/MailBodyEditor-D7MGJMLH.cjs +223 -0
  4. package/dist/MailBodyEditor-D7MGJMLH.cjs.map +1 -0
  5. package/dist/agents/index.cjs +281 -280
  6. package/dist/agents/index.js +6 -5
  7. package/dist/agents/workflows/StepBarFrame.d.ts +3 -1
  8. package/dist/agents/workflows/WorkflowRunner.d.ts +10 -1
  9. package/dist/agents/workflows/run.d.ts +24 -3
  10. package/dist/agents/workflows/stepWindow.d.ts +4 -2
  11. package/dist/agents/workflows/types.d.ts +5 -0
  12. package/dist/agents/workflows/useWorkflowView.d.ts +16 -1
  13. package/dist/chat/index.cjs +1 -1
  14. package/dist/chat/index.js +1 -1
  15. package/dist/{chunk-FE4ULGOR.js → chunk-2YOVK524.js} +28 -5
  16. package/dist/chunk-2YOVK524.js.map +1 -0
  17. package/dist/chunk-3R6XBYL7.cjs +576 -0
  18. package/dist/chunk-3R6XBYL7.cjs.map +1 -0
  19. package/dist/{chunk-CKB64Z4R.js → chunk-4XJZ6AAY.js} +6 -245
  20. package/dist/chunk-4XJZ6AAY.js.map +1 -0
  21. package/dist/{chunk-SB5ZKOYN.js → chunk-7C35WXYB.js} +4 -63
  22. package/dist/chunk-7C35WXYB.js.map +1 -0
  23. package/dist/chunk-7RJTEWYM.js +362 -0
  24. package/dist/chunk-7RJTEWYM.js.map +1 -0
  25. package/dist/chunk-AFSOUS5X.cjs +253 -0
  26. package/dist/chunk-AFSOUS5X.cjs.map +1 -0
  27. package/dist/{chunk-F4RUCUXF.cjs → chunk-C2HRZSAT.cjs} +2 -63
  28. package/dist/chunk-C2HRZSAT.cjs.map +1 -0
  29. package/dist/{chunk-RX35SMPR.js → chunk-FHOZMT5P.js} +7 -6
  30. package/dist/chunk-FHOZMT5P.js.map +1 -0
  31. package/dist/{chunk-ZVBPRMHJ.cjs → chunk-JH6JTI76.cjs} +27 -4
  32. package/dist/chunk-JH6JTI76.cjs.map +1 -0
  33. package/dist/{chunk-CONIA2ZA.js → chunk-KHY4PYU7.js} +246 -146
  34. package/dist/chunk-KHY4PYU7.js.map +1 -0
  35. package/dist/chunk-LGX6UFYG.js +557 -0
  36. package/dist/chunk-LGX6UFYG.js.map +1 -0
  37. package/dist/chunk-O4YPVYPO.cjs +373 -0
  38. package/dist/chunk-O4YPVYPO.cjs.map +1 -0
  39. package/dist/chunk-R26OHONI.js +250 -0
  40. package/dist/chunk-R26OHONI.js.map +1 -0
  41. package/dist/{chunk-RYYYHPFU.cjs → chunk-RZUMQM7W.cjs} +246 -146
  42. package/dist/chunk-RZUMQM7W.cjs.map +1 -0
  43. package/dist/{chunk-YJQVLVBJ.cjs → chunk-S5HZBXZA.cjs} +2 -243
  44. package/dist/chunk-S5HZBXZA.cjs.map +1 -0
  45. package/dist/{chunk-ZQYE7J3J.cjs → chunk-WRSBM6QN.cjs} +332 -94
  46. package/dist/chunk-WRSBM6QN.cjs.map +1 -0
  47. package/dist/{chunk-RSKSXEPW.js → chunk-X23U6QEJ.js} +324 -88
  48. package/dist/chunk-X23U6QEJ.js.map +1 -0
  49. package/dist/{chunk-XA5S4776.cjs → chunk-Z7YUCYI6.cjs} +51 -50
  50. package/dist/chunk-Z7YUCYI6.cjs.map +1 -0
  51. package/dist/collaboration/index.cjs +100 -49
  52. package/dist/collaboration/index.js +4 -1
  53. package/dist/collaboration/mail/MailBodyEditor.d.ts +7 -0
  54. package/dist/collaboration/mail/MailDeliveryList.d.ts +8 -0
  55. package/dist/collaboration/mail/MailDocumentPicker.d.ts +15 -0
  56. package/dist/collaboration/mail/MailGrid.d.ts +17 -0
  57. package/dist/collaboration/mail/MailMessageView.d.ts +27 -0
  58. package/dist/collaboration/mail/PlainMailBodyEditor.d.ts +12 -0
  59. package/dist/collaboration/mail/index.d.ts +6 -0
  60. package/dist/collaboration/mail/mailCompose.d.ts +24 -0
  61. package/dist/connect/index.cjs +1684 -72
  62. package/dist/connect/index.cjs.map +1 -1
  63. package/dist/connect/index.d.ts +2 -1
  64. package/dist/connect/index.js +1670 -64
  65. package/dist/connect/index.js.map +1 -1
  66. package/dist/connection/ConnectedTagTable.d.ts +32 -0
  67. package/dist/connection/WorkflowRunnerDialogs.d.ts +12 -1
  68. package/dist/connection/mail/ConnectedMailAccounts.d.ts +21 -0
  69. package/dist/connection/mail/ConnectedMailComposer.d.ts +40 -0
  70. package/dist/connection/mail/ConnectedMailSetup.d.ts +16 -0
  71. package/dist/connection/mail/ConnectedMailbox.d.ts +65 -0
  72. package/dist/connection/mail/MailComposerForm.d.ts +25 -0
  73. package/dist/connection/mail/attachments.d.ts +13 -0
  74. package/dist/connection/mail/index.d.ts +6 -0
  75. package/dist/connection/mail/mailbox.d.ts +6 -0
  76. package/dist/connection/mail/types.d.ts +92 -0
  77. package/dist/connection/useConnectedWorkNotifications.d.ts +6 -0
  78. package/dist/connection/useWorkflowThread.d.ts +7 -2
  79. package/dist/document-tools/SignDocumentDialog.d.ts +9 -2
  80. package/dist/document-tools/index.cjs +2 -2
  81. package/dist/document-tools/index.js +1 -1
  82. package/dist/facts/index.cjs +2 -2
  83. package/dist/facts/index.js +2 -2
  84. package/dist/files/index.cjs +47 -367
  85. package/dist/files/index.cjs.map +1 -1
  86. package/dist/files/index.js +10 -360
  87. package/dist/files/index.js.map +1 -1
  88. package/dist/index.cjs +510 -451
  89. package/dist/index.cjs.map +1 -1
  90. package/dist/index.js +21 -18
  91. package/dist/index.js.map +1 -1
  92. package/dist/settings/index.cjs +10 -9
  93. package/dist/settings/index.cjs.map +1 -1
  94. package/dist/settings/index.js +2 -1
  95. package/dist/settings/index.js.map +1 -1
  96. package/dist/shell/index.cjs +1 -1
  97. package/dist/shell/index.js +1 -1
  98. package/dist/tags/TagColumnsEditor.d.ts +34 -0
  99. package/dist/tags/TagDetail.d.ts +13 -11
  100. package/dist/tags/TagTable.d.ts +99 -0
  101. package/dist/tags/TagsNav.d.ts +2 -2
  102. package/dist/tags/index.d.ts +7 -5
  103. package/dist/tags/{tagMatrixDocx.d.ts → tagTableDocx.d.ts} +12 -12
  104. package/dist/tags/tagTableModel.d.ts +47 -0
  105. package/dist/workflow-canvas/index.cjs +49 -48
  106. package/dist/workflow-canvas/index.cjs.map +1 -1
  107. package/dist/workflow-canvas/index.js +6 -5
  108. package/dist/workflow-canvas/index.js.map +1 -1
  109. package/package.json +29 -4
  110. package/dist/chunk-CKB64Z4R.js.map +0 -1
  111. package/dist/chunk-CONIA2ZA.js.map +0 -1
  112. package/dist/chunk-F4RUCUXF.cjs.map +0 -1
  113. package/dist/chunk-FE4ULGOR.js.map +0 -1
  114. package/dist/chunk-RSKSXEPW.js.map +0 -1
  115. package/dist/chunk-RX35SMPR.js.map +0 -1
  116. package/dist/chunk-RYYYHPFU.cjs.map +0 -1
  117. package/dist/chunk-SB5ZKOYN.js.map +0 -1
  118. package/dist/chunk-XA5S4776.cjs.map +0 -1
  119. package/dist/chunk-YJQVLVBJ.cjs.map +0 -1
  120. package/dist/chunk-ZQYE7J3J.cjs.map +0 -1
  121. package/dist/chunk-ZVBPRMHJ.cjs.map +0 -1
  122. package/dist/connection/ConnectedTagMatrix.d.ts +0 -23
  123. package/dist/tags/TagMatrix.d.ts +0 -87
  124. package/dist/tags/tagMatrixModel.d.ts +0 -43
@@ -0,0 +1,373 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
5
+ var react = require('react');
6
+ var lucideReact = require('lucide-react');
7
+ var ui = require('@arbidocs/react/ui');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ var DEFAULT_FOLDER_PICKER_LABELS = {
11
+ none: "None",
12
+ removeFromFolder: "Remove from folder",
13
+ searchOrCreate: "Search or create...",
14
+ noFolders: "No folders yet",
15
+ create: (name) => `Create \u201C${name}\u201D`
16
+ };
17
+ function FolderPickerRow({
18
+ label,
19
+ icon,
20
+ count,
21
+ depth,
22
+ isActive,
23
+ muted,
24
+ checkbox,
25
+ indeterminate,
26
+ testId,
27
+ onClick
28
+ }) {
29
+ return /* @__PURE__ */ jsxRuntime.jsxs(
30
+ "button",
31
+ {
32
+ type: "button",
33
+ "data-testid": testId,
34
+ onClick,
35
+ role: checkbox ? "checkbox" : void 0,
36
+ "aria-checked": checkbox ? indeterminate ? "mixed" : isActive : void 0,
37
+ style: { paddingLeft: `${4 + depth * 14}px` },
38
+ className: ui.cn(
39
+ // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a
40
+ // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight
41
+ // even with a real mouse attached. The arbitrary selector has no media gate.
42
+ "flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11",
43
+ isActive && "bg-primary/10",
44
+ muted && !isActive && "text-muted-foreground"
45
+ ),
46
+ children: [
47
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex w-4 shrink-0 items-center justify-center", children: checkbox ? /* @__PURE__ */ jsxRuntime.jsx(
48
+ "span",
49
+ {
50
+ className: ui.cn(
51
+ "flex size-3.5 items-center justify-center rounded-[3px] border transition-colors",
52
+ isActive || indeterminate ? "border-primary bg-primary text-primary-foreground" : "border-muted-foreground/40"
53
+ ),
54
+ children: indeterminate ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { className: "size-2.5" }) : isActive && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-2.5" })
55
+ }
56
+ ) : isActive && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "size-3.5 text-primary" }) }),
57
+ icon,
58
+ label !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.cn("min-w-0 truncate", isActive && "font-semibold text-primary"), children: label }),
59
+ count !== void 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto pl-2 text-sm font-semibold text-muted-foreground", children: count })
60
+ ]
61
+ }
62
+ );
63
+ }
64
+ function FolderTree({
65
+ nodes,
66
+ unfiledCount,
67
+ value,
68
+ onChange,
69
+ showUnfiledAlways,
70
+ labels
71
+ }) {
72
+ const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels };
73
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-h-[240px] overflow-y-auto", children: [
74
+ nodes.map((node) => /* @__PURE__ */ jsxRuntime.jsx(
75
+ FolderPickerRow,
76
+ {
77
+ label: node.label,
78
+ icon: node.icon,
79
+ count: node.count,
80
+ depth: node.depth,
81
+ isActive: value === node.path,
82
+ onClick: () => onChange(node.path)
83
+ },
84
+ node.path
85
+ )),
86
+ (unfiledCount > 0 || showUnfiledAlways) && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
87
+ nodes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-1 border-t border-border" }),
88
+ /* @__PURE__ */ jsxRuntime.jsx(
89
+ FolderPickerRow,
90
+ {
91
+ label: l.none,
92
+ count: unfiledCount,
93
+ depth: 0,
94
+ isActive: value === null,
95
+ muted: true,
96
+ onClick: () => onChange(null)
97
+ }
98
+ )
99
+ ] })
100
+ ] });
101
+ }
102
+ function FolderBreadcrumb({ folder }) {
103
+ const parts = folder.split("/");
104
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: parts.map((part, i) => /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex items-center gap-0.5", children: [
105
+ i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mx-0.5 text-sm text-muted-foreground/50", children: "/" }),
106
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: i < parts.length - 1 ? "text-sm text-muted-foreground" : "", children: part })
107
+ ] }, i)) });
108
+ }
109
+ function FolderCommandList({
110
+ folders,
111
+ value,
112
+ onSelect,
113
+ showRemove = false,
114
+ removeLabel,
115
+ placeholder,
116
+ autoFocus = true,
117
+ labels,
118
+ testIds
119
+ }) {
120
+ const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels };
121
+ const [search, setSearch] = react.useState("");
122
+ const trimmed = search.trim();
123
+ const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase());
124
+ const handleCreate = react.useCallback(
125
+ (name) => {
126
+ const next = name.trim();
127
+ if (!next) return;
128
+ onSelect(next);
129
+ setSearch("");
130
+ },
131
+ [onSelect]
132
+ );
133
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Command, { shouldFilter: true, children: [
134
+ /* @__PURE__ */ jsxRuntime.jsx(
135
+ ui.CommandInput,
136
+ {
137
+ placeholder: placeholder ?? l.searchOrCreate,
138
+ value: search,
139
+ onValueChange: setSearch,
140
+ autoFocus,
141
+ onKeyDown: (e) => {
142
+ if (e.key === "Enter" && trimmed && !matchesExisting) {
143
+ e.preventDefault();
144
+ handleCreate(search);
145
+ }
146
+ }
147
+ }
148
+ ),
149
+ /* @__PURE__ */ jsxRuntime.jsxs(ui.CommandList, { children: [
150
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandEmpty, { children: trimmed ? /* @__PURE__ */ jsxRuntime.jsxs(
151
+ "button",
152
+ {
153
+ type: "button",
154
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.create, { testId: "folder-picker-create" }),
155
+ onClick: () => handleCreate(search),
156
+ onPointerDown: (e) => e.preventDefault(),
157
+ className: "flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11",
158
+ children: [
159
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "size-3.5 shrink-0" }),
160
+ l.create(trimmed)
161
+ ]
162
+ }
163
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: l.noFolders }) }),
164
+ /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: folders.map((folder) => /* @__PURE__ */ jsxRuntime.jsxs(
165
+ ui.CommandItem,
166
+ {
167
+ value: folder,
168
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.option?.(folder), {
169
+ testId: `folder-picker-option-${folder}`
170
+ }),
171
+ onSelect: () => onSelect(folder),
172
+ onPointerDown: (e) => e.preventDefault(),
173
+ className: "cursor-pointer text-sm",
174
+ children: [
175
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text" }),
176
+ /* @__PURE__ */ jsxRuntime.jsx(FolderBreadcrumb, { folder }),
177
+ value === folder && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto flex-none text-sm text-primary", children: "\u2713" })
178
+ ]
179
+ },
180
+ folder
181
+ )) }),
182
+ trimmed && !matchesExisting && folders.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(
183
+ ui.CommandItem,
184
+ {
185
+ value: `__create__${trimmed}`,
186
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.createOption, {
187
+ testId: "folder-picker-create-option"
188
+ }),
189
+ onSelect: () => handleCreate(search),
190
+ onPointerDown: (e) => e.preventDefault(),
191
+ className: "cursor-pointer text-sm text-primary",
192
+ children: [
193
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Plus, { className: "mr-1.5 size-3.5 shrink-0" }),
194
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: l.create(trimmed) })
195
+ ]
196
+ }
197
+ ) }),
198
+ showRemove && /* @__PURE__ */ jsxRuntime.jsx(ui.CommandGroup, { children: /* @__PURE__ */ jsxRuntime.jsxs(
199
+ ui.CommandItem,
200
+ {
201
+ value: "__none__",
202
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testIds?.remove, { testId: "folder-picker-remove" }),
203
+ onSelect: () => onSelect(null),
204
+ onPointerDown: (e) => e.preventDefault(),
205
+ className: "cursor-pointer text-sm text-muted-foreground",
206
+ children: [
207
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "mr-1 size-3.5 shrink-0" }),
208
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: removeLabel ?? l.removeFromFolder }),
209
+ value === null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto flex-none text-sm text-primary", children: "\u2713" })
210
+ ]
211
+ }
212
+ ) })
213
+ ] })
214
+ ] });
215
+ }
216
+ var DEFAULT_FOLDER_FILTER_LABELS = {
217
+ all: "All",
218
+ newFolder: "New folder"
219
+ };
220
+ function FolderFilterButton({
221
+ label,
222
+ icon,
223
+ isActive,
224
+ open,
225
+ onOpenChange,
226
+ allCount,
227
+ onSelectAll,
228
+ onNewFolder,
229
+ children,
230
+ className,
231
+ labels,
232
+ testId,
233
+ newFolderTestId
234
+ }) {
235
+ const l = { ...DEFAULT_FOLDER_FILTER_LABELS, ...labels };
236
+ return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { open, onOpenChange, children: [
237
+ /* @__PURE__ */ jsxRuntime.jsx(ui.PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
238
+ ui.Button,
239
+ {
240
+ variant: "ghost",
241
+ size: "sm",
242
+ "data-slot": "folder-filter-button",
243
+ "data-testid": testId,
244
+ className: ui.cn(
245
+ "h-7 shrink-0 gap-1.5 px-2 text-sm font-normal pointer-coarse:h-10",
246
+ isActive && "bg-accent font-medium text-accent-foreground",
247
+ className
248
+ ),
249
+ children: [
250
+ icon ?? /* @__PURE__ */ jsxRuntime.jsx(
251
+ lucideReact.FolderOpen,
252
+ {
253
+ className: ui.cn(
254
+ "h-3.5 w-3.5 shrink-0 text-muted-foreground",
255
+ isActive && "fill-muted-foreground/30"
256
+ )
257
+ }
258
+ ),
259
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "max-w-[280px] truncate", children: label }),
260
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 text-foreground", strokeWidth: 2.5 })
261
+ ]
262
+ }
263
+ ) }),
264
+ /* @__PURE__ */ jsxRuntime.jsxs(
265
+ ui.PopoverContent,
266
+ {
267
+ className: "w-max min-w-56 max-w-[480px] p-1 shadow-lg",
268
+ align: "start",
269
+ sideOffset: 4,
270
+ children: [
271
+ onSelectAll && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
272
+ /* @__PURE__ */ jsxRuntime.jsx(
273
+ FolderPickerRow,
274
+ {
275
+ label: l.all,
276
+ count: allCount,
277
+ depth: 0,
278
+ isActive: !isActive,
279
+ onClick: onSelectAll
280
+ }
281
+ ),
282
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-1 border-t border-border" })
283
+ ] }),
284
+ children,
285
+ onNewFolder && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
286
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "my-1 border-t border-border" }),
287
+ /* @__PURE__ */ jsxRuntime.jsxs(
288
+ "button",
289
+ {
290
+ type: "button",
291
+ onClick: onNewFolder,
292
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(newFolderTestId, { testId: "explorer-new-folder" }),
293
+ className: "flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11",
294
+ children: [
295
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderPlus, { className: "h-3.5 w-3.5" }),
296
+ l.newFolder
297
+ ]
298
+ }
299
+ )
300
+ ] })
301
+ ]
302
+ }
303
+ )
304
+ ] });
305
+ }
306
+ function FilesFilterBar({ className, ...props }) {
307
+ return /* @__PURE__ */ jsxRuntime.jsx(
308
+ "div",
309
+ {
310
+ "data-slot": "files-filter-bar",
311
+ className: ui.cn("flex min-w-0 flex-1 flex-nowrap items-center gap-2", className),
312
+ ...props
313
+ }
314
+ );
315
+ }
316
+ function FilesTagsButton({
317
+ onClick,
318
+ label = "Tags",
319
+ className,
320
+ testId
321
+ }) {
322
+ return /* @__PURE__ */ jsxRuntime.jsxs(
323
+ ui.Button,
324
+ {
325
+ variant: "ghost",
326
+ size: "sm",
327
+ className: ui.cn("h-8 shrink-0 gap-1.5 px-2 font-normal pointer-coarse:h-11", className),
328
+ onClick,
329
+ "data-testid": chunkMHVNT4J3_cjs.testIdOr(testId, { testId: "filter-bar-tags-button" }),
330
+ children: [
331
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BookMarked, { className: "h-3.5 w-3.5" }),
332
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm max-[480px]:sr-only", children: label })
333
+ ]
334
+ }
335
+ );
336
+ }
337
+ function FilesViewCenter({ className, ...props }) {
338
+ return /* @__PURE__ */ jsxRuntime.jsx(
339
+ "div",
340
+ {
341
+ "data-slot": "files-view-center",
342
+ className: ui.cn("@container flex min-w-[9.5rem] flex-1 items-center gap-2", className),
343
+ ...props
344
+ }
345
+ );
346
+ }
347
+ function FilesModalFooter({ children, className }) {
348
+ return /* @__PURE__ */ jsxRuntime.jsx(
349
+ "div",
350
+ {
351
+ "data-slot": "files-modal-footer",
352
+ className: ui.cn(
353
+ // Sticks to the bottom of the modal's scrolling body so Close is always reachable.
354
+ "sticky bottom-0 z-40 flex justify-end gap-2 border-t border-border bg-background px-4 py-3 sm:px-6",
355
+ className
356
+ ),
357
+ children
358
+ }
359
+ );
360
+ }
361
+
362
+ exports.DEFAULT_FOLDER_FILTER_LABELS = DEFAULT_FOLDER_FILTER_LABELS;
363
+ exports.DEFAULT_FOLDER_PICKER_LABELS = DEFAULT_FOLDER_PICKER_LABELS;
364
+ exports.FilesFilterBar = FilesFilterBar;
365
+ exports.FilesModalFooter = FilesModalFooter;
366
+ exports.FilesTagsButton = FilesTagsButton;
367
+ exports.FilesViewCenter = FilesViewCenter;
368
+ exports.FolderCommandList = FolderCommandList;
369
+ exports.FolderFilterButton = FolderFilterButton;
370
+ exports.FolderPickerRow = FolderPickerRow;
371
+ exports.FolderTree = FolderTree;
372
+ //# sourceMappingURL=chunk-O4YPVYPO.cjs.map
373
+ //# sourceMappingURL=chunk-O4YPVYPO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/FolderPicker.tsx","../src/files/bulk/FolderFilterButton.tsx","../src/files/page/FilesPageParts.tsx"],"names":["jsxs","cn","jsx","Minus","Check","Fragment","useState","useCallback","Command","CommandInput","CommandList","CommandEmpty","testIdOr","Plus","CommandGroup","CommandItem","FolderOpen","X","Popover","PopoverTrigger","Button","ChevronDown","PopoverContent","FolderPlus","BookMarked"],"mappings":"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","file":"chunk-O4YPVYPO.cjs","sourcesContent":["import { useCallback, useState } from 'react'\nimport type { ReactNode } from 'react'\nimport { Check, FolderOpen, Minus, Plus, X } from 'lucide-react'\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n cn,\n} from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the folder pickers. Pass a partial `labels` to translate or reword. */\nexport interface FolderPickerLabels {\n none: string\n removeFromFolder: string\n searchOrCreate: string\n noFolders: string\n create: (name: string) => string\n}\n\nexport const DEFAULT_FOLDER_PICKER_LABELS: FolderPickerLabels = {\n none: 'None',\n removeFromFolder: 'Remove from folder',\n searchOrCreate: 'Search or create...',\n noFolders: 'No folders yet',\n create: (name) => `Create \\u201c${name}\\u201d`,\n}\n\nexport interface FolderCommandListTestIds {\n create: string\n createOption: string\n remove: string\n /** Replaces the whole `folder-picker-option-<folder>` id. */\n option: (folder: string) => string\n}\n\n// ── Tree row ────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderPickerRowProps {\n label: string\n /** Optional leading glyph (e.g. a connector brand mark for provider roots). */\n icon?: ReactNode\n /** Shown at the right edge; omit for rows with nothing to count (e.g. an empty unread count). */\n count?: number\n depth: number\n isActive: boolean\n muted?: boolean\n /** Test id of the row button (none by default). */\n testId?: string\n /**\n * Draw a checkbox in the leading slot instead of the single-select tick. A list you can pick\n * SEVERAL rows from should look like one: a lone tick reads \"this is the current one\", a box\n * reads \"tick the ones you want\".\n */\n checkbox?: boolean\n /** Checkbox only: some descendants are selected, so show a dash, not a tick. */\n indeterminate?: boolean\n onClick: () => void\n}\n\n/** One folder row: indented by depth, with a count. Whole row is the target (44px on touch). */\nexport function FolderPickerRow({\n label,\n icon,\n count,\n depth,\n isActive,\n muted,\n checkbox,\n indeterminate,\n testId,\n onClick,\n}: FolderPickerRowProps) {\n return (\n <button\n type=\"button\"\n data-testid={testId}\n onClick={onClick}\n // The row IS the checkbox: a real <Checkbox> inside this button would nest one interactive\n // element in another and swallow the click. role + aria-checked carry the same meaning.\n role={checkbox ? 'checkbox' : undefined}\n aria-checked={checkbox ? (indeterminate ? 'mixed' : isActive) : undefined}\n style={{ paddingLeft: `${4 + depth * 14}px` }}\n className={cn(\n // `[&:hover]:`, not `hover:`: the latter compiles behind `@media (hover: hover)`, so on a\n // touchscreen whose PRIMARY pointer reports `hover: none` the row would never highlight\n // even with a real mouse attached. The arbitrary selector has no media gate.\n 'flex w-full items-center gap-1 rounded-sm py-1 pr-2 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&:hover]:bg-accent pointer-coarse:min-h-11',\n isActive && 'bg-primary/10',\n muted && !isActive && 'text-muted-foreground'\n )}\n >\n <span className=\"flex w-4 shrink-0 items-center justify-center\">\n {checkbox ? (\n <span\n className={cn(\n 'flex size-3.5 items-center justify-center rounded-[3px] border transition-colors',\n isActive || indeterminate\n ? 'border-primary bg-primary text-primary-foreground'\n : 'border-muted-foreground/40'\n )}\n >\n {indeterminate ? (\n <Minus className=\"size-2.5\" />\n ) : (\n isActive && <Check className=\"size-2.5\" />\n )}\n </span>\n ) : (\n isActive && <Check className=\"size-3.5 text-primary\" />\n )}\n </span>\n {icon}\n {label !== '' && (\n <span className={cn('min-w-0 truncate', isActive && 'font-semibold text-primary')}>\n {label}\n </span>\n )}\n {count !== undefined && (\n <span className=\"ml-auto pl-2 text-sm font-semibold text-muted-foreground\">{count}</span>\n )}\n </button>\n )\n}\n\n// ── Tree ────────────────────────────────────────────────────────────────────────────────────\n\nexport interface FolderTreeNode {\n path: string\n label: string\n depth: number\n count: number\n /** Replaces the label's default look (provider roots show a brand mark). */\n icon?: ReactNode\n}\n\nexport interface FolderTreeProps {\n nodes: FolderTreeNode[]\n unfiledCount: number\n /** string = folder path selected, null = Unfiled selected, undefined = nothing selected. */\n value: string | null | undefined\n onChange: (folder: string | null) => void\n /** Show the Unfiled (\"None\") row even when it is empty. */\n showUnfiledAlways?: boolean\n labels?: Partial<FolderPickerLabels>\n}\n\n/** Folder hierarchy with an Unfiled option at the bottom. No \"All\" row: callers add their own. */\nexport function FolderTree({\n nodes,\n unfiledCount,\n value,\n onChange,\n showUnfiledAlways,\n labels,\n}: FolderTreeProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n return (\n <div className=\"max-h-[240px] overflow-y-auto\">\n {nodes.map((node) => (\n <FolderPickerRow\n key={node.path}\n label={node.label}\n icon={node.icon}\n count={node.count}\n depth={node.depth}\n isActive={value === node.path}\n onClick={() => onChange(node.path)}\n />\n ))}\n {(unfiledCount > 0 || showUnfiledAlways) && (\n <>\n {nodes.length > 0 && <div className=\"my-1 border-t border-border\" />}\n <FolderPickerRow\n label={l.none}\n count={unfiledCount}\n depth={0}\n isActive={value === null}\n muted\n onClick={() => onChange(null)}\n />\n </>\n )}\n </div>\n )\n}\n\n// ── Searchable list ─────────────────────────────────────────────────────────────────────────\n\nfunction FolderBreadcrumb({ folder }: { folder: string }) {\n const parts = folder.split('/')\n return (\n <span className=\"whitespace-nowrap\">\n {parts.map((part, i) => (\n <span key={i} className=\"inline-flex items-center gap-0.5\">\n {i > 0 && <span className=\"mx-0.5 text-sm text-muted-foreground/50\">/</span>}\n <span className={i < parts.length - 1 ? 'text-sm text-muted-foreground' : ''}>\n {part}\n </span>\n </span>\n ))}\n </span>\n )\n}\n\nexport interface FolderCommandListProps {\n /** Existing folder paths (the host derives them from its documents). */\n folders: string[]\n /** Selected folder (null = unfiled, undefined = no selection). */\n value?: string | null\n /** A folder was picked or a new one created. */\n onSelect: (folder: string | null) => void\n /** Show the remove / move-to-root option. */\n showRemove?: boolean\n /** Wins over `labels.removeFromFolder`. */\n removeLabel?: string\n /** Wins over `labels.searchOrCreate`. */\n placeholder?: string\n autoFocus?: boolean\n labels?: Partial<FolderPickerLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<FolderCommandListTestIds>\n}\n\n/**\n * Searchable folder picker: filter existing folders, create one by typing a new name, optional\n * \"Remove from folder\". Shows hierarchy as breadcrumbs.\n */\nexport function FolderCommandList({\n folders,\n value,\n onSelect,\n showRemove = false,\n removeLabel,\n placeholder,\n autoFocus = true,\n labels,\n testIds,\n}: FolderCommandListProps) {\n const l = { ...DEFAULT_FOLDER_PICKER_LABELS, ...labels }\n const [search, setSearch] = useState('')\n const trimmed = search.trim()\n const matchesExisting = folders.some((f) => f.toLowerCase() === trimmed.toLowerCase())\n\n const handleCreate = useCallback(\n (name: string) => {\n const next = name.trim()\n if (!next) return\n onSelect(next)\n setSearch('')\n },\n [onSelect]\n )\n\n return (\n <Command shouldFilter={true}>\n <CommandInput\n placeholder={placeholder ?? l.searchOrCreate}\n value={search}\n onValueChange={setSearch}\n autoFocus={autoFocus}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && trimmed && !matchesExisting) {\n e.preventDefault()\n handleCreate(search)\n }\n }}\n />\n <CommandList>\n <CommandEmpty>\n {trimmed ? (\n <button\n type=\"button\"\n data-testid={testIdOr(testIds?.create, { testId: 'folder-picker-create' })}\n onClick={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"flex w-full cursor-pointer items-center gap-1.5 rounded px-2 py-1.5 text-left text-sm text-primary hover:bg-accent pointer-coarse:min-h-11\"\n >\n <Plus className=\"size-3.5 shrink-0\" />\n {l.create(trimmed)}\n </button>\n ) : (\n <span className=\"text-muted-foreground\">{l.noFolders}</span>\n )}\n </CommandEmpty>\n <CommandGroup>\n {folders.map((folder) => (\n <CommandItem\n key={folder}\n value={folder}\n data-testid={testIdOr(testIds?.option?.(folder), {\n testId: `folder-picker-option-${folder}`,\n })}\n onSelect={() => onSelect(folder)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm\"\n >\n <FolderOpen className=\"mr-1.5 size-3.5 flex-none shrink-0 text-yellow-text\" />\n <FolderBreadcrumb folder={folder} />\n {value === folder && (\n <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>\n )}\n </CommandItem>\n ))}\n </CommandGroup>\n\n {trimmed && !matchesExisting && folders.length > 0 && (\n <CommandGroup>\n <CommandItem\n value={`__create__${trimmed}`}\n data-testid={testIdOr(testIds?.createOption, {\n testId: 'folder-picker-create-option',\n })}\n onSelect={() => handleCreate(search)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-primary\"\n >\n <Plus className=\"mr-1.5 size-3.5 shrink-0\" />\n <span>{l.create(trimmed)}</span>\n </CommandItem>\n </CommandGroup>\n )}\n\n {showRemove && (\n <CommandGroup>\n <CommandItem\n value=\"__none__\"\n data-testid={testIdOr(testIds?.remove, { testId: 'folder-picker-remove' })}\n onSelect={() => onSelect(null)}\n onPointerDown={(e) => e.preventDefault()}\n className=\"cursor-pointer text-sm text-muted-foreground\"\n >\n <X className=\"mr-1 size-3.5 shrink-0\" />\n <span>{removeLabel ?? l.removeFromFolder}</span>\n {value === null && <span className=\"ml-auto flex-none text-sm text-primary\">✓</span>}\n </CommandItem>\n </CommandGroup>\n )}\n </CommandList>\n </Command>\n )\n}\n","import type { ReactNode } from 'react'\nimport { ChevronDown, FolderOpen, FolderPlus } from 'lucide-react'\nimport { Button, Popover, PopoverContent, PopoverTrigger, cn } from '@arbidocs/react/ui'\nimport { FolderPickerRow } from '../FolderPicker'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Every fixed string of the folder filter. Pass a partial `labels` to translate or reword. */\nexport interface FolderFilterLabels {\n all: string\n newFolder: string\n}\n\nexport const DEFAULT_FOLDER_FILTER_LABELS: FolderFilterLabels = {\n all: 'All',\n newFolder: 'New folder',\n}\n\nexport interface FolderFilterButtonProps {\n /** Text of the active folder (\"All\", \"None\", or the display path). */\n label: string\n /** Leading glyph for connector folders; falls back to a folder icon. */\n icon?: ReactNode\n /** A folder filter is active: the trigger takes the selection tint. */\n isActive: boolean\n open: boolean\n onOpenChange: (open: boolean) => void\n /** Total documents, shown on the \"All\" row. */\n allCount?: number\n /** When set, the popover starts with an \"All\" row; omit it for lists that have no \"All\". */\n onSelectAll?: () => void\n /** When set, the popover offers a \"New folder\" action. */\n onNewFolder?: () => void\n /** Slot: the folder tree picker. */\n children: ReactNode\n className?: string\n labels?: Partial<FolderFilterLabels>\n /** Test id of the trigger button (none by default). */\n testId?: string\n /** Overrides the \"New folder\" test id (default `explorer-new-folder`). */\n newFolderTestId?: string\n}\n\n/**\n * The folder filter control: a ghost button naming the active folder that opens a popover with\n * an \"All\" row, the folder tree (slot) and an optional \"New folder\" action.\n */\nexport function FolderFilterButton({\n label,\n icon,\n isActive,\n open,\n onOpenChange,\n allCount,\n onSelectAll,\n onNewFolder,\n children,\n className,\n labels,\n testId,\n newFolderTestId,\n}: FolderFilterButtonProps) {\n const l = { ...DEFAULT_FOLDER_FILTER_LABELS, ...labels }\n return (\n <Popover open={open} onOpenChange={onOpenChange}>\n <PopoverTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n data-slot=\"folder-filter-button\"\n data-testid={testId}\n className={cn(\n 'h-7 shrink-0 gap-1.5 px-2 text-sm font-normal pointer-coarse:h-10',\n isActive && 'bg-accent font-medium text-accent-foreground',\n className\n )}\n >\n {icon ?? (\n <FolderOpen\n className={cn(\n 'h-3.5 w-3.5 shrink-0 text-muted-foreground',\n isActive && 'fill-muted-foreground/30'\n )}\n />\n )}\n <span className=\"max-w-[280px] truncate\">{label}</span>\n <ChevronDown className=\"h-4 w-4 text-foreground\" strokeWidth={2.5} />\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className=\"w-max min-w-56 max-w-[480px] p-1 shadow-lg\"\n align=\"start\"\n sideOffset={4}\n >\n {onSelectAll && (\n <>\n <FolderPickerRow\n label={l.all}\n count={allCount}\n depth={0}\n isActive={!isActive}\n onClick={onSelectAll}\n />\n <div className=\"my-1 border-t border-border\" />\n </>\n )}\n {children}\n {onNewFolder && (\n <>\n <div className=\"my-1 border-t border-border\" />\n <button\n type=\"button\"\n onClick={onNewFolder}\n data-testid={testIdOr(newFolderTestId, { testId: 'explorer-new-folder' })}\n className=\"flex w-full items-center gap-2 rounded-md px-2 py-1.5 text-sm text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground pointer-coarse:min-h-11\"\n >\n <FolderPlus className=\"h-3.5 w-3.5\" />\n {l.newFolder}\n </button>\n </>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import type { ComponentProps, ReactNode } from 'react'\nimport { BookMarked } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../../chat/test-id'\n\n/** Row of controls that follows the tab: filter field, folder picker, tags button. */\nexport function FilesFilterBar({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-filter-bar\"\n className={cn('flex min-w-0 flex-1 flex-nowrap items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesTagsButtonProps {\n onClick: () => void\n /** Button text (default \"Tags\"). */\n label?: string\n className?: string\n /** Overrides the test id (default `filter-bar-tags-button`). */\n testId?: string\n}\n\n/** Opens the labels / annotations vocabulary editor. The label collapses to sr-only on phones. */\nexport function FilesTagsButton({\n onClick,\n label = 'Tags',\n className,\n testId,\n}: FilesTagsButtonProps) {\n return (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className={cn('h-8 shrink-0 gap-1.5 px-2 font-normal pointer-coarse:h-11', className)}\n onClick={onClick}\n data-testid={testIdOr(testId, { testId: 'filter-bar-tags-button' })}\n >\n <BookMarked className=\"h-3.5 w-3.5\" />\n <span className=\"text-sm max-[480px]:sr-only\">{label}</span>\n </Button>\n )\n}\n\n/**\n * The view switch beside the page title. Marks a size container so the switch collapses its labels\n * to icons by the room it is given (not the viewport), and shrinks with the row.\n */\nexport function FilesViewCenter({ className, ...props }: ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"files-view-center\"\n className={cn('@container flex min-w-[9.5rem] flex-1 items-center gap-2', className)}\n {...props}\n />\n )\n}\n\nexport interface FilesModalFooterProps {\n children?: ReactNode\n className?: string\n}\n\n/** Footer row used when the page is hosted in a modal. */\nexport function FilesModalFooter({ children, className }: FilesModalFooterProps) {\n return (\n <div\n data-slot=\"files-modal-footer\"\n className={cn(\n // Sticks to the bottom of the modal's scrolling body so Close is always reachable.\n 'sticky bottom-0 z-40 flex justify-end gap-2 border-t border-border bg-background px-4 py-3 sm:px-6',\n className\n )}\n >\n {children}\n </div>\n )\n}\n"]}