@chayns-components/core 5.3.9 → 5.3.11-alpha.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/AGENTS.md +73 -2
- package/lib/cjs/components/accordion/Accordion.js +107 -12
- package/lib/cjs/components/accordion/Accordion.js.map +1 -1
- package/lib/cjs/components/accordion/Accordion.styles.js +23 -3
- package/lib/cjs/components/accordion/Accordion.styles.js.map +1 -1
- package/lib/cjs/components/accordion/accordion-body/AccordionBody.styles.js +3 -1
- package/lib/cjs/components/accordion/accordion-body/AccordionBody.styles.js.map +1 -1
- package/lib/cjs/components/accordion/accordion-group/AccordionGroup.js +36 -19
- package/lib/cjs/components/accordion/accordion-group/AccordionGroup.js.map +1 -1
- package/lib/cjs/components/accordion/accordion-head/AccordionHead.js +6 -3
- package/lib/cjs/components/accordion/accordion-head/AccordionHead.js.map +1 -1
- package/lib/cjs/components/accordion/accordion-head/AccordionHead.styles.js +14 -0
- package/lib/cjs/components/accordion/accordion-head/AccordionHead.styles.js.map +1 -1
- package/lib/cjs/components/amount-control/AmountControl.js +31 -17
- package/lib/cjs/components/amount-control/AmountControl.js.map +1 -1
- package/lib/cjs/components/amount-control/AmountControl.styles.js +18 -2
- package/lib/cjs/components/amount-control/AmountControl.styles.js.map +1 -1
- package/lib/cjs/components/button/Button.js +5 -1
- package/lib/cjs/components/button/Button.js.map +1 -1
- package/lib/cjs/components/button/Button.styles.js +17 -0
- package/lib/cjs/components/button/Button.styles.js.map +1 -1
- package/lib/cjs/components/button/Button.types.js.map +1 -1
- package/lib/cjs/components/checkbox/Checkbox.js +5 -1
- package/lib/cjs/components/checkbox/Checkbox.js.map +1 -1
- package/lib/cjs/components/checkbox/Checkbox.styles.js +29 -2
- package/lib/cjs/components/checkbox/Checkbox.styles.js.map +1 -1
- package/lib/cjs/components/color-scheme-provider/ColorSchemeProvider.js +7 -2
- package/lib/cjs/components/color-scheme-provider/ColorSchemeProvider.js.map +1 -1
- package/lib/cjs/components/color-scheme-provider/ColorSchemeProvider.styles.js +8 -2
- package/lib/cjs/components/color-scheme-provider/ColorSchemeProvider.styles.js.map +1 -1
- package/lib/cjs/components/combobox/ComboBox.js +52 -5
- package/lib/cjs/components/combobox/ComboBox.js.map +1 -1
- package/lib/cjs/components/combobox/ComboBox.styles.js +11 -0
- package/lib/cjs/components/combobox/ComboBox.styles.js.map +1 -1
- package/lib/cjs/components/combobox/ComboBox.types.js.map +1 -1
- package/lib/cjs/components/context-menu/ContextMenu.js +100 -6
- package/lib/cjs/components/context-menu/ContextMenu.js.map +1 -1
- package/lib/cjs/components/context-menu/ContextMenu.styles.js +38 -0
- package/lib/cjs/components/context-menu/ContextMenu.styles.js.map +1 -1
- package/lib/cjs/components/context-menu/ContextMenu.types.js.map +1 -1
- package/lib/cjs/components/file-input/FileInput.js +4 -2
- package/lib/cjs/components/file-input/FileInput.js.map +1 -1
- package/lib/cjs/components/file-list/file-item/FileItem.js +23 -2
- package/lib/cjs/components/file-list/file-item/FileItem.js.map +1 -1
- package/lib/cjs/components/file-list/file-item/FileItem.styles.js +19 -1
- package/lib/cjs/components/file-list/file-item/FileItem.styles.js.map +1 -1
- package/lib/cjs/components/file-select/FileSelect.js +27 -4
- package/lib/cjs/components/file-select/FileSelect.js.map +1 -1
- package/lib/cjs/components/file-select/FileSelect.styles.js +10 -0
- package/lib/cjs/components/file-select/FileSelect.styles.js.map +1 -1
- package/lib/cjs/components/filter/Filter.js +51 -16
- package/lib/cjs/components/filter/Filter.js.map +1 -1
- package/lib/cjs/components/filter/Filter.styles.js +9 -0
- package/lib/cjs/components/filter/Filter.styles.js.map +1 -1
- package/lib/cjs/components/filter/filter-content/FilterContent.js +14 -5
- package/lib/cjs/components/filter/filter-content/FilterContent.js.map +1 -1
- package/lib/cjs/components/filter/filter-content/FilterContent.types.js.map +1 -1
- package/lib/cjs/components/filter-buttons/FilterButtons.js +69 -4
- package/lib/cjs/components/filter-buttons/FilterButtons.js.map +1 -1
- package/lib/cjs/components/filter-buttons/filter-button/FilterButton.js +40 -2
- package/lib/cjs/components/filter-buttons/filter-button/FilterButton.js.map +1 -1
- package/lib/cjs/components/filter-buttons/filter-button/FilterButton.styles.js +11 -0
- package/lib/cjs/components/filter-buttons/filter-button/FilterButton.styles.js.map +1 -1
- package/lib/cjs/components/grid-image/GridImage.js +20 -2
- package/lib/cjs/components/grid-image/GridImage.js.map +1 -1
- package/lib/cjs/components/grid-image/GridImage.styles.js +11 -2
- package/lib/cjs/components/grid-image/GridImage.styles.js.map +1 -1
- package/lib/cjs/components/grouped-image/GroupedImage.js +23 -4
- package/lib/cjs/components/grouped-image/GroupedImage.js.map +1 -1
- package/lib/cjs/components/grouped-image/GroupedImage.styles.js +9 -0
- package/lib/cjs/components/grouped-image/GroupedImage.styles.js.map +1 -1
- package/lib/cjs/components/highlight-slider/HighlightSlider.js +10 -3
- package/lib/cjs/components/highlight-slider/HighlightSlider.js.map +1 -1
- package/lib/cjs/components/highlight-slider/highlight-slider-item/HighlightSliderItem.js +21 -4
- package/lib/cjs/components/highlight-slider/highlight-slider-item/HighlightSliderItem.js.map +1 -1
- package/lib/cjs/components/highlight-slider/highlight-slider-item/HighlightSliderItem.styles.js +11 -2
- package/lib/cjs/components/highlight-slider/highlight-slider-item/HighlightSliderItem.styles.js.map +1 -1
- package/lib/cjs/components/icon/Icon.js +24 -5
- package/lib/cjs/components/icon/Icon.js.map +1 -1
- package/lib/cjs/components/icon/Icon.styles.js +23 -0
- package/lib/cjs/components/icon/Icon.styles.js.map +1 -1
- package/lib/cjs/components/input/Input.js +29 -8
- package/lib/cjs/components/input/Input.js.map +1 -1
- package/lib/cjs/components/input/Input.styles.js +33 -3
- package/lib/cjs/components/input/Input.styles.js.map +1 -1
- package/lib/cjs/components/list/List.js +124 -37
- package/lib/cjs/components/list/List.js.map +1 -1
- package/lib/cjs/components/list/List.utils.js +107 -1
- package/lib/cjs/components/list/List.utils.js.map +1 -1
- package/lib/cjs/components/list/list-item/ListItem.js +82 -3
- package/lib/cjs/components/list/list-item/ListItem.js.map +1 -1
- package/lib/cjs/components/list/list-item/ListItem.styles.js +9 -0
- package/lib/cjs/components/list/list-item/ListItem.styles.js.map +1 -1
- package/lib/cjs/components/list/list-item/list-item-head/ListItemHead.js +40 -5
- package/lib/cjs/components/list/list-item/list-item-head/ListItemHead.js.map +1 -1
- package/lib/cjs/components/list/list-item/list-item-head/ListItemHead.styles.js +5 -1
- package/lib/cjs/components/list/list-item/list-item-head/ListItemHead.styles.js.map +1 -1
- package/lib/cjs/components/list/list-item/list-item-head/list-item-right-element/ListItemRightElement.js +32 -1
- package/lib/cjs/components/list/list-item/list-item-head/list-item-right-element/ListItemRightElement.js.map +1 -1
- package/lib/cjs/components/list/list-item/list-item-head/list-item-subtitle/ListItemSubtitle.js +32 -1
- package/lib/cjs/components/list/list-item/list-item-head/list-item-subtitle/ListItemSubtitle.js.map +1 -1
- package/lib/cjs/components/list/list-item/list-item-head/list-item-title/ListItemTitle.js +30 -1
- package/lib/cjs/components/list/list-item/list-item-head/list-item-title/ListItemTitle.js.map +1 -1
- package/lib/cjs/components/list/list-item/useListItemFocus.js +47 -0
- package/lib/cjs/components/list/list-item/useListItemFocus.js.map +1 -0
- package/lib/cjs/components/masonry/Masonry.context.js +17 -0
- package/lib/cjs/components/masonry/Masonry.context.js.map +1 -0
- package/lib/cjs/components/masonry/Masonry.hooks.js +53 -0
- package/lib/cjs/components/masonry/Masonry.hooks.js.map +1 -0
- package/lib/cjs/components/masonry/Masonry.js +81 -0
- package/lib/cjs/components/masonry/Masonry.js.map +1 -0
- package/lib/cjs/components/masonry/Masonry.styles.js +16 -0
- package/lib/cjs/components/masonry/Masonry.styles.js.map +1 -0
- package/lib/cjs/components/masonry/Masonry.types.js +6 -0
- package/lib/cjs/components/masonry/Masonry.types.js.map +1 -0
- package/lib/cjs/components/masonry/Masonry.utils.js +121 -0
- package/lib/cjs/components/masonry/Masonry.utils.js.map +1 -0
- package/lib/cjs/components/masonry/masonry-item/MasonryItem.js +77 -0
- package/lib/cjs/components/masonry/masonry-item/MasonryItem.js.map +1 -0
- package/lib/cjs/components/masonry/masonry-item/MasonryItem.styles.js +17 -0
- package/lib/cjs/components/masonry/masonry-item/MasonryItem.styles.js.map +1 -0
- package/lib/cjs/components/mention-finder/MentionFinder.js +31 -2
- package/lib/cjs/components/mention-finder/MentionFinder.js.map +1 -1
- package/lib/cjs/components/mention-finder/mention-finder-item/MentionFinderItem.styles.js.map +1 -1
- package/lib/cjs/components/multi-action-button/MultiActionButton.js +36 -3
- package/lib/cjs/components/multi-action-button/MultiActionButton.js.map +1 -1
- package/lib/cjs/components/multi-action-button/MultiActionButton.types.js.map +1 -1
- package/lib/cjs/components/multi-action-button/action-button/ActionButton.js +7 -1
- package/lib/cjs/components/multi-action-button/action-button/ActionButton.js.map +1 -1
- package/lib/cjs/components/multi-action-button/action-button/ActionButton.styles.js +12 -0
- package/lib/cjs/components/multi-action-button/action-button/ActionButton.styles.js.map +1 -1
- package/lib/cjs/components/number-input/NumberInput.js +13 -10
- package/lib/cjs/components/number-input/NumberInput.js.map +1 -1
- package/lib/cjs/components/page-provider/PageProvider.js +4 -2
- package/lib/cjs/components/page-provider/PageProvider.js.map +1 -1
- package/lib/cjs/components/popup/Popup.js +8 -1
- package/lib/cjs/components/popup/Popup.js.map +1 -1
- package/lib/cjs/components/radio-button/RadioButton.js +29 -15
- package/lib/cjs/components/radio-button/RadioButton.js.map +1 -1
- package/lib/cjs/components/radio-button/RadioButton.styles.js +19 -8
- package/lib/cjs/components/radio-button/RadioButton.styles.js.map +1 -1
- package/lib/cjs/components/radio-button/radio-button-group/RadioButtonGroup.js +7 -4
- package/lib/cjs/components/radio-button/radio-button-group/RadioButtonGroup.js.map +1 -1
- package/lib/cjs/components/search-box/SearchBox.js +5 -2
- package/lib/cjs/components/search-box/SearchBox.js.map +1 -1
- package/lib/cjs/components/search-input/SearchInput.js +40 -41
- package/lib/cjs/components/search-input/SearchInput.js.map +1 -1
- package/lib/cjs/components/search-input/SearchInput.styles.js +25 -2
- package/lib/cjs/components/search-input/SearchInput.styles.js.map +1 -1
- package/lib/cjs/components/select-button/SelectButton.js +4 -2
- package/lib/cjs/components/select-button/SelectButton.js.map +1 -1
- package/lib/cjs/components/setup-wizard/SetupWizard.js +7 -4
- package/lib/cjs/components/setup-wizard/SetupWizard.js.map +1 -1
- package/lib/cjs/components/setup-wizard/setup-wizard-item/SetupWizardItem.js +5 -3
- package/lib/cjs/components/setup-wizard/setup-wizard-item/SetupWizardItem.js.map +1 -1
- package/lib/cjs/components/sharing-bar/SharingBar.js +31 -6
- package/lib/cjs/components/sharing-bar/SharingBar.js.map +1 -1
- package/lib/cjs/components/sharing-bar/SharingBar.styles.js +5 -0
- package/lib/cjs/components/sharing-bar/SharingBar.styles.js.map +1 -1
- package/lib/cjs/components/sharing-button/SharingButton.js +4 -2
- package/lib/cjs/components/sharing-button/SharingButton.js.map +1 -1
- package/lib/cjs/components/sharing-context-menu/SharingContextMenu.js +3 -1
- package/lib/cjs/components/sharing-context-menu/SharingContextMenu.js.map +1 -1
- package/lib/cjs/components/signature/Signature.js +6 -3
- package/lib/cjs/components/signature/Signature.js.map +1 -1
- package/lib/cjs/components/slider/Slider.js +30 -7
- package/lib/cjs/components/slider/Slider.js.map +1 -1
- package/lib/cjs/components/slider/Slider.styles.js +9 -2
- package/lib/cjs/components/slider/Slider.styles.js.map +1 -1
- package/lib/cjs/components/slider-button/SliderButton.js +63 -6
- package/lib/cjs/components/slider-button/SliderButton.js.map +1 -1
- package/lib/cjs/components/slider-button/SliderButton.styles.js +19 -2
- package/lib/cjs/components/slider-button/SliderButton.styles.js.map +1 -1
- package/lib/cjs/components/slider-button/SliderButton.types.js +6 -0
- package/lib/cjs/components/slider-button/SliderButton.types.js.map +1 -0
- package/lib/cjs/components/slider-button/useSliderButtonPopupKeyboard.js +66 -0
- package/lib/cjs/components/slider-button/useSliderButtonPopupKeyboard.js.map +1 -0
- package/lib/cjs/components/slider-button/useSliderButtonThumbKeyboard.js +47 -0
- package/lib/cjs/components/slider-button/useSliderButtonThumbKeyboard.js.map +1 -0
- package/lib/cjs/components/tag-input/TagInput.js +91 -36
- package/lib/cjs/components/tag-input/TagInput.js.map +1 -1
- package/lib/cjs/components/tag-input/TagInput.styles.js +31 -3
- package/lib/cjs/components/tag-input/TagInput.styles.js.map +1 -1
- package/lib/cjs/components/text-area/TextArea.js +17 -8
- package/lib/cjs/components/text-area/TextArea.js.map +1 -1
- package/lib/cjs/components/text-area/TextArea.styles.js +15 -1
- package/lib/cjs/components/text-area/TextArea.styles.js.map +1 -1
- package/lib/cjs/components/truncation/Truncation.js +17 -3
- package/lib/cjs/components/truncation/Truncation.js.map +1 -1
- package/lib/cjs/components/truncation/Truncation.styles.js +19 -1
- package/lib/cjs/components/truncation/Truncation.styles.js.map +1 -1
- package/lib/cjs/hooks/useKeyboardFocusHighlighting.js +68 -0
- package/lib/cjs/hooks/useKeyboardFocusHighlighting.js.map +1 -0
- package/lib/cjs/index.js +7 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/utils/file.js.map +1 -1
- package/lib/cjs/utils/keyboardFocusHighlighting.styles.js +30 -0
- package/lib/cjs/utils/keyboardFocusHighlighting.styles.js.map +1 -0
- package/lib/esm/components/accordion/Accordion.js +105 -12
- package/lib/esm/components/accordion/Accordion.js.map +1 -1
- package/lib/esm/components/accordion/Accordion.styles.js +23 -3
- package/lib/esm/components/accordion/Accordion.styles.js.map +1 -1
- package/lib/esm/components/accordion/accordion-body/AccordionBody.styles.js +3 -1
- package/lib/esm/components/accordion/accordion-body/AccordionBody.styles.js.map +1 -1
- package/lib/esm/components/accordion/accordion-group/AccordionGroup.js +33 -19
- package/lib/esm/components/accordion/accordion-group/AccordionGroup.js.map +1 -1
- package/lib/esm/components/accordion/accordion-head/AccordionHead.js +6 -3
- package/lib/esm/components/accordion/accordion-head/AccordionHead.js.map +1 -1
- package/lib/esm/components/accordion/accordion-head/AccordionHead.styles.js +14 -0
- package/lib/esm/components/accordion/accordion-head/AccordionHead.styles.js.map +1 -1
- package/lib/esm/components/amount-control/AmountControl.js +30 -16
- package/lib/esm/components/amount-control/AmountControl.js.map +1 -1
- package/lib/esm/components/amount-control/AmountControl.styles.js +18 -2
- package/lib/esm/components/amount-control/AmountControl.styles.js.map +1 -1
- package/lib/esm/components/button/Button.js +5 -1
- package/lib/esm/components/button/Button.js.map +1 -1
- package/lib/esm/components/button/Button.styles.js +17 -0
- package/lib/esm/components/button/Button.styles.js.map +1 -1
- package/lib/esm/components/button/Button.types.js.map +1 -1
- package/lib/esm/components/checkbox/Checkbox.js +5 -1
- package/lib/esm/components/checkbox/Checkbox.js.map +1 -1
- package/lib/esm/components/checkbox/Checkbox.styles.js +29 -2
- package/lib/esm/components/checkbox/Checkbox.styles.js.map +1 -1
- package/lib/esm/components/color-scheme-provider/ColorSchemeProvider.js +7 -2
- package/lib/esm/components/color-scheme-provider/ColorSchemeProvider.js.map +1 -1
- package/lib/esm/components/color-scheme-provider/ColorSchemeProvider.styles.js +8 -2
- package/lib/esm/components/color-scheme-provider/ColorSchemeProvider.styles.js.map +1 -1
- package/lib/esm/components/combobox/ComboBox.js +50 -5
- package/lib/esm/components/combobox/ComboBox.js.map +1 -1
- package/lib/esm/components/combobox/ComboBox.styles.js +11 -0
- package/lib/esm/components/combobox/ComboBox.styles.js.map +1 -1
- package/lib/esm/components/combobox/ComboBox.types.js.map +1 -1
- package/lib/esm/components/context-menu/ContextMenu.js +99 -5
- package/lib/esm/components/context-menu/ContextMenu.js.map +1 -1
- package/lib/esm/components/context-menu/ContextMenu.styles.js +38 -0
- package/lib/esm/components/context-menu/ContextMenu.styles.js.map +1 -1
- package/lib/esm/components/context-menu/ContextMenu.types.js.map +1 -1
- package/lib/esm/components/file-input/FileInput.js +4 -2
- package/lib/esm/components/file-input/FileInput.js.map +1 -1
- package/lib/esm/components/file-list/file-item/FileItem.js +24 -3
- package/lib/esm/components/file-list/file-item/FileItem.js.map +1 -1
- package/lib/esm/components/file-list/file-item/FileItem.styles.js +18 -0
- package/lib/esm/components/file-list/file-item/FileItem.styles.js.map +1 -1
- package/lib/esm/components/file-select/FileSelect.js +27 -4
- package/lib/esm/components/file-select/FileSelect.js.map +1 -1
- package/lib/esm/components/file-select/FileSelect.styles.js +10 -0
- package/lib/esm/components/file-select/FileSelect.styles.js.map +1 -1
- package/lib/esm/components/filter/Filter.js +52 -16
- package/lib/esm/components/filter/Filter.js.map +1 -1
- package/lib/esm/components/filter/Filter.styles.js +9 -0
- package/lib/esm/components/filter/Filter.styles.js.map +1 -1
- package/lib/esm/components/filter/filter-content/FilterContent.js +15 -5
- package/lib/esm/components/filter/filter-content/FilterContent.js.map +1 -1
- package/lib/esm/components/filter/filter-content/FilterContent.types.js.map +1 -1
- package/lib/esm/components/filter-buttons/FilterButtons.js +69 -5
- package/lib/esm/components/filter-buttons/FilterButtons.js.map +1 -1
- package/lib/esm/components/filter-buttons/filter-button/FilterButton.js +40 -2
- package/lib/esm/components/filter-buttons/filter-button/FilterButton.js.map +1 -1
- package/lib/esm/components/filter-buttons/filter-button/FilterButton.styles.js +11 -0
- package/lib/esm/components/filter-buttons/filter-button/FilterButton.styles.js.map +1 -1
- package/lib/esm/components/grid-image/GridImage.js +20 -2
- package/lib/esm/components/grid-image/GridImage.js.map +1 -1
- package/lib/esm/components/grid-image/GridImage.styles.js +10 -1
- package/lib/esm/components/grid-image/GridImage.styles.js.map +1 -1
- package/lib/esm/components/grouped-image/GroupedImage.js +22 -4
- package/lib/esm/components/grouped-image/GroupedImage.js.map +1 -1
- package/lib/esm/components/grouped-image/GroupedImage.styles.js +9 -0
- package/lib/esm/components/grouped-image/GroupedImage.styles.js.map +1 -1
- package/lib/esm/components/highlight-slider/HighlightSlider.js +10 -3
- package/lib/esm/components/highlight-slider/HighlightSlider.js.map +1 -1
- package/lib/esm/components/highlight-slider/highlight-slider-item/HighlightSliderItem.js +20 -3
- package/lib/esm/components/highlight-slider/highlight-slider-item/HighlightSliderItem.js.map +1 -1
- package/lib/esm/components/highlight-slider/highlight-slider-item/HighlightSliderItem.styles.js +10 -1
- package/lib/esm/components/highlight-slider/highlight-slider-item/HighlightSliderItem.styles.js.map +1 -1
- package/lib/esm/components/icon/Icon.js +26 -7
- package/lib/esm/components/icon/Icon.js.map +1 -1
- package/lib/esm/components/icon/Icon.styles.js +23 -0
- package/lib/esm/components/icon/Icon.styles.js.map +1 -1
- package/lib/esm/components/input/Input.js +24 -4
- package/lib/esm/components/input/Input.js.map +1 -1
- package/lib/esm/components/input/Input.styles.js +33 -3
- package/lib/esm/components/input/Input.styles.js.map +1 -1
- package/lib/esm/components/list/List.js +123 -37
- package/lib/esm/components/list/List.js.map +1 -1
- package/lib/esm/components/list/List.utils.js +99 -0
- package/lib/esm/components/list/List.utils.js.map +1 -1
- package/lib/esm/components/list/list-item/ListItem.js +83 -4
- package/lib/esm/components/list/list-item/ListItem.js.map +1 -1
- package/lib/esm/components/list/list-item/ListItem.styles.js +9 -0
- package/lib/esm/components/list/list-item/ListItem.styles.js.map +1 -1
- package/lib/esm/components/list/list-item/list-item-head/ListItemHead.js +41 -6
- package/lib/esm/components/list/list-item/list-item-head/ListItemHead.js.map +1 -1
- package/lib/esm/components/list/list-item/list-item-head/ListItemHead.styles.js +4 -0
- package/lib/esm/components/list/list-item/list-item-head/ListItemHead.styles.js.map +1 -1
- package/lib/esm/components/list/list-item/list-item-head/list-item-right-element/ListItemRightElement.js +33 -2
- package/lib/esm/components/list/list-item/list-item-head/list-item-right-element/ListItemRightElement.js.map +1 -1
- package/lib/esm/components/list/list-item/list-item-head/list-item-subtitle/ListItemSubtitle.js +33 -2
- package/lib/esm/components/list/list-item/list-item-head/list-item-subtitle/ListItemSubtitle.js.map +1 -1
- package/lib/esm/components/list/list-item/list-item-head/list-item-title/ListItemTitle.js +30 -1
- package/lib/esm/components/list/list-item/list-item-head/list-item-title/ListItemTitle.js.map +1 -1
- package/lib/esm/components/list/list-item/useListItemFocus.js +40 -0
- package/lib/esm/components/list/list-item/useListItemFocus.js.map +1 -0
- package/lib/esm/components/masonry/Masonry.context.js +10 -0
- package/lib/esm/components/masonry/Masonry.context.js.map +1 -0
- package/lib/esm/components/masonry/Masonry.hooks.js +44 -0
- package/lib/esm/components/masonry/Masonry.hooks.js.map +1 -0
- package/lib/esm/components/masonry/Masonry.js +74 -0
- package/lib/esm/components/masonry/Masonry.js.map +1 -0
- package/lib/esm/components/masonry/Masonry.styles.js +9 -0
- package/lib/esm/components/masonry/Masonry.styles.js.map +1 -0
- package/lib/esm/components/masonry/Masonry.types.js +2 -0
- package/lib/esm/components/masonry/Masonry.types.js.map +1 -0
- package/lib/esm/components/masonry/Masonry.utils.js +110 -0
- package/lib/esm/components/masonry/Masonry.utils.js.map +1 -0
- package/lib/esm/components/masonry/masonry-item/MasonryItem.js +69 -0
- package/lib/esm/components/masonry/masonry-item/MasonryItem.js.map +1 -0
- package/lib/esm/components/masonry/masonry-item/MasonryItem.styles.js +10 -0
- package/lib/esm/components/masonry/masonry-item/MasonryItem.styles.js.map +1 -0
- package/lib/esm/components/mention-finder/MentionFinder.js +30 -2
- package/lib/esm/components/mention-finder/MentionFinder.js.map +1 -1
- package/lib/esm/components/mention-finder/mention-finder-item/MentionFinderItem.styles.js.map +1 -1
- package/lib/esm/components/multi-action-button/MultiActionButton.js +36 -3
- package/lib/esm/components/multi-action-button/MultiActionButton.js.map +1 -1
- package/lib/esm/components/multi-action-button/MultiActionButton.types.js.map +1 -1
- package/lib/esm/components/multi-action-button/action-button/ActionButton.js +7 -1
- package/lib/esm/components/multi-action-button/action-button/ActionButton.js.map +1 -1
- package/lib/esm/components/multi-action-button/action-button/ActionButton.styles.js +12 -0
- package/lib/esm/components/multi-action-button/action-button/ActionButton.styles.js.map +1 -1
- package/lib/esm/components/number-input/NumberInput.js +13 -10
- package/lib/esm/components/number-input/NumberInput.js.map +1 -1
- package/lib/esm/components/page-provider/PageProvider.js +4 -2
- package/lib/esm/components/page-provider/PageProvider.js.map +1 -1
- package/lib/esm/components/popup/Popup.js +8 -1
- package/lib/esm/components/popup/Popup.js.map +1 -1
- package/lib/esm/components/radio-button/RadioButton.js +29 -15
- package/lib/esm/components/radio-button/RadioButton.js.map +1 -1
- package/lib/esm/components/radio-button/RadioButton.styles.js +19 -8
- package/lib/esm/components/radio-button/RadioButton.styles.js.map +1 -1
- package/lib/esm/components/radio-button/radio-button-group/RadioButtonGroup.js +7 -4
- package/lib/esm/components/radio-button/radio-button-group/RadioButtonGroup.js.map +1 -1
- package/lib/esm/components/search-box/SearchBox.js +5 -2
- package/lib/esm/components/search-box/SearchBox.js.map +1 -1
- package/lib/esm/components/search-input/SearchInput.js +41 -42
- package/lib/esm/components/search-input/SearchInput.js.map +1 -1
- package/lib/esm/components/search-input/SearchInput.styles.js +24 -1
- package/lib/esm/components/search-input/SearchInput.styles.js.map +1 -1
- package/lib/esm/components/select-button/SelectButton.js +4 -2
- package/lib/esm/components/select-button/SelectButton.js.map +1 -1
- package/lib/esm/components/setup-wizard/SetupWizard.js +7 -4
- package/lib/esm/components/setup-wizard/SetupWizard.js.map +1 -1
- package/lib/esm/components/setup-wizard/setup-wizard-item/SetupWizardItem.js +5 -3
- package/lib/esm/components/setup-wizard/setup-wizard-item/SetupWizardItem.js.map +1 -1
- package/lib/esm/components/sharing-bar/SharingBar.js +30 -5
- package/lib/esm/components/sharing-bar/SharingBar.js.map +1 -1
- package/lib/esm/components/sharing-bar/SharingBar.styles.js +5 -0
- package/lib/esm/components/sharing-bar/SharingBar.styles.js.map +1 -1
- package/lib/esm/components/sharing-button/SharingButton.js +4 -2
- package/lib/esm/components/sharing-button/SharingButton.js.map +1 -1
- package/lib/esm/components/sharing-context-menu/SharingContextMenu.js +3 -1
- package/lib/esm/components/sharing-context-menu/SharingContextMenu.js.map +1 -1
- package/lib/esm/components/signature/Signature.js +6 -3
- package/lib/esm/components/signature/Signature.js.map +1 -1
- package/lib/esm/components/slider/Slider.js +30 -7
- package/lib/esm/components/slider/Slider.js.map +1 -1
- package/lib/esm/components/slider/Slider.styles.js +8 -1
- package/lib/esm/components/slider/Slider.styles.js.map +1 -1
- package/lib/esm/components/slider-button/SliderButton.js +62 -6
- package/lib/esm/components/slider-button/SliderButton.js.map +1 -1
- package/lib/esm/components/slider-button/SliderButton.styles.js +18 -1
- package/lib/esm/components/slider-button/SliderButton.styles.js.map +1 -1
- package/lib/esm/components/slider-button/SliderButton.types.js +2 -0
- package/lib/esm/components/slider-button/SliderButton.types.js.map +1 -0
- package/lib/esm/components/slider-button/useSliderButtonPopupKeyboard.js +56 -0
- package/lib/esm/components/slider-button/useSliderButtonPopupKeyboard.js.map +1 -0
- package/lib/esm/components/slider-button/useSliderButtonThumbKeyboard.js +38 -0
- package/lib/esm/components/slider-button/useSliderButtonThumbKeyboard.js.map +1 -0
- package/lib/esm/components/tag-input/TagInput.js +85 -35
- package/lib/esm/components/tag-input/TagInput.js.map +1 -1
- package/lib/esm/components/tag-input/TagInput.styles.js +29 -1
- package/lib/esm/components/tag-input/TagInput.styles.js.map +1 -1
- package/lib/esm/components/text-area/TextArea.js +18 -9
- package/lib/esm/components/text-area/TextArea.js.map +1 -1
- package/lib/esm/components/text-area/TextArea.styles.js +14 -0
- package/lib/esm/components/text-area/TextArea.styles.js.map +1 -1
- package/lib/esm/components/truncation/Truncation.js +18 -4
- package/lib/esm/components/truncation/Truncation.js.map +1 -1
- package/lib/esm/components/truncation/Truncation.styles.js +18 -0
- package/lib/esm/components/truncation/Truncation.styles.js.map +1 -1
- package/lib/esm/hooks/useKeyboardFocusHighlighting.js +61 -0
- package/lib/esm/hooks/useKeyboardFocusHighlighting.js.map +1 -0
- package/lib/esm/index.js +1 -0
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/utils/file.js.map +1 -1
- package/lib/esm/utils/keyboardFocusHighlighting.styles.js +25 -0
- package/lib/esm/utils/keyboardFocusHighlighting.styles.js.map +1 -0
- package/lib/types/components/accordion/Accordion.d.ts +5 -0
- package/lib/types/components/accordion/Accordion.styles.d.ts +8 -4
- package/lib/types/components/accordion/accordion-body/AccordionBody.styles.d.ts +2 -2
- package/lib/types/components/accordion/accordion-group/AccordionGroup.d.ts +7 -2
- package/lib/types/components/accordion/accordion-head/AccordionHead.d.ts +1 -0
- package/lib/types/components/accordion/accordion-head/AccordionHead.styles.d.ts +18 -18
- package/lib/types/components/amount-control/AmountControl.d.ts +5 -0
- package/lib/types/components/amount-control/AmountControl.styles.d.ts +8 -4
- package/lib/types/components/button/Button.styles.d.ts +8 -6
- package/lib/types/components/button/Button.types.d.ts +8 -0
- package/lib/types/components/checkbox/Checkbox.d.ts +4 -0
- package/lib/types/components/checkbox/Checkbox.styles.d.ts +5 -1
- package/lib/types/components/color-scheme-provider/ColorSchemeProvider.d.ts +5 -0
- package/lib/types/components/combobox/ComboBox.styles.d.ts +4 -2
- package/lib/types/components/combobox/ComboBox.types.d.ts +5 -0
- package/lib/types/components/context-menu/ContextMenu.styles.d.ts +4 -2
- package/lib/types/components/context-menu/ContextMenu.types.d.ts +6 -0
- package/lib/types/components/context-menu/context-menu-content/ContextMenuContent.styles.d.ts +2 -2
- package/lib/types/components/dropdown-body-wrapper/delayed-dropdown-content/DelayedDropdownContent.styles.d.ts +2 -2
- package/lib/types/components/expandable-content/ExpandableContent.styles.d.ts +2 -2
- package/lib/types/components/file-input/FileInput.d.ts +4 -0
- package/lib/types/components/file-input/FileInput.styles.d.ts +2 -2
- package/lib/types/components/file-list/file-item/FileItem.styles.d.ts +3 -0
- package/lib/types/components/file-select/FileSelect.d.ts +4 -0
- package/lib/types/components/file-select/FileSelect.styles.d.ts +6 -4
- package/lib/types/components/filter/Filter.d.ts +1 -0
- package/lib/types/components/filter/Filter.styles.d.ts +6 -4
- package/lib/types/components/filter/filter-content/FilterContent.types.d.ts +4 -0
- package/lib/types/components/filter-buttons/FilterButtons.d.ts +4 -0
- package/lib/types/components/filter-buttons/filter-button/FilterButton.d.ts +5 -0
- package/lib/types/components/filter-buttons/filter-button/FilterButton.styles.d.ts +12 -8
- package/lib/types/components/grid-image/GridImage.d.ts +4 -0
- package/lib/types/components/grid-image/GridImage.styles.d.ts +4 -2
- package/lib/types/components/grouped-image/GroupedImage.d.ts +4 -0
- package/lib/types/components/grouped-image/GroupedImage.styles.d.ts +8 -6
- package/lib/types/components/highlight-slider/HighlightSlider.d.ts +4 -0
- package/lib/types/components/highlight-slider/highlight-slider-item/HighlightSliderItem.d.ts +3 -0
- package/lib/types/components/highlight-slider/highlight-slider-item/HighlightSliderItem.styles.d.ts +9 -5
- package/lib/types/components/icon/Icon.d.ts +4 -0
- package/lib/types/components/icon/Icon.styles.d.ts +1 -0
- package/lib/types/components/input/Input.d.ts +4 -0
- package/lib/types/components/input/Input.styles.d.ts +17 -9
- package/lib/types/components/list/List.d.ts +11 -0
- package/lib/types/components/list/List.utils.d.ts +16 -1
- package/lib/types/components/list/list-item/ListItem.styles.d.ts +64 -64
- package/lib/types/components/list/list-item/list-item-body/ListItemBody.styles.d.ts +2 -2
- package/lib/types/components/list/list-item/list-item-head/ListItemHead.d.ts +1 -0
- package/lib/types/components/list/list-item/list-item-head/ListItemHead.styles.d.ts +195 -194
- package/lib/types/components/list/list-item/list-item-head/list-item-right-element/ListItemRightElement.d.ts +1 -0
- package/lib/types/components/list/list-item/list-item-head/list-item-subtitle/ListItemSubtitle.d.ts +1 -0
- package/lib/types/components/list/list-item/list-item-head/list-item-title/ListItemTitle.d.ts +1 -0
- package/lib/types/components/list/list-item/useListItemFocus.d.ts +13 -0
- package/lib/types/components/masonry/Masonry.context.d.ts +3 -0
- package/lib/types/components/masonry/Masonry.d.ts +3 -0
- package/lib/types/components/masonry/Masonry.hooks.d.ts +22 -0
- package/lib/types/components/masonry/Masonry.styles.d.ts +5 -0
- package/lib/types/components/masonry/Masonry.types.d.ts +40 -0
- package/lib/types/components/masonry/Masonry.utils.d.ts +22 -0
- package/lib/types/components/masonry/masonry-item/MasonryItem.d.ts +5 -0
- package/lib/types/components/masonry/masonry-item/MasonryItem.styles.d.ts +5 -0
- package/lib/types/components/mention-finder/MentionFinder.styles.d.ts +4 -4
- package/lib/types/components/multi-action-button/MultiActionButton.styles.d.ts +2 -2
- package/lib/types/components/multi-action-button/MultiActionButton.types.d.ts +7 -0
- package/lib/types/components/multi-action-button/action-button/ActionButton.d.ts +4 -1
- package/lib/types/components/multi-action-button/action-button/ActionButton.styles.d.ts +4 -2
- package/lib/types/components/number-input/NumberInput.d.ts +4 -0
- package/lib/types/components/popup/popup-content-wrapper/PopupContentWrapper.styles.d.ts +2 -2
- package/lib/types/components/progress-bar/ProgressBar.styles.d.ts +6 -6
- package/lib/types/components/radio-button/RadioButton.d.ts +4 -0
- package/lib/types/components/radio-button/RadioButton.styles.d.ts +15 -9
- package/lib/types/components/radio-button/radio-button-group/RadioButtonGroup.d.ts +5 -0
- package/lib/types/components/search-box/SearchBox.d.ts +4 -0
- package/lib/types/components/search-box/SearchBox.styles.d.ts +2 -2
- package/lib/types/components/search-input/SearchInput.d.ts +4 -0
- package/lib/types/components/search-input/SearchInput.styles.d.ts +17 -9
- package/lib/types/components/select-button/SelectButton.d.ts +4 -0
- package/lib/types/components/setup-wizard/SetupWizard.d.ts +5 -0
- package/lib/types/components/sharing-bar/SharingBar.d.ts +4 -0
- package/lib/types/components/sharing-button/SharingButton.d.ts +1 -1
- package/lib/types/components/sharing-context-menu/SharingContextMenu.d.ts +10 -2
- package/lib/types/components/signature/Signature.d.ts +4 -0
- package/lib/types/components/skeleton/base-skeleton/BaseSkeleton.styles.d.ts +4 -4
- package/lib/types/components/slider/Slider.d.ts +8 -0
- package/lib/types/components/slider/Slider.styles.d.ts +18 -14
- package/lib/types/components/slider-button/SliderButton.d.ts +1 -28
- package/lib/types/components/slider-button/SliderButton.styles.d.ts +6 -4
- package/lib/types/components/slider-button/SliderButton.types.d.ts +32 -0
- package/lib/types/components/slider-button/useSliderButtonPopupKeyboard.d.ts +17 -0
- package/lib/types/components/slider-button/useSliderButtonThumbKeyboard.d.ts +13 -0
- package/lib/types/components/tag-input/TagInput.d.ts +4 -0
- package/lib/types/components/tag-input/TagInput.styles.d.ts +12 -2
- package/lib/types/components/text-area/TextArea.d.ts +4 -0
- package/lib/types/components/text-area/TextArea.styles.d.ts +1 -0
- package/lib/types/components/truncation/Truncation.d.ts +4 -0
- package/lib/types/components/truncation/Truncation.styles.d.ts +7 -2
- package/lib/types/hooks/useKeyboardFocusHighlighting.d.ts +5 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/utils/file.d.ts +1 -1
- package/lib/types/utils/keyboardFocusHighlighting.styles.d.ts +9 -0
- package/package.json +2 -2
|
@@ -8,7 +8,8 @@ const ListItemTitle = ({
|
|
|
8
8
|
shouldShowMultilineTitle,
|
|
9
9
|
isOpen,
|
|
10
10
|
onResize,
|
|
11
|
-
onTitleWidthChange
|
|
11
|
+
onTitleWidthChange,
|
|
12
|
+
shouldAllowRightElementFocus = true
|
|
12
13
|
}) => {
|
|
13
14
|
const titleWrapperRef = useRef(null);
|
|
14
15
|
const wrapperRef = useRef(null);
|
|
@@ -52,6 +53,33 @@ const ListItemTitle = ({
|
|
|
52
53
|
}
|
|
53
54
|
return false;
|
|
54
55
|
}, [topElement]);
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
const topElementWrapper = topElementWrapperRef.current;
|
|
58
|
+
if (!topElementWrapper) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const focusableElements = Array.from(topElementWrapper.querySelectorAll('a[href], button, input, select, textarea, [tabindex], [contenteditable="true"]'));
|
|
62
|
+
focusableElements.forEach(element => {
|
|
63
|
+
const currentElement = element;
|
|
64
|
+
const datasetKey = 'listItemRightElementOriginalTabIndex';
|
|
65
|
+
if (shouldAllowRightElementFocus) {
|
|
66
|
+
const originalTabIndex = currentElement.dataset[datasetKey];
|
|
67
|
+
if (typeof originalTabIndex === 'string') {
|
|
68
|
+
if (originalTabIndex === '') {
|
|
69
|
+
currentElement.removeAttribute('tabindex');
|
|
70
|
+
} else {
|
|
71
|
+
currentElement.setAttribute('tabindex', originalTabIndex);
|
|
72
|
+
}
|
|
73
|
+
delete currentElement.dataset[datasetKey];
|
|
74
|
+
}
|
|
75
|
+
} else {
|
|
76
|
+
if (typeof currentElement.dataset[datasetKey] !== 'string') {
|
|
77
|
+
currentElement.dataset[datasetKey] = currentElement.getAttribute('tabindex') ?? '';
|
|
78
|
+
}
|
|
79
|
+
currentElement.setAttribute('tabindex', '-1');
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
}, [shouldAllowRightElementFocus, topElement]);
|
|
55
83
|
return /*#__PURE__*/React.createElement(StyledListItemTitle, {
|
|
56
84
|
ref: wrapperRef
|
|
57
85
|
}, /*#__PURE__*/React.createElement(StyledListItemTitleLeftWrapper, null, /*#__PURE__*/React.createElement(StyledListItemHeadTitleText, {
|
|
@@ -61,6 +89,7 @@ const ListItemTitle = ({
|
|
|
61
89
|
}, title), /*#__PURE__*/React.createElement(StyledListItemHeadTitleElement, {
|
|
62
90
|
ref: elementWrapperRef
|
|
63
91
|
}, titleElement)), topElement && /*#__PURE__*/React.createElement(StyledListItemTopRightElement, {
|
|
92
|
+
"data-right-element": "true",
|
|
64
93
|
ref: topElementWrapperRef,
|
|
65
94
|
onClick: shouldPreventRightElementClick ? handlePreventClick : undefined
|
|
66
95
|
}, topElement));
|
package/lib/esm/components/list/list-item/list-item-head/list-item-title/ListItemTitle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListItemTitle.js","names":["React","useEffect","useMemo","useRef","StyledListItemHeadTitleElement","StyledListItemHeadTitleText","StyledListItemTitle","StyledListItemTitleLeftWrapper","StyledListItemTopRightElement","getElementClickEvent","ListItemTitle","rightElements","titleElement","title","shouldShowMultilineTitle","isOpen","onResize","onTitleWidthChange","titleWrapperRef","wrapperRef","elementWrapperRef","topElementWrapperRef","element","current","undefined","resizeObserver","ResizeObserver","observe","disconnect","fullWidth","clientWidth","rightElementWidth","topElementWidth","width","handlePreventClick","event","stopPropagation","preventDefault","topElement","top","shouldPreventRightElementClick","createElement","ref","$isEllipsis","$shouldShowMultilineTitle","onClick","displayName"],"sources":["../../../../../../../src/components/list/list-item/list-item-head/list-item-title/ListItemTitle.tsx"],"sourcesContent":["import React, { FC, ReactNode, useEffect, useMemo, useRef } from 'react';\nimport type { IListItemRightElement, IListItemRightElements } from '../../../../../types/list';\nimport {\n StyledListItemHeadTitleElement,\n StyledListItemHeadTitleText,\n StyledListItemTitle,\n StyledListItemTitleLeftWrapper,\n StyledListItemTopRightElement,\n} from './ListItemTitle.styles';\nimport { getElementClickEvent } from '../../../../../utils/accordion';\n\ntype ListItemTitleProps = {\n rightElements?: IListItemRightElements;\n title: ReactNode;\n titleElement?: ReactNode;\n shouldShowMultilineTitle: boolean;\n isOpen: boolean;\n onResize?: (entries: ResizeObserverEntry[]) => void;\n onTitleWidthChange: (width: number) => void;\n};\n\nconst ListItemTitle: FC<ListItemTitleProps> = ({\n rightElements,\n titleElement,\n title,\n shouldShowMultilineTitle,\n isOpen,\n onResize,\n onTitleWidthChange,\n}) => {\n const titleWrapperRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const elementWrapperRef = useRef<HTMLDivElement>(null);\n const topElementWrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const element = titleWrapperRef?.current;\n if (!element || typeof onResize !== 'function') return undefined;\n\n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(element);\n\n return () => resizeObserver.disconnect();\n }, [onResize]);\n\n useEffect(() => {\n if (wrapperRef.current && elementWrapperRef.current) {\n const fullWidth = wrapperRef.current.clientWidth;\n const rightElementWidth = elementWrapperRef.current.clientWidth;\n const topElementWidth = topElementWrapperRef.current?.clientWidth;\n\n let width = fullWidth;\n\n if (rightElementWidth > 0) {\n width -= rightElementWidth + 8;\n }\n\n if (topElementWidth) {\n width -= topElementWidth + 12;\n }\n\n onTitleWidthChange(width);\n }\n }, [onTitleWidthChange]);\n\n const handlePreventClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n };\n\n const topElement = useMemo(() => {\n if (typeof rightElements === 'object' && rightElements && 'top' in rightElements) {\n return (rightElements as unknown as IListItemRightElement).top;\n }\n\n return undefined;\n }, [rightElements]);\n\n const shouldPreventRightElementClick = useMemo(() => {\n if (topElement) {\n return getElementClickEvent(topElement);\n }\n\n return false;\n }, [topElement]);\n\n return (\n <StyledListItemTitle ref={wrapperRef}>\n <StyledListItemTitleLeftWrapper>\n <StyledListItemHeadTitleText\n $isEllipsis={!isOpen}\n ref={titleWrapperRef}\n $shouldShowMultilineTitle={shouldShowMultilineTitle}\n >\n {title}\n </StyledListItemHeadTitleText>\n <StyledListItemHeadTitleElement ref={elementWrapperRef}>\n {titleElement}\n </StyledListItemHeadTitleElement>\n </StyledListItemTitleLeftWrapper>\n {topElement && (\n <StyledListItemTopRightElement\n ref={topElementWrapperRef}\n onClick={shouldPreventRightElementClick ? handlePreventClick : undefined}\n >\n {topElement}\n </StyledListItemTopRightElement>\n )}\n </StyledListItemTitle>\n );\n};\n\nListItemTitle.displayName = 'ListItemTitle';\n\nexport default ListItemTitle;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAmBC,SAAS,EAAEC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAExE,SACIC,8BAA8B,EAC9BC,2BAA2B,EAC3BC,mBAAmB,EACnBC,8BAA8B,EAC9BC,6BAA6B,QAC1B,wBAAwB;AAC/B,SAASC,oBAAoB,QAAQ,gCAAgC;
|
|
1
|
+
{"version":3,"file":"ListItemTitle.js","names":["React","useEffect","useMemo","useRef","StyledListItemHeadTitleElement","StyledListItemHeadTitleText","StyledListItemTitle","StyledListItemTitleLeftWrapper","StyledListItemTopRightElement","getElementClickEvent","ListItemTitle","rightElements","titleElement","title","shouldShowMultilineTitle","isOpen","onResize","onTitleWidthChange","shouldAllowRightElementFocus","titleWrapperRef","wrapperRef","elementWrapperRef","topElementWrapperRef","element","current","undefined","resizeObserver","ResizeObserver","observe","disconnect","fullWidth","clientWidth","rightElementWidth","topElementWidth","width","handlePreventClick","event","stopPropagation","preventDefault","topElement","top","shouldPreventRightElementClick","topElementWrapper","focusableElements","Array","from","querySelectorAll","forEach","currentElement","datasetKey","originalTabIndex","dataset","removeAttribute","setAttribute","getAttribute","createElement","ref","$isEllipsis","$shouldShowMultilineTitle","onClick","displayName"],"sources":["../../../../../../../src/components/list/list-item/list-item-head/list-item-title/ListItemTitle.tsx"],"sourcesContent":["import React, { FC, ReactNode, useEffect, useMemo, useRef } from 'react';\nimport type { IListItemRightElement, IListItemRightElements } from '../../../../../types/list';\nimport {\n StyledListItemHeadTitleElement,\n StyledListItemHeadTitleText,\n StyledListItemTitle,\n StyledListItemTitleLeftWrapper,\n StyledListItemTopRightElement,\n} from './ListItemTitle.styles';\nimport { getElementClickEvent } from '../../../../../utils/accordion';\n\ntype ListItemTitleProps = {\n rightElements?: IListItemRightElements;\n title: ReactNode;\n titleElement?: ReactNode;\n shouldShowMultilineTitle: boolean;\n isOpen: boolean;\n onResize?: (entries: ResizeObserverEntry[]) => void;\n onTitleWidthChange: (width: number) => void;\n shouldAllowRightElementFocus?: boolean;\n};\n\nconst ListItemTitle: FC<ListItemTitleProps> = ({\n rightElements,\n titleElement,\n title,\n shouldShowMultilineTitle,\n isOpen,\n onResize,\n onTitleWidthChange,\n shouldAllowRightElementFocus = true,\n}) => {\n const titleWrapperRef = useRef<HTMLDivElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const elementWrapperRef = useRef<HTMLDivElement>(null);\n const topElementWrapperRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const element = titleWrapperRef?.current;\n if (!element || typeof onResize !== 'function') return undefined;\n\n const resizeObserver = new ResizeObserver(onResize);\n resizeObserver.observe(element);\n\n return () => resizeObserver.disconnect();\n }, [onResize]);\n\n useEffect(() => {\n if (wrapperRef.current && elementWrapperRef.current) {\n const fullWidth = wrapperRef.current.clientWidth;\n const rightElementWidth = elementWrapperRef.current.clientWidth;\n const topElementWidth = topElementWrapperRef.current?.clientWidth;\n\n let width = fullWidth;\n\n if (rightElementWidth > 0) {\n width -= rightElementWidth + 8;\n }\n\n if (topElementWidth) {\n width -= topElementWidth + 12;\n }\n\n onTitleWidthChange(width);\n }\n }, [onTitleWidthChange]);\n\n const handlePreventClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n };\n\n const topElement = useMemo(() => {\n if (typeof rightElements === 'object' && rightElements && 'top' in rightElements) {\n return (rightElements as unknown as IListItemRightElement).top;\n }\n\n return undefined;\n }, [rightElements]);\n\n const shouldPreventRightElementClick = useMemo(() => {\n if (topElement) {\n return getElementClickEvent(topElement);\n }\n\n return false;\n }, [topElement]);\n\n useEffect(() => {\n const topElementWrapper = topElementWrapperRef.current;\n\n if (!topElementWrapper) {\n return;\n }\n\n const focusableElements = Array.from(\n topElementWrapper.querySelectorAll<HTMLElement>(\n 'a[href], button, input, select, textarea, [tabindex], [contenteditable=\"true\"]',\n ),\n );\n\n focusableElements.forEach((element) => {\n const currentElement = element;\n const datasetKey = 'listItemRightElementOriginalTabIndex';\n\n if (shouldAllowRightElementFocus) {\n const originalTabIndex = currentElement.dataset[datasetKey];\n\n if (typeof originalTabIndex === 'string') {\n if (originalTabIndex === '') {\n currentElement.removeAttribute('tabindex');\n } else {\n currentElement.setAttribute('tabindex', originalTabIndex);\n }\n\n delete currentElement.dataset[datasetKey];\n }\n } else {\n if (typeof currentElement.dataset[datasetKey] !== 'string') {\n currentElement.dataset[datasetKey] =\n currentElement.getAttribute('tabindex') ?? '';\n }\n\n currentElement.setAttribute('tabindex', '-1');\n }\n });\n }, [shouldAllowRightElementFocus, topElement]);\n\n return (\n <StyledListItemTitle ref={wrapperRef}>\n <StyledListItemTitleLeftWrapper>\n <StyledListItemHeadTitleText\n $isEllipsis={!isOpen}\n ref={titleWrapperRef}\n $shouldShowMultilineTitle={shouldShowMultilineTitle}\n >\n {title}\n </StyledListItemHeadTitleText>\n <StyledListItemHeadTitleElement ref={elementWrapperRef}>\n {titleElement}\n </StyledListItemHeadTitleElement>\n </StyledListItemTitleLeftWrapper>\n {topElement && (\n <StyledListItemTopRightElement\n data-right-element=\"true\"\n ref={topElementWrapperRef}\n onClick={shouldPreventRightElementClick ? handlePreventClick : undefined}\n >\n {topElement}\n </StyledListItemTopRightElement>\n )}\n </StyledListItemTitle>\n );\n};\n\nListItemTitle.displayName = 'ListItemTitle';\n\nexport default ListItemTitle;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
export const useListItemFocus = ({
|
|
3
|
+
uuid,
|
|
4
|
+
listGroupUuid,
|
|
5
|
+
isInKeyboardNavigationGroup,
|
|
6
|
+
updateActiveListItemUuid
|
|
7
|
+
}) => {
|
|
8
|
+
const [isFocusWithinListItem, setIsFocusWithinListItem] = useState(false);
|
|
9
|
+
const handleFocus = useCallback(event => {
|
|
10
|
+
setIsFocusWithinListItem(true);
|
|
11
|
+
if (event.currentTarget === event.target && isInKeyboardNavigationGroup && typeof updateActiveListItemUuid === 'function') {
|
|
12
|
+
updateActiveListItemUuid(uuid);
|
|
13
|
+
}
|
|
14
|
+
}, [isInKeyboardNavigationGroup, updateActiveListItemUuid, uuid]);
|
|
15
|
+
const handleBlur = useCallback(event => {
|
|
16
|
+
const nextFocusedElement = event.relatedTarget;
|
|
17
|
+
const currentListItemElement = event.currentTarget;
|
|
18
|
+
if (nextFocusedElement && currentListItemElement.contains(nextFocusedElement)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
setIsFocusWithinListItem(false);
|
|
22
|
+
if (!isInKeyboardNavigationGroup || typeof updateActiveListItemUuid !== 'function' || typeof listGroupUuid !== 'string') {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (!nextFocusedElement) {
|
|
26
|
+
updateActiveListItemUuid(undefined);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const nextFocusedListItem = nextFocusedElement.closest(`[data-uuid^="${listGroupUuid}---"]`);
|
|
30
|
+
if (!nextFocusedListItem) {
|
|
31
|
+
updateActiveListItemUuid(undefined);
|
|
32
|
+
}
|
|
33
|
+
}, [isInKeyboardNavigationGroup, listGroupUuid, updateActiveListItemUuid]);
|
|
34
|
+
return {
|
|
35
|
+
isFocusWithinListItem,
|
|
36
|
+
handleFocus,
|
|
37
|
+
handleBlur
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=useListItemFocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useListItemFocus.js","names":["useCallback","useState","useListItemFocus","uuid","listGroupUuid","isInKeyboardNavigationGroup","updateActiveListItemUuid","isFocusWithinListItem","setIsFocusWithinListItem","handleFocus","event","currentTarget","target","handleBlur","nextFocusedElement","relatedTarget","currentListItemElement","contains","undefined","nextFocusedListItem","closest"],"sources":["../../../../../src/components/list/list-item/useListItemFocus.ts"],"sourcesContent":["import { type FocusEvent, useCallback, useState } from 'react';\n\ntype UseListItemFocusParams = {\n uuid: string;\n listGroupUuid?: string;\n isInKeyboardNavigationGroup: boolean;\n updateActiveListItemUuid?: (uuid?: string) => void;\n};\n\nexport const useListItemFocus = ({\n uuid,\n listGroupUuid,\n isInKeyboardNavigationGroup,\n updateActiveListItemUuid,\n}: UseListItemFocusParams) => {\n const [isFocusWithinListItem, setIsFocusWithinListItem] = useState(false);\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n setIsFocusWithinListItem(true);\n\n if (\n event.currentTarget === event.target &&\n isInKeyboardNavigationGroup &&\n typeof updateActiveListItemUuid === 'function'\n ) {\n updateActiveListItemUuid(uuid);\n }\n },\n [isInKeyboardNavigationGroup, updateActiveListItemUuid, uuid],\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n const nextFocusedElement = event.relatedTarget as HTMLElement | null;\n const currentListItemElement = event.currentTarget as HTMLElement;\n\n if (nextFocusedElement && currentListItemElement.contains(nextFocusedElement)) {\n return;\n }\n\n setIsFocusWithinListItem(false);\n\n if (\n !isInKeyboardNavigationGroup ||\n typeof updateActiveListItemUuid !== 'function' ||\n typeof listGroupUuid !== 'string'\n ) {\n return;\n }\n\n if (!nextFocusedElement) {\n updateActiveListItemUuid(undefined);\n return;\n }\n\n const nextFocusedListItem = nextFocusedElement.closest<HTMLElement>(\n `[data-uuid^=\"${listGroupUuid}---\"]`,\n );\n\n if (!nextFocusedListItem) {\n updateActiveListItemUuid(undefined);\n }\n },\n [isInKeyboardNavigationGroup, listGroupUuid, updateActiveListItemUuid],\n );\n\n return {\n isFocusWithinListItem,\n handleFocus,\n handleBlur,\n };\n};\n"],"mappings":"AAAA,SAA0BA,WAAW,EAAEC,QAAQ,QAAQ,OAAO;AAS9D,OAAO,MAAMC,gBAAgB,GAAGA,CAAC;EAC7BC,IAAI;EACJC,aAAa;EACbC,2BAA2B;EAC3BC;AACoB,CAAC,KAAK;EAC1B,MAAM,CAACC,qBAAqB,EAAEC,wBAAwB,CAAC,GAAGP,QAAQ,CAAC,KAAK,CAAC;EAEzE,MAAMQ,WAAW,GAAGT,WAAW,CAC1BU,KAAiC,IAAK;IACnCF,wBAAwB,CAAC,IAAI,CAAC;IAE9B,IACIE,KAAK,CAACC,aAAa,KAAKD,KAAK,CAACE,MAAM,IACpCP,2BAA2B,IAC3B,OAAOC,wBAAwB,KAAK,UAAU,EAChD;MACEA,wBAAwB,CAACH,IAAI,CAAC;IAClC;EACJ,CAAC,EACD,CAACE,2BAA2B,EAAEC,wBAAwB,EAAEH,IAAI,CAChE,CAAC;EAED,MAAMU,UAAU,GAAGb,WAAW,CACzBU,KAAiC,IAAK;IACnC,MAAMI,kBAAkB,GAAGJ,KAAK,CAACK,aAAmC;IACpE,MAAMC,sBAAsB,GAAGN,KAAK,CAACC,aAA4B;IAEjE,IAAIG,kBAAkB,IAAIE,sBAAsB,CAACC,QAAQ,CAACH,kBAAkB,CAAC,EAAE;MAC3E;IACJ;IAEAN,wBAAwB,CAAC,KAAK,CAAC;IAE/B,IACI,CAACH,2BAA2B,IAC5B,OAAOC,wBAAwB,KAAK,UAAU,IAC9C,OAAOF,aAAa,KAAK,QAAQ,EACnC;MACE;IACJ;IAEA,IAAI,CAACU,kBAAkB,EAAE;MACrBR,wBAAwB,CAACY,SAAS,CAAC;MACnC;IACJ;IAEA,MAAMC,mBAAmB,GAAGL,kBAAkB,CAACM,OAAO,CAClD,gBAAgBhB,aAAa,OACjC,CAAC;IAED,IAAI,CAACe,mBAAmB,EAAE;MACtBb,wBAAwB,CAACY,SAAS,CAAC;IACvC;EACJ,CAAC,EACD,CAACb,2BAA2B,EAAED,aAAa,EAAEE,wBAAwB,CACzE,CAAC;EAED,OAAO;IACHC,qBAAqB;IACrBE,WAAW;IACXI;EACJ,CAAC;AACL,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
export const MasonryContext = /*#__PURE__*/createContext(undefined);
|
|
3
|
+
export const useMasonryContext = () => {
|
|
4
|
+
const context = useContext(MasonryContext);
|
|
5
|
+
if (!context) {
|
|
6
|
+
throw new Error('Masonry.Item must be used inside Masonry.');
|
|
7
|
+
}
|
|
8
|
+
return context;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=Masonry.context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Masonry.context.js","names":["createContext","useContext","MasonryContext","undefined","useMasonryContext","context","Error"],"sources":["../../../../src/components/masonry/Masonry.context.ts"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport { MasonryContextValue } from './Masonry.types';\n\nexport const MasonryContext = createContext<MasonryContextValue | undefined>(undefined);\n\nexport const useMasonryContext = () => {\n const context = useContext(MasonryContext);\n\n if (!context) {\n throw new Error('Masonry.Item must be used inside Masonry.');\n }\n\n return context;\n};\n"],"mappings":"AAAA,SAASA,aAAa,EAAEC,UAAU,QAAQ,OAAO;AAGjD,OAAO,MAAMC,cAAc,gBAAGF,aAAa,CAAkCG,SAAS,CAAC;AAEvF,OAAO,MAAMC,iBAAiB,GAAGA,CAAA,KAAM;EACnC,MAAMC,OAAO,GAAGJ,UAAU,CAACC,cAAc,CAAC;EAE1C,IAAI,CAACG,OAAO,EAAE;IACV,MAAM,IAAIC,KAAK,CAAC,2CAA2C,CAAC;EAChE;EAEA,OAAOD,OAAO;AAClB,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Children, useMemo } from 'react';
|
|
2
|
+
import { calculateColumnCount, calculateRowSpan, getMasonryItemKey, packMasonryGrid } from './Masonry.utils';
|
|
3
|
+
export const useMasonryItems = ({
|
|
4
|
+
children
|
|
5
|
+
}) => useMemo(() => Children.toArray(children), [children]);
|
|
6
|
+
export const useMasonryLayout = ({
|
|
7
|
+
items,
|
|
8
|
+
itemHeights,
|
|
9
|
+
columnCount,
|
|
10
|
+
columnWidth,
|
|
11
|
+
rowHeight,
|
|
12
|
+
gap
|
|
13
|
+
}) => useMemo(() => {
|
|
14
|
+
const layoutItems = items.map((item, index) => {
|
|
15
|
+
const key = getMasonryItemKey(item, index);
|
|
16
|
+
const height = itemHeights[key] ?? rowHeight;
|
|
17
|
+
return {
|
|
18
|
+
key,
|
|
19
|
+
columns: item.props.columns ?? 1,
|
|
20
|
+
rows: calculateRowSpan({
|
|
21
|
+
height,
|
|
22
|
+
rowHeight,
|
|
23
|
+
gap
|
|
24
|
+
})
|
|
25
|
+
};
|
|
26
|
+
});
|
|
27
|
+
return packMasonryGrid({
|
|
28
|
+
items: layoutItems,
|
|
29
|
+
columnCount,
|
|
30
|
+
columnWidth,
|
|
31
|
+
rowHeight,
|
|
32
|
+
gap
|
|
33
|
+
});
|
|
34
|
+
}, [items, itemHeights, columnCount, columnWidth, rowHeight, gap]);
|
|
35
|
+
export const useMasonryColumnCount = ({
|
|
36
|
+
containerWidth,
|
|
37
|
+
columnWidth,
|
|
38
|
+
gap
|
|
39
|
+
}) => useMemo(() => calculateColumnCount({
|
|
40
|
+
containerWidth,
|
|
41
|
+
columnWidth,
|
|
42
|
+
gap
|
|
43
|
+
}), [containerWidth, columnWidth, gap]);
|
|
44
|
+
//# sourceMappingURL=Masonry.hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Masonry.hooks.js","names":["Children","useMemo","calculateColumnCount","calculateRowSpan","getMasonryItemKey","packMasonryGrid","useMasonryItems","children","toArray","useMasonryLayout","items","itemHeights","columnCount","columnWidth","rowHeight","gap","layoutItems","map","item","index","key","height","columns","props","rows","useMasonryColumnCount","containerWidth"],"sources":["../../../../src/components/masonry/Masonry.hooks.ts"],"sourcesContent":["import { Children, ReactNode, useMemo } from 'react';\nimport { MasonryChild, MasonryItemProps, MasonryLayoutItem } from './Masonry.types';\nimport {\n calculateColumnCount,\n calculateRowSpan,\n getMasonryItemKey,\n packMasonryGrid,\n} from './Masonry.utils';\n\ninterface UseMasonryItemsParams {\n children: ReactNode;\n}\n\nexport const useMasonryItems = ({ children }: UseMasonryItemsParams) =>\n useMemo(() => Children.toArray(children) as MasonryChild[], [children]);\n\ninterface UseMasonryLayoutParams {\n items: MasonryChild[];\n itemHeights: Record<string, number>;\n columnCount: number;\n columnWidth: number;\n rowHeight: number;\n gap: number;\n}\n\nexport const useMasonryLayout = ({\n items,\n itemHeights,\n columnCount,\n columnWidth,\n rowHeight,\n gap,\n}: UseMasonryLayoutParams) =>\n useMemo(() => {\n const layoutItems: MasonryLayoutItem[] = items.map((item, index) => {\n const key = getMasonryItemKey(item as React.ReactElement<MasonryItemProps>, index);\n\n const height = itemHeights[key] ?? rowHeight;\n\n return {\n key,\n columns: item.props.columns ?? 1,\n rows: calculateRowSpan({\n height,\n rowHeight,\n gap,\n }),\n };\n });\n\n return packMasonryGrid({\n items: layoutItems,\n columnCount,\n columnWidth,\n rowHeight,\n gap,\n });\n }, [items, itemHeights, columnCount, columnWidth, rowHeight, gap]);\n\ninterface UseMasonryColumnCountParams {\n containerWidth: number;\n columnWidth: number;\n gap: number;\n}\n\nexport const useMasonryColumnCount = ({\n containerWidth,\n columnWidth,\n gap,\n}: UseMasonryColumnCountParams) =>\n useMemo(\n () =>\n calculateColumnCount({\n containerWidth,\n columnWidth,\n gap,\n }),\n [containerWidth, columnWidth, gap],\n );\n"],"mappings":"AAAA,SAASA,QAAQ,EAAaC,OAAO,QAAQ,OAAO;AAEpD,SACIC,oBAAoB,EACpBC,gBAAgB,EAChBC,iBAAiB,EACjBC,eAAe,QACZ,iBAAiB;AAMxB,OAAO,MAAMC,eAAe,GAAGA,CAAC;EAAEC;AAAgC,CAAC,KAC/DN,OAAO,CAAC,MAAMD,QAAQ,CAACQ,OAAO,CAACD,QAAQ,CAAmB,EAAE,CAACA,QAAQ,CAAC,CAAC;AAW3E,OAAO,MAAME,gBAAgB,GAAGA,CAAC;EAC7BC,KAAK;EACLC,WAAW;EACXC,WAAW;EACXC,WAAW;EACXC,SAAS;EACTC;AACoB,CAAC,KACrBd,OAAO,CAAC,MAAM;EACV,MAAMe,WAAgC,GAAGN,KAAK,CAACO,GAAG,CAAC,CAACC,IAAI,EAAEC,KAAK,KAAK;IAChE,MAAMC,GAAG,GAAGhB,iBAAiB,CAACc,IAAI,EAA0CC,KAAK,CAAC;IAElF,MAAME,MAAM,GAAGV,WAAW,CAACS,GAAG,CAAC,IAAIN,SAAS;IAE5C,OAAO;MACHM,GAAG;MACHE,OAAO,EAAEJ,IAAI,CAACK,KAAK,CAACD,OAAO,IAAI,CAAC;MAChCE,IAAI,EAAErB,gBAAgB,CAAC;QACnBkB,MAAM;QACNP,SAAS;QACTC;MACJ,CAAC;IACL,CAAC;EACL,CAAC,CAAC;EAEF,OAAOV,eAAe,CAAC;IACnBK,KAAK,EAAEM,WAAW;IAClBJ,WAAW;IACXC,WAAW;IACXC,SAAS;IACTC;EACJ,CAAC,CAAC;AACN,CAAC,EAAE,CAACL,KAAK,EAAEC,WAAW,EAAEC,WAAW,EAAEC,WAAW,EAAEC,SAAS,EAAEC,GAAG,CAAC,CAAC;AAQtE,OAAO,MAAMU,qBAAqB,GAAGA,CAAC;EAClCC,cAAc;EACdb,WAAW;EACXE;AACyB,CAAC,KAC1Bd,OAAO,CACH,MACIC,oBAAoB,CAAC;EACjBwB,cAAc;EACdb,WAAW;EACXE;AACJ,CAAC,CAAC,EACN,CAACW,cAAc,EAAEb,WAAW,EAAEE,GAAG,CACrC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import React, { useCallback, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { AnimatePresence } from 'motion/react';
|
|
3
|
+
import { useElementSize } from '../../hooks/element';
|
|
4
|
+
import { MasonryContext } from './Masonry.context';
|
|
5
|
+
import { StyledMasonry } from './Masonry.styles';
|
|
6
|
+
import { useMasonryColumnCount, useMasonryItems, useMasonryLayout } from './Masonry.hooks';
|
|
7
|
+
import { getMasonryItemKey } from './Masonry.utils';
|
|
8
|
+
import MasonryItem, { InternalMasonryItem } from './masonry-item/MasonryItem';
|
|
9
|
+
const MasonryBase = ({
|
|
10
|
+
children,
|
|
11
|
+
gap = 8,
|
|
12
|
+
columnWidth = 80,
|
|
13
|
+
rowHeight = 80
|
|
14
|
+
}) => {
|
|
15
|
+
const ref = useRef(null);
|
|
16
|
+
const size = useElementSize(ref);
|
|
17
|
+
const containerWidth = size?.width ?? 0;
|
|
18
|
+
const [itemHeights, setItemHeights] = useState({});
|
|
19
|
+
const items = useMasonryItems({
|
|
20
|
+
children
|
|
21
|
+
});
|
|
22
|
+
const columnCount = useMasonryColumnCount({
|
|
23
|
+
containerWidth,
|
|
24
|
+
columnWidth,
|
|
25
|
+
gap
|
|
26
|
+
});
|
|
27
|
+
const layout = useMasonryLayout({
|
|
28
|
+
items,
|
|
29
|
+
itemHeights,
|
|
30
|
+
columnCount,
|
|
31
|
+
columnWidth,
|
|
32
|
+
rowHeight,
|
|
33
|
+
gap
|
|
34
|
+
});
|
|
35
|
+
const registerItem = useCallback((key, height) => {
|
|
36
|
+
setItemHeights(currentHeights => {
|
|
37
|
+
if (currentHeights[key] === height) {
|
|
38
|
+
return currentHeights;
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
...currentHeights,
|
|
42
|
+
[key]: height
|
|
43
|
+
};
|
|
44
|
+
});
|
|
45
|
+
}, []);
|
|
46
|
+
const contextValue = useMemo(() => ({
|
|
47
|
+
registerItem
|
|
48
|
+
}), [registerItem]);
|
|
49
|
+
return /*#__PURE__*/React.createElement(MasonryContext.Provider, {
|
|
50
|
+
value: contextValue
|
|
51
|
+
}, /*#__PURE__*/React.createElement(StyledMasonry, {
|
|
52
|
+
ref: ref,
|
|
53
|
+
$height: layout.height
|
|
54
|
+
}, /*#__PURE__*/React.createElement(AnimatePresence, null, items.map((item, index) => {
|
|
55
|
+
const key = getMasonryItemKey(item, index);
|
|
56
|
+
const packedItem = layout.items[key];
|
|
57
|
+
if (!packedItem) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return /*#__PURE__*/React.createElement(InternalMasonryItem, {
|
|
61
|
+
key: key,
|
|
62
|
+
itemKey: key,
|
|
63
|
+
x: packedItem.x,
|
|
64
|
+
y: packedItem.y,
|
|
65
|
+
width: packedItem.width
|
|
66
|
+
}, item.props.children);
|
|
67
|
+
}))));
|
|
68
|
+
};
|
|
69
|
+
MasonryBase.displayName = 'Masonry';
|
|
70
|
+
const Masonry = Object.assign(MasonryBase, {
|
|
71
|
+
Item: MasonryItem
|
|
72
|
+
});
|
|
73
|
+
export default Masonry;
|
|
74
|
+
//# sourceMappingURL=Masonry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Masonry.js","names":["React","useCallback","useMemo","useRef","useState","AnimatePresence","useElementSize","MasonryContext","StyledMasonry","useMasonryColumnCount","useMasonryItems","useMasonryLayout","getMasonryItemKey","MasonryItem","InternalMasonryItem","MasonryBase","children","gap","columnWidth","rowHeight","ref","size","containerWidth","width","itemHeights","setItemHeights","items","columnCount","layout","registerItem","key","height","currentHeights","contextValue","createElement","Provider","value","$height","map","item","index","packedItem","itemKey","x","y","props","displayName","Masonry","Object","assign","Item"],"sources":["../../../../src/components/masonry/Masonry.tsx"],"sourcesContent":["import React, { FC, useCallback, useMemo, useRef, useState } from 'react';\nimport { AnimatePresence } from 'motion/react';\nimport { useElementSize } from '../../hooks/element';\nimport { MasonryComponent, MasonryItemProps, MasonryProps } from './Masonry.types';\nimport { MasonryContext } from './Masonry.context';\nimport { StyledMasonry } from './Masonry.styles';\nimport { useMasonryColumnCount, useMasonryItems, useMasonryLayout } from './Masonry.hooks';\nimport { getMasonryItemKey } from './Masonry.utils';\nimport MasonryItem, { InternalMasonryItem } from './masonry-item/MasonryItem';\n\nconst MasonryBase: FC<MasonryProps> = ({ children, gap = 8, columnWidth = 80, rowHeight = 80 }) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const size = useElementSize(ref);\n\n const containerWidth = size?.width ?? 0;\n\n const [itemHeights, setItemHeights] = useState<Record<string, number>>({});\n\n const items = useMasonryItems({ children });\n\n const columnCount = useMasonryColumnCount({\n containerWidth,\n columnWidth,\n gap,\n });\n\n const layout = useMasonryLayout({\n items,\n itemHeights,\n columnCount,\n columnWidth,\n rowHeight,\n gap,\n });\n\n const registerItem = useCallback((key: string, height: number) => {\n setItemHeights((currentHeights) => {\n if (currentHeights[key] === height) {\n return currentHeights;\n }\n\n return {\n ...currentHeights,\n [key]: height,\n };\n });\n }, []);\n\n const contextValue = useMemo(\n () => ({\n registerItem,\n }),\n [registerItem],\n );\n\n return (\n <MasonryContext.Provider value={contextValue}>\n <StyledMasonry ref={ref} $height={layout.height}>\n <AnimatePresence>\n {items.map((item, index) => {\n const key = getMasonryItemKey(\n item as React.ReactElement<MasonryItemProps>,\n index,\n );\n\n const packedItem = layout.items[key];\n\n if (!packedItem) {\n return null;\n }\n\n return (\n <InternalMasonryItem\n key={key}\n itemKey={key}\n x={packedItem.x}\n y={packedItem.y}\n width={packedItem.width}\n >\n {item.props.children}\n </InternalMasonryItem>\n );\n })}\n </AnimatePresence>\n </StyledMasonry>\n </MasonryContext.Provider>\n );\n};\n\nMasonryBase.displayName = 'Masonry';\n\nconst Masonry = Object.assign(MasonryBase, {\n Item: MasonryItem,\n}) as MasonryComponent;\n\nexport default Masonry;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Masonry.styles.js","names":["styled","StyledMasonry","div","$height"],"sources":["../../../../src/components/masonry/Masonry.styles.ts"],"sourcesContent":["import styled from 'styled-components';\n\nexport const StyledMasonry = styled.div<{ $height: number }>`\n position: relative;\n width: 100%;\n height: ${({ $height }) => $height}px;\n`;\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,mBAAmB;AAEtC,OAAO,MAAMC,aAAa,GAAGD,MAAM,CAACE,GAAwB;AAC5D;AACA;AACA,cAAc,CAAC;EAAEC;AAAQ,CAAC,KAAKA,OAAO;AACtC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Masonry.types.js","names":[],"sources":["../../../../src/components/masonry/Masonry.types.ts"],"sourcesContent":["import { ReactElement, ReactNode } from 'react';\n\nexport interface MasonryProps {\n children: ReactNode;\n gap?: number;\n columnWidth?: number;\n rowHeight?: number;\n}\n\nexport interface MasonryItemProps {\n children: ReactNode;\n columns?: number;\n}\n\nexport interface MasonryContextValue {\n registerItem: (key: string, height: number) => void;\n}\n\nexport interface MasonryLayoutItem {\n key: string;\n columns: number;\n rows: number;\n}\n\nexport interface PackedMasonryItem {\n key: string;\n x: number;\n y: number;\n width: number;\n}\n\nexport interface PackedMasonryGrid {\n items: Record<string, PackedMasonryItem>;\n height: number;\n}\n\nexport interface InternalMasonryItemProps {\n children: ReactNode;\n itemKey: string;\n x: number;\n y: number;\n width: number;\n}\n\nexport type MasonryChild = ReactElement<MasonryItemProps>;\n\nexport type MasonryComponent = React.FC<MasonryProps> & {\n Item: React.FC<MasonryItemProps>;\n};\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export const getMasonryItemKey = (item, index) => item.key != null ? String(item.key) : String(index);
|
|
2
|
+
const isAreaFree = ({
|
|
3
|
+
grid,
|
|
4
|
+
startColumn,
|
|
5
|
+
startRow,
|
|
6
|
+
columns,
|
|
7
|
+
rows,
|
|
8
|
+
columnCount
|
|
9
|
+
}) => {
|
|
10
|
+
if (startColumn + columns > columnCount) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
for (let row = startRow; row < startRow + rows; row += 1) {
|
|
14
|
+
for (let column = startColumn; column < startColumn + columns; column += 1) {
|
|
15
|
+
if (grid[row]?.[column]) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return true;
|
|
21
|
+
};
|
|
22
|
+
const occupyArea = ({
|
|
23
|
+
grid,
|
|
24
|
+
startColumn,
|
|
25
|
+
startRow,
|
|
26
|
+
columns,
|
|
27
|
+
rows
|
|
28
|
+
}) => {
|
|
29
|
+
for (let row = startRow; row < startRow + rows; row += 1) {
|
|
30
|
+
if (!grid[row]) {
|
|
31
|
+
// eslint-disable-next-line no-param-reassign
|
|
32
|
+
grid[row] = [];
|
|
33
|
+
}
|
|
34
|
+
for (let column = startColumn; column < startColumn + columns; column += 1) {
|
|
35
|
+
// eslint-disable-next-line no-param-reassign
|
|
36
|
+
grid[row][column] = true;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
export const packMasonryGrid = ({
|
|
41
|
+
items,
|
|
42
|
+
columnCount,
|
|
43
|
+
columnWidth,
|
|
44
|
+
rowHeight,
|
|
45
|
+
gap
|
|
46
|
+
}) => {
|
|
47
|
+
const grid = [];
|
|
48
|
+
const packedItems = {};
|
|
49
|
+
let maxRow = 0;
|
|
50
|
+
items.forEach(item => {
|
|
51
|
+
const columns = Math.min(Math.max(item.columns, 1), columnCount);
|
|
52
|
+
const rows = Math.max(item.rows, 1);
|
|
53
|
+
let placed = false;
|
|
54
|
+
let row = 0;
|
|
55
|
+
while (!placed) {
|
|
56
|
+
for (let column = 0; column < columnCount; column += 1) {
|
|
57
|
+
const canPlaceItem = isAreaFree({
|
|
58
|
+
grid,
|
|
59
|
+
startColumn: column,
|
|
60
|
+
startRow: row,
|
|
61
|
+
columns,
|
|
62
|
+
rows,
|
|
63
|
+
columnCount
|
|
64
|
+
});
|
|
65
|
+
if (!canPlaceItem) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
occupyArea({
|
|
69
|
+
grid,
|
|
70
|
+
startColumn: column,
|
|
71
|
+
startRow: row,
|
|
72
|
+
columns,
|
|
73
|
+
rows
|
|
74
|
+
});
|
|
75
|
+
packedItems[item.key] = {
|
|
76
|
+
key: item.key,
|
|
77
|
+
x: column * (columnWidth + gap),
|
|
78
|
+
y: row * (rowHeight + gap),
|
|
79
|
+
width: columns * columnWidth + (columns - 1) * gap
|
|
80
|
+
};
|
|
81
|
+
maxRow = Math.max(maxRow, row + rows);
|
|
82
|
+
placed = true;
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
if (!placed) {
|
|
86
|
+
row += 1;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
items: packedItems,
|
|
92
|
+
height: maxRow * rowHeight + Math.max(0, maxRow - 1) * gap
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
export const calculateColumnCount = ({
|
|
96
|
+
containerWidth,
|
|
97
|
+
columnWidth,
|
|
98
|
+
gap
|
|
99
|
+
}) => {
|
|
100
|
+
if (!containerWidth) {
|
|
101
|
+
return 1;
|
|
102
|
+
}
|
|
103
|
+
return Math.max(1, Math.floor((containerWidth + gap) / (columnWidth + gap)));
|
|
104
|
+
};
|
|
105
|
+
export const calculateRowSpan = ({
|
|
106
|
+
height,
|
|
107
|
+
rowHeight,
|
|
108
|
+
gap
|
|
109
|
+
}) => Math.max(1, Math.ceil((height + gap) / (rowHeight + gap)));
|
|
110
|
+
//# sourceMappingURL=Masonry.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Masonry.utils.js","names":["getMasonryItemKey","item","index","key","String","isAreaFree","grid","startColumn","startRow","columns","rows","columnCount","row","column","occupyArea","packMasonryGrid","items","columnWidth","rowHeight","gap","packedItems","maxRow","forEach","Math","min","max","placed","canPlaceItem","x","y","width","height","calculateColumnCount","containerWidth","floor","calculateRowSpan","ceil"],"sources":["../../../../src/components/masonry/Masonry.utils.ts"],"sourcesContent":["import { ReactElement } from 'react';\nimport {\n MasonryItemProps,\n MasonryLayoutItem,\n PackedMasonryGrid,\n PackedMasonryItem,\n} from './Masonry.types';\n\nexport const getMasonryItemKey = (item: ReactElement<MasonryItemProps>, index: number) =>\n item.key != null ? String(item.key) : String(index);\n\ninterface IsAreaFreeParams {\n grid: boolean[][];\n startColumn: number;\n startRow: number;\n columns: number;\n rows: number;\n columnCount: number;\n}\n\nconst isAreaFree = ({\n grid,\n startColumn,\n startRow,\n columns,\n rows,\n columnCount,\n}: IsAreaFreeParams) => {\n if (startColumn + columns > columnCount) {\n return false;\n }\n\n for (let row = startRow; row < startRow + rows; row += 1) {\n for (let column = startColumn; column < startColumn + columns; column += 1) {\n if (grid[row]?.[column]) {\n return false;\n }\n }\n }\n\n return true;\n};\n\ninterface OccupyAreaParams {\n grid: boolean[][];\n startColumn: number;\n startRow: number;\n columns: number;\n rows: number;\n}\n\nconst occupyArea = ({ grid, startColumn, startRow, columns, rows }: OccupyAreaParams) => {\n for (let row = startRow; row < startRow + rows; row += 1) {\n if (!grid[row]) {\n // eslint-disable-next-line no-param-reassign\n grid[row] = [];\n }\n\n for (let column = startColumn; column < startColumn + columns; column += 1) {\n // eslint-disable-next-line no-param-reassign\n (grid[row] as boolean[])[column] = true;\n }\n }\n};\n\ninterface PackMasonryGridParams {\n items: MasonryLayoutItem[];\n columnCount: number;\n columnWidth: number;\n rowHeight: number;\n gap: number;\n}\n\nexport const packMasonryGrid = ({\n items,\n columnCount,\n columnWidth,\n rowHeight,\n gap,\n}: PackMasonryGridParams): PackedMasonryGrid => {\n const grid: boolean[][] = [];\n const packedItems: Record<string, PackedMasonryItem> = {};\n\n let maxRow = 0;\n\n items.forEach((item) => {\n const columns = Math.min(Math.max(item.columns, 1), columnCount);\n const rows = Math.max(item.rows, 1);\n\n let placed = false;\n let row = 0;\n\n while (!placed) {\n for (let column = 0; column < columnCount; column += 1) {\n const canPlaceItem = isAreaFree({\n grid,\n startColumn: column,\n startRow: row,\n columns,\n rows,\n columnCount,\n });\n\n if (!canPlaceItem) {\n continue;\n }\n\n occupyArea({\n grid,\n startColumn: column,\n startRow: row,\n columns,\n rows,\n });\n\n packedItems[item.key] = {\n key: item.key,\n x: column * (columnWidth + gap),\n y: row * (rowHeight + gap),\n width: columns * columnWidth + (columns - 1) * gap,\n };\n\n maxRow = Math.max(maxRow, row + rows);\n placed = true;\n break;\n }\n\n if (!placed) {\n row += 1;\n }\n }\n });\n\n return {\n items: packedItems,\n height: maxRow * rowHeight + Math.max(0, maxRow - 1) * gap,\n };\n};\n\nexport const calculateColumnCount = ({\n containerWidth,\n columnWidth,\n gap,\n}: {\n containerWidth: number;\n columnWidth: number;\n gap: number;\n}) => {\n if (!containerWidth) {\n return 1;\n }\n\n return Math.max(1, Math.floor((containerWidth + gap) / (columnWidth + gap)));\n};\n\nexport const calculateRowSpan = ({\n height,\n rowHeight,\n gap,\n}: {\n height: number;\n rowHeight: number;\n gap: number;\n}) => Math.max(1, Math.ceil((height + gap) / (rowHeight + gap)));\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import React, { useEffect, useRef } from 'react';
|
|
2
|
+
import { useMasonryContext } from '../Masonry.context';
|
|
3
|
+
import { StyledMasonryItem } from './MasonryItem.styles';
|
|
4
|
+
const MasonryItem = ({
|
|
5
|
+
children
|
|
6
|
+
}) => /*#__PURE__*/React.createElement(React.Fragment, null, children);
|
|
7
|
+
export const InternalMasonryItem = ({
|
|
8
|
+
children,
|
|
9
|
+
itemKey,
|
|
10
|
+
x,
|
|
11
|
+
y,
|
|
12
|
+
width
|
|
13
|
+
}) => {
|
|
14
|
+
const ref = useRef(null);
|
|
15
|
+
const {
|
|
16
|
+
registerItem
|
|
17
|
+
} = useMasonryContext();
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
const element = ref.current;
|
|
20
|
+
if (!element) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
let frameId;
|
|
24
|
+
const updateHeight = () => {
|
|
25
|
+
if (frameId) {
|
|
26
|
+
window.cancelAnimationFrame(frameId);
|
|
27
|
+
}
|
|
28
|
+
frameId = window.requestAnimationFrame(() => {
|
|
29
|
+
registerItem(itemKey, element.getBoundingClientRect().height);
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
updateHeight();
|
|
33
|
+
const observer = new ResizeObserver(updateHeight);
|
|
34
|
+
observer.observe(element);
|
|
35
|
+
return () => {
|
|
36
|
+
if (frameId) {
|
|
37
|
+
window.cancelAnimationFrame(frameId);
|
|
38
|
+
}
|
|
39
|
+
observer.disconnect();
|
|
40
|
+
};
|
|
41
|
+
}, [itemKey, registerItem, width]);
|
|
42
|
+
return /*#__PURE__*/React.createElement(StyledMasonryItem, {
|
|
43
|
+
ref: ref,
|
|
44
|
+
initial: {
|
|
45
|
+
opacity: 0,
|
|
46
|
+
scale: 0.96
|
|
47
|
+
},
|
|
48
|
+
animate: {
|
|
49
|
+
opacity: 1,
|
|
50
|
+
scale: 1,
|
|
51
|
+
x,
|
|
52
|
+
y,
|
|
53
|
+
width
|
|
54
|
+
},
|
|
55
|
+
exit: {
|
|
56
|
+
opacity: 0,
|
|
57
|
+
scale: 0.96
|
|
58
|
+
},
|
|
59
|
+
transition: {
|
|
60
|
+
type: 'spring',
|
|
61
|
+
stiffness: 320,
|
|
62
|
+
damping: 34,
|
|
63
|
+
mass: 0.85
|
|
64
|
+
}
|
|
65
|
+
}, children);
|
|
66
|
+
};
|
|
67
|
+
MasonryItem.displayName = 'Masonry.Item';
|
|
68
|
+
export default MasonryItem;
|
|
69
|
+
//# sourceMappingURL=MasonryItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MasonryItem.js","names":["React","useEffect","useRef","useMasonryContext","StyledMasonryItem","MasonryItem","children","createElement","Fragment","InternalMasonryItem","itemKey","x","y","width","ref","registerItem","element","current","undefined","frameId","updateHeight","window","cancelAnimationFrame","requestAnimationFrame","getBoundingClientRect","height","observer","ResizeObserver","observe","disconnect","initial","opacity","scale","animate","exit","transition","type","stiffness","damping","mass","displayName"],"sources":["../../../../../src/components/masonry/masonry-item/MasonryItem.tsx"],"sourcesContent":["import React, { FC, useEffect, useRef } from 'react';\nimport { InternalMasonryItemProps, MasonryItemProps } from '../Masonry.types';\nimport { useMasonryContext } from '../Masonry.context';\nimport { StyledMasonryItem } from './MasonryItem.styles';\n\nconst MasonryItem: FC<MasonryItemProps> = ({ children }) => <>{children}</>;\n\nexport const InternalMasonryItem: FC<InternalMasonryItemProps> = ({\n children,\n itemKey,\n x,\n y,\n width,\n}) => {\n const ref = useRef<HTMLDivElement | null>(null);\n const { registerItem } = useMasonryContext();\n\n useEffect(() => {\n const element = ref.current;\n\n if (!element) {\n return undefined;\n }\n\n let frameId: number | undefined;\n\n const updateHeight = () => {\n if (frameId) {\n window.cancelAnimationFrame(frameId);\n }\n\n frameId = window.requestAnimationFrame(() => {\n registerItem(itemKey, element.getBoundingClientRect().height);\n });\n };\n\n updateHeight();\n\n const observer = new ResizeObserver(updateHeight);\n\n observer.observe(element);\n\n return () => {\n if (frameId) {\n window.cancelAnimationFrame(frameId);\n }\n\n observer.disconnect();\n };\n }, [itemKey, registerItem, width]);\n\n return (\n <StyledMasonryItem\n ref={ref}\n initial={{\n opacity: 0,\n scale: 0.96,\n }}\n animate={{\n opacity: 1,\n scale: 1,\n x,\n y,\n width,\n }}\n exit={{\n opacity: 0,\n scale: 0.96,\n }}\n transition={{\n type: 'spring',\n stiffness: 320,\n damping: 34,\n mass: 0.85,\n }}\n >\n {children}\n </StyledMasonryItem>\n );\n};\n\nMasonryItem.displayName = 'Masonry.Item';\n\nexport default MasonryItem;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAQC,SAAS,EAAEC,MAAM,QAAQ,OAAO;AAEpD,SAASC,iBAAiB,QAAQ,oBAAoB;AACtD,SAASC,iBAAiB,QAAQ,sBAAsB;AAExD,MAAMC,WAAiC,GAAGA,CAAC;EAAEC;AAAS,CAAC,kBAAKN,KAAA,CAAAO,aAAA,CAAAP,KAAA,CAAAQ,QAAA,QAAGF,QAAW,CAAC;AAE3E,OAAO,MAAMG,mBAAiD,GAAGA,CAAC;EAC9DH,QAAQ;EACRI,OAAO;EACPC,CAAC;EACDC,CAAC;EACDC;AACJ,CAAC,KAAK;EACF,MAAMC,GAAG,GAAGZ,MAAM,CAAwB,IAAI,CAAC;EAC/C,MAAM;IAAEa;EAAa,CAAC,GAAGZ,iBAAiB,CAAC,CAAC;EAE5CF,SAAS,CAAC,MAAM;IACZ,MAAMe,OAAO,GAAGF,GAAG,CAACG,OAAO;IAE3B,IAAI,CAACD,OAAO,EAAE;MACV,OAAOE,SAAS;IACpB;IAEA,IAAIC,OAA2B;IAE/B,MAAMC,YAAY,GAAGA,CAAA,KAAM;MACvB,IAAID,OAAO,EAAE;QACTE,MAAM,CAACC,oBAAoB,CAACH,OAAO,CAAC;MACxC;MAEAA,OAAO,GAAGE,MAAM,CAACE,qBAAqB,CAAC,MAAM;QACzCR,YAAY,CAACL,OAAO,EAAEM,OAAO,CAACQ,qBAAqB,CAAC,CAAC,CAACC,MAAM,CAAC;MACjE,CAAC,CAAC;IACN,CAAC;IAEDL,YAAY,CAAC,CAAC;IAEd,MAAMM,QAAQ,GAAG,IAAIC,cAAc,CAACP,YAAY,CAAC;IAEjDM,QAAQ,CAACE,OAAO,CAACZ,OAAO,CAAC;IAEzB,OAAO,MAAM;MACT,IAAIG,OAAO,EAAE;QACTE,MAAM,CAACC,oBAAoB,CAACH,OAAO,CAAC;MACxC;MAEAO,QAAQ,CAACG,UAAU,CAAC,CAAC;IACzB,CAAC;EACL,CAAC,EAAE,CAACnB,OAAO,EAAEK,YAAY,EAAEF,KAAK,CAAC,CAAC;EAElC,oBACIb,KAAA,CAAAO,aAAA,CAACH,iBAAiB;IACdU,GAAG,EAAEA,GAAI;IACTgB,OAAO,EAAE;MACLC,OAAO,EAAE,CAAC;MACVC,KAAK,EAAE;IACX,CAAE;IACFC,OAAO,EAAE;MACLF,OAAO,EAAE,CAAC;MACVC,KAAK,EAAE,CAAC;MACRrB,CAAC;MACDC,CAAC;MACDC;IACJ,CAAE;IACFqB,IAAI,EAAE;MACFH,OAAO,EAAE,CAAC;MACVC,KAAK,EAAE;IACX,CAAE;IACFG,UAAU,EAAE;MACRC,IAAI,EAAE,QAAQ;MACdC,SAAS,EAAE,GAAG;MACdC,OAAO,EAAE,EAAE;MACXC,IAAI,EAAE;IACV;EAAE,GAEDjC,QACc,CAAC;AAE5B,CAAC;AAEDD,WAAW,CAACmC,WAAW,GAAG,cAAc;AAExC,eAAenC,WAAW","ignoreList":[]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import { motion } from 'motion/react';
|
|
3
|
+
export const StyledMasonryItem = styled(motion.div)`
|
|
4
|
+
position: absolute;
|
|
5
|
+
top: 0;
|
|
6
|
+
left: 0;
|
|
7
|
+
overflow: hidden;
|
|
8
|
+
will-change: transform, width;
|
|
9
|
+
`;
|
|
10
|
+
//# sourceMappingURL=MasonryItem.styles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MasonryItem.styles.js","names":["styled","motion","StyledMasonryItem","div"],"sources":["../../../../../src/components/masonry/masonry-item/MasonryItem.styles.ts"],"sourcesContent":["import styled from 'styled-components';\nimport { motion } from 'motion/react';\n\nexport const StyledMasonryItem = styled(motion.div)`\n position: absolute;\n top: 0;\n left: 0;\n overflow: hidden;\n will-change: transform, width;\n`;\n"],"mappings":"AAAA,OAAOA,MAAM,MAAM,mBAAmB;AACtC,SAASC,MAAM,QAAQ,cAAc;AAErC,OAAO,MAAMC,iBAAiB,GAAGF,MAAM,CAACC,MAAM,CAACE,GAAG,CAAC;AACnD;AACA;AACA;AACA;AACA;AACA,CAAC","ignoreList":[]}
|
|
@@ -5,6 +5,13 @@ import { MentionFinderPopupAlignment } from '../../constants/mentionFinder';
|
|
|
5
5
|
import MentionFinderItem from './mention-finder-item/MentionFinderItem';
|
|
6
6
|
import { StyledMentionFinder, StyledMentionFinderDragHandle, StyledMentionFinderDragHandleInner, StyledMentionFinderItemList, StyledMentionFinderOverlay, StyledMotionMentionFinderPopup } from './MentionFinder.styles';
|
|
7
7
|
const DRAG_CLOSE_THRESHOLD_IN_PX = 60;
|
|
8
|
+
const isTextInputElement = element => {
|
|
9
|
+
if (!element) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const tagName = element.tagName.toLowerCase();
|
|
13
|
+
return tagName === 'input' && element.type !== 'button' || tagName === 'textarea' || element.isContentEditable;
|
|
14
|
+
};
|
|
8
15
|
const findTouchByIdentifier = (touchList, identifier) => {
|
|
9
16
|
if (identifier === null) {
|
|
10
17
|
return null;
|
|
@@ -31,6 +38,7 @@ const MentionFinder = ({
|
|
|
31
38
|
const [shouldShowPopup, setShouldShowPopup] = useState(true);
|
|
32
39
|
const popupRef = useRef(null);
|
|
33
40
|
const listRef = useRef(null);
|
|
41
|
+
const inputElementRef = useRef(null);
|
|
34
42
|
const dragStartYRef = useRef(null);
|
|
35
43
|
const hasTriggeredDragCloseRef = useRef(false);
|
|
36
44
|
const activePointerIdRef = useRef(null);
|
|
@@ -49,7 +57,12 @@ const MentionFinder = ({
|
|
|
49
57
|
info,
|
|
50
58
|
name
|
|
51
59
|
}) => id.toLowerCase().includes(searchString) || info?.replace('chayns', '').toLowerCase().includes(searchString) || name.toLowerCase().includes(searchString)) : members, [members, searchString]);
|
|
60
|
+
const shouldRenderPopup = shouldShowPopup && !!fullMatch && filteredMembers.length > 0;
|
|
52
61
|
const handleKeyDown = useCallback(event => {
|
|
62
|
+
const targetElement = event.target;
|
|
63
|
+
if (isTextInputElement(targetElement)) {
|
|
64
|
+
inputElementRef.current = targetElement;
|
|
65
|
+
}
|
|
53
66
|
if ((event.key === 'ArrowUp' || event.key === 'ArrowDown') && shouldRenderPopup) {
|
|
54
67
|
event.preventDefault();
|
|
55
68
|
const children = listRef.current?.children;
|
|
@@ -75,8 +88,15 @@ const MentionFinder = ({
|
|
|
75
88
|
member: activeMember
|
|
76
89
|
});
|
|
77
90
|
}
|
|
91
|
+
} else if (event.key === 'Escape' && shouldRenderPopup) {
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
event.stopPropagation();
|
|
94
|
+
setShouldShowPopup(false);
|
|
95
|
+
window.requestAnimationFrame(() => {
|
|
96
|
+
inputElementRef.current?.focus();
|
|
97
|
+
});
|
|
78
98
|
}
|
|
79
|
-
}, [activeMember, filteredMembers, focusedIndex, fullMatch, onSelect]);
|
|
99
|
+
}, [activeMember, filteredMembers, focusedIndex, fullMatch, onSelect, shouldRenderPopup]);
|
|
80
100
|
const handleMemberClick = useCallback(member => {
|
|
81
101
|
if (fullMatch) {
|
|
82
102
|
onSelect({
|
|
@@ -111,6 +131,15 @@ const MentionFinder = ({
|
|
|
111
131
|
hasTriggeredDragCloseRef.current = false;
|
|
112
132
|
setShouldShowPopup(true);
|
|
113
133
|
}, [inputValue]);
|
|
134
|
+
useEffect(() => {
|
|
135
|
+
if (!shouldRenderPopup) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const activeElement = document.activeElement;
|
|
139
|
+
if (isTextInputElement(activeElement)) {
|
|
140
|
+
inputElementRef.current = activeElement;
|
|
141
|
+
}
|
|
142
|
+
}, [shouldRenderPopup]);
|
|
114
143
|
useEffect(() => {
|
|
115
144
|
if (shouldShowPopup) {
|
|
116
145
|
window.addEventListener('keydown', handleKeyDown, true);
|
|
@@ -281,7 +310,6 @@ const MentionFinder = ({
|
|
|
281
310
|
onTouchCancel: handleDragTouchCancel
|
|
282
311
|
}));
|
|
283
312
|
}, [enableDragHandle, popupAlignment, dragOffset, dragProgress, isDraggingHandle, handleDragPointerDown, handleDragPointerMove, handleDragPointerUp, handleDragPointerCancel, handleDragTouchStart, handleDragTouchMove, handleDragTouchEnd, handleDragTouchCancel]);
|
|
284
|
-
const shouldRenderPopup = shouldShowPopup && fullMatch && items.length > 0;
|
|
285
313
|
useEffect(() => {
|
|
286
314
|
if (!enableDragHandle || !shouldRenderPopup) {
|
|
287
315
|
setOverlayContainer(null);
|