@danske/sapphire-react-lab 0.105.2 → 0.106.2

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 (216) hide show
  1. package/build/cjs/index.js +1607 -2284
  2. package/build/cjs/index.js.map +1 -1
  3. package/build/esm/Accordion/index.js.map +1 -1
  4. package/build/esm/Accordion/src/Accordion.js +44 -75
  5. package/build/esm/Accordion/src/Accordion.js.map +1 -1
  6. package/build/esm/Accordion/src/AccordionContext.js +3 -1
  7. package/build/esm/Accordion/src/AccordionContext.js.map +1 -1
  8. package/build/esm/Accordion/src/AccordionHeading.js +23 -55
  9. package/build/esm/Accordion/src/AccordionHeading.js.map +1 -1
  10. package/build/esm/Accordion/src/AccordionItem.js +18 -44
  11. package/build/esm/Accordion/src/AccordionItem.js.map +1 -1
  12. package/build/esm/Accordion/src/AccordionPanel.js +28 -45
  13. package/build/esm/Accordion/src/AccordionPanel.js.map +1 -1
  14. package/build/esm/Accordion/src/utils.js.map +1 -1
  15. package/build/esm/Alert/src/Alert.js +27 -65
  16. package/build/esm/Alert/src/Alert.js.map +1 -1
  17. package/build/esm/Amount/src/Amount.js +41 -63
  18. package/build/esm/Amount/src/Amount.js.map +1 -1
  19. package/build/esm/Amount/src/useGroupAmount.js +4 -1
  20. package/build/esm/Amount/src/useGroupAmount.js.map +1 -1
  21. package/build/esm/Autocomplete/i18n/da-DK.json.js +6 -0
  22. package/build/esm/Autocomplete/i18n/da-DK.json.js.map +1 -0
  23. package/build/esm/Autocomplete/i18n/de-DE.json.js +6 -0
  24. package/build/esm/Autocomplete/i18n/de-DE.json.js.map +1 -0
  25. package/build/esm/Autocomplete/i18n/en-US.json.js +6 -0
  26. package/build/esm/Autocomplete/i18n/en-US.json.js.map +1 -0
  27. package/build/esm/Autocomplete/i18n/fi-FI.json.js +6 -0
  28. package/build/esm/Autocomplete/i18n/fi-FI.json.js.map +1 -0
  29. package/build/esm/Autocomplete/i18n/index.js +9 -9
  30. package/build/esm/Autocomplete/i18n/index.js.map +1 -1
  31. package/build/esm/Autocomplete/i18n/nb-NO.json.js +6 -0
  32. package/build/esm/Autocomplete/i18n/nb-NO.json.js.map +1 -0
  33. package/build/esm/Autocomplete/i18n/pl-PL.json.js +6 -0
  34. package/build/esm/Autocomplete/i18n/pl-PL.json.js.map +1 -0
  35. package/build/esm/Autocomplete/i18n/sv-SE.json.js +6 -0
  36. package/build/esm/Autocomplete/i18n/sv-SE.json.js.map +1 -0
  37. package/build/esm/Autocomplete/src/Autocomplete.js +57 -76
  38. package/build/esm/Autocomplete/src/Autocomplete.js.map +1 -1
  39. package/build/esm/Breadcrumbs/src/BreadcrumbItem.js +46 -52
  40. package/build/esm/Breadcrumbs/src/BreadcrumbItem.js.map +1 -1
  41. package/build/esm/Breadcrumbs/src/BreadcrumbItemLink.js +17 -45
  42. package/build/esm/Breadcrumbs/src/BreadcrumbItemLink.js.map +1 -1
  43. package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js +25 -46
  44. package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js.map +1 -1
  45. package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js +18 -11
  46. package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +1 -1
  47. package/build/esm/Breadcrumbs/src/Breadcrumbs.js +47 -64
  48. package/build/esm/Breadcrumbs/src/Breadcrumbs.js.map +1 -1
  49. package/build/esm/Breadcrumbs/src/BreadcrumbsSeparator.js +8 -6
  50. package/build/esm/Breadcrumbs/src/BreadcrumbsSeparator.js.map +1 -1
  51. package/build/esm/Breadcrumbs/src/useBreadcrumbThreshold.js +6 -6
  52. package/build/esm/Breadcrumbs/src/useBreadcrumbThreshold.js.map +1 -1
  53. package/build/esm/FileDropzone/i18n/{da-DK.js → da-DK.json.js} +3 -3
  54. package/build/esm/FileDropzone/i18n/da-DK.json.js.map +1 -0
  55. package/build/esm/FileDropzone/i18n/{de-DE.js → de-DE.json.js} +3 -3
  56. package/build/esm/FileDropzone/i18n/de-DE.json.js.map +1 -0
  57. package/build/esm/FileDropzone/i18n/{en-US.js → en-US.json.js} +3 -3
  58. package/build/esm/FileDropzone/i18n/en-US.json.js.map +1 -0
  59. package/build/esm/FileDropzone/i18n/{fi-FI.js → fi-FI.json.js} +3 -3
  60. package/build/esm/FileDropzone/i18n/fi-FI.json.js.map +1 -0
  61. package/build/esm/FileDropzone/i18n/index.js +9 -9
  62. package/build/esm/FileDropzone/i18n/index.js.map +1 -1
  63. package/build/esm/FileDropzone/i18n/{nb-NO.js → nb-NO.json.js} +3 -3
  64. package/build/esm/FileDropzone/i18n/nb-NO.json.js.map +1 -0
  65. package/build/esm/FileDropzone/i18n/{pl-PL.js → pl-PL.json.js} +3 -3
  66. package/build/esm/FileDropzone/i18n/pl-PL.json.js.map +1 -0
  67. package/build/esm/FileDropzone/i18n/{sv-SE.js → sv-SE.json.js} +3 -3
  68. package/build/esm/FileDropzone/i18n/sv-SE.json.js.map +1 -0
  69. package/build/esm/FileDropzone/src/FileDropzone.js +68 -88
  70. package/build/esm/FileDropzone/src/FileDropzone.js.map +1 -1
  71. package/build/esm/FileDropzone/src/FileTrigger.js +29 -61
  72. package/build/esm/FileDropzone/src/FileTrigger.js.map +1 -1
  73. package/build/esm/FileDropzone/src/utils.js.map +1 -1
  74. package/build/esm/Filtering/src/FilterDropdown.js +91 -113
  75. package/build/esm/Filtering/src/FilterDropdown.js.map +1 -1
  76. package/build/esm/Filtering/src/SearchableSelectFilter.js +53 -70
  77. package/build/esm/Filtering/src/SearchableSelectFilter.js.map +1 -1
  78. package/build/esm/Flag/src/Flag.js +5 -37
  79. package/build/esm/Flag/src/Flag.js.map +1 -1
  80. package/build/esm/LabeledValue/src/LabeledValue.js +21 -55
  81. package/build/esm/LabeledValue/src/LabeledValue.js.map +1 -1
  82. package/build/esm/NumberField/i18n/da-DK.json.js +9 -0
  83. package/build/esm/NumberField/i18n/da-DK.json.js.map +1 -0
  84. package/build/esm/NumberField/i18n/de-DE.json.js +9 -0
  85. package/build/esm/NumberField/i18n/de-DE.json.js.map +1 -0
  86. package/build/esm/NumberField/i18n/en-US.json.js +9 -0
  87. package/build/esm/NumberField/i18n/en-US.json.js.map +1 -0
  88. package/build/esm/NumberField/i18n/fi-FI.json.js +9 -0
  89. package/build/esm/NumberField/i18n/fi-FI.json.js.map +1 -0
  90. package/build/esm/NumberField/i18n/index.js +9 -9
  91. package/build/esm/NumberField/i18n/index.js.map +1 -1
  92. package/build/esm/NumberField/i18n/nb-NO.json.js +9 -0
  93. package/build/esm/NumberField/i18n/nb-NO.json.js.map +1 -0
  94. package/build/esm/NumberField/i18n/pl-PL.json.js +9 -0
  95. package/build/esm/NumberField/i18n/pl-PL.json.js.map +1 -0
  96. package/build/esm/NumberField/i18n/sv-SE.json.js +9 -0
  97. package/build/esm/NumberField/i18n/sv-SE.json.js.map +1 -0
  98. package/build/esm/NumberField/src/NumberField.js +130 -111
  99. package/build/esm/NumberField/src/NumberField.js.map +1 -1
  100. package/build/esm/NumberField/src/StepperButton.js +32 -53
  101. package/build/esm/NumberField/src/StepperButton.js.map +1 -1
  102. package/build/esm/NumberField/src/cursorHelpers.js +13 -8
  103. package/build/esm/NumberField/src/cursorHelpers.js.map +1 -1
  104. package/build/esm/NumberField/src/formatHelpers.js +15 -18
  105. package/build/esm/NumberField/src/formatHelpers.js.map +1 -1
  106. package/build/esm/NumberField/src/keyboardHelpers.js +13 -8
  107. package/build/esm/NumberField/src/keyboardHelpers.js.map +1 -1
  108. package/build/esm/NumberField/src/useAutofillStyle.js.map +1 -1
  109. package/build/esm/NumberField/src/useNumberFieldFormatting.js +79 -45
  110. package/build/esm/NumberField/src/useNumberFieldFormatting.js.map +1 -1
  111. package/build/esm/NumberField/src/useSapphireNumberField.js +16 -42
  112. package/build/esm/NumberField/src/useSapphireNumberField.js.map +1 -1
  113. package/build/esm/ProgressIndicator/src/ProgressIndicator.js +23 -35
  114. package/build/esm/ProgressIndicator/src/ProgressIndicator.js.map +1 -1
  115. package/build/esm/Sidebar/index.js.map +1 -1
  116. package/build/esm/Sidebar/src/Body.js +19 -44
  117. package/build/esm/Sidebar/src/Body.js.map +1 -1
  118. package/build/esm/Sidebar/src/ExpandableItem.js +89 -97
  119. package/build/esm/Sidebar/src/ExpandableItem.js.map +1 -1
  120. package/build/esm/Sidebar/src/Header.js +14 -44
  121. package/build/esm/Sidebar/src/Header.js.map +1 -1
  122. package/build/esm/Sidebar/src/Item.js +17 -44
  123. package/build/esm/Sidebar/src/Item.js.map +1 -1
  124. package/build/esm/Sidebar/src/List.js +14 -43
  125. package/build/esm/Sidebar/src/List.js.map +1 -1
  126. package/build/esm/Sidebar/src/Panel.js +56 -69
  127. package/build/esm/Sidebar/src/Panel.js.map +1 -1
  128. package/build/esm/Sidebar/src/ResponsiveSidebarContext.js +17 -9
  129. package/build/esm/Sidebar/src/ResponsiveSidebarContext.js.map +1 -1
  130. package/build/esm/Sidebar/src/SecondarySidebarContext.js +15 -12
  131. package/build/esm/Sidebar/src/SecondarySidebarContext.js.map +1 -1
  132. package/build/esm/Sidebar/src/Section.js +38 -51
  133. package/build/esm/Sidebar/src/Section.js.map +1 -1
  134. package/build/esm/Sidebar/src/Sidebar.js +65 -93
  135. package/build/esm/Sidebar/src/Sidebar.js.map +1 -1
  136. package/build/esm/Sidebar/src/useSidebar.js.map +1 -1
  137. package/build/esm/Slider/index.js.map +1 -1
  138. package/build/esm/Slider/src/Slider.js +46 -71
  139. package/build/esm/Slider/src/Slider.js.map +1 -1
  140. package/build/esm/TagGroup/src/Tag.js +71 -86
  141. package/build/esm/TagGroup/src/Tag.js.map +1 -1
  142. package/build/esm/TagGroup/src/TagGroup.js +46 -67
  143. package/build/esm/TagGroup/src/TagGroup.js.map +1 -1
  144. package/build/esm/TagGroup/src/TagItem.js +1 -1
  145. package/build/esm/TagGroup/src/TagItem.js.map +1 -1
  146. package/build/esm/TimeField/i18n/da-DK.json.js +7 -0
  147. package/build/esm/TimeField/i18n/da-DK.json.js.map +1 -0
  148. package/build/esm/TimeField/i18n/de-DE.json.js +7 -0
  149. package/build/esm/TimeField/i18n/de-DE.json.js.map +1 -0
  150. package/build/esm/TimeField/i18n/en-US.json.js +7 -0
  151. package/build/esm/TimeField/i18n/en-US.json.js.map +1 -0
  152. package/build/esm/TimeField/i18n/fi-FI.json.js +7 -0
  153. package/build/esm/TimeField/i18n/fi-FI.json.js.map +1 -0
  154. package/build/esm/TimeField/i18n/index.js +7 -7
  155. package/build/esm/TimeField/i18n/index.js.map +1 -1
  156. package/build/esm/TimeField/i18n/nb-NO.json.js +7 -0
  157. package/build/esm/TimeField/i18n/nb-NO.json.js.map +1 -0
  158. package/build/esm/TimeField/i18n/pl-PL.json.js +7 -0
  159. package/build/esm/TimeField/i18n/pl-PL.json.js.map +1 -0
  160. package/build/esm/TimeField/i18n/{sv-SE.js → sv-SE.json.js} +1 -1
  161. package/build/esm/TimeField/i18n/sv-SE.json.js.map +1 -0
  162. package/build/esm/TimeField/src/TimeField.js +67 -84
  163. package/build/esm/TimeField/src/TimeField.js.map +1 -1
  164. package/build/esm/TimeField/src/TimeFieldSegment.js +25 -37
  165. package/build/esm/TimeField/src/TimeFieldSegment.js.map +1 -1
  166. package/build/esm/index.js +1 -1
  167. package/build/index.d.ts +19 -17
  168. package/package.json +16 -39
  169. package/build/esm/Autocomplete/i18n/da-DK.js +0 -6
  170. package/build/esm/Autocomplete/i18n/da-DK.js.map +0 -1
  171. package/build/esm/Autocomplete/i18n/de-DE.js +0 -6
  172. package/build/esm/Autocomplete/i18n/de-DE.js.map +0 -1
  173. package/build/esm/Autocomplete/i18n/en-US.js +0 -6
  174. package/build/esm/Autocomplete/i18n/en-US.js.map +0 -1
  175. package/build/esm/Autocomplete/i18n/fi-FI.js +0 -6
  176. package/build/esm/Autocomplete/i18n/fi-FI.js.map +0 -1
  177. package/build/esm/Autocomplete/i18n/nb-NO.js +0 -6
  178. package/build/esm/Autocomplete/i18n/nb-NO.js.map +0 -1
  179. package/build/esm/Autocomplete/i18n/pl-PL.js +0 -6
  180. package/build/esm/Autocomplete/i18n/pl-PL.js.map +0 -1
  181. package/build/esm/Autocomplete/i18n/sv-SE.js +0 -6
  182. package/build/esm/Autocomplete/i18n/sv-SE.js.map +0 -1
  183. package/build/esm/FileDropzone/i18n/da-DK.js.map +0 -1
  184. package/build/esm/FileDropzone/i18n/de-DE.js.map +0 -1
  185. package/build/esm/FileDropzone/i18n/en-US.js.map +0 -1
  186. package/build/esm/FileDropzone/i18n/fi-FI.js.map +0 -1
  187. package/build/esm/FileDropzone/i18n/nb-NO.js.map +0 -1
  188. package/build/esm/FileDropzone/i18n/pl-PL.js.map +0 -1
  189. package/build/esm/FileDropzone/i18n/sv-SE.js.map +0 -1
  190. package/build/esm/NumberField/i18n/da-DK.js +0 -9
  191. package/build/esm/NumberField/i18n/da-DK.js.map +0 -1
  192. package/build/esm/NumberField/i18n/de-DE.js +0 -9
  193. package/build/esm/NumberField/i18n/de-DE.js.map +0 -1
  194. package/build/esm/NumberField/i18n/en-US.js +0 -9
  195. package/build/esm/NumberField/i18n/en-US.js.map +0 -1
  196. package/build/esm/NumberField/i18n/fi-FI.js +0 -9
  197. package/build/esm/NumberField/i18n/fi-FI.js.map +0 -1
  198. package/build/esm/NumberField/i18n/nb-NO.js +0 -9
  199. package/build/esm/NumberField/i18n/nb-NO.js.map +0 -1
  200. package/build/esm/NumberField/i18n/pl-PL.js +0 -9
  201. package/build/esm/NumberField/i18n/pl-PL.js.map +0 -1
  202. package/build/esm/NumberField/i18n/sv-SE.js +0 -9
  203. package/build/esm/NumberField/i18n/sv-SE.js.map +0 -1
  204. package/build/esm/TimeField/i18n/da-DK.js +0 -7
  205. package/build/esm/TimeField/i18n/da-DK.js.map +0 -1
  206. package/build/esm/TimeField/i18n/de-DE.js +0 -7
  207. package/build/esm/TimeField/i18n/de-DE.js.map +0 -1
  208. package/build/esm/TimeField/i18n/en-US.js +0 -7
  209. package/build/esm/TimeField/i18n/en-US.js.map +0 -1
  210. package/build/esm/TimeField/i18n/fi-FI.js +0 -7
  211. package/build/esm/TimeField/i18n/fi-FI.js.map +0 -1
  212. package/build/esm/TimeField/i18n/nb-NO.js +0 -7
  213. package/build/esm/TimeField/i18n/nb-NO.js.map +0 -1
  214. package/build/esm/TimeField/i18n/pl-PL.js +0 -7
  215. package/build/esm/TimeField/i18n/pl-PL.js.map +0 -1
  216. package/build/esm/TimeField/i18n/sv-SE.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"NumberField.js","sources":["../../../../src/NumberField/src/NumberField.tsx"],"sourcesContent":["import React, {\n forwardRef,\n ForwardedRef,\n ReactNode,\n RefObject,\n useImperativeHandle,\n useRef,\n useMemo,\n} from 'react';\nimport clsx from 'clsx';\nimport { useFocusRing } from '@react-aria/focus';\nimport { useLocale, useMessageFormatter } from '@react-aria/i18n';\nimport { mergeProps, useObjectRef } from '@react-aria/utils';\nimport { createFocusableRef } from '@react-spectrum/utils';\nimport { FocusableRefValue, PressEvents } from '@react-types/shared';\nimport textFieldStyles from '@danske/sapphire-css/components/textField/textField.module.css';\nimport {\n Field,\n Label,\n SapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n Separator,\n} from '@danske/sapphire-react';\n\nimport intlMessages from '../i18n';\nimport { StepperButton } from './StepperButton';\nimport { useAutofillStyle } from './useAutofillStyle';\nimport { useNumberFieldFormatting } from './useNumberFieldFormatting';\nimport {\n SapphireNumberFieldProps,\n useSapphireNumberField,\n} from './useSapphireNumberField';\n\nexport type NumberFieldRef = FocusableRefValue<\n HTMLInputElement,\n HTMLDivElement\n> & {\n getInputElement(): HTMLInputElement | null;\n};\n\nexport interface NumberFieldProps\n extends SapphireNumberFieldProps,\n PressEvents,\n SapphireStyleProps,\n GlobalDomAttributes {\n /**\n * A string or element to show before / after the input value.\n *\n * By default (`'auto'`), the component will automatically extract currency/unit symbols\n * from the locale formatter and display them as prefix/postfix.\n * If you provide a custom prefix or postfix, those will be used instead and\n * the extracted symbols will be ignored.\n *\n * @default 'auto' - automatically extracts currency/unit symbols from locale formatter\n */\n affix?: 'auto' | { prefix?: ReactNode; postfix?: ReactNode };\n inputRef?: RefObject<HTMLInputElement | null>;\n /**\n * A note to show below the input.\n * If the input has an error message, this note will be replaced by that.\n */\n note?: ReactNode;\n /**\n * A HelpButton to render next to the label.\n */\n contextualHelp?: ReactNode;\n /**\n * To visually indicate if this field is required or optional.\n * @default false\n */\n necessityIndicator?: boolean;\n /**\n * @default 'lg'\n */\n size?: 'lg' | 'md';\n /**\n * Aligns the text inside the input fields without affecting the positioning of the label of the field.\n */\n alignInputRight?: boolean;\n /**\n * Places the label either above (default) or on the side of the control.\n * @default 'above'\n */\n labelPlacement?: 'side' | 'above';\n /**\n * To show the buttons for incrementing and decrementing the value.\n * @default false\n */\n showButtons?: boolean;\n /**\n * Enables automatic formatting of the input value as the user types, based on the provided formatter and affix.\n *\n * @default false\n */\n autoFormat?: boolean;\n}\n\nexport const NumberField = forwardRef(function NumberField(\n props: NumberFieldProps,\n ref: ForwardedRef<NumberFieldRef>\n) {\n const {\n label,\n isDisabled,\n error,\n note,\n isRequired,\n contextualHelp,\n affix = 'auto',\n size = 'lg',\n labelPlacement = 'above',\n necessityIndicator = false,\n alignInputRight,\n showButtons = false,\n incrementAriaLabel,\n decrementAriaLabel,\n autoFormat = false,\n ...otherProps\n } = props;\n\n // Extract prefix and postfix from affix prop\n const { prefix, postfix } = useMemo(() => {\n if (affix === 'auto') {\n return { prefix: undefined, postfix: undefined };\n }\n return { prefix: affix.prefix, postfix: affix.postfix };\n }, [affix]);\n useThemeCheck();\n const inputRef = useObjectRef<HTMLInputElement>(props.inputRef);\n const formatMessage = useMessageFormatter(intlMessages);\n\n const {\n inputProps,\n labelProps,\n incrementButtonProps,\n decrementButtonProps,\n descriptionProps,\n errorMessageProps,\n } = useSapphireNumberField(\n {\n ...props,\n incrementAriaLabel: incrementAriaLabel ?? formatMessage('increment'),\n decrementAriaLabel: decrementAriaLabel ?? formatMessage('decrement'),\n },\n inputRef\n );\n const { focusProps, isFocusVisible } = useFocusRing();\n const { autofillStyles, updateStyle } = useAutofillStyle<'input'>(inputRef);\n const { locale } = useLocale();\n\n const formatter = useMemo(\n () => new Intl.NumberFormat(locale, props.formatOptions),\n [locale, props.formatOptions]\n );\n\n const formattingResult = useNumberFieldFormatting({\n inputRef,\n formatter,\n inputValue: inputProps.value as string,\n prefix,\n postfix,\n onOriginalKeyDown: inputProps.onKeyDown,\n onChange: props.onChange,\n autoFormat,\n });\n\n const { extractedPrefix, extractedPostfix, handleInput, handleKeyDown } =\n autoFormat\n ? formattingResult\n : {\n extractedPrefix: formattingResult.extractedPrefix,\n extractedPostfix: formattingResult.extractedPostfix,\n handleInput: undefined,\n handleKeyDown: inputProps.onKeyDown,\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(ref, () => ({\n ...createFocusableRef(containerRef, inputRef),\n /**\n * (This function is deprecated. Use `inputRef` prop)\n * @deprecated\n */\n getInputElement() {\n return inputRef.current;\n },\n }));\n\n return (\n <Field\n // otherProps contains some of the same props as inputProps. That is\n // intended, but some DOM props, like \"id\", should not be repeated\n {...removeUniqueDOMProps(otherProps)}\n ref={containerRef}\n size={size}\n labelPlacement={labelPlacement}\n >\n <Field.Context\n descriptionProps={error ? errorMessageProps : descriptionProps}\n >\n {label && (\n <Field.Label>\n <Label\n {...labelProps}\n size={size}\n necessityIndicator={\n isRequired && necessityIndicator\n ? 'required'\n : !isRequired && necessityIndicator\n ? 'optional'\n : undefined\n }\n contextualHelp={contextualHelp}\n >\n {label}\n </Label>\n </Field.Label>\n )}\n <Field.Control>\n <div\n className={clsx(textFieldStyles['sapphire-text-field'], {\n [textFieldStyles['is-focus']]: isFocusVisible,\n [textFieldStyles['sapphire-text-field--error']]:\n error === true || typeof error === 'string',\n [textFieldStyles['sapphire-text-field--md']]: size === 'md',\n })}\n >\n {extractedPrefix && (\n <span\n className={clsx(\n textFieldStyles['sapphire-text-field__prefix'],\n {\n [textFieldStyles['sapphire-text-field__prefix--icon']]:\n typeof extractedPrefix !== 'string',\n }\n )}\n >\n {extractedPrefix}\n </span>\n )}\n <input\n {...mergeProps(\n inputProps,\n focusProps,\n {\n onChange: updateStyle,\n onBlur: updateStyle,\n },\n autoFormat\n ? {\n onInput: handleInput,\n onKeyDown: handleKeyDown,\n }\n : {}\n )}\n value={formattingResult?.displayValue ?? inputProps.value}\n ref={inputRef}\n className={clsx(textFieldStyles['sapphire-text-field__input'], {\n [textFieldStyles['sapphire-text-field__input--align-right']]:\n !!alignInputRight,\n })}\n style={autofillStyles}\n />\n {extractedPostfix && (\n <span\n className={clsx(\n textFieldStyles['sapphire-text-field__postfix'],\n {\n [textFieldStyles['sapphire-text-field__postfix--icon']]:\n typeof extractedPostfix !== 'string',\n }\n )}\n >\n {extractedPostfix}\n </span>\n )}\n {showButtons && (\n <div className={textFieldStyles['sapphire-text-field__stepper']}>\n <StepperButton\n variant=\"decrement\"\n size={size}\n {...decrementButtonProps}\n />\n <Separator orientation=\"vertical\" />\n <StepperButton\n variant=\"increment\"\n size={size}\n {...incrementButtonProps}\n />\n </div>\n )}\n </div>\n </Field.Control>\n {((error && typeof error !== 'boolean') || note) && (\n <Field.Footer>\n {error && typeof error !== 'boolean' ? (\n <Field.Note variant=\"error\">{error}</Field.Note>\n ) : note ? (\n note\n ) : (\n <></>\n )}\n </Field.Footer>\n )}\n </Field.Context>\n </Field>\n );\n});\n\n// Once moved to the core package, this function should be removed and instead consume the one from TextFieldBase.\nconst removeUniqueDOMProps = (props: Record<any, any>): Record<any, any> =>\n Object.fromEntries(\n Object.entries(props).filter(\n ([name]) => name !== 'id' && !name.startsWith('data-')\n )\n );\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NumberField.js","sources":["../../../../src/NumberField/src/NumberField.tsx"],"sourcesContent":["import React, {\n forwardRef,\n ForwardedRef,\n ReactNode,\n RefObject,\n useImperativeHandle,\n useRef,\n useMemo,\n} from 'react';\nimport clsx from 'clsx';\nimport { useFocusRing } from 'react-aria/useFocusRing';\nimport { useLocale } from 'react-aria/I18nProvider';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { createFocusableRef } from '@react-spectrum/utils';\nimport { FocusableRefValue, PressEvents } from '@react-types/shared';\nimport textFieldStyles from '@danske/sapphire-css/components/textField/textField.module.css';\nimport {\n Field,\n Label,\n SapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n Separator,\n} from '@danske/sapphire-react';\n\nimport intlMessages from '../i18n';\nimport { StepperButton } from './StepperButton';\nimport { useAutofillStyle } from './useAutofillStyle';\nimport { useNumberFieldFormatting } from './useNumberFieldFormatting';\nimport {\n SapphireNumberFieldProps,\n useSapphireNumberField,\n} from './useSapphireNumberField';\n\nexport type NumberFieldRef = FocusableRefValue<\n HTMLInputElement,\n HTMLDivElement\n> & {\n getInputElement(): HTMLInputElement | null;\n};\n\nexport interface NumberFieldProps\n extends SapphireNumberFieldProps,\n PressEvents,\n SapphireStyleProps,\n GlobalDomAttributes {\n /**\n * A string or element to show before / after the input value.\n *\n * By default (`'auto'`), the component will automatically extract currency/unit symbols\n * from the locale formatter and display them as prefix/postfix.\n * If you provide a custom prefix or postfix, those will be used instead and\n * the extracted symbols will be ignored.\n *\n * @default 'auto' - automatically extracts currency/unit symbols from locale formatter\n */\n affix?: 'auto' | { prefix?: ReactNode; postfix?: ReactNode };\n inputRef?: RefObject<HTMLInputElement | null>;\n /**\n * A note to show below the input.\n * If the input has an error message, this note will be replaced by that.\n */\n note?: ReactNode;\n /**\n * A HelpButton to render next to the label.\n */\n contextualHelp?: ReactNode;\n /**\n * To visually indicate if this field is required or optional.\n * @default false\n */\n necessityIndicator?: boolean;\n /**\n * @default 'lg'\n */\n size?: 'lg' | 'md';\n /**\n * Aligns the text inside the input fields without affecting the positioning of the label of the field.\n */\n alignInputRight?: boolean;\n /**\n * Places the label either above (default) or on the side of the control.\n * @default 'above'\n */\n labelPlacement?: 'side' | 'above';\n /**\n * To show the buttons for incrementing and decrementing the value.\n * @default false\n */\n showButtons?: boolean;\n /**\n * Enables automatic formatting of the input value as the user types, based on the provided formatter and affix.\n *\n * @default false\n */\n autoFormat?: boolean;\n}\n\nexport const NumberField = forwardRef(function NumberField(\n props: NumberFieldProps,\n ref: ForwardedRef<NumberFieldRef>\n) {\n const {\n label,\n isDisabled,\n error,\n note,\n isRequired,\n contextualHelp,\n affix = 'auto',\n size = 'lg',\n labelPlacement = 'above',\n necessityIndicator = false,\n alignInputRight,\n showButtons = false,\n incrementAriaLabel,\n decrementAriaLabel,\n autoFormat = false,\n ...otherProps\n } = props;\n\n // Extract prefix and postfix from affix prop\n const { prefix, postfix } = useMemo(() => {\n if (affix === 'auto') {\n return { prefix: undefined, postfix: undefined };\n }\n return { prefix: affix.prefix, postfix: affix.postfix };\n }, [affix]);\n useThemeCheck();\n const inputRef = useObjectRef<HTMLInputElement>(props.inputRef);\n const formatMessage = useMessageFormatter(intlMessages);\n\n const {\n inputProps,\n labelProps,\n incrementButtonProps,\n decrementButtonProps,\n descriptionProps,\n errorMessageProps,\n } = useSapphireNumberField(\n {\n ...props,\n incrementAriaLabel: incrementAriaLabel ?? formatMessage('increment'),\n decrementAriaLabel: decrementAriaLabel ?? formatMessage('decrement'),\n },\n inputRef\n );\n const { focusProps, isFocusVisible } = useFocusRing();\n const { autofillStyles, updateStyle } = useAutofillStyle<'input'>(inputRef);\n const { locale } = useLocale();\n\n const formatter = useMemo(\n () => new Intl.NumberFormat(locale, props.formatOptions),\n [locale, props.formatOptions]\n );\n\n const formattingResult = useNumberFieldFormatting({\n inputRef,\n formatter,\n inputValue: inputProps.value as string,\n prefix,\n postfix,\n onOriginalKeyDown: inputProps.onKeyDown,\n onChange: props.onChange,\n autoFormat,\n });\n\n const { extractedPrefix, extractedPostfix, handleInput, handleKeyDown } =\n autoFormat\n ? formattingResult\n : {\n extractedPrefix: formattingResult.extractedPrefix,\n extractedPostfix: formattingResult.extractedPostfix,\n handleInput: undefined,\n handleKeyDown: inputProps.onKeyDown,\n };\n\n const containerRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(ref, () => ({\n ...createFocusableRef(containerRef, inputRef),\n /**\n * (This function is deprecated. Use `inputRef` prop)\n * @deprecated\n */\n getInputElement() {\n return inputRef.current;\n },\n }));\n\n return (\n <Field\n // otherProps contains some of the same props as inputProps. That is\n // intended, but some DOM props, like \"id\", should not be repeated\n {...removeUniqueDOMProps(otherProps)}\n ref={containerRef}\n size={size}\n labelPlacement={labelPlacement}\n >\n <Field.Context\n descriptionProps={error ? errorMessageProps : descriptionProps}\n >\n {label && (\n <Field.Label>\n <Label\n {...labelProps}\n size={size}\n necessityIndicator={\n isRequired && necessityIndicator\n ? 'required'\n : !isRequired && necessityIndicator\n ? 'optional'\n : undefined\n }\n contextualHelp={contextualHelp}\n >\n {label}\n </Label>\n </Field.Label>\n )}\n <Field.Control>\n <div\n className={clsx(textFieldStyles['sapphire-text-field'], {\n [textFieldStyles['is-focus']]: isFocusVisible,\n [textFieldStyles['sapphire-text-field--error']]:\n error === true || typeof error === 'string',\n [textFieldStyles['sapphire-text-field--md']]: size === 'md',\n })}\n >\n {extractedPrefix && (\n <span\n className={clsx(\n textFieldStyles['sapphire-text-field__prefix'],\n {\n [textFieldStyles['sapphire-text-field__prefix--icon']]:\n typeof extractedPrefix !== 'string',\n }\n )}\n >\n {extractedPrefix}\n </span>\n )}\n <input\n {...mergeProps(\n inputProps,\n focusProps,\n {\n onChange: updateStyle,\n onBlur: updateStyle,\n },\n autoFormat\n ? {\n onInput: handleInput,\n onKeyDown: handleKeyDown,\n }\n : {}\n )}\n value={formattingResult?.displayValue ?? inputProps.value}\n ref={inputRef}\n className={clsx(textFieldStyles['sapphire-text-field__input'], {\n [textFieldStyles['sapphire-text-field__input--align-right']]:\n !!alignInputRight,\n })}\n style={autofillStyles}\n />\n {extractedPostfix && (\n <span\n className={clsx(\n textFieldStyles['sapphire-text-field__postfix'],\n {\n [textFieldStyles['sapphire-text-field__postfix--icon']]:\n typeof extractedPostfix !== 'string',\n }\n )}\n >\n {extractedPostfix}\n </span>\n )}\n {showButtons && (\n <div className={textFieldStyles['sapphire-text-field__stepper']}>\n <StepperButton\n variant=\"decrement\"\n size={size}\n {...decrementButtonProps}\n />\n <Separator orientation=\"vertical\" />\n <StepperButton\n variant=\"increment\"\n size={size}\n {...incrementButtonProps}\n />\n </div>\n )}\n </div>\n </Field.Control>\n {((error && typeof error !== 'boolean') || note) && (\n <Field.Footer>\n {error && typeof error !== 'boolean' ? (\n <Field.Note variant=\"error\">{error}</Field.Note>\n ) : note ? (\n note\n ) : (\n <></>\n )}\n </Field.Footer>\n )}\n </Field.Context>\n </Field>\n );\n});\n\n// Once moved to the core package, this function should be removed and instead consume the one from TextFieldBase.\nconst removeUniqueDOMProps = (props: Record<any, any>): Record<any, any> =>\n Object.fromEntries(\n Object.entries(props).filter(\n ([name]) => name !== 'id' && !name.startsWith('data-')\n )\n );\n"],"names":["NumberField"],"mappings":"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"}
@@ -1,66 +1,45 @@
1
1
  import React, { useRef } from 'react';
2
- import { useHover } from '@react-aria/interactions';
3
- import { mergeProps, filterDOMProps } from '@react-aria/utils';
2
+ import { useHover } from 'react-aria/useHover';
3
+ import { filterDOMProps } from 'react-aria/filterDOMProps';
4
+ import { mergeProps } from 'react-aria/mergeProps';
4
5
  import clsx from 'clsx';
5
6
  import textFieldStyles from '@danske/sapphire-css/components/textField/textField.module.css';
6
7
  import { useButton, Icon } from '@danske/sapphire-react';
7
8
  import { Add, Subtract } from '@danske/sapphire-icons/react';
8
- import { useFocusRing } from '@react-aria/focus';
9
+ import { useFocusRing } from 'react-aria/useFocusRing';
9
10
 
10
- var __defProp = Object.defineProperty;
11
- var __defProps = Object.defineProperties;
12
- var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
13
- var __getOwnPropSymbols = Object.getOwnPropertySymbols;
14
- var __hasOwnProp = Object.prototype.hasOwnProperty;
15
- var __propIsEnum = Object.prototype.propertyIsEnumerable;
16
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
17
- var __spreadValues = (a, b) => {
18
- for (var prop in b || (b = {}))
19
- if (__hasOwnProp.call(b, prop))
20
- __defNormalProp(a, prop, b[prop]);
21
- if (__getOwnPropSymbols)
22
- for (var prop of __getOwnPropSymbols(b)) {
23
- if (__propIsEnum.call(b, prop))
24
- __defNormalProp(a, prop, b[prop]);
25
- }
26
- return a;
27
- };
28
- var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
29
- var __objRest = (source, exclude) => {
30
- var target = {};
31
- for (var prop in source)
32
- if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
33
- target[prop] = source[prop];
34
- if (source != null && __getOwnPropSymbols)
35
- for (var prop of __getOwnPropSymbols(source)) {
36
- if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
37
- target[prop] = source[prop];
38
- }
39
- return target;
40
- };
41
- const StepperButton = (_a) => {
42
- var _b = _a, {
43
- variant,
44
- size
45
- } = _b, props = __objRest(_b, [
46
- "variant",
47
- "size"
48
- ]);
11
+ const StepperButton = ({
12
+ variant,
13
+ size,
14
+ ...props
15
+ }) => {
49
16
  const ref = useRef(null);
50
17
  const { buttonProps, isPressed } = useButton(props, ref);
51
18
  const { hoverProps, isHovered } = useHover({ isDisabled: props.isDisabled });
52
19
  const { focusProps, isFocusVisible } = useFocusRing();
53
- return /* @__PURE__ */ React.createElement("button", __spreadProps(__spreadValues({}, mergeProps(buttonProps, hoverProps, focusProps, filterDOMProps(props, { global: true }))), {
54
- tabIndex: 0,
55
- ref,
56
- className: clsx(textFieldStyles["sapphire-text-field__stepper-button"], textFieldStyles["js-hover"], {
57
- [textFieldStyles["is-active"]]: isPressed,
58
- [textFieldStyles["is-hover"]]: isHovered,
59
- [textFieldStyles["is-focus"]]: isFocusVisible
60
- })
61
- }), /* @__PURE__ */ React.createElement(Icon, {
62
- size: size === "lg" ? "md" : "sm"
63
- }, variant === "increment" ? /* @__PURE__ */ React.createElement(Add, null) : /* @__PURE__ */ React.createElement(Subtract, null)));
20
+ return /* @__PURE__ */ React.createElement(
21
+ "button",
22
+ {
23
+ ...mergeProps(
24
+ buttonProps,
25
+ hoverProps,
26
+ focusProps,
27
+ filterDOMProps(props, { global: true })
28
+ ),
29
+ tabIndex: 0,
30
+ ref,
31
+ className: clsx(
32
+ textFieldStyles["sapphire-text-field__stepper-button"],
33
+ textFieldStyles["js-hover"],
34
+ {
35
+ [textFieldStyles["is-active"]]: isPressed,
36
+ [textFieldStyles["is-hover"]]: isHovered,
37
+ [textFieldStyles["is-focus"]]: isFocusVisible
38
+ }
39
+ )
40
+ },
41
+ /* @__PURE__ */ React.createElement(Icon, { size: size === "lg" ? "md" : "sm" }, variant === "increment" ? /* @__PURE__ */ React.createElement(Add, null) : /* @__PURE__ */ React.createElement(Subtract, null))
42
+ );
64
43
  };
65
44
 
66
45
  export { StepperButton };
@@ -1 +1 @@
1
- {"version":3,"file":"StepperButton.js","sources":["../../../../src/NumberField/src/StepperButton.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport { AriaButtonProps } from '@react-aria/button';\nimport { useHover } from '@react-aria/interactions';\nimport { filterDOMProps, mergeProps } from '@react-aria/utils';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/textField/textField.module.css';\nimport { Icon, useButton } from '@danske/sapphire-react';\nimport { Add, Subtract } from '@danske/sapphire-icons/react';\nimport { useFocusRing } from '@react-aria/focus';\n\n/**\n * @internal\n */\nexport const StepperButton = ({\n variant,\n size,\n ...props\n}: AriaButtonProps & {\n variant: 'increment' | 'decrement';\n size: 'lg' | 'md';\n}): React.JSX.Element => {\n const ref = useRef(null);\n const { buttonProps, isPressed } = useButton(props, ref);\n const { hoverProps, isHovered } = useHover({ isDisabled: props.isDisabled });\n const { focusProps, isFocusVisible } = useFocusRing();\n\n return (\n <button\n {...mergeProps(\n buttonProps,\n hoverProps,\n focusProps,\n filterDOMProps(props, { global: true })\n )}\n tabIndex={0} // tabIndex comes as \"-1\" from the react-aria hook\n ref={ref}\n className={clsx(\n styles['sapphire-text-field__stepper-button'],\n styles['js-hover'],\n {\n [styles['is-active']]: isPressed,\n [styles['is-hover']]: isHovered,\n [styles['is-focus']]: isFocusVisible,\n }\n )}\n >\n <Icon size={size === 'lg' ? 'md' : 'sm'}>\n {variant === 'increment' ? <Add /> : <Subtract />}\n </Icon>\n </button>\n );\n};\n"],"names":["styles"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaa,MAAA,aAAA,GAAgB,CAAC,EAOL,KAAA;AAPK,EAC5B,IAAA,EAAA,GAAA,EAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IACA,IAAA;AAAA,GAF4B,GAAA,EAAA,EAGzB,kBAHyB,EAGzB,EAAA;AAAA,IAFH,SAAA;AAAA,IACA,MAAA;AAAA,GAAA,CAAA,CAAA;AAMA,EAAA,MAAM,MAAM,MAAO,CAAA,IAAA,CAAA,CAAA;AACnB,EAAA,MAAM,EAAE,WAAA,EAAa,SAAc,EAAA,GAAA,SAAA,CAAU,KAAO,EAAA,GAAA,CAAA,CAAA;AACpD,EAAA,MAAM,EAAE,UAAY,EAAA,SAAA,EAAA,GAAc,QAAS,CAAA,EAAE,YAAY,KAAM,CAAA,UAAA,EAAA,CAAA,CAAA;AAC/D,EAAM,MAAA,EAAE,YAAY,cAAmB,EAAA,GAAA,YAAA,EAAA,CAAA;AAEvC,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,QAAD,EAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACM,UACF,CAAA,WAAA,EACA,UACA,EAAA,UAAA,EACA,cAAe,CAAA,KAAA,EAAO,EAAE,MAAA,EAAQ,IALpC,EAAA,CAAA,CAAA,CAAA,EAAA;AAAA,IAOE,QAAU,EAAA,CAAA;AAAA,IACV,GAAA;AAAA,IACA,SAAW,EAAA,IAAA,CACTA,eAAO,CAAA,qCAAA,CAAA,EACPA,gBAAO,UACP,CAAA,EAAA;AAAA,MAAA,CACGA,gBAAO,WAAe,CAAA,GAAA,SAAA;AAAA,MAAA,CACtBA,gBAAO,UAAc,CAAA,GAAA,SAAA;AAAA,MAAA,CACrBA,gBAAO,UAAc,CAAA,GAAA,cAAA;AAAA,KAAA,CAAA;AAAA,GAAA,CAAA,sCAIzB,IAAD,EAAA;AAAA,IAAM,IAAA,EAAM,IAAS,KAAA,IAAA,GAAO,IAAO,GAAA,IAAA;AAAA,GAAA,EAChC,YAAY,WAAc,mBAAA,KAAA,CAAA,aAAA,CAAC,GAAD,EAAA,IAAA,CAAA,uCAAW,QAAD,EAAA,IAAA,CAAA,CAAA,CAAA,CAAA;AAAA;;;;"}
1
+ {"version":3,"file":"StepperButton.js","sources":["../../../../src/NumberField/src/StepperButton.tsx"],"sourcesContent":["import React, { useRef } from 'react';\nimport { AriaButtonProps } from 'react-aria/useButton';\nimport { useHover } from 'react-aria/useHover';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/textField/textField.module.css';\nimport { Icon, useButton } from '@danske/sapphire-react';\nimport { Add, Subtract } from '@danske/sapphire-icons/react';\nimport { useFocusRing } from 'react-aria/useFocusRing';\n\n/**\n * @internal\n */\nexport const StepperButton = ({\n variant,\n size,\n ...props\n}: AriaButtonProps & {\n variant: 'increment' | 'decrement';\n size: 'lg' | 'md';\n}): React.JSX.Element => {\n const ref = useRef(null);\n const { buttonProps, isPressed } = useButton(props, ref);\n const { hoverProps, isHovered } = useHover({ isDisabled: props.isDisabled });\n const { focusProps, isFocusVisible } = useFocusRing();\n\n return (\n <button\n {...mergeProps(\n buttonProps,\n hoverProps,\n focusProps,\n filterDOMProps(props, { global: true })\n )}\n tabIndex={0} // tabIndex comes as \"-1\" from the react-aria hook\n ref={ref}\n className={clsx(\n styles['sapphire-text-field__stepper-button'],\n styles['js-hover'],\n {\n [styles['is-active']]: isPressed,\n [styles['is-hover']]: isHovered,\n [styles['is-focus']]: isFocusVisible,\n }\n )}\n >\n <Icon size={size === 'lg' ? 'md' : 'sm'}>\n {variant === 'increment' ? <Add /> : <Subtract />}\n </Icon>\n </button>\n );\n};\n"],"names":["styles"],"mappings":";;;;;;;;;;AAcO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,OAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG;AACL,CAAA,KAGyB;AACvB,EAAA,MAAM,GAAA,GAAM,OAAO,IAAI,CAAA;AACvB,EAAA,MAAM,EAAE,WAAA,EAAa,SAAA,EAAU,GAAI,SAAA,CAAU,OAAO,GAAG,CAAA;AACvD,EAAA,MAAM,EAAE,YAAY,SAAA,EAAU,GAAI,SAAS,EAAE,UAAA,EAAY,KAAA,CAAM,UAAA,EAAY,CAAA;AAC3E,EAAA,MAAM,EAAE,UAAA,EAAY,cAAA,EAAe,GAAI,YAAA,EAAa;AAEpD,EAAA,uBACE,KAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACE,GAAG,UAAA;AAAA,QACF,WAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,cAAA,CAAe,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM;AAAA,OACxC;AAAA,MACA,QAAA,EAAU,CAAA;AAAA,MACV,GAAA;AAAA,MACA,SAAA,EAAW,IAAA;AAAA,QACTA,gBAAO,qCAAqC,CAAA;AAAA,QAC5CA,gBAAO,UAAU,CAAA;AAAA,QACjB;AAAA,UACE,CAACA,eAAA,CAAO,WAAW,CAAC,GAAG,SAAA;AAAA,UACvB,CAACA,eAAA,CAAO,UAAU,CAAC,GAAG,SAAA;AAAA,UACtB,CAACA,eAAA,CAAO,UAAU,CAAC,GAAG;AAAA;AACxB;AACF,KAAA;AAAA,oBAEA,KAAA,CAAA,aAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,GAAO,IAAA,EAAA,EAChC,OAAA,KAAY,WAAA,mBAAc,KAAA,CAAA,aAAA,CAAC,GAAA,EAAA,IAAI,CAAA,mBAAK,KAAA,CAAA,aAAA,CAAC,cAAS,CACjD;AAAA,GACF;AAEJ;;;;"}
@@ -2,8 +2,7 @@ const isDeleteOperation = (inputType) => {
2
2
  return inputType === "deleteContentBackward" || inputType === "deleteContentForward";
3
3
  };
4
4
  const calculateCursorPosition = (oldValue, newValue, oldCursor, inputType, decimalSeparator, numericValue) => {
5
- if (!newValue)
6
- return 0;
5
+ if (!newValue) return 0;
7
6
  const oldDecimalPos = oldValue.indexOf(decimalSeparator);
8
7
  const newDecimalPos = newValue.indexOf(decimalSeparator);
9
8
  if (numericValue === 0 && isDeleteOperation(inputType)) {
@@ -12,8 +11,7 @@ const calculateCursorPosition = (oldValue, newValue, oldCursor, inputType, decim
12
11
  const countDigits = (str, start, end) => {
13
12
  let count = 0;
14
13
  for (let i = start; i < end; i++) {
15
- if (/[0-9]/.test(str[i]))
16
- count++;
14
+ if (/[0-9]/.test(str[i])) count++;
17
15
  }
18
16
  return count;
19
17
  };
@@ -21,7 +19,11 @@ const calculateCursorPosition = (oldValue, newValue, oldCursor, inputType, decim
21
19
  return newDecimalPos;
22
20
  }
23
21
  if (oldDecimalPos >= 0 && oldCursor > oldDecimalPos && newDecimalPos >= 0) {
24
- const digitsBeforeCursor = countDigits(oldValue, oldDecimalPos + 1, oldCursor);
22
+ const digitsBeforeCursor = countDigits(
23
+ oldValue,
24
+ oldDecimalPos + 1,
25
+ oldCursor
26
+ );
25
27
  let digitCount2 = 0;
26
28
  for (let i = newDecimalPos + 1; i < newValue.length; i++) {
27
29
  if (/[0-9]/.test(newValue[i]) && ++digitCount2 === digitsBeforeCursor) {
@@ -32,12 +34,15 @@ const calculateCursorPosition = (oldValue, newValue, oldCursor, inputType, decim
32
34
  }
33
35
  const oldEnd = oldDecimalPos >= 0 ? oldDecimalPos : oldValue.length;
34
36
  const newEnd = newDecimalPos >= 0 ? newDecimalPos : newValue.length;
35
- const intDigitsBeforeCursor = countDigits(oldValue, 0, Math.min(oldCursor, oldEnd));
37
+ const intDigitsBeforeCursor = countDigits(
38
+ oldValue,
39
+ 0,
40
+ Math.min(oldCursor, oldEnd)
41
+ );
36
42
  if (intDigitsBeforeCursor === 0) {
37
43
  if (isDeleteOperation(inputType)) {
38
44
  for (let i = 0; i < newValue.length; i++) {
39
- if (/[0-9]/.test(newValue[i]))
40
- return i + 1;
45
+ if (/[0-9]/.test(newValue[i])) return i + 1;
41
46
  }
42
47
  }
43
48
  return 0;
@@ -1 +1 @@
1
- {"version":3,"file":"cursorHelpers.js","sources":["../../../../src/NumberField/src/cursorHelpers.ts"],"sourcesContent":["/**\n * Check if the input type is a delete operation\n */\nexport const isDeleteOperation = (inputType: string): boolean => {\n return (\n inputType === 'deleteContentBackward' ||\n inputType === 'deleteContentForward'\n );\n};\n\n/**\n * Calculate the correct cursor position after formatting is applied.\n *\n * @param oldValue - The unformatted value (what's in input before formatting)\n * @param newValue - The formatted value (what we're replacing it with)\n * @param oldCursor - The cursor position in the unformatted value\n * @param inputType - The input type from InputEvent\n * @param decimalSeparator - The decimal separator character\n * @param numericValue - The parsed numeric value (optional, used for special decimal handling)\n * @returns The new cursor position in the formatted value\n */\nexport const calculateCursorPosition = (\n oldValue: string,\n newValue: string,\n oldCursor: number,\n inputType: string,\n decimalSeparator: string,\n numericValue?: number | null\n): number => {\n // For empty values, position at start\n if (!newValue) return 0;\n\n // Find decimal positions\n const oldDecimalPos = oldValue.indexOf(decimalSeparator);\n const newDecimalPos = newValue.indexOf(decimalSeparator);\n\n // Special handling: if numeric value is 0 and user performed a delete operation\n // Position cursor at the start (before the 0) to allow easy re-typing\n if (numericValue === 0 && isDeleteOperation(inputType)) {\n return 0;\n }\n\n // Count digits before cursor in the appropriate section\n const countDigits = (str: string, start: number, end: number): number => {\n let count = 0;\n for (let i = start; i < end; i++) {\n if (/[0-9]/.test(str[i])) count++;\n }\n return count;\n };\n\n // If user was at decimal position in old value and deleted it, position cursor before decimal in new formatted value\n if (\n isDeleteOperation(inputType) &&\n oldDecimalPos >= 0 &&\n oldCursor === oldDecimalPos &&\n newDecimalPos >= 0\n ) {\n return newDecimalPos;\n }\n\n // Cursor is in decimal part\n if (oldDecimalPos >= 0 && oldCursor > oldDecimalPos && newDecimalPos >= 0) {\n const digitsBeforeCursor = countDigits(\n oldValue,\n oldDecimalPos + 1,\n oldCursor\n );\n let digitCount = 0;\n for (let i = newDecimalPos + 1; i < newValue.length; i++) {\n if (/[0-9]/.test(newValue[i]) && ++digitCount === digitsBeforeCursor) {\n return i + 1;\n }\n }\n return newDecimalPos + 1;\n }\n\n // Cursor is in integer part\n const oldEnd = oldDecimalPos >= 0 ? oldDecimalPos : oldValue.length;\n const newEnd = newDecimalPos >= 0 ? newDecimalPos : newValue.length;\n const intDigitsBeforeCursor = countDigits(\n oldValue,\n 0,\n Math.min(oldCursor, oldEnd)\n );\n\n if (intDigitsBeforeCursor === 0) {\n // Cursor was at start - special handling for delete operations\n if (isDeleteOperation(inputType)) {\n for (let i = 0; i < newValue.length; i++) {\n if (/[0-9]/.test(newValue[i])) return i + 1;\n }\n }\n return 0;\n }\n\n // Find position after same number of integer digits\n let digitCount = 0;\n for (let i = 0; i < newEnd; i++) {\n if (/[0-9]/.test(newValue[i]) && ++digitCount === intDigitsBeforeCursor) {\n return i + 1;\n }\n }\n\n return newDecimalPos >= 0 ? newDecimalPos : newValue.length;\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursorHelpers.js","sources":["../../../../src/NumberField/src/cursorHelpers.ts"],"sourcesContent":["/**\n * Check if the input type is a delete operation\n */\nexport const isDeleteOperation = (inputType: string): boolean => {\n return (\n inputType === 'deleteContentBackward' ||\n inputType === 'deleteContentForward'\n );\n};\n\n/**\n * Calculate the correct cursor position after formatting is applied.\n *\n * @param oldValue - The unformatted value (what's in input before formatting)\n * @param newValue - The formatted value (what we're replacing it with)\n * @param oldCursor - The cursor position in the unformatted value\n * @param inputType - The input type from InputEvent\n * @param decimalSeparator - The decimal separator character\n * @param numericValue - The parsed numeric value (optional, used for special decimal handling)\n * @returns The new cursor position in the formatted value\n */\nexport const calculateCursorPosition = (\n oldValue: string,\n newValue: string,\n oldCursor: number,\n inputType: string,\n decimalSeparator: string,\n numericValue?: number | null\n): number => {\n // For empty values, position at start\n if (!newValue) return 0;\n\n // Find decimal positions\n const oldDecimalPos = oldValue.indexOf(decimalSeparator);\n const newDecimalPos = newValue.indexOf(decimalSeparator);\n\n // Special handling: if numeric value is 0 and user performed a delete operation\n // Position cursor at the start (before the 0) to allow easy re-typing\n if (numericValue === 0 && isDeleteOperation(inputType)) {\n return 0;\n }\n\n // Count digits before cursor in the appropriate section\n const countDigits = (str: string, start: number, end: number): number => {\n let count = 0;\n for (let i = start; i < end; i++) {\n if (/[0-9]/.test(str[i])) count++;\n }\n return count;\n };\n\n // If user was at decimal position in old value and deleted it, position cursor before decimal in new formatted value\n if (\n isDeleteOperation(inputType) &&\n oldDecimalPos >= 0 &&\n oldCursor === oldDecimalPos &&\n newDecimalPos >= 0\n ) {\n return newDecimalPos;\n }\n\n // Cursor is in decimal part\n if (oldDecimalPos >= 0 && oldCursor > oldDecimalPos && newDecimalPos >= 0) {\n const digitsBeforeCursor = countDigits(\n oldValue,\n oldDecimalPos + 1,\n oldCursor\n );\n let digitCount = 0;\n for (let i = newDecimalPos + 1; i < newValue.length; i++) {\n if (/[0-9]/.test(newValue[i]) && ++digitCount === digitsBeforeCursor) {\n return i + 1;\n }\n }\n return newDecimalPos + 1;\n }\n\n // Cursor is in integer part\n const oldEnd = oldDecimalPos >= 0 ? oldDecimalPos : oldValue.length;\n const newEnd = newDecimalPos >= 0 ? newDecimalPos : newValue.length;\n const intDigitsBeforeCursor = countDigits(\n oldValue,\n 0,\n Math.min(oldCursor, oldEnd)\n );\n\n if (intDigitsBeforeCursor === 0) {\n // Cursor was at start - special handling for delete operations\n if (isDeleteOperation(inputType)) {\n for (let i = 0; i < newValue.length; i++) {\n if (/[0-9]/.test(newValue[i])) return i + 1;\n }\n }\n return 0;\n }\n\n // Find position after same number of integer digits\n let digitCount = 0;\n for (let i = 0; i < newEnd; i++) {\n if (/[0-9]/.test(newValue[i]) && ++digitCount === intDigitsBeforeCursor) {\n return i + 1;\n }\n }\n\n return newDecimalPos >= 0 ? newDecimalPos : newValue.length;\n};\n"],"names":["digitCount"],"mappings":"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"}
@@ -1,18 +1,16 @@
1
1
  const getSeparators = (formatter) => {
2
- var _a, _b, _c, _d, _e;
3
2
  const parts = formatter.formatToParts(1000.1);
4
- const groupSeparator = (_b = (_a = parts.find((p) => p.type === "group")) == null ? void 0 : _a.value) != null ? _b : ",";
5
- let decimalSeparator = (_c = parts.find((p) => p.type === "decimal")) == null ? void 0 : _c.value;
3
+ const groupSeparator = parts.find((p) => p.type === "group")?.value ?? ",";
4
+ let decimalSeparator = parts.find((p) => p.type === "decimal")?.value;
6
5
  if (!decimalSeparator) {
7
6
  const locale = formatter.resolvedOptions().locale;
8
7
  const plainFormatter = new Intl.NumberFormat(locale);
9
- decimalSeparator = (_e = (_d = plainFormatter.formatToParts(1.1).find((p) => p.type === "decimal")) == null ? void 0 : _d.value) != null ? _e : ".";
8
+ decimalSeparator = plainFormatter.formatToParts(1.1).find((p) => p.type === "decimal")?.value ?? ".";
10
9
  }
11
10
  return { groupSeparator, decimalSeparator };
12
11
  };
13
12
  const trimSymbol = (value, symbol) => {
14
- if (!symbol)
15
- return value;
13
+ if (!symbol) return value;
16
14
  if (value.startsWith(symbol)) {
17
15
  return value.slice(symbol.length).trimStart();
18
16
  } else if (value.endsWith(symbol)) {
@@ -21,20 +19,20 @@ const trimSymbol = (value, symbol) => {
21
19
  return value;
22
20
  };
23
21
  const parseNumericValue = (value, decimalSeparator, formatter) => {
24
- if (!value || value === "-")
25
- return null;
26
- const cleaned = value.replace(new RegExp(`[^0-9${decimalSeparator}\\-]`, "g"), "");
27
- if (!cleaned)
28
- return null;
22
+ if (!value || value === "-") return null;
23
+ const cleaned = value.replace(
24
+ new RegExp(`[^0-9${decimalSeparator}\\-]`, "g"),
25
+ ""
26
+ );
27
+ if (!cleaned) return null;
29
28
  const hasLeadingMinus = cleaned.startsWith("-");
30
29
  const withoutMinus = cleaned.replace(/-/g, "");
31
30
  const normalized = hasLeadingMinus ? "-" + withoutMinus : withoutMinus;
32
31
  const parts = normalized.split(decimalSeparator);
33
32
  const withStandardDecimal = parts.length > 1 ? parts[0] + "." + parts.slice(1).join("") : normalized.replace(decimalSeparator, ".");
34
33
  let parsed = parseFloat(withStandardDecimal);
35
- if (isNaN(parsed))
36
- return null;
37
- if ((formatter == null ? void 0 : formatter.resolvedOptions().style) === "percent") {
34
+ if (isNaN(parsed)) return null;
35
+ if (formatter?.resolvedOptions().style === "percent") {
38
36
  parsed /= 100;
39
37
  }
40
38
  return parsed;
@@ -59,13 +57,12 @@ const formatNumberString = (value, formatter, decimalSeparator, shouldStripSymbo
59
57
  const isSymbol = (type) => ["currency", "unit", "percentSign"].includes(type);
60
58
  const hasSymbolAt = (parts, start) => {
61
59
  const [first, second] = start ? [parts[0], parts[1]] : [parts[parts.length - 1], parts[parts.length - 2]];
62
- return isSymbol(first == null ? void 0 : first.type) || (first == null ? void 0 : first.type) === "literal" && isSymbol(second == null ? void 0 : second.type);
60
+ return isSymbol(first?.type) || first?.type === "literal" && isSymbol(second?.type);
63
61
  };
64
62
  const extractSymbol = (formatter, prefix, postfix) => {
65
- var _a, _b;
66
63
  const parts = formatter.formatToParts(1000.1);
67
- const extractedPrefix = hasSymbolAt(parts, true) ? ((_a = parts.find((part) => isSymbol(part.type))) == null ? void 0 : _a.value) || null : null;
68
- const extractedPostfix = hasSymbolAt(parts, false) ? ((_b = [...parts].reverse().find((part) => isSymbol(part.type))) == null ? void 0 : _b.value) || null : null;
64
+ const extractedPrefix = hasSymbolAt(parts, true) ? parts.find((part) => isSymbol(part.type))?.value || null : null;
65
+ const extractedPostfix = hasSymbolAt(parts, false) ? [...parts].reverse().find((part) => isSymbol(part.type))?.value || null : null;
69
66
  return prefix !== void 0 || postfix !== void 0 ? {
70
67
  extractedPrefix: prefix,
71
68
  extractedPostfix: postfix,
@@ -1 +1 @@
1
- {"version":3,"file":"formatHelpers.js","sources":["../../../../src/NumberField/src/formatHelpers.ts"],"sourcesContent":["import { ReactNode } from 'react';\n\n/** Extract separators from Intl.NumberFormat */\nexport const getSeparators = (formatter: Intl.NumberFormat) => {\n const parts = formatter.formatToParts(1000.1);\n const groupSeparator = parts.find((p) => p.type === 'group')?.value ?? ',';\n let decimalSeparator = parts.find((p) => p.type === 'decimal')?.value;\n\n // Percentage formatters don't show decimals, so detect from a plain formatter\n if (!decimalSeparator) {\n const locale = formatter.resolvedOptions().locale;\n const plainFormatter = new Intl.NumberFormat(locale);\n decimalSeparator =\n plainFormatter.formatToParts(1.1).find((p) => p.type === 'decimal')\n ?.value ?? '.';\n }\n\n return { groupSeparator, decimalSeparator };\n};\n\n/** Extract only numeric parts (digits, group/decimal separators) from unformatted number */\nexport const trimSymbol = (\n value: string,\n symbol: string | undefined\n): string => {\n if (!symbol) return value;\n if (value.startsWith(symbol)) {\n return value.slice(symbol.length).trimStart();\n } else if (value.endsWith(symbol)) {\n return value.slice(0, -symbol.length).trimEnd();\n }\n return value;\n};\n\n/**\n * Parse numeric value from user input string.\n * Handles edge cases and converts percentage display values to actual values.\n */\nexport const parseNumericValue = (\n value: string,\n decimalSeparator: string,\n formatter?: Intl.NumberFormat\n): number | null => {\n if (!value || value === '-') return null;\n\n // Remove all non-numeric characters except decimal separator and minus\n const cleaned = value.replace(\n new RegExp(`[^0-9${decimalSeparator}\\\\-]`, 'g'),\n ''\n );\n if (!cleaned) return null;\n\n // Normalize minus sign (keep only if at start)\n const hasLeadingMinus = cleaned.startsWith('-');\n const withoutMinus = cleaned.replace(/-/g, '');\n const normalized = hasLeadingMinus ? '-' + withoutMinus : withoutMinus;\n\n // Normalize decimal separator (keep only first occurrence)\n const parts = normalized.split(decimalSeparator);\n const withStandardDecimal =\n parts.length > 1\n ? parts[0] + '.' + parts.slice(1).join('')\n : normalized.replace(decimalSeparator, '.');\n\n let parsed = parseFloat(withStandardDecimal);\n if (isNaN(parsed)) return null;\n\n // Convert percentage display value (25) to actual value (0.25)\n if (formatter?.resolvedOptions().style === 'percent') {\n parsed /= 100;\n }\n\n return parsed;\n};\n\n/**\n * Format user input string with locale-aware separators.\n * Optionally strips currency/unit/percent symbols for display.\n */\nexport const formatNumberString = (\n value: string,\n formatter: Intl.NumberFormat,\n decimalSeparator: string,\n shouldStripSymbols: boolean,\n symbol?: string\n): string => {\n // Allow typing special characters\n if (!value || value === '-' || value === decimalSeparator) {\n return value;\n }\n\n // Preserve trailing decimal separator for ongoing input\n const hasTrailingDecimal = value.endsWith(decimalSeparator);\n\n const numericValue = parseNumericValue(value, decimalSeparator, formatter);\n\n // Fallback: return cleaned value if parsing fails\n if (numericValue === null) {\n return value.replace(new RegExp(`[^0-9${decimalSeparator}\\\\-]`, 'g'), '');\n }\n\n try {\n const formatted = formatter.format(numericValue);\n const result =\n shouldStripSymbols && symbol ? trimSymbol(formatted, symbol) : formatted;\n\n // Re-append trailing decimal separator to allow continued typing\n return hasTrailingDecimal && !result.includes(decimalSeparator)\n ? result + decimalSeparator\n : result;\n } catch (_) {\n return value;\n }\n};\n\n/** Check if part is a symbol that should be extracted */\nconst isSymbol = (type: string) =>\n ['currency', 'unit', 'percentSign'].includes(type);\n\nexport interface SymbolExtractionInfo {\n extractedPrefix: ReactNode;\n extractedPostfix: ReactNode;\n symbol?: string;\n}\n\n/** Check if parts start or end with a symbol */\nconst hasSymbolAt = (\n parts: Intl.NumberFormatPart[],\n start: boolean\n): boolean => {\n const [first, second] = start\n ? [parts[0], parts[1]]\n : [parts[parts.length - 1], parts[parts.length - 2]];\n return (\n isSymbol(first?.type) ||\n (first?.type === 'literal' && isSymbol(second?.type))\n );\n};\n\n/**\n * Extract currency/unit/percent symbols and determine their position.\n *\n * If user has provided custom prefix/postfix, those will be used instead of extracted ones.\n */\nexport const extractSymbol = (\n formatter: Intl.NumberFormat,\n prefix?: ReactNode,\n postfix?: ReactNode\n): SymbolExtractionInfo => {\n const parts = formatter.formatToParts(1000.1);\n\n const extractedPrefix = hasSymbolAt(parts, true)\n ? parts.find((part) => isSymbol(part.type))?.value || null\n : null;\n const extractedPostfix = hasSymbolAt(parts, false)\n ? [...parts].reverse().find((part) => isSymbol(part.type))?.value || null\n : null;\n\n return prefix !== undefined || postfix !== undefined\n ? {\n extractedPrefix: prefix,\n extractedPostfix: postfix,\n symbol: extractedPrefix || extractedPostfix || undefined,\n }\n : {\n extractedPrefix,\n extractedPostfix,\n symbol: extractedPrefix || extractedPostfix || undefined,\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"formatHelpers.js","sources":["../../../../src/NumberField/src/formatHelpers.ts"],"sourcesContent":["import { ReactNode } from 'react';\n\n/** Extract separators from Intl.NumberFormat */\nexport const getSeparators = (formatter: Intl.NumberFormat) => {\n const parts = formatter.formatToParts(1000.1);\n const groupSeparator = parts.find((p) => p.type === 'group')?.value ?? ',';\n let decimalSeparator = parts.find((p) => p.type === 'decimal')?.value;\n\n // Percentage formatters don't show decimals, so detect from a plain formatter\n if (!decimalSeparator) {\n const locale = formatter.resolvedOptions().locale;\n const plainFormatter = new Intl.NumberFormat(locale);\n decimalSeparator =\n plainFormatter.formatToParts(1.1).find((p) => p.type === 'decimal')\n ?.value ?? '.';\n }\n\n return { groupSeparator, decimalSeparator };\n};\n\n/** Extract only numeric parts (digits, group/decimal separators) from unformatted number */\nexport const trimSymbol = (\n value: string,\n symbol: string | undefined\n): string => {\n if (!symbol) return value;\n if (value.startsWith(symbol)) {\n return value.slice(symbol.length).trimStart();\n } else if (value.endsWith(symbol)) {\n return value.slice(0, -symbol.length).trimEnd();\n }\n return value;\n};\n\n/**\n * Parse numeric value from user input string.\n * Handles edge cases and converts percentage display values to actual values.\n */\nexport const parseNumericValue = (\n value: string,\n decimalSeparator: string,\n formatter?: Intl.NumberFormat\n): number | null => {\n if (!value || value === '-') return null;\n\n // Remove all non-numeric characters except decimal separator and minus\n const cleaned = value.replace(\n new RegExp(`[^0-9${decimalSeparator}\\\\-]`, 'g'),\n ''\n );\n if (!cleaned) return null;\n\n // Normalize minus sign (keep only if at start)\n const hasLeadingMinus = cleaned.startsWith('-');\n const withoutMinus = cleaned.replace(/-/g, '');\n const normalized = hasLeadingMinus ? '-' + withoutMinus : withoutMinus;\n\n // Normalize decimal separator (keep only first occurrence)\n const parts = normalized.split(decimalSeparator);\n const withStandardDecimal =\n parts.length > 1\n ? parts[0] + '.' + parts.slice(1).join('')\n : normalized.replace(decimalSeparator, '.');\n\n let parsed = parseFloat(withStandardDecimal);\n if (isNaN(parsed)) return null;\n\n // Convert percentage display value (25) to actual value (0.25)\n if (formatter?.resolvedOptions().style === 'percent') {\n parsed /= 100;\n }\n\n return parsed;\n};\n\n/**\n * Format user input string with locale-aware separators.\n * Optionally strips currency/unit/percent symbols for display.\n */\nexport const formatNumberString = (\n value: string,\n formatter: Intl.NumberFormat,\n decimalSeparator: string,\n shouldStripSymbols: boolean,\n symbol?: string\n): string => {\n // Allow typing special characters\n if (!value || value === '-' || value === decimalSeparator) {\n return value;\n }\n\n // Preserve trailing decimal separator for ongoing input\n const hasTrailingDecimal = value.endsWith(decimalSeparator);\n\n const numericValue = parseNumericValue(value, decimalSeparator, formatter);\n\n // Fallback: return cleaned value if parsing fails\n if (numericValue === null) {\n return value.replace(new RegExp(`[^0-9${decimalSeparator}\\\\-]`, 'g'), '');\n }\n\n try {\n const formatted = formatter.format(numericValue);\n const result =\n shouldStripSymbols && symbol ? trimSymbol(formatted, symbol) : formatted;\n\n // Re-append trailing decimal separator to allow continued typing\n return hasTrailingDecimal && !result.includes(decimalSeparator)\n ? result + decimalSeparator\n : result;\n } catch (_) {\n return value;\n }\n};\n\n/** Check if part is a symbol that should be extracted */\nconst isSymbol = (type: string) =>\n ['currency', 'unit', 'percentSign'].includes(type);\n\nexport interface SymbolExtractionInfo {\n extractedPrefix: ReactNode;\n extractedPostfix: ReactNode;\n symbol?: string;\n}\n\n/** Check if parts start or end with a symbol */\nconst hasSymbolAt = (\n parts: Intl.NumberFormatPart[],\n start: boolean\n): boolean => {\n const [first, second] = start\n ? [parts[0], parts[1]]\n : [parts[parts.length - 1], parts[parts.length - 2]];\n return (\n isSymbol(first?.type) ||\n (first?.type === 'literal' && isSymbol(second?.type))\n );\n};\n\n/**\n * Extract currency/unit/percent symbols and determine their position.\n *\n * If user has provided custom prefix/postfix, those will be used instead of extracted ones.\n */\nexport const extractSymbol = (\n formatter: Intl.NumberFormat,\n prefix?: ReactNode,\n postfix?: ReactNode\n): SymbolExtractionInfo => {\n const parts = formatter.formatToParts(1000.1);\n\n const extractedPrefix = hasSymbolAt(parts, true)\n ? parts.find((part) => isSymbol(part.type))?.value || null\n : null;\n const extractedPostfix = hasSymbolAt(parts, false)\n ? [...parts].reverse().find((part) => isSymbol(part.type))?.value || null\n : null;\n\n return prefix !== undefined || postfix !== undefined\n ? {\n extractedPrefix: prefix,\n extractedPostfix: postfix,\n symbol: extractedPrefix || extractedPostfix || undefined,\n }\n : {\n extractedPrefix,\n extractedPostfix,\n symbol: extractedPrefix || extractedPostfix || undefined,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  const escapeRegExp = (str) => str.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
2
2
  const getSuffix = (value, groupSeparator, decimalSeparator) => {
3
- var _a;
4
- const suffixReg = new RegExp(`\\d([^${escapeRegExp(groupSeparator)}${escapeRegExp(decimalSeparator)}0-9]+)`);
5
- return (_a = value.match(suffixReg)) == null ? void 0 : _a[1];
3
+ const suffixReg = new RegExp(
4
+ `\\d([^${escapeRegExp(groupSeparator)}${escapeRegExp(
5
+ decimalSeparator
6
+ )}0-9]+)`
7
+ );
8
+ return value.match(suffixReg)?.[1];
6
9
  };
7
10
  function handleNumberFieldKeyDown({
8
11
  event,
@@ -11,19 +14,21 @@ function handleNumberFieldKeyDown({
11
14
  decimalSeparator,
12
15
  onOriginalKeyDown
13
16
  }) {
14
- var _a;
15
17
  const { key } = event;
16
18
  const input = event.currentTarget;
17
19
  const { selectionStart, value } = input;
18
20
  if (selectionStart === null) {
19
- onOriginalKeyDown == null ? void 0 : onOriginalKeyDown(event);
21
+ onOriginalKeyDown?.(event);
20
22
  return;
21
23
  }
22
24
  if (/^[0-9]$/.test(key)) {
23
25
  const decimalPos = value.indexOf(decimalSeparator);
24
26
  if (selectionStart === 0) {
25
27
  const integerPart = decimalPos >= 0 ? value.slice(0, decimalPos) : value;
26
- const cleanedInteger = integerPart.replace(new RegExp(escapeRegExp(groupSeparator), "g"), "");
28
+ const cleanedInteger = integerPart.replace(
29
+ new RegExp(escapeRegExp(groupSeparator), "g"),
30
+ ""
31
+ );
27
32
  if (cleanedInteger === "0") {
28
33
  event.preventDefault();
29
34
  const newValue = key + (decimalPos >= 0 ? value.slice(decimalPos) : "");
@@ -110,10 +115,10 @@ function handleNumberFieldKeyDown({
110
115
  const suffix = getSuffix(value, groupSeparator, decimalSeparator);
111
116
  if (suffix && selectionStart > value.length - suffix.length) {
112
117
  const suffixStartPos = value.length - suffix.length;
113
- (_a = inputRef.current) == null ? void 0 : _a.setSelectionRange(suffixStartPos, suffixStartPos);
118
+ inputRef.current?.setSelectionRange(suffixStartPos, suffixStartPos);
114
119
  }
115
120
  }
116
- onOriginalKeyDown == null ? void 0 : onOriginalKeyDown(event);
121
+ onOriginalKeyDown?.(event);
117
122
  }
118
123
 
119
124
  export { handleNumberFieldKeyDown };
@@ -1 +1 @@
1
- {"version":3,"file":"keyboardHelpers.js","sources":["../../../../src/NumberField/src/keyboardHelpers.ts"],"sourcesContent":["import { RefObject } from 'react';\n\n/** Escape special regex characters */\nconst escapeRegExp = (str: string): string =>\n str.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n/** Extract suffix (non-numeric trailing characters) from value */\nconst getSuffix = (\n value: string,\n groupSeparator: string,\n decimalSeparator: string\n): string | undefined => {\n const suffixReg = new RegExp(\n `\\\\d([^${escapeRegExp(groupSeparator)}${escapeRegExp(\n decimalSeparator\n )}0-9]+)`\n );\n return value.match(suffixReg)?.[1];\n};\n\ninterface HandleKeyDownParams {\n event: React.KeyboardEvent<HTMLInputElement>;\n inputRef: RefObject<HTMLInputElement>;\n groupSeparator: string;\n decimalSeparator: string;\n onOriginalKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n}\n\n/**\n * Handle keyboard events for number field input.\n * Manages special behaviors for separators, navigation, and deletion.\n */\nexport function handleNumberFieldKeyDown({\n event,\n inputRef,\n groupSeparator,\n decimalSeparator,\n onOriginalKeyDown,\n}: HandleKeyDownParams): void {\n const { key } = event;\n const input = event.currentTarget;\n const { selectionStart, value } = input;\n\n if (selectionStart === null) {\n onOriginalKeyDown?.(event);\n return;\n }\n\n // Handle typing a digit at the start when value is 0\n // Example: \"|0.00\" → user types \"7\" → becomes \"7.00\" (replace, not insert)\n if (/^[0-9]$/.test(key)) {\n const decimalPos = value.indexOf(decimalSeparator);\n\n // Check if cursor is at the start and the integer part is just \"0\"\n if (selectionStart === 0) {\n // Extract the integer part (everything before decimal separator)\n const integerPart = decimalPos >= 0 ? value.slice(0, decimalPos) : value;\n\n // Remove group separators to check if it's just \"0\"\n const cleanedInteger = integerPart.replace(\n new RegExp(escapeRegExp(groupSeparator), 'g'),\n ''\n );\n\n if (cleanedInteger === '0') {\n event.preventDefault();\n\n // Replace the \"0\" with the typed digit\n const newValue = key + (decimalPos >= 0 ? value.slice(decimalPos) : '');\n input.value = newValue;\n\n // Position cursor after the typed digit\n input.setSelectionRange(1, 1);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n return;\n }\n }\n }\n\n // Handle typing decimal separator to navigate to decimal part\n // Example: \"123|.00\" → user types \".\" → cursor moves to \"123.|00\"\n if (key === decimalSeparator) {\n const decimalPos = value.indexOf(decimalSeparator);\n\n // If decimal exists and cursor is before it, jump to after decimal\n if (decimalPos >= 0 && selectionStart <= decimalPos) {\n event.preventDefault();\n input.setSelectionRange(decimalPos + 1, decimalPos + 1);\n return;\n }\n }\n\n // Handle Backspace when cursor is right after a group separator\n // Example: \"1,|234\" with Backspace should delete '1', not ','\n if (\n key === 'Backspace' &&\n selectionStart > 0 &&\n value[selectionStart - 1] === groupSeparator\n ) {\n event.preventDefault();\n\n // Find the digit before the separator\n let deletePos = selectionStart - 2;\n while (deletePos >= 0 && value[deletePos] === groupSeparator) {\n deletePos--;\n }\n\n if (deletePos >= 0) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Set cursor position before the separator that was after the deleted digit\n input.setSelectionRange(deletePos, deletePos);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Handle Backspace when cursor is right after decimal separator\n // Example: \"123.|00\" with Backspace should delete '3', not '.'\n if (\n key === 'Backspace' &&\n selectionStart > 0 &&\n value[selectionStart - 1] === decimalSeparator\n ) {\n event.preventDefault();\n\n // Find the digit before the decimal separator\n let deletePos = selectionStart - 2;\n while (deletePos >= 0 && value[deletePos] === groupSeparator) {\n deletePos--;\n }\n\n if (deletePos >= 0) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Set cursor position at the decimal separator (which shifted left by 1)\n const decimalPos = newValue.indexOf(decimalSeparator);\n if (decimalPos >= 0) {\n input.setSelectionRange(decimalPos, decimalPos);\n }\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Handle Delete when cursor is right before a group separator\n // Example: \"1|,234\" with Delete should delete '2', not ','\n if (key === 'Delete' && value[selectionStart] === groupSeparator) {\n event.preventDefault();\n\n // Find the digit after the separator\n let deletePos = selectionStart + 1;\n while (deletePos < value.length && value[deletePos] === groupSeparator) {\n deletePos++;\n }\n\n if (deletePos < value.length) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Keep cursor at the same position (before the separator)\n input.setSelectionRange(selectionStart, selectionStart);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Handle Delete when cursor is right before decimal separator\n // Example: \"123|.00\" with Delete should delete '0' (first decimal digit), not '.'\n if (key === 'Delete' && value[selectionStart] === decimalSeparator) {\n event.preventDefault();\n\n // Find the first digit after the separator\n let deletePos = selectionStart + 1;\n while (deletePos < value.length && !/[0-9]/.test(value[deletePos])) {\n deletePos++;\n }\n\n if (deletePos < value.length) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Keep cursor at the decimal separator\n input.setSelectionRange(selectionStart, selectionStart);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Prevent cursor from entering suffix area (skip for arrow keys and empty values)\n if (key !== 'ArrowUp' && key !== 'ArrowDown' && value !== '-') {\n const suffix = getSuffix(value, groupSeparator, decimalSeparator);\n\n if (suffix && selectionStart > value.length - suffix.length) {\n const suffixStartPos = value.length - suffix.length;\n inputRef.current?.setSelectionRange(suffixStartPos, suffixStartPos);\n }\n }\n\n onOriginalKeyDown?.(event);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"keyboardHelpers.js","sources":["../../../../src/NumberField/src/keyboardHelpers.ts"],"sourcesContent":["import { RefObject } from 'react';\n\n/** Escape special regex characters */\nconst escapeRegExp = (str: string): string =>\n str.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n/** Extract suffix (non-numeric trailing characters) from value */\nconst getSuffix = (\n value: string,\n groupSeparator: string,\n decimalSeparator: string\n): string | undefined => {\n const suffixReg = new RegExp(\n `\\\\d([^${escapeRegExp(groupSeparator)}${escapeRegExp(\n decimalSeparator\n )}0-9]+)`\n );\n return value.match(suffixReg)?.[1];\n};\n\ninterface HandleKeyDownParams {\n event: React.KeyboardEvent<HTMLInputElement>;\n inputRef: RefObject<HTMLInputElement>;\n groupSeparator: string;\n decimalSeparator: string;\n onOriginalKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n}\n\n/**\n * Handle keyboard events for number field input.\n * Manages special behaviors for separators, navigation, and deletion.\n */\nexport function handleNumberFieldKeyDown({\n event,\n inputRef,\n groupSeparator,\n decimalSeparator,\n onOriginalKeyDown,\n}: HandleKeyDownParams): void {\n const { key } = event;\n const input = event.currentTarget;\n const { selectionStart, value } = input;\n\n if (selectionStart === null) {\n onOriginalKeyDown?.(event);\n return;\n }\n\n // Handle typing a digit at the start when value is 0\n // Example: \"|0.00\" → user types \"7\" → becomes \"7.00\" (replace, not insert)\n if (/^[0-9]$/.test(key)) {\n const decimalPos = value.indexOf(decimalSeparator);\n\n // Check if cursor is at the start and the integer part is just \"0\"\n if (selectionStart === 0) {\n // Extract the integer part (everything before decimal separator)\n const integerPart = decimalPos >= 0 ? value.slice(0, decimalPos) : value;\n\n // Remove group separators to check if it's just \"0\"\n const cleanedInteger = integerPart.replace(\n new RegExp(escapeRegExp(groupSeparator), 'g'),\n ''\n );\n\n if (cleanedInteger === '0') {\n event.preventDefault();\n\n // Replace the \"0\" with the typed digit\n const newValue = key + (decimalPos >= 0 ? value.slice(decimalPos) : '');\n input.value = newValue;\n\n // Position cursor after the typed digit\n input.setSelectionRange(1, 1);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n return;\n }\n }\n }\n\n // Handle typing decimal separator to navigate to decimal part\n // Example: \"123|.00\" → user types \".\" → cursor moves to \"123.|00\"\n if (key === decimalSeparator) {\n const decimalPos = value.indexOf(decimalSeparator);\n\n // If decimal exists and cursor is before it, jump to after decimal\n if (decimalPos >= 0 && selectionStart <= decimalPos) {\n event.preventDefault();\n input.setSelectionRange(decimalPos + 1, decimalPos + 1);\n return;\n }\n }\n\n // Handle Backspace when cursor is right after a group separator\n // Example: \"1,|234\" with Backspace should delete '1', not ','\n if (\n key === 'Backspace' &&\n selectionStart > 0 &&\n value[selectionStart - 1] === groupSeparator\n ) {\n event.preventDefault();\n\n // Find the digit before the separator\n let deletePos = selectionStart - 2;\n while (deletePos >= 0 && value[deletePos] === groupSeparator) {\n deletePos--;\n }\n\n if (deletePos >= 0) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Set cursor position before the separator that was after the deleted digit\n input.setSelectionRange(deletePos, deletePos);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Handle Backspace when cursor is right after decimal separator\n // Example: \"123.|00\" with Backspace should delete '3', not '.'\n if (\n key === 'Backspace' &&\n selectionStart > 0 &&\n value[selectionStart - 1] === decimalSeparator\n ) {\n event.preventDefault();\n\n // Find the digit before the decimal separator\n let deletePos = selectionStart - 2;\n while (deletePos >= 0 && value[deletePos] === groupSeparator) {\n deletePos--;\n }\n\n if (deletePos >= 0) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Set cursor position at the decimal separator (which shifted left by 1)\n const decimalPos = newValue.indexOf(decimalSeparator);\n if (decimalPos >= 0) {\n input.setSelectionRange(decimalPos, decimalPos);\n }\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Handle Delete when cursor is right before a group separator\n // Example: \"1|,234\" with Delete should delete '2', not ','\n if (key === 'Delete' && value[selectionStart] === groupSeparator) {\n event.preventDefault();\n\n // Find the digit after the separator\n let deletePos = selectionStart + 1;\n while (deletePos < value.length && value[deletePos] === groupSeparator) {\n deletePos++;\n }\n\n if (deletePos < value.length) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Keep cursor at the same position (before the separator)\n input.setSelectionRange(selectionStart, selectionStart);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Handle Delete when cursor is right before decimal separator\n // Example: \"123|.00\" with Delete should delete '0' (first decimal digit), not '.'\n if (key === 'Delete' && value[selectionStart] === decimalSeparator) {\n event.preventDefault();\n\n // Find the first digit after the separator\n let deletePos = selectionStart + 1;\n while (deletePos < value.length && !/[0-9]/.test(value[deletePos])) {\n deletePos++;\n }\n\n if (deletePos < value.length) {\n // Delete the digit and let formatting handle the rest\n const newValue = value.slice(0, deletePos) + value.slice(deletePos + 1);\n input.value = newValue;\n\n // Keep cursor at the decimal separator\n input.setSelectionRange(selectionStart, selectionStart);\n\n // Trigger input event to reformat\n const inputEvent = new Event('input', { bubbles: true });\n input.dispatchEvent(inputEvent);\n }\n return;\n }\n\n // Prevent cursor from entering suffix area (skip for arrow keys and empty values)\n if (key !== 'ArrowUp' && key !== 'ArrowDown' && value !== '-') {\n const suffix = getSuffix(value, groupSeparator, decimalSeparator);\n\n if (suffix && selectionStart > value.length - suffix.length) {\n const suffixStartPos = value.length - suffix.length;\n inputRef.current?.setSelectionRange(suffixStartPos, suffixStartPos);\n }\n }\n\n onOriginalKeyDown?.(event);\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAutofillStyle.js","sources":["../../../../src/NumberField/src/useAutofillStyle.ts"],"sourcesContent":["import { CSSProperties, RefObject, useState } from 'react';\n\ninterface UseAutofillStyle {\n autofillStyles: CSSProperties;\n updateStyle: () => void;\n}\n\n//Copied from TextFieldBase, once NumberField moves into Core, this file can be removed and the import updated\nexport function useAutofillStyle<T>(\n inputRef: RefObject<\n T extends 'input' ? HTMLInputElement : HTMLTextAreaElement\n >\n): UseAutofillStyle {\n const [styles, setStyles] = useState<CSSProperties>({});\n\n const updateStyle = () => {\n const input = inputRef.current;\n if (input) {\n const color = window.getComputedStyle(input).backgroundColor;\n\n setStyles({\n boxShadow: `-100px 0 ${color}, 100px 0 ${color}`,\n });\n }\n };\n\n return {\n autofillStyles: styles,\n updateStyle,\n };\n}\n"],"names":[],"mappings":";;AAQO,SAAA,gBAAA,CACL,QAGkB,EAAA;AAClB,EAAM,MAAA,CAAC,MAAQ,EAAA,SAAA,CAAA,GAAa,QAAwB,CAAA,EAAA,CAAA,CAAA;AAEpD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,QAAQ,QAAS,CAAA,OAAA,CAAA;AACvB,IAAA,IAAI,KAAO,EAAA;AACT,MAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,gBAAA,CAAiB,KAAO,CAAA,CAAA,eAAA,CAAA;AAE7C,MAAU,SAAA,CAAA;AAAA,QACR,SAAA,EAAW,YAAY,KAAkB,CAAA,UAAA,EAAA,KAAA,CAAA,CAAA;AAAA,OAAA,CAAA,CAAA;AAAA,KAAA;AAAA,GAAA,CAAA;AAK/C,EAAO,OAAA;AAAA,IACL,cAAgB,EAAA,MAAA;AAAA,IAChB,WAAA;AAAA,GAAA,CAAA;AAAA;;;;"}
1
+ {"version":3,"file":"useAutofillStyle.js","sources":["../../../../src/NumberField/src/useAutofillStyle.ts"],"sourcesContent":["import { CSSProperties, RefObject, useState } from 'react';\n\ninterface UseAutofillStyle {\n autofillStyles: CSSProperties;\n updateStyle: () => void;\n}\n\n//Copied from TextFieldBase, once NumberField moves into Core, this file can be removed and the import updated\nexport function useAutofillStyle<T>(\n inputRef: RefObject<\n T extends 'input' ? HTMLInputElement : HTMLTextAreaElement\n >\n): UseAutofillStyle {\n const [styles, setStyles] = useState<CSSProperties>({});\n\n const updateStyle = () => {\n const input = inputRef.current;\n if (input) {\n const color = window.getComputedStyle(input).backgroundColor;\n\n setStyles({\n boxShadow: `-100px 0 ${color}, 100px 0 ${color}`,\n });\n }\n };\n\n return {\n autofillStyles: styles,\n updateStyle,\n };\n}\n"],"names":[],"mappings":";;AAQO,SAAS,iBACd,QAAA,EAGkB;AAClB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,QAAA,CAAwB,EAAE,CAAA;AAEtD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAM,QAAQ,QAAA,CAAS,OAAA;AACvB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,gBAAA,CAAiB,KAAK,CAAA,CAAE,eAAA;AAE7C,MAAA,SAAA,CAAU;AAAA,QACR,SAAA,EAAW,CAAA,SAAA,EAAY,KAAK,CAAA,UAAA,EAAa,KAAK,CAAA;AAAA,OAC/C,CAAA;AAAA,IACH;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,cAAA,EAAgB,MAAA;AAAA,IAChB;AAAA,GACF;AACF;;;;"}