@spark-ui/components 11.4.1 → 11.4.3

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.
@@ -135,14 +135,14 @@ var FileUpload = ({
135
135
  children,
136
136
  defaultValue = [],
137
137
  value: controlledValue,
138
- onFilesChange,
138
+ onFileAccept,
139
+ onFileReject,
140
+ onFileChange,
139
141
  multiple = true,
140
142
  accept,
141
143
  maxFiles,
142
- onMaxFilesReached,
143
144
  maxFileSize,
144
145
  minFileSize,
145
- onFileSizeError,
146
146
  disabled = false,
147
147
  readOnly = false,
148
148
  locale
@@ -152,11 +152,7 @@ var FileUpload = ({
152
152
  const triggerRef = (0, import_react2.useRef)(null);
153
153
  const dropzoneRef = (0, import_react2.useRef)(null);
154
154
  const deleteButtonRefs = (0, import_react2.useRef)([]);
155
- const [filesState, setFilesState, ,] = (0, import_use_combined_state.useCombinedState)(
156
- controlledValue,
157
- defaultValue,
158
- onFilesChange
159
- );
155
+ const [filesState, setFilesState, ,] = (0, import_use_combined_state.useCombinedState)(controlledValue, defaultValue);
160
156
  const files = filesState ?? [];
161
157
  const setFiles = setFilesState;
162
158
  const [rejectedFiles, setRejectedFiles] = (0, import_react2.useState)([]);
@@ -185,9 +181,6 @@ var FileUpload = ({
185
181
  errors: [error]
186
182
  });
187
183
  }
188
- if (onFileSizeError) {
189
- onFileSizeError(file, error);
190
- }
191
184
  };
192
185
  setFiles((prev) => {
193
186
  const currentFiles = prev ?? [];
@@ -251,19 +244,29 @@ var FileUpload = ({
251
244
  filesToAdd.forEach((file) => {
252
245
  addRejectedFile(file, "TOO_MANY_FILES");
253
246
  });
254
- onMaxFilesReached?.(maxFiles, filesToAdd.length);
255
247
  filesToAdd = [];
256
248
  } else if (filesToAdd.length > remainingSlots) {
257
249
  filesToAdd.forEach((file) => {
258
250
  addRejectedFile(file, "TOO_MANY_FILES");
259
251
  });
260
- onMaxFilesReached?.(maxFiles, filesToAdd.length);
261
252
  filesToAdd = [];
262
253
  }
263
254
  }
264
255
  const updated = multiple ? [...currentFiles, ...filesToAdd] : filesToAdd;
265
256
  const rejectedFilesToAdd = [...newRejectedFiles];
266
257
  setRejectedFiles(rejectedFilesToAdd);
258
+ if (filesToAdd.length > 0 && onFileAccept) {
259
+ onFileAccept({ files: filesToAdd });
260
+ }
261
+ if (rejectedFilesToAdd.length > 0 && onFileReject) {
262
+ onFileReject({ files: rejectedFilesToAdd });
263
+ }
264
+ if (onFileChange) {
265
+ onFileChange({
266
+ acceptedFiles: updated,
267
+ rejectedFiles: rejectedFilesToAdd
268
+ });
269
+ }
267
270
  return updated;
268
271
  });
269
272
  };
@@ -274,10 +277,18 @@ var FileUpload = ({
274
277
  setFiles((prev) => {
275
278
  const currentFiles = prev ?? [];
276
279
  const updated = currentFiles.filter((_, i) => i !== index);
280
+ let updatedRejectedFiles = rejectedFiles;
277
281
  if (maxFiles !== void 0 && updated.length < maxFiles) {
278
- setRejectedFiles(
279
- (prevRejected) => prevRejected.filter((rejected) => !rejected.errors.includes("TOO_MANY_FILES"))
282
+ updatedRejectedFiles = rejectedFiles.filter(
283
+ (rejected) => !rejected.errors.includes("TOO_MANY_FILES")
280
284
  );
285
+ setRejectedFiles(updatedRejectedFiles);
286
+ }
287
+ if (onFileChange) {
288
+ onFileChange({
289
+ acceptedFiles: updated,
290
+ rejectedFiles: updatedRejectedFiles
291
+ });
281
292
  }
282
293
  return updated;
283
294
  });
@@ -289,6 +300,12 @@ var FileUpload = ({
289
300
  setFiles([]);
290
301
  setRejectedFiles([]);
291
302
  deleteButtonRefs.current = [];
303
+ if (onFileChange) {
304
+ onFileChange({
305
+ acceptedFiles: [],
306
+ rejectedFiles: []
307
+ });
308
+ }
292
309
  };
293
310
  const removeRejectedFile = (index) => {
294
311
  if (disabled || readOnly) {
@@ -361,6 +378,9 @@ var useFileUploadContext = () => {
361
378
  return context;
362
379
  };
363
380
 
381
+ // src/file-upload/FileUploadAcceptedFile.tsx
382
+ var import_class_variance_authority10 = require("class-variance-authority");
383
+
364
384
  // src/icon/Icon.tsx
365
385
  var import_react4 = require("react");
366
386
 
@@ -659,50 +679,24 @@ ProgressBar.displayName = "Progress.Bar";
659
679
  ProgressIndicator.displayName = "Progress.Indicator";
660
680
  ProgressLabel.displayName = "Progress.Label";
661
681
 
662
- // src/file-upload/FileUploadItem.tsx
663
- var import_class_variance_authority5 = require("class-variance-authority");
664
- var import_jsx_runtime9 = require("react/jsx-runtime");
665
- var Item = ({
666
- asChild: _asChild = false,
667
- className,
668
- children,
669
- ...props
670
- }) => {
671
- return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
672
- "li",
673
- {
674
- "data-spark-component": "file-upload-item",
675
- className: (0, import_class_variance_authority5.cx)(
676
- "relative",
677
- "default:bg-surface default:border-sm default:border-outline default:p-md default:rounded-md",
678
- "gap-md flex items-center justify-between default:w-full",
679
- className
680
- ),
681
- ...props,
682
- children
683
- }
684
- );
685
- };
686
- Item.displayName = "FileUpload.Item";
687
-
688
682
  // src/file-upload/FileUploadItemDeleteTrigger.tsx
689
683
  var import_Close = require("@spark-ui/icons/Close");
690
- var import_class_variance_authority10 = require("class-variance-authority");
684
+ var import_class_variance_authority9 = require("class-variance-authority");
691
685
  var import_react9 = require("react");
692
686
 
693
687
  // src/button/Button.tsx
694
- var import_class_variance_authority8 = require("class-variance-authority");
688
+ var import_class_variance_authority7 = require("class-variance-authority");
695
689
  var import_react8 = require("react");
696
690
 
697
691
  // src/spinner/Spinner.styles.tsx
698
692
  var import_internal_utils2 = require("@spark-ui/internal-utils");
699
- var import_class_variance_authority6 = require("class-variance-authority");
693
+ var import_class_variance_authority5 = require("class-variance-authority");
700
694
  var defaultVariants = {
701
695
  intent: "current",
702
696
  size: "current",
703
697
  isBackgroundVisible: false
704
698
  };
705
- var spinnerStyles = (0, import_class_variance_authority6.cva)(
699
+ var spinnerStyles = (0, import_class_variance_authority5.cva)(
706
700
  ["inline-block", "border-solid", "rounded-full", "border-md", "animate-spin"],
707
701
  {
708
702
  variants: {
@@ -743,7 +737,7 @@ var spinnerStyles = (0, import_class_variance_authority6.cva)(
743
737
  );
744
738
 
745
739
  // src/spinner/Spinner.tsx
746
- var import_jsx_runtime10 = require("react/jsx-runtime");
740
+ var import_jsx_runtime9 = require("react/jsx-runtime");
747
741
  var Spinner = ({
748
742
  className,
749
743
  size = "current",
@@ -753,7 +747,7 @@ var Spinner = ({
753
747
  ref,
754
748
  ...others
755
749
  }) => {
756
- return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
750
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
757
751
  "span",
758
752
  {
759
753
  role: "status",
@@ -761,14 +755,14 @@ var Spinner = ({
761
755
  ref,
762
756
  className: spinnerStyles({ className, size, intent, isBackgroundVisible }),
763
757
  ...others,
764
- children: label && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(VisuallyHidden, { children: label })
758
+ children: label && /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(VisuallyHidden, { children: label })
765
759
  }
766
760
  );
767
761
  };
768
762
 
769
763
  // src/button/Button.styles.tsx
770
764
  var import_internal_utils8 = require("@spark-ui/internal-utils");
771
- var import_class_variance_authority7 = require("class-variance-authority");
765
+ var import_class_variance_authority6 = require("class-variance-authority");
772
766
 
773
767
  // src/button/variants/filled.ts
774
768
  var import_internal_utils3 = require("@spark-ui/internal-utils");
@@ -1374,7 +1368,7 @@ var contrastVariants = [
1374
1368
  ];
1375
1369
 
1376
1370
  // src/button/Button.styles.tsx
1377
- var buttonStyles = (0, import_class_variance_authority7.cva)(
1371
+ var buttonStyles = (0, import_class_variance_authority6.cva)(
1378
1372
  [
1379
1373
  "u-shadow-border-transition",
1380
1374
  "box-border inline-flex items-center justify-center gap-md whitespace-nowrap",
@@ -1465,7 +1459,7 @@ var buttonStyles = (0, import_class_variance_authority7.cva)(
1465
1459
  );
1466
1460
 
1467
1461
  // src/button/Button.tsx
1468
- var import_jsx_runtime11 = require("react/jsx-runtime");
1462
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1469
1463
  var blockedEventHandlers = [
1470
1464
  "onClick",
1471
1465
  "onMouseDown",
@@ -1509,7 +1503,7 @@ var Button = ({
1509
1503
  className: loadingText ? "inline-block" : "absolute",
1510
1504
  ...loadingLabel && { "aria-label": loadingLabel }
1511
1505
  };
1512
- return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1506
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1513
1507
  Component,
1514
1508
  {
1515
1509
  "data-spark-component": "button",
@@ -1532,14 +1526,14 @@ var Button = ({
1532
1526
  children: wrapPolymorphicSlot(
1533
1527
  asChild,
1534
1528
  children,
1535
- (slotted) => isLoading ? /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(import_jsx_runtime11.Fragment, { children: [
1536
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(Spinner, { ...spinnerProps }),
1529
+ (slotted) => isLoading ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1530
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Spinner, { ...spinnerProps }),
1537
1531
  loadingText && loadingText,
1538
- /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1532
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1539
1533
  "div",
1540
1534
  {
1541
1535
  "aria-hidden": true,
1542
- className: (0, import_class_variance_authority8.cx)("gap-md", loadingText ? "hidden" : "inline-flex opacity-0"),
1536
+ className: (0, import_class_variance_authority7.cx)("gap-md", loadingText ? "hidden" : "inline-flex opacity-0"),
1543
1537
  children: slotted
1544
1538
  }
1545
1539
  )
@@ -1552,8 +1546,8 @@ Button.displayName = "Button";
1552
1546
 
1553
1547
  // src/icon-button/IconButton.styles.tsx
1554
1548
  var import_internal_utils9 = require("@spark-ui/internal-utils");
1555
- var import_class_variance_authority9 = require("class-variance-authority");
1556
- var iconButtonStyles = (0, import_class_variance_authority9.cva)(["pl-0 pr-0"], {
1549
+ var import_class_variance_authority8 = require("class-variance-authority");
1550
+ var iconButtonStyles = (0, import_class_variance_authority8.cva)(["pl-0 pr-0"], {
1557
1551
  variants: {
1558
1552
  /**
1559
1553
  * Sets the size of the icon.
@@ -1567,7 +1561,7 @@ var iconButtonStyles = (0, import_class_variance_authority9.cva)(["pl-0 pr-0"],
1567
1561
  });
1568
1562
 
1569
1563
  // src/icon-button/IconButton.tsx
1570
- var import_jsx_runtime12 = require("react/jsx-runtime");
1564
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1571
1565
  var IconButton = ({
1572
1566
  design = "filled",
1573
1567
  disabled = false,
@@ -1578,7 +1572,7 @@ var IconButton = ({
1578
1572
  ref,
1579
1573
  ...others
1580
1574
  }) => {
1581
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1575
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1582
1576
  Button,
1583
1577
  {
1584
1578
  "data-spark-component": "icon-button",
@@ -1596,15 +1590,16 @@ var IconButton = ({
1596
1590
  IconButton.displayName = "IconButton";
1597
1591
 
1598
1592
  // src/file-upload/FileUploadItemDeleteTrigger.tsx
1599
- var import_jsx_runtime13 = require("react/jsx-runtime");
1593
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1600
1594
  var ItemDeleteTrigger = ({
1601
1595
  className,
1602
- fileIndex,
1596
+ file,
1603
1597
  onClick,
1604
1598
  ...props
1605
1599
  }) => {
1606
- const { removeFile, triggerRef, dropzoneRef, deleteButtonRefs, disabled, readOnly } = useFileUploadContext();
1600
+ const { removeFile, triggerRef, dropzoneRef, deleteButtonRefs, disabled, readOnly, files } = useFileUploadContext();
1607
1601
  const buttonRef = (0, import_react9.useRef)(null);
1602
+ const fileIndex = files.findIndex((f) => f.name === file.name && f.size === file.size);
1608
1603
  const handleClick = (e) => {
1609
1604
  if (disabled || readOnly) {
1610
1605
  return;
@@ -1640,103 +1635,68 @@ var ItemDeleteTrigger = ({
1640
1635
  }
1641
1636
  }
1642
1637
  };
1643
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(
1638
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1644
1639
  IconButton,
1645
1640
  {
1646
1641
  ref: setRef,
1647
1642
  "data-spark-component": "file-upload-item-delete-trigger",
1648
- className: (0, import_class_variance_authority10.cx)(className),
1643
+ className: (0, import_class_variance_authority9.cx)(className),
1649
1644
  onClick: handleClick,
1650
1645
  disabled: disabled || readOnly,
1651
1646
  size: "sm",
1652
1647
  design: "contrast",
1653
1648
  intent: "surface",
1654
1649
  ...props,
1655
- children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_Close.Close, {}) })
1650
+ children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_Close.Close, {}) })
1656
1651
  }
1657
1652
  );
1658
1653
  };
1659
1654
  ItemDeleteTrigger.displayName = "FileUpload.ItemDeleteTrigger";
1660
1655
 
1661
- // src/file-upload/FileUploadItemFileName.tsx
1662
- var import_class_variance_authority11 = require("class-variance-authority");
1663
- var import_jsx_runtime14 = require("react/jsx-runtime");
1664
- var ItemFileName = ({
1665
- asChild: _asChild = false,
1666
- className,
1667
- children,
1668
- ...props
1669
- }) => {
1670
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
1671
- "p",
1672
- {
1673
- "data-spark-component": "file-upload-item-file-name",
1674
- className: (0, import_class_variance_authority11.cx)("text-body-2 truncate font-medium", className),
1675
- ...props,
1676
- children
1677
- }
1678
- );
1679
- };
1680
- ItemFileName.displayName = "FileUpload.ItemFileName";
1681
-
1682
- // src/file-upload/FileUploadItemSizeText.tsx
1683
- var import_class_variance_authority12 = require("class-variance-authority");
1684
- var import_jsx_runtime15 = require("react/jsx-runtime");
1685
- var ItemSizeText = ({
1686
- asChild: _asChild = false,
1687
- className,
1688
- children,
1689
- ...props
1690
- }) => {
1691
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1692
- "p",
1693
- {
1694
- "data-spark-component": "file-upload-item-size-text",
1695
- className: (0, import_class_variance_authority12.cx)("text-caption", className),
1696
- ...props,
1697
- children
1698
- }
1699
- );
1700
- };
1701
- ItemSizeText.displayName = "FileUpload.ItemSizeText";
1702
-
1703
1656
  // src/file-upload/FileUploadAcceptedFile.tsx
1704
- var import_jsx_runtime16 = require("react/jsx-runtime");
1657
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1705
1658
  var AcceptedFile = ({
1706
1659
  asChild: _asChild = false,
1707
1660
  className,
1708
1661
  file,
1709
- fileIndex,
1710
1662
  uploadProgress,
1663
+ deleteButtonAriaLabel,
1664
+ progressAriaLabel,
1711
1665
  ...props
1712
1666
  }) => {
1713
1667
  const { locale } = useFileUploadContext();
1714
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(Item, { className, ...props, children: [
1715
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "size-sz-40 bg-support-container flex items-center justify-center rounded-md", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Icon, { size: "md", children: getFileIcon(file) }) }),
1716
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "min-w-0 flex-1", children: [
1717
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "gap-md flex flex-row items-center justify-between", children: [
1718
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ItemFileName, { children: file.name }),
1719
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ItemSizeText, { className: "opacity-dim-1", children: formatFileSize(file.size, locale) })
1720
- ] }),
1721
- uploadProgress !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "mt-md", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1722
- Progress2,
1723
- {
1724
- value: uploadProgress,
1725
- max: 100,
1726
- "aria-label": `Upload progress: ${uploadProgress}%`
1727
- }
1728
- ) })
1729
- ] }),
1730
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ItemDeleteTrigger, { "aria-label": "Delete file", fileIndex })
1731
- ] });
1668
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1669
+ "li",
1670
+ {
1671
+ "data-spark-component": "file-upload-accepted-file",
1672
+ className: (0, import_class_variance_authority10.cx)(
1673
+ "relative",
1674
+ "default:bg-surface default:border-sm default:border-outline default:p-md default:rounded-md",
1675
+ "gap-md flex items-center justify-between default:w-full",
1676
+ className
1677
+ ),
1678
+ ...props,
1679
+ children: [
1680
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "size-sz-40 bg-support-container flex items-center justify-center rounded-md", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Icon, { size: "md", children: getFileIcon(file) }) }),
1681
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "min-w-0 flex-1", children: [
1682
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: "gap-md flex flex-row items-center justify-between", children: [
1683
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-body-2 truncate font-medium", children: file.name }),
1684
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("p", { className: "text-caption opacity-dim-1", children: formatFileSize(file.size, locale) })
1685
+ ] }),
1686
+ uploadProgress !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { className: "mt-md", children: /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(Progress2, { value: uploadProgress, max: 100, "aria-label": progressAriaLabel }) })
1687
+ ] }),
1688
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(ItemDeleteTrigger, { "aria-label": deleteButtonAriaLabel, file })
1689
+ ]
1690
+ }
1691
+ );
1732
1692
  };
1733
1693
  AcceptedFile.displayName = "FileUpload.AcceptedFile";
1734
1694
 
1735
1695
  // src/file-upload/FileUploadContext.tsx
1736
- var import_jsx_runtime17 = require("react/jsx-runtime");
1696
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1737
1697
  var Context = ({ children }) => {
1738
1698
  const { files = [], rejectedFiles = [], locale } = useFileUploadContext();
1739
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_jsx_runtime17.Fragment, { children: children({
1699
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_jsx_runtime14.Fragment, { children: children({
1740
1700
  acceptedFiles: files,
1741
1701
  rejectedFiles,
1742
1702
  formatFileSize,
@@ -1746,12 +1706,11 @@ var Context = ({ children }) => {
1746
1706
  Context.displayName = "FileUpload.Context";
1747
1707
 
1748
1708
  // src/file-upload/FileUploadDropzone.tsx
1749
- var import_class_variance_authority13 = require("class-variance-authority");
1709
+ var import_class_variance_authority11 = require("class-variance-authority");
1750
1710
  var import_react10 = require("react");
1751
- var import_jsx_runtime18 = require("react/jsx-runtime");
1711
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1752
1712
  function Dropzone({
1753
1713
  children,
1754
- onFiles,
1755
1714
  className,
1756
1715
  unstyled = false
1757
1716
  }) {
@@ -1766,7 +1725,6 @@ function Dropzone({
1766
1725
  return;
1767
1726
  }
1768
1727
  const files = e.dataTransfer.files;
1769
- onFiles?.(files);
1770
1728
  let filesArray = [];
1771
1729
  if (files) {
1772
1730
  filesArray = Array.isArray(files) ? [...files] : Array.from(files);
@@ -1789,7 +1747,7 @@ function Dropzone({
1789
1747
  }
1790
1748
  };
1791
1749
  const isDisabled = ctx.disabled || ctx.readOnly;
1792
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1750
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1793
1751
  "div",
1794
1752
  {
1795
1753
  ref: (node) => {
@@ -1807,12 +1765,12 @@ function Dropzone({
1807
1765
  onDragOver: (e) => {
1808
1766
  e.preventDefault();
1809
1767
  },
1810
- className: unstyled ? className : (0, import_class_variance_authority13.cx)(
1811
- "default:bg-surface default:border-sm default:border-outline default:rounded-lg default:border-dashed",
1768
+ className: unstyled ? className : (0, import_class_variance_authority11.cx)(
1769
+ "default:bg-surface default:border-sm default:border-outline default:relative default:rounded-lg default:border-dashed",
1812
1770
  "gap-lg flex flex-col items-center justify-center text-center",
1813
1771
  "default:p-xl",
1814
1772
  "transition-colors duration-200",
1815
- !isDisabled && "hover:bg-surface-hovered",
1773
+ !isDisabled && "default:hover:bg-surface-hovered",
1816
1774
  "data-[drag-over=true]:border-outline-high data-[drag-over=true]:bg-surface-hovered data-[drag-over=true]:border-solid",
1817
1775
  // Disabled: more visually disabled (opacity + cursor)
1818
1776
  ctx.disabled && "cursor-not-allowed opacity-50",
@@ -1835,9 +1793,9 @@ function Dropzone({
1835
1793
  Dropzone.displayName = "FileUploadDropzone";
1836
1794
 
1837
1795
  // src/file-upload/FileUploadPreviewImage.tsx
1838
- var import_class_variance_authority14 = require("class-variance-authority");
1796
+ var import_class_variance_authority12 = require("class-variance-authority");
1839
1797
  var import_react11 = require("react");
1840
- var import_jsx_runtime19 = require("react/jsx-runtime");
1798
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1841
1799
  var PreviewImage = ({
1842
1800
  asChild: _asChild = false,
1843
1801
  className,
@@ -1857,11 +1815,11 @@ var PreviewImage = ({
1857
1815
  };
1858
1816
  }, [imageUrl]);
1859
1817
  if (!isImage || imageError) {
1860
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1818
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1861
1819
  "div",
1862
1820
  {
1863
1821
  "data-spark-component": "file-upload-preview-image",
1864
- className: (0, import_class_variance_authority14.cx)(
1822
+ className: (0, import_class_variance_authority12.cx)(
1865
1823
  "bg-neutral-container flex items-center justify-center rounded-md",
1866
1824
  className
1867
1825
  ),
@@ -1870,24 +1828,24 @@ var PreviewImage = ({
1870
1828
  }
1871
1829
  );
1872
1830
  }
1873
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1831
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1874
1832
  "div",
1875
1833
  {
1876
1834
  "data-spark-component": "file-upload-preview-image",
1877
- className: (0, import_class_variance_authority14.cx)("bg-neutral-container overflow-hidden", className),
1835
+ className: (0, import_class_variance_authority12.cx)("bg-neutral-container overflow-hidden", className),
1878
1836
  ...props,
1879
1837
  children: [
1880
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1838
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1881
1839
  "img",
1882
1840
  {
1883
1841
  src: imageUrl,
1884
1842
  alt: file.name,
1885
- className: (0, import_class_variance_authority14.cx)("size-full object-cover", !imageLoaded && "opacity-0"),
1843
+ className: (0, import_class_variance_authority12.cx)("size-full object-cover", !imageLoaded && "opacity-0"),
1886
1844
  onLoad: () => setImageLoaded(true),
1887
1845
  onError: () => setImageError(true)
1888
1846
  }
1889
1847
  ),
1890
- !imageLoaded && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: "absolute inset-0 flex items-center justify-center", children: fallback })
1848
+ !imageLoaded && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "absolute inset-0 flex items-center justify-center", children: fallback })
1891
1849
  ]
1892
1850
  }
1893
1851
  );
@@ -1896,21 +1854,24 @@ PreviewImage.displayName = "FileUpload.PreviewImage";
1896
1854
 
1897
1855
  // src/file-upload/FileUploadRejectedFile.tsx
1898
1856
  var import_WarningOutline = require("@spark-ui/icons/WarningOutline");
1899
- var import_class_variance_authority16 = require("class-variance-authority");
1857
+ var import_class_variance_authority14 = require("class-variance-authority");
1900
1858
 
1901
1859
  // src/file-upload/FileUploadRejectedFileDeleteTrigger.tsx
1902
1860
  var import_Close2 = require("@spark-ui/icons/Close");
1903
- var import_class_variance_authority15 = require("class-variance-authority");
1861
+ var import_class_variance_authority13 = require("class-variance-authority");
1904
1862
  var import_react12 = require("react");
1905
- var import_jsx_runtime20 = require("react/jsx-runtime");
1863
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1906
1864
  var RejectedFileDeleteTrigger = ({
1907
1865
  className,
1908
- rejectedFileIndex,
1866
+ rejectedFile,
1909
1867
  onClick,
1910
1868
  ...props
1911
1869
  }) => {
1912
- const { removeRejectedFile, triggerRef, dropzoneRef, disabled, readOnly } = useFileUploadContext();
1870
+ const { removeRejectedFile, triggerRef, dropzoneRef, disabled, readOnly, rejectedFiles } = useFileUploadContext();
1913
1871
  const buttonRef = (0, import_react12.useRef)(null);
1872
+ const rejectedFileIndex = rejectedFiles.findIndex(
1873
+ (rf) => rf.file.name === rejectedFile.file.name && rf.file.size === rejectedFile.file.size
1874
+ );
1914
1875
  const handleClick = (e) => {
1915
1876
  if (disabled || readOnly) {
1916
1877
  return;
@@ -1924,58 +1885,66 @@ var RejectedFileDeleteTrigger = ({
1924
1885
  }, 0);
1925
1886
  onClick?.(e);
1926
1887
  };
1927
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1888
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1928
1889
  IconButton,
1929
1890
  {
1930
1891
  ref: buttonRef,
1931
1892
  "data-spark-component": "file-upload-rejected-file-delete-trigger",
1932
- className: (0, import_class_variance_authority15.cx)(className),
1893
+ className: (0, import_class_variance_authority13.cx)(className),
1933
1894
  onClick: handleClick,
1934
1895
  disabled: disabled || readOnly,
1935
1896
  size: "sm",
1936
1897
  design: "contrast",
1937
1898
  intent: "surface",
1938
1899
  ...props,
1939
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(import_Close2.Close, {}) })
1900
+ children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(Icon, { size: "sm", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(import_Close2.Close, {}) })
1940
1901
  }
1941
1902
  );
1942
1903
  };
1943
1904
  RejectedFileDeleteTrigger.displayName = "FileUpload.RejectedFileDeleteTrigger";
1944
1905
 
1945
1906
  // src/file-upload/FileUploadRejectedFile.tsx
1946
- var import_jsx_runtime21 = require("react/jsx-runtime");
1907
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1947
1908
  var RejectedFile = ({
1948
1909
  asChild: _asChild = false,
1949
1910
  className,
1950
1911
  rejectedFile,
1951
- rejectedFileIndex,
1952
1912
  renderError,
1913
+ deleteButtonAriaLabel,
1953
1914
  ...props
1954
1915
  }) => {
1955
1916
  const { locale } = useFileUploadContext();
1956
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(Item, { className: (0, import_class_variance_authority16.cx)("border-error border-md", className), ...props, children: [
1957
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "size-sz-40 bg-error-container flex items-center justify-center rounded-md", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Icon, { size: "md", className: "text-error", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_WarningOutline.WarningOutline, {}) }) }),
1958
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "gap-md flex flex-col", children: [
1959
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "gap-md flex flex-row items-center justify-between", children: [
1960
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ItemFileName, { children: rejectedFile.file.name }),
1961
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ItemSizeText, { className: "opacity-dim-1", children: formatFileSize(rejectedFile.file.size, locale) })
1962
- ] }),
1963
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "gap-xs flex flex-col", children: rejectedFile.errors.map((error, errorIndex) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "text-caption text-error", "data-error-code": error, children: renderError(error) }, errorIndex)) })
1964
- ] }) }),
1965
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1966
- RejectedFileDeleteTrigger,
1967
- {
1968
- "aria-label": `Remove ${rejectedFile.file.name} error`,
1969
- rejectedFileIndex
1970
- }
1971
- )
1972
- ] });
1917
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1918
+ "li",
1919
+ {
1920
+ "data-spark-component": "file-upload-rejected-file",
1921
+ className: (0, import_class_variance_authority14.cx)(
1922
+ "relative",
1923
+ "default:bg-surface default:border-sm default:border-outline default:p-md default:rounded-md",
1924
+ "gap-md flex items-center justify-between default:w-full",
1925
+ "border-error border-md",
1926
+ className
1927
+ ),
1928
+ ...props,
1929
+ children: [
1930
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "size-sz-40 bg-error-container flex items-center justify-center rounded-md", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(Icon, { size: "md", className: "text-error", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(import_WarningOutline.WarningOutline, {}) }) }),
1931
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "gap-md flex flex-col", children: [
1932
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "gap-md flex flex-row items-center justify-between", children: [
1933
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-body-2 truncate font-medium", children: rejectedFile.file.name }),
1934
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: "text-caption opacity-dim-1", children: formatFileSize(rejectedFile.file.size, locale) })
1935
+ ] }),
1936
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "gap-xs flex flex-col", children: rejectedFile.errors.map((error, errorIndex) => /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "text-caption text-error", "data-error-code": error, children: renderError(error) }, errorIndex)) })
1937
+ ] }) }),
1938
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(RejectedFileDeleteTrigger, { "aria-label": deleteButtonAriaLabel, rejectedFile })
1939
+ ]
1940
+ }
1941
+ );
1973
1942
  };
1974
1943
  RejectedFile.displayName = "FileUpload.RejectedFile";
1975
1944
 
1976
1945
  // src/file-upload/FileUploadTrigger.tsx
1977
- var import_class_variance_authority17 = require("class-variance-authority");
1978
- var import_jsx_runtime22 = require("react/jsx-runtime");
1946
+ var import_class_variance_authority15 = require("class-variance-authority");
1947
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1979
1948
  var Trigger = ({
1980
1949
  className,
1981
1950
  children,
@@ -1996,7 +1965,7 @@ var Trigger = ({
1996
1965
  };
1997
1966
  const buttonComponent = unstyled ? "button" : Button;
1998
1967
  const Comp = asChild ? Slot : buttonComponent;
1999
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1968
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
2000
1969
  Comp,
2001
1970
  {
2002
1971
  type: "button",
@@ -2015,7 +1984,7 @@ var Trigger = ({
2015
1984
  design,
2016
1985
  intent,
2017
1986
  "data-spark-component": "file-upload-trigger",
2018
- className: (0, import_class_variance_authority17.cx)(className),
1987
+ className: (0, import_class_variance_authority15.cx)(className),
2019
1988
  disabled: disabled || readOnly,
2020
1989
  onClick: handleClick,
2021
1990
  ...props,
@@ -2027,25 +1996,22 @@ Trigger.displayName = "FileUpload.Trigger";
2027
1996
 
2028
1997
  // src/file-upload/index.ts
2029
1998
  var FileUpload2 = Object.assign(FileUpload, {
1999
+ // Main input components
2030
2000
  Trigger,
2031
2001
  Dropzone,
2002
+ // Context components
2032
2003
  Context,
2033
- Item,
2034
- ItemFileName,
2035
- ItemSizeText,
2036
- ItemDeleteTrigger,
2037
- PreviewImage,
2038
2004
  AcceptedFile,
2039
2005
  RejectedFile,
2006
+ // Helpers for custom renders
2007
+ PreviewImage,
2008
+ ItemDeleteTrigger,
2040
2009
  RejectedFileDeleteTrigger
2041
2010
  });
2042
2011
  FileUpload2.displayName = "FileUpload";
2043
2012
  Trigger.displayName = "FileUpload.Trigger";
2044
2013
  Dropzone.displayName = "FileUpload.Dropzone";
2045
2014
  Context.displayName = "FileUpload.Context";
2046
- Item.displayName = "FileUpload.Item";
2047
- ItemFileName.displayName = "FileUpload.ItemFileName";
2048
- ItemSizeText.displayName = "FileUpload.ItemSizeText";
2049
2015
  ItemDeleteTrigger.displayName = "FileUpload.ItemDeleteTrigger";
2050
2016
  PreviewImage.displayName = "FileUpload.PreviewImage";
2051
2017
  AcceptedFile.displayName = "FileUpload.AcceptedFile";