@arbidocs/blocks 0.4.71 → 0.4.73

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 (179) hide show
  1. package/dist/agents/index.cjs +404 -266
  2. package/dist/agents/index.js +10 -8
  3. package/dist/agents/tasks/TaskActivityTimeline.d.ts +1 -1
  4. package/dist/agents/tasks/WorkflowThreadStrip.d.ts +58 -0
  5. package/dist/agents/tasks/index.d.ts +1 -0
  6. package/dist/agents/workflows/WorkflowRunner.d.ts +70 -0
  7. package/dist/agents/workflows/index.d.ts +7 -1
  8. package/dist/agents/workflows/planSteps.d.ts +28 -0
  9. package/dist/agents/workflows/run.d.ts +97 -0
  10. package/dist/agents/workflows/skillMarkdown.d.ts +15 -0
  11. package/dist/agents/workflows/types.d.ts +109 -0
  12. package/dist/agents/workflows/useWorkflowPreview.d.ts +14 -0
  13. package/dist/agents/workflows/useWorkflowView.d.ts +54 -0
  14. package/dist/agents/workflows/workflow.d.ts +3 -1
  15. package/dist/calendar/CalendarGrid.d.ts +2 -0
  16. package/dist/calendar/CalendarList.d.ts +2 -0
  17. package/dist/calendar/CalendarSettingsForm.d.ts +2 -0
  18. package/dist/calendar/EventDetails.d.ts +2 -0
  19. package/dist/calendar/EventEditor.d.ts +2 -0
  20. package/dist/calendar/MiniMonth.d.ts +2 -0
  21. package/dist/calendar/RecurrenceEditor.d.ts +13 -0
  22. package/dist/calendar/RoomFinder.d.ts +2 -0
  23. package/dist/calendar/SchedulingAssistant.d.ts +2 -0
  24. package/dist/calendar/ScopeDialog.d.ts +2 -0
  25. package/dist/calendar/TimeZonePicker.d.ts +2 -0
  26. package/dist/calendar/colors.d.ts +4 -0
  27. package/dist/calendar/draft.d.ts +43 -0
  28. package/dist/calendar/format.d.ts +14 -0
  29. package/dist/calendar/grid-model.d.ts +24 -0
  30. package/dist/calendar/index.cjs +4122 -0
  31. package/dist/calendar/index.cjs.map +1 -0
  32. package/dist/calendar/index.d.ts +30 -0
  33. package/dist/calendar/index.js +4043 -0
  34. package/dist/calendar/index.js.map +1 -0
  35. package/dist/calendar/labels.d.ts +4 -0
  36. package/dist/calendar/recurrence-labels.d.ts +22 -0
  37. package/dist/calendar/recurrence.d.ts +66 -0
  38. package/dist/calendar/reminders.d.ts +26 -0
  39. package/dist/calendar/scheduling.d.ts +27 -0
  40. package/dist/calendar/types.d.ts +605 -0
  41. package/dist/calendar/ui.d.ts +16 -0
  42. package/dist/calendar/zone.d.ts +56 -0
  43. package/dist/chat/index.cjs +123 -123
  44. package/dist/chat/index.js +3 -3
  45. package/dist/chunk-2P3T23C7.js +1250 -0
  46. package/dist/chunk-2P3T23C7.js.map +1 -0
  47. package/dist/{chunk-XNRGCQPZ.cjs → chunk-3SFFTSOI.cjs} +5 -5
  48. package/dist/{chunk-XNRGCQPZ.cjs.map → chunk-3SFFTSOI.cjs.map} +1 -1
  49. package/dist/{chunk-7WM62NMM.cjs → chunk-6OL5S7MJ.cjs} +5 -2
  50. package/dist/chunk-6OL5S7MJ.cjs.map +1 -0
  51. package/dist/chunk-7D737FLE.cjs +43 -0
  52. package/dist/chunk-7D737FLE.cjs.map +1 -0
  53. package/dist/{chunk-VUEZARW5.cjs → chunk-B3WCKBJ7.cjs} +278 -5
  54. package/dist/chunk-B3WCKBJ7.cjs.map +1 -0
  55. package/dist/{chunk-L5UPP2HC.js → chunk-D46ZAPEE.js} +5 -2
  56. package/dist/chunk-D46ZAPEE.js.map +1 -0
  57. package/dist/{chunk-LFGJAZ5H.js → chunk-DDF5GPIJ.js} +6 -36
  58. package/dist/chunk-DDF5GPIJ.js.map +1 -0
  59. package/dist/chunk-DETZZBG2.cjs +91 -0
  60. package/dist/chunk-DETZZBG2.cjs.map +1 -0
  61. package/dist/chunk-EVUEIBNU.js +89 -0
  62. package/dist/chunk-EVUEIBNU.js.map +1 -0
  63. package/dist/{chunk-CXWESDIZ.cjs → chunk-F4RUCUXF.cjs} +6 -6
  64. package/dist/{chunk-CXWESDIZ.cjs.map → chunk-F4RUCUXF.cjs.map} +1 -1
  65. package/dist/{chunk-DABEWNL2.js → chunk-G5DP27DU.js} +3 -3
  66. package/dist/{chunk-DABEWNL2.js.map → chunk-G5DP27DU.js.map} +1 -1
  67. package/dist/{chunk-VZGBCBYB.js → chunk-GJV2G4FC.js} +276 -7
  68. package/dist/chunk-GJV2G4FC.js.map +1 -0
  69. package/dist/chunk-GTNUQBXI.cjs +1296 -0
  70. package/dist/chunk-GTNUQBXI.cjs.map +1 -0
  71. package/dist/{chunk-7M22KND4.cjs → chunk-IUR565UW.cjs} +303 -530
  72. package/dist/chunk-IUR565UW.cjs.map +1 -0
  73. package/dist/{chunk-5DM6VU4L.cjs → chunk-KJ3QEKOJ.cjs} +3 -3
  74. package/dist/{chunk-5DM6VU4L.cjs.map → chunk-KJ3QEKOJ.cjs.map} +1 -1
  75. package/dist/{chunk-THO7DZNN.cjs → chunk-MUMH3Z6K.cjs} +20 -15
  76. package/dist/chunk-MUMH3Z6K.cjs.map +1 -0
  77. package/dist/{chunk-3TVTG7FK.js → chunk-ORA2XE7U.js} +4 -4
  78. package/dist/{chunk-3TVTG7FK.js.map → chunk-ORA2XE7U.js.map} +1 -1
  79. package/dist/{chunk-5HOAOKZL.js → chunk-OYMWV45N.js} +21 -16
  80. package/dist/chunk-OYMWV45N.js.map +1 -0
  81. package/dist/{chunk-HLMFU7L2.js → chunk-QDNXEB3T.js} +272 -488
  82. package/dist/chunk-QDNXEB3T.js.map +1 -0
  83. package/dist/{chunk-ILGHS6ZV.js → chunk-SB5ZKOYN.js} +3 -3
  84. package/dist/{chunk-ILGHS6ZV.js.map → chunk-SB5ZKOYN.js.map} +1 -1
  85. package/dist/{chunk-CPMNAJLF.js → chunk-TX2ZICS7.js} +24 -4
  86. package/dist/chunk-TX2ZICS7.js.map +1 -0
  87. package/dist/{chunk-2ZTONLT5.cjs → chunk-ULWRNGGE.cjs} +25 -4
  88. package/dist/chunk-ULWRNGGE.cjs.map +1 -0
  89. package/dist/{chunk-BMWZTNZB.js → chunk-VRPRAU3J.js} +3 -3
  90. package/dist/{chunk-BMWZTNZB.js.map → chunk-VRPRAU3J.js.map} +1 -1
  91. package/dist/{chunk-LTA2IAQB.cjs → chunk-WOYUXVVQ.cjs} +8 -8
  92. package/dist/{chunk-LTA2IAQB.cjs.map → chunk-WOYUXVVQ.cjs.map} +1 -1
  93. package/dist/chunk-XD2M6LIG.js +41 -0
  94. package/dist/chunk-XD2M6LIG.js.map +1 -0
  95. package/dist/{chunk-WBDK4PIA.cjs → chunk-Z5VUZ6YD.cjs} +6 -37
  96. package/dist/chunk-Z5VUZ6YD.cjs.map +1 -0
  97. package/dist/collaboration/index.cjs +44 -45
  98. package/dist/collaboration/index.js +2 -3
  99. package/dist/connect/docx.cjs +2 -2
  100. package/dist/connect/docx.js +1 -1
  101. package/dist/connect/index.cjs +370 -48
  102. package/dist/connect/index.cjs.map +1 -1
  103. package/dist/connect/index.d.ts +2 -1
  104. package/dist/connect/index.js +331 -12
  105. package/dist/connect/index.js.map +1 -1
  106. package/dist/connection/ConnectedSettings.d.ts +13 -0
  107. package/dist/connection/ConnectedWorkflowBuilder.d.ts +44 -0
  108. package/dist/connection/ConnectedWorkflowRunner.d.ts +27 -0
  109. package/dist/connection/useWorkflowThread.d.ts +34 -0
  110. package/dist/document-tools/index.cjs +4 -5
  111. package/dist/document-tools/index.cjs.map +1 -1
  112. package/dist/document-tools/index.js +1 -2
  113. package/dist/document-tools/index.js.map +1 -1
  114. package/dist/facts/index.cjs +1 -1
  115. package/dist/facts/index.js +1 -1
  116. package/dist/files/import/index.d.ts +0 -1
  117. package/dist/files/index.cjs +31 -169
  118. package/dist/files/index.cjs.map +1 -1
  119. package/dist/files/index.js +8 -147
  120. package/dist/files/index.js.map +1 -1
  121. package/dist/home/index.cjs +21 -20
  122. package/dist/home/index.cjs.map +1 -1
  123. package/dist/home/index.js +3 -2
  124. package/dist/home/index.js.map +1 -1
  125. package/dist/index.cjs +680 -542
  126. package/dist/index.cjs.map +1 -1
  127. package/dist/index.js +15 -13
  128. package/dist/index.js.map +1 -1
  129. package/dist/settings/Billing.d.ts +4 -0
  130. package/dist/settings/IdentityVerification.d.ts +83 -0
  131. package/dist/settings/PlanBadge.d.ts +2 -2
  132. package/dist/settings/PlanCard.d.ts +6 -1
  133. package/dist/settings/ProfileCard.d.ts +5 -1
  134. package/dist/settings/SubscriptionParts.d.ts +6 -2
  135. package/dist/settings/index.cjs +128 -95
  136. package/dist/settings/index.cjs.map +1 -1
  137. package/dist/settings/index.d.ts +1 -0
  138. package/dist/settings/index.js +64 -47
  139. package/dist/settings/index.js.map +1 -1
  140. package/dist/shell/ActionCluster.d.ts +3 -1
  141. package/dist/shell/index.cjs +54 -54
  142. package/dist/shell/index.js +2 -2
  143. package/dist/studio/index.cjs +6 -6
  144. package/dist/studio/index.js +4 -4
  145. package/dist/workflow-canvas/StepInspector.d.ts +46 -0
  146. package/dist/workflow-canvas/TriggerInspector.d.ts +46 -0
  147. package/dist/workflow-canvas/WorkflowBuilder.d.ts +55 -0
  148. package/dist/workflow-canvas/WorkflowCanvas.d.ts +65 -0
  149. package/dist/workflow-canvas/edit.d.ts +54 -0
  150. package/dist/workflow-canvas/index.cjs +1609 -0
  151. package/dist/workflow-canvas/index.cjs.map +1 -0
  152. package/dist/workflow-canvas/index.d.ts +13 -0
  153. package/dist/workflow-canvas/index.js +1579 -0
  154. package/dist/workflow-canvas/index.js.map +1 -0
  155. package/dist/workflow-canvas/trigger.d.ts +51 -0
  156. package/dist/workspaces/index.cjs +2 -3
  157. package/dist/workspaces/index.cjs.map +1 -1
  158. package/dist/workspaces/index.js +1 -2
  159. package/dist/workspaces/index.js.map +1 -1
  160. package/package.json +41 -12
  161. package/src/calendar/calendar.css +316 -0
  162. package/src/workflow-canvas/canvas.css +113 -0
  163. package/dist/chunk-2ZTONLT5.cjs.map +0 -1
  164. package/dist/chunk-5HOAOKZL.js.map +0 -1
  165. package/dist/chunk-7M22KND4.cjs.map +0 -1
  166. package/dist/chunk-7WM62NMM.cjs.map +0 -1
  167. package/dist/chunk-CPMNAJLF.js.map +0 -1
  168. package/dist/chunk-DCDVWPMB.cjs +0 -29
  169. package/dist/chunk-DCDVWPMB.cjs.map +0 -1
  170. package/dist/chunk-HLMFU7L2.js.map +0 -1
  171. package/dist/chunk-L5UPP2HC.js.map +0 -1
  172. package/dist/chunk-LFGJAZ5H.js.map +0 -1
  173. package/dist/chunk-THO7DZNN.cjs.map +0 -1
  174. package/dist/chunk-TJMKFY5P.js +0 -27
  175. package/dist/chunk-TJMKFY5P.js.map +0 -1
  176. package/dist/chunk-VUEZARW5.cjs.map +0 -1
  177. package/dist/chunk-VZGBCBYB.js.map +0 -1
  178. package/dist/chunk-WBDK4PIA.cjs.map +0 -1
  179. package/dist/files/import/CalendarImportRow.d.ts +0 -26
@@ -0,0 +1,91 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var react = require('react');
5
+ var lucideReact = require('lucide-react');
6
+ var ui = require('@arbidocs/react/ui');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ // src/files/UploadDropzone.tsx
10
+ function UploadDropzone({
11
+ onFiles,
12
+ accept,
13
+ multiple = true,
14
+ disabled = false,
15
+ uploading = false,
16
+ title = "Drag files here",
17
+ description = "or click to browse",
18
+ hint,
19
+ uploadingLabel = "Uploading\u2026",
20
+ icon: Icon = lucideReact.UploadCloud,
21
+ testId,
22
+ className
23
+ }) {
24
+ const inputRef = react.useRef(null);
25
+ const [dragOver, setDragOver] = react.useState(false);
26
+ const inert = disabled || uploading;
27
+ const pick = (files) => {
28
+ if (!files?.length) return;
29
+ onFiles(Array.from(files));
30
+ };
31
+ const onDrop = (e) => {
32
+ e.preventDefault();
33
+ setDragOver(false);
34
+ if (inert) return;
35
+ pick(e.dataTransfer.files);
36
+ };
37
+ const onDragOver = (e) => {
38
+ e.preventDefault();
39
+ if (!inert) setDragOver(true);
40
+ };
41
+ return /* @__PURE__ */ jsxRuntime.jsxs(
42
+ "button",
43
+ {
44
+ type: "button",
45
+ onClick: () => !inert && inputRef.current?.click(),
46
+ onDrop,
47
+ onDragOver,
48
+ onDragLeave: () => setDragOver(false),
49
+ disabled: inert,
50
+ "data-testid": testId,
51
+ className: ui.cn(
52
+ "flex w-full flex-col items-center justify-center gap-3 rounded-lg bg-muted px-6 py-12 text-center transition-colors",
53
+ "hover:bg-accent/60",
54
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
55
+ dragOver && "bg-accent ring-2 ring-primary",
56
+ inert && "cursor-not-allowed opacity-60 hover:bg-muted",
57
+ className
58
+ ),
59
+ children: [
60
+ /* @__PURE__ */ jsxRuntime.jsx(
61
+ "input",
62
+ {
63
+ ref: inputRef,
64
+ type: "file",
65
+ accept,
66
+ multiple,
67
+ className: "hidden",
68
+ onChange: (e) => {
69
+ pick(e.target.files);
70
+ if (inputRef.current) inputRef.current.value = "";
71
+ },
72
+ "data-testid": testId ? `${testId}-input` : void 0
73
+ }
74
+ ),
75
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary", children: uploading ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "size-6 animate-spin" }) : /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-6" }) }),
76
+ uploading ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-foreground", children: uploadingLabel }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
77
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm font-medium text-foreground", children: [
78
+ title,
79
+ " ",
80
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: description })
81
+ ] }),
82
+ hint && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: hint })
83
+ ] })
84
+ ]
85
+ }
86
+ );
87
+ }
88
+
89
+ exports.UploadDropzone = UploadDropzone;
90
+ //# sourceMappingURL=chunk-DETZZBG2.cjs.map
91
+ //# sourceMappingURL=chunk-DETZZBG2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/UploadDropzone.tsx"],"names":["UploadCloud","useRef","useState","jsxs","cn","jsx","Loader2"],"mappings":"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","file":"chunk-DETZZBG2.cjs","sourcesContent":["import { useRef, useState } from 'react'\nimport type { DragEvent } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Loader2, UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface UploadDropzoneProps {\n /** Called with the chosen/dropped files. */\n onFiles: (files: File[]) => void\n /** `accept` attribute for the file picker (e.g. `.pdf,.docx`). */\n accept?: string\n /** Allow selecting more than one file. Defaults to true. */\n multiple?: boolean\n /** Disables picking/dropping (e.g. no active workspace yet). */\n disabled?: boolean\n /** Shows a spinner + busy copy while an upload is in flight. */\n uploading?: boolean\n /** Primary line, e.g. \"Drag files here\". */\n title?: string\n /** Secondary line under the title. */\n description?: string\n /** Small muted hint, e.g. \"PDF, DOCX, images — up to 50MB\". */\n hint?: string\n /** Copy shown next to the spinner while uploading. */\n uploadingLabel?: string\n /** Glyph in the tile. Defaults to an upload-cloud icon. */\n icon?: LucideIcon\n testId?: string\n className?: string\n}\n\n/**\n * A themeable drag-and-drop upload target. Source-agnostic: it just surfaces\n * chosen files via `onFiles` — the host owns the actual upload. Handles its own\n * drag-over state, click-to-browse, and a busy state, styled with the kit's\n * SEMANTIC tokens only (border, muted, primary, foreground) so it renders in\n * each host's colours.\n */\nexport function UploadDropzone({\n onFiles,\n accept,\n multiple = true,\n disabled = false,\n uploading = false,\n title = 'Drag files here',\n description = 'or click to browse',\n hint,\n uploadingLabel = 'Uploading…',\n icon: Icon = UploadCloud,\n testId,\n className,\n}: UploadDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const inert = disabled || uploading\n\n const pick = (files: FileList | null) => {\n if (!files?.length) return\n onFiles(Array.from(files))\n }\n\n const onDrop = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (inert) return\n pick(e.dataTransfer.files)\n }\n\n const onDragOver = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n if (!inert) setDragOver(true)\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => !inert && inputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={() => setDragOver(false)}\n disabled={inert}\n data-testid={testId}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-3 rounded-lg bg-muted px-6 py-12 text-center transition-colors',\n 'hover:bg-accent/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n dragOver && 'bg-accent ring-2 ring-primary',\n inert && 'cursor-not-allowed opacity-60 hover:bg-muted',\n className\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n pick(e.target.files)\n if (inputRef.current) inputRef.current.value = ''\n }}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n <div className=\"flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary\">\n {uploading ? <Loader2 className=\"size-6 animate-spin\" /> : <Icon className=\"size-6\" />}\n </div>\n {uploading ? (\n <p className=\"text-sm font-medium text-foreground\">{uploadingLabel}</p>\n ) : (\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {title} <span className=\"text-muted-foreground\">{description}</span>\n </p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )}\n </button>\n )\n}\n"]}
@@ -0,0 +1,89 @@
1
+ "use client";
2
+ import { useRef, useState } from 'react';
3
+ import { Loader2, UploadCloud } from 'lucide-react';
4
+ import { cn } from '@arbidocs/react/ui';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ // src/files/UploadDropzone.tsx
8
+ function UploadDropzone({
9
+ onFiles,
10
+ accept,
11
+ multiple = true,
12
+ disabled = false,
13
+ uploading = false,
14
+ title = "Drag files here",
15
+ description = "or click to browse",
16
+ hint,
17
+ uploadingLabel = "Uploading\u2026",
18
+ icon: Icon = UploadCloud,
19
+ testId,
20
+ className
21
+ }) {
22
+ const inputRef = useRef(null);
23
+ const [dragOver, setDragOver] = useState(false);
24
+ const inert = disabled || uploading;
25
+ const pick = (files) => {
26
+ if (!files?.length) return;
27
+ onFiles(Array.from(files));
28
+ };
29
+ const onDrop = (e) => {
30
+ e.preventDefault();
31
+ setDragOver(false);
32
+ if (inert) return;
33
+ pick(e.dataTransfer.files);
34
+ };
35
+ const onDragOver = (e) => {
36
+ e.preventDefault();
37
+ if (!inert) setDragOver(true);
38
+ };
39
+ return /* @__PURE__ */ jsxs(
40
+ "button",
41
+ {
42
+ type: "button",
43
+ onClick: () => !inert && inputRef.current?.click(),
44
+ onDrop,
45
+ onDragOver,
46
+ onDragLeave: () => setDragOver(false),
47
+ disabled: inert,
48
+ "data-testid": testId,
49
+ className: cn(
50
+ "flex w-full flex-col items-center justify-center gap-3 rounded-lg bg-muted px-6 py-12 text-center transition-colors",
51
+ "hover:bg-accent/60",
52
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
53
+ dragOver && "bg-accent ring-2 ring-primary",
54
+ inert && "cursor-not-allowed opacity-60 hover:bg-muted",
55
+ className
56
+ ),
57
+ children: [
58
+ /* @__PURE__ */ jsx(
59
+ "input",
60
+ {
61
+ ref: inputRef,
62
+ type: "file",
63
+ accept,
64
+ multiple,
65
+ className: "hidden",
66
+ onChange: (e) => {
67
+ pick(e.target.files);
68
+ if (inputRef.current) inputRef.current.value = "";
69
+ },
70
+ "data-testid": testId ? `${testId}-input` : void 0
71
+ }
72
+ ),
73
+ /* @__PURE__ */ jsx("div", { className: "flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary", children: uploading ? /* @__PURE__ */ jsx(Loader2, { className: "size-6 animate-spin" }) : /* @__PURE__ */ jsx(Icon, { className: "size-6" }) }),
74
+ uploading ? /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-foreground", children: uploadingLabel }) : /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
75
+ /* @__PURE__ */ jsxs("p", { className: "text-sm font-medium text-foreground", children: [
76
+ title,
77
+ " ",
78
+ /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: description })
79
+ ] }),
80
+ hint && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: hint })
81
+ ] })
82
+ ]
83
+ }
84
+ );
85
+ }
86
+
87
+ export { UploadDropzone };
88
+ //# sourceMappingURL=chunk-EVUEIBNU.js.map
89
+ //# sourceMappingURL=chunk-EVUEIBNU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/UploadDropzone.tsx"],"names":[],"mappings":"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","file":"chunk-EVUEIBNU.js","sourcesContent":["import { useRef, useState } from 'react'\nimport type { DragEvent } from 'react'\nimport type { LucideIcon } from 'lucide-react'\nimport { Loader2, UploadCloud } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface UploadDropzoneProps {\n /** Called with the chosen/dropped files. */\n onFiles: (files: File[]) => void\n /** `accept` attribute for the file picker (e.g. `.pdf,.docx`). */\n accept?: string\n /** Allow selecting more than one file. Defaults to true. */\n multiple?: boolean\n /** Disables picking/dropping (e.g. no active workspace yet). */\n disabled?: boolean\n /** Shows a spinner + busy copy while an upload is in flight. */\n uploading?: boolean\n /** Primary line, e.g. \"Drag files here\". */\n title?: string\n /** Secondary line under the title. */\n description?: string\n /** Small muted hint, e.g. \"PDF, DOCX, images — up to 50MB\". */\n hint?: string\n /** Copy shown next to the spinner while uploading. */\n uploadingLabel?: string\n /** Glyph in the tile. Defaults to an upload-cloud icon. */\n icon?: LucideIcon\n testId?: string\n className?: string\n}\n\n/**\n * A themeable drag-and-drop upload target. Source-agnostic: it just surfaces\n * chosen files via `onFiles` — the host owns the actual upload. Handles its own\n * drag-over state, click-to-browse, and a busy state, styled with the kit's\n * SEMANTIC tokens only (border, muted, primary, foreground) so it renders in\n * each host's colours.\n */\nexport function UploadDropzone({\n onFiles,\n accept,\n multiple = true,\n disabled = false,\n uploading = false,\n title = 'Drag files here',\n description = 'or click to browse',\n hint,\n uploadingLabel = 'Uploading…',\n icon: Icon = UploadCloud,\n testId,\n className,\n}: UploadDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null)\n const [dragOver, setDragOver] = useState(false)\n const inert = disabled || uploading\n\n const pick = (files: FileList | null) => {\n if (!files?.length) return\n onFiles(Array.from(files))\n }\n\n const onDrop = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n setDragOver(false)\n if (inert) return\n pick(e.dataTransfer.files)\n }\n\n const onDragOver = (e: DragEvent<HTMLButtonElement>) => {\n e.preventDefault()\n if (!inert) setDragOver(true)\n }\n\n return (\n <button\n type=\"button\"\n onClick={() => !inert && inputRef.current?.click()}\n onDrop={onDrop}\n onDragOver={onDragOver}\n onDragLeave={() => setDragOver(false)}\n disabled={inert}\n data-testid={testId}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-3 rounded-lg bg-muted px-6 py-12 text-center transition-colors',\n 'hover:bg-accent/60',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n dragOver && 'bg-accent ring-2 ring-primary',\n inert && 'cursor-not-allowed opacity-60 hover:bg-muted',\n className\n )}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n className=\"hidden\"\n onChange={(e) => {\n pick(e.target.files)\n if (inputRef.current) inputRef.current.value = ''\n }}\n data-testid={testId ? `${testId}-input` : undefined}\n />\n <div className=\"flex size-12 items-center justify-center rounded-full bg-primary/10 text-primary\">\n {uploading ? <Loader2 className=\"size-6 animate-spin\" /> : <Icon className=\"size-6\" />}\n </div>\n {uploading ? (\n <p className=\"text-sm font-medium text-foreground\">{uploadingLabel}</p>\n ) : (\n <div className=\"space-y-1\">\n <p className=\"text-sm font-medium text-foreground\">\n {title} <span className=\"text-muted-foreground\">{description}</span>\n </p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </div>\n )}\n </button>\n )\n}\n"]}
@@ -2,7 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  var chunk7G2LJMUG_cjs = require('./chunk-7G2LJMUG.cjs');
5
- var chunk2ZTONLT5_cjs = require('./chunk-2ZTONLT5.cjs');
5
+ var chunkULWRNGGE_cjs = require('./chunk-ULWRNGGE.cjs');
6
6
  var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
7
7
  var lucideReact = require('lucide-react');
8
8
  var ui = require('@arbidocs/react/ui');
@@ -283,8 +283,8 @@ var STATUS_ICON = {
283
283
  };
284
284
  function AddContactsResults({ rows, onDone, onAddMore, labels }) {
285
285
  const l = react.useMemo(() => ({ ...DEFAULT_ADD_CONTACTS_LABELS, ...labels }), [labels]);
286
- return /* @__PURE__ */ jsxRuntime.jsxs(chunk2ZTONLT5_cjs.ModalSection, { children: [
287
- /* @__PURE__ */ jsxRuntime.jsx(chunk2ZTONLT5_cjs.ModalSectionTitle, { children: l.results }),
286
+ return /* @__PURE__ */ jsxRuntime.jsxs(chunkULWRNGGE_cjs.ModalSection, { children: [
287
+ /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalSectionTitle, { children: l.results }),
288
288
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-h-80 overflow-y-auto rounded-md border", children: /* @__PURE__ */ jsxRuntime.jsxs("table", { className: "w-full", children: [
289
289
  /* @__PURE__ */ jsxRuntime.jsx("thead", { className: "sticky top-0 bg-muted/50", children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { children: [
290
290
  /* @__PURE__ */ jsxRuntime.jsx("th", { className: "p-2 text-left font-medium", children: l.email }),
@@ -705,7 +705,7 @@ function RecipientPicker({
705
705
  }) {
706
706
  const l = react.useMemo(() => ({ ...DEFAULT_RECIPIENT_PICKER_LABELS, ...labels }), [labels]);
707
707
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 border-b px-6 py-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
708
- /* @__PURE__ */ jsxRuntime.jsx(chunk2ZTONLT5_cjs.ModalSectionTitle, { className: "mb-0 shrink-0 py-1.5", children: l.to }),
708
+ /* @__PURE__ */ jsxRuntime.jsx(chunkULWRNGGE_cjs.ModalSectionTitle, { className: "mb-0 shrink-0 py-1.5", children: l.to }),
709
709
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-1 flex-col gap-1.5", children: [
710
710
  selected.map((recipient) => /* @__PURE__ */ jsxRuntime.jsxs(
711
711
  "div",
@@ -1075,5 +1075,5 @@ exports.toAddContactsRow = toAddContactsRow;
1075
1075
  exports.toAddContactsRows = toAddContactsRows;
1076
1076
  exports.toggleMailFolder = toggleMailFolder;
1077
1077
  exports.vCardFilename = vCardFilename;
1078
- //# sourceMappingURL=chunk-CXWESDIZ.cjs.map
1079
- //# sourceMappingURL=chunk-CXWESDIZ.cjs.map
1078
+ //# sourceMappingURL=chunk-F4RUCUXF.cjs.map
1079
+ //# sourceMappingURL=chunk-F4RUCUXF.cjs.map