@enact/limestone 1.3.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/.github/PULL_REQUEST_TEMPLATE.md +28 -0
- package/.github/workflows/update-copyright-years.yml +25 -0
- package/.travis.yml +40 -0
- package/ActionGuide/ActionGuide.d.ts +73 -0
- package/ActionGuide/ActionGuide.js +164 -0
- package/ActionGuide/ActionGuide.module.css +73 -0
- package/ActionGuide/package.json +3 -0
- package/ActionGuide/tests/ActionGuide-specs.js +51 -0
- package/Alert/Alert.d.ts +155 -0
- package/Alert/Alert.js +313 -0
- package/Alert/Alert.module.css +190 -0
- package/Alert/AlertImage.js +102 -0
- package/Alert/AlertImage.module.css +15 -0
- package/Alert/package.json +3 -0
- package/Alert/tests/Alert-specs.js +204 -0
- package/BodyText/BodyText.d.ts +74 -0
- package/BodyText/BodyText.js +170 -0
- package/BodyText/BodyText.module.css +95 -0
- package/BodyText/package.json +3 -0
- package/BodyText/tests/BodyText-specs.js +55 -0
- package/Button/Button.d.ts +131 -0
- package/Button/Button.js +351 -0
- package/Button/Button.module.css +2518 -0
- package/Button/package.json +3 -0
- package/Button/tests/Button-specs.js +252 -0
- package/CHANGELOG.md +170 -0
- package/Card/Card.d.ts +138 -0
- package/Card/Card.js +396 -0
- package/Card/Card.module.css +1296 -0
- package/Card/package.json +3 -0
- package/Card/tests/Card-specs.js +65 -0
- package/Checkbox/Checkbox.d.ts +99 -0
- package/Checkbox/Checkbox.js +222 -0
- package/Checkbox/Checkbox.module.css +1395 -0
- package/Checkbox/package.json +3 -0
- package/Checkbox/tests/Checkbox-specs.js +79 -0
- package/CheckboxItem/CheckboxItem.d.ts +99 -0
- package/CheckboxItem/CheckboxItem.js +210 -0
- package/CheckboxItem/CheckboxItem.module.css +50 -0
- package/CheckboxItem/package.json +3 -0
- package/CheckboxItem/tests/CheckboxItem-specs.js +52 -0
- package/Chips/Chip.js +252 -0
- package/Chips/Chip.module.css +30 -0
- package/Chips/Chips.js +215 -0
- package/Chips/Chips.module.css +8 -0
- package/Chips/index.js +86 -0
- package/Chips/tests/Chip-specs.js +186 -0
- package/Chips/tests/Chips-specs.js +312 -0
- package/ColorPicker/ColorPicker.js +416 -0
- package/ColorPicker/ColorPicker.module.css +78 -0
- package/ColorPicker/package.json +3 -0
- package/ColorPicker/tests/ColorPicker-specs.js +225 -0
- package/ColorPicker/utils.js +135 -0
- package/ContextualMenuDecorator/ContextualMenuDecorator.d.ts +106 -0
- package/ContextualMenuDecorator/ContextualMenuDecorator.js +264 -0
- package/ContextualMenuDecorator/ContextualMenuDecorator.module.css +42 -0
- package/ContextualMenuDecorator/package.json +3 -0
- package/ContextualMenuDecorator/tests/ContextualMenuDecorator-specs.js +136 -0
- package/ContextualPopupDecorator/ContextualPopup.js +200 -0
- package/ContextualPopupDecorator/ContextualPopup.module.css +270 -0
- package/ContextualPopupDecorator/ContextualPopupDecorator.d.ts +182 -0
- package/ContextualPopupDecorator/ContextualPopupDecorator.js +867 -0
- package/ContextualPopupDecorator/ContextualPopupDecorator.module.css +3 -0
- package/ContextualPopupDecorator/HolePunchScrim.js +69 -0
- package/ContextualPopupDecorator/HolePunchScrim.module.css +38 -0
- package/ContextualPopupDecorator/package.json +3 -0
- package/ContextualPopupDecorator/tests/ContextualPopupDecorator-specs.js +621 -0
- package/DatePicker/DatePicker.d.ts +173 -0
- package/DatePicker/DatePicker.js +175 -0
- package/DatePicker/DatePicker.module.css +5 -0
- package/DatePicker/DatePickerBase.js +348 -0
- package/DatePicker/package.json +3 -0
- package/DatePicker/tests/DatePicker-specs.js +247 -0
- package/DayPicker/DayPicker.d.ts +92 -0
- package/DayPicker/DayPicker.js +188 -0
- package/DayPicker/DayPicker.module.css +35 -0
- package/DayPicker/DaySelectorDecorator.js +301 -0
- package/DayPicker/package.json +3 -0
- package/DayPicker/tests/DayPicker-specs.js +138 -0
- package/Dropdown/Dropdown.d.ts +135 -0
- package/Dropdown/Dropdown.js +460 -0
- package/Dropdown/Dropdown.module.css +160 -0
- package/Dropdown/DropdownList.js +360 -0
- package/Dropdown/package.json +3 -0
- package/Dropdown/tests/Dropdown-specs.js +267 -0
- package/FixedPopupPanels/FixedPopupPanels.d.ts +72 -0
- package/FixedPopupPanels/FixedPopupPanels.js +170 -0
- package/FixedPopupPanels/FixedPopupPanels.module.css +146 -0
- package/FixedPopupPanels/package.json +3 -0
- package/FixedPopupPanels/tests/FixedPopupPanels-specs.js +142 -0
- package/FlexiblePopupPanels/FlexiblePopupPanels.js +177 -0
- package/FlexiblePopupPanels/FlexiblePopupPanels.module.css +291 -0
- package/FlexiblePopupPanels/Header.js +110 -0
- package/FlexiblePopupPanels/Panel.js +256 -0
- package/FlexiblePopupPanels/index.d.ts +145 -0
- package/FlexiblePopupPanels/index.js +68 -0
- package/FlexiblePopupPanels/package.json +3 -0
- package/FlexiblePopupPanels/tests/FlexiblePopupPanels-specs.js +305 -0
- package/FlexiblePopupPanels/useNavButtonFocus.js +65 -0
- package/FormCheckboxItem/FormCheckboxItem.d.ts +87 -0
- package/FormCheckboxItem/FormCheckboxItem.js +200 -0
- package/FormCheckboxItem/FormCheckboxItem.module.css +374 -0
- package/FormCheckboxItem/package.json +3 -0
- package/FormCheckboxItem/tests/FormCheckboxItem-specs.js +164 -0
- package/Heading/Heading.d.ts +104 -0
- package/Heading/Heading.js +203 -0
- package/Heading/Heading.module.css +217 -0
- package/Heading/package.json +3 -0
- package/Heading/tests/Heading-specs.js +57 -0
- package/Icon/Icon.d.ts +377 -0
- package/Icon/Icon.js +503 -0
- package/Icon/Icon.module.css +121 -0
- package/Icon/IconList.js +611 -0
- package/Icon/package.json +3 -0
- package/Icon/tests/Icon-specs.js +131 -0
- package/IconItem/IconItem.d.ts +137 -0
- package/IconItem/IconItem.js +360 -0
- package/IconItem/IconItem.module.css +414 -0
- package/IconItem/package.json +3 -0
- package/IconItem/tests/IconItem-specs.js +106 -0
- package/Image/Image.d.ts +60 -0
- package/Image/Image.js +165 -0
- package/Image/Image.module.css +5 -0
- package/Image/package.json +3 -0
- package/Image/tests/Image-specs.js +62 -0
- package/ImageItem/ImageItem.d.ts +134 -0
- package/ImageItem/ImageItem.js +377 -0
- package/ImageItem/ImageItem.module.css +1079 -0
- package/ImageItem/package.json +3 -0
- package/ImageItem/tests/ImageItem-specs.js +223 -0
- package/Input/Input.js +715 -0
- package/Input/Input.module.css +699 -0
- package/Input/InputField.js +487 -0
- package/Input/InputField.module.css +763 -0
- package/Input/InputFieldDecoratorIcon.js +66 -0
- package/Input/InputFieldSpotlightDecorator.js +380 -0
- package/Input/Keypad.js +111 -0
- package/Input/NumberField.js +311 -0
- package/Input/index.d.ts +423 -0
- package/Input/index.js +87 -0
- package/Input/package.json +3 -0
- package/Input/pointer.js +103 -0
- package/Input/tests/Input-specs.js +537 -0
- package/Input/tests/InputField-specs.js +292 -0
- package/Input/tests/InputPopup-specs.js +56 -0
- package/Input/util.js +130 -0
- package/Item/Item.d.ts +108 -0
- package/Item/Item.js +360 -0
- package/Item/Item.module.css +665 -0
- package/Item/package.json +3 -0
- package/Item/tests/Item-specs.js +108 -0
- package/KeyGuide/KeyGuide.d.ts +103 -0
- package/KeyGuide/KeyGuide.js +254 -0
- package/KeyGuide/KeyGuide.module.css +431 -0
- package/KeyGuide/package.json +3 -0
- package/KeyGuide/tests/KeyGuide-specs.js +168 -0
- package/LICENSE +201 -0
- package/Marquee/Marquee.d.ts +42 -0
- package/Marquee/Marquee.js +45 -0
- package/Marquee/package.json +3 -0
- package/MediaOverlay/MediaOverlay.d.ts +134 -0
- package/MediaOverlay/MediaOverlay.js +304 -0
- package/MediaOverlay/MediaOverlay.module.css +292 -0
- package/MediaOverlay/package.json +3 -0
- package/MediaOverlay/tests/MediaOverlay-specs.js +127 -0
- package/MediaPlayer/MediaControls.js +934 -0
- package/MediaPlayer/MediaControls.module.css +86 -0
- package/MediaPlayer/MediaKnob.js +61 -0
- package/MediaPlayer/MediaSlider.js +131 -0
- package/MediaPlayer/MediaSlider.module.css +319 -0
- package/MediaPlayer/MediaSliderDecorator.js +245 -0
- package/MediaPlayer/Times.js +152 -0
- package/MediaPlayer/Times.module.css +34 -0
- package/MediaPlayer/index.d.ts +223 -0
- package/MediaPlayer/index.js +34 -0
- package/MediaPlayer/package.json +3 -0
- package/MediaPlayer/tests/MediaSlider-specs.js +126 -0
- package/MediaPlayer/tests/util-specs.js +114 -0
- package/MediaPlayer/util.js +83 -0
- package/PageViews/Page.js +77 -0
- package/PageViews/Page.module.css +3 -0
- package/PageViews/PageViews.js +440 -0
- package/PageViews/PageViews.module.css +175 -0
- package/PageViews/PageViewsRouter.js +150 -0
- package/PageViews/index.js +45 -0
- package/PageViews/tests/PageViews-specs.js +192 -0
- package/Panels/Header.js +599 -0
- package/Panels/Header.module.css +243 -0
- package/Panels/Panel.js +347 -0
- package/Panels/Panel.module.css +33 -0
- package/Panels/Panels.js +258 -0
- package/Panels/Panels.module.css +12 -0
- package/Panels/index.d.ts +376 -0
- package/Panels/index.js +66 -0
- package/Panels/package.json +3 -0
- package/Panels/tests/Header-specs.js +146 -0
- package/Panels/tests/Panels-specs.js +257 -0
- package/Picker/Picker.d.ts +193 -0
- package/Picker/Picker.js +389 -0
- package/Picker/Picker.module.css +46 -0
- package/Picker/package.json +3 -0
- package/Picker/tests/Picker-specs.js +91 -0
- package/Popup/Popup.d.ts +169 -0
- package/Popup/Popup.js +690 -0
- package/Popup/Popup.module.css +180 -0
- package/Popup/package.json +3 -0
- package/Popup/tests/Popup-specs.js +475 -0
- package/PopupTabLayout/PopupTabLayout.d.ts +196 -0
- package/PopupTabLayout/PopupTabLayout.js +605 -0
- package/PopupTabLayout/PopupTabLayout.module.css +226 -0
- package/PopupTabLayout/package.json +3 -0
- package/PopupTabLayout/tests/PopupTabLayout-specs.js +285 -0
- package/ProgressBar/ProgressBar.d.ts +171 -0
- package/ProgressBar/ProgressBar.js +223 -0
- package/ProgressBar/ProgressBar.module.css +264 -0
- package/ProgressBar/ProgressBarTooltip.js +359 -0
- package/ProgressBar/ProgressBarTooltip.module.css +86 -0
- package/ProgressBar/package.json +3 -0
- package/ProgressBar/tests/ProgressBar-specs.js +400 -0
- package/ProgressButton/ProgressButton.d.ts +57 -0
- package/ProgressButton/ProgressButton.js +143 -0
- package/ProgressButton/ProgressButton.module.css +147 -0
- package/ProgressButton/package.json +3 -0
- package/ProgressButton/tests/ProgressButton-specs.js +71 -0
- package/QuickGuidePanels/Panel.js +90 -0
- package/QuickGuidePanels/QuickGuidePanels.js +463 -0
- package/QuickGuidePanels/QuickGuidePanels.module.css +26 -0
- package/QuickGuidePanels/index.js +52 -0
- package/QuickGuidePanels/tests/QuickGuidePanels-specs.js +250 -0
- package/README.md +59 -0
- package/RadioItem/RadioItem.d.ts +59 -0
- package/RadioItem/RadioItem.js +146 -0
- package/RadioItem/RadioItem.module.css +233 -0
- package/RadioItem/package.json +3 -0
- package/RadioItem/tests/RadioItem-specs.js +62 -0
- package/RangePicker/RangePicker.d.ts +174 -0
- package/RangePicker/RangePicker.js +372 -0
- package/RangePicker/RangePicker.module.css +55 -0
- package/RangePicker/package.json +3 -0
- package/RangePicker/tests/RangePicker-specs.js +122 -0
- package/Region/Region.d.ts +33 -0
- package/Region/Region.js +91 -0
- package/Region/package.json +3 -0
- package/Region/tests/Region-specs.js +28 -0
- package/Scroller/ContentContainerDecorator.js +24 -0
- package/Scroller/EditableWrapper.js +1036 -0
- package/Scroller/EditableWrapper.module.css +22 -0
- package/Scroller/Scroller.d.ts +270 -0
- package/Scroller/Scroller.js +470 -0
- package/Scroller/Scroller.module.css +41 -0
- package/Scroller/package.json +3 -0
- package/Scroller/tests/ContentContainerDecorator-specs.js +20 -0
- package/Scroller/tests/EditableWrapper-specs.js +133 -0
- package/Scroller/tests/Scroller-specs.js +159 -0
- package/Scroller/useEvent.js +39 -0
- package/Scroller/useThemeScroller.js +410 -0
- package/Skinnable/Skinnable.d.ts +27 -0
- package/Skinnable/Skinnable.js +65 -0
- package/Skinnable/package.json +3 -0
- package/Slider/Slider.d.ts +218 -0
- package/Slider/Slider.js +441 -0
- package/Slider/Slider.module.css +880 -0
- package/Slider/SliderBehaviorDecorator.js +184 -0
- package/Slider/package.json +3 -0
- package/Slider/tests/Slider-specs.js +573 -0
- package/Slider/utils.js +114 -0
- package/Spinner/Spinner.d.ts +64 -0
- package/Spinner/Spinner.js +254 -0
- package/Spinner/Spinner.module.css +368 -0
- package/Spinner/package.json +3 -0
- package/Spinner/tests/Spinner-specs.js +70 -0
- package/Sprite/Sprite.d.ts +100 -0
- package/Sprite/Sprite.js +345 -0
- package/Sprite/Sprite.module.css +32 -0
- package/Sprite/package.json +3 -0
- package/Sprite/tests/Sprite-specs.js +59 -0
- package/Steps/Steps.d.ts +119 -0
- package/Steps/Steps.js +303 -0
- package/Steps/Steps.module.css +130 -0
- package/Steps/package.json +3 -0
- package/Steps/tests/Steps-specs.js +175 -0
- package/Switch/Switch.d.ts +54 -0
- package/Switch/Switch.js +143 -0
- package/Switch/Switch.module.css +714 -0
- package/Switch/package.json +3 -0
- package/Switch/tests/Switch-specs.js +54 -0
- package/SwitchItem/SwitchItem.d.ts +56 -0
- package/SwitchItem/SwitchItem.js +144 -0
- package/SwitchItem/SwitchItem.module.css +31 -0
- package/SwitchItem/package.json +3 -0
- package/SwitchItem/tests/SwitchItem-specs.js +49 -0
- package/TabLayout/RefocusDecorator.js +142 -0
- package/TabLayout/Tab.js +84 -0
- package/TabLayout/TabGroup.js +377 -0
- package/TabLayout/TabGroup.module.css +280 -0
- package/TabLayout/TabLayout.d.ts +161 -0
- package/TabLayout/TabLayout.js +661 -0
- package/TabLayout/TabLayout.module.css +101 -0
- package/TabLayout/package.json +3 -0
- package/TabLayout/tests/TabGroup-specs.js +214 -0
- package/TabLayout/tests/TabLayout-specs.js +740 -0
- package/ThemeDecorator/AccessibilityDecorator.js +151 -0
- package/ThemeDecorator/I18nFontDecorator.js +33 -0
- package/ThemeDecorator/ThemeDecorator.d.ts +143 -0
- package/ThemeDecorator/ThemeDecorator.js +307 -0
- package/ThemeDecorator/ThemeDecorator.module.css +1250 -0
- package/ThemeDecorator/fontGenerator.js +76 -0
- package/ThemeDecorator/package.json +3 -0
- package/ThemeDecorator/screenTypes.json +10 -0
- package/ThemeDecorator/tests/ThemeDecorator-specs.js +151 -0
- package/TimePicker/TimePicker.d.ts +147 -0
- package/TimePicker/TimePicker.js +255 -0
- package/TimePicker/TimePicker.module.css +61 -0
- package/TimePicker/TimePickerBase.js +396 -0
- package/TimePicker/package.json +3 -0
- package/TimePicker/tests/TimePicker-specs.js +248 -0
- package/TooltipDecorator/Tooltip.js +252 -0
- package/TooltipDecorator/Tooltip.module.css +496 -0
- package/TooltipDecorator/TooltipDecorator.d.ts +229 -0
- package/TooltipDecorator/TooltipDecorator.js +260 -0
- package/TooltipDecorator/TooltipLabel.js +117 -0
- package/TooltipDecorator/package.json +3 -0
- package/TooltipDecorator/tests/TooltipDecorator-specs.js +224 -0
- package/TooltipDecorator/tests/useTooltip-specs.js +266 -0
- package/TooltipDecorator/useTooltip.js +278 -0
- package/TooltipDecorator/util.js +273 -0
- package/VideoPlayer/Feedback.js +110 -0
- package/VideoPlayer/Feedback.module.css +55 -0
- package/VideoPlayer/FeedbackContent.js +99 -0
- package/VideoPlayer/FeedbackIcon.js +67 -0
- package/VideoPlayer/FeedbackIcons.js +76 -0
- package/VideoPlayer/FeedbackTooltip.js +242 -0
- package/VideoPlayer/FeedbackTooltip.module.css +160 -0
- package/VideoPlayer/MediaTitle.js +143 -0
- package/VideoPlayer/MediaTitle.module.css +95 -0
- package/VideoPlayer/Overlay.js +51 -0
- package/VideoPlayer/Video.js +345 -0
- package/VideoPlayer/VideoPlayer.d.ts +582 -0
- package/VideoPlayer/VideoPlayer.js +2116 -0
- package/VideoPlayer/VideoPlayer.module.css +164 -0
- package/VideoPlayer/package.json +3 -0
- package/VideoPlayer/tests/Video-specs.js +235 -0
- package/VideoPlayer/tests/VideoPlayer-specs.js +180 -0
- package/VirtualList/VirtualList.d.ts +411 -0
- package/VirtualList/VirtualList.js +931 -0
- package/VirtualList/VirtualList.module.css +52 -0
- package/VirtualList/package.json +3 -0
- package/VirtualList/tests/VirtualGridList-specs.js +289 -0
- package/VirtualList/tests/VirtualGridList-translate-specs.js +711 -0
- package/VirtualList/tests/VirtualList-specs.js +288 -0
- package/VirtualList/tests/VirtualList-translate-specs.js +704 -0
- package/VirtualList/tests/useEvent-specs.js +172 -0
- package/VirtualList/tests/useEvent-translate-specs.js +309 -0
- package/VirtualList/useEvent.js +324 -0
- package/VirtualList/usePreventScroll.js +31 -0
- package/VirtualList/useSpotlight.js +157 -0
- package/VirtualList/useThemeVirtualList.js +471 -0
- package/VirtualList/useThemeVirtualList.module.css +34 -0
- package/WizardPanels/Panel.js +99 -0
- package/WizardPanels/WizardPanels.js +501 -0
- package/WizardPanels/WizardPanels.module.css +15 -0
- package/WizardPanels/index.d.ts +182 -0
- package/WizardPanels/index.js +50 -0
- package/WizardPanels/package.json +3 -0
- package/WizardPanels/tests/WizardPanels-specs.js +713 -0
- package/codecov.yml +13 -0
- package/fonts/Limestone_Icons.ttf +0 -0
- package/fonts/Miso/LICENSE.txt +75 -0
- package/fonts/Miso/Miso-Bold.ttf +0 -0
- package/fonts/Miso/Miso-Light.ttf +0 -0
- package/fonts/Miso/Miso-Regular.ttf +0 -0
- package/fonts/MuseoSans/LICENSE.txt +75 -0
- package/fonts/MuseoSans/MuseoSans-Black.ttf +0 -0
- package/fonts/MuseoSans/MuseoSans-BlackItalic.ttf +0 -0
- package/fonts/MuseoSans/MuseoSans-Bold.ttf +0 -0
- package/fonts/MuseoSans/MuseoSans-BoldItalic.ttf +0 -0
- package/fonts/MuseoSans/MuseoSans-Light.ttf +0 -0
- package/fonts/MuseoSans/MuseoSans-Medium.ttf +0 -0
- package/fonts/MuseoSans/MuseoSans-MediumItalic.ttf +0 -0
- package/fonts/MuseoSans/MuseoSans-Thin.ttf +0 -0
- package/index.js +2 -0
- package/internal/$L/$L.d.ts +21 -0
- package/internal/$L/$L.js +97 -0
- package/internal/$L/package.json +3 -0
- package/internal/AsyncRenderChildren/AsyncRenderChildren.js +74 -0
- package/internal/AsyncRenderChildren/package.json +3 -0
- package/internal/AsyncRenderChildren/tests/AsyncRenderChildren-specs.js +49 -0
- package/internal/DateComponentPicker/DateComponentPicker.js +165 -0
- package/internal/DateComponentPicker/DateComponentPicker.module.css +53 -0
- package/internal/DateComponentPicker/DateComponentRangePicker.js +132 -0
- package/internal/DateComponentPicker/index.js +31 -0
- package/internal/DateComponentPicker/package.json +3 -0
- package/internal/DateTime/DateTime.js +83 -0
- package/internal/DateTime/DateTime.module.css +51 -0
- package/internal/DateTime/DateTimeDecorator.js +268 -0
- package/internal/DateTime/index.js +37 -0
- package/internal/DateTime/package.json +3 -0
- package/internal/DateTime/tests/DateTimeDecorator-specs.js +33 -0
- package/internal/DebounceDecorator/DebounceDecorator.js +125 -0
- package/internal/DebounceDecorator/package.json +3 -0
- package/internal/DebounceDecorator/tests/DebounceDecorator-specs.js +151 -0
- package/internal/Panels/Arrangers.js +248 -0
- package/internal/Panels/CancelDecorator.js +43 -0
- package/internal/Panels/FloatingLayerIdProvider.js +27 -0
- package/internal/Panels/NavigationButton.js +64 -0
- package/internal/Panels/NavigationButton.module.css +69 -0
- package/internal/Panels/PanelsRouter.js +223 -0
- package/internal/Panels/PopupDecorator.js +287 -0
- package/internal/Panels/TransitionDecorator.js +99 -0
- package/internal/Panels/Viewport.js +313 -0
- package/internal/Panels/Viewport.module.css +25 -0
- package/internal/Panels/captureKeys.js +48 -0
- package/internal/Panels/index.js +101 -0
- package/internal/Panels/package.json +3 -0
- package/internal/Panels/useAutoFocus.js +95 -0
- package/internal/Panels/useFocusOnTransition.js +45 -0
- package/internal/Panels/useToggleRole.js +30 -0
- package/internal/Panels/util.js +64 -0
- package/internal/Picker/Picker.js +942 -0
- package/internal/Picker/Picker.module.css +1145 -0
- package/internal/Picker/PickerButton.js +97 -0
- package/internal/Picker/PickerItem.js +38 -0
- package/internal/Picker/SpottablePicker.js +63 -0
- package/internal/Picker/package.json +3 -0
- package/internal/Picker/tests/Picker-specs.js +968 -0
- package/internal/SharedStateDecorator/SharedStateDecorator.js +167 -0
- package/internal/SharedStateDecorator/package.json +3 -0
- package/internal/SharedStateDecorator/tests/SharedStateDecorator-specs.js +277 -0
- package/internal/WindowEventable/WindowEventable.js +114 -0
- package/internal/WindowEventable/package.json +3 -0
- package/internal/util/package.json +3 -0
- package/internal/util/util.js +79 -0
- package/internal/validators/package.json +4 -0
- package/internal/validators/tests/validators-specs.js +80 -0
- package/internal/validators/validators.js +136 -0
- package/package.json +69 -0
- package/resources/ilibmanifest.json +3 -0
- package/styles/color-mixins.less +230 -0
- package/styles/colors-game-green.less +25 -0
- package/styles/colors-game-orange.less +25 -0
- package/styles/colors-game.less +56 -0
- package/styles/colors-highcontrast.less +21 -0
- package/styles/colors.less +435 -0
- package/styles/mixins.less +337 -0
- package/styles/skin.less +54 -0
- package/styles/variables-base.less +32 -0
- package/styles/variables-game.less +25 -0
- package/styles/variables.less +1182 -0
- package/useScroll/HoverToScroll.js +265 -0
- package/useScroll/HoverToScroll.module.css +38 -0
- package/useScroll/OverscrollEffect.module.css +14 -0
- package/useScroll/Scrollbar.js +171 -0
- package/useScroll/Scrollbar.module.css +19 -0
- package/useScroll/ScrollbarPlaceholder.js +64 -0
- package/useScroll/ScrollbarTrack.js +209 -0
- package/useScroll/ScrollbarTrack.module.css +136 -0
- package/useScroll/package.json +3 -0
- package/useScroll/useEvent.js +693 -0
- package/useScroll/useOverscrollEffect.js +105 -0
- package/useScroll/useScroll.js +523 -0
- package/useScroll/useScroll.module.css +49 -0
- package/useScroll/useSpotlight.js +32 -0
- package/useScroll/useThemeScrollContentHandle.js +32 -0
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("@testing-library/jest-dom");
|
|
4
|
+
var _react = require("@testing-library/react");
|
|
5
|
+
var _Scroller = _interopRequireDefault(require("../Scroller"));
|
|
6
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
7
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
8
|
+
var focus = function focus(elm) {
|
|
9
|
+
return _react.fireEvent.focus(elm);
|
|
10
|
+
};
|
|
11
|
+
var keyDownUp = function keyDownUp(keyCode) {
|
|
12
|
+
return function (elm) {
|
|
13
|
+
_react.fireEvent.keyDown(elm, {
|
|
14
|
+
keyCode: keyCode
|
|
15
|
+
});
|
|
16
|
+
return _react.fireEvent.keyUp(elm, {
|
|
17
|
+
keyCode: keyCode
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
var pressEnterKey = keyDownUp(14);
|
|
22
|
+
var pressDownKey = keyDownUp(40);
|
|
23
|
+
describe('Scroller', function () {
|
|
24
|
+
var contents;
|
|
25
|
+
beforeEach(function () {
|
|
26
|
+
contents = /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
27
|
+
children: ["Lorem ipsum dolor sit amet, consectetur adipiscing elit.", /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), "Aenean id blandit nunc. Donec lacinia nisi vitae mi dictum, eget pulvinar nunc tincidunt. Integer vehicula tempus rutrum. Sed efficitur neque in arcu dignissim cursus."]
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
afterEach(function () {
|
|
31
|
+
contents = null;
|
|
32
|
+
});
|
|
33
|
+
describe('Scrollbar visibility', function () {
|
|
34
|
+
test('should render both horizontal and vertical scrollbars when \'horizontalScrollbar\' and \'verticalScrollbar\' are "visible"', function () {
|
|
35
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
36
|
+
horizontalScrollbar: "visible",
|
|
37
|
+
verticalScrollbar: "visible",
|
|
38
|
+
children: contents
|
|
39
|
+
}));
|
|
40
|
+
var verticalScrollbar = _react.screen.getByLabelText('scroll up or down with up down button');
|
|
41
|
+
var horizontalScrollbar = _react.screen.getByLabelText('scroll left or right with left right button');
|
|
42
|
+
expect(verticalScrollbar).toBeInTheDocument();
|
|
43
|
+
expect(horizontalScrollbar).toBeInTheDocument();
|
|
44
|
+
});
|
|
45
|
+
test('should render only vertical scrollbar when \'verticalScrollbar\' is "visible" and \'horizontalScrollbar\' is "hidden"', function () {
|
|
46
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
47
|
+
horizontalScrollbar: "hidden",
|
|
48
|
+
verticalScrollbar: "visible",
|
|
49
|
+
children: contents
|
|
50
|
+
}));
|
|
51
|
+
var verticalScrollbar = _react.screen.getByLabelText('scroll up or down with up down button');
|
|
52
|
+
var horizontalScrollbar = _react.screen.queryByLabelText('scroll left or right with left right button');
|
|
53
|
+
expect(verticalScrollbar).toBeInTheDocument();
|
|
54
|
+
expect(horizontalScrollbar).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
test('should not render any scrollbar when \'horizontalScrollbar\' and \'verticalScrollbar\' are "hidden"', function () {
|
|
57
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
58
|
+
horizontalScrollbar: "hidden",
|
|
59
|
+
verticalScrollbar: "hidden",
|
|
60
|
+
children: contents
|
|
61
|
+
}));
|
|
62
|
+
var verticalScrollbar = _react.screen.queryByLabelText('scroll up or down with up down button');
|
|
63
|
+
var horizontalScrollbar = _react.screen.queryByLabelText('scroll left or right with left right button');
|
|
64
|
+
expect(verticalScrollbar).toBeNull();
|
|
65
|
+
expect(horizontalScrollbar).toBeNull();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe('focusable Scrollbar', function () {
|
|
69
|
+
test('should have focuable body and thumb when \'focusableScrollbar\' is "byEnter"', function () {
|
|
70
|
+
var id = 'scroller';
|
|
71
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
72
|
+
"data-testid": id,
|
|
73
|
+
focusableScrollbar: "byEnter",
|
|
74
|
+
verticalScrollbar: "visible",
|
|
75
|
+
children: contents
|
|
76
|
+
}));
|
|
77
|
+
var scroller = _react.screen.getByTestId(id);
|
|
78
|
+
var scrollBody = scroller.children.item(0);
|
|
79
|
+
var verticalScrollbar = _react.screen.getByLabelText("scroll up or down with up down button press ok button to read text");
|
|
80
|
+
var expected = "spottable";
|
|
81
|
+
|
|
82
|
+
// dispatching key event to increase code coverage
|
|
83
|
+
focus(verticalScrollbar);
|
|
84
|
+
pressDownKey(verticalScrollbar);
|
|
85
|
+
pressEnterKey(verticalScrollbar);
|
|
86
|
+
expect(scrollBody).toHaveClass(expected);
|
|
87
|
+
expect(verticalScrollbar).toHaveClass(expected);
|
|
88
|
+
});
|
|
89
|
+
test('should have focuable scroll thumb when \'focusableScrollbar\' is true', function () {
|
|
90
|
+
var id = 'scroller';
|
|
91
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
92
|
+
"data-testid": id,
|
|
93
|
+
focusableScrollbar: true,
|
|
94
|
+
verticalScrollbar: "visible",
|
|
95
|
+
children: contents
|
|
96
|
+
}));
|
|
97
|
+
var scroller = _react.screen.getByTestId(id);
|
|
98
|
+
var scrollBody = scroller.children.item(0);
|
|
99
|
+
var verticalScrollbar = _react.screen.getByLabelText("scroll up or down with up down button");
|
|
100
|
+
var expected = "spottable";
|
|
101
|
+
expect(scrollBody).not.toHaveClass(expected);
|
|
102
|
+
expect(verticalScrollbar).toHaveClass(expected);
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
describe('Scrollbar accessibility', function () {
|
|
106
|
+
test('should set a custom "aria-label" to the scroll thumb in the horizontal scroll bar', function () {
|
|
107
|
+
var label = 'custom button aria label';
|
|
108
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
109
|
+
horizontalScrollbar: "visible",
|
|
110
|
+
horizontalScrollThumbAriaLabel: label,
|
|
111
|
+
verticalScrollbar: "visible",
|
|
112
|
+
children: contents
|
|
113
|
+
}));
|
|
114
|
+
var horizontalScrollbarLabel = _react.screen.getByLabelText(label);
|
|
115
|
+
var horizontalScrollbar = _react.screen.getByLabelText(label).parentElement.parentElement;
|
|
116
|
+
expect(horizontalScrollbarLabel).toBeInTheDocument();
|
|
117
|
+
expect(horizontalScrollbar).toHaveClass('horizontal');
|
|
118
|
+
});
|
|
119
|
+
test('should set a custom "aria-label" to the scroll thumb in the vertical scroll bar', function () {
|
|
120
|
+
var label = 'custom button aria label';
|
|
121
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
122
|
+
horizontalScrollbar: "visible",
|
|
123
|
+
verticalScrollThumbAriaLabel: label,
|
|
124
|
+
verticalScrollbar: "visible",
|
|
125
|
+
children: contents
|
|
126
|
+
}));
|
|
127
|
+
var verticalScrollbarLabel = _react.screen.getByLabelText(label);
|
|
128
|
+
var verticalScrollbar = _react.screen.getByLabelText(label).parentElement.parentElement;
|
|
129
|
+
expect(verticalScrollbarLabel).toBeInTheDocument();
|
|
130
|
+
expect(verticalScrollbar).toHaveClass('vertical');
|
|
131
|
+
});
|
|
132
|
+
test('should set a null string "aria-label" to the scroll thumb in the horizontal scroll bar', function () {
|
|
133
|
+
var label = '';
|
|
134
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
135
|
+
horizontalScrollbar: "visible",
|
|
136
|
+
horizontalScrollThumbAriaLabel: label,
|
|
137
|
+
verticalScrollbar: "visible",
|
|
138
|
+
children: contents
|
|
139
|
+
}));
|
|
140
|
+
var horizontalScrollbarLabel = _react.screen.getByLabelText(label);
|
|
141
|
+
var horizontalScrollbar = _react.screen.getByLabelText(label).parentElement.parentElement;
|
|
142
|
+
expect(horizontalScrollbarLabel).toBeInTheDocument();
|
|
143
|
+
expect(horizontalScrollbar).toHaveClass('horizontal');
|
|
144
|
+
});
|
|
145
|
+
test('should set a null string "aria-label" to the scroll thumb in the vertical scroll bar', function () {
|
|
146
|
+
var label = '';
|
|
147
|
+
(0, _react.render)(/*#__PURE__*/(0, _jsxRuntime.jsx)(_Scroller["default"], {
|
|
148
|
+
horizontalScrollbar: "visible",
|
|
149
|
+
verticalScrollThumbAriaLabel: label,
|
|
150
|
+
verticalScrollbar: "visible",
|
|
151
|
+
children: contents
|
|
152
|
+
}));
|
|
153
|
+
var verticalScrollbarLabel = _react.screen.getByLabelText(label);
|
|
154
|
+
var verticalScrollbar = _react.screen.getByLabelText(label).parentElement.parentElement;
|
|
155
|
+
expect(verticalScrollbarLabel).toBeInTheDocument();
|
|
156
|
+
expect(verticalScrollbar).toHaveClass('vertical');
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
});
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useEventKey = exports["default"] = void 0;
|
|
7
|
+
var _utilEvent = _interopRequireDefault(require("@enact/ui/useScroll/utilEvent"));
|
|
8
|
+
var _react = require("react");
|
|
9
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
10
|
+
var useEventKey = exports.useEventKey = function useEventKey() {
|
|
11
|
+
// Mutable value
|
|
12
|
+
|
|
13
|
+
var mutableRef = (0, _react.useRef)({
|
|
14
|
+
fn: null
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// Functions
|
|
18
|
+
|
|
19
|
+
function addGlobalKeyDownEventListener(fn) {
|
|
20
|
+
mutableRef.current.fn = fn;
|
|
21
|
+
(0, _utilEvent["default"])('keydown').addEventListener(document, mutableRef.current.fn, {
|
|
22
|
+
capture: true
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
function removeGlobalKeyDownEventListener() {
|
|
26
|
+
(0, _utilEvent["default"])('keydown').removeEventListener(document, mutableRef.current.fn, {
|
|
27
|
+
capture: true
|
|
28
|
+
});
|
|
29
|
+
mutableRef.current.fn = null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Return
|
|
33
|
+
|
|
34
|
+
return {
|
|
35
|
+
addGlobalKeyDownEventListener: addGlobalKeyDownEventListener,
|
|
36
|
+
removeGlobalKeyDownEventListener: removeGlobalKeyDownEventListener
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
var _default = exports["default"] = useEventKey;
|
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useThemeScroller = exports["default"] = void 0;
|
|
7
|
+
var _handle = require("@enact/core/handle");
|
|
8
|
+
var _keymap = require("@enact/core/keymap");
|
|
9
|
+
var _platform = _interopRequireDefault(require("@enact/core/platform"));
|
|
10
|
+
var _spotlight = _interopRequireDefault(require("@enact/spotlight"));
|
|
11
|
+
var _utils = require("@enact/spotlight/src/utils");
|
|
12
|
+
var _resolution = _interopRequireDefault(require("@enact/ui/resolution"));
|
|
13
|
+
var _utilDOM = _interopRequireDefault(require("@enact/ui/useScroll/utilDOM"));
|
|
14
|
+
var _classnames = _interopRequireDefault(require("classnames"));
|
|
15
|
+
var _react = require("react");
|
|
16
|
+
var _useScroll = require("../useScroll");
|
|
17
|
+
var _useEvent = require("./useEvent");
|
|
18
|
+
var _ScrollerModule = _interopRequireDefault(require("./Scroller.module.css"));
|
|
19
|
+
var _ScrollbarTrackModule = _interopRequireDefault(require("../useScroll/ScrollbarTrack.module.css"));
|
|
20
|
+
var _excluded = ["className", "children", "editable", "fadeOut", "scrollContainerRef"],
|
|
21
|
+
_excluded2 = ["setNavigableFilter"];
|
|
22
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
|
|
23
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
24
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
25
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
26
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
27
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
28
|
+
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
29
|
+
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
30
|
+
var isCancel = (0, _keymap.is)('cancel'),
|
|
31
|
+
isEnter = (0, _keymap.is)('enter'),
|
|
32
|
+
isBody = function isBody(elem) {
|
|
33
|
+
return elem.classList.contains(_ScrollerModule["default"].focusableBody);
|
|
34
|
+
};
|
|
35
|
+
var getFocusableBodyProps = function getFocusableBodyProps(scrollContainerRef, contentId, isScrollbarVisible) {
|
|
36
|
+
var spotlightId = scrollContainerRef.current && scrollContainerRef.current.dataset.spotlightId;
|
|
37
|
+
var consumeKeyUpTarget = null;
|
|
38
|
+
var setNavigableFilter = function setNavigableFilter(_ref) {
|
|
39
|
+
var filterTarget = _ref.filterTarget;
|
|
40
|
+
spotlightId = scrollContainerRef.current && scrollContainerRef.current.dataset.spotlightId;
|
|
41
|
+
if (spotlightId && filterTarget) {
|
|
42
|
+
var targetClassName = filterTarget === 'body' ? _ScrollerModule["default"].focusableBody : _ScrollbarTrackModule["default"].thumb;
|
|
43
|
+
_spotlight["default"].set(spotlightId, {
|
|
44
|
+
navigableFilter: function navigableFilter(elem) {
|
|
45
|
+
return typeof elem === 'string' || !elem.classList.contains(targetClassName);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
};
|
|
52
|
+
var getNavigableFilterTarget = function getNavigableFilterTarget(ev) {
|
|
53
|
+
var keyCode = ev.keyCode,
|
|
54
|
+
target = ev.target,
|
|
55
|
+
type = ev.type;
|
|
56
|
+
var filterTarget = null;
|
|
57
|
+
if (!isScrollbarVisible) {
|
|
58
|
+
return {
|
|
59
|
+
filterTarget: filterTarget
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (type === 'focus') {
|
|
63
|
+
filterTarget = isBody(target) ? 'thumb' : 'body';
|
|
64
|
+
} else if (type === 'blur') {
|
|
65
|
+
filterTarget = 'body';
|
|
66
|
+
} else if (type === 'keydown') {
|
|
67
|
+
filterTarget = !_spotlight["default"].getPointerMode() && isEnter(keyCode) && isBody(target) && 'body' || isEnter(keyCode) && !isBody(target) && 'thumb' || isCancel(keyCode) && !isBody(target) && 'thumb' || null;
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
filterTarget: filterTarget
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
var consumeEventKeyDownWithFocus = function consumeEventKeyDownWithFocus(ev) {
|
|
74
|
+
var keyCode = ev.keyCode,
|
|
75
|
+
target = ev.target;
|
|
76
|
+
var nextTarget;
|
|
77
|
+
if (isBody(target)) {
|
|
78
|
+
// Enter key on scroll Body.
|
|
79
|
+
// Scroll thumb get focus.
|
|
80
|
+
var spottableDescendants = _spotlight["default"].getSpottableDescendants(spotlightId);
|
|
81
|
+
if (spottableDescendants.length > 0) {
|
|
82
|
+
// Last spottable descendant(thumb) get focus.
|
|
83
|
+
nextTarget = spottableDescendants.pop();
|
|
84
|
+
|
|
85
|
+
// If there are both thumbs, vertical thumb is the next target
|
|
86
|
+
var verticalThumb = spottableDescendants.pop();
|
|
87
|
+
nextTarget = verticalThumb && verticalThumb.classList.contains(_ScrollbarTrackModule["default"].thumb) ? verticalThumb : nextTarget;
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
// Enter or Cancel key on scroll thumb.
|
|
91
|
+
// Scroll body get focus.
|
|
92
|
+
nextTarget = target.closest(".".concat(_ScrollerModule["default"].focusableBody));
|
|
93
|
+
consumeKeyUpTarget = isCancel(keyCode) && nextTarget || null;
|
|
94
|
+
}
|
|
95
|
+
if (nextTarget) {
|
|
96
|
+
_spotlight["default"].focus(nextTarget);
|
|
97
|
+
ev.preventDefault();
|
|
98
|
+
ev.nativeEvent.stopImmediatePropagation();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
var consumeEventKeyUp = function consumeEventKeyUp(ev) {
|
|
102
|
+
var keyCode = ev.keyCode,
|
|
103
|
+
target = ev.target;
|
|
104
|
+
if (isCancel(keyCode) && target === consumeKeyUpTarget) {
|
|
105
|
+
ev.nativeEvent.stopImmediatePropagation();
|
|
106
|
+
}
|
|
107
|
+
consumeKeyUpTarget = null;
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
'aria-labelledby': contentId,
|
|
111
|
+
className: _ScrollerModule["default"].focusableBody,
|
|
112
|
+
onFocus: (0, _handle.handle)((0, _handle.forward)('onFocus'), (0, _handle.adaptEvent)(getNavigableFilterTarget, setNavigableFilter)),
|
|
113
|
+
onBlur: (0, _handle.handle)(
|
|
114
|
+
// Focus out to external element.
|
|
115
|
+
(0, _handle.forward)('onBlur'), (0, _handle.adaptEvent)(getNavigableFilterTarget, setNavigableFilter)),
|
|
116
|
+
onKeyDown: (0, _handle.handle)((0, _handle.forward)('onKeyDown'), (0, _handle.adaptEvent)(getNavigableFilterTarget, setNavigableFilter), consumeEventKeyDownWithFocus),
|
|
117
|
+
onKeyUp: (0, _handle.handle)(consumeEventKeyUp),
|
|
118
|
+
setNavigableFilter: setNavigableFilter
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
var useSpottable = function useSpottable(props, instances) {
|
|
122
|
+
var scrollContainerRef = instances.scrollContainerRef,
|
|
123
|
+
scrollContentHandle = instances.scrollContentHandle,
|
|
124
|
+
scrollContentRef = instances.scrollContentRef;
|
|
125
|
+
|
|
126
|
+
// Hooks
|
|
127
|
+
|
|
128
|
+
var _useEventKey = (0, _useEvent.useEventKey)(),
|
|
129
|
+
addGlobalKeyDownEventListener = _useEventKey.addGlobalKeyDownEventListener,
|
|
130
|
+
removeGlobalKeyDownEventListener = _useEventKey.removeGlobalKeyDownEventListener;
|
|
131
|
+
var setContainerDisabled = (0, _react.useCallback)(function (bool) {
|
|
132
|
+
if (scrollContainerRef.current) {
|
|
133
|
+
scrollContainerRef.current.dataset.spotlightContainerDisabled = bool;
|
|
134
|
+
if (bool) {
|
|
135
|
+
addGlobalKeyDownEventListener(function () {
|
|
136
|
+
setContainerDisabled(false);
|
|
137
|
+
});
|
|
138
|
+
} else {
|
|
139
|
+
removeGlobalKeyDownEventListener();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}, [addGlobalKeyDownEventListener, removeGlobalKeyDownEventListener, scrollContainerRef]);
|
|
143
|
+
(0, _react.useEffect)(function () {
|
|
144
|
+
return function () {
|
|
145
|
+
return setContainerDisabled(false);
|
|
146
|
+
};
|
|
147
|
+
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
148
|
+
|
|
149
|
+
(0, _react.useEffect)(function () {
|
|
150
|
+
var onUpdate = props.onUpdate;
|
|
151
|
+
if (onUpdate) {
|
|
152
|
+
onUpdate();
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Functions
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Returns the first spotlight container between `node` and the scroller
|
|
160
|
+
*
|
|
161
|
+
* @param {Node} node A DOM node
|
|
162
|
+
*
|
|
163
|
+
* @returns {Node|Null} Spotlight container for `node`
|
|
164
|
+
* @private
|
|
165
|
+
*/
|
|
166
|
+
function getSpotlightContainerForNode(node) {
|
|
167
|
+
do {
|
|
168
|
+
if (node.dataset.spotlightId && node.dataset.spotlightContainer && !node.dataset.expandableContainer) {
|
|
169
|
+
return node;
|
|
170
|
+
}
|
|
171
|
+
} while ((node = node.parentNode) && node !== scrollContentRef.current);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Calculates the "focus bounds" of a node. If the node is within a spotlight container, that
|
|
176
|
+
* container is scrolled into view rather than just the element.
|
|
177
|
+
*
|
|
178
|
+
* @param {Node} node Focused node
|
|
179
|
+
*
|
|
180
|
+
* @returns {Object} Bounds as returned by `getBoundingClientRect`
|
|
181
|
+
* @private
|
|
182
|
+
*/
|
|
183
|
+
function getFocusedItemBounds(node) {
|
|
184
|
+
node = getSpotlightContainerForNode(node) || node;
|
|
185
|
+
return node.getBoundingClientRect();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Calculates the new `scrollTop`.
|
|
190
|
+
*
|
|
191
|
+
* @param {Node} item Focused item node
|
|
192
|
+
*
|
|
193
|
+
* @returns {Number} Calculated `scrollTop`
|
|
194
|
+
* @private
|
|
195
|
+
*/
|
|
196
|
+
function calculateScrollTop(item) {
|
|
197
|
+
var threshold = _resolution["default"].scale(48);
|
|
198
|
+
var roundToStart = function roundToStart(sb, st) {
|
|
199
|
+
// round to start
|
|
200
|
+
if (st < threshold) return 0;
|
|
201
|
+
return st;
|
|
202
|
+
};
|
|
203
|
+
var roundToEnd = function roundToEnd(sb, st, sh) {
|
|
204
|
+
// round to end
|
|
205
|
+
if (sh - (st + sb.height) < threshold) return sh - sb.height;
|
|
206
|
+
return st + _resolution["default"].scale(_useScroll.affordanceSize);
|
|
207
|
+
};
|
|
208
|
+
// adding threshold into these determinations ensures that items that are within that are
|
|
209
|
+
// near the bounds of the scroller cause the edge to be scrolled into view even when the
|
|
210
|
+
// item itself is in view (e.g. due to margins)
|
|
211
|
+
var isItemBeforeView = function isItemBeforeView(ib, sb, d) {
|
|
212
|
+
return ib.top + d - threshold < sb.top;
|
|
213
|
+
};
|
|
214
|
+
var isItemAfterView = function isItemAfterView(ib, sb, d) {
|
|
215
|
+
return ib.top + d + ib.height + threshold > sb.top + sb.height;
|
|
216
|
+
};
|
|
217
|
+
var canItemFit = function canItemFit(ib, sb) {
|
|
218
|
+
return ib.height <= sb.height;
|
|
219
|
+
};
|
|
220
|
+
var calcItemAtStart = function calcItemAtStart(ib, sb, st, d) {
|
|
221
|
+
return ib.top + st + d - sb.top;
|
|
222
|
+
};
|
|
223
|
+
var calcItemAtEnd = function calcItemAtEnd(ib, sb, st, d) {
|
|
224
|
+
return ib.top + ib.height + st + d - (sb.top + sb.height);
|
|
225
|
+
};
|
|
226
|
+
var calcItemInView = function calcItemInView(ib, sb, st, sh, d) {
|
|
227
|
+
if (isItemBeforeView(ib, sb, d)) {
|
|
228
|
+
return roundToStart(sb, calcItemAtStart(ib, sb, st, d));
|
|
229
|
+
} else if (isItemAfterView(ib, sb, d)) {
|
|
230
|
+
return roundToEnd(sb, calcItemAtEnd(ib, sb, st, d), sh);
|
|
231
|
+
}
|
|
232
|
+
return st;
|
|
233
|
+
};
|
|
234
|
+
var container = getSpotlightContainerForNode(item);
|
|
235
|
+
var scrollerBounds = scrollContentRef.current.getBoundingClientRect();
|
|
236
|
+
var _scrollContentRef$cur = scrollContentRef.current,
|
|
237
|
+
scrollHeight = _scrollContentRef$cur.scrollHeight,
|
|
238
|
+
scrollTop = _scrollContentRef$cur.scrollTop;
|
|
239
|
+
var scrollTopDelta = 0;
|
|
240
|
+
var adjustScrollTop = function adjustScrollTop(v) {
|
|
241
|
+
scrollTopDelta = scrollTop - v;
|
|
242
|
+
scrollTop = v;
|
|
243
|
+
};
|
|
244
|
+
if (container) {
|
|
245
|
+
var containerBounds = container.getBoundingClientRect();
|
|
246
|
+
|
|
247
|
+
// if the entire container fits in the scroller, scroll it into view
|
|
248
|
+
if (canItemFit(containerBounds, scrollerBounds)) {
|
|
249
|
+
return calcItemInView(containerBounds, scrollerBounds, scrollTop, scrollHeight, scrollTopDelta);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// if the container doesn't fit, adjust the scroll top ...
|
|
253
|
+
if (containerBounds.top > scrollerBounds.top) {
|
|
254
|
+
// ... to the top of the container if the top is below the top of the scroller
|
|
255
|
+
adjustScrollTop(calcItemAtStart(containerBounds, scrollerBounds, scrollTop, scrollTopDelta));
|
|
256
|
+
}
|
|
257
|
+
// removing support for "snap to bottom" for 2.2.8
|
|
258
|
+
// } else if (containerBounds.top + containerBounds.height < scrollerBounds.top + scrollerBounds.height) {
|
|
259
|
+
// // ... to the bottom of the container if the bottom is above the bottom of the
|
|
260
|
+
// // scroller
|
|
261
|
+
// adjustScrollTop(calcItemAtEnd(containerBounds, scrollerBounds, scrollTop, scrollTopDelta));
|
|
262
|
+
// }
|
|
263
|
+
|
|
264
|
+
// N.B. if the container covers the scrollable area (its top is above the top of the
|
|
265
|
+
// scroller and its bottom is below the bottom of the scroller), we need not adjust the
|
|
266
|
+
// scroller to ensure the container is wholly in view.
|
|
267
|
+
}
|
|
268
|
+
var itemBounds = item.getBoundingClientRect();
|
|
269
|
+
return calcItemInView(itemBounds, scrollerBounds, scrollTop, scrollHeight, scrollTopDelta);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Calculates the new `scrollLeft`.
|
|
274
|
+
*
|
|
275
|
+
* @param {Node} item node
|
|
276
|
+
* @param {Number} scrollPosition last target position, passed when scroll animation is ongoing
|
|
277
|
+
*
|
|
278
|
+
* @returns {Number} Calculated `scrollLeft`
|
|
279
|
+
* @private
|
|
280
|
+
*/
|
|
281
|
+
function calculateScrollLeft(item, scrollPosition) {
|
|
282
|
+
var scrollContentNode = scrollContentRef.current;
|
|
283
|
+
var _getFocusedItemBounds = getFocusedItemBounds(item),
|
|
284
|
+
itemLeft = _getFocusedItemBounds.left,
|
|
285
|
+
itemWidth = _getFocusedItemBounds.width;
|
|
286
|
+
var rtl = props.rtl,
|
|
287
|
+
coordinateCoefficient = rtl && !(_platform["default"].chrome < 85) ? -1 : 1,
|
|
288
|
+
clientWidth = scrollContentHandle.current.scrollBounds.clientWidth,
|
|
289
|
+
rtlDirection = rtl ? -1 : 1,
|
|
290
|
+
_scrollContentNode$ge = scrollContentNode.getBoundingClientRect(),
|
|
291
|
+
containerLeft = _scrollContentNode$ge.left,
|
|
292
|
+
scrollLastPosition = scrollPosition ? scrollPosition : scrollContentHandle.current.scrollPos.left,
|
|
293
|
+
currentScrollLeft = rtl && coordinateCoefficient === 1 ? scrollContentHandle.current.scrollBounds.maxLeft - scrollLastPosition : scrollLastPosition,
|
|
294
|
+
newItemLeft = coordinateCoefficient * scrollContentNode.scrollLeft + (itemLeft - containerLeft);
|
|
295
|
+
var nextScrollLeft = scrollContentHandle.current.scrollPos.left;
|
|
296
|
+
if (newItemLeft + itemWidth > clientWidth + currentScrollLeft && itemWidth < clientWidth) {
|
|
297
|
+
// If focus is moved to an element outside of view area (to the right), scroller will move
|
|
298
|
+
// to the right just enough to show the current `focusedItem`. This does not apply to
|
|
299
|
+
// `focusedItem` that has a width that is bigger than `scrollBounds.clientWidth`.
|
|
300
|
+
nextScrollLeft += rtlDirection * (newItemLeft + itemWidth - (clientWidth + currentScrollLeft));
|
|
301
|
+
} else if (newItemLeft < currentScrollLeft) {
|
|
302
|
+
// If focus is outside the view area to the left, move scroller to the left accordingly.
|
|
303
|
+
nextScrollLeft += rtlDirection * (newItemLeft - currentScrollLeft);
|
|
304
|
+
}
|
|
305
|
+
return nextScrollLeft;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
/**
|
|
309
|
+
* Calculates the new top and left position for scroller based on focusedItem.
|
|
310
|
+
*
|
|
311
|
+
* @param {Node} item node
|
|
312
|
+
* @param {Number} scrollPosition last target position, passed scroll animation is ongoing
|
|
313
|
+
*
|
|
314
|
+
* @returns {Object} with keys {top, left} containing calculated top and left positions for scroll.
|
|
315
|
+
* @private
|
|
316
|
+
*/
|
|
317
|
+
function calculatePositionOnFocus(_ref2) {
|
|
318
|
+
var item = _ref2.item,
|
|
319
|
+
scrollPosition = _ref2.scrollPosition;
|
|
320
|
+
var containerNode = scrollContentRef.current;
|
|
321
|
+
var horizontal = scrollContentHandle.current.isHorizontal();
|
|
322
|
+
var vertical = scrollContentHandle.current.isVertical();
|
|
323
|
+
if (!vertical && !horizontal || !item || !_utilDOM["default"].containsDangerously(containerNode, item)) {
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
var containerRect = (0, _utils.getRect)(containerNode);
|
|
327
|
+
var itemRect = (0, _utils.getRect)(item);
|
|
328
|
+
if (horizontal && !(itemRect.left >= containerRect.left + _resolution["default"].scale(_useScroll.affordanceSize) && itemRect.right <= containerRect.right - _resolution["default"].scale(_useScroll.affordanceSize))) {
|
|
329
|
+
scrollContentHandle.current.scrollPos.left = calculateScrollLeft(item, scrollPosition);
|
|
330
|
+
}
|
|
331
|
+
if (vertical && !(itemRect.top >= containerRect.top && itemRect.bottom <= containerRect.bottom - _resolution["default"].scale(_useScroll.affordanceSize))) {
|
|
332
|
+
scrollContentHandle.current.scrollPos.top = calculateScrollTop(item);
|
|
333
|
+
}
|
|
334
|
+
return scrollContentHandle.current.scrollPos;
|
|
335
|
+
}
|
|
336
|
+
function focusOnNode(node) {
|
|
337
|
+
if (node) {
|
|
338
|
+
_spotlight["default"].focus(node);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Return
|
|
343
|
+
|
|
344
|
+
return {
|
|
345
|
+
calculatePositionOnFocus: calculatePositionOnFocus,
|
|
346
|
+
focusOnNode: focusOnNode,
|
|
347
|
+
setContainerDisabled: setContainerDisabled
|
|
348
|
+
};
|
|
349
|
+
};
|
|
350
|
+
var useThemeScroller = exports.useThemeScroller = function useThemeScroller(props, scrollContentProps, contentId, isHorizontalScrollbarVisible, isVerticalScrollbarVisible) {
|
|
351
|
+
var className = scrollContentProps.className,
|
|
352
|
+
children = scrollContentProps.children,
|
|
353
|
+
editable = scrollContentProps.editable,
|
|
354
|
+
fadeOut = scrollContentProps.fadeOut,
|
|
355
|
+
scrollContainerRef = scrollContentProps.scrollContainerRef,
|
|
356
|
+
rest = _objectWithoutProperties(scrollContentProps, _excluded);
|
|
357
|
+
var scrollContainerHandle = rest.scrollContainerHandle,
|
|
358
|
+
scrollContentHandle = rest.scrollContentHandle,
|
|
359
|
+
scrollContentRef = rest.scrollContentRef;
|
|
360
|
+
delete rest.onUpdate;
|
|
361
|
+
delete rest.scrollContainerContainsDangerously;
|
|
362
|
+
delete rest.scrollContainerHandle;
|
|
363
|
+
delete rest.scrollContentHandle;
|
|
364
|
+
delete rest.setThemeScrollContentHandle;
|
|
365
|
+
delete rest.spotlightId;
|
|
366
|
+
|
|
367
|
+
// Hooks
|
|
368
|
+
var isScrollbarVisible = isHorizontalScrollbarVisible || isVerticalScrollbarVisible;
|
|
369
|
+
var _useSpottable = useSpottable(scrollContentProps, {
|
|
370
|
+
scrollContainerRef: scrollContainerRef,
|
|
371
|
+
scrollContentHandle: scrollContentHandle,
|
|
372
|
+
scrollContentRef: scrollContentRef
|
|
373
|
+
}),
|
|
374
|
+
calculatePositionOnFocus = _useSpottable.calculatePositionOnFocus,
|
|
375
|
+
focusOnNode = _useSpottable.focusOnNode,
|
|
376
|
+
setContainerDisabled = _useSpottable.setContainerDisabled;
|
|
377
|
+
var _ref3 = props.focusableScrollbar === 'byEnter' ? getFocusableBodyProps(scrollContainerRef, contentId, isScrollbarVisible) : {},
|
|
378
|
+
setNavigableFilter = _ref3.setNavigableFilter,
|
|
379
|
+
focusableBodyProps = _objectWithoutProperties(_ref3, _excluded2);
|
|
380
|
+
(0, _react.useLayoutEffect)(function () {
|
|
381
|
+
// Initial filter setting
|
|
382
|
+
if (setNavigableFilter) {
|
|
383
|
+
setNavigableFilter({
|
|
384
|
+
filterTarget: 'body'
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
}, [props.focusableScrollbar, scrollContainerRef.current]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
388
|
+
|
|
389
|
+
scrollContentProps.setThemeScrollContentHandle({
|
|
390
|
+
calculatePositionOnFocus: calculatePositionOnFocus,
|
|
391
|
+
focusOnNode: focusOnNode,
|
|
392
|
+
setContainerDisabled: setContainerDisabled
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
// Render
|
|
396
|
+
|
|
397
|
+
rest.className = (0, _classnames["default"])(className, !isHorizontalScrollbarVisible && isVerticalScrollbarVisible && fadeOut ? _ScrollerModule["default"].verticalFadeout : null, isHorizontalScrollbarVisible && !isVerticalScrollbarVisible && fadeOut ? _ScrollerModule["default"].horizontalFadeout : null);
|
|
398
|
+
return {
|
|
399
|
+
editableWrapperProps: {
|
|
400
|
+
children: children,
|
|
401
|
+
editable: editable,
|
|
402
|
+
scrollContainerHandle: scrollContainerHandle,
|
|
403
|
+
scrollContainerRef: scrollContainerRef,
|
|
404
|
+
scrollContentRef: scrollContentRef
|
|
405
|
+
},
|
|
406
|
+
focusableBodyProps: focusableBodyProps,
|
|
407
|
+
themeScrollContentProps: _objectSpread({}, rest)
|
|
408
|
+
};
|
|
409
|
+
};
|
|
410
|
+
var _default = exports["default"] = useThemeScroller;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Type definitions for limestone/Skinnable
|
|
2
|
+
|
|
3
|
+
import { SkinnableProps as ui_Skinnable_SkinnableProps } from "@enact/ui/Skinnable";
|
|
4
|
+
|
|
5
|
+
type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
|
|
6
|
+
type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;
|
|
7
|
+
|
|
8
|
+
export interface SkinnableProps extends ui_Skinnable_SkinnableProps {
|
|
9
|
+
/**
|
|
10
|
+
* Select a skin by name by specifying this property.
|
|
11
|
+
*
|
|
12
|
+
* Available Limestone skins are `"neutral"` (default) and `"light"` . This may be changed at runtime.
|
|
13
|
+
All components already use their defaults, but a skin may be changed via this prop or by using
|
|
14
|
+
`Skinnable` directly and a config object.
|
|
15
|
+
*
|
|
16
|
+
* Example:
|
|
17
|
+
* ```
|
|
18
|
+
<Button skin="light">
|
|
19
|
+
```
|
|
20
|
+
*/
|
|
21
|
+
skin?: string;
|
|
22
|
+
}
|
|
23
|
+
export function Skinnable<P>(
|
|
24
|
+
Component: React.ComponentType<P> | string,
|
|
25
|
+
): React.ComponentType<P & SkinnableProps>;
|
|
26
|
+
|
|
27
|
+
export default Skinnable;
|