@opengovsg/oui 0.0.20 → 0.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/cjs/button/button.cjs +1 -1
  2. package/dist/cjs/calendar/calendar-month-day-selector.cjs +4 -3
  3. package/dist/cjs/checkbox/checkbox.cjs +1 -1
  4. package/dist/cjs/combo-box/combo-box.cjs +2 -2
  5. package/dist/cjs/date-field/date-field.cjs +13 -4
  6. package/dist/cjs/date-picker/date-picker.cjs +38 -14
  7. package/dist/cjs/date-range-picker/date-range-picker.cjs +4 -4
  8. package/dist/cjs/field/field.cjs +20 -6
  9. package/dist/cjs/field/index.cjs +1 -0
  10. package/dist/cjs/file-dropzone/contexts.cjs +18 -0
  11. package/dist/cjs/file-dropzone/file-dropzone.cjs +311 -0
  12. package/dist/cjs/file-dropzone/file-info.cjs +146 -0
  13. package/dist/cjs/file-dropzone/index.cjs +13 -0
  14. package/dist/cjs/file-dropzone/types.cjs +3 -0
  15. package/dist/cjs/file-dropzone/utils.cjs +31 -0
  16. package/dist/cjs/index.cjs +19 -11
  17. package/dist/cjs/menu/menu.cjs +1 -1
  18. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/trash-2.cjs +25 -0
  19. package/dist/cjs/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/upload.cjs +23 -0
  20. package/dist/cjs/range-calendar/range-calendar.cjs +1 -1
  21. package/dist/cjs/select/select.cjs +2 -2
  22. package/dist/cjs/tag-field/tag-field.cjs +3 -3
  23. package/dist/cjs/text-area-field/text-area-field.cjs +1 -1
  24. package/dist/cjs/text-field/text-field.cjs +1 -1
  25. package/dist/esm/button/button.js +1 -1
  26. package/dist/esm/calendar/calendar-month-day-selector.js +4 -3
  27. package/dist/esm/checkbox/checkbox.js +1 -1
  28. package/dist/esm/combo-box/combo-box.js +2 -2
  29. package/dist/esm/date-field/date-field.js +13 -4
  30. package/dist/esm/date-picker/date-picker.js +38 -14
  31. package/dist/esm/date-range-picker/date-range-picker.js +4 -4
  32. package/dist/esm/field/field.js +20 -7
  33. package/dist/esm/field/index.js +1 -1
  34. package/dist/esm/file-dropzone/contexts.js +13 -0
  35. package/dist/esm/file-dropzone/file-dropzone.js +309 -0
  36. package/dist/esm/file-dropzone/file-info.js +144 -0
  37. package/dist/esm/file-dropzone/index.js +4 -0
  38. package/dist/esm/file-dropzone/types.js +1 -0
  39. package/dist/esm/file-dropzone/utils.js +28 -0
  40. package/dist/esm/index.js +8 -5
  41. package/dist/esm/menu/menu.js +1 -1
  42. package/dist/esm/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/trash-2.js +20 -0
  43. package/dist/esm/node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/upload.js +18 -0
  44. package/dist/esm/range-calendar/range-calendar.js +1 -1
  45. package/dist/esm/select/select.js +2 -2
  46. package/dist/esm/tag-field/tag-field.js +3 -3
  47. package/dist/esm/text-area-field/text-area-field.js +1 -1
  48. package/dist/esm/text-field/text-field.js +1 -1
  49. package/dist/types/calendar/calendar-month-day-selector.d.ts.map +1 -1
  50. package/dist/types/date-field/date-field.d.ts +1 -0
  51. package/dist/types/date-field/date-field.d.ts.map +1 -1
  52. package/dist/types/date-picker/date-picker.d.ts +5 -2
  53. package/dist/types/date-picker/date-picker.d.ts.map +1 -1
  54. package/dist/types/field/field.d.ts +4 -1
  55. package/dist/types/field/field.d.ts.map +1 -1
  56. package/dist/types/file-dropzone/contexts.d.ts +4 -0
  57. package/dist/types/file-dropzone/contexts.d.ts.map +1 -0
  58. package/dist/types/file-dropzone/file-dropzone.d.ts +82 -0
  59. package/dist/types/file-dropzone/file-dropzone.d.ts.map +1 -0
  60. package/dist/types/file-dropzone/file-info.d.ts +9 -0
  61. package/dist/types/file-dropzone/file-info.d.ts.map +1 -0
  62. package/dist/types/file-dropzone/index.d.ts +7 -0
  63. package/dist/types/file-dropzone/index.d.ts.map +1 -0
  64. package/dist/types/file-dropzone/types.d.ts +24 -0
  65. package/dist/types/file-dropzone/types.d.ts.map +1 -0
  66. package/dist/types/file-dropzone/utils.d.ts +8 -0
  67. package/dist/types/file-dropzone/utils.d.ts.map +1 -0
  68. package/dist/types/index.d.mts +1 -0
  69. package/dist/types/index.d.ts +1 -0
  70. package/dist/types/index.d.ts.map +1 -1
  71. package/package.json +5 -4
@@ -7,9 +7,9 @@ var $670gB$react = require('react');
7
7
  var utils = require('@react-aria/utils');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
- var ripple = require('../ripple/ripple.cjs');
11
10
  var useRipple = require('../ripple/use-ripple.cjs');
12
11
  var spinner = require('../spinner/spinner.cjs');
12
+ var ripple = require('../ripple/ripple.cjs');
13
13
 
14
14
  const Button = $670gB$react.forwardRef(
15
15
  ({
@@ -6,11 +6,11 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var date = require('@internationalized/date');
8
8
  var reactAriaComponents = require('react-aria-components');
9
- var select = require('../select/select.cjs');
10
- var selectItem = require('../select/select-item.cjs');
11
9
  var agnosticCalendarStateContext = require('./agnostic-calendar-state-context.cjs');
12
10
  var calendarStyleContext = require('./calendar-style-context.cjs');
13
11
  var useCalendarSelectors = require('./hooks/use-calendar-selectors.cjs');
12
+ var select = require('../select/select.cjs');
13
+ var selectItem = require('../select/select-item.cjs');
14
14
  var useCalendarI18n = require('./hooks/use-calendar-i18n.cjs');
15
15
 
16
16
  const CalendarMonthDaySelector = () => {
@@ -63,7 +63,8 @@ const CalendarMonthDaySelector = () => {
63
63
  list: slots.yearList({ className: classNames?.yearList }),
64
64
  selectedText: slots.selectorText({
65
65
  className: classNames?.selectorText
66
- })
66
+ }),
67
+ popover: "min-w-[8ch]"
67
68
  },
68
69
  selectedKey: state.visibleRange.start.year,
69
70
  "aria-label": formatMessage("selectYear"),
@@ -5,11 +5,11 @@
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
  var reactAriaComponents = require('react-aria-components');
7
7
  var ouiTheme = require('@opengovsg/oui-theme');
8
- var field = require('../field/field.cjs');
9
8
  var utils = require('../system/utils.cjs');
10
9
  var checkboxGroupStyleContext = require('./checkbox-group-style-context.cjs');
11
10
  var minus = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/minus.cjs');
12
11
  var check = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/check.cjs');
12
+ var field = require('../field/field.cjs');
13
13
 
14
14
  const Checkbox = ({
15
15
  classNames,
@@ -7,13 +7,13 @@ var $670gB$react = require('react');
7
7
  var reactAria = require('react-aria');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
- var field = require('../field/field.cjs');
11
- var popover = require('../popover/popover.cjs');
12
10
  var utils = require('../system/utils.cjs');
13
11
  var comboBoxVariantContext = require('./combo-box-variant-context.cjs');
12
+ var field = require('../field/field.cjs');
14
13
  var chevronUp = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/chevron-up.cjs');
15
14
  var chevronDown = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/chevron-down.cjs');
16
15
  var x = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/x.cjs');
16
+ var popover = require('../popover/popover.cjs');
17
17
 
18
18
  const calculateEstimatedRowHeight = (size) => {
19
19
  switch (size) {
@@ -6,12 +6,20 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
- var field = require('../field/field.cjs');
10
9
  var utils = require('../system/utils.cjs');
10
+ var field = require('../field/field.cjs');
11
11
 
12
12
  function DateField(originalProps) {
13
13
  const [
14
- { label, description, errorMessage, className, classNames, ...props },
14
+ {
15
+ inputProps,
16
+ label,
17
+ description,
18
+ errorMessage,
19
+ className,
20
+ classNames,
21
+ ...props
22
+ },
15
23
  variantProps
16
24
  ] = $670gB$react.useMemo(
17
25
  () => utils.mapPropsVariants(originalProps, ouiTheme.dateFieldStyles.variantKeys),
@@ -28,11 +36,11 @@ function DateField(originalProps) {
28
36
  isDisabled: variantProps.isDisabled,
29
37
  className: ouiTheme.composeTailwindRenderProps(
30
38
  className ?? classNames?.base,
31
- "flex flex-col gap-2"
39
+ "flex w-full flex-col gap-2"
32
40
  ),
33
41
  children: [
34
42
  label && /* @__PURE__ */ jsxRuntime.jsx(field.Label, { size: variantProps.size, className: classNames?.label, children: label }),
35
- /* @__PURE__ */ jsxRuntime.jsx(DateInput, { size: variantProps.size, className: styles }),
43
+ /* @__PURE__ */ jsxRuntime.jsx(DateInput, { size: variantProps.size, className: styles, ...inputProps }),
36
44
  description && /* @__PURE__ */ jsxRuntime.jsx(
37
45
  field.Description,
38
46
  {
@@ -67,6 +75,7 @@ function DateInput(originalProps) {
67
75
  className: ouiTheme.composeRenderProps(
68
76
  classNames?.segment,
69
77
  (className2, renderProps) => styles.segment({
78
+ isEditable: segment.isEditable,
70
79
  ...renderProps,
71
80
  className: className2
72
81
  })
@@ -6,14 +6,13 @@ var jsxRuntime = require('react/jsx-runtime');
6
6
  var $670gB$react = require('react');
7
7
  var reactAriaComponents = require('react-aria-components');
8
8
  var ouiTheme = require('@opengovsg/oui-theme');
9
- var calendar$1 = require('../calendar/calendar.cjs');
10
- require('@internationalized/date');
11
- var dateField = require('../date-field/date-field.cjs');
12
- var field = require('../field/field.cjs');
13
- var popover = require('../popover/popover.cjs');
14
9
  var utils = require('../system/utils.cjs');
10
+ var dateField = require('../date-field/date-field.cjs');
15
11
  var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
12
+ var calendar$1 = require('../calendar/calendar.cjs');
13
+ var field = require('../field/field.cjs');
16
14
  var button = require('../button/button.cjs');
15
+ var popover = require('../popover/popover.cjs');
17
16
 
18
17
  function DatePicker(originalProps) {
19
18
  const [
@@ -26,6 +25,7 @@ function DatePicker(originalProps) {
26
25
  calendarProps,
27
26
  popoverProps,
28
27
  calendarButtonProps,
28
+ selectorIcon,
29
29
  ...props
30
30
  },
31
31
  variantProps
@@ -64,20 +64,44 @@ function DatePicker(originalProps) {
64
64
  className: classNames?.calendarButton
65
65
  }),
66
66
  ...calendarButtonProps,
67
- children: /* @__PURE__ */ jsxRuntime.jsx(calendar.default, { "aria-hidden": true })
67
+ children: selectorIcon ?? /* @__PURE__ */ jsxRuntime.jsx(
68
+ calendar.default,
69
+ {
70
+ className: styles.selectorIcon({
71
+ className: classNames?.selectorIcon
72
+ }),
73
+ "aria-hidden": true
74
+ }
75
+ )
68
76
  }
69
77
  )
70
78
  ] }),
71
- /* @__PURE__ */ jsxRuntime.jsx(popover.Popover, { placement: "bottom end", ...popoverProps, children: /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Dialog, { className: styles.dialog({ className: classNames?.dialog }), children: /* @__PURE__ */ jsxRuntime.jsx(
72
- calendar$1.Calendar,
79
+ /* @__PURE__ */ jsxRuntime.jsx(
80
+ popover.Popover,
81
+ {
82
+ placement: "bottom end",
83
+ classNames: classNames?.popover,
84
+ ...popoverProps,
85
+ children: /* @__PURE__ */ jsxRuntime.jsx(reactAriaComponents.Dialog, { className: styles.dialog({ className: classNames?.dialog }), children: /* @__PURE__ */ jsxRuntime.jsx(
86
+ calendar$1.Calendar,
87
+ {
88
+ size: variantProps.size === "xs" ? "sm" : variantProps.size,
89
+ classNames: classNames?.calendar,
90
+ pageBehavior: props.pageBehavior,
91
+ ...calendarProps
92
+ }
93
+ ) })
94
+ }
95
+ ),
96
+ description && /* @__PURE__ */ jsxRuntime.jsx(
97
+ field.Description,
73
98
  {
74
- size: variantProps.size === "xs" ? "sm" : variantProps.size,
75
- classNames: classNames?.calendar,
76
- ...calendarProps
99
+ className: classNames?.description,
100
+ size: variantProps.size,
101
+ children: description
77
102
  }
78
- ) }) }),
79
- description && /* @__PURE__ */ jsxRuntime.jsx(field.Description, { size: variantProps.size, children: description }),
80
- /* @__PURE__ */ jsxRuntime.jsx(field.FieldError, { size: variantProps.size, children: errorMessage })
103
+ ),
104
+ /* @__PURE__ */ jsxRuntime.jsx(field.FieldError, { classNames: classNames?.error, size: variantProps.size, children: errorMessage })
81
105
  ]
82
106
  }
83
107
  );
@@ -7,13 +7,13 @@ var $670gB$react = require('react');
7
7
  var date = require('@internationalized/date');
8
8
  var reactAriaComponents = require('react-aria-components');
9
9
  var ouiTheme = require('@opengovsg/oui-theme');
10
- var dateField = require('../date-field/date-field.cjs');
11
- var field = require('../field/field.cjs');
12
- var popover = require('../popover/popover.cjs');
13
- var rangeCalendar = require('../range-calendar/range-calendar.cjs');
14
10
  var utils = require('../system/utils.cjs');
15
11
  var calendar = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/calendar.cjs');
12
+ var rangeCalendar = require('../range-calendar/range-calendar.cjs');
13
+ var field = require('../field/field.cjs');
14
+ var dateField = require('../date-field/date-field.cjs');
16
15
  var button = require('../button/button.cjs');
16
+ var popover = require('../popover/popover.cjs');
17
17
 
18
18
  function DateRangePicker(originalProps) {
19
19
  const [
@@ -3,6 +3,7 @@
3
3
  'use strict';
4
4
 
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
+ var $670gB$react = require('react');
6
7
  var reactAriaComponents = require('react-aria-components');
7
8
  var ouiTheme = require('@opengovsg/oui-theme');
8
9
  var circleAlert = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/circle-alert.cjs');
@@ -14,12 +15,19 @@ function Description({ size, className, ...props }) {
14
15
  return /* @__PURE__ */ jsxRuntime.jsx(
15
16
  reactAriaComponents.Text,
16
17
  {
17
- ...props,
18
18
  slot: "description",
19
+ ...props,
19
20
  className: ouiTheme.descriptionStyles({ className, size })
20
21
  }
21
22
  );
22
23
  }
24
+ function FieldErrorIcon({
25
+ size,
26
+ className
27
+ }) {
28
+ const styles = ouiTheme.fieldErrorStyles({ size });
29
+ return /* @__PURE__ */ jsxRuntime.jsx(circleAlert.default, { className: styles.icon({ className }) });
30
+ }
23
31
  function FieldError({
24
32
  children,
25
33
  className,
@@ -28,7 +36,15 @@ function FieldError({
28
36
  ...props
29
37
  }) {
30
38
  const styles = ouiTheme.fieldErrorStyles({ size });
31
- if (!children) return null;
39
+ const childrenFromProps = $670gB$react.useMemo(() => {
40
+ if (typeof children === "string") {
41
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
42
+ /* @__PURE__ */ jsxRuntime.jsx(FieldErrorIcon, { className: classNames?.icon, size }),
43
+ children
44
+ ] });
45
+ }
46
+ return children;
47
+ }, [children, classNames?.icon, size]);
32
48
  return /* @__PURE__ */ jsxRuntime.jsx(
33
49
  reactAriaComponents.FieldError,
34
50
  {
@@ -37,10 +53,7 @@ function FieldError({
37
53
  className ?? classNames?.text,
38
54
  (className2, renderProps) => styles.text({ ...renderProps, className: className2 })
39
55
  ),
40
- children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
41
- /* @__PURE__ */ jsxRuntime.jsx(circleAlert.default, { className: styles.icon({ className: classNames?.icon }) }),
42
- children
43
- ] })
56
+ children: childrenFromProps
44
57
  }
45
58
  );
46
59
  }
@@ -59,5 +72,6 @@ function FieldGroup(props) {
59
72
 
60
73
  exports.Description = Description;
61
74
  exports.FieldError = FieldError;
75
+ exports.FieldErrorIcon = FieldErrorIcon;
62
76
  exports.FieldGroup = FieldGroup;
63
77
  exports.Label = Label;
@@ -7,5 +7,6 @@ var field = require('./field.cjs');
7
7
 
8
8
  exports.Description = field.Description;
9
9
  exports.FieldError = field.FieldError;
10
+ exports.FieldErrorIcon = field.FieldErrorIcon;
10
11
  exports.FieldGroup = field.FieldGroup;
11
12
  exports.Label = field.Label;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ 'use strict';
3
+
4
+ var context = require('../system/react-utils/context.cjs');
5
+
6
+ const [FileDropzoneStateContext, useFileDropzoneStateContext] = context.createContext({
7
+ strict: true,
8
+ name: "FileDropzoneStateContext"
9
+ });
10
+ const [FileDropzoneStyleContext, useFileDropzoneStyleContext] = context.createContext({
11
+ strict: true,
12
+ name: "FileDropzoneStyleContext"
13
+ });
14
+
15
+ exports.FileDropzoneStateContext = FileDropzoneStateContext;
16
+ exports.FileDropzoneStyleContext = FileDropzoneStyleContext;
17
+ exports.useFileDropzoneStateContext = useFileDropzoneStateContext;
18
+ exports.useFileDropzoneStyleContext = useFileDropzoneStyleContext;
@@ -0,0 +1,311 @@
1
+ "use strict";
2
+ "use client";
3
+ 'use strict';
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var $670gB$react = require('react');
7
+ var form = require('@react-stately/form');
8
+ var reactAria = require('react-aria');
9
+ var reactAriaComponents = require('react-aria-components');
10
+ var reactDropzone = require('react-dropzone');
11
+ var ouiTheme = require('@opengovsg/oui-theme');
12
+ var utils = require('../system/utils.cjs');
13
+ var contexts = require('./contexts.cjs');
14
+ var fileInfo = require('./file-info.cjs');
15
+ var utils$1 = require('./utils.cjs');
16
+ var useControllableState = require('../hooks/use-controllable-state.cjs');
17
+ var upload = require('../node_modules/.pnpm/lucide-react@0.475.0_react@19.0.0/node_modules/lucide-react/dist/esm/icons/upload.cjs');
18
+ var field = require('../field/field.cjs');
19
+
20
+ const FileDropzone = (originalProps) => {
21
+ const [props, variantProps] = utils.mapPropsVariants(
22
+ originalProps,
23
+ ouiTheme.fileDropzoneStyles.variantKeys
24
+ );
25
+ const {
26
+ name,
27
+ allowedMimeTypes = [],
28
+ maxFileSize = Number.POSITIVE_INFINITY,
29
+ minFileSize = 0,
30
+ showFileSizeText = true,
31
+ maxFiles = 1,
32
+ isDisabled,
33
+ isReadOnly,
34
+ classNames,
35
+ itemClassNames,
36
+ validator,
37
+ showRejectedFiles,
38
+ onError,
39
+ errorMessage,
40
+ label,
41
+ description,
42
+ children,
43
+ hideDropzoneOnValue = maxFiles === 1,
44
+ imagePreview = "small"
45
+ } = props;
46
+ const [value, setValue] = useControllableState.useControllableState({
47
+ value: props.value,
48
+ defaultValue: props.defaultValue || [],
49
+ onChange: props.onChange
50
+ });
51
+ const [rejections, setRejections] = useControllableState.useControllableState({
52
+ value: props.rejections,
53
+ defaultValue: [],
54
+ onChange: props.onRejection
55
+ });
56
+ const validationState = form.useFormValidationState({
57
+ ...props,
58
+ value
59
+ });
60
+ const { isInvalid, validationErrors, validationDetails } = validationState.displayValidation;
61
+ const { labelProps, fieldProps, descriptionProps, errorMessageProps } = reactAria.useField({
62
+ ...props,
63
+ isInvalid,
64
+ errorMessage: props.errorMessage || validationErrors
65
+ });
66
+ const slots = ouiTheme.fileDropzoneStyles(variantProps);
67
+ const fileSizeTextId = reactAria.useId();
68
+ const formatError = $670gB$react.useCallback(
69
+ (error) => utils$1.formatErrorMessage(error, {
70
+ maxFileSize,
71
+ minFileSize,
72
+ maxFiles
73
+ }),
74
+ [maxFileSize, maxFiles, minFileSize]
75
+ );
76
+ const onDrop = $670gB$react.useCallback(
77
+ (acceptedFiles, fileRejections) => {
78
+ const files = acceptedFiles;
79
+ if (showRejectedFiles) {
80
+ const invalidFiles = fileRejections.map(({ file, errors }) => {
81
+ file.errors = errors;
82
+ return file;
83
+ });
84
+ setRejections(invalidFiles);
85
+ }
86
+ setValue(files);
87
+ if (onError && fileRejections.length > 0) {
88
+ const firstError = fileRejections[0].errors[0];
89
+ onError(formatError(firstError));
90
+ }
91
+ },
92
+ [formatError, onError, setRejections, setValue, showRejectedFiles]
93
+ );
94
+ const handleRemoveFile = $670gB$react.useCallback(
95
+ (fileName) => {
96
+ setValue((files) => files.filter((file) => file.name !== fileName));
97
+ },
98
+ [setValue]
99
+ );
100
+ const handleRemoveRejection = $670gB$react.useCallback(
101
+ (fileName) => {
102
+ setRejections(
103
+ (rejections2) => rejections2.filter((file) => file.name !== fileName)
104
+ );
105
+ },
106
+ [setRejections]
107
+ );
108
+ const { getInputProps, ...dropzoneState } = reactDropzone.useDropzone({
109
+ validator,
110
+ accept: allowedMimeTypes.reduce(
111
+ (acc, type) => ({ ...acc, [type]: [] }),
112
+ {}
113
+ ),
114
+ onError: (e) => onError?.(e.message),
115
+ onDrop,
116
+ disabled: isDisabled,
117
+ noDrag: isReadOnly,
118
+ // Prevent ref hijack when there is a label
119
+ noClick: true,
120
+ noKeyboard: true,
121
+ maxSize: maxFileSize,
122
+ minSize: minFileSize,
123
+ maxFiles,
124
+ multiple: maxFiles !== 1
125
+ });
126
+ const fileSizeText = $670gB$react.useMemo(() => {
127
+ const notDefaultMaxFileSize = maxFileSize !== Number.POSITIVE_INFINITY;
128
+ const notDefaultMinFileSize = minFileSize !== 0;
129
+ const shouldShow = showFileSizeText && (notDefaultMaxFileSize || notDefaultMinFileSize);
130
+ if (!shouldShow) return null;
131
+ if (notDefaultMaxFileSize && notDefaultMinFileSize) {
132
+ return `File size must be between ${utils$1.formatBytes(minFileSize, 2)} and ${utils$1.formatBytes(
133
+ maxFileSize,
134
+ 2
135
+ )}`;
136
+ }
137
+ if (notDefaultMaxFileSize) {
138
+ return `Maximum file size: ${utils$1.formatBytes(maxFileSize, 2)}`;
139
+ }
140
+ if (notDefaultMinFileSize) {
141
+ return `Minimum file size: ${utils$1.formatBytes(minFileSize, 2)}`;
142
+ }
143
+ return null;
144
+ }, [maxFileSize, minFileSize, showFileSizeText]);
145
+ const triggerFileSelector = $670gB$react.useCallback(() => {
146
+ if (isDisabled || isReadOnly) return;
147
+ dropzoneState.inputRef.current?.click();
148
+ }, [dropzoneState, isDisabled, isReadOnly]);
149
+ $670gB$react.useEffect(() => {
150
+ if (value.length <= maxFiles) {
151
+ let changed = false;
152
+ const newFiles = value.map((file) => {
153
+ if (file.errors?.some((e) => e.code === "too-many-files")) {
154
+ file.errors = file.errors.filter((e) => e.code !== "too-many-files");
155
+ changed = true;
156
+ }
157
+ return file;
158
+ });
159
+ if (changed) {
160
+ setValue(newFiles);
161
+ }
162
+ }
163
+ }, [maxFiles, setValue, value]);
164
+ const inputProps = $670gB$react.useMemo(() => {
165
+ const inputProps2 = { ...fieldProps, name };
166
+ if (fileSizeText) {
167
+ inputProps2["aria-describedby"] = inputProps2["aria-describedby"] ? `${inputProps2["aria-describedby"]} ${fileSizeTextId}` : fileSizeTextId;
168
+ }
169
+ return getInputProps(inputProps2);
170
+ }, [fieldProps, getInputProps, fileSizeTextId, name, fileSizeText]);
171
+ const showDropzone = $670gB$react.useMemo(() => {
172
+ if (hideDropzoneOnValue) {
173
+ return value.length < maxFiles;
174
+ }
175
+ return true;
176
+ }, [hideDropzoneOnValue, maxFiles, value.length]);
177
+ return /* @__PURE__ */ jsxRuntime.jsx(
178
+ reactAriaComponents.Provider,
179
+ {
180
+ values: [
181
+ [
182
+ contexts.FileDropzoneStyleContext,
183
+ { slots, classNames, itemClassNames, ...variantProps }
184
+ ],
185
+ [
186
+ contexts.FileDropzoneStateContext,
187
+ {
188
+ isDisabled,
189
+ isReadOnly,
190
+ maxFiles,
191
+ maxFileSize,
192
+ showDropzone,
193
+ files: value,
194
+ handleRemoveFile,
195
+ handleRemoveRejection,
196
+ formatError,
197
+ inputProps,
198
+ triggerFileSelector,
199
+ ...dropzoneState
200
+ }
201
+ ],
202
+ [reactAriaComponents.LabelContext, labelProps],
203
+ [
204
+ reactAriaComponents.GroupContext,
205
+ {
206
+ role: "presentation",
207
+ isInvalid,
208
+ isDisabled: props.isDisabled || false
209
+ }
210
+ ],
211
+ [
212
+ reactAriaComponents.TextContext,
213
+ {
214
+ slots: {
215
+ fileSize: {},
216
+ description: descriptionProps,
217
+ errorMessage: errorMessageProps
218
+ }
219
+ }
220
+ ],
221
+ [reactAriaComponents.FieldErrorContext, { isInvalid, validationErrors, validationDetails }]
222
+ ],
223
+ children: /* @__PURE__ */ jsxRuntime.jsxs(reactAriaComponents.Group, { className: slots.base({ className: classNames?.base }), children: [
224
+ label && /* @__PURE__ */ jsxRuntime.jsx(field.Label, { size: variantProps.size, children: label }),
225
+ showDropzone && /* @__PURE__ */ jsxRuntime.jsx(FileDropzoneDropzone, {}),
226
+ value.map((file) => {
227
+ if (typeof children === "function") {
228
+ return children({
229
+ file,
230
+ removeFile: () => handleRemoveFile(file.name)
231
+ });
232
+ }
233
+ return /* @__PURE__ */ jsxRuntime.jsx(fileInfo.FileInfo, { imagePreview, file }, file.name);
234
+ }),
235
+ rejections.length >= 1 && rejections.map((rj) => /* @__PURE__ */ jsxRuntime.jsx(fileInfo.FileInfo, { imagePreview, file: rj }, rj.name)),
236
+ fileSizeText && /* @__PURE__ */ jsxRuntime.jsx(
237
+ field.Description,
238
+ {
239
+ size: variantProps.size,
240
+ id: fileSizeTextId,
241
+ slot: "fileSize",
242
+ children: fileSizeText
243
+ }
244
+ ),
245
+ description && /* @__PURE__ */ jsxRuntime.jsx(field.Description, { size: variantProps.size, children: description }),
246
+ errorMessage && /* @__PURE__ */ jsxRuntime.jsx(field.FieldError, { size: variantProps.size, children: errorMessage })
247
+ ] })
248
+ }
249
+ );
250
+ };
251
+ const FileDropzoneDropzone = () => {
252
+ const {
253
+ maxFiles,
254
+ getRootProps,
255
+ inputProps,
256
+ triggerFileSelector,
257
+ isDisabled,
258
+ isDragActive
259
+ } = contexts.useFileDropzoneStateContext();
260
+ const { slots, classNames } = contexts.useFileDropzoneStyleContext();
261
+ return /* @__PURE__ */ jsxRuntime.jsxs(
262
+ "div",
263
+ {
264
+ ...getRootProps({
265
+ "aria-disabled": isDisabled,
266
+ className: slots.group({
267
+ className: classNames?.group
268
+ })
269
+ }),
270
+ tabIndex: isDisabled ? void 0 : 0,
271
+ onClick: triggerFileSelector,
272
+ onKeyDown: (e) => {
273
+ if (e.key === "Enter" || e.key === " ") {
274
+ e.preventDefault();
275
+ triggerFileSelector();
276
+ }
277
+ },
278
+ children: [
279
+ /* @__PURE__ */ jsxRuntime.jsx("input", { ...inputProps }),
280
+ /* @__PURE__ */ jsxRuntime.jsxs(
281
+ "div",
282
+ {
283
+ "data-dragging": ouiTheme.dataAttr(isDragActive),
284
+ className: slots.dropzone({ className: classNames?.dropzone }),
285
+ children: [
286
+ /* @__PURE__ */ jsxRuntime.jsx(upload.default, { className: slots.icon({ className: classNames?.icon }) }),
287
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: slots.text({ className: classNames?.text }), children: [
288
+ /* @__PURE__ */ jsxRuntime.jsxs(
289
+ "span",
290
+ {
291
+ className: slots.dropzoneHighlight({
292
+ className: classNames?.dropzoneHighlight
293
+ }),
294
+ children: [
295
+ "Choose ",
296
+ maxFiles === 1 ? `file` : `files`
297
+ ]
298
+ }
299
+ ),
300
+ " ",
301
+ "or drag and drop here"
302
+ ] })
303
+ ]
304
+ }
305
+ )
306
+ ]
307
+ }
308
+ );
309
+ };
310
+
311
+ exports.FileDropzone = FileDropzone;