@fairmint/ui 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist/components/generic/Banner/Banner.cjs +200 -0
  2. package/dist/components/generic/Banner/Banner.cjs.map +1 -0
  3. package/dist/components/generic/Banner/Banner.d.ts +36 -0
  4. package/dist/components/generic/Banner/Banner.d.ts.map +1 -0
  5. package/dist/components/generic/Banner/Banner.js +200 -0
  6. package/dist/components/generic/Banner/Banner.js.map +1 -0
  7. package/dist/components/generic/DocumentRow/DocumentRow.cjs +297 -0
  8. package/dist/components/generic/DocumentRow/DocumentRow.cjs.map +1 -0
  9. package/dist/components/generic/DocumentRow/DocumentRow.d.ts +49 -0
  10. package/dist/components/generic/DocumentRow/DocumentRow.d.ts.map +1 -0
  11. package/dist/components/generic/DocumentRow/DocumentRow.js +297 -0
  12. package/dist/components/generic/DocumentRow/DocumentRow.js.map +1 -0
  13. package/dist/components/generic/FileDropzone/FileDropzone.cjs +396 -0
  14. package/dist/components/generic/FileDropzone/FileDropzone.cjs.map +1 -0
  15. package/dist/components/generic/FileDropzone/FileDropzone.d.ts +91 -0
  16. package/dist/components/generic/FileDropzone/FileDropzone.d.ts.map +1 -0
  17. package/dist/components/generic/FileDropzone/FileDropzone.js +396 -0
  18. package/dist/components/generic/FileDropzone/FileDropzone.js.map +1 -0
  19. package/dist/fairmint-ui.cjs +9 -0
  20. package/dist/fairmint-ui.cjs.map +1 -1
  21. package/dist/fairmint-ui.js +11 -2
  22. package/dist/fairmint-ui.js.map +1 -1
  23. package/dist/index.d.ts +8 -2
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/styles.css +73 -0
  26. package/dist/theme/index.cjs +4 -0
  27. package/dist/theme/index.cjs.map +1 -1
  28. package/dist/theme/index.d.ts +2 -0
  29. package/dist/theme/index.d.ts.map +1 -1
  30. package/dist/theme/index.js +4 -0
  31. package/dist/theme/index.js.map +1 -1
  32. package/package.json +1 -1
@@ -0,0 +1,396 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useRef, useState } from "react";
3
+ import { neutralColors, brandColors } from "../../../theme/index.js";
4
+ import { colors } from "../../../theme/colors.js";
5
+ import { Button } from "../../primitives/Button/Button.js";
6
+ import { Loader } from "../../primitives/Loader/Loader.js";
7
+ import { Stack, Box } from "../../primitives/layout.js";
8
+ import { Banner } from "../Banner/Banner.js";
9
+ import { Group } from "../../../node_modules/@mantine/core/esm/components/Group/Group.js";
10
+ import { Text } from "../../../node_modules/@mantine/core/esm/components/Text/Text.js";
11
+ import { ThemeIcon } from "../../../node_modules/@mantine/core/esm/components/ThemeIcon/ThemeIcon.js";
12
+ const errorTextProps = {
13
+ size: "xs",
14
+ c: colors.error,
15
+ style: { lineHeight: 1.4 }
16
+ };
17
+ const rejectionTextProps = {
18
+ size: "sm",
19
+ c: neutralColors[500],
20
+ style: { lineHeight: 1.4 }
21
+ };
22
+ const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [
23
+ "SAFE",
24
+ "Convertible note",
25
+ "Purchase agreement",
26
+ "Token warrant",
27
+ "Other agreement"
28
+ ];
29
+ const FILE_DROPZONE_DEFAULT_MAX_FILES = 50;
30
+ const DRAG_GRADIENT_BORDER = `linear-gradient(${neutralColors[50]}, ${neutralColors[50]}) padding-box, linear-gradient(135deg, ${brandColors.indigo}, ${brandColors.purple}) border-box`;
31
+ function DefaultUploadIcon() {
32
+ return /* @__PURE__ */ jsxs(
33
+ "svg",
34
+ {
35
+ "aria-hidden": "true",
36
+ width: "28",
37
+ height: "28",
38
+ viewBox: "0 0 24 24",
39
+ fill: "none",
40
+ stroke: "currentColor",
41
+ strokeWidth: "1.75",
42
+ strokeLinecap: "round",
43
+ strokeLinejoin: "round",
44
+ children: [
45
+ /* @__PURE__ */ jsx("path", { d: "M12 13v8" }),
46
+ /* @__PURE__ */ jsx("path", { d: "M4 14.899A7 7 0 1 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.242" }),
47
+ /* @__PURE__ */ jsx("path", { d: "m8 17 4-4 4 4" })
48
+ ]
49
+ }
50
+ );
51
+ }
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
+ function DefaultCompactAddIcon() {
77
+ return /* @__PURE__ */ jsxs(
78
+ "svg",
79
+ {
80
+ "aria-hidden": "true",
81
+ width: "16",
82
+ height: "16",
83
+ viewBox: "0 0 24 24",
84
+ fill: "none",
85
+ stroke: "currentColor",
86
+ strokeWidth: "1.75",
87
+ strokeLinecap: "round",
88
+ strokeLinejoin: "round",
89
+ children: [
90
+ /* @__PURE__ */ jsx("path", { d: "M12 19V5" }),
91
+ /* @__PURE__ */ jsx("path", { d: "m5 12 7-7 7 7" })
92
+ ]
93
+ }
94
+ );
95
+ }
96
+ function pluralizeFiles(count) {
97
+ return count === 1 ? "file" : "files";
98
+ }
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, ${brandColors.indigo}, ${brandColors.purple}, ${brandColors.indigo});
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: ${neutralColors[600]};
122
+ }
123
+ }
124
+ ` });
125
+ }
126
+ function FileDropzone({
127
+ onFilesSelected,
128
+ variant = "default",
129
+ errorMessage,
130
+ fileRejections = [],
131
+ uploading = false,
132
+ uploadingLabel = "Uploading…",
133
+ disabled = false,
134
+ dragging,
135
+ title = "Drop your PDFs here, or browse",
136
+ helperCopy,
137
+ supportedTypes = FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,
138
+ browseLabel = "Browse",
139
+ maxFiles = FILE_DROPZONE_DEFAULT_MAX_FILES,
140
+ maxFileSizeLabel = "50MB each",
141
+ accept = "application/pdf,.pdf",
142
+ fileCount = 0,
143
+ analyzedCount = 0,
144
+ compactProgressText,
145
+ compactAddLabel = "Add more PDFs",
146
+ uploadIcon,
147
+ browseIcon,
148
+ compactAddIcon
149
+ }) {
150
+ const inputRef = useRef(null);
151
+ const dragCounterRef = useRef(0);
152
+ const [internalDragging, setInternalDragging] = useState(false);
153
+ const isDragging = dragging ?? internalDragging;
154
+ const isCompact = variant === "compact";
155
+ const showUploadingChrome = uploading && !isCompact;
156
+ const resolvedUploadIcon = uploadIcon ?? /* @__PURE__ */ jsx(DefaultUploadIcon, {});
157
+ const resolvedBrowseIcon = browseIcon ?? /* @__PURE__ */ jsx(DefaultBrowseIcon, {});
158
+ const resolvedCompactAddIcon = compactAddIcon ?? /* @__PURE__ */ jsx(DefaultCompactAddIcon, {});
159
+ const resolvedHelperCopy = helperCopy ?? (showUploadingChrome ? "You can add more PDFs while we upload" : `PDF · up to ${maxFiles} files · ${maxFileSizeLabel}`);
160
+ const safeFileCount = Math.max(0, fileCount);
161
+ const clampedAnalyzed = Math.min(Math.max(0, analyzedCount), safeFileCount);
162
+ const pct = safeFileCount > 0 ? Math.round(clampedAnalyzed / safeFileCount * 100) : 0;
163
+ const defaultCompactProgress = safeFileCount > 0 ? `${safeFileCount} ${pluralizeFiles(safeFileCount)} · ${clampedAnalyzed} of ${safeFileCount} analyzed (${pct}%)` : null;
164
+ const resolvedCompactProgress = compactProgressText ?? defaultCompactProgress;
165
+ const compactAriaLabel = `${compactAddLabel}. Drop files here or activate to browse.`;
166
+ const handleFiles = (fileList) => {
167
+ if (disabled) return;
168
+ if (!fileList || fileList.length === 0) return;
169
+ onFilesSelected([...fileList]);
170
+ };
171
+ const openPicker = () => {
172
+ if (disabled) return;
173
+ inputRef.current?.click();
174
+ };
175
+ const setDragging = (next) => {
176
+ if (dragging === void 0) {
177
+ setInternalDragging(next);
178
+ }
179
+ };
180
+ const handleDragEnter = (event) => {
181
+ event.preventDefault();
182
+ if (disabled) return;
183
+ dragCounterRef.current += 1;
184
+ setDragging(true);
185
+ };
186
+ const handleDragLeave = () => {
187
+ dragCounterRef.current = Math.max(0, dragCounterRef.current - 1);
188
+ if (dragCounterRef.current === 0) {
189
+ setDragging(false);
190
+ }
191
+ };
192
+ const handleDragOver = (event) => {
193
+ event.preventDefault();
194
+ if (disabled) return;
195
+ setDragging(true);
196
+ };
197
+ const handleDrop = (event) => {
198
+ event.preventDefault();
199
+ dragCounterRef.current = 0;
200
+ setDragging(false);
201
+ if (disabled) return;
202
+ handleFiles(event.dataTransfer.files);
203
+ };
204
+ const fileInput = /* @__PURE__ */ jsx(
205
+ "input",
206
+ {
207
+ ref: inputRef,
208
+ type: "file",
209
+ accept,
210
+ multiple: true,
211
+ hidden: true,
212
+ disabled,
213
+ "aria-hidden": "true",
214
+ tabIndex: -1,
215
+ onClick: (event) => event.stopPropagation(),
216
+ onChange: (event) => {
217
+ handleFiles(event.target.files);
218
+ event.target.value = "";
219
+ }
220
+ }
221
+ );
222
+ return /* @__PURE__ */ jsxs(Stack, { gap: "xs", "data-testid": "file-dropzone", className: "file-dropzone-root", w: "100%", miw: 0, children: [
223
+ isCompact ? /* @__PURE__ */ jsxs(
224
+ Box,
225
+ {
226
+ role: "button",
227
+ tabIndex: disabled ? -1 : 0,
228
+ "aria-label": compactAriaLabel,
229
+ "aria-disabled": disabled,
230
+ "data-testid": "file-dropzone-surface",
231
+ "data-dragging": isDragging || void 0,
232
+ className: "file-dropzone-surface file-dropzone-surface--compact",
233
+ onClick: openPicker,
234
+ onKeyDown: (event) => {
235
+ if (event.key === "Enter" || event.key === " ") {
236
+ event.preventDefault();
237
+ openPicker();
238
+ }
239
+ },
240
+ onDragEnter: handleDragEnter,
241
+ onDragOver: handleDragOver,
242
+ onDragLeave: handleDragLeave,
243
+ onDrop: handleDrop,
244
+ style: {
245
+ cursor: disabled ? "not-allowed" : "pointer",
246
+ borderRadius: 12,
247
+ padding: "10px 16px",
248
+ border: `1px dashed ${isDragging ? neutralColors[500] : neutralColors[300]}`,
249
+ background: isDragging ? neutralColors[100] : neutralColors[50],
250
+ transition: "background 0.15s ease, border-color 0.15s ease",
251
+ opacity: disabled ? 0.6 : 1
252
+ },
253
+ children: [
254
+ /* @__PURE__ */ jsxs(
255
+ Group,
256
+ {
257
+ justify: "space-between",
258
+ wrap: "nowrap",
259
+ gap: "sm",
260
+ className: "file-dropzone-compact-row",
261
+ align: "flex-start",
262
+ children: [
263
+ /* @__PURE__ */ jsxs(Group, { gap: 6, wrap: "nowrap", className: "file-dropzone-compact-leading", miw: 0, children: [
264
+ /* @__PURE__ */ jsx(Box, { c: neutralColors[600], style: { display: "flex" }, "aria-hidden": true, children: resolvedCompactAddIcon }),
265
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: neutralColors[800], children: compactAddLabel })
266
+ ] }),
267
+ /* @__PURE__ */ jsx(
268
+ Text,
269
+ {
270
+ size: "sm",
271
+ c: neutralColors[600],
272
+ className: "file-dropzone-compact-progress",
273
+ style: { fontVariantNumeric: "tabular-nums" },
274
+ children: resolvedCompactProgress
275
+ }
276
+ )
277
+ ]
278
+ }
279
+ ),
280
+ fileInput
281
+ ]
282
+ }
283
+ ) : /* @__PURE__ */ jsxs(
284
+ Box,
285
+ {
286
+ "aria-disabled": disabled || void 0,
287
+ "aria-busy": showUploadingChrome || void 0,
288
+ "data-testid": "file-dropzone-surface",
289
+ "data-uploading": showUploadingChrome || void 0,
290
+ "data-dragging": isDragging || void 0,
291
+ className: "file-dropzone-surface file-dropzone-surface--default",
292
+ onClick: openPicker,
293
+ onDragEnter: handleDragEnter,
294
+ onDragOver: handleDragOver,
295
+ onDragLeave: handleDragLeave,
296
+ onDrop: handleDrop,
297
+ style: {
298
+ cursor: disabled ? "not-allowed" : "pointer",
299
+ opacity: disabled ? 0.6 : 1,
300
+ borderRadius: 16,
301
+ padding: "40px 24px",
302
+ textAlign: "center",
303
+ border: "2px solid transparent",
304
+ background: isDragging ? DRAG_GRADIENT_BORDER : neutralColors[50],
305
+ borderStyle: isDragging ? "solid" : "dashed",
306
+ borderColor: isDragging ? "transparent" : neutralColors[300],
307
+ boxShadow: isDragging ? `0 0 0 4px ${brandColors.indigo}1f` : "none",
308
+ transition: "box-shadow 0.2s ease, border-color 0.2s ease"
309
+ },
310
+ children: [
311
+ /* @__PURE__ */ jsxs(Stack, { gap: "sm", align: "center", children: [
312
+ /* @__PURE__ */ jsx(
313
+ ThemeIcon,
314
+ {
315
+ size: 56,
316
+ radius: "xl",
317
+ variant: "light",
318
+ color: colors.primary,
319
+ className: `file-dropzone-icon-wrap${isDragging ? " file-dropzone-icon--dragging" : showUploadingChrome ? " file-dropzone-icon--uploading" : ""}`,
320
+ "data-dragging": isDragging || void 0,
321
+ "data-uploading": showUploadingChrome || void 0,
322
+ children: showUploadingChrome ? /* @__PURE__ */ jsx(Loader, { size: "sm", color: colors.primary, "aria-hidden": true }) : resolvedUploadIcon
323
+ }
324
+ ),
325
+ /* @__PURE__ */ jsxs(Stack, { gap: "xs", align: "center", className: "file-dropzone-copy", w: "100%", children: [
326
+ /* @__PURE__ */ jsx(Text, { fw: 600, c: neutralColors[900], className: "file-dropzone-title", ta: "center", children: title }),
327
+ showUploadingChrome && /* @__PURE__ */ jsx(DropzoneUploadingLabel, { label: uploadingLabel }),
328
+ supportedTypes.length > 0 && /* @__PURE__ */ jsx(
329
+ Group,
330
+ {
331
+ gap: 6,
332
+ justify: "center",
333
+ wrap: "wrap",
334
+ w: "100%",
335
+ className: "file-dropzone-chips",
336
+ children: supportedTypes.map((type) => /* @__PURE__ */ jsx(
337
+ Text,
338
+ {
339
+ component: "span",
340
+ size: "xs",
341
+ fw: 500,
342
+ c: neutralColors[600],
343
+ px: 8,
344
+ py: 2,
345
+ style: {
346
+ background: neutralColors[100],
347
+ borderRadius: 999,
348
+ whiteSpace: "nowrap"
349
+ },
350
+ children: type
351
+ },
352
+ type
353
+ ))
354
+ }
355
+ ),
356
+ /* @__PURE__ */ jsx(Text, { size: "xs", c: neutralColors[500], ta: "center", className: "file-dropzone-helper", children: resolvedHelperCopy })
357
+ ] }),
358
+ /* @__PURE__ */ jsx(
359
+ Button,
360
+ {
361
+ variant: "light",
362
+ radius: "md",
363
+ disabled,
364
+ className: "file-dropzone-browse",
365
+ mih: 44,
366
+ leftSection: resolvedBrowseIcon,
367
+ onClick: (event) => {
368
+ event.stopPropagation();
369
+ openPicker();
370
+ },
371
+ children: browseLabel
372
+ }
373
+ )
374
+ ] }),
375
+ fileInput
376
+ ]
377
+ }
378
+ ),
379
+ fileRejections.length > 0 && /* @__PURE__ */ jsx(
380
+ Banner,
381
+ {
382
+ tone: "error",
383
+ icon: null,
384
+ title: "Some files weren't added",
385
+ description: /* @__PURE__ */ jsx(Stack, { gap: 2, children: fileRejections.map((rejection) => /* @__PURE__ */ jsx(Text, { ...rejectionTextProps, children: rejection.error }, `${rejection.name}:${rejection.error}`)) })
386
+ }
387
+ ),
388
+ errorMessage && /* @__PURE__ */ jsx(Text, { ...errorTextProps, role: "alert", children: errorMessage })
389
+ ] });
390
+ }
391
+ export {
392
+ FILE_DROPZONE_DEFAULT_MAX_FILES,
393
+ FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,
394
+ FileDropzone
395
+ };
396
+ //# sourceMappingURL=FileDropzone.js.map
@@ -0,0 +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 { brandColors, neutralColors } 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: colors.error,\n style: { lineHeight: 1.4 },\n};\n\nconst rejectionTextProps = {\n size: \"sm\" as const,\n c: neutralColors[500],\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(${neutralColors[50]}, ${neutralColors[50]}) padding-box, linear-gradient(135deg, ${brandColors.indigo}, ${brandColors.purple}) 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, ${brandColors.indigo}, ${brandColors.purple}, ${brandColors.indigo});\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: ${neutralColors[600]};\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 ? neutralColors[500] : neutralColors[300]}`,\n background: isDragging ? neutralColors[100] : neutralColors[50],\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={neutralColors[600]} style={{ display: \"flex\" }} aria-hidden>\n {resolvedCompactAddIcon}\n </Box>\n <Text size=\"sm\" fw={500} c={neutralColors[800]}>\n {compactAddLabel}\n </Text>\n </Group>\n <Text\n size=\"sm\"\n c={neutralColors[600]}\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 : neutralColors[50],\n borderStyle: isDragging ? \"solid\" : \"dashed\",\n borderColor: isDragging ? \"transparent\" : neutralColors[300],\n boxShadow: isDragging ? `0 0 0 4px ${brandColors.indigo}1f` : \"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 fw={600} c={neutralColors[900]} className=\"file-dropzone-title\" ta=\"center\">\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={neutralColors[600]}\n px={8}\n py={2}\n style={{\n background: neutralColors[100],\n borderRadius: 999,\n whiteSpace: \"nowrap\",\n }}\n >\n {type}\n </Text>\n ))}\n </Group>\n )}\n <Text size=\"xs\" c={neutralColors[500]} ta=\"center\" className=\"file-dropzone-helper\">\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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"}
@@ -16,6 +16,7 @@ const PhoneField = require("./components/form/PhoneField.cjs");
16
16
  const USStateField = require("./components/form/USStateField/USStateField.cjs");
17
17
  const ZipField = require("./components/form/ZipField/ZipField.cjs");
18
18
  const AnimateIn = require("./components/generic/AnimateIn/AnimateIn.cjs");
19
+ const Banner = require("./components/generic/Banner/Banner.cjs");
19
20
  const ClickableCard = require("./components/generic/ClickableCard/ClickableCard.cjs");
20
21
  const ColorDot = require("./components/generic/ColorDot/ColorDot.cjs");
21
22
  const CompanyBanner = require("./components/generic/CompanyBanner/CompanyBanner.cjs");
@@ -26,10 +27,12 @@ const DataRow = require("./components/generic/DataRow/DataRow.cjs");
26
27
  const DataTable = require("./components/generic/DataTable/DataTable.cjs");
27
28
  const DateDisplay = require("./components/generic/DateDisplay/DateDisplay.cjs");
28
29
  const DetailDrawer = require("./components/generic/DetailDrawer/DetailDrawer.cjs");
30
+ const DocumentRow$1 = require("./components/generic/DocumentRow/DocumentRow.cjs");
29
31
  const EditableSection = require("./components/generic/EditableSection/EditableSection.cjs");
30
32
  const EmptyState = require("./components/generic/EmptyState/EmptyState.cjs");
31
33
  const ErrorPage = require("./components/generic/ErrorPage/ErrorPage.cjs");
32
34
  const Eyebrow = require("./components/generic/Eyebrow/Eyebrow.cjs");
35
+ const FileDropzone = require("./components/generic/FileDropzone/FileDropzone.cjs");
33
36
  const ListRow = require("./components/generic/ListRow/ListRow.cjs");
34
37
  const MultiSelectSearch = require("./components/generic/MultiSelectSearch/MultiSelectSearch.cjs");
35
38
  const Percent = require("./components/generic/Percent/Percent.cjs");
@@ -159,6 +162,7 @@ exports.ZipField = ZipField.ZipField;
159
162
  exports.createZipSchema = ZipField.createZipSchema;
160
163
  exports.zipSchema = ZipField.zipSchema;
161
164
  exports.AnimateIn = AnimateIn.AnimateIn;
165
+ exports.Banner = Banner.Banner;
162
166
  exports.ClickableCard = ClickableCard.ClickableCard;
163
167
  exports.ColorDot = ColorDot.ColorDot;
164
168
  exports.CompanyBanner = CompanyBanner.CompanyBanner;
@@ -171,10 +175,14 @@ exports.StackedValue = DataRow.StackedValue;
171
175
  exports.DataTable = DataTable.DataTable;
172
176
  exports.DateDisplay = DateDisplay.DateDisplay;
173
177
  exports.DetailDrawer = DetailDrawer.DetailDrawer;
178
+ exports.DocumentStatusRow = DocumentRow$1.DocumentStatusRow;
174
179
  exports.EditableSection = EditableSection.EditableSection;
175
180
  exports.EmptyState = EmptyState.EmptyState;
176
181
  exports.ErrorPage = ErrorPage.ErrorPage;
177
182
  exports.Eyebrow = Eyebrow.Eyebrow;
183
+ exports.FILE_DROPZONE_DEFAULT_MAX_FILES = FileDropzone.FILE_DROPZONE_DEFAULT_MAX_FILES;
184
+ exports.FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = FileDropzone.FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES;
185
+ exports.FileDropzone = FileDropzone.FileDropzone;
178
186
  exports.ListRow = ListRow.ListRow;
179
187
  exports.MultiSelectSearch = MultiSelectSearch.MultiSelectSearch;
180
188
  exports.Percent = Percent.Percent;
@@ -431,6 +439,7 @@ exports.Tabs = Tabs.Tabs;
431
439
  exports.Textarea = Textarea.Textarea;
432
440
  exports.TextInput = TextInput.TextInput;
433
441
  exports.Tooltip = Tooltip.Tooltip;
442
+ exports.DocumentListRow = DocumentRow.DocumentRow;
434
443
  exports.DocumentRow = DocumentRow.DocumentRow;
435
444
  exports.EquityGrantCard = EquityGrantCard.EquityGrantCard;
436
445
  exports.InvestmentCard = InvestmentCard.InvestmentCard;
@@ -1 +1 @@
1
- {"version":3,"file":"fairmint-ui.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"fairmint-ui.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -14,6 +14,7 @@ import { PhoneField, formatPhone, formatPhoneDisplay, normalizePhone, phoneSchem
14
14
  import { USStateField, US_STATES } from "./components/form/USStateField/USStateField.js";
15
15
  import { ZipField, createZipSchema, zipSchema } from "./components/form/ZipField/ZipField.js";
16
16
  import { AnimateIn } from "./components/generic/AnimateIn/AnimateIn.js";
17
+ import { Banner } from "./components/generic/Banner/Banner.js";
17
18
  import { ClickableCard } from "./components/generic/ClickableCard/ClickableCard.js";
18
19
  import { ColorDot } from "./components/generic/ColorDot/ColorDot.js";
19
20
  import { CompanyBanner } from "./components/generic/CompanyBanner/CompanyBanner.js";
@@ -24,10 +25,12 @@ import { DataRow, RedactedValue, StackedValue } from "./components/generic/DataR
24
25
  import { DataTable } from "./components/generic/DataTable/DataTable.js";
25
26
  import { DateDisplay } from "./components/generic/DateDisplay/DateDisplay.js";
26
27
  import { DetailDrawer } from "./components/generic/DetailDrawer/DetailDrawer.js";
28
+ import { DocumentStatusRow } from "./components/generic/DocumentRow/DocumentRow.js";
27
29
  import { EditableSection } from "./components/generic/EditableSection/EditableSection.js";
28
30
  import { EmptyState } from "./components/generic/EmptyState/EmptyState.js";
29
31
  import { ErrorPage } from "./components/generic/ErrorPage/ErrorPage.js";
30
32
  import { Eyebrow } from "./components/generic/Eyebrow/Eyebrow.js";
33
+ import { FILE_DROPZONE_DEFAULT_MAX_FILES, FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES, FileDropzone } from "./components/generic/FileDropzone/FileDropzone.js";
31
34
  import { ListRow } from "./components/generic/ListRow/ListRow.js";
32
35
  import { MultiSelectSearch } from "./components/generic/MultiSelectSearch/MultiSelectSearch.js";
33
36
  import { Percent } from "./components/generic/Percent/Percent.js";
@@ -72,7 +75,7 @@ import { Tab, Tabs } from "./components/primitives/Tabs/Tabs.js";
72
75
  import { Textarea } from "./components/primitives/Textarea/Textarea.js";
73
76
  import { TextInput } from "./components/primitives/TextInput/TextInput.js";
74
77
  import { Tooltip } from "./components/primitives/Tooltip/Tooltip.js";
75
- import { DocumentRow } from "./components/specific/DocumentRow/DocumentRow.js";
78
+ import { DocumentRow, DocumentRow as DocumentRow2 } from "./components/specific/DocumentRow/DocumentRow.js";
76
79
  import { EquityGrantCard } from "./components/specific/EquityGrantCard/EquityGrantCard.js";
77
80
  import { InvestmentCard } from "./components/specific/InvestmentCard/InvestmentCard.js";
78
81
  import { InvestorProfileCard } from "./components/specific/InvestorProfileCard/InvestorProfileCard.js";
@@ -167,6 +170,7 @@ export {
167
170
  Badge,
168
171
  BankIcon,
169
172
  BankNoteIcon,
173
+ Banner,
170
174
  BarChartIcon,
171
175
  BarChartOutlinedIcon,
172
176
  BellIcon,
@@ -237,7 +241,9 @@ export {
237
241
  DialogContent,
238
242
  DialogTitle,
239
243
  Divider,
240
- DocumentRow,
244
+ DocumentRow as DocumentListRow,
245
+ DocumentRow2 as DocumentRow,
246
+ DocumentStatusRow,
241
247
  DownloadIcon,
242
248
  DrawOutlinedIcon,
243
249
  Drawer,
@@ -259,6 +265,8 @@ export {
259
265
  ExpandLessIcon,
260
266
  ExpandMoreIcon,
261
267
  Eyebrow,
268
+ FILE_DROPZONE_DEFAULT_MAX_FILES,
269
+ FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES,
262
270
  FacebookLogo,
263
271
  FairmintBrandLogo,
264
272
  FairmintLogo,
@@ -266,6 +274,7 @@ export {
266
274
  FairmintProvider,
267
275
  FairmintRibbonMark,
268
276
  FileDownloadOutlinedIcon,
277
+ FileDropzone,
269
278
  FileIcon,
270
279
  FilterListIcon,
271
280
  Flex,
@@ -1 +1 @@
1
- {"version":3,"file":"fairmint-ui.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"fairmint-ui.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -32,6 +32,8 @@ export type { ZipFieldProps, ZipSchemaOptions } from './components/form/ZipField
32
32
  export { createZipSchema, ZipField, zipSchema } from './components/form/ZipField/ZipField';
33
33
  export type { AnimateInDirection, AnimateInProps } from './components/generic/AnimateIn/AnimateIn';
34
34
  export { AnimateIn } from './components/generic/AnimateIn/AnimateIn';
35
+ export type { BannerActionProps, BannerPresentation, BannerProps, BannerTone, } from './components/generic/Banner/Banner';
36
+ export { Banner } from './components/generic/Banner/Banner';
35
37
  export type { ClickableCardProps } from './components/generic/ClickableCard/ClickableCard';
36
38
  export { ClickableCard } from './components/generic/ClickableCard/ClickableCard';
37
39
  export type { ColorDotProps } from './components/generic/ColorDot/ColorDot';
@@ -52,6 +54,8 @@ export type { DateDisplayProps } from './components/generic/DateDisplay/DateDisp
52
54
  export { DateDisplay } from './components/generic/DateDisplay/DateDisplay';
53
55
  export type { DetailDrawerProps } from './components/generic/DetailDrawer/DetailDrawer';
54
56
  export { DetailDrawer } from './components/generic/DetailDrawer/DetailDrawer';
57
+ export type { DocumentStatusRowProps, DocumentStatusRowStatus, } from './components/generic/DocumentRow/DocumentRow';
58
+ export { DocumentStatusRow } from './components/generic/DocumentRow/DocumentRow';
55
59
  export type { EditableSectionProps } from './components/generic/EditableSection/EditableSection';
56
60
  export { EditableSection } from './components/generic/EditableSection/EditableSection';
57
61
  export type { EmptyStateProps } from './components/generic/EmptyState/EmptyState';
@@ -60,6 +64,8 @@ export type { ErrorPageCode, ErrorPageProps } from './components/generic/ErrorPa
60
64
  export { ErrorPage } from './components/generic/ErrorPage/ErrorPage';
61
65
  export type { EyebrowProps } from './components/generic/Eyebrow/Eyebrow';
62
66
  export { Eyebrow } from './components/generic/Eyebrow/Eyebrow';
67
+ export type { FileDropzoneProps, FileDropzoneRejection, } from './components/generic/FileDropzone/FileDropzone';
68
+ export { FILE_DROPZONE_DEFAULT_MAX_FILES, FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES, FileDropzone, } from './components/generic/FileDropzone/FileDropzone';
63
69
  export type { ListRowProps } from './components/generic/ListRow/ListRow';
64
70
  export { ListRow } from './components/generic/ListRow/ListRow';
65
71
  export type { MultiSelectSearchData, MultiSelectSearchOption, MultiSelectSearchOptionGroup, MultiSelectSearchProps, } from './components/generic/MultiSelectSearch/MultiSelectSearch';
@@ -122,8 +128,8 @@ export { Tab, Tabs } from './components/primitives/Tabs/Tabs';
122
128
  export { Textarea, type TextareaProps } from './components/primitives/Textarea/Textarea';
123
129
  export { TextInput } from './components/primitives/TextInput/TextInput';
124
130
  export { Tooltip } from './components/primitives/Tooltip/Tooltip';
125
- export type { DocumentRowProps } from './components/specific/DocumentRow/DocumentRow';
126
- export { DocumentRow } from './components/specific/DocumentRow/DocumentRow';
131
+ export type { DocumentRowProps, DocumentRowProps as DocumentListRowProps, } from './components/specific/DocumentRow/DocumentRow';
132
+ export { DocumentRow, DocumentRow as DocumentListRow, } from './components/specific/DocumentRow/DocumentRow';
127
133
  export type { EquityGrantCardProps } from './components/specific/EquityGrantCard/EquityGrantCard';
128
134
  export { EquityGrantCard } from './components/specific/EquityGrantCard/EquityGrantCard';
129
135
  export type { EquityRibbonChartProps, FairmintRibbonMarkProps, RibbonBackground, RibbonGradientStop, RibbonLayout, } from './components/specific/EquityRibbonChart';