@spark-ui/components 11.4.2 → 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,98 +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,
1711
1663
  deleteButtonAriaLabel,
1712
1664
  progressAriaLabel,
1713
1665
  ...props
1714
1666
  }) => {
1715
1667
  const { locale } = useFileUploadContext();
1716
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(Item, { className, ...props, children: [
1717
- /* @__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) }) }),
1718
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "min-w-0 flex-1", children: [
1719
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "gap-md flex flex-row items-center justify-between", children: [
1720
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ItemFileName, { children: file.name }),
1721
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ItemSizeText, { className: "opacity-dim-1", children: formatFileSize(file.size, locale) })
1722
- ] }),
1723
- uploadProgress !== void 0 && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "mt-md", children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(Progress2, { value: uploadProgress, max: 100, "aria-label": progressAriaLabel }) })
1724
- ] }),
1725
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ItemDeleteTrigger, { "aria-label": deleteButtonAriaLabel, fileIndex })
1726
- ] });
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
+ );
1727
1692
  };
1728
1693
  AcceptedFile.displayName = "FileUpload.AcceptedFile";
1729
1694
 
1730
1695
  // src/file-upload/FileUploadContext.tsx
1731
- var import_jsx_runtime17 = require("react/jsx-runtime");
1696
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1732
1697
  var Context = ({ children }) => {
1733
1698
  const { files = [], rejectedFiles = [], locale } = useFileUploadContext();
1734
- 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({
1735
1700
  acceptedFiles: files,
1736
1701
  rejectedFiles,
1737
1702
  formatFileSize,
@@ -1741,12 +1706,11 @@ var Context = ({ children }) => {
1741
1706
  Context.displayName = "FileUpload.Context";
1742
1707
 
1743
1708
  // src/file-upload/FileUploadDropzone.tsx
1744
- var import_class_variance_authority13 = require("class-variance-authority");
1709
+ var import_class_variance_authority11 = require("class-variance-authority");
1745
1710
  var import_react10 = require("react");
1746
- var import_jsx_runtime18 = require("react/jsx-runtime");
1711
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1747
1712
  function Dropzone({
1748
1713
  children,
1749
- onFiles,
1750
1714
  className,
1751
1715
  unstyled = false
1752
1716
  }) {
@@ -1761,7 +1725,6 @@ function Dropzone({
1761
1725
  return;
1762
1726
  }
1763
1727
  const files = e.dataTransfer.files;
1764
- onFiles?.(files);
1765
1728
  let filesArray = [];
1766
1729
  if (files) {
1767
1730
  filesArray = Array.isArray(files) ? [...files] : Array.from(files);
@@ -1784,7 +1747,7 @@ function Dropzone({
1784
1747
  }
1785
1748
  };
1786
1749
  const isDisabled = ctx.disabled || ctx.readOnly;
1787
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1750
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
1788
1751
  "div",
1789
1752
  {
1790
1753
  ref: (node) => {
@@ -1802,12 +1765,12 @@ function Dropzone({
1802
1765
  onDragOver: (e) => {
1803
1766
  e.preventDefault();
1804
1767
  },
1805
- className: unstyled ? className : (0, import_class_variance_authority13.cx)(
1806
- "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",
1807
1770
  "gap-lg flex flex-col items-center justify-center text-center",
1808
1771
  "default:p-xl",
1809
1772
  "transition-colors duration-200",
1810
- !isDisabled && "hover:bg-surface-hovered",
1773
+ !isDisabled && "default:hover:bg-surface-hovered",
1811
1774
  "data-[drag-over=true]:border-outline-high data-[drag-over=true]:bg-surface-hovered data-[drag-over=true]:border-solid",
1812
1775
  // Disabled: more visually disabled (opacity + cursor)
1813
1776
  ctx.disabled && "cursor-not-allowed opacity-50",
@@ -1830,9 +1793,9 @@ function Dropzone({
1830
1793
  Dropzone.displayName = "FileUploadDropzone";
1831
1794
 
1832
1795
  // src/file-upload/FileUploadPreviewImage.tsx
1833
- var import_class_variance_authority14 = require("class-variance-authority");
1796
+ var import_class_variance_authority12 = require("class-variance-authority");
1834
1797
  var import_react11 = require("react");
1835
- var import_jsx_runtime19 = require("react/jsx-runtime");
1798
+ var import_jsx_runtime16 = require("react/jsx-runtime");
1836
1799
  var PreviewImage = ({
1837
1800
  asChild: _asChild = false,
1838
1801
  className,
@@ -1852,11 +1815,11 @@ var PreviewImage = ({
1852
1815
  };
1853
1816
  }, [imageUrl]);
1854
1817
  if (!isImage || imageError) {
1855
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1818
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1856
1819
  "div",
1857
1820
  {
1858
1821
  "data-spark-component": "file-upload-preview-image",
1859
- className: (0, import_class_variance_authority14.cx)(
1822
+ className: (0, import_class_variance_authority12.cx)(
1860
1823
  "bg-neutral-container flex items-center justify-center rounded-md",
1861
1824
  className
1862
1825
  ),
@@ -1865,24 +1828,24 @@ var PreviewImage = ({
1865
1828
  }
1866
1829
  );
1867
1830
  }
1868
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1831
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1869
1832
  "div",
1870
1833
  {
1871
1834
  "data-spark-component": "file-upload-preview-image",
1872
- 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),
1873
1836
  ...props,
1874
1837
  children: [
1875
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1838
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1876
1839
  "img",
1877
1840
  {
1878
1841
  src: imageUrl,
1879
1842
  alt: file.name,
1880
- 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"),
1881
1844
  onLoad: () => setImageLoaded(true),
1882
1845
  onError: () => setImageError(true)
1883
1846
  }
1884
1847
  ),
1885
- !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 })
1886
1849
  ]
1887
1850
  }
1888
1851
  );
@@ -1891,21 +1854,24 @@ PreviewImage.displayName = "FileUpload.PreviewImage";
1891
1854
 
1892
1855
  // src/file-upload/FileUploadRejectedFile.tsx
1893
1856
  var import_WarningOutline = require("@spark-ui/icons/WarningOutline");
1894
- var import_class_variance_authority16 = require("class-variance-authority");
1857
+ var import_class_variance_authority14 = require("class-variance-authority");
1895
1858
 
1896
1859
  // src/file-upload/FileUploadRejectedFileDeleteTrigger.tsx
1897
1860
  var import_Close2 = require("@spark-ui/icons/Close");
1898
- var import_class_variance_authority15 = require("class-variance-authority");
1861
+ var import_class_variance_authority13 = require("class-variance-authority");
1899
1862
  var import_react12 = require("react");
1900
- var import_jsx_runtime20 = require("react/jsx-runtime");
1863
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1901
1864
  var RejectedFileDeleteTrigger = ({
1902
1865
  className,
1903
- rejectedFileIndex,
1866
+ rejectedFile,
1904
1867
  onClick,
1905
1868
  ...props
1906
1869
  }) => {
1907
- const { removeRejectedFile, triggerRef, dropzoneRef, disabled, readOnly } = useFileUploadContext();
1870
+ const { removeRejectedFile, triggerRef, dropzoneRef, disabled, readOnly, rejectedFiles } = useFileUploadContext();
1908
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
+ );
1909
1875
  const handleClick = (e) => {
1910
1876
  if (disabled || readOnly) {
1911
1877
  return;
@@ -1919,59 +1885,66 @@ var RejectedFileDeleteTrigger = ({
1919
1885
  }, 0);
1920
1886
  onClick?.(e);
1921
1887
  };
1922
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1888
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1923
1889
  IconButton,
1924
1890
  {
1925
1891
  ref: buttonRef,
1926
1892
  "data-spark-component": "file-upload-rejected-file-delete-trigger",
1927
- className: (0, import_class_variance_authority15.cx)(className),
1893
+ className: (0, import_class_variance_authority13.cx)(className),
1928
1894
  onClick: handleClick,
1929
1895
  disabled: disabled || readOnly,
1930
1896
  size: "sm",
1931
1897
  design: "contrast",
1932
1898
  intent: "surface",
1933
1899
  ...props,
1934
- 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, {}) })
1935
1901
  }
1936
1902
  );
1937
1903
  };
1938
1904
  RejectedFileDeleteTrigger.displayName = "FileUpload.RejectedFileDeleteTrigger";
1939
1905
 
1940
1906
  // src/file-upload/FileUploadRejectedFile.tsx
1941
- var import_jsx_runtime21 = require("react/jsx-runtime");
1907
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1942
1908
  var RejectedFile = ({
1943
1909
  asChild: _asChild = false,
1944
1910
  className,
1945
1911
  rejectedFile,
1946
- rejectedFileIndex,
1947
1912
  renderError,
1948
1913
  deleteButtonAriaLabel,
1949
1914
  ...props
1950
1915
  }) => {
1951
1916
  const { locale } = useFileUploadContext();
1952
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(Item, { className: (0, import_class_variance_authority16.cx)("border-error border-md", className), ...props, children: [
1953
- /* @__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, {}) }) }),
1954
- /* @__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: [
1955
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "gap-md flex flex-row items-center justify-between", children: [
1956
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ItemFileName, { children: rejectedFile.file.name }),
1957
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ItemSizeText, { className: "opacity-dim-1", children: formatFileSize(rejectedFile.file.size, locale) })
1958
- ] }),
1959
- /* @__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)) })
1960
- ] }) }),
1961
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1962
- RejectedFileDeleteTrigger,
1963
- {
1964
- "aria-label": deleteButtonAriaLabel,
1965
- rejectedFileIndex
1966
- }
1967
- )
1968
- ] });
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
+ );
1969
1942
  };
1970
1943
  RejectedFile.displayName = "FileUpload.RejectedFile";
1971
1944
 
1972
1945
  // src/file-upload/FileUploadTrigger.tsx
1973
- var import_class_variance_authority17 = require("class-variance-authority");
1974
- 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");
1975
1948
  var Trigger = ({
1976
1949
  className,
1977
1950
  children,
@@ -1992,7 +1965,7 @@ var Trigger = ({
1992
1965
  };
1993
1966
  const buttonComponent = unstyled ? "button" : Button;
1994
1967
  const Comp = asChild ? Slot : buttonComponent;
1995
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1968
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1996
1969
  Comp,
1997
1970
  {
1998
1971
  type: "button",
@@ -2011,7 +1984,7 @@ var Trigger = ({
2011
1984
  design,
2012
1985
  intent,
2013
1986
  "data-spark-component": "file-upload-trigger",
2014
- className: (0, import_class_variance_authority17.cx)(className),
1987
+ className: (0, import_class_variance_authority15.cx)(className),
2015
1988
  disabled: disabled || readOnly,
2016
1989
  onClick: handleClick,
2017
1990
  ...props,
@@ -2023,25 +1996,22 @@ Trigger.displayName = "FileUpload.Trigger";
2023
1996
 
2024
1997
  // src/file-upload/index.ts
2025
1998
  var FileUpload2 = Object.assign(FileUpload, {
1999
+ // Main input components
2026
2000
  Trigger,
2027
2001
  Dropzone,
2002
+ // Context components
2028
2003
  Context,
2029
- Item,
2030
- ItemFileName,
2031
- ItemSizeText,
2032
- ItemDeleteTrigger,
2033
- PreviewImage,
2034
2004
  AcceptedFile,
2035
2005
  RejectedFile,
2006
+ // Helpers for custom renders
2007
+ PreviewImage,
2008
+ ItemDeleteTrigger,
2036
2009
  RejectedFileDeleteTrigger
2037
2010
  });
2038
2011
  FileUpload2.displayName = "FileUpload";
2039
2012
  Trigger.displayName = "FileUpload.Trigger";
2040
2013
  Dropzone.displayName = "FileUpload.Dropzone";
2041
2014
  Context.displayName = "FileUpload.Context";
2042
- Item.displayName = "FileUpload.Item";
2043
- ItemFileName.displayName = "FileUpload.ItemFileName";
2044
- ItemSizeText.displayName = "FileUpload.ItemSizeText";
2045
2015
  ItemDeleteTrigger.displayName = "FileUpload.ItemDeleteTrigger";
2046
2016
  PreviewImage.displayName = "FileUpload.PreviewImage";
2047
2017
  AcceptedFile.displayName = "FileUpload.AcceptedFile";