@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.
- package/dist/_virtual/index3.cjs +3 -5
- package/dist/_virtual/index3.cjs.map +1 -1
- package/dist/_virtual/index3.js +2 -5
- package/dist/_virtual/index3.js.map +1 -1
- package/dist/_virtual/index4.cjs +5 -3
- package/dist/_virtual/index4.cjs.map +1 -1
- package/dist/_virtual/index4.js +5 -2
- package/dist/_virtual/index4.js.map +1 -1
- package/dist/components/FairmintProvider/FairmintProvider.cjs +1 -1
- package/dist/components/FairmintProvider/FairmintProvider.cjs.map +1 -1
- package/dist/components/FairmintProvider/FairmintProvider.d.ts.map +1 -1
- package/dist/components/FairmintProvider/FairmintProvider.js +1 -1
- package/dist/components/FairmintProvider/FairmintProvider.js.map +1 -1
- package/dist/components/LoadingOverlay/LoadingOverlay.cjs +1 -1
- package/dist/components/LoadingOverlay/LoadingOverlay.cjs.map +1 -1
- package/dist/components/LoadingOverlay/LoadingOverlay.d.ts.map +1 -1
- package/dist/components/LoadingOverlay/LoadingOverlay.js +2 -2
- package/dist/components/LoadingOverlay/LoadingOverlay.js.map +1 -1
- package/dist/components/LoadingSpinner/LoadingSpinner.cjs +2 -2
- package/dist/components/LoadingSpinner/LoadingSpinner.cjs.map +1 -1
- package/dist/components/LoadingSpinner/LoadingSpinner.js +3 -3
- package/dist/components/LoadingSpinner/LoadingSpinner.js.map +1 -1
- package/dist/components/generic/Banner/Banner.cjs +46 -11
- package/dist/components/generic/Banner/Banner.cjs.map +1 -1
- package/dist/components/generic/Banner/Banner.d.ts.map +1 -1
- package/dist/components/generic/Banner/Banner.js +47 -12
- package/dist/components/generic/Banner/Banner.js.map +1 -1
- package/dist/components/generic/CompanyBanner/CompanyBanner.cjs +1 -1
- package/dist/components/generic/CompanyBanner/CompanyBanner.cjs.map +1 -1
- package/dist/components/generic/CompanyBanner/CompanyBanner.js +2 -2
- package/dist/components/generic/CompanyBanner/CompanyBanner.js.map +1 -1
- package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.cjs +3 -3
- package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.cjs.map +1 -1
- package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.js +4 -4
- package/dist/components/generic/ConfidentialityBanner/ConfidentialityBanner.js.map +1 -1
- package/dist/components/generic/DataRow/DataRow.cjs +4 -5
- package/dist/components/generic/DataRow/DataRow.cjs.map +1 -1
- package/dist/components/generic/DataRow/DataRow.d.ts.map +1 -1
- package/dist/components/generic/DataRow/DataRow.js +5 -6
- package/dist/components/generic/DataRow/DataRow.js.map +1 -1
- package/dist/components/generic/DocumentRow/DocumentRow.cjs +97 -28
- package/dist/components/generic/DocumentRow/DocumentRow.cjs.map +1 -1
- package/dist/components/generic/DocumentRow/DocumentRow.d.ts.map +1 -1
- package/dist/components/generic/DocumentRow/DocumentRow.js +98 -29
- package/dist/components/generic/DocumentRow/DocumentRow.js.map +1 -1
- package/dist/components/generic/Eyebrow/Eyebrow.cjs +6 -1
- package/dist/components/generic/Eyebrow/Eyebrow.cjs.map +1 -1
- package/dist/components/generic/Eyebrow/Eyebrow.d.ts +2 -2
- package/dist/components/generic/Eyebrow/Eyebrow.d.ts.map +1 -1
- package/dist/components/generic/Eyebrow/Eyebrow.js +7 -2
- package/dist/components/generic/Eyebrow/Eyebrow.js.map +1 -1
- package/dist/components/generic/FileDropzone/FileDropzone.cjs +38 -20
- package/dist/components/generic/FileDropzone/FileDropzone.cjs.map +1 -1
- package/dist/components/generic/FileDropzone/FileDropzone.d.ts.map +1 -1
- package/dist/components/generic/FileDropzone/FileDropzone.js +39 -21
- package/dist/components/generic/FileDropzone/FileDropzone.js.map +1 -1
- package/dist/components/generic/PhotoCropModal/PhotoCropModal.cjs +1 -1
- package/dist/components/generic/PhotoCropModal/PhotoCropModal.cjs.map +1 -1
- package/dist/components/generic/PhotoCropModal/PhotoCropModal.js +2 -2
- package/dist/components/generic/PhotoCropModal/PhotoCropModal.js.map +1 -1
- package/dist/components/generic/ProcessingState/ProcessingState.cjs +11 -2
- package/dist/components/generic/ProcessingState/ProcessingState.cjs.map +1 -1
- package/dist/components/generic/ProcessingState/ProcessingState.d.ts.map +1 -1
- package/dist/components/generic/ProcessingState/ProcessingState.js +12 -3
- package/dist/components/generic/ProcessingState/ProcessingState.js.map +1 -1
- package/dist/components/generic/RadioCard/RadioCard.cjs +7 -7
- package/dist/components/generic/RadioCard/RadioCard.cjs.map +1 -1
- package/dist/components/generic/RadioCard/RadioCard.js +8 -8
- package/dist/components/generic/RadioCard/RadioCard.js.map +1 -1
- package/dist/components/generic/StatCard/StatCard.cjs +27 -18
- package/dist/components/generic/StatCard/StatCard.cjs.map +1 -1
- package/dist/components/generic/StatCard/StatCard.d.ts.map +1 -1
- package/dist/components/generic/StatCard/StatCard.js +27 -18
- package/dist/components/generic/StatCard/StatCard.js.map +1 -1
- package/dist/components/generic/StepCard/StepCard.cjs +2 -2
- package/dist/components/generic/StepCard/StepCard.cjs.map +1 -1
- package/dist/components/generic/StepCard/StepCard.d.ts.map +1 -1
- package/dist/components/generic/StepCard/StepCard.js +3 -3
- package/dist/components/generic/StepCard/StepCard.js.map +1 -1
- package/dist/components/generic/StepProgress/StepProgress.cjs +2 -2
- package/dist/components/generic/StepProgress/StepProgress.cjs.map +1 -1
- package/dist/components/generic/StepProgress/StepProgress.js +2 -2
- package/dist/components/generic/StepProgress/StepProgress.js.map +1 -1
- package/dist/components/layout/SideNav/SideNav.cjs +2 -2
- package/dist/components/layout/SideNav/SideNav.cjs.map +1 -1
- package/dist/components/layout/SideNav/SideNav.js +3 -3
- package/dist/components/layout/SideNav/SideNav.js.map +1 -1
- package/dist/components/primitives/Badge/Badge.cjs +11 -3
- package/dist/components/primitives/Badge/Badge.cjs.map +1 -1
- package/dist/components/primitives/Badge/Badge.d.ts.map +1 -1
- package/dist/components/primitives/Badge/Badge.js +12 -4
- package/dist/components/primitives/Badge/Badge.js.map +1 -1
- package/dist/components/primitives/muiCompat.cjs +41 -44
- package/dist/components/primitives/muiCompat.cjs.map +1 -1
- package/dist/components/primitives/muiCompat.d.ts +21 -21
- package/dist/components/primitives/muiCompat.d.ts.map +1 -1
- package/dist/components/primitives/muiCompat.js +42 -45
- package/dist/components/primitives/muiCompat.js.map +1 -1
- package/dist/components/primitives/sx.cjs +21 -25
- package/dist/components/primitives/sx.cjs.map +1 -1
- package/dist/components/primitives/sx.d.ts.map +1 -1
- package/dist/components/primitives/sx.js +22 -26
- package/dist/components/primitives/sx.js.map +1 -1
- package/dist/components/specific/DocumentRow/DocumentRow.cjs +14 -1
- package/dist/components/specific/DocumentRow/DocumentRow.cjs.map +1 -1
- package/dist/components/specific/DocumentRow/DocumentRow.d.ts.map +1 -1
- package/dist/components/specific/DocumentRow/DocumentRow.js +14 -1
- package/dist/components/specific/DocumentRow/DocumentRow.js.map +1 -1
- package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.cjs +2 -2
- package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.cjs.map +1 -1
- package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.js +3 -3
- package/dist/components/specific/InvestorProfileCard/InvestorProfileCard.js.map +1 -1
- package/dist/fairmint-ui.cjs +1 -0
- package/dist/fairmint-ui.cjs.map +1 -1
- package/dist/fairmint-ui.js +2 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/mui-icons.cjs +7 -7
- package/dist/mui-icons.cjs.map +1 -1
- package/dist/mui-icons.js +8 -8
- package/dist/mui-icons.js.map +1 -1
- package/dist/node_modules/@mantine/form/esm/hooks/use-form-status/use-form-status.cjs +1 -1
- package/dist/node_modules/@mantine/form/esm/hooks/use-form-status/use-form-status.js +1 -1
- package/dist/node_modules/prop-types/index.cjs +1 -1
- package/dist/node_modules/prop-types/index.js +1 -1
- package/dist/styles.css +51 -8
- package/dist/theme/index.cjs +329 -28
- package/dist/theme/index.cjs.map +1 -1
- package/dist/theme/index.d.ts +85 -17
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +329 -28
- package/dist/theme/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const index = require("../../../theme/index.cjs");
|
|
5
|
-
const colors = require("../../../theme/colors.cjs");
|
|
6
5
|
const Loader = require("../../primitives/Loader/Loader.cjs");
|
|
7
6
|
const layout = require("../../primitives/layout.cjs");
|
|
8
7
|
const Group = require("../../../node_modules/@mantine/core/esm/components/Group/Group.cjs");
|
|
@@ -87,60 +86,121 @@ function DefaultAlertIcon() {
|
|
|
87
86
|
}
|
|
88
87
|
);
|
|
89
88
|
}
|
|
90
|
-
function
|
|
89
|
+
function statusLabelColor(status, selected) {
|
|
90
|
+
if (selected) return index.fairmintVars.colorInfoText;
|
|
91
91
|
switch (status) {
|
|
92
92
|
case "complete":
|
|
93
|
-
return
|
|
93
|
+
return index.fairmintVars.colorSuccessText;
|
|
94
94
|
case "attention":
|
|
95
|
-
return
|
|
95
|
+
return index.fairmintVars.colorWarningText;
|
|
96
96
|
case "error":
|
|
97
|
-
return
|
|
97
|
+
return index.fairmintVars.colorErrorText;
|
|
98
98
|
case "uploading":
|
|
99
99
|
case "processing":
|
|
100
|
-
return
|
|
100
|
+
return index.fairmintVars.colorBrandPrimary;
|
|
101
101
|
default:
|
|
102
|
-
return
|
|
102
|
+
return index.fairmintVars.colorTextTertiary;
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
|
-
function
|
|
106
|
-
if (selected) return index.semanticColors.info;
|
|
105
|
+
function statusIconStyle(status) {
|
|
107
106
|
switch (status) {
|
|
108
107
|
case "complete":
|
|
109
|
-
return
|
|
108
|
+
return {
|
|
109
|
+
backgroundColor: index.fairmintVars.colorSuccessBg,
|
|
110
|
+
color: index.fairmintVars.colorSuccessText
|
|
111
|
+
};
|
|
110
112
|
case "attention":
|
|
111
|
-
return
|
|
113
|
+
return {
|
|
114
|
+
backgroundColor: index.fairmintVars.colorWarningBg,
|
|
115
|
+
color: index.fairmintVars.colorWarningText
|
|
116
|
+
};
|
|
112
117
|
case "error":
|
|
113
|
-
return
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
118
|
+
return {
|
|
119
|
+
backgroundColor: index.fairmintVars.colorErrorBg,
|
|
120
|
+
color: index.fairmintVars.colorErrorText
|
|
121
|
+
};
|
|
117
122
|
default:
|
|
118
|
-
return
|
|
123
|
+
return {
|
|
124
|
+
backgroundColor: index.fairmintVars.colorBgSurfaceSecondary,
|
|
125
|
+
color: index.fairmintVars.colorIconSecondary
|
|
126
|
+
};
|
|
119
127
|
}
|
|
120
128
|
}
|
|
121
129
|
function DefaultStatusIcon({ status }) {
|
|
122
130
|
if (status === "uploading" || status === "processing") {
|
|
123
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Loader.Loader, { size: 14, color:
|
|
131
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Loader.Loader, { size: 14, color: index.fairmintVars.colorBrandPrimary, "aria-hidden": true });
|
|
124
132
|
}
|
|
125
133
|
if (status === "complete") {
|
|
126
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
134
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
135
|
+
ThemeIcon.ThemeIcon,
|
|
136
|
+
{
|
|
137
|
+
size: 20,
|
|
138
|
+
radius: "xl",
|
|
139
|
+
variant: "light",
|
|
140
|
+
color: "success",
|
|
141
|
+
style: statusIconStyle(status),
|
|
142
|
+
"aria-hidden": true,
|
|
143
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(DefaultCheckIcon, {})
|
|
144
|
+
}
|
|
145
|
+
);
|
|
127
146
|
}
|
|
128
147
|
if (status === "attention") {
|
|
129
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
148
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
149
|
+
ThemeIcon.ThemeIcon,
|
|
150
|
+
{
|
|
151
|
+
size: 20,
|
|
152
|
+
radius: "xl",
|
|
153
|
+
variant: "light",
|
|
154
|
+
color: "warning",
|
|
155
|
+
style: statusIconStyle(status),
|
|
156
|
+
"aria-hidden": true,
|
|
157
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(DefaultAlertIcon, {})
|
|
158
|
+
}
|
|
159
|
+
);
|
|
130
160
|
}
|
|
131
161
|
if (status === "error") {
|
|
132
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
162
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
163
|
+
ThemeIcon.ThemeIcon,
|
|
164
|
+
{
|
|
165
|
+
size: 20,
|
|
166
|
+
radius: "xl",
|
|
167
|
+
variant: "light",
|
|
168
|
+
color: "error",
|
|
169
|
+
style: statusIconStyle(status),
|
|
170
|
+
"aria-hidden": true,
|
|
171
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(DefaultAlertIcon, {})
|
|
172
|
+
}
|
|
173
|
+
);
|
|
133
174
|
}
|
|
134
175
|
if (status === "queued") {
|
|
135
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
176
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
177
|
+
layout.Box,
|
|
178
|
+
{
|
|
179
|
+
c: index.fairmintVars.colorIconTertiary,
|
|
180
|
+
style: { display: "flex", flexShrink: 0 },
|
|
181
|
+
"aria-hidden": true,
|
|
182
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(DefaultClockIcon, {})
|
|
183
|
+
}
|
|
184
|
+
);
|
|
136
185
|
}
|
|
137
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
186
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
187
|
+
ThemeIcon.ThemeIcon,
|
|
188
|
+
{
|
|
189
|
+
size: 20,
|
|
190
|
+
radius: "md",
|
|
191
|
+
variant: "light",
|
|
192
|
+
color: "gray",
|
|
193
|
+
style: statusIconStyle(status),
|
|
194
|
+
"aria-hidden": true,
|
|
195
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(DefaultFileIcon, {})
|
|
196
|
+
}
|
|
197
|
+
);
|
|
138
198
|
}
|
|
139
199
|
function ProcessingLabelStyles() {
|
|
140
200
|
return /* @__PURE__ */ jsxRuntime.jsx("style", { children: `
|
|
141
201
|
.document-row-status--live {
|
|
142
202
|
display: inline-block;
|
|
143
|
-
background-image: linear-gradient(90deg, ${index.
|
|
203
|
+
background-image: linear-gradient(90deg, ${index.fairmintVars.colorBrandPrimary}, ${index.fairmintVars.colorBrandPurple}, ${index.fairmintVars.colorBrandPrimary});
|
|
144
204
|
background-size: 200% auto;
|
|
145
205
|
-webkit-background-clip: text;
|
|
146
206
|
background-clip: text;
|
|
@@ -152,7 +212,7 @@ function ProcessingLabelStyles() {
|
|
|
152
212
|
.document-row-status--live {
|
|
153
213
|
animation: none;
|
|
154
214
|
background-image: none;
|
|
155
|
-
color: ${index.
|
|
215
|
+
color: ${index.fairmintVars.colorTextTertiary};
|
|
156
216
|
}
|
|
157
217
|
}
|
|
158
218
|
` });
|
|
@@ -173,8 +233,8 @@ function DocumentStatusRow({
|
|
|
173
233
|
const hasActivationTarget = Boolean(onClick);
|
|
174
234
|
const isClickable = hasActivationTarget && !disabled;
|
|
175
235
|
const isLive = status === "uploading" || status === "processing";
|
|
176
|
-
const borderColor = selected ? index.
|
|
177
|
-
const background = selected ?
|
|
236
|
+
const borderColor = selected ? index.fairmintVars.colorInfoBorder : status === "error" ? `color-mix(in srgb, ${index.fairmintVars.colorErrorBorder} 55%, transparent)` : status === "attention" ? `color-mix(in srgb, ${index.fairmintVars.colorWarningBorder} 66%, transparent)` : index.fairmintVars.colorBorderDefault;
|
|
237
|
+
const background = selected ? `color-mix(in srgb, ${index.fairmintVars.colorInfoBg} 55%, transparent)` : status === "error" ? `color-mix(in srgb, ${index.fairmintVars.colorErrorBg} 20%, transparent)` : void 0;
|
|
178
238
|
const resolvedAriaLabel = ariaLabel ?? `${fileName}. ${statusLabel}`;
|
|
179
239
|
const statusAnnouncement = `${fileName}: ${statusLabel}`;
|
|
180
240
|
const hasDescription = description != null && description !== "";
|
|
@@ -191,14 +251,23 @@ function DocumentStatusRow({
|
|
|
191
251
|
{
|
|
192
252
|
size: "sm",
|
|
193
253
|
fw: 500,
|
|
194
|
-
c: index.
|
|
254
|
+
c: index.fairmintVars.colorTextPrimary,
|
|
195
255
|
lineClamp: 1,
|
|
196
256
|
title: fileName,
|
|
197
257
|
style: { minWidth: 0 },
|
|
198
258
|
children: fileName
|
|
199
259
|
}
|
|
200
260
|
),
|
|
201
|
-
hasDescription ? typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
261
|
+
hasDescription ? typeof description === "string" ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
262
|
+
Text.Text,
|
|
263
|
+
{
|
|
264
|
+
size: "xs",
|
|
265
|
+
c: index.fairmintVars.colorTextSecondary,
|
|
266
|
+
lineClamp: 2,
|
|
267
|
+
style: { minWidth: 0 },
|
|
268
|
+
children: description
|
|
269
|
+
}
|
|
270
|
+
) : description : null
|
|
202
271
|
] })
|
|
203
272
|
] });
|
|
204
273
|
const statusAndActions = /* @__PURE__ */ jsxRuntime.jsxs(Group.Group, { gap: "xs", wrap: "nowrap", style: { flexShrink: 0 }, children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentRow.cjs","sources":["../../../../src/components/generic/DocumentRow/DocumentRow.tsx"],"sourcesContent":["import type { ReactNode, SyntheticEvent } from \"react\";\nimport { brandColors, neutralColors, semanticColors } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon, UnstyledButton } from \"../../primitives/layout\";\n\n/** Visual processing vocabulary for a source document after selection. */\nexport type DocumentStatusRowStatus =\n | \"staged\"\n | \"uploading\"\n | \"queued\"\n | \"processing\"\n | \"complete\"\n | \"attention\"\n | \"error\";\n\nexport interface DocumentStatusRowProps {\n /** Source document filename. */\n fileName: string;\n /**\n * Neutral visual state. Product meaning (classified, approved, needs review)\n * belongs in `statusLabel`, not in this enum.\n */\n status: DocumentStatusRowStatus;\n /**\n * Caller-supplied status word or short phrase. Required so status is never\n * communicated by color or animation alone.\n */\n statusLabel: string;\n /** Optional secondary description or metadata beneath the filename. */\n description?: ReactNode;\n /** Leading icon override. Defaults to a status-appropriate glyph. */\n icon?: ReactNode;\n /** Open / disclosed appearance (independent of `status`). Exposed as `aria-expanded` when `onClick` is set. @default false */\n selected?: boolean;\n /** Makes the primary row activatable (mouse + keyboard). */\n onClick?: () => void;\n /**\n * Trailing actions (remove, retry, download, open). Rendered outside the\n * clickable hit target so action clicks do not also activate the row.\n */\n actions?: ReactNode;\n /** Optional detail content beneath the primary row. */\n detail?: ReactNode;\n /** Softens chrome and, with `onClick`, renders a disabled button that blocks activation. @default false */\n disabled?: boolean;\n /** Accessible name when `onClick` is set. Defaults to fileName + statusLabel. */\n ariaLabel?: string;\n}\n\nfunction DefaultFileIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\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 </svg>\n );\n}\n\nfunction DefaultCheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction DefaultClockIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n );\n}\n\nfunction DefaultAlertIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nfunction statusIconColor(status: DocumentStatusRowStatus): string {\n switch (status) {\n case \"complete\":\n return colors.success;\n case \"attention\":\n return colors.warning;\n case \"error\":\n return colors.error;\n case \"uploading\":\n case \"processing\":\n return colors.primary;\n default:\n return colors.neutral;\n }\n}\n\nfunction statusLabelColor(status: DocumentStatusRowStatus, selected: boolean): string {\n if (selected) return semanticColors.info;\n switch (status) {\n case \"complete\":\n return semanticColors.success;\n case \"attention\":\n return semanticColors.warning;\n case \"error\":\n return semanticColors.error;\n case \"uploading\":\n case \"processing\":\n return brandColors.indigo;\n default:\n return neutralColors[500];\n }\n}\n\nfunction DefaultStatusIcon({ status }: { status: DocumentStatusRowStatus }) {\n if (status === \"uploading\" || status === \"processing\") {\n return <Loader size={14} color={colors.primary} aria-hidden />;\n }\n if (status === \"complete\") {\n return (\n <ThemeIcon size={20} radius=\"xl\" variant=\"light\" color={colors.success} aria-hidden>\n <DefaultCheckIcon />\n </ThemeIcon>\n );\n }\n if (status === \"attention\") {\n return (\n <ThemeIcon size={20} radius=\"xl\" variant=\"light\" color={colors.warning} aria-hidden>\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"error\") {\n return (\n <ThemeIcon size={20} radius=\"xl\" variant=\"light\" color={colors.error} aria-hidden>\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"queued\") {\n return (\n <Box c={neutralColors[400]} style={{ display: \"flex\", flexShrink: 0 }} aria-hidden>\n <DefaultClockIcon />\n </Box>\n );\n }\n return (\n <ThemeIcon size={20} radius=\"md\" variant=\"light\" color={statusIconColor(status)} aria-hidden>\n <DefaultFileIcon />\n </ThemeIcon>\n );\n}\n\nfunction ProcessingLabelStyles() {\n return (\n <style>{`\n .document-row-status--live {\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 .document-row-status--live {\n animation: none;\n background-image: none;\n color: ${neutralColors[600]};\n }\n }\n `}</style>\n );\n}\n\n/**\n * Neutral source-document row for upload → process → settle flows.\n *\n * Owns visual state and accessibility for one uploaded file. Does not own OCR,\n * classification, extraction, approval, polling, or product retry logic — the\n * caller supplies `statusLabel`, actions, and meaning.\n *\n * Layout: a single row with minimal separation. Do not wrap lists of these in\n * an extra card/panel unless the app owns that composition (e.g. a processing\n * container pattern).\n */\nexport function DocumentStatusRow({\n fileName,\n status,\n statusLabel,\n description,\n icon,\n selected = false,\n onClick,\n actions,\n detail,\n disabled = false,\n ariaLabel,\n}: DocumentStatusRowProps) {\n const hasActivationTarget = Boolean(onClick);\n const isClickable = hasActivationTarget && !disabled;\n const isLive = status === \"uploading\" || status === \"processing\";\n const borderColor = selected\n ? semanticColors.info\n : status === \"error\"\n ? `${semanticColors.error}55`\n : status === \"attention\"\n ? `${semanticColors.warning}66`\n : neutralColors[200];\n const background = selected\n ? `${semanticColors.info}0a`\n : status === \"error\"\n ? `${semanticColors.error}08`\n : undefined;\n const resolvedAriaLabel = ariaLabel ?? `${fileName}. ${statusLabel}`;\n /** Accessible status announcement includes filename so lists of rows stay distinct. */\n const statusAnnouncement = `${fileName}: ${statusLabel}`;\n const hasDescription = description != null && description !== \"\";\n /** Single-line rows center icon/title/actions; multi-line keeps icon top-aligned with the title. */\n const rowAlign = hasDescription ? \"flex-start\" : \"center\";\n\n const activate = () => {\n if (!isClickable) return;\n onClick?.();\n };\n\n const primaryContent = (\n <Group gap=\"sm\" wrap=\"nowrap\" align={rowAlign} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Box style={{ flexShrink: 0, display: \"flex\", alignItems: \"center\" }}>\n {icon ?? <DefaultStatusIcon status={status} />}\n </Box>\n <Stack gap={2} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Text\n size=\"sm\"\n fw={500}\n c={neutralColors[900]}\n lineClamp={1}\n title={fileName}\n style={{ minWidth: 0 }}\n >\n {fileName}\n </Text>\n {hasDescription ? (\n typeof description === \"string\" ? (\n <Text size=\"xs\" c={neutralColors[500]} lineClamp={2} style={{ minWidth: 0 }}>\n {description}\n </Text>\n ) : (\n description\n )\n ) : null}\n </Stack>\n </Group>\n );\n\n const statusAndActions = (\n <Group gap=\"xs\" wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n {isLive ? (\n <>\n <Text\n size=\"xs\"\n className=\"document-row-status--live\"\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n <ProcessingLabelStyles />\n </>\n ) : (\n <Text\n size=\"xs\"\n fw={selected ? 500 : 400}\n c={statusLabelColor(status, selected)}\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n )}\n {actions}\n </Group>\n );\n\n return (\n <Box\n data-testid=\"document-row\"\n data-status={status}\n data-selected={selected || undefined}\n data-disabled={disabled || undefined}\n className=\"document-row\"\n w=\"100%\"\n miw={0}\n style={{\n borderRadius: 10,\n border: `1px solid ${borderColor}`,\n background: background ?? \"transparent\",\n opacity: disabled ? 0.6 : 1,\n transition: \"border-color 0.18s ease, background-color 0.18s ease\",\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n px=\"sm\"\n py={8}\n align={rowAlign}\n style={{ minWidth: 0 }}\n >\n {hasActivationTarget ? (\n <UnstyledButton\n onClick={activate}\n disabled={disabled}\n aria-label={resolvedAriaLabel}\n aria-expanded={selected}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n minWidth: 0,\n flex: 1,\n textAlign: \"left\",\n }}\n >\n {primaryContent}\n </UnstyledButton>\n ) : (\n primaryContent\n )}\n {statusAndActions}\n </Group>\n\n {detail != null ? (\n <Box\n px=\"sm\"\n pb=\"sm\"\n pt={0}\n onClick={(event: SyntheticEvent) => event.stopPropagation()}\n onKeyDown={(event: SyntheticEvent) => event.stopPropagation()}\n >\n {detail}\n </Box>\n ) : null}\n </Box>\n );\n}\n"],"names":["jsxs","jsx","colors","semanticColors","brandColors","neutralColors","Loader","ThemeIcon","Box","Group","Stack","Text","Fragment","UnstyledButton"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentRow.cjs","sources":["../../../../src/components/generic/DocumentRow/DocumentRow.tsx"],"sourcesContent":["import type { ReactNode, SyntheticEvent } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon, UnstyledButton } from \"../../primitives/layout\";\n\n/** Visual processing vocabulary for a source document after selection. */\nexport type DocumentStatusRowStatus =\n | \"staged\"\n | \"uploading\"\n | \"queued\"\n | \"processing\"\n | \"complete\"\n | \"attention\"\n | \"error\";\n\nexport interface DocumentStatusRowProps {\n /** Source document filename. */\n fileName: string;\n /**\n * Neutral visual state. Product meaning (classified, approved, needs review)\n * belongs in `statusLabel`, not in this enum.\n */\n status: DocumentStatusRowStatus;\n /**\n * Caller-supplied status word or short phrase. Required so status is never\n * communicated by color or animation alone.\n */\n statusLabel: string;\n /** Optional secondary description or metadata beneath the filename. */\n description?: ReactNode;\n /** Leading icon override. Defaults to a status-appropriate glyph. */\n icon?: ReactNode;\n /** Open / disclosed appearance (independent of `status`). Exposed as `aria-expanded` when `onClick` is set. @default false */\n selected?: boolean;\n /** Makes the primary row activatable (mouse + keyboard). */\n onClick?: () => void;\n /**\n * Trailing actions (remove, retry, download, open). Rendered outside the\n * clickable hit target so action clicks do not also activate the row.\n */\n actions?: ReactNode;\n /** Optional detail content beneath the primary row. */\n detail?: ReactNode;\n /** Softens chrome and, with `onClick`, renders a disabled button that blocks activation. @default false */\n disabled?: boolean;\n /** Accessible name when `onClick` is set. Defaults to fileName + statusLabel. */\n ariaLabel?: string;\n}\n\nfunction DefaultFileIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\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 </svg>\n );\n}\n\nfunction DefaultCheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction DefaultClockIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n );\n}\n\nfunction DefaultAlertIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nfunction statusLabelColor(status: DocumentStatusRowStatus, selected: boolean): string {\n if (selected) return fairmintVars.colorInfoText;\n switch (status) {\n case \"complete\":\n return fairmintVars.colorSuccessText;\n case \"attention\":\n return fairmintVars.colorWarningText;\n case \"error\":\n return fairmintVars.colorErrorText;\n case \"uploading\":\n case \"processing\":\n return fairmintVars.colorBrandPrimary;\n default:\n return fairmintVars.colorTextTertiary;\n }\n}\n\nfunction statusIconStyle(status: DocumentStatusRowStatus) {\n switch (status) {\n case \"complete\":\n return {\n backgroundColor: fairmintVars.colorSuccessBg,\n color: fairmintVars.colorSuccessText,\n };\n case \"attention\":\n return {\n backgroundColor: fairmintVars.colorWarningBg,\n color: fairmintVars.colorWarningText,\n };\n case \"error\":\n return {\n backgroundColor: fairmintVars.colorErrorBg,\n color: fairmintVars.colorErrorText,\n };\n default:\n return {\n backgroundColor: fairmintVars.colorBgSurfaceSecondary,\n color: fairmintVars.colorIconSecondary,\n };\n }\n}\n\nfunction DefaultStatusIcon({ status }: { status: DocumentStatusRowStatus }) {\n if (status === \"uploading\" || status === \"processing\") {\n return <Loader size={14} color={fairmintVars.colorBrandPrimary} aria-hidden />;\n }\n if (status === \"complete\") {\n return (\n <ThemeIcon\n size={20}\n radius=\"xl\"\n variant=\"light\"\n color=\"success\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultCheckIcon />\n </ThemeIcon>\n );\n }\n if (status === \"attention\") {\n return (\n <ThemeIcon\n size={20}\n radius=\"xl\"\n variant=\"light\"\n color=\"warning\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"error\") {\n return (\n <ThemeIcon\n size={20}\n radius=\"xl\"\n variant=\"light\"\n color=\"error\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"queued\") {\n return (\n <Box\n c={fairmintVars.colorIconTertiary}\n style={{ display: \"flex\", flexShrink: 0 }}\n aria-hidden\n >\n <DefaultClockIcon />\n </Box>\n );\n }\n return (\n <ThemeIcon\n size={20}\n radius=\"md\"\n variant=\"light\"\n color=\"gray\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultFileIcon />\n </ThemeIcon>\n );\n}\n\nfunction ProcessingLabelStyles() {\n return (\n <style>{`\n .document-row-status--live {\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 .document-row-status--live {\n animation: none;\n background-image: none;\n color: ${fairmintVars.colorTextTertiary};\n }\n }\n `}</style>\n );\n}\n\n/**\n * Neutral source-document row for upload → process → settle flows.\n *\n * Owns visual state and accessibility for one uploaded file. Does not own OCR,\n * classification, extraction, approval, polling, or product retry logic — the\n * caller supplies `statusLabel`, actions, and meaning.\n *\n * Layout: a single row with minimal separation. Do not wrap lists of these in\n * an extra card/panel unless the app owns that composition (e.g. a processing\n * container pattern).\n */\nexport function DocumentStatusRow({\n fileName,\n status,\n statusLabel,\n description,\n icon,\n selected = false,\n onClick,\n actions,\n detail,\n disabled = false,\n ariaLabel,\n}: DocumentStatusRowProps) {\n const hasActivationTarget = Boolean(onClick);\n const isClickable = hasActivationTarget && !disabled;\n const isLive = status === \"uploading\" || status === \"processing\";\n const borderColor = selected\n ? fairmintVars.colorInfoBorder\n : status === \"error\"\n ? `color-mix(in srgb, ${fairmintVars.colorErrorBorder} 55%, transparent)`\n : status === \"attention\"\n ? `color-mix(in srgb, ${fairmintVars.colorWarningBorder} 66%, transparent)`\n : fairmintVars.colorBorderDefault;\n const background = selected\n ? `color-mix(in srgb, ${fairmintVars.colorInfoBg} 55%, transparent)`\n : status === \"error\"\n ? `color-mix(in srgb, ${fairmintVars.colorErrorBg} 20%, transparent)`\n : undefined;\n const resolvedAriaLabel = ariaLabel ?? `${fileName}. ${statusLabel}`;\n /** Accessible status announcement includes filename so lists of rows stay distinct. */\n const statusAnnouncement = `${fileName}: ${statusLabel}`;\n const hasDescription = description != null && description !== \"\";\n /** Single-line rows center icon/title/actions; multi-line keeps icon top-aligned with the title. */\n const rowAlign = hasDescription ? \"flex-start\" : \"center\";\n\n const activate = () => {\n if (!isClickable) return;\n onClick?.();\n };\n\n const primaryContent = (\n <Group gap=\"sm\" wrap=\"nowrap\" align={rowAlign} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Box style={{ flexShrink: 0, display: \"flex\", alignItems: \"center\" }}>\n {icon ?? <DefaultStatusIcon status={status} />}\n </Box>\n <Stack gap={2} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Text\n size=\"sm\"\n fw={500}\n c={fairmintVars.colorTextPrimary}\n lineClamp={1}\n title={fileName}\n style={{ minWidth: 0 }}\n >\n {fileName}\n </Text>\n {hasDescription ? (\n typeof description === \"string\" ? (\n <Text\n size=\"xs\"\n c={fairmintVars.colorTextSecondary}\n lineClamp={2}\n style={{ minWidth: 0 }}\n >\n {description}\n </Text>\n ) : (\n description\n )\n ) : null}\n </Stack>\n </Group>\n );\n\n const statusAndActions = (\n <Group gap=\"xs\" wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n {isLive ? (\n <>\n <Text\n size=\"xs\"\n className=\"document-row-status--live\"\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n <ProcessingLabelStyles />\n </>\n ) : (\n <Text\n size=\"xs\"\n fw={selected ? 500 : 400}\n c={statusLabelColor(status, selected)}\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n )}\n {actions}\n </Group>\n );\n\n return (\n <Box\n data-testid=\"document-row\"\n data-status={status}\n data-selected={selected || undefined}\n data-disabled={disabled || undefined}\n className=\"document-row\"\n w=\"100%\"\n miw={0}\n style={{\n borderRadius: 10,\n border: `1px solid ${borderColor}`,\n background: background ?? \"transparent\",\n opacity: disabled ? 0.6 : 1,\n transition: \"border-color 0.18s ease, background-color 0.18s ease\",\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n px=\"sm\"\n py={8}\n align={rowAlign}\n style={{ minWidth: 0 }}\n >\n {hasActivationTarget ? (\n <UnstyledButton\n onClick={activate}\n disabled={disabled}\n aria-label={resolvedAriaLabel}\n aria-expanded={selected}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n minWidth: 0,\n flex: 1,\n textAlign: \"left\",\n }}\n >\n {primaryContent}\n </UnstyledButton>\n ) : (\n primaryContent\n )}\n {statusAndActions}\n </Group>\n\n {detail != null ? (\n <Box\n px=\"sm\"\n pb=\"sm\"\n pt={0}\n onClick={(event: SyntheticEvent) => event.stopPropagation()}\n onKeyDown={(event: SyntheticEvent) => event.stopPropagation()}\n >\n {detail}\n </Box>\n ) : null}\n </Box>\n );\n}\n"],"names":["jsxs","jsx","fairmintVars","Loader","ThemeIcon","Box","Group","Stack","Text","Fragment","UnstyledButton"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentRow.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/DocumentRow/DocumentRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DocumentRow.d.ts","sourceRoot":"","sources":["../../../../src/components/generic/DocumentRow/DocumentRow.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,OAAO,CAAC;AAKvD,0EAA0E;AAC1E,MAAM,MAAM,uBAAuB,GAC/B,QAAQ,GACR,WAAW,GACX,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,WAAW,sBAAsB;IACrC,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,MAAM,EAAE,uBAAuB,CAAC;IAChC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,qEAAqE;IACrE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,8HAA8H;IAC9H,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,uDAAuD;IACvD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,2GAA2G;IAC3G,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAuND;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,MAAM,EACN,WAAW,EACX,WAAW,EACX,IAAI,EACJ,QAAgB,EAChB,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAgB,EAChB,SAAS,GACV,EAAE,sBAAsB,2CAyJxB"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import { colors } from "../../../theme/colors.js";
|
|
2
|
+
import { fairmintVars } from "../../../theme/index.js";
|
|
4
3
|
import { Loader } from "../../primitives/Loader/Loader.js";
|
|
5
4
|
import { Box, Stack } from "../../primitives/layout.js";
|
|
6
5
|
import { Group } from "../../../node_modules/@mantine/core/esm/components/Group/Group.js";
|
|
@@ -85,60 +84,121 @@ function DefaultAlertIcon() {
|
|
|
85
84
|
}
|
|
86
85
|
);
|
|
87
86
|
}
|
|
88
|
-
function
|
|
87
|
+
function statusLabelColor(status, selected) {
|
|
88
|
+
if (selected) return fairmintVars.colorInfoText;
|
|
89
89
|
switch (status) {
|
|
90
90
|
case "complete":
|
|
91
|
-
return
|
|
91
|
+
return fairmintVars.colorSuccessText;
|
|
92
92
|
case "attention":
|
|
93
|
-
return
|
|
93
|
+
return fairmintVars.colorWarningText;
|
|
94
94
|
case "error":
|
|
95
|
-
return
|
|
95
|
+
return fairmintVars.colorErrorText;
|
|
96
96
|
case "uploading":
|
|
97
97
|
case "processing":
|
|
98
|
-
return
|
|
98
|
+
return fairmintVars.colorBrandPrimary;
|
|
99
99
|
default:
|
|
100
|
-
return
|
|
100
|
+
return fairmintVars.colorTextTertiary;
|
|
101
101
|
}
|
|
102
102
|
}
|
|
103
|
-
function
|
|
104
|
-
if (selected) return semanticColors.info;
|
|
103
|
+
function statusIconStyle(status) {
|
|
105
104
|
switch (status) {
|
|
106
105
|
case "complete":
|
|
107
|
-
return
|
|
106
|
+
return {
|
|
107
|
+
backgroundColor: fairmintVars.colorSuccessBg,
|
|
108
|
+
color: fairmintVars.colorSuccessText
|
|
109
|
+
};
|
|
108
110
|
case "attention":
|
|
109
|
-
return
|
|
111
|
+
return {
|
|
112
|
+
backgroundColor: fairmintVars.colorWarningBg,
|
|
113
|
+
color: fairmintVars.colorWarningText
|
|
114
|
+
};
|
|
110
115
|
case "error":
|
|
111
|
-
return
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
116
|
+
return {
|
|
117
|
+
backgroundColor: fairmintVars.colorErrorBg,
|
|
118
|
+
color: fairmintVars.colorErrorText
|
|
119
|
+
};
|
|
115
120
|
default:
|
|
116
|
-
return
|
|
121
|
+
return {
|
|
122
|
+
backgroundColor: fairmintVars.colorBgSurfaceSecondary,
|
|
123
|
+
color: fairmintVars.colorIconSecondary
|
|
124
|
+
};
|
|
117
125
|
}
|
|
118
126
|
}
|
|
119
127
|
function DefaultStatusIcon({ status }) {
|
|
120
128
|
if (status === "uploading" || status === "processing") {
|
|
121
|
-
return /* @__PURE__ */ jsx(Loader, { size: 14, color:
|
|
129
|
+
return /* @__PURE__ */ jsx(Loader, { size: 14, color: fairmintVars.colorBrandPrimary, "aria-hidden": true });
|
|
122
130
|
}
|
|
123
131
|
if (status === "complete") {
|
|
124
|
-
return /* @__PURE__ */ jsx(
|
|
132
|
+
return /* @__PURE__ */ jsx(
|
|
133
|
+
ThemeIcon,
|
|
134
|
+
{
|
|
135
|
+
size: 20,
|
|
136
|
+
radius: "xl",
|
|
137
|
+
variant: "light",
|
|
138
|
+
color: "success",
|
|
139
|
+
style: statusIconStyle(status),
|
|
140
|
+
"aria-hidden": true,
|
|
141
|
+
children: /* @__PURE__ */ jsx(DefaultCheckIcon, {})
|
|
142
|
+
}
|
|
143
|
+
);
|
|
125
144
|
}
|
|
126
145
|
if (status === "attention") {
|
|
127
|
-
return /* @__PURE__ */ jsx(
|
|
146
|
+
return /* @__PURE__ */ jsx(
|
|
147
|
+
ThemeIcon,
|
|
148
|
+
{
|
|
149
|
+
size: 20,
|
|
150
|
+
radius: "xl",
|
|
151
|
+
variant: "light",
|
|
152
|
+
color: "warning",
|
|
153
|
+
style: statusIconStyle(status),
|
|
154
|
+
"aria-hidden": true,
|
|
155
|
+
children: /* @__PURE__ */ jsx(DefaultAlertIcon, {})
|
|
156
|
+
}
|
|
157
|
+
);
|
|
128
158
|
}
|
|
129
159
|
if (status === "error") {
|
|
130
|
-
return /* @__PURE__ */ jsx(
|
|
160
|
+
return /* @__PURE__ */ jsx(
|
|
161
|
+
ThemeIcon,
|
|
162
|
+
{
|
|
163
|
+
size: 20,
|
|
164
|
+
radius: "xl",
|
|
165
|
+
variant: "light",
|
|
166
|
+
color: "error",
|
|
167
|
+
style: statusIconStyle(status),
|
|
168
|
+
"aria-hidden": true,
|
|
169
|
+
children: /* @__PURE__ */ jsx(DefaultAlertIcon, {})
|
|
170
|
+
}
|
|
171
|
+
);
|
|
131
172
|
}
|
|
132
173
|
if (status === "queued") {
|
|
133
|
-
return /* @__PURE__ */ jsx(
|
|
174
|
+
return /* @__PURE__ */ jsx(
|
|
175
|
+
Box,
|
|
176
|
+
{
|
|
177
|
+
c: fairmintVars.colorIconTertiary,
|
|
178
|
+
style: { display: "flex", flexShrink: 0 },
|
|
179
|
+
"aria-hidden": true,
|
|
180
|
+
children: /* @__PURE__ */ jsx(DefaultClockIcon, {})
|
|
181
|
+
}
|
|
182
|
+
);
|
|
134
183
|
}
|
|
135
|
-
return /* @__PURE__ */ jsx(
|
|
184
|
+
return /* @__PURE__ */ jsx(
|
|
185
|
+
ThemeIcon,
|
|
186
|
+
{
|
|
187
|
+
size: 20,
|
|
188
|
+
radius: "md",
|
|
189
|
+
variant: "light",
|
|
190
|
+
color: "gray",
|
|
191
|
+
style: statusIconStyle(status),
|
|
192
|
+
"aria-hidden": true,
|
|
193
|
+
children: /* @__PURE__ */ jsx(DefaultFileIcon, {})
|
|
194
|
+
}
|
|
195
|
+
);
|
|
136
196
|
}
|
|
137
197
|
function ProcessingLabelStyles() {
|
|
138
198
|
return /* @__PURE__ */ jsx("style", { children: `
|
|
139
199
|
.document-row-status--live {
|
|
140
200
|
display: inline-block;
|
|
141
|
-
background-image: linear-gradient(90deg, ${
|
|
201
|
+
background-image: linear-gradient(90deg, ${fairmintVars.colorBrandPrimary}, ${fairmintVars.colorBrandPurple}, ${fairmintVars.colorBrandPrimary});
|
|
142
202
|
background-size: 200% auto;
|
|
143
203
|
-webkit-background-clip: text;
|
|
144
204
|
background-clip: text;
|
|
@@ -150,7 +210,7 @@ function ProcessingLabelStyles() {
|
|
|
150
210
|
.document-row-status--live {
|
|
151
211
|
animation: none;
|
|
152
212
|
background-image: none;
|
|
153
|
-
color: ${
|
|
213
|
+
color: ${fairmintVars.colorTextTertiary};
|
|
154
214
|
}
|
|
155
215
|
}
|
|
156
216
|
` });
|
|
@@ -171,8 +231,8 @@ function DocumentStatusRow({
|
|
|
171
231
|
const hasActivationTarget = Boolean(onClick);
|
|
172
232
|
const isClickable = hasActivationTarget && !disabled;
|
|
173
233
|
const isLive = status === "uploading" || status === "processing";
|
|
174
|
-
const borderColor = selected ?
|
|
175
|
-
const background = selected ?
|
|
234
|
+
const borderColor = selected ? fairmintVars.colorInfoBorder : status === "error" ? `color-mix(in srgb, ${fairmintVars.colorErrorBorder} 55%, transparent)` : status === "attention" ? `color-mix(in srgb, ${fairmintVars.colorWarningBorder} 66%, transparent)` : fairmintVars.colorBorderDefault;
|
|
235
|
+
const background = selected ? `color-mix(in srgb, ${fairmintVars.colorInfoBg} 55%, transparent)` : status === "error" ? `color-mix(in srgb, ${fairmintVars.colorErrorBg} 20%, transparent)` : void 0;
|
|
176
236
|
const resolvedAriaLabel = ariaLabel ?? `${fileName}. ${statusLabel}`;
|
|
177
237
|
const statusAnnouncement = `${fileName}: ${statusLabel}`;
|
|
178
238
|
const hasDescription = description != null && description !== "";
|
|
@@ -189,14 +249,23 @@ function DocumentStatusRow({
|
|
|
189
249
|
{
|
|
190
250
|
size: "sm",
|
|
191
251
|
fw: 500,
|
|
192
|
-
c:
|
|
252
|
+
c: fairmintVars.colorTextPrimary,
|
|
193
253
|
lineClamp: 1,
|
|
194
254
|
title: fileName,
|
|
195
255
|
style: { minWidth: 0 },
|
|
196
256
|
children: fileName
|
|
197
257
|
}
|
|
198
258
|
),
|
|
199
|
-
hasDescription ? typeof description === "string" ? /* @__PURE__ */ jsx(
|
|
259
|
+
hasDescription ? typeof description === "string" ? /* @__PURE__ */ jsx(
|
|
260
|
+
Text,
|
|
261
|
+
{
|
|
262
|
+
size: "xs",
|
|
263
|
+
c: fairmintVars.colorTextSecondary,
|
|
264
|
+
lineClamp: 2,
|
|
265
|
+
style: { minWidth: 0 },
|
|
266
|
+
children: description
|
|
267
|
+
}
|
|
268
|
+
) : description : null
|
|
200
269
|
] })
|
|
201
270
|
] });
|
|
202
271
|
const statusAndActions = /* @__PURE__ */ jsxs(Group, { gap: "xs", wrap: "nowrap", style: { flexShrink: 0 }, children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentRow.js","sources":["../../../../src/components/generic/DocumentRow/DocumentRow.tsx"],"sourcesContent":["import type { ReactNode, SyntheticEvent } from \"react\";\nimport { brandColors, neutralColors, semanticColors } from \"../../../theme\";\nimport { colors } from \"../../../theme/colors\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon, UnstyledButton } from \"../../primitives/layout\";\n\n/** Visual processing vocabulary for a source document after selection. */\nexport type DocumentStatusRowStatus =\n | \"staged\"\n | \"uploading\"\n | \"queued\"\n | \"processing\"\n | \"complete\"\n | \"attention\"\n | \"error\";\n\nexport interface DocumentStatusRowProps {\n /** Source document filename. */\n fileName: string;\n /**\n * Neutral visual state. Product meaning (classified, approved, needs review)\n * belongs in `statusLabel`, not in this enum.\n */\n status: DocumentStatusRowStatus;\n /**\n * Caller-supplied status word or short phrase. Required so status is never\n * communicated by color or animation alone.\n */\n statusLabel: string;\n /** Optional secondary description or metadata beneath the filename. */\n description?: ReactNode;\n /** Leading icon override. Defaults to a status-appropriate glyph. */\n icon?: ReactNode;\n /** Open / disclosed appearance (independent of `status`). Exposed as `aria-expanded` when `onClick` is set. @default false */\n selected?: boolean;\n /** Makes the primary row activatable (mouse + keyboard). */\n onClick?: () => void;\n /**\n * Trailing actions (remove, retry, download, open). Rendered outside the\n * clickable hit target so action clicks do not also activate the row.\n */\n actions?: ReactNode;\n /** Optional detail content beneath the primary row. */\n detail?: ReactNode;\n /** Softens chrome and, with `onClick`, renders a disabled button that blocks activation. @default false */\n disabled?: boolean;\n /** Accessible name when `onClick` is set. Defaults to fileName + statusLabel. */\n ariaLabel?: string;\n}\n\nfunction DefaultFileIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\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 </svg>\n );\n}\n\nfunction DefaultCheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction DefaultClockIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n );\n}\n\nfunction DefaultAlertIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nfunction statusIconColor(status: DocumentStatusRowStatus): string {\n switch (status) {\n case \"complete\":\n return colors.success;\n case \"attention\":\n return colors.warning;\n case \"error\":\n return colors.error;\n case \"uploading\":\n case \"processing\":\n return colors.primary;\n default:\n return colors.neutral;\n }\n}\n\nfunction statusLabelColor(status: DocumentStatusRowStatus, selected: boolean): string {\n if (selected) return semanticColors.info;\n switch (status) {\n case \"complete\":\n return semanticColors.success;\n case \"attention\":\n return semanticColors.warning;\n case \"error\":\n return semanticColors.error;\n case \"uploading\":\n case \"processing\":\n return brandColors.indigo;\n default:\n return neutralColors[500];\n }\n}\n\nfunction DefaultStatusIcon({ status }: { status: DocumentStatusRowStatus }) {\n if (status === \"uploading\" || status === \"processing\") {\n return <Loader size={14} color={colors.primary} aria-hidden />;\n }\n if (status === \"complete\") {\n return (\n <ThemeIcon size={20} radius=\"xl\" variant=\"light\" color={colors.success} aria-hidden>\n <DefaultCheckIcon />\n </ThemeIcon>\n );\n }\n if (status === \"attention\") {\n return (\n <ThemeIcon size={20} radius=\"xl\" variant=\"light\" color={colors.warning} aria-hidden>\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"error\") {\n return (\n <ThemeIcon size={20} radius=\"xl\" variant=\"light\" color={colors.error} aria-hidden>\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"queued\") {\n return (\n <Box c={neutralColors[400]} style={{ display: \"flex\", flexShrink: 0 }} aria-hidden>\n <DefaultClockIcon />\n </Box>\n );\n }\n return (\n <ThemeIcon size={20} radius=\"md\" variant=\"light\" color={statusIconColor(status)} aria-hidden>\n <DefaultFileIcon />\n </ThemeIcon>\n );\n}\n\nfunction ProcessingLabelStyles() {\n return (\n <style>{`\n .document-row-status--live {\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 .document-row-status--live {\n animation: none;\n background-image: none;\n color: ${neutralColors[600]};\n }\n }\n `}</style>\n );\n}\n\n/**\n * Neutral source-document row for upload → process → settle flows.\n *\n * Owns visual state and accessibility for one uploaded file. Does not own OCR,\n * classification, extraction, approval, polling, or product retry logic — the\n * caller supplies `statusLabel`, actions, and meaning.\n *\n * Layout: a single row with minimal separation. Do not wrap lists of these in\n * an extra card/panel unless the app owns that composition (e.g. a processing\n * container pattern).\n */\nexport function DocumentStatusRow({\n fileName,\n status,\n statusLabel,\n description,\n icon,\n selected = false,\n onClick,\n actions,\n detail,\n disabled = false,\n ariaLabel,\n}: DocumentStatusRowProps) {\n const hasActivationTarget = Boolean(onClick);\n const isClickable = hasActivationTarget && !disabled;\n const isLive = status === \"uploading\" || status === \"processing\";\n const borderColor = selected\n ? semanticColors.info\n : status === \"error\"\n ? `${semanticColors.error}55`\n : status === \"attention\"\n ? `${semanticColors.warning}66`\n : neutralColors[200];\n const background = selected\n ? `${semanticColors.info}0a`\n : status === \"error\"\n ? `${semanticColors.error}08`\n : undefined;\n const resolvedAriaLabel = ariaLabel ?? `${fileName}. ${statusLabel}`;\n /** Accessible status announcement includes filename so lists of rows stay distinct. */\n const statusAnnouncement = `${fileName}: ${statusLabel}`;\n const hasDescription = description != null && description !== \"\";\n /** Single-line rows center icon/title/actions; multi-line keeps icon top-aligned with the title. */\n const rowAlign = hasDescription ? \"flex-start\" : \"center\";\n\n const activate = () => {\n if (!isClickable) return;\n onClick?.();\n };\n\n const primaryContent = (\n <Group gap=\"sm\" wrap=\"nowrap\" align={rowAlign} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Box style={{ flexShrink: 0, display: \"flex\", alignItems: \"center\" }}>\n {icon ?? <DefaultStatusIcon status={status} />}\n </Box>\n <Stack gap={2} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Text\n size=\"sm\"\n fw={500}\n c={neutralColors[900]}\n lineClamp={1}\n title={fileName}\n style={{ minWidth: 0 }}\n >\n {fileName}\n </Text>\n {hasDescription ? (\n typeof description === \"string\" ? (\n <Text size=\"xs\" c={neutralColors[500]} lineClamp={2} style={{ minWidth: 0 }}>\n {description}\n </Text>\n ) : (\n description\n )\n ) : null}\n </Stack>\n </Group>\n );\n\n const statusAndActions = (\n <Group gap=\"xs\" wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n {isLive ? (\n <>\n <Text\n size=\"xs\"\n className=\"document-row-status--live\"\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n <ProcessingLabelStyles />\n </>\n ) : (\n <Text\n size=\"xs\"\n fw={selected ? 500 : 400}\n c={statusLabelColor(status, selected)}\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n )}\n {actions}\n </Group>\n );\n\n return (\n <Box\n data-testid=\"document-row\"\n data-status={status}\n data-selected={selected || undefined}\n data-disabled={disabled || undefined}\n className=\"document-row\"\n w=\"100%\"\n miw={0}\n style={{\n borderRadius: 10,\n border: `1px solid ${borderColor}`,\n background: background ?? \"transparent\",\n opacity: disabled ? 0.6 : 1,\n transition: \"border-color 0.18s ease, background-color 0.18s ease\",\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n px=\"sm\"\n py={8}\n align={rowAlign}\n style={{ minWidth: 0 }}\n >\n {hasActivationTarget ? (\n <UnstyledButton\n onClick={activate}\n disabled={disabled}\n aria-label={resolvedAriaLabel}\n aria-expanded={selected}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n minWidth: 0,\n flex: 1,\n textAlign: \"left\",\n }}\n >\n {primaryContent}\n </UnstyledButton>\n ) : (\n primaryContent\n )}\n {statusAndActions}\n </Group>\n\n {detail != null ? (\n <Box\n px=\"sm\"\n pb=\"sm\"\n pt={0}\n onClick={(event: SyntheticEvent) => event.stopPropagation()}\n onKeyDown={(event: SyntheticEvent) => event.stopPropagation()}\n >\n {detail}\n </Box>\n ) : null}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DocumentRow.js","sources":["../../../../src/components/generic/DocumentRow/DocumentRow.tsx"],"sourcesContent":["import type { ReactNode, SyntheticEvent } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { Loader } from \"../../primitives/Loader/Loader\";\nimport { Box, Group, Stack, Text, ThemeIcon, UnstyledButton } from \"../../primitives/layout\";\n\n/** Visual processing vocabulary for a source document after selection. */\nexport type DocumentStatusRowStatus =\n | \"staged\"\n | \"uploading\"\n | \"queued\"\n | \"processing\"\n | \"complete\"\n | \"attention\"\n | \"error\";\n\nexport interface DocumentStatusRowProps {\n /** Source document filename. */\n fileName: string;\n /**\n * Neutral visual state. Product meaning (classified, approved, needs review)\n * belongs in `statusLabel`, not in this enum.\n */\n status: DocumentStatusRowStatus;\n /**\n * Caller-supplied status word or short phrase. Required so status is never\n * communicated by color or animation alone.\n */\n statusLabel: string;\n /** Optional secondary description or metadata beneath the filename. */\n description?: ReactNode;\n /** Leading icon override. Defaults to a status-appropriate glyph. */\n icon?: ReactNode;\n /** Open / disclosed appearance (independent of `status`). Exposed as `aria-expanded` when `onClick` is set. @default false */\n selected?: boolean;\n /** Makes the primary row activatable (mouse + keyboard). */\n onClick?: () => void;\n /**\n * Trailing actions (remove, retry, download, open). Rendered outside the\n * clickable hit target so action clicks do not also activate the row.\n */\n actions?: ReactNode;\n /** Optional detail content beneath the primary row. */\n detail?: ReactNode;\n /** Softens chrome and, with `onClick`, renders a disabled button that blocks activation. @default false */\n disabled?: boolean;\n /** Accessible name when `onClick` is set. Defaults to fileName + statusLabel. */\n ariaLabel?: string;\n}\n\nfunction DefaultFileIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\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 </svg>\n );\n}\n\nfunction DefaultCheckIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\nfunction DefaultClockIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M12 6v6l4 2\" />\n </svg>\n );\n}\n\nfunction DefaultAlertIcon() {\n return (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n );\n}\n\nfunction statusLabelColor(status: DocumentStatusRowStatus, selected: boolean): string {\n if (selected) return fairmintVars.colorInfoText;\n switch (status) {\n case \"complete\":\n return fairmintVars.colorSuccessText;\n case \"attention\":\n return fairmintVars.colorWarningText;\n case \"error\":\n return fairmintVars.colorErrorText;\n case \"uploading\":\n case \"processing\":\n return fairmintVars.colorBrandPrimary;\n default:\n return fairmintVars.colorTextTertiary;\n }\n}\n\nfunction statusIconStyle(status: DocumentStatusRowStatus) {\n switch (status) {\n case \"complete\":\n return {\n backgroundColor: fairmintVars.colorSuccessBg,\n color: fairmintVars.colorSuccessText,\n };\n case \"attention\":\n return {\n backgroundColor: fairmintVars.colorWarningBg,\n color: fairmintVars.colorWarningText,\n };\n case \"error\":\n return {\n backgroundColor: fairmintVars.colorErrorBg,\n color: fairmintVars.colorErrorText,\n };\n default:\n return {\n backgroundColor: fairmintVars.colorBgSurfaceSecondary,\n color: fairmintVars.colorIconSecondary,\n };\n }\n}\n\nfunction DefaultStatusIcon({ status }: { status: DocumentStatusRowStatus }) {\n if (status === \"uploading\" || status === \"processing\") {\n return <Loader size={14} color={fairmintVars.colorBrandPrimary} aria-hidden />;\n }\n if (status === \"complete\") {\n return (\n <ThemeIcon\n size={20}\n radius=\"xl\"\n variant=\"light\"\n color=\"success\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultCheckIcon />\n </ThemeIcon>\n );\n }\n if (status === \"attention\") {\n return (\n <ThemeIcon\n size={20}\n radius=\"xl\"\n variant=\"light\"\n color=\"warning\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"error\") {\n return (\n <ThemeIcon\n size={20}\n radius=\"xl\"\n variant=\"light\"\n color=\"error\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultAlertIcon />\n </ThemeIcon>\n );\n }\n if (status === \"queued\") {\n return (\n <Box\n c={fairmintVars.colorIconTertiary}\n style={{ display: \"flex\", flexShrink: 0 }}\n aria-hidden\n >\n <DefaultClockIcon />\n </Box>\n );\n }\n return (\n <ThemeIcon\n size={20}\n radius=\"md\"\n variant=\"light\"\n color=\"gray\"\n style={statusIconStyle(status)}\n aria-hidden\n >\n <DefaultFileIcon />\n </ThemeIcon>\n );\n}\n\nfunction ProcessingLabelStyles() {\n return (\n <style>{`\n .document-row-status--live {\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 .document-row-status--live {\n animation: none;\n background-image: none;\n color: ${fairmintVars.colorTextTertiary};\n }\n }\n `}</style>\n );\n}\n\n/**\n * Neutral source-document row for upload → process → settle flows.\n *\n * Owns visual state and accessibility for one uploaded file. Does not own OCR,\n * classification, extraction, approval, polling, or product retry logic — the\n * caller supplies `statusLabel`, actions, and meaning.\n *\n * Layout: a single row with minimal separation. Do not wrap lists of these in\n * an extra card/panel unless the app owns that composition (e.g. a processing\n * container pattern).\n */\nexport function DocumentStatusRow({\n fileName,\n status,\n statusLabel,\n description,\n icon,\n selected = false,\n onClick,\n actions,\n detail,\n disabled = false,\n ariaLabel,\n}: DocumentStatusRowProps) {\n const hasActivationTarget = Boolean(onClick);\n const isClickable = hasActivationTarget && !disabled;\n const isLive = status === \"uploading\" || status === \"processing\";\n const borderColor = selected\n ? fairmintVars.colorInfoBorder\n : status === \"error\"\n ? `color-mix(in srgb, ${fairmintVars.colorErrorBorder} 55%, transparent)`\n : status === \"attention\"\n ? `color-mix(in srgb, ${fairmintVars.colorWarningBorder} 66%, transparent)`\n : fairmintVars.colorBorderDefault;\n const background = selected\n ? `color-mix(in srgb, ${fairmintVars.colorInfoBg} 55%, transparent)`\n : status === \"error\"\n ? `color-mix(in srgb, ${fairmintVars.colorErrorBg} 20%, transparent)`\n : undefined;\n const resolvedAriaLabel = ariaLabel ?? `${fileName}. ${statusLabel}`;\n /** Accessible status announcement includes filename so lists of rows stay distinct. */\n const statusAnnouncement = `${fileName}: ${statusLabel}`;\n const hasDescription = description != null && description !== \"\";\n /** Single-line rows center icon/title/actions; multi-line keeps icon top-aligned with the title. */\n const rowAlign = hasDescription ? \"flex-start\" : \"center\";\n\n const activate = () => {\n if (!isClickable) return;\n onClick?.();\n };\n\n const primaryContent = (\n <Group gap=\"sm\" wrap=\"nowrap\" align={rowAlign} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Box style={{ flexShrink: 0, display: \"flex\", alignItems: \"center\" }}>\n {icon ?? <DefaultStatusIcon status={status} />}\n </Box>\n <Stack gap={2} style={{ minWidth: 0, flex: 1 }} miw={0}>\n <Text\n size=\"sm\"\n fw={500}\n c={fairmintVars.colorTextPrimary}\n lineClamp={1}\n title={fileName}\n style={{ minWidth: 0 }}\n >\n {fileName}\n </Text>\n {hasDescription ? (\n typeof description === \"string\" ? (\n <Text\n size=\"xs\"\n c={fairmintVars.colorTextSecondary}\n lineClamp={2}\n style={{ minWidth: 0 }}\n >\n {description}\n </Text>\n ) : (\n description\n )\n ) : null}\n </Stack>\n </Group>\n );\n\n const statusAndActions = (\n <Group gap=\"xs\" wrap=\"nowrap\" style={{ flexShrink: 0 }}>\n {isLive ? (\n <>\n <Text\n size=\"xs\"\n className=\"document-row-status--live\"\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n <ProcessingLabelStyles />\n </>\n ) : (\n <Text\n size=\"xs\"\n fw={selected ? 500 : 400}\n c={statusLabelColor(status, selected)}\n role=\"status\"\n aria-label={statusAnnouncement}\n style={{ whiteSpace: \"nowrap\" }}\n >\n {statusLabel}\n </Text>\n )}\n {actions}\n </Group>\n );\n\n return (\n <Box\n data-testid=\"document-row\"\n data-status={status}\n data-selected={selected || undefined}\n data-disabled={disabled || undefined}\n className=\"document-row\"\n w=\"100%\"\n miw={0}\n style={{\n borderRadius: 10,\n border: `1px solid ${borderColor}`,\n background: background ?? \"transparent\",\n opacity: disabled ? 0.6 : 1,\n transition: \"border-color 0.18s ease, background-color 0.18s ease\",\n }}\n >\n <Group\n justify=\"space-between\"\n wrap=\"nowrap\"\n gap=\"sm\"\n px=\"sm\"\n py={8}\n align={rowAlign}\n style={{ minWidth: 0 }}\n >\n {hasActivationTarget ? (\n <UnstyledButton\n onClick={activate}\n disabled={disabled}\n aria-label={resolvedAriaLabel}\n aria-expanded={selected}\n style={{\n cursor: disabled ? \"not-allowed\" : \"pointer\",\n minWidth: 0,\n flex: 1,\n textAlign: \"left\",\n }}\n >\n {primaryContent}\n </UnstyledButton>\n ) : (\n primaryContent\n )}\n {statusAndActions}\n </Group>\n\n {detail != null ? (\n <Box\n px=\"sm\"\n pb=\"sm\"\n pt={0}\n onClick={(event: SyntheticEvent) => event.stopPropagation()}\n onKeyDown={(event: SyntheticEvent) => event.stopPropagation()}\n >\n {detail}\n </Box>\n ) : null}\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const index = require("../../../theme/index.cjs");
|
|
5
5
|
const Text = require("../../../node_modules/@mantine/core/esm/components/Text/Text.cjs");
|
|
6
|
-
function Eyebrow({
|
|
6
|
+
function Eyebrow({
|
|
7
|
+
children,
|
|
8
|
+
size = "xs",
|
|
9
|
+
c = index.fairmintVars.colorTextSecondary,
|
|
10
|
+
...rest
|
|
11
|
+
}) {
|
|
7
12
|
return /* @__PURE__ */ jsxRuntime.jsx(Text.Text, { size, fw: 700, tt: "uppercase", c, style: { letterSpacing: "0.08em" }, ...rest, children });
|
|
8
13
|
}
|
|
9
14
|
exports.Eyebrow = Eyebrow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Eyebrow.cjs","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport {
|
|
1
|
+
{"version":3,"file":"Eyebrow.cjs","sources":["../../../../src/components/generic/Eyebrow/Eyebrow.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { fairmintVars } from \"../../../theme\";\nimport { Text, type TextProps } from \"../../primitives/layout\";\n\nexport interface EyebrowProps extends Omit<TextProps, \"children\" | \"size\" | \"fw\" | \"tt\" | \"c\"> {\n /** Eyebrow text content. */\n children: ReactNode;\n /** Eyebrow size. Defaults to `xs`. */\n size?: \"xs\" | \"sm\";\n /**\n * Text color. Defaults to the semantic secondary text token. Override when the\n * eyebrow sits on a dark background or needs to match an accent.\n */\n c?: string;\n}\n\n/**\n * 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":["fairmintVars","jsx","Text"],"mappings":";;;;;AAwBO,SAAS,QAAQ;AAAA,EACtB;AAAA,EACA,OAAO;AAAA,EACP,IAAIA,MAAAA,aAAa;AAAA,EACjB,GAAG;AACL,GAAiB;AACf,SACEC,2BAAAA,IAACC,KAAAA,MAAA,EAAK,MAAY,IAAI,KAAK,IAAG,aAAY,GAAM,OAAO,EAAE,eAAe,SAAA,GAAa,GAAG,MACrF,UACH;AAEJ;;"}
|