@fairmint/ui 0.3.10 → 0.3.12

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 (133) hide show
  1. package/dist/_virtual/index3.cjs +3 -5
  2. package/dist/_virtual/index3.cjs.map +1 -1
  3. package/dist/_virtual/index3.js +2 -5
  4. package/dist/_virtual/index3.js.map +1 -1
  5. package/dist/_virtual/index4.cjs +5 -3
  6. package/dist/_virtual/index4.cjs.map +1 -1
  7. package/dist/_virtual/index4.js +5 -2
  8. package/dist/_virtual/index4.js.map +1 -1
  9. package/dist/components/FairmintProvider/FairmintProvider.cjs +1 -1
  10. package/dist/components/FairmintProvider/FairmintProvider.cjs.map +1 -1
  11. package/dist/components/FairmintProvider/FairmintProvider.d.ts.map +1 -1
  12. package/dist/components/FairmintProvider/FairmintProvider.js +1 -1
  13. package/dist/components/FairmintProvider/FairmintProvider.js.map +1 -1
  14. package/dist/components/LoadingOverlay/LoadingOverlay.cjs +1 -1
  15. package/dist/components/LoadingOverlay/LoadingOverlay.cjs.map +1 -1
  16. package/dist/components/LoadingOverlay/LoadingOverlay.d.ts.map +1 -1
  17. package/dist/components/LoadingOverlay/LoadingOverlay.js +2 -2
  18. package/dist/components/LoadingOverlay/LoadingOverlay.js.map +1 -1
  19. package/dist/components/LoadingSpinner/LoadingSpinner.cjs +2 -2
  20. package/dist/components/LoadingSpinner/LoadingSpinner.cjs.map +1 -1
  21. package/dist/components/LoadingSpinner/LoadingSpinner.js +3 -3
  22. package/dist/components/LoadingSpinner/LoadingSpinner.js.map +1 -1
  23. package/dist/components/generic/Banner/Banner.cjs +46 -11
  24. package/dist/components/generic/Banner/Banner.cjs.map +1 -1
  25. package/dist/components/generic/Banner/Banner.d.ts.map +1 -1
  26. package/dist/components/generic/Banner/Banner.js +47 -12
  27. package/dist/components/generic/Banner/Banner.js.map +1 -1
  28. package/dist/components/generic/CompanyBanner/CompanyBanner.cjs +1 -1
  29. package/dist/components/generic/CompanyBanner/CompanyBanner.cjs.map +1 -1
  30. package/dist/components/generic/CompanyBanner/CompanyBanner.js +2 -2
  31. package/dist/components/generic/CompanyBanner/CompanyBanner.js.map +1 -1
  32. package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.cjs +3 -3
  33. package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.cjs.map +1 -1
  34. package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.js +4 -4
  35. package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.js.map +1 -1
  36. package/dist/components/generic/DataRow/DataRow.cjs +4 -5
  37. package/dist/components/generic/DataRow/DataRow.cjs.map +1 -1
  38. package/dist/components/generic/DataRow/DataRow.d.ts.map +1 -1
  39. package/dist/components/generic/DataRow/DataRow.js +5 -6
  40. package/dist/components/generic/DataRow/DataRow.js.map +1 -1
  41. package/dist/components/generic/DocumentRow/DocumentRow.cjs +97 -28
  42. package/dist/components/generic/DocumentRow/DocumentRow.cjs.map +1 -1
  43. package/dist/components/generic/DocumentRow/DocumentRow.d.ts.map +1 -1
  44. package/dist/components/generic/DocumentRow/DocumentRow.js +98 -29
  45. package/dist/components/generic/DocumentRow/DocumentRow.js.map +1 -1
  46. package/dist/components/generic/Eyebrow/Eyebrow.cjs +6 -1
  47. package/dist/components/generic/Eyebrow/Eyebrow.cjs.map +1 -1
  48. package/dist/components/generic/Eyebrow/Eyebrow.d.ts +2 -2
  49. package/dist/components/generic/Eyebrow/Eyebrow.d.ts.map +1 -1
  50. package/dist/components/generic/Eyebrow/Eyebrow.js +7 -2
  51. package/dist/components/generic/Eyebrow/Eyebrow.js.map +1 -1
  52. package/dist/components/generic/FileDropzone/FileDropzone.cjs +38 -20
  53. package/dist/components/generic/FileDropzone/FileDropzone.cjs.map +1 -1
  54. package/dist/components/generic/FileDropzone/FileDropzone.d.ts.map +1 -1
  55. package/dist/components/generic/FileDropzone/FileDropzone.js +39 -21
  56. package/dist/components/generic/FileDropzone/FileDropzone.js.map +1 -1
  57. package/dist/components/generic/PhotoCropModal/PhotoCropModal.cjs +1 -1
  58. package/dist/components/generic/PhotoCropModal/PhotoCropModal.cjs.map +1 -1
  59. package/dist/components/generic/PhotoCropModal/PhotoCropModal.js +2 -2
  60. package/dist/components/generic/PhotoCropModal/PhotoCropModal.js.map +1 -1
  61. package/dist/components/generic/ProcessingState/ProcessingState.cjs +11 -2
  62. package/dist/components/generic/ProcessingState/ProcessingState.cjs.map +1 -1
  63. package/dist/components/generic/ProcessingState/ProcessingState.d.ts.map +1 -1
  64. package/dist/components/generic/ProcessingState/ProcessingState.js +12 -3
  65. package/dist/components/generic/ProcessingState/ProcessingState.js.map +1 -1
  66. package/dist/components/generic/RadioCard/RadioCard.cjs +7 -7
  67. package/dist/components/generic/RadioCard/RadioCard.cjs.map +1 -1
  68. package/dist/components/generic/RadioCard/RadioCard.js +8 -8
  69. package/dist/components/generic/RadioCard/RadioCard.js.map +1 -1
  70. package/dist/components/generic/StatCard/StatCard.cjs +27 -18
  71. package/dist/components/generic/StatCard/StatCard.cjs.map +1 -1
  72. package/dist/components/generic/StatCard/StatCard.d.ts.map +1 -1
  73. package/dist/components/generic/StatCard/StatCard.js +27 -18
  74. package/dist/components/generic/StatCard/StatCard.js.map +1 -1
  75. package/dist/components/generic/StepCard/StepCard.cjs +2 -2
  76. package/dist/components/generic/StepCard/StepCard.cjs.map +1 -1
  77. package/dist/components/generic/StepCard/StepCard.d.ts.map +1 -1
  78. package/dist/components/generic/StepCard/StepCard.js +3 -3
  79. package/dist/components/generic/StepCard/StepCard.js.map +1 -1
  80. package/dist/components/generic/StepProgress/StepProgress.cjs +2 -2
  81. package/dist/components/generic/StepProgress/StepProgress.cjs.map +1 -1
  82. package/dist/components/generic/StepProgress/StepProgress.js +2 -2
  83. package/dist/components/generic/StepProgress/StepProgress.js.map +1 -1
  84. package/dist/components/layout/SideNav/SideNav.cjs +2 -2
  85. package/dist/components/layout/SideNav/SideNav.cjs.map +1 -1
  86. package/dist/components/layout/SideNav/SideNav.js +3 -3
  87. package/dist/components/layout/SideNav/SideNav.js.map +1 -1
  88. package/dist/components/primitives/Badge/Badge.cjs +11 -3
  89. package/dist/components/primitives/Badge/Badge.cjs.map +1 -1
  90. package/dist/components/primitives/Badge/Badge.d.ts.map +1 -1
  91. package/dist/components/primitives/Badge/Badge.js +12 -4
  92. package/dist/components/primitives/Badge/Badge.js.map +1 -1
  93. package/dist/components/primitives/muiCompat.cjs +41 -44
  94. package/dist/components/primitives/muiCompat.cjs.map +1 -1
  95. package/dist/components/primitives/muiCompat.d.ts +21 -21
  96. package/dist/components/primitives/muiCompat.d.ts.map +1 -1
  97. package/dist/components/primitives/muiCompat.js +42 -45
  98. package/dist/components/primitives/muiCompat.js.map +1 -1
  99. package/dist/components/primitives/sx.cjs +21 -25
  100. package/dist/components/primitives/sx.cjs.map +1 -1
  101. package/dist/components/primitives/sx.d.ts.map +1 -1
  102. package/dist/components/primitives/sx.js +22 -26
  103. package/dist/components/primitives/sx.js.map +1 -1
  104. package/dist/components/specific/DocumentRow/DocumentRow.cjs +14 -1
  105. package/dist/components/specific/DocumentRow/DocumentRow.cjs.map +1 -1
  106. package/dist/components/specific/DocumentRow/DocumentRow.d.ts.map +1 -1
  107. package/dist/components/specific/DocumentRow/DocumentRow.js +14 -1
  108. package/dist/components/specific/DocumentRow/DocumentRow.js.map +1 -1
  109. package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.cjs +2 -2
  110. package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.cjs.map +1 -1
  111. package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.js +3 -3
  112. package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.js.map +1 -1
  113. package/dist/fairmint-ui.cjs +1 -0
  114. package/dist/fairmint-ui.cjs.map +1 -1
  115. package/dist/fairmint-ui.js +2 -1
  116. package/dist/index.d.ts +1 -1
  117. package/dist/index.d.ts.map +1 -1
  118. package/dist/mui-icons.cjs +7 -7
  119. package/dist/mui-icons.cjs.map +1 -1
  120. package/dist/mui-icons.js +8 -8
  121. package/dist/mui-icons.js.map +1 -1
  122. package/dist/node_modules/@mantine/form/esm/hooks/use-form-status/use-form-status.cjs +1 -1
  123. package/dist/node_modules/@mantine/form/esm/hooks/use-form-status/use-form-status.js +1 -1
  124. package/dist/node_modules/prop-types/index.cjs +1 -1
  125. package/dist/node_modules/prop-types/index.js +1 -1
  126. package/dist/styles.css +51 -8
  127. package/dist/theme/index.cjs +329 -28
  128. package/dist/theme/index.cjs.map +1 -1
  129. package/dist/theme/index.d.ts +85 -17
  130. package/dist/theme/index.d.ts.map +1 -1
  131. package/dist/theme/index.js +329 -28
  132. package/dist/theme/index.js.map +1 -1
  133. package/package.json +1 -1
@@ -6,7 +6,7 @@ export interface EyebrowProps extends Omit<TextProps, "children" | "size" | "fw"
6
6
  /** Eyebrow size. Defaults to `xs`. */
7
7
  size?: "xs" | "sm";
8
8
  /**
9
- * Text color. Defaults to `neutralColors[500]`. Override when the
9
+ * Text color. Defaults to the semantic secondary text token. Override when the
10
10
  * eyebrow sits on a dark background or needs to match an accent.
11
11
  */
12
12
  c?: string;
@@ -16,7 +16,7 @@ export interface EyebrowProps extends Omit<TextProps, "children" | "size" | "fw"
16
16
  * headers, and as section eyebrows throughout the Fairmint apps.
17
17
  *
18
18
  * Standardizes the `Text size="xs" tt="uppercase" fw={700}
19
- * c={neutralColors[500]} style={{ letterSpacing: "0.08em" }}`
19
+ * c={fairmintVars.colorTextSecondary} style={{ letterSpacing: "0.08em" }}`
20
20
  * incantation that was scattered across screens.
21
21
  */
22
22
  export declare function Eyebrow({ children, size, c, ...rest }: EyebrowProps): import("react/jsx-runtime").JSX.Element;
@@ -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;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAW,EAAE,CAAsB,EAAE,GAAG,IAAI,EAAE,EAAE,YAAY,2CAM/F"}
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;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,IAAW,EACX,CAAmC,EACnC,GAAG,IAAI,EACR,EAAE,YAAY,2CAMd"}
@@ -1,7 +1,12 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import { neutralColors } from "../../../theme/index.js";
2
+ import { fairmintVars } from "../../../theme/index.js";
3
3
  import { Text } from "../../../node_modules/@mantine/core/esm/components/Text/Text.js";
4
- function Eyebrow({ children, size = "xs", c = neutralColors[500], ...rest }) {
4
+ function Eyebrow({
5
+ children,
6
+ size = "xs",
7
+ c = fairmintVars.colorTextSecondary,
8
+ ...rest
9
+ }) {
5
10
  return /* @__PURE__ */ jsx(Text, { size, fw: 700, tt: "uppercase", c, style: { letterSpacing: "0.08em" }, ...rest, children });
6
11
  }
7
12
  export {
@@ -1 +1 @@
1
- {"version":3,"file":"Eyebrow.js","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { neutralColors } 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 `neutralColors[500]`. Override when the\n * eyebrow sits on a dark background or needs to match an accent.\n */\n c?: string;\n}\n\n/**\n * Small uppercase letter-spaced label used above titles, in card\n * headers, and as section eyebrows throughout the Fairmint apps.\n *\n * Standardizes the `Text size=\"xs\" tt=\"uppercase\" fw={700}\n * c={neutralColors[500]} style={{ letterSpacing: \"0.08em\" }}`\n * incantation that was scattered across screens.\n */\nexport function Eyebrow({ children, size = \"xs\", c = neutralColors[500], ...rest }: EyebrowProps) {\n return (\n <Text size={size} fw={700} tt=\"uppercase\" c={c} style={{ letterSpacing: \"0.08em\" }} {...rest}>\n {children}\n </Text>\n );\n}\n"],"names":[],"mappings":";;;AAwBO,SAAS,QAAQ,EAAE,UAAU,OAAO,MAAM,IAAI,cAAc,GAAG,GAAG,GAAG,QAAsB;AAChG,SACE,oBAAC,MAAA,EAAK,MAAY,IAAI,KAAK,IAAG,aAAY,GAAM,OAAO,EAAE,eAAe,SAAA,GAAa,GAAG,MACrF,UACH;AAEJ;"}
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 * Small uppercase letter-spaced label used above titles, in card\n * headers, and as section eyebrows throughout the Fairmint apps.\n *\n * Standardizes the `Text size=\"xs\" tt=\"uppercase\" fw={700}\n * c={fairmintVars.colorTextSecondary} style={{ letterSpacing: \"0.08em\" }}`\n * incantation that was scattered across screens.\n */\nexport function Eyebrow({\n children,\n size = \"xs\",\n c = fairmintVars.colorTextSecondary,\n ...rest\n}: EyebrowProps) {\n return (\n <Text size={size} fw={700} tt=\"uppercase\" c={c} style={{ letterSpacing: \"0.08em\" }} {...rest}>\n {children}\n </Text>\n );\n}\n"],"names":[],"mappings":";;;AAwBO,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;"}
@@ -13,12 +13,12 @@ const Text = require("../../../node_modules/@mantine/core/esm/components/Text/Te
13
13
  const ThemeIcon = require("../../../node_modules/@mantine/core/esm/components/ThemeIcon/ThemeIcon.cjs");
14
14
  const errorTextProps = {
15
15
  size: "xs",
16
- c: colors.colors.error,
16
+ c: index.fairmintVars.colorErrorText,
17
17
  style: { lineHeight: 1.4 }
18
18
  };
19
19
  const rejectionTextProps = {
20
20
  size: "sm",
21
- c: index.neutralColors[500],
21
+ c: index.fairmintVars.colorTextSecondary,
22
22
  style: { lineHeight: 1.4 }
23
23
  };
24
24
  const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [
@@ -29,7 +29,7 @@ const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [
29
29
  "Other agreement"
30
30
  ];
31
31
  const FILE_DROPZONE_DEFAULT_MAX_FILES = 50;
32
- const DRAG_GRADIENT_BORDER = `linear-gradient(${index.neutralColors[50]}, ${index.neutralColors[50]}) padding-box, linear-gradient(135deg, ${index.brandColors.indigo}, ${index.brandColors.purple}) border-box`;
32
+ const DRAG_GRADIENT_BORDER = `linear-gradient(${index.fairmintVars.colorBgSurfaceSecondary}, ${index.fairmintVars.colorBgSurfaceSecondary}) padding-box, linear-gradient(135deg, ${index.fairmintVars.colorBrandPrimary}, ${index.fairmintVars.colorBrandPurple}) border-box`;
33
33
  function DefaultUploadIcon() {
34
34
  return /* @__PURE__ */ jsxRuntime.jsxs(
35
35
  "svg",
@@ -108,19 +108,19 @@ function DropzoneStatusStyles() {
108
108
  return /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
109
109
  .file-dropzone-status--active {
110
110
  display: inline-block;
111
- background-image: linear-gradient(90deg, ${index.brandColors.indigo}, ${index.brandColors.purple}, ${index.brandColors.indigo});
111
+ background-image: linear-gradient(90deg, ${index.fairmintVars.colorBrandPrimary}, ${index.fairmintVars.colorBrandPurple}, ${index.fairmintVars.colorBrandPrimary});
112
112
  background-size: 200% auto;
113
113
  -webkit-background-clip: text;
114
114
  background-clip: text;
115
- color: transparent;
116
- font-weight: 500;
117
- animation: gradientFlow 2.2s linear infinite;
115
+ color: transparent;
116
+ font-weight: 500;
117
+ animation: gradientFlow 2.2s linear infinite;
118
118
  }
119
119
  @media (prefers-reduced-motion: reduce) {
120
120
  .file-dropzone-status--active {
121
121
  animation: none;
122
122
  background-image: none;
123
- color: ${index.neutralColors[600]};
123
+ color: ${index.fairmintVars.colorTextSecondary};
124
124
  }
125
125
  }
126
126
  ` });
@@ -247,8 +247,8 @@ function FileDropzone({
247
247
  cursor: disabled ? "not-allowed" : "pointer",
248
248
  borderRadius: 12,
249
249
  padding: "10px 16px",
250
- border: `1px dashed ${isDragging ? index.neutralColors[500] : index.neutralColors[300]}`,
251
- background: isDragging ? index.neutralColors[100] : index.neutralColors[50],
250
+ border: `1px dashed ${isDragging ? index.fairmintVars.colorBorderFocus : index.fairmintVars.colorBorderDefault}`,
251
+ background: isDragging ? index.fairmintVars.colorBgHover : index.fairmintVars.colorBgSurfaceSecondary,
252
252
  transition: "background 0.15s ease, border-color 0.15s ease",
253
253
  opacity: disabled ? 0.6 : 1
254
254
  },
@@ -263,14 +263,14 @@ function FileDropzone({
263
263
  align: "flex-start",
264
264
  children: [
265
265
  /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: 6, wrap: "nowrap", className: "file-dropzone-compact-leading", miw: 0, children: [
266
- /* @__PURE__ */ jsxRuntime.jsx(layout.Box, { c: index.neutralColors[600], style: { display: "flex" }, "aria-hidden": true, children: resolvedCompactAddIcon }),
267
- /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "sm", fw: 500, c: index.neutralColors[800], children: compactAddLabel })
266
+ /* @__PURE__ */ jsxRuntime.jsx(layout.Box, { c: index.fairmintVars.colorIconSecondary, style: { display: "flex" }, "aria-hidden": true, children: resolvedCompactAddIcon }),
267
+ /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "sm", fw: 500, c: index.fairmintVars.colorTextPrimary, children: compactAddLabel })
268
268
  ] }),
269
269
  /* @__PURE__ */ jsxRuntime.jsx(
270
270
  Text.Text,
271
271
  {
272
272
  size: "sm",
273
- c: index.neutralColors[600],
273
+ c: index.fairmintVars.colorTextSecondary,
274
274
  className: "file-dropzone-compact-progress",
275
275
  style: { fontVariantNumeric: "tabular-nums" },
276
276
  children: resolvedCompactProgress
@@ -303,10 +303,10 @@ function FileDropzone({
303
303
  padding: "40px 24px",
304
304
  textAlign: "center",
305
305
  border: "2px solid transparent",
306
- background: isDragging ? DRAG_GRADIENT_BORDER : index.neutralColors[50],
306
+ background: isDragging ? DRAG_GRADIENT_BORDER : index.fairmintVars.colorBgSurfaceSecondary,
307
307
  borderStyle: isDragging ? "solid" : "dashed",
308
- borderColor: isDragging ? "transparent" : index.neutralColors[300],
309
- boxShadow: isDragging ? `0 0 0 4px ${index.brandColors.indigo}1f` : "none",
308
+ borderColor: isDragging ? "transparent" : index.fairmintVars.colorBorderDefault,
309
+ boxShadow: isDragging ? `0 0 0 4px color-mix(in srgb, ${index.fairmintVars.colorBrandPrimary} 12%, transparent)` : "none",
310
310
  transition: "box-shadow 0.2s ease, border-color 0.2s ease"
311
311
  },
312
312
  children: [
@@ -325,7 +325,16 @@ function FileDropzone({
325
325
  }
326
326
  ),
327
327
  /* @__PURE__ */ jsxRuntime.jsxs(layout.Stack, { gap: "xs", align: "center", className: "file-dropzone-copy", w: "100%", children: [
328
- /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { fw: 600, c: index.neutralColors[900], className: "file-dropzone-title", ta: "center", children: title }),
328
+ /* @__PURE__ */ jsxRuntime.jsx(
329
+ Text.Text,
330
+ {
331
+ fw: 600,
332
+ c: index.fairmintVars.colorTextPrimary,
333
+ className: "file-dropzone-title",
334
+ ta: "center",
335
+ children: title
336
+ }
337
+ ),
329
338
  showUploadingChrome && /* @__PURE__ */ jsxRuntime.jsx(DropzoneUploadingLabel, { label: uploadingLabel }),
330
339
  supportedTypes.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
331
340
  Group.Group,
@@ -341,11 +350,11 @@ function FileDropzone({
341
350
  component: "span",
342
351
  size: "xs",
343
352
  fw: 500,
344
- c: index.neutralColors[600],
353
+ c: index.fairmintVars.colorTextSecondary,
345
354
  px: 8,
346
355
  py: 2,
347
356
  style: {
348
- background: index.neutralColors[100],
357
+ background: index.fairmintVars.colorBgSurface,
349
358
  borderRadius: 999,
350
359
  whiteSpace: "nowrap"
351
360
  },
@@ -355,7 +364,16 @@ function FileDropzone({
355
364
  ))
356
365
  }
357
366
  ),
358
- /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size: "xs", c: index.neutralColors[500], ta: "center", className: "file-dropzone-helper", children: resolvedHelperCopy })
367
+ /* @__PURE__ */ jsxRuntime.jsx(
368
+ Text.Text,
369
+ {
370
+ size: "xs",
371
+ c: index.fairmintVars.colorTextSecondary,
372
+ ta: "center",
373
+ className: "file-dropzone-helper",
374
+ children: resolvedHelperCopy
375
+ }
376
+ )
359
377
  ] }),
360
378
  /* @__PURE__ */ jsxRuntime.jsx(
361
379
  Button.Button,
@@ -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 { 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":["colors","neutralColors","brandColors","jsxs","jsx","Fragment","Text","useRef","useState","Stack","Box","Group","ThemeIcon","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 { 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 +1 @@
1
- {"version":3,"file":"FileDropzone.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAoB,MAAM,OAAO,CAAC;AAoB7F,8EAA8E;AAC9E,eAAO,MAAM,qCAAqC,iGAMxC,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACzC,mFAAmF;IACnF,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACzC;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,qCAAqC;IACrC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,yCAAyC;IACzC,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAyGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,EAC3B,eAAe,EACf,OAAmB,EACnB,YAAY,EACZ,cAAmB,EACnB,SAAiB,EACjB,cAA6B,EAC7B,QAAgB,EAChB,QAAQ,EACR,KAAwC,EACxC,UAAU,EACV,cAAsD,EACtD,WAAsB,EACtB,QAA0C,EAC1C,gBAA8B,EAC9B,MAA+B,EAC/B,SAAa,EACb,aAAiB,EACjB,mBAAmB,EACnB,eAAiC,EACjC,UAAU,EACV,UAAU,EACV,cAAc,GACf,EAAE,iBAAiB,2CAyRnB"}
1
+ {"version":3,"file":"FileDropzone.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/FileDropzone/FileDropzone.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,SAAS,EAAoB,MAAM,OAAO,CAAC;AAoB7F,8EAA8E;AAC9E,eAAO,MAAM,qCAAqC,iGAMxC,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,+BAA+B,KAAK,CAAC;AAElD,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,eAAe,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACzC,mFAAmF;IACnF,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,CAAC;IAChC,uEAAuE;IACvE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACzC;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gGAAgG;IAChG,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,mEAAmE;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,qCAAqC;IACrC,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,yCAAyC;IACzC,cAAc,CAAC,EAAE,SAAS,CAAC;CAC5B;AAyGD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,EAC3B,eAAe,EACf,OAAmB,EACnB,YAAY,EACZ,cAAmB,EACnB,SAAiB,EACjB,cAA6B,EAC7B,QAAgB,EAChB,QAAQ,EACR,KAAwC,EACxC,UAAU,EACV,cAAsD,EACtD,WAAsB,EACtB,QAA0C,EAC1C,gBAA8B,EAC9B,MAA+B,EAC/B,SAAa,EACb,aAAiB,EACjB,mBAAmB,EACnB,eAAiC,EACjC,UAAU,EACV,UAAU,EACV,cAAc,GACf,EAAE,iBAAiB,2CAuSnB"}
@@ -1,6 +1,6 @@
1
1
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
2
  import { useRef, useState } from "react";
3
- import { neutralColors, brandColors } from "../../../theme/index.js";
3
+ import { fairmintVars } from "../../../theme/index.js";
4
4
  import { colors } from "../../../theme/colors.js";
5
5
  import { Button } from "../../primitives/Button/Button.js";
6
6
  import { Loader } from "../../primitives/Loader/Loader.js";
@@ -11,12 +11,12 @@ import { Text } from "../../../node_modules/@mantine/core/esm/components/Text/Te
11
11
  import { ThemeIcon } from "../../../node_modules/@mantine/core/esm/components/ThemeIcon/ThemeIcon.js";
12
12
  const errorTextProps = {
13
13
  size: "xs",
14
- c: colors.error,
14
+ c: fairmintVars.colorErrorText,
15
15
  style: { lineHeight: 1.4 }
16
16
  };
17
17
  const rejectionTextProps = {
18
18
  size: "sm",
19
- c: neutralColors[500],
19
+ c: fairmintVars.colorTextSecondary,
20
20
  style: { lineHeight: 1.4 }
21
21
  };
22
22
  const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [
@@ -27,7 +27,7 @@ const FILE_DROPZONE_DEFAULT_SUPPORTED_TYPES = [
27
27
  "Other agreement"
28
28
  ];
29
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`;
30
+ const DRAG_GRADIENT_BORDER = `linear-gradient(${fairmintVars.colorBgSurfaceSecondary}, ${fairmintVars.colorBgSurfaceSecondary}) padding-box, linear-gradient(135deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}) border-box`;
31
31
  function DefaultUploadIcon() {
32
32
  return /* @__PURE__ */ jsxs(
33
33
  "svg",
@@ -106,19 +106,19 @@ function DropzoneStatusStyles() {
106
106
  return /* @__PURE__ */ jsx("style", { children: `
107
107
  .file-dropzone-status--active {
108
108
  display: inline-block;
109
- background-image: linear-gradient(90deg, ${brandColors.indigo}, ${brandColors.purple}, ${brandColors.indigo});
109
+ background-image: linear-gradient(90deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}, ${fairmintVars.colorBrandPrimary});
110
110
  background-size: 200% auto;
111
111
  -webkit-background-clip: text;
112
112
  background-clip: text;
113
- color: transparent;
114
- font-weight: 500;
115
- animation: gradientFlow 2.2s linear infinite;
113
+ color: transparent;
114
+ font-weight: 500;
115
+ animation: gradientFlow 2.2s linear infinite;
116
116
  }
117
117
  @media (prefers-reduced-motion: reduce) {
118
118
  .file-dropzone-status--active {
119
119
  animation: none;
120
120
  background-image: none;
121
- color: ${neutralColors[600]};
121
+ color: ${fairmintVars.colorTextSecondary};
122
122
  }
123
123
  }
124
124
  ` });
@@ -245,8 +245,8 @@ function FileDropzone({
245
245
  cursor: disabled ? "not-allowed" : "pointer",
246
246
  borderRadius: 12,
247
247
  padding: "10px 16px",
248
- border: `1px dashed ${isDragging ? neutralColors[500] : neutralColors[300]}`,
249
- background: isDragging ? neutralColors[100] : neutralColors[50],
248
+ border: `1px dashed ${isDragging ? fairmintVars.colorBorderFocus : fairmintVars.colorBorderDefault}`,
249
+ background: isDragging ? fairmintVars.colorBgHover : fairmintVars.colorBgSurfaceSecondary,
250
250
  transition: "background 0.15s ease, border-color 0.15s ease",
251
251
  opacity: disabled ? 0.6 : 1
252
252
  },
@@ -261,14 +261,14 @@ function FileDropzone({
261
261
  align: "flex-start",
262
262
  children: [
263
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 })
264
+ /* @__PURE__ */ jsx(Box, { c: fairmintVars.colorIconSecondary, style: { display: "flex" }, "aria-hidden": true, children: resolvedCompactAddIcon }),
265
+ /* @__PURE__ */ jsx(Text, { size: "sm", fw: 500, c: fairmintVars.colorTextPrimary, children: compactAddLabel })
266
266
  ] }),
267
267
  /* @__PURE__ */ jsx(
268
268
  Text,
269
269
  {
270
270
  size: "sm",
271
- c: neutralColors[600],
271
+ c: fairmintVars.colorTextSecondary,
272
272
  className: "file-dropzone-compact-progress",
273
273
  style: { fontVariantNumeric: "tabular-nums" },
274
274
  children: resolvedCompactProgress
@@ -301,10 +301,10 @@ function FileDropzone({
301
301
  padding: "40px 24px",
302
302
  textAlign: "center",
303
303
  border: "2px solid transparent",
304
- background: isDragging ? DRAG_GRADIENT_BORDER : neutralColors[50],
304
+ background: isDragging ? DRAG_GRADIENT_BORDER : fairmintVars.colorBgSurfaceSecondary,
305
305
  borderStyle: isDragging ? "solid" : "dashed",
306
- borderColor: isDragging ? "transparent" : neutralColors[300],
307
- boxShadow: isDragging ? `0 0 0 4px ${brandColors.indigo}1f` : "none",
306
+ borderColor: isDragging ? "transparent" : fairmintVars.colorBorderDefault,
307
+ boxShadow: isDragging ? `0 0 0 4px color-mix(in srgb, ${fairmintVars.colorBrandPrimary} 12%, transparent)` : "none",
308
308
  transition: "box-shadow 0.2s ease, border-color 0.2s ease"
309
309
  },
310
310
  children: [
@@ -323,7 +323,16 @@ function FileDropzone({
323
323
  }
324
324
  ),
325
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 }),
326
+ /* @__PURE__ */ jsx(
327
+ Text,
328
+ {
329
+ fw: 600,
330
+ c: fairmintVars.colorTextPrimary,
331
+ className: "file-dropzone-title",
332
+ ta: "center",
333
+ children: title
334
+ }
335
+ ),
327
336
  showUploadingChrome && /* @__PURE__ */ jsx(DropzoneUploadingLabel, { label: uploadingLabel }),
328
337
  supportedTypes.length > 0 && /* @__PURE__ */ jsx(
329
338
  Group,
@@ -339,11 +348,11 @@ function FileDropzone({
339
348
  component: "span",
340
349
  size: "xs",
341
350
  fw: 500,
342
- c: neutralColors[600],
351
+ c: fairmintVars.colorTextSecondary,
343
352
  px: 8,
344
353
  py: 2,
345
354
  style: {
346
- background: neutralColors[100],
355
+ background: fairmintVars.colorBgSurface,
347
356
  borderRadius: 999,
348
357
  whiteSpace: "nowrap"
349
358
  },
@@ -353,7 +362,16 @@ function FileDropzone({
353
362
  ))
354
363
  }
355
364
  ),
356
- /* @__PURE__ */ jsx(Text, { size: "xs", c: neutralColors[500], ta: "center", className: "file-dropzone-helper", children: resolvedHelperCopy })
365
+ /* @__PURE__ */ jsx(
366
+ Text,
367
+ {
368
+ size: "xs",
369
+ c: fairmintVars.colorTextSecondary,
370
+ ta: "center",
371
+ className: "file-dropzone-helper",
372
+ children: resolvedHelperCopy
373
+ }
374
+ )
357
375
  ] }),
358
376
  /* @__PURE__ */ jsx(
359
377
  Button,