@navikt/ds-react 8.9.1 → 8.10.1
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/alert/base-alert/content/BaseAlertContent.js +4 -1
- package/cjs/alert/base-alert/content/BaseAlertContent.js.map +1 -1
- package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -1
- package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +38 -19
- package/cjs/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
- package/cjs/data/drag-and-drop/item/DragAndDropItem.d.ts +3 -2
- package/cjs/data/drag-and-drop/item/DragAndDropItem.js +6 -4
- package/cjs/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
- package/cjs/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -2
- package/cjs/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -32
- package/cjs/data/drag-and-drop/root/DragAndDropRoot.js +73 -46
- package/cjs/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
- package/cjs/data/drag-and-drop/types.d.ts +4 -0
- package/cjs/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
- package/cjs/data/table/base-cell/DataTableBaseCell.js +63 -0
- package/cjs/data/table/base-cell/DataTableBaseCell.js.map +1 -0
- package/cjs/data/table/column-header/DataTableColumnHeader.d.ts +31 -0
- package/cjs/data/table/column-header/DataTableColumnHeader.js +107 -0
- package/cjs/data/table/column-header/DataTableColumnHeader.js.map +1 -0
- package/cjs/data/table/column-header/useTableColumnResize.js.map +1 -0
- package/cjs/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
- package/cjs/data/table/empty-state/DataTableEmptyState.js +2 -2
- package/cjs/data/table/empty-state/DataTableEmptyState.js.map +1 -1
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.d.ts +7 -7
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
- package/cjs/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
- package/cjs/data/table/helpers/selection/getSingleSelectProps.d.ts +5 -3
- package/cjs/data/table/helpers/selection/getSingleSelectProps.js +8 -12
- package/cjs/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
- package/cjs/data/table/helpers/selection/selection.types.d.ts +39 -16
- package/cjs/data/table/helpers/table-keyboard.js +3 -0
- package/cjs/data/table/helpers/table-keyboard.js.map +1 -1
- package/cjs/data/table/hooks/useColumnOptions.d.ts +19 -0
- package/cjs/data/table/hooks/useColumnOptions.js +19 -0
- package/cjs/data/table/hooks/useColumnOptions.js.map +1 -0
- package/cjs/data/table/hooks/useTableExpansion.d.ts +26 -0
- package/cjs/data/table/hooks/useTableExpansion.js +68 -0
- package/cjs/data/table/hooks/useTableExpansion.js.map +1 -0
- package/cjs/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
- package/cjs/data/table/hooks/useTableKeyboardNav.js +3 -1
- package/cjs/data/table/hooks/useTableKeyboardNav.js.map +1 -1
- package/cjs/data/table/hooks/useTableSelection.d.ts +14 -7
- package/cjs/data/table/hooks/useTableSelection.js +40 -27
- package/cjs/data/table/hooks/useTableSelection.js.map +1 -1
- package/cjs/data/table/hooks/useTableSort.d.ts +37 -0
- package/cjs/data/table/hooks/useTableSort.js +49 -0
- package/cjs/data/table/hooks/useTableSort.js.map +1 -0
- package/cjs/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
- package/cjs/data/table/loading-state/DataTableLoadingState.js +2 -2
- package/cjs/data/table/loading-state/DataTableLoadingState.js.map +1 -1
- package/cjs/data/table/root/DataTable.types.d.ts +55 -4
- package/cjs/data/table/root/DataTableAuto.d.ts +97 -1
- package/cjs/data/table/root/DataTableAuto.js +92 -39
- package/cjs/data/table/root/DataTableAuto.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.context.d.ts +22 -1
- package/cjs/data/table/root/DataTableRoot.context.js +7 -1
- package/cjs/data/table/root/DataTableRoot.context.js.map +1 -1
- package/cjs/data/table/root/DataTableRoot.d.ts +0 -6
- package/cjs/data/table/root/DataTableRoot.js +5 -4
- package/cjs/data/table/root/DataTableRoot.js.map +1 -1
- package/cjs/data/table/tbody/DataTableTbody.js +7 -1
- package/cjs/data/table/tbody/DataTableTbody.js.map +1 -1
- package/cjs/data/table/td/DataTableTd.d.ts +3 -23
- package/cjs/data/table/td/DataTableTd.js +3 -7
- package/cjs/data/table/td/DataTableTd.js.map +1 -1
- package/cjs/data/table/tfoot/DataTableTfoot.js +3 -1
- package/cjs/data/table/tfoot/DataTableTfoot.js.map +1 -1
- package/cjs/data/table/th/DataTableTh.d.ts +3 -48
- package/cjs/data/table/th/DataTableTh.js +3 -57
- package/cjs/data/table/th/DataTableTh.js.map +1 -1
- package/cjs/data/table/thead/DataTableThead.js +2 -2
- package/cjs/data/table/thead/DataTableThead.js.map +1 -1
- package/cjs/data/table/tr/DataTableTr.d.ts +8 -0
- package/cjs/data/table/tr/DataTableTr.js +131 -9
- package/cjs/data/table/tr/DataTableTr.js.map +1 -1
- package/cjs/date/datepicker/hooks/useRangeDatepicker.js +1 -1
- package/cjs/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
- package/cjs/date/datepicker/parts/DatePicker.DayButton.js +3 -1
- package/cjs/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
- package/cjs/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
- package/cjs/date/datepicker/parts/DatePicker.RDP.js +26 -11
- package/cjs/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
- package/cjs/date/monthpicker/parts/MonthPicker.Button.js +7 -5
- package/cjs/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
- package/cjs/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
- package/cjs/dialog/popup/DialogPopupInternal.js +1 -1
- package/cjs/dialog/popup/DialogPopupInternal.js.map +1 -1
- package/cjs/form/checkbox/CheckboxGroup.context.d.ts +6 -0
- package/cjs/form/checkbox/CheckboxGroup.context.js +6 -0
- package/cjs/form/checkbox/CheckboxGroup.context.js.map +1 -0
- package/cjs/form/checkbox/CheckboxGroup.d.ts +0 -6
- package/cjs/form/checkbox/CheckboxGroup.js +8 -8
- package/cjs/form/checkbox/CheckboxGroup.js.map +1 -1
- package/cjs/form/checkbox/useCheckbox.js +2 -2
- package/cjs/form/checkbox/useCheckbox.js.map +1 -1
- package/cjs/form/combobox/ComboboxWrapper.js +1 -3
- package/cjs/form/combobox/ComboboxWrapper.js.map +1 -1
- package/cjs/form/error-summary/ErrorSummary.js +1 -3
- package/cjs/form/error-summary/ErrorSummary.js.map +1 -1
- package/cjs/form/fieldset/Fieldset.d.ts +0 -4
- package/cjs/form/fieldset/Fieldset.js +3 -3
- package/cjs/form/fieldset/Fieldset.js.map +1 -1
- package/cjs/form/fieldset/useFieldset.d.ts +5 -3
- package/cjs/form/fieldset/useFieldset.js +9 -4
- package/cjs/form/fieldset/useFieldset.js.map +1 -1
- package/cjs/form/radio/RadioGroup.context.d.ts +8 -0
- package/cjs/form/radio/RadioGroup.context.js +6 -0
- package/cjs/form/radio/RadioGroup.context.js.map +1 -0
- package/cjs/form/radio/RadioGroup.d.ts +0 -8
- package/cjs/form/radio/RadioGroup.js +10 -10
- package/cjs/form/radio/RadioGroup.js.map +1 -1
- package/cjs/form/radio/useRadio.js +2 -2
- package/cjs/form/radio/useRadio.js.map +1 -1
- package/cjs/form/search/Search.js +1 -3
- package/cjs/form/search/Search.js.map +1 -1
- package/cjs/inline-message/root/InlineMessage.js +2 -5
- package/cjs/inline-message/root/InlineMessage.js.map +1 -1
- package/cjs/modal/Modal.js +4 -6
- package/cjs/modal/Modal.js.map +1 -1
- package/cjs/modal/ModalUtils.js +1 -1
- package/cjs/modal/ModalUtils.js.map +1 -1
- package/cjs/modal/types.d.ts +1 -0
- package/cjs/primitives/box/Box.d.ts +1 -1
- package/cjs/process/Process.js +1 -5
- package/cjs/process/Process.js.map +1 -1
- package/cjs/tabs/useTabs.js +3 -7
- package/cjs/tabs/useTabs.js.map +1 -1
- package/cjs/timeline/Timeline.js +25 -62
- package/cjs/timeline/Timeline.js.map +1 -1
- package/cjs/timeline/TimelineRow.js +10 -14
- package/cjs/timeline/TimelineRow.js.map +1 -1
- package/cjs/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
- package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js +179 -0
- package/cjs/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
- package/cjs/timeline/hooks/usePeriodContext.d.ts +0 -1
- package/cjs/timeline/hooks/usePeriodContext.js +0 -1
- package/cjs/timeline/hooks/usePeriodContext.js.map +1 -1
- package/cjs/timeline/hooks/useRowContext.d.ts +0 -1
- package/cjs/timeline/hooks/useRowContext.js +0 -1
- package/cjs/timeline/hooks/useRowContext.js.map +1 -1
- package/cjs/timeline/hooks/useTimelineContext.d.ts +0 -4
- package/cjs/timeline/hooks/useTimelineContext.js +0 -4
- package/cjs/timeline/hooks/useTimelineContext.js.map +1 -1
- package/cjs/timeline/period/ClickablePeriod.js +6 -20
- package/cjs/timeline/period/ClickablePeriod.js.map +1 -1
- package/cjs/timeline/period/NonClickablePeriod.js +1 -1
- package/cjs/timeline/period/NonClickablePeriod.js.map +1 -1
- package/cjs/timeline/pin/PinInternal.js +9 -10
- package/cjs/timeline/pin/PinInternal.js.map +1 -1
- package/cjs/toggle-group/useToggleGroup.js +1 -1
- package/cjs/toggle-group/useToggleGroup.js.map +1 -1
- package/cjs/utils/components/HighlightText/HighlightText.js +1 -4
- package/cjs/utils/components/HighlightText/HighlightText.js.map +1 -1
- package/cjs/utils/components/dismissablelayer/DismissableLayer.js +1 -1
- package/cjs/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
- package/cjs/utils/helpers/create-strict-context.js +1 -1
- package/cjs/utils/helpers/create-strict-context.js.map +1 -1
- package/cjs/utils/hooks/useEventCallback.js +1 -1
- package/cjs/utils/hooks/useEventCallback.js.map +1 -1
- package/cjs/utils/hooks/useMedia.js +1 -1
- package/cjs/utils/hooks/useMedia.js.map +1 -1
- package/esm/alert/base-alert/content/BaseAlertContent.js +4 -1
- package/esm/alert/base-alert/content/BaseAlertContent.js.map +1 -1
- package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.d.ts +3 -1
- package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js +38 -19
- package/esm/data/drag-and-drop/drag-handler/DragAndDropDragHandler.js.map +1 -1
- package/esm/data/drag-and-drop/item/DragAndDropItem.d.ts +3 -2
- package/esm/data/drag-and-drop/item/DragAndDropItem.js +6 -4
- package/esm/data/drag-and-drop/item/DragAndDropItem.js.map +1 -1
- package/esm/data/drag-and-drop/root/DragAndDrop.context.d.ts +2 -2
- package/esm/data/drag-and-drop/root/DragAndDropRoot.d.ts +7 -32
- package/esm/data/drag-and-drop/root/DragAndDropRoot.js +74 -47
- package/esm/data/drag-and-drop/root/DragAndDropRoot.js.map +1 -1
- package/esm/data/drag-and-drop/types.d.ts +4 -0
- package/esm/data/table/base-cell/DataTableBaseCell.d.ts +46 -0
- package/esm/data/table/base-cell/DataTableBaseCell.js +27 -0
- package/esm/data/table/base-cell/DataTableBaseCell.js.map +1 -0
- package/esm/data/table/column-header/DataTableColumnHeader.d.ts +31 -0
- package/esm/data/table/column-header/DataTableColumnHeader.js +71 -0
- package/esm/data/table/column-header/DataTableColumnHeader.js.map +1 -0
- package/esm/data/table/column-header/useTableColumnResize.js.map +1 -0
- package/esm/data/table/empty-state/DataTableEmptyState.d.ts +6 -2
- package/esm/data/table/empty-state/DataTableEmptyState.js +2 -2
- package/esm/data/table/empty-state/DataTableEmptyState.js.map +1 -1
- package/esm/data/table/helpers/selection/getMultipleSelectProps.d.ts +7 -7
- package/esm/data/table/helpers/selection/getMultipleSelectProps.js +29 -28
- package/esm/data/table/helpers/selection/getMultipleSelectProps.js.map +1 -1
- package/esm/data/table/helpers/selection/getSingleSelectProps.d.ts +5 -3
- package/esm/data/table/helpers/selection/getSingleSelectProps.js +8 -12
- package/esm/data/table/helpers/selection/getSingleSelectProps.js.map +1 -1
- package/esm/data/table/helpers/selection/selection.types.d.ts +39 -16
- package/esm/data/table/helpers/table-keyboard.js +3 -0
- package/esm/data/table/helpers/table-keyboard.js.map +1 -1
- package/esm/data/table/hooks/useColumnOptions.d.ts +19 -0
- package/esm/data/table/hooks/useColumnOptions.js +17 -0
- package/esm/data/table/hooks/useColumnOptions.js.map +1 -0
- package/esm/data/table/hooks/useTableExpansion.d.ts +26 -0
- package/esm/data/table/hooks/useTableExpansion.js +31 -0
- package/esm/data/table/hooks/useTableExpansion.js.map +1 -0
- package/esm/data/table/hooks/useTableKeyboardNav.d.ts +2 -1
- package/esm/data/table/hooks/useTableKeyboardNav.js +4 -2
- package/esm/data/table/hooks/useTableKeyboardNav.js.map +1 -1
- package/esm/data/table/hooks/useTableSelection.d.ts +14 -7
- package/esm/data/table/hooks/useTableSelection.js +40 -29
- package/esm/data/table/hooks/useTableSelection.js.map +1 -1
- package/esm/data/table/hooks/useTableSort.d.ts +37 -0
- package/esm/data/table/hooks/useTableSort.js +47 -0
- package/esm/data/table/hooks/useTableSort.js.map +1 -0
- package/esm/data/table/loading-state/DataTableLoadingState.d.ts +6 -2
- package/esm/data/table/loading-state/DataTableLoadingState.js +2 -2
- package/esm/data/table/loading-state/DataTableLoadingState.js.map +1 -1
- package/esm/data/table/root/DataTable.types.d.ts +55 -4
- package/esm/data/table/root/DataTableAuto.d.ts +97 -1
- package/esm/data/table/root/DataTableAuto.js +94 -41
- package/esm/data/table/root/DataTableAuto.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.context.d.ts +22 -1
- package/esm/data/table/root/DataTableRoot.context.js +5 -1
- package/esm/data/table/root/DataTableRoot.context.js.map +1 -1
- package/esm/data/table/root/DataTableRoot.d.ts +0 -6
- package/esm/data/table/root/DataTableRoot.js +6 -5
- package/esm/data/table/root/DataTableRoot.js.map +1 -1
- package/esm/data/table/tbody/DataTableTbody.js +8 -2
- package/esm/data/table/tbody/DataTableTbody.js.map +1 -1
- package/esm/data/table/td/DataTableTd.d.ts +3 -23
- package/esm/data/table/td/DataTableTd.js +3 -7
- package/esm/data/table/td/DataTableTd.js.map +1 -1
- package/esm/data/table/tfoot/DataTableTfoot.js +3 -1
- package/esm/data/table/tfoot/DataTableTfoot.js.map +1 -1
- package/esm/data/table/th/DataTableTh.d.ts +3 -48
- package/esm/data/table/th/DataTableTh.js +4 -58
- package/esm/data/table/th/DataTableTh.js.map +1 -1
- package/esm/data/table/thead/DataTableThead.js +2 -2
- package/esm/data/table/thead/DataTableThead.js.map +1 -1
- package/esm/data/table/tr/DataTableTr.d.ts +8 -0
- package/esm/data/table/tr/DataTableTr.js +134 -12
- package/esm/data/table/tr/DataTableTr.js.map +1 -1
- package/esm/date/datepicker/hooks/useRangeDatepicker.js +1 -1
- package/esm/date/datepicker/hooks/useRangeDatepicker.js.map +1 -1
- package/esm/date/datepicker/parts/DatePicker.DayButton.js +3 -1
- package/esm/date/datepicker/parts/DatePicker.DayButton.js.map +1 -1
- package/esm/date/datepicker/parts/DatePicker.RDP.d.ts +1 -1
- package/esm/date/datepicker/parts/DatePicker.RDP.js +27 -12
- package/esm/date/datepicker/parts/DatePicker.RDP.js.map +1 -1
- package/esm/date/monthpicker/parts/MonthPicker.Button.js +7 -5
- package/esm/date/monthpicker/parts/MonthPicker.Button.js.map +1 -1
- package/esm/date/monthpicker/parts/MonthPicker.Standalone.d.ts +1 -1
- package/esm/dialog/popup/DialogPopupInternal.js +1 -1
- package/esm/dialog/popup/DialogPopupInternal.js.map +1 -1
- package/esm/form/checkbox/CheckboxGroup.context.d.ts +6 -0
- package/esm/form/checkbox/CheckboxGroup.context.js +3 -0
- package/esm/form/checkbox/CheckboxGroup.context.js.map +1 -0
- package/esm/form/checkbox/CheckboxGroup.d.ts +0 -6
- package/esm/form/checkbox/CheckboxGroup.js +8 -8
- package/esm/form/checkbox/CheckboxGroup.js.map +1 -1
- package/esm/form/checkbox/useCheckbox.js +1 -1
- package/esm/form/checkbox/useCheckbox.js.map +1 -1
- package/esm/form/combobox/ComboboxWrapper.js +1 -3
- package/esm/form/combobox/ComboboxWrapper.js.map +1 -1
- package/esm/form/error-summary/ErrorSummary.js +1 -3
- package/esm/form/error-summary/ErrorSummary.js.map +1 -1
- package/esm/form/fieldset/Fieldset.d.ts +0 -4
- package/esm/form/fieldset/Fieldset.js +3 -3
- package/esm/form/fieldset/Fieldset.js.map +1 -1
- package/esm/form/fieldset/useFieldset.d.ts +5 -3
- package/esm/form/fieldset/useFieldset.js +10 -5
- package/esm/form/fieldset/useFieldset.js.map +1 -1
- package/esm/form/radio/RadioGroup.context.d.ts +8 -0
- package/esm/form/radio/RadioGroup.context.js +3 -0
- package/esm/form/radio/RadioGroup.context.js.map +1 -0
- package/esm/form/radio/RadioGroup.d.ts +0 -8
- package/esm/form/radio/RadioGroup.js +9 -9
- package/esm/form/radio/RadioGroup.js.map +1 -1
- package/esm/form/radio/useRadio.js +1 -1
- package/esm/form/radio/useRadio.js.map +1 -1
- package/esm/form/search/Search.js +1 -3
- package/esm/form/search/Search.js.map +1 -1
- package/esm/inline-message/root/InlineMessage.js +2 -5
- package/esm/inline-message/root/InlineMessage.js.map +1 -1
- package/esm/modal/Modal.js +4 -6
- package/esm/modal/Modal.js.map +1 -1
- package/esm/modal/ModalUtils.js +1 -1
- package/esm/modal/ModalUtils.js.map +1 -1
- package/esm/modal/types.d.ts +1 -0
- package/esm/primitives/box/Box.d.ts +1 -1
- package/esm/process/Process.js +1 -5
- package/esm/process/Process.js.map +1 -1
- package/esm/tabs/useTabs.js +3 -7
- package/esm/tabs/useTabs.js.map +1 -1
- package/esm/timeline/Timeline.js +26 -63
- package/esm/timeline/Timeline.js.map +1 -1
- package/esm/timeline/TimelineRow.js +10 -14
- package/esm/timeline/TimelineRow.js.map +1 -1
- package/esm/timeline/hooks/TimelineKeyboardNavProvider.d.ts +16 -0
- package/esm/timeline/hooks/TimelineKeyboardNavProvider.js +141 -0
- package/esm/timeline/hooks/TimelineKeyboardNavProvider.js.map +1 -0
- package/esm/timeline/hooks/usePeriodContext.d.ts +0 -1
- package/esm/timeline/hooks/usePeriodContext.js +0 -1
- package/esm/timeline/hooks/usePeriodContext.js.map +1 -1
- package/esm/timeline/hooks/useRowContext.d.ts +0 -1
- package/esm/timeline/hooks/useRowContext.js +0 -1
- package/esm/timeline/hooks/useRowContext.js.map +1 -1
- package/esm/timeline/hooks/useTimelineContext.d.ts +0 -4
- package/esm/timeline/hooks/useTimelineContext.js +0 -4
- package/esm/timeline/hooks/useTimelineContext.js.map +1 -1
- package/esm/timeline/period/ClickablePeriod.js +7 -21
- package/esm/timeline/period/ClickablePeriod.js.map +1 -1
- package/esm/timeline/period/NonClickablePeriod.js +1 -1
- package/esm/timeline/period/NonClickablePeriod.js.map +1 -1
- package/esm/timeline/pin/PinInternal.js +10 -11
- package/esm/timeline/pin/PinInternal.js.map +1 -1
- package/esm/toggle-group/useToggleGroup.js +1 -1
- package/esm/toggle-group/useToggleGroup.js.map +1 -1
- package/esm/utils/components/HighlightText/HighlightText.js +1 -4
- package/esm/utils/components/HighlightText/HighlightText.js.map +1 -1
- package/esm/utils/components/dismissablelayer/DismissableLayer.js +1 -1
- package/esm/utils/components/dismissablelayer/DismissableLayer.js.map +1 -1
- package/esm/utils/helpers/create-strict-context.js +1 -1
- package/esm/utils/helpers/create-strict-context.js.map +1 -1
- package/esm/utils/hooks/useEventCallback.js +1 -1
- package/esm/utils/hooks/useEventCallback.js.map +1 -1
- package/esm/utils/hooks/useMedia.js +1 -1
- package/esm/utils/hooks/useMedia.js.map +1 -1
- package/package.json +9 -7
- package/src/alert/base-alert/content/BaseAlertContent.tsx +7 -2
- package/src/data/drag-and-drop/drag-handler/DragAndDropDragHandler.tsx +69 -29
- package/src/data/drag-and-drop/item/DragAndDropItem.tsx +16 -10
- package/src/data/drag-and-drop/root/DragAndDrop.context.tsx +2 -2
- package/src/data/drag-and-drop/root/DragAndDropRoot.tsx +291 -246
- package/src/data/drag-and-drop/types.ts +5 -0
- package/src/data/table/base-cell/DataTableBaseCell.tsx +92 -0
- package/src/data/table/column-header/DataTableColumnHeader.tsx +180 -0
- package/src/data/table/empty-state/DataTableEmptyState.tsx +5 -3
- package/src/data/table/helpers/selection/getMultipleSelectProps.ts +47 -43
- package/src/data/table/helpers/selection/getSingleSelectProps.ts +13 -14
- package/src/data/table/helpers/selection/selection.types.ts +41 -16
- package/src/data/table/helpers/table-keyboard.ts +4 -0
- package/src/data/table/hooks/__tests__/useTableSelection.test.ts +93 -56
- package/src/data/table/hooks/useColumnOptions.ts +48 -0
- package/src/data/table/hooks/useTableExpansion.tsx +100 -0
- package/src/data/table/hooks/useTableKeyboardNav.ts +7 -5
- package/src/data/table/hooks/useTableSelection.ts +77 -46
- package/src/data/table/hooks/useTableSort.ts +103 -0
- package/src/data/table/loading-state/DataTableLoadingState.tsx +5 -3
- package/src/data/table/root/DataTable.types.ts +64 -5
- package/src/data/table/root/DataTableAuto.tsx +382 -104
- package/src/data/table/root/DataTableRoot.context.ts +30 -1
- package/src/data/table/root/DataTableRoot.tsx +14 -11
- package/src/data/table/tbody/DataTableTbody.tsx +17 -6
- package/src/data/table/td/DataTableTd.tsx +11 -47
- package/src/data/table/tfoot/DataTableTfoot.tsx +10 -7
- package/src/data/table/th/DataTableTh.tsx +11 -183
- package/src/data/table/thead/DataTableThead.tsx +3 -3
- package/src/data/table/tr/DataTableTr.tsx +300 -11
- package/src/date/datepicker/hooks/useRangeDatepicker.tsx +1 -1
- package/src/date/datepicker/parts/DatePicker.DayButton.tsx +2 -1
- package/src/date/datepicker/parts/DatePicker.RDP.tsx +34 -15
- package/src/date/monthpicker/parts/MonthPicker.Button.tsx +11 -9
- package/src/date/monthpicker/parts/MonthPicker.Standalone.tsx +1 -1
- package/src/dialog/popup/DialogPopupInternal.tsx +1 -1
- package/src/form/checkbox/CheckboxGroup.context.ts +10 -0
- package/src/form/checkbox/CheckboxGroup.tsx +18 -28
- package/src/form/checkbox/useCheckbox.ts +1 -1
- package/src/form/fieldset/Fieldset.tsx +4 -8
- package/src/form/fieldset/useFieldset.ts +13 -6
- package/src/form/radio/RadioGroup.context.ts +13 -0
- package/src/form/radio/RadioGroup.tsx +22 -31
- package/src/form/radio/useRadio.ts +1 -1
- package/src/inline-message/root/InlineMessage.tsx +3 -13
- package/src/modal/Modal.tsx +12 -6
- package/src/modal/ModalUtils.ts +1 -1
- package/src/modal/types.ts +1 -0
- package/src/primitives/box/Box.tsx +1 -1
- package/src/tabs/useTabs.ts +3 -7
- package/src/timeline/Timeline.tsx +62 -91
- package/src/timeline/TimelineRow.tsx +19 -17
- package/src/timeline/hooks/TimelineKeyboardNavProvider.tsx +237 -0
- package/src/timeline/hooks/usePeriodContext.tsx +0 -2
- package/src/timeline/hooks/useRowContext.tsx +0 -2
- package/src/timeline/hooks/useTimelineContext.tsx +0 -8
- package/src/timeline/period/ClickablePeriod.tsx +8 -19
- package/src/timeline/period/NonClickablePeriod.tsx +2 -0
- package/src/timeline/pin/PinInternal.tsx +10 -13
- package/src/toggle-group/useToggleGroup.ts +1 -1
- package/src/utils/components/dismissablelayer/DismissableLayer.tsx +1 -1
- package/src/utils/helpers/create-strict-context.tsx +1 -1
- package/src/utils/hooks/useEventCallback.ts +1 -1
- package/src/utils/hooks/useMedia.ts +1 -1
- package/cjs/data/table/th/DataTableThActions.d.ts +0 -5
- package/cjs/data/table/th/DataTableThActions.js +0 -23
- package/cjs/data/table/th/DataTableThActions.js.map +0 -1
- package/cjs/data/table/th/useTableColumnResize.js.map +0 -1
- package/cjs/data/table/thead/DataTableThead.context.d.ts +0 -4
- package/cjs/data/table/thead/DataTableThead.context.js +0 -45
- package/cjs/data/table/thead/DataTableThead.context.js.map +0 -1
- package/esm/data/table/th/DataTableThActions.d.ts +0 -5
- package/esm/data/table/th/DataTableThActions.js +0 -18
- package/esm/data/table/th/DataTableThActions.js.map +0 -1
- package/esm/data/table/th/useTableColumnResize.js.map +0 -1
- package/esm/data/table/thead/DataTableThead.context.d.ts +0 -4
- package/esm/data/table/thead/DataTableThead.context.js +0 -8
- package/esm/data/table/thead/DataTableThead.context.js.map +0 -1
- package/src/data/table/th/DataTableThActions.tsx +0 -32
- package/src/data/table/thead/DataTableThead.context.ts +0 -10
- /package/cjs/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
- /package/cjs/data/table/{th → column-header}/useTableColumnResize.js +0 -0
- /package/esm/data/table/{th → column-header}/useTableColumnResize.d.ts +0 -0
- /package/esm/data/table/{th → column-header}/useTableColumnResize.js +0 -0
- /package/src/data/table/{th → column-header}/useTableColumnResize.ts +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { endOfDay, isSameDay, startOfDay } from "date-fns";
|
|
2
|
-
import React, { forwardRef, useMemo,
|
|
2
|
+
import React, { forwardRef, useMemo, useState } from "react";
|
|
3
3
|
import { AxisLabels } from "./AxisLabels";
|
|
4
4
|
import TimelineRow, { TimelineRowType } from "./TimelineRow";
|
|
5
|
+
import { TimelineKeyboardNavProvider } from "./hooks/TimelineKeyboardNavProvider";
|
|
5
6
|
import { RowContext } from "./hooks/useRowContext";
|
|
6
7
|
import { TimelineContext } from "./hooks/useTimelineContext";
|
|
7
8
|
import {
|
|
@@ -92,43 +93,48 @@ export const Timeline = forwardRef<HTMLDivElement, TimelineProps>(
|
|
|
92
93
|
axisLabelTemplates,
|
|
93
94
|
...rest
|
|
94
95
|
},
|
|
95
|
-
|
|
96
|
+
forwardedRef,
|
|
96
97
|
) => {
|
|
97
|
-
const
|
|
98
|
+
const childArray = useMemo(
|
|
99
|
+
() =>
|
|
100
|
+
React.Children.toArray(Array.isArray(children) ? children : [children]),
|
|
101
|
+
[children],
|
|
102
|
+
);
|
|
98
103
|
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
104
|
+
const rowChildren = useMemo(() => {
|
|
105
|
+
return childArray.filter((c: any) => c?.type?.componentType === "row");
|
|
106
|
+
}, [childArray]);
|
|
102
107
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
+
const pins = useMemo(
|
|
109
|
+
() =>
|
|
110
|
+
childArray
|
|
111
|
+
.filter((c: any) => c?.type?.componentType === "pin")
|
|
112
|
+
.map((x) => () => x),
|
|
113
|
+
[childArray],
|
|
108
114
|
);
|
|
109
115
|
|
|
110
|
-
const
|
|
111
|
-
.
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const zoomComponent = React.Children.toArray(children).find(
|
|
115
|
-
(c: any) => c?.type?.componentType === "zoom",
|
|
116
|
+
const zoomComponent = useMemo(
|
|
117
|
+
() => childArray.find((c: any) => c?.type?.componentType === "zoom"),
|
|
118
|
+
[childArray],
|
|
116
119
|
);
|
|
117
120
|
|
|
118
121
|
const rowsRaw = useMemo(() => {
|
|
119
122
|
return parseRows(rowChildren);
|
|
120
123
|
}, [rowChildren]);
|
|
121
124
|
|
|
122
|
-
const rows =
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
const rows = useMemo(
|
|
126
|
+
() =>
|
|
127
|
+
rowsRaw.map((r) => {
|
|
128
|
+
if (r?.periods) {
|
|
129
|
+
return r.periods;
|
|
130
|
+
}
|
|
131
|
+
return [];
|
|
132
|
+
}),
|
|
133
|
+
[rowsRaw],
|
|
134
|
+
);
|
|
128
135
|
|
|
129
136
|
const initialStartDate = startOfDay(useEarliestDate({ startDate, rows }));
|
|
130
137
|
const [start, setStart] = useState(initialStartDate);
|
|
131
|
-
const [activeRow, setActiveRow] = useState<number | null>(null);
|
|
132
138
|
const [endInclusive, setEndInclusive] = useState(
|
|
133
139
|
endOfDay(useLatestDate({ endDate, rows })),
|
|
134
140
|
);
|
|
@@ -165,38 +171,6 @@ export const Timeline = forwardRef<HTMLDivElement, TimelineProps>(
|
|
|
165
171
|
}
|
|
166
172
|
};
|
|
167
173
|
|
|
168
|
-
const handleActiveRowChange = (key: string) => {
|
|
169
|
-
if (activeRow !== null && key === "ArrowDown") {
|
|
170
|
-
for (let i = activeRow + 1; i < processedRows.length; i++) {
|
|
171
|
-
const row = processedRows[i];
|
|
172
|
-
if (row.periods.find((p) => !!p.children || !!p.onSelectPeriod)) {
|
|
173
|
-
setActiveRow(i);
|
|
174
|
-
firstFocusabled.current.find((x) => x.id === i)?.ref?.focus();
|
|
175
|
-
break;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return;
|
|
179
|
-
}
|
|
180
|
-
if (activeRow !== null && key === "ArrowUp") {
|
|
181
|
-
for (let i = activeRow - 1; i >= 0; i--) {
|
|
182
|
-
const row = processedRows[i];
|
|
183
|
-
if (row.periods.find((p) => !!p.children || !!p.onSelectPeriod)) {
|
|
184
|
-
setActiveRow(i);
|
|
185
|
-
firstFocusabled.current.find((x) => x.id === i)?.ref?.focus();
|
|
186
|
-
break;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
const addFocusable = (btnRef: HTMLButtonElement | null, id: number) => {
|
|
194
|
-
let items = firstFocusabled.current;
|
|
195
|
-
items = items.filter((x) => x.id !== id);
|
|
196
|
-
items.push({ ref: btnRef, id });
|
|
197
|
-
firstFocusabled.current = items;
|
|
198
|
-
};
|
|
199
|
-
|
|
200
174
|
return (
|
|
201
175
|
<TimelineContext.Provider
|
|
202
176
|
value={{
|
|
@@ -205,44 +179,41 @@ export const Timeline = forwardRef<HTMLDivElement, TimelineProps>(
|
|
|
205
179
|
direction,
|
|
206
180
|
setStart: (d) => handleZoomChange(d),
|
|
207
181
|
setEndInclusive: (d) => setEndInclusive(d),
|
|
208
|
-
activeRow,
|
|
209
|
-
setActiveRow: (key) => handleActiveRowChange(key),
|
|
210
|
-
initiate: (i) => setActiveRow(i),
|
|
211
|
-
addFocusable,
|
|
212
182
|
}}
|
|
213
183
|
>
|
|
214
|
-
<
|
|
215
|
-
<div
|
|
216
|
-
<
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
184
|
+
<TimelineKeyboardNavProvider>
|
|
185
|
+
<div {...rest} ref={forwardedRef}>
|
|
186
|
+
<div className="aksel-timeline">
|
|
187
|
+
<AxisLabels templates={axisLabelTemplates} />
|
|
188
|
+
|
|
189
|
+
{pins.map((PinChild, i) => (
|
|
190
|
+
<PinChild key={`pin-${i}`} />
|
|
191
|
+
))}
|
|
192
|
+
|
|
193
|
+
{processedRows.map((row, i) => {
|
|
194
|
+
return (
|
|
195
|
+
<RowContext.Provider
|
|
196
|
+
key={`row-${row.id}`}
|
|
197
|
+
value={{
|
|
198
|
+
periods: row.periods,
|
|
199
|
+
id: row.id,
|
|
200
|
+
index: i,
|
|
201
|
+
}}
|
|
202
|
+
>
|
|
203
|
+
<TimelineRow
|
|
204
|
+
{...row?.restProps}
|
|
205
|
+
ref={row?.ref}
|
|
206
|
+
label={row.label}
|
|
207
|
+
icon={row.icon}
|
|
208
|
+
headingTag={row.headingTag}
|
|
209
|
+
/>
|
|
210
|
+
</RowContext.Provider>
|
|
211
|
+
);
|
|
212
|
+
})}
|
|
213
|
+
</div>
|
|
214
|
+
{zoomComponent}
|
|
243
215
|
</div>
|
|
244
|
-
|
|
245
|
-
</div>
|
|
216
|
+
</TimelineKeyboardNavProvider>
|
|
246
217
|
</TimelineContext.Provider>
|
|
247
218
|
);
|
|
248
219
|
},
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
/* eslint-disable jsx-a11y/no-static-element-interactions */
|
|
1
2
|
import { format } from "date-fns";
|
|
2
3
|
import React, { forwardRef } from "react";
|
|
3
4
|
import { BodyShort } from "../typography/BodyShort";
|
|
4
5
|
import { cl } from "../utils/helpers";
|
|
5
6
|
import { useI18n } from "../utils/i18n/i18n.hooks";
|
|
7
|
+
import {
|
|
8
|
+
useTimelineKeyboardActiveRow,
|
|
9
|
+
useTimelineKeyboardContext,
|
|
10
|
+
} from "./hooks/TimelineKeyboardNavProvider";
|
|
6
11
|
import { PeriodContext } from "./hooks/usePeriodContext";
|
|
7
12
|
import { useRowContext } from "./hooks/useRowContext";
|
|
8
|
-
import { useTimelineContext } from "./hooks/useTimelineContext";
|
|
9
13
|
import Period from "./period";
|
|
10
14
|
import {
|
|
11
15
|
PositionedPeriod,
|
|
@@ -49,10 +53,14 @@ export interface TimelineRowType extends React.ForwardRefExoticComponent<
|
|
|
49
53
|
|
|
50
54
|
export const TimelineRow = forwardRef<HTMLOListElement, TimelineRowProps>(
|
|
51
55
|
({ label, className, headingTag = "h3", icon, ...rest }, ref) => {
|
|
52
|
-
const { periods
|
|
53
|
-
const {
|
|
56
|
+
const { periods } = useRowContext();
|
|
57
|
+
const { updateActiveRow, handleRowKeyDown } = useTimelineKeyboardContext();
|
|
58
|
+
const { activeRow } = useTimelineKeyboardActiveRow();
|
|
54
59
|
const translate = useI18n("Timeline");
|
|
55
60
|
|
|
61
|
+
const [elementRefState, setElementRefState] =
|
|
62
|
+
React.useState<HTMLDivElement | null>(null);
|
|
63
|
+
|
|
56
64
|
const latest = periods.reduce((a, b) => {
|
|
57
65
|
return a.end > b.end ? a : b;
|
|
58
66
|
}, {} as PositionedPeriod);
|
|
@@ -61,10 +69,6 @@ export const TimelineRow = forwardRef<HTMLOListElement, TimelineRowProps>(
|
|
|
61
69
|
return a.end < b.end ? a : b;
|
|
62
70
|
}, {} as PositionedPeriod);
|
|
63
71
|
|
|
64
|
-
const firstFocusable = periods.find(
|
|
65
|
-
(p) => !!p.children || !!p.onSelectPeriod,
|
|
66
|
-
);
|
|
67
|
-
|
|
68
72
|
return (
|
|
69
73
|
<>
|
|
70
74
|
{label &&
|
|
@@ -80,15 +84,20 @@ export const TimelineRow = forwardRef<HTMLOListElement, TimelineRowProps>(
|
|
|
80
84
|
) : (
|
|
81
85
|
<div className="aksel-timeline__row-label">{label}</div>
|
|
82
86
|
))}
|
|
87
|
+
|
|
88
|
+
{/** biome-ignore lint/a11y/noStaticElementInteractions: onKeyDown just captures events on child-elements here. Regular interaction patterns still works as expected. */}
|
|
83
89
|
<div
|
|
84
90
|
className={cl("aksel-timeline__row", {
|
|
85
|
-
"aksel-timeline__row--active":
|
|
91
|
+
"aksel-timeline__row--active": activeRow === elementRefState,
|
|
86
92
|
})}
|
|
93
|
+
ref={setElementRefState}
|
|
94
|
+
tabIndex={-1}
|
|
95
|
+
onFocusCapture={() => updateActiveRow(elementRefState)}
|
|
96
|
+
onKeyDown={handleRowKeyDown}
|
|
97
|
+
data-timeline-row
|
|
87
98
|
>
|
|
88
|
-
{/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions */}
|
|
89
99
|
<ol
|
|
90
100
|
{...rest}
|
|
91
|
-
tabIndex={-1}
|
|
92
101
|
ref={ref}
|
|
93
102
|
aria-label={
|
|
94
103
|
periods.length === 0
|
|
@@ -99,12 +108,6 @@ export const TimelineRow = forwardRef<HTMLOListElement, TimelineRowProps>(
|
|
|
99
108
|
})
|
|
100
109
|
}
|
|
101
110
|
className={cl("aksel-timeline__row-periods", className)}
|
|
102
|
-
onKeyDown={(e) => {
|
|
103
|
-
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
|
|
104
|
-
e.preventDefault();
|
|
105
|
-
setActiveRow(e.key);
|
|
106
|
-
}
|
|
107
|
-
}}
|
|
108
111
|
>
|
|
109
112
|
{periods?.map((period) => {
|
|
110
113
|
return (
|
|
@@ -112,7 +115,6 @@ export const TimelineRow = forwardRef<HTMLOListElement, TimelineRowProps>(
|
|
|
112
115
|
<PeriodContext.Provider
|
|
113
116
|
value={{
|
|
114
117
|
periodId: period.id,
|
|
115
|
-
firstFocus: firstFocusable?.id === period.id,
|
|
116
118
|
restProps: period?.restProps,
|
|
117
119
|
}}
|
|
118
120
|
>
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import React, { useCallback, useRef } from "react";
|
|
2
|
+
import { Slot } from "../../utils/components/slot/Slot";
|
|
3
|
+
import { createStrictContext } from "../../utils/helpers";
|
|
4
|
+
|
|
5
|
+
type TimelineKeyboardNavStableContextType = {
|
|
6
|
+
updateActiveRow: (element: HTMLElement | null) => void;
|
|
7
|
+
handleRowKeyDown: (event: React.KeyboardEvent<HTMLElement>) => void;
|
|
8
|
+
handlePinKeyDown: (event: React.KeyboardEvent<Element>) => void;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
type TimelineKeyboardNavActiveRowContextType = {
|
|
12
|
+
activeRow: HTMLElement | null;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const {
|
|
16
|
+
Provider: TimelineKeyboardNavStableContextProvider,
|
|
17
|
+
useContext: useTimelineKeyboardContext,
|
|
18
|
+
} = createStrictContext<TimelineKeyboardNavStableContextType>({
|
|
19
|
+
name: "TimelineKeyboardNavStableContext",
|
|
20
|
+
errorMessage:
|
|
21
|
+
"useTimelineKeyboardContext must be used within a TimelineKeyboardNavProvider",
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
const {
|
|
25
|
+
Provider: TimelineKeyboardNavActiveRowContextProvider,
|
|
26
|
+
useContext: useTimelineKeyboardActiveRow,
|
|
27
|
+
} = createStrictContext<TimelineKeyboardNavActiveRowContextType>({
|
|
28
|
+
name: "TimelineKeyboardNavActiveRowContext",
|
|
29
|
+
errorMessage:
|
|
30
|
+
"useTimelineKeyboardActiveRow must be used within a TimelineKeyboardNavProvider",
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
type TimelineKeyboardNavProviderProps = {
|
|
34
|
+
children: React.ReactElement;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
function TimelineKeyboardNavProvider({
|
|
38
|
+
children,
|
|
39
|
+
}: TimelineKeyboardNavProviderProps) {
|
|
40
|
+
const [activeRow, setActiveRow] = React.useState<HTMLElement | null>(null);
|
|
41
|
+
const activeRowRef = React.useRef<HTMLElement | null>(null);
|
|
42
|
+
|
|
43
|
+
const timelineElementRef = useRef<HTMLTableElement>(null);
|
|
44
|
+
|
|
45
|
+
const updateActiveRow = React.useCallback((element: HTMLElement | null) => {
|
|
46
|
+
activeRowRef.current = element;
|
|
47
|
+
setActiveRow(element);
|
|
48
|
+
}, []);
|
|
49
|
+
|
|
50
|
+
const handleRowKeyDown = useCallback(
|
|
51
|
+
(event: React.KeyboardEvent<HTMLElement>) => {
|
|
52
|
+
const currentActiveRow = activeRowRef.current;
|
|
53
|
+
if (!currentActiveRow) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* Skip interaction if focus is inside popover */
|
|
58
|
+
if (document.activeElement?.closest("[data-timeline-popover]")) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const { key } = event;
|
|
63
|
+
|
|
64
|
+
if (key === "ArrowDown" || key === "ArrowUp") {
|
|
65
|
+
const rows = currentActiveRow.parentElement?.querySelectorAll(
|
|
66
|
+
"[data-timeline-row]",
|
|
67
|
+
);
|
|
68
|
+
const firstPin = currentActiveRow.parentElement?.querySelector(
|
|
69
|
+
"[data-timeline-pin]",
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
if (!rows || rows.length === 0) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const currentIndex = Array.from(rows).indexOf(currentActiveRow);
|
|
77
|
+
if (currentIndex === -1) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const atBoundary = currentIndex === 0 && key === "ArrowUp";
|
|
82
|
+
|
|
83
|
+
if (atBoundary && firstPin) {
|
|
84
|
+
focusElement(firstPin, event);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const nextIndex =
|
|
89
|
+
key === "ArrowDown" ? currentIndex + 1 : currentIndex - 1;
|
|
90
|
+
|
|
91
|
+
/* We want to avoid looping */
|
|
92
|
+
if (nextIndex < 0 || nextIndex >= rows.length) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const nextRow = rows[nextIndex];
|
|
97
|
+
const periods = nextRow?.querySelectorAll("[data-timeline-period]");
|
|
98
|
+
|
|
99
|
+
if (periods?.length > 0) {
|
|
100
|
+
focusElement(periods[0], event);
|
|
101
|
+
} else if (nextRow) {
|
|
102
|
+
focusElement(nextRow, event);
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (key === "ArrowRight" || key === "ArrowLeft") {
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
const periods = currentActiveRow.querySelectorAll(
|
|
110
|
+
"[data-timeline-period]",
|
|
111
|
+
);
|
|
112
|
+
if (periods.length === 0) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const currentIndex = Array.from(periods).indexOf(
|
|
117
|
+
document.activeElement as HTMLElement,
|
|
118
|
+
);
|
|
119
|
+
if (currentIndex === -1) {
|
|
120
|
+
/* If just the row has focus, we want to focus either the first or last period inside based on key */
|
|
121
|
+
focusElement(
|
|
122
|
+
periods[key === "ArrowRight" ? 0 : periods.length - 1],
|
|
123
|
+
event,
|
|
124
|
+
);
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const nextIndex =
|
|
129
|
+
key === "ArrowRight" ? currentIndex + 1 : currentIndex - 1;
|
|
130
|
+
|
|
131
|
+
/* We want to avoid looping */
|
|
132
|
+
if (nextIndex < 0 || nextIndex >= periods.length) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
focusElement(periods[nextIndex], event);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
[],
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
const handlePinKeyDown = useCallback(
|
|
143
|
+
(event: React.KeyboardEvent<Element>) => {
|
|
144
|
+
const timelineElement = timelineElementRef.current;
|
|
145
|
+
if (!timelineElement) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Skip interaction if focus is inside popover */
|
|
150
|
+
if (document.activeElement?.closest("[data-timeline-popover]")) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const { key } = event;
|
|
155
|
+
|
|
156
|
+
if (key === "ArrowDown") {
|
|
157
|
+
const rows = timelineElement.querySelectorAll("[data-timeline-row]");
|
|
158
|
+
if (rows.length === 0) {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
const rowToFocus = rows[0] as HTMLElement | null;
|
|
162
|
+
|
|
163
|
+
if (rowToFocus) {
|
|
164
|
+
const periods = rowToFocus?.querySelectorAll(
|
|
165
|
+
"[data-timeline-period]",
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
if (periods?.length > 0) {
|
|
169
|
+
focusElement(periods[0], event);
|
|
170
|
+
} else if (rowToFocus) {
|
|
171
|
+
focusElement(rowToFocus, event);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (key === "ArrowRight" || key === "ArrowLeft") {
|
|
177
|
+
event.preventDefault();
|
|
178
|
+
const pins = timelineElement.querySelectorAll("[data-timeline-pin]");
|
|
179
|
+
if (pins.length === 0) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
const currentIndex = Array.from(pins).indexOf(
|
|
184
|
+
document.activeElement as HTMLElement,
|
|
185
|
+
);
|
|
186
|
+
if (currentIndex === -1) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const nextIndex =
|
|
191
|
+
key === "ArrowRight" ? currentIndex + 1 : currentIndex - 1;
|
|
192
|
+
|
|
193
|
+
/* We want to avoid looping */
|
|
194
|
+
if (nextIndex < 0 || nextIndex >= pins.length) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
focusElement(pins[nextIndex], event);
|
|
199
|
+
}
|
|
200
|
+
},
|
|
201
|
+
[],
|
|
202
|
+
);
|
|
203
|
+
|
|
204
|
+
return (
|
|
205
|
+
<TimelineKeyboardNavStableContextProvider
|
|
206
|
+
updateActiveRow={updateActiveRow}
|
|
207
|
+
handleRowKeyDown={handleRowKeyDown}
|
|
208
|
+
handlePinKeyDown={handlePinKeyDown}
|
|
209
|
+
>
|
|
210
|
+
<TimelineKeyboardNavActiveRowContextProvider activeRow={activeRow}>
|
|
211
|
+
<Slot ref={timelineElementRef}>{children}</Slot>
|
|
212
|
+
</TimelineKeyboardNavActiveRowContextProvider>
|
|
213
|
+
</TimelineKeyboardNavStableContextProvider>
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Focuses the given element and prevents default behavior of the event if focus is called.
|
|
219
|
+
*/
|
|
220
|
+
function focusElement(
|
|
221
|
+
element: HTMLElement | Element | null,
|
|
222
|
+
event: React.KeyboardEvent<HTMLElement | Element>,
|
|
223
|
+
) {
|
|
224
|
+
if (!element) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
event.preventDefault();
|
|
229
|
+
|
|
230
|
+
(element as HTMLElement).focus();
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export {
|
|
234
|
+
TimelineKeyboardNavProvider,
|
|
235
|
+
useTimelineKeyboardContext,
|
|
236
|
+
useTimelineKeyboardActiveRow,
|
|
237
|
+
};
|
|
@@ -2,13 +2,11 @@ import { createContext, useContext } from "react";
|
|
|
2
2
|
|
|
3
3
|
interface PeriodContextProps {
|
|
4
4
|
periodId: string;
|
|
5
|
-
firstFocus: boolean;
|
|
6
5
|
restProps?: any;
|
|
7
6
|
}
|
|
8
7
|
|
|
9
8
|
export const PeriodContext = createContext<PeriodContextProps>({
|
|
10
9
|
periodId: "",
|
|
11
|
-
firstFocus: false,
|
|
12
10
|
});
|
|
13
11
|
|
|
14
12
|
export const usePeriodContext = () => {
|
|
@@ -4,14 +4,12 @@ import { PositionedPeriod } from "../utils/types.internal";
|
|
|
4
4
|
interface RowContextProps {
|
|
5
5
|
periods: PositionedPeriod[];
|
|
6
6
|
id: string;
|
|
7
|
-
active: boolean;
|
|
8
7
|
index: number;
|
|
9
8
|
}
|
|
10
9
|
|
|
11
10
|
export const RowContext = createContext<RowContextProps>({
|
|
12
11
|
periods: [],
|
|
13
12
|
id: "",
|
|
14
|
-
active: false,
|
|
15
13
|
index: 0,
|
|
16
14
|
});
|
|
17
15
|
|
|
@@ -6,10 +6,6 @@ interface TimelineContextProps {
|
|
|
6
6
|
direction: "left" | "right";
|
|
7
7
|
setStart: (d: Date) => void;
|
|
8
8
|
setEndInclusive: (d: Date) => void;
|
|
9
|
-
activeRow: number | null;
|
|
10
|
-
setActiveRow: (i: string) => void;
|
|
11
|
-
initiate: (i: number) => void;
|
|
12
|
-
addFocusable: (ref: HTMLButtonElement | null, id: number) => void;
|
|
13
9
|
}
|
|
14
10
|
|
|
15
11
|
export const TimelineContext = createContext<TimelineContextProps>({
|
|
@@ -18,10 +14,6 @@ export const TimelineContext = createContext<TimelineContextProps>({
|
|
|
18
14
|
direction: "left",
|
|
19
15
|
setStart: () => null,
|
|
20
16
|
setEndInclusive: () => null,
|
|
21
|
-
activeRow: 0,
|
|
22
|
-
setActiveRow: () => null,
|
|
23
|
-
initiate: () => null,
|
|
24
|
-
addFocusable: () => null,
|
|
25
17
|
});
|
|
26
18
|
|
|
27
19
|
export const useTimelineContext = () => {
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
offset,
|
|
6
6
|
safePolygon,
|
|
7
7
|
shift,
|
|
8
|
+
useClick,
|
|
8
9
|
useDismiss,
|
|
9
10
|
useFloating,
|
|
10
11
|
useFocus,
|
|
@@ -15,9 +16,6 @@ import React, { useState } from "react";
|
|
|
15
16
|
import { cl } from "../../utils/helpers";
|
|
16
17
|
import { useMergeRefs } from "../../utils/hooks";
|
|
17
18
|
import { useI18n } from "../../utils/i18n/i18n.hooks";
|
|
18
|
-
import { usePeriodContext } from "../hooks/usePeriodContext";
|
|
19
|
-
import { useRowContext } from "../hooks/useRowContext";
|
|
20
|
-
import { useTimelineContext } from "../hooks/useTimelineContext";
|
|
21
19
|
import { ariaLabel, getConditionalClasses } from "../utils/period";
|
|
22
20
|
import type { PeriodProps } from "./types";
|
|
23
21
|
|
|
@@ -52,9 +50,6 @@ const ClickablePeriod = React.memo(
|
|
|
52
50
|
periodRef,
|
|
53
51
|
}: TimelineClickablePeriodProps) => {
|
|
54
52
|
const [open, setOpen] = useState(false);
|
|
55
|
-
const { index } = useRowContext();
|
|
56
|
-
const { firstFocus } = usePeriodContext();
|
|
57
|
-
const { initiate, addFocusable } = useTimelineContext();
|
|
58
53
|
|
|
59
54
|
const translate = useI18n("Timeline");
|
|
60
55
|
|
|
@@ -78,8 +73,10 @@ const ClickablePeriod = React.memo(
|
|
|
78
73
|
});
|
|
79
74
|
const focus = useFocus(context);
|
|
80
75
|
const dismiss = useDismiss(context);
|
|
76
|
+
const click = useClick(context);
|
|
81
77
|
|
|
82
78
|
const { getFloatingProps, getReferenceProps } = useInteractions([
|
|
79
|
+
click,
|
|
83
80
|
hover,
|
|
84
81
|
focus,
|
|
85
82
|
dismiss,
|
|
@@ -92,13 +89,11 @@ const ClickablePeriod = React.memo(
|
|
|
92
89
|
return (
|
|
93
90
|
<>
|
|
94
91
|
<button
|
|
92
|
+
data-timeline-period
|
|
95
93
|
{...restProps}
|
|
96
94
|
data-color={restProps?.["data-color"] ?? status}
|
|
97
95
|
type="button"
|
|
98
|
-
ref={
|
|
99
|
-
firstFocus && addFocusable(r, index);
|
|
100
|
-
mergedRef?.(r);
|
|
101
|
-
}}
|
|
96
|
+
ref={mergedRef}
|
|
102
97
|
aria-label={label}
|
|
103
98
|
className={cl(
|
|
104
99
|
"aksel-timeline__period--clickable",
|
|
@@ -111,17 +106,10 @@ const ClickablePeriod = React.memo(
|
|
|
111
106
|
aria-expanded={children ? open : undefined}
|
|
112
107
|
aria-current={isActive || undefined}
|
|
113
108
|
{...getReferenceProps({
|
|
114
|
-
onFocus: () => {
|
|
115
|
-
initiate(index);
|
|
116
|
-
},
|
|
117
109
|
onKeyDown: (e) => {
|
|
118
|
-
restProps?.
|
|
119
|
-
if (e.key === "Enter") {
|
|
120
|
-
setOpen((prev) => !prev);
|
|
121
|
-
}
|
|
110
|
+
restProps?.onKeyDown?.(e);
|
|
122
111
|
if (e.key === " ") {
|
|
123
112
|
onSelectPeriod?.(e);
|
|
124
|
-
setOpen(false);
|
|
125
113
|
}
|
|
126
114
|
},
|
|
127
115
|
style: {
|
|
@@ -144,10 +132,11 @@ const ClickablePeriod = React.memo(
|
|
|
144
132
|
context={context}
|
|
145
133
|
modal={false}
|
|
146
134
|
initialFocus={-1}
|
|
147
|
-
returnFocus
|
|
135
|
+
returnFocus
|
|
148
136
|
>
|
|
149
137
|
<div
|
|
150
138
|
className="aksel-timeline__popover"
|
|
139
|
+
data-timeline-popover
|
|
151
140
|
data-placement={placement}
|
|
152
141
|
ref={refs.setFloating}
|
|
153
142
|
role="dialog"
|