@navikt/ds-react 7.6.0 → 7.8.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/cjs/chips/Removable.d.ts +0 -5
- package/cjs/chips/Removable.js +2 -2
- package/cjs/chips/Removable.js.map +1 -1
- package/cjs/copybutton/CopyButton.d.ts +1 -6
- package/cjs/copybutton/CopyButton.js +8 -6
- package/cjs/copybutton/CopyButton.js.map +1 -1
- package/cjs/date/context/index.d.ts +2 -1
- package/cjs/date/context/index.js +5 -2
- package/cjs/date/context/index.js.map +1 -1
- package/cjs/date/context/useDateInputContext.d.ts +3 -3
- package/cjs/date/context/useDateInputContext.js +4 -4
- package/cjs/date/context/useDateInputContext.js.map +1 -1
- package/cjs/date/context/useDateTranslationContext.d.ts +8 -0
- package/cjs/date/context/useDateTranslationContext.js +7 -0
- package/cjs/date/context/useDateTranslationContext.js.map +1 -0
- package/cjs/date/datepicker/DatePicker.js +18 -16
- package/cjs/date/datepicker/DatePicker.js.map +1 -1
- package/cjs/date/datepicker/DatePickerStandalone.js +17 -14
- package/cjs/date/datepicker/DatePickerStandalone.js.map +1 -1
- package/cjs/date/datepicker/parts/Caption.js +2 -3
- package/cjs/date/datepicker/parts/Caption.js.map +1 -1
- package/cjs/date/datepicker/parts/DropdownCaption.js +2 -2
- package/cjs/date/datepicker/parts/DropdownCaption.js.map +1 -1
- package/cjs/date/datepicker/parts/WeekNumber.js +14 -6
- package/cjs/date/datepicker/parts/WeekNumber.js.map +1 -1
- package/cjs/date/datepicker/parts/WeekRow.js +2 -3
- package/cjs/date/datepicker/parts/WeekRow.js.map +1 -1
- package/cjs/date/datepicker/types.d.ts +8 -0
- package/cjs/date/monthpicker/MonthCaption.js +1 -3
- package/cjs/date/monthpicker/MonthCaption.js.map +1 -1
- package/cjs/date/monthpicker/MonthPicker.js +30 -28
- package/cjs/date/monthpicker/MonthPicker.js.map +1 -1
- package/cjs/date/monthpicker/MonthPickerStandalone.js +16 -12
- package/cjs/date/monthpicker/MonthPickerStandalone.js.map +1 -1
- package/cjs/date/monthpicker/types.d.ts +8 -0
- package/cjs/date/parts/DateInput.js +1 -2
- package/cjs/date/parts/DateInput.js.map +1 -1
- package/cjs/date/parts/DateWrapper.d.ts +3 -1
- package/cjs/date/parts/DateWrapper.js +3 -3
- package/cjs/date/parts/DateWrapper.js.map +1 -1
- package/cjs/date/utils/index.d.ts +1 -1
- package/cjs/date/utils/index.js +2 -1
- package/cjs/date/utils/index.js.map +1 -1
- package/cjs/date/utils/locale.d.ts +12 -2
- package/cjs/date/utils/locale.js +18 -2
- package/cjs/date/utils/locale.js.map +1 -1
- package/cjs/form/combobox/Combobox.d.ts +1 -1
- package/cjs/form/combobox/ComboboxWrapper.js +6 -6
- package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/AddNewOption.js +3 -1
- package/cjs/form/combobox/FilteredOptions/AddNewOption.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
- package/cjs/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/FilteredOptionsItem.js +1 -1
- package/cjs/form/combobox/FilteredOptions/FilteredOptionsItem.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/LoadingMessage.js +3 -1
- package/cjs/form/combobox/FilteredOptions/LoadingMessage.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.d.ts +1 -1
- package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.js +6 -5
- package/cjs/form/combobox/FilteredOptions/MaxSelectedMessage.js.map +1 -1
- package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
- package/cjs/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
- package/cjs/form/combobox/Input/Input.context.d.ts +1 -1
- package/cjs/form/combobox/Input/Input.context.js.map +1 -1
- package/cjs/form/combobox/Input/Input.js +1 -1
- package/cjs/form/combobox/Input/Input.js.map +1 -1
- package/cjs/form/combobox/Input/InputController.d.ts +1 -1
- package/cjs/form/combobox/Input/InputController.js +10 -10
- package/cjs/form/combobox/Input/InputController.js.map +1 -1
- package/cjs/form/combobox/Input/ToggleListButton.d.ts +1 -4
- package/cjs/form/combobox/Input/ToggleListButton.js +3 -5
- package/cjs/form/combobox/Input/ToggleListButton.js.map +1 -1
- package/cjs/form/combobox/SelectedOptions/SelectedOptions.js +8 -6
- package/cjs/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
- package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +2 -1
- package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js +9 -5
- package/cjs/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
- package/cjs/form/combobox/types.d.ts +7 -22
- package/cjs/form/form-summary/FormSummaryEditLink.js +4 -2
- package/cjs/form/form-summary/FormSummaryEditLink.js.map +1 -1
- package/cjs/form/search/Search.d.ts +2 -1
- package/cjs/form/search/Search.js +8 -3
- package/cjs/form/search/Search.js.map +1 -1
- package/cjs/form/textarea/Textarea.d.ts +1 -0
- package/cjs/form/textarea/Textarea.js.map +1 -1
- package/cjs/guide-panel/GuidePanel.js +11 -3
- package/cjs/guide-panel/GuidePanel.js.map +1 -1
- package/cjs/guide-panel/Illustration.d.ts +2 -8
- package/cjs/guide-panel/Illustration.darkside.d.ts +2 -0
- package/cjs/guide-panel/Illustration.darkside.js +30 -0
- package/cjs/guide-panel/Illustration.darkside.js.map +1 -0
- package/cjs/guide-panel/Illustration.js +4 -18
- package/cjs/guide-panel/Illustration.js.map +1 -1
- package/cjs/guide-panel/index.d.ts +0 -1
- package/cjs/guide-panel/index.js +1 -3
- package/cjs/guide-panel/index.js.map +1 -1
- package/cjs/help-text/HelpText.d.ts +1 -1
- package/cjs/help-text/HelpText.js +6 -3
- package/cjs/help-text/HelpText.js.map +1 -1
- package/cjs/index.d.ts +1 -1
- package/cjs/index.js +2 -3
- package/cjs/index.js.map +1 -1
- package/cjs/internal-header/InternalHeaderButton.d.ts +1 -1
- package/cjs/internal-header/InternalHeaderUserButton.d.ts +1 -1
- package/cjs/internal-header/InternalHeaderUserButton.js +1 -1
- package/cjs/internal-header/InternalHeaderUserButton.js.map +1 -1
- package/cjs/layout/base/BasePrimitive.js +4 -1
- package/cjs/layout/base/BasePrimitive.js.map +1 -1
- package/cjs/layout/bleed/Bleed.js +5 -2
- package/cjs/layout/bleed/Bleed.js.map +1 -1
- package/cjs/layout/box/Box.d.ts +6 -1
- package/cjs/layout/box/Box.darkside.d.ts +70 -0
- package/cjs/layout/box/Box.darkside.js +98 -0
- package/cjs/layout/box/Box.darkside.js.map +1 -0
- package/cjs/layout/box/Box.js +19 -6
- package/cjs/layout/box/Box.js.map +1 -1
- package/cjs/layout/box/index.js +2 -0
- package/cjs/layout/box/index.js.map +1 -1
- package/cjs/layout/grid/HGrid.js +4 -1
- package/cjs/layout/grid/HGrid.js.map +1 -1
- package/cjs/layout/page/Page.d.ts +1 -0
- package/cjs/layout/page/Page.js +5 -0
- package/cjs/layout/page/Page.js.map +1 -1
- package/cjs/layout/stack/Stack.js +4 -1
- package/cjs/layout/stack/Stack.js.map +1 -1
- package/cjs/layout/utilities/css.d.ts +2 -2
- package/cjs/layout/utilities/css.js +8 -9
- package/cjs/layout/utilities/css.js.map +1 -1
- package/cjs/layout/utilities/types.d.ts +10 -0
- package/cjs/modal/Modal.js +1 -1
- package/cjs/modal/Modal.js.map +1 -1
- package/cjs/modal/ModalHeader.js +1 -1
- package/cjs/modal/ModalHeader.js.map +1 -1
- package/cjs/popover/Popover.js +1 -1
- package/cjs/popover/Popover.js.map +1 -1
- package/cjs/provider/Provider.d.ts +35 -10
- package/cjs/provider/Provider.js +13 -14
- package/cjs/provider/Provider.js.map +1 -1
- package/cjs/table/ExpandableRow.js +3 -3
- package/cjs/table/ExpandableRow.js.map +1 -1
- package/cjs/tabs/Tabs.context.d.ts +1 -1
- package/cjs/timeline/Timeline.d.ts +1 -0
- package/cjs/timeline/Timeline.js.map +1 -1
- package/cjs/util/i18n/i18n.context.d.ts +1 -1
- package/cjs/util/i18n/i18n.context.js +15 -14
- package/cjs/util/i18n/i18n.context.js.map +1 -1
- package/cjs/util/i18n/locales/en.d.ts +51 -36
- package/cjs/util/i18n/locales/en.js +52 -37
- package/cjs/util/i18n/locales/en.js.map +1 -1
- package/cjs/util/i18n/locales/index.d.ts +3 -0
- package/cjs/util/i18n/locales/index.js +14 -0
- package/cjs/util/i18n/locales/index.js.map +1 -0
- package/cjs/util/i18n/locales/nb.d.ts +54 -37
- package/cjs/util/i18n/locales/nb.js +56 -39
- package/cjs/util/i18n/locales/nb.js.map +1 -1
- package/cjs/util/i18n/locales/nn.d.ts +51 -36
- package/cjs/util/i18n/locales/nn.js +52 -37
- package/cjs/util/i18n/locales/nn.js.map +1 -1
- package/esm/chips/Removable.d.ts +0 -5
- package/esm/chips/Removable.js +2 -2
- package/esm/chips/Removable.js.map +1 -1
- package/esm/copybutton/CopyButton.d.ts +1 -6
- package/esm/copybutton/CopyButton.js +8 -6
- package/esm/copybutton/CopyButton.js.map +1 -1
- package/esm/date/context/index.d.ts +2 -1
- package/esm/date/context/index.js +2 -1
- package/esm/date/context/index.js.map +1 -1
- package/esm/date/context/useDateInputContext.d.ts +3 -3
- package/esm/date/context/useDateInputContext.js +3 -3
- package/esm/date/context/useDateInputContext.js.map +1 -1
- package/esm/date/context/useDateTranslationContext.d.ts +8 -0
- package/esm/date/context/useDateTranslationContext.js +3 -0
- package/esm/date/context/useDateTranslationContext.js.map +1 -0
- package/esm/date/datepicker/DatePicker.js +21 -19
- package/esm/date/datepicker/DatePicker.js.map +1 -1
- package/esm/date/datepicker/DatePickerStandalone.js +19 -16
- package/esm/date/datepicker/DatePickerStandalone.js.map +1 -1
- package/esm/date/datepicker/parts/Caption.js +2 -3
- package/esm/date/datepicker/parts/Caption.js.map +1 -1
- package/esm/date/datepicker/parts/DropdownCaption.js +3 -3
- package/esm/date/datepicker/parts/DropdownCaption.js.map +1 -1
- package/esm/date/datepicker/parts/WeekNumber.js +15 -7
- package/esm/date/datepicker/parts/WeekNumber.js.map +1 -1
- package/esm/date/datepicker/parts/WeekRow.js +2 -3
- package/esm/date/datepicker/parts/WeekRow.js.map +1 -1
- package/esm/date/datepicker/types.d.ts +8 -0
- package/esm/date/monthpicker/MonthCaption.js +2 -4
- package/esm/date/monthpicker/MonthCaption.js.map +1 -1
- package/esm/date/monthpicker/MonthPicker.js +33 -31
- package/esm/date/monthpicker/MonthPicker.js.map +1 -1
- package/esm/date/monthpicker/MonthPickerStandalone.js +18 -14
- package/esm/date/monthpicker/MonthPickerStandalone.js.map +1 -1
- package/esm/date/monthpicker/types.d.ts +8 -0
- package/esm/date/parts/DateInput.js +2 -3
- package/esm/date/parts/DateInput.js.map +1 -1
- package/esm/date/parts/DateWrapper.d.ts +3 -1
- package/esm/date/parts/DateWrapper.js +4 -4
- package/esm/date/parts/DateWrapper.js.map +1 -1
- package/esm/date/utils/index.d.ts +1 -1
- package/esm/date/utils/index.js +1 -1
- package/esm/date/utils/index.js.map +1 -1
- package/esm/date/utils/locale.d.ts +12 -2
- package/esm/date/utils/locale.js +16 -1
- package/esm/date/utils/locale.js.map +1 -1
- package/esm/form/combobox/Combobox.d.ts +1 -1
- package/esm/form/combobox/ComboboxWrapper.js +6 -6
- package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/AddNewOption.js +3 -1
- package/esm/form/combobox/FilteredOptions/AddNewOption.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/FilteredOptions.js +4 -4
- package/esm/form/combobox/FilteredOptions/FilteredOptions.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/FilteredOptionsItem.js +1 -1
- package/esm/form/combobox/FilteredOptions/FilteredOptionsItem.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/LoadingMessage.js +3 -1
- package/esm/form/combobox/FilteredOptions/LoadingMessage.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.d.ts +1 -1
- package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.js +6 -5
- package/esm/form/combobox/FilteredOptions/MaxSelectedMessage.js.map +1 -1
- package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js +4 -4
- package/esm/form/combobox/FilteredOptions/filteredOptionsContext.js.map +1 -1
- package/esm/form/combobox/Input/Input.context.d.ts +1 -1
- package/esm/form/combobox/Input/Input.context.js.map +1 -1
- package/esm/form/combobox/Input/Input.js +1 -1
- package/esm/form/combobox/Input/Input.js.map +1 -1
- package/esm/form/combobox/Input/InputController.d.ts +1 -1
- package/esm/form/combobox/Input/InputController.js +10 -10
- package/esm/form/combobox/Input/InputController.js.map +1 -1
- package/esm/form/combobox/Input/ToggleListButton.d.ts +1 -4
- package/esm/form/combobox/Input/ToggleListButton.js +3 -5
- package/esm/form/combobox/Input/ToggleListButton.js.map +1 -1
- package/esm/form/combobox/SelectedOptions/SelectedOptions.js +8 -6
- package/esm/form/combobox/SelectedOptions/SelectedOptions.js.map +1 -1
- package/esm/form/combobox/SelectedOptions/selectedOptionsContext.d.ts +2 -1
- package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js +9 -5
- package/esm/form/combobox/SelectedOptions/selectedOptionsContext.js.map +1 -1
- package/esm/form/combobox/types.d.ts +7 -22
- package/esm/form/form-summary/FormSummaryEditLink.js +4 -2
- package/esm/form/form-summary/FormSummaryEditLink.js.map +1 -1
- package/esm/form/search/Search.d.ts +2 -1
- package/esm/form/search/Search.js +8 -3
- package/esm/form/search/Search.js.map +1 -1
- package/esm/form/textarea/Textarea.d.ts +1 -0
- package/esm/form/textarea/Textarea.js.map +1 -1
- package/esm/guide-panel/GuidePanel.js +11 -3
- package/esm/guide-panel/GuidePanel.js.map +1 -1
- package/esm/guide-panel/Illustration.d.ts +2 -8
- package/esm/guide-panel/Illustration.darkside.d.ts +2 -0
- package/esm/guide-panel/Illustration.darkside.js +23 -0
- package/esm/guide-panel/Illustration.darkside.js.map +1 -0
- package/esm/guide-panel/Illustration.js +4 -18
- package/esm/guide-panel/Illustration.js.map +1 -1
- package/esm/guide-panel/index.d.ts +0 -1
- package/esm/guide-panel/index.js +0 -1
- package/esm/guide-panel/index.js.map +1 -1
- package/esm/help-text/HelpText.d.ts +1 -1
- package/esm/help-text/HelpText.js +6 -3
- package/esm/help-text/HelpText.js.map +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.js +1 -1
- package/esm/index.js.map +1 -1
- package/esm/internal-header/InternalHeaderButton.d.ts +1 -1
- package/esm/internal-header/InternalHeaderUserButton.d.ts +1 -1
- package/esm/internal-header/InternalHeaderUserButton.js +1 -1
- package/esm/internal-header/InternalHeaderUserButton.js.map +1 -1
- package/esm/layout/base/BasePrimitive.js +4 -1
- package/esm/layout/base/BasePrimitive.js.map +1 -1
- package/esm/layout/bleed/Bleed.js +5 -2
- package/esm/layout/bleed/Bleed.js.map +1 -1
- package/esm/layout/box/Box.d.ts +6 -1
- package/esm/layout/box/Box.darkside.d.ts +70 -0
- package/esm/layout/box/Box.darkside.js +69 -0
- package/esm/layout/box/Box.darkside.js.map +1 -0
- package/esm/layout/box/Box.js +18 -5
- package/esm/layout/box/Box.js.map +1 -1
- package/esm/layout/grid/HGrid.js +4 -1
- package/esm/layout/grid/HGrid.js.map +1 -1
- package/esm/layout/page/Page.d.ts +1 -0
- package/esm/layout/page/Page.js +5 -0
- package/esm/layout/page/Page.js.map +1 -1
- package/esm/layout/stack/Stack.js +4 -1
- package/esm/layout/stack/Stack.js.map +1 -1
- package/esm/layout/utilities/css.d.ts +2 -2
- package/esm/layout/utilities/css.js +8 -9
- package/esm/layout/utilities/css.js.map +1 -1
- package/esm/layout/utilities/types.d.ts +10 -0
- package/esm/modal/Modal.js +2 -2
- package/esm/modal/Modal.js.map +1 -1
- package/esm/modal/ModalHeader.js +1 -1
- package/esm/modal/ModalHeader.js.map +1 -1
- package/esm/popover/Popover.js +2 -2
- package/esm/popover/Popover.js.map +1 -1
- package/esm/provider/Provider.d.ts +35 -10
- package/esm/provider/Provider.js +11 -15
- package/esm/provider/Provider.js.map +1 -1
- package/esm/table/ExpandableRow.js +3 -3
- package/esm/table/ExpandableRow.js.map +1 -1
- package/esm/tabs/Tabs.context.d.ts +1 -1
- package/esm/timeline/Timeline.d.ts +1 -0
- package/esm/timeline/Timeline.js.map +1 -1
- package/esm/util/i18n/i18n.context.d.ts +1 -1
- package/esm/util/i18n/i18n.context.js +15 -14
- package/esm/util/i18n/i18n.context.js.map +1 -1
- package/esm/util/i18n/locales/en.d.ts +51 -36
- package/esm/util/i18n/locales/en.js +52 -37
- package/esm/util/i18n/locales/en.js.map +1 -1
- package/esm/util/i18n/locales/index.d.ts +3 -0
- package/esm/util/i18n/locales/index.js +5 -0
- package/esm/util/i18n/locales/index.js.map +1 -0
- package/esm/util/i18n/locales/nb.d.ts +54 -37
- package/esm/util/i18n/locales/nb.js +56 -39
- package/esm/util/i18n/locales/nb.js.map +1 -1
- package/esm/util/i18n/locales/nn.d.ts +51 -36
- package/esm/util/i18n/locales/nn.js +52 -37
- package/esm/util/i18n/locales/nn.js.map +1 -1
- package/package.json +13 -3
- package/src/chips/Removable.tsx +1 -9
- package/src/copybutton/CopyButton.tsx +14 -30
- package/src/date/context/index.ts +5 -1
- package/src/date/context/useDateInputContext.tsx +6 -4
- package/src/date/context/useDateTranslationContext.ts +9 -0
- package/src/date/datepicker/DatePicker.tsx +41 -32
- package/src/date/datepicker/DatePickerStandalone.tsx +46 -37
- package/src/date/datepicker/parts/Caption.tsx +2 -3
- package/src/date/datepicker/parts/DropdownCaption.tsx +3 -3
- package/src/date/datepicker/parts/WeekNumber.tsx +34 -15
- package/src/date/datepicker/parts/WeekRow.tsx +2 -3
- package/src/date/datepicker/types.ts +8 -0
- package/src/date/monthpicker/MonthCaption.tsx +2 -4
- package/src/date/monthpicker/MonthPicker.tsx +67 -54
- package/src/date/monthpicker/MonthPickerStandalone.tsx +39 -26
- package/src/date/monthpicker/types.ts +8 -0
- package/src/date/parts/DateInput.tsx +2 -3
- package/src/date/parts/DateWrapper.tsx +6 -4
- package/src/date/utils/index.ts +5 -1
- package/src/date/utils/locale.ts +17 -1
- package/src/form/combobox/ComboboxWrapper.tsx +6 -6
- package/src/form/combobox/FilteredOptions/AddNewOption.tsx +3 -1
- package/src/form/combobox/FilteredOptions/FilteredOptions.tsx +4 -4
- package/src/form/combobox/FilteredOptions/FilteredOptionsItem.tsx +1 -1
- package/src/form/combobox/FilteredOptions/LoadingMessage.tsx +3 -1
- package/src/form/combobox/FilteredOptions/MaxSelectedMessage.tsx +6 -6
- package/src/form/combobox/FilteredOptions/filteredOptionsContext.tsx +4 -4
- package/src/form/combobox/Input/Input.context.tsx +3 -3
- package/src/form/combobox/Input/Input.tsx +1 -1
- package/src/form/combobox/Input/InputController.tsx +5 -27
- package/src/form/combobox/Input/ToggleListButton.tsx +8 -24
- package/src/form/combobox/SelectedOptions/SelectedOptions.tsx +17 -11
- package/src/form/combobox/SelectedOptions/selectedOptionsContext.tsx +10 -7
- package/src/form/combobox/__tests__/combobox.test.tsx +2 -1
- package/src/form/combobox/types.ts +11 -24
- package/src/form/form-summary/FormSummaryEditLink.tsx +7 -6
- package/src/form/search/Search.tsx +35 -13
- package/src/form/textarea/Textarea.tsx +1 -0
- package/src/guide-panel/GuidePanel.tsx +59 -15
- package/src/guide-panel/Illustration.darkside.tsx +96 -0
- package/src/guide-panel/Illustration.tsx +5 -22
- package/src/guide-panel/index.ts +0 -1
- package/src/help-text/HelpText.tsx +8 -6
- package/src/index.ts +1 -5
- package/src/internal-header/InternalHeaderButton.tsx +1 -1
- package/src/internal-header/InternalHeaderUserButton.tsx +2 -2
- package/src/layout/base/BasePrimitive.tsx +29 -25
- package/src/layout/bleed/Bleed.tsx +8 -0
- package/src/layout/box/Box.darkside.tsx +154 -0
- package/src/layout/box/Box.tsx +90 -61
- package/src/layout/box/index.ts +3 -0
- package/src/layout/grid/HGrid.tsx +7 -3
- package/src/layout/page/Page.tsx +10 -0
- package/src/layout/stack/Stack.tsx +8 -4
- package/src/layout/utilities/css.ts +18 -12
- package/src/layout/utilities/types.ts +24 -0
- package/src/modal/Modal.tsx +2 -2
- package/src/modal/ModalHeader.tsx +1 -1
- package/src/popover/Popover.tsx +2 -2
- package/src/provider/Provider.tsx +56 -13
- package/src/table/ExpandableRow.tsx +10 -3
- package/src/timeline/Timeline.tsx +1 -0
- package/src/util/i18n/i18n.context.test.tsx +29 -8
- package/src/util/i18n/i18n.context.ts +15 -14
- package/src/util/i18n/locales/en.ts +52 -37
- package/src/util/i18n/locales/index.ts +4 -0
- package/src/util/i18n/locales/nb.ts +56 -39
- package/src/util/i18n/locales/nn.ts +52 -37
- package/cjs/provider/i18n/LanguageProvider.d.ts +0 -26
- package/cjs/provider/i18n/LanguageProvider.js +0 -54
- package/cjs/provider/i18n/LanguageProvider.js.map +0 -1
- package/esm/provider/i18n/LanguageProvider.d.ts +0 -26
- package/esm/provider/i18n/LanguageProvider.js +0 -23
- package/esm/provider/i18n/LanguageProvider.js.map +0 -1
- package/src/provider/i18n/LanguageProvider.tsx +0 -49
package/src/date/utils/locale.ts
CHANGED
|
@@ -16,7 +16,7 @@ export const getLocaleFromString = (locale: "nb" | "nn" | "en" = "nb") => {
|
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
18
|
* @private
|
|
19
|
-
* Temporary for backwards compatibility with locale prop
|
|
19
|
+
* Temporary for backwards compatibility with locale prop. Can be removed when locale prop has been removed.
|
|
20
20
|
*/
|
|
21
21
|
export const getTranslations = (locale: string | undefined) => {
|
|
22
22
|
switch (locale) {
|
|
@@ -29,3 +29,19 @@ export const getTranslations = (locale: string | undefined) => {
|
|
|
29
29
|
return undefined;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* @private
|
|
35
|
+
* Temporary for backwards compatibility with locale prop. Can be removed when locale prop has been removed.
|
|
36
|
+
*/
|
|
37
|
+
export const getGlobalTranslations = (locale: string | undefined) => {
|
|
38
|
+
switch (locale) {
|
|
39
|
+
case "nn":
|
|
40
|
+
return nn_translations.global;
|
|
41
|
+
case "en":
|
|
42
|
+
case "en-GB":
|
|
43
|
+
return en_translations.global;
|
|
44
|
+
default:
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
@@ -27,21 +27,21 @@ const ComboboxWrapper = ({
|
|
|
27
27
|
const wrapperRef = useRef<HTMLDivElement | null>(null);
|
|
28
28
|
const [hasFocusWithin, setHasFocusWithin] = useState(false);
|
|
29
29
|
|
|
30
|
-
function onFocusInsideWrapper(
|
|
30
|
+
function onFocusInsideWrapper(event: React.FocusEvent<HTMLDivElement>) {
|
|
31
31
|
if (
|
|
32
|
-
!wrapperRef.current?.contains(
|
|
33
|
-
toggleOpenButtonRef?.current !==
|
|
32
|
+
!wrapperRef.current?.contains(event.relatedTarget) &&
|
|
33
|
+
toggleOpenButtonRef?.current !== event.target
|
|
34
34
|
) {
|
|
35
35
|
toggleIsListOpen(true);
|
|
36
36
|
setHasFocusWithin(true);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
function onBlurWrapper(
|
|
41
|
-
if (!wrapperRef.current?.contains(
|
|
40
|
+
function onBlurWrapper(event: React.FocusEvent<HTMLDivElement>) {
|
|
41
|
+
if (!wrapperRef.current?.contains(event.relatedTarget)) {
|
|
42
42
|
toggleIsListOpen(false);
|
|
43
43
|
setHasFocusWithin(false);
|
|
44
|
-
clearInput(
|
|
44
|
+
clearInput(event);
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
|
|
@@ -2,6 +2,7 @@ import cl from "clsx";
|
|
|
2
2
|
import React from "react";
|
|
3
3
|
import { PlusIcon } from "@navikt/aksel-icons";
|
|
4
4
|
import { BodyShort, Label } from "../../../typography";
|
|
5
|
+
import { useI18n } from "../../../util/i18n/i18n.context";
|
|
5
6
|
import { useInputContext } from "../Input/Input.context";
|
|
6
7
|
import { useSelectedOptionsContext } from "../SelectedOptions/selectedOptionsContext";
|
|
7
8
|
import { isInList, toComboboxOption } from "../combobox-utils";
|
|
@@ -22,6 +23,7 @@ const AddNewOption = () => {
|
|
|
22
23
|
} = useFilteredOptionsContext();
|
|
23
24
|
const { isMultiSelect, selectedOptions, toggleOption } =
|
|
24
25
|
useSelectedOptionsContext();
|
|
26
|
+
const translate = useI18n("Combobox");
|
|
25
27
|
return (
|
|
26
28
|
<li
|
|
27
29
|
tabIndex={-1}
|
|
@@ -51,7 +53,7 @@ const AddNewOption = () => {
|
|
|
51
53
|
>
|
|
52
54
|
<PlusIcon aria-hidden />
|
|
53
55
|
<BodyShort size={size}>
|
|
54
|
-
|
|
56
|
+
{translate("addOption")}{" "}
|
|
55
57
|
<Label as="span" size={size}>
|
|
56
58
|
“{searchTerm}”
|
|
57
59
|
</Label>
|
|
@@ -26,12 +26,12 @@ const FilteredOptions = () => {
|
|
|
26
26
|
const { maxSelected } = useSelectedOptionsContext();
|
|
27
27
|
|
|
28
28
|
const shouldRenderNonSelectables =
|
|
29
|
-
maxSelected
|
|
29
|
+
maxSelected.isLimitReached || // Render maxSelected message
|
|
30
30
|
isLoading || // Render loading message
|
|
31
31
|
(!isLoading && filteredOptions.length === 0 && !allowNewValues); // Render no hits message
|
|
32
32
|
|
|
33
33
|
const shouldRenderFilteredOptionsList =
|
|
34
|
-
(allowNewValues && isValueNew && !maxSelected
|
|
34
|
+
(allowNewValues && isValueNew && !maxSelected.isLimitReached) || // Render add new option
|
|
35
35
|
filteredOptions.length > 0; // Render filtered options
|
|
36
36
|
|
|
37
37
|
return (
|
|
@@ -45,7 +45,7 @@ const FilteredOptions = () => {
|
|
|
45
45
|
>
|
|
46
46
|
{shouldRenderNonSelectables && (
|
|
47
47
|
<div className="navds-combobox__list_non-selectables" role="status">
|
|
48
|
-
{maxSelected
|
|
48
|
+
{maxSelected.isLimitReached && <MaxSelectedMessage />}
|
|
49
49
|
{isLoading && <LoadingMessage />}
|
|
50
50
|
{!isLoading && filteredOptions.length === 0 && !allowNewValues && (
|
|
51
51
|
<NoSearchHitsMessage />
|
|
@@ -60,7 +60,7 @@ const FilteredOptions = () => {
|
|
|
60
60
|
role="listbox"
|
|
61
61
|
className="navds-combobox__list-options"
|
|
62
62
|
>
|
|
63
|
-
{isValueNew && !maxSelected
|
|
63
|
+
{isValueNew && !maxSelected.isLimitReached && allowNewValues && (
|
|
64
64
|
<AddNewOption />
|
|
65
65
|
)}
|
|
66
66
|
{filteredOptions.map((option) => (
|
|
@@ -39,7 +39,7 @@ const FilteredOptionsItem = ({ option }: { option: ComboboxOption }) => {
|
|
|
39
39
|
const [start, highlight, end] = useTextHighlight(option.label, searchTerm);
|
|
40
40
|
|
|
41
41
|
const isDisabled = (_option: ComboboxOption) =>
|
|
42
|
-
maxSelected
|
|
42
|
+
maxSelected.isLimitReached && !isInList(_option.value, selectedOptions);
|
|
43
43
|
|
|
44
44
|
return (
|
|
45
45
|
<li
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Loader } from "../../../loader";
|
|
3
|
+
import { useI18n } from "../../../util/i18n/i18n.context";
|
|
3
4
|
import { useInputContext } from "../Input/Input.context";
|
|
4
5
|
import filteredOptionsUtil from "./filtered-options-util";
|
|
5
6
|
|
|
@@ -7,12 +8,13 @@ const LoadingMessage = () => {
|
|
|
7
8
|
const {
|
|
8
9
|
inputProps: { id },
|
|
9
10
|
} = useInputContext();
|
|
11
|
+
const translate = useI18n("Combobox");
|
|
10
12
|
return (
|
|
11
13
|
<div
|
|
12
14
|
className="navds-combobox__list-item--loading"
|
|
13
15
|
id={filteredOptionsUtil.getIsLoadingId(id)}
|
|
14
16
|
>
|
|
15
|
-
<Loader title="
|
|
17
|
+
<Loader title={translate("loading")} />
|
|
16
18
|
</div>
|
|
17
19
|
);
|
|
18
20
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
+
import { useI18n } from "../../../util/i18n/i18n.context";
|
|
2
3
|
import { useInputContext } from "../Input/Input.context";
|
|
3
4
|
import { useSelectedOptionsContext } from "../SelectedOptions/selectedOptionsContext";
|
|
4
5
|
import filteredOptionsUtil from "./filtered-options-util";
|
|
@@ -8,18 +9,17 @@ const MaxSelectedMessage = () => {
|
|
|
8
9
|
inputProps: { id },
|
|
9
10
|
} = useInputContext();
|
|
10
11
|
const { maxSelected, selectedOptions } = useSelectedOptionsContext();
|
|
11
|
-
|
|
12
|
-
if (!maxSelected) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
12
|
+
const translate = useI18n("Combobox");
|
|
15
13
|
|
|
16
14
|
return (
|
|
17
15
|
<div
|
|
18
16
|
className="navds-combobox__list-item--max-selected"
|
|
19
17
|
id={filteredOptionsUtil.getMaxSelectedOptionsId(id)}
|
|
20
18
|
>
|
|
21
|
-
{maxSelected
|
|
22
|
-
|
|
19
|
+
{translate("maxSelected", {
|
|
20
|
+
selected: selectedOptions.length,
|
|
21
|
+
limit: maxSelected.limit || 0,
|
|
22
|
+
})}
|
|
23
23
|
</div>
|
|
24
24
|
);
|
|
25
25
|
};
|
|
@@ -142,13 +142,13 @@ const FilteredOptionsProvider = ({
|
|
|
142
142
|
}
|
|
143
143
|
virtualFocus.resetFocus();
|
|
144
144
|
if (newState ?? !isInternalListOpen) {
|
|
145
|
-
setHideCaret(
|
|
145
|
+
setHideCaret(maxSelected.isLimitReached);
|
|
146
146
|
}
|
|
147
147
|
setInternalListOpen((oldState) => newState ?? !oldState);
|
|
148
148
|
},
|
|
149
149
|
[
|
|
150
150
|
virtualFocus,
|
|
151
|
-
maxSelected
|
|
151
|
+
maxSelected.isLimitReached,
|
|
152
152
|
isInternalListOpen,
|
|
153
153
|
setHideCaret,
|
|
154
154
|
disabled,
|
|
@@ -178,7 +178,7 @@ const FilteredOptionsProvider = ({
|
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
180
|
const maybeMaxSelectedOptionsId =
|
|
181
|
-
maxSelected
|
|
181
|
+
maxSelected.isLimitReached &&
|
|
182
182
|
filteredOptionsUtils.getMaxSelectedOptionsId(id);
|
|
183
183
|
|
|
184
184
|
return (
|
|
@@ -188,7 +188,7 @@ const FilteredOptionsProvider = ({
|
|
|
188
188
|
}, [
|
|
189
189
|
isListOpen,
|
|
190
190
|
isLoading,
|
|
191
|
-
maxSelected
|
|
191
|
+
maxSelected.isLimitReached,
|
|
192
192
|
value,
|
|
193
193
|
partialAriaDescribedBy,
|
|
194
194
|
shouldAutocomplete,
|
|
@@ -15,7 +15,7 @@ interface InputContextValue extends FormFieldType {
|
|
|
15
15
|
searchTerm: string;
|
|
16
16
|
setSearchTerm: React.Dispatch<React.SetStateAction<string>>;
|
|
17
17
|
shouldAutocomplete?: boolean;
|
|
18
|
-
toggleOpenButtonRef: React.RefObject<
|
|
18
|
+
toggleOpenButtonRef: React.RefObject<HTMLDivElement>;
|
|
19
19
|
hideCaret: boolean;
|
|
20
20
|
setHideCaret: React.Dispatch<React.SetStateAction<boolean>>;
|
|
21
21
|
}
|
|
@@ -72,7 +72,7 @@ const InputProvider = ({ children, value: props }: Props) => {
|
|
|
72
72
|
"comboboxfield",
|
|
73
73
|
);
|
|
74
74
|
const inputRef = useRef<HTMLInputElement | null>(null);
|
|
75
|
-
const toggleOpenButtonRef = useRef<
|
|
75
|
+
const toggleOpenButtonRef = useRef<HTMLDivElement>(null);
|
|
76
76
|
const [internalValue, setInternalValue] = useState<string>(defaultValue);
|
|
77
77
|
const [hideCaret, setHideCaret] = useState(false);
|
|
78
78
|
|
|
@@ -93,7 +93,7 @@ const InputProvider = ({ children, value: props }: Props) => {
|
|
|
93
93
|
);
|
|
94
94
|
|
|
95
95
|
const clearInput = useCallback(
|
|
96
|
-
(event: React.PointerEvent | React.KeyboardEvent | React.
|
|
96
|
+
(event: React.PointerEvent | React.KeyboardEvent | React.FocusEvent) => {
|
|
97
97
|
onClear?.(event);
|
|
98
98
|
externalOnChange?.("");
|
|
99
99
|
setInternalValue("");
|
|
@@ -279,7 +279,7 @@ const Input = forwardRef<HTMLInputElement, InputProps>(
|
|
|
279
279
|
value={value}
|
|
280
280
|
onBlur={composeEventHandlers(onBlur, virtualFocus.resetFocus)}
|
|
281
281
|
onClick={() => {
|
|
282
|
-
setHideCaret(
|
|
282
|
+
setHideCaret(maxSelected.isLimitReached);
|
|
283
283
|
value !== searchTerm && onChange(value);
|
|
284
284
|
}}
|
|
285
285
|
onInput={onChangeHandler}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
2
2
|
import cl from "clsx";
|
|
3
3
|
import React, { forwardRef } from "react";
|
|
4
|
-
import { XMarkIcon } from "@navikt/aksel-icons";
|
|
5
4
|
import { useMergeRefs } from "../../../util/hooks";
|
|
6
5
|
import { useFilteredOptionsContext } from "../FilteredOptions/filteredOptionsContext";
|
|
7
6
|
import SelectedOptions from "../SelectedOptions/SelectedOptions";
|
|
@@ -11,7 +10,6 @@ import Input from "./Input";
|
|
|
11
10
|
import { useInputContext } from "./Input.context";
|
|
12
11
|
import ToggleListButton from "./ToggleListButton";
|
|
13
12
|
|
|
14
|
-
/* eslint-disable jsx-a11y/click-events-have-key-events */
|
|
15
13
|
export const InputController = forwardRef<
|
|
16
14
|
HTMLInputElement,
|
|
17
15
|
Omit<
|
|
@@ -28,20 +26,19 @@ export const InputController = forwardRef<
|
|
|
28
26
|
>
|
|
29
27
|
>((props, ref) => {
|
|
30
28
|
const {
|
|
31
|
-
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Remove when prop has been removed from ComboboxProps.
|
|
30
|
+
clearButton,
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- Remove when prop has been removed from ComboboxProps.
|
|
32
32
|
clearButtonLabel,
|
|
33
33
|
toggleListButton = true,
|
|
34
|
-
toggleListButtonLabel,
|
|
35
34
|
inputClassName,
|
|
36
35
|
shouldShowSelectedOptions = true,
|
|
37
36
|
...rest
|
|
38
37
|
} = props;
|
|
39
38
|
|
|
40
39
|
const {
|
|
41
|
-
clearInput,
|
|
42
40
|
focusInput,
|
|
43
41
|
inputProps,
|
|
44
|
-
value,
|
|
45
42
|
size = "medium",
|
|
46
43
|
inputRef,
|
|
47
44
|
toggleOpenButtonRef,
|
|
@@ -54,6 +51,7 @@ export const InputController = forwardRef<
|
|
|
54
51
|
const mergedInputRef = useMergeRefs(inputRef, ref);
|
|
55
52
|
|
|
56
53
|
return (
|
|
54
|
+
// eslint-disable-next-line jsx-a11y/click-events-have-key-events
|
|
57
55
|
<div
|
|
58
56
|
className={cl("navds-combobox__wrapper-inner navds-text-field__input", {
|
|
59
57
|
"navds-combobox__wrapper-inner--virtually-unfocused":
|
|
@@ -81,27 +79,7 @@ export const InputController = forwardRef<
|
|
|
81
79
|
/>
|
|
82
80
|
</SelectedOptions>
|
|
83
81
|
)}
|
|
84
|
-
<
|
|
85
|
-
{value && clearButton && (
|
|
86
|
-
<button
|
|
87
|
-
type="button"
|
|
88
|
-
onClick={clearInput}
|
|
89
|
-
className="navds-combobox__button-clear"
|
|
90
|
-
tabIndex={-1}
|
|
91
|
-
>
|
|
92
|
-
<span className="navds-sr-only">
|
|
93
|
-
{clearButtonLabel ? clearButtonLabel : "Tøm"}
|
|
94
|
-
</span>
|
|
95
|
-
<XMarkIcon aria-hidden />
|
|
96
|
-
</button>
|
|
97
|
-
)}
|
|
98
|
-
{toggleListButton && (
|
|
99
|
-
<ToggleListButton
|
|
100
|
-
toggleListButtonLabel={toggleListButtonLabel}
|
|
101
|
-
ref={toggleOpenButtonRef}
|
|
102
|
-
/>
|
|
103
|
-
)}
|
|
104
|
-
</div>
|
|
82
|
+
{toggleListButton && <ToggleListButton ref={toggleOpenButtonRef} />}
|
|
105
83
|
</div>
|
|
106
84
|
);
|
|
107
85
|
});
|
|
@@ -3,38 +3,22 @@ import { ChevronDownIcon, ChevronUpIcon } from "@navikt/aksel-icons";
|
|
|
3
3
|
import { useFilteredOptionsContext } from "../FilteredOptions/filteredOptionsContext";
|
|
4
4
|
import { useInputContext } from "./Input.context";
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
toggleListButtonLabel?: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export const ToggleListButton = forwardRef<
|
|
11
|
-
HTMLButtonElement,
|
|
12
|
-
ToggleListButtonProps
|
|
13
|
-
>(({ toggleListButtonLabel }, ref) => {
|
|
6
|
+
export const ToggleListButton = forwardRef<HTMLDivElement>((_, ref) => {
|
|
14
7
|
const { isListOpen, toggleIsListOpen } = useFilteredOptionsContext();
|
|
15
8
|
const { focusInput } = useInputContext();
|
|
9
|
+
|
|
16
10
|
return (
|
|
17
|
-
<
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
<div
|
|
12
|
+
ref={ref}
|
|
13
|
+
onClick={() => {
|
|
20
14
|
toggleIsListOpen();
|
|
21
15
|
focusInput();
|
|
22
16
|
}}
|
|
23
|
-
onKeyDown={({ key }) => key === "Enter" && toggleIsListOpen()}
|
|
24
17
|
className="navds-combobox__button-toggle-list"
|
|
25
|
-
aria-
|
|
26
|
-
tabIndex={-1}
|
|
27
|
-
ref={ref}
|
|
18
|
+
aria-hidden
|
|
28
19
|
>
|
|
29
|
-
<
|
|
30
|
-
|
|
31
|
-
</span>
|
|
32
|
-
{isListOpen ? (
|
|
33
|
-
<ChevronUpIcon aria-hidden />
|
|
34
|
-
) : (
|
|
35
|
-
<ChevronDownIcon aria-hidden />
|
|
36
|
-
)}
|
|
37
|
-
</button>
|
|
20
|
+
{isListOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}
|
|
21
|
+
</div>
|
|
38
22
|
);
|
|
39
23
|
});
|
|
40
24
|
|
|
@@ -14,12 +14,6 @@ const Option = ({ option }: { option: ComboboxOption }) => {
|
|
|
14
14
|
const { isMultiSelect, removeSelectedOption } = useSelectedOptionsContext();
|
|
15
15
|
const { focusInput, readOnly, inputProps } = useInputContext();
|
|
16
16
|
|
|
17
|
-
const onClick = (e) => {
|
|
18
|
-
e.stopPropagation();
|
|
19
|
-
removeSelectedOption(option);
|
|
20
|
-
focusInput();
|
|
21
|
-
};
|
|
22
|
-
|
|
23
17
|
if (!isMultiSelect) {
|
|
24
18
|
return (
|
|
25
19
|
<div className="navds-combobox__selected-options--no-bg">
|
|
@@ -28,12 +22,24 @@ const Option = ({ option }: { option: ComboboxOption }) => {
|
|
|
28
22
|
);
|
|
29
23
|
}
|
|
30
24
|
|
|
31
|
-
|
|
32
|
-
|
|
25
|
+
if (readOnly || inputProps.disabled) {
|
|
26
|
+
return (
|
|
27
|
+
<Chips.Toggle variant="neutral" checkmark={false} as="div">
|
|
28
|
+
{option.label}
|
|
29
|
+
</Chips.Toggle>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return (
|
|
34
|
+
<Chips.Removable
|
|
35
|
+
onClick={(event) => {
|
|
36
|
+
event.stopPropagation();
|
|
37
|
+
removeSelectedOption(option);
|
|
38
|
+
focusInput();
|
|
39
|
+
}}
|
|
40
|
+
>
|
|
33
41
|
{option.label}
|
|
34
|
-
</Chips.
|
|
35
|
-
) : (
|
|
36
|
-
<Chips.Removable onClick={onClick}>{option.label}</Chips.Removable>
|
|
42
|
+
</Chips.Removable>
|
|
37
43
|
);
|
|
38
44
|
};
|
|
39
45
|
|
|
@@ -12,7 +12,7 @@ type SelectedOptionsContextValue = {
|
|
|
12
12
|
removeSelectedOption: (option: ComboboxOption) => void;
|
|
13
13
|
prevSelectedOptions?: ComboboxOption[];
|
|
14
14
|
selectedOptions: ComboboxOption[];
|
|
15
|
-
maxSelected
|
|
15
|
+
maxSelected: { limit: number | undefined; isLimitReached: boolean };
|
|
16
16
|
setSelectedOptions: (any) => void;
|
|
17
17
|
toggleOption: (
|
|
18
18
|
option: ComboboxOption,
|
|
@@ -101,14 +101,17 @@ const SelectedOptionsProvider = ({
|
|
|
101
101
|
[customOptions, onToggleSelected, removeCustomOption],
|
|
102
102
|
);
|
|
103
103
|
|
|
104
|
+
const maxSelectedLimit =
|
|
105
|
+
typeof maxSelected === "object" ? maxSelected.limit : maxSelected;
|
|
104
106
|
const isLimitReached =
|
|
105
|
-
|
|
106
|
-
|
|
107
|
+
!!maxSelectedLimit && selectedOptions.length >= maxSelectedLimit;
|
|
108
|
+
const newHideCaret =
|
|
109
|
+
isLimitReached || (!isMultiSelect && selectedOptions.length > 0);
|
|
107
110
|
|
|
108
111
|
// biome-ignore lint/correctness/useExhaustiveDependencies: We explicitly want to run this effect when selectedOptions changes to match the view with the selected options.
|
|
109
112
|
useEffect(() => {
|
|
110
|
-
setHideCaret(
|
|
111
|
-
}, [
|
|
113
|
+
setHideCaret(newHideCaret);
|
|
114
|
+
}, [newHideCaret, selectedOptions, setHideCaret]);
|
|
112
115
|
|
|
113
116
|
const toggleOption = useCallback(
|
|
114
117
|
(
|
|
@@ -142,8 +145,8 @@ const SelectedOptionsProvider = ({
|
|
|
142
145
|
selectedOptions,
|
|
143
146
|
setSelectedOptions,
|
|
144
147
|
toggleOption,
|
|
145
|
-
maxSelected:
|
|
146
|
-
|
|
148
|
+
maxSelected: {
|
|
149
|
+
limit: maxSelectedLimit,
|
|
147
150
|
isLimitReached,
|
|
148
151
|
},
|
|
149
152
|
};
|
|
@@ -3,6 +3,7 @@ import { act, render, screen } from "@testing-library/react";
|
|
|
3
3
|
import userEvent from "@testing-library/user-event";
|
|
4
4
|
import React, { useId } from "react";
|
|
5
5
|
import { describe, expect, test, vi } from "vitest";
|
|
6
|
+
import nb from "../../../util/i18n/locales/nb";
|
|
6
7
|
import { ComboboxProps, UNSAFE_Combobox } from "../index";
|
|
7
8
|
|
|
8
9
|
const options = [
|
|
@@ -73,7 +74,7 @@ describe("Render combobox", () => {
|
|
|
73
74
|
test("Should show loading icon when loading (used for async search)", async () => {
|
|
74
75
|
render(<App options={[]} isListOpen isLoading />);
|
|
75
76
|
|
|
76
|
-
expect(await screen.findByText(
|
|
77
|
+
expect(await screen.findByText(nb.Combobox.loading)).toBeInTheDocument();
|
|
77
78
|
});
|
|
78
79
|
|
|
79
80
|
test("Should not select previous focused element when closes", async () => {
|
|
@@ -45,15 +45,11 @@ export interface ComboboxProps
|
|
|
45
45
|
*/
|
|
46
46
|
allowNewValues?: boolean;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
49
|
-
* NB: Will not clear selected values.
|
|
50
|
-
* @default true
|
|
48
|
+
* @deprecated The clear button has been removed. This prop has no effect.
|
|
51
49
|
*/
|
|
52
50
|
clearButton?: boolean;
|
|
53
51
|
/**
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* @default "Tøm"
|
|
52
|
+
* @deprecated The clear button has been removed. This prop has no effect.
|
|
57
53
|
*/
|
|
58
54
|
clearButtonLabel?: string;
|
|
59
55
|
/**
|
|
@@ -102,7 +98,7 @@ export interface ComboboxProps
|
|
|
102
98
|
* @param event
|
|
103
99
|
*/
|
|
104
100
|
onClear?: (
|
|
105
|
-
event: React.PointerEvent | React.KeyboardEvent | React.
|
|
101
|
+
event: React.PointerEvent | React.KeyboardEvent | React.FocusEvent,
|
|
106
102
|
) => void;
|
|
107
103
|
/**
|
|
108
104
|
* Callback function triggered whenever an option is selected or de-selected.
|
|
@@ -124,18 +120,15 @@ export interface ComboboxProps
|
|
|
124
120
|
*/
|
|
125
121
|
selectedOptions?: string[] | ComboboxOption[];
|
|
126
122
|
/**
|
|
127
|
-
*
|
|
123
|
+
* Maximum number of selected options.
|
|
124
|
+
* @example maxSelected={3}
|
|
128
125
|
*/
|
|
129
|
-
maxSelected?:
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
* Override the message to display when the limit for maximum selected options has been reached
|
|
136
|
-
*/
|
|
137
|
-
message?: string;
|
|
138
|
-
};
|
|
126
|
+
maxSelected?:
|
|
127
|
+
| {
|
|
128
|
+
/** @deprecated Provide a number instead of an object */
|
|
129
|
+
limit: number;
|
|
130
|
+
}
|
|
131
|
+
| number;
|
|
139
132
|
/**
|
|
140
133
|
* Set to `true` to enable inline autocomplete.
|
|
141
134
|
*
|
|
@@ -154,12 +147,6 @@ export interface ComboboxProps
|
|
|
154
147
|
* @default true
|
|
155
148
|
*/
|
|
156
149
|
toggleListButton?: boolean;
|
|
157
|
-
/**
|
|
158
|
-
* Custom name for the toggle list-button. Requires "toggleListButton" to be `true`.
|
|
159
|
-
*
|
|
160
|
-
* @default "Alternativer"
|
|
161
|
-
*/
|
|
162
|
-
toggleListButtonLabel?: string;
|
|
163
150
|
/**
|
|
164
151
|
* Set this to override the value of the input field.
|
|
165
152
|
*
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import cl from "clsx";
|
|
2
2
|
import React, { forwardRef } from "react";
|
|
3
3
|
import { Link } from "../../link";
|
|
4
|
+
import { useI18n } from "../../util/i18n/i18n.context";
|
|
4
5
|
import { OverridableComponent } from "../../util/types";
|
|
5
6
|
|
|
6
|
-
// export type FormSummaryEditProps = Partial<LinkProps>;
|
|
7
7
|
export interface FormSummaryEditProps
|
|
8
8
|
extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
9
9
|
/**
|
|
@@ -22,17 +22,18 @@ export interface FormSummaryEditProps
|
|
|
22
22
|
export const FormSummaryEditLink: OverridableComponent<
|
|
23
23
|
FormSummaryEditProps,
|
|
24
24
|
HTMLAnchorElement
|
|
25
|
-
> = forwardRef(
|
|
26
|
-
|
|
25
|
+
> = forwardRef(({ children, className, as = "a", ...rest }, ref) => {
|
|
26
|
+
const translate = useI18n("FormSummary");
|
|
27
|
+
return (
|
|
27
28
|
<Link
|
|
28
29
|
ref={ref}
|
|
29
30
|
as={as}
|
|
30
31
|
{...rest}
|
|
31
32
|
className={cl("navds-form-summary__edit", className)}
|
|
32
33
|
>
|
|
33
|
-
{children}
|
|
34
|
+
{children || translate("editAnswer")}
|
|
34
35
|
</Link>
|
|
35
|
-
)
|
|
36
|
-
);
|
|
36
|
+
);
|
|
37
|
+
});
|
|
37
38
|
|
|
38
39
|
export default FormSummaryEditLink;
|
|
@@ -6,6 +6,8 @@ import React, {
|
|
|
6
6
|
useState,
|
|
7
7
|
} from "react";
|
|
8
8
|
import { MagnifyingGlassIcon, XMarkIcon } from "@navikt/aksel-icons";
|
|
9
|
+
import { Button } from "../../button";
|
|
10
|
+
import { UNSAFE_useAkselTheme } from "../../provider";
|
|
9
11
|
import { BodyShort, ErrorMessage, Label } from "../../typography";
|
|
10
12
|
import { omit } from "../../util";
|
|
11
13
|
import { useMergeRefs } from "../../util/hooks/useMergeRefs";
|
|
@@ -50,7 +52,8 @@ export interface SearchProps
|
|
|
50
52
|
onSearchClick?: (value: string) => void;
|
|
51
53
|
/**
|
|
52
54
|
* Sets the `aria-label` for the clear button.
|
|
53
|
-
* @default "Tøm"
|
|
55
|
+
* @default "Tøm feltet"
|
|
56
|
+
* @deprecated Use `<Provider />`-component
|
|
54
57
|
*/
|
|
55
58
|
clearButtonLabel?: string;
|
|
56
59
|
/**
|
|
@@ -122,6 +125,8 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
|
|
|
122
125
|
...rest
|
|
123
126
|
} = props;
|
|
124
127
|
|
|
128
|
+
const themeContext = UNSAFE_useAkselTheme(false);
|
|
129
|
+
|
|
125
130
|
const searchRef = useRef<HTMLInputElement | null>(null);
|
|
126
131
|
const mergedRef = useMergeRefs(searchRef, ref);
|
|
127
132
|
const translate = useI18n("Search");
|
|
@@ -142,6 +147,34 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
|
|
|
142
147
|
onSearchClick?.(`${value ?? internalValue}`);
|
|
143
148
|
};
|
|
144
149
|
|
|
150
|
+
const showClearButton =
|
|
151
|
+
clearButton && !inputProps.disabled && (value ?? internalValue);
|
|
152
|
+
|
|
153
|
+
const ClearButton = () =>
|
|
154
|
+
themeContext ? (
|
|
155
|
+
<Button
|
|
156
|
+
className="navds-search__button-clear"
|
|
157
|
+
variant="tertiary-neutral"
|
|
158
|
+
size={size === "medium" ? "small" : "xsmall"}
|
|
159
|
+
icon={<XMarkIcon aria-hidden />}
|
|
160
|
+
title={clearButtonLabel || translate("clear")}
|
|
161
|
+
hidden={!showClearButton}
|
|
162
|
+
onClick={(event) => handleClear({ trigger: "Click", event })}
|
|
163
|
+
/>
|
|
164
|
+
) : (
|
|
165
|
+
<button
|
|
166
|
+
type="button"
|
|
167
|
+
onClick={(event) => handleClear({ trigger: "Click", event })}
|
|
168
|
+
className="navds-search__button-clear"
|
|
169
|
+
hidden={!showClearButton}
|
|
170
|
+
>
|
|
171
|
+
<span className="navds-sr-only">
|
|
172
|
+
{clearButtonLabel || translate("clear")}
|
|
173
|
+
</span>
|
|
174
|
+
<XMarkIcon aria-hidden />
|
|
175
|
+
</button>
|
|
176
|
+
);
|
|
177
|
+
|
|
145
178
|
return (
|
|
146
179
|
// eslint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
147
180
|
<div
|
|
@@ -210,18 +243,7 @@ export const Search = forwardRef<HTMLInputElement, SearchProps>(
|
|
|
210
243
|
)}
|
|
211
244
|
{...(htmlSize ? { size: Number(htmlSize) } : {})}
|
|
212
245
|
/>
|
|
213
|
-
|
|
214
|
-
<button
|
|
215
|
-
type="button"
|
|
216
|
-
onClick={(event) => handleClear({ trigger: "Click", event })}
|
|
217
|
-
className="navds-search__button-clear"
|
|
218
|
-
>
|
|
219
|
-
<span className="navds-sr-only">
|
|
220
|
-
{clearButtonLabel || translate("clear")}
|
|
221
|
-
</span>
|
|
222
|
-
<XMarkIcon aria-hidden />
|
|
223
|
-
</button>
|
|
224
|
-
)}
|
|
246
|
+
<ClearButton />
|
|
225
247
|
</div>
|
|
226
248
|
<SearchContext.Provider
|
|
227
249
|
value={{
|