@danske/sapphire-react-lab 0.106.2 → 0.107.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.
- package/build/cjs/index.js +2557 -64
- package/build/cjs/index.js.map +1 -1
- package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js +11 -0
- package/build/esm/core/src/BreakpointProvider/useBreakpointContext.js.map +1 -0
- package/build/esm/core/src/Flex/src/Flex.js +64 -0
- package/build/esm/core/src/Flex/src/Flex.js.map +1 -0
- package/build/esm/core/src/Grid/src/Grid.js +55 -0
- package/build/esm/core/src/Grid/src/Grid.js.map +1 -0
- package/build/esm/core/src/Icon/src/Icon.js +37 -0
- package/build/esm/core/src/Icon/src/Icon.js.map +1 -0
- package/build/esm/core/src/ListBox/i18n/da-DK.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/de-DE.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/en-US.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/fi-FI.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/index.js.map +1 -0
- package/build/esm/core/src/ListBox/i18n/nb-NO.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/pl-PL.json.js +7 -0
- package/build/esm/core/src/ListBox/i18n/sv-SE.json.js +7 -0
- package/build/esm/core/src/ListBox/src/ListBoxContext.js +8 -0
- package/build/esm/core/src/ListBox/src/ListBoxContext.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js +26 -0
- package/build/esm/core/src/ListBox/src/ListBoxEmptyState.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js +37 -0
- package/build/esm/core/src/ListBox/src/ListBoxItemSkeleton.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxOption.js +105 -0
- package/build/esm/core/src/ListBox/src/ListBoxOption.js.map +1 -0
- package/build/esm/core/src/ListBox/src/ListBoxSection.js +86 -0
- package/build/esm/core/src/ListBox/src/ListBoxSection.js.map +1 -0
- package/build/esm/core/src/ListBox/src/StatelessListBox.js +162 -0
- package/build/esm/core/src/ListBox/src/StatelessListBox.js.map +1 -0
- package/build/esm/core/src/Pagination/src/usePaginationContext.js +8 -0
- package/build/esm/core/src/Pagination/src/usePaginationContext.js.map +1 -0
- package/build/esm/core/src/Popover/src/Popover.js +62 -0
- package/build/esm/core/src/Popover/src/Popover.js.map +1 -0
- package/build/esm/core/src/Radio/src/RadioBox.js +58 -0
- package/build/esm/core/src/Radio/src/RadioBox.js.map +1 -0
- package/build/esm/core/src/Separator/src/Separator.js +32 -0
- package/build/esm/core/src/Separator/src/Separator.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/Skeleton.js +19 -0
- package/build/esm/core/src/Skeleton/src/Skeleton.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/SkeletonCircle.js +39 -0
- package/build/esm/core/src/Skeleton/src/SkeletonCircle.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/SkeletonText.js +59 -0
- package/build/esm/core/src/Skeleton/src/SkeletonText.js.map +1 -0
- package/build/esm/core/src/Skeleton/src/animation.js +4 -0
- package/build/esm/core/src/Skeleton/src/animation.js.map +1 -0
- package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js +42 -0
- package/build/esm/core/src/ThemeRoot/src/ThemeRoot.js.map +1 -0
- package/build/esm/core/src/View/src/View.js +60 -0
- package/build/esm/core/src/View/src/View.js.map +1 -0
- package/build/esm/core/src/utils/SapphireStyleProps.js +48 -0
- package/build/esm/core/src/utils/SapphireStyleProps.js.map +1 -0
- package/build/esm/core/src/utils/useCollectionFocusProxy.js +53 -0
- package/build/esm/core/src/utils/useCollectionFocusProxy.js.map +1 -0
- package/build/esm/core/src/utils/usePreventTouchEnd.js +16 -0
- package/build/esm/core/src/utils/usePreventTouchEnd.js.map +1 -0
- package/build/esm/core/src/utils/useSapphireStyleProps.js +179 -0
- package/build/esm/core/src/utils/useSapphireStyleProps.js.map +1 -0
- package/build/esm/core/src/utils/useSapphireTextStyleProps.js +9 -0
- package/build/esm/core/src/utils/useSapphireTextStyleProps.js.map +1 -0
- package/build/esm/core/src/utils/useScrollCheck.js +38 -0
- package/build/esm/core/src/utils/useScrollCheck.js.map +1 -0
- package/build/esm/core/src/utils/useThemeCheck.js +14 -0
- package/build/esm/core/src/utils/useThemeCheck.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js +158 -0
- package/build/esm/core/src/utils/virtualization/ListWithLoadingStateLayout.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js +69 -0
- package/build/esm/core/src/utils/virtualization/VariableWidthListLayout.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js +40 -0
- package/build/esm/core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.js.map +1 -0
- package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js +35 -0
- package/build/esm/core/src/utils/virtualization/useListWithLoadingStateLayout.js.map +1 -0
- package/build/esm/index.js +23 -20
- package/build/esm/index.js.map +1 -1
- package/build/esm/lab/src/Accordion/index.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/Accordion.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionContext.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionHeading.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionItem.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/AccordionPanel.js.map +1 -0
- package/build/esm/lab/src/Accordion/src/utils.js.map +1 -0
- package/build/esm/lab/src/Alert/src/Alert.js.map +1 -0
- package/build/esm/lab/src/Amount/src/Amount.js.map +1 -0
- package/build/esm/lab/src/Amount/src/useGroupAmount.js.map +1 -0
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/Autocomplete/i18n/index.js +20 -0
- package/build/esm/lab/src/Autocomplete/i18n/index.js.map +1 -0
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js +2 -2
- package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/Autocomplete/src/Autocomplete.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItem.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemLink.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbItemStatic.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/Breadcrumbs.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/BreadcrumbsSeparator.js.map +1 -0
- package/build/esm/lab/src/Breadcrumbs/src/useBreadcrumbThreshold.js.map +1 -0
- package/build/esm/lab/src/DataGrid/index.js +9 -0
- package/build/esm/lab/src/DataGrid/index.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/DataGrid.js +463 -0
- package/build/esm/lab/src/DataGrid/src/DataGrid.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js +6 -0
- package/build/esm/lab/src/DataGrid/src/DataGridCellContext.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/EditableCellContent.js +125 -0
- package/build/esm/lab/src/DataGrid/src/EditableCellContent.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js +15 -0
- package/build/esm/lab/src/DataGrid/src/createDataGridColumnHelper.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js +417 -0
- package/build/esm/lab/src/DataGrid/src/useGridKeyboardNavigation.js.map +1 -0
- package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js +55 -0
- package/build/esm/lab/src/DataGrid/src/useMeasureColumnWidths.js.map +1 -0
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/FileDropzone/i18n/index.js.map +1 -0
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js +2 -2
- package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/FileDropzone/src/FileDropzone.js.map +1 -0
- package/build/esm/lab/src/FileDropzone/src/FileTrigger.js.map +1 -0
- package/build/esm/lab/src/FileDropzone/src/utils.js.map +1 -0
- package/build/esm/lab/src/Filtering/src/FilterDropdown.js.map +1 -0
- package/build/esm/{Filtering → lab/src/Filtering}/src/SearchableSelectFilter.js +2 -0
- package/build/esm/lab/src/Filtering/src/SearchableSelectFilter.js.map +1 -0
- package/build/esm/lab/src/Flag/src/Flag.js.map +1 -0
- package/build/esm/lab/src/LabeledValue/src/LabeledValue.js.map +1 -0
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/NumberField/i18n/index.js.map +1 -0
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js +2 -2
- package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/NumberField/src/NumberField.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/StepperButton.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/cursorHelpers.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/formatHelpers.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/keyboardHelpers.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/useAutofillStyle.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/useNumberFieldFormatting.js.map +1 -0
- package/build/esm/lab/src/NumberField/src/useSapphireNumberField.js.map +1 -0
- package/build/esm/lab/src/ProgressIndicator/src/ProgressIndicator.js.map +1 -0
- package/build/esm/lab/src/Sidebar/index.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Body.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/ExpandableItem.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Header.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Item.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/List.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Panel.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/ResponsiveSidebarContext.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/SecondarySidebarContext.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Section.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/Sidebar.js.map +1 -0
- package/build/esm/lab/src/Sidebar/src/useSidebar.js.map +1 -0
- package/build/esm/lab/src/Slider/index.js.map +1 -0
- package/build/esm/lab/src/Slider/src/Slider.js.map +1 -0
- package/build/esm/lab/src/TagGroup/src/Tag.js.map +1 -0
- package/build/esm/lab/src/TagGroup/src/TagGroup.js.map +1 -0
- package/build/esm/lab/src/TagGroup/src/TagItem.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/da-DK.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/da-DK.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/de-DE.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/de-DE.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/en-US.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/en-US.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/fi-FI.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/fi-FI.json.js.map +1 -0
- package/build/esm/lab/src/TimeField/i18n/index.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/nb-NO.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/nb-NO.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/pl-PL.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/pl-PL.json.js.map +1 -0
- package/build/esm/{TimeField → lab/src/TimeField}/i18n/sv-SE.json.js +2 -2
- package/build/esm/lab/src/TimeField/i18n/sv-SE.json.js.map +1 -0
- package/build/esm/lab/src/TimeField/src/TimeField.js.map +1 -0
- package/build/esm/lab/src/TimeField/src/TimeFieldSegment.js.map +1 -0
- package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js +46 -0
- package/build/esm/lab/src/TruncateOverflow/src/TruncateOverflow.js.map +1 -0
- package/build/index.d.ts +553 -10
- package/package.json +8 -8
- package/build/esm/Accordion/index.js.map +0 -1
- package/build/esm/Accordion/src/Accordion.js.map +0 -1
- package/build/esm/Accordion/src/AccordionContext.js.map +0 -1
- package/build/esm/Accordion/src/AccordionHeading.js.map +0 -1
- package/build/esm/Accordion/src/AccordionItem.js.map +0 -1
- package/build/esm/Accordion/src/AccordionPanel.js.map +0 -1
- package/build/esm/Accordion/src/utils.js.map +0 -1
- package/build/esm/Alert/src/Alert.js.map +0 -1
- package/build/esm/Amount/src/Amount.js.map +0 -1
- package/build/esm/Amount/src/useGroupAmount.js.map +0 -1
- package/build/esm/Autocomplete/i18n/index.js.map +0 -1
- package/build/esm/Autocomplete/src/Autocomplete.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItem.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItemLink.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbItemStatic.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbOverflowMenu.js.map +0 -1
- package/build/esm/Breadcrumbs/src/Breadcrumbs.js.map +0 -1
- package/build/esm/Breadcrumbs/src/BreadcrumbsSeparator.js.map +0 -1
- package/build/esm/Breadcrumbs/src/useBreadcrumbThreshold.js.map +0 -1
- package/build/esm/FileDropzone/i18n/index.js.map +0 -1
- package/build/esm/FileDropzone/src/FileDropzone.js.map +0 -1
- package/build/esm/FileDropzone/src/FileTrigger.js.map +0 -1
- package/build/esm/FileDropzone/src/utils.js.map +0 -1
- package/build/esm/Filtering/src/FilterDropdown.js.map +0 -1
- package/build/esm/Filtering/src/SearchableSelectFilter.js.map +0 -1
- package/build/esm/Flag/src/Flag.js.map +0 -1
- package/build/esm/LabeledValue/src/LabeledValue.js.map +0 -1
- package/build/esm/NumberField/i18n/index.js.map +0 -1
- package/build/esm/NumberField/src/NumberField.js.map +0 -1
- package/build/esm/NumberField/src/StepperButton.js.map +0 -1
- package/build/esm/NumberField/src/cursorHelpers.js.map +0 -1
- package/build/esm/NumberField/src/formatHelpers.js.map +0 -1
- package/build/esm/NumberField/src/keyboardHelpers.js.map +0 -1
- package/build/esm/NumberField/src/useAutofillStyle.js.map +0 -1
- package/build/esm/NumberField/src/useNumberFieldFormatting.js.map +0 -1
- package/build/esm/NumberField/src/useSapphireNumberField.js.map +0 -1
- package/build/esm/ProgressIndicator/src/ProgressIndicator.js.map +0 -1
- package/build/esm/Sidebar/index.js.map +0 -1
- package/build/esm/Sidebar/src/Body.js.map +0 -1
- package/build/esm/Sidebar/src/ExpandableItem.js.map +0 -1
- package/build/esm/Sidebar/src/Header.js.map +0 -1
- package/build/esm/Sidebar/src/Item.js.map +0 -1
- package/build/esm/Sidebar/src/List.js.map +0 -1
- package/build/esm/Sidebar/src/Panel.js.map +0 -1
- package/build/esm/Sidebar/src/ResponsiveSidebarContext.js.map +0 -1
- package/build/esm/Sidebar/src/SecondarySidebarContext.js.map +0 -1
- package/build/esm/Sidebar/src/Section.js.map +0 -1
- package/build/esm/Sidebar/src/Sidebar.js.map +0 -1
- package/build/esm/Sidebar/src/useSidebar.js.map +0 -1
- package/build/esm/Slider/index.js.map +0 -1
- package/build/esm/Slider/src/Slider.js.map +0 -1
- package/build/esm/TagGroup/src/Tag.js.map +0 -1
- package/build/esm/TagGroup/src/TagGroup.js.map +0 -1
- package/build/esm/TagGroup/src/TagItem.js.map +0 -1
- package/build/esm/TimeField/i18n/index.js.map +0 -1
- package/build/esm/TimeField/src/TimeField.js.map +0 -1
- package/build/esm/TimeField/src/TimeFieldSegment.js.map +0 -1
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/index.js +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{TimeField → core/src/ListBox}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/index.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/Accordion.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionContext.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionHeading.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionItem.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/AccordionPanel.js +0 -0
- /package/build/esm/{Accordion → lab/src/Accordion}/src/utils.js +0 -0
- /package/build/esm/{Alert → lab/src/Alert}/src/Alert.js +0 -0
- /package/build/esm/{Amount → lab/src/Amount}/src/Amount.js +0 -0
- /package/build/esm/{Amount → lab/src/Amount}/src/useGroupAmount.js +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/Autocomplete}/src/Autocomplete.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItem.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemLink.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbItemStatic.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbOverflowMenu.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/Breadcrumbs.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/BreadcrumbsSeparator.js +0 -0
- /package/build/esm/{Breadcrumbs → lab/src/Breadcrumbs}/src/useBreadcrumbThreshold.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{Autocomplete → lab/src/FileDropzone}/i18n/index.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileDropzone.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/FileTrigger.js +0 -0
- /package/build/esm/{FileDropzone → lab/src/FileDropzone}/src/utils.js +0 -0
- /package/build/esm/{Filtering → lab/src/Filtering}/src/FilterDropdown.js +0 -0
- /package/build/esm/{Flag → lab/src/Flag}/src/Flag.js +0 -0
- /package/build/esm/{LabeledValue → lab/src/LabeledValue}/src/LabeledValue.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/da-DK.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/de-DE.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/en-US.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/fi-FI.json.js.map +0 -0
- /package/build/esm/{FileDropzone → lab/src/NumberField}/i18n/index.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/nb-NO.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/pl-PL.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/i18n/sv-SE.json.js.map +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/NumberField.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/StepperButton.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/cursorHelpers.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/formatHelpers.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/keyboardHelpers.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/useAutofillStyle.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/useNumberFieldFormatting.js +0 -0
- /package/build/esm/{NumberField → lab/src/NumberField}/src/useSapphireNumberField.js +0 -0
- /package/build/esm/{ProgressIndicator → lab/src/ProgressIndicator}/src/ProgressIndicator.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/index.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Body.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ExpandableItem.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Header.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Item.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/List.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Panel.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/ResponsiveSidebarContext.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/SecondarySidebarContext.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Section.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/Sidebar.js +0 -0
- /package/build/esm/{Sidebar → lab/src/Sidebar}/src/useSidebar.js +0 -0
- /package/build/esm/{Slider → lab/src/Slider}/index.js +0 -0
- /package/build/esm/{Slider → lab/src/Slider}/src/Slider.js +0 -0
- /package/build/esm/{TagGroup → lab/src/TagGroup}/src/Tag.js +0 -0
- /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagGroup.js +0 -0
- /package/build/esm/{TagGroup → lab/src/TagGroup}/src/TagItem.js +0 -0
- /package/build/esm/{NumberField → lab/src/TimeField}/i18n/index.js +0 -0
- /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeField.js +0 -0
- /package/build/esm/{TimeField → lab/src/TimeField}/src/TimeFieldSegment.js +0 -0
package/build/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/Accordion/src/AccordionContext.ts","../../src/Accordion/src/Accordion.tsx","../../src/Accordion/src/utils.ts","../../src/Accordion/src/AccordionHeading.tsx","../../src/Accordion/src/AccordionItem.tsx","../../src/Accordion/src/AccordionPanel.tsx","../../src/Accordion/index.ts","../../src/Alert/src/Alert.tsx","../../src/Amount/src/useGroupAmount.ts","../../src/Amount/src/Amount.tsx","../../src/Autocomplete/i18n/index.ts","../../src/Autocomplete/src/Autocomplete.tsx","../../src/Breadcrumbs/src/useBreadcrumbThreshold.ts","../../src/Breadcrumbs/src/Breadcrumbs.tsx","../../src/Breadcrumbs/src/BreadcrumbsSeparator.tsx","../../src/Breadcrumbs/src/BreadcrumbOverflowMenu.tsx","../../src/Breadcrumbs/src/BreadcrumbItemStatic.tsx","../../src/Breadcrumbs/src/BreadcrumbItemLink.tsx","../../src/Breadcrumbs/src/BreadcrumbItem.tsx","../../src/FileDropzone/src/FileTrigger.tsx","../../src/FileDropzone/src/utils.ts","../../src/FileDropzone/i18n/index.ts","../../src/FileDropzone/src/FileDropzone.tsx","../../src/Filtering/src/FilterDropdown.tsx","../../src/Filtering/src/SearchableSelectFilter.tsx","../../src/Flag/src/Flag.tsx","../../src/LabeledValue/src/LabeledValue.tsx","../../src/NumberField/i18n/index.ts","../../src/NumberField/src/StepperButton.tsx","../../src/NumberField/src/useAutofillStyle.ts","../../src/NumberField/src/formatHelpers.ts","../../src/NumberField/src/cursorHelpers.ts","../../src/NumberField/src/keyboardHelpers.ts","../../src/NumberField/src/useNumberFieldFormatting.ts","../../src/NumberField/src/useSapphireNumberField.ts","../../src/NumberField/src/NumberField.tsx","../../src/Sidebar/src/SecondarySidebarContext.tsx","../../src/Sidebar/src/ResponsiveSidebarContext.tsx","../../src/Sidebar/src/Panel.tsx","../../src/Sidebar/src/useSidebar.ts","../../src/Sidebar/src/Sidebar.tsx","../../src/Sidebar/src/Header.tsx","../../src/Sidebar/src/Item.tsx","../../src/Sidebar/src/ExpandableItem.tsx","../../src/Sidebar/src/Section.tsx","../../src/Sidebar/src/Body.tsx","../../src/Sidebar/src/List.tsx","../../src/Sidebar/index.ts","../../src/ProgressIndicator/src/ProgressIndicator.tsx","../../src/Slider/src/Slider.tsx","../../src/Slider/index.ts","../../src/TagGroup/src/Tag.tsx","../../src/TagGroup/src/TagGroup.tsx","../../src/TagGroup/src/TagItem.tsx","../../src/TimeField/src/TimeFieldSegment.tsx","../../src/TimeField/i18n/index.ts","../../src/TimeField/src/TimeField.tsx"],"sourcesContent":["import { TypographyHeadingProps } from '@danske/sapphire-react';\nimport React, { useContext } from 'react';\n\ninterface AccordionContextProps {\n sidePadding?: number | string;\n headerLevel?: TypographyHeadingProps['level'];\n}\n\nexport const AccordionContext = React.createContext<AccordionContextProps>({\n sidePadding: undefined,\n headerLevel: 5,\n});\n\nexport function useAccordionContext(): AccordionContextProps {\n const context = useContext(AccordionContext);\n if (context) {\n return context;\n }\n throw new Error(\n 'Accordion context can only be used within Accordion component.'\n );\n}\n","import React, { ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport {\n SapphireStyleProps,\n TypographyHeadingProps,\n useSapphireStyleProps,\n useThemeCheck,\n withTruthyZero as hasAllowedCustomSidePadding,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FocusScope } from 'react-aria/FocusScope';\n\nimport { AccordionContext } from './AccordionContext';\nimport { DisclosureGroup, DisclosureGroupProps } from 'react-aria-components';\n\nexport type TreeExpansionMode = 'single' | 'multiple';\n\nexport interface AccordionProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n DOMProps,\n Pick<\n DisclosureGroupProps,\n | 'allowsMultipleExpanded'\n | 'expandedKeys'\n | 'defaultExpandedKeys'\n | 'onExpandedChange'\n | 'children'\n | 'isDisabled'\n > {\n /** Set aria-level attribute for item's header. Accessibility requirement.\n * Defines the hierarchical level of an element within a page structure.\n * @default 5\n */\n headerLevel?: TypographyHeadingProps['level'];\n /**\n * Removes the divider after the last accordion item.\n * Useful when rendered in a container which already has borders.\n */\n hideLastDivider?: boolean;\n /**\n * Counter acts the side padding, so that accordion is shifted to the left with same amount\n * and having side padding * 2 added to width – resulting in full width accordion.\n * Useful in scenarions where accordion is inside a padded container and desired layout has accordion going from edge to edge horizontally.\n * @example\n * ```tsx\n * <Accordion hasNegativeSideMargin>...</Accordion>\n * ```\n */\n hasNegativeSideMargin?: boolean;\n /**\n * Add custom sized padding to the sides of the accordion items.\n * @example\n * ```tsx\n * <Accordion sidePadding={tokens.size.spacingContainerHorizontalM.value} hasNegativeSideMargin>...</Accordion>\n * ```\n */\n sidePadding?: number | string;\n}\n\n/**\n * Accordion is a vertically stacked set of items, that consist of an interactive header and expandable content section. An accordion item’s content display can be toggled on and off by clicking the component’s header above.\n */\nexport const Accordion = forwardRef(function Accordion(\n {\n allowsMultipleExpanded = true,\n headerLevel = 5,\n hideLastDivider = false,\n hasNegativeSideMargin = false,\n sidePadding,\n children,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled,\n ...props\n }: AccordionProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const forwardedRef = useObjectRef<HTMLDivElement>(ref);\n\n return (\n <FocusScope>\n <AccordionContext.Provider value={{ sidePadding, headerLevel }}>\n <DisclosureGroup\n {...filterDOMProps(props, { global: true, labelable: true })}\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys}\n defaultExpandedKeys={defaultExpandedKeys}\n onExpandedChange={onExpandedChange}\n isDisabled={isDisabled}\n ref={forwardedRef}\n className={clsx(\n styles['sapphire-accordion'],\n {\n [styles['sapphire-accordion--without-last-divider']]:\n hideLastDivider,\n [styles['sapphire-accordion--negative-margin-self']]:\n !hasAllowedCustomSidePadding(sidePadding) &&\n hasNegativeSideMargin,\n },\n styleProps.className\n )}\n style={{\n ...(hasAllowedCustomSidePadding(sidePadding) &&\n hasNegativeSideMargin\n ? {\n marginLeft:\n typeof sidePadding === 'string'\n ? `calc(${sidePadding} * -1)`\n : `-${sidePadding}px`,\n width: `calc(100% + calc(${sidePadding} * 2${\n typeof sidePadding === 'string' ? '' : 'px'\n }))`,\n }\n : {}),\n ...styleProps.style,\n }}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n </FocusScope>\n );\n});\n","export const customPaddingStyleProps = (sidePadding: number | string) => ({\n paddingLeft:\n typeof sidePadding === 'string' ? sidePadding : `${sidePadding}px`,\n paddingRight:\n typeof sidePadding === 'string' ? sidePadding : `${sidePadding}px`,\n});\n","import React, { forwardRef, ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport {\n Icon,\n Typography,\n TypographyHeadingProps,\n withTruthyZero as hasAllowedCustomSidePadding,\n} from '@danske/sapphire-react';\nimport { ChevronDown } from '@danske/sapphire-icons/react';\nimport { Button } from 'react-aria-components';\nimport { useAccordionContext } from './AccordionContext';\nimport { customPaddingStyleProps } from './utils';\n\nexport interface AccordionHeadingProps extends DOMProps {\n children?: ReactNode;\n headerLevel?: TypographyHeadingProps['level'];\n}\n\nexport const AccordionHeading = forwardRef(function AccordionHeading(\n { children, headerLevel, ...props }: AccordionHeadingProps,\n ref: React.Ref<HTMLDivElement>\n): React.JSX.Element {\n const { sidePadding, headerLevel: contextHeaderLevel } =\n useAccordionContext();\n\n return (\n <div\n role=\"heading\"\n aria-level={headerLevel ?? contextHeaderLevel}\n {...filterDOMProps(props, { global: true })}\n ref={ref}\n >\n <Button\n slot=\"trigger\"\n className={({ isFocusVisible }) =>\n clsx(styles['sapphire-accordion__item-header'], styles['js-focus'], {\n [styles['is-focus']]: isFocusVisible,\n })\n }\n style={\n hasAllowedCustomSidePadding(sidePadding)\n ? customPaddingStyleProps(sidePadding)\n : {}\n }\n >\n <Typography.Heading level={6} elementType=\"span\">\n <div className={clsx(styles['sapphire-accordion__item-heading'])}>\n {children}\n </div>\n </Typography.Heading>\n <div className={clsx(styles['sapphire-accordion__item-arrow'])}>\n <Icon size=\"lg\">\n <ChevronDown />\n </Icon>\n </div>\n </Button>\n </div>\n );\n});\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\n\nimport { Disclosure } from 'react-aria-components';\nimport { DisclosureProps } from 'react-aria-components';\nimport { useFocusManager } from 'react-aria/FocusScope';\nimport { useEvent } from 'react-aria/private/utils/useEvent';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { DOMProps } from '@react-types/shared';\n\nexport interface AccordionItemProps\n extends DOMProps,\n Pick<DisclosureProps, 'children' | 'isDisabled'> {}\n\nexport const AccordionItem = forwardRef(function AccordionItem(\n { children, id, ...props }: AccordionItemProps,\n forwardedRef: React.Ref<HTMLDivElement>\n): JSX.Element {\n const ref = useObjectRef<HTMLDivElement>(forwardedRef);\n const focusManager = useFocusManager();\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (!focusManager) return;\n\n if (\n !(e.target instanceof Element) ||\n e.target.getAttribute('slot') !== 'trigger'\n )\n return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusManager.focusNext();\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusManager.focusPrevious();\n break;\n case 'Home':\n e.preventDefault();\n focusManager.focusFirst();\n break;\n case 'End':\n e.preventDefault();\n focusManager.focusLast();\n break;\n default:\n return;\n }\n };\n\n useEvent(ref, 'keydown', onKeyDown);\n\n return (\n <Disclosure\n ref={ref}\n id={id}\n className={({ isExpanded, isDisabled }) =>\n clsx(styles['sapphire-accordion__item'], {\n [styles['sapphire-accordion__item--open']]: isExpanded,\n [styles['is-disabled']]: isDisabled,\n })\n }\n {...props}\n >\n <div className={clsx(styles['sapphire-accordion__item-content-wrapper'])}>\n {children}\n </div>\n </Disclosure>\n );\n});\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport { DisclosurePanel, DisclosurePanelProps } from 'react-aria-components';\nimport { useAccordionContext } from './AccordionContext';\nimport { customPaddingStyleProps } from './utils';\nimport { withTruthyZero as hasAllowedCustomSidePadding } from '@danske/sapphire-react';\nimport { DOMProps } from '@react-types/shared';\n\nexport interface AccordionPanelProps\n extends DOMProps,\n Pick<DisclosurePanelProps, 'children' | 'role'> {}\n\nexport const AccordionPanel = forwardRef(function AccordionPanel(\n { children, ...props }: AccordionPanelProps,\n ref: React.Ref<HTMLDivElement>\n): React.JSX.Element {\n const { sidePadding } = useAccordionContext();\n\n return (\n <DisclosurePanel\n ref={ref}\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-accordion__item-content'])}\n style={{\n /**\n * useDisclosure hook from react-aria uses css variable --disclosure-panel-height to\n * animate the height of the panel.\n */\n height: 'var(--disclosure-panel-height)',\n }}\n {...props}\n >\n <div\n style={{\n ...(hasAllowedCustomSidePadding(sidePadding)\n ? customPaddingStyleProps(sidePadding)\n : {}),\n }}\n className={styles['sapphire-accordion__item-content-inner']}\n >\n {children}\n </div>\n </DisclosurePanel>\n );\n});\n","import { Accordion, type AccordionProps } from './src/Accordion';\nimport {\n AccordionHeading,\n type AccordionHeadingProps,\n} from './src/AccordionHeading';\nimport { AccordionItem, type AccordionItemProps } from './src/AccordionItem';\nimport { AccordionContext } from './src/AccordionContext';\nimport { AccordionPanel, type AccordionPanelProps } from './src/AccordionPanel';\n\n/*\n * Before moving Accordion component to the core package, it's important to check on the\n * latest release of \"@react-aria/accordion\".\n * The hook and the component package are marked as \"pre-release\", so we can expect some changes.\n *\n * https://github.com/adobe/react-spectrum/issues/2801#issuecomment-1035377858\n * https://github.com/adobe/react-spectrum/discussions/6635#discussioncomment-9990027\n *\n * The current implementation is based on the SelectableCollection API, which creates bugs when\n * focusable items are used inside of the Accordion.Item.\n * E.g. UC-3414 (fixed), UC-3545 (to-do)\n *\n * Alternatively, we can re-implement the component.\n */\nconst _Accordion = Object.assign(Accordion, {\n Heading: AccordionHeading,\n Item: AccordionItem,\n Panel: AccordionPanel,\n});\n\nexport {\n _Accordion as Accordion,\n AccordionContext,\n type AccordionProps,\n type AccordionItemProps,\n type AccordionHeadingProps,\n type AccordionPanelProps,\n};\n","import React, { ReactNode } from 'react';\nimport {\n SapphireStyleProps,\n useThemeCheck,\n useSapphireStyleProps,\n Typography,\n Icon,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport {\n CheckmarkOutline,\n Information,\n Warning,\n Error,\n} from '@danske/sapphire-icons/react';\nimport alertStyles from '@danske/sapphire-css/components/alert/alert.module.css';\nimport { clsx } from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport interface SapphireAlertProps\n extends GlobalDomAttributes,\n SapphireStyleProps {\n /**\n * The content of the alert.\n */\n children?: ReactNode;\n\n /**\n * The title of the alert.\n */\n title?: ReactNode;\n\n /**\n * @default 'info'\n */\n variant?: 'info' | 'positive' | 'negative' | 'warning';\n}\n\nexport function Alert({\n children,\n title,\n variant = 'info',\n ...props\n}: SapphireAlertProps): React.JSX.Element {\n useThemeCheck();\n const {\n styleProps: { style, className },\n } = useSapphireStyleProps(props);\n\n const getIcon = (variant: string) => {\n switch (variant) {\n case 'warning':\n return <Warning />;\n case 'positive':\n return <CheckmarkOutline />;\n case 'negative':\n return <Error />;\n default:\n return <Information />;\n }\n };\n\n return (\n <div\n {...filterDOMProps(props, { global: true })}\n className={clsx(\n alertStyles['sapphire-alert'],\n {\n [alertStyles['sapphire-alert--positive']]: variant === 'positive',\n [alertStyles['sapphire-alert--negative']]: variant === 'negative',\n [alertStyles['sapphire-alert--warning']]: variant === 'warning',\n },\n className\n )}\n style={style}\n role=\"alert\"\n >\n <span className={alertStyles['sapphire-alert__icon']}>\n <Icon size=\"sm\">{getIcon(variant)}</Icon>\n </span>\n <div className={alertStyles['sapphire-alert__title']}>\n <Typography.Body size=\"sm\" isSemibold>\n {title}\n </Typography.Body>\n </div>\n <div className={alertStyles['sapphire-alert__content']}>\n <Typography.Body elementType=\"section\" size=\"md\">\n {children}\n </Typography.Body>\n </div>\n </div>\n );\n}\n","import { useMemo } from 'react';\n\nexport interface GroupedPart {\n type: 'sign' | 'number' | 'currency';\n value: string;\n}\n\n/**\n * Process the value that is being provided and format it using the provided formatter.\n * It returns both the formatted value as a string and the grouped parts for further processing.\n * It's useful for keeping track of diffrent parts of the formatted amount and where currency symbols are located.\n *\n * Example: value = \"+30000\", formatter for DKK currency\n * formattedValue = \"+DKK 30,000.00\"\n * groupedParts = [\n * { type: 'sign', value: '+' },\n * { type: 'currency', value: 'DKK' },\n * { type: 'number', value: '30,000.00' }\n * ]\n */\nexport const useGroupAmount = (\n value: string | number,\n formatter: Intl.NumberFormat\n) => {\n const numberValue = useMemo(() => {\n const parsed = Number(value);\n return isNaN(parsed) ? 0 : parsed;\n }, [value]);\n\n const groupedParts = useMemo(() => {\n const parts = formatter.formatToParts(numberValue);\n const result: GroupedPart[] = [];\n let currentNumber = '';\n\n parts.forEach((part) => {\n if (part.type === 'plusSign' || part.type === 'minusSign') {\n result.push({ type: 'sign', value: part.value });\n } else if (part.type === 'currency') {\n if (currentNumber) {\n result.push({ type: 'number', value: currentNumber });\n currentNumber = '';\n }\n result.push({ type: 'currency', value: part.value });\n } else if (part.type !== 'literal') {\n currentNumber += part.value;\n }\n });\n\n if (currentNumber) {\n result.push({ type: 'number', value: currentNumber });\n }\n\n return result;\n }, [numberValue, formatter]);\n\n const formattedValue = useMemo(\n () => groupedParts.map((part) => part.value).join(''),\n [groupedParts]\n );\n\n return { formattedValue, groupedParts };\n};\n","import { useMemo } from 'react';\nimport {\n useThemeCheck,\n SapphireStyleProps,\n GlobalDomAttributes,\n Typography,\n TypographyBodyProps,\n useSapphireStyleProps,\n} from '@danske/sapphire-react';\nimport React from 'react';\nimport { useLocale } from 'react-aria/I18nProvider';\nimport { useGroupAmount } from './useGroupAmount';\nimport styles from '@danske/sapphire-css/components/amount/amount.module.css';\n\n/**\n * Format options for currency amounts.\n * The style is always 'currency', so only currency-related options are exposed.\n */\nexport type CurrencyFormatOptions = Pick<\n Intl.NumberFormatOptions,\n | 'currency'\n | 'currencyDisplay'\n | 'currencySign'\n | 'signDisplay'\n | 'minimumFractionDigits'\n | 'maximumFractionDigits'\n | 'minimumSignificantDigits'\n | 'maximumSignificantDigits'\n | 'useGrouping'\n | 'notation'\n>;\n\nexport type AmountProps = {\n /**\n * When displaying amounts, readability and visual hierarchy are key. Use medium weight for primary emphasis to highlight amounts or regular weight for secondary emphasis.\n *\n * @default 'regular'\n */\n emphasis?: 'primary' | 'regular';\n /**\n * The variant of the Amount component. `positive` shows a green color, and should be used for amounts greater than zero.\n *\n * @default 'neutal'\n */\n variant?: 'neutal' | 'positive';\n /**\n * The amount value to be formatted and displayed.\n *\n * If displaying the sign is a requirement, ensure the value is a string that starts with '+' or '-'.\n * Alternatively, you can use the `signDisplay` option in `formatOptions` to control the display of the sign for numeric values.\n */\n value: string | number;\n /** Currency formatting options */\n formatOptions?: CurrencyFormatOptions;\n} & Pick<TypographyBodyProps, 'size'> &\n SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const Amount = ({\n emphasis = 'regular',\n variant,\n formatOptions,\n value,\n size,\n ...props\n}: AmountProps): JSX.Element => {\n useThemeCheck();\n const { styleProps, filteredProps } = useSapphireStyleProps(props);\n const { locale } = useLocale();\n\n const formatter = useMemo(\n () =>\n new Intl.NumberFormat(locale, {\n style: formatOptions?.currency ? 'currency' : undefined,\n /**\n * Always show the sign if the value starts with '+' or '-'.\n */\n signDisplay:\n formatOptions?.signDisplay || String(value).startsWith('+')\n ? 'always'\n : 'auto',\n minimumFractionDigits: 2,\n ...formatOptions,\n }),\n [locale, formatOptions, value]\n );\n\n const { formattedValue, groupedParts } = useGroupAmount(value, formatter);\n\n return (\n <span\n style={styleProps.style}\n className={styles['sapphire-amount']}\n {...filteredProps}\n aria-label={formattedValue}\n >\n {groupedParts.map((part, index) => (\n <Typography.Body\n elementType=\"span\"\n key={index}\n color={variant === 'positive' ? 'positive' : 'primary'}\n isSemibold={emphasis === 'primary' ? true : false}\n size={size}\n >\n {part.value}\n </Typography.Body>\n ))}\n </span>\n );\n};\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","import React, { Key, ReactElement, useRef } from 'react';\nimport {\n ListBoxProps,\n useThemeCheck,\n useSapphireStyleProps,\n SapphireStyleProps,\n ListBoxPopover,\n useComboBoxState,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { useComboBox } from 'react-aria/useComboBox';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport intlMessages from '../i18n';\nimport { useFocusableRef } from '@react-spectrum/utils';\nimport type { ComboBoxProps } from '@react-types/combobox';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport type AutocompleteProps<T extends object> = GlobalDomAttributes &\n SapphireStyleProps &\n Pick<\n ComboBoxProps<T>,\n | 'items'\n | 'children'\n | 'inputValue'\n | 'defaultInputValue'\n | 'onInputChange'\n | 'isDisabled'\n > &\n Pick<ListBoxProps<T>, 'loadingState' | 'loadingSkeletonRowsCount'> & {\n /**\n * This prop is badly named. It is NOT related to a selection state being\n * changed since there is no selection state in this component.\n *\n * This callback simply notifies you when the user filled in the text field\n * by selecting an option from the autocomplete dropdown. Similar to an\n * onClick.\n *\n * @deprecated\n * Use `onSuggestionSelected` instead.\n */\n onSelectionChange?: Pick<\n ComboBoxProps<T>,\n 'onSelectionChange'\n >['onSelectionChange'];\n\n /*\n * This callback simply notifies you when the user filled in the text field\n * by selecting an option from the autocomplete dropdown. Similar to an\n * onClick.\n */\n onSuggestionSelected?: (key: Key) => void;\n /**\n * Render function for the input element.\n * Receives props that should be spread onto the input component.\n */\n renderInput: (inputProps: any) => ReactElement;\n\n /**\n * Accessible label for the suggestions listbox.\n */\n listboxAriaLabel?: string;\n\n /**\n * Controlled selected value.\n */\n value?: React.Key | null;\n\n /**\n * Decide what items to display in the dropdown menu.\n * @default 'String.includes'\n */\n defaultFilter?: (textValue: string, inputValue: string) => boolean;\n };\n\nexport function Autocomplete<T extends object>(\n props: AutocompleteProps<T>\n): ReactElement {\n useThemeCheck();\n const formatMessage = useMessageFormatter(intlMessages);\n\n const {\n inputValue,\n renderInput,\n loadingState,\n loadingSkeletonRowsCount,\n listboxAriaLabel,\n onSuggestionSelected,\n onSelectionChange,\n ...otherProps\n } = props;\n\n const {\n styleProps: { style, className },\n } = useSapphireStyleProps(props);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const listBoxRef = useFocusableRef<HTMLUListElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const triggerRef = useFocusableRef<HTMLDivElement>(null);\n const collectionRef = useRef<\n ReturnType<typeof useComboBoxState>['collection'] | null\n >(null);\n\n const state = useComboBoxState({\n ...props,\n inputValue,\n allowsEmptyCollection: loadingState === 'loading',\n allowsCustomValue: true,\n shouldCloseOnBlur: true,\n onSelectionChange: (key) => {\n if (key !== null) {\n onSelectionChange?.(key);\n onSuggestionSelected?.(key);\n // When both value and inputValue are controlled, react-stately skips\n // updating inputValue\n const itemText = collectionRef.current?.getItem(key)?.textValue ?? '';\n if (itemText) {\n props.onInputChange?.(itemText);\n }\n }\n },\n });\n\n collectionRef.current = state.collection;\n\n const { inputProps, listBoxProps } = useComboBox(\n {\n ...props,\n 'aria-label': listboxAriaLabel || formatMessage('listbox-suggestions'),\n inputRef,\n listBoxRef,\n popoverRef,\n },\n state\n );\n\n const inputElement = renderInput({\n ...inputProps,\n isDisabled: props.isDisabled,\n inputRef,\n 'aria-haspopup': 'listbox',\n 'aria-expanded': state.isOpen,\n onChange: (value: string) => {\n inputProps.onChange?.({\n target: { value },\n currentTarget: { value },\n } as React.ChangeEvent<HTMLInputElement>);\n },\n });\n\n return (\n <div\n ref={triggerRef}\n {...filterDOMProps(otherProps, { global: true })}\n style={{ display: 'inline-flex', ...style }}\n className={className}\n >\n {inputElement}\n {state.isOpen && (\n <ListBoxPopover<T>\n state={state}\n triggerRef={triggerRef}\n popoverRef={popoverRef}\n listBoxRef={listBoxRef}\n listBoxProps={listBoxProps}\n loadingState={loadingState}\n loadingSkeletonRowsCount={loadingSkeletonRowsCount}\n selectWidth={triggerRef.current?.offsetWidth}\n disableSelectedStyles\n isNonModal\n >\n {props.children || []}\n </ListBoxPopover>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport { useResizeObserver } from 'react-aria/private/utils/useResizeObserver';\n\nexport const useBreadcrumbThreshold = (\n childrenCount: number,\n containerRef: React.RefObject<HTMLElement>,\n breadcrumbRef: React.RefObject<HTMLOListElement>\n) => {\n const [itemWidths, setItemWidths] = useState<number[]>([]);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n const { shouldRenderOverflow, maxVisibleTailChildren } = useMemo(() => {\n if (!containerWidth || itemWidths.length === 0) {\n return {\n shouldRenderOverflow: false,\n maxVisibleTailChildren: childrenCount,\n };\n }\n\n // Exit early if the container is wider than all items combined\n const totalItemWidth = itemWidths.reduce((a, b) => a + b, 0);\n if (totalItemWidth <= containerWidth) {\n return {\n shouldRenderOverflow: false,\n maxVisibleTailChildren: itemWidths.length - 1,\n };\n }\n\n // The minimum number of items in the container is 2 (first and last).\n let totalWidth = itemWidths[0] + itemWidths[itemWidths.length - 1];\n let visibleTailCount = 1; // Last item counted by default\n\n for (\n let i = itemWidths.length - 2;\n i > 0 && totalWidth + itemWidths[i] < containerWidth;\n i--\n ) {\n totalWidth += itemWidths[i];\n visibleTailCount++;\n }\n\n visibleTailCount--; // When we are overflowing, take into account the icon button that will be rendered\n return {\n shouldRenderOverflow: true,\n maxVisibleTailChildren: Math.max(1, visibleTailCount),\n };\n }, [itemWidths, containerWidth, childrenCount]);\n\n /**\n * Compute the individual widths of the breadcrumb items.\n * It's important to have these values for all the items, since they disappear if the container\n * is overflowing. We need these values to recompute the number of items that can fit,\n * but we can't do that once they have disappeared from the container.\n */\n const computeItemWidths = () => {\n if (!breadcrumbRef.current) return;\n const breadcrumbItems = Array.from(\n breadcrumbRef.current.children\n ) as HTMLElement[];\n const widths = breadcrumbItems\n .map((item) => item.offsetWidth)\n .filter(Boolean);\n\n if (widths.length === breadcrumbItems.length) {\n setItemWidths(widths);\n }\n };\n\n /**\n * Recompute the item widths when the children change.\n */\n useEffect(() => {\n if (childrenCount !== itemWidths.length) {\n computeItemWidths();\n }\n }, [containerRef.current, childrenCount]);\n\n useResizeObserver({\n ref: containerRef,\n onResize: () => {\n if (!containerRef.current) return;\n setContainerWidth(containerRef.current.offsetWidth);\n },\n });\n\n const overflowNodes = useMemo(() => {\n if (childrenCount > 0 && shouldRenderOverflow) {\n const tailCount = maxVisibleTailChildren > 1 ? maxVisibleTailChildren : 1;\n const actualTailCount =\n maxVisibleTailChildren === 1 ? maxVisibleTailChildren : tailCount;\n const limitedTailCount = Math.min(actualTailCount, 5); // By design, we limit the number of visible tail items to 6\n const tailStartIndex = childrenCount - limitedTailCount;\n // Return overflow indexes (hidden items) - all items except first and tail items\n return Array.from({ length: tailStartIndex - 1 }, (_, i) => i + 1);\n }\n return [];\n }, [childrenCount, shouldRenderOverflow, maxVisibleTailChildren]);\n\n return {\n overflowNodes,\n };\n};\n","import React, { createContext } from 'react';\nimport { useBreadcrumbs } from 'react-aria/useBreadcrumbs';\nimport { Collection } from 'react-aria/Collection';\nimport { CollectionBuilder } from 'react-aria/CollectionBuilder';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { forwardRefType } from '@react-types/shared';\nimport { ForwardedRef, forwardRef, useContext, useRef } from 'react';\nimport {\n BreadcrumbsContext as RACBreadcrumbsContext,\n BreadcrumbsProps as RACBreadcrumbsProps,\n CollectionRendererContext,\n useContextProps,\n} from 'react-aria-components';\nimport { useBreadcrumbThreshold } from './useBreadcrumbThreshold';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport clsx from 'clsx';\nimport { BreadcrumbItemNode } from './types';\n\nexport type BreadcrumbsProps<T extends object> = Pick<\n RACBreadcrumbsProps<T>,\n 'aria-label' | 'isDisabled' | 'children'\n> & {\n /**\n * The size of the breadcrumbs component.\n *\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Maximum width for the breadcrumbs container. When content overflows,\n * it will show an overflow menu with the first and last items.\n */\n maxWidth?: React.CSSProperties['maxWidth'];\n} & SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const BreadcrumbsContext = createContext<{\n size: 'sm' | 'md' | 'lg';\n overflowNodes: (BreadcrumbItemNode | null)[];\n isDisabled?: boolean;\n}>({ size: 'md', overflowNodes: [] });\n\n/**\n * Implementation is based on React Aria's Breadcrumbs component.\n * It was necessary to own the implementation to add support for\n * handling the collection directly, as we need it for the overflow calculation logic.\n */\nexport const Breadcrumbs = (forwardRef as forwardRefType)(function Breadcrumbs<\n T extends object\n>(\n { maxWidth, size = 'md', ...props }: BreadcrumbsProps<T>,\n fwdRef: ForwardedRef<HTMLOListElement>\n) {\n const [RACprops, ref] = useContextProps(props, fwdRef, RACBreadcrumbsContext);\n const { styleProps } = useSapphireStyleProps(RACprops);\n const containerRef = useRef<HTMLDivElement>(null);\n const { CollectionRoot } = useContext(CollectionRendererContext);\n const { navProps } = useBreadcrumbs(RACprops);\n const DOMProps = filterDOMProps(RACprops, { global: true });\n\n return (\n <CollectionBuilder content={<Collection {...RACprops} />}>\n {(collection) => {\n const { overflowNodes } = useBreadcrumbThreshold(\n collection.size,\n containerRef,\n ref\n );\n const keys = Array.from(collection.getKeys());\n return (\n <div\n ref={containerRef}\n style={{\n ...styleProps.style,\n maxWidth,\n display: 'flex',\n }}\n >\n <ol\n ref={ref}\n {...mergeProps(DOMProps, navProps)}\n className={clsx(styles['sapphire-breadcrumbs'], {\n [styles['sapphire-breadcrumbs--sm']]: size === 'sm',\n [styles['sapphire-breadcrumbs--lg']]: size === 'lg',\n })}\n >\n <BreadcrumbsContext.Provider\n value={{\n size,\n overflowNodes: overflowNodes.map((index) =>\n collection.getItem(keys[index])\n ),\n isDisabled: RACprops.isDisabled,\n }}\n >\n <RACBreadcrumbsContext.Provider value={RACprops}>\n <CollectionRoot collection={collection} />\n </RACBreadcrumbsContext.Provider>\n </BreadcrumbsContext.Provider>\n </ol>\n </div>\n );\n }}\n </CollectionBuilder>\n );\n});\n","import clsx from 'clsx';\nimport React, { useContext } from 'react';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { ChevronRight } from '@danske/sapphire-icons/react';\nimport { Icon } from '@danske/sapphire-react';\nimport { BreadcrumbsContext } from './Breadcrumbs';\n\nexport const BreadcrumbsSeparator = (): JSX.Element => {\n const { size } = useContext(BreadcrumbsContext);\n\n // Based on the design\n const iconSize = size === 'lg' ? 'md' : 'sm';\n\n return (\n <span\n className={clsx(styles['sapphire-breadcrumbs__separator'])}\n aria-hidden=\"true\"\n >\n <Icon size={iconSize}>\n <ChevronRight />\n </Icon>\n </span>\n );\n};\n","import { Menu, MenuItem, IconButton } from '@danske/sapphire-react';\nimport { OverflowMenuHorizontal } from '@danske/sapphire-icons/react';\nimport React from 'react';\nimport { useContext } from 'react';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbsSeparator } from './BreadcrumbsSeparator';\n\n/**\n * Component that is being rendered in the case of overflowed breadcrumbs.\n * It is an internal component, so it's automatically rendered when the Breadcrumb\n * component detects overflow.\n */\nexport const BreadcrumbOverflowMenu = (): JSX.Element => {\n const { size, overflowNodes } = useContext(BreadcrumbsContext);\n\n return (\n <>\n <Menu\n triggerElement={\n <IconButton aria-label=\"Show more breadcrumbs\" size={size}>\n <OverflowMenuHorizontal />\n </IconButton>\n }\n >\n {overflowNodes.map((item) =>\n !item ? null : (\n <MenuItem\n key={item.key}\n id={item.key}\n href={item.href}\n isDisabled={!item.href}\n >\n {item.rendered}\n </MenuItem>\n )\n )}\n </Menu>\n <BreadcrumbsSeparator />\n </>\n );\n};\n","import React, { forwardRef } from 'react';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n TooltipIfNeeded,\n} from '@danske/sapphire-react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { mergeRefs } from 'react-aria/mergeRefs';\n\nexport type BreadcrumbItemStaticProps = Pick<\n React.HTMLAttributes<HTMLSpanElement>,\n 'children'\n> &\n SapphireStyleProps &\n GlobalDomAttributes & { size: 'sm' | 'md' | 'lg' };\n\nexport const BreadcrumbItemStatic = forwardRef<\n HTMLSpanElement,\n BreadcrumbItemStaticProps\n>(function BreadcrumbItemStatic({ size, ...props }, ref): JSX.Element {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n return (\n <TooltipIfNeeded<HTMLSpanElement> title={props.children}>\n {(tooltipContentRef, tooltipProps) => {\n const positioningRef = tooltipProps?.ref;\n return (\n <span\n {...tooltipProps}\n ref={\n mergeRefs(\n ref,\n tooltipContentRef,\n positioningRef\n ) as React.LegacyRef<HTMLSpanElement>\n }\n className={clsx(\n styles['sapphire-breadcrumbs__item--static'],\n {\n [styles['sapphire-breadcrumbs__item--static--sm']]:\n size === 'sm',\n [styles['sapphire-breadcrumbs__item--static--lg']]:\n size === 'lg',\n },\n styleProps.className\n )}\n style={styleProps.style}\n >\n {props.children}\n </span>\n );\n }}\n </TooltipIfNeeded>\n );\n});\n","import React, { useContext, forwardRef } from 'react';\nimport {\n Button,\n ButtonProps,\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FocusableRef } from '@react-types/shared';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbItemStatic } from './BreadcrumbItemStatic';\n\nexport type BreadcrumbItemLinkProps = Pick<\n ButtonProps<'a'>,\n | 'children'\n | 'href'\n | 'hrefLang'\n | 'target'\n | 'rel'\n | 'isDisabled'\n | 'icon'\n // TODO when moving to \"core\", use types under `types.ts` instead of plain strings\n | 'aria-label'\n | 'aria-labelledby'\n | 'aria-describedby'\n | 'aria-details'\n | 'UNSAFE_onClick'\n> &\n SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const BreadcrumbItemLink = forwardRef(function BreadcrumbItemLink(\n { children, ...props }: BreadcrumbItemLinkProps,\n ref: FocusableRef<HTMLAnchorElement>\n): JSX.Element {\n useThemeCheck();\n const { styleProps: sapphireStyleProps } = useSapphireStyleProps(props);\n const { style, className, ...styleProps } = sapphireStyleProps;\n const { size } = useContext(BreadcrumbsContext);\n\n if (!props.href && !props.UNSAFE_onClick) {\n return (\n <BreadcrumbItemStatic {...props} size={size}>\n {children}\n </BreadcrumbItemStatic>\n );\n }\n\n return (\n <Button\n {...props}\n {...styleProps}\n UNSAFE_className={className}\n UNSAFE_style={{ ...style }}\n ref={ref}\n size={size}\n variant=\"tertiary\"\n isDisabled={props.isDisabled}\n >\n {children}\n </Button>\n );\n});\n\nBreadcrumbItemLink.displayName = 'BreadcrumbItemLink';\n","import React, { useContext, ForwardedRef } from 'react';\nimport type { BreadcrumbProps as RACBreadcrumbProps } from 'react-aria-components';\nimport { CollectionNode } from 'react-aria/private/collections/BaseCollection';\nimport { createLeafComponent } from 'react-aria/CollectionBuilder';\nimport {\n useSapphireStyleProps,\n useThemeCheck,\n SapphireStyleProps,\n Typography,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { BreadcrumbsSeparator } from './BreadcrumbsSeparator';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbOverflowMenu } from './BreadcrumbOverflowMenu';\nimport { BreadcrumbItemNode } from './types';\nimport {\n BreadcrumbItemLink,\n BreadcrumbItemLinkProps,\n} from './BreadcrumbItemLink';\n\nexport type BreadcrumbItemProps = {\n isDisabled?: boolean;\n} & SapphireStyleProps &\n GlobalDomAttributes &\n Pick<RACBreadcrumbProps, 'children'> &\n BreadcrumbItemLinkProps;\n\nclass BreadcrumbItemCollectionNode extends CollectionNode<unknown> {\n static readonly type = 'item';\n}\n\n/**\n * The implementation is based on React Aria's BreadcrumbItem, with added support for\n * overflow menu data handling.\n */\nexport const BreadcrumbItem = createLeafComponent(\n BreadcrumbItemCollectionNode,\n function BreadcrumbItem(\n props: BreadcrumbItemProps,\n ref: ForwardedRef<HTMLLIElement>,\n node: BreadcrumbItemNode\n ): JSX.Element {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const {\n size,\n overflowNodes,\n isDisabled: breadcrumbsDisabled,\n } = useContext(BreadcrumbsContext);\n const { isDisabled: individualDisabled = false } = props;\n\n const isCurrent = node.nextKey == null;\n const isDisabled = individualDisabled || breadcrumbsDisabled;\n\n /**\n * The item should not be rendered if it's in the overflow indexes.\n * The only exception is the first overflow menu item, which will be rendered\n * as the overflow menu trigger.\n */\n const shouldRender = !overflowNodes.some((item) => item?.key === node.key);\n const showOverflowMenu = overflowNodes[0]?.key === node.key;\n\n if (!shouldRender && !showOverflowMenu) {\n return <></>;\n }\n\n if (!shouldRender && showOverflowMenu) {\n return <BreadcrumbOverflowMenu />;\n }\n\n node.href = props.href;\n\n return (\n <li\n ref={ref}\n className={clsx(styles['sapphire-breadcrumbs__item'])}\n style={{ ...styleProps.style }}\n data-disabled={isDisabled || undefined}\n data-current={isCurrent || undefined}\n >\n {isCurrent ? (\n <Typography.Body\n elementType=\"span\"\n isSemibold\n size={size === 'lg' ? 'md' : size === 'md' ? 'sm' : 'xs'}\n >\n {node.rendered}\n </Typography.Body>\n ) : (\n <BreadcrumbItemLink isDisabled={isDisabled} {...props}>\n {node.rendered}\n </BreadcrumbItemLink>\n )}\n {!isCurrent && <BreadcrumbsSeparator />}\n </li>\n );\n }\n);\n","import React, { ForwardedRef } from 'react';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { PressResponder } from 'react-aria/private/interactions/PressResponder';\n\nexport interface FileSelectProps {\n /**\n * List of file types that are allowed to be selected using the file select.\n * When no list is passed, all file types will be allowed to be selected.\n * @default \"\"\n */\n acceptedFileTypes?: string[];\n /**\n * Whether multiple files are allowed to be selected using the file select.\n * @default \"false\"\n */\n allowsMultiple?: boolean;\n}\n\nexport interface FileTriggerProps extends FileSelectProps {\n /**\n * Callback for file selection.\n * @param files - the list of selected files\n * @default \"() => null\"\n */\n onSelect?: (files: FileList | null) => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}\n\nconst HiddenFileInput = React.forwardRef(function InputWrapper(\n props: React.HTMLProps<HTMLInputElement>,\n ref: ForwardedRef<HTMLInputElement>\n) {\n return <input {...props} ref={ref} type=\"file\" style={{ display: 'none' }} />;\n});\n\nexport const FileTrigger = React.forwardRef(function FileTriggerWrapper(\n props: FileTriggerProps,\n ref: ForwardedRef<HTMLInputElement>\n) {\n const {\n acceptedFileTypes,\n allowsMultiple = false,\n onSelect = () => null,\n children,\n isDisabled = false,\n ...rest\n } = props;\n const inputRef = useObjectRef(ref);\n const domProps = filterDOMProps(rest, { global: true });\n\n return (\n <>\n <PressResponder\n isDisabled={isDisabled}\n onPress={() => {\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n inputRef.current?.click();\n }}\n >\n {children}\n </PressResponder>\n <HiddenFileInput\n {...domProps}\n disabled={isDisabled}\n ref={inputRef}\n accept={acceptedFileTypes?.toString()}\n onChange={(e) => onSelect?.((e.target as HTMLInputElement).files)}\n multiple={allowsMultiple}\n />\n </>\n );\n});\n","import { FileDropItem } from '@react-types/shared';\n\nexport const convertFileListToFileDropItems = (\n fileList: FileList | null\n): FileDropItem[] => {\n if (!fileList) {\n return [];\n }\n\n return Array.from(fileList).map((file) => ({\n kind: 'file',\n type: file.type,\n name: file.name,\n getFile: () => Promise.resolve(file),\n getText: () =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsText(file);\n }),\n }));\n};\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","import React, { ForwardedRef } from 'react';\nimport clsx from 'clsx';\nimport {\n Typography,\n Icon,\n SapphireStyleProps,\n useButton,\n useSapphireStyleProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/dropzone/dropzone.module.css';\nimport { Upload } from '@danske/sapphire-icons/react';\nimport { HoverProps, useHover } from 'react-aria/useHover';\nimport { Pressable } from 'react-aria/Pressable';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useId } from 'react-aria/useId';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { FileSelectProps, FileTrigger } from './FileTrigger';\nimport { DropOptions, useDrop } from 'react-aria/useDrop';\nimport { useClipboard } from 'react-aria/useClipboard';\nimport { convertFileListToFileDropItems } from './utils';\nimport { useFocusRing } from 'react-aria/useFocusRing';\nimport { AriaLabelingProps } from '@react-types/shared';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport intlMessages from '../i18n';\n\nexport interface FileDropzoneProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n Pick<\n DropOptions,\n | 'getDropOperation'\n | 'onDropEnter'\n | 'onDropActivate'\n | 'onDropMove'\n | 'onDropExit'\n | 'onDrop'\n >,\n HoverProps,\n FileSelectProps,\n // TODO when moving to \"core\", use types under `types.ts` instead of plain strings\n Pick<\n AriaLabelingProps,\n 'aria-label' | 'aria-labelledby' | 'aria-describedby' | 'aria-details'\n > {\n /**\n * Whether the dropzone has an error\n * @default false\n */\n hasError?: boolean;\n /**\n * The body text of the dropzone which can contain the instructions for the files to be uploaded.\n * Can be rendered differently based on the `isDropping` parameter, which is true if a file is about to be dropped in the zone.\n * @param isDropping - boolean that marks whether a payload is about to be dropped in the dropzone.\n */\n renderInstruction: (isDropping: boolean) => string;\n /**\n * Function that is called when the file select is opened on press, before any file is selected.\n * @default \"() => null\"\n */\n onFileSelectOpen?: () => void;\n}\n\nexport const FileDropzone = React.forwardRef(function DropzoneWrapper(\n props: FileDropzoneProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n isDisabled = false,\n hasError,\n renderInstruction,\n onFileSelectOpen = () => null,\n acceptedFileTypes,\n allowsMultiple,\n onDrop = () => null,\n getDropOperation = () => 'copy',\n ...otherProps\n } = props;\n\n const id = useId();\n const paragraphId = props['aria-label'] ? undefined : id;\n const format = useMessageFormatter(intlMessages);\n const pressableRef = useObjectRef(forwardedRef);\n const { hoverProps, isHovered } = useHover({ isDisabled });\n const { styleProps } = useSapphireStyleProps(props);\n const { dropProps, isDropTarget: isDropping } = useDrop({\n ...props,\n ref: pressableRef,\n hasDropButton: true,\n isDisabled,\n getDropOperation,\n });\n const { buttonProps, isPressed } = useButton(\n { elementType: 'div' },\n pressableRef as React.RefObject<Element>\n );\n const { focusProps, isFocusVisible } = useFocusRing();\n\n const { clipboardProps } = useClipboard({\n isDisabled,\n onPaste: (items) =>\n onDrop({\n type: 'drop',\n items,\n x: 0,\n y: 0,\n dropOperation: 'copy',\n }),\n });\n\n const ariaLabel: string = props['aria-label'] || 'Dropzone';\n\n const onFileTriggerSelect = (files: FileList | null) => {\n onDrop({\n type: 'drop',\n items: convertFileListToFileDropItems(files),\n x: 0,\n y: 0,\n dropOperation: 'copy',\n });\n };\n\n return (\n <FileTrigger\n acceptedFileTypes={acceptedFileTypes}\n allowsMultiple={allowsMultiple}\n onSelect={onFileTriggerSelect}\n isDisabled={isDisabled}\n >\n <Pressable ref={pressableRef} onPress={onFileSelectOpen}>\n <div\n {...mergeProps(\n dropProps,\n hoverProps,\n clipboardProps,\n focusProps,\n buttonProps\n )}\n {...filterDOMProps(otherProps, { global: true })}\n style={{ ...styleProps.style }}\n className={clsx(\n styles['sapphire-dropzone'],\n styles['js-focus'],\n styles['js-hover'],\n {\n [styles['is-hover']]: isHovered && !isDropping,\n [styles['is-active']]: isPressed,\n [styles['is-disabled']]: isDisabled,\n [styles['is-focus']]: isFocusVisible,\n [styles['sapphire-dropzone--dropping']]: isDropping,\n [styles['sapphire-dropzone--error']]: hasError,\n },\n styleProps.className\n )}\n aria-label={ariaLabel}\n aria-invalid={hasError}\n aria-describedby={paragraphId}\n >\n <div className={clsx(styles['sapphire-dropzone__content'])}>\n <div className={clsx(styles['sapphire-dropzone__icon'])}>\n <Icon size=\"lg\">\n <Upload />\n </Icon>\n </div>\n <div className={clsx(styles['sapphire-dropzone__heading'])}>\n <Typography.Heading level={6}>\n {isDropping\n ? format('dropzone-heading-dropping')\n : allowsMultiple\n ? format('dropzone-heading-default')\n : format('dropzone-heading-default-single')}\n </Typography.Heading>\n </div>\n <div\n id={paragraphId}\n className={clsx(styles['sapphire-dropzone__paragraph'])}\n >\n <Typography.Body size=\"sm\" color=\"secondary\">\n {renderInstruction(isDropping)}\n </Typography.Body>\n </div>\n </div>\n </div>\n </Pressable>\n </FileTrigger>\n );\n});\n","import React, { useRef, ReactNode, FormEvent } from 'react';\nimport clsx from 'clsx';\nimport { VisuallyHidden } from 'react-aria/VisuallyHidden';\nimport { useEffectEvent } from 'react-aria/private/utils/useEffectEvent';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { useControlledState } from 'react-stately/useControlledState';\nimport {\n Button,\n ButtonGroup,\n PopoverTrigger,\n PopoverTriggerProps,\n SapphireStyleProps,\n ToggleButton,\n GlobalDomAttributes,\n useSapphireStyleProps,\n} from '@danske/sapphire-react';\nimport { ChevronDown, ChevronUp } from '@danske/sapphire-icons/react';\nimport { FocusableRefValue } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/filterDropdown/filterDropdown.module.css';\n\nexport interface FilterDropdownProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n Pick<\n PopoverTriggerProps,\n 'defaultOpen' | 'isOpen' | 'onOpenChange' | 'noMaxWidth'\n > {\n /**\n * \"Filter by\" label, shown inside the trigger button.\n */\n label: ReactNode;\n /**\n * Filter value, shown inside the trigger button. `null`, `undefined` and empty string are\n * considered as unset value.\n */\n value: ReactNode;\n /**\n * Filtering UI controls, rendered in a popover.\n */\n children: ReactNode;\n /**\n * Called when:\n * - `Enter` is pressed on form fields rendered inside the popover.\n * - 'Apply' button is pressed (if `hasApplyButton` is true)\n */\n onApply?: () => void;\n /**\n * Whether to show the 'Apply' button.\n */\n hasApplyButton?: boolean;\n /**\n * Called when 'Clear' button is pressed.\n */\n onClear?: () => void;\n /**\n * Whether the button is disabled.\n */\n isDisabled?: boolean;\n /**\n * Whether the 'Apply' button is disabled.\n */\n isApplyDisabled?: boolean;\n /**\n * Whether the 'Clear' button is hidden.\n */\n hideClearButton?: boolean;\n /**\n * Whether the 'Clear' button is disabled.\n */\n isClearDisabled?: boolean;\n /**\n * The label of the 'Clear' button.\n * @default \"Clear\"\n */\n clearButtonLabel?: ReactNode;\n /**\n * The label of the 'Apply' button.\n * @default \"Apply\"\n */\n applyButtonLabel?: ReactNode;\n /**\n * The size of the buttons incl. the trigger itself.\n * @default 'md'\n */\n buttonSize?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * A button with a dropdown, used for filtering UI.\n */\nexport function FilterDropdown({\n children,\n label,\n value,\n isDisabled = false,\n isApplyDisabled = false,\n isClearDisabled,\n isOpen: isOpenProp,\n applyButtonLabel = 'Apply',\n clearButtonLabel = 'Clear',\n hideClearButton = false,\n defaultOpen = false,\n hasApplyButton = false,\n noMaxWidth,\n onApply,\n onClear,\n onOpenChange,\n buttonSize = 'md',\n ...props\n}: FilterDropdownProps): JSX.Element {\n const triggerRef = useRef<FocusableRefValue>(null);\n const { styleProps } = useSapphireStyleProps(props);\n\n // We need to know if the dropdown is open or not, so we control the state here, still\n // allowing for both controlled and uncontrolled modes.\n const [isOpen, setIsOpen] = useControlledState(\n isOpenProp,\n defaultOpen,\n useEffectEvent(onOpenChange)\n );\n const hasValue = value != null && value !== '';\n const close = () => setIsOpen(false);\n const onSubmit = (e: FormEvent) => {\n e.preventDefault();\n onApply?.();\n close();\n };\n\n const applyButton = (\n <Button\n type=\"submit\"\n size={buttonSize}\n excludeFromTabOrder={!hasApplyButton}\n isDisabled={isApplyDisabled}\n >\n {applyButtonLabel}\n </Button>\n );\n\n return (\n <PopoverTrigger\n ref={triggerRef}\n placement=\"bottom left\"\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n noMaxWidth={noMaxWidth}\n noPadding\n popoverContent={\n <form\n {...filterDOMProps(props, { global: true })}\n onSubmit={onSubmit}\n className={clsx(\n styles['sapphire-filter-dropdown'],\n styleProps.className\n )}\n style={{ ...styleProps.style }}\n >\n <div className={styles['sapphire-filter-dropdown__body']}>\n {children}\n </div>\n <div className={styles['sapphire-filter-dropdown__footer']}>\n <ButtonGroup align=\"right\">\n {!hideClearButton && (\n <Button\n size={buttonSize}\n variant=\"text\"\n onPress={() => {\n close();\n onClear?.();\n }}\n isDisabled={isClearDisabled ?? !hasValue}\n >\n {clearButtonLabel}\n </Button>\n )}\n {hasApplyButton ? (\n applyButton\n ) : (\n // The following is necessary to have the form submitted on \"Enter\", if there is more than one field\n <VisuallyHidden>{applyButton}</VisuallyHidden>\n )}\n </ButtonGroup>\n </div>\n </form>\n }\n >\n <ToggleButton\n icon={isOpen ? <ChevronUp /> : <ChevronDown />}\n iconAlign=\"right\"\n isSelected={hasValue}\n isDisabled={isDisabled}\n size={buttonSize}\n >\n {label}\n {value ? ': ' : ''}\n {value}\n </ToggleButton>\n </PopoverTrigger>\n );\n}\n","import React, { cloneElement, ReactElement, useRef } from 'react';\nimport {\n Flex,\n ListBoxProps,\n SapphireStyleProps,\n SearchFieldPropsWithRef,\n tokens,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FilterDropdown, FilterDropdownProps } from '../..';\nimport { mergeRefs } from 'react-aria/mergeRefs';\nimport { useControlledState } from 'react-stately/useControlledState';\n\nexport interface SearchableSelectFilterProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n Omit<FilterDropdownProps, 'children'> {\n /**\n * The SearchField to search items with.\n */\n searchField: ReactElement<SearchFieldPropsWithRef<object>>;\n /**\n * The ListBox to select items from.\n */\n listBox: ReactElement<ListBoxProps<object>>;\n /**\n * The Button size of the trigger\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * A button with a dropdown, used for filtering UI.\n */\nexport function SearchableSelectFilter(\n props: SearchableSelectFilterProps\n): JSX.Element {\n const { searchField, listBox, size = 'md', ...otherProps } = props;\n const searchFieldRef = useRef<HTMLInputElement>(null);\n\n const searchFieldProps = searchField.props;\n const listBoxProps = listBox.props;\n\n const [searchQuery, setSearchQuery] = useControlledState(\n searchFieldProps?.value,\n '',\n searchFieldProps.onChange\n );\n\n if (\n listBoxProps.connectedInputRef &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'development'\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n 'The connectedInputRef prop on the ListBox in the SearchableSelectFilter component is not needed and will be ignored. The connectedInputRef is set automatically (to the passed SearchField) and should not be set manually.'\n );\n }\n\n const hasSelection =\n listBoxProps.selectedKeys === 'all' ||\n Array.from(listBoxProps.selectedKeys || []).length > 0;\n\n return (\n <FilterDropdown\n {...otherProps}\n noMaxWidth={otherProps.noMaxWidth ?? true}\n buttonSize={size}\n // Since useCollectionFocusProxy disables normal form submission behaviour on \"Enter\"\n // the apply button is the only way to submit, which is why we add it if an onApply function is passed\n hasApplyButton={Boolean(otherProps.onApply)}\n // In scenarios where selections are not applied immediately we want to allow cancelling\n // the filter selection via 'Clear' button as soon as at least 1 item is selected\n isClearDisabled={\n otherProps.isClearDisabled || (!hasSelection && !otherProps.value)\n }\n >\n <Flex flexDirection=\"column\" height=\"100%\">\n {cloneElement(searchField, {\n size: 'md',\n value: searchFieldProps.value || searchQuery,\n inputRef: mergeRefs(searchFieldRef, searchFieldProps.inputRef),\n width: searchFieldProps.width || '100%',\n marginBottom: searchFieldProps.marginBottom || tokens.size.spacingSm,\n onChange: setSearchQuery,\n })}\n {cloneElement(listBox, {\n connectedInputRef: searchFieldRef,\n selectionMode: listBoxProps.selectionMode || 'multiple',\n marginX: `calc(${tokens.size.spacingContainerHorizontalSm.value} * -1)`,\n hasScrollDividers: true,\n filter:\n // This is a way to also allow opting out of the internal filter with filter={undefined}\n // without us having to allow for more values on the ListBox filter prop\n 'filter' in listBoxProps\n ? listBoxProps.filter\n : (textValue: string) =>\n textValue.toLowerCase().includes(searchQuery.toLowerCase()),\n })}\n </Flex>\n </FilterDropdown>\n );\n}\n","import clsx from 'clsx';\nimport React from 'react';\nimport { getWrappedElement } from '@react-spectrum/utils';\nimport styles from '@danske/sapphire-css/components/flag/flag.module.css';\n\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\n\nexport type FlagProps = GlobalDomAttributes &\n SapphireStyleProps & {\n 'aria-label'?: string;\n /**\n * The size of the flag.\n * @default 'lg'\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /**\n * Flags come in square or rounded shapes. Square flags are used for display purposes, ensuring a clean and consistent look.\n * Rounded flags are reserved for actionable elements like buttons or selectors, providing a more interactive and approachable feel.\n * @default false\n */\n rounded?: boolean;\n children: React.ReactNode;\n };\n\nexport const Flag = React.forwardRef(function Flag(\n { size = 'lg', rounded, 'aria-label': ariaLabel, ...props }: FlagProps,\n ref: React.Ref<HTMLSpanElement>\n) {\n useThemeCheck();\n\n const { styleProps } = useSapphireStyleProps(props);\n\n return React.cloneElement(getWrappedElement(props.children), {\n ref,\n role: 'img',\n ...(ariaLabel ? { 'aria-label': ariaLabel } : { 'aria-hidden': true }),\n className: clsx(styles['sapphire-flag'], styleProps.className, {\n [styles['sapphire-flag--xs']]: size === 'xs',\n [styles['sapphire-flag--sm']]: size === 'sm',\n [styles['sapphire-flag--md']]: size === 'md',\n [styles['sapphire-flag--lg']]: size === 'lg',\n [styles['sapphire-flag--xl']]: size === 'xl',\n [styles['sapphire-flag--rounded']]: rounded,\n }),\n style: styleProps.style,\n });\n});\n","import React, { ReactNode } from 'react';\nimport { useField } from 'react-aria/useField';\nimport {\n Field,\n Label,\n SapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { mergeProps } from 'react-aria/mergeProps';\n\nexport interface LabeledValueProps\n extends SapphireStyleProps,\n GlobalDomAttributes {\n children?: React.ReactNode;\n /**\n * A HelpButton element to place next to the label.\n */\n contextualHelp?: ReactNode;\n /**\n * The content to display as a label.\n */\n label: ReactNode;\n /**\n * Places the label either above (default) or on the left side of tags.\n * @default 'above'\n */\n labelPlacement?: 'above' | 'side';\n /**\n * @default 'lg'\n */\n size?: 'lg' | 'md';\n}\n\nexport function LabeledValue({\n children,\n contextualHelp,\n label,\n labelPlacement = 'above',\n size = 'lg',\n ...otherProps\n}: LabeledValueProps): React.JSX.Element {\n useThemeCheck();\n const { fieldProps } = useField({ label });\n\n return (\n <Field\n {...mergeProps(fieldProps, otherProps)}\n labelPlacement={labelPlacement}\n size={size}\n noDefaultWidth\n >\n <Field.Label>\n <Label contextualHelp={contextualHelp} size={size}>\n {label}\n </Label>\n </Field.Label>\n <Field.Control>{children}</Field.Control>\n </Field>\n );\n}\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","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","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","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","/**\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","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","import {\n useMemo,\n useCallback,\n RefObject,\n ReactNode,\n useRef,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n getSeparators,\n parseNumericValue,\n formatNumberString,\n trimSymbol,\n extractSymbol,\n} from './formatHelpers';\nimport { calculateCursorPosition } from './cursorHelpers';\nimport { handleNumberFieldKeyDown } from './keyboardHelpers';\n\ninterface UseNumberFieldFormattingParams {\n inputRef: RefObject<HTMLInputElement>;\n formatter: Intl.NumberFormat;\n inputValue: string;\n prefix?: ReactNode;\n postfix?: ReactNode;\n onOriginalKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n onChange?: (value: number) => void;\n autoFormat: boolean;\n}\n\ninterface UseNumberFieldFormattingReturn {\n displayValue: string;\n extractedPrefix: ReactNode;\n extractedPostfix: ReactNode;\n handleInput: (e: React.FormEvent<HTMLInputElement>) => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\n/**\n * Hook for number field formatting with locale-aware separators and cursor management.\n * Handles currency/unit extraction, number formatting, and maintains correct cursor position.\n * When autoFormat is false, returns original values without any computation.\n */\nexport function useNumberFieldFormatting({\n inputRef,\n formatter,\n inputValue,\n prefix,\n postfix,\n onOriginalKeyDown,\n onChange,\n autoFormat,\n}: UseNumberFieldFormattingParams): UseNumberFieldFormattingReturn {\n const { groupSeparator, decimalSeparator } = useMemo(\n () => getSeparators(formatter),\n [formatter]\n );\n\n const [formattedValue, setFormattedValue] = useState<string>('');\n\n // Extract and position currency/unit symbols\n const symbolInfo = useMemo(\n () => extractSymbol(formatter, prefix, postfix),\n [formatter, prefix, postfix]\n );\n\n const { extractedPrefix, extractedPostfix, symbol } = symbolInfo;\n\n // Track cursor position to restore after React updates the value\n const cursorPositionRef = useRef<number | null>(null);\n\n // Format the input value for display\n const displayValue = useMemo(() => {\n const numericValue = parseNumericValue(\n inputValue,\n decimalSeparator,\n formatter\n );\n if (numericValue === null) return inputValue;\n\n try {\n const trimmedValue = trimSymbol(inputValue, symbol) || inputValue;\n return autoFormat ? formattedValue || trimmedValue : trimmedValue;\n } catch {\n return inputValue;\n }\n }, [\n inputValue,\n symbol,\n formatter,\n decimalSeparator,\n autoFormat,\n formattedValue,\n ]);\n\n // Restore cursor position after value changes\n useLayoutEffect(() => {\n if (cursorPositionRef.current !== null && inputRef.current) {\n inputRef.current.setSelectionRange(\n cursorPositionRef.current,\n cursorPositionRef.current\n );\n cursorPositionRef.current = null;\n }\n }, [displayValue, inputRef]);\n\n // Handle input with formatting and cursor management\n const handleInput = useCallback(\n (e: React.FormEvent<HTMLInputElement>): void => {\n if (!autoFormat) return;\n\n const input = e.currentTarget;\n const { value, selectionStart } = input;\n const inputType = (e.nativeEvent as InputEvent).inputType || '';\n const shouldStrip = !!symbol;\n\n /**\n * Check if we're exceeding maximum decimal places when typing at the end.\n * For example, with max 2 decimals, having \"12,34|\" and typing \"5\" should be prevented.\n */\n //#region Prevent excess decimals\n const maxFractionDigits =\n formatter.resolvedOptions().maximumFractionDigits || 0;\n const decimalIndex = value.indexOf(decimalSeparator);\n\n if (decimalIndex !== -1 && selectionStart !== null) {\n // Count decimal digits in the new value\n const decimalPart = value\n .slice(decimalIndex + 1)\n .replace(new RegExp(`[^0-9]`, 'g'), '');\n const prevDecimalIndex = displayValue.indexOf(decimalSeparator);\n const prevDecimalLength =\n prevDecimalIndex !== -1\n ? displayValue.slice(prevDecimalIndex + 1).length\n : 0;\n\n // If we have more decimals than allowed and cursor was at the end of decimals, prevent and restore\n if (\n decimalPart.length > maxFractionDigits &&\n selectionStart > decimalIndex + 1 + prevDecimalLength\n ) {\n e.preventDefault();\n // Store cursor position to restore after React's update\n cursorPositionRef.current = decimalIndex + 1 + prevDecimalLength;\n return;\n }\n }\n //#endregion Prevent excess decimals\n\n const formattedValue = formatNumberString(\n value,\n formatter,\n decimalSeparator,\n shouldStrip,\n symbol\n );\n\n setFormattedValue(formattedValue);\n\n const numericValue = parseNumericValue(\n formattedValue,\n decimalSeparator,\n formatter\n );\n\n // Calculate and store cursor position for restoration after React's update\n if (\n formattedValue !== value &&\n formattedValue !== '' &&\n selectionStart !== null\n ) {\n const newCursorPosition = calculateCursorPosition(\n value,\n formattedValue,\n selectionStart,\n inputType,\n decimalSeparator,\n numericValue\n );\n\n cursorPositionRef.current = newCursorPosition;\n }\n\n if (numericValue !== null) {\n onChange?.(numericValue);\n }\n },\n [formatter, decimalSeparator, symbol, autoFormat, displayValue, onChange]\n );\n\n // Handle keydown for special key behaviors\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): void => {\n handleNumberFieldKeyDown({\n event: e,\n inputRef,\n groupSeparator,\n decimalSeparator,\n onOriginalKeyDown,\n });\n },\n [groupSeparator, decimalSeparator, inputRef, onOriginalKeyDown]\n );\n\n return {\n displayValue,\n extractedPrefix,\n extractedPostfix,\n handleInput,\n handleKeyDown,\n };\n}\n","import React, { RefObject } from 'react';\nimport {\n AriaNumberFieldProps,\n NumberFieldAria,\n useNumberField,\n} from 'react-aria/useNumberField';\nimport { useNumberFieldState } from 'react-stately/useNumberFieldState';\nimport { useLocale } from 'react-aria/I18nProvider';\n\nexport interface SapphireNumberFieldProps\n // TODO: when this is moved to `core`, we can replace the picked props with `ValueBasePropsKeys`\n extends Pick<\n AriaNumberFieldProps,\n | 'label'\n | 'isDisabled'\n | 'isRequired'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'incrementAriaLabel'\n | 'decrementAriaLabel'\n | 'onFocus'\n | 'onBlur'\n | 'formatOptions'\n | 'step'\n | 'minValue'\n | 'maxValue'\n | 'placeholder'\n | 'isReadOnly'\n | 'autoFocus'\n | 'onFocusChange'\n | 'onKeyUp'\n | 'onKeyDown'\n > {\n /**\n * Whether the input should render as having an error and an error message.\n * This also sets the appropriate `aria` attributes on the input.\n *\n * A `boolean` sets the error state.\n * A `ReactNode` sets the error state with an additional error message.\n *\n * **An error message is strongly recommended because an error should always have an explanation about how to fix it.**\n */\n error?: boolean | React.ReactNode;\n}\n\nexport const useSapphireNumberField = (\n { error, ...numberFieldProps }: SapphireNumberFieldProps,\n ref: RefObject<HTMLInputElement>\n): NumberFieldAria & { state: ReturnType<typeof useNumberFieldState> } => {\n const { locale } = useLocale();\n const numberFieldState = useNumberFieldState({\n ...numberFieldProps,\n locale,\n });\n const numberFieldAria = useNumberField(\n {\n ...numberFieldProps,\n validationState:\n error === false || error === undefined ? undefined : 'invalid',\n },\n numberFieldState,\n ref\n );\n\n return { ...numberFieldAria, state: numberFieldState };\n};\n","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","import React, { ReactNode, useContext, useState } from 'react';\nimport { ThemeVariant } from '@danske/sapphire-react';\nimport { useControlledState } from 'react-stately/useControlledState';\n\nexport type SecondarySidebarContent = {\n header: ReactNode;\n body: ReactNode;\n} | null;\n\nexport interface SecondarySidebarContextValue {\n content: SecondarySidebarContent;\n setContent: (content: SecondarySidebarContent) => void;\n openedId: string | null;\n setOpenedId: (id: string | null) => void;\n themeVariant: ThemeVariant | undefined;\n}\n\nexport const SecondarySidebarContext =\n React.createContext<SecondarySidebarContextValue | null>(null);\n\nexport const useSecondarySidebarContext = (): SecondarySidebarContextValue => {\n const context = useContext(SecondarySidebarContext);\n if (context) {\n return context;\n }\n throw new Error('This should be rendered inside a <Sidebar />.');\n};\n\nexport const SecondarySidebarProvider = ({\n openedId,\n defaultOpenedId,\n onOpenedIdChange,\n themeVariant,\n children,\n}: {\n openedId?: string | null;\n defaultOpenedId?: string | null;\n onOpenedIdChange?: (id: string | null) => void;\n themeVariant?: ThemeVariant;\n children: ReactNode;\n}) => {\n const context = useContext(SecondarySidebarContext);\n\n const [secondarySidebarId, setSecondarySidebarId] = useControlledState<\n string | null\n >(openedId, defaultOpenedId ?? null, onOpenedIdChange);\n\n const [content, setContent] = useState<SecondarySidebarContent>(null);\n\n return (\n <SecondarySidebarContext.Provider\n value={{\n openedId: context?.openedId ?? secondarySidebarId,\n setOpenedId: context?.setOpenedId ?? setSecondarySidebarId,\n content: context?.content ?? content,\n setContent: context?.setContent ?? setContent,\n themeVariant: themeVariant ?? context?.themeVariant,\n }}\n >\n {children}\n </SecondarySidebarContext.Provider>\n );\n};\n","import { useControlledState } from 'react-stately/useControlledState';\nimport { BreakpointKey, useMatchedBreakpoints } from '@danske/sapphire-react';\nimport React, { ReactNode, useContext } from 'react';\n\nexport interface ResponsiveSidebarContextValue {\n isPanelOpen: boolean;\n setPanelOpen: (open: boolean) => void;\n collapsed: boolean | BreakpointKey | undefined;\n}\n\nexport const ResponsiveSidebarContext =\n React.createContext<ResponsiveSidebarContextValue | null>(null);\n\nexport function useResponsiveSidebarContext() {\n return useContext(ResponsiveSidebarContext);\n}\n\n/**\n * Hook to determine if the sidebar should be collapsed.\n * Returns true if collapsed, false if expanded, or null if not in responsive mode.\n */\nexport function useIsSidebarCollapsed(): boolean | null {\n const context = useContext(ResponsiveSidebarContext);\n const matchedBreakpoints: string[] = useMatchedBreakpoints();\n\n if (!context) {\n return null;\n }\n\n const { collapsed } = context;\n\n // If collapsed is a boolean, use it directly\n if (typeof collapsed === 'boolean') {\n return collapsed;\n }\n\n // If collapsed is a breakpoint string, check if we're below that breakpoint\n if (typeof collapsed === 'string') {\n return !matchedBreakpoints.includes(collapsed);\n }\n\n // If collapsed is undefined, default to 'md' breakpoint behavior\n return !matchedBreakpoints.includes('md');\n}\n\nexport const ResponsiveSidebarProvider = ({\n collapsed,\n isPanelOpen,\n defaultIsPanelOpen,\n onPanelOpenChange,\n children,\n}: {\n /**\n * Controls whether the sidebar is collapsed.\n * - When `true`: sidebar is always collapsed (shows as panel)\n * - When `false`: sidebar is always expanded (shows as sidebar)\n * - When a breakpoint string (e.g., 'md', 'lg'): automatically collapses below that breakpoint\n * - When `undefined`: defaults to 'md' breakpoint behavior (collapses below medium screens)\n * @default undefined (equivalent to 'md')\n */\n collapsed?: boolean | BreakpointKey;\n\n /**\n * If the sidebar panel is open (controlled)\n */\n isPanelOpen?: boolean;\n\n /**\n * The default state of the panel (uncontrolled)\n */\n defaultIsPanelOpen?: boolean;\n\n /**\n * Callback for when the state of the panel changes\n */\n onPanelOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}) => {\n const [isOpen, setOpen] = useControlledState<boolean>(\n isPanelOpen,\n defaultIsPanelOpen ?? false,\n onPanelOpenChange\n );\n\n return (\n <ResponsiveSidebarContext.Provider\n value={{\n isPanelOpen: isOpen,\n setPanelOpen: setOpen,\n collapsed,\n }}\n >\n {children}\n </ResponsiveSidebarContext.Provider>\n );\n};\n","import React, { ReactNode, useEffect } from 'react';\nimport {\n IconButton,\n ModalLayout,\n Panel,\n PanelProps,\n tokens,\n View,\n} from '@danske/sapphire-react';\nimport { ChevronLeft } from '@danske/sapphire-icons/react';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\nimport {\n useIsSidebarCollapsed,\n useResponsiveSidebarContext,\n} from './ResponsiveSidebarContext';\n\nexport type SidebarPanelProps = Omit<\n PanelProps,\n 'isOpen' | 'size' | 'direction'\n> & { header: ReactNode };\n\nexport const SidebarPanel = ({\n children,\n header,\n ...props\n}: SidebarPanelProps) => {\n const { openedId, setOpenedId, content } = useSecondarySidebarContext();\n const responsiveContext = useResponsiveSidebarContext();\n\n if (!responsiveContext) {\n throw new Error(\n '<SidebarPanel> must be rendered inside a <Sidebar.ResponsiveProvider>'\n );\n }\n\n const { isPanelOpen, setPanelOpen } = responsiveContext;\n const isCollapsed = useIsSidebarCollapsed();\n\n useEffect(() => {\n if (!isCollapsed) {\n // if breakpoint changes, we want to close the panel until opened manually again\n setPanelOpen(false);\n }\n }, [isCollapsed]);\n\n return (\n <Panel\n {...props}\n isOpen={isPanelOpen}\n onClose={() => setPanelOpen(false)}\n onCloseTransitionDone={() => setOpenedId(null)}\n alignLeft\n isDismissable\n width={320}\n >\n <ModalLayout\n header={\n <ModalLayout.Header\n heading={openedId === null ? header : content?.header}\n backButton={\n openedId !== null && (\n <IconButton\n size=\"md\"\n aria-label=\"Back\"\n variant=\"tertiary\"\n marginLeft={`calc(-1 * ${tokens.size.spacingSm})`}\n onPress={() => setOpenedId(null)}\n >\n <ChevronLeft />\n </IconButton>\n )\n }\n />\n }\n body={\n <ModalLayout.Body\n noPadding\n UNSAFE_style={{\n paddingLeft: tokens.size.spacingMd.value,\n paddingRight: tokens.size.spacingMd.value,\n }}\n >\n <>\n <View isHidden={openedId !== null}>{children}</View>\n {openedId && content?.body}\n </>\n </ModalLayout.Body>\n }\n />\n </Panel>\n );\n};\n\nexport const SidebarPanelTrigger = ({\n children,\n}: {\n children: (triggerProps: any) => JSX.Element;\n}) => {\n const context = useResponsiveSidebarContext();\n if (!context) {\n throw new Error(\n '<Sidebar.PanelTrigger> should be rendered inside a <Sidebar.ResponsiveProvider>'\n );\n }\n const isCollapsed = useIsSidebarCollapsed();\n const panelTriggerProps = {\n onPress: () => {\n context.setPanelOpen(true);\n },\n };\n\n return isCollapsed ? children(panelTriggerProps) : null;\n};\n","import { useResponsiveSidebarContext } from './ResponsiveSidebarContext';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\n\n/**\n * Returns props to be spread on different components that make the Sidebar.\n */\nexport const useSidebar = () => {\n const { openedId, setOpenedId } = useSecondarySidebarContext();\n const responsiveContext = useResponsiveSidebarContext();\n const { isPanelOpen, setPanelOpen } = responsiveContext\n ? responsiveContext\n : { isPanelOpen: false, setPanelOpen: () => {} };\n\n return {\n sidebarProps: { onBlurWithin: () => setOpenedId(null) },\n itemProps: {\n onPress: () => {\n setPanelOpen(false);\n if (!isPanelOpen) {\n /* If panel is open, let the secondary sidebar get closed\n * when the closing transition is done. See `panelProps`\n */\n setOpenedId(null);\n }\n },\n },\n getExpandableItemProps: (id: string) => ({\n onPress: () => setOpenedId(openedId === id ? null : id),\n }),\n secondarySidebarProps: {\n onClose: () => setOpenedId(null),\n },\n };\n};\n","import { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport {\n useThemeCheck,\n useSapphireStyleProps,\n SapphireStyleProps,\n ThemeRoot,\n ThemeVariant,\n} from '@danske/sapphire-react';\nimport React from 'react';\nimport { DOMProps } from '@react-types/shared';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { FocusWithinProps, useFocusWithin } from 'react-aria/useFocusWithin';\nimport { SidebarPanel } from './Panel';\nimport { useSidebar } from './useSidebar';\nimport { SecondarySidebarProvider } from './SecondarySidebarContext';\nimport {\n useIsSidebarCollapsed,\n useResponsiveSidebarContext,\n} from './ResponsiveSidebarContext';\n\nexport type SidebarProps = DOMProps &\n SapphireStyleProps & {\n /**\n * Shorthand to wrap the sidebar in a ThemeRoot with a different theme variant\n */\n themeVariant?: ThemeVariant;\n\n /**\n * The theme variant for the overflow sidebar\n */\n secondarySidebarThemeVariant?: ThemeVariant;\n\n /**\n * Callback for when the sidebar's elements lose focus.\n * Useful to know when to close the overflow sidebar.\n */\n onBlurWithin?: FocusWithinProps['onBlurWithin'];\n\n /**\n * Callback for when one of the sidebar's elements first gains focus.\n */\n onFocusWithin?: FocusWithinProps['onFocusWithin'];\n\n /**\n * Callback for when one of the sidebar's elements loses or gains focus\n */\n onFocusWithinChange?: FocusWithinProps['onFocusWithinChange'];\n\n /**\n * Whether the overflow sidebar should close when all sidebar's elements\n * lost focus\n * @default true\n */\n closeOnBlurWithin?: boolean;\n\n /**\n * The header of the sidebar\n */\n header: ReactNode;\n\n /**\n * The header of the sidebar for small screens, when the sidebar is\n * rendered as a panel\n */\n panelHeader?: ReactNode;\n\n /**\n * The id of the opened secondary sidebar (controlled)\n */\n openedSecondarySidebar?: string | null;\n\n /**\n * The id of the secondary sidebar opened by default (uncontrolled)\n */\n defaultOpenedSecondarySidebar?: string | null;\n\n /**\n * Callback for when the secondary sidebar opens or closes\n */\n onSecondarySidebarChange?: (id: string | null) => void;\n\n children?: ReactNode;\n };\n\n/**\n * Sidebar component for the site's main navigation.\n * Takes the height of the container.\n *\n * The default recommended way to use it is in the example below. But each part\n * can be replaced with a custom implementation.\n *\n * **Example:**\n * ```tsx\n * <Sidebar\n * header={\n * <Sidebar.Header>\n * header\n * </Sidebar.Header>\n * }\n * >\n * <Sidebar.Body>\n * <Sidebar.List>\n * ...\n * </Sidebar.List>\n * </Sidebar.Body>\n * </Sidebar>\n * ```\n */\nexport const Sidebar = ({\n themeVariant,\n openedSecondarySidebar,\n defaultOpenedSecondarySidebar,\n onSecondarySidebarChange,\n secondarySidebarThemeVariant,\n children,\n ...props\n}: SidebarProps) => {\n useThemeCheck();\n\n return (\n <SecondarySidebarProvider\n openedId={openedSecondarySidebar}\n defaultOpenedId={defaultOpenedSecondarySidebar}\n onOpenedIdChange={onSecondarySidebarChange}\n themeVariant={secondarySidebarThemeVariant}\n >\n <WithThemeRoot themeVariant={themeVariant}>\n <SidebarContent {...props}>{children}</SidebarContent>\n </WithThemeRoot>\n </SecondarySidebarProvider>\n );\n};\n\nconst SidebarContent = ({\n onBlurWithin,\n onFocusWithin,\n onFocusWithinChange,\n closeOnBlurWithin = true,\n header,\n panelHeader,\n children,\n ...props\n}: SidebarProps) => {\n const { styleProps } = useSapphireStyleProps(props);\n const { sidebarProps } = useSidebar();\n\n const { focusWithinProps } = useFocusWithin(\n mergeProps(\n {\n onBlurWithin,\n onFocusWithin,\n onFocusWithinChange,\n },\n closeOnBlurWithin ? sidebarProps : {}\n )\n );\n\n const responsiveSidebarContext = useResponsiveSidebarContext();\n const isCollapsed = useIsSidebarCollapsed();\n\n return (\n <>\n {!isCollapsed && (\n <div\n {...styleProps}\n {...filterDOMProps(props, { global: true })}\n {...focusWithinProps}\n className={clsx(styles['sapphire-sidebar'])}\n tabIndex={-1 /* sidebar must be focusable but not tabbable */}\n >\n {header}\n {children}\n </div>\n )}\n {responsiveSidebarContext && (\n <SidebarPanel header={panelHeader}>{children}</SidebarPanel>\n )}\n </>\n );\n};\n\nconst WithThemeRoot = ({\n children,\n themeVariant,\n}: {\n themeVariant?: ThemeVariant;\n children: ReactNode;\n}) =>\n themeVariant ? (\n <ThemeRoot\n variant={themeVariant}\n noSurface\n height=\"100%\"\n width=\"min-content\"\n >\n {children}\n </ThemeRoot>\n ) : (\n <>{children}</>\n );\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport { IconButton, IconButtonProps } from '@danske/sapphire-react';\nimport { CloseLarge } from '@danske/sapphire-icons/react';\n\nexport interface SidebarHeaderProps extends DOMProps {\n children: ReactNode;\n /**\n * Props for the close button\n * If none provided, close button won't show\n */\n closeButtonProps?: Omit<\n IconButtonProps<'button'>,\n 'children' | 'aria-label' | 'aria-hidden'\n >;\n}\n\nexport const SidebarHeader = ({\n children,\n closeButtonProps,\n ...props\n}: SidebarHeaderProps): React.JSX.Element => {\n return (\n <div\n {...filterDOMProps(props)}\n className={clsx(styles['sapphire-sidebar__header'])}\n >\n {children}\n {closeButtonProps && (\n <IconButton {...closeButtonProps} aria-label=\"Close\">\n <CloseLarge />\n </IconButton>\n )}\n </div>\n );\n};\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport buttonStyles from '@danske/sapphire-css/components/button/button.module.css';\nimport { Button, ButtonProps } from '@danske/sapphire-react';\nimport { FocusableRef } from '@react-types/shared';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useSidebar } from './useSidebar';\n\nexport type SidebarItemProps = Omit<\n ButtonProps<'a'>,\n 'variant' | 'size' | 'elementType'\n> & {\n /**\n * If the link is currently active\n */\n isActive?: boolean;\n children?: ReactNode;\n};\n\nexport const SidebarItem = React.forwardRef(function SidebarItem(\n { isActive, children, ...props }: SidebarItemProps,\n ref: FocusableRef<HTMLAnchorElement>\n): React.JSX.Element {\n const { itemProps } = useSidebar();\n\n return (\n <li className={clsx(styles['sapphire-sidebar__nav-item'])}>\n <Button\n ref={ref}\n variant=\"tertiary\"\n elementType=\"a\"\n aria-current={isActive ? 'page' : undefined}\n {...mergeProps(props as ButtonProps<'a'>, itemProps)}\n UNSAFE_className={clsx(\n buttonStyles['sapphire-button--stretch-left-align'],\n { [buttonStyles['sapphire-button--selected']]: isActive }\n )}\n >\n {children}\n </Button>\n </li>\n );\n});\n","import React, { ReactNode, useEffect, useLayoutEffect, useRef } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport buttonStyles from '@danske/sapphire-css/components/button/button.module.css';\nimport { Button, ButtonProps, ThemeVariant } from '@danske/sapphire-react';\nimport { FocusScope } from 'react-aria/FocusScope';\nimport { FocusableRef } from '@react-types/shared';\nimport { Transition } from 'react-transition-group';\nimport { Sidebar } from '..';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useId } from 'react-aria/useId';\nimport { useSidebar } from './useSidebar';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\nimport { useIsSidebarCollapsed } from './ResponsiveSidebarContext';\n\nexport type SidebarExpandableItemProps = Omit<\n ButtonProps<'button'>,\n 'variant' | 'size' | 'elementType'\n> & {\n /**\n * If the link is currently active\n */\n isActive?: boolean;\n\n /**\n * The id of the group.\n * Used in `onSecondarySidebarChange` or when the sidebar is controlled\n */\n id?: string;\n\n /**\n * Heading used for secondary sidebar\n */\n header: ReactNode;\n\n /**\n * Subitems (secondary sidebar)\n */\n body: ReactNode;\n children?: ReactNode;\n};\n\nexport const SidebarExpandableItem = React.forwardRef(\n function SidebarExpandableItem(\n {\n id,\n isActive,\n body,\n header,\n children,\n ...props\n }: SidebarExpandableItemProps,\n ref: FocusableRef<HTMLAnchorElement>\n ): React.JSX.Element {\n const { openedId, setContent, themeVariant } = useSecondarySidebarContext();\n const isCollapsed = useIsSidebarCollapsed();\n const { getExpandableItemProps, secondarySidebarProps } = useSidebar();\n const itemId = useId(id);\n const isOpen = openedId === itemId;\n\n useLayoutEffect(() => {\n if (isOpen) {\n setContent({ header, body });\n }\n }, [isOpen]);\n\n return (\n <li className={clsx(styles['sapphire-sidebar__nav-item'])}>\n <Button\n variant=\"tertiary\"\n aria-current={isActive || undefined}\n ref={ref}\n {...mergeProps(\n getExpandableItemProps(itemId),\n props as ButtonProps<'button'>\n )}\n UNSAFE_className={clsx(\n buttonStyles['sapphire-button--stretch-left-align'],\n {\n [buttonStyles['sapphire-button--selected']]: isActive && !isOpen,\n [buttonStyles['is-active']]: isOpen,\n }\n )}\n >\n {children}\n </Button>\n <SecondarySidebar\n isOpen={isOpen && !isCollapsed}\n header={header}\n themeVariant={themeVariant}\n {...secondarySidebarProps}\n >\n {body}\n </SecondarySidebar>\n </li>\n );\n }\n);\n\nconst SecondarySidebar = ({\n isOpen,\n onClose,\n onCloseTransitionDone,\n themeVariant,\n header,\n children,\n}: {\n isOpen: boolean;\n onClose?: () => void;\n onCloseTransitionDone?: () => void;\n themeVariant?: ThemeVariant;\n header: ReactNode;\n children: ReactNode;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n return (\n <Transition\n in={isOpen}\n mountOnEnter\n nodeRef={ref}\n unmountOnExit\n onExited={onCloseTransitionDone}\n timeout={200}\n >\n {(transitionState) => (\n <div\n ref={ref}\n className={clsx(styles['sapphire-sidebar__secondary-container'], {\n [styles['sapphire-sidebar--slide-in']]: true,\n [styles['sapphire-sidebar--slide-out']]:\n transitionState === 'exiting',\n })}\n >\n <FocusScope restoreFocus autoFocus>\n <Sidebar\n themeVariant={themeVariant}\n closeOnBlurWithin={\n false /* no focus management on nested sidebars */\n }\n header={\n <Sidebar.Header\n closeButtonProps={{\n onPress: () => onClose?.(),\n }}\n >\n {header}\n </Sidebar.Header>\n }\n panelHeader={null}\n >\n {children}\n </Sidebar>\n </FocusScope>\n </div>\n )}\n </Transition>\n );\n};\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n} from '@danske/sapphire-react';\nimport { useListBoxSection } from 'react-aria/useListBox';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\n\nexport type SidebarSectionProps = DOMProps &\n SapphireStyleProps & {\n /**\n * Section title\n * If not provided, please pass the `aria-label`\n */\n title?: string;\n\n /**\n * Section aria title\n */\n 'aria-label'?: string;\n\n children?: ReactNode;\n };\n\nexport const SidebarSection = ({\n title,\n 'aria-label': label,\n children,\n ...props\n}: SidebarSectionProps) => {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const { itemProps, headingProps, groupProps } = useListBoxSection({\n heading: title,\n 'aria-label': label,\n });\n\n return (\n <>\n <li\n role=\"separator\"\n className={clsx(styles['sapphire-sidebar__separator'])}\n ></li>\n <li\n {...itemProps}\n {...styleProps}\n {...filterDOMProps(props, { global: true })}\n >\n {title && (\n <div\n {...headingProps}\n className={clsx(styles['sapphire-sidebar__section-header'])}\n >\n {title}\n </div>\n )}\n <ul\n {...groupProps}\n className={clsx(styles['sapphire-sidebar__section'])}\n >\n {children}\n </ul>\n </li>\n </>\n );\n};\n","import React, { ReactNode, useRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport { useScrollCheck } from '@danske/sapphire-react';\n\nexport interface SidebarBodyProps extends DOMProps {\n /**\n * Wrapping element type.\n * @default 'nav'\n */\n elementType?: string;\n children?: ReactNode;\n}\n\nexport const SidebarBody = ({\n elementType = 'nav',\n children,\n ...props\n}: SidebarBodyProps): React.JSX.Element => {\n const RootNode = elementType as any;\n const sidebarBody = useRef<HTMLElement>(null);\n const { isScrolled, scrollCheckProps } = useScrollCheck(sidebarBody);\n\n return (\n <RootNode\n ref={sidebarBody}\n tabIndex={\n -1 /* Some browsers will make this focusable because it overflows */\n }\n className={clsx(styles['sapphire-sidebar__body'], {\n [styles['sapphire-sidebar__body--scrolled']]: isScrolled,\n })}\n {...filterDOMProps(props, { global: true })}\n {...scrollCheckProps}\n >\n {children}\n </RootNode>\n );\n};\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\n\nexport interface SidebarListProps extends DOMProps {\n /**\n * Wrapping element type.\n * @default 'ul'\n */\n elementType?: 'ul' | 'ol';\n children?: ReactNode;\n}\n\nexport const SidebarList = ({\n elementType = 'ul',\n children,\n ...props\n}: SidebarListProps): React.JSX.Element => {\n const RootNode = elementType as any;\n\n return (\n <RootNode\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-sidebar__nav-list'])}\n >\n {children}\n </RootNode>\n );\n};\n","import { Sidebar } from './src/Sidebar';\nimport { SidebarHeader } from './src/Header';\nimport { SidebarItem } from './src/Item';\nimport { SidebarExpandableItem } from './src/ExpandableItem';\nimport { SidebarSection } from './src/Section';\nimport { SidebarBody } from './src/Body';\nimport { SidebarList } from './src/List';\nimport { ResponsiveSidebarProvider } from './src/ResponsiveSidebarContext';\nimport { SidebarPanelTrigger } from './src/Panel';\n\nconst _Sidebar = Object.assign(Sidebar, {\n ResponsiveProvider: ResponsiveSidebarProvider,\n Header: SidebarHeader,\n Body: SidebarBody,\n List: SidebarList,\n Item: SidebarItem,\n ExpandableItem: SidebarExpandableItem,\n Section: SidebarSection,\n PanelTrigger: SidebarPanelTrigger,\n});\n\nexport { _Sidebar as Sidebar };\nexport { type SidebarProps } from './src/Sidebar';\nexport { type SidebarItemProps } from './src/Item';\nexport { type SidebarExpandableItemProps } from './src/ExpandableItem';\nexport { type SidebarSectionProps } from './src/Section';\nexport { type SidebarBodyProps } from './src/Body';\nexport { type SidebarListProps } from './src/List';\nexport { type SidebarHeaderProps } from './src/Header';\n","import React from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/progressIndicator/progressIndicator.module.css';\nimport {\n SapphireStyleProps,\n useThemeCheck,\n useSapphireStyleProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { useProgressBar } from 'react-aria/useProgressBar';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport type ProgressIndicatorProps = {\n /**\n * The maximum value for the progress bar. Will be used as:\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-valuemax\n *\n * @default 100\n */\n maxValue?: number;\n\n /**\n * The current value of the progress bar. Will be used as:\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-valuenow\n */\n value: number;\n\n /**\n * Defines how many segments the progress bar will have.\n *\n * @default 1\n */\n segments?: number;\n\n /**\n * Human-readable text alternative for the current value of the progress bar. Will be used as:\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-valuetext\n */\n 'aria-valuetext'?: string;\n} & SapphireStyleProps &\n GlobalDomAttributes &\n ({ 'aria-labelledby': string } | { 'aria-label': string });\n\nexport const ProgressIndicator = (\n props: ProgressIndicatorProps\n): JSX.Element => {\n const {\n maxValue = 100,\n value: realValue,\n segments = 1,\n 'aria-valuetext': ariaValueText,\n } = props;\n\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const { progressBarProps } = useProgressBar({\n ...props,\n minValue: 0,\n valueLabel: ariaValueText,\n });\n\n const minValue = 0;\n\n const value = Math.min(Math.max(realValue, minValue), maxValue);\n const widthPercentage = (value / maxValue) * 100;\n\n return (\n <div\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-progress'])}\n >\n <div\n {...progressBarProps}\n className={styles['sapphire-progress--indicator']}\n style={{ ...styleProps, width: `${widthPercentage}%` }}\n aria-label={'aria-label' in props ? props['aria-label'] : undefined}\n aria-labelledby={\n 'aria-labelledby' in props ? props['aria-labelledby'] : undefined\n }\n />\n {segments > 1 && (\n <div className={styles['sapphire-progress--segments']}>\n {Array.from({ length: segments }, (_, index) => (\n <span key={index}></span>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/slider/slider.module.css';\nimport {\n useThemeCheck,\n useSapphireStyleProps,\n Label,\n SapphireStyleProps,\n Field,\n FieldProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport {\n Slider as RACSlider,\n SliderProps as RACSliderProps,\n SliderThumb as RACSliderThumb,\n SliderThumbProps as RACSliderThumbProps,\n SliderTrack as RACSliderTrack,\n} from 'react-aria-components';\nimport React from 'react';\n\nexport type SliderProps = {\n label?: ReactNode;\n /**\n * A note to show below the slider.\n * Use {@Link Slider.Note} to render the note.\n */\n note?: ReactNode;\n} & SapphireStyleProps &\n GlobalDomAttributes &\n Pick<FieldProps, 'labelPlacement'> &\n Pick<\n RACSliderProps<number>, // We're only supporting sliders with one end\n | 'isDisabled'\n | 'minValue'\n | 'maxValue'\n | 'step'\n | 'value'\n | 'defaultValue'\n | 'aria-label'\n | 'onChange'\n | 'onChangeEnd'\n > &\n Pick<RACSliderThumbProps, 'name'>;\n\nexport const Slider = ({\n label,\n labelPlacement = 'above',\n note,\n name,\n ...props\n}: SliderProps): JSX.Element => {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n\n return (\n <Field {...styleProps} labelPlacement={labelPlacement}>\n <Field.Context>\n {label && (\n <Field.Label>\n <Label>{label}</Label>\n </Field.Label>\n )}\n\n <Field.Control>\n <RACSlider {...props} style={{ height: '100%' }}>\n <div className={clsx(styles['sapphire-slider'])} role=\"slider\">\n <RACSliderTrack\n className={({ isDisabled }) =>\n clsx(styles['sapphire-slider__track'], {\n [styles['is-disabled']]: isDisabled,\n })\n }\n >\n {({ state }) => (\n <>\n <div\n className={clsx(\n styles['sapphire-slider__track-remaining']\n )}\n />\n <div\n className={clsx(styles['sapphire-slider__track-fill'])}\n style={{ width: state.getThumbPercent(0) * 100 + '%' }}\n />\n <RACSliderThumb\n name={name}\n className={(state) =>\n clsx(styles['sapphire-slider__thumb'], {\n [styles['is-focus']]: state.isFocusVisible,\n })\n }\n style={({ state }) => {\n // Pad the thumb position, so it doesn't go over the track\n const percent = Math.min(\n 3 + state.getThumbPercent(0) * 94,\n 100\n );\n return {\n left: `${percent}%`,\n };\n }}\n />\n </>\n )}\n </RACSliderTrack>\n </div>\n </RACSlider>\n </Field.Control>\n\n {note && <Field.Footer>{note}</Field.Footer>}\n </Field.Context>\n </Field>\n );\n};\n","import { Field } from '@danske/sapphire-react';\nimport { Slider } from './src/Slider';\n\nconst _Slider = Object.assign(Slider, {\n Note: Field.Note,\n});\n\nexport { _Slider as Slider };\nexport { type SliderProps } from './src/Slider';\n","import React, { useRef } from 'react';\nimport clsx from 'clsx';\nimport { AriaButtonProps, useButton } from 'react-aria/useButton';\nimport { useHover } from 'react-aria/useHover';\nimport { useTag } from 'react-aria/useTagGroup';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { mergeRefs } from 'react-aria/mergeRefs';\nimport type { ListState } from 'react-stately/useListState';\nimport type { FocusableElement, Node } from '@react-types/shared';\n\nimport { Icon, useThemeCheck, TooltipIfNeeded } from '@danske/sapphire-react';\nimport { Close, Error } from '@danske/sapphire-icons/react';\nimport styles from '@danske/sapphire-css/components/tag/tag.module.css';\nimport { FocusRing } from 'react-aria/FocusRing';\n\nexport interface TagProps<T> {\n /**\n * Object representing the tag. Contains relevant information about the tag.\n */\n item: Node<T>;\n /**\n * State for TagGroup, returned by `useListState`\n */\n state: ListState<T>;\n /**\n * Shows error icon.\n * @default 'false'\n */\n hasError?: boolean;\n /**\n * Control whether the tag is removable or not.\n * This behavior is overridden to `false` if the tag is disabled.\n *\n * @default false\n */\n allowsRemoving?: boolean;\n}\n\nexport function Tag<T>(props: TagProps<T>): React.JSX.Element {\n useThemeCheck();\n const { hasError = false, item, state } = props;\n const ref = useRef<HTMLDivElement>(null);\n const {\n gridCellProps,\n isDisabled,\n isFocused,\n isPressed,\n removeButtonProps,\n rowProps: { onKeyDown, ...rowProps },\n ...otherProps\n } = useTag(props, state, ref);\n const { hoverProps, isHovered } = useHover({ isDisabled });\n /* hasAction prop is passed when onAction is present, we are using it to set the hover and action classes.\n The workaround below is made because AriaTagProps Omit's hasAction to avoid typecheck error */\n const hasAction = (otherProps as any).hasAction;\n\n return (\n <TooltipIfNeeded<HTMLDivElement> title={item.rendered}>\n {(tooltipRef, tooltipProps) => {\n const { ref: tooltipTargetRef, ...restTooltipProps } =\n tooltipProps || {};\n return (\n <FocusRing focusRingClass={styles['is-focus']}>\n <div\n ref={mergeRefs(ref, tooltipTargetRef)}\n {...mergeProps(\n {\n onKeyDown: (e: React.KeyboardEvent<FocusableElement>) => {\n /* We are removing Space key interaction and prevent default behavior to avoid isPressed prop being set\n as we do not want to apply is-active class on \"Space\" interaction when having actionable tags with onAction or link */\n if (e.key !== ' ') {\n onKeyDown?.(e);\n } else {\n e.preventDefault();\n }\n },\n },\n rowProps,\n hoverProps,\n restTooltipProps\n )}\n className={clsx(\n styles['sapphire-tag'],\n styles['js-focus'],\n styles['js-hover'],\n {\n [styles['sapphire-tag--actionable']]: hasAction,\n [styles['is-active']]: hasAction && isPressed,\n [styles['is-hover']]: hasAction && isHovered,\n [styles['is-disabled']]: isDisabled,\n }\n )}\n {...(hasError ? { 'aria-invalid': true } : {})}\n >\n <div\n {...gridCellProps}\n className={styles['sapphire-tag__content']}\n >\n {hasError && !isDisabled && <IconError />}\n <span\n ref={tooltipRef as React.Ref<HTMLSpanElement>}\n className={styles['sapphire-tag__label']}\n >\n {item.rendered}\n </span>\n {!isDisabled && props.allowsRemoving && (\n <RemoveButton {...(removeButtonProps as AriaButtonProps)} />\n )}\n </div>\n </div>\n </FocusRing>\n );\n }}\n </TooltipIfNeeded>\n );\n}\n\nfunction RemoveButton(removeButtonProps: AriaButtonProps) {\n const buttonRef = useRef(null);\n const { buttonProps } = useButton(removeButtonProps, buttonRef);\n return (\n <button\n {...buttonProps}\n className={clsx(styles['sapphire-tag__button'], styles['js-focus'])}\n >\n <Icon size=\"sm\">\n <Close />\n </Icon>\n </button>\n );\n}\n\nconst IconError = () => {\n return (\n <span className={clsx(styles['sapphire-tag__error-icon'])}>\n <Icon size=\"sm\">\n <Error />\n </Icon>\n </span>\n );\n};\n","import React, { Key, ReactNode, useRef } from 'react';\nimport { useTagGroup } from 'react-aria/useTagGroup';\nimport { useListState } from 'react-stately/useListState';\nimport {\n AriaLabelingProps,\n CollectionBase,\n DOMProps,\n} from '@react-types/shared';\nimport {\n Field,\n Label,\n SapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/tag/tag.module.css';\n\nimport { Tag } from './Tag';\nimport { TagItemProps } from './TagItem';\n\nexport interface TagGroupProps<T>\n extends CollectionBase<T>,\n DOMProps,\n // TODO when moving to \"core\", use types under `types.ts` instead of plain strings\n Pick<\n AriaLabelingProps,\n 'aria-label' | 'aria-labelledby' | 'aria-describedby' | 'aria-details'\n >,\n SapphireStyleProps,\n GlobalDomAttributes {\n /**\n * A HelpButton element to place next to the label.\n */\n contextualHelp?: ReactNode;\n /**\n * Custom error message help text.\n */\n errorMessage?: string;\n /**\n * The label of the tag group.\n */\n label?: string;\n /**\n * Places the label either above (default) or on the left side of tags.\n * @default 'above'\n */\n labelPlacement?: 'above' | 'side';\n /**\n * Help text description displayed below tags.\n */\n note?: string;\n /**\n * onAction handler passed down for actionable Tags, called onPress of tags.\n */\n onAction?: (key: Key) => void;\n /**\n * Handler that is called when a user deletes a tag.\n *\n * @deprecated Use `onRemove` prop on the `TagItem` component instead.\n * This prop will be removed when this component is moved to \"@danske/sapphire-react\".\n */\n onRemove?: (keys: Set<Key>) => void;\n}\n\nexport function TagGroup<T extends object>(\n props: TagGroupProps<T>\n): React.JSX.Element {\n useThemeCheck();\n const {\n contextualHelp,\n errorMessage,\n label: labelText,\n labelPlacement = 'above',\n note,\n onRemove: originalOnRemove,\n ...otherProps\n } = props;\n const ref = useRef(null);\n const state = useListState(props);\n\n // TODO when moving to \"core\": Remove `originalOnRemove` from here & remove support for `onRemove` prop.\n // If an external onRemove handler is provided, use it directly.\n // Otherwise, call individual onRemove handlers on each tag item.\n const onRemove = originalOnRemove\n ? (keys: Set<Key>) => {\n // eslint-disable-next-line no-console -- It's good to warn about the deprecation, but this needs to be removed alongside `onRemove`\n console.warn(\n 'The `onRemove` prop is deprecated and will be removed in future versions. Use the `onRemove` prop on the `TagItem` component instead.'\n );\n originalOnRemove(keys);\n }\n : (keys: Set<Key>) => {\n // Iterate through the keys and call each item's onRemove handler\n Array.from(keys).forEach((key) => {\n const item = state.collection.getItem(key);\n if (item) {\n (item.props as TagItemProps<T>).onRemove?.();\n }\n });\n };\n\n const { descriptionProps, gridProps, labelProps, errorMessageProps } =\n useTagGroup({ ...props, onRemove }, state, ref);\n\n return (\n <Field\n {...otherProps}\n labelPlacement={labelPlacement}\n labelVerticalAlignment=\"top\"\n noDefaultWidth\n >\n <Field.Context\n descriptionProps={errorMessage ? errorMessageProps : descriptionProps}\n >\n {(labelText || contextualHelp) && (\n <Field.Label>\n <Label {...labelProps} contextualHelp={contextualHelp}>\n {labelText}\n </Label>\n </Field.Label>\n )}\n <Field.Control>\n <div\n {...gridProps}\n ref={ref}\n className={styles['sapphire-tag-group']}\n >\n {Array.from(state.collection).map((item) => (\n <Tag\n key={item.key}\n item={item}\n state={state}\n hasError={item.props.hasError}\n // TODO when moving to \"core\": Remove `originalOnRemove` from here & remove support for `onRemove` prop.\n // Always allow removing if `onRemove` was provided, for backwards compatibility\n // Allow removal of the tag item if a removal handler is provided\n allowsRemoving={!!originalOnRemove || !!item.props.onRemove}\n />\n ))}\n </div>\n </Field.Control>\n {(note || errorMessage) &&\n (errorMessage ? (\n <Field.Footer>\n <Field.Note variant=\"error\">{errorMessage}</Field.Note>\n </Field.Footer>\n ) : (\n <Field.Footer>{note}</Field.Footer>\n ))}\n </Field.Context>\n </Field>\n );\n}\n","import { Item } from 'react-stately/Item';\nimport { ItemProps } from '@react-types/shared';\n\nexport interface TagItemProps<T> extends ItemProps<T> {\n /**\n * Shows error icon.\n * @default 'false'\n */\n hasError?: boolean;\n\n /**\n * This function is called when the tag is being removed, either through\n * clicking the \"X\" button or by any supported key combination.\n *\n * @default false\n *\n * @note If the `TagGroup` has `onRemove` prop, that implementation will take\n * precedence over this function.\n *\n * @note If the `TagItem` is disabled, this function will not be called.\n */\n onRemove?: () => void;\n}\n\nconst TagItem = Item as <T>(props: TagItemProps<T>) => JSX.Element;\n\nexport { TagItem };\n","import React, { useRef } from 'react';\nimport { useDateSegment } from 'react-aria/useDateField';\nimport { DateSegment as DateSegmentType } from 'react-stately/useDateFieldState';\nimport styles from '@danske/sapphire-css/components/dateField/dateField.module.css';\nimport clsx from 'clsx';\nimport { DateSegmentProps } from '@danske/sapphire-react';\n\nexport const TimeSegment = ({ segment, state }: DateSegmentProps) =>\n segment.type === 'hour' ||\n segment.type === 'minute' ||\n segment.type === 'dayPeriod' ? (\n <EditableSegment segment={segment} state={state}></EditableSegment>\n ) : (\n <SeparatorSegment segment={segment} />\n );\nconst SeparatorSegment = ({ segment }: { segment: DateSegmentType }) => (\n <span\n aria-hidden=\"true\"\n className={clsx(\n styles['sapphire-date-field__segment'],\n styles['sapphire-date-field__segment--separator']\n )}\n >\n {segment.text}\n </span>\n);\n\nconst EditableSegment = ({ segment, state }: DateSegmentProps) => {\n const ref = useRef(null);\n const { segmentProps } = useDateSegment(segment, state, ref);\n\n return (\n <div\n {...segmentProps}\n style={segmentProps.style}\n ref={ref}\n className={clsx(styles['sapphire-date-field__segment'], {\n [styles['sapphire-date-field__segment--filled']]:\n !segment.isPlaceholder,\n })}\n >\n {segment.text}\n </div>\n );\n};\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/dateField/dateField.module.css';\nimport {\n SapphireStyleProps,\n useThemeCheck,\n Field,\n Label,\n Icon,\n IconButton,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { AriaTimeFieldProps, useTimeField } from 'react-aria/useTimeField';\nimport { ForwardedRef, forwardRef, RefObject, ReactNode } from 'react';\nimport { TimeValue } from 'react-aria-components';\nimport { DateSegment as DateSegmentType } from 'react-stately/useDateFieldState';\nimport { useTimeFieldState } from 'react-stately/useTimeFieldState';\nimport { useLocale } from 'react-aria/I18nProvider';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport { TimeSegment } from './TimeFieldSegment';\nimport { CloseOutline } from '@danske/sapphire-icons/react';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport intlMessages from '../i18n';\n\nconst isAnySegmentModified = (segments: DateSegmentType[]) =>\n segments\n .map(({ type, isPlaceholder }) => {\n // type \"literal\" refers to the segment containing the non-editable separator\n return type !== 'literal' && !isPlaceholder;\n })\n .some((isModified) => isModified);\n\nexport type TimeFieldProps<T extends TimeValue> = Pick<\n AriaTimeFieldProps<T>,\n // TODO: when this is moved to `core`, we can replace the picked props with `ValueBasePropsKeys`\n | 'isDisabled'\n | 'isRequired'\n | 'isReadOnly'\n | 'label'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'onFocus'\n | 'onBlur'\n | 'shouldForceLeadingZeros'\n> &\n SapphireStyleProps &\n GlobalDomAttributes & {\n /**\n * @default 'lg'\n */\n size?: 'lg' | 'md';\n /**\n * To visually indicate if this field is required or optional.\n * @default false\n */\n necessityIndicator?: 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 * If it should hide the \"clear\" button when input is not empty.\n *\n * @default false\n */\n noClearButton?: boolean;\n /**\n * Whether the input should render as having an error and an error message.\n * This also sets the appropriate `aria` attributes on the input.\n *\n * A `boolean` sets the error state. Can be paired with the \"note\" prop with Field.Note variant=\"error\"\n * A `ReactNode` sets the error state with an additional error message.\n *\n * **An error message is strongly recommended because an error should\n * always have an explanation about how to fix it.**\n */\n error?: boolean | ReactNode;\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 * Use {@Link Field.Note} to render the note.\n */\n note?: ReactNode;\n /**\n * A HelpButton to render next to the label.\n */\n contextualHelp?: ReactNode;\n };\n\nfunction _TimeField<T extends TimeValue>(\n {\n // TODO many other props\n size = 'lg',\n noClearButton = false,\n error,\n note,\n contextualHelp,\n necessityIndicator = false,\n ...otherProps\n }: TimeFieldProps<T>,\n ref: ForwardedRef<HTMLDivElement>\n) {\n useThemeCheck();\n\n const timeFieldRef = useObjectRef(ref);\n const { locale } = useLocale();\n const formatMessage = useMessageFormatter(intlMessages);\n\n const state = useTimeFieldState({\n ...otherProps,\n locale,\n isInvalid: error ? true : undefined,\n });\n\n const { fieldProps, labelProps } = useTimeField(\n { ...otherProps },\n state,\n timeFieldRef\n );\n\n return (\n <Field {...otherProps} ref={ref} size={size} noShrink>\n <Field.Context>\n {otherProps.label && (\n <Field.Label>\n <Label\n {...labelProps}\n size={size}\n necessityIndicator={\n otherProps.isRequired && necessityIndicator\n ? 'required'\n : !otherProps.isRequired && necessityIndicator\n ? 'optional'\n : undefined\n }\n contextualHelp={contextualHelp}\n >\n {otherProps.label}\n </Label>\n </Field.Label>\n )}\n </Field.Context>\n <Field.Control>\n <div\n className={clsx(styles['sapphire-date-field'], {\n [styles['sapphire-date-field--error']]: state.isInvalid,\n [styles['sapphire-date-field--no-clear-button']]: noClearButton,\n [styles['sapphire-date-field--no-calendar']]: true,\n [styles['sapphire-date-field--md']]: size === 'md',\n })}\n >\n <div\n {...fieldProps}\n className={styles['sapphire-date-field__input']}\n ref={timeFieldRef}\n >\n {state.segments.map((segment, i) => (\n <TimeSegment key={i} segment={segment} state={state} />\n ))}\n </div>\n {!noClearButton &&\n !otherProps.isReadOnly &&\n !otherProps.isDisabled &&\n isAnySegmentModified(state.segments) && (\n <IconButton\n aria-label={formatMessage('clear')}\n onPress={() =>\n state.segments.forEach((segment) =>\n state.clearSegment(segment.type)\n )\n }\n size={size === 'md' ? 'sm' : 'md'}\n UNSAFE_className={clsx(\n styles['sapphire-date-field__button'],\n styles['sapphire-date-field__button--clear']\n )}\n >\n <Icon>\n <CloseOutline />\n </Icon>\n </IconButton>\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 ) : null}\n </Field.Footer>\n ) : null}\n </Field>\n );\n}\n\nexport const TimeField = forwardRef(_TimeField) as <T extends TimeValue>(\n props: TimeFieldProps<T> & { ref?: RefObject<HTMLDivElement> }\n) => React.ReactElement;\n"],"names":["useContext","forwardRef","Accordion","useThemeCheck","useSapphireStyleProps","useObjectRef","FocusScope","DisclosureGroup","filterDOMProps","hasAllowedCustomSidePadding","AccordionHeading","Button","Typography","Icon","ChevronDown","AccordionItem","useFocusManager","useEvent","Disclosure","AccordionPanel","DisclosurePanel","variant","Warning","CheckmarkOutline","Error","Information","clsx","useMemo","useLocale","styles","da","en","de","fi","no","pl","se","useMessageFormatter","intlMessages","useRef","useFocusableRef","useComboBoxState","useComboBox","ListBoxPopover","useState","useEffect","useResizeObserver","createContext","Breadcrumbs","useContextProps","RACBreadcrumbsContext","CollectionRendererContext","useBreadcrumbs","CollectionBuilder","Collection","mergeProps","ChevronRight","Menu","IconButton","OverflowMenuHorizontal","MenuItem","BreadcrumbItemStatic","TooltipIfNeeded","mergeRefs","BreadcrumbItemLink","CollectionNode","createLeafComponent","BreadcrumbItem","PressResponder","useId","useHover","useDrop","useButton","useFocusRing","useClipboard","Pressable","Upload","useControlledState","useEffectEvent","PopoverTrigger","ButtonGroup","VisuallyHidden","ToggleButton","ChevronUp","Flex","cloneElement","tokens","Flag","getWrappedElement","useField","Field","Label","Add","Subtract","digitCount","useLayoutEffect","useCallback","formattedValue","useNumberFieldState","useNumberField","NumberField","useImperativeHandle","createFocusableRef","Separator","useMatchedBreakpoints","Panel","ModalLayout","ChevronLeft","View","useFocusWithin","ThemeRoot","CloseLarge","SidebarItem","SidebarExpandableItem","Transition","Sidebar","useListBoxSection","useScrollCheck","useProgressBar","RACSlider","RACSliderTrack","RACSliderThumb","state","useTag","FocusRing","Close","useListState","useTagGroup","Item","useDateSegment","useTimeFieldState","useTimeField","CloseOutline"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/Accordion/src/AccordionContext.ts","../../src/Accordion/src/Accordion.tsx","../../src/Accordion/src/utils.ts","../../src/Accordion/src/AccordionHeading.tsx","../../src/Accordion/src/AccordionItem.tsx","../../src/Accordion/src/AccordionPanel.tsx","../../src/Accordion/index.ts","../../src/Alert/src/Alert.tsx","../../src/Amount/src/useGroupAmount.ts","../../src/Amount/src/Amount.tsx","../../src/Autocomplete/i18n/index.ts","../../src/Autocomplete/src/Autocomplete.tsx","../../src/Breadcrumbs/src/useBreadcrumbThreshold.ts","../../src/Breadcrumbs/src/Breadcrumbs.tsx","../../src/Breadcrumbs/src/BreadcrumbsSeparator.tsx","../../src/Breadcrumbs/src/BreadcrumbOverflowMenu.tsx","../../src/Breadcrumbs/src/BreadcrumbItemStatic.tsx","../../src/Breadcrumbs/src/BreadcrumbItemLink.tsx","../../src/Breadcrumbs/src/BreadcrumbItem.tsx","../../src/FileDropzone/src/FileTrigger.tsx","../../src/FileDropzone/src/utils.ts","../../src/FileDropzone/i18n/index.ts","../../src/FileDropzone/src/FileDropzone.tsx","../../src/Filtering/src/FilterDropdown.tsx","../../src/Filtering/src/SearchableSelectFilter.tsx","../../src/Flag/src/Flag.tsx","../../src/LabeledValue/src/LabeledValue.tsx","../../src/NumberField/i18n/index.ts","../../src/NumberField/src/StepperButton.tsx","../../src/NumberField/src/useAutofillStyle.ts","../../src/NumberField/src/formatHelpers.ts","../../src/NumberField/src/cursorHelpers.ts","../../src/NumberField/src/keyboardHelpers.ts","../../src/NumberField/src/useNumberFieldFormatting.ts","../../src/NumberField/src/useSapphireNumberField.ts","../../src/NumberField/src/NumberField.tsx","../../src/Sidebar/src/SecondarySidebarContext.tsx","../../src/Sidebar/src/ResponsiveSidebarContext.tsx","../../src/Sidebar/src/Panel.tsx","../../src/Sidebar/src/useSidebar.ts","../../src/Sidebar/src/Sidebar.tsx","../../src/Sidebar/src/Header.tsx","../../src/Sidebar/src/Item.tsx","../../src/Sidebar/src/ExpandableItem.tsx","../../src/Sidebar/src/Section.tsx","../../src/Sidebar/src/Body.tsx","../../src/Sidebar/src/List.tsx","../../src/Sidebar/index.ts","../../src/ProgressIndicator/src/ProgressIndicator.tsx","../../src/Slider/src/Slider.tsx","../../src/Slider/index.ts","../../src/TagGroup/src/Tag.tsx","../../src/TagGroup/src/TagGroup.tsx","../../src/TagGroup/src/TagItem.tsx","../../src/TimeField/src/TimeFieldSegment.tsx","../../src/TimeField/i18n/index.ts","../../src/TimeField/src/TimeField.tsx","../../src/TruncateOverflow/src/TruncateOverflow.tsx","../../src/DataGrid/src/DataGridCellContext.tsx","../../src/DataGrid/src/EditableCellContent.tsx","../../src/DataGrid/src/useMeasureColumnWidths.tsx","../../src/DataGrid/src/useGridKeyboardNavigation.ts","../../../core/src/utils/SapphireStyleProps.ts","../../../core/src/BreakpointProvider/useBreakpointContext.ts","../../../core/src/utils/useSapphireStyleProps.ts","../../../core/src/utils/useSapphireTextStyleProps.ts","../../../core/src/ListBox/src/ListBoxContext.ts","../../../core/src/Skeleton/src/animation.ts","../../../core/src/Skeleton/src/SkeletonText.tsx","../../../core/src/Skeleton/src/SkeletonCircle.tsx","../../../core/src/Skeleton/src/Skeleton.tsx","../../../core/src/ListBox/src/ListBoxItemSkeleton.tsx","../../../core/src/Icon/src/Icon.tsx","../../../core/src/Flex/src/Flex.tsx","../../../core/src/Grid/src/Grid.tsx","../../../core/src/View/src/View.tsx","../../../core/src/ThemeRoot/src/ThemeRoot.tsx","../../../core/src/ListBox/src/ListBoxOption.tsx","../../../core/src/utils/useThemeCheck.ts","../../../core/src/Separator/src/Separator.tsx","../../../core/src/ListBox/src/ListBoxSection.tsx","../../../core/src/utils/virtualization/VariableWidthListLayout.ts","../../../core/src/utils/virtualization/ListWithLoadingStateLayout.ts","../../../core/src/utils/virtualization/useListWithLoadingStateLayout.ts","../../../core/src/utils/virtualization/VirtualizerWithLoadingSkeleton.tsx","../../../core/src/utils/useCollectionFocusProxy.ts","../../../core/src/ListBox/src/ListBoxEmptyState.tsx","../../../core/src/ListBox/i18n/index.ts","../../../core/src/ListBox/src/StatelessListBox.tsx","../../../core/src/Popover/src/Popover.tsx","../../../core/src/utils/useScrollCheck.ts","../../../core/src/utils/usePreventTouchEnd.ts","../../../core/src/Radio/src/RadioBox.tsx","../../../core/src/Pagination/src/usePaginationContext.tsx","../../src/DataGrid/src/DataGrid.tsx","../../src/DataGrid/src/createDataGridColumnHelper.ts","../../src/DataGrid/index.ts"],"sourcesContent":["import { TypographyHeadingProps } from '@danske/sapphire-react';\nimport React, { useContext } from 'react';\n\ninterface AccordionContextProps {\n sidePadding?: number | string;\n headerLevel?: TypographyHeadingProps['level'];\n}\n\nexport const AccordionContext = React.createContext<AccordionContextProps>({\n sidePadding: undefined,\n headerLevel: 5,\n});\n\nexport function useAccordionContext(): AccordionContextProps {\n const context = useContext(AccordionContext);\n if (context) {\n return context;\n }\n throw new Error(\n 'Accordion context can only be used within Accordion component.'\n );\n}\n","import React, { ForwardedRef, forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport {\n SapphireStyleProps,\n TypographyHeadingProps,\n useSapphireStyleProps,\n useThemeCheck,\n withTruthyZero as hasAllowedCustomSidePadding,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FocusScope } from 'react-aria/FocusScope';\n\nimport { AccordionContext } from './AccordionContext';\nimport { DisclosureGroup, DisclosureGroupProps } from 'react-aria-components';\n\nexport type TreeExpansionMode = 'single' | 'multiple';\n\nexport interface AccordionProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n DOMProps,\n Pick<\n DisclosureGroupProps,\n | 'allowsMultipleExpanded'\n | 'expandedKeys'\n | 'defaultExpandedKeys'\n | 'onExpandedChange'\n | 'children'\n | 'isDisabled'\n > {\n /** Set aria-level attribute for item's header. Accessibility requirement.\n * Defines the hierarchical level of an element within a page structure.\n * @default 5\n */\n headerLevel?: TypographyHeadingProps['level'];\n /**\n * Removes the divider after the last accordion item.\n * Useful when rendered in a container which already has borders.\n */\n hideLastDivider?: boolean;\n /**\n * Counter acts the side padding, so that accordion is shifted to the left with same amount\n * and having side padding * 2 added to width – resulting in full width accordion.\n * Useful in scenarions where accordion is inside a padded container and desired layout has accordion going from edge to edge horizontally.\n * @example\n * ```tsx\n * <Accordion hasNegativeSideMargin>...</Accordion>\n * ```\n */\n hasNegativeSideMargin?: boolean;\n /**\n * Add custom sized padding to the sides of the accordion items.\n * @example\n * ```tsx\n * <Accordion sidePadding={tokens.size.spacingContainerHorizontalM.value} hasNegativeSideMargin>...</Accordion>\n * ```\n */\n sidePadding?: number | string;\n}\n\n/**\n * Accordion is a vertically stacked set of items, that consist of an interactive header and expandable content section. An accordion item’s content display can be toggled on and off by clicking the component’s header above.\n */\nexport const Accordion = forwardRef(function Accordion(\n {\n allowsMultipleExpanded = true,\n headerLevel = 5,\n hideLastDivider = false,\n hasNegativeSideMargin = false,\n sidePadding,\n children,\n expandedKeys,\n defaultExpandedKeys,\n onExpandedChange,\n isDisabled,\n ...props\n }: AccordionProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const forwardedRef = useObjectRef<HTMLDivElement>(ref);\n\n return (\n <FocusScope>\n <AccordionContext.Provider value={{ sidePadding, headerLevel }}>\n <DisclosureGroup\n {...filterDOMProps(props, { global: true, labelable: true })}\n allowsMultipleExpanded={allowsMultipleExpanded}\n expandedKeys={expandedKeys}\n defaultExpandedKeys={defaultExpandedKeys}\n onExpandedChange={onExpandedChange}\n isDisabled={isDisabled}\n ref={forwardedRef}\n className={clsx(\n styles['sapphire-accordion'],\n {\n [styles['sapphire-accordion--without-last-divider']]:\n hideLastDivider,\n [styles['sapphire-accordion--negative-margin-self']]:\n !hasAllowedCustomSidePadding(sidePadding) &&\n hasNegativeSideMargin,\n },\n styleProps.className\n )}\n style={{\n ...(hasAllowedCustomSidePadding(sidePadding) &&\n hasNegativeSideMargin\n ? {\n marginLeft:\n typeof sidePadding === 'string'\n ? `calc(${sidePadding} * -1)`\n : `-${sidePadding}px`,\n width: `calc(100% + calc(${sidePadding} * 2${\n typeof sidePadding === 'string' ? '' : 'px'\n }))`,\n }\n : {}),\n ...styleProps.style,\n }}\n >\n {children}\n </DisclosureGroup>\n </AccordionContext.Provider>\n </FocusScope>\n );\n});\n","export const customPaddingStyleProps = (sidePadding: number | string) => ({\n paddingLeft:\n typeof sidePadding === 'string' ? sidePadding : `${sidePadding}px`,\n paddingRight:\n typeof sidePadding === 'string' ? sidePadding : `${sidePadding}px`,\n});\n","import React, { forwardRef, ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport {\n Icon,\n Typography,\n TypographyHeadingProps,\n withTruthyZero as hasAllowedCustomSidePadding,\n} from '@danske/sapphire-react';\nimport { ChevronDown } from '@danske/sapphire-icons/react';\nimport { Button } from 'react-aria-components';\nimport { useAccordionContext } from './AccordionContext';\nimport { customPaddingStyleProps } from './utils';\n\nexport interface AccordionHeadingProps extends DOMProps {\n children?: ReactNode;\n headerLevel?: TypographyHeadingProps['level'];\n}\n\nexport const AccordionHeading = forwardRef(function AccordionHeading(\n { children, headerLevel, ...props }: AccordionHeadingProps,\n ref: React.Ref<HTMLDivElement>\n): React.JSX.Element {\n const { sidePadding, headerLevel: contextHeaderLevel } =\n useAccordionContext();\n\n return (\n <div\n role=\"heading\"\n aria-level={headerLevel ?? contextHeaderLevel}\n {...filterDOMProps(props, { global: true })}\n ref={ref}\n >\n <Button\n slot=\"trigger\"\n className={({ isFocusVisible }) =>\n clsx(styles['sapphire-accordion__item-header'], styles['js-focus'], {\n [styles['is-focus']]: isFocusVisible,\n })\n }\n style={\n hasAllowedCustomSidePadding(sidePadding)\n ? customPaddingStyleProps(sidePadding)\n : {}\n }\n >\n <Typography.Heading level={6} elementType=\"span\">\n <div className={clsx(styles['sapphire-accordion__item-heading'])}>\n {children}\n </div>\n </Typography.Heading>\n <div className={clsx(styles['sapphire-accordion__item-arrow'])}>\n <Icon size=\"lg\">\n <ChevronDown />\n </Icon>\n </div>\n </Button>\n </div>\n );\n});\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\n\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\n\nimport { Disclosure } from 'react-aria-components';\nimport { DisclosureProps } from 'react-aria-components';\nimport { useFocusManager } from 'react-aria/FocusScope';\nimport { useEvent } from 'react-aria/private/utils/useEvent';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { DOMProps } from '@react-types/shared';\n\nexport interface AccordionItemProps\n extends DOMProps,\n Pick<DisclosureProps, 'children' | 'isDisabled'> {}\n\nexport const AccordionItem = forwardRef(function AccordionItem(\n { children, id, ...props }: AccordionItemProps,\n forwardedRef: React.Ref<HTMLDivElement>\n): JSX.Element {\n const ref = useObjectRef<HTMLDivElement>(forwardedRef);\n const focusManager = useFocusManager();\n\n const onKeyDown = (e: KeyboardEvent) => {\n if (!focusManager) return;\n\n if (\n !(e.target instanceof Element) ||\n e.target.getAttribute('slot') !== 'trigger'\n )\n return;\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focusManager.focusNext();\n break;\n case 'ArrowUp':\n e.preventDefault();\n focusManager.focusPrevious();\n break;\n case 'Home':\n e.preventDefault();\n focusManager.focusFirst();\n break;\n case 'End':\n e.preventDefault();\n focusManager.focusLast();\n break;\n default:\n return;\n }\n };\n\n useEvent(ref, 'keydown', onKeyDown);\n\n return (\n <Disclosure\n ref={ref}\n id={id}\n className={({ isExpanded, isDisabled }) =>\n clsx(styles['sapphire-accordion__item'], {\n [styles['sapphire-accordion__item--open']]: isExpanded,\n [styles['is-disabled']]: isDisabled,\n })\n }\n {...props}\n >\n <div className={clsx(styles['sapphire-accordion__item-content-wrapper'])}>\n {children}\n </div>\n </Disclosure>\n );\n});\n","import React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport styles from '@danske/sapphire-css/components/accordion/accordion.module.css';\nimport { DisclosurePanel, DisclosurePanelProps } from 'react-aria-components';\nimport { useAccordionContext } from './AccordionContext';\nimport { customPaddingStyleProps } from './utils';\nimport { withTruthyZero as hasAllowedCustomSidePadding } from '@danske/sapphire-react';\nimport { DOMProps } from '@react-types/shared';\n\nexport interface AccordionPanelProps\n extends DOMProps,\n Pick<DisclosurePanelProps, 'children' | 'role'> {}\n\nexport const AccordionPanel = forwardRef(function AccordionPanel(\n { children, ...props }: AccordionPanelProps,\n ref: React.Ref<HTMLDivElement>\n): React.JSX.Element {\n const { sidePadding } = useAccordionContext();\n\n return (\n <DisclosurePanel\n ref={ref}\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-accordion__item-content'])}\n style={{\n /**\n * useDisclosure hook from react-aria uses css variable --disclosure-panel-height to\n * animate the height of the panel.\n */\n height: 'var(--disclosure-panel-height)',\n }}\n {...props}\n >\n <div\n style={{\n ...(hasAllowedCustomSidePadding(sidePadding)\n ? customPaddingStyleProps(sidePadding)\n : {}),\n }}\n className={styles['sapphire-accordion__item-content-inner']}\n >\n {children}\n </div>\n </DisclosurePanel>\n );\n});\n","import { Accordion, type AccordionProps } from './src/Accordion';\nimport {\n AccordionHeading,\n type AccordionHeadingProps,\n} from './src/AccordionHeading';\nimport { AccordionItem, type AccordionItemProps } from './src/AccordionItem';\nimport { AccordionContext } from './src/AccordionContext';\nimport { AccordionPanel, type AccordionPanelProps } from './src/AccordionPanel';\n\n/*\n * Before moving Accordion component to the core package, it's important to check on the\n * latest release of \"@react-aria/accordion\".\n * The hook and the component package are marked as \"pre-release\", so we can expect some changes.\n *\n * https://github.com/adobe/react-spectrum/issues/2801#issuecomment-1035377858\n * https://github.com/adobe/react-spectrum/discussions/6635#discussioncomment-9990027\n *\n * The current implementation is based on the SelectableCollection API, which creates bugs when\n * focusable items are used inside of the Accordion.Item.\n * E.g. UC-3414 (fixed), UC-3545 (to-do)\n *\n * Alternatively, we can re-implement the component.\n */\nconst _Accordion = Object.assign(Accordion, {\n Heading: AccordionHeading,\n Item: AccordionItem,\n Panel: AccordionPanel,\n});\n\nexport {\n _Accordion as Accordion,\n AccordionContext,\n type AccordionProps,\n type AccordionItemProps,\n type AccordionHeadingProps,\n type AccordionPanelProps,\n};\n","import React, { ReactNode } from 'react';\nimport {\n SapphireStyleProps,\n useThemeCheck,\n useSapphireStyleProps,\n Typography,\n Icon,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport {\n CheckmarkOutline,\n Information,\n Warning,\n Error,\n} from '@danske/sapphire-icons/react';\nimport alertStyles from '@danske/sapphire-css/components/alert/alert.module.css';\nimport { clsx } from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport interface SapphireAlertProps\n extends GlobalDomAttributes,\n SapphireStyleProps {\n /**\n * The content of the alert.\n */\n children?: ReactNode;\n\n /**\n * The title of the alert.\n */\n title?: ReactNode;\n\n /**\n * @default 'info'\n */\n variant?: 'info' | 'positive' | 'negative' | 'warning';\n}\n\nexport function Alert({\n children,\n title,\n variant = 'info',\n ...props\n}: SapphireAlertProps): React.JSX.Element {\n useThemeCheck();\n const {\n styleProps: { style, className },\n } = useSapphireStyleProps(props);\n\n const getIcon = (variant: string) => {\n switch (variant) {\n case 'warning':\n return <Warning />;\n case 'positive':\n return <CheckmarkOutline />;\n case 'negative':\n return <Error />;\n default:\n return <Information />;\n }\n };\n\n return (\n <div\n {...filterDOMProps(props, { global: true })}\n className={clsx(\n alertStyles['sapphire-alert'],\n {\n [alertStyles['sapphire-alert--positive']]: variant === 'positive',\n [alertStyles['sapphire-alert--negative']]: variant === 'negative',\n [alertStyles['sapphire-alert--warning']]: variant === 'warning',\n },\n className\n )}\n style={style}\n role=\"alert\"\n >\n <span className={alertStyles['sapphire-alert__icon']}>\n <Icon size=\"sm\">{getIcon(variant)}</Icon>\n </span>\n <div className={alertStyles['sapphire-alert__title']}>\n <Typography.Body size=\"sm\" isSemibold>\n {title}\n </Typography.Body>\n </div>\n <div className={alertStyles['sapphire-alert__content']}>\n <Typography.Body elementType=\"section\" size=\"md\">\n {children}\n </Typography.Body>\n </div>\n </div>\n );\n}\n","import { useMemo } from 'react';\n\nexport interface GroupedPart {\n type: 'sign' | 'number' | 'currency';\n value: string;\n}\n\n/**\n * Process the value that is being provided and format it using the provided formatter.\n * It returns both the formatted value as a string and the grouped parts for further processing.\n * It's useful for keeping track of diffrent parts of the formatted amount and where currency symbols are located.\n *\n * Example: value = \"+30000\", formatter for DKK currency\n * formattedValue = \"+DKK 30,000.00\"\n * groupedParts = [\n * { type: 'sign', value: '+' },\n * { type: 'currency', value: 'DKK' },\n * { type: 'number', value: '30,000.00' }\n * ]\n */\nexport const useGroupAmount = (\n value: string | number,\n formatter: Intl.NumberFormat\n) => {\n const numberValue = useMemo(() => {\n const parsed = Number(value);\n return isNaN(parsed) ? 0 : parsed;\n }, [value]);\n\n const groupedParts = useMemo(() => {\n const parts = formatter.formatToParts(numberValue);\n const result: GroupedPart[] = [];\n let currentNumber = '';\n\n parts.forEach((part) => {\n if (part.type === 'plusSign' || part.type === 'minusSign') {\n result.push({ type: 'sign', value: part.value });\n } else if (part.type === 'currency') {\n if (currentNumber) {\n result.push({ type: 'number', value: currentNumber });\n currentNumber = '';\n }\n result.push({ type: 'currency', value: part.value });\n } else if (part.type !== 'literal') {\n currentNumber += part.value;\n }\n });\n\n if (currentNumber) {\n result.push({ type: 'number', value: currentNumber });\n }\n\n return result;\n }, [numberValue, formatter]);\n\n const formattedValue = useMemo(\n () => groupedParts.map((part) => part.value).join(''),\n [groupedParts]\n );\n\n return { formattedValue, groupedParts };\n};\n","import { useMemo } from 'react';\nimport {\n useThemeCheck,\n SapphireStyleProps,\n GlobalDomAttributes,\n Typography,\n TypographyBodyProps,\n useSapphireStyleProps,\n} from '@danske/sapphire-react';\nimport React from 'react';\nimport { useLocale } from 'react-aria/I18nProvider';\nimport { useGroupAmount } from './useGroupAmount';\nimport styles from '@danske/sapphire-css/components/amount/amount.module.css';\n\n/**\n * Format options for currency amounts.\n * The style is always 'currency', so only currency-related options are exposed.\n */\nexport type CurrencyFormatOptions = Pick<\n Intl.NumberFormatOptions,\n | 'currency'\n | 'currencyDisplay'\n | 'currencySign'\n | 'signDisplay'\n | 'minimumFractionDigits'\n | 'maximumFractionDigits'\n | 'minimumSignificantDigits'\n | 'maximumSignificantDigits'\n | 'useGrouping'\n | 'notation'\n>;\n\nexport type AmountProps = {\n /**\n * When displaying amounts, readability and visual hierarchy are key. Use medium weight for primary emphasis to highlight amounts or regular weight for secondary emphasis.\n *\n * @default 'regular'\n */\n emphasis?: 'primary' | 'regular';\n /**\n * The variant of the Amount component. `positive` shows a green color, and should be used for amounts greater than zero.\n *\n * @default 'neutal'\n */\n variant?: 'neutal' | 'positive';\n /**\n * The amount value to be formatted and displayed.\n *\n * If displaying the sign is a requirement, ensure the value is a string that starts with '+' or '-'.\n * Alternatively, you can use the `signDisplay` option in `formatOptions` to control the display of the sign for numeric values.\n */\n value: string | number;\n /** Currency formatting options */\n formatOptions?: CurrencyFormatOptions;\n} & Pick<TypographyBodyProps, 'size'> &\n SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const Amount = ({\n emphasis = 'regular',\n variant,\n formatOptions,\n value,\n size,\n ...props\n}: AmountProps): JSX.Element => {\n useThemeCheck();\n const { styleProps, filteredProps } = useSapphireStyleProps(props);\n const { locale } = useLocale();\n\n const formatter = useMemo(\n () =>\n new Intl.NumberFormat(locale, {\n style: formatOptions?.currency ? 'currency' : undefined,\n /**\n * Always show the sign if the value starts with '+' or '-'.\n */\n signDisplay:\n formatOptions?.signDisplay || String(value).startsWith('+')\n ? 'always'\n : 'auto',\n minimumFractionDigits: 2,\n ...formatOptions,\n }),\n [locale, formatOptions, value]\n );\n\n const { formattedValue, groupedParts } = useGroupAmount(value, formatter);\n\n return (\n <span\n style={styleProps.style}\n className={styles['sapphire-amount']}\n {...filteredProps}\n aria-label={formattedValue}\n >\n {groupedParts.map((part, index) => (\n <Typography.Body\n elementType=\"span\"\n key={index}\n color={variant === 'positive' ? 'positive' : 'primary'}\n isSemibold={emphasis === 'primary' ? true : false}\n size={size}\n >\n {part.value}\n </Typography.Body>\n ))}\n </span>\n );\n};\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","import React, { Key, ReactElement, useRef } from 'react';\nimport {\n ListBoxProps,\n useThemeCheck,\n useSapphireStyleProps,\n SapphireStyleProps,\n ListBoxPopover,\n useComboBoxState,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { useComboBox } from 'react-aria/useComboBox';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport intlMessages from '../i18n';\nimport { useFocusableRef } from '@react-spectrum/utils';\nimport type { ComboBoxProps } from 'react-stately/useComboBoxState';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport type AutocompleteProps<T extends object> = GlobalDomAttributes &\n SapphireStyleProps &\n Pick<\n ComboBoxProps<T>,\n | 'items'\n | 'children'\n | 'inputValue'\n | 'defaultInputValue'\n | 'onInputChange'\n | 'isDisabled'\n > &\n Pick<ListBoxProps<T>, 'loadingState' | 'loadingSkeletonRowsCount'> & {\n /**\n * This prop is badly named. It is NOT related to a selection state being\n * changed since there is no selection state in this component.\n *\n * This callback simply notifies you when the user filled in the text field\n * by selecting an option from the autocomplete dropdown. Similar to an\n * onClick.\n *\n * @deprecated\n * Use `onSuggestionSelected` instead.\n */\n onSelectionChange?: Pick<\n ComboBoxProps<T>,\n 'onSelectionChange'\n >['onSelectionChange'];\n\n /*\n * This callback simply notifies you when the user filled in the text field\n * by selecting an option from the autocomplete dropdown. Similar to an\n * onClick.\n */\n onSuggestionSelected?: (key: Key) => void;\n /**\n * Render function for the input element.\n * Receives props that should be spread onto the input component.\n */\n renderInput: (inputProps: any) => ReactElement;\n\n /**\n * Accessible label for the suggestions listbox.\n */\n listboxAriaLabel?: string;\n\n /**\n * Controlled selected value.\n */\n value?: React.Key | null;\n\n /**\n * Decide what items to display in the dropdown menu.\n * @default 'String.includes'\n */\n defaultFilter?: (textValue: string, inputValue: string) => boolean;\n };\n\nexport function Autocomplete<T extends object>(\n props: AutocompleteProps<T>\n): ReactElement {\n useThemeCheck();\n const formatMessage = useMessageFormatter(intlMessages);\n\n const {\n inputValue,\n renderInput,\n loadingState,\n loadingSkeletonRowsCount,\n listboxAriaLabel,\n onSuggestionSelected,\n onSelectionChange,\n ...otherProps\n } = props;\n\n const {\n styleProps: { style, className },\n } = useSapphireStyleProps(props);\n\n const inputRef = useRef<HTMLInputElement>(null);\n const listBoxRef = useFocusableRef<HTMLUListElement>(null);\n const popoverRef = useRef<HTMLDivElement>(null);\n const triggerRef = useFocusableRef<HTMLDivElement>(null);\n const collectionRef = useRef<\n ReturnType<typeof useComboBoxState>['collection'] | null\n >(null);\n\n const state = useComboBoxState({\n ...props,\n inputValue,\n allowsEmptyCollection: loadingState === 'loading',\n allowsCustomValue: true,\n shouldCloseOnBlur: true,\n onSelectionChange: (key) => {\n if (key !== null) {\n onSelectionChange?.(key);\n onSuggestionSelected?.(key);\n // When both value and inputValue are controlled, react-stately skips\n // updating inputValue\n const itemText = collectionRef.current?.getItem(key)?.textValue ?? '';\n if (itemText) {\n props.onInputChange?.(itemText);\n }\n }\n },\n });\n\n collectionRef.current = state.collection;\n\n const { inputProps, listBoxProps } = useComboBox(\n {\n ...props,\n 'aria-label': listboxAriaLabel || formatMessage('listbox-suggestions'),\n inputRef,\n listBoxRef,\n popoverRef,\n },\n state\n );\n\n const inputElement = renderInput({\n ...inputProps,\n isDisabled: props.isDisabled,\n inputRef,\n 'aria-haspopup': 'listbox',\n 'aria-expanded': state.isOpen,\n onChange: (value: string) => {\n inputProps.onChange?.({\n target: { value },\n currentTarget: { value },\n } as React.ChangeEvent<HTMLInputElement>);\n },\n });\n\n return (\n <div\n ref={triggerRef}\n {...filterDOMProps(otherProps, { global: true })}\n style={{ display: 'inline-flex', ...style }}\n className={className}\n >\n {inputElement}\n {state.isOpen && (\n <ListBoxPopover<T>\n state={state}\n triggerRef={triggerRef}\n popoverRef={popoverRef}\n listBoxRef={listBoxRef}\n listBoxProps={listBoxProps}\n loadingState={loadingState}\n loadingSkeletonRowsCount={loadingSkeletonRowsCount}\n selectWidth={triggerRef.current?.offsetWidth}\n disableSelectedStyles\n isNonModal\n >\n {props.children || []}\n </ListBoxPopover>\n )}\n </div>\n );\n}\n","import { useState, useMemo, useEffect } from 'react';\nimport { useResizeObserver } from 'react-aria/private/utils/useResizeObserver';\n\nexport const useBreadcrumbThreshold = (\n childrenCount: number,\n containerRef: React.RefObject<HTMLElement>,\n breadcrumbRef: React.RefObject<HTMLOListElement>\n) => {\n const [itemWidths, setItemWidths] = useState<number[]>([]);\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n const { shouldRenderOverflow, maxVisibleTailChildren } = useMemo(() => {\n if (!containerWidth || itemWidths.length === 0) {\n return {\n shouldRenderOverflow: false,\n maxVisibleTailChildren: childrenCount,\n };\n }\n\n // Exit early if the container is wider than all items combined\n const totalItemWidth = itemWidths.reduce((a, b) => a + b, 0);\n if (totalItemWidth <= containerWidth) {\n return {\n shouldRenderOverflow: false,\n maxVisibleTailChildren: itemWidths.length - 1,\n };\n }\n\n // The minimum number of items in the container is 2 (first and last).\n let totalWidth = itemWidths[0] + itemWidths[itemWidths.length - 1];\n let visibleTailCount = 1; // Last item counted by default\n\n for (\n let i = itemWidths.length - 2;\n i > 0 && totalWidth + itemWidths[i] < containerWidth;\n i--\n ) {\n totalWidth += itemWidths[i];\n visibleTailCount++;\n }\n\n visibleTailCount--; // When we are overflowing, take into account the icon button that will be rendered\n return {\n shouldRenderOverflow: true,\n maxVisibleTailChildren: Math.max(1, visibleTailCount),\n };\n }, [itemWidths, containerWidth, childrenCount]);\n\n /**\n * Compute the individual widths of the breadcrumb items.\n * It's important to have these values for all the items, since they disappear if the container\n * is overflowing. We need these values to recompute the number of items that can fit,\n * but we can't do that once they have disappeared from the container.\n */\n const computeItemWidths = () => {\n if (!breadcrumbRef.current) return;\n const breadcrumbItems = Array.from(\n breadcrumbRef.current.children\n ) as HTMLElement[];\n const widths = breadcrumbItems\n .map((item) => item.offsetWidth)\n .filter(Boolean);\n\n if (widths.length === breadcrumbItems.length) {\n setItemWidths(widths);\n }\n };\n\n /**\n * Recompute the item widths when the children change.\n */\n useEffect(() => {\n if (childrenCount !== itemWidths.length) {\n computeItemWidths();\n }\n }, [containerRef.current, childrenCount]);\n\n useResizeObserver({\n ref: containerRef,\n onResize: () => {\n if (!containerRef.current) return;\n setContainerWidth(containerRef.current.offsetWidth);\n },\n });\n\n const overflowNodes = useMemo(() => {\n if (childrenCount > 0 && shouldRenderOverflow) {\n const tailCount = maxVisibleTailChildren > 1 ? maxVisibleTailChildren : 1;\n const actualTailCount =\n maxVisibleTailChildren === 1 ? maxVisibleTailChildren : tailCount;\n const limitedTailCount = Math.min(actualTailCount, 5); // By design, we limit the number of visible tail items to 6\n const tailStartIndex = childrenCount - limitedTailCount;\n // Return overflow indexes (hidden items) - all items except first and tail items\n return Array.from({ length: tailStartIndex - 1 }, (_, i) => i + 1);\n }\n return [];\n }, [childrenCount, shouldRenderOverflow, maxVisibleTailChildren]);\n\n return {\n overflowNodes,\n };\n};\n","import React, { createContext } from 'react';\nimport { useBreadcrumbs } from 'react-aria/useBreadcrumbs';\nimport { Collection } from 'react-aria/Collection';\nimport { CollectionBuilder } from 'react-aria/CollectionBuilder';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { forwardRefType } from '@react-types/shared';\nimport { ForwardedRef, forwardRef, useContext, useRef } from 'react';\nimport {\n BreadcrumbsContext as RACBreadcrumbsContext,\n BreadcrumbsProps as RACBreadcrumbsProps,\n CollectionRendererContext,\n useContextProps,\n} from 'react-aria-components';\nimport { useBreadcrumbThreshold } from './useBreadcrumbThreshold';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport clsx from 'clsx';\nimport { BreadcrumbItemNode } from './types';\n\nexport type BreadcrumbsProps<T extends object> = Pick<\n RACBreadcrumbsProps<T>,\n 'aria-label' | 'isDisabled' | 'children'\n> & {\n /**\n * The size of the breadcrumbs component.\n *\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg';\n /**\n * Maximum width for the breadcrumbs container. When content overflows,\n * it will show an overflow menu with the first and last items.\n */\n maxWidth?: React.CSSProperties['maxWidth'];\n} & SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const BreadcrumbsContext = createContext<{\n size: 'sm' | 'md' | 'lg';\n overflowNodes: (BreadcrumbItemNode | null)[];\n isDisabled?: boolean;\n}>({ size: 'md', overflowNodes: [] });\n\n/**\n * Shows the path to the current page through a hierarchical trail of links,\n * helping users understand their location within the application and navigate back to\n * parent pages.\n */\nexport const Breadcrumbs = (forwardRef as forwardRefType)(function Breadcrumbs<\n T extends object\n>(\n { maxWidth, size = 'md', ...props }: BreadcrumbsProps<T>,\n fwdRef: ForwardedRef<HTMLOListElement>\n) {\n const [RACprops, ref] = useContextProps(props, fwdRef, RACBreadcrumbsContext);\n const { styleProps } = useSapphireStyleProps(RACprops);\n const containerRef = useRef<HTMLDivElement>(null);\n const { CollectionRoot } = useContext(CollectionRendererContext);\n const { navProps } = useBreadcrumbs(RACprops);\n const DOMProps = filterDOMProps(RACprops, { global: true });\n\n return (\n <CollectionBuilder content={<Collection {...RACprops} />}>\n {(collection) => {\n const { overflowNodes } = useBreadcrumbThreshold(\n collection.size,\n containerRef,\n ref\n );\n const keys = Array.from(collection.getKeys());\n return (\n <div\n ref={containerRef}\n style={{\n ...styleProps.style,\n maxWidth,\n display: 'flex',\n }}\n >\n <ol\n ref={ref}\n {...mergeProps(DOMProps, navProps)}\n className={clsx(styles['sapphire-breadcrumbs'], {\n [styles['sapphire-breadcrumbs--sm']]: size === 'sm',\n [styles['sapphire-breadcrumbs--lg']]: size === 'lg',\n })}\n >\n <BreadcrumbsContext.Provider\n value={{\n size,\n overflowNodes: overflowNodes.map((index) =>\n collection.getItem(keys[index])\n ),\n isDisabled: RACprops.isDisabled,\n }}\n >\n <RACBreadcrumbsContext.Provider value={RACprops}>\n <CollectionRoot collection={collection} />\n </RACBreadcrumbsContext.Provider>\n </BreadcrumbsContext.Provider>\n </ol>\n </div>\n );\n }}\n </CollectionBuilder>\n );\n});\n","import clsx from 'clsx';\nimport React, { useContext } from 'react';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { ChevronRight } from '@danske/sapphire-icons/react';\nimport { Icon } from '@danske/sapphire-react';\nimport { BreadcrumbsContext } from './Breadcrumbs';\n\nexport const BreadcrumbsSeparator = (): JSX.Element => {\n const { size } = useContext(BreadcrumbsContext);\n\n // Based on the design\n const iconSize = size === 'lg' ? 'md' : 'sm';\n\n return (\n <span\n className={clsx(styles['sapphire-breadcrumbs__separator'])}\n aria-hidden=\"true\"\n >\n <Icon size={iconSize}>\n <ChevronRight />\n </Icon>\n </span>\n );\n};\n","import { Menu, MenuItem, IconButton } from '@danske/sapphire-react';\nimport { OverflowMenuHorizontal } from '@danske/sapphire-icons/react';\nimport React from 'react';\nimport { useContext } from 'react';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbsSeparator } from './BreadcrumbsSeparator';\n\n/**\n * Component that is being rendered in the case of overflowed breadcrumbs.\n * It is an internal component, so it's automatically rendered when the Breadcrumb\n * component detects overflow.\n */\nexport const BreadcrumbOverflowMenu = (): JSX.Element => {\n const { size, overflowNodes } = useContext(BreadcrumbsContext);\n\n return (\n <>\n <Menu\n triggerElement={\n <IconButton aria-label=\"Show more breadcrumbs\" size={size}>\n <OverflowMenuHorizontal />\n </IconButton>\n }\n >\n {overflowNodes.map((item) =>\n !item ? null : (\n <MenuItem\n key={item.key}\n id={item.key}\n href={item.href}\n isDisabled={!item.href}\n >\n {item.rendered}\n </MenuItem>\n )\n )}\n </Menu>\n <BreadcrumbsSeparator />\n </>\n );\n};\n","import React, { forwardRef } from 'react';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n TooltipIfNeeded,\n} from '@danske/sapphire-react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { mergeRefs } from 'react-aria/mergeRefs';\n\nexport type BreadcrumbItemStaticProps = Pick<\n React.HTMLAttributes<HTMLSpanElement>,\n 'children'\n> &\n SapphireStyleProps &\n GlobalDomAttributes & { size: 'sm' | 'md' | 'lg' };\n\nexport const BreadcrumbItemStatic = forwardRef<\n HTMLSpanElement,\n BreadcrumbItemStaticProps\n>(function BreadcrumbItemStatic({ size, ...props }, ref): JSX.Element {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n return (\n <TooltipIfNeeded<HTMLSpanElement> title={props.children}>\n {(tooltipContentRef, tooltipProps) => {\n const positioningRef = tooltipProps?.ref;\n return (\n <span\n {...tooltipProps}\n ref={\n mergeRefs(\n ref,\n tooltipContentRef,\n positioningRef\n ) as React.LegacyRef<HTMLSpanElement>\n }\n className={clsx(\n styles['sapphire-breadcrumbs__item--static'],\n {\n [styles['sapphire-breadcrumbs__item--static--sm']]:\n size === 'sm',\n [styles['sapphire-breadcrumbs__item--static--lg']]:\n size === 'lg',\n },\n styleProps.className\n )}\n style={styleProps.style}\n >\n {props.children}\n </span>\n );\n }}\n </TooltipIfNeeded>\n );\n});\n","import React, { useContext, forwardRef } from 'react';\nimport {\n Button,\n ButtonProps,\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FocusableRef } from '@react-types/shared';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbItemStatic } from './BreadcrumbItemStatic';\n\nexport type BreadcrumbItemLinkProps = Pick<\n ButtonProps<'a'>,\n | 'children'\n | 'href'\n | 'hrefLang'\n | 'target'\n | 'rel'\n | 'isDisabled'\n | 'icon'\n // TODO when moving to \"core\", use types under `types.ts` instead of plain strings\n | 'aria-label'\n | 'aria-labelledby'\n | 'aria-describedby'\n | 'aria-details'\n | 'UNSAFE_onClick'\n> &\n SapphireStyleProps &\n GlobalDomAttributes;\n\nexport const BreadcrumbItemLink = forwardRef(function BreadcrumbItemLink(\n { children, ...props }: BreadcrumbItemLinkProps,\n ref: FocusableRef<HTMLAnchorElement>\n): JSX.Element {\n useThemeCheck();\n const { styleProps: sapphireStyleProps } = useSapphireStyleProps(props);\n const { style, className, ...styleProps } = sapphireStyleProps;\n const { size } = useContext(BreadcrumbsContext);\n\n if (!props.href && !props.UNSAFE_onClick) {\n return (\n <BreadcrumbItemStatic {...props} size={size}>\n {children}\n </BreadcrumbItemStatic>\n );\n }\n\n return (\n <Button\n {...props}\n {...styleProps}\n UNSAFE_className={className}\n UNSAFE_style={{ ...style }}\n ref={ref}\n size={size}\n variant=\"tertiary\"\n isDisabled={props.isDisabled}\n >\n {children}\n </Button>\n );\n});\n\nBreadcrumbItemLink.displayName = 'BreadcrumbItemLink';\n","import React, { useContext, ForwardedRef } from 'react';\nimport type { BreadcrumbProps as RACBreadcrumbProps } from 'react-aria-components';\nimport { CollectionNode } from 'react-aria/private/collections/BaseCollection';\nimport { createLeafComponent } from 'react-aria/CollectionBuilder';\nimport {\n useSapphireStyleProps,\n useThemeCheck,\n SapphireStyleProps,\n Typography,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { BreadcrumbsSeparator } from './BreadcrumbsSeparator';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/breadcrumbs/breadcrumbs.module.css';\nimport { BreadcrumbsContext } from './Breadcrumbs';\nimport { BreadcrumbOverflowMenu } from './BreadcrumbOverflowMenu';\nimport { BreadcrumbItemNode } from './types';\nimport {\n BreadcrumbItemLink,\n BreadcrumbItemLinkProps,\n} from './BreadcrumbItemLink';\n\nexport type BreadcrumbItemProps = {\n isDisabled?: boolean;\n} & SapphireStyleProps &\n GlobalDomAttributes &\n Pick<RACBreadcrumbProps, 'children'> &\n BreadcrumbItemLinkProps;\n\nclass BreadcrumbItemCollectionNode extends CollectionNode<unknown> {\n static readonly type = 'item';\n}\n\n/**\n * The implementation is based on React Aria's BreadcrumbItem, with added support for\n * overflow menu data handling.\n */\nexport const BreadcrumbItem = createLeafComponent(\n BreadcrumbItemCollectionNode,\n function BreadcrumbItem(\n props: BreadcrumbItemProps,\n ref: ForwardedRef<HTMLLIElement>,\n node: BreadcrumbItemNode\n ): JSX.Element {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const {\n size,\n overflowNodes,\n isDisabled: breadcrumbsDisabled,\n } = useContext(BreadcrumbsContext);\n const { isDisabled: individualDisabled = false } = props;\n\n const isCurrent = node.nextKey == null;\n const isDisabled = individualDisabled || breadcrumbsDisabled;\n\n /**\n * The item should not be rendered if it's in the overflow indexes.\n * The only exception is the first overflow menu item, which will be rendered\n * as the overflow menu trigger.\n */\n const shouldRender = !overflowNodes.some((item) => item?.key === node.key);\n const showOverflowMenu = overflowNodes[0]?.key === node.key;\n\n if (!shouldRender && !showOverflowMenu) {\n return <></>;\n }\n\n if (!shouldRender && showOverflowMenu) {\n return <BreadcrumbOverflowMenu />;\n }\n\n node.href = props.href;\n\n return (\n <li\n ref={ref}\n className={clsx(styles['sapphire-breadcrumbs__item'])}\n style={{ ...styleProps.style }}\n data-disabled={isDisabled || undefined}\n data-current={isCurrent || undefined}\n >\n {isCurrent ? (\n <Typography.Body\n elementType=\"span\"\n isSemibold\n size={size === 'lg' ? 'md' : size === 'md' ? 'sm' : 'xs'}\n >\n {node.rendered}\n </Typography.Body>\n ) : (\n <BreadcrumbItemLink isDisabled={isDisabled} {...props}>\n {node.rendered}\n </BreadcrumbItemLink>\n )}\n {!isCurrent && <BreadcrumbsSeparator />}\n </li>\n );\n }\n);\n","import React, { ForwardedRef } from 'react';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { PressResponder } from 'react-aria/private/interactions/PressResponder';\n\nexport interface FileSelectProps {\n /**\n * List of file types that are allowed to be selected using the file select.\n * When no list is passed, all file types will be allowed to be selected.\n * @default \"\"\n */\n acceptedFileTypes?: string[];\n /**\n * Whether multiple files are allowed to be selected using the file select.\n * @default \"false\"\n */\n allowsMultiple?: boolean;\n}\n\nexport interface FileTriggerProps extends FileSelectProps {\n /**\n * Callback for file selection.\n * @param files - the list of selected files\n * @default \"() => null\"\n */\n onSelect?: (files: FileList | null) => void;\n isDisabled?: boolean;\n children?: React.ReactNode;\n}\n\nconst HiddenFileInput = React.forwardRef(function InputWrapper(\n props: React.HTMLProps<HTMLInputElement>,\n ref: ForwardedRef<HTMLInputElement>\n) {\n return <input {...props} ref={ref} type=\"file\" style={{ display: 'none' }} />;\n});\n\nexport const FileTrigger = React.forwardRef(function FileTriggerWrapper(\n props: FileTriggerProps,\n ref: ForwardedRef<HTMLInputElement>\n) {\n const {\n acceptedFileTypes,\n allowsMultiple = false,\n onSelect = () => null,\n children,\n isDisabled = false,\n ...rest\n } = props;\n const inputRef = useObjectRef(ref);\n const domProps = filterDOMProps(rest, { global: true });\n\n return (\n <>\n <PressResponder\n isDisabled={isDisabled}\n onPress={() => {\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n inputRef.current?.click();\n }}\n >\n {children}\n </PressResponder>\n <HiddenFileInput\n {...domProps}\n disabled={isDisabled}\n ref={inputRef}\n accept={acceptedFileTypes?.toString()}\n onChange={(e) => onSelect?.((e.target as HTMLInputElement).files)}\n multiple={allowsMultiple}\n />\n </>\n );\n});\n","import { FileDropItem } from '@react-types/shared';\n\nexport const convertFileListToFileDropItems = (\n fileList: FileList | null\n): FileDropItem[] => {\n if (!fileList) {\n return [];\n }\n\n return Array.from(fileList).map((file) => ({\n kind: 'file',\n type: file.type,\n name: file.name,\n getFile: () => Promise.resolve(file),\n getText: () =>\n new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = () => reject(reader.error);\n reader.readAsText(file);\n }),\n }));\n};\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","import React, { ForwardedRef } from 'react';\nimport clsx from 'clsx';\nimport {\n Typography,\n Icon,\n SapphireStyleProps,\n useButton,\n useSapphireStyleProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/dropzone/dropzone.module.css';\nimport { Upload } from '@danske/sapphire-icons/react';\nimport { HoverProps, useHover } from 'react-aria/useHover';\nimport { Pressable } from 'react-aria/Pressable';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useId } from 'react-aria/useId';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { FileSelectProps, FileTrigger } from './FileTrigger';\nimport { DropOptions, useDrop } from 'react-aria/useDrop';\nimport { useClipboard } from 'react-aria/useClipboard';\nimport { convertFileListToFileDropItems } from './utils';\nimport { useFocusRing } from 'react-aria/useFocusRing';\nimport { AriaLabelingProps } from '@react-types/shared';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport intlMessages from '../i18n';\n\nexport interface FileDropzoneProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n Pick<\n DropOptions,\n | 'getDropOperation'\n | 'onDropEnter'\n | 'onDropActivate'\n | 'onDropMove'\n | 'onDropExit'\n | 'onDrop'\n >,\n HoverProps,\n FileSelectProps,\n // TODO when moving to \"core\", use types under `types.ts` instead of plain strings\n Pick<\n AriaLabelingProps,\n 'aria-label' | 'aria-labelledby' | 'aria-describedby' | 'aria-details'\n > {\n /**\n * Whether the dropzone has an error\n * @default false\n */\n hasError?: boolean;\n /**\n * The body text of the dropzone which can contain the instructions for the files to be uploaded.\n * Can be rendered differently based on the `isDropping` parameter, which is true if a file is about to be dropped in the zone.\n * @param isDropping - boolean that marks whether a payload is about to be dropped in the dropzone.\n */\n renderInstruction: (isDropping: boolean) => string;\n /**\n * Function that is called when the file select is opened on press, before any file is selected.\n * @default \"() => null\"\n */\n onFileSelectOpen?: () => void;\n}\n\nexport const FileDropzone = React.forwardRef(function DropzoneWrapper(\n props: FileDropzoneProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n isDisabled = false,\n hasError,\n renderInstruction,\n onFileSelectOpen = () => null,\n acceptedFileTypes,\n allowsMultiple,\n onDrop = () => null,\n getDropOperation = () => 'copy',\n ...otherProps\n } = props;\n\n const id = useId();\n const paragraphId = props['aria-label'] ? undefined : id;\n const format = useMessageFormatter(intlMessages);\n const pressableRef = useObjectRef(forwardedRef);\n const { hoverProps, isHovered } = useHover({ isDisabled });\n const { styleProps } = useSapphireStyleProps(props);\n const { dropProps, isDropTarget: isDropping } = useDrop({\n ...props,\n ref: pressableRef,\n hasDropButton: true,\n isDisabled,\n getDropOperation,\n });\n const { buttonProps, isPressed } = useButton(\n { elementType: 'div' },\n pressableRef as React.RefObject<Element>\n );\n const { focusProps, isFocusVisible } = useFocusRing();\n\n const { clipboardProps } = useClipboard({\n isDisabled,\n onPaste: (items) =>\n onDrop({\n type: 'drop',\n items,\n x: 0,\n y: 0,\n dropOperation: 'copy',\n }),\n });\n\n const ariaLabel: string = props['aria-label'] || 'Dropzone';\n\n const onFileTriggerSelect = (files: FileList | null) => {\n onDrop({\n type: 'drop',\n items: convertFileListToFileDropItems(files),\n x: 0,\n y: 0,\n dropOperation: 'copy',\n });\n };\n\n return (\n <FileTrigger\n acceptedFileTypes={acceptedFileTypes}\n allowsMultiple={allowsMultiple}\n onSelect={onFileTriggerSelect}\n isDisabled={isDisabled}\n >\n <Pressable ref={pressableRef} onPress={onFileSelectOpen}>\n <div\n {...mergeProps(\n dropProps,\n hoverProps,\n clipboardProps,\n focusProps,\n buttonProps\n )}\n {...filterDOMProps(otherProps, { global: true })}\n style={{ ...styleProps.style }}\n className={clsx(\n styles['sapphire-dropzone'],\n styles['js-focus'],\n styles['js-hover'],\n {\n [styles['is-hover']]: isHovered && !isDropping,\n [styles['is-active']]: isPressed,\n [styles['is-disabled']]: isDisabled,\n [styles['is-focus']]: isFocusVisible,\n [styles['sapphire-dropzone--dropping']]: isDropping,\n [styles['sapphire-dropzone--error']]: hasError,\n },\n styleProps.className\n )}\n aria-label={ariaLabel}\n aria-invalid={hasError}\n aria-describedby={paragraphId}\n >\n <div className={clsx(styles['sapphire-dropzone__content'])}>\n <div className={clsx(styles['sapphire-dropzone__icon'])}>\n <Icon size=\"lg\">\n <Upload />\n </Icon>\n </div>\n <div className={clsx(styles['sapphire-dropzone__heading'])}>\n <Typography.Heading level={6}>\n {isDropping\n ? format('dropzone-heading-dropping')\n : allowsMultiple\n ? format('dropzone-heading-default')\n : format('dropzone-heading-default-single')}\n </Typography.Heading>\n </div>\n <div\n id={paragraphId}\n className={clsx(styles['sapphire-dropzone__paragraph'])}\n >\n <Typography.Body size=\"sm\" color=\"secondary\">\n {renderInstruction(isDropping)}\n </Typography.Body>\n </div>\n </div>\n </div>\n </Pressable>\n </FileTrigger>\n );\n});\n","import React, { useRef, ReactNode, FormEvent } from 'react';\nimport clsx from 'clsx';\nimport { VisuallyHidden } from 'react-aria/VisuallyHidden';\nimport { useEffectEvent } from 'react-aria/private/utils/useEffectEvent';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { useControlledState } from 'react-stately/useControlledState';\nimport {\n Button,\n ButtonGroup,\n PopoverTrigger,\n PopoverTriggerProps,\n SapphireStyleProps,\n ToggleButton,\n GlobalDomAttributes,\n useSapphireStyleProps,\n} from '@danske/sapphire-react';\nimport { ChevronDown, ChevronUp } from '@danske/sapphire-icons/react';\nimport { FocusableRefValue } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/filterDropdown/filterDropdown.module.css';\n\nexport interface FilterDropdownProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n Pick<\n PopoverTriggerProps,\n 'defaultOpen' | 'isOpen' | 'onOpenChange' | 'noMaxWidth'\n > {\n /**\n * \"Filter by\" label, shown inside the trigger button.\n */\n label: ReactNode;\n /**\n * Filter value, shown inside the trigger button. `null`, `undefined` and empty string are\n * considered as unset value.\n */\n value: ReactNode;\n /**\n * Filtering UI controls, rendered in a popover.\n */\n children: ReactNode;\n /**\n * Called when:\n * - `Enter` is pressed on form fields rendered inside the popover.\n * - 'Apply' button is pressed (if `hasApplyButton` is true)\n */\n onApply?: () => void;\n /**\n * Whether to show the 'Apply' button.\n */\n hasApplyButton?: boolean;\n /**\n * Called when 'Clear' button is pressed.\n */\n onClear?: () => void;\n /**\n * Whether the button is disabled.\n */\n isDisabled?: boolean;\n /**\n * Whether the 'Apply' button is disabled.\n */\n isApplyDisabled?: boolean;\n /**\n * Whether the 'Clear' button is hidden.\n */\n hideClearButton?: boolean;\n /**\n * Whether the 'Clear' button is disabled.\n */\n isClearDisabled?: boolean;\n /**\n * The label of the 'Clear' button.\n * @default \"Clear\"\n */\n clearButtonLabel?: ReactNode;\n /**\n * The label of the 'Apply' button.\n * @default \"Apply\"\n */\n applyButtonLabel?: ReactNode;\n /**\n * The size of the buttons incl. the trigger itself.\n * @default 'md'\n */\n buttonSize?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * A button with a dropdown, used for filtering UI.\n */\nexport function FilterDropdown({\n children,\n label,\n value,\n isDisabled = false,\n isApplyDisabled = false,\n isClearDisabled,\n isOpen: isOpenProp,\n applyButtonLabel = 'Apply',\n clearButtonLabel = 'Clear',\n hideClearButton = false,\n defaultOpen = false,\n hasApplyButton = false,\n noMaxWidth,\n onApply,\n onClear,\n onOpenChange,\n buttonSize = 'md',\n ...props\n}: FilterDropdownProps): JSX.Element {\n const triggerRef = useRef<FocusableRefValue>(null);\n const { styleProps } = useSapphireStyleProps(props);\n\n // We need to know if the dropdown is open or not, so we control the state here, still\n // allowing for both controlled and uncontrolled modes.\n const [isOpen, setIsOpen] = useControlledState(\n isOpenProp,\n defaultOpen,\n useEffectEvent(onOpenChange)\n );\n const hasValue = value != null && value !== '';\n const close = () => setIsOpen(false);\n const onSubmit = (e: FormEvent) => {\n e.preventDefault();\n onApply?.();\n close();\n };\n\n const applyButton = (\n <Button\n type=\"submit\"\n size={buttonSize}\n excludeFromTabOrder={!hasApplyButton}\n isDisabled={isApplyDisabled}\n >\n {applyButtonLabel}\n </Button>\n );\n\n return (\n <PopoverTrigger\n ref={triggerRef}\n placement=\"bottom left\"\n isOpen={isOpen}\n onOpenChange={setIsOpen}\n noMaxWidth={noMaxWidth}\n noPadding\n popoverContent={\n <form\n {...filterDOMProps(props, { global: true })}\n onSubmit={onSubmit}\n className={clsx(\n styles['sapphire-filter-dropdown'],\n styleProps.className\n )}\n style={{ ...styleProps.style }}\n >\n <div className={styles['sapphire-filter-dropdown__body']}>\n {children}\n </div>\n <div className={styles['sapphire-filter-dropdown__footer']}>\n <ButtonGroup align=\"right\">\n {!hideClearButton && (\n <Button\n size={buttonSize}\n variant=\"text\"\n onPress={() => {\n close();\n onClear?.();\n }}\n isDisabled={isClearDisabled ?? !hasValue}\n >\n {clearButtonLabel}\n </Button>\n )}\n {hasApplyButton ? (\n applyButton\n ) : (\n // The following is necessary to have the form submitted on \"Enter\", if there is more than one field\n <VisuallyHidden>{applyButton}</VisuallyHidden>\n )}\n </ButtonGroup>\n </div>\n </form>\n }\n >\n <ToggleButton\n icon={isOpen ? <ChevronUp /> : <ChevronDown />}\n iconAlign=\"right\"\n isSelected={hasValue}\n isDisabled={isDisabled}\n size={buttonSize}\n >\n {label}\n {value ? ': ' : ''}\n {value}\n </ToggleButton>\n </PopoverTrigger>\n );\n}\n","import React, { cloneElement, ReactElement, useRef } from 'react';\nimport {\n Flex,\n ListBoxProps,\n SapphireStyleProps,\n SearchFieldPropsWithRef,\n tokens,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { FilterDropdown, FilterDropdownProps } from '../..';\nimport { mergeRefs } from 'react-aria/mergeRefs';\nimport { useControlledState } from 'react-stately/useControlledState';\n\nexport interface SearchableSelectFilterProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n Omit<FilterDropdownProps, 'children'> {\n /**\n * The SearchField to search items with.\n */\n searchField: ReactElement<SearchFieldPropsWithRef<object>>;\n /**\n * The ListBox to select items from.\n */\n listBox: ReactElement<ListBoxProps<object>>;\n /**\n * The Button size of the trigger\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * A button with a dropdown, used for filtering UI.\n */\nexport function SearchableSelectFilter(\n props: SearchableSelectFilterProps\n): JSX.Element {\n const { searchField, listBox, size = 'md', ...otherProps } = props;\n const searchFieldRef = useRef<HTMLInputElement>(null);\n\n const searchFieldProps = searchField.props;\n const listBoxProps = listBox.props;\n\n const [searchQuery, setSearchQuery] = useControlledState(\n searchFieldProps?.value,\n '',\n searchFieldProps.onChange\n );\n\n if (\n listBoxProps.connectedInputRef &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'development'\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n 'The connectedInputRef prop on the ListBox in the SearchableSelectFilter component is not needed and will be ignored. The connectedInputRef is set automatically (to the passed SearchField) and should not be set manually.'\n );\n }\n\n const hasSelection =\n listBoxProps.selectedKeys === 'all' ||\n Array.from(listBoxProps.selectedKeys || []).length > 0;\n\n return (\n <FilterDropdown\n {...otherProps}\n noMaxWidth={otherProps.noMaxWidth ?? true}\n buttonSize={size}\n // Since useCollectionFocusProxy disables normal form submission behaviour on \"Enter\"\n // the apply button is the only way to submit, which is why we add it if an onApply function is passed\n hasApplyButton={Boolean(otherProps.onApply)}\n // In scenarios where selections are not applied immediately we want to allow cancelling\n // the filter selection via 'Clear' button as soon as at least 1 item is selected\n isClearDisabled={\n otherProps.isClearDisabled || (!hasSelection && !otherProps.value)\n }\n >\n <Flex flexDirection=\"column\" height=\"100%\">\n {cloneElement(searchField, {\n size: 'md',\n value: searchFieldProps.value || searchQuery,\n inputRef: mergeRefs(searchFieldRef, searchFieldProps.inputRef),\n width: searchFieldProps.width || '100%',\n marginBottom: searchFieldProps.marginBottom || tokens.size.spacingSm,\n onChange: setSearchQuery,\n })}\n {cloneElement(listBox, {\n connectedInputRef: searchFieldRef,\n selectionMode: listBoxProps.selectionMode || 'multiple',\n marginX: `calc(${tokens.size.spacingContainerHorizontalSm.value} * -1)`,\n hasScrollDividers: true,\n filter:\n // This is a way to also allow opting out of the internal filter with filter={undefined}\n // without us having to allow for more values on the ListBox filter prop\n 'filter' in listBoxProps\n ? listBoxProps.filter\n : (textValue: string) =>\n textValue.toLowerCase().includes(searchQuery.toLowerCase()),\n })}\n </Flex>\n </FilterDropdown>\n );\n}\n","import clsx from 'clsx';\nimport React from 'react';\nimport { getWrappedElement } from '@react-spectrum/utils';\nimport styles from '@danske/sapphire-css/components/flag/flag.module.css';\n\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\n\nexport type FlagProps = GlobalDomAttributes &\n SapphireStyleProps & {\n 'aria-label'?: string;\n /**\n * The size of the flag.\n * @default 'lg'\n */\n size?: 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n /**\n * Flags come in square or rounded shapes. Square flags are used for display purposes, ensuring a clean and consistent look.\n * Rounded flags are reserved for actionable elements like buttons or selectors, providing a more interactive and approachable feel.\n * @default false\n */\n rounded?: boolean;\n children: React.ReactNode;\n };\n\nexport const Flag = React.forwardRef(function Flag(\n { size = 'lg', rounded, 'aria-label': ariaLabel, ...props }: FlagProps,\n ref: React.Ref<HTMLSpanElement>\n) {\n useThemeCheck();\n\n const { styleProps } = useSapphireStyleProps(props);\n\n return React.cloneElement(getWrappedElement(props.children), {\n ref,\n role: 'img',\n ...(ariaLabel ? { 'aria-label': ariaLabel } : { 'aria-hidden': true }),\n className: clsx(styles['sapphire-flag'], styleProps.className, {\n [styles['sapphire-flag--xs']]: size === 'xs',\n [styles['sapphire-flag--sm']]: size === 'sm',\n [styles['sapphire-flag--md']]: size === 'md',\n [styles['sapphire-flag--lg']]: size === 'lg',\n [styles['sapphire-flag--xl']]: size === 'xl',\n [styles['sapphire-flag--rounded']]: rounded,\n }),\n style: styleProps.style,\n });\n});\n","import React, { ReactNode } from 'react';\nimport { useField } from 'react-aria/useField';\nimport {\n Field,\n Label,\n SapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { mergeProps } from 'react-aria/mergeProps';\n\nexport interface LabeledValueProps\n extends SapphireStyleProps,\n GlobalDomAttributes {\n children?: React.ReactNode;\n /**\n * A HelpButton element to place next to the label.\n */\n contextualHelp?: ReactNode;\n /**\n * The content to display as a label.\n */\n label: ReactNode;\n /**\n * Places the label either above (default) or on the left side of tags.\n * @default 'above'\n */\n labelPlacement?: 'above' | 'side';\n /**\n * @default 'lg'\n */\n size?: 'lg' | 'md';\n}\n\nexport function LabeledValue({\n children,\n contextualHelp,\n label,\n labelPlacement = 'above',\n size = 'lg',\n ...otherProps\n}: LabeledValueProps): React.JSX.Element {\n useThemeCheck();\n const { fieldProps } = useField({ label });\n\n return (\n <Field\n {...mergeProps(fieldProps, otherProps)}\n labelPlacement={labelPlacement}\n size={size}\n noDefaultWidth\n >\n <Field.Label>\n <Label contextualHelp={contextualHelp} size={size}>\n {label}\n </Label>\n </Field.Label>\n <Field.Control>{children}</Field.Control>\n </Field>\n );\n}\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","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","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","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","/**\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","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","import {\n useMemo,\n useCallback,\n RefObject,\n ReactNode,\n useRef,\n useLayoutEffect,\n useState,\n} from 'react';\nimport {\n getSeparators,\n parseNumericValue,\n formatNumberString,\n trimSymbol,\n extractSymbol,\n} from './formatHelpers';\nimport { calculateCursorPosition } from './cursorHelpers';\nimport { handleNumberFieldKeyDown } from './keyboardHelpers';\n\ninterface UseNumberFieldFormattingParams {\n inputRef: RefObject<HTMLInputElement>;\n formatter: Intl.NumberFormat;\n inputValue: string;\n prefix?: ReactNode;\n postfix?: ReactNode;\n onOriginalKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;\n onChange?: (value: number) => void;\n autoFormat: boolean;\n}\n\ninterface UseNumberFieldFormattingReturn {\n displayValue: string;\n extractedPrefix: ReactNode;\n extractedPostfix: ReactNode;\n handleInput: (e: React.FormEvent<HTMLInputElement>) => void;\n handleKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\n/**\n * Hook for number field formatting with locale-aware separators and cursor management.\n * Handles currency/unit extraction, number formatting, and maintains correct cursor position.\n * When autoFormat is false, returns original values without any computation.\n */\nexport function useNumberFieldFormatting({\n inputRef,\n formatter,\n inputValue,\n prefix,\n postfix,\n onOriginalKeyDown,\n onChange,\n autoFormat,\n}: UseNumberFieldFormattingParams): UseNumberFieldFormattingReturn {\n const { groupSeparator, decimalSeparator } = useMemo(\n () => getSeparators(formatter),\n [formatter]\n );\n\n const [formattedValue, setFormattedValue] = useState<string>('');\n\n // Extract and position currency/unit symbols\n const symbolInfo = useMemo(\n () => extractSymbol(formatter, prefix, postfix),\n [formatter, prefix, postfix]\n );\n\n const { extractedPrefix, extractedPostfix, symbol } = symbolInfo;\n\n // Track cursor position to restore after React updates the value\n const cursorPositionRef = useRef<number | null>(null);\n\n // Format the input value for display\n const displayValue = useMemo(() => {\n const numericValue = parseNumericValue(\n inputValue,\n decimalSeparator,\n formatter\n );\n if (numericValue === null) return inputValue;\n\n try {\n const trimmedValue = trimSymbol(inputValue, symbol) || inputValue;\n return autoFormat ? formattedValue || trimmedValue : trimmedValue;\n } catch {\n return inputValue;\n }\n }, [\n inputValue,\n symbol,\n formatter,\n decimalSeparator,\n autoFormat,\n formattedValue,\n ]);\n\n // Restore cursor position after value changes\n useLayoutEffect(() => {\n if (cursorPositionRef.current !== null && inputRef.current) {\n inputRef.current.setSelectionRange(\n cursorPositionRef.current,\n cursorPositionRef.current\n );\n cursorPositionRef.current = null;\n }\n }, [displayValue, inputRef]);\n\n // Handle input with formatting and cursor management\n const handleInput = useCallback(\n (e: React.FormEvent<HTMLInputElement>): void => {\n if (!autoFormat) return;\n\n const input = e.currentTarget;\n const { value, selectionStart } = input;\n const inputType = (e.nativeEvent as InputEvent).inputType || '';\n const shouldStrip = !!symbol;\n\n /**\n * Check if we're exceeding maximum decimal places when typing at the end.\n * For example, with max 2 decimals, having \"12,34|\" and typing \"5\" should be prevented.\n */\n //#region Prevent excess decimals\n const maxFractionDigits =\n formatter.resolvedOptions().maximumFractionDigits || 0;\n const decimalIndex = value.indexOf(decimalSeparator);\n\n if (decimalIndex !== -1 && selectionStart !== null) {\n // Count decimal digits in the new value\n const decimalPart = value\n .slice(decimalIndex + 1)\n .replace(new RegExp(`[^0-9]`, 'g'), '');\n const prevDecimalIndex = displayValue.indexOf(decimalSeparator);\n const prevDecimalLength =\n prevDecimalIndex !== -1\n ? displayValue.slice(prevDecimalIndex + 1).length\n : 0;\n\n // If we have more decimals than allowed and cursor was at the end of decimals, prevent and restore\n if (\n decimalPart.length > maxFractionDigits &&\n selectionStart > decimalIndex + 1 + prevDecimalLength\n ) {\n e.preventDefault();\n // Store cursor position to restore after React's update\n cursorPositionRef.current = decimalIndex + 1 + prevDecimalLength;\n return;\n }\n }\n //#endregion Prevent excess decimals\n\n const formattedValue = formatNumberString(\n value,\n formatter,\n decimalSeparator,\n shouldStrip,\n symbol\n );\n\n setFormattedValue(formattedValue);\n\n const numericValue = parseNumericValue(\n formattedValue,\n decimalSeparator,\n formatter\n );\n\n // Calculate and store cursor position for restoration after React's update\n if (\n formattedValue !== value &&\n formattedValue !== '' &&\n selectionStart !== null\n ) {\n const newCursorPosition = calculateCursorPosition(\n value,\n formattedValue,\n selectionStart,\n inputType,\n decimalSeparator,\n numericValue\n );\n\n cursorPositionRef.current = newCursorPosition;\n }\n\n if (numericValue !== null) {\n onChange?.(numericValue);\n }\n },\n [formatter, decimalSeparator, symbol, autoFormat, displayValue, onChange]\n );\n\n // Handle keydown for special key behaviors\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLInputElement>): void => {\n handleNumberFieldKeyDown({\n event: e,\n inputRef,\n groupSeparator,\n decimalSeparator,\n onOriginalKeyDown,\n });\n },\n [groupSeparator, decimalSeparator, inputRef, onOriginalKeyDown]\n );\n\n return {\n displayValue,\n extractedPrefix,\n extractedPostfix,\n handleInput,\n handleKeyDown,\n };\n}\n","import React, { RefObject } from 'react';\nimport {\n AriaNumberFieldProps,\n NumberFieldAria,\n useNumberField,\n} from 'react-aria/useNumberField';\nimport { useNumberFieldState } from 'react-stately/useNumberFieldState';\nimport { useLocale } from 'react-aria/I18nProvider';\n\nexport interface SapphireNumberFieldProps\n // TODO: when this is moved to `core`, we can replace the picked props with `ValueBasePropsKeys`\n extends Pick<\n AriaNumberFieldProps,\n | 'label'\n | 'isDisabled'\n | 'isRequired'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'incrementAriaLabel'\n | 'decrementAriaLabel'\n | 'onFocus'\n | 'onBlur'\n | 'formatOptions'\n | 'step'\n | 'minValue'\n | 'maxValue'\n | 'placeholder'\n | 'isReadOnly'\n | 'autoFocus'\n | 'onFocusChange'\n | 'onKeyUp'\n | 'onKeyDown'\n > {\n /**\n * Whether the input should render as having an error and an error message.\n * This also sets the appropriate `aria` attributes on the input.\n *\n * A `boolean` sets the error state.\n * A `ReactNode` sets the error state with an additional error message.\n *\n * **An error message is strongly recommended because an error should always have an explanation about how to fix it.**\n */\n error?: boolean | React.ReactNode;\n}\n\nexport const useSapphireNumberField = (\n { error, ...numberFieldProps }: SapphireNumberFieldProps,\n ref: RefObject<HTMLInputElement>\n): NumberFieldAria & { state: ReturnType<typeof useNumberFieldState> } => {\n const { locale } = useLocale();\n const numberFieldState = useNumberFieldState({\n ...numberFieldProps,\n locale,\n });\n const numberFieldAria = useNumberField(\n {\n ...numberFieldProps,\n validationState:\n error === false || error === undefined ? undefined : 'invalid',\n },\n numberFieldState,\n ref\n );\n\n return { ...numberFieldAria, state: numberFieldState };\n};\n","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","import React, { ReactNode, useContext, useState } from 'react';\nimport { ThemeVariant } from '@danske/sapphire-react';\nimport { useControlledState } from 'react-stately/useControlledState';\n\nexport type SecondarySidebarContent = {\n header: ReactNode;\n body: ReactNode;\n} | null;\n\nexport interface SecondarySidebarContextValue {\n content: SecondarySidebarContent;\n setContent: (content: SecondarySidebarContent) => void;\n openedId: string | null;\n setOpenedId: (id: string | null) => void;\n themeVariant: ThemeVariant | undefined;\n}\n\nexport const SecondarySidebarContext =\n React.createContext<SecondarySidebarContextValue | null>(null);\n\nexport const useSecondarySidebarContext = (): SecondarySidebarContextValue => {\n const context = useContext(SecondarySidebarContext);\n if (context) {\n return context;\n }\n throw new Error('This should be rendered inside a <Sidebar />.');\n};\n\nexport const SecondarySidebarProvider = ({\n openedId,\n defaultOpenedId,\n onOpenedIdChange,\n themeVariant,\n children,\n}: {\n openedId?: string | null;\n defaultOpenedId?: string | null;\n onOpenedIdChange?: (id: string | null) => void;\n themeVariant?: ThemeVariant;\n children: ReactNode;\n}) => {\n const context = useContext(SecondarySidebarContext);\n\n const [secondarySidebarId, setSecondarySidebarId] = useControlledState<\n string | null\n >(openedId, defaultOpenedId ?? null, onOpenedIdChange);\n\n const [content, setContent] = useState<SecondarySidebarContent>(null);\n\n return (\n <SecondarySidebarContext.Provider\n value={{\n openedId: context?.openedId ?? secondarySidebarId,\n setOpenedId: context?.setOpenedId ?? setSecondarySidebarId,\n content: context?.content ?? content,\n setContent: context?.setContent ?? setContent,\n themeVariant: themeVariant ?? context?.themeVariant,\n }}\n >\n {children}\n </SecondarySidebarContext.Provider>\n );\n};\n","import { useControlledState } from 'react-stately/useControlledState';\nimport { BreakpointKey, useMatchedBreakpoints } from '@danske/sapphire-react';\nimport React, { ReactNode, useContext } from 'react';\n\nexport interface ResponsiveSidebarContextValue {\n isPanelOpen: boolean;\n setPanelOpen: (open: boolean) => void;\n collapsed: boolean | BreakpointKey | undefined;\n}\n\nexport const ResponsiveSidebarContext =\n React.createContext<ResponsiveSidebarContextValue | null>(null);\n\nexport function useResponsiveSidebarContext() {\n return useContext(ResponsiveSidebarContext);\n}\n\n/**\n * Hook to determine if the sidebar should be collapsed.\n * Returns true if collapsed, false if expanded, or null if not in responsive mode.\n */\nexport function useIsSidebarCollapsed(): boolean | null {\n const context = useContext(ResponsiveSidebarContext);\n const matchedBreakpoints: string[] = useMatchedBreakpoints();\n\n if (!context) {\n return null;\n }\n\n const { collapsed } = context;\n\n // If collapsed is a boolean, use it directly\n if (typeof collapsed === 'boolean') {\n return collapsed;\n }\n\n // If collapsed is a breakpoint string, check if we're below that breakpoint\n if (typeof collapsed === 'string') {\n return !matchedBreakpoints.includes(collapsed);\n }\n\n // If collapsed is undefined, default to 'md' breakpoint behavior\n return !matchedBreakpoints.includes('md');\n}\n\nexport const ResponsiveSidebarProvider = ({\n collapsed,\n isPanelOpen,\n defaultIsPanelOpen,\n onPanelOpenChange,\n children,\n}: {\n /**\n * Controls whether the sidebar is collapsed.\n * - When `true`: sidebar is always collapsed (shows as panel)\n * - When `false`: sidebar is always expanded (shows as sidebar)\n * - When a breakpoint string (e.g., 'md', 'lg'): automatically collapses below that breakpoint\n * - When `undefined`: defaults to 'md' breakpoint behavior (collapses below medium screens)\n * @default undefined (equivalent to 'md')\n */\n collapsed?: boolean | BreakpointKey;\n\n /**\n * If the sidebar panel is open (controlled)\n */\n isPanelOpen?: boolean;\n\n /**\n * The default state of the panel (uncontrolled)\n */\n defaultIsPanelOpen?: boolean;\n\n /**\n * Callback for when the state of the panel changes\n */\n onPanelOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}) => {\n const [isOpen, setOpen] = useControlledState<boolean>(\n isPanelOpen,\n defaultIsPanelOpen ?? false,\n onPanelOpenChange\n );\n\n return (\n <ResponsiveSidebarContext.Provider\n value={{\n isPanelOpen: isOpen,\n setPanelOpen: setOpen,\n collapsed,\n }}\n >\n {children}\n </ResponsiveSidebarContext.Provider>\n );\n};\n","import React, { ReactNode, useEffect } from 'react';\nimport {\n IconButton,\n ModalLayout,\n Panel,\n PanelProps,\n tokens,\n View,\n} from '@danske/sapphire-react';\nimport { ChevronLeft } from '@danske/sapphire-icons/react';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\nimport {\n useIsSidebarCollapsed,\n useResponsiveSidebarContext,\n} from './ResponsiveSidebarContext';\n\nexport type SidebarPanelProps = Omit<\n PanelProps,\n 'isOpen' | 'size' | 'direction'\n> & { header: ReactNode };\n\nexport const SidebarPanel = ({\n children,\n header,\n ...props\n}: SidebarPanelProps) => {\n const { openedId, setOpenedId, content } = useSecondarySidebarContext();\n const responsiveContext = useResponsiveSidebarContext();\n\n if (!responsiveContext) {\n throw new Error(\n '<SidebarPanel> must be rendered inside a <Sidebar.ResponsiveProvider>'\n );\n }\n\n const { isPanelOpen, setPanelOpen } = responsiveContext;\n const isCollapsed = useIsSidebarCollapsed();\n\n useEffect(() => {\n if (!isCollapsed) {\n // if breakpoint changes, we want to close the panel until opened manually again\n setPanelOpen(false);\n }\n }, [isCollapsed]);\n\n return (\n <Panel\n {...props}\n isOpen={isPanelOpen}\n onClose={() => setPanelOpen(false)}\n onCloseTransitionDone={() => setOpenedId(null)}\n alignLeft\n isDismissable\n width={320}\n >\n <ModalLayout\n header={\n <ModalLayout.Header\n heading={openedId === null ? header : content?.header}\n backButton={\n openedId !== null && (\n <IconButton\n size=\"md\"\n aria-label=\"Back\"\n variant=\"tertiary\"\n marginLeft={`calc(-1 * ${tokens.size.spacingSm})`}\n onPress={() => setOpenedId(null)}\n >\n <ChevronLeft />\n </IconButton>\n )\n }\n />\n }\n body={\n <ModalLayout.Body\n noPadding\n UNSAFE_style={{\n paddingLeft: tokens.size.spacingMd.value,\n paddingRight: tokens.size.spacingMd.value,\n }}\n >\n <>\n <View isHidden={openedId !== null}>{children}</View>\n {openedId && content?.body}\n </>\n </ModalLayout.Body>\n }\n />\n </Panel>\n );\n};\n\nexport const SidebarPanelTrigger = ({\n children,\n}: {\n children: (triggerProps: any) => JSX.Element;\n}) => {\n const context = useResponsiveSidebarContext();\n if (!context) {\n throw new Error(\n '<Sidebar.PanelTrigger> should be rendered inside a <Sidebar.ResponsiveProvider>'\n );\n }\n const isCollapsed = useIsSidebarCollapsed();\n const panelTriggerProps = {\n onPress: () => {\n context.setPanelOpen(true);\n },\n };\n\n return isCollapsed ? children(panelTriggerProps) : null;\n};\n","import { useResponsiveSidebarContext } from './ResponsiveSidebarContext';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\n\n/**\n * Returns props to be spread on different components that make the Sidebar.\n */\nexport const useSidebar = () => {\n const { openedId, setOpenedId } = useSecondarySidebarContext();\n const responsiveContext = useResponsiveSidebarContext();\n const { isPanelOpen, setPanelOpen } = responsiveContext\n ? responsiveContext\n : { isPanelOpen: false, setPanelOpen: () => {} };\n\n return {\n sidebarProps: { onBlurWithin: () => setOpenedId(null) },\n itemProps: {\n onPress: () => {\n setPanelOpen(false);\n if (!isPanelOpen) {\n /* If panel is open, let the secondary sidebar get closed\n * when the closing transition is done. See `panelProps`\n */\n setOpenedId(null);\n }\n },\n },\n getExpandableItemProps: (id: string) => ({\n onPress: () => setOpenedId(openedId === id ? null : id),\n }),\n secondarySidebarProps: {\n onClose: () => setOpenedId(null),\n },\n };\n};\n","import { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport {\n useThemeCheck,\n useSapphireStyleProps,\n SapphireStyleProps,\n ThemeRoot,\n ThemeVariant,\n} from '@danske/sapphire-react';\nimport React from 'react';\nimport { DOMProps } from '@react-types/shared';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { FocusWithinProps, useFocusWithin } from 'react-aria/useFocusWithin';\nimport { SidebarPanel } from './Panel';\nimport { useSidebar } from './useSidebar';\nimport { SecondarySidebarProvider } from './SecondarySidebarContext';\nimport {\n useIsSidebarCollapsed,\n useResponsiveSidebarContext,\n} from './ResponsiveSidebarContext';\n\nexport type SidebarProps = DOMProps &\n SapphireStyleProps & {\n /**\n * Shorthand to wrap the sidebar in a ThemeRoot with a different theme variant\n */\n themeVariant?: ThemeVariant;\n\n /**\n * The theme variant for the overflow sidebar\n */\n secondarySidebarThemeVariant?: ThemeVariant;\n\n /**\n * Callback for when the sidebar's elements lose focus.\n * Useful to know when to close the overflow sidebar.\n */\n onBlurWithin?: FocusWithinProps['onBlurWithin'];\n\n /**\n * Callback for when one of the sidebar's elements first gains focus.\n */\n onFocusWithin?: FocusWithinProps['onFocusWithin'];\n\n /**\n * Callback for when one of the sidebar's elements loses or gains focus\n */\n onFocusWithinChange?: FocusWithinProps['onFocusWithinChange'];\n\n /**\n * Whether the overflow sidebar should close when all sidebar's elements\n * lost focus\n * @default true\n */\n closeOnBlurWithin?: boolean;\n\n /**\n * The header of the sidebar\n */\n header: ReactNode;\n\n /**\n * The header of the sidebar for small screens, when the sidebar is\n * rendered as a panel\n */\n panelHeader?: ReactNode;\n\n /**\n * The id of the opened secondary sidebar (controlled)\n */\n openedSecondarySidebar?: string | null;\n\n /**\n * The id of the secondary sidebar opened by default (uncontrolled)\n */\n defaultOpenedSecondarySidebar?: string | null;\n\n /**\n * Callback for when the secondary sidebar opens or closes\n */\n onSecondarySidebarChange?: (id: string | null) => void;\n\n children?: ReactNode;\n };\n\n/**\n * Sidebar component for the site's main navigation.\n * Takes the height of the container.\n *\n * The default recommended way to use it is in the example below. But each part\n * can be replaced with a custom implementation.\n *\n * **Example:**\n * ```tsx\n * <Sidebar\n * header={\n * <Sidebar.Header>\n * header\n * </Sidebar.Header>\n * }\n * >\n * <Sidebar.Body>\n * <Sidebar.List>\n * ...\n * </Sidebar.List>\n * </Sidebar.Body>\n * </Sidebar>\n * ```\n */\nexport const Sidebar = ({\n themeVariant,\n openedSecondarySidebar,\n defaultOpenedSecondarySidebar,\n onSecondarySidebarChange,\n secondarySidebarThemeVariant,\n children,\n ...props\n}: SidebarProps) => {\n useThemeCheck();\n\n return (\n <SecondarySidebarProvider\n openedId={openedSecondarySidebar}\n defaultOpenedId={defaultOpenedSecondarySidebar}\n onOpenedIdChange={onSecondarySidebarChange}\n themeVariant={secondarySidebarThemeVariant}\n >\n <WithThemeRoot themeVariant={themeVariant}>\n <SidebarContent {...props}>{children}</SidebarContent>\n </WithThemeRoot>\n </SecondarySidebarProvider>\n );\n};\n\nconst SidebarContent = ({\n onBlurWithin,\n onFocusWithin,\n onFocusWithinChange,\n closeOnBlurWithin = true,\n header,\n panelHeader,\n children,\n ...props\n}: SidebarProps) => {\n const { styleProps } = useSapphireStyleProps(props);\n const { sidebarProps } = useSidebar();\n\n const { focusWithinProps } = useFocusWithin(\n mergeProps(\n {\n onBlurWithin,\n onFocusWithin,\n onFocusWithinChange,\n },\n closeOnBlurWithin ? sidebarProps : {}\n )\n );\n\n const responsiveSidebarContext = useResponsiveSidebarContext();\n const isCollapsed = useIsSidebarCollapsed();\n\n return (\n <>\n {!isCollapsed && (\n <div\n {...styleProps}\n {...filterDOMProps(props, { global: true })}\n {...focusWithinProps}\n className={clsx(styles['sapphire-sidebar'])}\n tabIndex={-1 /* sidebar must be focusable but not tabbable */}\n >\n {header}\n {children}\n </div>\n )}\n {responsiveSidebarContext && (\n <SidebarPanel header={panelHeader}>{children}</SidebarPanel>\n )}\n </>\n );\n};\n\nconst WithThemeRoot = ({\n children,\n themeVariant,\n}: {\n themeVariant?: ThemeVariant;\n children: ReactNode;\n}) =>\n themeVariant ? (\n <ThemeRoot\n variant={themeVariant}\n noSurface\n height=\"100%\"\n width=\"min-content\"\n >\n {children}\n </ThemeRoot>\n ) : (\n <>{children}</>\n );\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport { IconButton, IconButtonProps } from '@danske/sapphire-react';\nimport { CloseLarge } from '@danske/sapphire-icons/react';\n\nexport interface SidebarHeaderProps extends DOMProps {\n children: ReactNode;\n /**\n * Props for the close button\n * If none provided, close button won't show\n */\n closeButtonProps?: Omit<\n IconButtonProps<'button'>,\n 'children' | 'aria-label' | 'aria-hidden'\n >;\n}\n\nexport const SidebarHeader = ({\n children,\n closeButtonProps,\n ...props\n}: SidebarHeaderProps): React.JSX.Element => {\n return (\n <div\n {...filterDOMProps(props)}\n className={clsx(styles['sapphire-sidebar__header'])}\n >\n {children}\n {closeButtonProps && (\n <IconButton {...closeButtonProps} aria-label=\"Close\">\n <CloseLarge />\n </IconButton>\n )}\n </div>\n );\n};\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport buttonStyles from '@danske/sapphire-css/components/button/button.module.css';\nimport { Button, ButtonProps } from '@danske/sapphire-react';\nimport { FocusableRef } from '@react-types/shared';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useSidebar } from './useSidebar';\n\nexport type SidebarItemProps = Omit<\n ButtonProps<'a'>,\n 'variant' | 'size' | 'elementType'\n> & {\n /**\n * If the link is currently active\n */\n isActive?: boolean;\n children?: ReactNode;\n};\n\nexport const SidebarItem = React.forwardRef(function SidebarItem(\n { isActive, children, ...props }: SidebarItemProps,\n ref: FocusableRef<HTMLAnchorElement>\n): React.JSX.Element {\n const { itemProps } = useSidebar();\n\n return (\n <li className={clsx(styles['sapphire-sidebar__nav-item'])}>\n <Button\n ref={ref}\n variant=\"tertiary\"\n elementType=\"a\"\n aria-current={isActive ? 'page' : undefined}\n {...mergeProps(props as ButtonProps<'a'>, itemProps)}\n UNSAFE_className={clsx(\n buttonStyles['sapphire-button--stretch-left-align'],\n { [buttonStyles['sapphire-button--selected']]: isActive }\n )}\n >\n {children}\n </Button>\n </li>\n );\n});\n","import React, { ReactNode, useEffect, useLayoutEffect, useRef } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport buttonStyles from '@danske/sapphire-css/components/button/button.module.css';\nimport { Button, ButtonProps, ThemeVariant } from '@danske/sapphire-react';\nimport { FocusScope } from 'react-aria/FocusScope';\nimport { FocusableRef } from '@react-types/shared';\nimport { Transition } from 'react-transition-group';\nimport { Sidebar } from '..';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useId } from 'react-aria/useId';\nimport { useSidebar } from './useSidebar';\nimport { useSecondarySidebarContext } from './SecondarySidebarContext';\nimport { useIsSidebarCollapsed } from './ResponsiveSidebarContext';\n\nexport type SidebarExpandableItemProps = Omit<\n ButtonProps<'button'>,\n 'variant' | 'size' | 'elementType'\n> & {\n /**\n * If the link is currently active\n */\n isActive?: boolean;\n\n /**\n * The id of the group.\n * Used in `onSecondarySidebarChange` or when the sidebar is controlled\n */\n id?: string;\n\n /**\n * Heading used for secondary sidebar\n */\n header: ReactNode;\n\n /**\n * Subitems (secondary sidebar)\n */\n body: ReactNode;\n children?: ReactNode;\n};\n\nexport const SidebarExpandableItem = React.forwardRef(\n function SidebarExpandableItem(\n {\n id,\n isActive,\n body,\n header,\n children,\n ...props\n }: SidebarExpandableItemProps,\n ref: FocusableRef<HTMLAnchorElement>\n ): React.JSX.Element {\n const { openedId, setContent, themeVariant } = useSecondarySidebarContext();\n const isCollapsed = useIsSidebarCollapsed();\n const { getExpandableItemProps, secondarySidebarProps } = useSidebar();\n const itemId = useId(id);\n const isOpen = openedId === itemId;\n\n useLayoutEffect(() => {\n if (isOpen) {\n setContent({ header, body });\n }\n }, [isOpen]);\n\n return (\n <li className={clsx(styles['sapphire-sidebar__nav-item'])}>\n <Button\n variant=\"tertiary\"\n aria-current={isActive || undefined}\n ref={ref}\n {...mergeProps(\n getExpandableItemProps(itemId),\n props as ButtonProps<'button'>\n )}\n UNSAFE_className={clsx(\n buttonStyles['sapphire-button--stretch-left-align'],\n {\n [buttonStyles['sapphire-button--selected']]: isActive && !isOpen,\n [buttonStyles['is-active']]: isOpen,\n }\n )}\n >\n {children}\n </Button>\n <SecondarySidebar\n isOpen={isOpen && !isCollapsed}\n header={header}\n themeVariant={themeVariant}\n {...secondarySidebarProps}\n >\n {body}\n </SecondarySidebar>\n </li>\n );\n }\n);\n\nconst SecondarySidebar = ({\n isOpen,\n onClose,\n onCloseTransitionDone,\n themeVariant,\n header,\n children,\n}: {\n isOpen: boolean;\n onClose?: () => void;\n onCloseTransitionDone?: () => void;\n themeVariant?: ThemeVariant;\n header: ReactNode;\n children: ReactNode;\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose?.();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onClose]);\n\n return (\n <Transition\n in={isOpen}\n mountOnEnter\n nodeRef={ref}\n unmountOnExit\n onExited={onCloseTransitionDone}\n timeout={200}\n >\n {(transitionState) => (\n <div\n ref={ref}\n className={clsx(styles['sapphire-sidebar__secondary-container'], {\n [styles['sapphire-sidebar--slide-in']]: true,\n [styles['sapphire-sidebar--slide-out']]:\n transitionState === 'exiting',\n })}\n >\n <FocusScope restoreFocus autoFocus>\n <Sidebar\n themeVariant={themeVariant}\n closeOnBlurWithin={\n false /* no focus management on nested sidebars */\n }\n header={\n <Sidebar.Header\n closeButtonProps={{\n onPress: () => onClose?.(),\n }}\n >\n {header}\n </Sidebar.Header>\n }\n panelHeader={null}\n >\n {children}\n </Sidebar>\n </FocusScope>\n </div>\n )}\n </Transition>\n );\n};\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n} from '@danske/sapphire-react';\nimport { useListBoxSection } from 'react-aria/useListBox';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\n\nexport type SidebarSectionProps = DOMProps &\n SapphireStyleProps & {\n /**\n * Section title\n * If not provided, please pass the `aria-label`\n */\n title?: string;\n\n /**\n * Section aria title\n */\n 'aria-label'?: string;\n\n children?: ReactNode;\n };\n\nexport const SidebarSection = ({\n title,\n 'aria-label': label,\n children,\n ...props\n}: SidebarSectionProps) => {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const { itemProps, headingProps, groupProps } = useListBoxSection({\n heading: title,\n 'aria-label': label,\n });\n\n return (\n <>\n <li\n role=\"separator\"\n className={clsx(styles['sapphire-sidebar__separator'])}\n ></li>\n <li\n {...itemProps}\n {...styleProps}\n {...filterDOMProps(props, { global: true })}\n >\n {title && (\n <div\n {...headingProps}\n className={clsx(styles['sapphire-sidebar__section-header'])}\n >\n {title}\n </div>\n )}\n <ul\n {...groupProps}\n className={clsx(styles['sapphire-sidebar__section'])}\n >\n {children}\n </ul>\n </li>\n </>\n );\n};\n","import React, { ReactNode, useRef } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\nimport { useScrollCheck } from '@danske/sapphire-react';\n\nexport interface SidebarBodyProps extends DOMProps {\n /**\n * Wrapping element type.\n * @default 'nav'\n */\n elementType?: string;\n children?: ReactNode;\n}\n\nexport const SidebarBody = ({\n elementType = 'nav',\n children,\n ...props\n}: SidebarBodyProps): React.JSX.Element => {\n const RootNode = elementType as any;\n const sidebarBody = useRef<HTMLElement>(null);\n const { isScrolled, scrollCheckProps } = useScrollCheck(sidebarBody);\n\n return (\n <RootNode\n ref={sidebarBody}\n tabIndex={\n -1 /* Some browsers will make this focusable because it overflows */\n }\n className={clsx(styles['sapphire-sidebar__body'], {\n [styles['sapphire-sidebar__body--scrolled']]: isScrolled,\n })}\n {...filterDOMProps(props, { global: true })}\n {...scrollCheckProps}\n >\n {children}\n </RootNode>\n );\n};\n","import React, { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport { DOMProps } from '@react-types/shared';\nimport styles from '@danske/sapphire-css/components/sidebar/sidebar.module.css';\n\nexport interface SidebarListProps extends DOMProps {\n /**\n * Wrapping element type.\n * @default 'ul'\n */\n elementType?: 'ul' | 'ol';\n children?: ReactNode;\n}\n\nexport const SidebarList = ({\n elementType = 'ul',\n children,\n ...props\n}: SidebarListProps): React.JSX.Element => {\n const RootNode = elementType as any;\n\n return (\n <RootNode\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-sidebar__nav-list'])}\n >\n {children}\n </RootNode>\n );\n};\n","import { Sidebar } from './src/Sidebar';\nimport { SidebarHeader } from './src/Header';\nimport { SidebarItem } from './src/Item';\nimport { SidebarExpandableItem } from './src/ExpandableItem';\nimport { SidebarSection } from './src/Section';\nimport { SidebarBody } from './src/Body';\nimport { SidebarList } from './src/List';\nimport { ResponsiveSidebarProvider } from './src/ResponsiveSidebarContext';\nimport { SidebarPanelTrigger } from './src/Panel';\n\nconst _Sidebar = Object.assign(Sidebar, {\n ResponsiveProvider: ResponsiveSidebarProvider,\n Header: SidebarHeader,\n Body: SidebarBody,\n List: SidebarList,\n Item: SidebarItem,\n ExpandableItem: SidebarExpandableItem,\n Section: SidebarSection,\n PanelTrigger: SidebarPanelTrigger,\n});\n\nexport { _Sidebar as Sidebar };\nexport { type SidebarProps } from './src/Sidebar';\nexport { type SidebarItemProps } from './src/Item';\nexport { type SidebarExpandableItemProps } from './src/ExpandableItem';\nexport { type SidebarSectionProps } from './src/Section';\nexport { type SidebarBodyProps } from './src/Body';\nexport { type SidebarListProps } from './src/List';\nexport { type SidebarHeaderProps } from './src/Header';\n","import React from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/progressIndicator/progressIndicator.module.css';\nimport {\n SapphireStyleProps,\n useThemeCheck,\n useSapphireStyleProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { useProgressBar } from 'react-aria/useProgressBar';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport type ProgressIndicatorProps = {\n /**\n * The maximum value for the progress bar. Will be used as:\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-valuemax\n *\n * @default 100\n */\n maxValue?: number;\n\n /**\n * The current value of the progress bar. Will be used as:\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-valuenow\n */\n value: number;\n\n /**\n * Defines how many segments the progress bar will have.\n *\n * @default 1\n */\n segments?: number;\n\n /**\n * Human-readable text alternative for the current value of the progress bar. Will be used as:\n * https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Attributes/aria-valuetext\n */\n 'aria-valuetext'?: string;\n} & SapphireStyleProps &\n GlobalDomAttributes &\n ({ 'aria-labelledby': string } | { 'aria-label': string });\n\n/**\n * When users need a visual representation of how far along a process or operation is, either as a continuous bar or divided into discrete segments.\n */\nexport const ProgressIndicator = (\n props: ProgressIndicatorProps\n): JSX.Element => {\n const {\n maxValue = 100,\n value: realValue,\n segments = 1,\n 'aria-valuetext': ariaValueText,\n } = props;\n\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n const { progressBarProps } = useProgressBar({\n ...props,\n minValue: 0,\n valueLabel: ariaValueText,\n });\n\n const minValue = 0;\n\n const value = Math.min(Math.max(realValue, minValue), maxValue);\n const widthPercentage = (value / maxValue) * 100;\n\n return (\n <div\n {...filterDOMProps(props, { global: true })}\n className={clsx(styles['sapphire-progress'])}\n >\n <div\n {...progressBarProps}\n className={styles['sapphire-progress--indicator']}\n style={{ ...styleProps, width: `${widthPercentage}%` }}\n aria-label={'aria-label' in props ? props['aria-label'] : undefined}\n aria-labelledby={\n 'aria-labelledby' in props ? props['aria-labelledby'] : undefined\n }\n />\n {segments > 1 && (\n <div className={styles['sapphire-progress--segments']}>\n {Array.from({ length: segments }, (_, index) => (\n <span key={index}></span>\n ))}\n </div>\n )}\n </div>\n );\n};\n","import { ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/slider/slider.module.css';\nimport {\n useThemeCheck,\n useSapphireStyleProps,\n Label,\n SapphireStyleProps,\n Field,\n FieldProps,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport {\n Slider as RACSlider,\n SliderProps as RACSliderProps,\n SliderThumb as RACSliderThumb,\n SliderThumbProps as RACSliderThumbProps,\n SliderTrack as RACSliderTrack,\n} from 'react-aria-components';\nimport React from 'react';\n\nexport type SliderProps = {\n label?: ReactNode;\n /**\n * A note to show below the slider.\n * Use {@Link Slider.Note} to render the note.\n */\n note?: ReactNode;\n} & SapphireStyleProps &\n GlobalDomAttributes &\n Pick<FieldProps, 'labelPlacement'> &\n Pick<\n RACSliderProps<number>, // We're only supporting sliders with one end\n | 'isDisabled'\n | 'minValue'\n | 'maxValue'\n | 'step'\n | 'value'\n | 'defaultValue'\n | 'aria-label'\n | 'onChange'\n | 'onChangeEnd'\n > &\n Pick<RACSliderThumbProps, 'name'>;\n\n/**\n * Lets users select a single numeric value within a defined range by dragging\n * a thumb along a track. Use it when precise value entry is less important than quick,\n * visual range selection (e.g. volume, brightness, or filter thresholds).\n */\nexport const Slider = ({\n label,\n labelPlacement = 'above',\n note,\n name,\n ...props\n}: SliderProps): JSX.Element => {\n useThemeCheck();\n const { styleProps } = useSapphireStyleProps(props);\n\n return (\n <Field {...styleProps} labelPlacement={labelPlacement}>\n <Field.Context>\n {label && (\n <Field.Label>\n <Label>{label}</Label>\n </Field.Label>\n )}\n\n <Field.Control>\n <RACSlider {...props} style={{ height: '100%' }}>\n <div className={clsx(styles['sapphire-slider'])} role=\"slider\">\n <RACSliderTrack\n className={({ isDisabled }) =>\n clsx(styles['sapphire-slider__track'], {\n [styles['is-disabled']]: isDisabled,\n })\n }\n >\n {({ state }) => (\n <>\n <div\n className={clsx(\n styles['sapphire-slider__track-remaining']\n )}\n />\n <div\n className={clsx(styles['sapphire-slider__track-fill'])}\n style={{ width: state.getThumbPercent(0) * 100 + '%' }}\n />\n <RACSliderThumb\n name={name}\n className={(state) =>\n clsx(styles['sapphire-slider__thumb'], {\n [styles['is-focus']]: state.isFocusVisible,\n })\n }\n style={({ state }) => {\n // Pad the thumb position, so it doesn't go over the track\n const percent = Math.min(\n 3 + state.getThumbPercent(0) * 94,\n 100\n );\n return {\n left: `${percent}%`,\n };\n }}\n />\n </>\n )}\n </RACSliderTrack>\n </div>\n </RACSlider>\n </Field.Control>\n\n {note && <Field.Footer>{note}</Field.Footer>}\n </Field.Context>\n </Field>\n );\n};\n","import { Field } from '@danske/sapphire-react';\nimport { Slider } from './src/Slider';\n\nconst _Slider = Object.assign(Slider, {\n Note: Field.Note,\n});\n\nexport { _Slider as Slider };\nexport { type SliderProps } from './src/Slider';\n","import React, { useRef } from 'react';\nimport clsx from 'clsx';\nimport { AriaButtonProps, useButton } from 'react-aria/useButton';\nimport { useHover } from 'react-aria/useHover';\nimport { useTag } from 'react-aria/useTagGroup';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { mergeRefs } from 'react-aria/mergeRefs';\nimport type { ListState } from 'react-stately/useListState';\nimport type { FocusableElement, Node } from '@react-types/shared';\n\nimport { Icon, useThemeCheck, TooltipIfNeeded } from '@danske/sapphire-react';\nimport { Close, Error } from '@danske/sapphire-icons/react';\nimport styles from '@danske/sapphire-css/components/tag/tag.module.css';\nimport { FocusRing } from 'react-aria/FocusRing';\n\nexport interface TagProps<T> {\n /**\n * Object representing the tag. Contains relevant information about the tag.\n */\n item: Node<T>;\n /**\n * State for TagGroup, returned by `useListState`\n */\n state: ListState<T>;\n /**\n * Shows error icon.\n * @default 'false'\n */\n hasError?: boolean;\n /**\n * Control whether the tag is removable or not.\n * This behavior is overridden to `false` if the tag is disabled.\n *\n * @default false\n */\n allowsRemoving?: boolean;\n}\n\nexport function Tag<T>(props: TagProps<T>): React.JSX.Element {\n useThemeCheck();\n const { hasError = false, item, state } = props;\n const ref = useRef<HTMLDivElement>(null);\n const {\n gridCellProps,\n isDisabled,\n isFocused,\n isPressed,\n removeButtonProps,\n rowProps: { onKeyDown, ...rowProps },\n ...otherProps\n } = useTag(props, state, ref);\n const { hoverProps, isHovered } = useHover({ isDisabled });\n /* hasAction prop is passed when onAction is present, we are using it to set the hover and action classes.\n The workaround below is made because AriaTagProps Omit's hasAction to avoid typecheck error */\n const hasAction = (otherProps as any).hasAction;\n\n return (\n <TooltipIfNeeded<HTMLDivElement> title={item.rendered}>\n {(tooltipRef, tooltipProps) => {\n const { ref: tooltipTargetRef, ...restTooltipProps } =\n tooltipProps || {};\n return (\n <FocusRing focusRingClass={styles['is-focus']}>\n <div\n ref={mergeRefs(ref, tooltipTargetRef)}\n {...mergeProps(\n {\n onKeyDown: (e: React.KeyboardEvent<FocusableElement>) => {\n /* We are removing Space key interaction and prevent default behavior to avoid isPressed prop being set\n as we do not want to apply is-active class on \"Space\" interaction when having actionable tags with onAction or link */\n if (e.key !== ' ') {\n onKeyDown?.(e);\n } else {\n e.preventDefault();\n }\n },\n },\n rowProps,\n hoverProps,\n restTooltipProps\n )}\n className={clsx(\n styles['sapphire-tag'],\n styles['js-focus'],\n styles['js-hover'],\n {\n [styles['sapphire-tag--actionable']]: hasAction,\n [styles['is-active']]: hasAction && isPressed,\n [styles['is-hover']]: hasAction && isHovered,\n [styles['is-disabled']]: isDisabled,\n }\n )}\n {...(hasError ? { 'aria-invalid': true } : {})}\n >\n <div\n {...gridCellProps}\n className={styles['sapphire-tag__content']}\n >\n {hasError && !isDisabled && <IconError />}\n <span\n ref={tooltipRef as React.Ref<HTMLSpanElement>}\n className={styles['sapphire-tag__label']}\n >\n {item.rendered}\n </span>\n {!isDisabled && props.allowsRemoving && (\n <RemoveButton {...(removeButtonProps as AriaButtonProps)} />\n )}\n </div>\n </div>\n </FocusRing>\n );\n }}\n </TooltipIfNeeded>\n );\n}\n\nfunction RemoveButton(removeButtonProps: AriaButtonProps) {\n const buttonRef = useRef(null);\n const { buttonProps } = useButton(removeButtonProps, buttonRef);\n return (\n <button\n {...buttonProps}\n className={clsx(styles['sapphire-tag__button'], styles['js-focus'])}\n >\n <Icon size=\"sm\">\n <Close />\n </Icon>\n </button>\n );\n}\n\nconst IconError = () => {\n return (\n <span className={clsx(styles['sapphire-tag__error-icon'])}>\n <Icon size=\"sm\">\n <Error />\n </Icon>\n </span>\n );\n};\n","import React, { Key, ReactNode, useRef } from 'react';\nimport { useTagGroup } from 'react-aria/useTagGroup';\nimport { useListState } from 'react-stately/useListState';\nimport {\n AriaLabelingProps,\n CollectionBase,\n DOMProps,\n} from '@react-types/shared';\nimport {\n Field,\n Label,\n SapphireStyleProps,\n useThemeCheck,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/tag/tag.module.css';\n\nimport { Tag } from './Tag';\nimport { TagItemProps } from './TagItem';\n\nexport interface TagGroupProps<T>\n extends CollectionBase<T>,\n DOMProps,\n // TODO when moving to \"core\", use types under `types.ts` instead of plain strings\n Pick<\n AriaLabelingProps,\n 'aria-label' | 'aria-labelledby' | 'aria-describedby' | 'aria-details'\n >,\n SapphireStyleProps,\n GlobalDomAttributes {\n /**\n * A HelpButton element to place next to the label.\n */\n contextualHelp?: ReactNode;\n /**\n * Custom error message help text.\n */\n errorMessage?: string;\n /**\n * The label of the tag group.\n */\n label?: string;\n /**\n * Places the label either above (default) or on the left side of tags.\n * @default 'above'\n */\n labelPlacement?: 'above' | 'side';\n /**\n * Help text description displayed below tags.\n */\n note?: string;\n /**\n * onAction handler passed down for actionable Tags, called onPress of tags.\n */\n onAction?: (key: Key) => void;\n /**\n * Handler that is called when a user deletes a tag.\n *\n * @deprecated Use `onRemove` prop on the `TagItem` component instead.\n * This prop will be removed when this component is moved to \"@danske/sapphire-react\".\n */\n onRemove?: (keys: Set<Key>) => void;\n}\n\nexport function TagGroup<T extends object>(\n props: TagGroupProps<T>\n): React.JSX.Element {\n useThemeCheck();\n const {\n contextualHelp,\n errorMessage,\n label: labelText,\n labelPlacement = 'above',\n note,\n onRemove: originalOnRemove,\n ...otherProps\n } = props;\n const ref = useRef(null);\n const state = useListState(props);\n\n // TODO when moving to \"core\": Remove `originalOnRemove` from here & remove support for `onRemove` prop.\n // If an external onRemove handler is provided, use it directly.\n // Otherwise, call individual onRemove handlers on each tag item.\n const onRemove = originalOnRemove\n ? (keys: Set<Key>) => {\n // eslint-disable-next-line no-console -- It's good to warn about the deprecation, but this needs to be removed alongside `onRemove`\n console.warn(\n 'The `onRemove` prop is deprecated and will be removed in future versions. Use the `onRemove` prop on the `TagItem` component instead.'\n );\n originalOnRemove(keys);\n }\n : (keys: Set<Key>) => {\n // Iterate through the keys and call each item's onRemove handler\n Array.from(keys).forEach((key) => {\n const item = state.collection.getItem(key);\n if (item) {\n (item.props as TagItemProps<T>).onRemove?.();\n }\n });\n };\n\n const { descriptionProps, gridProps, labelProps, errorMessageProps } =\n useTagGroup({ ...props, onRemove }, state, ref);\n\n return (\n <Field\n {...otherProps}\n labelPlacement={labelPlacement}\n labelVerticalAlignment=\"top\"\n noDefaultWidth\n >\n <Field.Context\n descriptionProps={errorMessage ? errorMessageProps : descriptionProps}\n >\n {(labelText || contextualHelp) && (\n <Field.Label>\n <Label {...labelProps} contextualHelp={contextualHelp}>\n {labelText}\n </Label>\n </Field.Label>\n )}\n <Field.Control>\n <div\n {...gridProps}\n ref={ref}\n className={styles['sapphire-tag-group']}\n >\n {Array.from(state.collection).map((item) => (\n <Tag\n key={item.key}\n item={item}\n state={state}\n hasError={item.props.hasError}\n // TODO when moving to \"core\": Remove `originalOnRemove` from here & remove support for `onRemove` prop.\n // Always allow removing if `onRemove` was provided, for backwards compatibility\n // Allow removal of the tag item if a removal handler is provided\n allowsRemoving={!!originalOnRemove || !!item.props.onRemove}\n />\n ))}\n </div>\n </Field.Control>\n {(note || errorMessage) &&\n (errorMessage ? (\n <Field.Footer>\n <Field.Note variant=\"error\">{errorMessage}</Field.Note>\n </Field.Footer>\n ) : (\n <Field.Footer>{note}</Field.Footer>\n ))}\n </Field.Context>\n </Field>\n );\n}\n","import { Item } from 'react-stately/Item';\nimport { ItemProps } from '@react-types/shared';\n\nexport interface TagItemProps<T> extends ItemProps<T> {\n /**\n * Shows error icon.\n * @default 'false'\n */\n hasError?: boolean;\n\n /**\n * This function is called when the tag is being removed, either through\n * clicking the \"X\" button or by any supported key combination.\n *\n * @default false\n *\n * @note If the `TagGroup` has `onRemove` prop, that implementation will take\n * precedence over this function.\n *\n * @note If the `TagItem` is disabled, this function will not be called.\n */\n onRemove?: () => void;\n}\n\nconst TagItem = Item as <T>(props: TagItemProps<T>) => JSX.Element;\n\nexport { TagItem };\n","import React, { useRef } from 'react';\nimport { useDateSegment } from 'react-aria/useDateField';\nimport { DateSegment as DateSegmentType } from 'react-stately/useDateFieldState';\nimport styles from '@danske/sapphire-css/components/dateField/dateField.module.css';\nimport clsx from 'clsx';\nimport { DateSegmentProps } from '@danske/sapphire-react';\n\nexport const TimeSegment = ({ segment, state }: DateSegmentProps) =>\n segment.type === 'hour' ||\n segment.type === 'minute' ||\n segment.type === 'dayPeriod' ? (\n <EditableSegment segment={segment} state={state}></EditableSegment>\n ) : (\n <SeparatorSegment segment={segment} />\n );\nconst SeparatorSegment = ({ segment }: { segment: DateSegmentType }) => (\n <span\n aria-hidden=\"true\"\n className={clsx(\n styles['sapphire-date-field__segment'],\n styles['sapphire-date-field__segment--separator']\n )}\n >\n {segment.text}\n </span>\n);\n\nconst EditableSegment = ({ segment, state }: DateSegmentProps) => {\n const ref = useRef(null);\n const { segmentProps } = useDateSegment(segment, state, ref);\n\n return (\n <div\n {...segmentProps}\n style={segmentProps.style}\n ref={ref}\n className={clsx(styles['sapphire-date-field__segment'], {\n [styles['sapphire-date-field__segment--filled']]:\n !segment.isPlaceholder,\n })}\n >\n {segment.text}\n </div>\n );\n};\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/dateField/dateField.module.css';\nimport {\n SapphireStyleProps,\n useThemeCheck,\n Field,\n Label,\n Icon,\n IconButton,\n GlobalDomAttributes,\n} from '@danske/sapphire-react';\nimport { AriaTimeFieldProps, useTimeField } from 'react-aria/useTimeField';\nimport { ForwardedRef, forwardRef, RefObject, ReactNode } from 'react';\nimport { TimeValue } from 'react-aria-components';\nimport { DateSegment as DateSegmentType } from 'react-stately/useDateFieldState';\nimport { useTimeFieldState } from 'react-stately/useTimeFieldState';\nimport { useLocale } from 'react-aria/I18nProvider';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport { TimeSegment } from './TimeFieldSegment';\nimport { CloseOutline } from '@danske/sapphire-icons/react';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport intlMessages from '../i18n';\n\nconst isAnySegmentModified = (segments: DateSegmentType[]) =>\n segments\n .map(({ type, isPlaceholder }) => {\n // type \"literal\" refers to the segment containing the non-editable separator\n return type !== 'literal' && !isPlaceholder;\n })\n .some((isModified) => isModified);\n\nexport type TimeFieldProps<T extends TimeValue> = Pick<\n AriaTimeFieldProps<T>,\n // TODO: when this is moved to `core`, we can replace the picked props with `ValueBasePropsKeys`\n | 'isDisabled'\n | 'isRequired'\n | 'isReadOnly'\n | 'label'\n | 'value'\n | 'defaultValue'\n | 'onChange'\n | 'onFocus'\n | 'onBlur'\n | 'shouldForceLeadingZeros'\n> &\n SapphireStyleProps &\n GlobalDomAttributes & {\n /**\n * @default 'lg'\n */\n size?: 'lg' | 'md';\n /**\n * To visually indicate if this field is required or optional.\n * @default false\n */\n necessityIndicator?: 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 * If it should hide the \"clear\" button when input is not empty.\n *\n * @default false\n */\n noClearButton?: boolean;\n /**\n * Whether the input should render as having an error and an error message.\n * This also sets the appropriate `aria` attributes on the input.\n *\n * A `boolean` sets the error state. Can be paired with the \"note\" prop with Field.Note variant=\"error\"\n * A `ReactNode` sets the error state with an additional error message.\n *\n * **An error message is strongly recommended because an error should\n * always have an explanation about how to fix it.**\n */\n error?: boolean | ReactNode;\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 * Use {@Link Field.Note} to render the note.\n */\n note?: ReactNode;\n /**\n * A HelpButton to render next to the label.\n */\n contextualHelp?: ReactNode;\n };\n\nfunction _TimeField<T extends TimeValue>(\n {\n // TODO many other props\n size = 'lg',\n noClearButton = false,\n error,\n note,\n contextualHelp,\n necessityIndicator = false,\n ...otherProps\n }: TimeFieldProps<T>,\n ref: ForwardedRef<HTMLDivElement>\n) {\n useThemeCheck();\n\n const timeFieldRef = useObjectRef(ref);\n const { locale } = useLocale();\n const formatMessage = useMessageFormatter(intlMessages);\n\n const state = useTimeFieldState({\n ...otherProps,\n locale,\n isInvalid: error ? true : undefined,\n });\n\n const { fieldProps, labelProps } = useTimeField(\n { ...otherProps },\n state,\n timeFieldRef\n );\n\n return (\n <Field {...otherProps} ref={ref} size={size} noShrink>\n <Field.Context>\n {otherProps.label && (\n <Field.Label>\n <Label\n {...labelProps}\n size={size}\n necessityIndicator={\n otherProps.isRequired && necessityIndicator\n ? 'required'\n : !otherProps.isRequired && necessityIndicator\n ? 'optional'\n : undefined\n }\n contextualHelp={contextualHelp}\n >\n {otherProps.label}\n </Label>\n </Field.Label>\n )}\n </Field.Context>\n <Field.Control>\n <div\n className={clsx(styles['sapphire-date-field'], {\n [styles['sapphire-date-field--error']]: state.isInvalid,\n [styles['sapphire-date-field--no-clear-button']]: noClearButton,\n [styles['sapphire-date-field--no-calendar']]: true,\n [styles['sapphire-date-field--md']]: size === 'md',\n })}\n >\n <div\n {...fieldProps}\n className={styles['sapphire-date-field__input']}\n ref={timeFieldRef}\n >\n {state.segments.map((segment, i) => (\n <TimeSegment key={i} segment={segment} state={state} />\n ))}\n </div>\n {!noClearButton &&\n !otherProps.isReadOnly &&\n !otherProps.isDisabled &&\n isAnySegmentModified(state.segments) && (\n <IconButton\n aria-label={formatMessage('clear')}\n onPress={() =>\n state.segments.forEach((segment) =>\n state.clearSegment(segment.type)\n )\n }\n size={size === 'md' ? 'sm' : 'md'}\n UNSAFE_className={clsx(\n styles['sapphire-date-field__button'],\n styles['sapphire-date-field__button--clear']\n )}\n >\n <Icon>\n <CloseOutline />\n </Icon>\n </IconButton>\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 ) : null}\n </Field.Footer>\n ) : null}\n </Field>\n );\n}\n\n/**\n * For collecting a specific time value from users with a segmented, locale-aware input that supports keyboard navigation between hours and minutes.\n */\nexport const TimeField = forwardRef(_TimeField) as <T extends TimeValue>(\n props: TimeFieldProps<T> & { ref?: RefObject<HTMLDivElement> }\n) => React.ReactElement;\n","import React, { useEffect, useState } from 'react';\nimport clsx from 'clsx';\nimport { mergeRefs } from 'react-aria/mergeRefs';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport {\n SapphireViewStyleProps,\n Tooltip,\n useSapphireStyleProps,\n} from '@danske/sapphire-react';\nimport styles from '@danske/sapphire-css/components/truncate-overflow/truncate-overflow.module.css';\n\nexport interface TruncateOverflowProps extends SapphireViewStyleProps {\n /** Content to truncate. */\n children: React.ReactNode;\n /**\n * Overrides the tooltip shown when the text is truncated.\n * When omitted, the tooltip is derived automatically from the `children` if\n * it's a string or from element's `textContent` otherwise.\n */\n tooltip?: React.ReactNode;\n}\n\n/**\n * Renders its children in a block that clips overflowing text with an ellipsis.\n * When the text is actually truncated, a tooltip is shown on hover with\n * the full content.\n */\nexport const TruncateOverflow = React.forwardRef<\n HTMLSpanElement,\n TruncateOverflowProps\n>(({ children, tooltip: tooltipProp, ...props }, forwardedRef) => {\n const ref = useObjectRef<HTMLSpanElement>(forwardedRef);\n const { styleProps, filteredProps } = useSapphireStyleProps(props);\n const [needsTooltip, setNeedsTooltip] = useState(false);\n const [content, setContent] = useState<string>(\n typeof children === 'string' ? children : ''\n );\n const tooltip = tooltipProp ?? content;\n\n // Re-check on every render so layout changes (e.g. column resize) are picked up.\n useEffect(() => {\n const elem = ref.current;\n if (!elem) return;\n const hasOverflow =\n elem.scrollWidth > elem.clientWidth ||\n elem.scrollHeight > elem.clientHeight;\n setNeedsTooltip(hasOverflow);\n setContent(\n typeof children === 'string' ? children : elem.textContent?.trim() ?? ''\n );\n });\n\n return needsTooltip && tooltip ? (\n <Tooltip title={tooltip}>\n {(triggerProps) => (\n <span\n {...mergeProps(triggerProps, filteredProps)}\n ref={\n mergeRefs(\n ref,\n triggerProps.ref as React.Ref<HTMLSpanElement>\n ) as React.Ref<HTMLSpanElement>\n }\n className={clsx(\n styles['sapphire-truncate-overflow'],\n styleProps.className\n )}\n style={styleProps.style}\n >\n {children}\n </span>\n )}\n </Tooltip>\n ) : (\n <span ref={ref} className={styles['sapphire-truncate-overflow']}>\n {children}\n </span>\n );\n});\n\nTruncateOverflow.displayName = 'TruncateOverflow';\n","import { createContext, RefObject } from 'react';\n\nexport const DataGridCellContext = createContext<{\n ref: RefObject<HTMLTableCellElement>;\n} | null>(null);\n","import React, {\n FormEvent,\n ForwardedRef,\n forwardRef,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { useOverlayTriggerState } from 'react-stately/useOverlayTriggerState';\nimport { Popover, IconButton } from '@danske/sapphire-react';\n\nimport { Checkmark, EditAlt } from '@danske/sapphire-icons/react';\nimport clsx from 'clsx';\nimport { SapphireStyleProps } from '@danske/sapphire-react';\nimport { DataGridCellContext } from './DataGridCellContext';\n\nimport styles from '@danske/sapphire-css/components/table/table.module.css';\n\nexport interface EditableCellContentProps extends SapphireStyleProps {\n /**\n * The display value rendered when not editing.\n */\n children?: React.ReactNode;\n /**\n * A function that renders the editable form content.\n * This should typically contain form inputs like {@link TextField} or {@link Select}.\n */\n renderEditor: () => ReactNode;\n /**\n * Callback fired when the user submits the edit (via Enter key or checkmark button).\n * If this returns false, the editor popover is not closed. This is useful\n * when the field contains errors.\n */\n onSubmit?: (e: FormEvent<HTMLFormElement>) => boolean | void;\n /**\n * Callback fired when the user cancels the edit (via Escape key).\n */\n onCancel?: () => void;\n /**\n * aria-label of the edit button\n * @default: 'Edit'\n */\n editButtonLabel?: string;\n\n /**\n * aria-label of the save button\n * @default: 'Save'\n */\n saveButtonLabel?: string;\n}\n\n/**\n * Used inside DataGrid cells to provide inline editing functionality.\n * Displays a static value with an edit button that appears on row hover/focus.\n * When the edit button is clicked, a popover form opens allowing inline editing.\n */\nexport const EditableCellContent = forwardRef(function EditableCellContent(\n props: EditableCellContentProps,\n ref: ForwardedRef<HTMLSpanElement>\n) {\n const {\n children,\n renderEditor,\n onSubmit,\n onCancel,\n editButtonLabel,\n saveButtonLabel,\n } = props;\n\n const [isEditing, setIsEditing] = useState(false);\n const [cellPosition, setCellPosition] = useState({ width: 0, offset: 0 });\n const cellContext = useContext(DataGridCellContext);\n if (!cellContext) {\n throw new Error(\n 'DataGrid.EditableCellContent is meant to be rendered inside DataGrid columns.'\n );\n }\n const cellRef = cellContext.ref;\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleSubmit = useCallback(\n (e: FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n const result = onSubmit?.(e);\n if (result !== false) {\n setIsEditing(false);\n }\n },\n [onSubmit, setIsEditing]\n );\n\n const cancel = useCallback(() => {\n setIsEditing(false);\n onCancel?.();\n }, [setIsEditing, onCancel]);\n\n const popoverState = useOverlayTriggerState({\n isOpen: isEditing,\n onOpenChange: (isOpen) => {\n if (!isOpen) {\n formRef.current?.requestSubmit();\n }\n },\n });\n\n // Measure cell width when editing starts\n useLayoutEffect(() => {\n if (isEditing && cellRef.current) {\n const width = cellRef.current.clientWidth;\n const offset =\n -cellRef.current.offsetHeight -\n 1; /* to cross over the row separator nicely */\n setCellPosition({ width, offset });\n }\n }, [isEditing]);\n\n useEffect(() => {\n if (isEditing) {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n e.preventDefault();\n cancel();\n }\n };\n window.addEventListener('keydown', onKeyDown);\n return () => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }\n }, [isEditing, cancel]);\n\n return (\n <span\n ref={ref}\n className={clsx(styles['sapphire-table__cell-container--editable'])}\n >\n {children}\n <IconButton\n aria-label={editButtonLabel ?? 'Edit'}\n variant=\"tertiary\"\n size=\"sm\"\n onPress={() => setIsEditing(true)}\n UNSAFE_className={clsx(styles['sapphire-table__edit-button'])}\n >\n <EditAlt />\n </IconButton>\n <Popover\n state={popoverState}\n triggerRef={cellRef}\n placement=\"bottom start\"\n offset={cellPosition.offset}\n // We want to control the escape key manually\n isKeyboardDismissDisabled\n padded\n UNSAFE_style={{ minWidth: `${cellPosition.width}px` }}\n >\n <form\n ref={formRef}\n onSubmit={handleSubmit}\n className={clsx(styles['sapphire-table__edit-cell-popover'])}\n >\n {renderEditor()}\n <IconButton\n size=\"md\"\n type=\"submit\"\n variant=\"tertiary\"\n aria-label={saveButtonLabel ?? 'Save'}\n >\n <Checkmark />\n </IconButton>\n </form>\n </Popover>\n </span>\n );\n});\n","import { Table as TanstackTable } from '@tanstack/react-table';\nimport React, { useLayoutEffect, useState } from 'react';\n\n/**\n * Measures column widths. Used to mimic `table-layout: auto` for virtualized tables by measuring column widths after\n * the initial render and then locking them in with `table-layout: fixed`,\n * to prevent column widths from shifting as different rows are scrolled in and out of view.\n */\nexport function useMeasureColumnWidths<TData>({\n data,\n table,\n enabled: shouldAutoMeasure,\n tableRef,\n}: {\n table: TanstackTable<TData>;\n enabled: boolean;\n tableRef: React.RefObject<HTMLTableElement>;\n data: TData[];\n}): { measuredColumnWidths: Record<string, number> | null } {\n const [measuredColumnWidths, setMeasuredColumnWidths] = useState<Record<\n string,\n number\n > | null>(null);\n\n // Create a stable key from column IDs to detect column changes\n const columnKey = table\n .getVisibleLeafColumns()\n .map((c) => c.id)\n .join(',');\n\n // Reset measured widths when columns change\n useLayoutEffect(() => {\n if (shouldAutoMeasure) {\n setMeasuredColumnWidths(null);\n }\n }, [columnKey, shouldAutoMeasure]);\n\n // Measure column widths after initial render\n useLayoutEffect(() => {\n if (!shouldAutoMeasure || measuredColumnWidths !== null) return;\n if (data.length === 0) return; // Don't measure with empty data\n\n const tableEl = tableRef.current;\n if (!tableEl) return;\n\n let rafId: number;\n let cancelled = false;\n\n // When virtualization is enabled, the virtualizer needs a frame to initialize\n // and render rows. We use requestAnimationFrame to defer measurement until\n // after the virtualizer has populated the DOM.\n const measureColumnWidths = () => {\n if (cancelled) return;\n\n // Verify rows are actually rendered before measuring\n const bodyRows = tableEl.querySelectorAll('tbody tr:not([aria-hidden])');\n if (bodyRows.length === 0) {\n rafId = requestAnimationFrame(measureColumnWidths);\n return;\n }\n\n const headerCells = tableEl.querySelectorAll('thead th');\n const visibleColumns = table.getVisibleLeafColumns();\n\n const widths: Record<string, number> = {};\n visibleColumns.forEach((col, i) => {\n const thEl = headerCells[i] as HTMLElement | undefined;\n if (thEl) {\n // Use getBoundingClientRect for sub-pixel accuracy\n widths[col.id] = thEl.getBoundingClientRect().width;\n }\n });\n\n // Only lock if we successfully measured at least one column\n if (Object.keys(widths).length > 0 && !cancelled) {\n setMeasuredColumnWidths(widths);\n }\n };\n\n rafId = requestAnimationFrame(measureColumnWidths);\n\n return () => {\n cancelled = true;\n cancelAnimationFrame(rafId);\n };\n }, [shouldAutoMeasure, measuredColumnWidths, data.length, table]);\n\n return {\n measuredColumnWidths,\n };\n}\n","import {\n type RefObject,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport type {\n KeyboardEvent as ReactKeyboardEvent,\n FocusEvent as ReactFocusEvent,\n} from 'react';\nimport { defaultRangeExtractor, Virtualizer } from '@tanstack/react-virtual';\nimport { getInteractionModality } from 'react-aria/private/interactions/useFocusVisible';\n\n/**\n * Selector for elements that are inherently focusable through HTML semantics —\n * used to detect interactive widgets inside grid cells.\n */\nconst INTERACTIVE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled]):not([type=\"hidden\"])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n].join(', ');\n\n/**\n * Attribute placed on `<tr>` elements in `<tbody>` to mark them as\n * navigable grid rows. Only rows carrying this attribute participate in\n * keyboard navigation.\n */\nexport const GRID_ROW_ATTR = 'data-grid-row';\n\n/** Attribute that stores the row-item index in the full (possibly virtualised) list. */\nconst DATA_INDEX_ATTR = 'data-index';\n\n// ---------------------------------------------------------------------------\n// Grid model helpers\n// ---------------------------------------------------------------------------\n\n/** @internal */\ninterface GridCell {\n /** The `<th>` or `<td>` element. */\n element: HTMLElement;\n /**\n * The element that should receive focus — either the cell itself (for\n * text-only cells) or a single interactive widget within the cell\n * (checkbox, button, link …).\n */\n focusTarget: HTMLElement;\n}\n\n/**\n * Builds a 2-D grid model from the DOM structure of an HTML `<table>`.\n *\n * - Header rows are taken from `<thead> > tr`.\n * - Body rows from `<tbody> > tr[data-grid-row]` (only navigable rows).\n */\nfunction buildGrid(table: HTMLTableElement): GridCell[][] {\n const grid: GridCell[][] = [];\n\n const thead = table.querySelector('thead');\n if (thead) {\n thead.querySelectorAll<HTMLTableRowElement>(':scope > tr').forEach((tr) => {\n const cells = rowCells(tr);\n if (cells.length > 0) grid.push(cells);\n });\n }\n\n const tbody = table.querySelector('tbody');\n if (tbody) {\n tbody\n .querySelectorAll<HTMLTableRowElement>(`:scope > tr[${GRID_ROW_ATTR}]`)\n .forEach((tr) => {\n const cells = rowCells(tr);\n if (cells.length > 0) grid.push(cells);\n });\n }\n\n return grid;\n}\n\nfunction rowCells(tr: HTMLTableRowElement): GridCell[] {\n const cells: GridCell[] = [];\n tr.querySelectorAll<HTMLElement>(':scope > th, :scope > td').forEach(\n (cell) => {\n cells.push({ element: cell, focusTarget: getFocusTarget(cell) });\n }\n );\n return cells;\n}\n\n/**\n * Determines the focus target inside a grid cell per the WAI-ARIA grid\n * pattern specification:\n *\n * - If the cell contains **exactly one** interactive widget whose operation\n * does not require arrow keys (link, button, checkbox …) → focus the widget.\n * - Otherwise → focus the cell itself.\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/grid/#gridNav_focus\n */\nfunction getFocusTarget(cell: HTMLElement): HTMLElement {\n const interactive = cell.querySelectorAll<HTMLElement>(INTERACTIVE_SELECTOR);\n return interactive.length === 1 ? interactive[0] : cell;\n}\n\n/**\n * Returns `true` when the target is an editable form control where arrow\n * keys have their own native meaning (text caret, dropdown navigation …).\n */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (target instanceof HTMLTextAreaElement) return true;\n if (target instanceof HTMLSelectElement) return true;\n if (\n target instanceof HTMLInputElement &&\n target.type !== 'checkbox' &&\n target.type !== 'radio' &&\n target.type !== 'button'\n )\n return true;\n return target instanceof HTMLElement && target.isContentEditable;\n}\n\n/**\n * Reads the `data-index` attribute from the `<tr>` that owns a grid cell.\n * Returns `null` for header cells (which don't carry this attribute).\n */\nfunction getDataIndexOfCell(cell: HTMLElement): number | null {\n const tr = cell.closest('tr');\n const raw = tr?.getAttribute(DATA_INDEX_ATTR);\n if (raw == null) return null;\n const n = parseInt(raw, 10);\n return isNaN(n) ? null : n;\n}\n\n/**\n * Find the grid-row index in `grid` for a `<tr>` identified by its\n * `data-index` attribute value. Returns `-1` when not found.\n */\nfunction findGridRowByDataIndex(grid: GridCell[][], dataIndex: number): number {\n for (let r = grid.length - 1; r >= 0; r--) {\n const tr = grid[r][0]?.element.closest('tr');\n if (tr?.getAttribute(DATA_INDEX_ATTR) === String(dataIndex)) return r;\n }\n return -1;\n}\n\n/**\n * Compute visible page size (number of body rows that fit in the scroll\n * container) from the container height and the first visible body-row height.\n */\nfunction getVisiblePageSize(\n scrollContainer: HTMLElement | null,\n table: HTMLTableElement\n): number {\n const fallback = 7;\n if (!scrollContainer) return fallback;\n\n const containerHeight = scrollContainer.clientHeight;\n if (containerHeight <= 0) return fallback;\n\n const firstBodyRow = table.querySelector<HTMLElement>(\n `tbody > tr[${GRID_ROW_ATTR}]`\n );\n if (!firstBodyRow) return fallback;\n\n const rowHeight = firstBodyRow.getBoundingClientRect().height;\n if (rowHeight <= 0) return fallback;\n\n return Math.max(1, Math.floor(containerHeight / rowHeight));\n}\n\n/** Count header rows in the grid (rows from `<thead>`). */\nfunction countHeaderRows(grid: GridCell[][]): number {\n let count = 0;\n for (const row of grid) {\n const tr = row[0]?.element.closest('tr');\n if (tr?.closest('thead')) count++;\n else break;\n }\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface UseGridKeyboardNavigationOptions {\n /** Reference to the `<table>` element that represents the grid. */\n tableRef: RefObject<HTMLTableElement | null>;\n /**\n * Whether grid keyboard navigation is active.\n * @default true\n */\n enabled?: boolean;\n\n /**\n * Ref to the scrollable container. Used to compute the visible page size\n * dynamically so that PageUp/PageDown jump by exactly one screen of rows.\n *\n * When omitted a fallback page size of 7 rows is used.\n */\n scrollContainerRef?: RefObject<HTMLElement | null>;\n\n /**\n * Total number of row items in the (possibly virtualised) list.\n * Needed so PageUp/PageDown can navigate beyond the currently rendered DOM\n * rows.\n *\n * When omitted, page navigation is limited to rows present in the DOM.\n */\n rowItemCount?: number;\n\n /**\n * Scroll a row item into view by its `data-index`. Called when\n * PageUp/PageDown targets a row that is not currently in the DOM (e.g.\n * because of virtualisation). The hook will focus the row once it appears\n * on the next render.\n */\n onScrollToRowIndex?: Virtualizer<Element, Element>['scrollToIndex'];\n}\n\nexport interface UseGridKeyboardNavigationResult {\n /** Props to spread onto the grid `<table>` element. */\n gridKeyboardNavigationProps: {\n onKeyDown: (e: ReactKeyboardEvent) => void;\n onFocus: (e: ReactFocusEvent) => void;\n };\n\n /**\n * A wrapper around the virtualizer's `rangeExtractor` that ensures the currently focused row is included in\n * the extracted range, even if it would normally be excluded by the virtualizer's default range extraction logic.\n */\n rangeExtractor: typeof defaultRangeExtractor;\n}\n\n/**\n * Implements WAI-ARIA Grid Pattern keyboard navigation with roving tabindex.\n *\n * Only **one** cell in the entire grid has `tabIndex={0}` (the active cell);\n * all others have `tabIndex={-1}`. When the user tabs into the grid, focus\n * lands on the active cell. Arrow keys then move focus between cells.\n *\n * ### Supported keys (Data Grid pattern)\n *\n * | Key | Action |\n * |-----|--------|\n * | `→` | Move focus one cell to the right |\n * | `←` | Move focus one cell to the left |\n * | `↓` | Move focus one cell down |\n * | `↑` | Move focus one cell up |\n * | `Home` | First cell in the current row |\n * | `End` | Last cell in the current row |\n * | `Ctrl/⌘ + Home` | First cell in the first row |\n * | `Ctrl/⌘ + End` | Last cell in the last row |\n * | `Page Down` | Jump down by one visible page of rows |\n * | `Page Up` | Jump up by one visible page of rows |\n *\n * @see https://www.w3.org/WAI/ARIA/apg/patterns/grid/\n */\nexport function useGridKeyboardNavigation({\n tableRef,\n enabled = true,\n scrollContainerRef,\n rowItemCount,\n onScrollToRowIndex,\n}: UseGridKeyboardNavigationOptions): UseGridKeyboardNavigationResult {\n const activeCoordsRef = useRef({ row: 0, col: 0 });\n\n const pendingFocusRef = useRef<{\n dataIndex: number;\n col: number;\n } | null>(null);\n\n /**\n * The `data-index` of the body row that currently holds focus.\n * Returned so the DataGrid can persist it in the virtualizer.\n */\n const [focusedRowIndex, setFocusedRowIndex] = useState<number | null>(null);\n\n // ------------------------------------------------------------------\n // Synchronize tabindex across every navigable cell.\n // ------------------------------------------------------------------\n const syncTabIndices = () => {\n const table = tableRef.current;\n if (!table || !enabled) return;\n\n const grid = buildGrid(table);\n if (grid.length === 0) return;\n\n // If a cell inside the table currently has DOM focus, always prefer it\n // as the active cell. This handles the case where the grid was rebuilt\n // after a virtualiser scroll but the focused cell's grid-row index has\n // shifted (e.g. a persisted row that moved from the middle to the end).\n let { row, col } = activeCoordsRef.current;\n const activeEl = table.ownerDocument.activeElement;\n if (activeEl && table.contains(activeEl)) {\n const focusedCell = (activeEl as HTMLElement).closest?.(\n 'th, td'\n ) as HTMLElement | null;\n if (focusedCell) {\n for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n if (grid[r][c].element === focusedCell) {\n row = r;\n col = c;\n break;\n }\n }\n }\n }\n }\n\n const clampedRow = clamp(row, 0, grid.length - 1);\n const clampedCol = clamp(col, 0, grid[clampedRow].length - 1);\n activeCoordsRef.current = { row: clampedRow, col: clampedCol };\n\n for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n const { element, focusTarget } = grid[r][c];\n const isActive = r === clampedRow && c === clampedCol;\n\n element.setAttribute('tabindex', '-1');\n element\n .querySelectorAll<HTMLElement>(INTERACTIVE_SELECTOR)\n .forEach((child) => {\n child.setAttribute('tabindex', '-1');\n });\n\n if (isActive) {\n focusTarget.setAttribute('tabindex', '0');\n }\n }\n }\n };\n\n // Re-sync after every React render and resolve any pending focus.\n useLayoutEffect(() => {\n if (!enabled) return;\n const table = tableRef.current;\n if (!table) return;\n\n const pending = pendingFocusRef.current;\n if (pending) {\n const grid = buildGrid(table);\n const gridRow = findNearestGridRowByDataIndex(grid, pending.dataIndex);\n if (gridRow >= 0) {\n pendingFocusRef.current = null;\n const col = clamp(pending.col, 0, grid[gridRow].length - 1);\n activeCoordsRef.current = { row: gridRow, col };\n syncTabIndices();\n grid[gridRow][col].focusTarget.focus();\n return;\n }\n }\n\n syncTabIndices();\n });\n\n // ------------------------------------------------------------------\n // Navigate to a specific cell (by grid-row index) and focus it.\n // ------------------------------------------------------------------\n const navigateTo = (targetRow: number, targetCol: number) => {\n const table = tableRef.current;\n if (!table) return;\n\n const grid = buildGrid(table);\n if (grid.length === 0) return;\n\n const row = clamp(targetRow, 0, grid.length - 1);\n const col = clamp(targetCol, 0, grid[row].length - 1);\n activeCoordsRef.current = { row, col };\n syncTabIndices();\n\n const cell = grid[row]?.[col];\n if (cell) {\n cell.focusTarget.focus({ preventScroll: true });\n cell.element.scrollIntoView?.({ block: 'nearest', inline: 'nearest' });\n }\n };\n\n // ------------------------------------------------------------------\n // Navigate to a cell identified by data-index. Falls back to\n // scrolling + deferred focus when the row is not in the DOM.\n // ------------------------------------------------------------------\n const navigateToDataIndex = (dataIndex: number, col: number) => {\n const table = tableRef.current;\n if (!table) return;\n\n const grid = buildGrid(table);\n const gridRow = findGridRowByDataIndex(grid, dataIndex);\n if (gridRow >= 0) {\n const clampedCol = clamp(col, 0, grid[gridRow].length - 1);\n activeCoordsRef.current = { row: gridRow, col: clampedCol };\n syncTabIndices();\n grid[gridRow][clampedCol].focusTarget.focus({ preventScroll: true });\n grid[gridRow][clampedCol].element.scrollIntoView?.({\n block: 'nearest',\n inline: 'nearest',\n });\n return;\n }\n if (onScrollToRowIndex) {\n onScrollToRowIndex(dataIndex);\n pendingFocusRef.current = { dataIndex, col };\n }\n };\n\n // ------------------------------------------------------------------\n // Keyboard handler\n // ------------------------------------------------------------------\n const onKeyDown = (e: ReactKeyboardEvent) => {\n if (!enabled) return;\n\n const table = tableRef.current;\n if (!table) return;\n\n if (isEditableTarget(e.target)) return;\n\n const grid = buildGrid(table);\n if (grid.length === 0) return;\n\n const cell = (e.target as HTMLElement).closest?.(\n 'th, td'\n ) as HTMLElement | null;\n if (!cell || !table.contains(cell)) return;\n\n let curRow = -1;\n let curCol = -1;\n outer: for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n if (grid[r][c].element === cell) {\n curRow = r;\n curCol = c;\n break outer;\n }\n }\n }\n if (curRow < 0) return;\n\n const curDataIndex = getDataIndexOfCell(cell);\n const headerRows = countHeaderRows(grid);\n const isBodyRow = curDataIndex != null;\n\n const maxRow = grid.length - 1;\n let targetRow = curRow;\n let targetCol = curCol;\n let handled = true;\n\n switch (e.key) {\n case 'ArrowRight':\n targetCol = Math.min(curCol + 1, grid[curRow].length - 1);\n break;\n case 'ArrowLeft':\n targetCol = Math.max(curCol - 1, 0);\n break;\n\n case 'ArrowDown':\n if (isBodyRow && rowItemCount != null) {\n const nextDataIndex = findNextNavigableDataIndex(\n grid,\n curDataIndex,\n 1,\n rowItemCount\n );\n if (nextDataIndex != null) {\n e.preventDefault();\n navigateToDataIndex(nextDataIndex, curCol);\n return;\n }\n // No navigable row below — stay put.\n } else {\n targetRow = Math.min(curRow + 1, maxRow);\n }\n break;\n\n case 'ArrowUp':\n if (isBodyRow) {\n const prevDataIndex = findNextNavigableDataIndex(\n grid,\n curDataIndex,\n -1,\n rowItemCount ?? curDataIndex\n );\n if (prevDataIndex != null) {\n e.preventDefault();\n navigateToDataIndex(prevDataIndex, curCol);\n return;\n }\n // No navigable body row above → last header row.\n targetRow = Math.max(headerRows - 1, 0);\n } else {\n targetRow = Math.max(curRow - 1, 0);\n }\n break;\n\n case 'Home':\n if (e.ctrlKey || e.metaKey) {\n targetRow = 0;\n targetCol = 0;\n } else {\n targetCol = 0;\n }\n break;\n case 'End':\n if (e.ctrlKey || e.metaKey) {\n targetRow = maxRow;\n targetCol = grid[maxRow].length - 1;\n } else {\n targetCol = grid[curRow].length - 1;\n }\n break;\n\n case 'PageDown':\n case 'PageUp': {\n const pageSize = getVisiblePageSize(\n scrollContainerRef?.current ?? null,\n table\n );\n const direction = e.key === 'PageDown' ? 1 : -1;\n\n if (isBodyRow && rowItemCount != null) {\n // Jump by `pageSize` navigable rows in the given direction.\n let target = curDataIndex;\n let stepsUsed = 0;\n for (let i = 0; i < pageSize; i++) {\n const next = findNextNavigableDataIndex(\n grid,\n target,\n direction,\n rowItemCount\n );\n if (next == null) break;\n target = next;\n stepsUsed++;\n }\n const hasRemainingSteps = stepsUsed < pageSize;\n\n // PageUp with remaining steps at data-index 0 → go to header.\n if (direction === -1 && hasRemainingSteps) {\n targetRow = 0;\n break;\n }\n\n if (target !== curDataIndex) {\n e.preventDefault();\n navigateToDataIndex(target, curCol);\n return;\n }\n }\n\n targetRow = clamp(curRow + direction * pageSize, 0, maxRow);\n break;\n }\n\n default:\n handled = false;\n }\n\n if (handled) {\n e.preventDefault();\n targetCol = Math.min(targetCol, grid[targetRow].length - 1);\n navigateTo(targetRow, targetCol);\n }\n };\n\n // ------------------------------------------------------------------\n // Focus handler\n // ------------------------------------------------------------------\n const onFocus = (e: ReactFocusEvent) => {\n if (!enabled) return;\n\n const table = tableRef.current;\n if (!table) return;\n\n const cell = (e.target as HTMLElement).closest?.(\n 'th, td'\n ) as HTMLElement | null;\n if (!cell || !table.contains(cell)) return;\n\n // if tabbing back to the table, make sure the focused row is scrolled into view\n if (\n focusedRowIndex != null &&\n !table.contains(e.relatedTarget) &&\n getInteractionModality() !== 'pointer'\n ) {\n onScrollToRowIndex?.(focusedRowIndex, { align: 'start' });\n }\n\n const grid = buildGrid(table);\n for (let r = 0; r < grid.length; r++) {\n for (let c = 0; c < grid[r].length; c++) {\n if (grid[r][c].element === cell) {\n activeCoordsRef.current = { row: r, col: c };\n syncTabIndices();\n\n const dataIndex = getDataIndexOfCell(cell);\n if (dataIndex !== focusedRowIndex) {\n setFocusedRowIndex(dataIndex);\n }\n return;\n }\n }\n }\n };\n\n const rangeExtractor = useCallback(\n (range: Parameters<typeof defaultRangeExtractor>[0]) => {\n const indices = defaultRangeExtractor(range);\n if (focusedRowIndex != null && !indices.includes(focusedRowIndex)) {\n indices.push(focusedRowIndex);\n indices.sort((a, b) => a - b);\n }\n return indices;\n },\n [focusedRowIndex]\n );\n\n return {\n gridKeyboardNavigationProps: { onKeyDown, onFocus },\n rangeExtractor,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Starting from `fromDataIndex`, scan in `direction` (+1 or −1) to find the\n * next data-index that corresponds to a navigable grid row (a `<tr>` with the\n * `data-grid-row` attribute). Skips expandedView / skeleton rows.\n *\n * Returns `null` when no navigable row exists in the given direction.\n */\nfunction findNextNavigableDataIndex(\n grid: GridCell[][],\n fromDataIndex: number,\n direction: 1 | -1,\n rowItemCount: number\n): number | null {\n // Collect data-indices of all rows in the DOM, split into navigable\n // (data-grid-row) and non-navigable (expandedView, skeleton, etc.).\n const navigable = new Set<number>();\n const nonNavigable = new Set<number>();\n\n const table = grid[0]?.[0]?.element.closest('table');\n if (table) {\n const tbody = table.querySelector('tbody');\n if (tbody) {\n tbody\n .querySelectorAll<HTMLTableRowElement>(':scope > tr[data-index]')\n .forEach((tr) => {\n const idx = parseInt(tr.getAttribute(DATA_INDEX_ATTR)!, 10);\n if (isNaN(idx)) return;\n if (tr.hasAttribute(GRID_ROW_ATTR)) {\n navigable.add(idx);\n } else {\n nonNavigable.add(idx);\n }\n });\n }\n }\n\n let candidate = fromDataIndex + direction;\n while (candidate >= 0 && candidate < rowItemCount) {\n // Skip indices we know are non-navigable (expanded views in the DOM).\n if (nonNavigable.has(candidate)) {\n candidate += direction;\n continue;\n }\n // Accept if it's a known navigable row or if it's off-screen (we'll\n // discover its type when the virtualiser renders it).\n return candidate;\n }\n return null;\n}\n\n/**\n * Find the grid-row whose `data-index` is closest to `targetDataIndex`.\n * Only considers body rows (those with the `data-index` attribute).\n * Returns `-1` when no suitable row is found.\n */\nfunction findNearestGridRowByDataIndex(\n grid: GridCell[][],\n targetDataIndex: number\n): number {\n let bestRow = -1;\n let bestDist = Infinity;\n for (let r = 0; r < grid.length; r++) {\n const tr = grid[r][0]?.element.closest('tr');\n const raw = tr?.getAttribute(DATA_INDEX_ATTR);\n if (raw == null) continue;\n const idx = parseInt(raw, 10);\n if (isNaN(idx)) continue;\n const dist = Math.abs(idx - targetDataIndex);\n if (dist < bestDist) {\n bestDist = dist;\n bestRow = r;\n }\n }\n return bestRow;\n}\n","import { CSSProperties } from 'react';\nimport { tokens } from '../SapphireProvider';\nimport { type BreakpointKey } from './useBreakpointTokens';\n\nexport type BaseResponsiveProp<T> =\n /**\n * Support design-token breakpoint values for both media queries and container queries.\n */\n { [key in BreakpointKey]?: T } & {\n /**\n * Used when the resolved width is less than all breakpoints. Or if breakpoint\n * detection is not possible for any reason (like being run in SSR),\n */\n base: T;\n };\n\nexport type ViewportResponsiveProp<T> = BaseResponsiveProp<T> & {\n container?: never;\n [key: number]: never;\n};\n\nexport type ContainerResponsiveProp<T> = BaseResponsiveProp<T> & {\n /**\n * Provide a container name to target a specific container.\n * If set to `true`, the element will target the closest container.\n *\n * When a container name is provided, the string is used as a container query selector, as per\n * the documentation:\n * https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_containment/Container_queries#naming_containment_contexts.\n * This functionality requires that a layout element has `containerName` property set to the same\n * value.\n */\n container: true | string;\n /**\n * Container queries support passing a number value as a breakpoint, since some components may\n * not take up the space required to hit the design-tokens breakpoints.\n */\n [key: number]: T;\n};\n\nexport type ResponsiveProp<T> =\n | ViewportResponsiveProp<T>\n | ContainerResponsiveProp<T>;\n\nexport type Responsive<T> = ResponsiveProp<T> | T;\n\n/**\n * Represents either a single value or a set of different values for each breakpoint.\n * In both cases, the type of the value itself comes from a CSS property specified\n * by K and also a design token (a value from `theme`) of type T, if provided.\n * By default, it doesn't allow any theme value.\n */\nexport type ResponsiveCssProp<\n K extends keyof CSSProperties,\n T extends keyof typeof tokens | '' = ''\n> = Responsive<\n | CSSProperties[K]\n | (T extends keyof typeof tokens ? ValueOf<(typeof tokens)[T]> : never)\n>;\n\ntype ValueOf<T> = T[keyof T];\n\nexport interface SapphireCommonStyleProps {\n // Spacing\n margin?: ResponsiveCssProp<'margin', 'size'>;\n marginLeft?: ResponsiveCssProp<'marginLeft', 'size'>;\n marginRight?: ResponsiveCssProp<'marginRight', 'size'>;\n marginTop?: ResponsiveCssProp<'marginTop', 'size'>;\n marginBottom?: ResponsiveCssProp<'marginBottom', 'size'>;\n /**\n * Shorthand for marginLeft and marginRight\n */\n marginX?: ResponsiveCssProp<'marginBottom', 'size'>;\n /**\n * Shorthand for marginTop and marginBottom\n */\n marginY?: ResponsiveCssProp<'marginBottom', 'size'>;\n width?: ResponsiveCssProp<'width', 'size'>;\n height?: ResponsiveCssProp<'height', 'size'>;\n minWidth?: ResponsiveCssProp<'minWidth', 'size'>;\n minHeight?: ResponsiveCssProp<'minHeight', 'size'>;\n maxWidth?: ResponsiveCssProp<'maxWidth', 'size'>;\n maxHeight?: ResponsiveCssProp<'maxHeight', 'size'>;\n\n // Layout\n flex?: ResponsiveCssProp<'flex'>;\n flexGrow?: ResponsiveCssProp<'flexGrow'>;\n flexShrink?: ResponsiveCssProp<'flexShrink'>;\n flexBasis?: ResponsiveCssProp<'flexBasis'>;\n justifySelf?: ResponsiveCssProp<'justifySelf'>;\n alignSelf?: ResponsiveCssProp<'alignSelf'>;\n order?: ResponsiveCssProp<'order'>;\n gridArea?: ResponsiveCssProp<'gridArea'>;\n gridColumn?: ResponsiveCssProp<'gridColumn'>;\n gridRow?: ResponsiveCssProp<'gridRow'>;\n gridColumnStart?: ResponsiveCssProp<'gridColumnStart'>;\n gridColumnEnd?: ResponsiveCssProp<'gridColumnEnd'>;\n gridRowStart?: ResponsiveCssProp<'gridRowStart'>;\n gridRowEnd?: ResponsiveCssProp<'gridRowEnd'>;\n\n // Positioning\n position?: ResponsiveCssProp<'position'>;\n zIndex?: ResponsiveCssProp<'zIndex'>;\n top?: ResponsiveCssProp<'top', 'size'>;\n bottom?: ResponsiveCssProp<'bottom', 'size'>;\n left?: ResponsiveCssProp<'left', 'size'>;\n right?: ResponsiveCssProp<'right', 'size'>;\n inset?: ResponsiveCssProp<'marginBottom', 'size'>;\n\n isHidden?: Responsive<boolean>;\n}\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nexport type StyleHandler<T extends keyof CSSProperties> =\n | keyof CSSProperties\n | {\n styleProp: T;\n convertValue: (value: any) => CSSProperties[T] | undefined;\n }\n | {\n styleProps: T[];\n };\n\nexport type StyleHandlers<\n T extends {\n [key: string]: ResponsiveCssProp<any, any> | Responsive<any>;\n } = SapphireCommonStyleProps\n> = {\n [key in keyof T]-?: StyleHandler<any>;\n};\n\nconst isHiddenHandler: StyleHandler<'display'> = {\n styleProp: 'display',\n convertValue: (value: boolean) => (value ? 'none' : undefined),\n};\n\nexport const commonStyleHandlers: StyleHandlers = {\n margin: 'margin',\n marginLeft: 'marginLeft',\n marginRight: 'marginRight',\n marginTop: 'marginTop',\n marginBottom: 'marginBottom',\n marginX: {\n styleProps: ['marginLeft', 'marginRight'] as Array<keyof CSSProperties>,\n },\n marginY: {\n styleProps: ['marginTop', 'marginBottom'] as Array<keyof CSSProperties>,\n },\n width: 'width',\n height: 'height',\n minWidth: 'minWidth',\n minHeight: 'minHeight',\n maxWidth: 'maxWidth',\n maxHeight: 'maxHeight',\n flex: 'flex',\n flexGrow: 'flexGrow',\n flexShrink: 'flexShrink',\n flexBasis: 'flexBasis',\n justifySelf: 'justifySelf',\n alignSelf: 'alignSelf',\n order: 'order',\n gridArea: 'gridArea',\n gridColumn: 'gridColumn',\n gridColumnEnd: 'gridColumnEnd',\n gridColumnStart: 'gridColumnStart',\n gridRow: 'gridRow',\n gridRowEnd: 'gridRowEnd',\n gridRowStart: 'gridRowStart',\n position: 'position',\n zIndex: 'zIndex',\n top: 'top',\n bottom: 'bottom',\n left: 'left',\n right: 'right',\n inset: 'inset',\n\n isHidden: isHiddenHandler,\n};\n","import {\n BreakpointContext,\n BreakpointContextValue,\n} from '@danske/sapphire-react-context';\nimport { Breakpoints } from '../utils/useBreakpointTokens';\nimport { useContext } from 'react';\n\nexport function useBreakpointContext(): BreakpointContextValue<Breakpoints> | null {\n return useContext(\n BreakpointContext\n ) as BreakpointContextValue<Breakpoints> | null;\n}\n","import { CSSProperties, useCallback, useEffect } from 'react';\nimport {\n commonStyleHandlers,\n ContainerResponsiveProp,\n Responsive,\n SapphireCommonStyleProps,\n StyleHandler,\n StyleHandlers,\n} from './SapphireStyleProps';\nimport { type BreakpointKey } from './useBreakpointTokens';\nimport { useBreakpointContext } from '../BreakpointProvider';\nimport { useId } from 'react-aria/useId';\nimport clsx from 'clsx';\n\nconst isSapphireToken = (obj: Record<string, unknown>): obj is SapphireToken =>\n 'value' in obj;\n\nexport const resolveResponsiveValue = <\n T extends string | number | undefined | SapphireToken\n>(\n matchedBreakpoints: BreakpointKey[],\n value?: Responsive<T | SapphireToken>\n): T | string => {\n if (value && typeof value === 'object') {\n // Handle SapphireToken case like `{ value: 'var(--sapphire-semantic-size-width-panel-sm)' }`\n if (isSapphireToken(value)) {\n return (value as SapphireToken).value;\n }\n // `base` is the fallback breakpoint and must not shadow matched breakpoints.\n for (const breakpoint of matchedBreakpoints as Array<\n BreakpointKey | 'base'\n >) {\n if (breakpoint === 'base') {\n continue;\n }\n\n const breakpointValue = value[breakpoint];\n if (breakpointValue != null) {\n // Handle case where a breakpoint has a SapphireToken like `{ sm: { value: 'var(--sapphire-semantic-size-width-panel-sm)' } }`\n if (\n typeof breakpointValue === 'object' &&\n isSapphireToken(breakpointValue)\n ) {\n return breakpointValue.value;\n }\n\n // Handle case where a breakpoint has a 'string' | 'number' | 'undefined' value like `{ sm: '11px' }`\n return breakpointValue as T;\n }\n }\n\n const baseValue = value.base;\n if (baseValue != null) {\n if (typeof baseValue === 'object' && isSapphireToken(baseValue)) {\n return baseValue.value;\n }\n return baseValue as T;\n }\n }\n\n // Handle 'string' | 'number' | 'undefined' case\n return value as T;\n};\n\n// Unsure why an interface makes the typeguard fail - perhaps something that is fixed in later TS versions than 4.9?\n// eslint-disable-next-line @typescript-eslint/consistent-type-definitions\ntype SapphireToken = {\n value: string;\n};\n\nexport const useResolveResponsiveValue = (): (<\n T extends string | number | undefined\n>(\n value?: Responsive<T | SapphireToken>\n) => T | string) => {\n const breakpointContext = useBreakpointContext();\n const matchedBreakpoints =\n (breakpointContext?.matchedBreakpoints as BreakpointKey[]) || ['base'];\n return (value) => resolveResponsiveValue(matchedBreakpoints, value);\n};\n\nconst generateRulePart = <T extends string | number | undefined>(\n containerBreakpointValue: number,\n className: string,\n key: string,\n breakpointResponsiveValue: T | SapphireToken,\n container: true | string\n) => {\n const kebabCaseKey = key.replace(\n /[A-Z]/g,\n (match) => `-${match.toLowerCase()}`\n );\n\n const value =\n breakpointResponsiveValue &&\n typeof breakpointResponsiveValue === 'object' &&\n isSapphireToken(breakpointResponsiveValue)\n ? breakpointResponsiveValue.value\n : breakpointResponsiveValue;\n\n return `\n @container ${\n typeof container === 'string' ? container : ''\n } (min-width: ${containerBreakpointValue}px) {\n .${className} {\n ${kebabCaseKey}: ${value};\n }\n }`;\n};\n\n/**\n * The `useResolveContainerQuery` hook leverages the power of CSS container queries to dynamically\n * generate and apply styles based on the provided responsive values in relation to the specified\n * container.\n *\n * This hook allows collecting the key-value pairs necessary for generating a new stylesheet that\n * will provide the necessary container queries based on the passed values and appends it to the\n * document's head.\n *\n * By using CSS container queries, we avoid emulating the behavior in JavaScript.\n */\nexport const useContainerStyleProps = <T extends SapphireCommonStyleProps>(\n props: Omit<T & SapphireStyleProps, 'UNSAFE_style' | 'UNSAFE_className'>,\n handlers: StyleHandlers<T>\n): {\n containerStylesClassName: string;\n} => {\n const uniqueId = useId().replace(/:/g, '_');\n // There should only be one classname per element\n const elementClassName = `container-query-${uniqueId}`;\n const breakpointContext = useBreakpointContext();\n\n let stylesString = '';\n Object.keys(props).forEach((_key) => {\n const key = _key as Exclude<keyof T, 'UNSAFE_style' | 'UNSAFE_className'>;\n const responsiveValue = props[key];\n if (!responsiveValue || !isContainerResponsiveProp(responsiveValue)) {\n return;\n }\n\n const breakpoints = [\n 0, // `value.base` should be mapped to min-width: 0px and should always be first in the stylesheet.\n ...Object.keys(responsiveValue).filter(\n (breakpointKey) => !['base', 'container'].includes(breakpointKey)\n ),\n ];\n\n breakpoints.forEach((breakpointKey) => {\n // Try resolving the current breakpoint as a number. If it doesn't work, it's for sure a design-token breakpoint.\n const isDesignTokenBreakpoint = isNaN(Number(breakpointKey));\n const containerBreakpointValue = isDesignTokenBreakpoint\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain -- we are confident it's a BreakpointKey\n breakpointContext?.breakpoints?.[breakpointKey as BreakpointKey]!\n : Number(breakpointKey);\n\n const value = (\n isDesignTokenBreakpoint\n ? responsiveValue[breakpointKey as BreakpointKey]\n : breakpointKey === 0\n ? responsiveValue.base\n : responsiveValue[containerBreakpointValue]\n ) as string | number | undefined | null;\n Object.entries(\n normalizeHandler(handlers[key], value ?? undefined)\n ).forEach(([styleProp, styleValue]) => {\n stylesString += generateRulePart(\n containerBreakpointValue,\n elementClassName,\n styleProp,\n styleValue,\n responsiveValue.container\n );\n });\n });\n });\n\n const getOrCreateStylesheet = useCallback(() => {\n const stylesheetElementId = 'container-query-stylesheet-' + uniqueId;\n let containerQueryStylesheetElement =\n document.getElementById(stylesheetElementId);\n if (!containerQueryStylesheetElement) {\n containerQueryStylesheetElement = document.createElement('style');\n containerQueryStylesheetElement.id = stylesheetElementId;\n document.head.appendChild(containerQueryStylesheetElement);\n }\n return containerQueryStylesheetElement as HTMLStyleElement;\n }, [uniqueId]);\n\n /**\n * Create or update the stylesheet with the generated container query styles.\n *\n * The stylesheet is only created if styles are provided.\n * The stylesheet is removed when the component using the hook is unmounted.\n */\n useEffect(() => {\n if (!stylesString) {\n return;\n }\n\n const styleSheet = getOrCreateStylesheet();\n const cssRuleNode = document.createTextNode(stylesString);\n styleSheet.appendChild(cssRuleNode);\n return () => {\n styleSheet.remove();\n };\n }, [stylesString, getOrCreateStylesheet]);\n\n return {\n containerStylesClassName: stylesString ? elementClassName : '',\n };\n};\n\ninterface RegularStyleProps {\n style?: CSSProperties;\n className?: string;\n}\n\ninterface UnsafeStyleProps {\n UNSAFE_className?: string;\n UNSAFE_style?: CSSProperties;\n}\n\nexport interface SapphireStyleProps\n extends SapphireCommonStyleProps,\n UnsafeStyleProps {}\n\nexport type FilteredProps<P, T> = Omit<\n P,\n keyof (T & RegularStyleProps & UnsafeStyleProps)\n>;\n\nfunction isContainerResponsiveProp<T>(\n prop: any\n): prop is ContainerResponsiveProp<T> {\n return prop && typeof prop === 'object' && 'container' in prop;\n}\n\nexport const useSapphireStyleProps = <\n P extends T,\n T extends SapphireCommonStyleProps = SapphireCommonStyleProps\n>(\n { UNSAFE_className, UNSAFE_style, ...props }: P & SapphireStyleProps,\n handlers: StyleHandlers<T> = commonStyleHandlers as StyleHandlers<T>\n): {\n styleProps: { style: CSSProperties; className?: string };\n filteredProps: FilteredProps<P, T>;\n} => {\n const resolveResponsiveValue = useResolveResponsiveValue();\n const { containerStylesClassName } = useContainerStyleProps<T>(\n props,\n handlers\n );\n const derivedStyle: CSSProperties = {};\n\n const filteredProps = {} as FilteredProps<P, T>;\n\n (Object.keys(props) as Array<keyof typeof props>).forEach((key) => {\n if (\n ['style', 'className'].includes(key as string) &&\n typeof process !== 'undefined' &&\n process.env?.NODE_ENV === 'development'\n ) {\n // eslint-disable-next-line no-console\n return console.warn(\n \"Passing 'style' or 'className' props will have no effect. Please use supported style props directly or use UNSAFE_style or UNSAFE_className if you have no other options than applying style directly to the component.\"\n );\n }\n\n const currentProp = props[key];\n const handler = handlers[key as keyof T];\n if (handler !== undefined && currentProp !== null) {\n if (!isContainerResponsiveProp<T>(currentProp)) {\n /**\n * If no context is provided, we treat it as a viewport query.\n */\n const resolvedResponsiveValue = resolveResponsiveValue(\n // @ts-expect-error: TS2590: Expression produces a union type that is too complex to represent.\n currentProp as Responsive<SapphireToken | string | number | undefined>\n );\n Object.assign(\n derivedStyle,\n normalizeHandler(handler, resolvedResponsiveValue)\n );\n }\n } else {\n // @ts-expect-error: TS2536: Cannot be used to index type 'Omit<P, keyof T>'.\n // TS is not convinced that we're not working with T at this point. We are.\n filteredProps[key] = currentProp;\n }\n });\n\n return {\n styleProps: {\n style: { ...UNSAFE_style, ...derivedStyle },\n className: clsx(UNSAFE_className, containerStylesClassName),\n },\n filteredProps,\n };\n};\n\nfunction normalizeHandler<T extends keyof CSSProperties>(\n handler: StyleHandler<T>,\n value: string | number | undefined\n): CSSProperties {\n const result: CSSProperties = {};\n if (value == undefined) {\n return result;\n }\n if (typeof handler === 'object') {\n if ('convertValue' in handler) {\n value = handler.convertValue(value);\n }\n const styleProps =\n 'styleProps' in handler ? handler.styleProps : [handler.styleProp];\n styleProps.forEach((styleProp) => {\n (result as Record<string, string | number | undefined>)[\n styleProp as keyof CSSProperties\n ] = value;\n });\n } else {\n (result as Record<string, string | number | undefined>)[\n handler as keyof CSSProperties\n ] = value;\n }\n\n return result;\n}\n","import {\n commonStyleHandlers,\n Responsive,\n ResponsiveCssProp,\n SapphireCommonStyleProps,\n StyleHandlers,\n} from './SapphireStyleProps';\nimport { FilteredProps, useSapphireStyleProps } from './useSapphireStyleProps';\n\n/**\n * There are some css properties related to text layout which\n * seem like they should be allowed to be customized, but only\n * in those components which are mean to render text.\n *\n * All the usual text-related properties (eg. font-size,\n * line-height, color etc.) are not allowed because those\n * belong to Sapphire itself.\n *\n * https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Fundamentals#other_properties_worth_looking_at\n */\n\nexport type SapphireTextStyleProps = SapphireCommonStyleProps & {\n textAlign?: ResponsiveCssProp<'textAlign'>;\n textIndent?: ResponsiveCssProp<'textIndent'>;\n textOverflow?: ResponsiveCssProp<'textOverflow'>;\n textAlignLast?: ResponsiveCssProp<'textAlignLast'>;\n textJustify?: ResponsiveCssProp<'textJustify'>;\n overflowWrap?: ResponsiveCssProp<'overflowWrap'>;\n hyphens?: ResponsiveCssProp<'hyphens'>;\n whiteSpace?: ResponsiveCssProp<'whiteSpace'>;\n wordBreak?: ResponsiveCssProp<'wordBreak'>;\n overflow?: ResponsiveCssProp<'overflow'>;\n fontStyle?: Responsive<'normal' | 'italic'>;\n\n /* NOTE:\n *\n * These are the text-layout properties we do not want to support:\n *\n * - line-break: relevant only for asian languages\n * - text-orientation: relevant only for vertical scripts\n * - direction: not relevant. But also it should be defined for the html document itself.\n * - writing-mode: not relevant. But also it should be defined for the html document itself.\n */\n};\n\nexport const sapphireTextStyleHandlers: StyleHandlers<SapphireTextStyleProps> =\n {\n ...commonStyleHandlers,\n textAlign: 'textAlign',\n textIndent: 'textIndent',\n textOverflow: 'textOverflow',\n textAlignLast: 'textAlignLast',\n textJustify: 'textJustify',\n overflowWrap: 'overflowWrap',\n hyphens: 'hyphens',\n whiteSpace: 'whiteSpace',\n wordBreak: 'wordBreak',\n overflow: 'overflow',\n fontStyle: 'fontStyle',\n };\n\nexport const useSapphireTextStyleProps = (\n props: SapphireTextStyleProps\n): {\n styleProps: {\n style: React.CSSProperties;\n className?: string;\n };\n filteredProps: FilteredProps<\n SapphireTextStyleProps,\n SapphireCommonStyleProps\n >;\n} =>\n useSapphireStyleProps<SapphireTextStyleProps>(\n props,\n sapphireTextStyleHandlers\n );\n","import { ListState } from 'react-stately/useListState';\nimport React from 'react';\n\ninterface ListBoxContextValue {\n state: ListState<unknown>;\n shouldUseVirtualFocus: boolean;\n disableSelectedStyles: boolean;\n containerMaxWidth?: number;\n}\n\nexport const ListBoxContext = React.createContext<ListBoxContextValue | null>(\n null\n);\n","export const getAnimationDelay = (order?: number): string | undefined =>\n order ? `${order * 80}ms` : undefined;\n","import React, { useMemo } from 'react';\nimport cx from 'clsx';\n\nimport styles from '@danske/sapphire-css/components/skeleton/skeleton.module.css';\n\nimport { useSapphireStyleProps, useThemeCheck } from '../../utils';\nimport { SkeletonProps } from './skeleton.model';\nimport { getAnimationDelay } from './animation';\n\ninterface SkeletonTextFixedWidth {\n /**\n * Width type. Will be used to determine width calculation.\n * @default 'randomPct'\n * */\n widthType?: 'fixed';\n /** Allowed width of a skeleton */\n width: number;\n minWidth?: never;\n maxWidth?: never;\n}\n\ninterface SkeletonTextRandomPxWidth {\n /**\n * Width type. Will be used to determine width calculation.\n * @default 'randomPct'\n */\n widthType?: 'randomPx';\n /** Min width of skeleton. Used internally to calculate width of a component */\n minWidth?: number;\n /** Max width of skeleton. Used internally to calculate width of a component */\n maxWidth?: number;\n}\n\ninterface SkeletonTextRandomPcWidth {\n /**\n * Width type. Will be used to determine width calculation.\n * @default 'randomPct'\n */\n widthType?: 'randomPct';\n /** Min width of skeleton. Used internally to calculate width of a component */\n minWidth?: number;\n /** Max width of skeleton. Used internally to calculate width of a component */\n maxWidth?: number;\n}\n\nexport type SkeletonTextProps = SkeletonProps &\n (\n | SkeletonTextFixedWidth\n | SkeletonTextRandomPxWidth\n | SkeletonTextRandomPcWidth\n );\n\nconst isFixedWidthType = (\n props: SkeletonTextProps\n): props is SkeletonProps & SkeletonTextFixedWidth => {\n return props.widthType === 'fixed';\n};\n\nexport const SkeletonText: React.FC<SkeletonTextProps> = (props) => {\n useThemeCheck();\n\n const {\n index,\n widthType = 'randomPct',\n UNSAFE_className,\n UNSAFE_style,\n children,\n minWidth = 50,\n maxWidth = 100,\n ...rest\n } = props;\n\n const animationDelay = getAnimationDelay(index);\n // Excluding minWidth & maxWidth props here as they're used only to calculate relevant width but not to define constraints.\n const { styleProps } = useSapphireStyleProps({\n UNSAFE_className,\n UNSAFE_style,\n });\n\n const skeletonWidth = useMemo(() => {\n if (isFixedWidthType(props)) {\n return props.width;\n }\n\n const calculatedWidth = Math.random() * (maxWidth - minWidth) + minWidth;\n\n return widthType === 'randomPct' ? `${calculatedWidth}%` : calculatedWidth;\n }, []);\n\n return (\n <span\n {...rest}\n style={{\n width: skeletonWidth,\n animationDelay,\n ...styleProps.style,\n }}\n className={cx(\n styles['sapphire-skeleton'],\n styles['sapphire-skeleton--text'],\n styleProps.className\n )}\n />\n );\n};\n","import React from 'react';\nimport cx from 'clsx';\n\nimport styles from '@danske/sapphire-css/components/skeleton/skeleton.module.css';\n\nimport { useSapphireStyleProps, useThemeCheck } from '../../utils';\nimport { getAnimationDelay } from './animation';\nimport { SkeletonProps } from './skeleton.model';\n\nexport type SkeletonCircleProps = SkeletonProps;\n\nexport const SkeletonCircle: React.FC<SkeletonCircleProps> = ({\n index,\n children,\n ...rest\n}) => {\n useThemeCheck();\n\n const { styleProps } = useSapphireStyleProps(rest);\n\n const animationDelay = getAnimationDelay(index);\n\n return (\n <div\n {...rest}\n style={{\n animationDelay,\n ...styleProps.style,\n }}\n className={cx(\n styles['sapphire-skeleton'],\n styles['sapphire-skeleton--circle'],\n styleProps.className\n )}\n />\n );\n};\n","import { SkeletonBlock, type SkeletonBlockProps } from './SkeletonBlock';\nimport { SkeletonText, type SkeletonTextProps } from './SkeletonText';\nimport { SkeletonCircle, type SkeletonCircleProps } from './SkeletonCircle';\nimport { SkeletonFrom, type SkeletonFromProps } from './SkeletonFrom';\n\nexport const Skeleton = {\n Block: SkeletonBlock,\n Circle: SkeletonCircle,\n Text: SkeletonText,\n From: SkeletonFrom,\n};\n\nexport type {\n SkeletonBlockProps,\n SkeletonCircleProps,\n SkeletonFromProps,\n SkeletonTextProps,\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport iconStyles from '@danske/sapphire-css/components/icon/icon.module.css';\nimport styles from '@danske/sapphire-css/components/listbox/listbox.module.css';\nimport { Skeleton } from '../../Skeleton';\n\ninterface ListBoxItemSkeletonProps {\n index?: number;\n /**\n * Can be used for rendering custom skeleton (ReactNode) instead of primaryText\n * @default 'true'\n */\n primaryText?: boolean | React.ReactNode;\n secondaryText?: boolean | React.ReactNode;\n icon?: boolean | React.ReactNode;\n /**\n * The size of the skeleton icon.\n * @default 'lg'\n */\n iconSize?: 'sm' | 'md' | 'lg' | 'xl';\n}\n\nexport const ListBoxItemSkeleton: React.FC<ListBoxItemSkeletonProps> = ({\n index,\n primaryText = true,\n secondaryText = false,\n icon = false,\n iconSize = 'lg',\n}) => (\n <div\n className={clsx(\n styles['sapphire-listbox__item'],\n styles['js-hover'],\n styles['js-focus']\n )}\n >\n <div className={styles['sapphire-listbox__content']}>\n {icon && (\n <div className={styles['sapphire-listbox__icon']}>\n <div\n className={clsx(iconStyles['sapphire-icon'], {\n [iconStyles['sapphire-icon--sm']]: iconSize === 'sm',\n [iconStyles['sapphire-icon--md']]: iconSize === 'md',\n [iconStyles['sapphire-icon--lg']]: iconSize === 'lg',\n [iconStyles['sapphire-icon--xl']]: iconSize === 'xl',\n })}\n >\n {icon === true ? <Skeleton.Circle index={index} /> : icon}\n </div>\n </div>\n )}\n <div className={styles['sapphire-listbox__text-container']}>\n <div className={styles['sapphire-listbox__primary-text']}>\n {primaryText === true ? <Skeleton.Text index={index} /> : primaryText}\n </div>\n {secondaryText && (\n <div className={styles['sapphire-listbox__secondary-text']}>\n {secondaryText === true ? (\n <Skeleton.Text index={index} />\n ) : (\n secondaryText\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n);\n","import clsx from 'clsx';\nimport React from 'react';\nimport { getWrappedElement } from '@react-spectrum/utils';\nimport styles from '@danske/sapphire-css/components/icon/icon.module.css';\n\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n} from '../../utils';\nimport { GlobalDomAttributes } from '../../utils/types';\n\nexport type IconProps = GlobalDomAttributes &\n SapphireStyleProps & {\n 'aria-label'?: string;\n /**\n * The size of the icon.\n * @default 'md'\n */\n size?: 'sm' | 'md' | 'lg' | 'xl';\n /**\n * The semantic color of the icon\n * @default 'inherit'\n */\n color?:\n | 'inherit'\n | 'primary'\n | 'secondary'\n | 'positive'\n | 'negative'\n | 'warning'\n | 'informative';\n children: React.ReactNode;\n };\n\n/**\n * `Icon` should be used to render Sapphire icon or custom SVG with the correct size, semantic color, and\n * accessibility attributes.\n *\n * Provide an `aria-label` when the icon conveys meaning on its own. If the icon is decorative,\n * omit `aria-label` and it will be hidden from assistive technologies.\n */\nexport const Icon = React.forwardRef(function Icon(\n {\n size = 'md',\n color = 'inherit',\n 'aria-label': ariaLabel,\n ...props\n }: IconProps,\n ref: React.Ref<HTMLSpanElement>\n) {\n useThemeCheck();\n\n const { styleProps } = useSapphireStyleProps(props);\n const colorClass =\n color === 'inherit' ? undefined : styles[`sapphire-icon--${color}`];\n\n return React.cloneElement(getWrappedElement(props.children), {\n ref,\n role: 'img',\n ...(ariaLabel ? { 'aria-label': ariaLabel } : { 'aria-hidden': true }),\n className: clsx(\n styles['sapphire-icon'],\n styleProps.className,\n styles[`sapphire-icon--${size}`],\n colorClass\n ),\n style: styleProps.style,\n });\n});\n","import { DOMAttributes, DOMProps } from '@react-types/shared';\nimport React, { ElementType, ForwardedRef, forwardRef, ReactNode } from 'react';\n\nimport {\n commonStyleHandlers,\n ResponsiveCssProp,\n SapphireCommonStyleProps,\n SapphireStyleProps,\n StyleHandlers,\n useSapphireStyleProps,\n useThemeCheck,\n} from '../../utils';\nimport { GlobalDomAttributes } from '../../utils/types';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport interface FlexStyleProps extends SapphireCommonStyleProps {\n /**\n * The direction in which to layout children. See\n * [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-direction).\n * @default 'row'\n */\n flexDirection?: ResponsiveCssProp<'flexDirection'>;\n /**\n * Whether to wrap items onto multiple lines. See\n * [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-wrap).\n * @default false\n */\n flexWrap?: ResponsiveCssProp<'flexWrap'>;\n /**\n * CSS shorthand property specifies the direction of a flex container, as well as its wrapping\n * behavior. see [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/flex-flow)\n */\n flexFlow?: ResponsiveCssProp<'flexFlow'>;\n\n justifyContent?: ResponsiveCssProp<'justifyContent'>;\n alignItems?: ResponsiveCssProp<'alignItems'>;\n alignContent?: ResponsiveCssProp<'alignContent'>;\n\n /** The space to display between both rows and columns. See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/gap). */\n gap?: ResponsiveCssProp<'gap', 'size'>;\n /** The space to display between columns. See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/column-gap). */\n columnGap?: ResponsiveCssProp<'columnGap', 'size'>;\n /** The space to display between rows. See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/row-gap). */\n rowGap?: ResponsiveCssProp<'rowGap', 'size'>;\n\n padding?: ResponsiveCssProp<'padding', 'size'>;\n paddingLeft?: ResponsiveCssProp<'padding', 'size'>;\n paddingRight?: ResponsiveCssProp<'paddingRight', 'size'>;\n paddingTop?: ResponsiveCssProp<'paddingTop', 'size'>;\n paddingBottom?: ResponsiveCssProp<'paddingBottom', 'size'>;\n\n container?: ResponsiveCssProp<'container'>;\n containerType?: ResponsiveCssProp<'containerType'>;\n containerName?: ResponsiveCssProp<'containerName'>;\n}\nexport interface FlexProps\n extends DOMProps,\n GlobalDomAttributes,\n Omit<\n DOMAttributes,\n 'children' | 'style' | 'className' | 'dangerouslySetInnerHTML'\n >,\n SapphireStyleProps,\n FlexStyleProps {\n /** Children of the flex container. */\n children: ReactNode;\n /**\n * @default 'div'\n */\n elementType?: ElementType;\n}\n\nexport const flexStylePropsHandler: StyleHandlers<FlexStyleProps> = {\n ...commonStyleHandlers,\n flexDirection: 'flexDirection',\n flexWrap: 'flexWrap',\n flexFlow: 'flexFlow',\n justifyContent: { styleProp: 'justifyContent', convertValue: flexAlignValue },\n alignItems: { styleProp: 'alignItems', convertValue: flexAlignValue },\n alignContent: { styleProp: 'alignContent', convertValue: flexAlignValue },\n gap: 'gap',\n columnGap: 'columnGap',\n rowGap: 'rowGap',\n padding: 'padding',\n paddingLeft: 'paddingLeft',\n paddingRight: 'paddingRight',\n paddingTop: 'paddingTop',\n paddingBottom: 'paddingBottom',\n container: 'container',\n containerType: 'containerType',\n containerName: 'containerName',\n};\n\nexport const Flex = forwardRef(function Flex(\n props: FlexProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n useThemeCheck();\n const { children, elementType, ...otherProps } = props;\n const { styleProps, filteredProps } = useSapphireStyleProps<\n Omit<FlexProps, 'children'>,\n FlexStyleProps\n >(otherProps, flexStylePropsHandler);\n\n const style = {\n ...styleProps.style,\n display: 'flex',\n };\n\n const ElementType = elementType || 'div';\n\n return (\n <ElementType\n {...filteredProps}\n {...filterDOMProps(props, { global: true })}\n style={style}\n ref={ref}\n className={styleProps.className}\n >\n {children}\n </ElementType>\n );\n});\n\n/**\n * Normalize 'start' and 'end' alignment values to 'flex-start' and 'flex-end'\n * in flex containers for browser compatibility.\n */\nfunction flexAlignValue(value: string): string {\n if (value === 'start') {\n return 'flex-start';\n }\n\n if (value === 'end') {\n return 'flex-end';\n }\n\n return value;\n}\n","import React, { ForwardedRef, forwardRef, ReactNode } from 'react';\nimport { DOMAttributes, DOMProps } from '@react-types/shared';\n\nimport {\n commonStyleHandlers,\n ResponsiveCssProp,\n SapphireCommonStyleProps,\n SapphireStyleProps,\n StyleHandlers,\n useSapphireStyleProps,\n useThemeCheck,\n} from '../../utils';\nimport { GlobalDomAttributes } from '../../utils/types';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport interface GridStyleProps extends SapphireCommonStyleProps {\n /* Controls how the auto-placement algorithm works. Specifies how auto-placed items get flowed into the grid.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-auto-flow).\n */\n gridAutoFlow?: ResponsiveCssProp<'gridAutoFlow'>;\n\n /* Specifies the size of an implicitly-created grid column track or pattern of tracks.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-auto-columns).\n */\n gridAutoColumns?: ResponsiveCssProp<'gridAutoColumns'>;\n\n /* Specifies the size of an implicitly-created grid row track or pattern of tracks.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-auto-rows).\n */\n gridAutoRows?: ResponsiveCssProp<'gridAutoRows'>;\n\n /* Specifies named grid areas, establishing the cells in the grid and assigning them names.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-areas).\n */\n gridTemplateAreas?: ResponsiveCssProp<'gridTemplateAreas'>;\n\n /* Defines the line names and track sizing functions of the grid columns.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-columns).\n */\n gridTemplateColumns?: ResponsiveCssProp<'gridTemplateColumns'>;\n\n /* Defines the line names and track sizing functions of the grid rows.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/grid-template-rows).\n */\n gridTemplateRows?: ResponsiveCssProp<'gridTemplateRows'>;\n\n /* The space between rows and columns. It is a shorthand for rowGap and columnGap.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/gap).\n */\n gap?: ResponsiveCssProp<'gap', 'size'>;\n\n /* The space to display between a grid's columns.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/column-gap).\n */\n columnGap?: ResponsiveCssProp<'columnGap', 'size'>;\n\n /* The space to display between a grid's rows.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/row-gap).\n */\n rowGap?: ResponsiveCssProp<'rowGap', 'size'>;\n\n /* The space to display between a grid's rows.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-items).\n */\n justifyItems?: ResponsiveCssProp<'justifyItems'>;\n\n /* The space to display between a grid's columns.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/justify-content).\n */\n justifyContent?: ResponsiveCssProp<'justifyContent'>;\n\n /* Sets the align-self value on all direct children as a group\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/align-items).\n */\n alignItems?: ResponsiveCssProp<'alignItems'>;\n\n /* Sets the distribution of space between and around content items along the grid's block axis.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/align-content).\n */\n alignContent?: ResponsiveCssProp<'alignContent'>;\n padding?: ResponsiveCssProp<'padding', 'size'>;\n paddingLeft?: ResponsiveCssProp<'padding', 'size'>;\n paddingRight?: ResponsiveCssProp<'paddingRight', 'size'>;\n paddingTop?: ResponsiveCssProp<'paddingTop', 'size'>;\n paddingBottom?: ResponsiveCssProp<'paddingBottom', 'size'>;\n}\nexport interface GridProps\n extends DOMProps,\n Omit<\n DOMAttributes,\n 'children' | 'style' | 'className' | 'dangerouslySetInnerHTML'\n >,\n SapphireStyleProps,\n GridStyleProps,\n GlobalDomAttributes {\n /** Children of the grid container. */\n children: ReactNode;\n}\n\nexport const gridStylePropsHandler: StyleHandlers<GridStyleProps> = {\n ...commonStyleHandlers,\n gridAutoFlow: 'gridAutoFlow',\n gridAutoColumns: 'gridAutoColumns',\n gridAutoRows: 'gridAutoRows',\n gridTemplateAreas: 'gridTemplateAreas',\n gridTemplateColumns: 'gridTemplateColumns',\n gridTemplateRows: 'gridTemplateRows',\n gap: 'gap',\n columnGap: 'columnGap',\n rowGap: 'rowGap',\n justifyItems: 'justifyItems',\n justifyContent: 'justifyContent',\n alignItems: 'alignItems',\n alignContent: 'alignContent',\n padding: 'padding',\n paddingLeft: 'paddingLeft',\n paddingRight: 'paddingRight',\n paddingTop: 'paddingTop',\n paddingBottom: 'paddingBottom',\n};\n\nexport const Grid = forwardRef(function Grid(\n props: GridProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n useThemeCheck();\n\n const { children, ...otherProps } = props;\n const { styleProps, filteredProps } = useSapphireStyleProps<\n Omit<GridProps, 'children'>,\n GridStyleProps\n >(otherProps, gridStylePropsHandler);\n\n const style = {\n ...styleProps.style,\n display: 'grid',\n };\n\n return (\n <div\n {...filteredProps}\n {...filterDOMProps(props, { global: true })}\n style={style}\n ref={ref}\n className={styleProps.className}\n >\n {children}\n </div>\n );\n});\n","import React, {\n ForwardedRef,\n forwardRef,\n JSXElementConstructor,\n ReactNode,\n} from 'react';\nimport { DOMProps, DOMAttributes } from '@react-types/shared';\n\nimport { FlexStyleProps, flexStylePropsHandler } from '../../Flex/src/Flex';\nimport { GridStyleProps, gridStylePropsHandler } from '../../Grid/src/Grid';\nimport {\n commonStyleHandlers,\n ResponsiveCssProp,\n SapphireCommonStyleProps,\n SapphireStyleProps,\n StyleHandlers,\n useSapphireStyleProps,\n useThemeCheck,\n} from '../../utils';\nimport { GlobalDomAttributes } from '../../utils/types';\n\nexport interface ViewProps\n extends GlobalDomAttributes,\n SapphireStyleProps,\n SapphireViewStyleProps,\n DOMProps,\n Omit<\n DOMAttributes,\n 'children' | 'style' | 'className' | 'dangerouslySetInnerHTML'\n > {\n /**\n * The element to render as the node.\n * @default: 'div'\n */\n /* eslint-disable @typescript-eslint/no-explicit-any */\n elementType?: string | JSXElementConstructor<any>;\n /**\n * Children to be displayed in the View.\n */\n children?: ReactNode;\n}\n\nexport interface SapphireViewStyleProps\n extends SapphireCommonStyleProps,\n FlexStyleProps,\n GridStyleProps {\n display?: ResponsiveCssProp<'display'>;\n\n backgroundColor?: ResponsiveCssProp<'backgroundColor', 'color'>;\n color?: ResponsiveCssProp<'color', 'color'>;\n\n border?: ResponsiveCssProp<'border'>;\n borderWidth?: ResponsiveCssProp<'borderWidth', 'size'>;\n borderColor?: ResponsiveCssProp<'borderColor', 'color'>;\n borderStyle?: ResponsiveCssProp<'borderColor'>;\n borderLeft?: ResponsiveCssProp<'borderLeft'>;\n borderLeftColor?: ResponsiveCssProp<'borderLeftColor', 'color'>;\n borderLeftWidth?: ResponsiveCssProp<'borderLeftWidth', 'size'>;\n borderLeftStyle?: ResponsiveCssProp<'borderLeftStyle'>;\n borderRight?: ResponsiveCssProp<'borderRight'>;\n borderRightColor?: ResponsiveCssProp<'borderRightColor', 'color'>;\n borderRightWidth?: ResponsiveCssProp<'borderRightWidth', 'size'>;\n borderRightStyle?: ResponsiveCssProp<'borderRightStyle'>;\n borderTop?: ResponsiveCssProp<'borderTop'>;\n borderTopColor?: ResponsiveCssProp<'borderTopColor', 'color'>;\n borderTopWidth?: ResponsiveCssProp<'borderTopWidth', 'size'>;\n borderTopStyle?: ResponsiveCssProp<'borderTopStyle'>;\n borderBottom?: ResponsiveCssProp<'borderBottom'>;\n borderBottomColor?: ResponsiveCssProp<'borderBottomColor', 'color'>;\n borderBottomWidth?: ResponsiveCssProp<'borderBottomWidth', 'size'>;\n borderBottomStyle?: ResponsiveCssProp<'borderBottomStyle'>;\n borderRadius?: ResponsiveCssProp<'borderRadius', 'size'>;\n borderTopLeftRadius?: ResponsiveCssProp<'borderTopLeftRadius', 'size'>;\n borderTopRightRadius?: ResponsiveCssProp<'borderTopRightRadius', 'size'>;\n borderBottomLeftRadius?: ResponsiveCssProp<'borderBottomLeftRadius', 'size'>;\n borderBottomRightRadius?: ResponsiveCssProp<\n 'borderBottomRightRadius',\n 'size'\n >;\n\n boxShadow?: ResponsiveCssProp<'boxShadow', 'shadow'>;\n\n container?: ResponsiveCssProp<'container'>;\n containerType?: ResponsiveCssProp<'containerType'>;\n containerName?: ResponsiveCssProp<'containerName'>;\n\n overflow?: ResponsiveCssProp<'overflow'>;\n overflowX?: ResponsiveCssProp<'overflowX'>;\n overflowY?: ResponsiveCssProp<'overflowY'>;\n}\nexport const viewStylePropHandlers: StyleHandlers<SapphireViewStyleProps> = {\n ...commonStyleHandlers,\n ...flexStylePropsHandler,\n ...gridStylePropsHandler,\n display: 'display',\n color: 'color',\n backgroundColor: 'backgroundColor',\n border: 'border',\n borderWidth: 'borderWidth',\n borderColor: 'borderColor',\n borderStyle: 'borderStyle',\n borderLeft: 'borderLeft',\n borderLeftWidth: 'borderLeftWidth',\n borderLeftColor: 'borderLeftColor',\n borderLeftStyle: 'borderLeftStyle',\n borderRight: 'borderRight',\n borderRightWidth: 'borderRightWidth',\n borderRightColor: 'borderRightColor',\n borderRightStyle: 'borderRightStyle',\n borderTop: 'borderTop',\n borderTopWidth: 'borderTopWidth',\n borderTopColor: 'borderTopColor',\n borderTopStyle: 'borderTopStyle',\n borderBottom: 'borderBottom',\n borderBottomWidth: 'borderBottomWidth',\n borderBottomColor: 'borderBottomColor',\n borderBottomStyle: 'borderBottomStyle',\n borderRadius: 'borderRadius',\n borderTopLeftRadius: 'borderTopLeftRadius',\n borderTopRightRadius: 'borderTopRightRadius',\n borderBottomLeftRadius: 'borderBottomLeftRadius',\n borderBottomRightRadius: 'borderBottomRightRadius',\n boxShadow: 'boxShadow',\n container: 'container',\n containerType: 'containerType',\n containerName: 'containerName',\n overflow: 'overflow',\n overflowX: 'overflowX',\n overflowY: 'overflowY',\n};\n\nexport const View = forwardRef(function View(\n { elementType: ElementType = 'div', children, ...otherProps }: ViewProps,\n ref: ForwardedRef<HTMLElement>\n) {\n useThemeCheck();\n\n const { styleProps, filteredProps } = useSapphireStyleProps<\n ViewProps,\n SapphireViewStyleProps\n >(otherProps, viewStylePropHandlers);\n\n return (\n <ElementType {...filteredProps} {...styleProps} ref={ref}>\n {children}\n </ElementType>\n );\n});\n","import React, { ReactNode, useContext, forwardRef, ForwardedRef } from 'react';\nimport clsx from 'clsx';\nimport { ThemeContext, ThemeContextProps } from '@danske/sapphire-react-context';\nimport { Theme } from '@danske/sapphire-css/themes';\nimport { SapphireStyleProps, useSapphireStyleProps } from '../../utils';\nimport { ThemeVariant } from '../../SapphireProvider/src';\nimport surfaceStyles from '@danske/sapphire-css/components/surface/surface.module.css';\nimport { SapphireViewStyleProps } from '../../View';\nimport { DOMProps, DOMAttributes } from '@react-types/shared';\nimport { viewStylePropHandlers } from '../../View/src/View';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\n\nexport interface ThemeRootProps\n extends SapphireStyleProps,\n Omit<SapphireViewStyleProps, 'backgroundColor' | 'color'>,\n DOMProps,\n Omit<\n DOMAttributes,\n 'children' | 'style' | 'className' | 'dangerouslySetInnerHTML'\n > {\n /**\n * The theme variation, if the theme supports any.\n */\n variant?: ThemeVariant;\n noSurface?: boolean;\n children: ReactNode;\n}\n\n/**\n * ThemeRoot wraps the children with an element that provides the design tokens\n * in the DOM subtree. Also renders the necessary background surface for the\n * theme's components to be rendered on.\n */\nexport const ThemeRoot = forwardRef(function ThemeRoot(\n { children, variant, noSurface = false, ...props }: ThemeRootProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n const themeContext = useContext(ThemeContext);\n\n if (typeof themeContext.theme === 'undefined') {\n throw new Error(\n '<ThemeRoot> must be rendered inside a <SapphireProvider>.'\n );\n }\n const { styleProps } = useSapphireStyleProps(props, viewStylePropHandlers);\n const theme = themeContext.theme as ThemeContextProps<\n Theme,\n ThemeVariant\n >['theme'];\n const themeVariant =\n variant ||\n (themeContext.themeVariant as ThemeContextProps<\n Theme,\n ThemeVariant\n >['themeVariant']);\n\n const themeClassName = theme?.themeClassName;\n const colorScheme = themeClassName?.includes('dark') ? 'dark' : 'light';\n\n return (\n <div\n className={clsx(\n themeClassName,\n themeVariant === 'secondary'\n ? theme?.themeSecondaryModifierClassName\n : themeVariant === 'tertiary'\n ? theme?.themeTertiaryModifierClassName\n : themeVariant === 'contrast'\n ? theme?.themeContrastModifierClassName\n : null,\n styleProps.className,\n !noSurface && surfaceStyles['sapphire-surface']\n )}\n style={{ ...styleProps.style, colorScheme }}\n ref={ref}\n {...filterDOMProps(props, { global: true })}\n >\n {children}\n </div>\n );\n});\n","import React, { useContext } from 'react';\nimport clsx from 'clsx';\nimport { useHover } from 'react-aria/useHover';\nimport { isFocusVisible } from 'react-aria/private/interactions/useFocusVisible';\nimport { useFocusRing } from 'react-aria/useFocusRing';\nimport { useOption } from 'react-aria/useListBox';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { Node } from '@react-types/shared';\n\nimport styles from '@danske/sapphire-css/components/listbox/listbox.module.css';\nimport avatarStyles from '@danske/sapphire-css/components/avatar/avatar.module.css';\nimport { Checkmark } from '@danske/sapphire-icons/react';\n\nimport { Icon } from '../../Icon';\nimport { usePreventTouchEnd } from '../../utils';\nimport { ListBoxContext } from './ListBoxContext';\nimport { tokens } from '../../SapphireProvider';\n\ninterface OptionProps<T> {\n item: Node<T>;\n}\n\nexport const ListBoxOption = <T extends object>({\n item,\n}: OptionProps<T>): JSX.Element => {\n const ref = React.useRef<HTMLDivElement>(null);\n const {\n state,\n shouldUseVirtualFocus,\n disableSelectedStyles,\n containerMaxWidth,\n } = useContext(ListBoxContext)!;\n const {\n optionProps,\n isDisabled,\n isFocused: isVirtuallyFocused,\n isPressed,\n } = useOption({ key: item.key }, state, ref);\n\n const { focusProps, isFocusVisible: isFocusRingVisible } = useFocusRing();\n const { hoverProps, isHovered } = useHover({ isDisabled });\n\n usePreventTouchEnd(ref);\n\n const rightIcon = item.props.rightIcon || item.props.icon;\n\n return (\n <div\n {...mergeProps(\n optionProps,\n hoverProps,\n shouldUseVirtualFocus ? {} : focusProps\n )}\n ref={ref}\n className={clsx(\n styles['sapphire-listbox__item'],\n styles['js-hover'],\n styles['js-focus'],\n {\n [styles['is-disabled']]: isDisabled,\n [styles['is-focus']]: shouldUseVirtualFocus\n ? isVirtuallyFocused && isFocusVisible()\n : isFocusRingVisible,\n [styles['is-hover']]: isHovered,\n [styles['is-active']]: isPressed,\n }\n )}\n >\n <div\n className={clsx(styles['sapphire-listbox__content'])}\n style={\n containerMaxWidth !== undefined\n ? {\n maxWidth: `calc(${containerMaxWidth}px - 2 * ${tokens.size.iconSm})`,\n }\n : undefined\n }\n >\n {!disableSelectedStyles && (\n <div\n className={clsx(styles['sapphire-listbox__checkmark'])}\n style={{\n visibility: state.selectionManager.selectedKeys.has(item.key)\n ? 'visible'\n : 'hidden',\n }}\n >\n <Icon size=\"sm\" color=\"informative\">\n <Checkmark />\n </Icon>\n </div>\n )}\n {item.props.leftIcon && (\n <div className={clsx(styles['sapphire-listbox__icon'])}>\n <Icon size=\"sm\">{item.props.leftIcon}</Icon>\n </div>\n )}\n <div className={clsx(styles['sapphire-listbox__text-container'])}>\n <div className={clsx(styles['sapphire-listbox__primary-text'])}>\n {item.rendered}\n </div>\n {item.props.secondaryText && (\n <div className={clsx(styles['sapphire-listbox__secondary-text'])}>\n {item.props.secondaryText}\n </div>\n )}\n </div>\n {rightIcon ? (\n <div className={clsx(styles['sapphire-listbox__icon'])}>\n <Icon size=\"sm\">{rightIcon}</Icon>\n </div>\n ) : (\n item.props.avatar && (\n <div className={clsx(styles['sapphire-listbox__icon'])}>\n <div\n className={clsx(\n avatarStyles['sapphire-avatar'],\n avatarStyles['sapphire-avatar--sm']\n )}\n >\n {item.props.avatar}\n </div>\n </div>\n )\n )}\n </div>\n </div>\n );\n};\n","import { useContext } from 'react';\nimport { ThemeContext } from '@danske/sapphire-react-context';\n\n/**\n * Checks if Sapphire theme context is provided. Meant to be used only inside Sapphire components.\n * @private\n */\nexport const useThemeCheck = (): void => {\n const themeContext = useContext(ThemeContext);\n if (typeof themeContext.theme === undefined) {\n throw new Error(\n 'A Sapphire component must be rendered inside a <SapphireProvider>.'\n );\n }\n};\n","/**\n * Based on: https://github.com/adobe/react-spectrum/blob/main/packages/%40react-spectrum/divider/src/Divider.tsx\n */\nimport React, { forwardRef } from 'react';\nimport clsx from 'clsx';\nimport { DOMProps } from '@react-types/shared';\nimport { Separator as RACSeparator } from 'react-aria-components';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useThemeCheck,\n} from '../../utils';\nimport { GlobalDomAttributes } from '../../utils/types';\nimport { filterDOMProps } from 'react-aria/filterDOMProps';\nimport styles from '@danske/sapphire-css/components/separator/separator.module.css';\n\nexport interface SeparatorProps\n extends DOMProps,\n GlobalDomAttributes,\n SapphireStyleProps {\n /**\n * The orientation of the separator.\n *\n * @default 'horizontal'\n */\n orientation?: 'horizontal' | 'vertical';\n}\n\nexport const Separator = forwardRef(function Separator(\n props: SeparatorProps,\n ref: React.ForwardedRef<HTMLElement>\n) {\n useThemeCheck();\n const { orientation = 'horizontal', ...otherProps } = props;\n const { styleProps, filteredProps } = useSapphireStyleProps(otherProps);\n\n return (\n <RACSeparator\n ref={ref}\n {...filteredProps}\n {...filterDOMProps(props, { global: true })}\n style={styleProps.style}\n className={clsx(styles['sapphire-separator'], styleProps.className)}\n orientation={orientation}\n />\n );\n});\n","import React, { DOMAttributes, ReactNode, useRef } from 'react';\nimport { FocusableElement, Node } from '@react-types/shared';\nimport { useListBoxSection } from 'react-aria/useListBox';\nimport { ReusableView } from 'react-stately/useVirtualizerState';\nimport styles from '@danske/sapphire-css/components/listbox/listbox.module.css';\nimport {\n useVirtualizerItem,\n VirtualizerItemOptions,\n} from 'react-aria/private/virtualizer/useVirtualizerItem';\nimport { layoutInfoToStyle } from 'react-aria/private/virtualizer/VirtualizerItem';\nimport { LayoutInfo } from 'react-stately/useVirtualizerState';\n\nimport { useThemeCheck } from '../../utils/useThemeCheck';\nimport { Separator } from '../../Separator';\n\ntype ListBoxSectionProps<T> = Omit<VirtualizerItemOptions, 'ref'> & {\n item: Node<T>;\n childrenViews?: ReusableView<Node<T>, ReactNode>[];\n children?: ReactNode;\n};\n\nexport function ListBoxSection<T extends object>({\n item,\n layoutInfo,\n virtualizer,\n childrenViews,\n children,\n}: ListBoxSectionProps<T>): JSX.Element {\n useThemeCheck();\n\n const { groupProps, headingProps } = useListBoxSection({\n 'aria-label': item['aria-label'],\n heading: item.rendered,\n });\n\n const headerLayoutInfo =\n childrenViews &&\n childrenViews.find((c) => c.viewType === 'header')?.layoutInfo;\n const dividerLayoutInfo =\n childrenViews &&\n childrenViews.find((c) => c.viewType === 'divider')?.layoutInfo;\n\n return (\n <>\n {headerLayoutInfo && (\n <div\n role=\"presentation\"\n style={layoutInfoToStyle(headerLayoutInfo, 'ltr')}\n >\n {item.prevKey && (\n <Separator\n UNSAFE_className={styles['sapphire-listbox__separator']}\n />\n )}\n {item.rendered && (\n <SectionHeader\n item={item}\n headerLayoutInfo={headerLayoutInfo!}\n headingProps={headingProps}\n virtualizer={virtualizer}\n />\n )}\n </div>\n )}\n {layoutInfo && (\n <div\n {...groupProps}\n key={layoutInfo.key}\n style={layoutInfoToStyle(layoutInfo, 'ltr')}\n className={styles['sapphire-listbox__section']}\n >\n {children}\n </div>\n )}\n {dividerLayoutInfo && (\n <div\n role=\"presentation\"\n style={layoutInfoToStyle(dividerLayoutInfo, 'ltr')}\n >\n <Separator UNSAFE_className={styles['sapphire-listbox__separator']} />\n </div>\n )}\n </>\n );\n}\n\nconst SectionHeader = <T,>({\n item,\n headerLayoutInfo,\n headingProps,\n virtualizer,\n}: {\n item: Node<T>;\n headerLayoutInfo: LayoutInfo;\n headingProps: DOMAttributes<FocusableElement>;\n virtualizer: VirtualizerItemOptions['virtualizer'];\n}) => {\n const headerRef = useRef<HTMLDivElement>(null);\n\n useVirtualizerItem({\n layoutInfo: headerLayoutInfo!,\n virtualizer,\n ref: headerRef,\n });\n\n return (\n <div\n {...headingProps}\n ref={headerRef}\n className={styles['sapphire-listbox__section-header']}\n >\n {item.rendered}\n </div>\n );\n};\n","import {\n LayoutNode,\n ListLayout,\n ListLayoutOptions,\n} from 'react-stately/useVirtualizerState';\nimport React, { Key } from 'react';\nimport {\n InvalidationContext,\n Rect,\n Size,\n} from 'react-stately/useVirtualizerState';\nimport { Node } from '@react-types/shared';\n\n/**\n * Extends `ListLayout` and allows items of the list to have width based on the content.\n * `ListLayout` by default sets width based on the virtualizer's visible rect. This means the\n * overflow of list items will be clipped. In `VariableWidthListLayout`, the width of the list\n * depends on the content of the visible items.\n *\n * NOTE: At the time of writing this class, Virtualization in @react-aria and @react-stately don't\n * have proper documentation, and it wasn't clear if there could be better ways of letting list's\n * width grow based on the content.\n */\nexport class VariableWidthListLayout<T> extends ListLayout<T> {\n /**\n * content width of items are stored here, if the content width is bigger than the Virtualizer's\n * visible rect's width.\n */\n keyToWidth = new Map<Key, number>();\n private visibleContentWidth: number = 0;\n\n constructor(options: ListLayoutOptions) {\n super(options);\n }\n\n override buildItem(node: Node<T>, x: number, y: number): LayoutNode {\n const previousLayoutNode = this.layoutNodes.get(node.key);\n const layoutNode = super.buildItem(node, x, y);\n if (this.visibleContentWidth) {\n layoutNode.layoutInfo.rect.width = this.visibleContentWidth;\n }\n // If only the width changed (not the content) and the item was already\n // measured, don't mark as estimated. This prevents re-measurement cascades\n // where width expansion → re-measure → new wider items → more width\n // expansion can exceed React's update depth limit.\n if (\n previousLayoutNode &&\n previousLayoutNode.node === node &&\n !previousLayoutNode.layoutInfo.estimatedSize\n ) {\n layoutNode.layoutInfo.estimatedSize = false;\n }\n return layoutNode;\n }\n\n /**\n * Allows for overriding buildCollection in a sub-class\n */\n protected doBuildCollection(): LayoutNode[] {\n return super.buildCollection();\n }\n\n buildCollection(): LayoutNode[] {\n this.visibleContentWidth = this.getVisibleContentWidth();\n const layoutNodes = this.doBuildCollection();\n this.contentSize.width = this.visibleContentWidth;\n return layoutNodes;\n }\n\n override shouldInvalidate(newRect: Rect, oldRect: Rect): boolean {\n return (\n super.shouldInvalidate(newRect, oldRect) ||\n this.getVisibleContentWidth() !== this.visibleContentWidth\n );\n }\n\n override shouldInvalidateEverything(\n invalidationContext: InvalidationContext<ListLayoutOptions>\n ): boolean {\n return (\n super.shouldInvalidateEverything(invalidationContext) ||\n // in buildChild, if invalidateEverything is false and y is not changed, it will reuse the existing layoutInfo.\n // which can be problematic, if it was created in a time when the visible content width was different.\n // A more efficient approach (instead of rebuilding the whole collection), might be to set layout width to\n // visibleContentWidth, in getVisibleLayoutInfos, if mutation is ok.\n // UPDATE: using getFinalLayoutInfo seems to be a legitimate last minute way to mutate layout infos.\n this.contentSize?.width !== this.visibleContentWidth\n );\n }\n\n override updateItemSize(key: React.Key, size: Size): boolean {\n const changed = super.updateItemSize(key, size);\n const layoutNode = this.layoutNodes.get(key);\n // If no layoutInfo, item has been deleted/removed.\n if (!layoutNode) return false;\n const layoutInfo = layoutNode.layoutInfo;\n if (layoutInfo && size.width > this.contentSize.width) {\n this.keyToWidth.set(key, size.width);\n // Update contentSize.width immediately so that subsequent items measured\n // in the same render cycle compare against the latest max width, avoiding\n // redundant invalidations that can exceed React's update depth limit.\n this.contentSize.width = size.width;\n return true;\n } else {\n return changed;\n }\n }\n\n private getVisibleContentWidth() {\n return this.virtualizer\n ? Math.max(\n this.virtualizer.visibleRect.width,\n ...Array.from(this.keyToWidth.values())\n )\n : 0;\n }\n}\n","import { LayoutInfo, Rect, Size } from 'react-stately/useVirtualizerState';\nimport {\n LayoutNode,\n ListLayoutOptions,\n} from 'react-stately/useVirtualizerState';\nimport { Node } from '@react-types/shared';\nimport { Key } from 'react';\nimport { VariableWidthListLayout } from './VariableWidthListLayout';\n\ninterface ListWithLoadingStateLayoutProps {\n loadingState?: 'loading' | 'loadingMore';\n loadingRowsCount: number;\n sectionDividerHeight: number;\n headingHeight: number;\n}\n\nexport class ListWithLoadingStateLayout<T> extends VariableWidthListLayout<T> {\n readonly options;\n\n constructor(\n options: Pick<ListLayoutOptions, 'rowHeight' | 'estimatedRowHeight'> &\n ListWithLoadingStateLayoutProps\n ) {\n super(options);\n this.options = options;\n\n this.loaderSize =\n options.loadingRowsCount *\n (options.rowHeight ?? options.estimatedRowHeight ?? 50);\n }\n\n override doBuildCollection(): LayoutNode[] {\n let nodes: LayoutNode[] = [];\n if (this.options.loadingState === 'loading' || this.collection.size === 0) {\n this.contentSize.height = 0;\n } else {\n nodes = super.doBuildCollection();\n }\n if (this.options.loadingState) {\n const loaderNode = this.buildLoader();\n nodes.push(loaderNode);\n this.contentSize.height =\n this.contentSize.height + loaderNode.layoutInfo.rect.height;\n }\n\n if (!this.options.loadingState && this.collection.size === 0) {\n const emptyStateNode = this.buildEmptyState();\n nodes.push(emptyStateNode);\n this.contentSize.height = emptyStateNode.layoutInfo.rect.height;\n }\n return nodes;\n }\n\n /**\n * Adds the section header node (which is rendered as a divider and\n * optional heading text)\n */\n override buildSection(node: Node<T>, x: number, y: number): LayoutNode {\n // Synthesize a collection node for the header.\n const headerNode = {\n type: 'header',\n key: node.key + ':header',\n parentKey: node.key,\n value: null,\n level: node.level,\n index: node.index,\n hasChildNodes: false,\n childNodes: [],\n rendered: node.rendered,\n textValue: node.textValue,\n };\n\n // `node.rendered` is undefined if Section doesn't have a title.\n // `this.headingSize` is used in `this.buildSectionHeader`\n this.headingSize = node.rendered ? this.options.headingHeight : 0;\n\n // Build layout node for it and adjust y offset of section children.\n const header = this.buildSectionHeader(headerNode, x, y);\n header.node = headerNode;\n header.layoutInfo.parentKey = node.key;\n this.layoutNodes.set(headerNode.key, header);\n header.layoutInfo.rect.height +=\n // if first item is the section, we don't show the divider\n node.prevKey ? this.options.sectionDividerHeight : 0;\n\n y += header.layoutInfo.rect.height;\n\n const section = super.buildSection(node, x, y);\n section.children!.unshift(header);\n\n // Add a separator after the section if it is not followed by a section;\n if (node.nextKey && node.index !== undefined) {\n const nextNode = this.nextNodeAtLevel(node.level, node.index);\n if (nextNode && nextNode.type !== 'section') {\n const dividerRect = new Rect(\n 0,\n section.layoutInfo.rect.maxY,\n this.virtualizer?.visibleRect.width,\n this.options.sectionDividerHeight\n );\n\n const layoutInfo = new LayoutInfo(\n 'divider',\n `${node.key}:divider`,\n dividerRect\n );\n layoutInfo.parentKey = node.key;\n\n const layoutNode = {\n layoutInfo: layoutInfo,\n validRect: layoutInfo.rect.intersection(this.validRect),\n };\n\n this.layoutNodes.set(layoutInfo.key, layoutNode);\n section.children?.push(layoutNode);\n\n section.layoutInfo.rect.height += dividerRect.height;\n y += dividerRect.height;\n }\n }\n\n return section;\n }\n\n nextNodeAtLevel(level: number, startAt: number): Node<T> | undefined {\n for (const item of this.collection) {\n if (item.level === level && item.index && item.index > startAt) {\n return item;\n }\n }\n }\n\n /**\n * Builds loader node (containing all loading rows at the end of the view)\n */\n buildLoader(): LayoutNode {\n const rect = new Rect(\n 0,\n this.contentSize.height,\n this.virtualizer?.visibleRect.width,\n this.loaderSize ?? 0\n );\n const previousLayoutNode = this.layoutNodes.get('loader');\n if (previousLayoutNode?.layoutInfo.rect.y === rect.y) {\n return previousLayoutNode;\n }\n const layoutNode = {\n layoutInfo: new LayoutInfo('loader', 'loader', rect),\n validRect: rect,\n };\n layoutNode.layoutInfo.estimatedSize = true;\n this.layoutNodes.set('loader', layoutNode);\n return layoutNode;\n }\n\n /**\n * Builds empty state node\n */\n buildEmptyState(): LayoutNode {\n const rect = new Rect(\n 0,\n this.contentSize.height,\n this.virtualizer?.visibleRect.width,\n this.options.rowHeight ?? this.options.estimatedRowHeight ?? 50\n );\n const previousLayoutNode = this.layoutNodes.get('empty-state');\n if (previousLayoutNode?.layoutInfo.rect.y === rect.y) {\n return previousLayoutNode;\n }\n const layoutNode = {\n layoutInfo: new LayoutInfo('empty-state', 'empty-state', rect),\n validRect: rect,\n };\n layoutNode.layoutInfo.estimatedSize = true;\n this.layoutNodes.set('empty-state', layoutNode);\n return layoutNode;\n }\n\n /**\n * estimatedSize is set to false by default after size is updated, assuming item\n * height is not dynamic. In some cases (including loading skeleton rows) the height can\n * change as custom loading skeleton render can be passed as a prop. Setting estimatedSize to\n * true makes sure size is calculated and updated if needed after each render.\n * See useVirtualizerItem code for more details.\n */\n override updateItemSize(key: Key, size: Size): boolean {\n const result = super.updateItemSize(key, size);\n if (this.canNodeHaveVariableHeight(key)) {\n const loaderLayoutInfo = this.virtualizer\n ?.getVisibleLayoutInfos()\n .get(key);\n if (loaderLayoutInfo) {\n loaderLayoutInfo.estimatedSize = true;\n }\n }\n return result;\n }\n\n private canNodeHaveVariableHeight(key: Key) {\n return key === 'loader';\n }\n}\n","import { useMemo } from 'react';\nimport { ListWithLoadingStateLayout } from './ListWithLoadingStateLayout';\n\nexport function useListWithLoadingStateLayout<T>({\n loadingState,\n loadingSkeletonRowsCount,\n sectionDividerHeight = 5,\n headingHeight = 34, // default css height\n}: {\n loadingState?: 'loading' | 'loadingMore';\n loadingSkeletonRowsCount: number;\n sectionDividerHeight?: number;\n headingHeight?: number;\n}) {\n const layout = useMemo(\n () =>\n new ListWithLoadingStateLayout<T>({\n /**\n * The estimated height is an average between the min and max height\n * of list items built with our own exports. Which is the only way\n * to render InteractiveList items.\n */\n estimatedRowHeight: 60,\n loadingState,\n sectionDividerHeight,\n headingHeight,\n loadingRowsCount: loadingSkeletonRowsCount,\n }),\n [\n loadingState,\n loadingSkeletonRowsCount,\n sectionDividerHeight,\n headingHeight,\n ]\n );\n\n return layout;\n}\n","import { useObjectRef } from 'react-aria/useObjectRef';\nimport { Virtualizer } from 'react-aria/private/virtualizer/Virtualizer';\nimport React, {\n ComponentProps,\n createContext,\n ForwardedRef,\n ReactNode,\n} from 'react';\n\nconst LoadingRendererContext = createContext<{\n renderLoadingSkeleton: (index: number) => ReactNode;\n loadingSkeletonRowsCount: number;\n}>({\n loadingSkeletonRowsCount: NaN,\n renderLoadingSkeleton: () => {\n throw new Error('Illegal state.');\n },\n});\n\ntype VirtualizerWithLoadingProps = Omit<\n ComponentProps<typeof Virtualizer>,\n 'isLoading'\n> & {\n loadingSkeletonRowsCount: number;\n renderLoadingSkeleton: (index: number) => ReactNode;\n emptyState?: ReactNode;\n};\n\n/**\n * Wraps Virtualizer from @react-aria/virtualizer to render skeleton loading rows for \"loader\" node,\n * in a way that it's reactive to `loadingSkeletonRowsCount` and `renderLoadingSkeleton` props.\n * By default, the renderer function passed as Virtualizer children is not called in each re-render,\n * and a React context is used to make the rendered UI reactive to loading-related props.\n */\nfunction _VirtualizerWithLoading(\n {\n renderLoadingSkeleton,\n loadingSkeletonRowsCount,\n emptyState,\n ...props\n }: VirtualizerWithLoadingProps,\n ref: ForwardedRef<HTMLDivElement>\n) {\n return (\n <LoadingRendererContext.Provider\n value={{ renderLoadingSkeleton, loadingSkeletonRowsCount }}\n >\n <Virtualizer {...props} ref={useObjectRef(ref)}>\n {(kind, item) => {\n if (kind === 'loader') {\n return (\n <LoadingRendererContext.Consumer>\n {({ renderLoadingSkeleton, loadingSkeletonRowsCount }) =>\n Array.from(Array(loadingSkeletonRowsCount)).map((_, index) =>\n renderLoadingSkeleton(index)\n )\n }\n </LoadingRendererContext.Consumer>\n );\n }\n if (!!emptyState && kind === 'empty-state') {\n return emptyState;\n }\n return <>{props.children(kind, item)}</>;\n }}\n </Virtualizer>\n </LoadingRendererContext.Provider>\n );\n}\n\nexport const VirtualizerWithLoadingSkeleton = React.forwardRef(\n _VirtualizerWithLoading\n) as (\n props: VirtualizerWithLoadingProps & {\n ref?: ForwardedRef<HTMLDivElement>;\n }\n) => React.ReactElement;\n","import { RefObject, useEffect } from 'react';\nimport { SelectionManager } from 'react-stately/private/selection/SelectionManager';\nimport { Collection, Node } from '@react-types/shared';\n\n/**\n * A solution for connecting a collection to a search input so that the collection can still be navigated by keyboard\n * while the input is focused. It works by replaying certain keyboard events on the collection container and focused\n * item. An alternative approach (which is used in react-aria's useCombobox) is to use useSelectableCollection\n * separately for the input, but the biggest issue with that approach is that it's limiting in the following ways:\n * - Rendering input should be a part of the same component that renders the collection. Having specific components\n * for use cases that require a search input is not flexible enough.\n * Also, the input and the collection may need to be in different layouts in some use cases.\n * Decoupling the rendering of the input and collection is a more flexible solution.\n * - The same options used for collection should be passed to the input field for behavior consistency,\n * and that is prone to error.\n * Some of these options, like `keyboardDelegate` can even have a default value in hooks like\n * `useSelectableList`.\n * It means making sure the same value is passed to the useSelectableCollection for input\n * would require not using the default value, since the same value can't be accessed.\n *\n * With this event-forwarding approach, it's an arrow up or down event would behave exactly like it was triggered on\n * the collection itself, leaving no room for behavior discrepancies. But it has a few drawbacks:\n * - Although small, there is still some coupling between this code and implementation of the collection component.\n * More specifically, this implementation assumes the following things:\n * - \"Enter\" keys (selection or action) are handled on items, but arrow keys are handled on the collection element.\n * - \"[data-key] attribute is set on items. That is used to find the element for the focused item (which, of course,\n * is not actually focused while the input is).\n *\n * Note: there has been some addition to react-aria useSelectableCollection and useSelectableItem hooks\n * based on CustomEvent and a similar event reply mechanism in useAutocomplete.\n * It may be possible to replace this hook with built-in functionality in react-aria at some point.\n * But at the moment, it seems like that implementation is too coupled with the autocompletion use case, while\n * what is supported here is more generic and allows for the connected search input use case too.\n */\n\nexport const useCollectionFocusProxy = <T>({\n state,\n focusProxyRef,\n collectionRef,\n}: {\n focusProxyRef: RefObject<HTMLElement> | undefined;\n collectionRef: RefObject<HTMLElement>;\n state: {\n /** A collection of items in the list. */\n collection: Collection<Node<T>>;\n /** A selection manager to read and update multiple selection state. */\n selectionManager: SelectionManager;\n };\n}): void => {\n useEffect(\n () => {\n const proxy = focusProxyRef?.current;\n if (proxy) {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n event.preventDefault();\n event.stopPropagation();\n\n state.selectionManager.setFocused(true);\n collectionRef.current?.dispatchEvent(\n new KeyboardEvent(event.type, event)\n );\n } else if (\n event.key === 'Enter' &&\n state.selectionManager?.focusedKey != null\n ) {\n forwardEventToFocusedItem(event);\n event.preventDefault(); // in forms, pressing Enter on input submits the form\n (event.currentTarget as HTMLElement)?.addEventListener(\n 'keyup',\n (event: KeyboardEvent) => {\n if (\n event.key === 'Enter' &&\n state.selectionManager.focusedKey != null\n ) {\n // onEnter?.(state.selectionManager.focusedKey);\n forwardEventToFocusedItem(event);\n }\n },\n { once: true, capture: true }\n );\n }\n function forwardEventToFocusedItem(event: KeyboardEvent) {\n if (state.selectionManager.focusedKey != null) {\n collectionRef.current\n ?.querySelector(\n `[data-key=\"${state.selectionManager.focusedKey}\"]`\n )\n ?.dispatchEvent(new KeyboardEvent(event.type, event));\n }\n }\n };\n proxy.addEventListener('keydown', onKeyDown);\n return () => {\n proxy.removeEventListener('keydown', onKeyDown);\n };\n }\n } /* with no dependency here, event listeners are reattached on each render, but that's the case when unmemoized\n event handlers are passed to elements too (e.g., when using any react-aria hook) */\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/listbox/listbox.module.css';\n\ninterface ListBoxEmptyStateProps {\n children?: React.ReactNode;\n}\n\nexport const ListBoxEmptyState: React.FC<ListBoxEmptyStateProps> = ({\n children,\n}) => (\n <div\n className={clsx(\n styles['sapphire-listbox__item'],\n styles['sapphire-listbox__item--empty']\n )}\n >\n <div className={clsx(styles['sapphire-listbox__content'])}>\n <div\n role=\"presentation\"\n className={styles['sapphire-listbox__primary-text']}\n >\n {children}\n </div>\n </div>\n </div>\n);\n","import da from './da-DK.json';\nimport en from './en-US.json';\nimport de from './de-DE.json';\nimport fi from './fi-FI.json';\nimport no from './nb-NO.json';\nimport pl from './pl-PL.json';\nimport se from './sv-SE.json';\n\nexport default {\n 'da-DK': da,\n 'en-US': en,\n 'de-DE': de,\n 'fi-FI': fi,\n 'nb-NO': no,\n 'pl-PL': pl,\n 'sv-SE': se,\n};\n","import React, {\n forwardRef,\n ForwardedRef,\n ReactElement,\n ReactNode,\n Ref,\n useCallback,\n useLayoutEffect,\n useState,\n RefObject,\n} from 'react';\nimport clsx from 'clsx';\nimport { AriaListBoxOptions, useListBox } from 'react-aria/useListBox';\nimport { VirtualizerItem } from 'react-aria/private/virtualizer/VirtualizerItem';\nimport { useObjectRef } from 'react-aria/useObjectRef';\nimport { mergeProps } from 'react-aria/mergeProps';\nimport { ListState } from 'react-stately/useListState';\nimport { ReusableView } from 'react-stately/useVirtualizerState';\nimport { Node } from '@react-types/shared';\nimport { AriaListBoxProps } from 'react-aria/useListBox';\nimport styles from '@danske/sapphire-css/components/listbox/listbox.module.css';\nimport { ListBoxContext } from './ListBoxContext';\nimport { ListBoxItemSkeleton } from './ListBoxItemSkeleton';\nimport { ListBoxOption } from './ListBoxOption';\nimport { ListBoxSection } from './ListBoxSection';\nimport { useListWithLoadingStateLayout } from '../../utils/virtualization/useListWithLoadingStateLayout';\nimport { VirtualizerWithLoadingSkeleton } from '../../utils/virtualization/VirtualizerWithLoadingSkeleton';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n useScrollCheck,\n} from '../../utils';\nimport { useCollectionFocusProxy } from '../../utils/useCollectionFocusProxy';\nimport { tokens } from '@danske/sapphire-css/themes';\nimport {\n CollectionBaseKeys,\n GlobalDomAttributes,\n MultipleSelectionKeys,\n} from '../../utils/types';\nimport { ListBoxEmptyState } from './ListBoxEmptyState';\nimport { useMessageFormatter } from '@react-aria/i18n';\nimport intlMessages from '../i18n';\n\n/**\n * Component not exported externally which can render and manage the UI of the\n * listbox.\n * The `state` needs to be provided.\n */\nexport type StatelessListBoxProps<T> = Pick<\n AriaListBoxOptions<T>,\n | 'shouldUseVirtualFocus'\n | 'onAction'\n | 'autoFocus'\n | MultipleSelectionKeys\n | CollectionBaseKeys\n | 'id'\n | 'selectionMode'\n> &\n Pick<AriaListBoxProps<T>, 'children'> &\n SapphireStyleProps &\n GlobalDomAttributes & {\n loadingState?: 'loading';\n loadingSkeletonRowsCount?: number;\n /**\n * Callback called when the user scrolled to the bottom of the listbox.\n * Useful when implementing infinite scroll.\n */\n onLoadMore?: () => void;\n disableSelectedStyles?: boolean;\n state: ListState<T>;\n renderLoadingSkeleton?: (index: number) => React.ReactNode;\n\n /**\n * Renders a message indicating the list is empty.\n * Default is a simple \"No results\" (in given language) message.\n * Passing `null` will hide the empty state message.\n */\n emptyState?: React.ReactNode;\n\n // TODO(v5): remove. Check usages in Sapphire Insights before writing a codemod.\n // The usage is likely to be very limited if any.\n /**\n * @deprecated use marginX instead. negativeSideMargin={x} => marginX={`calc(-1 * ${x})`}\n */\n negativeSideMargin?: number | string;\n\n /**\n * Allows for connecting a (search) input to the ListBox, so that the ListBox\n * items can be navigated and selected by keyboard when the input is focused.\n */\n connectedInputRef?: RefObject<HTMLElement>;\n\n /**\n * Whether top and bottom dividers should be shown to mark ListBox's scrollable area.\n * The top divider will be shown when the list is **scrolled** down,\n * and the bottom divider will be shown when the list is **scrollable**.\n */\n hasScrollDividers?: boolean;\n\n /**\n * Whether the listbox items should use virtual focus instead of being focused directly.\n *\n * @default `true` if `connectedInputRef` is provided, `false` otherwise\n */\n shouldUseVirtualFocus?: boolean;\n };\n\nconst _StatelessListBox = <T extends object>(\n {\n loadingState,\n loadingSkeletonRowsCount = 4,\n state,\n renderLoadingSkeleton = (index: number) => (\n <ListBoxItemSkeleton key={index} index={index} />\n ),\n onLoadMore,\n hasScrollDividers = false,\n connectedInputRef,\n shouldUseVirtualFocus = Boolean(connectedInputRef),\n disableSelectedStyles = false,\n negativeSideMargin,\n emptyState: emptyStateProp,\n ...otherProps\n }: StatelessListBoxProps<T>,\n ref: ForwardedRef<HTMLDivElement>\n): JSX.Element => {\n const { styleProps } = useSapphireStyleProps(otherProps);\n\n const listBoxRef = useObjectRef(ref);\n const { listBoxProps } = useListBox(\n {\n ...otherProps,\n shouldUseVirtualFocus,\n isVirtualized: true,\n },\n state,\n listBoxRef\n );\n\n const formatMessage = useMessageFormatter(intlMessages);\n\n const emptyState =\n emptyStateProp === null ? null : (\n <ListBoxEmptyState>\n {emptyStateProp || formatMessage('empty')}\n </ListBoxEmptyState>\n );\n\n const layout = useListWithLoadingStateLayout<T>({\n loadingState,\n loadingSkeletonRowsCount,\n sectionDividerHeight: 5,\n headingHeight: 34,\n });\n\n useCollectionFocusProxy({\n state,\n focusProxyRef: connectedInputRef,\n collectionRef: listBoxRef,\n });\n\n const { scrollCheckProps, isScrolled, isScrollable } =\n useScrollCheck(listBoxRef);\n\n const constrainWidth =\n styleProps.style?.maxWidth !== undefined ||\n styleProps.style?.width !== undefined;\n const [containerMaxWidth, setContainerMaxWidth] = useState<\n number | undefined\n >(undefined);\n useLayoutEffect(() => {\n setContainerMaxWidth(\n constrainWidth && listBoxRef.current\n ? listBoxRef.current.offsetWidth\n : undefined\n );\n }, [constrainWidth]);\n\n type View = ReusableView<Node<T>, ReactNode>;\n\n const renderWrapper = useCallback(\n (\n parent: View | null,\n reusableView: View,\n children: View[],\n renderChildren: (views: View[]) => ReactElement[]\n ) => {\n if (reusableView.viewType === 'section' && reusableView.content) {\n return (\n <ListBoxSection\n key={reusableView.key}\n item={reusableView.content!}\n layoutInfo={reusableView.layoutInfo!}\n virtualizer={reusableView.virtualizer}\n childrenViews={children}\n >\n {renderChildren(children.filter((c) => c.viewType === 'item'))}\n </ListBoxSection>\n );\n }\n\n return (\n <VirtualizerItem\n key={reusableView.key}\n layoutInfo={reusableView.layoutInfo!}\n virtualizer={reusableView.virtualizer}\n parent={parent?.layoutInfo}\n >\n {reusableView.rendered}\n </VirtualizerItem>\n );\n },\n []\n );\n\n return (\n <ListBoxContext.Provider\n value={{\n state,\n shouldUseVirtualFocus,\n disableSelectedStyles,\n containerMaxWidth,\n }}\n >\n <VirtualizerWithLoadingSkeleton\n {...mergeProps(listBoxProps, scrollCheckProps)}\n onLoadMore={onLoadMore}\n scrollDirection=\"vertical\"\n autoFocus={Boolean(otherProps.autoFocus)}\n layout={layout}\n collection={state.collection}\n persistedKeys={\n new Set(\n [\n ...state.selectionManager.selectedKeys,\n state.selectionManager.focusedKey,\n ].filter((key): key is React.Key => key !== null)\n )\n }\n className={clsx(\n styles['sapphire-listbox'],\n {\n [styles['sapphire-listbox--selection']]: !disableSelectedStyles,\n },\n styleProps.className\n )}\n style={{\n ...styleProps.style,\n padding:\n undefined /* virtualizer tries to take control of padding. this stops that */,\n ...(negativeSideMargin\n ? {\n marginLeft:\n typeof negativeSideMargin === 'string'\n ? `calc(${negativeSideMargin} * -1)`\n : `-${negativeSideMargin}px`,\n marginRight:\n typeof negativeSideMargin === 'string'\n ? `calc(${negativeSideMargin} * -1)`\n : `-${negativeSideMargin}px`,\n }\n : {}),\n // Should be moved to css when we are a little more sure about what we want, and specially\n // when/if we need the same feature in Sapphire Angular.\n borderTop:\n hasScrollDividers && isScrolled\n ? `${tokens.size.borderSm} solid ${tokens.color.borderSecondary}`\n : '',\n borderBottom:\n hasScrollDividers && isScrollable\n ? `${tokens.size.borderSm} solid ${tokens.color.borderSecondary}`\n : '',\n }}\n renderWrapper={renderWrapper as any}\n renderLoadingSkeleton={renderLoadingSkeleton}\n loadingSkeletonRowsCount={loadingSkeletonRowsCount}\n emptyState={emptyState}\n ref={listBoxRef}\n aria-busy={loadingState && true}\n >\n {(kind, item) => {\n const node = item as Node<T>;\n if (kind === 'item') {\n return <ListBoxOption key={node.key} item={node} />;\n }\n return null;\n }}\n </VirtualizerWithLoadingSkeleton>\n </ListBoxContext.Provider>\n );\n};\n\nexport const StatelessListBox = forwardRef(_StatelessListBox) as <\n T extends object\n>(\n props: StatelessListBoxProps<T> & { ref?: Ref<HTMLUListElement> }\n) => React.ReactElement;\n","import React, { ForwardedRef, forwardRef, useEffect } from 'react';\nimport {\n OverlayTriggerState,\n Popover as AriaPopover,\n PopoverProps as RACPopoverProps,\n OverlayTriggerStateContext,\n} from 'react-aria-components';\nimport {\n SapphireStyleProps,\n useSapphireStyleProps,\n} from '../../utils/useSapphireStyleProps';\nimport clsx from 'clsx';\nimport popoverStyles from '@danske/sapphire-css/components/popover/popover.module.css';\nimport { AriaPositionPropsKeys, GlobalDomAttributes } from '../../utils/types';\nimport { FocusScope } from 'react-aria/FocusScope';\nimport { ariaHideOutside } from 'react-aria/private/overlays/ariaHideOutside';\nimport { useObjectRef } from 'react-aria/useObjectRef';\n\nexport interface PopoverProps\n extends Pick<\n RACPopoverProps,\n | 'triggerRef'\n | 'isNonModal'\n | 'isKeyboardDismissDisabled'\n | 'shouldCloseOnInteractOutside'\n | AriaPositionPropsKeys\n >,\n SapphireStyleProps,\n GlobalDomAttributes {\n state?: OverlayTriggerState;\n children: React.ReactNode;\n /**\n * Whether to include the default popover padding.\n * @default false\n */\n padded?: boolean;\n /**\n * Whether it has a predefined size constraint. Useful when the popover is\n * used as a dropdown of selects, menus etc.\n * @default false\n */\n defaultMaxWidth?: boolean;\n\n restoreFocus?: boolean;\n}\n\n/**\n * Helper component intended for internal use within Sapphire in components\n * like Select and Menu.\n *\n * *Popovers* are containers used to display transient content such as menus,\n * options, additional actions etc.\n *\n * @internal\n */\nexport const Popover = forwardRef(function Popover(\n {\n children,\n padded,\n defaultMaxWidth,\n maxHeight,\n state,\n restoreFocus = false,\n ...props\n }: PopoverProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const ref = useObjectRef(forwardedRef);\n const { styleProps } = useSapphireStyleProps({ ...props, maxHeight });\n\n /*\n * We need this effect to fix an issue in react-aria's \"usePopover\". The\n * issue is that a popover which is not a modal (see prop \"isNonModal\") will\n * get aria-hidden if opened in an existing modal. See more here\n * https://github.com/adobe/react-spectrum/issues/4213\n *\n * This same hack is present in react-aria's useComboBox.\n * https://github.com/adobe/react-spectrum/blob/main/packages/%40react-aria/combobox/src/useComboBox.ts#L300-L304\n */\n useEffect(() => {\n if (state && state.isOpen && props.isNonModal) {\n // input to ariaHideOutside is what NOT to hide (and their ancestors).\n return ariaHideOutside([\n props.triggerRef?.current as Element,\n ref?.current as Element,\n ]);\n }\n }, [state?.isOpen, props.isNonModal, ref, props.triggerRef]);\n\n const popover = (\n <AriaPopover\n {...props}\n ref={ref}\n style={styleProps.style}\n className={clsx(styleProps.className, popoverStyles['sapphire-popover'], {\n [popoverStyles['sapphire-popover--padded']]: padded,\n [popoverStyles['sapphire-popover--max-width']]: defaultMaxWidth,\n })}\n >\n <div\n className={popoverStyles['sapphire-popover__content']}\n role=\"presentation\"\n >\n {/*\n * TODO UC-5016\n * The Overlay component (from react-aria-components) already wraps the\n * portal content in a FocusScope with restoreFocus and contain.\n * We only need autoFocus here to focus the first focusable child\n * (rather than the popover container itself, which is what RAC does by default).\n */}\n <FocusScope\n autoFocus={!props.isNonModal}\n contain={!props.isNonModal}\n restoreFocus={restoreFocus}\n >\n {children}\n </FocusScope>\n </div>\n </AriaPopover>\n );\n\n if (state) {\n return (\n <OverlayTriggerStateContext.Provider value={state}>\n {popover}\n </OverlayTriggerStateContext.Provider>\n );\n }\n\n return popover;\n});\n","import React, { useLayoutEffect, useEffect, useState } from 'react';\n\nexport const useScrollCheck = (\n ref: React.RefObject<HTMLElement>\n): {\n isScrolled: boolean;\n isScrollable: boolean;\n scrollCheckProps: { onScroll: () => void };\n} => {\n const [isScrollable, setScrollable] = useState(false);\n const [isScrolled, setScrolled] = useState(false);\n\n const onScroll = () => {\n if (ref.current?.scrollTop === 0) {\n setScrolled(false);\n } else {\n setScrolled(true);\n }\n };\n\n useLayoutEffect(() => {\n const bodyElement = ref.current;\n /**\n * ResizeObserver is not supported by IE but there is a polyfill for it\n * https://www.npmjs.com/package/resize-observer-polyfill\n * https://github.com/que-etc/resize-observer-polyfill\n * so it is safe to use it, in case we need to support IE as well.\n */\n const resizeObserver = new ResizeObserver(() => {\n if (bodyElement) {\n setScrollable(bodyElement?.scrollHeight > bodyElement.offsetHeight);\n }\n });\n if (bodyElement) {\n resizeObserver.observe(bodyElement);\n }\n return () => {\n if (bodyElement) {\n resizeObserver.unobserve(bodyElement);\n }\n };\n }, []);\n\n useEffect(() => {\n if (ref.current) {\n setScrollable(ref.current?.scrollHeight > ref.current.offsetHeight);\n }\n });\n\n return { isScrollable, isScrolled, scrollCheckProps: { onScroll } };\n};\n","import { RefObject, useEffect } from 'react';\n\n/**\n * Used to fix a react-aria issue on touch devices.\n * https://github.com/adobe/react-spectrum/issues/1513\n */\nexport const usePreventTouchEnd = (ref: RefObject<Element | null>): void =>\n useEffect(() => {\n ref.current?.addEventListener(\n 'touchend',\n (e) => {\n /**\n * The first condition is necessary to avoid the issue that a button with\n * type=\"submit\" inside a <form> would not trigger the form submit\n * event on a device with touch input.\n *\n * The second condition is needed for thse buttons that are links\n * underneath and will have a href. If \"touchend\" is prevented, links\n * won't open by touch.\n *\n * Admittedly, this is an ugly patch, but given the react-spectrum\n * issue it seems necessary. If this hook grows any larger after\n * further bug reports and edge cases, we may want to reconsider\n * this approach.\n */\n if (\n (e.currentTarget as HTMLElement)?.getAttribute('type') !== 'submit' &&\n typeof (e.currentTarget as HTMLElement)?.getAttribute('href') !==\n 'string'\n ) {\n e.preventDefault();\n }\n },\n { passive: false }\n );\n }, []);\n","import React, { AriaRole, ForwardedRef, forwardRef, ReactNode } from 'react';\nimport clsx from 'clsx';\nimport styles from '@danske/sapphire-css/components/radio/radio.module.css';\nimport { SapphireStyleProps, useSapphireStyleProps } from '../../utils';\nimport { GlobalDomAttributes } from '../../utils/types';\nimport {\n CheckboxContext,\n SlotProps,\n useContextProps,\n} from 'react-aria-components';\n\nexport type RadioBoxProps = GlobalDomAttributes &\n SapphireStyleProps &\n SlotProps & {\n elementType?: 'div' | 'label';\n size?: 'lg' | 'md';\n isDisabled?: boolean;\n isHovered?: boolean;\n isFocusVisible?: boolean;\n isPressed?: boolean;\n isSelected?: boolean;\n label?: ReactNode;\n children?: ReactNode;\n role?: AriaRole;\n };\n\n/**\n * Internal \"dumb\" component which allows one to render the radio box. This\n * does not come with any radio-related functionality. It is just the plain UI\n * element.\n */\nexport const RadioBox = forwardRef(function RadioBox(\n props: RadioBoxProps,\n ref: ForwardedRef<HTMLLabelElement>\n) {\n [props, ref] = useContextProps(props, ref, CheckboxContext);\n const {\n elementType: CustomElement = 'div',\n size,\n isDisabled,\n isHovered,\n isFocusVisible,\n isPressed,\n isSelected,\n label,\n role,\n children,\n slot,\n ...otherProps\n } = props;\n const { styleProps, filteredProps } = useSapphireStyleProps(otherProps);\n const ariaProps =\n role === 'checkbox' ? { role, 'aria-checked': isSelected } : { role };\n\n return (\n <CustomElement\n {...filteredProps}\n {...ariaProps}\n ref={ref as ForwardedRef<any>}\n className={clsx(\n styles['sapphire-radio'],\n {\n [styles['sapphire-radio--checked']]: isSelected,\n [styles['sapphire-radio--md']]: size === 'md',\n [styles['is-hover']]: isHovered,\n [styles['is-focus']]: isFocusVisible,\n [styles['is-active']]: isPressed,\n },\n styles['js-focus'],\n styleProps.className\n )}\n style={styleProps.style}\n >\n {children}\n <span className={clsx(styles['sapphire-radio__box'])} />\n {label && (\n <span className={clsx(styles['sapphire-radio__label'])}>{label}</span>\n )}\n </CustomElement>\n );\n});\n","import React from 'react';\n\nexport interface PaginationContextValue {\n scrollableRef?: React.RefObject<HTMLElement>;\n}\n\nexport const PaginationContext = React.createContext<PaginationContextValue>({\n scrollableRef: undefined,\n});\nexport const usePaginationContext = (): PaginationContextValue => {\n return React.useContext(PaginationContext);\n};\n","import React, { ReactNode, useMemo, useRef } from 'react';\nimport {\n type ColumnDef as TanStackColumnDef,\n type ExpandedState,\n flexRender,\n getCoreRowModel,\n getExpandedRowModel,\n getSortedRowModel,\n type Row as TanStackRow,\n type RowSelectionState,\n SortDirection as TanStackSortDirection,\n type SortingState,\n type Updater,\n useReactTable,\n} from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n type CellSpacing,\n Checkbox,\n ColumnAlignment,\n SapphireStyleProps,\n Skeleton,\n type StickyPosition,\n Table,\n TableCellProps,\n TableHeaderCellProps,\n useSapphireStyleProps,\n useThemeCheck,\n} from '@danske/sapphire-react';\nimport { useControlledState } from 'react-stately/useControlledState';\nimport { useLoadMore } from 'react-aria/private/utils/useLoadMore';\nimport { SortDirection } from '@react-types/shared/src/collections';\nimport { DisabledBehavior, DOMProps } from '@react-types/shared';\nimport { useMeasureColumnWidths } from './useMeasureColumnWidths';\nimport { useGridKeyboardNavigation } from './useGridKeyboardNavigation';\nimport { RadioBox } from '../../../../core/src/Radio/src/RadioBox';\nimport { PaginationContext } from '../../../../core/src/Pagination/src/usePaginationContext';\nimport { DataGridCellContext } from './DataGridCellContext';\n\n/**\n * The interaction that triggered an `onSelectionChange` callback.\n *\n * - `'select-all'` — the user clicked the \"Select all\" header checkbox.\n * - `'select'` — the user selected or deselected an individual row.\n */\ntype DataGridSelectionInteraction = 'select-all' | 'select';\n\n/**\n * Determines how column widths are calculated.\n *\n * - `'auto'` — uses the browser's native\n * [`table-layout: auto`](https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout) algorithm.\n * - `'fixed'` — uses the browser's native\n * [`table-layout: fixed`](https://developer.mozilla.org/en-US/docs/Web/CSS/table-layout) algorithm.\n */\nexport type Layout = 'auto' | 'fixed';\n\n/**\n * Column sizing options when using `layout=\"fixed\"`.\n * Only `width` is effective in fixed table layout; `minWidth` and `maxWidth` have no effect.\n *\n * Note: this type is the *most restrictive* column sizing shape. A value of\n * this type is structurally assignable to both fixed- and auto-mode column\n * arrays, which is what lets column helpers return \"mode-agnostic\" columns\n * (and therefore reusable) whenever `minWidth`/`maxWidth` are not used.\n */\nexport interface FixedColumnSizing {\n /**\n * Width of the column. Accepts a pixel count (`number`) or any valid CSS `width` value\n * (`string`, e.g. `'50%'`). In fixed layout this is the exact column width.\n */\n width?: number | string;\n /** @internal Not available in fixed layout */\n minWidth?: never;\n /** @internal Not available in fixed layout */\n maxWidth?: never;\n}\n\n/**\n * Column sizing options when using `layout=\"auto\"`.\n * All three properties are treated as hints by the browser's sizing algorithm —\n * see the `\"auto\"` docs section for caveats.\n */\nexport interface AutoColumnSizing {\n /**\n * Preferred width hint. Accepts a pixel count (`number`) or any valid CSS `width` value\n * (`string`, e.g. `'50%'`, `'10rem'`). Pass `0` to make the column as narrow as its\n * content — useful for icon or action button columns.\n */\n width?: number | string;\n /**\n * Minimum width of the column. Accepts a pixel count (`number`) or any valid CSS\n * `min-width` value (`string`).\n */\n minWidth?: number | string;\n /**\n * Maximum width of the column. Accepts a pixel count (`number`) or any valid CSS\n * `max-width` value (`string`).\n */\n maxWidth?: number | string;\n}\n\n/**\n * Sizing shape available for a given {@link Layout}.\n */\nexport type ColumnSizingFor<TMode extends Layout> = TMode extends 'fixed'\n ? FixedColumnSizing\n : AutoColumnSizing;\n\n/**\n * Context passed to a column's `cell` renderer.\n *\n * - `row` — the plain row data (`TData`).\n * - `value` — the cell value, typed from `accessorKey` / `accessorFn`.\n * For display columns (no accessor) this is `undefined`.\n * - `rowIndex` — the zero-based index of the row within the current data.\n * - `context` — the `context` object passed to the DataGrid. Typed via the\n * `TContext` generic.\n */\nexport interface DataGridBodyCellRenderProps<TData, TValue, TContext>\n extends DataGridCellRendererProps<TContext> {\n /** The cell value (typed from `accessorKey`/`accessorFn`). */\n value: TValue;\n /** The row data. */\n rowData: TData;\n /** Zero-based row index in the current data. */\n rowIndex: number;\n}\n\ninterface DataGridCellRendererProps<TContext> {\n /** Custom context object passed via the DataGrid `context` prop. */\n context: TContext;\n}\n/**\n * Props shared by all DataGrid column definitions, regardless of column kind\n * (accessor / accessor function / display) and sizing mode.\n */\ninterface DataGridColumnShared<TMode extends Layout, TContext> {\n /** Stable id for the column. Required for display columns. */\n id?: string;\n /** Header rendered in the column's header cell. */\n header?:\n | ReactNode\n | (({ context }: DataGridCellRendererProps<TContext>) => ReactNode);\n /** Footer rendered in the column's footer cell. */\n footer?:\n | ReactNode\n | (({ context }: DataGridCellRendererProps<TContext>) => ReactNode);\n /** Whether sorting can be toggled on this column. */\n enableSorting?: boolean;\n /** Horizontal alignment of cell content. Defaults to `'left'`. */\n align?: ColumnAlignment;\n /** Whether this column is a [row header](https://www.w3.org/TR/wai-aria-1.1/#rowheader). */\n isRowHeader?: boolean;\n /**\n * Custom skeleton loading content for this column. Receives the skeleton row\n * index and returns a `ReactNode` to render inside the cell while the grid is\n * in a loading state. Defaults to `<Skeleton.Text>`.\n */\n renderLoadingSkeleton?: (rowIndex: number) => ReactNode;\n /** Column width/min/max (shape depends on sizing mode). */\n sizing?: ColumnSizingFor<TMode>;\n}\n\n/**\n * Accessor column — reads a value directly from a property of `TData` by key.\n * `value` in the cell renderer is typed as `TData[TKey]`.\n */\nexport interface DataGridAccessorKeyColumn<\n TData,\n TKey extends keyof TData,\n TContext,\n TMode extends Layout\n> extends DataGridColumnShared<TMode, TContext> {\n accessorKey: TKey;\n accessorFn?: never;\n cell?: (\n context: DataGridBodyCellRenderProps<TData, TData[TKey], TContext>\n ) => ReactNode;\n}\n\n/**\n * Accessor-function column — derives the value via a function of `TData`.\n * `value` in the cell renderer is typed as the function's return type.\n * `id` is required since there is no `accessorKey` to derive it from.\n */\nexport interface DataGridAccessorFnColumn<\n TData,\n TValue,\n TContext,\n TMode extends Layout\n> extends DataGridColumnShared<TMode, TContext> {\n id: string;\n accessorKey?: never;\n accessorFn: (row: TData) => TValue;\n cell?: (\n context: DataGridBodyCellRenderProps<TData, TValue, TContext>\n ) => ReactNode;\n}\n\n/**\n * Display column — no accessor. `value` in the cell renderer is `undefined`.\n * Typically used for action columns that render controls derived only from\n * row data / custom context.\n */\nexport interface DataGridDisplayColumn<TData, TContext, TMode extends Layout>\n extends DataGridColumnShared<TMode, TContext> {\n id: string;\n accessorKey?: never;\n accessorFn?: never;\n cell?: (\n context: DataGridBodyCellRenderProps<TData, undefined, TContext>\n ) => ReactNode;\n}\n\n/**\n * A column definition. Union of:\n * - {@link DataGridAccessorKeyColumn} — one per key of `TData`, with `value` typed as `TData[K]`\n * - {@link DataGridAccessorFnColumn} — `value` typed from the `accessorFn` return\n * - {@link DataGridDisplayColumn} — no accessor, `value` is `undefined`\n *\n * Generic order is `<TData, TMode, TContext>`: the sizing mode is the most\n * common \"second argument\" consumers need, and `TContext` defaults to\n * `undefined` so the single-arg form works.\n */\nexport type DataGridColumn<\n TData,\n TMode extends Layout = 'auto',\n TContext = undefined\n> =\n | {\n [K in keyof TData]: DataGridAccessorKeyColumn<TData, K, TContext, TMode>;\n }[keyof TData]\n | DataGridAccessorFnColumn<TData, unknown, TContext, TMode>\n | DataGridDisplayColumn<TData, TContext, TMode>;\n\nexport type DataGridSelectionMode = 'none' | 'single' | 'multiple';\n\nexport interface DataGridSortDescriptor {\n /** The id of the column to sort by. */\n column: string;\n /** The direction to sort by. */\n direction: SortDirection;\n}\n\n/**\n * Context-ergonomics helper: when `TContext` is `undefined` (consumer didn't\n * specify a context type), the `context` prop is optional. Otherwise it is\n * required, mirroring the shape of the column definitions.\n */\ntype ContextProp<TContext> = [TContext] extends [undefined]\n ? { context?: undefined }\n : {\n /**\n * Object passed to every cell renderer as `context`. Use it to share\n * table-level state or callbacks (e.g. editing handlers) with cells\n * without closing over ad-hoc references in every column `cell`.\n */\n context: TContext;\n };\n\nexport type DataGridProps<TData, TContext = undefined> = (\n | {\n layout?: 'auto';\n /** Column definitions */\n columns: DataGridColumn<TData, 'auto', TContext>[];\n }\n | {\n layout: 'fixed';\n /** Column definitions */\n columns: DataGridColumn<TData, 'fixed', TContext>[];\n }\n) &\n SapphireStyleProps &\n DOMProps &\n ContextProp<TContext> & {\n /** Accessibility label for the grid */\n 'aria-label': string;\n\n /** Row data */\n data: TData[];\n /**\n * The spacing inside table cells.\n * @default 'md'\n */\n cellSpacing?: CellSpacing;\n\n /**\n * Default sorting state. Used for initializing uncontrolled sorting.\n */\n defaultSortDescriptor?: DataGridSortDescriptor;\n /**\n * The current sort state. Used for controlled sorting.\n * If not provided, the component will manage its own sort state.\n */\n sortDescriptor?: DataGridSortDescriptor;\n /**\n * Called when the sort state changes.\n * Use together with `sortingDescriptor` for controlled sorting.\n */\n onSortChange?: (sorting: DataGridSortDescriptor | undefined) => void;\n\n /**\n * Function to derive a stable unique identifier for each row.\n * Defaults to the row's index. Provide this when using controlled selection\n * or when row order can change (e.g. after sorting).\n */\n getRowId?: (row: TData, index: number) => string;\n\n /**\n * Enables row selection. Pass `'single'` for single-row selection or\n * `'multiple'` for multi-row selection with a \"select all\" header checkbox.\n */\n selectionMode?: DataGridSelectionMode;\n /**\n * When `true`, no user interaction can result in an empty selection.\n * In single-selection mode, radio buttons are rendered instead of checkboxes\n * to communicate this to users.\n * Has no effect on the initial or controlled state.\n */\n disallowEmptySelection?: boolean;\n /**\n * The currently selected row ids (controlled).\n * Use together with `onSelectionChange`.\n */\n selectedRowIds?: string[];\n /**\n * Default selected row ids (uncontrolled).\n */\n defaultSelectedRowIds?: string[];\n /**\n * Called when the selection changes with the new array of selected row ids\n * and the interaction that triggered the change.\n *\n * - `'select-all'` — the user clicked the \"Select all\" header checkbox.\n * - `'select'` — the user selected or deselected an individual row.\n */\n onSelectionChange?: (\n selectedRowsIds: string[],\n interaction: DataGridSelectionInteraction\n ) => void;\n\n /**\n * Content to show when there are no rows to display. Can be used to\n * communicate empty, or error state. The value is typically a\n * {@link FeedbackMessage} element. For loading state, render skeleton\n * loading rows using {@link loadingState} prop.\n */\n emptyState?: ReactNode;\n\n /**\n * Whether the grid is currently loading data.\n * When set to `'loading'`, the grid will show loading skeleton rows instead of the actual content.\n * When set to `'loadingMore'`, the grid will show loading skeleton rows in addition to the actual content.\n * Use this for \"infinite scrolling\" scenarios when you want to indicate that more content is being loaded, but you\n * still have some content to show.\n **/\n loadingState?: 'loading' | 'loadingMore';\n /**\n * Number of loading skeleton rows to render when {@link loadingState} is set.\n * Use it to match amount of actual content rows being loaded as closely as possible.\n * @default 3\n */\n loadingSkeletonRowsCount?: number;\n /**\n * Whether to hide the divider after the last row.\n * @default false\n */\n hideLastDivider?: boolean;\n /**\n * When `true`, rows are virtualized — only the rows currently in the\n * viewport are rendered. The table must have a bounded scroll area for this\n * to work, either via {@link height} or by constraining the container through\n * parent layout.\n * @default false\n */\n enableRowVirtualization?: boolean;\n /**\n * Estimated height of each row in pixels, used to improve scroll accuracy\n * during virtualization. Defaults to the natural row height for the current\n * {@link cellSpacing}.\n */\n estimatedRowHeight?: number;\n /**\n * Called when the user scrolls near the bottom of the table.\n * Use this to append more rows for infinite scrolling.\n * Not called while {@link loadingState} is set.\n */\n onLoadMore?: () => void;\n\n /**\n * Element rendered in a sticky footer below the table.\n * Normally used to render a {@link Pagination} component.\n *\n * The DataGrid automatically provides the scroll container reference to\n * the `Pagination` component so that it scrolls back to the top of the\n * table when the page changes.\n */\n footer?: ReactNode;\n\n /**\n * Whether the table header should be sticky relative to the first\n * scrolling ancestor.\n *\n * - `'auto'` (default) — the header sticks when the component has a\n * set (or constrained) height.\n * - `true` — always sticky.\n * - `false` — never sticky.\n *\n * @default 'auto'\n */\n stickyHeader?: StickyPosition;\n\n /**\n * Whether the table footer (rendered via the [`footer`](#props:footer)\n * prop) should be sticky relative to the first scrolling ancestor.\n *\n * - `'auto'` (default) — the footer sticks when the component has a\n * set (or constrained) height.\n * - `true` — always sticky.\n * - `false` — never sticky.\n *\n * @default 'auto'\n */\n stickyFooter?: StickyPosition;\n\n // --- Row expansion ---\n\n /**\n * Configures row expansion.\n *\n * - `{ type: 'subRows', getSubRows }` — tree-grid structure. `getSubRows`\n * returns the child rows for a given parent row. Child rows are indented\n * to convey depth.\n * - `{ type: 'expandedView', getExpandedView }` — accordion-style panel.\n * `getExpandedView` returns the `ReactNode` to render below the row when\n * it is expanded.\n *\n * Use {@link defaultExpandedRowIds} to pre-expand rows, or control expansion\n * fully with {@link expandedRowIds} and {@link onExpandedRowsChange}.\n */\n rowExpansion?:\n | {\n type: 'subRows';\n getSubRows: (row: TData, index: number) => TData[] | undefined;\n }\n | {\n type: 'expandedView';\n // TODO: rename to expandedView and render as component to allow for hooks\n getExpandedView: (row: TData, index: number) => ReactNode;\n };\n\n /**\n * The currently expanded row ids (controlled).\n * Use together with {@link onExpandedRowsChange}.\n */\n expandedRowIds?: string[];\n\n /**\n * Default expanded row ids (uncontrolled).\n */\n defaultExpandedRowIds?: string[];\n\n /**\n * Called when the set of expanded rows changes.\n */\n onExpandedRowsChange?: (expandedRowIds: string[]) => void;\n\n /**\n * Called when a row is clicked. Passing it makes the rows interactive.\n */\n onRowAction?: (row: TData) => void;\n\n /**\n * Disables individual rows. Pass a function to evaluate the disabled state\n * per row, or a static `true` to disable all rows.\n * Use {@link disabledBehavior} to control whether disabled rows are fully\n * inert (`'all'`, the default) or only prevented from being selected\n * (`'selection'`).\n */\n isDisabled?: boolean | ((row: TData) => boolean);\n /**\n * Whether disabled state applies to all interactions, or only selection.\n * @default \"all\"\n */\n disabledBehavior?: DisabledBehavior;\n };\n\ntype RowItem<TData> =\n | {\n type: 'data';\n row: TanStackRow<TData>;\n hasExpandedView: boolean;\n disabled: boolean;\n }\n | {\n type: 'expandedView';\n row: TanStackRow<TData>;\n expandedView: ReactNode;\n }\n | { type: 'skeleton'; skeletonIndex: number };\n\nconst DEFAULT_ROW_HEIGHTS: Record<CellSpacing, number> = {\n sm: 40,\n md: 48,\n lg: 56,\n xl: 64,\n};\n\nconst SELECTION_COLUMN_ID = '__selection';\n\n/**\n * DataGrid columns are passed to TanStack as-is (cast to TanStack's type).\n * TanStack only consults `id`, `accessorKey`, `accessorFn`, and\n * `enableSorting`; the renderer fields (`header`, `cell`, `footer`) are never\n * invoked by TanStack — we render them ourselves. This alias is used purely\n * to cast back to our column type at render sites.\n *\n * Internally we widen `TMode` to `'auto'` so we can read all\n * possible sizing fields (`width`/`minWidth`/`maxWidth`) regardless of the\n * grid's active sizing mode. In fixed layout the min/max values — if any —\n * are simply ignored at render time (they have no effect in CSS).\n */\ntype AnyColumn<TData, TContext> = DataGridColumn<TData, 'auto', TContext>;\n\n/**\n * DataGrid renders an array of objects into a grid layout following Sapphire Table design.\n * It supports features such as sorting or row selection, typically required for data-heavy applications.\n */\nexport function DataGrid<TData, TContext = undefined>({\n 'aria-label': ariaLabel,\n columns,\n data,\n cellSpacing = 'md',\n sortDescriptor,\n onSortChange,\n defaultSortDescriptor,\n selectionMode = 'none',\n disallowEmptySelection,\n getRowId,\n selectedRowIds: selectedRowsProp,\n defaultSelectedRowIds,\n onSelectionChange,\n emptyState,\n loadingState,\n loadingSkeletonRowsCount = 3,\n hideLastDivider,\n enableRowVirtualization,\n estimatedRowHeight,\n rowExpansion,\n expandedRowIds,\n defaultExpandedRowIds,\n onExpandedRowsChange,\n onLoadMore,\n onRowAction,\n isDisabled,\n disabledBehavior = 'all',\n layout = 'auto',\n footer,\n stickyHeader = 'auto',\n stickyFooter = 'auto',\n context,\n ...otherProps\n}: DataGridProps<TData, TContext>): React.JSX.Element {\n useThemeCheck();\n const { styleProps, filteredProps } = useSapphireStyleProps(otherProps);\n\n const [sorting, setSorting] = useControlledState<SortingState>(\n toSortingState(sortDescriptor),\n toSortingState(defaultSortDescriptor) ?? [],\n (sortingState) => {\n onSortChange?.(fromSortingState(sortingState));\n }\n );\n\n const [rowSelection, setRowSelection] = useControlledState<RowSelectionState>(\n toBooleanMap(selectedRowsProp),\n toBooleanMap(defaultSelectedRowIds) ?? {},\n (state) => {\n onSelectionChange?.(\n fromBooleanMap(state),\n pendingSelectionInteraction.current\n );\n }\n );\n\n // fairly hacky way to support `interaction` in the `onSelectionChange` callback\n // while still using TanStack API for changing selection\n const pendingSelectionInteraction =\n useRef<DataGridSelectionInteraction>('select');\n\n const handleRowSelectionChange = (updater: Updater<RowSelectionState>) => {\n const newValue =\n typeof updater === 'function' ? updater(rowSelection) : updater;\n if (\n !disallowEmptySelection ||\n Object.values(newValue).filter(Boolean).length > 0\n ) {\n setRowSelection(newValue);\n pendingSelectionInteraction.current = 'select';\n }\n };\n\n const [expanded, setExpanded] = useControlledState<ExpandedState>(\n toBooleanMap(expandedRowIds),\n toBooleanMap(defaultExpandedRowIds) ?? {},\n (expandedState) => {\n onExpandedRowsChange?.(\n expandedState === true ? [] : fromBooleanMap(expandedState)\n );\n }\n );\n\n // Hold `context` in a ref so cell renderers always read the latest value\n // without needing to re-memoize columns on every context change.\n const contextRef = useRef(context);\n contextRef.current = context;\n\n // Build the full column list with internal columns prepended\n const allColumns = useMemo<TanStackColumnDef<TData>[]>(() => {\n const result: TanStackColumnDef<TData>[] = [];\n\n if (selectionMode !== 'none') {\n result.push({\n id: SELECTION_COLUMN_ID,\n header:\n selectionMode === 'multiple'\n ? ({ table }) => (\n <Checkbox\n aria-label=\"Select all\" // TODO(i18n)\n isSelected={table.getIsAllRowsSelected()}\n isIndeterminate={table.getIsSomeRowsSelected()}\n isDisabled={isDisabled === true}\n onChange={(isSelected: boolean) => {\n pendingSelectionInteraction.current = 'select-all';\n table.toggleAllRowsSelected(isSelected);\n }}\n />\n )\n : () => null,\n cell: ({ row }) => {\n const checkboxProps = {\n 'aria-label': 'Select', // TODO(i18n)\n isSelected: row.getIsSelected(),\n isDisabled: !row.getCanSelect(),\n onChange: (isSelected: boolean) => row.toggleSelected(isSelected),\n };\n return selectionMode === 'single' && disallowEmptySelection ? (\n <RadioBox role=\"checkbox\" {...checkboxProps} />\n ) : (\n <Checkbox {...checkboxProps} />\n );\n },\n renderLoadingSkeleton: (i: number) => (\n <Skeleton.From index={i} margin=\"auto\">\n <Checkbox />\n </Skeleton.From>\n ),\n } as TanStackColumnDef<TData>);\n }\n\n result.push(\n ...columns.map(({ header, cell, footer, ...column }) => {\n return {\n ...column,\n header:\n typeof header === 'function'\n ? () => header({ context: contextRef.current! })\n : header,\n footer:\n typeof footer === 'function'\n ? () => footer({ context: contextRef.current! })\n : footer,\n cell: ({ row, getValue }): ReactNode => {\n const value = getValue();\n if (!cell) {\n return value as ReactNode;\n }\n return cell({\n rowData: row.original,\n value: value as any,\n rowIndex: row.index,\n context: contextRef.current!,\n });\n },\n } as TanStackColumnDef<TData>;\n })\n );\n return result;\n }, [\n selectionMode,\n disallowEmptySelection,\n isDisabled,\n disabledBehavior,\n columns,\n ]);\n\n const table = useReactTable({\n data,\n columns: allColumns,\n state: { sorting, rowSelection, expanded },\n defaultColumn: {\n enableSorting: false, // TODO(decision): should sorting be enabled or disabled by default?\n size: undefined,\n },\n getRowId,\n getSubRows:\n rowExpansion?.type === 'subRows' ? rowExpansion.getSubRows : undefined,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getExpandedRowModel: getExpandedRowModel(),\n\n // sorting\n enableMultiSort: false,\n sortDescFirst: false, // TODO(decision): should it be an option?\n manualSorting: sortDescriptor !== undefined,\n onSortingChange: setSorting,\n\n // row selection\n enableRowSelection:\n selectionMode === 'none'\n ? false\n : isDisabled !== undefined\n ? (tanStackRow) => {\n const disabled =\n typeof isDisabled === 'function'\n ? isDisabled?.(tanStackRow.original)\n : isDisabled;\n return !disabled;\n }\n : true,\n enableMultiRowSelection: selectionMode === 'multiple',\n onRowSelectionChange: handleRowSelectionChange,\n\n // row expansion\n onExpandedChange: setExpanded,\n });\n\n const containerRef = useRef<HTMLDivElement>(null);\n const tableRef = useRef<HTMLTableElement>(null);\n\n const { measuredColumnWidths } = useMeasureColumnWidths({\n table,\n data,\n tableRef,\n enabled: Boolean(enableRowVirtualization && layout === 'auto'),\n });\n\n const rows = table.getRowModel().rows;\n const rowItems: RowItem<TData>[] = [];\n if (loadingState !== 'loading') {\n for (const row of rows) {\n const disabled =\n typeof isDisabled === 'function'\n ? isDisabled?.(row.original)\n : isDisabled ?? false;\n const expandedView =\n rowExpansion?.type === 'expandedView'\n ? rowExpansion.getExpandedView(row.original, row.index)\n : undefined;\n rowItems.push({\n type: 'data',\n row,\n hasExpandedView: Boolean(expandedView),\n disabled,\n });\n // Inject an expandedView row after the data row when the row is expanded\n // and this is an expandedView-type expansion (not sub-rows).\n if (expandedView && row.getIsExpanded()) {\n rowItems.push({\n type: 'expandedView',\n row,\n expandedView,\n });\n }\n }\n }\n if (loadingState) {\n for (\n let skeletonIndex = 0;\n skeletonIndex < loadingSkeletonRowsCount;\n skeletonIndex++\n ) {\n rowItems.push({ type: 'skeleton', skeletonIndex });\n }\n }\n\n const { gridKeyboardNavigationProps, rangeExtractor } =\n useGridKeyboardNavigation({\n tableRef,\n enabled: true,\n scrollContainerRef: containerRef,\n rowItemCount: rowItems.length,\n onScrollToRowIndex: enableRowVirtualization\n ? (...args) => {\n virtualizer.scrollToIndex(...args);\n }\n : undefined,\n });\n\n const virtualizer = useVirtualizer({\n count: rowItems.length,\n getScrollElement: () => containerRef.current,\n estimateSize: () => estimatedRowHeight ?? DEFAULT_ROW_HEIGHTS[cellSpacing],\n overscan: 5,\n enabled: enableRowVirtualization,\n rangeExtractor,\n });\n\n const virtualRows = enableRowVirtualization\n ? virtualizer.getVirtualItems()\n : null;\n\n // The focused row is always included in the rendered items.\n // So there might be a gap between the first two or the last two rendered rows that needs to be added to the paddings.\n const topGap = (virtualRows?.[1]?.start || 0) - (virtualRows?.[0]?.end || 0);\n const bottomGap =\n (virtualRows?.[virtualRows.length - 2]?.end || 0) -\n (virtualRows?.[virtualRows.length - 1]?.start || 0);\n const virtualPaddingTop = virtualRows?.length\n ? virtualRows[0].start + topGap\n : 0;\n const virtualPaddingBottom = virtualRows?.length\n ? virtualizer.getTotalSize() -\n virtualRows[virtualRows.length - 1].end +\n bottomGap\n : 0;\n\n const renderedRowItems = virtualRows\n ? virtualRows\n .map((vi) => ({ rowItem: rowItems[vi.index], index: vi.index }))\n .filter(({ rowItem }) => !!rowItem)\n : rowItems.map((rowItem, index) => ({ rowItem, index }));\n\n // Total visible column count (for colSpan on empty/skeleton/expandedView rows)\n const columnCount = table.getVisibleLeafColumns().length;\n\n // Only render a <tfoot> when at least one user-provided column has a footer.\n const hasFooterRow = columns.some((col) => col.footer != null);\n\n useLoadMore(\n { isLoading: !!loadingState, onLoadMore, items: data },\n containerRef\n );\n\n // Using CSS variables instead of inline style on individual elements\n // to pave the way for a performant column resizing implementation in the future, without causing React re-renders.\n const columnSizeVars = Object.fromEntries(\n table.getVisibleLeafColumns().flatMap((col) => {\n const columnDef = col.columnDef as AnyColumn<TData, TContext>;\n const width = measuredColumnWidths?.[col.id] ?? columnDef.sizing?.width;\n if (width === undefined) return [];\n const cssValue = typeof width === 'number' ? `${width}px` : width;\n return [[`--col-${col.id}-width`, cssValue]];\n })\n );\n\n return (\n <Table.Container\n ref={containerRef}\n hideLastDivider={hideLastDivider || (data.length === 0 && !loadingState)}\n stickyHeader={stickyHeader}\n stickyFooter={stickyFooter}\n UNSAFE_style={styleProps.style}\n UNSAFE_className={styleProps.className}\n footer={\n footer ? (\n <PaginationContext.Provider value={{ scrollableRef: containerRef }}>\n {footer}\n </PaginationContext.Provider>\n ) : undefined\n }\n {...filteredProps}\n >\n <Table\n ref={tableRef}\n role=\"grid\"\n aria-label={ariaLabel}\n cellSpacing={cellSpacing}\n aria-busy={Boolean(loadingState) || undefined}\n layout={\n layout === 'fixed' || measuredColumnWidths !== null ? 'fixed' : 'auto'\n }\n UNSAFE_style={columnSizeVars}\n {...gridKeyboardNavigationProps}\n >\n {/* colgroup ensures column size declarations reach the browser */}\n <colgroup>\n {table.getVisibleLeafColumns().map((col) => {\n const varName = `--col-${col.id}-width`;\n return (\n <col\n key={col.id}\n style={\n columnSizeVars[varName]\n ? { width: `var(${varName})` }\n : undefined\n }\n />\n );\n })}\n </colgroup>\n <Table.Header>\n {table.getHeaderGroups().map((headerGroup) => (\n <Table.HeaderRow key={headerGroup.id}>\n {headerGroup.headers.map((header) => {\n const columnDef = header.column.columnDef as AnyColumn<\n TData,\n TContext\n >;\n return (\n <Table.HeaderCell\n key={header.id}\n allowsSorting={header.column.getCanSort()}\n sortDirection={mapSortDirection(\n header.column.getIsSorted()\n )}\n onPress={header.column.getToggleSortingHandler()}\n align={columnDef.align}\n variant={\n header.column.id === SELECTION_COLUMN_ID\n ? 'selection'\n : 'normal'\n }\n // min-width and max-width are intentionally set on <th>, not <col>.\n // The CSS spec only allows width, background, border, and visibility on\n // <col> elements — min-width/max-width are ignored by browsers there.\n minWidth={columnDef.sizing?.minWidth}\n maxWidth={columnDef.sizing?.maxWidth}\n >\n {header.isPlaceholder\n ? null\n : flexRender(columnDef.header, header.getContext())}\n </Table.HeaderCell>\n );\n })}\n </Table.HeaderRow>\n ))}\n </Table.Header>\n <Table.Body>\n {/* Top spacer for virtual items scrolled past */}\n {virtualPaddingTop > 0 && (\n <tr aria-hidden style={{ height: virtualPaddingTop }}>\n <td colSpan={columnCount} />\n </tr>\n )}\n\n {renderedRowItems.map(({ rowItem, index: itemIndex }) => {\n if (rowItem.type === 'skeleton') {\n const { skeletonIndex: i } = rowItem;\n return (\n <Table.Row key={`skeleton-${i}`} aria-hidden>\n {table.getVisibleLeafColumns().map((col) => {\n const columnDef = col.columnDef as AnyColumn<\n TData,\n TContext\n >;\n const renderLoadingSkeleton =\n columnDef.renderLoadingSkeleton ??\n ((i) => (\n <Skeleton.Text index={i} widthType=\"randomPct\" />\n ));\n return (\n <Table.Cell\n key={col.id}\n align={columnDef.align}\n overflow=\"none\"\n variant={\n col.id === SELECTION_COLUMN_ID\n ? 'selection'\n : 'normal'\n }\n >\n {renderLoadingSkeleton(i)}\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n }\n\n if (rowItem.type === 'expandedView') {\n const { row } = rowItem;\n return (\n <Table.Row\n key={`${row.id}-expanded-view`}\n data-index={itemIndex}\n // passing a new function on each render has a role here in\n // making sure the ref callback is called on each render and\n // not just on mount.\n ref={(element) => {\n virtualizer.measureElement(element);\n }}\n >\n <Table.Cell colSpan={columnCount} overflow=\"none\">\n {rowItem.expandedView}\n </Table.Cell>\n </Table.Row>\n );\n }\n\n const { row, disabled } = rowItem;\n const canExpand = row.getCanExpand() || rowItem.hasExpandedView;\n\n const toggleRowExpansion = canExpand\n ? () => row?.toggleExpanded()\n : undefined;\n const toggleRowSelection = row.getCanSelect()\n ? () => row?.toggleSelected()\n : undefined;\n const rowAction = onRowAction\n ? () => onRowAction(row.original)\n : undefined;\n\n const isRowActionDisabled =\n disabled && disabledBehavior !== 'selection';\n const onAction = !isRowActionDisabled\n ? rowAction ?? toggleRowExpansion ?? toggleRowSelection\n : undefined;\n\n // The first non-internal column gets the expand toggle + depth indent\n const firstUserColumnId = row\n .getVisibleCells()\n .find((c) => c.column.id !== SELECTION_COLUMN_ID)?.column.id;\n\n return (\n <Table.Row\n key={row.id}\n isDisabled={isRowActionDisabled}\n isSelected={\n selectionMode !== 'none' ? row.getIsSelected() : undefined\n }\n aria-selected={\n selectionMode !== 'none' ? row.getIsSelected() : undefined\n }\n onAction={\n onAction &&\n ((e) => {\n if (\n e.pointerType === 'keyboard' &&\n e.key === ' ' &&\n toggleRowSelection\n ) {\n toggleRowSelection();\n } else {\n onAction?.();\n }\n })\n }\n triggerActionOnPressStart={onAction === toggleRowSelection}\n isExpanded={\n row.getIsExpanded() && rowExpansion?.type === 'expandedView'\n }\n aria-level={rowExpansion != null ? row.depth + 1 : undefined}\n data-grid-row={isRowActionDisabled ? undefined : ''}\n data-index={itemIndex}\n // passing a new function on each render has a role here in\n // making sure the ref callback is called on each render and\n // not just on mount.\n ref={(element) => {\n virtualizer.measureElement(element);\n }}\n >\n {row.getVisibleCells().map((cell) => {\n const columnDef = cell.column.columnDef as AnyColumn<\n TData,\n TContext\n >;\n const isTreeColumn =\n rowExpansion != null &&\n cell.column.id === firstUserColumnId;\n\n return (\n <DataGridCell\n key={cell.id}\n align={columnDef.align}\n isRowHeader={columnDef.isRowHeader}\n variant={\n cell.column.id === SELECTION_COLUMN_ID\n ? 'selection'\n : isTreeColumn\n ? 'tree'\n : 'normal'\n }\n >\n {isTreeColumn && canExpand && (\n <Table.ToggleExpandButton\n isExpanded={row.getIsExpanded()}\n onPress={toggleRowExpansion}\n isDisabled={isRowActionDisabled}\n />\n )}\n {flexRender(columnDef.cell, cell.getContext())}\n </DataGridCell>\n );\n })}\n </Table.Row>\n );\n })}\n\n {/* Bottom spacer for virtual items not yet scrolled to */}\n {virtualPaddingBottom > 0 && (\n <tr aria-hidden style={{ height: virtualPaddingBottom }}>\n <td colSpan={columnCount} />\n </tr>\n )}\n\n {/* Empty state */}\n {!loadingState && data.length === 0 && emptyState != null && (\n <Table.Row>\n <Table.Cell colSpan={columnCount} overflow=\"none\">\n {emptyState}\n </Table.Cell>\n </Table.Row>\n )}\n </Table.Body>\n\n {hasFooterRow &&\n table.getFooterGroups().map((footerGroup) => (\n <Table.Footer key={footerGroup.id}>\n <Table.Row>\n {footerGroup.headers.map((footer) => {\n const columnDef = footer.column.columnDef as AnyColumn<\n TData,\n TContext\n >;\n return (\n <Table.Cell\n key={footer.id}\n role=\"gridcell\"\n align={columnDef.align}\n overflow=\"none\"\n >\n {footer.isPlaceholder\n ? null\n : flexRender(columnDef.footer, footer.getContext())}\n </Table.Cell>\n );\n })}\n </Table.Row>\n </Table.Footer>\n ))}\n </Table>\n </Table.Container>\n );\n}\n\nfunction DataGridCell({\n align,\n isRowHeader,\n children,\n variant,\n}: {\n align: ColumnAlignment | undefined;\n isRowHeader: boolean | undefined;\n children: ReactNode;\n variant: TableCellProps['variant'];\n}) {\n const ref = React.useRef<HTMLTableCellElement>(null);\n return (\n <DataGridCellContext.Provider value={{ ref }}>\n <Table.Cell\n ref={ref}\n role={isRowHeader ? 'rowheader' : 'gridcell'}\n align={align}\n overflow=\"none\"\n variant={variant}\n >\n {children}\n </Table.Cell>\n </DataGridCellContext.Provider>\n );\n}\n\nfunction fromBooleanMap(state: Record<string, boolean>): string[] {\n return Object.entries(state)\n .filter(([, isExpanded]) => isExpanded)\n .map(([id]) => id);\n}\n\nfunction toBooleanMap(\n ids: string[] | undefined\n): Record<string, boolean> | undefined {\n return ids?.reduce<Record<string, boolean>>((acc, id) => {\n acc[id] = true;\n return acc;\n }, {});\n}\n\nfunction toSortingState(\n sorting: DataGridSortDescriptor | undefined\n): SortingState | undefined {\n return sorting\n ? [\n {\n id: sorting.column,\n desc: sorting.direction === 'descending',\n },\n ]\n : undefined;\n}\n\nfunction fromSortingState(\n sorting: SortingState\n): DataGridSortDescriptor | undefined {\n return sorting[0]\n ? {\n column: sorting[0].id,\n direction: sorting[0].desc ? 'descending' : 'ascending',\n }\n : undefined;\n}\nfunction mapSortDirection(\n tanStackSortDirection: TanStackSortDirection | false\n): TableHeaderCellProps['sortDirection'] {\n if (tanStackSortDirection === 'asc') {\n return 'ascending';\n } else if (tanStackSortDirection === 'desc') {\n return 'descending';\n }\n return undefined;\n}\n","import type {\n Layout,\n DataGridAccessorFnColumn,\n DataGridAccessorKeyColumn,\n DataGridDisplayColumn,\n} from './DataGrid';\n\n/**\n * Options accepted by {@link createDataGridColumnHelper}.\n */\nexport interface CreateDataGridColumnHelperOptions<\n TMode extends Layout = 'auto'\n> {\n /**\n * The column sizing mode the produced columns will be used with.\n * Determines the shape of the `sizing` option on each column.\n *\n * @default 'auto'\n */\n layout?: TMode;\n}\n\n/**\n * Column helper returned by {@link createDataGridColumnHelper}. Provides\n * type-safe builders for the three kinds of column definition:\n * accessor (by key), accessor (by function), and display.\n *\n * Each builder method is overloaded: the first overload covers the\n * \"mode-neutral\" case where `sizing` does not use `minWidth` / `maxWidth`,\n * returning a `'fixed'`-typed column. Because\n * {@link FixedColumnSizing} uses `never` for `minWidth` / `maxWidth` (and\n * `never` is assignable to any type), such a column is structurally\n * assignable to both fixed- and auto-layout column arrays — making it\n * reusable across grids with different `layout` settings regardless\n * of which helper created it.\n *\n * The second overload covers the remaining case and keeps the column\n * bound to the helper's declared mode (`TMode`). If the helper was created\n * for `'fixed'`, the call site still rejects `minWidth` /\n * `maxWidth` at the property level.\n */\nexport interface DataGridColumnHelper<TData, TContext, TMode extends Layout> {\n /**\n * Define an accessor column that reads a value directly from a property of\n * `TData` by key. The `value` received in the cell renderer is typed as\n * `TData[TKey]`.\n */\n accessor<TKey extends keyof TData>(\n accessorKey: TKey,\n column: Omit<\n DataGridAccessorKeyColumn<TData, TKey, TContext, 'fixed'>,\n 'accessorKey'\n >\n ): DataGridAccessorKeyColumn<TData, TKey, TContext, 'fixed'>;\n accessor<TKey extends keyof TData>(\n accessorKey: TKey,\n column: Omit<\n DataGridAccessorKeyColumn<TData, TKey, TContext, TMode>,\n 'accessorKey'\n >\n ): DataGridAccessorKeyColumn<TData, TKey, TContext, TMode>;\n\n /**\n * Define an accessor column that derives its value via a function. The\n * `value` received in the cell renderer is typed as the function's return\n * type. `id` is required since there is no `accessorKey` to derive it from.\n */\n accessor<TValue>(\n accessorFn: (row: TData) => TValue,\n column: Omit<\n DataGridAccessorFnColumn<TData, TValue, TContext, 'fixed'>,\n 'accessorFn'\n >\n ): DataGridAccessorFnColumn<TData, TValue, TContext, 'fixed'>;\n accessor<TValue>(\n accessorFn: (row: TData) => TValue,\n column: Omit<\n DataGridAccessorFnColumn<TData, TValue, TContext, TMode>,\n 'accessorFn'\n >\n ): DataGridAccessorFnColumn<TData, TValue, TContext, TMode>;\n\n /**\n * Define a display column — no accessor. The cell renderer receives a\n * `row` and `context` but `value` is `undefined`. Typically used for\n * action columns.\n */\n display(\n column: DataGridDisplayColumn<TData, TContext, 'fixed'>\n ): DataGridDisplayColumn<TData, TContext, 'fixed'>;\n display(\n column: DataGridDisplayColumn<TData, TContext, TMode>\n ): DataGridDisplayColumn<TData, TContext, TMode>;\n}\n\n/**\n * Create a typed column helper for a `DataGrid` with the given row data type\n * `TData` and cell rendering context type `TContext`. The helper's\n * `accessor` / `display` methods return correctly typed column definitions\n * that plug into the `columns` prop.\n *\n * @example\n * ```tsx\n * interface Person { id: string; name: string; age: number; }\n * interface Ctx { onEdit: (p: Person) => void; }\n *\n * const helper = createDataGridColumnHelper<Person, Ctx>();\n *\n * const columns = [\n * helper.accessor('name', {\n * header: 'Name',\n * cell: ({ value }) => value.toUpperCase(), // value: string\n * }),\n * helper.accessor((row) => row.age * 12, {\n * id: 'ageInMonths',\n * header: 'Age (months)',\n * cell: ({ value }) => value.toLocaleString(), // value: number\n * }),\n * helper.display({\n * id: 'actions',\n * header: 'Actions',\n * cell: ({ row, context }) => (\n * <button onClick={() => context.onEdit(row)}>Edit</button>\n * ),\n * }),\n * ];\n * ```\n *\n * Pass `{ layout: 'fixed' }` in the options to type the\n * column `sizing` property for fixed-layout grids. The sizing mode is\n * inferred from the options object — there is no need to pass it as an\n * explicit generic argument.\n *\n * Columns whose `sizing` does not use `minWidth` / `maxWidth` are returned\n * as mode-agnostic so that they can be reused across both fixed- and\n * auto-layout grids, regardless of which helper created them.\n */\nexport function createDataGridColumnHelper<\n TData,\n TContext = undefined\n>(options: { layout: 'fixed' }): DataGridColumnHelper<TData, TContext, 'fixed'>;\nexport function createDataGridColumnHelper<\n TData,\n TContext = undefined\n>(options?: { layout?: 'auto' }): DataGridColumnHelper<TData, TContext, 'auto'>;\nexport function createDataGridColumnHelper<TData, TContext = undefined>(\n _options?: CreateDataGridColumnHelperOptions<Layout>\n): DataGridColumnHelper<TData, TContext, Layout> {\n const helper = {\n accessor: (accessorKeyOrFn: unknown, column: Record<string, unknown>) => {\n if (typeof accessorKeyOrFn === 'function') {\n return { ...column, accessorFn: accessorKeyOrFn };\n }\n return { ...column, accessorKey: accessorKeyOrFn };\n },\n display: (column: unknown) => column,\n };\n return helper as unknown as DataGridColumnHelper<TData, TContext, Layout>;\n}\n","import { EditableCellContent } from './src/EditableCellContent';\nimport { DataGrid } from './src/DataGrid';\n\nexport {\n type DataGridColumn,\n type DataGridAccessorKeyColumn,\n type DataGridAccessorFnColumn,\n type DataGridDisplayColumn,\n type DataGridBodyCellRenderProps,\n type DataGridProps,\n type DataGridSortDescriptor,\n type DataGridSelectionMode,\n type Layout,\n type ColumnSizingFor,\n type FixedColumnSizing,\n type AutoColumnSizing,\n} from './src/DataGrid';\n\nexport {\n createDataGridColumnHelper,\n type CreateDataGridColumnHelperOptions,\n type DataGridColumnHelper,\n} from './src/createDataGridColumnHelper';\n\nconst _DataGrid = Object.assign(DataGrid, {\n EditableCellContent,\n});\n\nexport { _DataGrid as DataGrid };\n"],"names":["useContext","forwardRef","Accordion","useThemeCheck","useSapphireStyleProps","useObjectRef","FocusScope","DisclosureGroup","filterDOMProps","hasAllowedCustomSidePadding","AccordionHeading","Button","Typography","Icon","ChevronDown","AccordionItem","useFocusManager","useEvent","Disclosure","AccordionPanel","DisclosurePanel","variant","Warning","CheckmarkOutline","Error","Information","clsx","useMemo","useLocale","styles","da","en","de","fi","no","pl","se","useMessageFormatter","intlMessages","useRef","useFocusableRef","useComboBoxState","useComboBox","ListBoxPopover","useState","useEffect","useResizeObserver","createContext","Breadcrumbs","useContextProps","RACBreadcrumbsContext","CollectionRendererContext","useBreadcrumbs","CollectionBuilder","Collection","mergeProps","ChevronRight","Menu","IconButton","OverflowMenuHorizontal","MenuItem","BreadcrumbItemStatic","TooltipIfNeeded","mergeRefs","BreadcrumbItemLink","CollectionNode","createLeafComponent","BreadcrumbItem","PressResponder","useId","useHover","useDrop","useButton","useFocusRing","useClipboard","Pressable","Upload","useControlledState","useEffectEvent","PopoverTrigger","ButtonGroup","VisuallyHidden","ToggleButton","ChevronUp","Flex","cloneElement","tokens","Flag","getWrappedElement","useField","Field","Label","Add","Subtract","digitCount","useLayoutEffect","useCallback","formattedValue","useNumberFieldState","useNumberField","NumberField","useImperativeHandle","createFocusableRef","Separator","useMatchedBreakpoints","Panel","ModalLayout","ChevronLeft","View","useFocusWithin","ThemeRoot","CloseLarge","SidebarItem","SidebarExpandableItem","Transition","Sidebar","useListBoxSection","useScrollCheck","useProgressBar","RACSlider","RACSliderTrack","RACSliderThumb","state","useTag","FocusRing","Close","useListState","useTagGroup","Item","useDateSegment","useTimeFieldState","useTimeField","CloseOutline","Tooltip","EditableCellContent","useOverlayTriggerState","EditAlt","Popover","Checkmark","getInteractionModality","defaultRangeExtractor","BreakpointContext","resolveResponsiveValue","cx","ElementType","Grid","ThemeContext","useOption","isFocusVisible","RACSeparator","layoutInfoToStyle","useVirtualizerItem","ListLayout","Rect","LayoutInfo","Virtualizer","renderLoadingSkeleton","loadingSkeletonRowsCount","event","useListBox","VirtualizerItem","ariaHideOutside","AriaPopover","OverlayTriggerStateContext","RadioBox","CheckboxContext","table","Checkbox","Skeleton","footer","useReactTable","getCoreRowModel","getSortedRowModel","getExpandedRowModel","useVirtualizer","useLoadMore","Table","flexRender","i","row"],"mappings":"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"}
|