@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select2.js","sources":["../../../src/components/Select2/Select2.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport cn from 'clsx';\nimport React from 'react';\n\nimport { LegacyButton, Spinner, useLocalization } from '@/components';\nimport { useBoundingClientRectListener } from '@/hooks/useBoundingClientRectListener';\nimport { useControlled } from '@/hooks/useControlled';\nimport { useIsFormControl } from '@/hooks/useIsFormControl';\nimport { useIsHoverStatePaused } from '@/hooks/useIsHoverStatePaused';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { BubbleSelect } from '@/primitives/BubbleSelect';\nimport type { CollectionRef } from '@/primitives/Collection/Collection';\nimport * as ListboxPrimitive from '@/primitives/Listbox2/Listbox2';\nimport type { FontSize } from '@/types';\nimport { fixedForwardRef, FontSizes } from '@/types';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { debounce } from '@/utils/debounce';\nimport { getNextFocussableElement, isElementInsideTable3OrReport } from '@/utils/dom';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\nimport { Collection } from './components/Collection';\nimport { Select2Context } from './components/Context';\nimport { Create } from './components/Create';\nimport type { Select2GroupProps } from './components/Group';\nimport { Group } from './components/Group';\nimport type { Select2OptionProps } from './components/Option';\nimport { Option } from './components/Option';\nimport { Search } from './components/Search';\nimport type { Select2TitleProps } from './components/Title';\nimport { Title } from './components/Title';\nimport { Trigger } from './components/Trigger';\nimport { isGroup, useChildren } from './hooks/useChildren';\nimport type {\n Select2Child,\n Select2Children,\n Select2CreateHandler,\n Select2CreateDialogRenderer,\n Select2DeleteHandler,\n Select2EditHandler,\n Select2OptionValue,\n Select2Value,\n} from './types';\nimport { createCollectionClassName, filterOption, FONT_SIZE_CLASSNAME } from './utilities';\n\ntype Select2Texts = {\n allSelect: string;\n allDeselect: string;\n cancel: string;\n chooseColor: string;\n create: string;\n delete: string;\n save: string;\n search: string;\n searchOrCreate: string;\n selectAll: string;\n selectAllResults: string;\n deselectAll: string;\n deselectAllResults: string;\n};\n\ntype Select2Props<T extends Select2Value = Select2Value> = Omit<\n React.HTMLAttributes<HTMLButtonElement>,\n 'children' | 'defaultValue' | 'onChange' | 'value'\n> & {\n /** Autofocus Select2 when loaded **/\n autoFocus?: boolean;\n /** Array of options in Select2 */\n children: Select2Children;\n /** Initial value of the input in Select2 */\n defaultValue?: T;\n /** Set what value should have an empty option in Select2 */\n emptyValue?: Extract<T, Select2OptionValue>;\n /** Whether the Select2 is in a disabled state **/\n disabled?: boolean;\n /** Font size of text in Select2 **/\n fontSize?: FontSize;\n /** Draws attention to the Select2 by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Whether the Select2 is in an invalid state **/\n invalid?: boolean;\n /** Whether the Select2 is loading the data **/\n loading?: boolean;\n /** Whether the Select2 allows selecting multiple values **/\n multiple?: boolean;\n /** Whether the Select2 is in an invalid state **/\n name?: string;\n /** Handler called when user chooses an option from the provided options **/\n onChange?: (value: T) => void;\n /** Handler called when user creates a new option **/\n onCreate?: Select2CreateHandler;\n /** Handler called when user deletes an option **/\n onDelete?: Select2DeleteHandler;\n /** Handler called when user edits an option **/\n onEdit?: Select2EditHandler;\n /** Placeholder showed when nothing is selected **/\n placeholder?: string;\n /** Whether the Select2 is in a readonly state **/\n readOnly?: boolean;\n required?: boolean;\n /** Renders select options as tags **/\n tags?: boolean;\n /** Value of the input in select2 */\n value?: T;\n /** Create dialog component, if specified, then create button will become always visible in the bottom of options dropdown,\n * when clicked, it will open create dialog and wait for 'onCreate' handler to be triggered from the dialog */\n createDialog?: Select2CreateDialogRenderer;\n /** Create button text */\n createTriggerText?: string;\n};\n\n// generic overload is the public face; the wide implementation signature lets the internals\n// (which all operate on Select2Value) consume the props without assertions\nfunction _Select2Inner<T extends Select2Value = Select2Value>(\n props: Select2Props<T>,\n ref: React.Ref<HTMLButtonElement>\n): React.JSX.Element;\nfunction _Select2Inner(props: Select2Props, ref: React.Ref<HTMLButtonElement>): React.JSX.Element {\n const {\n children: initChildren,\n defaultValue,\n disabled = false,\n emptyValue = undefined,\n fontSize,\n highlighted = false,\n invalid = false,\n loading,\n multiple = false,\n name,\n onChange,\n onCreate,\n onDelete,\n onEdit,\n placeholder,\n readOnly = false,\n tags = false,\n value: prop,\n createDialog,\n createTriggerText,\n ...otherProps\n } = props;\n\n const emptyOption: React.ReactElement<Select2OptionProps> | undefined = React.useMemo(() => {\n if (emptyValue !== undefined && !multiple) {\n // Empty option has 0px height, because it's empty, so need to apply height manually\n return <Option key=\"__empty\" children=\"\" value={emptyValue} className=\"h-8\" />;\n }\n return;\n }, [emptyValue, multiple]);\n\n const initialChildren = React.useMemo(() => {\n // flatten nested arrays from maps and strip conditionals (false/null) so the internals see a flat list\n const children = React.Children.toArray(initChildren).filter((child): child is Select2Child =>\n React.isValidElement(child)\n );\n\n return emptyOption ? [emptyOption, ...children] : children;\n }, [emptyOption, initChildren]);\n\n // refs\n const internalRef = useMergedRef<HTMLButtonElement>(ref);\n const listboxRef = React.useRef<CollectionRef>(null);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const { texts } = useLocalization();\n // align the listbox min width with the width of the input - it should never be smaller\n const dimensions = useBoundingClientRectListener(internalRef);\n\n // state\n const [open, setOpen] = React.useState(false);\n const [value, _setValue] = useControlled<Select2Value>({\n // uncontrolled\n defaultValue,\n // controlled\n onChange,\n value: prop,\n });\n const setValue = ListboxPrimitive.createListboxValueSetter(\n multiple,\n // the state can genuinely become undefined (form reset), but widening `useControlled` to\n // `Select2Value | undefined` would require onChange to accept `undefined` — a breaking API change\n _setValue as React.Dispatch<React.SetStateAction<Select2Value | undefined>>\n );\n const [validationError, setValidationError] = React.useState<Error | undefined>();\n const [shouldPauseHoverState, setShouldPauseHoverState] = useIsHoverStatePaused();\n\n const { flattenedChildren, filteredChildren, searchQuery, setSearchQuery } = useChildren({\n children: initialChildren,\n emptyValue,\n multiple,\n open,\n setValue,\n value,\n });\n\n // context\n const context = {\n disabled,\n highlighted,\n invalid,\n listboxRef,\n multiple,\n onCreate,\n onDelete,\n onEdit,\n open,\n readOnly,\n ref: internalRef,\n searchQuery,\n searchRef,\n setOpen,\n setSearchQuery,\n setValidationError,\n setValue,\n shouldPauseHoverState,\n setShouldPauseHoverState,\n tags,\n fontSize,\n validationError,\n value,\n createDialog,\n createTriggerText,\n };\n\n const hasInlineCreation = onCreate && !createDialog;\n const hasSearch = flattenedChildren.length > 5 || hasInlineCreation;\n const visibleChildren = searchQuery === '' ? initialChildren : filteredChildren;\n const selectOptions =\n searchQuery === ''\n ? flattenedChildren.map(child => child.props.value)\n : filteredChildren.flatMap(child => {\n if (isGroup(child)) {\n return Array.isArray(child.props.children)\n ? child.props.children.map(subChild => subChild.props.value)\n : [];\n }\n return child.props.value;\n });\n\n // support typeahead functionality when search isn't available\n const queryTimeoutRef = React.useRef('');\n\n const typeahead = debounce(function () {\n if (!queryTimeoutRef.current) {\n return;\n }\n\n // match against the flattened list — selectOptions is flattened too, so indices\n // stay aligned when groups are present, and group members can be matched\n const matchedValueIndex = flattenedChildren.findIndex(child => filterOption(child, queryTimeoutRef.current));\n\n if (matchedValueIndex > -1 && selectOptions[matchedValueIndex] !== undefined) {\n setValue(selectOptions[matchedValueIndex]);\n }\n\n queryTimeoutRef.current = '';\n }, 200);\n\n const setValueIfMatched = (query: string) => {\n queryTimeoutRef.current = queryTimeoutRef.current + query;\n typeahead();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (open) {\n event.preventDefault();\n } else if (isElementInsideTable3OrReport(event.currentTarget) && isAriaDirectionKey(event)) {\n return;\n } else if (!event.ctrlKey && !event.metaKey && (event.key === 'ArrowDown' || /^[a-z0-9]$/i.test(event.key))) {\n setOpen(true);\n\n if (!hasSearch) {\n setValueIfMatched(event.key);\n }\n }\n\n // Collect the first character when opening with keyboard (when user starts typing while focused on a trigger)\n if (hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setSearchQuery(prev => prev + event.key);\n }\n\n // the focus should always remain on the input, so we forward events on to the listbox\n listboxRef.current?.dispatchEvent(createCustomKeyboardEvent(event));\n };\n\n const shouldFocusNextRef = React.useRef<number | undefined>(undefined);\n\n const handleHorizontalNavigation = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isElementInsideTable3OrReport(internalRef.current)) {\n const isTriggeredFromPopover = event.target instanceof Node && event.currentTarget.contains?.(event.target);\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && isTriggeredFromPopover) {\n event.preventDefault(); // prevents scrolling horizontally in the table on arrow left/right.\n event.stopPropagation();\n\n shouldFocusNextRef.current = event.key === 'ArrowLeft' ? -1 : +1;\n setOpen(false);\n }\n }\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isAriaDirectionKey(event)) {\n setShouldPauseHoverState(true);\n return;\n }\n\n if (event.key === 'Tab') {\n shouldFocusNextRef.current = event.shiftKey ? -1 : +1;\n setOpen(false);\n return;\n }\n\n // Handle Escape key to close the select without closing the parent dialog\n if (!hasSearch && event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n return;\n }\n\n // support typeahead to set the value by typing its text\n if (!hasSearch && /^[a-z0-9]$/i.test(event.key)) {\n setValueIfMatched(event.key);\n return;\n }\n };\n\n const handleOpenChange = (open: boolean, details: { reason: string; event: Event }) => {\n if (!open && (details.reason === 'outside-press' || details.reason === 'focus-out')) {\n otherProps.onBlur?.(details.event as unknown as React.FocusEvent<HTMLButtonElement>);\n }\n setOpen(open);\n };\n\n const handleFinalFocus = (closeType: 'mouse' | 'touch' | 'keyboard' | 'pen' | '') => {\n if (shouldFocusNextRef.current !== undefined) {\n const el = getNextFocussableElement(internalRef.current, shouldFocusNextRef.current);\n shouldFocusNextRef.current = undefined;\n return el || false;\n }\n if (closeType === 'mouse' || closeType === 'touch') {\n // Don't steal focus — the clicked element receives it naturally.\n return false;\n }\n return true;\n };\n const areAllSelected = Array.isArray(value) && selectOptions.every(option => value.includes(option));\n\n const selectAllText = React.useMemo(() => {\n if (searchQuery === '') {\n if (areAllSelected) {\n return texts.select2.deselectAll;\n }\n return texts.select2.selectAll;\n }\n\n if (areAllSelected) {\n return texts.select2.deselectAllResults;\n }\n\n return texts.select2.selectAllResults;\n }, [areAllSelected, searchQuery]);\n\n const selectAll = () => {\n if (!Array.isArray(value) || value.length === 0) {\n setValue(selectOptions);\n } else {\n // array of all available options which are not selected\n const preselectedValues = selectOptions.filter(option => !value.includes(option));\n setValue([...value, ...preselectedValues]);\n }\n };\n\n const deselectAll = () => {\n if (searchQuery === '') {\n setValue([]);\n } else {\n const nextValue = Array.isArray(value) && value.filter(subValue => !selectOptions.includes(subValue));\n setValue(nextValue);\n }\n };\n\n const className = cn(\n 'rounded border border-gray-300 bg-white py-1.5 shadow-md',\n {\n 'focus-within:yt-focus': !hasSearch,\n 'outline-none': hasSearch,\n },\n createCollectionClassName()\n );\n\n return (\n <Select2Context.Provider value={context}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger\n render={\n <Trigger\n {...otherProps}\n aria-haspopup=\"listbox\"\n aria-multiselectable={multiple}\n // oxlint-disable-next-line taco/data-taco-kebab-case -- established public selector API; renaming it is a breaking change\n data-taco=\"Select2\"\n emptyValue={emptyValue}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={internalRef}>\n {flattenedChildren}\n </Trigger>\n }\n />\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align=\"start\"\n sideOffset={4}\n collisionAvoidance={{\n side: 'flip',\n fallbackAxisSide: 'none',\n }}>\n <PopoverPrimitive.Popup\n className={className}\n style={{ minWidth: dimensions?.width ? `${dimensions.width}px` : undefined }}\n initialFocus={hasSearch ? searchRef : true}\n finalFocus={handleFinalFocus}\n onKeyDown={handleHorizontalNavigation}\n tabIndex={-1}>\n {hasSearch ? (\n <>\n <Search\n placeholder={hasInlineCreation ? texts.select2.searchOrCreate : texts.select2.search}\n ref={searchRef}\n />\n {multiple && selectOptions.length > 1 && (\n <>\n <LegacyButton\n className=\"!justify-start\"\n appearance=\"discrete\"\n onClick={areAllSelected ? deselectAll : selectAll}>\n {selectAllText}\n </LegacyButton>\n <div className=\"mx-3 rounded border-t border-gray-200\" />\n </>\n )}\n </>\n ) : null}\n {loading ? (\n <span\n className={cn(\n 'flex items-center italic text-gray-700',\n fontSize && FONT_SIZE_CLASSNAME[fontSize]\n )}>\n <span>\n <Spinner\n delay={0}\n className={cn('ml-3 mr-2 mt-1.5 h-5 w-5', {\n '!mt-1 !h-3.5 !w-3.5': fontSize === FontSizes.small,\n '!h-4 !w-4': fontSize === FontSizes.medium,\n '!h-5 !w-5': fontSize === FontSizes.large,\n })}\n />\n </span>\n <span>{texts.listbox.loading}</span>\n </span>\n ) : flattenedChildren.length <= 0 && !onCreate ? (\n <div className=\"-mt-0.5 flex h-8 items-center px-2 text-gray-700\" role=\"presentation\">\n {texts.listbox.empty}\n </div>\n ) : (\n <ListboxPrimitive.Root\n className=\"flex flex-col gap-0.5 focus-visible:outline-none\"\n customSelector=\":scope > button\"\n disabled={disabled}\n multiple={multiple}\n onKeyDown={handleListboxKeyDown}\n readOnly={readOnly}\n ref={listboxRef}\n setValue={setValue}\n value={value}>\n <Collection>{visibleChildren}</Collection>\n {onCreate ? <Create onCreate={onCreate} options={flattenedChildren} /> : null}\n </ListboxPrimitive.Root>\n )}\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n <ControlledHiddenField\n emptyValue={emptyValue}\n multiple={multiple || tags}\n name={name}\n options={flattenedChildren.map(child => child.props.value)}\n parentRef={internalRef}\n setValue={setValue}\n value={value}\n />\n </PopoverPrimitive.Root>\n </Select2Context.Provider>\n );\n}\n\nexport const Select2 = Object.assign(fixedForwardRef(_Select2Inner), {\n Option,\n Group,\n Title,\n displayName: 'Select2',\n});\n\ntype ControlledHiddenFieldProps = {\n emptyValue: ListboxPrimitive.Listbox2OptionValue | undefined;\n multiple: boolean;\n name: string | undefined;\n options: Select2OptionValue[];\n parentRef: React.RefObject<HTMLButtonElement>;\n setValue: (nextValue: Select2Value | undefined) => void;\n value: Select2Value | undefined;\n};\n\nconst ControlledHiddenField = (props: ControlledHiddenFieldProps) => {\n const { emptyValue, multiple, name, options, parentRef, value, setValue } = props;\n const isFormControl = useIsFormControl(parentRef, () => setValue(multiple ? [] : undefined));\n\n let bubbleValue;\n\n if (isFormControl) {\n if (value !== undefined) {\n if (multiple) {\n bubbleValue = Array.isArray(value) ? value.map(String) : [value === null ? '' : String(value)];\n } else {\n bubbleValue = value === null ? '' : String(value);\n }\n }\n\n return (\n <BubbleSelect aria-hidden key={String(bubbleValue)} multiple={multiple} name={name} tabIndex={-1} value={bubbleValue}>\n {emptyValue === undefined ? null : <option value={emptyValue === null ? '' : String(emptyValue)} />}\n {options.map(option => (\n <option key={String(option)} value={String(option)} />\n ))}\n </BubbleSelect>\n );\n }\n\n return null;\n};\n\nexport type {\n Select2Texts,\n Select2Child,\n Select2GroupProps,\n Select2OptionProps,\n Select2OptionValue,\n Select2Value,\n Select2Props,\n Select2TitleProps,\n Select2Children,\n};\n"],"names":["React","ListboxPrimitive.createListboxValueSetter","open","PopoverPrimitive","ListboxPrimitive.Root"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select2.js","sources":["../../../src/components/Select2/Select2.tsx"],"sourcesContent":["import { Popover as PopoverPrimitive } from '@base-ui/react/popover';\nimport cn from 'clsx';\nimport React from 'react';\n\nimport { LegacyButton, Spinner, useLocalization } from '@/components';\nimport { useBoundingClientRectListener } from '@/hooks/useBoundingClientRectListener';\nimport { useControlled } from '@/hooks/useControlled';\nimport { useIsFormControl } from '@/hooks/useIsFormControl';\nimport { useIsHoverStatePaused } from '@/hooks/useIsHoverStatePaused';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { BubbleSelect } from '@/primitives/BubbleSelect';\nimport type { CollectionRef } from '@/primitives/Collection/Collection';\nimport * as ListboxPrimitive from '@/primitives/Listbox2/Listbox2';\nimport type { FontSize } from '@/types';\nimport { fixedForwardRef, FontSizes } from '@/types';\nimport { isAriaDirectionKey } from '@/utils/aria';\nimport { debounce } from '@/utils/debounce';\nimport { getNextFocussableElement, isElementInsideTable3OrReport } from '@/utils/dom';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\nimport { Collection } from './components/Collection';\nimport { Select2Context } from './components/Context';\nimport { Create } from './components/Create';\nimport type { Select2GroupProps } from './components/Group';\nimport { Group } from './components/Group';\nimport type { Select2OptionProps } from './components/Option';\nimport { Option } from './components/Option';\nimport { Search } from './components/Search';\nimport type { Select2TitleProps } from './components/Title';\nimport { Title } from './components/Title';\nimport { Trigger } from './components/Trigger';\nimport { isGroup, useChildren } from './hooks/useChildren';\nimport type {\n Select2Child,\n Select2Children,\n Select2CreateHandler,\n Select2CreateDialogRenderer,\n Select2DeleteHandler,\n Select2EditHandler,\n Select2OptionValue,\n Select2Value,\n} from './types';\nimport { createCollectionClassName, filterOption, FONT_SIZE_CLASSNAME } from './utilities';\n\ntype Select2Texts = {\n allSelect: string;\n allDeselect: string;\n cancel: string;\n chooseColor: string;\n create: string;\n delete: string;\n save: string;\n search: string;\n searchOrCreate: string;\n selectAll: string;\n selectAllResults: string;\n deselectAll: string;\n deselectAllResults: string;\n};\n\ntype Select2Props<T extends Select2Value = Select2Value> = Omit<\n React.HTMLAttributes<HTMLButtonElement>,\n 'children' | 'defaultValue' | 'onChange' | 'value'\n> & {\n /** Autofocus Select2 when loaded **/\n autoFocus?: boolean;\n /** Array of options in Select2 */\n children: Select2Children;\n /** Initial value of the input in Select2 */\n defaultValue?: T;\n /** Set what value should have an empty option in Select2 */\n emptyValue?: Extract<T, Select2OptionValue>;\n /** Whether the Select2 is in a disabled state **/\n disabled?: boolean;\n /** Font size of text in Select2 **/\n fontSize?: FontSize;\n /** Draws attention to the Select2 by changing its style and making it visually prominent */\n highlighted?: boolean;\n /** Whether the Select2 is in an invalid state **/\n invalid?: boolean;\n /** Whether the Select2 is loading the data **/\n loading?: boolean;\n /** Whether the Select2 allows selecting multiple values **/\n multiple?: boolean;\n /** Whether the Select2 is in an invalid state **/\n name?: string;\n /** Handler called when user chooses an option from the provided options **/\n onChange?: (value: T) => void;\n /** Handler called when user creates a new option **/\n onCreate?: Select2CreateHandler;\n /** Handler called when user deletes an option **/\n onDelete?: Select2DeleteHandler;\n /** Handler called when user edits an option **/\n onEdit?: Select2EditHandler;\n /** Placeholder showed when nothing is selected **/\n placeholder?: string;\n /** Whether the Select2 is in a readonly state **/\n readOnly?: boolean;\n required?: boolean;\n /** Renders select options as tags **/\n tags?: boolean;\n /** Value of the input in select2 */\n value?: T;\n /** Create dialog component, if specified, then create button will become always visible in the bottom of options dropdown,\n * when clicked, it will open create dialog and wait for 'onCreate' handler to be triggered from the dialog */\n createDialog?: Select2CreateDialogRenderer;\n /** Create button text */\n createTriggerText?: string;\n};\n\n// generic overload is the public face; the wide implementation signature lets the internals\n// (which all operate on Select2Value) consume the props without assertions\nfunction _Select2Inner<T extends Select2Value = Select2Value>(\n props: Select2Props<T>,\n ref: React.Ref<HTMLButtonElement>\n): React.JSX.Element;\nfunction _Select2Inner(props: Select2Props, ref: React.Ref<HTMLButtonElement>): React.JSX.Element {\n const {\n children: initChildren,\n defaultValue,\n disabled = false,\n emptyValue = undefined,\n fontSize,\n highlighted = false,\n invalid = false,\n loading,\n multiple = false,\n name,\n onChange,\n onCreate,\n onDelete,\n onEdit,\n placeholder,\n readOnly = false,\n tags = false,\n value: prop,\n createDialog,\n createTriggerText,\n ...otherProps\n } = props;\n\n const emptyOption: React.ReactElement<Select2OptionProps> | undefined = React.useMemo(() => {\n if (emptyValue !== undefined && !multiple) {\n // Empty option has 0px height, because it's empty, so need to apply height manually\n return <Option key=\"__empty\" children=\"\" value={emptyValue} className=\"h-8\" />;\n }\n\n return undefined;\n }, [emptyValue, multiple]);\n\n const initialChildren = React.useMemo(() => {\n // flatten nested arrays from maps and strip conditionals (false/null) so the internals see a flat list\n const children = React.Children.toArray(initChildren).filter((child): child is Select2Child =>\n React.isValidElement(child)\n );\n\n return emptyOption ? [emptyOption, ...children] : children;\n }, [emptyOption, initChildren]);\n\n // refs\n const internalRef = useMergedRef<HTMLButtonElement>(ref);\n const listboxRef = React.useRef<CollectionRef>(null);\n const searchRef = React.useRef<HTMLInputElement>(null);\n const { texts } = useLocalization();\n // align the listbox min width with the width of the input - it should never be smaller\n const dimensions = useBoundingClientRectListener(internalRef);\n\n // state\n const [open, setOpen] = React.useState(false);\n const [value, _setValue] = useControlled<Select2Value>({\n // uncontrolled\n defaultValue,\n // controlled\n onChange,\n value: prop,\n });\n const setValue = ListboxPrimitive.createListboxValueSetter(\n multiple,\n // the state can genuinely become undefined (form reset), but widening `useControlled` to\n // `Select2Value | undefined` would require onChange to accept `undefined` — a breaking API change\n _setValue as React.Dispatch<React.SetStateAction<Select2Value | undefined>>\n );\n const [validationError, setValidationError] = React.useState<Error | undefined>();\n const [shouldPauseHoverState, setShouldPauseHoverState] = useIsHoverStatePaused();\n\n const { flattenedChildren, filteredChildren, searchQuery, setSearchQuery } = useChildren({\n children: initialChildren,\n emptyValue,\n multiple,\n open,\n setValue,\n value,\n });\n\n // context\n const context = {\n disabled,\n highlighted,\n invalid,\n listboxRef,\n multiple,\n onCreate,\n onDelete,\n onEdit,\n open,\n readOnly,\n ref: internalRef,\n searchQuery,\n searchRef,\n setOpen,\n setSearchQuery,\n setValidationError,\n setValue,\n shouldPauseHoverState,\n setShouldPauseHoverState,\n tags,\n fontSize,\n validationError,\n value,\n createDialog,\n createTriggerText,\n };\n\n const hasInlineCreation = onCreate && !createDialog;\n const hasSearch = flattenedChildren.length > 5 || hasInlineCreation;\n const visibleChildren = searchQuery === '' ? initialChildren : filteredChildren;\n const selectOptions =\n searchQuery === ''\n ? flattenedChildren.map(child => child.props.value)\n : filteredChildren.flatMap(child => {\n if (isGroup(child)) {\n return Array.isArray(child.props.children)\n ? child.props.children.map(subChild => subChild.props.value)\n : [];\n }\n return child.props.value;\n });\n\n // support typeahead functionality when search isn't available\n const queryTimeoutRef = React.useRef('');\n\n const typeahead = debounce(function () {\n if (!queryTimeoutRef.current) {\n return;\n }\n\n // match against the flattened list — selectOptions is flattened too, so indices\n // stay aligned when groups are present, and group members can be matched\n const matchedValueIndex = flattenedChildren.findIndex(child => filterOption(child, queryTimeoutRef.current));\n\n if (matchedValueIndex > -1 && selectOptions[matchedValueIndex] !== undefined) {\n setValue(selectOptions[matchedValueIndex]);\n }\n\n queryTimeoutRef.current = '';\n }, 200);\n\n const setValueIfMatched = (query: string) => {\n queryTimeoutRef.current = queryTimeoutRef.current + query;\n typeahead();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (open) {\n event.preventDefault();\n } else if (isElementInsideTable3OrReport(event.currentTarget) && isAriaDirectionKey(event)) {\n return;\n } else if (!event.ctrlKey && !event.metaKey && (event.key === 'ArrowDown' || /^[a-z0-9]$/iu.test(event.key))) {\n setOpen(true);\n\n if (!hasSearch) {\n setValueIfMatched(event.key);\n }\n }\n\n // Collect the first character when opening with keyboard (when user starts typing while focused on a trigger)\n if (hasSearch && /^[a-z0-9]$/iu.test(event.key)) {\n setSearchQuery(prev => prev + event.key);\n }\n\n // the focus should always remain on the input, so we forward events on to the listbox\n listboxRef.current?.dispatchEvent(createCustomKeyboardEvent(event));\n };\n\n const shouldFocusNextRef = React.useRef<number | undefined>(undefined);\n\n const handleHorizontalNavigation = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (isElementInsideTable3OrReport(internalRef.current)) {\n const isTriggeredFromPopover = event.target instanceof Node && event.currentTarget.contains?.(event.target);\n\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && isTriggeredFromPopover) {\n // prevents scrolling horizontally in the table on arrow left/right.\n event.preventDefault();\n event.stopPropagation();\n\n shouldFocusNextRef.current = event.key === 'ArrowLeft' ? -1 : +1;\n setOpen(false);\n }\n }\n };\n\n const handleListboxKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n if (isAriaDirectionKey(event)) {\n setShouldPauseHoverState(true);\n return;\n }\n\n if (event.key === 'Tab') {\n shouldFocusNextRef.current = event.shiftKey ? -1 : +1;\n setOpen(false);\n return;\n }\n\n // Handle Escape key to close the select without closing the parent dialog\n if (!hasSearch && event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n return;\n }\n\n // support typeahead to set the value by typing its text\n if (!hasSearch && /^[a-z0-9]$/iu.test(event.key)) {\n setValueIfMatched(event.key);\n }\n };\n\n const handleOpenChange = (open: boolean, details: { reason: string; event: Event }) => {\n if (!open && (details.reason === 'outside-press' || details.reason === 'focus-out')) {\n otherProps.onBlur?.(details.event as unknown as React.FocusEvent<HTMLButtonElement>);\n }\n setOpen(open);\n };\n\n const handleFinalFocus = (closeType: 'mouse' | 'touch' | 'keyboard' | 'pen' | '') => {\n if (shouldFocusNextRef.current !== undefined) {\n const el = getNextFocussableElement(internalRef.current, shouldFocusNextRef.current);\n shouldFocusNextRef.current = undefined;\n return el || false;\n }\n if (closeType === 'mouse' || closeType === 'touch') {\n // Don't steal focus — the clicked element receives it naturally.\n return false;\n }\n return true;\n };\n const areAllSelected = Array.isArray(value) && selectOptions.every(option => value.includes(option));\n\n const selectAllText = React.useMemo(() => {\n if (searchQuery === '') {\n if (areAllSelected) {\n return texts.select2.deselectAll;\n }\n return texts.select2.selectAll;\n }\n\n if (areAllSelected) {\n return texts.select2.deselectAllResults;\n }\n\n return texts.select2.selectAllResults;\n }, [areAllSelected, searchQuery]);\n\n const selectAll = () => {\n if (!Array.isArray(value) || value.length === 0) {\n setValue(selectOptions);\n } else {\n // array of all available options which are not selected\n const preselectedValues = selectOptions.filter(option => !value.includes(option));\n setValue([...value, ...preselectedValues]);\n }\n };\n\n const deselectAll = () => {\n if (searchQuery === '') {\n setValue([]);\n } else {\n const nextValue = Array.isArray(value) && value.filter(subValue => !selectOptions.includes(subValue));\n setValue(nextValue);\n }\n };\n\n const className = cn(\n 'rounded border border-gray-300 bg-white py-1.5 shadow-md',\n {\n 'focus-within:yt-focus': !hasSearch,\n 'outline-none': hasSearch,\n },\n createCollectionClassName()\n );\n\n return (\n <Select2Context.Provider value={context}>\n <PopoverPrimitive.Root open={open} onOpenChange={handleOpenChange}>\n <PopoverPrimitive.Trigger\n render={\n <Trigger\n {...otherProps}\n aria-haspopup=\"dialog\"\n // oxlint-disable-next-line taco/data-taco-kebab-case -- established public selector API; renaming it is a breaking change\n data-taco=\"Select2\"\n data-multiple={multiple ? true : undefined}\n emptyValue={emptyValue}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n ref={internalRef}>\n {flattenedChildren}\n </Trigger>\n }\n />\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Positioner\n align=\"start\"\n sideOffset={4}\n collisionAvoidance={{\n side: 'flip',\n fallbackAxisSide: 'none',\n }}>\n <PopoverPrimitive.Popup\n className={className}\n style={{ minWidth: dimensions?.width ? `${dimensions.width}px` : undefined }}\n initialFocus={hasSearch ? searchRef : true}\n finalFocus={handleFinalFocus}\n onKeyDown={handleHorizontalNavigation}\n tabIndex={-1}>\n {hasSearch ? (\n <>\n <Search\n placeholder={hasInlineCreation ? texts.select2.searchOrCreate : texts.select2.search}\n ref={searchRef}\n />\n {multiple && selectOptions.length > 1 && (\n <>\n <LegacyButton\n className=\"!justify-start\"\n appearance=\"discrete\"\n onClick={areAllSelected ? deselectAll : selectAll}>\n {selectAllText}\n </LegacyButton>\n <div className=\"mx-3 rounded border-t border-gray-200\" />\n </>\n )}\n </>\n ) : null}\n {loading ? (\n <span\n className={cn(\n 'flex items-center italic text-gray-700',\n fontSize && FONT_SIZE_CLASSNAME[fontSize]\n )}>\n <span>\n <Spinner\n delay={0}\n className={cn('ml-3 mr-2 mt-1.5 h-5 w-5', {\n '!mt-1 !h-3.5 !w-3.5': fontSize === FontSizes.small,\n '!h-4 !w-4': fontSize === FontSizes.medium,\n '!h-5 !w-5': fontSize === FontSizes.large,\n })}\n />\n </span>\n <span>{texts.listbox.loading}</span>\n </span>\n ) : flattenedChildren.length <= 0 && !onCreate ? (\n <div className=\"-mt-0.5 flex h-8 items-center px-2 text-gray-700\" role=\"presentation\">\n {texts.listbox.empty}\n </div>\n ) : (\n <ListboxPrimitive.Root\n className=\"flex flex-col gap-0.5 focus-visible:outline-none\"\n customSelector=\":scope > button\"\n disabled={disabled}\n multiple={multiple}\n onKeyDown={handleListboxKeyDown}\n readOnly={readOnly}\n ref={listboxRef}\n setValue={setValue}\n value={value}>\n <Collection>{visibleChildren}</Collection>\n {onCreate ? <Create onCreate={onCreate} options={flattenedChildren} /> : null}\n </ListboxPrimitive.Root>\n )}\n </PopoverPrimitive.Popup>\n </PopoverPrimitive.Positioner>\n </PopoverPrimitive.Portal>\n <ControlledHiddenField\n emptyValue={emptyValue}\n multiple={multiple || tags}\n name={name}\n options={flattenedChildren.map(child => child.props.value)}\n parentRef={internalRef}\n setValue={setValue}\n value={value}\n />\n </PopoverPrimitive.Root>\n </Select2Context.Provider>\n );\n}\n\nexport const Select2 = Object.assign(fixedForwardRef(_Select2Inner), {\n Option,\n Group,\n Title,\n displayName: 'Select2',\n});\n\ntype ControlledHiddenFieldProps = {\n emptyValue: ListboxPrimitive.Listbox2OptionValue | undefined;\n multiple: boolean;\n name: string | undefined;\n options: Select2OptionValue[];\n parentRef: React.RefObject<HTMLButtonElement | null>;\n setValue: (nextValue: Select2Value | undefined) => void;\n value: Select2Value | undefined;\n};\n\nconst ControlledHiddenField = (props: ControlledHiddenFieldProps) => {\n const { emptyValue, multiple, name, options, parentRef, value, setValue } = props;\n const isFormControl = useIsFormControl(parentRef, () => setValue(multiple ? [] : undefined));\n\n let bubbleValue;\n\n if (isFormControl) {\n if (value !== undefined) {\n if (multiple) {\n bubbleValue = Array.isArray(value) ? value.map(String) : [value === null ? '' : String(value)];\n } else {\n bubbleValue = value === null ? '' : String(value);\n }\n }\n\n return (\n <BubbleSelect aria-hidden key={String(bubbleValue)} multiple={multiple} name={name} tabIndex={-1} value={bubbleValue}>\n {emptyValue === undefined ? null : <option value={emptyValue === null ? '' : String(emptyValue)} />}\n {options.map(option => (\n <option key={String(option)} value={String(option)} />\n ))}\n </BubbleSelect>\n );\n }\n\n return null;\n};\n\nexport type {\n Select2Texts,\n Select2Child,\n Select2GroupProps,\n Select2OptionProps,\n Select2OptionValue,\n Select2Value,\n Select2Props,\n Select2TitleProps,\n Select2Children,\n};\n"],"names":["React","ListboxPrimitive.createListboxValueSetter","open","PopoverPrimitive","ListboxPrimitive.Root"],"mappings":"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"}
|
|
@@ -25,7 +25,6 @@ const Search = React.forwardRef(function ListboxSearch(props, ref) {
|
|
|
25
25
|
if (aria.isAriaSelectionKey(event) || event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
26
26
|
event.preventDefault();
|
|
27
27
|
listboxRef?.current?.dispatchEvent(input.createCustomKeyboardEvent(event));
|
|
28
|
-
return;
|
|
29
28
|
}
|
|
30
29
|
};
|
|
31
30
|
return /* @__PURE__ */ React.createElement(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Search.cjs","sources":["../../../../src/components/Select2/components/Search.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { InputProps } from '@/components';\nimport { Field, Input } from '@/components';\nimport { isAriaSelectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\nimport { useSelect2Context } from './Context';\n\nexport const Search = React.forwardRef<HTMLInputElement, InputProps>(function ListboxSearch(props, ref) {\n const { listboxRef, searchQuery, setSearchQuery, setValidationError, validationError } = useSelect2Context();\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (validationError) {\n setValidationError(undefined);\n }\n\n setSearchQuery(event.target.value);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // space is an aria selection key, so we have to remove it to allow spaces\n if (event.key === ' ') {\n return;\n }\n\n // don't bubble if there is a search value, it would prevent cursor navigation inside the input\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && event.currentTarget.value.length) {\n event.stopPropagation();\n }\n\n if (isAriaSelectionKey(event) || event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n // forward navigation events onto the underlying collection - we want arrow keys to work from inside the filter input\n listboxRef?.current?.dispatchEvent(createCustomKeyboardEvent(event));\n
|
|
1
|
+
{"version":3,"file":"Search.cjs","sources":["../../../../src/components/Select2/components/Search.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { InputProps } from '@/components';\nimport { Field, Input } from '@/components';\nimport { isAriaSelectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\nimport { useSelect2Context } from './Context';\n\nexport const Search = React.forwardRef<HTMLInputElement, InputProps>(function ListboxSearch(props, ref) {\n const { listboxRef, searchQuery, setSearchQuery, setValidationError, validationError } = useSelect2Context();\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (validationError) {\n setValidationError(undefined);\n }\n\n setSearchQuery(event.target.value);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // space is an aria selection key, so we have to remove it to allow spaces\n if (event.key === ' ') {\n return;\n }\n\n // don't bubble if there is a search value, it would prevent cursor navigation inside the input\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && event.currentTarget.value.length) {\n event.stopPropagation();\n }\n\n if (isAriaSelectionKey(event) || event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n // forward navigation events onto the underlying collection - we want arrow keys to work from inside the filter input\n listboxRef?.current?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n };\n\n return (\n <Field\n // oxlint-disable-next-line taco/no-component-margin -- grandfathered; removing this margin is a visual breaking change\n className={cn('mx-1.5 mb-1.5 !min-h-fit', { '!pb-0': !validationError })}\n invalid={!!validationError}\n message={validationError?.message}>\n <Input\n {...props}\n invalid={!!validationError}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n ref={ref}\n value={searchQuery}\n />\n </Field>\n );\n});\n"],"names":["useSelect2Context","isAriaSelectionKey","createCustomKeyboardEvent","Field","Input"],"mappings":";;;;;;;;;AAUO,MAAM,SAAS,MAAM,WAAyC,SAAS,cAAc,OAAO,KAAK;AACpG,QAAM,EAAE,YAAY,aAAa,gBAAgB,oBAAoB,gBAAA,IAAoBA,0BAAA;AAEzF,QAAM,eAAe,CAAC,UAA+C;AACjE,QAAI,iBAAiB;AACjB,yBAAmB,MAAS;AAAA,IAChC;AAEA,mBAAe,MAAM,OAAO,KAAK;AAAA,EACrC;AAEA,QAAM,gBAAgB,CAAC,UAAiD;AAEpE,QAAI,MAAM,QAAQ,KAAK;AACnB;AAAA,IACJ;AAGA,SAAK,MAAM,QAAQ,eAAe,MAAM,QAAQ,iBAAiB,MAAM,cAAc,MAAM,QAAQ;AAC/F,YAAM,gBAAA;AAAA,IACV;AAEA,QAAIC,KAAAA,mBAAmB,KAAK,KAAK,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AACnF,YAAM,eAAA;AAEN,kBAAY,SAAS,cAAcC,MAAAA,0BAA0B,KAAK,CAAC;AAAA,IACvE;AAAA,EACJ;AAEA,SACI,sBAAA;AAAA,IAACC,MAAAA;AAAAA,IAAA;AAAA,MAEG,WAAW,GAAG,4BAA4B,EAAE,SAAS,CAAC,iBAAiB;AAAA,MACvE,SAAS,CAAC,CAAC;AAAA,MACX,SAAS,iBAAiB;AAAA,IAAA;AAAA,IAC1B,sBAAA;AAAA,MAACC,MAAAA;AAAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ,SAAS,CAAC,CAAC;AAAA,QACX,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA,OAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EACX;AAGZ,CAAC;;"}
|
|
@@ -23,7 +23,6 @@ const Search = React__default.forwardRef(function ListboxSearch(props, ref) {
|
|
|
23
23
|
if (isAriaSelectionKey(event) || event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
24
24
|
event.preventDefault();
|
|
25
25
|
listboxRef?.current?.dispatchEvent(createCustomKeyboardEvent(event));
|
|
26
|
-
return;
|
|
27
26
|
}
|
|
28
27
|
};
|
|
29
28
|
return /* @__PURE__ */ React__default.createElement(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Search.js","sources":["../../../../src/components/Select2/components/Search.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { InputProps } from '@/components';\nimport { Field, Input } from '@/components';\nimport { isAriaSelectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\nimport { useSelect2Context } from './Context';\n\nexport const Search = React.forwardRef<HTMLInputElement, InputProps>(function ListboxSearch(props, ref) {\n const { listboxRef, searchQuery, setSearchQuery, setValidationError, validationError } = useSelect2Context();\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (validationError) {\n setValidationError(undefined);\n }\n\n setSearchQuery(event.target.value);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // space is an aria selection key, so we have to remove it to allow spaces\n if (event.key === ' ') {\n return;\n }\n\n // don't bubble if there is a search value, it would prevent cursor navigation inside the input\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && event.currentTarget.value.length) {\n event.stopPropagation();\n }\n\n if (isAriaSelectionKey(event) || event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n // forward navigation events onto the underlying collection - we want arrow keys to work from inside the filter input\n listboxRef?.current?.dispatchEvent(createCustomKeyboardEvent(event));\n
|
|
1
|
+
{"version":3,"file":"Search.js","sources":["../../../../src/components/Select2/components/Search.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { InputProps } from '@/components';\nimport { Field, Input } from '@/components';\nimport { isAriaSelectionKey } from '@/utils/aria';\nimport { createCustomKeyboardEvent } from '@/utils/input';\n\nimport { useSelect2Context } from './Context';\n\nexport const Search = React.forwardRef<HTMLInputElement, InputProps>(function ListboxSearch(props, ref) {\n const { listboxRef, searchQuery, setSearchQuery, setValidationError, validationError } = useSelect2Context();\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (validationError) {\n setValidationError(undefined);\n }\n\n setSearchQuery(event.target.value);\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n // space is an aria selection key, so we have to remove it to allow spaces\n if (event.key === ' ') {\n return;\n }\n\n // don't bubble if there is a search value, it would prevent cursor navigation inside the input\n if ((event.key === 'ArrowLeft' || event.key === 'ArrowRight') && event.currentTarget.value.length) {\n event.stopPropagation();\n }\n\n if (isAriaSelectionKey(event) || event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n // forward navigation events onto the underlying collection - we want arrow keys to work from inside the filter input\n listboxRef?.current?.dispatchEvent(createCustomKeyboardEvent(event));\n }\n };\n\n return (\n <Field\n // oxlint-disable-next-line taco/no-component-margin -- grandfathered; removing this margin is a visual breaking change\n className={cn('mx-1.5 mb-1.5 !min-h-fit', { '!pb-0': !validationError })}\n invalid={!!validationError}\n message={validationError?.message}>\n <Input\n {...props}\n invalid={!!validationError}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n ref={ref}\n value={searchQuery}\n />\n </Field>\n );\n});\n"],"names":["React"],"mappings":";;;;;;;AAUO,MAAM,SAASA,eAAM,WAAyC,SAAS,cAAc,OAAO,KAAK;AACpG,QAAM,EAAE,YAAY,aAAa,gBAAgB,oBAAoB,gBAAA,IAAoB,kBAAA;AAEzF,QAAM,eAAe,CAAC,UAA+C;AACjE,QAAI,iBAAiB;AACjB,yBAAmB,MAAS;AAAA,IAChC;AAEA,mBAAe,MAAM,OAAO,KAAK;AAAA,EACrC;AAEA,QAAM,gBAAgB,CAAC,UAAiD;AAEpE,QAAI,MAAM,QAAQ,KAAK;AACnB;AAAA,IACJ;AAGA,SAAK,MAAM,QAAQ,eAAe,MAAM,QAAQ,iBAAiB,MAAM,cAAc,MAAM,QAAQ;AAC/F,YAAM,gBAAA;AAAA,IACV;AAEA,QAAI,mBAAmB,KAAK,KAAK,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAW;AACnF,YAAM,eAAA;AAEN,kBAAY,SAAS,cAAc,0BAA0B,KAAK,CAAC;AAAA,IACvE;AAAA,EACJ;AAEA,SACIA,+BAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEG,WAAW,GAAG,4BAA4B,EAAE,SAAS,CAAC,iBAAiB;AAAA,MACvE,SAAS,CAAC,CAAC;AAAA,MACX,SAAS,iBAAiB;AAAA,IAAA;AAAA,IAC1BA,+BAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ,SAAS,CAAC,CAAC;AAAA,QACX,UAAU;AAAA,QACV,WAAW;AAAA,QACX;AAAA,QACA,OAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EACX;AAGZ,CAAC;"}
|
|
@@ -99,7 +99,7 @@ const Single = React.forwardRef(function Select2TriggerSingle(props, ref) {
|
|
|
99
99
|
const { children, emptyValue, value, placeholder, ...buttonProps } = props;
|
|
100
100
|
const { disabled, readOnly, tags } = Context.useSelect2Context();
|
|
101
101
|
const contentClassName = cn("flex items-center gap-1 truncate");
|
|
102
|
-
const currentValue = children.find(matchesValue(value));
|
|
102
|
+
const currentValue = children.find((child) => matchesValue(value)(child));
|
|
103
103
|
let output;
|
|
104
104
|
if (placeholder && currentValue === void 0) {
|
|
105
105
|
output = /* @__PURE__ */ React.createElement(Placeholder, { disabled, readOnly }, placeholder);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Trigger.cjs","sources":["../../../../src/components/Select2/components/Trigger.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { BadgeProps } from '@/components';\nimport { Badge, Icon, Tag, Tooltip } from '@/components';\nimport { getInputClasses } from '@/components/Input/util';\nimport { ScrollArea } from '@/components/ScrollArea/ScrollArea';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { getIndexOfFirstChildOverflowingParent, isElementInsideOrTriggeredFromContainer } from '@/utils/dom';\n\nimport type { Select2OptionValue } from '../types';\nimport { FONT_SIZE_CLASSNAME } from '../utilities';\n\nimport { useSelect2Context } from './Context';\nimport type { Select2OptionProps } from './Option';\n\ntype Select2TriggerProps = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n emptyValue?: Select2OptionValue;\n placeholder?: string;\n children: React.ReactElement<Select2OptionProps>[];\n};\n\ntype PlaceholderProps = React.PropsWithChildren<{\n disabled: boolean;\n readOnly: boolean;\n}>;\n\nconst Placeholder = ({ disabled, readOnly, ...props }: PlaceholderProps) => {\n if (readOnly) {\n return null;\n }\n return (\n <div\n {...props}\n className={cn({ 'text-gray-500': disabled, 'text-gray-700': !disabled })}\n data-taco=\"select2-placeholder\"\n />\n );\n};\n\nexport const Trigger = React.forwardRef<HTMLButtonElement, Select2TriggerProps>(function Select2Trigger(props, ref) {\n const { multiple, value } = useSelect2Context();\n\n if (Array.isArray(value) || multiple) {\n const values = Array.isArray(value) ? value : value === undefined ? undefined : [value];\n return <Multiple {...props} ref={ref} values={values} />;\n }\n\n return <Single {...props} ref={ref} value={value} />;\n});\n\ntype ButtonProps = React.HTMLAttributes<HTMLButtonElement> &\n Omit<Select2TriggerProps, 'children' | 'open' | 'setValue' | 'value'>;\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Select2TriggerButton(props, ref) {\n const { children, onBlur, onClick, onFocus, tabIndex = 0, ...otherProps } = props;\n const { disabled, fontSize = 'medium', highlighted, invalid, open, readOnly } = useSelect2Context();\n\n const className = cn(\n 'h-fit px-1.5',\n getInputClasses({ ...props, disabled, highlighted, invalid, readOnly })\n .replace('w-full', '')\n .replace('px-2', ''),\n FONT_SIZE_CLASSNAME[fontSize],\n {\n 'select-text': readOnly,\n 'w-full': !props.className?.includes('w-'),\n },\n props.className\n );\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) {\n event.preventDefault();\n return;\n }\n\n if (typeof onClick === 'function') {\n onClick(event);\n }\n };\n\n let handleBlur;\n\n if (typeof onBlur === 'function') {\n // we might be focusing on an input or something inside the dropdown that was triggered by the select\n // so see if the element gaining focus is inside a portal and look up its controller\n // if we don't do this, things like validate on blur occur while simply opening the select\n handleBlur = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget)) {\n return;\n }\n\n onBlur(event);\n };\n }\n\n // select the value text if the select is readonly\n const handleFocus = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (readOnly) {\n const value = event.currentTarget.querySelector(':first-child');\n\n if (value) {\n window.getSelection()?.selectAllChildren?.(value);\n }\n }\n\n if (typeof onFocus === 'function') {\n onFocus(event);\n }\n };\n\n return (\n <button\n {...otherProps}\n aria-invalid={invalid ? true : undefined}\n aria-readonly={readOnly ? true : undefined}\n className={className}\n disabled={disabled}\n onClick={handleClick}\n onBlur={handleBlur}\n onFocus={handleFocus}\n ref={ref}\n role=\"combobox\"\n tabIndex={disabled ? -1 : tabIndex}\n type=\"button\">\n {children}\n {readOnly ? null : <Icon name={open ? 'chevron-up' : 'chevron-down'} className=\"pointer-events-none -mr-1 ml-auto\" />}\n </button>\n );\n});\n\ntype SingleProps = Omit<Select2TriggerProps, 'value'> & { value?: Select2OptionValue; placeholder?: string };\n\nconst Single = React.forwardRef<HTMLButtonElement, SingleProps>(function Select2TriggerSingle(props, ref) {\n const { children, emptyValue, value, placeholder, ...buttonProps } = props;\n const { disabled, readOnly, tags } = useSelect2Context();\n const contentClassName = cn('flex items-center gap-1 truncate');\n\n const currentValue = children.find(matchesValue(value));\n\n let output;\n\n if (placeholder && currentValue === undefined) {\n output = (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n );\n } else if (currentValue) {\n if (tags && emptyValue !== value) {\n if (typeof currentValue.props.children === 'string')\n output = (\n <Tag\n className=\"truncate\"\n color={currentValue.props.color}\n disabled={disabled}\n icon={currentValue.props.prefix}\n readOnly={readOnly}>\n {currentValue.props.children}\n </Tag>\n );\n else output = currentValue.props.children;\n } else {\n output = (\n <>\n {currentValue.props.prefix ? (\n typeof currentValue.props.prefix === 'string' ? (\n <Icon name={currentValue.props.prefix} className=\"mr-1 !h-5 !w-5\" />\n ) : (\n currentValue.props.prefix\n )\n ) : null}\n {currentValue.props.children}\n </>\n );\n }\n }\n\n return (\n <Button {...buttonProps} ref={ref}>\n <div className={contentClassName} data-taco={placeholder ? undefined : 'select2-value'}>\n {output}\n </div>\n </Button>\n );\n});\n\ntype MultipleProps = Omit<Select2TriggerProps, 'value'> & {\n values?: Select2OptionValue[];\n};\n\nconst Multiple = React.forwardRef<HTMLButtonElement, MultipleProps>(function Select2TriggerMultiple(props, ref) {\n const { children, emptyValue: _, values = [], placeholder, ...buttonProps } = props;\n const { disabled, open, readOnly, setValue, tags } = useSelect2Context();\n const buttonRef = useMergedRef<HTMLButtonElement>(ref);\n\n const valuesAsChildren = values\n .map(value => children.find(c => c.props.value === value))\n .filter(c => !!c) as React.ReactElement<Select2OptionProps>[];\n\n const forwardClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n buttonRef.current?.click();\n };\n\n let content;\n let { className } = buttonProps;\n\n if (open) {\n const hasValues = valuesAsChildren.length > 0;\n className = cn('!absolute z-20 !h-fit', buttonProps.className);\n content = (\n <ScrollArea className=\"my-1 flex max-h-[5.5rem] flex-col\" onClick={forwardClick}>\n <div className=\"flex flex-wrap gap-1\" data-taco=\"select2-value\">\n {hasValues ? (\n valuesAsChildren.map(child =>\n typeof child.props.children === 'string' ? (\n <Tag\n key={String(child.props.value)}\n className=\"truncate\"\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n onDelete={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n ) : (\n React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n children: BadgeProps['children'];\n className: BadgeProps['className'];\n }\n >,\n {\n key: String(child.props.value),\n className: '!pr-0 !pl-1.5',\n children: (\n <span className=\"flex items-center\" data-taco=\"select2-value\">\n {\n (child.props.children as React.ReactElement<{ children?: React.ReactNode }>)\n .props.children\n }\n <Icon\n name=\"close\"\n onClick={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n className=\"ml-0.5 !h-5 !w-5 shrink-0 cursor-pointer rounded-r p-0.5 hover:bg-black/5\"\n />\n </span>\n ),\n }\n )\n )\n )\n ) : (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n )}\n </div>\n </ScrollArea>\n );\n } else {\n content = <MultipleValue onClick={forwardClick} valuesAsChildren={valuesAsChildren} placeholder={placeholder} />;\n }\n\n return (\n <div\n className=\"relative inline-flex h-fit flex-grow\"\n data-taco=\"select2-container\"\n style={{ width: open ? buttonRef.current?.offsetWidth : undefined }}>\n <Button {...buttonProps} className={className} ref={buttonRef}>\n {content}\n </Button>\n </div>\n );\n});\n\ntype MultipleValueProps = Omit<Select2TriggerProps, 'value' | 'children' | 'onClick'> & {\n valuesAsChildren: React.ReactElement<Select2OptionProps>[];\n placeholder?: string;\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nconst MultipleValue = ({ onClick, valuesAsChildren, placeholder }: MultipleValueProps) => {\n const { disabled, readOnly, tags } = useSelect2Context();\n const [contentRef, setContentRef] = React.useState<HTMLDivElement | null>(null);\n const boundaryIndex = contentRef ? getIndexOfFirstChildOverflowingParent(contentRef, 30) : undefined;\n\n // Retrieves the relevant text content from any React.JSX.Element passed as a select option, handling nested elements, arrays, and direct text\n const getTooltipTitle = (child: React.ReactElement<{ children?: React.ReactNode }>): string | string[] => {\n const children = child.props.children;\n\n if (typeof children === 'string') return children;\n\n if (React.isValidElement<{ children?: React.ReactNode }>(children)) {\n const nested = children.props.children;\n\n if (typeof nested === 'string') return nested;\n\n if (Array.isArray(nested)) {\n return nested.filter((item: React.ReactNode) => typeof item === 'string');\n }\n }\n\n return '';\n };\n\n return (\n <div className=\"relative flex w-full items-center gap-1 overflow-hidden\" onClick={onClick}>\n <div className=\"flex flex-1 gap-1 truncate\" ref={ref => setContentRef(ref)} data-taco=\"select2-value\">\n {valuesAsChildren.length === 0 ? (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n ) : (\n valuesAsChildren.map((child, index) => {\n const classNames = {\n truncate: index === boundaryIndex,\n hidden: boundaryIndex !== undefined && boundaryIndex !== null ? index > boundaryIndex : false,\n };\n let output;\n if (typeof child.props.children === 'string') {\n output = (\n <Tag\n key={String(child.props.value)}\n className={cn('cursor-pointer', classNames)}\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n );\n } else\n output = React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n className: BadgeProps['className'];\n }\n >,\n {\n className: cn('cursor-pointer', { 'shrink-0': index !== boundaryIndex }, classNames),\n key: String(child.props.value),\n }\n );\n\n if (index === boundaryIndex) {\n return (\n <Tooltip key={String(child.props.value)} title={String(getTooltipTitle(child))}>\n {output}\n </Tooltip>\n );\n }\n\n return output;\n })\n )}\n </div>\n\n {boundaryIndex !== undefined && boundaryIndex !== null && boundaryIndex < valuesAsChildren.length - 1 ? (\n <Tooltip\n title={valuesAsChildren\n .slice(boundaryIndex + 1)\n .map(child => (child ? String(getTooltipTitle(child)) : ''))\n .join(', ')}>\n <Badge className=\"flex-shrink-0\">+{valuesAsChildren.length - (boundaryIndex + 1)}</Badge>\n </Tooltip>\n ) : null}\n </div>\n );\n};\n\nconst matchesValue = (value: undefined | any | any[]) => (child: React.ReactElement<any>) => {\n if (Array.isArray(value)) {\n return value.includes(child.props.value);\n }\n\n return child.props.value === value;\n};\n"],"names":["useSelect2Context","getInputClasses","FONT_SIZE_CLASSNAME","isElementInsideOrTriggeredFromContainer","Icon","Tag","useMergedRef","ScrollArea","getIndexOfFirstChildOverflowingParent","Tooltip","Badge"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Trigger.cjs","sources":["../../../../src/components/Select2/components/Trigger.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { BadgeProps } from '@/components';\nimport { Badge, Icon, Tag, Tooltip } from '@/components';\nimport { getInputClasses } from '@/components/Input/util';\nimport { ScrollArea } from '@/components/ScrollArea/ScrollArea';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { getIndexOfFirstChildOverflowingParent, isElementInsideOrTriggeredFromContainer } from '@/utils/dom';\n\nimport type { Select2OptionValue } from '../types';\nimport { FONT_SIZE_CLASSNAME } from '../utilities';\n\nimport { useSelect2Context } from './Context';\nimport type { Select2OptionProps } from './Option';\n\ntype Select2TriggerProps = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n emptyValue?: Select2OptionValue;\n placeholder?: string;\n children: React.ReactElement<Select2OptionProps>[];\n};\n\ntype PlaceholderProps = React.PropsWithChildren<{\n disabled: boolean;\n readOnly: boolean;\n}>;\n\nconst Placeholder = ({ disabled, readOnly, ...props }: PlaceholderProps) => {\n if (readOnly) {\n return null;\n }\n return (\n <div\n {...props}\n className={cn({ 'text-gray-500': disabled, 'text-gray-700': !disabled })}\n data-taco=\"select2-placeholder\"\n />\n );\n};\n\nexport const Trigger = React.forwardRef<HTMLButtonElement, Select2TriggerProps>(function Select2Trigger(props, ref) {\n const { multiple, value } = useSelect2Context();\n\n if (Array.isArray(value) || multiple) {\n const values = Array.isArray(value) ? value : value === undefined ? undefined : [value];\n return <Multiple {...props} ref={ref} values={values} />;\n }\n\n return <Single {...props} ref={ref} value={value} />;\n});\n\ntype ButtonProps = React.HTMLAttributes<HTMLButtonElement> &\n Omit<Select2TriggerProps, 'children' | 'open' | 'setValue' | 'value'>;\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Select2TriggerButton(props, ref) {\n const { children, onBlur, onClick, onFocus, tabIndex = 0, ...otherProps } = props;\n const { disabled, fontSize = 'medium', highlighted, invalid, open, readOnly } = useSelect2Context();\n\n const className = cn(\n 'h-fit px-1.5',\n getInputClasses({ ...props, disabled, highlighted, invalid, readOnly })\n .replace('w-full', '')\n .replace('px-2', ''),\n FONT_SIZE_CLASSNAME[fontSize],\n {\n 'select-text': readOnly,\n 'w-full': !props.className?.includes('w-'),\n },\n props.className\n );\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) {\n event.preventDefault();\n return;\n }\n\n if (typeof onClick === 'function') {\n onClick(event);\n }\n };\n\n let handleBlur;\n\n if (typeof onBlur === 'function') {\n // we might be focusing on an input or something inside the dropdown that was triggered by the select\n // so see if the element gaining focus is inside a portal and look up its controller\n // if we don't do this, things like validate on blur occur while simply opening the select\n handleBlur = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget)) {\n return;\n }\n\n onBlur(event);\n };\n }\n\n // select the value text if the select is readonly\n const handleFocus = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (readOnly) {\n const value = event.currentTarget.querySelector(':first-child');\n\n if (value) {\n window.getSelection()?.selectAllChildren?.(value);\n }\n }\n\n if (typeof onFocus === 'function') {\n onFocus(event);\n }\n };\n\n return (\n <button\n {...otherProps}\n aria-invalid={invalid ? true : undefined}\n aria-readonly={readOnly ? true : undefined}\n className={className}\n disabled={disabled}\n onClick={handleClick}\n onBlur={handleBlur}\n onFocus={handleFocus}\n ref={ref}\n role=\"combobox\"\n tabIndex={disabled ? -1 : tabIndex}\n type=\"button\">\n {children}\n {readOnly ? null : <Icon name={open ? 'chevron-up' : 'chevron-down'} className=\"pointer-events-none -mr-1 ml-auto\" />}\n </button>\n );\n});\n\ntype SingleProps = Omit<Select2TriggerProps, 'value'> & { value?: Select2OptionValue; placeholder?: string };\n\nconst Single = React.forwardRef<HTMLButtonElement, SingleProps>(function Select2TriggerSingle(props, ref) {\n const { children, emptyValue, value, placeholder, ...buttonProps } = props;\n const { disabled, readOnly, tags } = useSelect2Context();\n const contentClassName = cn('flex items-center gap-1 truncate');\n\n const currentValue = children.find(child => matchesValue(value)(child));\n\n let output;\n\n if (placeholder && currentValue === undefined) {\n output = (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n );\n } else if (currentValue) {\n if (tags && emptyValue !== value) {\n if (typeof currentValue.props.children === 'string')\n output = (\n <Tag\n className=\"truncate\"\n color={currentValue.props.color}\n disabled={disabled}\n icon={currentValue.props.prefix}\n readOnly={readOnly}>\n {currentValue.props.children}\n </Tag>\n );\n else output = currentValue.props.children;\n } else {\n output = (\n <>\n {currentValue.props.prefix ? (\n typeof currentValue.props.prefix === 'string' ? (\n <Icon name={currentValue.props.prefix} className=\"mr-1 !h-5 !w-5\" />\n ) : (\n currentValue.props.prefix\n )\n ) : null}\n {currentValue.props.children}\n </>\n );\n }\n }\n\n return (\n <Button {...buttonProps} ref={ref}>\n <div className={contentClassName} data-taco={placeholder ? undefined : 'select2-value'}>\n {output}\n </div>\n </Button>\n );\n});\n\ntype MultipleProps = Omit<Select2TriggerProps, 'value'> & {\n values?: Select2OptionValue[];\n};\n\nconst Multiple = React.forwardRef<HTMLButtonElement, MultipleProps>(function Select2TriggerMultiple(props, ref) {\n const { children, emptyValue: _, values = [], placeholder, ...buttonProps } = props;\n const { disabled, open, readOnly, setValue, tags } = useSelect2Context();\n const buttonRef = useMergedRef<HTMLButtonElement>(ref);\n\n const valuesAsChildren = values\n .map(value => children.find(c => c.props.value === value))\n .filter(c => !!c) as React.ReactElement<Select2OptionProps>[];\n\n const forwardClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n buttonRef.current?.click();\n };\n\n let content;\n let { className } = buttonProps;\n\n if (open) {\n const hasValues = valuesAsChildren.length > 0;\n className = cn('!absolute z-20 !h-fit', buttonProps.className);\n content = (\n <ScrollArea className=\"my-1 flex max-h-[5.5rem] flex-col\" onClick={forwardClick}>\n <div className=\"flex flex-wrap gap-1\" data-taco=\"select2-value\">\n {hasValues ? (\n valuesAsChildren.map(child =>\n typeof child.props.children === 'string' ? (\n <Tag\n key={String(child.props.value)}\n className=\"truncate\"\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n onDelete={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n ) : (\n React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n children: BadgeProps['children'];\n className: BadgeProps['className'];\n }\n >,\n {\n key: String(child.props.value),\n className: '!pr-0 !pl-1.5',\n children: (\n <span className=\"flex items-center\" data-taco=\"select2-value\">\n {\n (child.props.children as React.ReactElement<{ children?: React.ReactNode }>)\n .props.children\n }\n <Icon\n name=\"close\"\n onClick={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n className=\"ml-0.5 !h-5 !w-5 shrink-0 cursor-pointer rounded-r p-0.5 hover:bg-black/5\"\n />\n </span>\n ),\n }\n )\n )\n )\n ) : (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n )}\n </div>\n </ScrollArea>\n );\n } else {\n content = <MultipleValue onClick={forwardClick} valuesAsChildren={valuesAsChildren} placeholder={placeholder} />;\n }\n\n return (\n <div\n className=\"relative inline-flex h-fit flex-grow\"\n data-taco=\"select2-container\"\n style={{ width: open ? buttonRef.current?.offsetWidth : undefined }}>\n <Button {...buttonProps} className={className} ref={buttonRef}>\n {content}\n </Button>\n </div>\n );\n});\n\ntype MultipleValueProps = Omit<Select2TriggerProps, 'value' | 'children' | 'onClick'> & {\n valuesAsChildren: React.ReactElement<Select2OptionProps>[];\n placeholder?: string;\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nconst MultipleValue = ({ onClick, valuesAsChildren, placeholder }: MultipleValueProps) => {\n const { disabled, readOnly, tags } = useSelect2Context();\n const [contentRef, setContentRef] = React.useState<HTMLDivElement | null>(null);\n const boundaryIndex = contentRef ? getIndexOfFirstChildOverflowingParent(contentRef, 30) : undefined;\n\n // Retrieves the relevant text content from any React.JSX.Element passed as a select option, handling nested elements, arrays, and direct text\n const getTooltipTitle = (child: React.ReactElement<{ children?: React.ReactNode }>): string | string[] => {\n const children = child.props.children;\n\n if (typeof children === 'string') return children;\n\n if (React.isValidElement<{ children?: React.ReactNode }>(children)) {\n const nested = children.props.children;\n\n if (typeof nested === 'string') return nested;\n\n if (Array.isArray(nested)) {\n return nested.filter((item: React.ReactNode) => typeof item === 'string');\n }\n }\n\n return '';\n };\n\n return (\n <div className=\"relative flex w-full items-center gap-1 overflow-hidden\" onClick={onClick}>\n <div className=\"flex flex-1 gap-1 truncate\" ref={ref => setContentRef(ref)} data-taco=\"select2-value\">\n {valuesAsChildren.length === 0 ? (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n ) : (\n valuesAsChildren.map((child, index) => {\n const classNames = {\n truncate: index === boundaryIndex,\n hidden: boundaryIndex !== undefined && boundaryIndex !== null ? index > boundaryIndex : false,\n };\n let output;\n if (typeof child.props.children === 'string') {\n output = (\n <Tag\n key={String(child.props.value)}\n className={cn('cursor-pointer', classNames)}\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n );\n } else\n output = React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n className: BadgeProps['className'];\n }\n >,\n {\n className: cn('cursor-pointer', { 'shrink-0': index !== boundaryIndex }, classNames),\n key: String(child.props.value),\n }\n );\n\n if (index === boundaryIndex) {\n return (\n <Tooltip key={String(child.props.value)} title={String(getTooltipTitle(child))}>\n {output}\n </Tooltip>\n );\n }\n\n return output;\n })\n )}\n </div>\n\n {boundaryIndex !== undefined && boundaryIndex !== null && boundaryIndex < valuesAsChildren.length - 1 ? (\n <Tooltip\n title={valuesAsChildren\n .slice(boundaryIndex + 1)\n .map(child => (child ? String(getTooltipTitle(child)) : ''))\n .join(', ')}>\n <Badge className=\"flex-shrink-0\">+{valuesAsChildren.length - (boundaryIndex + 1)}</Badge>\n </Tooltip>\n ) : null}\n </div>\n );\n};\n\nconst matchesValue = (value: undefined | any | any[]) => (child: React.ReactElement<any>) => {\n if (Array.isArray(value)) {\n return value.includes(child.props.value);\n }\n\n return child.props.value === value;\n};\n"],"names":["useSelect2Context","getInputClasses","FONT_SIZE_CLASSNAME","isElementInsideOrTriggeredFromContainer","Icon","Tag","useMergedRef","ScrollArea","getIndexOfFirstChildOverflowingParent","Tooltip","Badge"],"mappings":"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"}
|
|
@@ -97,7 +97,7 @@ const Single = React__default.forwardRef(function Select2TriggerSingle(props, re
|
|
|
97
97
|
const { children, emptyValue, value, placeholder, ...buttonProps } = props;
|
|
98
98
|
const { disabled, readOnly, tags } = useSelect2Context();
|
|
99
99
|
const contentClassName = cn("flex items-center gap-1 truncate");
|
|
100
|
-
const currentValue = children.find(matchesValue(value));
|
|
100
|
+
const currentValue = children.find((child) => matchesValue(value)(child));
|
|
101
101
|
let output;
|
|
102
102
|
if (placeholder && currentValue === void 0) {
|
|
103
103
|
output = /* @__PURE__ */ React__default.createElement(Placeholder, { disabled, readOnly }, placeholder);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Trigger.js","sources":["../../../../src/components/Select2/components/Trigger.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { BadgeProps } from '@/components';\nimport { Badge, Icon, Tag, Tooltip } from '@/components';\nimport { getInputClasses } from '@/components/Input/util';\nimport { ScrollArea } from '@/components/ScrollArea/ScrollArea';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { getIndexOfFirstChildOverflowingParent, isElementInsideOrTriggeredFromContainer } from '@/utils/dom';\n\nimport type { Select2OptionValue } from '../types';\nimport { FONT_SIZE_CLASSNAME } from '../utilities';\n\nimport { useSelect2Context } from './Context';\nimport type { Select2OptionProps } from './Option';\n\ntype Select2TriggerProps = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n emptyValue?: Select2OptionValue;\n placeholder?: string;\n children: React.ReactElement<Select2OptionProps>[];\n};\n\ntype PlaceholderProps = React.PropsWithChildren<{\n disabled: boolean;\n readOnly: boolean;\n}>;\n\nconst Placeholder = ({ disabled, readOnly, ...props }: PlaceholderProps) => {\n if (readOnly) {\n return null;\n }\n return (\n <div\n {...props}\n className={cn({ 'text-gray-500': disabled, 'text-gray-700': !disabled })}\n data-taco=\"select2-placeholder\"\n />\n );\n};\n\nexport const Trigger = React.forwardRef<HTMLButtonElement, Select2TriggerProps>(function Select2Trigger(props, ref) {\n const { multiple, value } = useSelect2Context();\n\n if (Array.isArray(value) || multiple) {\n const values = Array.isArray(value) ? value : value === undefined ? undefined : [value];\n return <Multiple {...props} ref={ref} values={values} />;\n }\n\n return <Single {...props} ref={ref} value={value} />;\n});\n\ntype ButtonProps = React.HTMLAttributes<HTMLButtonElement> &\n Omit<Select2TriggerProps, 'children' | 'open' | 'setValue' | 'value'>;\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Select2TriggerButton(props, ref) {\n const { children, onBlur, onClick, onFocus, tabIndex = 0, ...otherProps } = props;\n const { disabled, fontSize = 'medium', highlighted, invalid, open, readOnly } = useSelect2Context();\n\n const className = cn(\n 'h-fit px-1.5',\n getInputClasses({ ...props, disabled, highlighted, invalid, readOnly })\n .replace('w-full', '')\n .replace('px-2', ''),\n FONT_SIZE_CLASSNAME[fontSize],\n {\n 'select-text': readOnly,\n 'w-full': !props.className?.includes('w-'),\n },\n props.className\n );\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) {\n event.preventDefault();\n return;\n }\n\n if (typeof onClick === 'function') {\n onClick(event);\n }\n };\n\n let handleBlur;\n\n if (typeof onBlur === 'function') {\n // we might be focusing on an input or something inside the dropdown that was triggered by the select\n // so see if the element gaining focus is inside a portal and look up its controller\n // if we don't do this, things like validate on blur occur while simply opening the select\n handleBlur = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget)) {\n return;\n }\n\n onBlur(event);\n };\n }\n\n // select the value text if the select is readonly\n const handleFocus = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (readOnly) {\n const value = event.currentTarget.querySelector(':first-child');\n\n if (value) {\n window.getSelection()?.selectAllChildren?.(value);\n }\n }\n\n if (typeof onFocus === 'function') {\n onFocus(event);\n }\n };\n\n return (\n <button\n {...otherProps}\n aria-invalid={invalid ? true : undefined}\n aria-readonly={readOnly ? true : undefined}\n className={className}\n disabled={disabled}\n onClick={handleClick}\n onBlur={handleBlur}\n onFocus={handleFocus}\n ref={ref}\n role=\"combobox\"\n tabIndex={disabled ? -1 : tabIndex}\n type=\"button\">\n {children}\n {readOnly ? null : <Icon name={open ? 'chevron-up' : 'chevron-down'} className=\"pointer-events-none -mr-1 ml-auto\" />}\n </button>\n );\n});\n\ntype SingleProps = Omit<Select2TriggerProps, 'value'> & { value?: Select2OptionValue; placeholder?: string };\n\nconst Single = React.forwardRef<HTMLButtonElement, SingleProps>(function Select2TriggerSingle(props, ref) {\n const { children, emptyValue, value, placeholder, ...buttonProps } = props;\n const { disabled, readOnly, tags } = useSelect2Context();\n const contentClassName = cn('flex items-center gap-1 truncate');\n\n const currentValue = children.find(matchesValue(value));\n\n let output;\n\n if (placeholder && currentValue === undefined) {\n output = (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n );\n } else if (currentValue) {\n if (tags && emptyValue !== value) {\n if (typeof currentValue.props.children === 'string')\n output = (\n <Tag\n className=\"truncate\"\n color={currentValue.props.color}\n disabled={disabled}\n icon={currentValue.props.prefix}\n readOnly={readOnly}>\n {currentValue.props.children}\n </Tag>\n );\n else output = currentValue.props.children;\n } else {\n output = (\n <>\n {currentValue.props.prefix ? (\n typeof currentValue.props.prefix === 'string' ? (\n <Icon name={currentValue.props.prefix} className=\"mr-1 !h-5 !w-5\" />\n ) : (\n currentValue.props.prefix\n )\n ) : null}\n {currentValue.props.children}\n </>\n );\n }\n }\n\n return (\n <Button {...buttonProps} ref={ref}>\n <div className={contentClassName} data-taco={placeholder ? undefined : 'select2-value'}>\n {output}\n </div>\n </Button>\n );\n});\n\ntype MultipleProps = Omit<Select2TriggerProps, 'value'> & {\n values?: Select2OptionValue[];\n};\n\nconst Multiple = React.forwardRef<HTMLButtonElement, MultipleProps>(function Select2TriggerMultiple(props, ref) {\n const { children, emptyValue: _, values = [], placeholder, ...buttonProps } = props;\n const { disabled, open, readOnly, setValue, tags } = useSelect2Context();\n const buttonRef = useMergedRef<HTMLButtonElement>(ref);\n\n const valuesAsChildren = values\n .map(value => children.find(c => c.props.value === value))\n .filter(c => !!c) as React.ReactElement<Select2OptionProps>[];\n\n const forwardClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n buttonRef.current?.click();\n };\n\n let content;\n let { className } = buttonProps;\n\n if (open) {\n const hasValues = valuesAsChildren.length > 0;\n className = cn('!absolute z-20 !h-fit', buttonProps.className);\n content = (\n <ScrollArea className=\"my-1 flex max-h-[5.5rem] flex-col\" onClick={forwardClick}>\n <div className=\"flex flex-wrap gap-1\" data-taco=\"select2-value\">\n {hasValues ? (\n valuesAsChildren.map(child =>\n typeof child.props.children === 'string' ? (\n <Tag\n key={String(child.props.value)}\n className=\"truncate\"\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n onDelete={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n ) : (\n React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n children: BadgeProps['children'];\n className: BadgeProps['className'];\n }\n >,\n {\n key: String(child.props.value),\n className: '!pr-0 !pl-1.5',\n children: (\n <span className=\"flex items-center\" data-taco=\"select2-value\">\n {\n (child.props.children as React.ReactElement<{ children?: React.ReactNode }>)\n .props.children\n }\n <Icon\n name=\"close\"\n onClick={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n className=\"ml-0.5 !h-5 !w-5 shrink-0 cursor-pointer rounded-r p-0.5 hover:bg-black/5\"\n />\n </span>\n ),\n }\n )\n )\n )\n ) : (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n )}\n </div>\n </ScrollArea>\n );\n } else {\n content = <MultipleValue onClick={forwardClick} valuesAsChildren={valuesAsChildren} placeholder={placeholder} />;\n }\n\n return (\n <div\n className=\"relative inline-flex h-fit flex-grow\"\n data-taco=\"select2-container\"\n style={{ width: open ? buttonRef.current?.offsetWidth : undefined }}>\n <Button {...buttonProps} className={className} ref={buttonRef}>\n {content}\n </Button>\n </div>\n );\n});\n\ntype MultipleValueProps = Omit<Select2TriggerProps, 'value' | 'children' | 'onClick'> & {\n valuesAsChildren: React.ReactElement<Select2OptionProps>[];\n placeholder?: string;\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nconst MultipleValue = ({ onClick, valuesAsChildren, placeholder }: MultipleValueProps) => {\n const { disabled, readOnly, tags } = useSelect2Context();\n const [contentRef, setContentRef] = React.useState<HTMLDivElement | null>(null);\n const boundaryIndex = contentRef ? getIndexOfFirstChildOverflowingParent(contentRef, 30) : undefined;\n\n // Retrieves the relevant text content from any React.JSX.Element passed as a select option, handling nested elements, arrays, and direct text\n const getTooltipTitle = (child: React.ReactElement<{ children?: React.ReactNode }>): string | string[] => {\n const children = child.props.children;\n\n if (typeof children === 'string') return children;\n\n if (React.isValidElement<{ children?: React.ReactNode }>(children)) {\n const nested = children.props.children;\n\n if (typeof nested === 'string') return nested;\n\n if (Array.isArray(nested)) {\n return nested.filter((item: React.ReactNode) => typeof item === 'string');\n }\n }\n\n return '';\n };\n\n return (\n <div className=\"relative flex w-full items-center gap-1 overflow-hidden\" onClick={onClick}>\n <div className=\"flex flex-1 gap-1 truncate\" ref={ref => setContentRef(ref)} data-taco=\"select2-value\">\n {valuesAsChildren.length === 0 ? (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n ) : (\n valuesAsChildren.map((child, index) => {\n const classNames = {\n truncate: index === boundaryIndex,\n hidden: boundaryIndex !== undefined && boundaryIndex !== null ? index > boundaryIndex : false,\n };\n let output;\n if (typeof child.props.children === 'string') {\n output = (\n <Tag\n key={String(child.props.value)}\n className={cn('cursor-pointer', classNames)}\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n );\n } else\n output = React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n className: BadgeProps['className'];\n }\n >,\n {\n className: cn('cursor-pointer', { 'shrink-0': index !== boundaryIndex }, classNames),\n key: String(child.props.value),\n }\n );\n\n if (index === boundaryIndex) {\n return (\n <Tooltip key={String(child.props.value)} title={String(getTooltipTitle(child))}>\n {output}\n </Tooltip>\n );\n }\n\n return output;\n })\n )}\n </div>\n\n {boundaryIndex !== undefined && boundaryIndex !== null && boundaryIndex < valuesAsChildren.length - 1 ? (\n <Tooltip\n title={valuesAsChildren\n .slice(boundaryIndex + 1)\n .map(child => (child ? String(getTooltipTitle(child)) : ''))\n .join(', ')}>\n <Badge className=\"flex-shrink-0\">+{valuesAsChildren.length - (boundaryIndex + 1)}</Badge>\n </Tooltip>\n ) : null}\n </div>\n );\n};\n\nconst matchesValue = (value: undefined | any | any[]) => (child: React.ReactElement<any>) => {\n if (Array.isArray(value)) {\n return value.includes(child.props.value);\n }\n\n return child.props.value === value;\n};\n"],"names":["React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Trigger.js","sources":["../../../../src/components/Select2/components/Trigger.tsx"],"sourcesContent":["import cn from 'clsx';\nimport React from 'react';\n\nimport type { BadgeProps } from '@/components';\nimport { Badge, Icon, Tag, Tooltip } from '@/components';\nimport { getInputClasses } from '@/components/Input/util';\nimport { ScrollArea } from '@/components/ScrollArea/ScrollArea';\nimport { useMergedRef } from '@/hooks/useMergedRef';\nimport { getIndexOfFirstChildOverflowingParent, isElementInsideOrTriggeredFromContainer } from '@/utils/dom';\n\nimport type { Select2OptionValue } from '../types';\nimport { FONT_SIZE_CLASSNAME } from '../utilities';\n\nimport { useSelect2Context } from './Context';\nimport type { Select2OptionProps } from './Option';\n\ntype Select2TriggerProps = Omit<React.HTMLAttributes<HTMLButtonElement>, 'children' | 'defaultValue' | 'onChange' | 'value'> & {\n emptyValue?: Select2OptionValue;\n placeholder?: string;\n children: React.ReactElement<Select2OptionProps>[];\n};\n\ntype PlaceholderProps = React.PropsWithChildren<{\n disabled: boolean;\n readOnly: boolean;\n}>;\n\nconst Placeholder = ({ disabled, readOnly, ...props }: PlaceholderProps) => {\n if (readOnly) {\n return null;\n }\n return (\n <div\n {...props}\n className={cn({ 'text-gray-500': disabled, 'text-gray-700': !disabled })}\n data-taco=\"select2-placeholder\"\n />\n );\n};\n\nexport const Trigger = React.forwardRef<HTMLButtonElement, Select2TriggerProps>(function Select2Trigger(props, ref) {\n const { multiple, value } = useSelect2Context();\n\n if (Array.isArray(value) || multiple) {\n const values = Array.isArray(value) ? value : value === undefined ? undefined : [value];\n return <Multiple {...props} ref={ref} values={values} />;\n }\n\n return <Single {...props} ref={ref} value={value} />;\n});\n\ntype ButtonProps = React.HTMLAttributes<HTMLButtonElement> &\n Omit<Select2TriggerProps, 'children' | 'open' | 'setValue' | 'value'>;\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(function Select2TriggerButton(props, ref) {\n const { children, onBlur, onClick, onFocus, tabIndex = 0, ...otherProps } = props;\n const { disabled, fontSize = 'medium', highlighted, invalid, open, readOnly } = useSelect2Context();\n\n const className = cn(\n 'h-fit px-1.5',\n getInputClasses({ ...props, disabled, highlighted, invalid, readOnly })\n .replace('w-full', '')\n .replace('px-2', ''),\n FONT_SIZE_CLASSNAME[fontSize],\n {\n 'select-text': readOnly,\n 'w-full': !props.className?.includes('w-'),\n },\n props.className\n );\n\n const handleClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n if (disabled || readOnly) {\n event.preventDefault();\n return;\n }\n\n if (typeof onClick === 'function') {\n onClick(event);\n }\n };\n\n let handleBlur;\n\n if (typeof onBlur === 'function') {\n // we might be focusing on an input or something inside the dropdown that was triggered by the select\n // so see if the element gaining focus is inside a portal and look up its controller\n // if we don't do this, things like validate on blur occur while simply opening the select\n handleBlur = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget)) {\n return;\n }\n\n onBlur(event);\n };\n }\n\n // select the value text if the select is readonly\n const handleFocus = (event: React.FocusEvent<HTMLButtonElement>) => {\n if (readOnly) {\n const value = event.currentTarget.querySelector(':first-child');\n\n if (value) {\n window.getSelection()?.selectAllChildren?.(value);\n }\n }\n\n if (typeof onFocus === 'function') {\n onFocus(event);\n }\n };\n\n return (\n <button\n {...otherProps}\n aria-invalid={invalid ? true : undefined}\n aria-readonly={readOnly ? true : undefined}\n className={className}\n disabled={disabled}\n onClick={handleClick}\n onBlur={handleBlur}\n onFocus={handleFocus}\n ref={ref}\n role=\"combobox\"\n tabIndex={disabled ? -1 : tabIndex}\n type=\"button\">\n {children}\n {readOnly ? null : <Icon name={open ? 'chevron-up' : 'chevron-down'} className=\"pointer-events-none -mr-1 ml-auto\" />}\n </button>\n );\n});\n\ntype SingleProps = Omit<Select2TriggerProps, 'value'> & { value?: Select2OptionValue; placeholder?: string };\n\nconst Single = React.forwardRef<HTMLButtonElement, SingleProps>(function Select2TriggerSingle(props, ref) {\n const { children, emptyValue, value, placeholder, ...buttonProps } = props;\n const { disabled, readOnly, tags } = useSelect2Context();\n const contentClassName = cn('flex items-center gap-1 truncate');\n\n const currentValue = children.find(child => matchesValue(value)(child));\n\n let output;\n\n if (placeholder && currentValue === undefined) {\n output = (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n );\n } else if (currentValue) {\n if (tags && emptyValue !== value) {\n if (typeof currentValue.props.children === 'string')\n output = (\n <Tag\n className=\"truncate\"\n color={currentValue.props.color}\n disabled={disabled}\n icon={currentValue.props.prefix}\n readOnly={readOnly}>\n {currentValue.props.children}\n </Tag>\n );\n else output = currentValue.props.children;\n } else {\n output = (\n <>\n {currentValue.props.prefix ? (\n typeof currentValue.props.prefix === 'string' ? (\n <Icon name={currentValue.props.prefix} className=\"mr-1 !h-5 !w-5\" />\n ) : (\n currentValue.props.prefix\n )\n ) : null}\n {currentValue.props.children}\n </>\n );\n }\n }\n\n return (\n <Button {...buttonProps} ref={ref}>\n <div className={contentClassName} data-taco={placeholder ? undefined : 'select2-value'}>\n {output}\n </div>\n </Button>\n );\n});\n\ntype MultipleProps = Omit<Select2TriggerProps, 'value'> & {\n values?: Select2OptionValue[];\n};\n\nconst Multiple = React.forwardRef<HTMLButtonElement, MultipleProps>(function Select2TriggerMultiple(props, ref) {\n const { children, emptyValue: _, values = [], placeholder, ...buttonProps } = props;\n const { disabled, open, readOnly, setValue, tags } = useSelect2Context();\n const buttonRef = useMergedRef<HTMLButtonElement>(ref);\n\n const valuesAsChildren = values\n .map(value => children.find(c => c.props.value === value))\n .filter(c => !!c) as React.ReactElement<Select2OptionProps>[];\n\n const forwardClick = (event: React.MouseEvent<HTMLDivElement>) => {\n event.preventDefault();\n buttonRef.current?.click();\n };\n\n let content;\n let { className } = buttonProps;\n\n if (open) {\n const hasValues = valuesAsChildren.length > 0;\n className = cn('!absolute z-20 !h-fit', buttonProps.className);\n content = (\n <ScrollArea className=\"my-1 flex max-h-[5.5rem] flex-col\" onClick={forwardClick}>\n <div className=\"flex flex-wrap gap-1\" data-taco=\"select2-value\">\n {hasValues ? (\n valuesAsChildren.map(child =>\n typeof child.props.children === 'string' ? (\n <Tag\n key={String(child.props.value)}\n className=\"truncate\"\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n onDelete={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n ) : (\n React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n children: BadgeProps['children'];\n className: BadgeProps['className'];\n }\n >,\n {\n key: String(child.props.value),\n className: '!pr-0 !pl-1.5',\n children: (\n <span className=\"flex items-center\" data-taco=\"select2-value\">\n {\n (child.props.children as React.ReactElement<{ children?: React.ReactNode }>)\n .props.children\n }\n <Icon\n name=\"close\"\n onClick={event => {\n event?.stopPropagation();\n event?.preventDefault();\n\n if (!disabled && !readOnly) {\n setValue(child.props.value);\n }\n }}\n className=\"ml-0.5 !h-5 !w-5 shrink-0 cursor-pointer rounded-r p-0.5 hover:bg-black/5\"\n />\n </span>\n ),\n }\n )\n )\n )\n ) : (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n )}\n </div>\n </ScrollArea>\n );\n } else {\n content = <MultipleValue onClick={forwardClick} valuesAsChildren={valuesAsChildren} placeholder={placeholder} />;\n }\n\n return (\n <div\n className=\"relative inline-flex h-fit flex-grow\"\n data-taco=\"select2-container\"\n style={{ width: open ? buttonRef.current?.offsetWidth : undefined }}>\n <Button {...buttonProps} className={className} ref={buttonRef}>\n {content}\n </Button>\n </div>\n );\n});\n\ntype MultipleValueProps = Omit<Select2TriggerProps, 'value' | 'children' | 'onClick'> & {\n valuesAsChildren: React.ReactElement<Select2OptionProps>[];\n placeholder?: string;\n onClick?: (event: React.MouseEvent<HTMLDivElement>) => void;\n};\n\nconst MultipleValue = ({ onClick, valuesAsChildren, placeholder }: MultipleValueProps) => {\n const { disabled, readOnly, tags } = useSelect2Context();\n const [contentRef, setContentRef] = React.useState<HTMLDivElement | null>(null);\n const boundaryIndex = contentRef ? getIndexOfFirstChildOverflowingParent(contentRef, 30) : undefined;\n\n // Retrieves the relevant text content from any React.JSX.Element passed as a select option, handling nested elements, arrays, and direct text\n const getTooltipTitle = (child: React.ReactElement<{ children?: React.ReactNode }>): string | string[] => {\n const children = child.props.children;\n\n if (typeof children === 'string') return children;\n\n if (React.isValidElement<{ children?: React.ReactNode }>(children)) {\n const nested = children.props.children;\n\n if (typeof nested === 'string') return nested;\n\n if (Array.isArray(nested)) {\n return nested.filter((item: React.ReactNode) => typeof item === 'string');\n }\n }\n\n return '';\n };\n\n return (\n <div className=\"relative flex w-full items-center gap-1 overflow-hidden\" onClick={onClick}>\n <div className=\"flex flex-1 gap-1 truncate\" ref={ref => setContentRef(ref)} data-taco=\"select2-value\">\n {valuesAsChildren.length === 0 ? (\n <Placeholder disabled={disabled} readOnly={readOnly}>\n {placeholder}\n </Placeholder>\n ) : (\n valuesAsChildren.map((child, index) => {\n const classNames = {\n truncate: index === boundaryIndex,\n hidden: boundaryIndex !== undefined && boundaryIndex !== null ? index > boundaryIndex : false,\n };\n let output;\n if (typeof child.props.children === 'string') {\n output = (\n <Tag\n key={String(child.props.value)}\n className={cn('cursor-pointer', classNames)}\n color={tags ? child.props.color : undefined}\n disabled={disabled}\n icon={child.props.prefix}\n readOnly={readOnly}>\n {child.props.children}\n </Tag>\n );\n } else\n output = React.cloneElement(\n child.props.children as React.ReactElement<\n typeof Badge & {\n className: BadgeProps['className'];\n }\n >,\n {\n className: cn('cursor-pointer', { 'shrink-0': index !== boundaryIndex }, classNames),\n key: String(child.props.value),\n }\n );\n\n if (index === boundaryIndex) {\n return (\n <Tooltip key={String(child.props.value)} title={String(getTooltipTitle(child))}>\n {output}\n </Tooltip>\n );\n }\n\n return output;\n })\n )}\n </div>\n\n {boundaryIndex !== undefined && boundaryIndex !== null && boundaryIndex < valuesAsChildren.length - 1 ? (\n <Tooltip\n title={valuesAsChildren\n .slice(boundaryIndex + 1)\n .map(child => (child ? String(getTooltipTitle(child)) : ''))\n .join(', ')}>\n <Badge className=\"flex-shrink-0\">+{valuesAsChildren.length - (boundaryIndex + 1)}</Badge>\n </Tooltip>\n ) : null}\n </div>\n );\n};\n\nconst matchesValue = (value: undefined | any | any[]) => (child: React.ReactElement<any>) => {\n if (Array.isArray(value)) {\n return value.includes(child.props.value);\n }\n\n return child.props.value === value;\n};\n"],"names":["React"],"mappings":"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"}
|
|
@@ -167,7 +167,7 @@ const MemoedEditingCell = React.memo(function MemoedEditingCell2(props) {
|
|
|
167
167
|
}
|
|
168
168
|
return;
|
|
169
169
|
}
|
|
170
|
-
if (!keyboard.isPressingMetaKey(event) && (/^[a-z0-9]$/
|
|
170
|
+
if (!keyboard.isPressingMetaKey(event) && (/^[a-z0-9]$/iu.test(event.key) || event.key === "Backspace")) {
|
|
171
171
|
toggleDetailedMode(true);
|
|
172
172
|
}
|
|
173
173
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditingControlCell.cjs","sources":["../../../../../../src/components/Table3/components/Columns/Cell/EditingControlCell.tsx"],"sourcesContent":["import type { TableMeta as ReactTableMeta, ColumnMeta as ReactTableColumnMeta } from '@tanstack/react-table';\nimport { isDate, isEqual as isEqualDate, isSameDay } from 'date-fns';\nimport React from 'react';\n\nimport { Checkbox, Datepicker, Field, Input, useLocalization, Switch } from '@/components';\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { getCellAttributes } from '@/primitives/Table/Core/components/Columns/Cell/util';\nimport { RowContext } from '@/primitives/Table/Core/components/Row/RowContext';\nimport type { TableCellRendererProps } from '@/primitives/Table/Core/types';\nimport type { TableColumnDataType, TableColumnRendererControl, TableFontSize } from '@/primitives/Table/types';\nimport { getDataTypeProperties } from '@/primitives/Table/useTableManager/util/dataTypes';\nimport * as date from '@/utils/date';\nimport { isElementInsideOrTriggeredFromContainer } from '@/utils/dom';\nimport { isPressingMetaKey } from '@/utils/keyboard';\n\nimport { RowMoveIndicator } from './Editing/RowMoveIndicator';\nimport { TextareaWithAutosizing } from './Editing/TextareaWithAutosizing';\nimport { useEditingCellAutofocus } from './util';\n\nexport function EditingControlCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, isHighlighted, index } = props;\n const { rowIndex } = React.useContext(RowContext);\n const { table } = cell.getContext();\n const locale = useLocalization();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const columnMeta = cell.column.columnDef.meta as ReactTableColumnMeta<TType, unknown>;\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const type = columnMeta.control ?? 'input';\n const handleFocus = useEditingCellAutofocus<TType>(props);\n const value = cell.getValue();\n const rowChanges = tableMeta.editing.getRowValue(cell.row.id);\n const shouldRunUpdate = React.useRef(false);\n\n // some controls, like select2, should trigger cell changed (validation, updates) as the value changes\n const hasNonTextControl = React.useMemo(() => {\n return (\n typeof type === 'function' &&\n !!cellRef.current?.querySelector('[data-taco=\"Select2\"],[data-taco=\"switch\"],[data-taco=\"checkbox\"]')\n );\n }, [cellRef.current]);\n\n useLazyEffect(() => {\n // Use an effect instead of a change handler to prevent onEditingChange from running with a stale js closure during on-the-fly creation.\n if (hasNonTextControl && shouldRunUpdate.current) {\n tableMeta.editing.onCellChanged(cell, rowIndex, value, true, false);\n shouldRunUpdate.current = false; // prevent risk of infinite loop, in case there'd ever be an updater function with two values that update each other.\n }\n }, [value]);\n\n const handleChange = React.useCallback(\n (nextValue: unknown) => {\n let hasChanged = false;\n\n if (columnMeta.dataType === 'date') {\n hasChanged = !isSameDay(new Date(nextValue as string | Date), new Date(value as string | Date));\n } else if (columnMeta.dataType === 'datetime') {\n hasChanged = !isEqualDate(new Date(nextValue as string | Date), new Date(value as string | Date));\n } else if (columnMeta.dataType === 'time') {\n const next = new Date(nextValue as string | Date);\n const current = new Date(value as string | Date);\n hasChanged = !(next.getHours() === current.getHours() && next.getMinutes() === current.getMinutes());\n } else {\n hasChanged = nextValue !== value;\n }\n\n if (hasChanged) {\n tableMeta.editing.setCellValue(cell, rowIndex, nextValue);\n shouldRunUpdate.current = hasNonTextControl;\n }\n },\n [hasNonTextControl, cell.row.id, cell.column.id, cell.row.original, rowIndex, value, columnMeta.dataType]\n );\n\n const handleBlur = React.useCallback(\n (event: React.FocusEvent) => {\n if (event && isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget)) {\n return;\n }\n\n requestAnimationFrame(() => {\n tableMeta.editing.toggleDetailedMode(false);\n tableMeta.editing.onCellChanged(cell, rowIndex, undefined, !hasNonTextControl, true);\n });\n },\n [hasNonTextControl, cell.row.id, JSON.stringify(rowChanges), rowIndex, cell.column.id, cell.row.original]\n );\n\n const error = tableMeta.editing.getCellError<TType>(cell);\n\n const handleExitDetailedMode = React.useCallback(() => {\n tableMeta.editing.onCellChanged(cell, rowIndex, undefined, true, true);\n }, [cell.row.id, JSON.stringify(rowChanges), rowIndex, cell.column.id, cell.row.original]);\n\n const controlProps = {\n dataType: columnMeta.dataType,\n disabled: tableMeta.editing.getRowStatus(cell.row.id) === 'saving',\n fontSize: tableMeta.fontSize.size,\n id: cell.column.id,\n invalid: !!error,\n isDetailedMode: tableMeta.editing.isDetailedMode,\n isTruncated: !!columnMeta.enableTruncate,\n locale: locale.locale,\n onBlur: handleBlur,\n onChange: handleChange,\n onExitDetailedMode: handleExitDetailedMode,\n row: cell.row.original,\n rowPendingChanges: tableMeta.editing.getRowValue(cell.row.id),\n tabIndex: isActiveRow ? 0 : -1,\n toggleDetailedMode: tableMeta.editing.toggleDetailedMode,\n type,\n value,\n };\n\n const cellAttributes = {\n ...getCellAttributes(cell, index, isHighlighted),\n 'data-cell-editing-invalid': error ? true : undefined,\n 'data-taco': 'cell-control',\n onFocus: handleFocus,\n ref: cellRef,\n tabIndex: -1,\n };\n\n return (\n <td {...cellAttributes}>\n <Field invalid={!!error} message={error}>\n <MemoedEditingCell<TType> {...controlProps} />\n </Field>\n {\n // we show row move indicator here within the cell rather than the row because it is\n // an editing only feature, and we don't want to leak editing into the shared row component\n }\n <RowMoveIndicator cell={cell} cellRef={cellRef} isActiveRow={isActiveRow} />\n </td>\n );\n}\n\ntype MemoedEditingCellProps<TType = unknown, TValue = unknown> = {\n dataType?: TableColumnDataType;\n disabled: boolean;\n fontSize: TableFontSize;\n id: string;\n invalid: boolean;\n isDetailedMode: boolean;\n isTruncated: boolean;\n locale: string;\n onBlur: (event: React.FocusEvent) => void;\n onChange: (value: TValue) => void;\n onExitDetailedMode: () => void;\n row: TType;\n rowPendingChanges: Partial<TType> | undefined;\n tabIndex?: number;\n toggleDetailedMode: (detailed: React.SetStateAction<boolean>) => void;\n type: TableColumnRendererControl<TType>;\n value: TValue;\n};\n\nconst MemoedEditingCell = React.memo(function MemoedEditingCell<TType = unknown>(props: MemoedEditingCellProps<TType>) {\n const {\n dataType,\n disabled,\n fontSize,\n id,\n invalid,\n isDetailedMode,\n isTruncated,\n locale,\n onBlur,\n onChange,\n onExitDetailedMode,\n row,\n rowPendingChanges,\n tabIndex = -1,\n toggleDetailedMode,\n type = 'input',\n value,\n } = props;\n const controlRef = React.useRef<HTMLElement>(null);\n const currentValue = row[id as keyof TType];\n const commonProps = {\n disabled,\n onBlur,\n ref: controlRef,\n tabIndex,\n };\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n\n if (target.readOnly) {\n return;\n }\n\n // prevent active row navigation while in detailed mode\n if (\n isDetailedMode &&\n (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'ArrowLeft' || event.key === 'ArrowRight')\n ) {\n event.stopPropagation();\n }\n\n // enter or exit detail mode when pressing enter\n if (event.key === 'Enter') {\n // textareas support shift and enter, don't prevent default in that case\n if (event.shiftKey && isDetailedMode) {\n return;\n }\n\n event.preventDefault();\n\n if (isDetailedMode) {\n target.select?.();\n onExitDetailedMode();\n } else {\n target.setSelectionRange?.(target.value?.length, target.value?.length);\n }\n\n toggleDetailedMode(editing => !editing);\n return;\n }\n\n // reset the value, or exit edit mode when pressing escape\n if (event.key === 'Escape') {\n if (isDetailedMode) {\n event.preventDefault();\n toggleDetailedMode(false);\n\n if (value !== currentValue) {\n props.onChange(currentValue);\n }\n\n // have to let onChange run before selecting, otherwise the value changes\n requestAnimationFrame(() => target.select?.());\n }\n\n return;\n }\n\n // toggle into detailed mode when actually inputting something\n if (!isPressingMetaKey(event) && (/^[a-z0-9]$/i.test(event.key) || event.key === 'Backspace')) {\n toggleDetailedMode(true);\n }\n };\n\n const handlePaste = () => {\n if (!isDetailedMode) {\n toggleDetailedMode(true);\n }\n };\n\n if (typeof type === 'function') {\n const controlFnProps = {\n ...commonProps,\n invalid,\n setValue: onChange,\n onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => {\n const target = (event.target as HTMLElement) || null;\n // it make sense to handle keydown for the custom edititng controls only if target is either input or textarea\n if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA')) {\n handleInputKeyDown(event as React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>);\n }\n },\n onPaste: handlePaste,\n value,\n };\n\n return type(controlFnProps, { ...row, ...rowPendingChanges });\n }\n\n if (type === 'switch') {\n return (\n <Switch\n {...commonProps}\n checked={Boolean(value)}\n onChange={onChange}\n ref={controlRef as React.RefObject<HTMLInputElement>}\n />\n );\n }\n\n if (type === 'checkbox') {\n return (\n <Checkbox\n {...commonProps}\n checked={Boolean(value)}\n onChange={onChange}\n ref={controlRef as React.RefObject<HTMLInputElement>}\n />\n );\n }\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (!isDetailedMode) {\n event.target.select();\n }\n };\n\n if (type === 'datepicker') {\n const valueAsDate = date.parse(value as Date | string | undefined);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newDate = (event as any).detail as Date;\n\n if (!valueAsDate || !newDate || (isDate(valueAsDate) && isDate(newDate) && !date.isWeakEqual(valueAsDate, newDate))) {\n props.onChange(newDate);\n }\n };\n\n const handleDatepickerInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n const target = event.target as HTMLInputElement;\n\n if (isDetailedMode && event.key === 'Enter') {\n // If the field is empty, save as null before exiting detailed mode\n // This prevents the value from reverting to the previous value\n if (target.value === '') {\n onChange(null);\n } else {\n // When value is not empty, prevent handleInputKeyDown and give full control to Datepicker\n // The datepicker will exit \"detailed mode\" by itself when a valid date change is triggered\n target.select?.();\n return;\n }\n }\n\n handleInputKeyDown(event);\n };\n\n return (\n <Datepicker\n {...commonProps}\n invalid={invalid}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleDatepickerInputKeyDown}\n onPaste={handlePaste}\n ref={controlRef as React.RefObject<HTMLInputElement>}\n value={valueAsDate}\n />\n );\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const dataTypeProps = getDataTypeProperties(dataType);\n onChange(dataTypeProps.parse?.(event.target.value, locale) ?? event.target.value);\n };\n\n if (type === 'textarea') {\n return (\n <TextareaWithAutosizing\n {...commonProps}\n fontSize={fontSize}\n invalid={invalid}\n isTruncated={isTruncated}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n onPaste={handlePaste}\n ref={controlRef as React.RefObject<HTMLTextAreaElement>}\n value={String(value ?? '')}\n />\n );\n }\n\n return (\n <Input\n {...commonProps}\n invalid={invalid}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n onPaste={handlePaste}\n ref={controlRef as React.RefObject<HTMLInputElement>}\n type={dataType === 'number' ? 'number' : undefined}\n value={dataType === 'number' ? (value as number) : String(value ?? '')}\n />\n );\n}) as <TType = unknown>(props: MemoedEditingCellProps<TType>) => React.JSX.Element;\n"],"names":["RowContext","useLocalization","useEditingCellAutofocus","useLazyEffect","isSameDay","isEqualDate","isElementInsideOrTriggeredFromContainer","getCellAttributes","Field","RowMoveIndicator","MemoedEditingCell","isPressingMetaKey","Switch","Checkbox","date.parse","handleChange","isDate","date.isWeakEqual","Datepicker","getDataTypeProperties","TextareaWithAutosizing","Input"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditingControlCell.cjs","sources":["../../../../../../src/components/Table3/components/Columns/Cell/EditingControlCell.tsx"],"sourcesContent":["import type { TableMeta as ReactTableMeta, ColumnMeta as ReactTableColumnMeta } from '@tanstack/react-table';\nimport { isDate, isEqual as isEqualDate, isSameDay } from 'date-fns';\nimport React from 'react';\n\nimport { Checkbox, Datepicker, Field, Input, useLocalization, Switch } from '@/components';\nimport { useLazyEffect } from '@/hooks/useLazyEffect';\nimport { getCellAttributes } from '@/primitives/Table/Core/components/Columns/Cell/util';\nimport { RowContext } from '@/primitives/Table/Core/components/Row/RowContext';\nimport type { TableCellRendererProps } from '@/primitives/Table/Core/types';\nimport type { TableColumnDataType, TableColumnRendererControl, TableFontSize } from '@/primitives/Table/types';\nimport { getDataTypeProperties } from '@/primitives/Table/useTableManager/util/dataTypes';\nimport * as date from '@/utils/date';\nimport { isElementInsideOrTriggeredFromContainer } from '@/utils/dom';\nimport { isPressingMetaKey } from '@/utils/keyboard';\n\nimport { RowMoveIndicator } from './Editing/RowMoveIndicator';\nimport { TextareaWithAutosizing } from './Editing/TextareaWithAutosizing';\nimport { useEditingCellAutofocus } from './util';\n\nexport function EditingControlCell<TType = unknown>(props: TableCellRendererProps<TType>) {\n const { cell, cellRef, isHighlighted, index } = props;\n const { rowIndex } = React.useContext(RowContext);\n const { table } = cell.getContext();\n const locale = useLocalization();\n const tableMeta = table.options.meta as ReactTableMeta<TType>;\n const columnMeta = cell.column.columnDef.meta as ReactTableColumnMeta<TType, unknown>;\n const isActiveRow = tableMeta.rowActive.rowActiveIndex === rowIndex;\n const type = columnMeta.control ?? 'input';\n const handleFocus = useEditingCellAutofocus<TType>(props);\n const value = cell.getValue();\n const rowChanges = tableMeta.editing.getRowValue(cell.row.id);\n const shouldRunUpdate = React.useRef(false);\n\n // some controls, like select2, should trigger cell changed (validation, updates) as the value changes\n const hasNonTextControl = React.useMemo(() => {\n return (\n typeof type === 'function' &&\n !!cellRef.current?.querySelector('[data-taco=\"Select2\"],[data-taco=\"switch\"],[data-taco=\"checkbox\"]')\n );\n }, [cellRef.current]);\n\n useLazyEffect(() => {\n // Use an effect instead of a change handler to prevent onEditingChange from running with a stale js closure during on-the-fly creation.\n if (hasNonTextControl && shouldRunUpdate.current) {\n tableMeta.editing.onCellChanged(cell, rowIndex, value, true, false);\n // prevent risk of infinite loop, in case there'd ever be an updater function with two values that update each other.\n shouldRunUpdate.current = false;\n }\n }, [value]);\n\n const handleChange = React.useCallback(\n (nextValue: unknown) => {\n let hasChanged = false;\n\n if (columnMeta.dataType === 'date') {\n hasChanged = !isSameDay(new Date(nextValue as string | Date), new Date(value as string | Date));\n } else if (columnMeta.dataType === 'datetime') {\n hasChanged = !isEqualDate(new Date(nextValue as string | Date), new Date(value as string | Date));\n } else if (columnMeta.dataType === 'time') {\n const next = new Date(nextValue as string | Date);\n const current = new Date(value as string | Date);\n hasChanged = !(next.getHours() === current.getHours() && next.getMinutes() === current.getMinutes());\n } else {\n hasChanged = nextValue !== value;\n }\n\n if (hasChanged) {\n tableMeta.editing.setCellValue(cell, rowIndex, nextValue);\n shouldRunUpdate.current = hasNonTextControl;\n }\n },\n [hasNonTextControl, cell.row.id, cell.column.id, cell.row.original, rowIndex, value, columnMeta.dataType]\n );\n\n const handleBlur = React.useCallback(\n (event: React.FocusEvent) => {\n if (event && isElementInsideOrTriggeredFromContainer(event.relatedTarget, event.currentTarget)) {\n return;\n }\n\n requestAnimationFrame(() => {\n tableMeta.editing.toggleDetailedMode(false);\n tableMeta.editing.onCellChanged(cell, rowIndex, undefined, !hasNonTextControl, true);\n });\n },\n [hasNonTextControl, cell.row.id, JSON.stringify(rowChanges), rowIndex, cell.column.id, cell.row.original]\n );\n\n const error = tableMeta.editing.getCellError<TType>(cell);\n\n const handleExitDetailedMode = React.useCallback(() => {\n tableMeta.editing.onCellChanged(cell, rowIndex, undefined, true, true);\n }, [cell.row.id, JSON.stringify(rowChanges), rowIndex, cell.column.id, cell.row.original]);\n\n const controlProps = {\n dataType: columnMeta.dataType,\n disabled: tableMeta.editing.getRowStatus(cell.row.id) === 'saving',\n fontSize: tableMeta.fontSize.size,\n id: cell.column.id,\n invalid: !!error,\n isDetailedMode: tableMeta.editing.isDetailedMode,\n isTruncated: !!columnMeta.enableTruncate,\n locale: locale.locale,\n onBlur: handleBlur,\n onChange: handleChange,\n onExitDetailedMode: handleExitDetailedMode,\n row: cell.row.original,\n rowPendingChanges: tableMeta.editing.getRowValue(cell.row.id),\n tabIndex: isActiveRow ? 0 : -1,\n toggleDetailedMode: tableMeta.editing.toggleDetailedMode,\n type,\n value,\n };\n\n const cellAttributes = {\n ...getCellAttributes(cell, index, isHighlighted),\n 'data-cell-editing-invalid': error ? true : undefined,\n 'data-taco': 'cell-control',\n onFocus: handleFocus,\n ref: cellRef,\n tabIndex: -1,\n };\n\n return (\n <td {...cellAttributes}>\n <Field invalid={!!error} message={error}>\n <MemoedEditingCell<TType> {...controlProps} />\n </Field>\n {\n // we show row move indicator here within the cell rather than the row because it is\n // an editing only feature, and we don't want to leak editing into the shared row component\n }\n <RowMoveIndicator cell={cell} cellRef={cellRef} isActiveRow={isActiveRow} />\n </td>\n );\n}\n\ntype MemoedEditingCellProps<TType = unknown, TValue = unknown> = {\n dataType?: TableColumnDataType;\n disabled: boolean;\n fontSize: TableFontSize;\n id: string;\n invalid: boolean;\n isDetailedMode: boolean;\n isTruncated: boolean;\n locale: string;\n onBlur: (event: React.FocusEvent) => void;\n onChange: (value: TValue) => void;\n onExitDetailedMode: () => void;\n row: TType;\n rowPendingChanges: Partial<TType> | undefined;\n tabIndex?: number;\n toggleDetailedMode: (detailed: React.SetStateAction<boolean>) => void;\n type: TableColumnRendererControl<TType>;\n value: TValue;\n};\n\nconst MemoedEditingCell = React.memo(function MemoedEditingCell<TType = unknown>(props: MemoedEditingCellProps<TType>) {\n const {\n dataType,\n disabled,\n fontSize,\n id,\n invalid,\n isDetailedMode,\n isTruncated,\n locale,\n onBlur,\n onChange,\n onExitDetailedMode,\n row,\n rowPendingChanges,\n tabIndex = -1,\n toggleDetailedMode,\n type = 'input',\n value,\n } = props;\n const controlRef = React.useRef<HTMLElement>(null);\n const currentValue = row[id as keyof TType];\n const commonProps = {\n disabled,\n onBlur,\n ref: controlRef,\n tabIndex,\n };\n\n const handleInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const target = event.target as HTMLInputElement | HTMLTextAreaElement;\n\n if (target.readOnly) {\n return;\n }\n\n // prevent active row navigation while in detailed mode\n if (\n isDetailedMode &&\n (event.key === 'ArrowUp' || event.key === 'ArrowDown' || event.key === 'ArrowLeft' || event.key === 'ArrowRight')\n ) {\n event.stopPropagation();\n }\n\n // enter or exit detail mode when pressing enter\n if (event.key === 'Enter') {\n // textareas support shift and enter, don't prevent default in that case\n if (event.shiftKey && isDetailedMode) {\n return;\n }\n\n event.preventDefault();\n\n if (isDetailedMode) {\n target.select?.();\n onExitDetailedMode();\n } else {\n target.setSelectionRange?.(target.value?.length, target.value?.length);\n }\n\n toggleDetailedMode(editing => !editing);\n return;\n }\n\n // reset the value, or exit edit mode when pressing escape\n if (event.key === 'Escape') {\n if (isDetailedMode) {\n event.preventDefault();\n toggleDetailedMode(false);\n\n if (value !== currentValue) {\n props.onChange(currentValue);\n }\n\n // have to let onChange run before selecting, otherwise the value changes\n requestAnimationFrame(() => target.select?.());\n }\n\n return;\n }\n\n // toggle into detailed mode when actually inputting something\n if (!isPressingMetaKey(event) && (/^[a-z0-9]$/iu.test(event.key) || event.key === 'Backspace')) {\n toggleDetailedMode(true);\n }\n };\n\n const handlePaste = () => {\n if (!isDetailedMode) {\n toggleDetailedMode(true);\n }\n };\n\n if (typeof type === 'function') {\n const controlFnProps = {\n ...commonProps,\n invalid,\n setValue: onChange,\n onKeyDown: (event: React.KeyboardEvent<HTMLElement>) => {\n const target = (event.target as HTMLElement) || null;\n // it make sense to handle keydown for the custom edititng controls only if target is either input or textarea\n if (target && (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA')) {\n handleInputKeyDown(event as React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>);\n }\n },\n onPaste: handlePaste,\n value,\n };\n\n return type(controlFnProps, { ...row, ...rowPendingChanges });\n }\n\n if (type === 'switch') {\n return (\n <Switch\n {...commonProps}\n checked={Boolean(value)}\n onChange={onChange}\n ref={controlRef as React.Ref<HTMLInputElement>}\n />\n );\n }\n\n if (type === 'checkbox') {\n return (\n <Checkbox\n {...commonProps}\n checked={Boolean(value)}\n onChange={onChange}\n ref={controlRef as React.Ref<HTMLInputElement>}\n />\n );\n }\n\n const handleFocus = (event: React.FocusEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n if (!isDetailedMode) {\n event.target.select();\n }\n };\n\n if (type === 'datepicker') {\n const valueAsDate = date.parse(value as Date | string | undefined);\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n const newDate = (event as any).detail as Date;\n\n if (!valueAsDate || !newDate || (isDate(valueAsDate) && isDate(newDate) && !date.isWeakEqual(valueAsDate, newDate))) {\n props.onChange(newDate);\n }\n };\n\n const handleDatepickerInputKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\n const target = event.target as HTMLInputElement;\n\n if (isDetailedMode && event.key === 'Enter') {\n // If the field is empty, save as null before exiting detailed mode\n // This prevents the value from reverting to the previous value\n if (target.value === '') {\n onChange(null);\n } else {\n // When value is not empty, prevent handleInputKeyDown and give full control to Datepicker\n // The datepicker will exit \"detailed mode\" by itself when a valid date change is triggered\n target.select?.();\n return;\n }\n }\n\n handleInputKeyDown(event);\n };\n\n return (\n <Datepicker\n {...commonProps}\n invalid={invalid}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleDatepickerInputKeyDown}\n onPaste={handlePaste}\n ref={controlRef as React.Ref<HTMLInputElement>}\n value={valueAsDate}\n />\n );\n }\n\n const handleChange = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n const dataTypeProps = getDataTypeProperties(dataType);\n onChange(dataTypeProps.parse?.(event.target.value, locale) ?? event.target.value);\n };\n\n if (type === 'textarea') {\n return (\n <TextareaWithAutosizing\n {...commonProps}\n fontSize={fontSize}\n invalid={invalid}\n isTruncated={isTruncated}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n onPaste={handlePaste}\n ref={controlRef as React.Ref<HTMLTextAreaElement>}\n value={String(value ?? '')}\n />\n );\n }\n\n return (\n <Input\n {...commonProps}\n invalid={invalid}\n onChange={handleChange}\n onFocus={handleFocus}\n onKeyDown={handleInputKeyDown}\n onPaste={handlePaste}\n ref={controlRef as React.Ref<HTMLInputElement>}\n type={dataType === 'number' ? 'number' : undefined}\n value={dataType === 'number' ? (value as number) : String(value ?? '')}\n />\n );\n}) as <TType = unknown>(props: MemoedEditingCellProps<TType>) => React.JSX.Element;\n"],"names":["RowContext","useLocalization","useEditingCellAutofocus","useLazyEffect","isSameDay","isEqualDate","isElementInsideOrTriggeredFromContainer","getCellAttributes","Field","RowMoveIndicator","MemoedEditingCell","isPressingMetaKey","Switch","Checkbox","date.parse","handleChange","isDate","date.isWeakEqual","Datepicker","getDataTypeProperties","TextareaWithAutosizing","Input"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmBO,SAAS,mBAAoC,OAAsC;AACtF,QAAM,EAAE,MAAM,SAAS,eAAe,UAAU;AAChD,QAAM,EAAE,SAAA,IAAa,MAAM,WAAWA,WAAAA,UAAU;AAChD,QAAM,EAAE,MAAA,IAAU,KAAK,WAAA;AACvB,QAAM,SAASC,aAAAA,gBAAA;AACf,QAAM,YAAY,MAAM,QAAQ;AAChC,QAAM,aAAa,KAAK,OAAO,UAAU;AACzC,QAAM,cAAc,UAAU,UAAU,mBAAmB;AAC3D,QAAM,OAAO,WAAW,WAAW;AACnC,QAAM,cAAcC,KAAAA,wBAA+B,KAAK;AACxD,QAAM,QAAQ,KAAK,SAAA;AACnB,QAAM,aAAa,UAAU,QAAQ,YAAY,KAAK,IAAI,EAAE;AAC5D,QAAM,kBAAkB,MAAM,OAAO,KAAK;AAG1C,QAAM,oBAAoB,MAAM,QAAQ,MAAM;AAC1C,WACI,OAAO,SAAS,cAChB,CAAC,CAAC,QAAQ,SAAS,cAAc,mEAAmE;AAAA,EAE5G,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpBC,gBAAAA,cAAc,MAAM;AAEhB,QAAI,qBAAqB,gBAAgB,SAAS;AAC9C,gBAAU,QAAQ,cAAc,MAAM,UAAU,OAAO,MAAM,KAAK;AAElE,sBAAgB,UAAU;AAAA,IAC9B;AAAA,EACJ,GAAG,CAAC,KAAK,CAAC;AAEV,QAAM,eAAe,MAAM;AAAA,IACvB,CAAC,cAAuB;AACpB,UAAI,aAAa;AAEjB,UAAI,WAAW,aAAa,QAAQ;AAChC,qBAAa,CAACC,QAAAA,UAAU,IAAI,KAAK,SAA0B,GAAG,IAAI,KAAK,KAAsB,CAAC;AAAA,MAClG,WAAW,WAAW,aAAa,YAAY;AAC3C,qBAAa,CAACC,QAAAA,QAAY,IAAI,KAAK,SAA0B,GAAG,IAAI,KAAK,KAAsB,CAAC;AAAA,MACpG,WAAW,WAAW,aAAa,QAAQ;AACvC,cAAM,OAAO,IAAI,KAAK,SAA0B;AAChD,cAAM,UAAU,IAAI,KAAK,KAAsB;AAC/C,qBAAa,EAAE,KAAK,SAAA,MAAe,QAAQ,cAAc,KAAK,WAAA,MAAiB,QAAQ,WAAA;AAAA,MAC3F,OAAO;AACH,qBAAa,cAAc;AAAA,MAC/B;AAEA,UAAI,YAAY;AACZ,kBAAU,QAAQ,aAAa,MAAM,UAAU,SAAS;AACxD,wBAAgB,UAAU;AAAA,MAC9B;AAAA,IACJ;AAAA,IACA,CAAC,mBAAmB,KAAK,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,UAAU,UAAU,OAAO,WAAW,QAAQ;AAAA,EAAA;AAG5G,QAAM,aAAa,MAAM;AAAA,IACrB,CAAC,UAA4B;AACzB,UAAI,SAASC,IAAAA,wCAAwC,MAAM,eAAe,MAAM,aAAa,GAAG;AAC5F;AAAA,MACJ;AAEA,4BAAsB,MAAM;AACxB,kBAAU,QAAQ,mBAAmB,KAAK;AAC1C,kBAAU,QAAQ,cAAc,MAAM,UAAU,QAAW,CAAC,mBAAmB,IAAI;AAAA,MACvF,CAAC;AAAA,IACL;AAAA,IACA,CAAC,mBAAmB,KAAK,IAAI,IAAI,KAAK,UAAU,UAAU,GAAG,UAAU,KAAK,OAAO,IAAI,KAAK,IAAI,QAAQ;AAAA,EAAA;AAG5G,QAAM,QAAQ,UAAU,QAAQ,aAAoB,IAAI;AAExD,QAAM,yBAAyB,MAAM,YAAY,MAAM;AACnD,cAAU,QAAQ,cAAc,MAAM,UAAU,QAAW,MAAM,IAAI;AAAA,EACzE,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,UAAU,UAAU,GAAG,UAAU,KAAK,OAAO,IAAI,KAAK,IAAI,QAAQ,CAAC;AAEzF,QAAM,eAAe;AAAA,IACjB,UAAU,WAAW;AAAA,IACrB,UAAU,UAAU,QAAQ,aAAa,KAAK,IAAI,EAAE,MAAM;AAAA,IAC1D,UAAU,UAAU,SAAS;AAAA,IAC7B,IAAI,KAAK,OAAO;AAAA,IAChB,SAAS,CAAC,CAAC;AAAA,IACX,gBAAgB,UAAU,QAAQ;AAAA,IAClC,aAAa,CAAC,CAAC,WAAW;AAAA,IAC1B,QAAQ,OAAO;AAAA,IACf,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,KAAK,KAAK,IAAI;AAAA,IACd,mBAAmB,UAAU,QAAQ,YAAY,KAAK,IAAI,EAAE;AAAA,IAC5D,UAAU,cAAc,IAAI;AAAA,IAC5B,oBAAoB,UAAU,QAAQ;AAAA,IACtC;AAAA,IACA;AAAA,EAAA;AAGJ,QAAM,iBAAiB;AAAA,IACnB,GAAGC,yBAAkB,MAAM,OAAO,aAAa;AAAA,IAC/C,6BAA6B,QAAQ,OAAO;AAAA,IAC5C,aAAa;AAAA,IACb,SAAS;AAAA,IACT,KAAK;AAAA,IACL,UAAU;AAAA,EAAA;AAGd,SACI,sBAAA,cAAC,QAAI,GAAG,eAAA,uCACHC,MAAAA,OAAA,EAAM,SAAS,CAAC,CAAC,OAAO,SAAS,SAC9B,sBAAA,cAAC,mBAAA,EAA0B,GAAG,aAAA,CAAc,CAChD,uCAKCC,iBAAAA,kBAAA,EAAiB,MAAY,SAAkB,YAAA,CAA0B,CAC9E;AAER;AAsBA,MAAM,oBAAoB,MAAM,KAAK,SAASC,mBAAmC,OAAsC;AACnH,QAAM;AAAA,IACF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,OAAO;AAAA,IACP;AAAA,EAAA,IACA;AACJ,QAAM,aAAa,MAAM,OAAoB,IAAI;AACjD,QAAM,eAAe,IAAI,EAAiB;AAC1C,QAAM,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EAAA;AAGJ,QAAM,qBAAqB,CAAC,UAAuE;AAC/F,UAAM,SAAS,MAAM;AAErB,QAAI,OAAO,UAAU;AACjB;AAAA,IACJ;AAGA,QACI,mBACC,MAAM,QAAQ,aAAa,MAAM,QAAQ,eAAe,MAAM,QAAQ,eAAe,MAAM,QAAQ,eACtG;AACE,YAAM,gBAAA;AAAA,IACV;AAGA,QAAI,MAAM,QAAQ,SAAS;AAEvB,UAAI,MAAM,YAAY,gBAAgB;AAClC;AAAA,MACJ;AAEA,YAAM,eAAA;AAEN,UAAI,gBAAgB;AAChB,eAAO,SAAA;AACP,2BAAA;AAAA,MACJ,OAAO;AACH,eAAO,oBAAoB,OAAO,OAAO,QAAQ,OAAO,OAAO,MAAM;AAAA,MACzE;AAEA,yBAAmB,CAAA,YAAW,CAAC,OAAO;AACtC;AAAA,IACJ;AAGA,QAAI,MAAM,QAAQ,UAAU;AACxB,UAAI,gBAAgB;AAChB,cAAM,eAAA;AACN,2BAAmB,KAAK;AAExB,YAAI,UAAU,cAAc;AACxB,gBAAM,SAAS,YAAY;AAAA,QAC/B;AAGA,8BAAsB,MAAM,OAAO,UAAU;AAAA,MACjD;AAEA;AAAA,IACJ;AAGA,QAAI,CAACC,SAAAA,kBAAkB,KAAK,MAAM,eAAe,KAAK,MAAM,GAAG,KAAK,MAAM,QAAQ,cAAc;AAC5F,yBAAmB,IAAI;AAAA,IAC3B;AAAA,EACJ;AAEA,QAAM,cAAc,MAAM;AACtB,QAAI,CAAC,gBAAgB;AACjB,yBAAmB,IAAI;AAAA,IAC3B;AAAA,EACJ;AAEA,MAAI,OAAO,SAAS,YAAY;AAC5B,UAAM,iBAAiB;AAAA,MACnB,GAAG;AAAA,MACH;AAAA,MACA,UAAU;AAAA,MACV,WAAW,CAAC,UAA4C;AACpD,cAAM,SAAU,MAAM,UAA0B;AAEhD,YAAI,WAAW,OAAO,YAAY,WAAW,OAAO,YAAY,aAAa;AACzE,6BAAmB,KAAoE;AAAA,QAC3F;AAAA,MACJ;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IAAA;AAGJ,WAAO,KAAK,gBAAgB,EAAE,GAAG,KAAK,GAAG,mBAAmB;AAAA,EAChE;AAEA,MAAI,SAAS,UAAU;AACnB,WACI,sBAAA;AAAA,MAACC,OAAAA;AAAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ,SAAS,QAAQ,KAAK;AAAA,QACtB;AAAA,QACA,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGjB;AAEA,MAAI,SAAS,YAAY;AACrB,WACI,sBAAA;AAAA,MAACC,SAAAA;AAAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ,SAAS,QAAQ,KAAK;AAAA,QACtB;AAAA,QACA,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGjB;AAEA,QAAM,cAAc,CAAC,UAAoE;AACrF,QAAI,CAAC,gBAAgB;AACjB,YAAM,OAAO,OAAA;AAAA,IACjB;AAAA,EACJ;AAEA,MAAI,SAAS,cAAc;AACvB,UAAM,cAAcC,KAAAA,MAAW,KAAkC;AAEjE,UAAMC,gBAAe,CAAC,UAA+C;AACjE,YAAM,UAAW,MAAc;AAE/B,UAAI,CAAC,eAAe,CAAC,WAAYC,QAAAA,OAAO,WAAW,KAAKA,eAAO,OAAO,KAAK,CAACC,KAAAA,YAAiB,aAAa,OAAO,GAAI;AACjH,cAAM,SAAS,OAAO;AAAA,MAC1B;AAAA,IACJ;AAEA,UAAM,+BAA+B,CAAC,UAAiD;AACnF,YAAM,SAAS,MAAM;AAErB,UAAI,kBAAkB,MAAM,QAAQ,SAAS;AAGzC,YAAI,OAAO,UAAU,IAAI;AACrB,mBAAS,IAAI;AAAA,QACjB,OAAO;AAGH,iBAAO,SAAA;AACP;AAAA,QACJ;AAAA,MACJ;AAEA,yBAAmB,KAAK;AAAA,IAC5B;AAEA,WACI,sBAAA;AAAA,MAACC,WAAAA;AAAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ;AAAA,QACA,UAAUH;AAAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,QACT,KAAK;AAAA,QACL,OAAO;AAAA,MAAA;AAAA,IAAA;AAAA,EAGnB;AAEA,QAAM,eAAe,CAAC,UAAqE;AACvF,UAAM,gBAAgBI,UAAAA,sBAAsB,QAAQ;AACpD,aAAS,cAAc,QAAQ,MAAM,OAAO,OAAO,MAAM,KAAK,MAAM,OAAO,KAAK;AAAA,EACpF;AAEA,MAAI,SAAS,YAAY;AACrB,WACI,sBAAA;AAAA,MAACC,uBAAAA;AAAAA,MAAA;AAAA,QACI,GAAG;AAAA,QACJ;AAAA,QACA;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,QACX,SAAS;AAAA,QACT,KAAK;AAAA,QACL,OAAO,OAAO,SAAS,EAAE;AAAA,MAAA;AAAA,IAAA;AAAA,EAGrC;AAEA,SACI,sBAAA;AAAA,IAACC,MAAAA;AAAAA,IAAA;AAAA,MACI,GAAG;AAAA,MACJ;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA,MACT,WAAW;AAAA,MACX,SAAS;AAAA,MACT,KAAK;AAAA,MACL,MAAM,aAAa,WAAW,WAAW;AAAA,MACzC,OAAO,aAAa,WAAY,QAAmB,OAAO,SAAS,EAAE;AAAA,IAAA;AAAA,EAAA;AAGjF,CAAC;;"}
|