@cloud-ru/ds-list 1.0.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/CHANGELOG.md +8 -0
- package/LICENSE +201 -0
- package/README.md +1413 -0
- package/dist/cjs/components/Items/AccordionItem/AccordionItem.d.ts +4 -0
- package/dist/cjs/components/Items/AccordionItem/AccordionItem.js +37 -0
- package/dist/cjs/components/Items/AccordionItem/index.d.ts +1 -0
- package/dist/cjs/components/Items/AccordionItem/index.js +17 -0
- package/dist/cjs/components/Items/BaseItem/BaseItem.d.ts +24 -0
- package/dist/cjs/components/Items/BaseItem/BaseItem.js +118 -0
- package/dist/cjs/components/Items/BaseItem/constants.d.ts +3 -0
- package/dist/cjs/components/Items/BaseItem/constants.js +8 -0
- package/dist/cjs/components/Items/BaseItem/index.d.ts +1 -0
- package/dist/cjs/components/Items/BaseItem/index.js +17 -0
- package/dist/cjs/components/Items/BaseItem/styles.module.css +312 -0
- package/dist/cjs/components/Items/GroupSelectItem/GroupSelectItem.d.ts +4 -0
- package/dist/cjs/components/Items/GroupSelectItem/GroupSelectItem.js +22 -0
- package/dist/cjs/components/Items/GroupSelectItem/index.d.ts +1 -0
- package/dist/cjs/components/Items/GroupSelectItem/index.js +17 -0
- package/dist/cjs/components/Items/NextListItem/NextListItem.d.ts +2 -0
- package/dist/cjs/components/Items/NextListItem/NextListItem.js +71 -0
- package/dist/cjs/components/Items/NextListItem/constants.d.ts +2 -0
- package/dist/cjs/components/Items/NextListItem/constants.js +13 -0
- package/dist/cjs/components/Items/NextListItem/index.d.ts +1 -0
- package/dist/cjs/components/Items/NextListItem/index.js +17 -0
- package/dist/cjs/components/Items/NextListItem/types.d.ts +4 -0
- package/dist/cjs/components/Items/NextListItem/types.js +2 -0
- package/dist/cjs/components/Items/PinGroupItem/PinGroupItem.d.ts +7 -0
- package/dist/cjs/components/Items/PinGroupItem/PinGroupItem.js +27 -0
- package/dist/cjs/components/Items/PinGroupItem/index.d.ts +1 -0
- package/dist/cjs/components/Items/PinGroupItem/index.js +17 -0
- package/dist/cjs/components/Items/PinGroupItem/styles.module.css +12 -0
- package/dist/cjs/components/Items/SearchItem/SearchItem.d.ts +17 -0
- package/dist/cjs/components/Items/SearchItem/SearchItem.js +28 -0
- package/dist/cjs/components/Items/SearchItem/index.d.ts +1 -0
- package/dist/cjs/components/Items/SearchItem/index.js +17 -0
- package/dist/cjs/components/Items/SearchItem/styles.module.css +13 -0
- package/dist/cjs/components/Items/SimpleItem/components/DragHandle/DragHandle.d.ts +7 -0
- package/dist/cjs/components/Items/SimpleItem/components/DragHandle/DragHandle.js +20 -0
- package/dist/cjs/components/Items/SimpleItem/components/DragHandle/index.d.ts +1 -0
- package/dist/cjs/components/Items/SimpleItem/components/DragHandle/index.js +17 -0
- package/dist/cjs/components/Items/SimpleItem/components/OverlayDragHandle/OverlayDragHandle.d.ts +2 -0
- package/dist/cjs/components/Items/SimpleItem/components/OverlayDragHandle/OverlayDragHandle.js +9 -0
- package/dist/cjs/components/Items/SimpleItem/components/OverlayDragHandle/index.d.ts +1 -0
- package/dist/cjs/components/Items/SimpleItem/components/OverlayDragHandle/index.js +17 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlock/SimpleGroupBlock.d.ts +19 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlock/SimpleGroupBlock.js +52 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlock/index.d.ts +1 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlock/index.js +17 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/SimpleGroupBlockOverlay.d.ts +15 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/SimpleGroupBlockOverlay.js +19 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/index.d.ts +1 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/index.js +17 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItem/SimpleItem.d.ts +11 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItem/SimpleItem.js +48 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItem/index.d.ts +1 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItem/index.js +17 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItemOverlay/SimpleItemOverlay.d.ts +15 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItemOverlay/SimpleItemOverlay.js +19 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItemOverlay/index.d.ts +1 -0
- package/dist/cjs/components/Items/SimpleItem/components/SimpleItemOverlay/index.js +17 -0
- package/dist/cjs/components/Items/SimpleItem/components/index.d.ts +4 -0
- package/dist/cjs/components/Items/SimpleItem/components/index.js +20 -0
- package/dist/cjs/components/Items/SimpleItem/constants.d.ts +7 -0
- package/dist/cjs/components/Items/SimpleItem/constants.js +9 -0
- package/dist/cjs/components/Items/SimpleItem/index.d.ts +2 -0
- package/dist/cjs/components/Items/SimpleItem/index.js +18 -0
- package/dist/cjs/components/Items/SimpleItem/styles.module.css +96 -0
- package/dist/cjs/components/Items/SimpleItem/types.d.ts +3 -0
- package/dist/cjs/components/Items/SimpleItem/types.js +2 -0
- package/dist/cjs/components/Items/SimpleItem/utils.d.ts +6 -0
- package/dist/cjs/components/Items/SimpleItem/utils.js +11 -0
- package/dist/cjs/components/Items/hooks.d.ts +23 -0
- package/dist/cjs/components/Items/hooks.js +130 -0
- package/dist/cjs/components/Items/index.d.ts +5 -0
- package/dist/cjs/components/Items/index.js +21 -0
- package/dist/cjs/components/Items/styles.module.css +168 -0
- package/dist/cjs/components/Items/types.d.ts +168 -0
- package/dist/cjs/components/Items/types.js +2 -0
- package/dist/cjs/components/Items/utils.d.ts +52 -0
- package/dist/cjs/components/Items/utils.js +218 -0
- package/dist/cjs/components/Lists/Droplist/DropList.d.ts +21 -0
- package/dist/cjs/components/Lists/Droplist/DropList.js +36 -0
- package/dist/cjs/components/Lists/Droplist/constants.d.ts +8 -0
- package/dist/cjs/components/Lists/Droplist/constants.js +10 -0
- package/dist/cjs/components/Lists/Droplist/index.d.ts +1 -0
- package/dist/cjs/components/Lists/Droplist/index.js +17 -0
- package/dist/cjs/components/Lists/List/List.d.ts +61 -0
- package/dist/cjs/components/Lists/List/List.js +62 -0
- package/dist/cjs/components/Lists/List/index.d.ts +1 -0
- package/dist/cjs/components/Lists/List/index.js +17 -0
- package/dist/cjs/components/Lists/ListPrivate/ListPrivate.d.ts +18 -0
- package/dist/cjs/components/Lists/ListPrivate/ListPrivate.js +301 -0
- package/dist/cjs/components/Lists/ListPrivate/constants.d.ts +7 -0
- package/dist/cjs/components/Lists/ListPrivate/constants.js +19 -0
- package/dist/cjs/components/Lists/ListPrivate/index.d.ts +1 -0
- package/dist/cjs/components/Lists/ListPrivate/index.js +17 -0
- package/dist/cjs/components/Lists/ListPrivate/styles.module.css +80 -0
- package/dist/cjs/components/Lists/contexts/CollapseProvider.d.ts +17 -0
- package/dist/cjs/components/Lists/contexts/CollapseProvider.js +10 -0
- package/dist/cjs/components/Lists/contexts/FocusListProvider.d.ts +9 -0
- package/dist/cjs/components/Lists/contexts/FocusListProvider.js +9 -0
- package/dist/cjs/components/Lists/contexts/NewListProvider.d.ts +33 -0
- package/dist/cjs/components/Lists/contexts/NewListProvider.js +23 -0
- package/dist/cjs/components/Lists/contexts/OpenListProvider.d.ts +6 -0
- package/dist/cjs/components/Lists/contexts/OpenListProvider.js +10 -0
- package/dist/cjs/components/Lists/contexts/SelectionProvider.d.ts +74 -0
- package/dist/cjs/components/Lists/contexts/SelectionProvider.js +90 -0
- package/dist/cjs/components/Lists/contexts/index.d.ts +5 -0
- package/dist/cjs/components/Lists/contexts/index.js +21 -0
- package/dist/cjs/components/Lists/hooks.d.ts +83 -0
- package/dist/cjs/components/Lists/hooks.js +242 -0
- package/dist/cjs/components/Lists/index.d.ts +5 -0
- package/dist/cjs/components/Lists/index.js +21 -0
- package/dist/cjs/components/Lists/styles.module.css +65 -0
- package/dist/cjs/components/Lists/types.d.ts +200 -0
- package/dist/cjs/components/Lists/types.js +2 -0
- package/dist/cjs/components/Lists/utils.d.ts +8 -0
- package/dist/cjs/components/Lists/utils.js +31 -0
- package/dist/cjs/components/index.d.ts +2 -0
- package/dist/cjs/components/index.js +18 -0
- package/dist/cjs/constants.d.ts +48 -0
- package/dist/cjs/constants.js +51 -0
- package/dist/cjs/helperComponents/CollapseBlockPrivate/CollapseBlockPrivate.d.ts +9 -0
- package/dist/cjs/helperComponents/CollapseBlockPrivate/CollapseBlockPrivate.js +15 -0
- package/dist/cjs/helperComponents/CollapseBlockPrivate/index.d.ts +1 -0
- package/dist/cjs/helperComponents/CollapseBlockPrivate/index.js +17 -0
- package/dist/cjs/helperComponents/CollapseBlockPrivate/styles.module.css +27 -0
- package/dist/cjs/helperComponents/DesktopDroplist/DesktopDroplist.d.ts +7 -0
- package/dist/cjs/helperComponents/DesktopDroplist/DesktopDroplist.js +142 -0
- package/dist/cjs/helperComponents/DesktopDroplist/index.d.ts +1 -0
- package/dist/cjs/helperComponents/DesktopDroplist/index.js +17 -0
- package/dist/cjs/helperComponents/HiddenTabButton/HiddenTabButton.d.ts +7 -0
- package/dist/cjs/helperComponents/HiddenTabButton/HiddenTabButton.js +20 -0
- package/dist/cjs/helperComponents/HiddenTabButton/index.d.ts +1 -0
- package/dist/cjs/helperComponents/HiddenTabButton/index.js +17 -0
- package/dist/cjs/helperComponents/HiddenTabButton/styles.module.css +9 -0
- package/dist/cjs/helperComponents/ItemContent/ItemContent.d.ts +17 -0
- package/dist/cjs/helperComponents/ItemContent/ItemContent.js +27 -0
- package/dist/cjs/helperComponents/ItemContent/index.d.ts +1 -0
- package/dist/cjs/helperComponents/ItemContent/index.js +17 -0
- package/dist/cjs/helperComponents/ItemContent/styles.module.css +139 -0
- package/dist/cjs/helperComponents/ListEmptyState/ListEmptyState.d.ts +16 -0
- package/dist/cjs/helperComponents/ListEmptyState/ListEmptyState.js +25 -0
- package/dist/cjs/helperComponents/ListEmptyState/hooks.d.ts +10 -0
- package/dist/cjs/helperComponents/ListEmptyState/hooks.js +30 -0
- package/dist/cjs/helperComponents/ListEmptyState/index.d.ts +2 -0
- package/dist/cjs/helperComponents/ListEmptyState/index.js +20 -0
- package/dist/cjs/helperComponents/ListEmptyState/styles.module.css +8 -0
- package/dist/cjs/helperComponents/MobileDroplist/MobileDroplist.d.ts +9 -0
- package/dist/cjs/helperComponents/MobileDroplist/MobileDroplist.js +143 -0
- package/dist/cjs/helperComponents/MobileDroplist/MobileDroplist.module.css +16 -0
- package/dist/cjs/helperComponents/MobileDroplist/index.d.ts +1 -0
- package/dist/cjs/helperComponents/MobileDroplist/index.js +17 -0
- package/dist/cjs/helperComponents/MobileDroplist/utils.d.ts +11 -0
- package/dist/cjs/helperComponents/MobileDroplist/utils.js +65 -0
- package/dist/cjs/helperComponents/Separator/Separator.d.ts +20 -0
- package/dist/cjs/helperComponents/Separator/Separator.js +40 -0
- package/dist/cjs/helperComponents/Separator/constants.d.ts +3 -0
- package/dist/cjs/helperComponents/Separator/constants.js +10 -0
- package/dist/cjs/helperComponents/Separator/index.d.ts +1 -0
- package/dist/cjs/helperComponents/Separator/index.js +17 -0
- package/dist/cjs/helperComponents/Separator/styles.module.css +168 -0
- package/dist/cjs/helperComponents/index.d.ts +5 -0
- package/dist/cjs/helperComponents/index.js +21 -0
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.js +37 -0
- package/dist/cjs/locale/index.d.ts +79 -0
- package/dist/cjs/locale/index.js +44 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/style.css +1113 -0
- package/dist/cjs/types.d.ts +38 -0
- package/dist/cjs/types.js +2 -0
- package/dist/cjs/utils.d.ts +18 -0
- package/dist/cjs/utils.js +26 -0
- package/dist/esm/components/Items/AccordionItem/AccordionItem.d.ts +4 -0
- package/dist/esm/components/Items/AccordionItem/AccordionItem.js +34 -0
- package/dist/esm/components/Items/AccordionItem/index.d.ts +1 -0
- package/dist/esm/components/Items/AccordionItem/index.js +1 -0
- package/dist/esm/components/Items/BaseItem/BaseItem.d.ts +24 -0
- package/dist/esm/components/Items/BaseItem/BaseItem.js +112 -0
- package/dist/esm/components/Items/BaseItem/constants.d.ts +3 -0
- package/dist/esm/components/Items/BaseItem/constants.js +5 -0
- package/dist/esm/components/Items/BaseItem/index.d.ts +1 -0
- package/dist/esm/components/Items/BaseItem/index.js +1 -0
- package/dist/esm/components/Items/BaseItem/styles.module.css +312 -0
- package/dist/esm/components/Items/GroupSelectItem/GroupSelectItem.d.ts +4 -0
- package/dist/esm/components/Items/GroupSelectItem/GroupSelectItem.js +19 -0
- package/dist/esm/components/Items/GroupSelectItem/index.d.ts +1 -0
- package/dist/esm/components/Items/GroupSelectItem/index.js +1 -0
- package/dist/esm/components/Items/NextListItem/NextListItem.d.ts +2 -0
- package/dist/esm/components/Items/NextListItem/NextListItem.js +68 -0
- package/dist/esm/components/Items/NextListItem/constants.d.ts +2 -0
- package/dist/esm/components/Items/NextListItem/constants.js +10 -0
- package/dist/esm/components/Items/NextListItem/index.d.ts +1 -0
- package/dist/esm/components/Items/NextListItem/index.js +1 -0
- package/dist/esm/components/Items/NextListItem/types.d.ts +4 -0
- package/dist/esm/components/Items/NextListItem/types.js +1 -0
- package/dist/esm/components/Items/PinGroupItem/PinGroupItem.d.ts +7 -0
- package/dist/esm/components/Items/PinGroupItem/PinGroupItem.js +20 -0
- package/dist/esm/components/Items/PinGroupItem/index.d.ts +1 -0
- package/dist/esm/components/Items/PinGroupItem/index.js +1 -0
- package/dist/esm/components/Items/PinGroupItem/styles.module.css +12 -0
- package/dist/esm/components/Items/SearchItem/SearchItem.d.ts +17 -0
- package/dist/esm/components/Items/SearchItem/SearchItem.js +22 -0
- package/dist/esm/components/Items/SearchItem/index.d.ts +1 -0
- package/dist/esm/components/Items/SearchItem/index.js +1 -0
- package/dist/esm/components/Items/SearchItem/styles.module.css +13 -0
- package/dist/esm/components/Items/SimpleItem/components/DragHandle/DragHandle.d.ts +7 -0
- package/dist/esm/components/Items/SimpleItem/components/DragHandle/DragHandle.js +14 -0
- package/dist/esm/components/Items/SimpleItem/components/DragHandle/index.d.ts +1 -0
- package/dist/esm/components/Items/SimpleItem/components/DragHandle/index.js +1 -0
- package/dist/esm/components/Items/SimpleItem/components/OverlayDragHandle/OverlayDragHandle.d.ts +2 -0
- package/dist/esm/components/Items/SimpleItem/components/OverlayDragHandle/OverlayDragHandle.js +6 -0
- package/dist/esm/components/Items/SimpleItem/components/OverlayDragHandle/index.d.ts +1 -0
- package/dist/esm/components/Items/SimpleItem/components/OverlayDragHandle/index.js +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlock/SimpleGroupBlock.d.ts +19 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlock/SimpleGroupBlock.js +46 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlock/index.d.ts +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlock/index.js +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/SimpleGroupBlockOverlay.d.ts +15 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/SimpleGroupBlockOverlay.js +13 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/index.d.ts +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/index.js +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItem/SimpleItem.d.ts +11 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItem/SimpleItem.js +42 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItem/index.d.ts +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItem/index.js +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItemOverlay/SimpleItemOverlay.d.ts +15 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItemOverlay/SimpleItemOverlay.js +13 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItemOverlay/index.d.ts +1 -0
- package/dist/esm/components/Items/SimpleItem/components/SimpleItemOverlay/index.js +1 -0
- package/dist/esm/components/Items/SimpleItem/components/index.d.ts +4 -0
- package/dist/esm/components/Items/SimpleItem/components/index.js +4 -0
- package/dist/esm/components/Items/SimpleItem/constants.d.ts +7 -0
- package/dist/esm/components/Items/SimpleItem/constants.js +6 -0
- package/dist/esm/components/Items/SimpleItem/index.d.ts +2 -0
- package/dist/esm/components/Items/SimpleItem/index.js +2 -0
- package/dist/esm/components/Items/SimpleItem/styles.module.css +96 -0
- package/dist/esm/components/Items/SimpleItem/types.d.ts +3 -0
- package/dist/esm/components/Items/SimpleItem/types.js +1 -0
- package/dist/esm/components/Items/SimpleItem/utils.d.ts +6 -0
- package/dist/esm/components/Items/SimpleItem/utils.js +8 -0
- package/dist/esm/components/Items/hooks.d.ts +23 -0
- package/dist/esm/components/Items/hooks.js +125 -0
- package/dist/esm/components/Items/index.d.ts +5 -0
- package/dist/esm/components/Items/index.js +5 -0
- package/dist/esm/components/Items/styles.module.css +168 -0
- package/dist/esm/components/Items/types.d.ts +168 -0
- package/dist/esm/components/Items/types.js +1 -0
- package/dist/esm/components/Items/utils.d.ts +52 -0
- package/dist/esm/components/Items/utils.js +203 -0
- package/dist/esm/components/Lists/Droplist/DropList.d.ts +21 -0
- package/dist/esm/components/Lists/Droplist/DropList.js +32 -0
- package/dist/esm/components/Lists/Droplist/constants.d.ts +8 -0
- package/dist/esm/components/Lists/Droplist/constants.js +7 -0
- package/dist/esm/components/Lists/Droplist/index.d.ts +1 -0
- package/dist/esm/components/Lists/Droplist/index.js +1 -0
- package/dist/esm/components/Lists/List/List.d.ts +61 -0
- package/dist/esm/components/Lists/List/List.js +56 -0
- package/dist/esm/components/Lists/List/index.d.ts +1 -0
- package/dist/esm/components/Lists/List/index.js +1 -0
- package/dist/esm/components/Lists/ListPrivate/ListPrivate.d.ts +18 -0
- package/dist/esm/components/Lists/ListPrivate/ListPrivate.js +295 -0
- package/dist/esm/components/Lists/ListPrivate/constants.d.ts +7 -0
- package/dist/esm/components/Lists/ListPrivate/constants.js +16 -0
- package/dist/esm/components/Lists/ListPrivate/index.d.ts +1 -0
- package/dist/esm/components/Lists/ListPrivate/index.js +1 -0
- package/dist/esm/components/Lists/ListPrivate/styles.module.css +80 -0
- package/dist/esm/components/Lists/contexts/CollapseProvider.d.ts +17 -0
- package/dist/esm/components/Lists/contexts/CollapseProvider.js +5 -0
- package/dist/esm/components/Lists/contexts/FocusListProvider.d.ts +9 -0
- package/dist/esm/components/Lists/contexts/FocusListProvider.js +5 -0
- package/dist/esm/components/Lists/contexts/NewListProvider.d.ts +33 -0
- package/dist/esm/components/Lists/contexts/NewListProvider.js +18 -0
- package/dist/esm/components/Lists/contexts/OpenListProvider.d.ts +6 -0
- package/dist/esm/components/Lists/contexts/OpenListProvider.js +6 -0
- package/dist/esm/components/Lists/contexts/SelectionProvider.d.ts +74 -0
- package/dist/esm/components/Lists/contexts/SelectionProvider.js +83 -0
- package/dist/esm/components/Lists/contexts/index.d.ts +5 -0
- package/dist/esm/components/Lists/contexts/index.js +5 -0
- package/dist/esm/components/Lists/hooks.d.ts +83 -0
- package/dist/esm/components/Lists/hooks.js +238 -0
- package/dist/esm/components/Lists/index.d.ts +5 -0
- package/dist/esm/components/Lists/index.js +5 -0
- package/dist/esm/components/Lists/styles.module.css +65 -0
- package/dist/esm/components/Lists/types.d.ts +200 -0
- package/dist/esm/components/Lists/types.js +1 -0
- package/dist/esm/components/Lists/utils.d.ts +8 -0
- package/dist/esm/components/Lists/utils.js +28 -0
- package/dist/esm/components/index.d.ts +2 -0
- package/dist/esm/components/index.js +2 -0
- package/dist/esm/constants.d.ts +48 -0
- package/dist/esm/constants.js +48 -0
- package/dist/esm/helperComponents/CollapseBlockPrivate/CollapseBlockPrivate.d.ts +9 -0
- package/dist/esm/helperComponents/CollapseBlockPrivate/CollapseBlockPrivate.js +9 -0
- package/dist/esm/helperComponents/CollapseBlockPrivate/index.d.ts +1 -0
- package/dist/esm/helperComponents/CollapseBlockPrivate/index.js +1 -0
- package/dist/esm/helperComponents/CollapseBlockPrivate/styles.module.css +27 -0
- package/dist/esm/helperComponents/DesktopDroplist/DesktopDroplist.d.ts +7 -0
- package/dist/esm/helperComponents/DesktopDroplist/DesktopDroplist.js +136 -0
- package/dist/esm/helperComponents/DesktopDroplist/index.d.ts +1 -0
- package/dist/esm/helperComponents/DesktopDroplist/index.js +1 -0
- package/dist/esm/helperComponents/HiddenTabButton/HiddenTabButton.d.ts +7 -0
- package/dist/esm/helperComponents/HiddenTabButton/HiddenTabButton.js +14 -0
- package/dist/esm/helperComponents/HiddenTabButton/index.d.ts +1 -0
- package/dist/esm/helperComponents/HiddenTabButton/index.js +1 -0
- package/dist/esm/helperComponents/HiddenTabButton/styles.module.css +9 -0
- package/dist/esm/helperComponents/ItemContent/ItemContent.d.ts +17 -0
- package/dist/esm/helperComponents/ItemContent/ItemContent.js +21 -0
- package/dist/esm/helperComponents/ItemContent/index.d.ts +1 -0
- package/dist/esm/helperComponents/ItemContent/index.js +1 -0
- package/dist/esm/helperComponents/ItemContent/styles.module.css +139 -0
- package/dist/esm/helperComponents/ListEmptyState/ListEmptyState.d.ts +16 -0
- package/dist/esm/helperComponents/ListEmptyState/ListEmptyState.js +19 -0
- package/dist/esm/helperComponents/ListEmptyState/hooks.d.ts +10 -0
- package/dist/esm/helperComponents/ListEmptyState/hooks.js +27 -0
- package/dist/esm/helperComponents/ListEmptyState/index.d.ts +2 -0
- package/dist/esm/helperComponents/ListEmptyState/index.js +2 -0
- package/dist/esm/helperComponents/ListEmptyState/styles.module.css +8 -0
- package/dist/esm/helperComponents/MobileDroplist/MobileDroplist.d.ts +9 -0
- package/dist/esm/helperComponents/MobileDroplist/MobileDroplist.js +137 -0
- package/dist/esm/helperComponents/MobileDroplist/MobileDroplist.module.css +16 -0
- package/dist/esm/helperComponents/MobileDroplist/index.d.ts +1 -0
- package/dist/esm/helperComponents/MobileDroplist/index.js +1 -0
- package/dist/esm/helperComponents/MobileDroplist/utils.d.ts +11 -0
- package/dist/esm/helperComponents/MobileDroplist/utils.js +61 -0
- package/dist/esm/helperComponents/Separator/Separator.d.ts +20 -0
- package/dist/esm/helperComponents/Separator/Separator.js +34 -0
- package/dist/esm/helperComponents/Separator/constants.d.ts +3 -0
- package/dist/esm/helperComponents/Separator/constants.js +7 -0
- package/dist/esm/helperComponents/Separator/index.d.ts +1 -0
- package/dist/esm/helperComponents/Separator/index.js +1 -0
- package/dist/esm/helperComponents/Separator/styles.module.css +168 -0
- package/dist/esm/helperComponents/index.d.ts +5 -0
- package/dist/esm/helperComponents/index.js +5 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/locale/index.d.ts +79 -0
- package/dist/esm/locale/index.js +41 -0
- package/dist/esm/style.css +1113 -0
- package/dist/esm/types.d.ts +38 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/utils.d.ts +18 -0
- package/dist/esm/utils.js +19 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +70 -0
- package/src/_iconSizes.scss +7 -0
- package/src/components/Items/AccordionItem/AccordionItem.tsx +79 -0
- package/src/components/Items/AccordionItem/index.ts +1 -0
- package/src/components/Items/BaseItem/BaseItem.tsx +274 -0
- package/src/components/Items/BaseItem/constants.ts +9 -0
- package/src/components/Items/BaseItem/index.ts +1 -0
- package/src/components/Items/BaseItem/styles.module.scss +330 -0
- package/src/components/Items/GroupSelectItem/GroupSelectItem.tsx +48 -0
- package/src/components/Items/GroupSelectItem/index.ts +1 -0
- package/src/components/Items/NextListItem/NextListItem.tsx +157 -0
- package/src/components/Items/NextListItem/constants.ts +12 -0
- package/src/components/Items/NextListItem/index.ts +1 -0
- package/src/components/Items/NextListItem/types.ts +3 -0
- package/src/components/Items/PinGroupItem/PinGroupItem.tsx +38 -0
- package/src/components/Items/PinGroupItem/index.ts +1 -0
- package/src/components/Items/PinGroupItem/styles.module.scss +14 -0
- package/src/components/Items/SearchItem/SearchItem.tsx +55 -0
- package/src/components/Items/SearchItem/index.ts +1 -0
- package/src/components/Items/SearchItem/styles.module.scss +26 -0
- package/src/components/Items/SimpleItem/components/DragHandle/DragHandle.tsx +27 -0
- package/src/components/Items/SimpleItem/components/DragHandle/index.ts +1 -0
- package/src/components/Items/SimpleItem/components/OverlayDragHandle/OverlayDragHandle.tsx +6 -0
- package/src/components/Items/SimpleItem/components/OverlayDragHandle/index.ts +1 -0
- package/src/components/Items/SimpleItem/components/SimpleGroupBlock/SimpleGroupBlock.tsx +87 -0
- package/src/components/Items/SimpleItem/components/SimpleGroupBlock/index.ts +1 -0
- package/src/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/SimpleGroupBlockOverlay.tsx +33 -0
- package/src/components/Items/SimpleItem/components/SimpleGroupBlockOverlay/index.ts +1 -0
- package/src/components/Items/SimpleItem/components/SimpleItem/SimpleItem.tsx +70 -0
- package/src/components/Items/SimpleItem/components/SimpleItem/index.ts +1 -0
- package/src/components/Items/SimpleItem/components/SimpleItemOverlay/SimpleItemOverlay.tsx +26 -0
- package/src/components/Items/SimpleItem/components/SimpleItemOverlay/index.ts +1 -0
- package/src/components/Items/SimpleItem/components/index.ts +4 -0
- package/src/components/Items/SimpleItem/constants.ts +8 -0
- package/src/components/Items/SimpleItem/index.ts +2 -0
- package/src/components/Items/SimpleItem/styles.module.scss +149 -0
- package/src/components/Items/SimpleItem/types.ts +7 -0
- package/src/components/Items/SimpleItem/utils.ts +8 -0
- package/src/components/Items/hooks.tsx +233 -0
- package/src/components/Items/index.ts +5 -0
- package/src/components/Items/styles.module.scss +107 -0
- package/src/components/Items/types.ts +203 -0
- package/src/components/Items/utils.ts +302 -0
- package/src/components/Lists/Droplist/DropList.tsx +62 -0
- package/src/components/Lists/Droplist/constants.ts +11 -0
- package/src/components/Lists/Droplist/index.ts +1 -0
- package/src/components/Lists/List/List.tsx +155 -0
- package/src/components/Lists/List/index.ts +1 -0
- package/src/components/Lists/ListPrivate/ListPrivate.tsx +560 -0
- package/src/components/Lists/ListPrivate/constants.ts +22 -0
- package/src/components/Lists/ListPrivate/index.ts +1 -0
- package/src/components/Lists/ListPrivate/styles.module.scss +90 -0
- package/src/components/Lists/contexts/CollapseProvider.tsx +22 -0
- package/src/components/Lists/contexts/FocusListProvider.tsx +15 -0
- package/src/components/Lists/contexts/NewListProvider.tsx +76 -0
- package/src/components/Lists/contexts/OpenListProvider.tsx +13 -0
- package/src/components/Lists/contexts/SelectionProvider.tsx +214 -0
- package/src/components/Lists/contexts/index.ts +5 -0
- package/src/components/Lists/hooks.ts +351 -0
- package/src/components/Lists/index.ts +5 -0
- package/src/components/Lists/styles.module.scss +95 -0
- package/src/components/Lists/types.ts +231 -0
- package/src/components/Lists/utils.ts +32 -0
- package/src/components/index.ts +2 -0
- package/src/constants.ts +53 -0
- package/src/helperComponents/CollapseBlockPrivate/CollapseBlockPrivate.tsx +32 -0
- package/src/helperComponents/CollapseBlockPrivate/index.ts +1 -0
- package/src/helperComponents/CollapseBlockPrivate/styles.module.scss +32 -0
- package/src/helperComponents/DesktopDroplist/DesktopDroplist.tsx +313 -0
- package/src/helperComponents/DesktopDroplist/index.ts +1 -0
- package/src/helperComponents/HiddenTabButton/HiddenTabButton.tsx +35 -0
- package/src/helperComponents/HiddenTabButton/index.ts +1 -0
- package/src/helperComponents/HiddenTabButton/styles.module.scss +11 -0
- package/src/helperComponents/ItemContent/ItemContent.tsx +80 -0
- package/src/helperComponents/ItemContent/index.ts +1 -0
- package/src/helperComponents/ItemContent/styles.module.scss +100 -0
- package/src/helperComponents/ListEmptyState/ListEmptyState.tsx +52 -0
- package/src/helperComponents/ListEmptyState/hooks.ts +42 -0
- package/src/helperComponents/ListEmptyState/index.ts +2 -0
- package/src/helperComponents/ListEmptyState/styles.module.scss +11 -0
- package/src/helperComponents/MobileDroplist/MobileDroplist.module.scss +25 -0
- package/src/helperComponents/MobileDroplist/MobileDroplist.tsx +230 -0
- package/src/helperComponents/MobileDroplist/index.ts +1 -0
- package/src/helperComponents/MobileDroplist/utils.tsx +76 -0
- package/src/helperComponents/Separator/Separator.tsx +115 -0
- package/src/helperComponents/Separator/constants.ts +11 -0
- package/src/helperComponents/Separator/index.ts +1 -0
- package/src/helperComponents/Separator/styles.module.scss +255 -0
- package/src/helperComponents/index.ts +5 -0
- package/src/index.ts +19 -0
- package/src/locale/index.ts +45 -0
- package/src/types.ts +44 -0
- package/src/utils.ts +26 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
import { ItemId } from '../../Items';
|
|
4
|
+
|
|
5
|
+
export type CollapseLevelContextType = {
|
|
6
|
+
level?: number;
|
|
7
|
+
};
|
|
8
|
+
export const CollapseLevelContext = createContext<CollapseLevelContextType>({});
|
|
9
|
+
export const useCollapseLevelContext = () => useContext(CollapseLevelContext);
|
|
10
|
+
|
|
11
|
+
export type CollapseContextType = {
|
|
12
|
+
openCollapseItems?: ItemId[];
|
|
13
|
+
toggleOpenCollapseItem?(id: ItemId): void;
|
|
14
|
+
};
|
|
15
|
+
export const CollapseContext = createContext<CollapseContextType>({});
|
|
16
|
+
export const useCollapseContext = () => useContext(CollapseContext);
|
|
17
|
+
|
|
18
|
+
export type CollapseState = {
|
|
19
|
+
value?: ItemId[];
|
|
20
|
+
onChange?(value?: ItemId[]): void;
|
|
21
|
+
defaultValue?: ItemId[];
|
|
22
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { createContext, KeyboardEvent, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
import { ItemId } from '../../Items';
|
|
4
|
+
|
|
5
|
+
export type FocusListContextType = {
|
|
6
|
+
activeItemId?: ItemId;
|
|
7
|
+
forceUpdateActiveItemId?(itemId: ItemId): void;
|
|
8
|
+
handleListKeyDownFactory: (ids: ItemId[], expandedIds: ItemId[]) => (e: KeyboardEvent<HTMLElement>) => void;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const FocusListContext = createContext<FocusListContextType>({
|
|
12
|
+
handleListKeyDownFactory: () => () => {},
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export const useFocusListContext = () => useContext(FocusListContext);
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { createContext, ReactNode, useContext, useMemo } from 'react';
|
|
2
|
+
|
|
3
|
+
import { ITEM_PREFIXES } from '../../../constants';
|
|
4
|
+
import { ItemContentProps } from '../../../helperComponents';
|
|
5
|
+
import { Size } from '../../../types';
|
|
6
|
+
import { FlattenItem, FocusFlattenItem, ItemId } from '../../Items';
|
|
7
|
+
|
|
8
|
+
type ContentRenderProps = {
|
|
9
|
+
id?: ItemId;
|
|
10
|
+
content?: ItemContentProps | ReactNode;
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type PublicListContextType = {
|
|
15
|
+
/** Размер списка */
|
|
16
|
+
size?: Size;
|
|
17
|
+
/** Отображать ли маркер у выбранного элемента списка */
|
|
18
|
+
marker?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Рендер функция основного контента айтема
|
|
21
|
+
*/
|
|
22
|
+
contentRender?(props: ContentRenderProps): ReactNode;
|
|
23
|
+
virtualized?: boolean;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export type PrivateListContextType = {
|
|
27
|
+
flattenItems: Record<string, FlattenItem>;
|
|
28
|
+
focusFlattenItems: Record<string, FocusFlattenItem>;
|
|
29
|
+
firstItemId?: ItemId;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
type Child = {
|
|
33
|
+
children: ReactNode;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type ListContextType = PublicListContextType & PrivateListContextType;
|
|
37
|
+
|
|
38
|
+
export const ListContext = createContext<ListContextType>({
|
|
39
|
+
flattenItems: {},
|
|
40
|
+
focusFlattenItems: {},
|
|
41
|
+
firstItemId: ITEM_PREFIXES.default,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
export function useNewListContext() {
|
|
45
|
+
return useContext<ListContextType>(ListContext);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function extractListProps<T extends ListContextType>({
|
|
49
|
+
size,
|
|
50
|
+
marker,
|
|
51
|
+
flattenItems,
|
|
52
|
+
focusFlattenItems,
|
|
53
|
+
contentRender,
|
|
54
|
+
firstItemId,
|
|
55
|
+
virtualized,
|
|
56
|
+
}: T) {
|
|
57
|
+
return { size, marker, contentRender, flattenItems, focusFlattenItems, firstItemId, virtualized };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function NewListContextProvider({
|
|
61
|
+
children,
|
|
62
|
+
size,
|
|
63
|
+
marker,
|
|
64
|
+
flattenItems,
|
|
65
|
+
focusFlattenItems,
|
|
66
|
+
contentRender,
|
|
67
|
+
firstItemId,
|
|
68
|
+
virtualized,
|
|
69
|
+
}: ListContextType & Child) {
|
|
70
|
+
const value = useMemo(
|
|
71
|
+
() => extractListProps({ size, marker, flattenItems, focusFlattenItems, contentRender, firstItemId, virtualized }),
|
|
72
|
+
[size, marker, flattenItems, focusFlattenItems, contentRender, firstItemId, virtualized],
|
|
73
|
+
);
|
|
74
|
+
|
|
75
|
+
return <ListContext.Provider value={value}>{children}</ListContext.Provider>;
|
|
76
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
|
|
3
|
+
export type OpenListContextType = {
|
|
4
|
+
closeDroplistOnItemClick?: boolean;
|
|
5
|
+
closeDroplist(): void;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export const OpenListContext = createContext<OpenListContextType>({
|
|
9
|
+
closeDroplist: () => {},
|
|
10
|
+
closeDroplistOnItemClick: false,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export const useOpenListContext = () => useContext(OpenListContext);
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { useValueControl } from '@cloud-ru/ds-utils';
|
|
2
|
+
import { createContext, Dispatch, ReactNode, SetStateAction, useCallback, useContext } from 'react';
|
|
3
|
+
|
|
4
|
+
import { MODE } from '../../../constants';
|
|
5
|
+
import { ItemId } from '../../Items';
|
|
6
|
+
|
|
7
|
+
export type SelectionValue = ItemId | ItemId[];
|
|
8
|
+
|
|
9
|
+
export type OnChangeHandler<T = SelectionValue> = (value: T) => void;
|
|
10
|
+
|
|
11
|
+
export type SelectionSingleValueType = ItemId;
|
|
12
|
+
|
|
13
|
+
export type SelectionSingleState = {
|
|
14
|
+
/** Начальное состояние */
|
|
15
|
+
defaultValue?: ItemId;
|
|
16
|
+
/** Controlled состояние */
|
|
17
|
+
value?: ItemId;
|
|
18
|
+
/** Controlled обработчик изменения состояния — получает выбранный `ItemId` */
|
|
19
|
+
onChange?: OnChangeHandler<ItemId>;
|
|
20
|
+
/** Режим выбора */
|
|
21
|
+
mode: typeof MODE.Single;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export type SelectionSingleProps = {
|
|
25
|
+
setValue?: Dispatch<SetStateAction<ItemId | undefined>>;
|
|
26
|
+
/** Внутренний toggle-обработчик: выбирает/снимает один элемент по id */
|
|
27
|
+
onChange?: OnChangeHandler<ItemId>;
|
|
28
|
+
/** Режим выбора single */
|
|
29
|
+
isSelectionSingle: true;
|
|
30
|
+
/** Режим выбора multi */
|
|
31
|
+
isSelectionMultiple: false;
|
|
32
|
+
} & Omit<SelectionSingleState, 'onChange'>;
|
|
33
|
+
|
|
34
|
+
export type SelectionMultipleState = {
|
|
35
|
+
/** Начальное состояние */
|
|
36
|
+
defaultValue?: ItemId[];
|
|
37
|
+
/** Controlled состояние */
|
|
38
|
+
value?: ItemId[];
|
|
39
|
+
/** Controlled обработчик изменения состояния — получает массив выбранных `ItemId[]` */
|
|
40
|
+
onChange?: OnChangeHandler<ItemId[]>;
|
|
41
|
+
/** Режим выбора */
|
|
42
|
+
mode: typeof MODE.Multiple;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
export type SelectionMultipleProps = {
|
|
46
|
+
setValue?: Dispatch<SetStateAction<ItemId[] | undefined>>;
|
|
47
|
+
/** Внутренний toggle-обработчик: добавляет/убирает один элемент по id */
|
|
48
|
+
onChange?: OnChangeHandler<ItemId>;
|
|
49
|
+
/** Режим выбора single */
|
|
50
|
+
isSelectionSingle: false;
|
|
51
|
+
/** Режим выбора multi */
|
|
52
|
+
isSelectionMultiple: true;
|
|
53
|
+
} & Omit<SelectionMultipleState, 'onChange'>;
|
|
54
|
+
|
|
55
|
+
type SelectionNoneProps = {
|
|
56
|
+
mode?: typeof MODE.None;
|
|
57
|
+
value?: undefined;
|
|
58
|
+
onChange?: undefined;
|
|
59
|
+
setValue?: undefined;
|
|
60
|
+
defaultValue?: undefined;
|
|
61
|
+
isSelectionSingle?: undefined;
|
|
62
|
+
isSelectionMultiple?: undefined;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
type SelectionContextType =
|
|
66
|
+
| Omit<SelectionNoneProps, 'defaultValue'>
|
|
67
|
+
| Omit<SelectionSingleProps, 'defaultValue'>
|
|
68
|
+
| Omit<SelectionMultipleProps, 'defaultValue'>;
|
|
69
|
+
|
|
70
|
+
export type SelectionState = {
|
|
71
|
+
/**
|
|
72
|
+
* Настройки выбора элементов. `mode: 'single'` — один выбранный элемент (`value: ItemId`),
|
|
73
|
+
* `mode: 'multiple'` — множественный выбор (`value: ItemId[]`). Без `selection` выбора нет —
|
|
74
|
+
* клик вызывает только `onClick` элемента.
|
|
75
|
+
*/
|
|
76
|
+
selection?: SelectionSingleState | SelectionMultipleState;
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const SelectionContext = createContext<SelectionContextType>({
|
|
80
|
+
value: undefined,
|
|
81
|
+
onChange: undefined,
|
|
82
|
+
mode: undefined,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export function isSelectionMultipleProps(props: object): props is SelectionMultipleState {
|
|
86
|
+
return 'mode' in props && props['mode'] === MODE.Multiple;
|
|
87
|
+
}
|
|
88
|
+
export function isSelectionSingleProps(props: object): props is SelectionSingleState {
|
|
89
|
+
return 'mode' in props && props['mode'] === MODE.Single;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
type Child = {
|
|
93
|
+
children: ReactNode;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
function SelectionNoneProvider({ children }: SelectionNoneProps & Child) {
|
|
97
|
+
return (
|
|
98
|
+
<SelectionContext.Provider
|
|
99
|
+
value={{
|
|
100
|
+
mode: MODE.None,
|
|
101
|
+
}}
|
|
102
|
+
>
|
|
103
|
+
{children}
|
|
104
|
+
</SelectionContext.Provider>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function SelectionSingleProvider({
|
|
109
|
+
value: valueProp,
|
|
110
|
+
defaultValue,
|
|
111
|
+
onChange: onChangeProp,
|
|
112
|
+
children,
|
|
113
|
+
}: SelectionSingleState & Child) {
|
|
114
|
+
const [value, setValue] = useValueControl<ItemId | undefined>({
|
|
115
|
+
value: valueProp,
|
|
116
|
+
defaultValue,
|
|
117
|
+
// На deselect внутреннее значение становится undefined; наружу передаём только реальный id.
|
|
118
|
+
onChange: newValue => newValue !== undefined && onChangeProp?.(newValue),
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const onChange = useCallback(
|
|
122
|
+
(newValue: SelectionSingleValueType) =>
|
|
123
|
+
setValue((oldValue: ItemId | undefined) => {
|
|
124
|
+
if (newValue !== oldValue) {
|
|
125
|
+
return newValue;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return undefined;
|
|
129
|
+
}),
|
|
130
|
+
[setValue],
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
return (
|
|
134
|
+
<SelectionContext.Provider
|
|
135
|
+
value={{
|
|
136
|
+
value,
|
|
137
|
+
onChange,
|
|
138
|
+
mode: MODE.Single,
|
|
139
|
+
isSelectionSingle: true,
|
|
140
|
+
isSelectionMultiple: false,
|
|
141
|
+
setValue,
|
|
142
|
+
}}
|
|
143
|
+
>
|
|
144
|
+
{children}
|
|
145
|
+
</SelectionContext.Provider>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function SelectionMultipleProvider({
|
|
150
|
+
value: valueProp,
|
|
151
|
+
defaultValue,
|
|
152
|
+
onChange: onChangeProp,
|
|
153
|
+
children,
|
|
154
|
+
}: SelectionMultipleState & Child) {
|
|
155
|
+
const [value, setValue] = useValueControl<ItemId[] | undefined>({
|
|
156
|
+
value: valueProp,
|
|
157
|
+
defaultValue,
|
|
158
|
+
onChange: newValue => onChangeProp?.(newValue ?? []),
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
const onChange = useCallback(
|
|
162
|
+
(newValue: SelectionSingleValueType) => {
|
|
163
|
+
setValue((oldValues: ItemId[] | undefined) => {
|
|
164
|
+
if (Array.isArray(oldValues)) {
|
|
165
|
+
if (oldValues.includes(newValue)) {
|
|
166
|
+
return oldValues.filter(oldValue => oldValue !== newValue);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return oldValues.concat(newValue);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if (oldValues === undefined) {
|
|
173
|
+
return Array.isArray(newValue) ? newValue : [newValue];
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return undefined;
|
|
177
|
+
});
|
|
178
|
+
},
|
|
179
|
+
[setValue],
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<SelectionContext.Provider
|
|
184
|
+
value={{
|
|
185
|
+
value,
|
|
186
|
+
onChange,
|
|
187
|
+
mode: MODE.Multiple,
|
|
188
|
+
isSelectionSingle: false,
|
|
189
|
+
isSelectionMultiple: true,
|
|
190
|
+
setValue,
|
|
191
|
+
}}
|
|
192
|
+
>
|
|
193
|
+
{children}
|
|
194
|
+
</SelectionContext.Provider>
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
type SelectionProviderProps = SelectionSingleState | SelectionMultipleState | { mode?: typeof MODE.None };
|
|
199
|
+
|
|
200
|
+
export function SelectionProvider({ children, ...props }: SelectionProviderProps & Child) {
|
|
201
|
+
if (isSelectionSingleProps(props)) {
|
|
202
|
+
return <SelectionSingleProvider {...props}>{children}</SelectionSingleProvider>;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (isSelectionMultipleProps(props)) {
|
|
206
|
+
return <SelectionMultipleProvider {...props}>{children}</SelectionMultipleProvider>;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
return <SelectionNoneProvider>{children}</SelectionNoneProvider>;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
export function useSelectionContext() {
|
|
213
|
+
return useContext(SelectionContext);
|
|
214
|
+
}
|
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
import { DragEndEvent } from '@dnd-kit/core';
|
|
2
|
+
import { preventScrollOnArrowKeys, useValueControl } from '@cloud-ru/ds-utils';
|
|
3
|
+
import { KeyboardEvent, RefObject, useCallback, useImperativeHandle, useMemo, useRef, useState } from 'react';
|
|
4
|
+
|
|
5
|
+
import { ITEM_PREFIXES, ITEM_TYPE, MODE } from '../../constants';
|
|
6
|
+
import { Mode, SearchState } from '../../types';
|
|
7
|
+
import {
|
|
8
|
+
extractActiveItems,
|
|
9
|
+
FocusFlattenItem,
|
|
10
|
+
Item,
|
|
11
|
+
ItemId,
|
|
12
|
+
kindFlattenItems,
|
|
13
|
+
ReorderItem,
|
|
14
|
+
useCreateBaseItems,
|
|
15
|
+
} from '../Items';
|
|
16
|
+
import { CollapseState } from './contexts';
|
|
17
|
+
import { reorderItems } from './utils';
|
|
18
|
+
|
|
19
|
+
// Селектор фокусируемых узлов для возврата фокуса на триггер при «выходе вверх» из списка.
|
|
20
|
+
const FOCUSABLE_SELECTOR = 'input,textarea,select,button,a[href],[tabindex]';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Вернуть фокус на триггер списка. `mainRef` может указывать не на сам фокусируемый узел, а на
|
|
24
|
+
* обёртку popover'а (`PopoverPrivate` перезаписывает переданный `triggerRef.current` своим span-
|
|
25
|
+
* wrapper'ом — см. MR!101). Span не фокусируется, поэтому если узел сам не focusable — фокусируем
|
|
26
|
+
* первый focusable-потомок (input у FieldSelect, Button у голого Droplist).
|
|
27
|
+
*/
|
|
28
|
+
function focusReturnTarget(el: HTMLElement | null | undefined) {
|
|
29
|
+
if (!el) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const target = el.matches(FOCUSABLE_SELECTOR) ? el : el.querySelector<HTMLElement>(FOCUSABLE_SELECTOR);
|
|
33
|
+
target?.focus();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
type UseListItemsModelProps = {
|
|
37
|
+
items: Item[] | ReorderItem[];
|
|
38
|
+
pinTop: Item[];
|
|
39
|
+
pinBottom: Item[];
|
|
40
|
+
search?: SearchState;
|
|
41
|
+
collapse: CollapseState;
|
|
42
|
+
selectionMode?: Mode;
|
|
43
|
+
footerActiveElementsRefs?: RefObject<HTMLElement>[];
|
|
44
|
+
/**
|
|
45
|
+
* Колбек drag&drop-переупорядочивания (см. `ListProps.onItemsReorder`). Наличие переключает
|
|
46
|
+
* `items` в сортируемый режим: `kindFlattenItems` размечает каждый узел `type: ITEM_TYPE.Simple`,
|
|
47
|
+
* а хук дополнительно возвращает `onDragEnd`/`sortableIds` для `DndContext`/`SortableContext`
|
|
48
|
+
* (собираемых уже в `ListPrivate`).
|
|
49
|
+
*/
|
|
50
|
+
onItemsReorder?(items: ReorderItem[]): void;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Единая модель данных списка для `List` и `Droplist`: collapse-состояние,
|
|
55
|
+
* плоские карты айтемов (`flattenItems` / `focusFlattenItems`) и производный
|
|
56
|
+
* порядок навигации (`ids` / `expandedIds`). Оба компонента собирают одну и ту же
|
|
57
|
+
* структуру, поэтому она живёт в одном хуке — расхождение между списком и дроплистом
|
|
58
|
+
* физически невозможно.
|
|
59
|
+
*/
|
|
60
|
+
export function useListItemsModel({
|
|
61
|
+
items: itemsProp,
|
|
62
|
+
pinTop: pinTopProp,
|
|
63
|
+
pinBottom: pinBottomProp,
|
|
64
|
+
search,
|
|
65
|
+
collapse,
|
|
66
|
+
selectionMode,
|
|
67
|
+
footerActiveElementsRefs,
|
|
68
|
+
onItemsReorder,
|
|
69
|
+
}: UseListItemsModelProps) {
|
|
70
|
+
const hasSearch = useMemo(() => Boolean(search), [search]);
|
|
71
|
+
const sortable = Boolean(onItemsReorder);
|
|
72
|
+
|
|
73
|
+
const [openCollapseItems = [], setOpenCollapsedItems] = useValueControl<ItemId[] | undefined>(collapse);
|
|
74
|
+
const toggleOpenCollapseItem = useCallback(
|
|
75
|
+
(id: ItemId) =>
|
|
76
|
+
setOpenCollapsedItems((items: ItemId[]) =>
|
|
77
|
+
items?.includes(id) ? items.filter(item => item !== id) : (items ?? []).concat([id]),
|
|
78
|
+
),
|
|
79
|
+
[setOpenCollapsedItems],
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
const { searchItem, footerItems } = useCreateBaseItems({ footerActiveElementsRefs });
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Объект с пропсами всех вложенных айтемов; ключ id
|
|
86
|
+
*/
|
|
87
|
+
const { flattenItems, focusFlattenItems, ...memorizedItems } = useMemo(() => {
|
|
88
|
+
const pinTop = kindFlattenItems({
|
|
89
|
+
items: pinTopProp,
|
|
90
|
+
prefix: ITEM_PREFIXES.pinTop,
|
|
91
|
+
parentId: ITEM_PREFIXES.default,
|
|
92
|
+
});
|
|
93
|
+
const items = kindFlattenItems({
|
|
94
|
+
items: itemsProp,
|
|
95
|
+
prefix: ITEM_PREFIXES.default,
|
|
96
|
+
parentId: ITEM_PREFIXES.default,
|
|
97
|
+
sortable,
|
|
98
|
+
});
|
|
99
|
+
const pinBottom = kindFlattenItems({
|
|
100
|
+
items: pinBottomProp,
|
|
101
|
+
prefix: ITEM_PREFIXES.pinBottom,
|
|
102
|
+
parentId: ITEM_PREFIXES.default,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const flattenItems = { ...pinTop.flattenItems, ...pinBottom.flattenItems, ...items.flattenItems };
|
|
106
|
+
const focusFlattenItems = {
|
|
107
|
+
...pinTop.focusFlattenItems,
|
|
108
|
+
...pinBottom.focusFlattenItems,
|
|
109
|
+
...items.focusFlattenItems,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
[...footerItems, searchItem].forEach(item => {
|
|
113
|
+
flattenItems[item.id] = item;
|
|
114
|
+
focusFlattenItems[item.id] = { ...item, originalId: item.id, items: [], key: item.id, allChildIds: [] };
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
return { items, pinTop, pinBottom, flattenItems, focusFlattenItems };
|
|
118
|
+
}, [itemsProp, pinTopProp, pinBottomProp, searchItem, footerItems, sortable]);
|
|
119
|
+
|
|
120
|
+
const { ids, expandedIds } = useMemo(() => {
|
|
121
|
+
const { pinTop, items, pinBottom } = memorizedItems;
|
|
122
|
+
|
|
123
|
+
let ids: ItemId[] = [];
|
|
124
|
+
let expandedIds: ItemId[] = [];
|
|
125
|
+
|
|
126
|
+
if (hasSearch) {
|
|
127
|
+
ids.push(searchItem.id);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
[pinTop, items, pinBottom].forEach(({ focusFlattenItems, focusCloseChildIds }) => {
|
|
131
|
+
const activeItems = extractActiveItems({
|
|
132
|
+
focusFlattenItems,
|
|
133
|
+
focusCloseChildIds,
|
|
134
|
+
openCollapseItems,
|
|
135
|
+
isSelectionMultiple: selectionMode === MODE.Multiple,
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
ids = ids.concat(activeItems.ids);
|
|
139
|
+
expandedIds = expandedIds.concat(activeItems.expandedIds);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
footerItems.forEach(footerItem => {
|
|
143
|
+
ids.push(footerItem.id);
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
return { ids, expandedIds };
|
|
147
|
+
}, [footerItems, hasSearch, memorizedItems, openCollapseItems, searchItem.id, selectionMode]);
|
|
148
|
+
|
|
149
|
+
// Работает с исходным (не плоским) деревом `itemsProp` — гарантированно `ReorderItem[]`, когда
|
|
150
|
+
// `onItemsReorder` передан (см. дискриминированный `ListProps` — вызывающая сторона это
|
|
151
|
+
// обеспечивает на уровне типов, здесь только рантайм-каст).
|
|
152
|
+
const handleDragEnd = useCallback(
|
|
153
|
+
({ active, over }: DragEndEvent) => {
|
|
154
|
+
if (!onItemsReorder || !over || active.id === over.id) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
onItemsReorder(reorderItems(itemsProp as ReorderItem[], active.id, over.id));
|
|
159
|
+
},
|
|
160
|
+
[itemsProp, onItemsReorder],
|
|
161
|
+
);
|
|
162
|
+
|
|
163
|
+
return {
|
|
164
|
+
hasSearch,
|
|
165
|
+
openCollapseItems,
|
|
166
|
+
toggleOpenCollapseItem,
|
|
167
|
+
searchItem,
|
|
168
|
+
footerItems,
|
|
169
|
+
flattenItems,
|
|
170
|
+
focusFlattenItems,
|
|
171
|
+
memorizedItems,
|
|
172
|
+
ids,
|
|
173
|
+
expandedIds,
|
|
174
|
+
firstItemId: ids[0],
|
|
175
|
+
// Всегда `undefined`, когда `onItemsReorder` не передан — `ListPrivate` включает
|
|
176
|
+
// `DndContext`/`SortableContext` и принудительно отключает виртуализацию по наличию `onDragEnd`.
|
|
177
|
+
onDragEnd: sortable ? handleDragEnd : undefined,
|
|
178
|
+
// Внешний `SortableContext` держит сортируемые элементы верхнего уровня: строки без группы
|
|
179
|
+
// (`Simple`) и сами группы (`Group`) — группы переставляются между собой за ручку на заголовке.
|
|
180
|
+
// Строки внутри групп сортируются в собственных `SortableContext` (их разворачивает
|
|
181
|
+
// `getRenderItems`), чтобы переупорядочивание шло строго внутри группы. Для плоского списка —
|
|
182
|
+
// просто все id.
|
|
183
|
+
sortableIds: sortable
|
|
184
|
+
? memorizedItems.items.focusCloseChildIds
|
|
185
|
+
.map(focusId => focusFlattenItems[focusId])
|
|
186
|
+
.filter(item => item?.type === ITEM_TYPE.Simple || item?.type === ITEM_TYPE.Group)
|
|
187
|
+
.map(item => item.originalId)
|
|
188
|
+
: undefined,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
type UseNewKeyboardNavigationProps<T extends HTMLElement> = {
|
|
193
|
+
mainRef?: RefObject<T>;
|
|
194
|
+
btnRef?: RefObject<HTMLButtonElement>;
|
|
195
|
+
focusFlattenItems: Record<string, FocusFlattenItem>;
|
|
196
|
+
keyboardNavigationRef?: RefObject<{ focusItem(item: ItemId): void }>;
|
|
197
|
+
hasListInFocusChain: boolean;
|
|
198
|
+
firstItemId: ItemId;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
export function useNewKeyboardNavigation<T extends HTMLElement>({
|
|
202
|
+
mainRef,
|
|
203
|
+
btnRef,
|
|
204
|
+
focusFlattenItems,
|
|
205
|
+
keyboardNavigationRef,
|
|
206
|
+
hasListInFocusChain,
|
|
207
|
+
firstItemId,
|
|
208
|
+
}: UseNewKeyboardNavigationProps<T>) {
|
|
209
|
+
const defaultActiveItemId = hasListInFocusChain ? undefined : firstItemId;
|
|
210
|
+
const [activeItemId, setActiveItemId] = useState<ItemId | undefined>(() => defaultActiveItemId);
|
|
211
|
+
const activeItemIdRef = useRef<ItemId | undefined>(defaultActiveItemId);
|
|
212
|
+
|
|
213
|
+
const resetActiveItemId = useCallback(() => {
|
|
214
|
+
setActiveItemId(defaultActiveItemId);
|
|
215
|
+
activeItemIdRef.current = defaultActiveItemId;
|
|
216
|
+
}, [defaultActiveItemId]);
|
|
217
|
+
|
|
218
|
+
const handleListKeyDownFactory = useCallback(
|
|
219
|
+
(ids: ItemId[], expandedIds: ItemId[]) => (e: KeyboardEvent<T>) => {
|
|
220
|
+
// Стрелки навигации по списку гасим централизованно — иначе нативное поведение скроллит
|
|
221
|
+
// страницу (элементы — кнопки/li, не текст, поэтому безопасны все четыре стрелки).
|
|
222
|
+
preventScrollOnArrowKeys(e);
|
|
223
|
+
|
|
224
|
+
switch (e.key) {
|
|
225
|
+
case 'ArrowDown': {
|
|
226
|
+
if (activeItemIdRef.current !== undefined) {
|
|
227
|
+
const activeIndex = ids.findIndex(id => id === activeItemIdRef.current);
|
|
228
|
+
|
|
229
|
+
const nextId = Math.min(activeIndex + 1, ids.length - 1);
|
|
230
|
+
const itemId = ids[nextId];
|
|
231
|
+
const item = focusFlattenItems[itemId];
|
|
232
|
+
|
|
233
|
+
activeItemIdRef.current = itemId;
|
|
234
|
+
setActiveItemId(itemId);
|
|
235
|
+
|
|
236
|
+
if (item?.type !== ITEM_TYPE.Group) {
|
|
237
|
+
item?.itemRef?.current?.focus();
|
|
238
|
+
}
|
|
239
|
+
} else {
|
|
240
|
+
const itemId = ids[0];
|
|
241
|
+
const item = focusFlattenItems[itemId];
|
|
242
|
+
|
|
243
|
+
activeItemIdRef.current = itemId;
|
|
244
|
+
setActiveItemId(itemId);
|
|
245
|
+
|
|
246
|
+
if (item?.type !== ITEM_TYPE.Group) {
|
|
247
|
+
item?.itemRef?.current?.focus();
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
e.stopPropagation();
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
case 'ArrowUp': {
|
|
255
|
+
if (ids[0] === activeItemIdRef.current) {
|
|
256
|
+
if (hasListInFocusChain) {
|
|
257
|
+
const item = focusFlattenItems[ids[0]];
|
|
258
|
+
|
|
259
|
+
if (item?.parentId === ITEM_PREFIXES.default) {
|
|
260
|
+
activeItemIdRef.current = undefined;
|
|
261
|
+
setActiveItemId(undefined);
|
|
262
|
+
focusReturnTarget(mainRef?.current);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
} else if (activeItemIdRef.current !== undefined) {
|
|
266
|
+
const activeIndex = ids.findIndex(id => id === activeItemIdRef.current);
|
|
267
|
+
const nextId = Math.max(activeIndex - 1, 0);
|
|
268
|
+
const itemId = ids[nextId];
|
|
269
|
+
const item = focusFlattenItems[itemId];
|
|
270
|
+
|
|
271
|
+
activeItemIdRef.current = itemId;
|
|
272
|
+
setActiveItemId(itemId);
|
|
273
|
+
|
|
274
|
+
if (item?.type !== ITEM_TYPE.Group) {
|
|
275
|
+
item?.itemRef?.current?.focus();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
e.stopPropagation();
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
case 'ArrowRight': {
|
|
284
|
+
if (activeItemIdRef.current !== undefined && expandedIds.includes(activeItemIdRef.current)) {
|
|
285
|
+
const item = focusFlattenItems[activeItemIdRef.current];
|
|
286
|
+
const newItemId = item?.items[0];
|
|
287
|
+
|
|
288
|
+
if (newItemId === undefined) {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const newItem = focusFlattenItems[newItemId];
|
|
293
|
+
|
|
294
|
+
activeItemIdRef.current = newItemId;
|
|
295
|
+
setActiveItemId(newItemId);
|
|
296
|
+
|
|
297
|
+
setTimeout(() => newItem?.itemRef?.current?.focus(), 0);
|
|
298
|
+
|
|
299
|
+
e.stopPropagation();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
case 'Tab': {
|
|
306
|
+
if (activeItemIdRef.current !== undefined) {
|
|
307
|
+
if (hasListInFocusChain) {
|
|
308
|
+
e.preventDefault();
|
|
309
|
+
e.stopPropagation();
|
|
310
|
+
|
|
311
|
+
activeItemIdRef.current = undefined;
|
|
312
|
+
setActiveItemId(undefined);
|
|
313
|
+
focusReturnTarget(mainRef?.current);
|
|
314
|
+
} else {
|
|
315
|
+
resetActiveItemId();
|
|
316
|
+
}
|
|
317
|
+
} else {
|
|
318
|
+
btnRef && !e.shiftKey ? btnRef?.current?.focus() : focusReturnTarget(mainRef?.current);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
default: {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
[focusFlattenItems, hasListInFocusChain, mainRef, resetActiveItemId, btnRef],
|
|
329
|
+
);
|
|
330
|
+
|
|
331
|
+
const forceUpdateActiveItemId = useCallback(
|
|
332
|
+
(itemId: ItemId) => {
|
|
333
|
+
setActiveItemId(itemId);
|
|
334
|
+
activeItemIdRef.current = itemId;
|
|
335
|
+
|
|
336
|
+
const item = focusFlattenItems[itemId];
|
|
337
|
+
|
|
338
|
+
item?.itemRef?.current?.focus();
|
|
339
|
+
},
|
|
340
|
+
[focusFlattenItems],
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
useImperativeHandle(keyboardNavigationRef, () => ({ focusItem: forceUpdateActiveItemId }), [forceUpdateActiveItemId]);
|
|
344
|
+
|
|
345
|
+
return {
|
|
346
|
+
resetActiveItemId,
|
|
347
|
+
activeItemId,
|
|
348
|
+
forceUpdateActiveItemId,
|
|
349
|
+
handleListKeyDownFactory,
|
|
350
|
+
};
|
|
351
|
+
}
|