@allxsmith/bestax-bulma 5.57.5 → 5.58.0

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 (51) hide show
  1. package/dist/esm/components/Avatars.js +2 -2
  2. package/dist/esm/components/Avatars.js.map +1 -1
  3. package/dist/esm/components/Badge.js +2 -2
  4. package/dist/esm/components/Badge.js.map +1 -1
  5. package/dist/esm/components/Pagination.js +2 -2
  6. package/dist/esm/components/Pagination.js.map +1 -1
  7. package/dist/esm/components/Steps.js +2 -2
  8. package/dist/esm/components/Steps.js.map +1 -1
  9. package/dist/esm/components/TreeView.js +7 -5
  10. package/dist/esm/components/TreeView.js.map +1 -1
  11. package/dist/esm/components/useDataTable.js +2 -2
  12. package/dist/esm/components/useDataTable.js.map +1 -1
  13. package/dist/esm/elements/NumberFormatter.js +42 -0
  14. package/dist/esm/elements/NumberFormatter.js.map +1 -0
  15. package/dist/esm/elements/RingProgress.js +2 -2
  16. package/dist/esm/elements/RingProgress.js.map +1 -1
  17. package/dist/esm/form/Dropzone.js +2 -2
  18. package/dist/esm/form/Dropzone.js.map +1 -1
  19. package/dist/esm/form/File.js +2 -2
  20. package/dist/esm/form/File.js.map +1 -1
  21. package/dist/esm/form/Rate.js +2 -2
  22. package/dist/esm/form/Rate.js.map +1 -1
  23. package/dist/esm/form/Slider.js +2 -2
  24. package/dist/esm/form/Slider.js.map +1 -1
  25. package/dist/esm/form/Taginput.js +2 -2
  26. package/dist/esm/form/Taginput.js.map +1 -1
  27. package/dist/esm/form/_colorInternals/pickerState.js +2 -2
  28. package/dist/esm/form/_colorInternals/pickerState.js.map +1 -1
  29. package/dist/esm/helpers/LocaleProvider.js +13 -6
  30. package/dist/esm/helpers/LocaleProvider.js.map +1 -1
  31. package/dist/esm/helpers/localeFormat.js +196 -36
  32. package/dist/esm/helpers/localeFormat.js.map +1 -1
  33. package/dist/esm/helpers/useTreeView.js +54 -20
  34. package/dist/esm/helpers/useTreeView.js.map +1 -1
  35. package/dist/index.cjs +312 -76
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.esm.js +2 -0
  38. package/dist/index.esm.js.map +1 -1
  39. package/dist/types/components/TreeView.d.ts +20 -11
  40. package/dist/types/elements/NumberFormatter.d.ts +62 -0
  41. package/dist/types/helpers/LocaleProvider.d.ts +7 -0
  42. package/dist/types/helpers/localeFormat.d.ts +30 -8
  43. package/dist/types/helpers/useTreeView.d.ts +12 -6
  44. package/dist/types/index.d.ts +3 -0
  45. package/dist/types-cjs/components/TreeView.d.ts +20 -11
  46. package/dist/types-cjs/elements/NumberFormatter.d.ts +62 -0
  47. package/dist/types-cjs/helpers/LocaleProvider.d.ts +7 -0
  48. package/dist/types-cjs/helpers/localeFormat.d.ts +30 -8
  49. package/dist/types-cjs/helpers/useTreeView.d.ts +12 -6
  50. package/dist/types-cjs/index.d.ts +3 -0
  51. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RingProgress.js","sources":["../../../src/elements/RingProgress.tsx"],"sourcesContent":["import React, { forwardRef, useEffect } from 'react';\nimport {\n classNames,\n prefixedClassNames,\n usePrefixedClassNames,\n} from '../helpers/classNames';\nimport { useClassPrefix } from '../helpers/Config';\nimport { useNumberFormat } from '../helpers/localeFormat';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n} from '../helpers/useBulmaClasses';\nimport { warnOnce } from '../helpers/devWarnings';\n\nconst validRingProgressColors = [\n 'primary',\n 'link',\n 'info',\n 'success',\n 'warning',\n 'danger',\n 'black',\n 'dark',\n 'light',\n 'white',\n] as const;\n/** The Bulma colors an arc takes, the ones `Progress` takes. */\nexport type RingProgressColor = (typeof validRingProgressColors)[number];\n\nconst validRingProgressSizes = ['small', 'medium', 'large'] as const;\n\n/** One colored part of a ring drawn in sections. */\nexport interface RingProgressSection {\n /** Its size, in the same units as the ring's `max`. */\n value: number;\n /** Its color. Without one, it takes the ring's. */\n color?: RingProgressColor;\n /** What it is, such as \"Photos\", read in the ring's name with its share. */\n label: string;\n}\n\n/**\n * Props for the RingProgress component. The helper props, the other\n * attributes and the `ref` land on its root `<div>`.\n *\n * @extraProp {React.Ref<HTMLDivElement>} [ref] - Ref forwarded to the root `<div>`.\n * @extraProp {string} [aria-labelledby] - The id of a visible heading that names the ring, in place of `label`. With `sections`, use `label`, since a name from here replaces the one that lists the values.\n * @extraProp {string} [aria-valuetext] - What a screen reader says for the value, such as \"7 of 10 tasks\". Without it, the value is read as a percentage.\n */\nexport interface RingProgressProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'color' | 'role'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Additional CSS classes to apply. */\n className?: string;\n /**\n * How far along it is, from 0 to `max`. Values outside that range are\n * drawn, and read, at the nearest end. Ignored with `sections`.\n */\n value?: number;\n /** The value that fills the ring. */\n max?: number;\n /**\n * Several values around one ring, in order clockwise from the top, each\n * with its own color and label. The ring is then an image whose name\n * writes them out, such as \"Storage: Documents 40%, Photos 15%\", since a\n * screen reader can't take several values from one element. Inside a\n * `LocaleProvider` with a `locale`, the shares are written as that locale\n * writes a percentage. A total over `max` fills the ring and stops.\n */\n sections?: RingProgressSection[];\n /**\n * What it shows, such as \"Upload\" or \"Storage\". It names the ring, so it's\n * read with the value. A development build warns when the ring has no\n * name.\n */\n label?: string;\n /**\n * A level within a range, such as storage used or a score, rather than a\n * task moving toward done: `role=\"meter\"` in place of `role=\"progressbar\"`.\n * Ignored with `sections`.\n */\n isMeter?: boolean;\n /** The arc's color, and the color of sections without one. */\n color?: RingProgressColor;\n /** The ring's size. */\n size?: (typeof validRingProgressSizes)[number];\n /** Rounds the ends of the arc. */\n isRounded?: boolean;\n /**\n * What sits in the middle of the ring, such as the value as text. It's\n * hidden from assistive tech, which reads the value from the ring itself,\n * so the value isn't heard twice. Say anything more, such as \"7 of 10\n * tasks\", in `aria-valuetext`.\n */\n children?: React.ReactNode;\n /** Text color helper. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n}\n\n/** An arc's place on the ring, in percent of the way round. */\ninterface Arc {\n start: number;\n length: number;\n color?: RingProgressColor;\n}\n\nconst clamp = (value: number, low: number, high: number) =>\n Math.min(Math.max(value, low), high);\n\n/**\n * The `RingProgress` component draws a value as a ring that fills as it grows, with anything you pass shown in the middle.\n *\n * It's a `progressbar` for a task moving toward done, or a `meter` with\n * `isMeter` for a level within a range, named by `label`. With `sections`\n * it draws several values around one ring and is an image whose name lists\n * them. It has no state for work with no value: that's `Loader`.\n *\n * @function\n * @param {RingProgressProps} props - Props for the RingProgress component.\n * @param {React.Ref<HTMLDivElement>} ref - Forwarded ref to the root `<div>`.\n * @returns {JSX.Element} The rendered ring.\n *\n * @example\n * <RingProgress value={72} label=\"Upload\" color=\"success\">\n * 72%\n * </RingProgress>\n */\nexport const RingProgress = forwardRef<HTMLDivElement, RingProgressProps>(\n (\n {\n className,\n textColor,\n bgColor,\n value,\n max = 100,\n sections,\n label,\n isMeter,\n color,\n size,\n isRounded,\n children,\n ...props\n },\n ref\n ) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor,\n backgroundColor: bgColor,\n ...props,\n });\n\n const named = Boolean(\n label || rest['aria-label'] || rest['aria-labelledby']\n );\n const mixed = sections !== undefined && value !== undefined;\n useEffect(() => {\n if (!named) {\n warnOnce(\n 'RingProgress:unnamed',\n '[bestax-bulma] <RingProgress> has no accessible name. Pass ' +\n 'label, so a screen reader can say what the ring shows.'\n );\n }\n if (mixed) {\n warnOnce(\n 'RingProgress:value-and-sections',\n '[bestax-bulma] <RingProgress> was given both value and sections. ' +\n 'It draws the sections and ignores value.'\n );\n }\n }, [named, mixed]);\n\n const total = max > 0 ? max : 100;\n const share = (part: number) => (clamp(part, 0, total) / total) * 100;\n\n // Each arc starts where the one before ended, and the last stops at the\n // top, so a total over max fills the ring and no more.\n const arcs: Arc[] = [];\n if (sections) {\n let start = 0;\n for (const section of sections) {\n const length = Math.min(share(section.value), 100 - start);\n arcs.push({ start, length, color: section.color });\n start += length;\n }\n } else {\n arcs.push({ start: 0, length: share(value ?? 0) });\n }\n\n const rootClass = usePrefixedClassNames('ring-progress', {\n [`is-${size}`]:\n !!size && (validRingProgressSizes as readonly string[]).includes(size),\n [`is-${color}`]:\n !!color &&\n (validRingProgressColors as readonly string[]).includes(color),\n 'is-rounded': !!isRounded,\n 'has-sections': !!sections,\n });\n const ringClass = usePrefixedClassNames('ring-progress-ring');\n const trackClass = usePrefixedClassNames('ring-progress-track');\n const arcClass = usePrefixedClassNames('ring-progress-arc');\n const labelClass = usePrefixedClassNames('ring-progress-label');\n // A section's color class, prefixed like the rest.\n const classPrefix = useClassPrefix();\n const formatNumber = useNumberFormat();\n const writeShare = (share: number) =>\n formatNumber\n ? formatNumber(share / 100, { style: 'percent' })\n : `${share}%`;\n\n const roleProps = sections\n ? {\n role: 'img',\n 'aria-label': [\n label || rest['aria-label'],\n sections\n .map(\n (section, i) =>\n `${section.label} ${writeShare(Math.round(arcs[i].length))}`\n )\n .join(', '),\n ]\n .filter(Boolean)\n .join(': '),\n }\n : {\n role: isMeter ? 'meter' : 'progressbar',\n 'aria-valuenow': clamp(value ?? 0, 0, total),\n 'aria-valuemin': 0,\n 'aria-valuemax': total,\n 'aria-label': label || rest['aria-label'],\n };\n\n return (\n <div\n ref={ref}\n className={classNames(rootClass, bulmaHelperClasses, className)}\n {...rest}\n {...roleProps}\n >\n <svg className={ringClass} viewBox=\"0 0 100 100\" aria-hidden=\"true\">\n <circle className={trackClass} cx=\"50\" cy=\"50\" r=\"42\" />\n {arcs.map(\n (arc, i) =>\n arc.length > 0 && (\n <circle\n key={i}\n className={classNames(\n arcClass,\n arc.color &&\n (validRingProgressColors as readonly string[]).includes(\n arc.color\n ) &&\n prefixedClassNames(classPrefix, `is-${arc.color}`)\n )}\n cx=\"50\"\n cy=\"50\"\n r=\"42\"\n pathLength={100}\n style={\n {\n '--ring-progress-length': arc.length,\n '--ring-progress-start': arc.start,\n } as React.CSSProperties\n }\n />\n )\n )}\n </svg>\n {children !== undefined && children !== null && (\n // The ring's value is already read from its role, and not every\n // browser keeps a meter's content out of the tree, so the middle\n // is for the eye only.\n <div className={labelClass} aria-hidden=\"true\">\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nRingProgress.displayName = 'RingProgress';\n\nexport default RingProgress;\n"],"names":["clamp","_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"RingProgress.js","sources":["../../../src/elements/RingProgress.tsx"],"sourcesContent":["import React, { forwardRef, useEffect } from 'react';\nimport {\n classNames,\n prefixedClassNames,\n usePrefixedClassNames,\n} from '../helpers/classNames';\nimport { useClassPrefix } from '../helpers/Config';\nimport { useScopedNumberFormat } from '../helpers/localeFormat';\nimport {\n useBulmaClasses,\n BulmaClassesProps,\n validColors,\n} from '../helpers/useBulmaClasses';\nimport { warnOnce } from '../helpers/devWarnings';\n\nconst validRingProgressColors = [\n 'primary',\n 'link',\n 'info',\n 'success',\n 'warning',\n 'danger',\n 'black',\n 'dark',\n 'light',\n 'white',\n] as const;\n/** The Bulma colors an arc takes, the ones `Progress` takes. */\nexport type RingProgressColor = (typeof validRingProgressColors)[number];\n\nconst validRingProgressSizes = ['small', 'medium', 'large'] as const;\n\n/** One colored part of a ring drawn in sections. */\nexport interface RingProgressSection {\n /** Its size, in the same units as the ring's `max`. */\n value: number;\n /** Its color. Without one, it takes the ring's. */\n color?: RingProgressColor;\n /** What it is, such as \"Photos\", read in the ring's name with its share. */\n label: string;\n}\n\n/**\n * Props for the RingProgress component. The helper props, the other\n * attributes and the `ref` land on its root `<div>`.\n *\n * @extraProp {React.Ref<HTMLDivElement>} [ref] - Ref forwarded to the root `<div>`.\n * @extraProp {string} [aria-labelledby] - The id of a visible heading that names the ring, in place of `label`. With `sections`, use `label`, since a name from here replaces the one that lists the values.\n * @extraProp {string} [aria-valuetext] - What a screen reader says for the value, such as \"7 of 10 tasks\". Without it, the value is read as a percentage.\n */\nexport interface RingProgressProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, 'color' | 'role'>,\n Omit<BulmaClassesProps, 'color' | 'backgroundColor'> {\n /** Additional CSS classes to apply. */\n className?: string;\n /**\n * How far along it is, from 0 to `max`. Values outside that range are\n * drawn, and read, at the nearest end. Ignored with `sections`.\n */\n value?: number;\n /** The value that fills the ring. */\n max?: number;\n /**\n * Several values around one ring, in order clockwise from the top, each\n * with its own color and label. The ring is then an image whose name\n * writes them out, such as \"Storage: Documents 40%, Photos 15%\", since a\n * screen reader can't take several values from one element. Inside a\n * `LocaleProvider` with a `locale`, the shares are written as that locale\n * writes a percentage. A total over `max` fills the ring and stops.\n */\n sections?: RingProgressSection[];\n /**\n * What it shows, such as \"Upload\" or \"Storage\". It names the ring, so it's\n * read with the value. A development build warns when the ring has no\n * name.\n */\n label?: string;\n /**\n * A level within a range, such as storage used or a score, rather than a\n * task moving toward done: `role=\"meter\"` in place of `role=\"progressbar\"`.\n * Ignored with `sections`.\n */\n isMeter?: boolean;\n /** The arc's color, and the color of sections without one. */\n color?: RingProgressColor;\n /** The ring's size. */\n size?: (typeof validRingProgressSizes)[number];\n /** Rounds the ends of the arc. */\n isRounded?: boolean;\n /**\n * What sits in the middle of the ring, such as the value as text. It's\n * hidden from assistive tech, which reads the value from the ring itself,\n * so the value isn't heard twice. Say anything more, such as \"7 of 10\n * tasks\", in `aria-valuetext`.\n */\n children?: React.ReactNode;\n /** Text color helper. */\n textColor?: (typeof validColors)[number] | 'inherit' | 'current';\n /** Background color helper. */\n bgColor?: (typeof validColors)[number] | 'inherit' | 'current';\n}\n\n/** An arc's place on the ring, in percent of the way round. */\ninterface Arc {\n start: number;\n length: number;\n color?: RingProgressColor;\n}\n\nconst clamp = (value: number, low: number, high: number) =>\n Math.min(Math.max(value, low), high);\n\n/**\n * The `RingProgress` component draws a value as a ring that fills as it grows, with anything you pass shown in the middle.\n *\n * It's a `progressbar` for a task moving toward done, or a `meter` with\n * `isMeter` for a level within a range, named by `label`. With `sections`\n * it draws several values around one ring and is an image whose name lists\n * them. It has no state for work with no value: that's `Loader`.\n *\n * @function\n * @param {RingProgressProps} props - Props for the RingProgress component.\n * @param {React.Ref<HTMLDivElement>} ref - Forwarded ref to the root `<div>`.\n * @returns {JSX.Element} The rendered ring.\n *\n * @example\n * <RingProgress value={72} label=\"Upload\" color=\"success\">\n * 72%\n * </RingProgress>\n */\nexport const RingProgress = forwardRef<HTMLDivElement, RingProgressProps>(\n (\n {\n className,\n textColor,\n bgColor,\n value,\n max = 100,\n sections,\n label,\n isMeter,\n color,\n size,\n isRounded,\n children,\n ...props\n },\n ref\n ) => {\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color: textColor,\n backgroundColor: bgColor,\n ...props,\n });\n\n const named = Boolean(\n label || rest['aria-label'] || rest['aria-labelledby']\n );\n const mixed = sections !== undefined && value !== undefined;\n useEffect(() => {\n if (!named) {\n warnOnce(\n 'RingProgress:unnamed',\n '[bestax-bulma] <RingProgress> has no accessible name. Pass ' +\n 'label, so a screen reader can say what the ring shows.'\n );\n }\n if (mixed) {\n warnOnce(\n 'RingProgress:value-and-sections',\n '[bestax-bulma] <RingProgress> was given both value and sections. ' +\n 'It draws the sections and ignores value.'\n );\n }\n }, [named, mixed]);\n\n const total = max > 0 ? max : 100;\n const share = (part: number) => (clamp(part, 0, total) / total) * 100;\n\n // Each arc starts where the one before ended, and the last stops at the\n // top, so a total over max fills the ring and no more.\n const arcs: Arc[] = [];\n if (sections) {\n let start = 0;\n for (const section of sections) {\n const length = Math.min(share(section.value), 100 - start);\n arcs.push({ start, length, color: section.color });\n start += length;\n }\n } else {\n arcs.push({ start: 0, length: share(value ?? 0) });\n }\n\n const rootClass = usePrefixedClassNames('ring-progress', {\n [`is-${size}`]:\n !!size && (validRingProgressSizes as readonly string[]).includes(size),\n [`is-${color}`]:\n !!color &&\n (validRingProgressColors as readonly string[]).includes(color),\n 'is-rounded': !!isRounded,\n 'has-sections': !!sections,\n });\n const ringClass = usePrefixedClassNames('ring-progress-ring');\n const trackClass = usePrefixedClassNames('ring-progress-track');\n const arcClass = usePrefixedClassNames('ring-progress-arc');\n const labelClass = usePrefixedClassNames('ring-progress-label');\n // A section's color class, prefixed like the rest.\n const classPrefix = useClassPrefix();\n const formatNumber = useScopedNumberFormat();\n const writeShare = (share: number) =>\n formatNumber\n ? formatNumber(share / 100, { style: 'percent' })\n : `${share}%`;\n\n const roleProps = sections\n ? {\n role: 'img',\n 'aria-label': [\n label || rest['aria-label'],\n sections\n .map(\n (section, i) =>\n `${section.label} ${writeShare(Math.round(arcs[i].length))}`\n )\n .join(', '),\n ]\n .filter(Boolean)\n .join(': '),\n }\n : {\n role: isMeter ? 'meter' : 'progressbar',\n 'aria-valuenow': clamp(value ?? 0, 0, total),\n 'aria-valuemin': 0,\n 'aria-valuemax': total,\n 'aria-label': label || rest['aria-label'],\n };\n\n return (\n <div\n ref={ref}\n className={classNames(rootClass, bulmaHelperClasses, className)}\n {...rest}\n {...roleProps}\n >\n <svg className={ringClass} viewBox=\"0 0 100 100\" aria-hidden=\"true\">\n <circle className={trackClass} cx=\"50\" cy=\"50\" r=\"42\" />\n {arcs.map(\n (arc, i) =>\n arc.length > 0 && (\n <circle\n key={i}\n className={classNames(\n arcClass,\n arc.color &&\n (validRingProgressColors as readonly string[]).includes(\n arc.color\n ) &&\n prefixedClassNames(classPrefix, `is-${arc.color}`)\n )}\n cx=\"50\"\n cy=\"50\"\n r=\"42\"\n pathLength={100}\n style={\n {\n '--ring-progress-length': arc.length,\n '--ring-progress-start': arc.start,\n } as React.CSSProperties\n }\n />\n )\n )}\n </svg>\n {children !== undefined && children !== null && (\n // The ring's value is already read from its role, and not every\n // browser keeps a meter's content out of the tree, so the middle\n // is for the eye only.\n <div className={labelClass} aria-hidden=\"true\">\n {children}\n </div>\n )}\n </div>\n );\n }\n);\n\nRingProgress.displayName = 'RingProgress';\n\nexport default RingProgress;\n"],"names":["clamp","_jsxs","_jsx"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { forwardRef, useState, useReducer, useRef, useCallback, useEffect, useId
5
5
  import { usePrefixedClassNames, classNames, prefixedClassNames } from '../helpers/classNames.js';
6
6
  import { useBulmaClasses } from '../helpers/useBulmaClasses.js';
7
7
  import { useConfig } from '../helpers/Config.js';
8
- import { useNumberFormat } from '../helpers/localeFormat.js';
8
+ import { useScopedNumberFormat } from '../helpers/localeFormat.js';
9
9
  import { StatusRegion } from '../helpers/statusRegion.js';
10
10
  import { warnOnce } from '../helpers/devWarnings.js';
11
11
  import { Delete } from '../elements/Delete.js';
@@ -190,7 +190,7 @@ label, labelSize, labelProps, horizontal, message, messageColor, fieldClassName,
190
190
  node;
191
191
  }
192
192
  }, [ref]);
193
- const formatNumber = useNumberFormat();
193
+ const formatNumber = useScopedNumberFormat();
194
194
  const tokens = acceptTokens(accept);
195
195
  const sizeText = (bytes) => formatFileSize(bytes, formatNumber);
196
196
  const countText = (count) => formatNumber ? formatNumber(count) : String(count);
@@ -1 +1 @@
1
- {"version":3,"file":"Dropzone.js","sources":["../../../src/form/Dropzone.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport {\n classNames,\n usePrefixedClassNames,\n prefixedClassNames,\n} from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { useConfig } from '../helpers/Config';\nimport { useNumberFormat, NumberFormatter } from '../helpers/localeFormat';\nimport { StatusRegion } from '../helpers/statusRegion';\nimport { warnOnce } from '../helpers/devWarnings';\nimport { Delete } from '../elements/Delete';\nimport {\n useInsideField,\n useInsideControl,\n rendersOwnField,\n useFieldsetDisabled,\n} from './FormContext';\nimport { Field } from './Field';\nimport { FormFieldProps } from './fieldProps';\nimport { useAutoLabelId } from './useAutoLabelId';\n\n/** Why a Dropzone refused a file. */\nexport type DropzoneRejectionCode =\n 'file-invalid-type' | 'file-too-large' | 'too-many-files';\n\n/** A file a Dropzone refused, and why. */\nexport interface DropzoneRejection {\n /** The file. */\n file: File;\n /**\n * Why it was refused: `file-invalid-type` when `accept` doesn't take it, or\n * it's a folder; `file-too-large` when it's over `maxSize`; `too-many-files`\n * when the list is full.\n */\n code: DropzoneRejectionCode;\n}\n\n/**\n * Props for the Dropzone component.\n *\n * @helperProps Helper props go on the `.dropzone` root `<div>`, with\n * `className`. The other attributes go on the `<input>`.\n * @extraProp {string} [accept] - File types it takes, as the native attribute writes them (`.pdf`, `image/*`, `application/pdf`). The picker offers them, and Dropzone checks every pick, drop and paste against them by the same rules, since browsers don't check a dropped file. It goes by a file's name and type, not its contents.\n * @extraProp {boolean} [multiple=false] - Takes several files, and each pick, drop or paste adds to the list. Without it, a new file replaces the one chosen.\n * @extraProp {string} [name] - The files' name in the form's data. The input holds the chosen files, so a plain form submit, `FormData` and React 19 actions all carry them.\n * @extraProp {boolean} [required=false] - The browser's own check: a form won't submit with no file chosen.\n * @extraProp {boolean} [disabled=false] - Disables the input, hides the remove buttons and takes no drops. A disabled `Fieldset` around it does the same.\n * @extraProp {(event: React.ChangeEvent<HTMLInputElement>) => void} [onChange] - Called on the input's `change`, after each pick, drop, paste or removal that changes the files, with `event.target.files` holding the new list.\n * @extraProp {React.Ref<HTMLInputElement>} [ref] - Forwarded to the `<input>`, so `ref.current.showPicker()` opens the picker from a button of your own. A script that writes the input through it, such as `value = ''` to clear it or a form library setting `files`, changes what the input holds and what the next pick, drop or paste adds to, but no event reports the write, so the list shows it only from the next change. To clear the list at once, reset the form, or control it with `files` and set that to `[]`.\n */\nexport interface DropzoneProps\n extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'color' | 'type' | 'children' | 'value' | 'defaultValue'\n >,\n Omit<BulmaClassesProps, 'color'>,\n FormFieldProps {\n /** Field label, rendered above the zone. It names the input along with the zone's own text, through `htmlFor` (your `id` when you pass one). Inside an outer `Field` it's dropped, and that `Field`'s label names the input. */\n label?: React.ReactNode;\n /** Props for the label element. An explicit `htmlFor` here overrides the automatic association (no id is generated then). */\n labelProps?: React.LabelHTMLAttributes<HTMLLabelElement> & {\n [key: string]: unknown;\n };\n /** Bulma color modifier for the zone, as `File` takes it. */\n color?:\n | 'primary'\n | 'link'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'black'\n | 'dark'\n | 'light'\n | 'white';\n /** Size modifier for the zone. */\n size?: 'small' | 'medium' | 'large';\n /**\n * The zone's text. It's the input's accessible name, so keep it short, and\n * put details such as \"PDF up to 5 MB\" in `hint`. Default: \"Choose or drop\n * a file\", or \"Choose or drop files\" with `multiple`.\n */\n buttonLabel?: React.ReactNode;\n /**\n * An icon above the zone's text. It sits inside the `<label>` that names\n * the input, so leave an `Icon` here unnamed (`<Icon name=\"upload\" />`).\n */\n icon?: React.ReactNode;\n /**\n * A line under the zone that describes the input through\n * `aria-describedby`, such as \"PDF up to 5 MB\".\n */\n hint?: React.ReactNode;\n /** The largest file it takes, in bytes. A bigger one is refused with `file-too-large`. */\n maxSize?: number;\n /**\n * With `multiple`, how many files the list holds at most. A drop that would\n * go over adds files up to the limit and refuses the rest with\n * `too-many-files`.\n */\n maxFiles?: number;\n /**\n * The chosen files, to control the list. The input and the list follow it,\n * and a change you don't take through `onFilesChange` is undone. Setting it\n * to `[]` clears both.\n */\n files?: File[];\n /** Called with the whole list of chosen files each time it changes. */\n onFilesChange?: (files: File[]) => void;\n /** Called with the files a pick, drop or paste refused, and why. */\n onReject?: (rejections: DropzoneRejection[]) => void;\n /**\n * Shows the chosen files under the zone, each with its size and a remove\n * button. Turn it off to show them your own way from `onFilesChange`. The\n * refusals still show.\n */\n showFileList?: boolean;\n /** Takes files pasted while the input has focus, through the same checks as a drop. */\n allowPaste?: boolean;\n /**\n * While it's on the page, stops the browser opening a file dropped outside\n * any drop target, which would leave the page. Drops on other file inputs\n * and on editable fields are left alone.\n */\n preventDocumentDrop?: boolean;\n /** Names a file's remove button, for localization. Default: `` `Remove ${file.name}` ``. */\n removeLabel?: (file: File) => string;\n /**\n * The text shown and announced for a refused file, for localization.\n * Default: the file's name and the reason, such as \"photo.png: only PDF\n * files\".\n */\n rejectionMessage?: (rejection: DropzoneRejection) => string;\n /**\n * What's announced when files are added, for localization. Default: the\n * file's name and \"added\", or a count (\"2 files added\").\n */\n addedMessage?: (files: File[]) => string;\n /** What's announced when a file is removed, for localization. Default: `` `${file.name} removed` ``. */\n removedMessage?: (file: File) => string;\n /**\n * Help or validation message under the Dropzone. It describes the input\n * through `aria-describedby`, after the hint and any refusals.\n */\n message?: React.ReactNode;\n /** Additional CSS classes for the root. */\n className?: string;\n}\n\n/** A file on its way in, and whether it's really a folder. */\ninterface Incoming {\n file: File;\n folder: boolean;\n}\n\n/** A refusal, with whether the file was a folder, which the default message says. */\ninterface Refusal extends DropzoneRejection {\n folder: boolean;\n}\n\n/** Something the status region says, with an id that's new each time. */\ninterface Announcement {\n id: string;\n text: string;\n}\n\nconst noFiles: File[] = [];\nconst noRefusals: Refusal[] = [];\nconst noAnnouncements: Announcement[] = [];\n\nconst describeAnnouncement = (announcement: Announcement) => announcement.text;\n\n/**\n * The tokens of an `accept` attribute that HTML recognizes, lowercased: an\n * extension (`.pdf`), a wildcard (`image/*`) or a MIME type. Others are\n * ignored, as browsers ignore them.\n */\nconst acceptTokens = (accept: string | undefined): string[] =>\n (accept ?? '')\n .split(',')\n .map(token => token.trim().toLowerCase())\n .filter(\n token => token.length > 1 && (token[0] === '.' || token.includes('/'))\n );\n\n/** Whether `accept`'s tokens take a file with this name and type. */\nconst accepts = (tokens: string[], name: string, type: string): boolean => {\n if (tokens.length === 0) return true;\n const lowerName = name.toLowerCase();\n const lowerType = type.toLowerCase();\n return tokens.some(token =>\n token[0] === '.'\n ? lowerName.endsWith(token)\n : token.endsWith('/*')\n ? lowerType.startsWith(token.slice(0, -1))\n : lowerType === token\n );\n};\n\n/** Whether a drag or a clipboard carries files. */\nconst carriesFiles = (data: DataTransfer | null): data is DataTransfer =>\n !!data && Array.from(data.types ?? []).includes('Files');\n\n/** The files a drop or a paste brings, with folders marked. */\nconst incomingFrom = (data: DataTransfer | null): Incoming[] => {\n if (!data) return [];\n const items = Array.from(data.items ?? []).filter(\n item => item.kind === 'file'\n );\n if (items.length === 0) {\n return Array.from(data.files ?? [], file => ({ file, folder: false }));\n }\n const incoming: Incoming[] = [];\n for (const item of items) {\n const file = item.getAsFile();\n if (!file) continue;\n const entry = item.webkitGetAsEntry?.();\n incoming.push({ file, folder: !!entry?.isDirectory });\n }\n return incoming;\n};\n\n/** The same file: one object, or one picked again with the same details. */\nconst sameFile = (a: File, b: File): boolean =>\n a === b ||\n (a.name === b.name && a.size === b.size && a.lastModified === b.lastModified);\n\n/** Whether two lists hold the same files in the same order. */\nconst sameFiles = (\n a: ArrayLike<File> | null | undefined,\n b: readonly File[]\n): boolean =>\n !!a && a.length === b.length && b.every((file, i) => sameFile(a[i], file));\n\n/**\n * Writes files to a file input, through a `DataTransfer`, the one way script\n * can build a `FileList`. Where there's no `DataTransfer` the input is left as\n * it is.\n */\nconst writeFiles = (input: HTMLInputElement, files: readonly File[]) => {\n if (typeof DataTransfer !== 'function') return;\n const transfer = new DataTransfer();\n for (const file of files) transfer.items.add(file);\n input.files = transfer.files;\n};\n\n/** The units a file size is written in, largest first. */\nconst sizeUnits = [\n ['gigabyte', 1e9, 'GB'],\n ['megabyte', 1e6, 'MB'],\n ['kilobyte', 1e3, 'kB'],\n] as const;\n\n/**\n * A file size for display, in decimal units (\"1.2 MB\"), in the locale of a\n * `LocaleProvider` around it, or as English writes it outside one.\n */\nconst formatFileSize = (\n bytes: number,\n formatNumber: NumberFormatter | null\n): string => {\n for (const [unit, factor, symbol] of sizeUnits) {\n if (bytes >= factor) {\n const value = bytes / factor;\n return formatNumber\n ? formatNumber(value, {\n style: 'unit',\n unit,\n unitDisplay: 'short',\n maximumFractionDigits: 1,\n })\n : `${Math.round(value * 10) / 10} ${symbol}`;\n }\n }\n return formatNumber\n ? formatNumber(bytes, { style: 'unit', unit: 'byte', unitDisplay: 'long' })\n : `${bytes} ${bytes === 1 ? 'byte' : 'bytes'}`;\n};\n\n/** A word for each kind of file `accept` names: \"PDF\", \"image\". */\nconst typeNames = (tokens: string[]): string[] => {\n const names: string[] = [];\n for (const token of tokens) {\n let name = token;\n if (token[0] === '.') {\n name = token.slice(1).toUpperCase();\n } else {\n const [type, subtype] = token.split('/');\n const core = subtype.split('+')[0];\n if (subtype === '*') name = type;\n else if (core === 'plain') name = 'text';\n else if (/^[a-z0-9]+$/.test(core)) name = core.toUpperCase();\n }\n if (!names.includes(name)) names.push(name);\n }\n return names;\n};\n\n/** \"A\", \"A or B\", \"A, B, or C\". */\nconst orList = (items: string[]): string =>\n items.length <= 2\n ? items.join(' or ')\n : `${items.slice(0, -1).join(', ')}, or ${items[items.length - 1]}`;\n\n/**\n * The `Dropzone` component is an area to drop files on or click to pick\n * them, which checks each file and lists the chosen ones with a way to remove\n * each.\n *\n * It's Bulma's boxed, full-width file widget with the real\n * `<input type=\"file\">` lying over it, so the input is the one tab stop, the\n * click target and the drop target, and Enter and Space open the picker. The\n * input holds the chosen files: a pick, drop or paste that passes the checks\n * is written to it, so a form submits the files under `name`. It doesn't\n * upload anything.\n *\n * @function\n * @param {DropzoneProps} props - Props for the Dropzone component.\n * @returns {JSX.Element} The rendered dropzone.\n *\n * @example\n * <Dropzone\n * label=\"CV\"\n * name=\"cv\"\n * accept=\".pdf,application/pdf\"\n * maxSize={5_000_000}\n * hint=\"PDF up to 5 MB\"\n * />\n */\nexport const Dropzone = forwardRef<HTMLInputElement, DropzoneProps>(\n (\n {\n // Field props\n label,\n labelSize,\n labelProps,\n horizontal,\n message,\n messageColor,\n fieldClassName,\n color,\n size,\n buttonLabel,\n icon,\n hint,\n maxSize,\n maxFiles,\n files: filesProp,\n onFilesChange,\n onReject,\n showFileList = true,\n allowPaste = true,\n preventDocumentDrop = true,\n removeLabel,\n rejectionMessage,\n addedMessage,\n removedMessage,\n className,\n accept,\n multiple,\n disabled: disabledProp,\n onChange,\n onClick,\n onDragEnter,\n onDragOver,\n onDragLeave,\n onDrop,\n onPaste,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) => {\n const disabled = useFieldsetDisabled(disabledProp);\n const controlled = filesProp !== undefined;\n const [ownFiles, setOwnFiles] = useState<File[]>(noFiles);\n const files = filesProp ?? ownFiles;\n // A render the controlled list needs after a change, so that one the app\n // didn't take is undone.\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n const [refusals, setRefusals] = useState<Refusal[]>(noRefusals);\n const [drag, setDrag] = useState<'over' | 'reject' | null>(null);\n const [announcements, setAnnouncements] =\n useState<Announcement[]>(noAnnouncements);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n // Set while Dropzone dispatches the input's own events, so its change\n // handler hands them on rather than reading them as a pick.\n const dispatchingRef = useRef(false);\n // The row a removal emptied, whose neighbour takes focus.\n const removedRowRef = useRef<number | null>(null);\n const announcedRef = useRef(0);\n // What the input held when it was last clicked (Enter and Space click it\n // too), which a pick adds to: by the time the pick's change arrives, the\n // browser has replaced the input's files with the picked ones.\n const pickBaseRef = useRef<File[] | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n node;\n }\n },\n [ref]\n );\n\n const formatNumber = useNumberFormat();\n const tokens = acceptTokens(accept);\n const sizeText = (bytes: number) => formatFileSize(bytes, formatNumber);\n const countText = (count: number) =>\n formatNumber ? formatNumber(count) : String(count);\n\n // The files a pick, drop or paste builds on, and a removal takes one from.\n // Controlled, that's `files`. Uncontrolled, it's the input itself rather\n // than the list: a script can rewrite the input through the ref, emptying\n // it with `value = ''` or setting its `files`, and no event reports that,\n // so the list catches up only at the next change. Where there's no\n // DataTransfer to write the input with, the list is all there is.\n const current = (): File[] =>\n controlled || typeof DataTransfer !== 'function'\n ? files\n : Array.from((inputRef.current as HTMLInputElement).files as FileList);\n\n const messageFor = (refusal: Refusal): string => {\n const { file, code } = refusal;\n if (rejectionMessage) return rejectionMessage({ file, code });\n if (code === 'file-too-large') {\n return `${file.name}: larger than ${sizeText(maxSize as number)}`;\n }\n if (code === 'too-many-files') {\n const most = multiple ? (maxFiles as number) : 1;\n return `${file.name}: only ${most === 1 ? 'one file' : `${countText(most)} files`}`;\n }\n return refusal.folder\n ? `${file.name}: folders can't be added`\n : `${file.name}: only ${orList(typeNames(tokens))} files`;\n };\n\n const announce = (texts: string[]) => {\n if (texts.length === 0) return;\n const batch = ++announcedRef.current;\n setAnnouncements(texts.map((text, i) => ({ id: `${batch}-${i}`, text })));\n };\n\n /**\n * Makes `next` the chosen files: writes them to the input, and when they\n * differ from the list, dispatches the input's `input` and `change` and\n * reports the new list.\n */\n const commit = (next: File[]) => {\n pickBaseRef.current = null;\n const input = inputRef.current as HTMLInputElement;\n if (!sameFiles(input.files, next)) writeFiles(input, next);\n if (sameFiles(files, next)) return;\n if (controlled) rerender();\n else setOwnFiles(next);\n onFilesChange?.(next);\n dispatchingRef.current = true;\n try {\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n } finally {\n dispatchingRef.current = false;\n }\n };\n\n /** Checks the files a pick, drop or paste brings, and takes those that pass. */\n const take = (incoming: Incoming[], base: File[] = current()) => {\n const kept = multiple ? base : noFiles;\n const room = multiple ? (maxFiles ?? Infinity) - kept.length : 1;\n const added: File[] = [];\n const refused: Refusal[] = [];\n for (const { file, folder } of incoming) {\n const code: DropzoneRejectionCode | null =\n folder || !accepts(tokens, file.name, file.type)\n ? 'file-invalid-type'\n : maxSize !== undefined && file.size > maxSize\n ? 'file-too-large'\n : null;\n if (code) {\n refused.push({ file, code, folder });\n } else if (\n multiple &&\n [...kept, ...added].some(f => sameFile(f, file))\n ) {\n // Already in the list: nothing to add, and nothing wrong.\n } else if (added.length >= room) {\n refused.push({ file, code: 'too-many-files', folder });\n } else {\n added.push(file);\n }\n }\n setRefusals(refused.length > 0 ? refused : noRefusals);\n if (refused.length > 0) {\n onReject?.(refused.map(({ file, code }) => ({ file, code })));\n }\n commit(added.length > 0 ? [...kept, ...added] : base);\n const addedText =\n added.length === 0\n ? []\n : [\n addedMessage\n ? addedMessage(added)\n : added.length === 1\n ? `${added[0].name} added`\n : `${countText(added.length)} files added`,\n ];\n announce([...addedText, ...refused.map(messageFor)]);\n };\n\n const remove = (index: number) => {\n const file = files[index];\n removedRowRef.current = index;\n commit(current().filter(held => !sameFile(held, file)));\n announce([\n removedMessage ? removedMessage(file) : `${file.name} removed`,\n ]);\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (dispatchingRef.current) {\n onChange?.(event);\n return;\n }\n // A pick: the browser has put the picked files in the input. They're\n // added to what it held when it was clicked, or, for a picker opened\n // with showPicker(), which clicks nothing, to the list. With none (a\n // cancelled pick, in a browser that clears it), that stays.\n const base = pickBaseRef.current ?? files;\n const picked = Array.from(event.target.files ?? []);\n if (picked.length === 0) commit(base);\n else\n take(\n picked.map(file => ({ file, folder: false })),\n base\n );\n };\n\n const handleClick = (event: React.MouseEvent<HTMLInputElement>) => {\n onClick?.(event);\n pickBaseRef.current = current();\n };\n\n // While files are dragged over the input it's cancelled, which makes the\n // input the drop target and keeps the browser's own drop from running.\n // Disabled, it refuses the drop, so the browser doesn't open the file.\n const handleDragOver = (event: React.DragEvent<HTMLInputElement>) => {\n (event.type === 'dragenter' ? onDragEnter : onDragOver)?.(event);\n if (!carriesFiles(event.dataTransfer)) return;\n event.preventDefault();\n if (disabled) {\n event.dataTransfer.dropEffect = 'none';\n return;\n }\n event.dataTransfer.dropEffect = 'copy';\n // Only the dragged files' types can be read, so a file is known to be\n // refused only when `accept` names no extension and its type is known.\n const room = multiple ? (maxFiles ?? Infinity) - current().length : 1;\n const types = Array.from(event.dataTransfer.items ?? [])\n .filter(item => item.kind === 'file')\n .map(item => item.type);\n const refused =\n room <= 0 ||\n (types.length > 0 &&\n tokens.length > 0 &&\n !tokens.some(token => token[0] === '.') &&\n types.every(type => type !== '' && !accepts(tokens, '', type)));\n setDrag(refused ? 'reject' : 'over');\n };\n\n const handleDragLeave = (event: React.DragEvent<HTMLInputElement>) => {\n onDragLeave?.(event);\n setDrag(null);\n };\n\n const handleDrop = (event: React.DragEvent<HTMLInputElement>) => {\n onDrop?.(event);\n setDrag(null);\n if (!carriesFiles(event.dataTransfer)) return;\n event.preventDefault();\n if (!disabled) take(incomingFrom(event.dataTransfer));\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n onPaste?.(event);\n if (!allowPaste || disabled) return;\n const incoming = incomingFrom(event.clipboardData);\n if (incoming.length === 0) return;\n event.preventDefault();\n take(incoming);\n };\n\n // A controlled list: the input follows `files`, and a change the app\n // didn't take is undone.\n useEffect(() => {\n const input = inputRef.current;\n if (controlled && input && !sameFiles(input.files, files)) {\n writeFiles(input, files);\n }\n });\n\n // After a removal, focus goes to the remove button that took the removed\n // one's place, else the one before, else the input.\n useEffect(() => {\n const row = removedRowRef.current;\n if (row === null) return;\n removedRowRef.current = null;\n const buttons = listRef.current?.querySelectorAll('button') ?? [];\n const next = buttons[Math.min(row, buttons.length - 1)];\n (next ?? inputRef.current)?.focus();\n });\n\n // A reset of the input's form empties the input, so the list and the\n // refusals go too. The reset event fires before the form resets, and a\n // listener after this one can still cancel it, so the list is cleared a\n // task later, and only if the reset went ahead.\n const latestRef = useRef({ files, controlled, onFilesChange });\n useEffect(() => {\n latestRef.current = { files, controlled, onFilesChange };\n });\n const formAttribute = props.form;\n useEffect(() => {\n const form = inputRef.current?.form;\n if (!form) return undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onReset = (event: Event) => {\n timer = setTimeout(() => {\n if (event.defaultPrevented) return;\n const latest = latestRef.current;\n pickBaseRef.current = null;\n setRefusals(noRefusals);\n if (latest.files.length === 0) return;\n if (latest.controlled) rerender();\n else setOwnFiles(noFiles);\n latest.onFilesChange?.(noFiles);\n });\n };\n form.addEventListener('reset', onReset);\n return () => {\n form.removeEventListener('reset', onReset);\n clearTimeout(timer);\n };\n }, [formAttribute]);\n\n // A file dropped just outside the zone would open in the tab. The guard\n // cancels a file drag anywhere nothing else takes it, leaving alone\n // enabled file inputs and editable fields, which take drops of their own,\n // and drops something else already handled. It reads the event's real\n // target, so a file input inside a shadow root is left alone too.\n useEffect(() => {\n if (!preventDocumentDrop) return undefined;\n const guard = (event: DragEvent) => {\n if (event.defaultPrevented || !carriesFiles(event.dataTransfer)) {\n return;\n }\n const target = event.composedPath()[0];\n if (\n target instanceof Element &&\n target.closest(\n 'input[type=\"file\"]:not(:disabled), textarea, [contenteditable]:not([contenteditable=\"false\"])'\n )\n ) {\n return;\n }\n event.preventDefault();\n if (event.type === 'dragover') event.dataTransfer.dropEffect = 'none';\n };\n document.addEventListener('dragover', guard);\n document.addEventListener('drop', guard);\n return () => {\n document.removeEventListener('dragover', guard);\n document.removeEventListener('drop', guard);\n };\n }, [preventDocumentDrop]);\n\n const warnsMaxFiles = maxFiles !== undefined && !multiple;\n useEffect(() => {\n if (warnsMaxFiles) {\n warnOnce(\n 'Dropzone:maxFiles-without-multiple',\n '[bestax-bulma] <Dropzone maxFiles> takes effect only with ' +\n 'multiple. Without it, each new file replaces the one chosen.'\n );\n }\n }, [warnsMaxFiles]);\n\n const insideField = useInsideField();\n const insideControl = useInsideControl();\n const ownField = rendersOwnField('Dropzone', {\n insideField,\n insideControl,\n label,\n message,\n horizontal,\n fieldClassName,\n });\n const { controlId, fieldLabelProps } = useAutoLabelId({\n label,\n id: props.id,\n labelProps,\n rendersLabel: ownField,\n });\n const { classPrefix } = useConfig();\n const pcn = (...args: Parameters<typeof classNames>) =>\n prefixedClassNames(classPrefix, ...args);\n // The input takes `controlId`, so `id` stays out of the spread, where an\n // undefined `id` key would wipe the id the label points at.\n const { id: _id, ...inputProps } = props;\n const { bulmaHelperClasses, rest } = useBulmaClasses(inputProps);\n\n const baseId = useId();\n const hintId = `${baseId}-hint`;\n const refusalsId = `${baseId}-refusals`;\n const messageId = `${baseId}-message`;\n const describedBy =\n [\n ariaDescribedBy,\n hint ? hintId : undefined,\n refusals.length > 0 ? refusalsId : undefined,\n message ? messageId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const rootClass = usePrefixedClassNames('dropzone', {\n 'is-dragover': drag === 'over',\n 'is-drag-reject': drag === 'reject',\n 'is-disabled': disabled,\n });\n const zoneClass = usePrefixedClassNames(\n 'file',\n 'is-boxed',\n 'is-fullwidth',\n {\n [`is-${color}`]: !!color,\n [`is-${size}`]: !!size,\n }\n );\n const helpClass = usePrefixedClassNames('help', {\n [`is-${messageColor}`]: !!messageColor,\n });\n\n // Each row's key, from the file's details, which the list keeps unique.\n const seen = new Map<string, number>();\n const keyOf = (file: File) => {\n const key = `${file.name}:${file.size}:${file.lastModified}`;\n const count = seen.get(key) ?? 0;\n seen.set(key, count + 1);\n return count === 0 ? key : `${key}:${count}`;\n };\n\n const dropzoneElement = (\n <div className={classNames(rootClass, bulmaHelperClasses, className)}>\n <div className={zoneClass}>\n <label className={pcn('file-label')}>\n <input\n {...rest}\n ref={setInputRef}\n className={pcn('file-input')}\n type=\"file\"\n id={controlId}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n aria-describedby={describedBy}\n onChange={handleChange}\n onClick={handleClick}\n onDragEnter={handleDragOver}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onPaste={handlePaste}\n />\n <span className={pcn('file-cta')}>\n {icon && <span className={pcn('file-icon')}>{icon}</span>}\n <span className={pcn('file-label')}>\n {buttonLabel ||\n (multiple ? 'Choose or drop files' : 'Choose or drop a file')}\n </span>\n </span>\n </label>\n </div>\n {hint && (\n <p id={hintId} className={pcn('help', 'dropzone-hint')}>\n {hint}\n </p>\n )}\n {showFileList && files.length > 0 && (\n <ul ref={listRef} className={pcn('dropzone-list')}>\n {files.map((file, index) => (\n <li key={keyOf(file)} className={pcn('dropzone-item')}>\n <span className={pcn('dropzone-name')}>{file.name}</span>\n <span className={pcn('dropzone-size')}>\n {sizeText(file.size)}\n </span>\n {!disabled && (\n <Delete\n size=\"small\"\n ariaLabel={\n removeLabel ? removeLabel(file) : `Remove ${file.name}`\n }\n onClick={() => remove(index)}\n />\n )}\n </li>\n ))}\n </ul>\n )}\n {refusals.length > 0 && (\n <div id={refusalsId} className={pcn('dropzone-rejections')}>\n {refusals.map((refusal, index) => (\n <p key={index} className={pcn('help', 'is-danger')}>\n {messageFor(refusal)}\n </p>\n ))}\n </div>\n )}\n <StatusRegion items={announcements} describe={describeAnnouncement} />\n </div>\n );\n\n const messageEl = message ? (\n <p id={messageId} className={helpClass}>\n {message}\n </p>\n ) : null;\n\n if (ownField) {\n return (\n <Field\n label={label}\n labelSize={labelSize}\n labelProps={fieldLabelProps}\n horizontal={horizontal}\n className={fieldClassName}\n >\n {dropzoneElement}\n {messageEl}\n </Field>\n );\n }\n\n return (\n <>\n {dropzoneElement}\n {messageEl}\n </>\n );\n }\n);\n\nDropzone.displayName = 'Dropzone';\n\nexport default Dropzone;\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"Dropzone.js","sources":["../../../src/form/Dropzone.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport {\n classNames,\n usePrefixedClassNames,\n prefixedClassNames,\n} from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { useConfig } from '../helpers/Config';\nimport {\n useScopedNumberFormat,\n NumberFormatFunction,\n} from '../helpers/localeFormat';\nimport { StatusRegion } from '../helpers/statusRegion';\nimport { warnOnce } from '../helpers/devWarnings';\nimport { Delete } from '../elements/Delete';\nimport {\n useInsideField,\n useInsideControl,\n rendersOwnField,\n useFieldsetDisabled,\n} from './FormContext';\nimport { Field } from './Field';\nimport { FormFieldProps } from './fieldProps';\nimport { useAutoLabelId } from './useAutoLabelId';\n\n/** Why a Dropzone refused a file. */\nexport type DropzoneRejectionCode =\n 'file-invalid-type' | 'file-too-large' | 'too-many-files';\n\n/** A file a Dropzone refused, and why. */\nexport interface DropzoneRejection {\n /** The file. */\n file: File;\n /**\n * Why it was refused: `file-invalid-type` when `accept` doesn't take it, or\n * it's a folder; `file-too-large` when it's over `maxSize`; `too-many-files`\n * when the list is full.\n */\n code: DropzoneRejectionCode;\n}\n\n/**\n * Props for the Dropzone component.\n *\n * @helperProps Helper props go on the `.dropzone` root `<div>`, with\n * `className`. The other attributes go on the `<input>`.\n * @extraProp {string} [accept] - File types it takes, as the native attribute writes them (`.pdf`, `image/*`, `application/pdf`). The picker offers them, and Dropzone checks every pick, drop and paste against them by the same rules, since browsers don't check a dropped file. It goes by a file's name and type, not its contents.\n * @extraProp {boolean} [multiple=false] - Takes several files, and each pick, drop or paste adds to the list. Without it, a new file replaces the one chosen.\n * @extraProp {string} [name] - The files' name in the form's data. The input holds the chosen files, so a plain form submit, `FormData` and React 19 actions all carry them.\n * @extraProp {boolean} [required=false] - The browser's own check: a form won't submit with no file chosen.\n * @extraProp {boolean} [disabled=false] - Disables the input, hides the remove buttons and takes no drops. A disabled `Fieldset` around it does the same.\n * @extraProp {(event: React.ChangeEvent<HTMLInputElement>) => void} [onChange] - Called on the input's `change`, after each pick, drop, paste or removal that changes the files, with `event.target.files` holding the new list.\n * @extraProp {React.Ref<HTMLInputElement>} [ref] - Forwarded to the `<input>`, so `ref.current.showPicker()` opens the picker from a button of your own. A script that writes the input through it, such as `value = ''` to clear it or a form library setting `files`, changes what the input holds and what the next pick, drop or paste adds to, but no event reports the write, so the list shows it only from the next change. To clear the list at once, reset the form, or control it with `files` and set that to `[]`.\n */\nexport interface DropzoneProps\n extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'color' | 'type' | 'children' | 'value' | 'defaultValue'\n >,\n Omit<BulmaClassesProps, 'color'>,\n FormFieldProps {\n /** Field label, rendered above the zone. It names the input along with the zone's own text, through `htmlFor` (your `id` when you pass one). Inside an outer `Field` it's dropped, and that `Field`'s label names the input. */\n label?: React.ReactNode;\n /** Props for the label element. An explicit `htmlFor` here overrides the automatic association (no id is generated then). */\n labelProps?: React.LabelHTMLAttributes<HTMLLabelElement> & {\n [key: string]: unknown;\n };\n /** Bulma color modifier for the zone, as `File` takes it. */\n color?:\n | 'primary'\n | 'link'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'black'\n | 'dark'\n | 'light'\n | 'white';\n /** Size modifier for the zone. */\n size?: 'small' | 'medium' | 'large';\n /**\n * The zone's text. It's the input's accessible name, so keep it short, and\n * put details such as \"PDF up to 5 MB\" in `hint`. Default: \"Choose or drop\n * a file\", or \"Choose or drop files\" with `multiple`.\n */\n buttonLabel?: React.ReactNode;\n /**\n * An icon above the zone's text. It sits inside the `<label>` that names\n * the input, so leave an `Icon` here unnamed (`<Icon name=\"upload\" />`).\n */\n icon?: React.ReactNode;\n /**\n * A line under the zone that describes the input through\n * `aria-describedby`, such as \"PDF up to 5 MB\".\n */\n hint?: React.ReactNode;\n /** The largest file it takes, in bytes. A bigger one is refused with `file-too-large`. */\n maxSize?: number;\n /**\n * With `multiple`, how many files the list holds at most. A drop that would\n * go over adds files up to the limit and refuses the rest with\n * `too-many-files`.\n */\n maxFiles?: number;\n /**\n * The chosen files, to control the list. The input and the list follow it,\n * and a change you don't take through `onFilesChange` is undone. Setting it\n * to `[]` clears both.\n */\n files?: File[];\n /** Called with the whole list of chosen files each time it changes. */\n onFilesChange?: (files: File[]) => void;\n /** Called with the files a pick, drop or paste refused, and why. */\n onReject?: (rejections: DropzoneRejection[]) => void;\n /**\n * Shows the chosen files under the zone, each with its size and a remove\n * button. Turn it off to show them your own way from `onFilesChange`. The\n * refusals still show.\n */\n showFileList?: boolean;\n /** Takes files pasted while the input has focus, through the same checks as a drop. */\n allowPaste?: boolean;\n /**\n * While it's on the page, stops the browser opening a file dropped outside\n * any drop target, which would leave the page. Drops on other file inputs\n * and on editable fields are left alone.\n */\n preventDocumentDrop?: boolean;\n /** Names a file's remove button, for localization. Default: `` `Remove ${file.name}` ``. */\n removeLabel?: (file: File) => string;\n /**\n * The text shown and announced for a refused file, for localization.\n * Default: the file's name and the reason, such as \"photo.png: only PDF\n * files\".\n */\n rejectionMessage?: (rejection: DropzoneRejection) => string;\n /**\n * What's announced when files are added, for localization. Default: the\n * file's name and \"added\", or a count (\"2 files added\").\n */\n addedMessage?: (files: File[]) => string;\n /** What's announced when a file is removed, for localization. Default: `` `${file.name} removed` ``. */\n removedMessage?: (file: File) => string;\n /**\n * Help or validation message under the Dropzone. It describes the input\n * through `aria-describedby`, after the hint and any refusals.\n */\n message?: React.ReactNode;\n /** Additional CSS classes for the root. */\n className?: string;\n}\n\n/** A file on its way in, and whether it's really a folder. */\ninterface Incoming {\n file: File;\n folder: boolean;\n}\n\n/** A refusal, with whether the file was a folder, which the default message says. */\ninterface Refusal extends DropzoneRejection {\n folder: boolean;\n}\n\n/** Something the status region says, with an id that's new each time. */\ninterface Announcement {\n id: string;\n text: string;\n}\n\nconst noFiles: File[] = [];\nconst noRefusals: Refusal[] = [];\nconst noAnnouncements: Announcement[] = [];\n\nconst describeAnnouncement = (announcement: Announcement) => announcement.text;\n\n/**\n * The tokens of an `accept` attribute that HTML recognizes, lowercased: an\n * extension (`.pdf`), a wildcard (`image/*`) or a MIME type. Others are\n * ignored, as browsers ignore them.\n */\nconst acceptTokens = (accept: string | undefined): string[] =>\n (accept ?? '')\n .split(',')\n .map(token => token.trim().toLowerCase())\n .filter(\n token => token.length > 1 && (token[0] === '.' || token.includes('/'))\n );\n\n/** Whether `accept`'s tokens take a file with this name and type. */\nconst accepts = (tokens: string[], name: string, type: string): boolean => {\n if (tokens.length === 0) return true;\n const lowerName = name.toLowerCase();\n const lowerType = type.toLowerCase();\n return tokens.some(token =>\n token[0] === '.'\n ? lowerName.endsWith(token)\n : token.endsWith('/*')\n ? lowerType.startsWith(token.slice(0, -1))\n : lowerType === token\n );\n};\n\n/** Whether a drag or a clipboard carries files. */\nconst carriesFiles = (data: DataTransfer | null): data is DataTransfer =>\n !!data && Array.from(data.types ?? []).includes('Files');\n\n/** The files a drop or a paste brings, with folders marked. */\nconst incomingFrom = (data: DataTransfer | null): Incoming[] => {\n if (!data) return [];\n const items = Array.from(data.items ?? []).filter(\n item => item.kind === 'file'\n );\n if (items.length === 0) {\n return Array.from(data.files ?? [], file => ({ file, folder: false }));\n }\n const incoming: Incoming[] = [];\n for (const item of items) {\n const file = item.getAsFile();\n if (!file) continue;\n const entry = item.webkitGetAsEntry?.();\n incoming.push({ file, folder: !!entry?.isDirectory });\n }\n return incoming;\n};\n\n/** The same file: one object, or one picked again with the same details. */\nconst sameFile = (a: File, b: File): boolean =>\n a === b ||\n (a.name === b.name && a.size === b.size && a.lastModified === b.lastModified);\n\n/** Whether two lists hold the same files in the same order. */\nconst sameFiles = (\n a: ArrayLike<File> | null | undefined,\n b: readonly File[]\n): boolean =>\n !!a && a.length === b.length && b.every((file, i) => sameFile(a[i], file));\n\n/**\n * Writes files to a file input, through a `DataTransfer`, the one way script\n * can build a `FileList`. Where there's no `DataTransfer` the input is left as\n * it is.\n */\nconst writeFiles = (input: HTMLInputElement, files: readonly File[]) => {\n if (typeof DataTransfer !== 'function') return;\n const transfer = new DataTransfer();\n for (const file of files) transfer.items.add(file);\n input.files = transfer.files;\n};\n\n/** The units a file size is written in, largest first. */\nconst sizeUnits = [\n ['gigabyte', 1e9, 'GB'],\n ['megabyte', 1e6, 'MB'],\n ['kilobyte', 1e3, 'kB'],\n] as const;\n\n/**\n * A file size for display, in decimal units (\"1.2 MB\"), in the locale of a\n * `LocaleProvider` around it, or as English writes it outside one.\n */\nconst formatFileSize = (\n bytes: number,\n formatNumber: NumberFormatFunction | null\n): string => {\n for (const [unit, factor, symbol] of sizeUnits) {\n if (bytes >= factor) {\n const value = bytes / factor;\n return formatNumber\n ? formatNumber(value, {\n style: 'unit',\n unit,\n unitDisplay: 'short',\n maximumFractionDigits: 1,\n })\n : `${Math.round(value * 10) / 10} ${symbol}`;\n }\n }\n return formatNumber\n ? formatNumber(bytes, { style: 'unit', unit: 'byte', unitDisplay: 'long' })\n : `${bytes} ${bytes === 1 ? 'byte' : 'bytes'}`;\n};\n\n/** A word for each kind of file `accept` names: \"PDF\", \"image\". */\nconst typeNames = (tokens: string[]): string[] => {\n const names: string[] = [];\n for (const token of tokens) {\n let name = token;\n if (token[0] === '.') {\n name = token.slice(1).toUpperCase();\n } else {\n const [type, subtype] = token.split('/');\n const core = subtype.split('+')[0];\n if (subtype === '*') name = type;\n else if (core === 'plain') name = 'text';\n else if (/^[a-z0-9]+$/.test(core)) name = core.toUpperCase();\n }\n if (!names.includes(name)) names.push(name);\n }\n return names;\n};\n\n/** \"A\", \"A or B\", \"A, B, or C\". */\nconst orList = (items: string[]): string =>\n items.length <= 2\n ? items.join(' or ')\n : `${items.slice(0, -1).join(', ')}, or ${items[items.length - 1]}`;\n\n/**\n * The `Dropzone` component is an area to drop files on or click to pick\n * them, which checks each file and lists the chosen ones with a way to remove\n * each.\n *\n * It's Bulma's boxed, full-width file widget with the real\n * `<input type=\"file\">` lying over it, so the input is the one tab stop, the\n * click target and the drop target, and Enter and Space open the picker. The\n * input holds the chosen files: a pick, drop or paste that passes the checks\n * is written to it, so a form submits the files under `name`. It doesn't\n * upload anything.\n *\n * @function\n * @param {DropzoneProps} props - Props for the Dropzone component.\n * @returns {JSX.Element} The rendered dropzone.\n *\n * @example\n * <Dropzone\n * label=\"CV\"\n * name=\"cv\"\n * accept=\".pdf,application/pdf\"\n * maxSize={5_000_000}\n * hint=\"PDF up to 5 MB\"\n * />\n */\nexport const Dropzone = forwardRef<HTMLInputElement, DropzoneProps>(\n (\n {\n // Field props\n label,\n labelSize,\n labelProps,\n horizontal,\n message,\n messageColor,\n fieldClassName,\n color,\n size,\n buttonLabel,\n icon,\n hint,\n maxSize,\n maxFiles,\n files: filesProp,\n onFilesChange,\n onReject,\n showFileList = true,\n allowPaste = true,\n preventDocumentDrop = true,\n removeLabel,\n rejectionMessage,\n addedMessage,\n removedMessage,\n className,\n accept,\n multiple,\n disabled: disabledProp,\n onChange,\n onClick,\n onDragEnter,\n onDragOver,\n onDragLeave,\n onDrop,\n onPaste,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) => {\n const disabled = useFieldsetDisabled(disabledProp);\n const controlled = filesProp !== undefined;\n const [ownFiles, setOwnFiles] = useState<File[]>(noFiles);\n const files = filesProp ?? ownFiles;\n // A render the controlled list needs after a change, so that one the app\n // didn't take is undone.\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n const [refusals, setRefusals] = useState<Refusal[]>(noRefusals);\n const [drag, setDrag] = useState<'over' | 'reject' | null>(null);\n const [announcements, setAnnouncements] =\n useState<Announcement[]>(noAnnouncements);\n\n const inputRef = useRef<HTMLInputElement | null>(null);\n const listRef = useRef<HTMLUListElement>(null);\n // Set while Dropzone dispatches the input's own events, so its change\n // handler hands them on rather than reading them as a pick.\n const dispatchingRef = useRef(false);\n // The row a removal emptied, whose neighbour takes focus.\n const removedRowRef = useRef<number | null>(null);\n const announcedRef = useRef(0);\n // What the input held when it was last clicked (Enter and Space click it\n // too), which a pick adds to: by the time the pick's change arrives, the\n // browser has replaced the input's files with the picked ones.\n const pickBaseRef = useRef<File[] | null>(null);\n\n const setInputRef = useCallback(\n (node: HTMLInputElement | null) => {\n inputRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) {\n (ref as React.MutableRefObject<HTMLInputElement | null>).current =\n node;\n }\n },\n [ref]\n );\n\n const formatNumber = useScopedNumberFormat();\n const tokens = acceptTokens(accept);\n const sizeText = (bytes: number) => formatFileSize(bytes, formatNumber);\n const countText = (count: number) =>\n formatNumber ? formatNumber(count) : String(count);\n\n // The files a pick, drop or paste builds on, and a removal takes one from.\n // Controlled, that's `files`. Uncontrolled, it's the input itself rather\n // than the list: a script can rewrite the input through the ref, emptying\n // it with `value = ''` or setting its `files`, and no event reports that,\n // so the list catches up only at the next change. Where there's no\n // DataTransfer to write the input with, the list is all there is.\n const current = (): File[] =>\n controlled || typeof DataTransfer !== 'function'\n ? files\n : Array.from((inputRef.current as HTMLInputElement).files as FileList);\n\n const messageFor = (refusal: Refusal): string => {\n const { file, code } = refusal;\n if (rejectionMessage) return rejectionMessage({ file, code });\n if (code === 'file-too-large') {\n return `${file.name}: larger than ${sizeText(maxSize as number)}`;\n }\n if (code === 'too-many-files') {\n const most = multiple ? (maxFiles as number) : 1;\n return `${file.name}: only ${most === 1 ? 'one file' : `${countText(most)} files`}`;\n }\n return refusal.folder\n ? `${file.name}: folders can't be added`\n : `${file.name}: only ${orList(typeNames(tokens))} files`;\n };\n\n const announce = (texts: string[]) => {\n if (texts.length === 0) return;\n const batch = ++announcedRef.current;\n setAnnouncements(texts.map((text, i) => ({ id: `${batch}-${i}`, text })));\n };\n\n /**\n * Makes `next` the chosen files: writes them to the input, and when they\n * differ from the list, dispatches the input's `input` and `change` and\n * reports the new list.\n */\n const commit = (next: File[]) => {\n pickBaseRef.current = null;\n const input = inputRef.current as HTMLInputElement;\n if (!sameFiles(input.files, next)) writeFiles(input, next);\n if (sameFiles(files, next)) return;\n if (controlled) rerender();\n else setOwnFiles(next);\n onFilesChange?.(next);\n dispatchingRef.current = true;\n try {\n input.dispatchEvent(new Event('input', { bubbles: true }));\n input.dispatchEvent(new Event('change', { bubbles: true }));\n } finally {\n dispatchingRef.current = false;\n }\n };\n\n /** Checks the files a pick, drop or paste brings, and takes those that pass. */\n const take = (incoming: Incoming[], base: File[] = current()) => {\n const kept = multiple ? base : noFiles;\n const room = multiple ? (maxFiles ?? Infinity) - kept.length : 1;\n const added: File[] = [];\n const refused: Refusal[] = [];\n for (const { file, folder } of incoming) {\n const code: DropzoneRejectionCode | null =\n folder || !accepts(tokens, file.name, file.type)\n ? 'file-invalid-type'\n : maxSize !== undefined && file.size > maxSize\n ? 'file-too-large'\n : null;\n if (code) {\n refused.push({ file, code, folder });\n } else if (\n multiple &&\n [...kept, ...added].some(f => sameFile(f, file))\n ) {\n // Already in the list: nothing to add, and nothing wrong.\n } else if (added.length >= room) {\n refused.push({ file, code: 'too-many-files', folder });\n } else {\n added.push(file);\n }\n }\n setRefusals(refused.length > 0 ? refused : noRefusals);\n if (refused.length > 0) {\n onReject?.(refused.map(({ file, code }) => ({ file, code })));\n }\n commit(added.length > 0 ? [...kept, ...added] : base);\n const addedText =\n added.length === 0\n ? []\n : [\n addedMessage\n ? addedMessage(added)\n : added.length === 1\n ? `${added[0].name} added`\n : `${countText(added.length)} files added`,\n ];\n announce([...addedText, ...refused.map(messageFor)]);\n };\n\n const remove = (index: number) => {\n const file = files[index];\n removedRowRef.current = index;\n commit(current().filter(held => !sameFile(held, file)));\n announce([\n removedMessage ? removedMessage(file) : `${file.name} removed`,\n ]);\n };\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (dispatchingRef.current) {\n onChange?.(event);\n return;\n }\n // A pick: the browser has put the picked files in the input. They're\n // added to what it held when it was clicked, or, for a picker opened\n // with showPicker(), which clicks nothing, to the list. With none (a\n // cancelled pick, in a browser that clears it), that stays.\n const base = pickBaseRef.current ?? files;\n const picked = Array.from(event.target.files ?? []);\n if (picked.length === 0) commit(base);\n else\n take(\n picked.map(file => ({ file, folder: false })),\n base\n );\n };\n\n const handleClick = (event: React.MouseEvent<HTMLInputElement>) => {\n onClick?.(event);\n pickBaseRef.current = current();\n };\n\n // While files are dragged over the input it's cancelled, which makes the\n // input the drop target and keeps the browser's own drop from running.\n // Disabled, it refuses the drop, so the browser doesn't open the file.\n const handleDragOver = (event: React.DragEvent<HTMLInputElement>) => {\n (event.type === 'dragenter' ? onDragEnter : onDragOver)?.(event);\n if (!carriesFiles(event.dataTransfer)) return;\n event.preventDefault();\n if (disabled) {\n event.dataTransfer.dropEffect = 'none';\n return;\n }\n event.dataTransfer.dropEffect = 'copy';\n // Only the dragged files' types can be read, so a file is known to be\n // refused only when `accept` names no extension and its type is known.\n const room = multiple ? (maxFiles ?? Infinity) - current().length : 1;\n const types = Array.from(event.dataTransfer.items ?? [])\n .filter(item => item.kind === 'file')\n .map(item => item.type);\n const refused =\n room <= 0 ||\n (types.length > 0 &&\n tokens.length > 0 &&\n !tokens.some(token => token[0] === '.') &&\n types.every(type => type !== '' && !accepts(tokens, '', type)));\n setDrag(refused ? 'reject' : 'over');\n };\n\n const handleDragLeave = (event: React.DragEvent<HTMLInputElement>) => {\n onDragLeave?.(event);\n setDrag(null);\n };\n\n const handleDrop = (event: React.DragEvent<HTMLInputElement>) => {\n onDrop?.(event);\n setDrag(null);\n if (!carriesFiles(event.dataTransfer)) return;\n event.preventDefault();\n if (!disabled) take(incomingFrom(event.dataTransfer));\n };\n\n const handlePaste = (event: React.ClipboardEvent<HTMLInputElement>) => {\n onPaste?.(event);\n if (!allowPaste || disabled) return;\n const incoming = incomingFrom(event.clipboardData);\n if (incoming.length === 0) return;\n event.preventDefault();\n take(incoming);\n };\n\n // A controlled list: the input follows `files`, and a change the app\n // didn't take is undone.\n useEffect(() => {\n const input = inputRef.current;\n if (controlled && input && !sameFiles(input.files, files)) {\n writeFiles(input, files);\n }\n });\n\n // After a removal, focus goes to the remove button that took the removed\n // one's place, else the one before, else the input.\n useEffect(() => {\n const row = removedRowRef.current;\n if (row === null) return;\n removedRowRef.current = null;\n const buttons = listRef.current?.querySelectorAll('button') ?? [];\n const next = buttons[Math.min(row, buttons.length - 1)];\n (next ?? inputRef.current)?.focus();\n });\n\n // A reset of the input's form empties the input, so the list and the\n // refusals go too. The reset event fires before the form resets, and a\n // listener after this one can still cancel it, so the list is cleared a\n // task later, and only if the reset went ahead.\n const latestRef = useRef({ files, controlled, onFilesChange });\n useEffect(() => {\n latestRef.current = { files, controlled, onFilesChange };\n });\n const formAttribute = props.form;\n useEffect(() => {\n const form = inputRef.current?.form;\n if (!form) return undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const onReset = (event: Event) => {\n timer = setTimeout(() => {\n if (event.defaultPrevented) return;\n const latest = latestRef.current;\n pickBaseRef.current = null;\n setRefusals(noRefusals);\n if (latest.files.length === 0) return;\n if (latest.controlled) rerender();\n else setOwnFiles(noFiles);\n latest.onFilesChange?.(noFiles);\n });\n };\n form.addEventListener('reset', onReset);\n return () => {\n form.removeEventListener('reset', onReset);\n clearTimeout(timer);\n };\n }, [formAttribute]);\n\n // A file dropped just outside the zone would open in the tab. The guard\n // cancels a file drag anywhere nothing else takes it, leaving alone\n // enabled file inputs and editable fields, which take drops of their own,\n // and drops something else already handled. It reads the event's real\n // target, so a file input inside a shadow root is left alone too.\n useEffect(() => {\n if (!preventDocumentDrop) return undefined;\n const guard = (event: DragEvent) => {\n if (event.defaultPrevented || !carriesFiles(event.dataTransfer)) {\n return;\n }\n const target = event.composedPath()[0];\n if (\n target instanceof Element &&\n target.closest(\n 'input[type=\"file\"]:not(:disabled), textarea, [contenteditable]:not([contenteditable=\"false\"])'\n )\n ) {\n return;\n }\n event.preventDefault();\n if (event.type === 'dragover') event.dataTransfer.dropEffect = 'none';\n };\n document.addEventListener('dragover', guard);\n document.addEventListener('drop', guard);\n return () => {\n document.removeEventListener('dragover', guard);\n document.removeEventListener('drop', guard);\n };\n }, [preventDocumentDrop]);\n\n const warnsMaxFiles = maxFiles !== undefined && !multiple;\n useEffect(() => {\n if (warnsMaxFiles) {\n warnOnce(\n 'Dropzone:maxFiles-without-multiple',\n '[bestax-bulma] <Dropzone maxFiles> takes effect only with ' +\n 'multiple. Without it, each new file replaces the one chosen.'\n );\n }\n }, [warnsMaxFiles]);\n\n const insideField = useInsideField();\n const insideControl = useInsideControl();\n const ownField = rendersOwnField('Dropzone', {\n insideField,\n insideControl,\n label,\n message,\n horizontal,\n fieldClassName,\n });\n const { controlId, fieldLabelProps } = useAutoLabelId({\n label,\n id: props.id,\n labelProps,\n rendersLabel: ownField,\n });\n const { classPrefix } = useConfig();\n const pcn = (...args: Parameters<typeof classNames>) =>\n prefixedClassNames(classPrefix, ...args);\n // The input takes `controlId`, so `id` stays out of the spread, where an\n // undefined `id` key would wipe the id the label points at.\n const { id: _id, ...inputProps } = props;\n const { bulmaHelperClasses, rest } = useBulmaClasses(inputProps);\n\n const baseId = useId();\n const hintId = `${baseId}-hint`;\n const refusalsId = `${baseId}-refusals`;\n const messageId = `${baseId}-message`;\n const describedBy =\n [\n ariaDescribedBy,\n hint ? hintId : undefined,\n refusals.length > 0 ? refusalsId : undefined,\n message ? messageId : undefined,\n ]\n .filter(Boolean)\n .join(' ') || undefined;\n\n const rootClass = usePrefixedClassNames('dropzone', {\n 'is-dragover': drag === 'over',\n 'is-drag-reject': drag === 'reject',\n 'is-disabled': disabled,\n });\n const zoneClass = usePrefixedClassNames(\n 'file',\n 'is-boxed',\n 'is-fullwidth',\n {\n [`is-${color}`]: !!color,\n [`is-${size}`]: !!size,\n }\n );\n const helpClass = usePrefixedClassNames('help', {\n [`is-${messageColor}`]: !!messageColor,\n });\n\n // Each row's key, from the file's details, which the list keeps unique.\n const seen = new Map<string, number>();\n const keyOf = (file: File) => {\n const key = `${file.name}:${file.size}:${file.lastModified}`;\n const count = seen.get(key) ?? 0;\n seen.set(key, count + 1);\n return count === 0 ? key : `${key}:${count}`;\n };\n\n const dropzoneElement = (\n <div className={classNames(rootClass, bulmaHelperClasses, className)}>\n <div className={zoneClass}>\n <label className={pcn('file-label')}>\n <input\n {...rest}\n ref={setInputRef}\n className={pcn('file-input')}\n type=\"file\"\n id={controlId}\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n aria-describedby={describedBy}\n onChange={handleChange}\n onClick={handleClick}\n onDragEnter={handleDragOver}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onPaste={handlePaste}\n />\n <span className={pcn('file-cta')}>\n {icon && <span className={pcn('file-icon')}>{icon}</span>}\n <span className={pcn('file-label')}>\n {buttonLabel ||\n (multiple ? 'Choose or drop files' : 'Choose or drop a file')}\n </span>\n </span>\n </label>\n </div>\n {hint && (\n <p id={hintId} className={pcn('help', 'dropzone-hint')}>\n {hint}\n </p>\n )}\n {showFileList && files.length > 0 && (\n <ul ref={listRef} className={pcn('dropzone-list')}>\n {files.map((file, index) => (\n <li key={keyOf(file)} className={pcn('dropzone-item')}>\n <span className={pcn('dropzone-name')}>{file.name}</span>\n <span className={pcn('dropzone-size')}>\n {sizeText(file.size)}\n </span>\n {!disabled && (\n <Delete\n size=\"small\"\n ariaLabel={\n removeLabel ? removeLabel(file) : `Remove ${file.name}`\n }\n onClick={() => remove(index)}\n />\n )}\n </li>\n ))}\n </ul>\n )}\n {refusals.length > 0 && (\n <div id={refusalsId} className={pcn('dropzone-rejections')}>\n {refusals.map((refusal, index) => (\n <p key={index} className={pcn('help', 'is-danger')}>\n {messageFor(refusal)}\n </p>\n ))}\n </div>\n )}\n <StatusRegion items={announcements} describe={describeAnnouncement} />\n </div>\n );\n\n const messageEl = message ? (\n <p id={messageId} className={helpClass}>\n {message}\n </p>\n ) : null;\n\n if (ownField) {\n return (\n <Field\n label={label}\n labelSize={labelSize}\n labelProps={fieldLabelProps}\n horizontal={horizontal}\n className={fieldClassName}\n >\n {dropzoneElement}\n {messageEl}\n </Field>\n );\n }\n\n return (\n <>\n {dropzoneElement}\n {messageEl}\n </>\n );\n }\n);\n\nDropzone.displayName = 'Dropzone';\n\nexport default Dropzone;\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { forwardRef, useState, useEffect } from 'react';
5
5
  import { prefixedClassNames, usePrefixedClassNames, classNames } from '../helpers/classNames.js';
6
6
  import { useBulmaClasses } from '../helpers/useBulmaClasses.js';
7
7
  import { useConfig } from '../helpers/Config.js';
8
- import { useNumberFormat } from '../helpers/localeFormat.js';
8
+ import { useScopedNumberFormat } from '../helpers/localeFormat.js';
9
9
  import { useInsideField, useInsideControl, rendersOwnField } from './FormContext.js';
10
10
  import { Field } from './Field.js';
11
11
  import { useAutoLabelId } from './useAutoLabelId.js';
@@ -49,7 +49,7 @@ label, labelSize, labelProps, horizontal, message, messageColor, fieldClassName,
49
49
  : undefined);
50
50
  onChange?.(event);
51
51
  };
52
- const formatNumber = useNumberFormat();
52
+ const formatNumber = useScopedNumberFormat();
53
53
  const pickedText = picked &&
54
54
  (picked.count === 1
55
55
  ? picked.firstName
@@ -1 +1 @@
1
- {"version":3,"file":"File.js","sources":["../../../src/form/File.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useState } from 'react';\nimport {\n classNames,\n usePrefixedClassNames,\n prefixedClassNames,\n} from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { useConfig } from '../helpers/Config';\nimport { useNumberFormat } from '../helpers/localeFormat';\nimport {\n useInsideField,\n useInsideControl,\n rendersOwnField,\n} from './FormContext';\nimport { Field } from './Field';\nimport { FormFieldProps } from './fieldProps';\nimport { useAutoLabelId } from './useAutoLabelId';\n\n/**\n * Props for the File component.\n * Inside an outer `Field`, or a `Control` with no `Field` around it, it\n * renders no `Field` of its own. The exception is `label`, `message`,\n * `horizontal` or `fieldClassName` in that bare `Control`: it keeps a `Field`\n * for them, nested in the `.control`, and warns in development. Wrap the\n * `Control` in a `Field` instead, and set the `label`, `horizontal` and class\n * name on that `Field`.\n *\n * @helperProps Helper props go on the `.file` wrapper `<div>`, with\n * `className`. The other attributes go on the `<input>`.\n * @extraProp {string} [accept] - File types the picker offers, as the native attribute takes them (`.pdf`, `image/*`, `application/pdf`). Browsers apply it in the picker only: a file dropped on the input lands whatever its type, so check `files` in `onChange` when the type matters.\n * @extraProp {(event: React.ChangeEvent<HTMLInputElement>) => void} [onChange] - Called when the user picks files, or drops them on the input. With the extras stylesheet loaded, a drop does what a pick does: it replaces what was picked and fires `input` and `change`. A drop of several files lands only with `multiple`.\n */\nexport interface FileProps\n extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'color' | 'type'\n >,\n Omit<BulmaClassesProps, 'color'>,\n FormFieldProps {\n /** Field label. Automatically associated with the file input via `htmlFor` — uses your `id` when provided, otherwise a generated one. The input then has two labels (this one plus the wrapping `file-label`); assistive tech reads both. Dropped inside an outer `Field`, whose own label associates instead when that `Field` generates a target id (not `grouped`/`hasAddons`, no explicit `labelProps.htmlFor`) and you set no `id` here. */\n label?: React.ReactNode;\n /** Props for the label element. An explicit `htmlFor` here overrides the automatic association (no id is generated then). */\n labelProps?: React.LabelHTMLAttributes<HTMLLabelElement> & {\n [key: string]: unknown;\n };\n /** Bulma color modifier for the file input. */\n color?:\n | 'primary'\n | 'link'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'black'\n | 'dark'\n | 'light'\n | 'white';\n /** Size modifier for the file input. */\n size?: 'small' | 'medium' | 'large';\n /** Boxed file input. */\n isBoxed?: boolean;\n /** Whether the file input expands to full width. */\n isFullwidth?: boolean;\n /** Whether the file input expands to full width. @deprecated Use `isFullwidth` instead — `isFullwidth` wins if both are set. */\n isFullWidth?: boolean;\n /** Position the CTA on the right (with `hasName`). */\n isRight?: boolean;\n /** Center the file input within its container. */\n isCentered?: boolean;\n /**\n * Show a file name area. Without `fileName` it shows what the user picked: the file's name, or\n * a count when `multiple` lets them pick several (see `pickedFilesLabel`). Before a pick there is\n * no name area, and the root takes Bulma's `is-empty`. A reset of the input's form clears the\n * name, but clearing the input from code fires no change event and leaves it showing, so pass\n * `fileName` to control the text then.\n */\n hasName?: boolean;\n /** Text on the file CTA button (defaults to \"Choose a file…\"). */\n buttonLabel?: React.ReactNode;\n /**\n * Left icon element. It renders inside the `<label>` that names the file input, beside\n * `buttonLabel`, so leave an `Icon` here unnamed (`<Icon name=\"upload\" />`): it is then\n * `aria-hidden`, while an `ariaLabel` would join the input's accessible name.\n */\n iconLeft?: React.ReactNode;\n /**\n * Right icon element. Sits inside the same `<label>` as `iconLeft`, so the same applies:\n * an `Icon` here with an `ariaLabel` joins the input's accessible name.\n */\n iconRight?: React.ReactNode;\n /** Additional CSS classes to apply. */\n className?: string;\n /** Additional CSS classes for the `<input>`. */\n inputClassName?: string;\n /**\n * Text for the file name area (with `hasName`), for a file chosen earlier or your own wording.\n * Setting it takes over from the picked file's name; an empty string shows no name area.\n */\n fileName?: string;\n /**\n * Builds the text `hasName` shows when several files are picked, from their count, for\n * localization. Default: `` `${count} files` ``, with the count written the way the `locale`\n * of a `LocaleProvider` around it writes numbers. A single pick shows its file's name.\n */\n pickedFilesLabel?: (count: number) => string;\n}\n\n/**\n * The `File` component provides a Bulma-styled file input, supporting color, size, boxed/fullwidth/align styles, icons, \"has name\", and filename display.\n *\n * @function\n * @param {FileProps} props - Props for the File component.\n * @returns {JSX.Element} The rendered file upload field.\n * @see {@link https://bulma.io/documentation/form/file/ | Bulma File documentation}\n */\nexport const File = forwardRef<HTMLInputElement, FileProps>(\n (\n {\n // Field props\n label,\n labelSize,\n labelProps,\n horizontal,\n message,\n messageColor,\n fieldClassName,\n color,\n size,\n isBoxed,\n isFullwidth,\n isFullWidth,\n isRight,\n isCentered,\n hasName,\n buttonLabel,\n iconLeft,\n iconRight,\n className,\n inputClassName,\n fileName,\n pickedFilesLabel,\n onChange,\n ...props\n },\n ref\n ) => {\n // What the user last picked, and the form a reset of which clears it.\n const [picked, setPicked] = useState<{\n count: number;\n firstName: string;\n form: HTMLFormElement | null;\n }>();\n const pickedForm = picked?.form;\n useEffect(() => {\n if (!pickedForm) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // The reset event fires before the form resets, and a listener after this one can still\n // cancel it, so the name is cleared a task later, and only if the reset went ahead.\n const onReset = (event: Event) => {\n timer = setTimeout(() => {\n if (!event.defaultPrevented) setPicked(undefined);\n });\n };\n pickedForm.addEventListener('reset', onReset);\n return () => {\n pickedForm.removeEventListener('reset', onReset);\n clearTimeout(timer);\n };\n }, [pickedForm]);\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const { files, form } = event.target;\n setPicked(\n files?.length\n ? { count: files.length, firstName: files[0].name, form }\n : undefined\n );\n onChange?.(event);\n };\n const formatNumber = useNumberFormat();\n const pickedText =\n picked &&\n (picked.count === 1\n ? picked.firstName\n : (pickedFilesLabel?.(picked.count) ??\n `${formatNumber ? formatNumber(picked.count) : picked.count} files`));\n const shownName = fileName ?? pickedText;\n\n const insideField = useInsideField();\n const insideControl = useInsideControl();\n const ownField = rendersOwnField('File', {\n insideField,\n insideControl,\n label,\n message,\n horizontal,\n fieldClassName,\n });\n const { controlId, fieldLabelProps } = useAutoLabelId({\n label,\n id: props.id,\n labelProps,\n rendersLabel: ownField,\n });\n const { classPrefix } = useConfig();\n // The input takes `controlId`, so `id` stays out of the spread, where an\n // undefined `id` key would wipe the id the label points at.\n const { id: _id, ...inputProps } = props;\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color,\n ...inputProps,\n });\n\n // Mutually exclusive alignment\n let alignmentClass: string | undefined;\n if (isRight && isCentered) {\n // If both are set, prefer isRight and warn in dev\n alignmentClass = prefixedClassNames(classPrefix, 'is-right');\n } else if (isRight) {\n alignmentClass = prefixedClassNames(classPrefix, 'is-right');\n } else if (isCentered) {\n alignmentClass = prefixedClassNames(classPrefix, 'is-centered');\n }\n\n const mainClass = usePrefixedClassNames('file', {\n [`is-${color}`]: !!color,\n [`is-${size}`]: !!size,\n 'is-boxed': isBoxed,\n 'is-fullwidth': isFullwidth ?? isFullWidth,\n 'has-name': hasName,\n 'is-empty': hasName && !shownName,\n });\n const fileClass = classNames(\n mainClass,\n bulmaHelperClasses,\n alignmentClass,\n className\n );\n\n const helpClass = usePrefixedClassNames('help', {\n [`is-${messageColor}`]: !!messageColor,\n });\n const messageEl = message ? <p className={helpClass}>{message}</p> : null;\n\n const fileElement = (\n <div className={fileClass}>\n <label className={usePrefixedClassNames('file-label')}>\n <input\n ref={ref}\n className={classNames(\n usePrefixedClassNames('file-input'),\n inputClassName\n )}\n type=\"file\"\n id={controlId}\n onChange={handleChange}\n {...rest}\n />\n <span className={usePrefixedClassNames('file-cta')}>\n {iconLeft && (\n <span className={prefixedClassNames(classPrefix, 'file-icon')}>\n {iconLeft}\n </span>\n )}\n <span className={usePrefixedClassNames('file-label')}>\n {buttonLabel || 'Choose a file\\u2026'}\n </span>\n {iconRight && (\n <span className={prefixedClassNames(classPrefix, 'file-icon')}>\n {iconRight}\n </span>\n )}\n </span>\n {hasName && shownName && (\n <span className={prefixedClassNames(classPrefix, 'file-name')}>\n {shownName}\n </span>\n )}\n </label>\n </div>\n );\n\n if (ownField) {\n return (\n <Field\n label={label}\n labelSize={labelSize}\n labelProps={fieldLabelProps}\n horizontal={horizontal}\n className={fieldClassName}\n >\n {fileElement}\n {messageEl}\n </Field>\n );\n }\n\n return (\n <>\n {fileElement}\n {messageEl}\n </>\n );\n }\n);\n\nFile.displayName = 'File';\n\nexport default File;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"File.js","sources":["../../../src/form/File.tsx"],"sourcesContent":["import React, { forwardRef, useEffect, useState } from 'react';\nimport {\n classNames,\n usePrefixedClassNames,\n prefixedClassNames,\n} from '../helpers/classNames';\nimport { useBulmaClasses, BulmaClassesProps } from '../helpers/useBulmaClasses';\nimport { useConfig } from '../helpers/Config';\nimport { useScopedNumberFormat } from '../helpers/localeFormat';\nimport {\n useInsideField,\n useInsideControl,\n rendersOwnField,\n} from './FormContext';\nimport { Field } from './Field';\nimport { FormFieldProps } from './fieldProps';\nimport { useAutoLabelId } from './useAutoLabelId';\n\n/**\n * Props for the File component.\n * Inside an outer `Field`, or a `Control` with no `Field` around it, it\n * renders no `Field` of its own. The exception is `label`, `message`,\n * `horizontal` or `fieldClassName` in that bare `Control`: it keeps a `Field`\n * for them, nested in the `.control`, and warns in development. Wrap the\n * `Control` in a `Field` instead, and set the `label`, `horizontal` and class\n * name on that `Field`.\n *\n * @helperProps Helper props go on the `.file` wrapper `<div>`, with\n * `className`. The other attributes go on the `<input>`.\n * @extraProp {string} [accept] - File types the picker offers, as the native attribute takes them (`.pdf`, `image/*`, `application/pdf`). Browsers apply it in the picker only: a file dropped on the input lands whatever its type, so check `files` in `onChange` when the type matters.\n * @extraProp {(event: React.ChangeEvent<HTMLInputElement>) => void} [onChange] - Called when the user picks files, or drops them on the input. With the extras stylesheet loaded, a drop does what a pick does: it replaces what was picked and fires `input` and `change`. A drop of several files lands only with `multiple`.\n */\nexport interface FileProps\n extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement>,\n 'size' | 'color' | 'type'\n >,\n Omit<BulmaClassesProps, 'color'>,\n FormFieldProps {\n /** Field label. Automatically associated with the file input via `htmlFor` — uses your `id` when provided, otherwise a generated one. The input then has two labels (this one plus the wrapping `file-label`); assistive tech reads both. Dropped inside an outer `Field`, whose own label associates instead when that `Field` generates a target id (not `grouped`/`hasAddons`, no explicit `labelProps.htmlFor`) and you set no `id` here. */\n label?: React.ReactNode;\n /** Props for the label element. An explicit `htmlFor` here overrides the automatic association (no id is generated then). */\n labelProps?: React.LabelHTMLAttributes<HTMLLabelElement> & {\n [key: string]: unknown;\n };\n /** Bulma color modifier for the file input. */\n color?:\n | 'primary'\n | 'link'\n | 'info'\n | 'success'\n | 'warning'\n | 'danger'\n | 'black'\n | 'dark'\n | 'light'\n | 'white';\n /** Size modifier for the file input. */\n size?: 'small' | 'medium' | 'large';\n /** Boxed file input. */\n isBoxed?: boolean;\n /** Whether the file input expands to full width. */\n isFullwidth?: boolean;\n /** Whether the file input expands to full width. @deprecated Use `isFullwidth` instead — `isFullwidth` wins if both are set. */\n isFullWidth?: boolean;\n /** Position the CTA on the right (with `hasName`). */\n isRight?: boolean;\n /** Center the file input within its container. */\n isCentered?: boolean;\n /**\n * Show a file name area. Without `fileName` it shows what the user picked: the file's name, or\n * a count when `multiple` lets them pick several (see `pickedFilesLabel`). Before a pick there is\n * no name area, and the root takes Bulma's `is-empty`. A reset of the input's form clears the\n * name, but clearing the input from code fires no change event and leaves it showing, so pass\n * `fileName` to control the text then.\n */\n hasName?: boolean;\n /** Text on the file CTA button (defaults to \"Choose a file…\"). */\n buttonLabel?: React.ReactNode;\n /**\n * Left icon element. It renders inside the `<label>` that names the file input, beside\n * `buttonLabel`, so leave an `Icon` here unnamed (`<Icon name=\"upload\" />`): it is then\n * `aria-hidden`, while an `ariaLabel` would join the input's accessible name.\n */\n iconLeft?: React.ReactNode;\n /**\n * Right icon element. Sits inside the same `<label>` as `iconLeft`, so the same applies:\n * an `Icon` here with an `ariaLabel` joins the input's accessible name.\n */\n iconRight?: React.ReactNode;\n /** Additional CSS classes to apply. */\n className?: string;\n /** Additional CSS classes for the `<input>`. */\n inputClassName?: string;\n /**\n * Text for the file name area (with `hasName`), for a file chosen earlier or your own wording.\n * Setting it takes over from the picked file's name; an empty string shows no name area.\n */\n fileName?: string;\n /**\n * Builds the text `hasName` shows when several files are picked, from their count, for\n * localization. Default: `` `${count} files` ``, with the count written the way the `locale`\n * of a `LocaleProvider` around it writes numbers. A single pick shows its file's name.\n */\n pickedFilesLabel?: (count: number) => string;\n}\n\n/**\n * The `File` component provides a Bulma-styled file input, supporting color, size, boxed/fullwidth/align styles, icons, \"has name\", and filename display.\n *\n * @function\n * @param {FileProps} props - Props for the File component.\n * @returns {JSX.Element} The rendered file upload field.\n * @see {@link https://bulma.io/documentation/form/file/ | Bulma File documentation}\n */\nexport const File = forwardRef<HTMLInputElement, FileProps>(\n (\n {\n // Field props\n label,\n labelSize,\n labelProps,\n horizontal,\n message,\n messageColor,\n fieldClassName,\n color,\n size,\n isBoxed,\n isFullwidth,\n isFullWidth,\n isRight,\n isCentered,\n hasName,\n buttonLabel,\n iconLeft,\n iconRight,\n className,\n inputClassName,\n fileName,\n pickedFilesLabel,\n onChange,\n ...props\n },\n ref\n ) => {\n // What the user last picked, and the form a reset of which clears it.\n const [picked, setPicked] = useState<{\n count: number;\n firstName: string;\n form: HTMLFormElement | null;\n }>();\n const pickedForm = picked?.form;\n useEffect(() => {\n if (!pickedForm) return;\n let timer: ReturnType<typeof setTimeout> | undefined;\n // The reset event fires before the form resets, and a listener after this one can still\n // cancel it, so the name is cleared a task later, and only if the reset went ahead.\n const onReset = (event: Event) => {\n timer = setTimeout(() => {\n if (!event.defaultPrevented) setPicked(undefined);\n });\n };\n pickedForm.addEventListener('reset', onReset);\n return () => {\n pickedForm.removeEventListener('reset', onReset);\n clearTimeout(timer);\n };\n }, [pickedForm]);\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const { files, form } = event.target;\n setPicked(\n files?.length\n ? { count: files.length, firstName: files[0].name, form }\n : undefined\n );\n onChange?.(event);\n };\n const formatNumber = useScopedNumberFormat();\n const pickedText =\n picked &&\n (picked.count === 1\n ? picked.firstName\n : (pickedFilesLabel?.(picked.count) ??\n `${formatNumber ? formatNumber(picked.count) : picked.count} files`));\n const shownName = fileName ?? pickedText;\n\n const insideField = useInsideField();\n const insideControl = useInsideControl();\n const ownField = rendersOwnField('File', {\n insideField,\n insideControl,\n label,\n message,\n horizontal,\n fieldClassName,\n });\n const { controlId, fieldLabelProps } = useAutoLabelId({\n label,\n id: props.id,\n labelProps,\n rendersLabel: ownField,\n });\n const { classPrefix } = useConfig();\n // The input takes `controlId`, so `id` stays out of the spread, where an\n // undefined `id` key would wipe the id the label points at.\n const { id: _id, ...inputProps } = props;\n const { bulmaHelperClasses, rest } = useBulmaClasses({\n color,\n ...inputProps,\n });\n\n // Mutually exclusive alignment\n let alignmentClass: string | undefined;\n if (isRight && isCentered) {\n // If both are set, prefer isRight and warn in dev\n alignmentClass = prefixedClassNames(classPrefix, 'is-right');\n } else if (isRight) {\n alignmentClass = prefixedClassNames(classPrefix, 'is-right');\n } else if (isCentered) {\n alignmentClass = prefixedClassNames(classPrefix, 'is-centered');\n }\n\n const mainClass = usePrefixedClassNames('file', {\n [`is-${color}`]: !!color,\n [`is-${size}`]: !!size,\n 'is-boxed': isBoxed,\n 'is-fullwidth': isFullwidth ?? isFullWidth,\n 'has-name': hasName,\n 'is-empty': hasName && !shownName,\n });\n const fileClass = classNames(\n mainClass,\n bulmaHelperClasses,\n alignmentClass,\n className\n );\n\n const helpClass = usePrefixedClassNames('help', {\n [`is-${messageColor}`]: !!messageColor,\n });\n const messageEl = message ? <p className={helpClass}>{message}</p> : null;\n\n const fileElement = (\n <div className={fileClass}>\n <label className={usePrefixedClassNames('file-label')}>\n <input\n ref={ref}\n className={classNames(\n usePrefixedClassNames('file-input'),\n inputClassName\n )}\n type=\"file\"\n id={controlId}\n onChange={handleChange}\n {...rest}\n />\n <span className={usePrefixedClassNames('file-cta')}>\n {iconLeft && (\n <span className={prefixedClassNames(classPrefix, 'file-icon')}>\n {iconLeft}\n </span>\n )}\n <span className={usePrefixedClassNames('file-label')}>\n {buttonLabel || 'Choose a file\\u2026'}\n </span>\n {iconRight && (\n <span className={prefixedClassNames(classPrefix, 'file-icon')}>\n {iconRight}\n </span>\n )}\n </span>\n {hasName && shownName && (\n <span className={prefixedClassNames(classPrefix, 'file-name')}>\n {shownName}\n </span>\n )}\n </label>\n </div>\n );\n\n if (ownField) {\n return (\n <Field\n label={label}\n labelSize={labelSize}\n labelProps={fieldLabelProps}\n horizontal={horizontal}\n className={fieldClassName}\n >\n {fileElement}\n {messageEl}\n </Field>\n );\n }\n\n return (\n <>\n {fileElement}\n {messageEl}\n </>\n );\n }\n);\n\nFile.displayName = 'File';\n\nexport default File;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
@@ -6,7 +6,7 @@ import { usePrefixedClassNames, classNames, prefixedClassNames } from '../helper
6
6
  import { useBulmaClasses } from '../helpers/useBulmaClasses.js';
7
7
  import { Icon } from '../elements/Icon.js';
8
8
  import { useIconLibrary, useClassPrefix } from '../helpers/Config.js';
9
- import { useNumberFormat } from '../helpers/localeFormat.js';
9
+ import { useScopedNumberFormat } from '../helpers/localeFormat.js';
10
10
  import { useFieldsetDisabled, useInsideField, useInsideControl, rendersOwnField, rendersOwnControl } from './FormContext.js';
11
11
  import { Field } from './Field.js';
12
12
  import { Control } from './Control.js';
@@ -67,7 +67,7 @@ const Rate = forwardRef(({ label, labelSize, labelProps, horizontal, message, me
67
67
  callerProps: props,
68
68
  });
69
69
  const { bulmaHelperClasses, rest } = useBulmaClasses(props);
70
- const formatNumber = useNumberFormat();
70
+ const formatNumber = useScopedNumberFormat();
71
71
  const starBaseId = useId();
72
72
  const [internalValue, setInternalValue] = useState(defaultValue);
73
73
  const [hoverValue, setHoverValue] = useState(null);