@fairmint/ui 0.4.5 → 0.4.7
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/dist/components/generic/Eyebrow/Eyebrow.cjs +1 -1
- package/dist/components/generic/Eyebrow/Eyebrow.cjs.map +1 -1
- package/dist/components/generic/Eyebrow/Eyebrow.d.ts +3 -6
- package/dist/components/generic/Eyebrow/Eyebrow.d.ts.map +1 -1
- package/dist/components/generic/Eyebrow/Eyebrow.js +1 -1
- package/dist/components/generic/Eyebrow/Eyebrow.js.map +1 -1
- package/dist/components/generic/FileDropzone/FileDropzone.cjs +21 -84
- package/dist/components/generic/FileDropzone/FileDropzone.cjs.map +1 -1
- package/dist/components/generic/FileDropzone/FileDropzone.d.ts +19 -15
- package/dist/components/generic/FileDropzone/FileDropzone.d.ts.map +1 -1
- package/dist/components/generic/FileDropzone/FileDropzone.js +22 -85
- package/dist/components/generic/FileDropzone/FileDropzone.js.map +1 -1
- package/dist/components/layout/PageHeader/PageHeader.cjs.map +1 -1
- package/dist/components/layout/PageHeader/PageHeader.d.ts +1 -0
- package/dist/components/layout/PageHeader/PageHeader.d.ts.map +1 -1
- package/dist/components/layout/PageHeader/PageHeader.js.map +1 -1
- package/dist/styles.css +0 -4
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ function Eyebrow({
|
|
|
9
9
|
c = index.fairmintVars.colorTextSecondary,
|
|
10
10
|
...rest
|
|
11
11
|
}) {
|
|
12
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size, fw:
|
|
12
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size, fw: 600, tt: "uppercase", c, style: { letterSpacing: "0.08em" }, ...rest, children });
|
|
13
13
|
}
|
|
14
14
|
exports.Eyebrow = Eyebrow;
|
|
15
15
|
//# sourceMappingURL=Eyebrow.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Eyebrow.cjs","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { Text, type TextProps } from \"../../primitives/layout\";\n\nexport interface EyebrowProps extends Omit<TextProps, \"children\" | \"size\" | \"fw\" | \"tt\" | \"c\"> {\n /** Eyebrow text content. */\n children: ReactNode;\n /** Eyebrow size. Defaults to `xs`. */\n size?: \"xs\" | \"sm\";\n /**\n * Text color. Defaults to the semantic secondary text token. Override when the\n * eyebrow sits on a dark background or needs to match an accent.\n */\n c?: string;\n}\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"Eyebrow.cjs","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { Text, type TextProps } from \"../../primitives/layout\";\n\nexport interface EyebrowProps extends Omit<TextProps, \"children\" | \"size\" | \"fw\" | \"tt\" | \"c\"> {\n /** Eyebrow text content. */\n children: ReactNode;\n /** Eyebrow size. Defaults to `xs`. */\n size?: \"xs\" | \"sm\";\n /**\n * Text color. Defaults to the semantic secondary text token. Override when the\n * eyebrow sits on a dark background or needs to match an accent.\n */\n c?: string;\n}\n\n/**\n * Uppercase letter-spaced kicker. Marketing and event surfaces only —\n * not Founder or Investor page titles, wizard steps, or section headers.\n * See design/DESIGN.md Page copy.\n */\nexport function Eyebrow({\n children,\n size = \"xs\",\n c = fairmintVars.colorTextSecondary,\n ...rest\n}: EyebrowProps) {\n return (\n <Text size={size} fw={600} tt=\"uppercase\" c={c} style={{ letterSpacing: \"0.08em\" }} {...rest}>\n {children}\n </Text>\n );\n}\n"],"names":["fairmintVars","jsx","Text"],"mappings":";;;;;AAqBO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,EACP,IAAIA,MAAAA,aAAa;AAAA,EACjB,GAAG;AACL,GAAiB;AACf,SACEC,2BAAAA,IAACC,KAAAA,MAAA,EAAK,MAAY,IAAI,KAAK,IAAG,aAAY,GAAM,OAAO,EAAE,eAAe,SAAA,GAAa,GAAG,MACrF,UACH;AAEJ;;"}
|
|
@@ -12,12 +12,9 @@ export interface EyebrowProps extends Omit<TextProps, "children" | "size" | "fw"
|
|
|
12
12
|
c?: string;
|
|
13
13
|
}
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* Standardizes the `Text size="xs" tt="uppercase" fw={700}
|
|
19
|
-
* c={fairmintVars.colorTextSecondary} style={{ letterSpacing: "0.08em" }}`
|
|
20
|
-
* incantation that was scattered across screens.
|
|
15
|
+
* Uppercase letter-spaced kicker. Marketing and event surfaces only —
|
|
16
|
+
* not Founder or Investor page titles, wizard steps, or section headers.
|
|
17
|
+
* See design/DESIGN.md Page copy.
|
|
21
18
|
*/
|
|
22
19
|
export declare function Eyebrow({ children, size, c, ...rest }: EyebrowProps): import("react").JSX.Element;
|
|
23
20
|
//# sourceMappingURL=Eyebrow.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Eyebrow.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;IAC5F,4BAA4B;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB;;;OAGG;IACH,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED
|
|
1
|
+
{"version":3,"file":"Eyebrow.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAQ,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAE/D,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC;IAC5F,4BAA4B;IAC5B,QAAQ,EAAE,SAAS,CAAC;IACpB,sCAAsC;IACtC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB;;;OAGG;IACH,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,IAAW,EACX,CAAmC,EACnC,GAAG,IAAI,EACR,EAAE,YAAY,+BAMd"}
|
|
@@ -7,7 +7,7 @@ function Eyebrow({
|
|
|
7
7
|
c = fairmintVars.colorTextSecondary,
|
|
8
8
|
...rest
|
|
9
9
|
}) {
|
|
10
|
-
return /* @__PURE__ */ jsx(Text, { size, fw:
|
|
10
|
+
return /* @__PURE__ */ jsx(Text, { size, fw: 600, tt: "uppercase", c, style: { letterSpacing: "0.08em" }, ...rest, children });
|
|
11
11
|
}
|
|
12
12
|
export {
|
|
13
13
|
Eyebrow
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Eyebrow.js","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { Text, type TextProps } from \"../../primitives/layout\";\n\nexport interface EyebrowProps extends Omit<TextProps, \"children\" | \"size\" | \"fw\" | \"tt\" | \"c\"> {\n /** Eyebrow text content. */\n children: ReactNode;\n /** Eyebrow size. Defaults to `xs`. */\n size?: \"xs\" | \"sm\";\n /**\n * Text color. Defaults to the semantic secondary text token. Override when the\n * eyebrow sits on a dark background or needs to match an accent.\n */\n c?: string;\n}\n\n/**\n *
|
|
1
|
+
{"version":3,"file":"Eyebrow.js","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { Text, type TextProps } from \"../../primitives/layout\";\n\nexport interface EyebrowProps extends Omit<TextProps, \"children\" | \"size\" | \"fw\" | \"tt\" | \"c\"> {\n /** Eyebrow text content. */\n children: ReactNode;\n /** Eyebrow size. Defaults to `xs`. */\n size?: \"xs\" | \"sm\";\n /**\n * Text color. Defaults to the semantic secondary text token. Override when the\n * eyebrow sits on a dark background or needs to match an accent.\n */\n c?: string;\n}\n\n/**\n * Uppercase letter-spaced kicker. Marketing and event surfaces only —\n * not Founder or Investor page titles, wizard steps, or section headers.\n * See design/DESIGN.md Page copy.\n */\nexport function Eyebrow({\n children,\n size = \"xs\",\n c = fairmintVars.colorTextSecondary,\n ...rest\n}: EyebrowProps) {\n return (\n <Text size={size} fw={600} tt=\"uppercase\" c={c} style={{ letterSpacing: \"0.08em\" }} {...rest}>\n {children}\n </Text>\n );\n}\n"],"names":[],"mappings":";;;AAqBO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,EACP,IAAI,aAAa;AAAA,EACjB,GAAG;AACL,GAAiB;AACf,SACE,oBAAC,MAAA,EAAK,MAAY,IAAI,KAAK,IAAG,aAAY,GAAM,OAAO,EAAE,eAAe,SAAA,GAAa,GAAG,MACrF,UACH;AAEJ;"}
|
|
@@ -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.
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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.
|
|
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
|
|
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
|
|
24
|
-
*
|
|
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:
|
|
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
|
-
/**
|
|
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
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
*
|
|
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,
|
|
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;
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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:
|
|
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:
|
|
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.
|
|
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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader.cjs","sources":["../../../../src/components/layout/PageHeader/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars, responsiveTypography } from \"../../../theme\";\nimport { Group, Stack, Text, Title } from \"../../primitives/layout\";\n\nexport interface PageHeaderProps {\n title: string;\n subtitle?: string;\n action?: ReactNode;\n}\n\nexport function PageHeader({ title, subtitle, action }: PageHeaderProps) {\n return (\n <Group justify=\"space-between\" align=\"flex-start\" mb=\"lg\">\n <Stack gap={4}>\n <Title order={2} fz={responsiveTypography.h2}>\n {title}\n </Title>\n {subtitle && (\n <Text c={fairmintVars.colorTextSecondary} size=\"sm\">\n {subtitle}\n </Text>\n )}\n </Stack>\n {action}\n </Group>\n );\n}\n"],"names":["Group","jsxs","Stack","jsx","Title","responsiveTypography","Text","fairmintVars"],"mappings":";;;;;;;;;
|
|
1
|
+
{"version":3,"file":"PageHeader.cjs","sources":["../../../../src/components/layout/PageHeader/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars, responsiveTypography } from \"../../../theme\";\nimport { Group, Stack, Text, Title } from \"../../primitives/layout\";\n\nexport interface PageHeaderProps {\n title: string;\n /** Unique operational state only (date, count, status). Omit restatements of the title. */\n subtitle?: string;\n action?: ReactNode;\n}\n\nexport function PageHeader({ title, subtitle, action }: PageHeaderProps) {\n return (\n <Group justify=\"space-between\" align=\"flex-start\" mb=\"lg\">\n <Stack gap={4}>\n <Title order={2} fz={responsiveTypography.h2}>\n {title}\n </Title>\n {subtitle && (\n <Text c={fairmintVars.colorTextSecondary} size=\"sm\">\n {subtitle}\n </Text>\n )}\n </Stack>\n {action}\n </Group>\n );\n}\n"],"names":["Group","jsxs","Stack","jsx","Title","responsiveTypography","Text","fairmintVars"],"mappings":";;;;;;;;;AAWO,SAAS,WAAW,EAAE,OAAO,UAAU,UAA2B;AACvE,yCACGA,aAAA,EAAM,SAAQ,iBAAgB,OAAM,cAAa,IAAG,MACnD,UAAA;AAAA,IAAAC,2BAAAA,KAACC,OAAAA,OAAA,EAAM,KAAK,GACV,UAAA;AAAA,MAAAC,+BAACC,MAAAA,SAAM,OAAO,GAAG,IAAIC,qBAAAA,qBAAqB,IACvC,UAAA,OACH;AAAA,MACC,2CACEC,WAAA,EAAK,GAAGC,MAAAA,aAAa,oBAAoB,MAAK,MAC5C,UAAA,SAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IACC;AAAA,EAAA,GACH;AAEJ;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/PageHeader/PageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,+BAgBtE"}
|
|
1
|
+
{"version":3,"file":"PageHeader.d.ts","sourceRoot":"","sources":["../../../../src/components/layout/PageHeader/PageHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAIvC,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,eAAe,+BAgBtE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHeader.js","sources":["../../../../src/components/layout/PageHeader/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars, responsiveTypography } from \"../../../theme\";\nimport { Group, Stack, Text, Title } from \"../../primitives/layout\";\n\nexport interface PageHeaderProps {\n title: string;\n subtitle?: string;\n action?: ReactNode;\n}\n\nexport function PageHeader({ title, subtitle, action }: PageHeaderProps) {\n return (\n <Group justify=\"space-between\" align=\"flex-start\" mb=\"lg\">\n <Stack gap={4}>\n <Title order={2} fz={responsiveTypography.h2}>\n {title}\n </Title>\n {subtitle && (\n <Text c={fairmintVars.colorTextSecondary} size=\"sm\">\n {subtitle}\n </Text>\n )}\n </Stack>\n {action}\n </Group>\n );\n}\n"],"names":[],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"PageHeader.js","sources":["../../../../src/components/layout/PageHeader/PageHeader.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars, responsiveTypography } from \"../../../theme\";\nimport { Group, Stack, Text, Title } from \"../../primitives/layout\";\n\nexport interface PageHeaderProps {\n title: string;\n /** Unique operational state only (date, count, status). Omit restatements of the title. */\n subtitle?: string;\n action?: ReactNode;\n}\n\nexport function PageHeader({ title, subtitle, action }: PageHeaderProps) {\n return (\n <Group justify=\"space-between\" align=\"flex-start\" mb=\"lg\">\n <Stack gap={4}>\n <Title order={2} fz={responsiveTypography.h2}>\n {title}\n </Title>\n {subtitle && (\n <Text c={fairmintVars.colorTextSecondary} size=\"sm\">\n {subtitle}\n </Text>\n )}\n </Stack>\n {action}\n </Group>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAWO,SAAS,WAAW,EAAE,OAAO,UAAU,UAA2B;AACvE,8BACG,OAAA,EAAM,SAAQ,iBAAgB,OAAM,cAAa,IAAG,MACnD,UAAA;AAAA,IAAA,qBAAC,OAAA,EAAM,KAAK,GACV,UAAA;AAAA,MAAA,oBAAC,SAAM,OAAO,GAAG,IAAI,qBAAqB,IACvC,UAAA,OACH;AAAA,MACC,gCACE,MAAA,EAAK,GAAG,aAAa,oBAAoB,MAAK,MAC5C,UAAA,SAAA,CACH;AAAA,IAAA,GAEJ;AAAA,IACC;AAAA,EAAA,GACH;AAEJ;"}
|
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;
|