@economic/taco 14.0.0 → 14.1.0-EC-85807-code-report-fixes.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/dist/charts/components/Area/AreaChart.cjs.map +1 -1
- package/dist/charts/components/Area/AreaChart.d.ts +1 -1
- package/dist/charts/components/Area/AreaChart.js.map +1 -1
- package/dist/charts/components/Bar/BarChart.cjs +2 -2
- package/dist/charts/components/Bar/BarChart.cjs.map +1 -1
- package/dist/charts/components/Bar/BarChart.d.ts +1 -1
- package/dist/charts/components/Bar/BarChart.js +2 -2
- package/dist/charts/components/Bar/BarChart.js.map +1 -1
- package/dist/charts/components/ChartWrapper.cjs.map +1 -1
- package/dist/charts/components/ChartWrapper.js.map +1 -1
- package/dist/charts/components/Composed/BarLineChart.cjs.map +1 -1
- package/dist/charts/components/Composed/BarLineChart.d.ts +2 -2
- package/dist/charts/components/Composed/BarLineChart.js.map +1 -1
- package/dist/charts/components/Donut/DonutChart.cjs.map +1 -1
- package/dist/charts/components/Donut/DonutChart.d.ts +1 -1
- package/dist/charts/components/Donut/DonutChart.js.map +1 -1
- package/dist/charts/components/LegacyDonut/ActiveShape.cjs +7 -5
- package/dist/charts/components/LegacyDonut/ActiveShape.cjs.map +1 -1
- package/dist/charts/components/LegacyDonut/ActiveShape.d.ts +6 -3
- package/dist/charts/components/LegacyDonut/ActiveShape.js +7 -5
- package/dist/charts/components/LegacyDonut/ActiveShape.js.map +1 -1
- package/dist/charts/components/LegacyDonut/CenteredLabel.cjs +1 -1
- package/dist/charts/components/LegacyDonut/CenteredLabel.cjs.map +1 -1
- package/dist/charts/components/LegacyDonut/CenteredLabel.js +1 -1
- package/dist/charts/components/LegacyDonut/CenteredLabel.js.map +1 -1
- package/dist/charts/components/LegacyDonut/LegacyDonutChart.cjs +119 -103
- package/dist/charts/components/LegacyDonut/LegacyDonutChart.cjs.map +1 -1
- package/dist/charts/components/LegacyDonut/LegacyDonutChart.d.ts +13 -2
- package/dist/charts/components/LegacyDonut/LegacyDonutChart.js +119 -103
- package/dist/charts/components/LegacyDonut/LegacyDonutChart.js.map +1 -1
- package/dist/charts/components/LegacyDonut/Legend.cjs +1 -1
- package/dist/charts/components/LegacyDonut/Legend.cjs.map +1 -1
- package/dist/charts/components/LegacyDonut/Legend.js +1 -1
- package/dist/charts/components/LegacyDonut/Legend.js.map +1 -1
- package/dist/charts/components/Legend.cjs +1 -1
- package/dist/charts/components/Legend.cjs.map +1 -1
- package/dist/charts/components/Legend.js +1 -1
- package/dist/charts/components/Legend.js.map +1 -1
- package/dist/charts/components/Line/LineChart.cjs.map +1 -1
- package/dist/charts/components/Line/LineChart.d.ts +3 -2
- package/dist/charts/components/Line/LineChart.js.map +1 -1
- package/dist/charts/components/Pie/PieChart.cjs +4 -4
- package/dist/charts/components/Pie/PieChart.cjs.map +1 -1
- package/dist/charts/components/Pie/PieChart.js +4 -4
- package/dist/charts/components/Pie/PieChart.js.map +1 -1
- package/dist/charts/components/Pie/util.cjs.map +1 -1
- package/dist/charts/components/Pie/util.d.ts +2 -1
- package/dist/charts/components/Pie/util.js.map +1 -1
- package/dist/charts/components/Tooltip.cjs.map +1 -1
- package/dist/charts/components/Tooltip.d.ts +2 -3
- package/dist/charts/components/Tooltip.js.map +1 -1
- package/dist/charts/components/types.d.ts +9 -5
- package/dist/charts/components/useChartData.cjs +5 -3
- package/dist/charts/components/useChartData.cjs.map +1 -1
- package/dist/charts/components/useChartData.d.ts +6 -2
- package/dist/charts/components/useChartData.js +5 -3
- package/dist/charts/components/useChartData.js.map +1 -1
- package/dist/charts/utils/color.cjs +6 -10
- package/dist/charts/utils/color.cjs.map +1 -1
- package/dist/charts/utils/color.js +6 -10
- package/dist/charts/utils/color.js.map +1 -1
- package/dist/charts/utils/common.cjs +10 -10
- package/dist/charts/utils/common.cjs.map +1 -1
- package/dist/charts/utils/common.d.ts +5 -6
- package/dist/charts/utils/common.js +10 -10
- package/dist/charts/utils/common.js.map +1 -1
- package/dist/components/AlertDialog/Context.cjs.map +1 -1
- package/dist/components/AlertDialog/Context.d.ts +1 -1
- package/dist/components/AlertDialog/Context.js.map +1 -1
- package/dist/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/Combobox/Combobox.cjs.map +1 -1
- package/dist/components/Combobox/Combobox.js.map +1 -1
- package/dist/components/Combobox/useCombobox.cjs +2 -4
- package/dist/components/Combobox/useCombobox.cjs.map +1 -1
- package/dist/components/Combobox/useCombobox.d.ts +1 -1
- package/dist/components/Combobox/useCombobox.js +2 -4
- package/dist/components/Combobox/useCombobox.js.map +1 -1
- package/dist/components/Datepicker/useDatepicker.cjs.map +1 -1
- package/dist/components/Datepicker/useDatepicker.js.map +1 -1
- package/dist/components/Dialog/Context.cjs.map +1 -1
- package/dist/components/Dialog/Context.d.ts +1 -1
- package/dist/components/Dialog/Context.js.map +1 -1
- package/dist/components/Dialog/components/Content.cjs.map +1 -1
- package/dist/components/Dialog/components/Content.js.map +1 -1
- package/dist/components/Drawer/components/Content.cjs +1 -1
- package/dist/components/Drawer/components/Content.cjs.map +1 -1
- package/dist/components/Drawer/components/Content.js +1 -1
- package/dist/components/Drawer/components/Content.js.map +1 -1
- package/dist/components/Drawer/useDrawerStack.cjs.map +1 -1
- package/dist/components/Drawer/useDrawerStack.js.map +1 -1
- package/dist/components/Hanger/Hanger.cjs.map +1 -1
- package/dist/components/Hanger/Hanger.js.map +1 -1
- package/dist/components/Header/Header.cjs +1 -1
- package/dist/components/Header/Header.cjs.map +1 -1
- package/dist/components/Header/Header.js +1 -1
- package/dist/components/Header/Header.js.map +1 -1
- package/dist/components/Header/components/PrimaryNavigation.cjs.map +1 -1
- package/dist/components/Header/components/PrimaryNavigation.js.map +1 -1
- package/dist/components/Icon/Icon.cjs.map +1 -1
- package/dist/components/Icon/Icon.js.map +1 -1
- package/dist/components/Layout/components/Sidebar.cjs +2 -1
- package/dist/components/Layout/components/Sidebar.cjs.map +1 -1
- package/dist/components/Layout/components/Sidebar.js +2 -1
- package/dist/components/Layout/components/Sidebar.js.map +1 -1
- package/dist/components/LegacyComponents/IconButton/IconButton.cjs.map +1 -1
- package/dist/components/LegacyComponents/IconButton/IconButton.js.map +1 -1
- package/dist/components/List/components/Toggle.cjs +0 -2
- package/dist/components/List/components/Toggle.cjs.map +1 -1
- package/dist/components/List/components/Toggle.js +0 -2
- package/dist/components/List/components/Toggle.js.map +1 -1
- package/dist/components/Listbox/Listbox.cjs +2 -5
- package/dist/components/Listbox/Listbox.cjs.map +1 -1
- package/dist/components/Listbox/Listbox.js +2 -5
- package/dist/components/Listbox/Listbox.js.map +1 -1
- package/dist/components/Listbox/useListbox.cjs +1 -1
- package/dist/components/Listbox/useListbox.cjs.map +1 -1
- package/dist/components/Listbox/useListbox.js +1 -1
- package/dist/components/Listbox/useListbox.js.map +1 -1
- package/dist/components/Listbox/useMultiListbox.cjs +1 -1
- package/dist/components/Listbox/useMultiListbox.cjs.map +1 -1
- package/dist/components/Listbox/useMultiListbox.js +1 -1
- package/dist/components/Listbox/useMultiListbox.js.map +1 -1
- package/dist/components/Listbox/util.cjs.map +1 -1
- package/dist/components/Listbox/util.js.map +1 -1
- package/dist/components/Menu/components/Content.cjs.map +1 -1
- package/dist/components/Menu/components/Content.js.map +1 -1
- package/dist/components/Menu/components/Item.cjs.map +1 -1
- package/dist/components/Menu/components/Item.d.ts +2 -2
- package/dist/components/Menu/components/Item.js.map +1 -1
- package/dist/components/Menu/components/Trigger.cjs +1 -5
- package/dist/components/Menu/components/Trigger.cjs.map +1 -1
- package/dist/components/Menu/components/Trigger.js +1 -5
- package/dist/components/Menu/components/Trigger.js.map +1 -1
- package/dist/components/Pagination/usePaginationShortcuts.cjs +0 -1
- package/dist/components/Pagination/usePaginationShortcuts.cjs.map +1 -1
- package/dist/components/Pagination/usePaginationShortcuts.js +0 -1
- package/dist/components/Pagination/usePaginationShortcuts.js.map +1 -1
- package/dist/components/Provider/Provider.cjs.map +1 -1
- package/dist/components/Provider/Provider.d.ts +1 -1
- package/dist/components/Provider/Provider.js.map +1 -1
- package/dist/components/SearchInput/SearchInput.cjs +0 -1
- package/dist/components/SearchInput/SearchInput.cjs.map +1 -1
- package/dist/components/SearchInput/SearchInput.js +0 -1
- package/dist/components/SearchInput/SearchInput.js.map +1 -1
- package/dist/components/SearchInput2/SearchInput2.cjs +0 -1
- package/dist/components/SearchInput2/SearchInput2.cjs.map +1 -1
- package/dist/components/SearchInput2/SearchInput2.js +0 -1
- package/dist/components/SearchInput2/SearchInput2.js.map +1 -1
- package/dist/components/Select2/Select2.cjs +6 -7
- package/dist/components/Select2/Select2.cjs.map +1 -1
- package/dist/components/Select2/Select2.js +6 -7
- package/dist/components/Select2/Select2.js.map +1 -1
- package/dist/components/Select2/components/Search.cjs +0 -1
- package/dist/components/Select2/components/Search.cjs.map +1 -1
- package/dist/components/Select2/components/Search.js +0 -1
- package/dist/components/Select2/components/Search.js.map +1 -1
- package/dist/components/Select2/components/Trigger.cjs +1 -1
- package/dist/components/Select2/components/Trigger.cjs.map +1 -1
- package/dist/components/Select2/components/Trigger.js +1 -1
- package/dist/components/Select2/components/Trigger.js.map +1 -1
- package/dist/components/Table3/components/Columns/Cell/EditingControlCell.cjs +1 -1
- package/dist/components/Table3/components/Columns/Cell/EditingControlCell.cjs.map +1 -1
- package/dist/components/Table3/components/Columns/Cell/EditingControlCell.js +1 -1
- package/dist/components/Table3/components/Columns/Cell/EditingControlCell.js.map +1 -1
- package/dist/components/Table3/components/Columns/Cell/util.cjs.map +1 -1
- package/dist/components/Table3/components/Columns/Cell/util.js.map +1 -1
- package/dist/components/Table3/components/Editing/Alert.cjs +4 -4
- package/dist/components/Table3/components/Editing/Alert.cjs.map +1 -1
- package/dist/components/Table3/components/Editing/Alert.js +4 -4
- package/dist/components/Table3/components/Editing/Alert.js.map +1 -1
- package/dist/components/Table3/features/useEditingState.cjs +1 -1
- package/dist/components/Table3/features/useEditingState.cjs.map +1 -1
- package/dist/components/Table3/features/useEditingState.js +1 -1
- package/dist/components/Table3/features/useEditingState.js.map +1 -1
- package/dist/components/Table3/types.d.ts +2 -2
- package/dist/components/Table3/useTable3.cjs +8 -6
- package/dist/components/Table3/useTable3.cjs.map +1 -1
- package/dist/components/Table3/useTable3.js +8 -6
- package/dist/components/Table3/useTable3.js.map +1 -1
- package/dist/components/Table3/util/editing.cjs +1 -1
- package/dist/components/Table3/util/editing.cjs.map +1 -1
- package/dist/components/Table3/util/editing.d.ts +1 -1
- package/dist/components/Table3/util/editing.js +1 -1
- package/dist/components/Table3/util/editing.js.map +1 -1
- package/dist/hooks/useBoundaryOverflowDetection.cjs.map +1 -1
- package/dist/hooks/useBoundaryOverflowDetection.d.ts +1 -1
- package/dist/hooks/useBoundaryOverflowDetection.js.map +1 -1
- package/dist/hooks/useBoundingClientRectListener.cjs.map +1 -1
- package/dist/hooks/useBoundingClientRectListener.d.ts +1 -1
- package/dist/hooks/useBoundingClientRectListener.js.map +1 -1
- package/dist/hooks/useControlled.cjs +6 -10
- package/dist/hooks/useControlled.cjs.map +1 -1
- package/dist/hooks/useControlled.js +6 -10
- package/dist/hooks/useControlled.js.map +1 -1
- package/dist/hooks/useIsFormControl.cjs.map +1 -1
- package/dist/hooks/useIsFormControl.d.ts +1 -1
- package/dist/hooks/useIsFormControl.js.map +1 -1
- package/dist/hooks/useMergedRef.cjs.map +1 -1
- package/dist/hooks/useMergedRef.js.map +1 -1
- package/dist/hooks/usePrevious.cjs.map +1 -1
- package/dist/hooks/usePrevious.js.map +1 -1
- package/dist/primitives/Button.cjs.map +1 -1
- package/dist/primitives/Button.js.map +1 -1
- package/dist/primitives/Collection/components/Root.cjs +9 -16
- package/dist/primitives/Collection/components/Root.cjs.map +1 -1
- package/dist/primitives/Collection/components/Root.js +9 -16
- package/dist/primitives/Collection/components/Root.js.map +1 -1
- package/dist/primitives/Listbox2/components/Context.cjs.map +1 -1
- package/dist/primitives/Listbox2/components/Context.d.ts +1 -0
- package/dist/primitives/Listbox2/components/Context.js.map +1 -1
- package/dist/primitives/Listbox2/components/Option.cjs +8 -2
- package/dist/primitives/Listbox2/components/Option.cjs.map +1 -1
- package/dist/primitives/Listbox2/components/Option.js +8 -2
- package/dist/primitives/Listbox2/components/Option.js.map +1 -1
- package/dist/primitives/Listbox2/components/Root.cjs +3 -2
- package/dist/primitives/Listbox2/components/Root.cjs.map +1 -1
- package/dist/primitives/Listbox2/components/Root.js +3 -2
- package/dist/primitives/Listbox2/components/Root.js.map +1 -1
- package/dist/primitives/Sortable/components/Item.cjs +2 -4
- package/dist/primitives/Sortable/components/Item.cjs.map +1 -1
- package/dist/primitives/Sortable/components/Item.js +2 -4
- package/dist/primitives/Sortable/components/Item.js.map +1 -1
- package/dist/primitives/Table/Core/components/Body/Body.cjs +4 -4
- package/dist/primitives/Table/Core/components/Body/Body.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Body/Body.js +4 -4
- package/dist/primitives/Table/Core/components/Body/Body.js.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/DisplayCell.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/DisplayCell.js.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/BuiltIns/GroupedCell.js.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/util.cjs +22 -16
- package/dist/primitives/Table/Core/components/Columns/Cell/util.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Columns/Cell/util.js +22 -16
- package/dist/primitives/Table/Core/components/Columns/Cell/util.js.map +1 -1
- package/dist/primitives/Table/Core/components/Footer/Summary.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Footer/Summary.js.map +1 -1
- package/dist/primitives/Table/Core/components/Header/util.cjs +4 -3
- package/dist/primitives/Table/Core/components/Header/util.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Header/util.js +4 -3
- package/dist/primitives/Table/Core/components/Header/util.js.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.cjs +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.js +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/Filters.js.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.cjs +4 -2
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.js +4 -2
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/ManageFiltersPopover.js.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/components/Filter.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Filters/components/Filter.js.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.cjs +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.cjs.map +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.js +1 -1
- package/dist/primitives/Table/Core/components/Toolbar/components/Print/Print.js.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRef.cjs +7 -0
- package/dist/primitives/Table/Core/features/useTableRef.cjs.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRef.js +7 -0
- package/dist/primitives/Table/Core/features/useTableRef.js.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.cjs +2 -2
- package/dist/primitives/Table/Core/features/useTableRenderer.cjs.map +1 -1
- package/dist/primitives/Table/Core/features/useTableRenderer.js +2 -2
- package/dist/primitives/Table/Core/features/useTableRenderer.js.map +1 -1
- package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.cjs +2 -2
- package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.cjs.map +1 -1
- package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.js +2 -2
- package/dist/primitives/Table/Core/features/useTableStyleColumnFreezing.js.map +1 -1
- package/dist/primitives/Table/Core/features/useTableStyleGrid.cjs.map +1 -1
- package/dist/primitives/Table/Core/features/useTableStyleGrid.js.map +1 -1
- package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.cjs +2 -4
- package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.cjs.map +1 -1
- package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.d.ts +2 -2
- package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.js +2 -4
- package/dist/primitives/Table/Core/listeners/useTableRowActiveListener.js.map +1 -1
- package/dist/primitives/Table/types.cjs.map +1 -1
- package/dist/primitives/Table/types.d.ts +6 -0
- package/dist/primitives/Table/types.js.map +1 -1
- package/dist/primitives/Table/useTableDataLoader2.cjs +36 -3
- package/dist/primitives/Table/useTableDataLoader2.cjs.map +1 -1
- package/dist/primitives/Table/useTableDataLoader2.d.ts +2 -1
- package/dist/primitives/Table/useTableDataLoader2.js +36 -3
- package/dist/primitives/Table/useTableDataLoader2.js.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActive.cjs +0 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActive.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActive.d.ts +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActive.js +0 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowActive.js.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowClick.cjs +0 -2
- package/dist/primitives/Table/useTableManager/features/useTableRowClick.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowClick.js +0 -2
- package/dist/primitives/Table/useTableManager/features/useTableRowClick.js.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowSelection.cjs +0 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowSelection.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowSelection.js +0 -1
- package/dist/primitives/Table/useTableManager/features/useTableRowSelection.js.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableServerLoading.cjs +10 -1
- package/dist/primitives/Table/useTableManager/features/useTableServerLoading.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/features/useTableServerLoading.d.ts +3 -2
- package/dist/primitives/Table/useTableManager/features/useTableServerLoading.js +10 -1
- package/dist/primitives/Table/useTableManager/features/useTableServerLoading.js.map +1 -1
- package/dist/primitives/Table/useTableManager/useTableManager.cjs +1 -5
- package/dist/primitives/Table/useTableManager/useTableManager.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/useTableManager.js +1 -5
- package/dist/primitives/Table/useTableManager/useTableManager.js.map +1 -1
- package/dist/primitives/Table/useTableManager/util/dataTypes.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/util/dataTypes.d.ts +3 -3
- package/dist/primitives/Table/useTableManager/util/dataTypes.js.map +1 -1
- package/dist/primitives/Table/useTableManager/util/filtering.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/util/filtering.js.map +1 -1
- package/dist/primitives/Table/useTableManager/util/search.cjs +1 -1
- package/dist/primitives/Table/useTableManager/util/search.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/util/search.js +1 -1
- package/dist/primitives/Table/useTableManager/util/search.js.map +1 -1
- package/dist/primitives/Table/useTableManager/util/setup.cjs +3 -3
- package/dist/primitives/Table/useTableManager/util/setup.cjs.map +1 -1
- package/dist/primitives/Table/useTableManager/util/setup.js +3 -3
- package/dist/primitives/Table/useTableManager/util/setup.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/dataTypes.cjs +4 -4
- package/dist/utils/dataTypes.cjs.map +1 -1
- package/dist/utils/dataTypes.d.ts +1 -1
- package/dist/utils/dataTypes.js +4 -4
- package/dist/utils/dataTypes.js.map +1 -1
- package/dist/utils/date.cjs +14 -16
- package/dist/utils/date.cjs.map +1 -1
- package/dist/utils/date.js +14 -16
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/debounce.cjs.map +1 -1
- package/dist/utils/debounce.d.ts +1 -1
- package/dist/utils/debounce.js.map +1 -1
- package/dist/utils/device.cjs +1 -1
- package/dist/utils/device.cjs.map +1 -1
- package/dist/utils/device.js +1 -1
- package/dist/utils/device.js.map +1 -1
- package/dist/utils/dom.cjs +1 -1
- package/dist/utils/dom.cjs.map +1 -1
- package/dist/utils/dom.d.ts +2 -2
- package/dist/utils/dom.js +1 -1
- package/dist/utils/dom.js.map +1 -1
- package/dist/utils/hooks/useDraggable.cjs.map +1 -1
- package/dist/utils/hooks/useDraggable.d.ts +9 -1
- package/dist/utils/hooks/useDraggable.js.map +1 -1
- package/dist/utils/hooks/useListKeyboardNavigation.cjs +1 -1
- package/dist/utils/hooks/useListKeyboardNavigation.cjs.map +1 -1
- package/dist/utils/hooks/useListKeyboardNavigation.js +1 -1
- package/dist/utils/hooks/useListKeyboardNavigation.js.map +1 -1
- package/dist/utils/hooks/useListScrollTo.cjs.map +1 -1
- package/dist/utils/hooks/useListScrollTo.d.ts +4 -1
- package/dist/utils/hooks/useListScrollTo.js.map +1 -1
- package/dist/utils/hooks/useOnClickOutside.cjs.map +1 -1
- package/dist/utils/hooks/useOnClickOutside.d.ts +1 -1
- package/dist/utils/hooks/useOnClickOutside.js.map +1 -1
- package/dist/utils/hooks/useTruncated.cjs.map +1 -1
- package/dist/utils/hooks/useTruncated.d.ts +2 -1
- package/dist/utils/hooks/useTruncated.js.map +1 -1
- package/dist/utils/mergeRefs.cjs.map +1 -1
- package/dist/utils/mergeRefs.d.ts +1 -1
- package/dist/utils/mergeRefs.js.map +1 -1
- package/dist/utils/storyutils.d.ts +1 -3
- package/package.json +4 -5
- package/plugins/tailwindcss-group-peer.js +1 -1
- package/scripts/stylelint-plugin/radius.mjs +2 -2
|
@@ -20,20 +20,19 @@ function _interopNamespaceDefault(e) {
|
|
|
20
20
|
const React__namespace = /* @__PURE__ */ _interopNamespaceDefault(React);
|
|
21
21
|
function useControlled(props) {
|
|
22
22
|
const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);
|
|
23
|
-
const
|
|
24
|
-
const returnValue = isControlled ? props.value : uncontrolledValue;
|
|
23
|
+
const returnValue = props.value === void 0 ? uncontrolledValue : props.value;
|
|
25
24
|
const onChange = React__namespace.useCallback(
|
|
26
25
|
(nextValue) => {
|
|
27
|
-
if (
|
|
28
|
-
|
|
26
|
+
if (props.value === void 0) {
|
|
27
|
+
setUncontrolledValue(nextValue);
|
|
28
|
+
} else {
|
|
29
|
+
const newValue = typeof nextValue === "function" ? nextValue(props.value) : nextValue;
|
|
29
30
|
if (newValue !== props.value) {
|
|
30
31
|
onChangeRef.current?.(newValue);
|
|
31
32
|
}
|
|
32
|
-
} else {
|
|
33
|
-
setUncontrolledValue(nextValue);
|
|
34
33
|
}
|
|
35
34
|
},
|
|
36
|
-
[props.value, onChangeRef,
|
|
35
|
+
[props.value, onChangeRef, setUncontrolledValue]
|
|
37
36
|
);
|
|
38
37
|
return [returnValue, onChange];
|
|
39
38
|
}
|
|
@@ -52,8 +51,5 @@ function useUncontrolledState(defaultValue, onChange) {
|
|
|
52
51
|
}, [value, prevValueRef]);
|
|
53
52
|
return [value, setValue, onChangeRef];
|
|
54
53
|
}
|
|
55
|
-
function isFunction(value) {
|
|
56
|
-
return typeof value === "function";
|
|
57
|
-
}
|
|
58
54
|
exports.useControlled = useControlled;
|
|
59
55
|
//# sourceMappingURL=useControlled.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useControlled.cjs","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const
|
|
1
|
+
{"version":3,"file":"useControlled.cjs","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const returnValue = props.value === undefined ? uncontrolledValue : props.value;\n\n const onChange = React.useCallback<SetStateFn<T>>(\n nextValue => {\n if (props.value === undefined) {\n setUncontrolledValue(nextValue);\n } else {\n // TS cannot narrow SetStateAction<T> with `typeof` when `T` is unconstrained\n const newValue = typeof nextValue === 'function' ? (nextValue as (prev: T) => T)(props.value) : nextValue;\n if (newValue !== props.value) {\n onChangeRef.current?.(newValue);\n }\n }\n },\n [props.value, onChangeRef, setUncontrolledValue]\n );\n\n return [returnValue, onChange];\n}\n\ntype ChangeHandler<T> = (state: T) => void;\n\nfunction useUncontrolledState<T>(\n defaultValue: UseControlledProps<T>['defaultValue'],\n onChange: UseControlledProps<T>['onChange']\n): [value: T, setValue: React.Dispatch<React.SetStateAction<T>>, OnChangeRef: React.RefObject<ChangeHandler<T> | undefined>] {\n // with no defaultValue the initial state is genuinely undefined; asserting `T` here\n // (the same lie as React's own `useState<T>()` overload) keeps every downstream type honest\n const [value, setValue] = React.useState(defaultValue as T);\n const prevValueRef = React.useRef(value);\n\n const onChangeRef = React.useRef(onChange);\n\n React.useLayoutEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n onChangeRef.current?.(value);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef]);\n\n return [value, setValue, onChangeRef];\n}\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;AAaO,SAAS,cAA2B,OAAkD;AACzF,QAAM,CAAC,mBAAmB,sBAAsB,WAAW,IAAI,qBAAqB,MAAM,cAAc,MAAM,QAAQ;AAEtH,QAAM,cAAc,MAAM,UAAU,SAAY,oBAAoB,MAAM;AAE1E,QAAM,WAAWA,iBAAM;AAAA,IACnB,CAAA,cAAa;AACT,UAAI,MAAM,UAAU,QAAW;AAC3B,6BAAqB,SAAS;AAAA,MAClC,OAAO;AAEH,cAAM,WAAW,OAAO,cAAc,aAAc,UAA6B,MAAM,KAAK,IAAI;AAChG,YAAI,aAAa,MAAM,OAAO;AAC1B,sBAAY,UAAU,QAAQ;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,OAAO,aAAa,oBAAoB;AAAA,EAAA;AAGnD,SAAO,CAAC,aAAa,QAAQ;AACjC;AAIA,SAAS,qBACL,cACA,UACyH;AAGzH,QAAM,CAAC,OAAO,QAAQ,IAAIA,iBAAM,SAAS,YAAiB;AAC1D,QAAM,eAAeA,iBAAM,OAAO,KAAK;AAEvC,QAAM,cAAcA,iBAAM,OAAO,QAAQ;AAEzCA,mBAAM,gBAAgB,MAAM;AACxB,gBAAY,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEbA,mBAAM,UAAU,MAAM;AAClB,QAAI,aAAa,YAAY,OAAO;AAChC,kBAAY,UAAU,KAAK;AAC3B,mBAAa,UAAU;AAAA,IAC3B;AAAA,EACJ,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SAAO,CAAC,OAAO,UAAU,WAAW;AACxC;;"}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
function useControlled(props) {
|
|
3
3
|
const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);
|
|
4
|
-
const
|
|
5
|
-
const returnValue = isControlled ? props.value : uncontrolledValue;
|
|
4
|
+
const returnValue = props.value === void 0 ? uncontrolledValue : props.value;
|
|
6
5
|
const onChange = React.useCallback(
|
|
7
6
|
(nextValue) => {
|
|
8
|
-
if (
|
|
9
|
-
|
|
7
|
+
if (props.value === void 0) {
|
|
8
|
+
setUncontrolledValue(nextValue);
|
|
9
|
+
} else {
|
|
10
|
+
const newValue = typeof nextValue === "function" ? nextValue(props.value) : nextValue;
|
|
10
11
|
if (newValue !== props.value) {
|
|
11
12
|
onChangeRef.current?.(newValue);
|
|
12
13
|
}
|
|
13
|
-
} else {
|
|
14
|
-
setUncontrolledValue(nextValue);
|
|
15
14
|
}
|
|
16
15
|
},
|
|
17
|
-
[props.value, onChangeRef,
|
|
16
|
+
[props.value, onChangeRef, setUncontrolledValue]
|
|
18
17
|
);
|
|
19
18
|
return [returnValue, onChange];
|
|
20
19
|
}
|
|
@@ -33,9 +32,6 @@ function useUncontrolledState(defaultValue, onChange) {
|
|
|
33
32
|
}, [value, prevValueRef]);
|
|
34
33
|
return [value, setValue, onChangeRef];
|
|
35
34
|
}
|
|
36
|
-
function isFunction(value) {
|
|
37
|
-
return typeof value === "function";
|
|
38
|
-
}
|
|
39
35
|
export {
|
|
40
36
|
useControlled
|
|
41
37
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useControlled.js","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const
|
|
1
|
+
{"version":3,"file":"useControlled.js","sources":["../../src/hooks/useControlled.ts"],"sourcesContent":["import * as React from 'react';\n\ntype SetStateFn<T> = React.Dispatch<React.SetStateAction<T>>;\n\nexport type UseControlledProps<T> = {\n // Controlled\n value?: T | undefined;\n onChange?: (value: T) => void;\n\n // Uncontrolled value.\n defaultValue?: T | undefined;\n};\n\nexport function useControlled<T = unknown>(props: UseControlledProps<T>): [T, SetStateFn<T>] {\n const [uncontrolledValue, setUncontrolledValue, onChangeRef] = useUncontrolledState(props.defaultValue, props.onChange);\n\n const returnValue = props.value === undefined ? uncontrolledValue : props.value;\n\n const onChange = React.useCallback<SetStateFn<T>>(\n nextValue => {\n if (props.value === undefined) {\n setUncontrolledValue(nextValue);\n } else {\n // TS cannot narrow SetStateAction<T> with `typeof` when `T` is unconstrained\n const newValue = typeof nextValue === 'function' ? (nextValue as (prev: T) => T)(props.value) : nextValue;\n if (newValue !== props.value) {\n onChangeRef.current?.(newValue);\n }\n }\n },\n [props.value, onChangeRef, setUncontrolledValue]\n );\n\n return [returnValue, onChange];\n}\n\ntype ChangeHandler<T> = (state: T) => void;\n\nfunction useUncontrolledState<T>(\n defaultValue: UseControlledProps<T>['defaultValue'],\n onChange: UseControlledProps<T>['onChange']\n): [value: T, setValue: React.Dispatch<React.SetStateAction<T>>, OnChangeRef: React.RefObject<ChangeHandler<T> | undefined>] {\n // with no defaultValue the initial state is genuinely undefined; asserting `T` here\n // (the same lie as React's own `useState<T>()` overload) keeps every downstream type honest\n const [value, setValue] = React.useState(defaultValue as T);\n const prevValueRef = React.useRef(value);\n\n const onChangeRef = React.useRef(onChange);\n\n React.useLayoutEffect(() => {\n onChangeRef.current = onChange;\n }, [onChange]);\n\n React.useEffect(() => {\n if (prevValueRef.current !== value) {\n onChangeRef.current?.(value);\n prevValueRef.current = value;\n }\n }, [value, prevValueRef]);\n\n return [value, setValue, onChangeRef];\n}\n"],"names":[],"mappings":";AAaO,SAAS,cAA2B,OAAkD;AACzF,QAAM,CAAC,mBAAmB,sBAAsB,WAAW,IAAI,qBAAqB,MAAM,cAAc,MAAM,QAAQ;AAEtH,QAAM,cAAc,MAAM,UAAU,SAAY,oBAAoB,MAAM;AAE1E,QAAM,WAAW,MAAM;AAAA,IACnB,CAAA,cAAa;AACT,UAAI,MAAM,UAAU,QAAW;AAC3B,6BAAqB,SAAS;AAAA,MAClC,OAAO;AAEH,cAAM,WAAW,OAAO,cAAc,aAAc,UAA6B,MAAM,KAAK,IAAI;AAChG,YAAI,aAAa,MAAM,OAAO;AAC1B,sBAAY,UAAU,QAAQ;AAAA,QAClC;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,MAAM,OAAO,aAAa,oBAAoB;AAAA,EAAA;AAGnD,SAAO,CAAC,aAAa,QAAQ;AACjC;AAIA,SAAS,qBACL,cACA,UACyH;AAGzH,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,YAAiB;AAC1D,QAAM,eAAe,MAAM,OAAO,KAAK;AAEvC,QAAM,cAAc,MAAM,OAAO,QAAQ;AAEzC,QAAM,gBAAgB,MAAM;AACxB,gBAAY,UAAU;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,UAAU,MAAM;AAClB,QAAI,aAAa,YAAY,OAAO;AAChC,kBAAY,UAAU,KAAK;AAC3B,mBAAa,UAAU;AAAA,IAC3B;AAAA,EACJ,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SAAO,CAAC,OAAO,UAAU,WAAW;AACxC;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsFormControl.cjs","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;AAIO,MAAM,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"useIsFormControl.cjs","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement | null>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":["React"],"mappings":";;;;;;;;;;;;;;;;;;;;AAIO,MAAM,mBAAmB,CAAC,KAA0C,UAAsB;AAC7F,QAAM,CAAC,eAAe,gBAAgB,IAAIA,iBAAM,SAAS,KAAK;AAE9DA,mBAAM,UAAU,MAAM;AAClB,QAAI;AAEJ,QAAI,IAAI,SAAS;AACb,oBAAc,IAAI,QAAQ,QAAQ,MAAM;AACxC,uBAAiB,CAAC,CAAC,WAAW;AAE9B,UAAI,SAAS,aAAa;AACtB,oBAAY,iBAAiB,SAAS,KAAK;AAAA,MAC/C;AAEA,UAAI,QAAQ,QAAQ,MAAM,GAAG,iBAAiB,SAAS,KAAK;AAAA,IAChE;AAEA,WAAO,MAAM;AACT,UAAI,aAAa;AACb,oBAAY,oBAAoB,SAAS,KAAK;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,IAAI,OAAO,CAAC;AAEhB,SAAO;AACX;;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
export declare const useIsFormControl: (ref: React.RefObject<HTMLElement>, reset: () => void) => boolean;
|
|
2
|
+
export declare const useIsFormControl: (ref: React.RefObject<HTMLElement | null>, reset: () => void) => boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useIsFormControl.js","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":[],"mappings":";AAIO,MAAM,mBAAmB,CAAC,
|
|
1
|
+
{"version":3,"file":"useIsFormControl.js","sources":["../../src/hooks/useIsFormControl.ts"],"sourcesContent":["import * as React from 'react';\n\n// taken from radix\n// determines whether a given ref is a descendant of a form element\nexport const useIsFormControl = (ref: React.RefObject<HTMLElement | null>, reset: () => void) => {\n const [isFormControl, setIsFormControl] = React.useState(false);\n\n React.useEffect(() => {\n let formElement: HTMLFormElement | null;\n\n if (ref.current) {\n formElement = ref.current.closest('form');\n setIsFormControl(!!formElement);\n\n if (reset && formElement) {\n formElement.addEventListener('reset', reset);\n }\n\n ref.current.closest('form')?.addEventListener('reset', reset);\n }\n\n return () => {\n if (formElement) {\n formElement.removeEventListener('reset', reset);\n }\n };\n }, [ref.current]);\n\n return isFormControl;\n};\n"],"names":[],"mappings":";AAIO,MAAM,mBAAmB,CAAC,KAA0C,UAAsB;AAC7F,QAAM,CAAC,eAAe,gBAAgB,IAAI,MAAM,SAAS,KAAK;AAE9D,QAAM,UAAU,MAAM;AAClB,QAAI;AAEJ,QAAI,IAAI,SAAS;AACb,oBAAc,IAAI,QAAQ,QAAQ,MAAM;AACxC,uBAAiB,CAAC,CAAC,WAAW;AAE9B,UAAI,SAAS,aAAa;AACtB,oBAAY,iBAAiB,SAAS,KAAK;AAAA,MAC/C;AAEA,UAAI,QAAQ,QAAQ,MAAM,GAAG,iBAAiB,SAAS,KAAK;AAAA,IAChE;AAEA,WAAO,MAAM;AACT,UAAI,aAAa;AACb,oBAAY,oBAAoB,SAAS,KAAK;AAAA,MAClD;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,IAAI,OAAO,CAAC;AAEhB,SAAO;AACX;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMergedRef.cjs","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.
|
|
1
|
+
{"version":3,"file":"useMergedRef.cjs","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.RefObject<HTMLElement | null>).current = internalRef.current;\n }\n }\n }, [ref]);\n\n // React 19 types useRef<T>(null) as RefObject<T | null>, but this hook hands back a ref that is\n // always attached to an element, so keep the narrower contract rather than leak null to callers.\n return internalRef as React.RefObject<T>;\n};\n"],"names":[],"mappings":";;;AAGO,MAAM,eAAe,CAAwB,QAAoD;AACpG,QAAM,cAAc,MAAM,OAAU,IAAI;AAExC,QAAM,UAAU,MAAM;AAClB,QAAI,KAAK;AACL,UAAI,OAAO,QAAQ,YAAY;AAC3B,YAAI,YAAY,OAAO;AAAA,MAC3B,OAAO;AACF,YAA4C,UAAU,YAAY;AAAA,MACvE;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,GAAG,CAAC;AAIR,SAAO;AACX;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMergedRef.js","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.
|
|
1
|
+
{"version":3,"file":"useMergedRef.js","sources":["../../src/hooks/useMergedRef.ts"],"sourcesContent":["import React from 'react';\n\n// merges an external ref (optional) with an internal ref (required)\nexport const useMergedRef = <T extends HTMLElement>(ref: React.Ref<HTMLElement>): React.RefObject<T> => {\n const internalRef = React.useRef<T>(null);\n\n React.useEffect(() => {\n if (ref) {\n if (typeof ref === 'function') {\n ref(internalRef.current);\n } else {\n (ref as React.RefObject<HTMLElement | null>).current = internalRef.current;\n }\n }\n }, [ref]);\n\n // React 19 types useRef<T>(null) as RefObject<T | null>, but this hook hands back a ref that is\n // always attached to an element, so keep the narrower contract rather than leak null to callers.\n return internalRef as React.RefObject<T>;\n};\n"],"names":["React"],"mappings":";AAGO,MAAM,eAAe,CAAwB,QAAoD;AACpG,QAAM,cAAcA,eAAM,OAAU,IAAI;AAExCA,iBAAM,UAAU,MAAM;AAClB,QAAI,KAAK;AACL,UAAI,OAAO,QAAQ,YAAY;AAC3B,YAAI,YAAY,OAAO;AAAA,MAC3B,OAAO;AACF,YAA4C,UAAU,YAAY;AAAA,MACvE;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,GAAG,CAAC;AAIR,SAAO;AACX;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePrevious.cjs","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n
|
|
1
|
+
{"version":3,"file":"usePrevious.cjs","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n // Only re-run if value changes\n }, [value]);\n\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n\nexport { usePreviousValue };\n"],"names":[],"mappings":";;;AAGA,SAAS,iBAAoB,OAAU;AAGnC,QAAM,MAAM,MAAM,OAAU,KAAK;AAGjC,QAAM,UAAU,MAAM;AAClB,QAAI,UAAU;AAAA,EAElB,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,IAAI;AACf;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePrevious.js","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n
|
|
1
|
+
{"version":3,"file":"usePrevious.js","sources":["../../src/hooks/usePrevious.ts"],"sourcesContent":["import React from 'react';\n\n// taken from radix\nfunction usePreviousValue<T>(value: T) {\n // The ref object is a generic container whose current property is mutable ...\n // ... and can hold any value, similar to an instance property on a class\n const ref = React.useRef<T>(value);\n\n // Store current value in ref\n React.useEffect(() => {\n ref.current = value;\n // Only re-run if value changes\n }, [value]);\n\n // Return previous value (happens before update in useEffect above)\n return ref.current;\n}\n\nexport { usePreviousValue };\n"],"names":["React"],"mappings":";AAGA,SAAS,iBAAoB,OAAU;AAGnC,QAAM,MAAMA,eAAM,OAAU,KAAK;AAGjCA,iBAAM,UAAU,MAAM;AAClB,QAAI,UAAU;AAAA,EAElB,GAAG,CAAC,KAAK,CAAC;AAGV,SAAO,IAAI;AACf;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.cjs","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as
|
|
1
|
+
{"version":3,"file":"Button.cjs","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as React.RefObject<HTMLButtonElement & HTMLAnchorElement>}>\n {React.Children.count(props.children) > 1\n ? React.Children.map(props.children, child => (typeof child === 'string' ? <span>{child}</span> : child))\n : props.children}\n </Tag>\n );\n});\n\nexport { Button };\nexport type { ButtonProps };\n"],"names":["React","Button","useMergedRef","useGlobalKeyDown"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAM,SAASA,iBAAM,WAAW,SAASC,QAAO,OAAoB,KAAuD;AACvH,QAAM,EAAE,UAAU,UAAU,QAAQ,OAAO,UAAU,GAAG,eAAe;AACvE,QAAM,cAAcC,aAAAA,aAAoD,GAAG;AAE3EC,oCAAiB,UAAU,CAAA,UAAS;AAChC,WAAO,eAAA;AACP,UAAM,SAAS,SAAS,cAAc,iBAAiB;AAGvD,QAAI,UAAU,CAAC,QAAQ,SAAS,YAAY,OAAO,GAAG;AAClD;AAAA,IACJ;AAEA,gBAAY,SAAS,MAAA;AAAA,EACzB,CAAC;AAED,QAAM,MAAM,MAAM,OAAO,MAAM;AAE/B,SACIH,iCAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAM,WAAW,SAAY,MAAM;AAAA,MACnC,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,QAAQ,QAAQ,MAAM,SAAS;AAAA,MAC/B,MAAM,QAAQ,MAAM,SAAY;AAAA,MAChC,KAAK;AAAA,IAAA;AAAA,IACJA,iBAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,IAClCA,iBAAM,SAAS,IAAI,MAAM,UAAU,CAAA,UAAU,OAAO,UAAU,WAAWA,iCAAA,cAAC,cAAM,KAAM,IAAU,KAAM,IACtG,MAAM;AAAA,EAAA;AAGxB,CAAC;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.js","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as
|
|
1
|
+
{"version":3,"file":"Button.js","sources":["../../src/primitives/Button.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useGlobalKeyDown } from '@/hooks/useGlobalKeyDown';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport type { KeyDownHandlerOptions } from '@/utils/keyboard';\n\n// React 19 added the native `popover` attribute to HTML props. Consumers of this primitive use\n// `popover` as a render prop for an associated Popover, so the native one is dropped to keep that.\ntype ButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement | HTMLAnchorElement>, 'popover'> & {\n /** Content should be a text */\n children: React.ReactNode;\n /** Provides url for buttons being used as a link */\n href?: string;\n shortcut?: string | KeyDownHandlerOptions;\n /** Provides target for buttons being used as a link */\n target?: '_self' | '_blank' | '_parent' | '_top';\n};\n\nconst Button = React.forwardRef(function Button(props: ButtonProps, ref: React.Ref<HTMLButtonElement | HTMLAnchorElement>) {\n const { disabled, shortcut, target, type = 'button', ...otherProps } = props;\n const internalRef = useMergedRef<HTMLButtonElement | HTMLAnchorElement>(ref);\n\n useGlobalKeyDown(shortcut, event => {\n event?.preventDefault();\n const dialog = document.querySelector('[role=\"dialog\"]');\n\n // Don't trigger the click on the button if it is outside of the dialog\n if (dialog && !dialog?.contains(internalRef.current)) {\n return;\n }\n\n internalRef.current?.click();\n });\n\n const Tag = props.href ? 'a' : 'button';\n\n return (\n <Tag\n {...otherProps}\n href={disabled ? undefined : props.href}\n aria-disabled={disabled ? 'true' : undefined}\n disabled={disabled}\n target={Tag === 'a' ? target : undefined}\n type={Tag === 'a' ? undefined : type}\n ref={internalRef as React.RefObject<HTMLButtonElement & HTMLAnchorElement>}>\n {React.Children.count(props.children) > 1\n ? React.Children.map(props.children, child => (typeof child === 'string' ? <span>{child}</span> : child))\n : props.children}\n </Tag>\n );\n});\n\nexport { Button };\nexport type { ButtonProps };\n"],"names":["Button"],"mappings":";;;AAkBA,MAAM,SAAS,MAAM,WAAW,SAASA,QAAO,OAAoB,KAAuD;AACvH,QAAM,EAAE,UAAU,UAAU,QAAQ,OAAO,UAAU,GAAG,eAAe;AACvE,QAAM,cAAc,aAAoD,GAAG;AAE3E,mBAAiB,UAAU,CAAA,UAAS;AAChC,WAAO,eAAA;AACP,UAAM,SAAS,SAAS,cAAc,iBAAiB;AAGvD,QAAI,UAAU,CAAC,QAAQ,SAAS,YAAY,OAAO,GAAG;AAClD;AAAA,IACJ;AAEA,gBAAY,SAAS,MAAA;AAAA,EACzB,CAAC;AAED,QAAM,MAAM,MAAM,OAAO,MAAM;AAE/B,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,MAAM,WAAW,SAAY,MAAM;AAAA,MACnC,iBAAe,WAAW,SAAS;AAAA,MACnC;AAAA,MACA,QAAQ,QAAQ,MAAM,SAAS;AAAA,MAC/B,MAAM,QAAQ,MAAM,SAAY;AAAA,MAChC,KAAK;AAAA,IAAA;AAAA,IACJ,MAAM,SAAS,MAAM,MAAM,QAAQ,IAAI,IAClC,MAAM,SAAS,IAAI,MAAM,UAAU,CAAA,UAAU,OAAO,UAAU,WAAW,sBAAA,cAAC,cAAM,KAAM,IAAU,KAAM,IACtG,MAAM;AAAA,EAAA;AAGxB,CAAC;"}
|
|
@@ -37,7 +37,7 @@ const Root = React.forwardRef(function CollectionRoot(props, ref) {
|
|
|
37
37
|
if (internalRef.current) {
|
|
38
38
|
const options = getOptionsFromCollection(internalRef.current, querySelector);
|
|
39
39
|
if (options.length && !isMultiselectable) {
|
|
40
|
-
const firstSelected = internalRef.current.querySelector(
|
|
40
|
+
const firstSelected = internalRef.current.querySelector('[aria-selected="true"]');
|
|
41
41
|
if (firstSelected) {
|
|
42
42
|
const selectedIndex = Array.from(options).indexOf(firstSelected);
|
|
43
43
|
if (selectedIndex > -1 && selectedIndex !== activeIndex) {
|
|
@@ -53,7 +53,7 @@ const Root = React.forwardRef(function CollectionRoot(props, ref) {
|
|
|
53
53
|
if (options.length) {
|
|
54
54
|
let selected = internalRef.current.querySelectorAll('[aria-current="true"]');
|
|
55
55
|
if (selected.length === 0) {
|
|
56
|
-
selected = internalRef.current.querySelectorAll(
|
|
56
|
+
selected = internalRef.current.querySelectorAll('[aria-selected="true"]');
|
|
57
57
|
}
|
|
58
58
|
if (selected.length === 1) {
|
|
59
59
|
if (options) {
|
|
@@ -71,6 +71,9 @@ const Root = React.forwardRef(function CollectionRoot(props, ref) {
|
|
|
71
71
|
}, [props.children]);
|
|
72
72
|
const handleClick = (event) => {
|
|
73
73
|
const target = event.target;
|
|
74
|
+
if (!(target instanceof Element)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
74
77
|
const option = target.matches(querySelector) ? target : target.closest(querySelector);
|
|
75
78
|
if (option) {
|
|
76
79
|
const options = getOptionsFromCollection(event.currentTarget, querySelector);
|
|
@@ -117,7 +120,7 @@ const getNextIndexFromKeycode = (event, length, activeIndex) => {
|
|
|
117
120
|
case "End":
|
|
118
121
|
return length - 1;
|
|
119
122
|
default:
|
|
120
|
-
return;
|
|
123
|
+
return void 0;
|
|
121
124
|
}
|
|
122
125
|
};
|
|
123
126
|
const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
|
|
@@ -128,20 +131,10 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
|
|
|
128
131
|
}
|
|
129
132
|
if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {
|
|
130
133
|
if (recurse && nextIndex === 0) {
|
|
131
|
-
return getNextEnabledItem(
|
|
132
|
-
new KeyboardEvent(event.type, { ...event, key: "ArrowDown" }),
|
|
133
|
-
options,
|
|
134
|
-
nextIndex,
|
|
135
|
-
false
|
|
136
|
-
);
|
|
134
|
+
return getNextEnabledItem({ ...event, key: "ArrowDown" }, options, nextIndex, false);
|
|
137
135
|
}
|
|
138
136
|
if (recurse && nextIndex === options.length - 1) {
|
|
139
|
-
return getNextEnabledItem(
|
|
140
|
-
new KeyboardEvent(event.type, { ...event, key: "ArrowUp" }),
|
|
141
|
-
options,
|
|
142
|
-
nextIndex,
|
|
143
|
-
false
|
|
144
|
-
);
|
|
137
|
+
return getNextEnabledItem({ ...event, key: "ArrowUp" }, options, nextIndex, false);
|
|
145
138
|
}
|
|
146
139
|
return getNextEnabledItem(event, options, nextIndex, recurse);
|
|
147
140
|
}
|
|
@@ -149,7 +142,7 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
|
|
|
149
142
|
return nextIndex;
|
|
150
143
|
};
|
|
151
144
|
const isSkippableItem = (element) => {
|
|
152
|
-
return element.getAttribute("role") === "presentation" ||
|
|
145
|
+
return element.getAttribute("role") === "presentation" || element.hasAttribute("disabled") || !!element.getAttribute("aria-disabled") || !!element.getAttribute("aria-hidden");
|
|
153
146
|
};
|
|
154
147
|
exports.Root = Root;
|
|
155
148
|
exports.getNextEnabledItem = getNextEnabledItem;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Root.cjs","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowDown' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowUp' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n !!element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["useMergedRef","isAriaDirectionKey","createCustomKeyboardEvent"],"mappings":";;;;;;AAmBA,MAAM,2BAA2B,CAAC,YAA4B,aAC1D,WAAW,iBAAiB,QAAQ;AAKjC,MAAM,OAAO,MAAM,WAA2C,SAAS,eAAe,OAAO,KAAK;AACrG,QAAM,EAAE,eAAe,eAAe,WAAW,GAAG,GAAG,eAAe;AACtE,QAAM,cAAcA,aAAAA,aAA4B,GAAG;AACnD,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,SAAA;AAC5C,QAAM,oBAAoB,MAAM,sBAAsB;AAEtD,QAAM,kBAAkB,CAAC,OAAe,YAA4B,WAAoB;AACpF,eAAW,cAAc,gBAAgB,GAAG,gBAAgB,cAAc;AAC1E,WAAO,aAAa,gBAAgB,MAAM;AAE1C,WAAO,eAAe,EAAE,OAAO,UAAA,CAAW;AAC1C,mBAAe,KAAK;AAAA,EACxB;AAEA,QAAM,0BAA0B,MAAM;AAAA,IAClC,CAAC,WAA2B;AACxB,UAAI,YAAY,WAAW,OAAO,QAAQ,aAAa,GAAG;AACtD,cAAM,UAAU,yBAAyB,YAAY,SAAS,aAAa;AAC3E,cAAM,kBAAkB,MAAM,KAAK,OAAO,EAAE,QAAQ,MAAM;AAE1D,YAAI,kBAAkB,IAAI;AACtB,0BAAgB,iBAAiB,YAAY,SAAS,MAAM;AAAA,QAChE;AAAA,MACJ;AAAA,IACJ;AAAA,IACA,CAAC,YAAY,SAAS,aAAa;AAAA,EAAA;AAGvC,QAAM,UAAU,MAAM;AAClB,QAAI,YAAY,SAAS;AACrB,kBAAY,QAAQ,0BAA0B;AAAA,IAClD;AAAA,EACJ,GAAG,CAAC,YAAY,OAAO,CAAC;AAExB,QAAM,UAAU,MAAM;AAClB,QAAI,YAAY,SAAS;AACrB,YAAM,UAAU,yBAAyB,YAAY,SAAS,aAAa;AAE3E,UAAI,QAAQ,UAAU,CAAC,mBAAmB;AACtC,cAAM,gBAAgB,YAAY,QAAQ,cAAc,iBAAiB;AAEzE,YAAI,eAAe;AACf,gBAAM,gBAAgB,MAAM,KAAK,OAAO,EAAE,QAAQ,aAAa;AAE/D,cAAI,gBAAgB,MAAM,kBAAkB,aAAa;AACrD,4BAAgB,eAAe,YAAY,SAAS,aAAa;AAAA,UACrE;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,eAAe,iBAAiB,CAAC;AAErC,QAAM,UAAU,MAAM;AAClB,QAAI,YAAY,SAAS;AACrB,YAAM,UAAU,yBAAyB,YAAY,SAAS,aAAa;AAE3E,UAAI,QAAQ,QAAQ;AAChB,YAAI,WAAW,YAAY,QAAQ,iBAAiB,uBAAuB;AAG3E,YAAI,SAAS,WAAW,GAAG;AACvB,qBAAW,YAAY,QAAQ,iBAAiB,iBAAiB;AAAA,QACrE;AAGA,YAAI,SAAS,WAAW,GAAG;AACvB,cAAI,SAAS;AACT,kBAAM,gBAAgB,SAAS,KAAK,CAAC;AACrC,kBAAM,gBAAgB,MAAM,KAAK,OAAO,EAAE,QAAQ,aAAa;AAE/D,gBAAI,gBAAgB,IAAI;AACpB,8BAAgB,eAAe,YAAY,SAAS,aAAa;AAAA,YACrE;AAAA,UACJ;AAAA,QACJ,OAAO;AAEH,0BAAgB,GAAG,YAAY,SAAS,QAAQ,KAAK,CAAC,CAAC;AAAA,QAC3D;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ,GAAG,CAAC,MAAM,QAAQ,CAAC;AAEnB,QAAM,cAAc,CAAC,UAA4C;AAC7D,UAAM,SAAS,MAAM;AAGrB,UAAM,SAAS,OAAO,QAAQ,aAAa,IAAI,SAAS,OAAO,QAAQ,aAAa;AAEpF,QAAI,QAAQ;AACR,YAAM,UAAU,yBAAyB,MAAM,eAAe,aAAa;AAC3E,YAAM,kBAAkB,MAAM,KAAK,OAAO,EAAE,QAAQ,MAAM;AAE1D,UAAI,kBAAkB,IAAI;AACtB,wBAAgB,iBAAiB,MAAM,eAAe,MAAM;AAAA,MAChE;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAElE,QAAI,MAAM,WAAW,MAAM,eAAe;AACtC;AAAA,IACJ;AAEA,QAAI,WAAW,WAAW;AACtB,iBAAW,UAAU,KAAK;AAAA,IAC9B;AAEA,QAAI,MAAM,sBAAsB;AAC5B;AAAA,IACJ;AAEA,UAAM,UAAU,yBAAyB,MAAM,eAAe,aAAa;AAE3E,QAAI,SAAS;AACT,UAAIC,KAAAA,mBAAmB,KAAK,GAAG;AAC3B,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,cAAM,kBAAkB,mBAAmB,OAAO,SAAS,WAAW;AAEtE,YAAI,oBAAoB,UAAa,oBAAoB,aAAa;AAClE,0BAAgB,iBAAiB,MAAM,eAAe,QAAQ,KAAK,eAAe,CAAC;AAAA,QACvF;AAAA,MACJ,WAAW,gBAAgB,UAAa,CAAC,CAAC,QAAQ,KAAK,WAAW,GAAG;AAEjE,gBAAQ,KAAK,WAAW,GAAG,cAAcC,MAAAA,0BAA0B,KAAK,CAAC;AAAA,MAC7E;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,sBAAA,cAAC,OAAA,EAAK,GAAG,YAAY,SAAS,aAAa,WAAW,eAAe,KAAK,aAAa,SAAA,CAAoB;AACtH,CAAC;AAEM,MAAM,0BAA0B,CACnC,OACA,QACA,gBACqB;AACrB,UAAQ,MAAM,KAAA;AAAA,IACV,KAAK;AACD,aAAO,gBAAgB,SAAY,SAAS,IAAI,cAAc,IAAI,cAAc,IAAI;AAAA,IAExF,KAAK;AACD,aAAO,gBAAgB,SAAY,IAAI,cAAc,SAAS,IAAI,cAAc,IAAI;AAAA,IAExF,KAAK;AACD,aAAO;AAAA,IAEX,KAAK;AACD,aAAO,SAAS;AAAA,IAEpB;AACI;AAAA,EAAA;AAEZ;AAEO,MAAM,qBAAqB,CAC9B,OACA,SACA,aACA,UAAU,SACW;AACrB,QAAM,YAAY,wBAAwB,OAAO,QAAQ,QAAQ,WAAW;AAE5E,MAAI,cAAc,QAAW;AACzB,QAAI,cAAc,aAAa;AAC3B,aAAO;AAAA,IACX;AACA,QAAI,QAAQ,KAAK,SAAS,KAAK,gBAAgB,QAAQ,KAAK,SAAS,CAAC,GAAG;AAGrE,UAAI,WAAW,cAAc,GAAG;AAC5B,eAAO;AAAA,UACH,IAAI,cAAc,MAAM,MAAM,EAAE,GAAI,OAAe,KAAK,aAAa;AAAA,UACrE;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAER;AAEA,UAAI,WAAW,cAAc,QAAQ,SAAS,GAAG;AAC7C,eAAO;AAAA,UACH,IAAI,cAAc,MAAM,MAAM,EAAE,GAAI,OAAe,KAAK,WAAW;AAAA,UACnE;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MAER;AAEA,aAAO,mBAAmB,OAAO,SAAS,WAAW,OAAO;AAAA,IAChE;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,MAAM,kBAAkB,CAAC,YAAqB;AAC1C,SACI,QAAQ,aAAa,MAAM,MAAM,kBACjC,CAAC,CAAC,QAAQ,aAAa,UAAU,KACjC,CAAC,CAAC,QAAQ,aAAa,eAAe,KACtC,CAAC,CAAC,QAAQ,aAAa,aAAa;AAE5C;;;;"}
|
|
1
|
+
{"version":3,"file":"Root.cjs","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected=\"true\"]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected=\"true\"]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target;\n\n if (!(target instanceof Element)) {\n return;\n }\n\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n // TODO: Replace with an interactive element or leave a comment explaining why not\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return undefined;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem({ ...event, key: 'ArrowDown' }, options, nextIndex, false);\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem({ ...event, key: 'ArrowUp' }, options, nextIndex, false);\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["useMergedRef","isAriaDirectionKey","createCustomKeyboardEvent"],"mappings":"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"}
|
|
@@ -35,7 +35,7 @@ const Root = React__default.forwardRef(function CollectionRoot(props, ref) {
|
|
|
35
35
|
if (internalRef.current) {
|
|
36
36
|
const options = getOptionsFromCollection(internalRef.current, querySelector);
|
|
37
37
|
if (options.length && !isMultiselectable) {
|
|
38
|
-
const firstSelected = internalRef.current.querySelector(
|
|
38
|
+
const firstSelected = internalRef.current.querySelector('[aria-selected="true"]');
|
|
39
39
|
if (firstSelected) {
|
|
40
40
|
const selectedIndex = Array.from(options).indexOf(firstSelected);
|
|
41
41
|
if (selectedIndex > -1 && selectedIndex !== activeIndex) {
|
|
@@ -51,7 +51,7 @@ const Root = React__default.forwardRef(function CollectionRoot(props, ref) {
|
|
|
51
51
|
if (options.length) {
|
|
52
52
|
let selected = internalRef.current.querySelectorAll('[aria-current="true"]');
|
|
53
53
|
if (selected.length === 0) {
|
|
54
|
-
selected = internalRef.current.querySelectorAll(
|
|
54
|
+
selected = internalRef.current.querySelectorAll('[aria-selected="true"]');
|
|
55
55
|
}
|
|
56
56
|
if (selected.length === 1) {
|
|
57
57
|
if (options) {
|
|
@@ -69,6 +69,9 @@ const Root = React__default.forwardRef(function CollectionRoot(props, ref) {
|
|
|
69
69
|
}, [props.children]);
|
|
70
70
|
const handleClick = (event) => {
|
|
71
71
|
const target = event.target;
|
|
72
|
+
if (!(target instanceof Element)) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
72
75
|
const option = target.matches(querySelector) ? target : target.closest(querySelector);
|
|
73
76
|
if (option) {
|
|
74
77
|
const options = getOptionsFromCollection(event.currentTarget, querySelector);
|
|
@@ -115,7 +118,7 @@ const getNextIndexFromKeycode = (event, length, activeIndex) => {
|
|
|
115
118
|
case "End":
|
|
116
119
|
return length - 1;
|
|
117
120
|
default:
|
|
118
|
-
return;
|
|
121
|
+
return void 0;
|
|
119
122
|
}
|
|
120
123
|
};
|
|
121
124
|
const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
|
|
@@ -126,20 +129,10 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
|
|
|
126
129
|
}
|
|
127
130
|
if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {
|
|
128
131
|
if (recurse && nextIndex === 0) {
|
|
129
|
-
return getNextEnabledItem(
|
|
130
|
-
new KeyboardEvent(event.type, { ...event, key: "ArrowDown" }),
|
|
131
|
-
options,
|
|
132
|
-
nextIndex,
|
|
133
|
-
false
|
|
134
|
-
);
|
|
132
|
+
return getNextEnabledItem({ ...event, key: "ArrowDown" }, options, nextIndex, false);
|
|
135
133
|
}
|
|
136
134
|
if (recurse && nextIndex === options.length - 1) {
|
|
137
|
-
return getNextEnabledItem(
|
|
138
|
-
new KeyboardEvent(event.type, { ...event, key: "ArrowUp" }),
|
|
139
|
-
options,
|
|
140
|
-
nextIndex,
|
|
141
|
-
false
|
|
142
|
-
);
|
|
135
|
+
return getNextEnabledItem({ ...event, key: "ArrowUp" }, options, nextIndex, false);
|
|
143
136
|
}
|
|
144
137
|
return getNextEnabledItem(event, options, nextIndex, recurse);
|
|
145
138
|
}
|
|
@@ -147,7 +140,7 @@ const getNextEnabledItem = (event, options, activeIndex, recurse = true) => {
|
|
|
147
140
|
return nextIndex;
|
|
148
141
|
};
|
|
149
142
|
const isSkippableItem = (element) => {
|
|
150
|
-
return element.getAttribute("role") === "presentation" ||
|
|
143
|
+
return element.getAttribute("role") === "presentation" || element.hasAttribute("disabled") || !!element.getAttribute("aria-disabled") || !!element.getAttribute("aria-hidden");
|
|
151
144
|
};
|
|
152
145
|
export {
|
|
153
146
|
Root,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Root.js","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowDown' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem(\n new KeyboardEvent(event.type, { ...(event as any), key: 'ArrowUp' }) as any,\n options,\n nextIndex,\n false\n );\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n !!element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Root.js","sources":["../../../../src/primitives/Collection/components/Root.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\n/* This component provides a keyboard navigable collection primitive for use in lists\n * It is unlikely you need to edit this component\n */\n\nexport type CollectionProps = React.HTMLAttributes<HTMLDivElement> & {\n querySelector: string;\n resetOnChange?: unknown;\n};\n\nexport type CollectionRef = HTMLDivElement & {\n setActiveIndexByElement: (option: HTMLDivElement) => void;\n};\n\nconst getOptionsFromCollection = (collection: HTMLDivElement, selector: string): NodeListOf<Element> =>\n collection.querySelectorAll(selector);\n\n// we use javascript to set attributes (rather than cloning children and adding them)\n// so that we can support nesting (e.g. groups) - child elements that aren't options.\n// without doing this we would have to unwrap and flatten all groups\nexport const Root = React.forwardRef<CollectionRef, CollectionProps>(function CollectionRoot(props, ref) {\n const { querySelector, resetOnChange, tabIndex = 0, ...otherProps } = props;\n const internalRef = useMergedRef<CollectionRef>(ref);\n const [activeIndex, setActiveIndex] = React.useState<number | undefined>();\n const isMultiselectable = props['aria-multiselectable'];\n\n const setActiveOption = (index: number, collection: HTMLDivElement, option: Element) => {\n collection.querySelector('[aria-current]')?.removeAttribute('aria-current');\n option.setAttribute('aria-current', 'true');\n\n option.scrollIntoView({ block: 'nearest' });\n setActiveIndex(index);\n };\n\n const setActiveIndexByElement = React.useCallback(\n (option: HTMLDivElement) => {\n if (internalRef.current && option.matches(querySelector)) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, internalRef.current, option);\n }\n }\n },\n [internalRef.current, querySelector]\n );\n\n React.useEffect(() => {\n if (internalRef.current) {\n internalRef.current.setActiveIndexByElement = setActiveIndexByElement;\n }\n }, [internalRef.current]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length && !isMultiselectable) {\n const firstSelected = internalRef.current.querySelector('[aria-selected=\"true\"]');\n\n if (firstSelected) {\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1 && selectedIndex !== activeIndex) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n }\n }\n }, [resetOnChange, isMultiselectable]);\n\n React.useEffect(() => {\n if (internalRef.current) {\n const options = getOptionsFromCollection(internalRef.current, querySelector);\n\n if (options.length) {\n let selected = internalRef.current.querySelectorAll('[aria-current=\"true\"]');\n\n // if nothing is current (keyboard visible), look for selected items\n if (selected.length === 0) {\n selected = internalRef.current.querySelectorAll('[aria-selected=\"true\"]');\n }\n\n // if one item is selected, make sure it's current\n if (selected.length === 1) {\n if (options) {\n const firstSelected = selected.item(0);\n const selectedIndex = Array.from(options).indexOf(firstSelected);\n\n if (selectedIndex > -1) {\n setActiveOption(selectedIndex, internalRef.current, firstSelected);\n }\n }\n } else {\n // multiple selected or none selected should go to 0\n setActiveOption(0, internalRef.current, options.item(0));\n }\n }\n }\n }, [props.children]);\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target;\n\n if (!(target instanceof Element)) {\n return;\n }\n\n // after we allowed complex content in options (like prefix/postfix in Select2), the click target can be a child of the option\n // so in this case we need to find the closest option\n const option = target.matches(querySelector) ? target : target.closest(querySelector);\n\n if (option) {\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n const nextActiveIndex = Array.from(options).indexOf(option);\n\n if (nextActiveIndex > -1) {\n setActiveOption(nextActiveIndex, event.currentTarget, option);\n }\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n // this stops the event dispatched to the option rebounding back and starting an infinite loop\n if (event.target !== event.currentTarget) {\n return;\n }\n\n if (otherProps.onKeyDown) {\n otherProps.onKeyDown(event);\n }\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n const options = getOptionsFromCollection(event.currentTarget, querySelector);\n\n if (options) {\n if (isAriaDirectionKey(event)) {\n event.preventDefault();\n event.stopPropagation();\n const nextActiveIndex = getNextEnabledItem(event, options, activeIndex);\n\n if (nextActiveIndex !== undefined && nextActiveIndex !== activeIndex) {\n setActiveOption(nextActiveIndex, event.currentTarget, options.item(nextActiveIndex));\n }\n } else if (activeIndex !== undefined && !!options.item(activeIndex)) {\n // forward events onto the underlying option - this lets consumers place onKeyDown handlers on their own components\n options.item(activeIndex)?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n }\n };\n\n // TODO: Replace with an interactive element or leave a comment explaining why not\n return <div {...otherProps} onClick={handleClick} onKeyDown={handleKeyDown} ref={internalRef} tabIndex={tabIndex} />;\n});\n\nexport const getNextIndexFromKeycode = (\n event: React.KeyboardEvent,\n length: number,\n activeIndex: number | undefined\n): number | undefined => {\n switch (event.key) {\n case 'ArrowUp':\n return activeIndex === undefined ? length - 1 : activeIndex > 0 ? activeIndex - 1 : activeIndex;\n\n case 'ArrowDown':\n return activeIndex === undefined ? 0 : activeIndex < length - 1 ? activeIndex + 1 : activeIndex;\n\n case 'Home':\n return 0;\n\n case 'End':\n return length - 1;\n\n default:\n return undefined;\n }\n};\n\nexport const getNextEnabledItem = (\n event: React.KeyboardEvent<HTMLElement>,\n options: NodeListOf<Element>,\n activeIndex: number | undefined,\n recurse = true\n): number | undefined => {\n const nextIndex = getNextIndexFromKeycode(event, options.length, activeIndex);\n\n if (nextIndex !== undefined) {\n if (nextIndex === activeIndex) {\n return activeIndex;\n }\n if (options.item(nextIndex) && isSkippableItem(options.item(nextIndex))) {\n // check in the other direction if the first or last item is disabled,\n // but prevent infinite loops if all elements are disabled by disabling recursion\n if (recurse && nextIndex === 0) {\n return getNextEnabledItem({ ...event, key: 'ArrowDown' }, options, nextIndex, false);\n }\n\n if (recurse && nextIndex === options.length - 1) {\n return getNextEnabledItem({ ...event, key: 'ArrowUp' }, options, nextIndex, false);\n }\n\n return getNextEnabledItem(event, options, nextIndex, recurse);\n }\n }\n\n return nextIndex;\n};\n\nconst isSkippableItem = (element: Element) => {\n return (\n element.getAttribute('role') === 'presentation' ||\n element.hasAttribute('disabled') ||\n !!element.getAttribute('aria-disabled') ||\n !!element.getAttribute('aria-hidden')\n );\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Context.cjs","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"Context.cjs","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n multiple: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":[],"mappings":";;;AAYO,MAAM,kBAAkB,MAAM,cAAc,CAAA,CAA0B;AACtE,MAAM,qBAAqB,MAAM,MAAM,WAAW,eAAe;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Context.js","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":["React"],"mappings":";
|
|
1
|
+
{"version":3,"file":"Context.js","sources":["../../../../src/primitives/Listbox2/components/Context.tsx"],"sourcesContent":["import React from 'react';\n\nimport type { Listbox2Value } from '../types';\n\nexport type Listbox2ContextProps = {\n disabled: boolean;\n multiple: boolean;\n readOnly: boolean;\n setValue: (value: Listbox2Value) => void;\n value?: Listbox2Value;\n};\n\nexport const Listbox2Context = React.createContext({} as Listbox2ContextProps);\nexport const useListbox2Context = () => React.useContext(Listbox2Context);\n"],"names":["React"],"mappings":";AAYO,MAAM,kBAAkBA,eAAM,cAAc,CAAA,CAA0B;AACtE,MAAM,qBAAqB,MAAMA,eAAM,WAAW,eAAe;"}
|
|
@@ -7,7 +7,13 @@ const aria = require("../../../utils/aria.cjs");
|
|
|
7
7
|
const Context = require("./Context.cjs");
|
|
8
8
|
const Option = types.fixedForwardRef(function Listbox2Option(props, ref) {
|
|
9
9
|
const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;
|
|
10
|
-
const {
|
|
10
|
+
const {
|
|
11
|
+
disabled: listboxDisabled,
|
|
12
|
+
multiple,
|
|
13
|
+
readOnly: listboxReadOnly,
|
|
14
|
+
setValue,
|
|
15
|
+
value: currentValue
|
|
16
|
+
} = Context.useListbox2Context();
|
|
11
17
|
const id = "option-" + useId.useId(nativeId);
|
|
12
18
|
const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;
|
|
13
19
|
const handleClick = (event) => {
|
|
@@ -37,7 +43,7 @@ const Option = types.fixedForwardRef(function Listbox2Option(props, ref) {
|
|
|
37
43
|
{
|
|
38
44
|
...otherProps,
|
|
39
45
|
"aria-disabled": listboxDisabled || disabled ? "true" : void 0,
|
|
40
|
-
"aria-selected": selected ? "true" : void 0,
|
|
46
|
+
"aria-selected": selected ? "true" : multiple ? "false" : void 0,
|
|
41
47
|
id,
|
|
42
48
|
onClick: handleClick,
|
|
43
49
|
onKeyDown: handleKeyDown,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Option.cjs","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const {
|
|
1
|
+
{"version":3,"file":"Option.cjs","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const {\n disabled: listboxDisabled,\n multiple,\n readOnly: listboxReadOnly,\n setValue,\n value: currentValue,\n } = useListbox2Context();\n // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.\n // That's why adding prefix.\n const id = 'option-' + useId(nativeId);\n const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n setValue(value);\n\n if (typeof props.onClick === 'function') {\n props.onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n if (isAriaSelectionKey(event)) {\n setValue(value);\n }\n\n if (typeof props.onKeyDown === 'function') {\n props.onKeyDown(event);\n }\n };\n\n return (\n <div\n {...otherProps}\n aria-disabled={listboxDisabled || disabled ? 'true' : undefined}\n aria-selected={selected ? 'true' : multiple ? 'false' : undefined}\n id={id}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"option\"\n />\n );\n});\n"],"names":["fixedForwardRef","useListbox2Context","useId","isAriaSelectionKey"],"mappings":";;;;;;;AAeO,MAAM,SAASA,MAAAA,gBAAgB,SAAS,eAC3C,OACA,KACF;AACE,QAAM,EAAE,UAAU,IAAI,UAAU,OAAO,IAAI,OAAO,GAAG,WAAA,IAAe;AACpE,QAAM;AAAA,IACF,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,EAAA,IACPC,2BAAA;AAGJ,QAAM,KAAK,YAAYC,MAAAA,MAAM,QAAQ;AACrC,QAAM,WAAW,MAAM,QAAQ,YAAY,IAAI,aAAa,SAAS,KAAK,IAAI,iBAAiB;AAE/F,QAAM,cAAc,CAAC,UAA4C;AAC7D,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,aAAS,KAAK;AAEd,QAAI,OAAO,MAAM,YAAY,YAAY;AACrC,YAAM,QAAQ,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAClE,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,QAAIC,KAAAA,mBAAmB,KAAK,GAAG;AAC3B,eAAS,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO,MAAM,cAAc,YAAY;AACvC,YAAM,UAAU,KAAK;AAAA,IACzB;AAAA,EACJ;AAEA,SACI,sBAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,iBAAe,mBAAmB,WAAW,SAAS;AAAA,MACtD,iBAAe,WAAW,SAAS,WAAW,UAAU;AAAA,MACxD;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACX;AAAA,MACA,MAAK;AAAA,IAAA;AAAA,EAAA;AAGjB,CAAC;;"}
|
|
@@ -5,7 +5,13 @@ import { isAriaSelectionKey } from "../../../utils/aria.js";
|
|
|
5
5
|
import { useListbox2Context } from "./Context.js";
|
|
6
6
|
const Option = fixedForwardRef(function Listbox2Option(props, ref) {
|
|
7
7
|
const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;
|
|
8
|
-
const {
|
|
8
|
+
const {
|
|
9
|
+
disabled: listboxDisabled,
|
|
10
|
+
multiple,
|
|
11
|
+
readOnly: listboxReadOnly,
|
|
12
|
+
setValue,
|
|
13
|
+
value: currentValue
|
|
14
|
+
} = useListbox2Context();
|
|
9
15
|
const id = "option-" + useId(nativeId);
|
|
10
16
|
const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;
|
|
11
17
|
const handleClick = (event) => {
|
|
@@ -35,7 +41,7 @@ const Option = fixedForwardRef(function Listbox2Option(props, ref) {
|
|
|
35
41
|
{
|
|
36
42
|
...otherProps,
|
|
37
43
|
"aria-disabled": listboxDisabled || disabled ? "true" : void 0,
|
|
38
|
-
"aria-selected": selected ? "true" : void 0,
|
|
44
|
+
"aria-selected": selected ? "true" : multiple ? "false" : void 0,
|
|
39
45
|
id,
|
|
40
46
|
onClick: handleClick,
|
|
41
47
|
onKeyDown: handleKeyDown,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Option.js","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const {
|
|
1
|
+
{"version":3,"file":"Option.js","sources":["../../../../src/primitives/Listbox2/components/Option.tsx"],"sourcesContent":["import React from 'react';\n\nimport { useId } from '@/hooks/useId';\nimport { fixedForwardRef } from '@/types';\nimport { isAriaSelectionKey } from '@/utils/aria';\n\nimport type { Listbox2OptionValue } from '../types';\n\nimport { useListbox2Context } from './Context';\n\nexport type Listbox2OptionProps<T extends Listbox2OptionValue = Listbox2OptionValue> = React.HTMLAttributes<HTMLDivElement> & {\n disabled?: boolean;\n value: T;\n};\n\nexport const Option = fixedForwardRef(function Listbox2Option<T extends Listbox2OptionValue>(\n props: Listbox2OptionProps<T>,\n ref: React.Ref<HTMLDivElement>\n) {\n const { disabled, id: nativeId, title: _1, value, ...otherProps } = props;\n const {\n disabled: listboxDisabled,\n multiple,\n readOnly: listboxReadOnly,\n setValue,\n value: currentValue,\n } = useListbox2Context();\n // The id name cannot start with a number, otherwise unit tests will fail when trying to querry element with such id.\n // That's why adding prefix.\n const id = 'option-' + useId(nativeId);\n const selected = Array.isArray(currentValue) ? currentValue.includes(value) : currentValue === value;\n\n const handleClick = (event: React.MouseEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n setValue(value);\n\n if (typeof props.onClick === 'function') {\n props.onClick(event);\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (disabled || listboxDisabled || listboxReadOnly) {\n event.stopPropagation();\n return;\n }\n if (isAriaSelectionKey(event)) {\n setValue(value);\n }\n\n if (typeof props.onKeyDown === 'function') {\n props.onKeyDown(event);\n }\n };\n\n return (\n <div\n {...otherProps}\n aria-disabled={listboxDisabled || disabled ? 'true' : undefined}\n aria-selected={selected ? 'true' : multiple ? 'false' : undefined}\n id={id}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n ref={ref}\n role=\"option\"\n />\n );\n});\n"],"names":["React"],"mappings":";;;;;AAeO,MAAM,SAAS,gBAAgB,SAAS,eAC3C,OACA,KACF;AACE,QAAM,EAAE,UAAU,IAAI,UAAU,OAAO,IAAI,OAAO,GAAG,WAAA,IAAe;AACpE,QAAM;AAAA,IACF,UAAU;AAAA,IACV;AAAA,IACA,UAAU;AAAA,IACV;AAAA,IACA,OAAO;AAAA,EAAA,IACP,mBAAA;AAGJ,QAAM,KAAK,YAAY,MAAM,QAAQ;AACrC,QAAM,WAAW,MAAM,QAAQ,YAAY,IAAI,aAAa,SAAS,KAAK,IAAI,iBAAiB;AAE/F,QAAM,cAAc,CAAC,UAA4C;AAC7D,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,aAAS,KAAK;AAEd,QAAI,OAAO,MAAM,YAAY,YAAY;AACrC,YAAM,QAAQ,KAAK;AAAA,IACvB;AAAA,EACJ;AAEA,QAAM,gBAAgB,CAAC,UAA+C;AAClE,QAAI,YAAY,mBAAmB,iBAAiB;AAChD,YAAM,gBAAA;AACN;AAAA,IACJ;AACA,QAAI,mBAAmB,KAAK,GAAG;AAC3B,eAAS,KAAK;AAAA,IAClB;AAEA,QAAI,OAAO,MAAM,cAAc,YAAY;AACvC,YAAM,UAAU,KAAK;AAAA,IACzB;AAAA,EACJ;AAEA,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ,iBAAe,mBAAmB,WAAW,SAAS;AAAA,MACtD,iBAAe,WAAW,SAAS,WAAW,UAAU;AAAA,MACxD;AAAA,MACA,SAAS;AAAA,MACT,WAAW;AAAA,MACX;AAAA,MACA,MAAK;AAAA,IAAA;AAAA,EAAA;AAGjB,CAAC;"}
|