@fairmint/ui 0.4.6 → 0.4.8

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.
package/LICENSE CHANGED
@@ -1,21 +1,24 @@
1
- MIT License
1
+ Proprietary License
2
2
 
3
3
  Copyright (c) 2026 Fairmint
4
4
 
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
5
+ All Rights Reserved
11
6
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
7
+ This software and associated documentation files (the "Software") are the
8
+ proprietary property of Fairmint. The Software is not open source.
9
+
10
+ Permission is granted to install and use the Software solely as a dependency
11
+ of Fairmint products and internal Fairmint applications. This permission
12
+ includes bundling, transforming, minifying, and distributing the Software
13
+ as part of those products, including delivery to end-user browsers.
14
+
15
+ You may not redistribute the Software on a standalone basis, sublicense it,
16
+ or use it in competing products except as Fairmint expressly permits in
17
+ writing.
14
18
 
15
19
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
20
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22
+ FAIRMINT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23
+ ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -4,7 +4,6 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const React = require("react");
5
5
  const index = require("../../../theme/index.cjs");
6
6
  const colors = require("../../../theme/colors.cjs");
7
- const Button = require("../../primitives/Button/Button.cjs");
8
7
  const Loader = require("../../primitives/Loader/Loader.cjs");
9
8
  const layout = require("../../primitives/layout.cjs");
10
9
  const Banner = require("../Banner/Banner.cjs");
@@ -40,7 +39,7 @@ function DefaultUploadIcon() {
40
39
  viewBox: "0 0 24 24",
41
40
  fill: "none",
42
41
  stroke: "currentColor",
43
- strokeWidth: "1.75",
42
+ strokeWidth: "1.25",
44
43
  strokeLinecap: "round",
45
44
  strokeLinejoin: "round",
46
45
  children: [
@@ -51,30 +50,6 @@ function DefaultUploadIcon() {
51
50
  }
52
51
  );
53
52
  }
54
- function DefaultBrowseIcon() {
55
- return /* @__PURE__ */ jsxRuntime.jsxs(
56
- "svg",
57
- {
58
- "aria-hidden": "true",
59
- width: "16",
60
- height: "16",
61
- viewBox: "0 0 24 24",
62
- fill: "none",
63
- stroke: "currentColor",
64
- strokeWidth: "1.75",
65
- strokeLinecap: "round",
66
- strokeLinejoin: "round",
67
- children: [
68
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" }),
69
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M14 2v6h6" }),
70
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 13H8" }),
71
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M16 13h-2" }),
72
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M10 17H8" }),
73
- /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M13 17h2" })
74
- ]
75
- }
76
- );
77
- }
78
53
  function DefaultCompactAddIcon() {
79
54
  return /* @__PURE__ */ jsxRuntime.jsxs(
80
55
  "svg",
@@ -98,33 +73,6 @@ function DefaultCompactAddIcon() {
98
73
  function pluralizeFiles(count) {
99
74
  return count === 1 ? "file" : "files";
100
75
  }
101
- function DropzoneUploadingLabel({ label }) {
102
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
103
- /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { component: "span", size: "sm", className: "file-dropzone-status--active", role: "status", children: label }),
104
- /* @__PURE__ */ jsxRuntime.jsx(DropzoneStatusStyles, {})
105
- ] });
106
- }
107
- function DropzoneStatusStyles() {
108
- return /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
109
- .file-dropzone-status--active {
110
- display: inline-block;
111
- background-image: linear-gradient(90deg, ${index.fairmintVars.colorBrandPrimary}, ${index.fairmintVars.colorBrandPurple}, ${index.fairmintVars.colorBrandPrimary});
112
- background-size: 200% auto;
113
- -webkit-background-clip: text;
114
- background-clip: text;
115
- color: transparent;
116
- font-weight: 500;
117
- animation: gradientFlow 2.2s linear infinite;
118
- }
119
- @media (prefers-reduced-motion: reduce) {
120
- .file-dropzone-status--active {
121
- animation: none;
122
- background-image: none;
123
- color: ${index.fairmintVars.colorTextSecondary};
124
- }
125
- }
126
- ` });
127
- }
128
76
  function FileDropzone({
129
77
  onFilesSelected,
130
78
  variant = "default",
@@ -134,10 +82,9 @@ function FileDropzone({
134
82
  uploadingLabel = "Uploading…",
135
83
  disabled = false,
136
84
  dragging,
137
- title = "Drop your PDFs here, or browse",
85
+ title,
138
86
  helperCopy,
139
87
  supportedTypes = FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,
140
- browseLabel = "Browse",
141
88
  maxFiles = FILE_DROPZONE_DEFAULT_MAX_FILES,
142
89
  maxFileSizeLabel = "50MB each",
143
90
  accept = "application/pdf,.pdf",
@@ -146,7 +93,6 @@ function FileDropzone({
146
93
  compactProgressText,
147
94
  compactAddLabel = "Add more PDFs",
148
95
  uploadIcon,
149
- browseIcon,
150
96
  compactAddIcon
151
97
  }) {
152
98
  const inputRef = React.useRef(null);
@@ -156,9 +102,11 @@ function FileDropzone({
156
102
  const isCompact = variant === "compact";
157
103
  const showUploadingChrome = uploading && !isCompact;
158
104
  const resolvedUploadIcon = uploadIcon ?? /* @__PURE__ */ jsxRuntime.jsx(DefaultUploadIcon, {});
159
- const resolvedBrowseIcon = browseIcon ?? /* @__PURE__ */ jsxRuntime.jsx(DefaultBrowseIcon, {});
160
105
  const resolvedCompactAddIcon = compactAddIcon ?? /* @__PURE__ */ jsxRuntime.jsx(DefaultCompactAddIcon, {});
161
- const resolvedHelperCopy = helperCopy ?? (showUploadingChrome ? "You can add more PDFs while we upload" : `PDF · up to ${maxFiles} files · ${maxFileSizeLabel}`);
106
+ const resolvedTitle = title ?? `Upload up to ${maxFiles} files`;
107
+ const browseHint = "Drop files here or activate to browse.";
108
+ const defaultAriaLabel = [showUploadingChrome ? uploadingLabel : null, resolvedTitle, browseHint].filter((part) => Boolean(part)).join(" ");
109
+ const resolvedHelperCopy = helperCopy ?? (showUploadingChrome ? "You can add more PDFs while we upload" : `PDF · ${maxFileSizeLabel}`);
162
110
  const safeFileCount = Math.max(0, fileCount);
163
111
  const clampedAnalyzed = Math.min(Math.max(0, analyzedCount), safeFileCount);
164
112
  const pct = safeFileCount > 0 ? Math.round(clampedAnalyzed / safeFileCount * 100) : 0;
@@ -174,6 +122,12 @@ function FileDropzone({
174
122
  if (disabled) return;
175
123
  inputRef.current?.click();
176
124
  };
125
+ const handleSurfaceKeyDown = (event) => {
126
+ if (event.key === "Enter" || event.key === " ") {
127
+ event.preventDefault();
128
+ openPicker();
129
+ }
130
+ };
177
131
  const setDragging = (next) => {
178
132
  if (dragging === void 0) {
179
133
  setInternalDragging(next);
@@ -233,12 +187,7 @@ function FileDropzone({
233
187
  "data-dragging": isDragging || void 0,
234
188
  className: "file-dropzone-surface file-dropzone-surface--compact",
235
189
  onClick: openPicker,
236
- onKeyDown: (event) => {
237
- if (event.key === "Enter" || event.key === " ") {
238
- event.preventDefault();
239
- openPicker();
240
- }
241
- },
190
+ onKeyDown: handleSurfaceKeyDown,
242
191
  onDragEnter: handleDragEnter,
243
192
  onDragOver: handleDragOver,
244
193
  onDragLeave: handleDragLeave,
@@ -285,6 +234,9 @@ function FileDropzone({
285
234
  ) : /* @__PURE__ */ jsxRuntime.jsxs(
286
235
  layout.Box,
287
236
  {
237
+ role: "button",
238
+ tabIndex: disabled ? -1 : 0,
239
+ "aria-label": defaultAriaLabel,
288
240
  "aria-disabled": disabled || void 0,
289
241
  "aria-busy": showUploadingChrome || void 0,
290
242
  "data-testid": "file-dropzone-surface",
@@ -292,6 +244,7 @@ function FileDropzone({
292
244
  "data-dragging": isDragging || void 0,
293
245
  className: "file-dropzone-surface file-dropzone-surface--default",
294
246
  onClick: openPicker,
247
+ onKeyDown: handleSurfaceKeyDown,
295
248
  onDragEnter: handleDragEnter,
296
249
  onDragOver: handleDragOver,
297
250
  onDragLeave: handleDragLeave,
@@ -332,10 +285,9 @@ function FileDropzone({
332
285
  c: index.fairmintVars.colorTextPrimary,
333
286
  className: "file-dropzone-title",
334
287
  ta: "center",
335
- children: title
288
+ children: resolvedTitle
336
289
  }
337
290
  ),
338
- showUploadingChrome && /* @__PURE__ */ jsxRuntime.jsx(DropzoneUploadingLabel, { label: uploadingLabel }),
339
291
  supportedTypes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
340
292
  Group.Group,
341
293
  {
@@ -350,11 +302,12 @@ function FileDropzone({
350
302
  component: "span",
351
303
  size: "xs",
352
304
  fw: 500,
353
- c: index.fairmintVars.colorTextSecondary,
305
+ c: index.fairmintVars.colorTextPrimary,
354
306
  px: 8,
355
307
  py: 2,
356
308
  style: {
357
309
  background: index.fairmintVars.colorBgSurface,
310
+ border: `1px solid ${index.fairmintVars.colorBorderDefault}`,
358
311
  borderRadius: 999,
359
312
  whiteSpace: "nowrap"
360
313
  },
@@ -374,23 +327,7 @@ function FileDropzone({
374
327
  children: resolvedHelperCopy
375
328
  }
376
329
  )
377
- ] }),
378
- /* @__PURE__ */ jsxRuntime.jsx(
379
- Button.Button,
380
- {
381
- variant: "light",
382
- radius: "md",
383
- disabled,
384
- className: "file-dropzone-browse",
385
- mih: 44,
386
- leftSection: resolvedBrowseIcon,
387
- onClick: (event) => {
388
- event.stopPropagation();
389
- openPicker();
390
- },
391
- children: browseLabel
392
- }
393
- )
330
+ ] })
394
331
  ] }),
395
332
  fileInput
396
333
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"FileDropzone.cjs","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"sourcesContent":["import { type DragEvent, type KeyboardEvent, type ReactNode, useRef, useState } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Button } from \"../../primitives/Button/Button\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon } from \"../../primitives/layout\";\nimport { Banner } from \"../Banner/Banner\";\n\nconst errorTextProps = {\n size: \"xs\" as const,\n c: fairmintVars.colorErrorText,\n style: { lineHeight: 1.4 },\n};\n\nconst rejectionTextProps = {\n size: \"sm\" as const,\n c: fairmintVars.colorTextSecondary,\n style: { lineHeight: 1.4 },\n};\n\n/** Default supported document-type chips shown beneath the dropzone title. */\nexport const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [\n \"SAFE\",\n \"Convertible note\",\n \"Purchase agreement\",\n \"Token warrant\",\n \"Other agreement\",\n] as const;\n\n/** Default batch cap surfaced in the dropzone helper copy. */\nexport const FILE_DROPZONE_DEFAULT_MAX_FILES = 50;\n\nexport interface FileDropzoneRejection {\n name: string;\n error: string;\n}\n\nexport interface FileDropzoneProps {\n /**\n * Called with the files the user selected or dropped. Per-file validation,\n * dedup, and batch caps are the caller's responsibility.\n */\n onFilesSelected: (files: File[]) => void;\n /** Full dropzone (Stage A) or collapsed header (Stages B/C). @default \"default\" */\n variant?: \"default\" | \"compact\";\n /** External error (e.g. upload failure) shown beneath the dropzone. */\n errorMessage?: string | null;\n /** Per-file validation rejections (wrong type, oversize, batch cap, etc.). */\n fileRejections?: FileDropzoneRejection[];\n /**\n * Default variant only: shows the live upload animation (loader + gradient\n * status). The dropzone stays interactive so callers can queue more files\n * while an upload batch is in flight (ENG-854).\n *\n * Ignored by `variant=\"compact\"` — keep the add-more bar calm and put\n * processing copy on parent-owned file rows instead (Slack design review).\n */\n uploading?: boolean;\n /**\n * Default variant only: gradient status copy while `uploading` is true.\n * @default \"Uploading…\"\n */\n uploadingLabel?: string;\n /** Disables all interaction (e.g. final import). Does not apply to `uploading`. */\n disabled?: boolean;\n /**\n * Visual override for drag-active styling (Storybook / visual tests). Omit for\n * normal drag-and-drop behavior.\n */\n dragging?: boolean;\n /** Primary heading in the default variant. */\n title?: string;\n /** Override the helper line beneath the title/chips. */\n helperCopy?: string;\n /** Supported document-type chips. Pass `[]` to hide chips (e.g. cap table uses prose above). */\n supportedTypes?: readonly string[];\n /** Label on the Browse / Choose files button. @default \"Browse\" */\n browseLabel?: string;\n /** Maximum files copy-deck number. @default 50 */\n maxFiles?: number;\n /** Size constraint copy shown in the helper line. @default \"50MB each\" */\n maxFileSizeLabel?: string;\n /** `input[type=file]` accept attribute. @default \"application/pdf,.pdf\" */\n accept?: string;\n /** Compact variant: staged file count (investor: total staged files). */\n fileCount?: number;\n /** Compact variant: completed count (investor: analyzed files). */\n analyzedCount?: number;\n /**\n * Compact variant: custom progress copy. When set, replaces the default\n * investor string (`9 files · 3 of 9 analyzed (33%)`). Use for cap table\n * (`6 files · 4 classified`) or pipeline states (`Processing 2 documents`).\n */\n compactProgressText?: string;\n /** Compact variant: leading action label. @default \"Add more PDFs\" */\n compactAddLabel?: string;\n /** Icon in the default variant upload circle. */\n uploadIcon?: ReactNode;\n /** Icon beside the Browse button. */\n browseIcon?: ReactNode;\n /** Icon beside the compact add label. */\n compactAddIcon?: ReactNode;\n}\n\nconst DRAG_GRADIENT_BORDER = `linear-gradient(${fairmintVars.colorBgSurfaceSecondary}, ${fairmintVars.colorBgSurfaceSecondary}) padding-box, linear-gradient(135deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}) border-box`;\n\nfunction DefaultUploadIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 13v8\" />\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\n <path d=\"m8 17 4-4 4 4\" />\n </svg>\n );\n}\n\nfunction DefaultBrowseIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z\" />\n <path d=\"M14 2v6h6\" />\n <path d=\"M10 13H8\" />\n <path d=\"M16 13h-2\" />\n <path d=\"M10 17H8\" />\n <path d=\"M13 17h2\" />\n </svg>\n );\n}\n\nfunction DefaultCompactAddIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n );\n}\n\nfunction pluralizeFiles(count: number): string {\n return count === 1 ? \"file\" : \"files\";\n}\n\nfunction DropzoneUploadingLabel({ label }: { label: string }) {\n return (\n <>\n <Text component=\"span\" size=\"sm\" className=\"file-dropzone-status--active\" role=\"status\">\n {label}\n </Text>\n <DropzoneStatusStyles />\n </>\n );\n}\n\nfunction DropzoneStatusStyles() {\n return (\n <style>{`\n .file-dropzone-status--active {\n display: inline-block;\n background-image: linear-gradient(90deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}, ${fairmintVars.colorBrandPrimary});\n background-size: 200% auto;\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n font-weight: 500;\n animation: gradientFlow 2.2s linear infinite;\n }\n @media (prefers-reduced-motion: reduce) {\n .file-dropzone-status--active {\n animation: none;\n background-image: none;\n color: ${fairmintVars.colorTextSecondary};\n }\n }\n `}</style>\n );\n}\n\n/**\n * Multi-file document dropzone for investor import and similar flows.\n *\n * Keyboard-operable: the visible Browse button is the sole focusable control;\n * clicking the drop surface also opens the file picker. Drag state adds a\n * `breathe` glow. Set `uploading` on the **default** variant for the ENG-854\n * gradient status + loader while keeping the dropzone open for more files;\n * reserve `disabled` for hard blocks. Compact stays a calm add-more control —\n * put flashy processing copy on parent-owned file rows, not the header.\n *\n * Responsive: uses CSS container queries on `.file-dropzone-root` so the layout\n * adapts inside narrow right panels (cap table drawer ~360px, investor aside\n * ~420px) without callers passing breakpoint props.\n */\nexport function FileDropzone({\n onFilesSelected,\n variant = \"default\",\n errorMessage,\n fileRejections = [],\n uploading = false,\n uploadingLabel = \"Uploading…\",\n disabled = false,\n dragging,\n title = \"Drop your PDFs here, or browse\",\n helperCopy,\n supportedTypes = FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,\n browseLabel = \"Browse\",\n maxFiles = FILE_DROPZONE_DEFAULT_MAX_FILES,\n maxFileSizeLabel = \"50MB each\",\n accept = \"application/pdf,.pdf\",\n fileCount = 0,\n analyzedCount = 0,\n compactProgressText,\n compactAddLabel = \"Add more PDFs\",\n uploadIcon,\n browseIcon,\n compactAddIcon,\n}: FileDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const dragCounterRef = useRef(0);\n const [internalDragging, setInternalDragging] = useState(false);\n const isDragging = dragging ?? internalDragging;\n const isCompact = variant === \"compact\";\n /** Compact never shows upload chrome — processing belongs on file rows. */\n const showUploadingChrome = uploading && !isCompact;\n const resolvedUploadIcon = uploadIcon ?? <DefaultUploadIcon />;\n const resolvedBrowseIcon = browseIcon ?? <DefaultBrowseIcon />;\n const resolvedCompactAddIcon = compactAddIcon ?? <DefaultCompactAddIcon />;\n const resolvedHelperCopy =\n helperCopy ??\n (showUploadingChrome\n ? \"You can add more PDFs while we upload\"\n : `PDF · up to ${maxFiles} files · ${maxFileSizeLabel}`);\n const safeFileCount = Math.max(0, fileCount);\n const clampedAnalyzed = Math.min(Math.max(0, analyzedCount), safeFileCount);\n const pct = safeFileCount > 0 ? Math.round((clampedAnalyzed / safeFileCount) * 100) : 0;\n const defaultCompactProgress =\n safeFileCount > 0\n ? `${safeFileCount} ${pluralizeFiles(safeFileCount)} · ${clampedAnalyzed} of ${safeFileCount} analyzed (${pct}%)`\n : null;\n const resolvedCompactProgress = compactProgressText ?? defaultCompactProgress;\n const compactAriaLabel = `${compactAddLabel}. Drop files here or activate to browse.`;\n\n const handleFiles = (fileList: FileList | null | undefined) => {\n if (disabled) return;\n if (!fileList || fileList.length === 0) return;\n onFilesSelected([...fileList]);\n };\n\n const openPicker = () => {\n if (disabled) return;\n inputRef.current?.click();\n };\n\n const setDragging = (next: boolean) => {\n if (dragging === undefined) {\n setInternalDragging(next);\n }\n };\n\n const handleDragEnter = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) return;\n dragCounterRef.current += 1;\n setDragging(true);\n };\n\n const handleDragLeave = () => {\n // Counter-only: each enter/leave (including child targets) must balance.\n // Do not also filter with relatedTarget containment — that skips decrements\n // while enters still increment, leaving drag state stuck above zero.\n dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);\n if (dragCounterRef.current === 0) {\n setDragging(false);\n }\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n // Always cancel default so the browser does not navigate/open the file on\n // drop — including when the dropzone is disabled.\n event.preventDefault();\n if (disabled) return;\n setDragging(true);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n dragCounterRef.current = 0;\n setDragging(false);\n if (disabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n const fileInput = (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple\n hidden\n disabled={disabled}\n aria-hidden=\"true\"\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => {\n handleFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n );\n\n return (\n <Stack gap=\"xs\" data-testid=\"file-dropzone\" className=\"file-dropzone-root\" w=\"100%\" miw={0}>\n {isCompact ? (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={compactAriaLabel}\n aria-disabled={disabled}\n data-testid=\"file-dropzone-surface\"\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--compact\"\n onClick={openPicker}\n onKeyDown={(event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openPicker();\n }\n }}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n borderRadius: 12,\n padding: \"10px 16px\",\n border: `1px dashed ${isDragging ? fairmintVars.colorBorderFocus : fairmintVars.colorBorderDefault}`,\n background: isDragging\n ? fairmintVars.colorBgHover\n : fairmintVars.colorBgSurfaceSecondary,\n transition: \"background 0.15s ease, border-color 0.15s ease\",\n opacity: disabled ? 0.6 : 1,\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n className=\"file-dropzone-compact-row\"\n align=\"flex-start\"\n >\n <Group gap={6} wrap=\"nowrap\" className=\"file-dropzone-compact-leading\" miw={0}>\n <Box c={fairmintVars.colorIconSecondary} style={{ display: \"flex\" }} aria-hidden>\n {resolvedCompactAddIcon}\n </Box>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary}>\n {compactAddLabel}\n </Text>\n </Group>\n <Text\n size=\"sm\"\n c={fairmintVars.colorTextSecondary}\n className=\"file-dropzone-compact-progress\"\n style={{ fontVariantNumeric: \"tabular-nums\" }}\n >\n {resolvedCompactProgress}\n </Text>\n </Group>\n {fileInput}\n </Box>\n ) : (\n <Box\n aria-disabled={disabled || undefined}\n aria-busy={showUploadingChrome || undefined}\n data-testid=\"file-dropzone-surface\"\n data-uploading={showUploadingChrome || undefined}\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--default\"\n onClick={openPicker}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.6 : 1,\n borderRadius: 16,\n padding: \"40px 24px\",\n textAlign: \"center\",\n border: \"2px solid transparent\",\n background: isDragging ? DRAG_GRADIENT_BORDER : fairmintVars.colorBgSurfaceSecondary,\n borderStyle: isDragging ? \"solid\" : \"dashed\",\n borderColor: isDragging ? \"transparent\" : fairmintVars.colorBorderDefault,\n boxShadow: isDragging\n ? `0 0 0 4px color-mix(in srgb, ${fairmintVars.colorBrandPrimary} 12%, transparent)`\n : \"none\",\n transition: \"box-shadow 0.2s ease, border-color 0.2s ease\",\n }}\n >\n <Stack gap=\"sm\" align=\"center\">\n <ThemeIcon\n size={56}\n radius=\"xl\"\n variant=\"light\"\n color={colors.primary}\n className={`file-dropzone-icon-wrap${\n isDragging\n ? \" file-dropzone-icon--dragging\"\n : showUploadingChrome\n ? \" file-dropzone-icon--uploading\"\n : \"\"\n }`}\n data-dragging={isDragging || undefined}\n data-uploading={showUploadingChrome || undefined}\n >\n {showUploadingChrome ? (\n <Loader size=\"sm\" color={colors.primary} aria-hidden />\n ) : (\n resolvedUploadIcon\n )}\n </ThemeIcon>\n <Stack gap=\"xs\" align=\"center\" className=\"file-dropzone-copy\" w=\"100%\">\n <Text\n fw={600}\n c={fairmintVars.colorTextPrimary}\n className=\"file-dropzone-title\"\n ta=\"center\"\n >\n {title}\n </Text>\n {showUploadingChrome && <DropzoneUploadingLabel label={uploadingLabel} />}\n {supportedTypes.length > 0 && (\n <Group\n gap={6}\n justify=\"center\"\n wrap=\"wrap\"\n w=\"100%\"\n className=\"file-dropzone-chips\"\n >\n {supportedTypes.map((type) => (\n <Text\n key={type}\n component=\"span\"\n size=\"xs\"\n fw={500}\n c={fairmintVars.colorTextSecondary}\n px={8}\n py={2}\n style={{\n background: fairmintVars.colorBgSurface,\n borderRadius: 999,\n whiteSpace: \"nowrap\",\n }}\n >\n {type}\n </Text>\n ))}\n </Group>\n )}\n <Text\n size=\"xs\"\n c={fairmintVars.colorTextSecondary}\n ta=\"center\"\n className=\"file-dropzone-helper\"\n >\n {resolvedHelperCopy}\n </Text>\n </Stack>\n <Button\n variant=\"light\"\n radius=\"md\"\n disabled={disabled}\n className=\"file-dropzone-browse\"\n mih={44}\n leftSection={resolvedBrowseIcon}\n onClick={(event) => {\n event.stopPropagation();\n openPicker();\n }}\n >\n {browseLabel}\n </Button>\n </Stack>\n {fileInput}\n </Box>\n )}\n\n {fileRejections.length > 0 && (\n <Banner\n tone=\"error\"\n icon={null}\n title=\"Some files weren't added\"\n description={\n <Stack gap={2}>\n {fileRejections.map((rejection) => (\n <Text key={`${rejection.name}:${rejection.error}`} {...rejectionTextProps}>\n {rejection.error}\n </Text>\n ))}\n </Stack>\n }\n />\n )}\n\n {errorMessage && (\n <Text {...errorTextProps} role=\"alert\">\n {errorMessage}\n </Text>\n )}\n </Stack>\n );\n}\n"],"names":["fairmintVars","jsxs","jsx","Fragment","Text","useRef","useState","Stack","Box","Group","ThemeIcon","colors","Loader","Button","Banner"],"mappings":"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"}
1
+ {"version":3,"file":"FileDropzone.cjs","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"sourcesContent":["import { type DragEvent, type KeyboardEvent, type ReactNode, useRef, useState } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon } from \"../../primitives/layout\";\nimport { Banner } from \"../Banner/Banner\";\n\nconst errorTextProps = {\n size: \"xs\" as const,\n c: fairmintVars.colorErrorText,\n style: { lineHeight: 1.4 },\n};\n\nconst rejectionTextProps = {\n size: \"sm\" as const,\n c: fairmintVars.colorTextSecondary,\n style: { lineHeight: 1.4 },\n};\n\n/** Default supported document-type chips shown in the default dropzone. */\nexport const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [\n \"SAFE\",\n \"Convertible note\",\n \"Purchase agreement\",\n \"Token warrant\",\n \"Other agreement\",\n] as const;\n\n/** Default batch cap surfaced in the dropzone helper copy. */\nexport const FILE_DROPZONE_DEFAULT_MAX_FILES = 50;\n\nexport interface FileDropzoneRejection {\n name: string;\n error: string;\n}\n\nexport interface FileDropzoneProps {\n /**\n * Called with the files the user selected or dropped. Per-file validation,\n * dedup, and batch caps are the caller's responsibility.\n */\n onFilesSelected: (files: File[]) => void;\n /** Full dropzone (Stage A) or collapsed header (Stages B/C). @default \"default\" */\n variant?: \"default\" | \"compact\";\n /** External error (e.g. upload failure) shown beneath the dropzone. */\n errorMessage?: string | null;\n /** Per-file validation rejections (wrong type, oversize, batch cap, etc.). */\n fileRejections?: FileDropzoneRejection[];\n /**\n * Default variant only: shows the live upload animation (loader in the icon\n * slot). The dropzone stays interactive so callers can queue more files\n * while an upload batch is in flight (ENG-854).\n *\n * Ignored by `variant=\"compact\"` — keep the add-more bar calm and put\n * processing copy on parent-owned file rows instead (Slack design review).\n */\n uploading?: boolean;\n /**\n * Default variant only: included in the drop surface accessible name while\n * `uploading` is true. Not shown as visible copy — status belongs on\n * `DocumentStatusRow`.\n * @default \"Uploading…\"\n */\n uploadingLabel?: string;\n /** Disables all interaction (e.g. final import). Does not apply to `uploading`. */\n disabled?: boolean;\n /**\n * Visual override for drag-active styling (Storybook / visual tests). Omit for\n * normal drag-and-drop behavior.\n */\n dragging?: boolean;\n /** Heading under the icon in the default variant. @default \"Upload up to {maxFiles} files\" */\n title?: string;\n /** Override the helper line beneath the chips. */\n helperCopy?: string;\n /** Supported document-type chips. Pass `[]` to hide chips (e.g. cap table uses prose above). */\n supportedTypes?: readonly string[];\n /**\n * @deprecated No visible browse button. Accepted for API compatibility.\n * @default \"Browse\"\n */\n browseLabel?: string;\n /** Maximum files copy-deck number. @default 50 */\n maxFiles?: number;\n /** Size constraint copy shown in the helper line. @default \"50MB each\" */\n maxFileSizeLabel?: string;\n /** `input[type=file]` accept attribute. @default \"application/pdf,.pdf\" */\n accept?: string;\n /** Compact variant: staged file count (investor: total staged files). */\n fileCount?: number;\n /** Compact variant: completed count (investor: analyzed files). */\n analyzedCount?: number;\n /**\n * Compact variant: custom progress copy. When set, replaces the default\n * investor string (`9 files · 3 of 9 analyzed (33%)`). Use for cap table\n * (`6 files · 4 classified`) or pipeline states (`Processing 2 documents`).\n */\n compactProgressText?: string;\n /** Compact variant: leading action label. @default \"Add more PDFs\" */\n compactAddLabel?: string;\n /** Icon in the default variant upload circle. */\n uploadIcon?: ReactNode;\n /** @deprecated No visible browse button. Accepted for API compatibility. */\n browseIcon?: ReactNode;\n /** Icon beside the compact add label. */\n compactAddIcon?: ReactNode;\n}\n\nconst DRAG_GRADIENT_BORDER = `linear-gradient(${fairmintVars.colorBgSurfaceSecondary}, ${fairmintVars.colorBgSurfaceSecondary}) padding-box, linear-gradient(135deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}) border-box`;\n\nfunction DefaultUploadIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 13v8\" />\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\n <path d=\"m8 17 4-4 4 4\" />\n </svg>\n );\n}\n\nfunction DefaultCompactAddIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n );\n}\n\nfunction pluralizeFiles(count: number): string {\n return count === 1 ? \"file\" : \"files\";\n}\n\n/**\n * Multi-file document dropzone for investor import and similar flows.\n *\n * Keyboard-operable: the drop surface is the sole focusable control and opens\n * the file picker. Drag state adds a `breathe` glow. Set `uploading` on the\n * **default** variant for the ENG-854 loader while keeping the dropzone open\n * for more files; reserve `disabled` for hard blocks. Compact stays a calm\n * add-more control — put processing copy on parent-owned file rows, not the header.\n *\n * Responsive: uses CSS container queries on `.file-dropzone-root` so the layout\n * adapts inside narrow right panels (cap table drawer ~360px, investor aside\n * ~420px) without callers passing breakpoint props.\n */\nexport function FileDropzone({\n onFilesSelected,\n variant = \"default\",\n errorMessage,\n fileRejections = [],\n uploading = false,\n uploadingLabel = \"Uploading…\",\n disabled = false,\n dragging,\n title,\n helperCopy,\n supportedTypes = FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,\n maxFiles = FILE_DROPZONE_DEFAULT_MAX_FILES,\n maxFileSizeLabel = \"50MB each\",\n accept = \"application/pdf,.pdf\",\n fileCount = 0,\n analyzedCount = 0,\n compactProgressText,\n compactAddLabel = \"Add more PDFs\",\n uploadIcon,\n compactAddIcon,\n}: FileDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const dragCounterRef = useRef(0);\n const [internalDragging, setInternalDragging] = useState(false);\n const isDragging = dragging ?? internalDragging;\n const isCompact = variant === \"compact\";\n /** Compact never shows upload chrome — processing belongs on file rows. */\n const showUploadingChrome = uploading && !isCompact;\n const resolvedUploadIcon = uploadIcon ?? <DefaultUploadIcon />;\n const resolvedCompactAddIcon = compactAddIcon ?? <DefaultCompactAddIcon />;\n const resolvedTitle = title ?? `Upload up to ${maxFiles} files`;\n const browseHint = \"Drop files here or activate to browse.\";\n const defaultAriaLabel = [showUploadingChrome ? uploadingLabel : null, resolvedTitle, browseHint]\n .filter((part): part is string => Boolean(part))\n .join(\" \");\n const resolvedHelperCopy =\n helperCopy ??\n (showUploadingChrome ? \"You can add more PDFs while we upload\" : `PDF · ${maxFileSizeLabel}`);\n const safeFileCount = Math.max(0, fileCount);\n const clampedAnalyzed = Math.min(Math.max(0, analyzedCount), safeFileCount);\n const pct = safeFileCount > 0 ? Math.round((clampedAnalyzed / safeFileCount) * 100) : 0;\n const defaultCompactProgress =\n safeFileCount > 0\n ? `${safeFileCount} ${pluralizeFiles(safeFileCount)} · ${clampedAnalyzed} of ${safeFileCount} analyzed (${pct}%)`\n : null;\n const resolvedCompactProgress = compactProgressText ?? defaultCompactProgress;\n const compactAriaLabel = `${compactAddLabel}. Drop files here or activate to browse.`;\n\n const handleFiles = (fileList: FileList | null | undefined) => {\n if (disabled) return;\n if (!fileList || fileList.length === 0) return;\n onFilesSelected([...fileList]);\n };\n\n const openPicker = () => {\n if (disabled) return;\n inputRef.current?.click();\n };\n\n const handleSurfaceKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openPicker();\n }\n };\n\n const setDragging = (next: boolean) => {\n if (dragging === undefined) {\n setInternalDragging(next);\n }\n };\n\n const handleDragEnter = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) return;\n dragCounterRef.current += 1;\n setDragging(true);\n };\n\n const handleDragLeave = () => {\n // Counter-only: each enter/leave (including child targets) must balance.\n // Do not also filter with relatedTarget containment — that skips decrements\n // while enters still increment, leaving drag state stuck above zero.\n dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);\n if (dragCounterRef.current === 0) {\n setDragging(false);\n }\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n // Always cancel default so the browser does not navigate/open the file on\n // drop — including when the dropzone is disabled.\n event.preventDefault();\n if (disabled) return;\n setDragging(true);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n dragCounterRef.current = 0;\n setDragging(false);\n if (disabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n const fileInput = (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple\n hidden\n disabled={disabled}\n aria-hidden=\"true\"\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => {\n handleFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n );\n\n return (\n <Stack gap=\"xs\" data-testid=\"file-dropzone\" className=\"file-dropzone-root\" w=\"100%\" miw={0}>\n {isCompact ? (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={compactAriaLabel}\n aria-disabled={disabled}\n data-testid=\"file-dropzone-surface\"\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--compact\"\n onClick={openPicker}\n onKeyDown={handleSurfaceKeyDown}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n borderRadius: 12,\n padding: \"10px 16px\",\n border: `1px dashed ${isDragging ? fairmintVars.colorBorderFocus : fairmintVars.colorBorderDefault}`,\n background: isDragging\n ? fairmintVars.colorBgHover\n : fairmintVars.colorBgSurfaceSecondary,\n transition: \"background 0.15s ease, border-color 0.15s ease\",\n opacity: disabled ? 0.6 : 1,\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n className=\"file-dropzone-compact-row\"\n align=\"flex-start\"\n >\n <Group gap={6} wrap=\"nowrap\" className=\"file-dropzone-compact-leading\" miw={0}>\n <Box c={fairmintVars.colorIconSecondary} style={{ display: \"flex\" }} aria-hidden>\n {resolvedCompactAddIcon}\n </Box>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary}>\n {compactAddLabel}\n </Text>\n </Group>\n <Text\n size=\"sm\"\n c={fairmintVars.colorTextSecondary}\n className=\"file-dropzone-compact-progress\"\n style={{ fontVariantNumeric: \"tabular-nums\" }}\n >\n {resolvedCompactProgress}\n </Text>\n </Group>\n {fileInput}\n </Box>\n ) : (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={defaultAriaLabel}\n aria-disabled={disabled || undefined}\n aria-busy={showUploadingChrome || undefined}\n data-testid=\"file-dropzone-surface\"\n data-uploading={showUploadingChrome || undefined}\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--default\"\n onClick={openPicker}\n onKeyDown={handleSurfaceKeyDown}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.6 : 1,\n borderRadius: 16,\n padding: \"40px 24px\",\n textAlign: \"center\",\n border: \"2px solid transparent\",\n background: isDragging ? DRAG_GRADIENT_BORDER : fairmintVars.colorBgSurfaceSecondary,\n borderStyle: isDragging ? \"solid\" : \"dashed\",\n borderColor: isDragging ? \"transparent\" : fairmintVars.colorBorderDefault,\n boxShadow: isDragging\n ? `0 0 0 4px color-mix(in srgb, ${fairmintVars.colorBrandPrimary} 12%, transparent)`\n : \"none\",\n transition: \"box-shadow 0.2s ease, border-color 0.2s ease\",\n }}\n >\n <Stack gap=\"sm\" align=\"center\">\n <ThemeIcon\n size={56}\n radius=\"xl\"\n variant=\"light\"\n color={colors.primary}\n className={`file-dropzone-icon-wrap${\n isDragging\n ? \" file-dropzone-icon--dragging\"\n : showUploadingChrome\n ? \" file-dropzone-icon--uploading\"\n : \"\"\n }`}\n data-dragging={isDragging || undefined}\n data-uploading={showUploadingChrome || undefined}\n >\n {showUploadingChrome ? (\n <Loader size=\"sm\" color={colors.primary} aria-hidden />\n ) : (\n resolvedUploadIcon\n )}\n </ThemeIcon>\n <Stack gap=\"xs\" align=\"center\" className=\"file-dropzone-copy\" w=\"100%\">\n <Text\n fw={600}\n c={fairmintVars.colorTextPrimary}\n className=\"file-dropzone-title\"\n ta=\"center\"\n >\n {resolvedTitle}\n </Text>\n {supportedTypes.length > 0 && (\n <Group\n gap={6}\n justify=\"center\"\n wrap=\"wrap\"\n w=\"100%\"\n className=\"file-dropzone-chips\"\n >\n {supportedTypes.map((type) => (\n <Text\n key={type}\n component=\"span\"\n size=\"xs\"\n fw={500}\n c={fairmintVars.colorTextPrimary}\n px={8}\n py={2}\n style={{\n background: fairmintVars.colorBgSurface,\n border: `1px solid ${fairmintVars.colorBorderDefault}`,\n borderRadius: 999,\n whiteSpace: \"nowrap\",\n }}\n >\n {type}\n </Text>\n ))}\n </Group>\n )}\n <Text\n size=\"xs\"\n c={fairmintVars.colorTextSecondary}\n ta=\"center\"\n className=\"file-dropzone-helper\"\n >\n {resolvedHelperCopy}\n </Text>\n </Stack>\n </Stack>\n {fileInput}\n </Box>\n )}\n\n {fileRejections.length > 0 && (\n <Banner\n tone=\"error\"\n icon={null}\n title=\"Some files weren't added\"\n description={\n <Stack gap={2}>\n {fileRejections.map((rejection) => (\n <Text key={`${rejection.name}:${rejection.error}`} {...rejectionTextProps}>\n {rejection.error}\n </Text>\n ))}\n </Stack>\n }\n />\n )}\n\n {errorMessage && (\n <Text {...errorTextProps} role=\"alert\">\n {errorMessage}\n </Text>\n )}\n </Stack>\n );\n}\n"],"names":["fairmintVars","jsxs","jsx","useRef","useState","Stack","Box","Group","Text","ThemeIcon","colors","Loader","Banner"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- /** Default supported document-type chips shown beneath the dropzone title. */
2
+ /** Default supported document-type chips shown in the default dropzone. */
3
3
  export declare const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES: readonly ["SAFE", "Convertible note", "Purchase agreement", "Token warrant", "Other agreement"];
4
4
  /** Default batch cap surfaced in the dropzone helper copy. */
5
5
  export declare const FILE_DROPZONE_DEFAULT_MAX_FILES = 50;
@@ -20,8 +20,8 @@ export interface FileDropzoneProps {
20
20
  /** Per-file validation rejections (wrong type, oversize, batch cap, etc.). */
21
21
  fileRejections?: FileDropzoneRejection[];
22
22
  /**
23
- * Default variant only: shows the live upload animation (loader + gradient
24
- * status). The dropzone stays interactive so callers can queue more files
23
+ * Default variant only: shows the live upload animation (loader in the icon
24
+ * slot). The dropzone stays interactive so callers can queue more files
25
25
  * while an upload batch is in flight (ENG-854).
26
26
  *
27
27
  * Ignored by `variant="compact"` — keep the add-more bar calm and put
@@ -29,7 +29,9 @@ export interface FileDropzoneProps {
29
29
  */
30
30
  uploading?: boolean;
31
31
  /**
32
- * Default variant only: gradient status copy while `uploading` is true.
32
+ * Default variant only: included in the drop surface accessible name while
33
+ * `uploading` is true. Not shown as visible copy — status belongs on
34
+ * `DocumentStatusRow`.
33
35
  * @default "Uploading…"
34
36
  */
35
37
  uploadingLabel?: string;
@@ -40,13 +42,16 @@ export interface FileDropzoneProps {
40
42
  * normal drag-and-drop behavior.
41
43
  */
42
44
  dragging?: boolean;
43
- /** Primary heading in the default variant. */
45
+ /** Heading under the icon in the default variant. @default "Upload up to {maxFiles} files" */
44
46
  title?: string;
45
- /** Override the helper line beneath the title/chips. */
47
+ /** Override the helper line beneath the chips. */
46
48
  helperCopy?: string;
47
49
  /** Supported document-type chips. Pass `[]` to hide chips (e.g. cap table uses prose above). */
48
50
  supportedTypes?: readonly string[];
49
- /** Label on the Browse / Choose files button. @default "Browse" */
51
+ /**
52
+ * @deprecated No visible browse button. Accepted for API compatibility.
53
+ * @default "Browse"
54
+ */
50
55
  browseLabel?: string;
51
56
  /** Maximum files copy-deck number. @default 50 */
52
57
  maxFiles?: number;
@@ -68,7 +73,7 @@ export interface FileDropzoneProps {
68
73
  compactAddLabel?: string;
69
74
  /** Icon in the default variant upload circle. */
70
75
  uploadIcon?: ReactNode;
71
- /** Icon beside the Browse button. */
76
+ /** @deprecated No visible browse button. Accepted for API compatibility. */
72
77
  browseIcon?: ReactNode;
73
78
  /** Icon beside the compact add label. */
74
79
  compactAddIcon?: ReactNode;
@@ -76,16 +81,15 @@ export interface FileDropzoneProps {
76
81
  /**
77
82
  * Multi-file document dropzone for investor import and similar flows.
78
83
  *
79
- * Keyboard-operable: the visible Browse button is the sole focusable control;
80
- * clicking the drop surface also opens the file picker. Drag state adds a
81
- * `breathe` glow. Set `uploading` on the **default** variant for the ENG-854
82
- * gradient status + loader while keeping the dropzone open for more files;
83
- * reserve `disabled` for hard blocks. Compact stays a calm add-more control —
84
- * put flashy processing copy on parent-owned file rows, not the header.
84
+ * Keyboard-operable: the drop surface is the sole focusable control and opens
85
+ * the file picker. Drag state adds a `breathe` glow. Set `uploading` on the
86
+ * **default** variant for the ENG-854 loader while keeping the dropzone open
87
+ * for more files; reserve `disabled` for hard blocks. Compact stays a calm
88
+ * add-more control — put processing copy on parent-owned file rows, not the header.
85
89
  *
86
90
  * Responsive: uses CSS container queries on `.file-dropzone-root` so the layout
87
91
  * adapts inside narrow right panels (cap table drawer ~360px, investor aside
88
92
  * ~420px) without callers passing breakpoint props.
89
93
  */
90
- export declare function FileDropzone({ onFilesSelected, variant, errorMessage, fileRejections, uploading, uploadingLabel, disabled, dragging, title, helperCopy, supportedTypes, browseLabel, maxFiles, maxFileSizeLabel, accept, fileCount, analyzedCount, compactProgressText, compactAddLabel, uploadIcon, browseIcon, compactAddIcon, }: FileDropzoneProps): import("react").JSX.Element;
94
+ export declare function FileDropzone({ onFilesSelected, variant, errorMessage, fileRejections, uploading, uploadingLabel, disabled, dragging, title, helperCopy, supportedTypes, maxFiles, maxFileSizeLabel, accept, fileCount, analyzedCount, compactProgressText, compactAddLabel, uploadIcon, compactAddIcon, }: FileDropzoneProps): import("react").JSX.Element;
91
95
  //# sourceMappingURL=FileDropzone.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileDropzone.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAoB,MAAM,OAAO,CAAC;AAoB7F,8EAA8E;AAC9E,eAAO,MAAM,qCAAqC,iGAMxC,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACzC,mFAAmF;IACnF,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACzC;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,qCAAqC;IACrC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,yCAAyC;IACzC,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAyGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,EAC3B,eAAe,EACf,OAAmB,EACnB,YAAY,EACZ,cAAmB,EACnB,SAAiB,EACjB,cAA6B,EAC7B,QAAgB,EAChB,QAAQ,EACR,KAAwC,EACxC,UAAU,EACV,cAAsD,EACtD,WAAsB,EACtB,QAA0C,EAC1C,gBAA8B,EAC9B,MAA+B,EAC/B,SAAa,EACb,aAAiB,EACjB,mBAAmB,EACnB,eAAiC,EACjC,UAAU,EACV,UAAU,EACV,cAAc,GACf,EAAE,iBAAiB,+BAuSnB"}
1
+ {"version":3,"file":"FileDropzone.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAoB,MAAM,OAAO,CAAC;AAmB7F,2EAA2E;AAC3E,eAAO,MAAM,qCAAqC,iGAMxC,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACzC,mFAAmF;IACnF,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACzC;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8FAA8F;IAC9F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,yCAAyC;IACzC,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AA+CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,EAC3B,eAAe,EACf,OAAmB,EACnB,YAAY,EACZ,cAAmB,EACnB,SAAiB,EACjB,cAA6B,EAC7B,QAAgB,EAChB,QAAQ,EACR,KAAK,EACL,UAAU,EACV,cAAsD,EACtD,QAA0C,EAC1C,gBAA8B,EAC9B,MAA+B,EAC/B,SAAa,EACb,aAAiB,EACjB,mBAAmB,EACnB,eAAiC,EACjC,UAAU,EACV,cAAc,GACf,EAAE,iBAAiB,+BAiSnB"}
@@ -1,8 +1,7 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useRef, useState } from "react";
3
3
  import { fairmintVars } from "../../../theme/index.js";
4
4
  import { colors } from "../../../theme/colors.js";
5
- import { Button } from "../../primitives/Button/Button.js";
6
5
  import { Loader } from "../../primitives/Loader/Loader.js";
7
6
  import { Stack, Box } from "../../primitives/layout.js";
8
7
  import { Banner } from "../Banner/Banner.js";
@@ -38,7 +37,7 @@ function DefaultUploadIcon() {
38
37
  viewBox: "0 0 24 24",
39
38
  fill: "none",
40
39
  stroke: "currentColor",
41
- strokeWidth: "1.75",
40
+ strokeWidth: "1.25",
42
41
  strokeLinecap: "round",
43
42
  strokeLinejoin: "round",
44
43
  children: [
@@ -49,30 +48,6 @@ function DefaultUploadIcon() {
49
48
  }
50
49
  );
51
50
  }
52
- function DefaultBrowseIcon() {
53
- return /* @__PURE__ */ jsxs(
54
- "svg",
55
- {
56
- "aria-hidden": "true",
57
- width: "16",
58
- height: "16",
59
- viewBox: "0 0 24 24",
60
- fill: "none",
61
- stroke: "currentColor",
62
- strokeWidth: "1.75",
63
- strokeLinecap: "round",
64
- strokeLinejoin: "round",
65
- children: [
66
- /* @__PURE__ */ jsx("path", { d: "M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z" }),
67
- /* @__PURE__ */ jsx("path", { d: "M14 2v6h6" }),
68
- /* @__PURE__ */ jsx("path", { d: "M10 13H8" }),
69
- /* @__PURE__ */ jsx("path", { d: "M16 13h-2" }),
70
- /* @__PURE__ */ jsx("path", { d: "M10 17H8" }),
71
- /* @__PURE__ */ jsx("path", { d: "M13 17h2" })
72
- ]
73
- }
74
- );
75
- }
76
51
  function DefaultCompactAddIcon() {
77
52
  return /* @__PURE__ */ jsxs(
78
53
  "svg",
@@ -96,33 +71,6 @@ function DefaultCompactAddIcon() {
96
71
  function pluralizeFiles(count) {
97
72
  return count === 1 ? "file" : "files";
98
73
  }
99
- function DropzoneUploadingLabel({ label }) {
100
- return /* @__PURE__ */ jsxs(Fragment, { children: [
101
- /* @__PURE__ */ jsx(Text, { component: "span", size: "sm", className: "file-dropzone-status--active", role: "status", children: label }),
102
- /* @__PURE__ */ jsx(DropzoneStatusStyles, {})
103
- ] });
104
- }
105
- function DropzoneStatusStyles() {
106
- return /* @__PURE__ */ jsx("style", { children: `
107
- .file-dropzone-status--active {
108
- display: inline-block;
109
- background-image: linear-gradient(90deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}, ${fairmintVars.colorBrandPrimary});
110
- background-size: 200% auto;
111
- -webkit-background-clip: text;
112
- background-clip: text;
113
- color: transparent;
114
- font-weight: 500;
115
- animation: gradientFlow 2.2s linear infinite;
116
- }
117
- @media (prefers-reduced-motion: reduce) {
118
- .file-dropzone-status--active {
119
- animation: none;
120
- background-image: none;
121
- color: ${fairmintVars.colorTextSecondary};
122
- }
123
- }
124
- ` });
125
- }
126
74
  function FileDropzone({
127
75
  onFilesSelected,
128
76
  variant = "default",
@@ -132,10 +80,9 @@ function FileDropzone({
132
80
  uploadingLabel = "Uploading…",
133
81
  disabled = false,
134
82
  dragging,
135
- title = "Drop your PDFs here, or browse",
83
+ title,
136
84
  helperCopy,
137
85
  supportedTypes = FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,
138
- browseLabel = "Browse",
139
86
  maxFiles = FILE_DROPZONE_DEFAULT_MAX_FILES,
140
87
  maxFileSizeLabel = "50MB each",
141
88
  accept = "application/pdf,.pdf",
@@ -144,7 +91,6 @@ function FileDropzone({
144
91
  compactProgressText,
145
92
  compactAddLabel = "Add more PDFs",
146
93
  uploadIcon,
147
- browseIcon,
148
94
  compactAddIcon
149
95
  }) {
150
96
  const inputRef = useRef(null);
@@ -154,9 +100,11 @@ function FileDropzone({
154
100
  const isCompact = variant === "compact";
155
101
  const showUploadingChrome = uploading && !isCompact;
156
102
  const resolvedUploadIcon = uploadIcon ?? /* @__PURE__ */ jsx(DefaultUploadIcon, {});
157
- const resolvedBrowseIcon = browseIcon ?? /* @__PURE__ */ jsx(DefaultBrowseIcon, {});
158
103
  const resolvedCompactAddIcon = compactAddIcon ?? /* @__PURE__ */ jsx(DefaultCompactAddIcon, {});
159
- const resolvedHelperCopy = helperCopy ?? (showUploadingChrome ? "You can add more PDFs while we upload" : `PDF · up to ${maxFiles} files · ${maxFileSizeLabel}`);
104
+ const resolvedTitle = title ?? `Upload up to ${maxFiles} files`;
105
+ const browseHint = "Drop files here or activate to browse.";
106
+ const defaultAriaLabel = [showUploadingChrome ? uploadingLabel : null, resolvedTitle, browseHint].filter((part) => Boolean(part)).join(" ");
107
+ const resolvedHelperCopy = helperCopy ?? (showUploadingChrome ? "You can add more PDFs while we upload" : `PDF · ${maxFileSizeLabel}`);
160
108
  const safeFileCount = Math.max(0, fileCount);
161
109
  const clampedAnalyzed = Math.min(Math.max(0, analyzedCount), safeFileCount);
162
110
  const pct = safeFileCount > 0 ? Math.round(clampedAnalyzed / safeFileCount * 100) : 0;
@@ -172,6 +120,12 @@ function FileDropzone({
172
120
  if (disabled) return;
173
121
  inputRef.current?.click();
174
122
  };
123
+ const handleSurfaceKeyDown = (event) => {
124
+ if (event.key === "Enter" || event.key === " ") {
125
+ event.preventDefault();
126
+ openPicker();
127
+ }
128
+ };
175
129
  const setDragging = (next) => {
176
130
  if (dragging === void 0) {
177
131
  setInternalDragging(next);
@@ -231,12 +185,7 @@ function FileDropzone({
231
185
  "data-dragging": isDragging || void 0,
232
186
  className: "file-dropzone-surface file-dropzone-surface--compact",
233
187
  onClick: openPicker,
234
- onKeyDown: (event) => {
235
- if (event.key === "Enter" || event.key === " ") {
236
- event.preventDefault();
237
- openPicker();
238
- }
239
- },
188
+ onKeyDown: handleSurfaceKeyDown,
240
189
  onDragEnter: handleDragEnter,
241
190
  onDragOver: handleDragOver,
242
191
  onDragLeave: handleDragLeave,
@@ -283,6 +232,9 @@ function FileDropzone({
283
232
  ) : /* @__PURE__ */ jsxs(
284
233
  Box,
285
234
  {
235
+ role: "button",
236
+ tabIndex: disabled ? -1 : 0,
237
+ "aria-label": defaultAriaLabel,
286
238
  "aria-disabled": disabled || void 0,
287
239
  "aria-busy": showUploadingChrome || void 0,
288
240
  "data-testid": "file-dropzone-surface",
@@ -290,6 +242,7 @@ function FileDropzone({
290
242
  "data-dragging": isDragging || void 0,
291
243
  className: "file-dropzone-surface file-dropzone-surface--default",
292
244
  onClick: openPicker,
245
+ onKeyDown: handleSurfaceKeyDown,
293
246
  onDragEnter: handleDragEnter,
294
247
  onDragOver: handleDragOver,
295
248
  onDragLeave: handleDragLeave,
@@ -330,10 +283,9 @@ function FileDropzone({
330
283
  c: fairmintVars.colorTextPrimary,
331
284
  className: "file-dropzone-title",
332
285
  ta: "center",
333
- children: title
286
+ children: resolvedTitle
334
287
  }
335
288
  ),
336
- showUploadingChrome && /* @__PURE__ */ jsx(DropzoneUploadingLabel, { label: uploadingLabel }),
337
289
  supportedTypes.length > 0 && /* @__PURE__ */ jsx(
338
290
  Group,
339
291
  {
@@ -348,11 +300,12 @@ function FileDropzone({
348
300
  component: "span",
349
301
  size: "xs",
350
302
  fw: 500,
351
- c: fairmintVars.colorTextSecondary,
303
+ c: fairmintVars.colorTextPrimary,
352
304
  px: 8,
353
305
  py: 2,
354
306
  style: {
355
307
  background: fairmintVars.colorBgSurface,
308
+ border: `1px solid ${fairmintVars.colorBorderDefault}`,
356
309
  borderRadius: 999,
357
310
  whiteSpace: "nowrap"
358
311
  },
@@ -372,23 +325,7 @@ function FileDropzone({
372
325
  children: resolvedHelperCopy
373
326
  }
374
327
  )
375
- ] }),
376
- /* @__PURE__ */ jsx(
377
- Button,
378
- {
379
- variant: "light",
380
- radius: "md",
381
- disabled,
382
- className: "file-dropzone-browse",
383
- mih: 44,
384
- leftSection: resolvedBrowseIcon,
385
- onClick: (event) => {
386
- event.stopPropagation();
387
- openPicker();
388
- },
389
- children: browseLabel
390
- }
391
- )
328
+ ] })
392
329
  ] }),
393
330
  fileInput
394
331
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"FileDropzone.js","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"sourcesContent":["import { type DragEvent, type KeyboardEvent, type ReactNode, useRef, useState } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Button } from \"../../primitives/Button/Button\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon } from \"../../primitives/layout\";\nimport { Banner } from \"../Banner/Banner\";\n\nconst errorTextProps = {\n size: \"xs\" as const,\n c: fairmintVars.colorErrorText,\n style: { lineHeight: 1.4 },\n};\n\nconst rejectionTextProps = {\n size: \"sm\" as const,\n c: fairmintVars.colorTextSecondary,\n style: { lineHeight: 1.4 },\n};\n\n/** Default supported document-type chips shown beneath the dropzone title. */\nexport const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [\n \"SAFE\",\n \"Convertible note\",\n \"Purchase agreement\",\n \"Token warrant\",\n \"Other agreement\",\n] as const;\n\n/** Default batch cap surfaced in the dropzone helper copy. */\nexport const FILE_DROPZONE_DEFAULT_MAX_FILES = 50;\n\nexport interface FileDropzoneRejection {\n name: string;\n error: string;\n}\n\nexport interface FileDropzoneProps {\n /**\n * Called with the files the user selected or dropped. Per-file validation,\n * dedup, and batch caps are the caller's responsibility.\n */\n onFilesSelected: (files: File[]) => void;\n /** Full dropzone (Stage A) or collapsed header (Stages B/C). @default \"default\" */\n variant?: \"default\" | \"compact\";\n /** External error (e.g. upload failure) shown beneath the dropzone. */\n errorMessage?: string | null;\n /** Per-file validation rejections (wrong type, oversize, batch cap, etc.). */\n fileRejections?: FileDropzoneRejection[];\n /**\n * Default variant only: shows the live upload animation (loader + gradient\n * status). The dropzone stays interactive so callers can queue more files\n * while an upload batch is in flight (ENG-854).\n *\n * Ignored by `variant=\"compact\"` — keep the add-more bar calm and put\n * processing copy on parent-owned file rows instead (Slack design review).\n */\n uploading?: boolean;\n /**\n * Default variant only: gradient status copy while `uploading` is true.\n * @default \"Uploading…\"\n */\n uploadingLabel?: string;\n /** Disables all interaction (e.g. final import). Does not apply to `uploading`. */\n disabled?: boolean;\n /**\n * Visual override for drag-active styling (Storybook / visual tests). Omit for\n * normal drag-and-drop behavior.\n */\n dragging?: boolean;\n /** Primary heading in the default variant. */\n title?: string;\n /** Override the helper line beneath the title/chips. */\n helperCopy?: string;\n /** Supported document-type chips. Pass `[]` to hide chips (e.g. cap table uses prose above). */\n supportedTypes?: readonly string[];\n /** Label on the Browse / Choose files button. @default \"Browse\" */\n browseLabel?: string;\n /** Maximum files copy-deck number. @default 50 */\n maxFiles?: number;\n /** Size constraint copy shown in the helper line. @default \"50MB each\" */\n maxFileSizeLabel?: string;\n /** `input[type=file]` accept attribute. @default \"application/pdf,.pdf\" */\n accept?: string;\n /** Compact variant: staged file count (investor: total staged files). */\n fileCount?: number;\n /** Compact variant: completed count (investor: analyzed files). */\n analyzedCount?: number;\n /**\n * Compact variant: custom progress copy. When set, replaces the default\n * investor string (`9 files · 3 of 9 analyzed (33%)`). Use for cap table\n * (`6 files · 4 classified`) or pipeline states (`Processing 2 documents`).\n */\n compactProgressText?: string;\n /** Compact variant: leading action label. @default \"Add more PDFs\" */\n compactAddLabel?: string;\n /** Icon in the default variant upload circle. */\n uploadIcon?: ReactNode;\n /** Icon beside the Browse button. */\n browseIcon?: ReactNode;\n /** Icon beside the compact add label. */\n compactAddIcon?: ReactNode;\n}\n\nconst DRAG_GRADIENT_BORDER = `linear-gradient(${fairmintVars.colorBgSurfaceSecondary}, ${fairmintVars.colorBgSurfaceSecondary}) padding-box, linear-gradient(135deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}) border-box`;\n\nfunction DefaultUploadIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 13v8\" />\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\n <path d=\"m8 17 4-4 4 4\" />\n </svg>\n );\n}\n\nfunction DefaultBrowseIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8Z\" />\n <path d=\"M14 2v6h6\" />\n <path d=\"M10 13H8\" />\n <path d=\"M16 13h-2\" />\n <path d=\"M10 17H8\" />\n <path d=\"M13 17h2\" />\n </svg>\n );\n}\n\nfunction DefaultCompactAddIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n );\n}\n\nfunction pluralizeFiles(count: number): string {\n return count === 1 ? \"file\" : \"files\";\n}\n\nfunction DropzoneUploadingLabel({ label }: { label: string }) {\n return (\n <>\n <Text component=\"span\" size=\"sm\" className=\"file-dropzone-status--active\" role=\"status\">\n {label}\n </Text>\n <DropzoneStatusStyles />\n </>\n );\n}\n\nfunction DropzoneStatusStyles() {\n return (\n <style>{`\n .file-dropzone-status--active {\n display: inline-block;\n background-image: linear-gradient(90deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}, ${fairmintVars.colorBrandPrimary});\n background-size: 200% auto;\n -webkit-background-clip: text;\n background-clip: text;\n color: transparent;\n font-weight: 500;\n animation: gradientFlow 2.2s linear infinite;\n }\n @media (prefers-reduced-motion: reduce) {\n .file-dropzone-status--active {\n animation: none;\n background-image: none;\n color: ${fairmintVars.colorTextSecondary};\n }\n }\n `}</style>\n );\n}\n\n/**\n * Multi-file document dropzone for investor import and similar flows.\n *\n * Keyboard-operable: the visible Browse button is the sole focusable control;\n * clicking the drop surface also opens the file picker. Drag state adds a\n * `breathe` glow. Set `uploading` on the **default** variant for the ENG-854\n * gradient status + loader while keeping the dropzone open for more files;\n * reserve `disabled` for hard blocks. Compact stays a calm add-more control —\n * put flashy processing copy on parent-owned file rows, not the header.\n *\n * Responsive: uses CSS container queries on `.file-dropzone-root` so the layout\n * adapts inside narrow right panels (cap table drawer ~360px, investor aside\n * ~420px) without callers passing breakpoint props.\n */\nexport function FileDropzone({\n onFilesSelected,\n variant = \"default\",\n errorMessage,\n fileRejections = [],\n uploading = false,\n uploadingLabel = \"Uploading…\",\n disabled = false,\n dragging,\n title = \"Drop your PDFs here, or browse\",\n helperCopy,\n supportedTypes = FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,\n browseLabel = \"Browse\",\n maxFiles = FILE_DROPZONE_DEFAULT_MAX_FILES,\n maxFileSizeLabel = \"50MB each\",\n accept = \"application/pdf,.pdf\",\n fileCount = 0,\n analyzedCount = 0,\n compactProgressText,\n compactAddLabel = \"Add more PDFs\",\n uploadIcon,\n browseIcon,\n compactAddIcon,\n}: FileDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const dragCounterRef = useRef(0);\n const [internalDragging, setInternalDragging] = useState(false);\n const isDragging = dragging ?? internalDragging;\n const isCompact = variant === \"compact\";\n /** Compact never shows upload chrome — processing belongs on file rows. */\n const showUploadingChrome = uploading && !isCompact;\n const resolvedUploadIcon = uploadIcon ?? <DefaultUploadIcon />;\n const resolvedBrowseIcon = browseIcon ?? <DefaultBrowseIcon />;\n const resolvedCompactAddIcon = compactAddIcon ?? <DefaultCompactAddIcon />;\n const resolvedHelperCopy =\n helperCopy ??\n (showUploadingChrome\n ? \"You can add more PDFs while we upload\"\n : `PDF · up to ${maxFiles} files · ${maxFileSizeLabel}`);\n const safeFileCount = Math.max(0, fileCount);\n const clampedAnalyzed = Math.min(Math.max(0, analyzedCount), safeFileCount);\n const pct = safeFileCount > 0 ? Math.round((clampedAnalyzed / safeFileCount) * 100) : 0;\n const defaultCompactProgress =\n safeFileCount > 0\n ? `${safeFileCount} ${pluralizeFiles(safeFileCount)} · ${clampedAnalyzed} of ${safeFileCount} analyzed (${pct}%)`\n : null;\n const resolvedCompactProgress = compactProgressText ?? defaultCompactProgress;\n const compactAriaLabel = `${compactAddLabel}. Drop files here or activate to browse.`;\n\n const handleFiles = (fileList: FileList | null | undefined) => {\n if (disabled) return;\n if (!fileList || fileList.length === 0) return;\n onFilesSelected([...fileList]);\n };\n\n const openPicker = () => {\n if (disabled) return;\n inputRef.current?.click();\n };\n\n const setDragging = (next: boolean) => {\n if (dragging === undefined) {\n setInternalDragging(next);\n }\n };\n\n const handleDragEnter = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) return;\n dragCounterRef.current += 1;\n setDragging(true);\n };\n\n const handleDragLeave = () => {\n // Counter-only: each enter/leave (including child targets) must balance.\n // Do not also filter with relatedTarget containment — that skips decrements\n // while enters still increment, leaving drag state stuck above zero.\n dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);\n if (dragCounterRef.current === 0) {\n setDragging(false);\n }\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n // Always cancel default so the browser does not navigate/open the file on\n // drop — including when the dropzone is disabled.\n event.preventDefault();\n if (disabled) return;\n setDragging(true);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n dragCounterRef.current = 0;\n setDragging(false);\n if (disabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n const fileInput = (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple\n hidden\n disabled={disabled}\n aria-hidden=\"true\"\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => {\n handleFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n );\n\n return (\n <Stack gap=\"xs\" data-testid=\"file-dropzone\" className=\"file-dropzone-root\" w=\"100%\" miw={0}>\n {isCompact ? (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={compactAriaLabel}\n aria-disabled={disabled}\n data-testid=\"file-dropzone-surface\"\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--compact\"\n onClick={openPicker}\n onKeyDown={(event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openPicker();\n }\n }}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n borderRadius: 12,\n padding: \"10px 16px\",\n border: `1px dashed ${isDragging ? fairmintVars.colorBorderFocus : fairmintVars.colorBorderDefault}`,\n background: isDragging\n ? fairmintVars.colorBgHover\n : fairmintVars.colorBgSurfaceSecondary,\n transition: \"background 0.15s ease, border-color 0.15s ease\",\n opacity: disabled ? 0.6 : 1,\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n className=\"file-dropzone-compact-row\"\n align=\"flex-start\"\n >\n <Group gap={6} wrap=\"nowrap\" className=\"file-dropzone-compact-leading\" miw={0}>\n <Box c={fairmintVars.colorIconSecondary} style={{ display: \"flex\" }} aria-hidden>\n {resolvedCompactAddIcon}\n </Box>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary}>\n {compactAddLabel}\n </Text>\n </Group>\n <Text\n size=\"sm\"\n c={fairmintVars.colorTextSecondary}\n className=\"file-dropzone-compact-progress\"\n style={{ fontVariantNumeric: \"tabular-nums\" }}\n >\n {resolvedCompactProgress}\n </Text>\n </Group>\n {fileInput}\n </Box>\n ) : (\n <Box\n aria-disabled={disabled || undefined}\n aria-busy={showUploadingChrome || undefined}\n data-testid=\"file-dropzone-surface\"\n data-uploading={showUploadingChrome || undefined}\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--default\"\n onClick={openPicker}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.6 : 1,\n borderRadius: 16,\n padding: \"40px 24px\",\n textAlign: \"center\",\n border: \"2px solid transparent\",\n background: isDragging ? DRAG_GRADIENT_BORDER : fairmintVars.colorBgSurfaceSecondary,\n borderStyle: isDragging ? \"solid\" : \"dashed\",\n borderColor: isDragging ? \"transparent\" : fairmintVars.colorBorderDefault,\n boxShadow: isDragging\n ? `0 0 0 4px color-mix(in srgb, ${fairmintVars.colorBrandPrimary} 12%, transparent)`\n : \"none\",\n transition: \"box-shadow 0.2s ease, border-color 0.2s ease\",\n }}\n >\n <Stack gap=\"sm\" align=\"center\">\n <ThemeIcon\n size={56}\n radius=\"xl\"\n variant=\"light\"\n color={colors.primary}\n className={`file-dropzone-icon-wrap${\n isDragging\n ? \" file-dropzone-icon--dragging\"\n : showUploadingChrome\n ? \" file-dropzone-icon--uploading\"\n : \"\"\n }`}\n data-dragging={isDragging || undefined}\n data-uploading={showUploadingChrome || undefined}\n >\n {showUploadingChrome ? (\n <Loader size=\"sm\" color={colors.primary} aria-hidden />\n ) : (\n resolvedUploadIcon\n )}\n </ThemeIcon>\n <Stack gap=\"xs\" align=\"center\" className=\"file-dropzone-copy\" w=\"100%\">\n <Text\n fw={600}\n c={fairmintVars.colorTextPrimary}\n className=\"file-dropzone-title\"\n ta=\"center\"\n >\n {title}\n </Text>\n {showUploadingChrome && <DropzoneUploadingLabel label={uploadingLabel} />}\n {supportedTypes.length > 0 && (\n <Group\n gap={6}\n justify=\"center\"\n wrap=\"wrap\"\n w=\"100%\"\n className=\"file-dropzone-chips\"\n >\n {supportedTypes.map((type) => (\n <Text\n key={type}\n component=\"span\"\n size=\"xs\"\n fw={500}\n c={fairmintVars.colorTextSecondary}\n px={8}\n py={2}\n style={{\n background: fairmintVars.colorBgSurface,\n borderRadius: 999,\n whiteSpace: \"nowrap\",\n }}\n >\n {type}\n </Text>\n ))}\n </Group>\n )}\n <Text\n size=\"xs\"\n c={fairmintVars.colorTextSecondary}\n ta=\"center\"\n className=\"file-dropzone-helper\"\n >\n {resolvedHelperCopy}\n </Text>\n </Stack>\n <Button\n variant=\"light\"\n radius=\"md\"\n disabled={disabled}\n className=\"file-dropzone-browse\"\n mih={44}\n leftSection={resolvedBrowseIcon}\n onClick={(event) => {\n event.stopPropagation();\n openPicker();\n }}\n >\n {browseLabel}\n </Button>\n </Stack>\n {fileInput}\n </Box>\n )}\n\n {fileRejections.length > 0 && (\n <Banner\n tone=\"error\"\n icon={null}\n title=\"Some files weren't added\"\n description={\n <Stack gap={2}>\n {fileRejections.map((rejection) => (\n <Text key={`${rejection.name}:${rejection.error}`} {...rejectionTextProps}>\n {rejection.error}\n </Text>\n ))}\n </Stack>\n }\n />\n )}\n\n {errorMessage && (\n <Text {...errorTextProps} role=\"alert\">\n {errorMessage}\n </Text>\n )}\n </Stack>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileDropzone.js","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"sourcesContent":["import { type DragEvent, type KeyboardEvent, type ReactNode, useRef, useState } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon } from \"../../primitives/layout\";\nimport { Banner } from \"../Banner/Banner\";\n\nconst errorTextProps = {\n size: \"xs\" as const,\n c: fairmintVars.colorErrorText,\n style: { lineHeight: 1.4 },\n};\n\nconst rejectionTextProps = {\n size: \"sm\" as const,\n c: fairmintVars.colorTextSecondary,\n style: { lineHeight: 1.4 },\n};\n\n/** Default supported document-type chips shown in the default dropzone. */\nexport const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [\n \"SAFE\",\n \"Convertible note\",\n \"Purchase agreement\",\n \"Token warrant\",\n \"Other agreement\",\n] as const;\n\n/** Default batch cap surfaced in the dropzone helper copy. */\nexport const FILE_DROPZONE_DEFAULT_MAX_FILES = 50;\n\nexport interface FileDropzoneRejection {\n name: string;\n error: string;\n}\n\nexport interface FileDropzoneProps {\n /**\n * Called with the files the user selected or dropped. Per-file validation,\n * dedup, and batch caps are the caller's responsibility.\n */\n onFilesSelected: (files: File[]) => void;\n /** Full dropzone (Stage A) or collapsed header (Stages B/C). @default \"default\" */\n variant?: \"default\" | \"compact\";\n /** External error (e.g. upload failure) shown beneath the dropzone. */\n errorMessage?: string | null;\n /** Per-file validation rejections (wrong type, oversize, batch cap, etc.). */\n fileRejections?: FileDropzoneRejection[];\n /**\n * Default variant only: shows the live upload animation (loader in the icon\n * slot). The dropzone stays interactive so callers can queue more files\n * while an upload batch is in flight (ENG-854).\n *\n * Ignored by `variant=\"compact\"` — keep the add-more bar calm and put\n * processing copy on parent-owned file rows instead (Slack design review).\n */\n uploading?: boolean;\n /**\n * Default variant only: included in the drop surface accessible name while\n * `uploading` is true. Not shown as visible copy — status belongs on\n * `DocumentStatusRow`.\n * @default \"Uploading…\"\n */\n uploadingLabel?: string;\n /** Disables all interaction (e.g. final import). Does not apply to `uploading`. */\n disabled?: boolean;\n /**\n * Visual override for drag-active styling (Storybook / visual tests). Omit for\n * normal drag-and-drop behavior.\n */\n dragging?: boolean;\n /** Heading under the icon in the default variant. @default \"Upload up to {maxFiles} files\" */\n title?: string;\n /** Override the helper line beneath the chips. */\n helperCopy?: string;\n /** Supported document-type chips. Pass `[]` to hide chips (e.g. cap table uses prose above). */\n supportedTypes?: readonly string[];\n /**\n * @deprecated No visible browse button. Accepted for API compatibility.\n * @default \"Browse\"\n */\n browseLabel?: string;\n /** Maximum files copy-deck number. @default 50 */\n maxFiles?: number;\n /** Size constraint copy shown in the helper line. @default \"50MB each\" */\n maxFileSizeLabel?: string;\n /** `input[type=file]` accept attribute. @default \"application/pdf,.pdf\" */\n accept?: string;\n /** Compact variant: staged file count (investor: total staged files). */\n fileCount?: number;\n /** Compact variant: completed count (investor: analyzed files). */\n analyzedCount?: number;\n /**\n * Compact variant: custom progress copy. When set, replaces the default\n * investor string (`9 files · 3 of 9 analyzed (33%)`). Use for cap table\n * (`6 files · 4 classified`) or pipeline states (`Processing 2 documents`).\n */\n compactProgressText?: string;\n /** Compact variant: leading action label. @default \"Add more PDFs\" */\n compactAddLabel?: string;\n /** Icon in the default variant upload circle. */\n uploadIcon?: ReactNode;\n /** @deprecated No visible browse button. Accepted for API compatibility. */\n browseIcon?: ReactNode;\n /** Icon beside the compact add label. */\n compactAddIcon?: ReactNode;\n}\n\nconst DRAG_GRADIENT_BORDER = `linear-gradient(${fairmintVars.colorBgSurfaceSecondary}, ${fairmintVars.colorBgSurfaceSecondary}) padding-box, linear-gradient(135deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}) border-box`;\n\nfunction DefaultUploadIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"28\"\n height=\"28\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 13v8\" />\n <path d=\"M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242\" />\n <path d=\"m8 17 4-4 4 4\" />\n </svg>\n );\n}\n\nfunction DefaultCompactAddIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 19V5\" />\n <path d=\"m5 12 7-7 7 7\" />\n </svg>\n );\n}\n\nfunction pluralizeFiles(count: number): string {\n return count === 1 ? \"file\" : \"files\";\n}\n\n/**\n * Multi-file document dropzone for investor import and similar flows.\n *\n * Keyboard-operable: the drop surface is the sole focusable control and opens\n * the file picker. Drag state adds a `breathe` glow. Set `uploading` on the\n * **default** variant for the ENG-854 loader while keeping the dropzone open\n * for more files; reserve `disabled` for hard blocks. Compact stays a calm\n * add-more control — put processing copy on parent-owned file rows, not the header.\n *\n * Responsive: uses CSS container queries on `.file-dropzone-root` so the layout\n * adapts inside narrow right panels (cap table drawer ~360px, investor aside\n * ~420px) without callers passing breakpoint props.\n */\nexport function FileDropzone({\n onFilesSelected,\n variant = \"default\",\n errorMessage,\n fileRejections = [],\n uploading = false,\n uploadingLabel = \"Uploading…\",\n disabled = false,\n dragging,\n title,\n helperCopy,\n supportedTypes = FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,\n maxFiles = FILE_DROPZONE_DEFAULT_MAX_FILES,\n maxFileSizeLabel = \"50MB each\",\n accept = \"application/pdf,.pdf\",\n fileCount = 0,\n analyzedCount = 0,\n compactProgressText,\n compactAddLabel = \"Add more PDFs\",\n uploadIcon,\n compactAddIcon,\n}: FileDropzoneProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const dragCounterRef = useRef(0);\n const [internalDragging, setInternalDragging] = useState(false);\n const isDragging = dragging ?? internalDragging;\n const isCompact = variant === \"compact\";\n /** Compact never shows upload chrome — processing belongs on file rows. */\n const showUploadingChrome = uploading && !isCompact;\n const resolvedUploadIcon = uploadIcon ?? <DefaultUploadIcon />;\n const resolvedCompactAddIcon = compactAddIcon ?? <DefaultCompactAddIcon />;\n const resolvedTitle = title ?? `Upload up to ${maxFiles} files`;\n const browseHint = \"Drop files here or activate to browse.\";\n const defaultAriaLabel = [showUploadingChrome ? uploadingLabel : null, resolvedTitle, browseHint]\n .filter((part): part is string => Boolean(part))\n .join(\" \");\n const resolvedHelperCopy =\n helperCopy ??\n (showUploadingChrome ? \"You can add more PDFs while we upload\" : `PDF · ${maxFileSizeLabel}`);\n const safeFileCount = Math.max(0, fileCount);\n const clampedAnalyzed = Math.min(Math.max(0, analyzedCount), safeFileCount);\n const pct = safeFileCount > 0 ? Math.round((clampedAnalyzed / safeFileCount) * 100) : 0;\n const defaultCompactProgress =\n safeFileCount > 0\n ? `${safeFileCount} ${pluralizeFiles(safeFileCount)} · ${clampedAnalyzed} of ${safeFileCount} analyzed (${pct}%)`\n : null;\n const resolvedCompactProgress = compactProgressText ?? defaultCompactProgress;\n const compactAriaLabel = `${compactAddLabel}. Drop files here or activate to browse.`;\n\n const handleFiles = (fileList: FileList | null | undefined) => {\n if (disabled) return;\n if (!fileList || fileList.length === 0) return;\n onFilesSelected([...fileList]);\n };\n\n const openPicker = () => {\n if (disabled) return;\n inputRef.current?.click();\n };\n\n const handleSurfaceKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n openPicker();\n }\n };\n\n const setDragging = (next: boolean) => {\n if (dragging === undefined) {\n setInternalDragging(next);\n }\n };\n\n const handleDragEnter = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n if (disabled) return;\n dragCounterRef.current += 1;\n setDragging(true);\n };\n\n const handleDragLeave = () => {\n // Counter-only: each enter/leave (including child targets) must balance.\n // Do not also filter with relatedTarget containment — that skips decrements\n // while enters still increment, leaving drag state stuck above zero.\n dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);\n if (dragCounterRef.current === 0) {\n setDragging(false);\n }\n };\n\n const handleDragOver = (event: DragEvent<HTMLDivElement>) => {\n // Always cancel default so the browser does not navigate/open the file on\n // drop — including when the dropzone is disabled.\n event.preventDefault();\n if (disabled) return;\n setDragging(true);\n };\n\n const handleDrop = (event: DragEvent<HTMLDivElement>) => {\n event.preventDefault();\n dragCounterRef.current = 0;\n setDragging(false);\n if (disabled) return;\n handleFiles(event.dataTransfer.files);\n };\n\n const fileInput = (\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple\n hidden\n disabled={disabled}\n aria-hidden=\"true\"\n tabIndex={-1}\n onClick={(event) => event.stopPropagation()}\n onChange={(event) => {\n handleFiles(event.target.files);\n event.target.value = \"\";\n }}\n />\n );\n\n return (\n <Stack gap=\"xs\" data-testid=\"file-dropzone\" className=\"file-dropzone-root\" w=\"100%\" miw={0}>\n {isCompact ? (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={compactAriaLabel}\n aria-disabled={disabled}\n data-testid=\"file-dropzone-surface\"\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--compact\"\n onClick={openPicker}\n onKeyDown={handleSurfaceKeyDown}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n borderRadius: 12,\n padding: \"10px 16px\",\n border: `1px dashed ${isDragging ? fairmintVars.colorBorderFocus : fairmintVars.colorBorderDefault}`,\n background: isDragging\n ? fairmintVars.colorBgHover\n : fairmintVars.colorBgSurfaceSecondary,\n transition: \"background 0.15s ease, border-color 0.15s ease\",\n opacity: disabled ? 0.6 : 1,\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n className=\"file-dropzone-compact-row\"\n align=\"flex-start\"\n >\n <Group gap={6} wrap=\"nowrap\" className=\"file-dropzone-compact-leading\" miw={0}>\n <Box c={fairmintVars.colorIconSecondary} style={{ display: \"flex\" }} aria-hidden>\n {resolvedCompactAddIcon}\n </Box>\n <Text size=\"sm\" fw={500} c={fairmintVars.colorTextPrimary}>\n {compactAddLabel}\n </Text>\n </Group>\n <Text\n size=\"sm\"\n c={fairmintVars.colorTextSecondary}\n className=\"file-dropzone-compact-progress\"\n style={{ fontVariantNumeric: \"tabular-nums\" }}\n >\n {resolvedCompactProgress}\n </Text>\n </Group>\n {fileInput}\n </Box>\n ) : (\n <Box\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-label={defaultAriaLabel}\n aria-disabled={disabled || undefined}\n aria-busy={showUploadingChrome || undefined}\n data-testid=\"file-dropzone-surface\"\n data-uploading={showUploadingChrome || undefined}\n data-dragging={isDragging || undefined}\n className=\"file-dropzone-surface file-dropzone-surface--default\"\n onClick={openPicker}\n onKeyDown={handleSurfaceKeyDown}\n onDragEnter={handleDragEnter}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n opacity: disabled ? 0.6 : 1,\n borderRadius: 16,\n padding: \"40px 24px\",\n textAlign: \"center\",\n border: \"2px solid transparent\",\n background: isDragging ? DRAG_GRADIENT_BORDER : fairmintVars.colorBgSurfaceSecondary,\n borderStyle: isDragging ? \"solid\" : \"dashed\",\n borderColor: isDragging ? \"transparent\" : fairmintVars.colorBorderDefault,\n boxShadow: isDragging\n ? `0 0 0 4px color-mix(in srgb, ${fairmintVars.colorBrandPrimary} 12%, transparent)`\n : \"none\",\n transition: \"box-shadow 0.2s ease, border-color 0.2s ease\",\n }}\n >\n <Stack gap=\"sm\" align=\"center\">\n <ThemeIcon\n size={56}\n radius=\"xl\"\n variant=\"light\"\n color={colors.primary}\n className={`file-dropzone-icon-wrap${\n isDragging\n ? \" file-dropzone-icon--dragging\"\n : showUploadingChrome\n ? \" file-dropzone-icon--uploading\"\n : \"\"\n }`}\n data-dragging={isDragging || undefined}\n data-uploading={showUploadingChrome || undefined}\n >\n {showUploadingChrome ? (\n <Loader size=\"sm\" color={colors.primary} aria-hidden />\n ) : (\n resolvedUploadIcon\n )}\n </ThemeIcon>\n <Stack gap=\"xs\" align=\"center\" className=\"file-dropzone-copy\" w=\"100%\">\n <Text\n fw={600}\n c={fairmintVars.colorTextPrimary}\n className=\"file-dropzone-title\"\n ta=\"center\"\n >\n {resolvedTitle}\n </Text>\n {supportedTypes.length > 0 && (\n <Group\n gap={6}\n justify=\"center\"\n wrap=\"wrap\"\n w=\"100%\"\n className=\"file-dropzone-chips\"\n >\n {supportedTypes.map((type) => (\n <Text\n key={type}\n component=\"span\"\n size=\"xs\"\n fw={500}\n c={fairmintVars.colorTextPrimary}\n px={8}\n py={2}\n style={{\n background: fairmintVars.colorBgSurface,\n border: `1px solid ${fairmintVars.colorBorderDefault}`,\n borderRadius: 999,\n whiteSpace: \"nowrap\",\n }}\n >\n {type}\n </Text>\n ))}\n </Group>\n )}\n <Text\n size=\"xs\"\n c={fairmintVars.colorTextSecondary}\n ta=\"center\"\n className=\"file-dropzone-helper\"\n >\n {resolvedHelperCopy}\n </Text>\n </Stack>\n </Stack>\n {fileInput}\n </Box>\n )}\n\n {fileRejections.length > 0 && (\n <Banner\n tone=\"error\"\n icon={null}\n title=\"Some files weren't added\"\n description={\n <Stack gap={2}>\n {fileRejections.map((rejection) => (\n <Text key={`${rejection.name}:${rejection.error}`} {...rejectionTextProps}>\n {rejection.error}\n </Text>\n ))}\n </Stack>\n }\n />\n )}\n\n {errorMessage && (\n <Text {...errorTextProps} role=\"alert\">\n {errorMessage}\n </Text>\n )}\n </Stack>\n );\n}\n"],"names":[],"mappings":"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"}
package/dist/styles.css CHANGED
@@ -9224,10 +9224,6 @@ fieldset:disabled .m_38aeed47:where(:not([data-inverted])),
9224
9224
  line-height: 1.35;
9225
9225
  }
9226
9226
 
9227
- .file-dropzone-browse {
9228
- width: 100%;
9229
- }
9230
-
9231
9227
  .file-dropzone-compact-row {
9232
9228
  flex-direction: column;
9233
9229
  align-items: stretch;
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@fairmint/ui",
3
- "version": "0.4.6",
3
+ "version": "0.4.8",
4
4
  "type": "module",
5
5
  "description": "Fairmint design system and UI component library",
6
- "license": "UNLICENSED",
6
+ "license": "SEE LICENSE IN LICENSE",
7
7
  "packageManager": "bun@1.3.11",
8
8
  "repository": {
9
9
  "type": "git",
@@ -40,7 +40,7 @@
40
40
  "*.css"
41
41
  ],
42
42
  "publishConfig": {
43
- "access": "restricted"
43
+ "access": "public"
44
44
  },
45
45
  "dependencies": {
46
46
  "@mantine/core": "8.3.18",