@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.
Files changed (463) hide show
  1. package/.github/PULL_REQUEST_TEMPLATE.md +28 -0
  2. package/.github/workflows/update-copyright-years.yml +25 -0
  3. package/.travis.yml +40 -0
  4. package/ActionGuide/ActionGuide.d.ts +73 -0
  5. package/ActionGuide/ActionGuide.js +164 -0
  6. package/ActionGuide/ActionGuide.module.css +73 -0
  7. package/ActionGuide/package.json +3 -0
  8. package/ActionGuide/tests/ActionGuide-specs.js +51 -0
  9. package/Alert/Alert.d.ts +155 -0
  10. package/Alert/Alert.js +313 -0
  11. package/Alert/Alert.module.css +190 -0
  12. package/Alert/AlertImage.js +102 -0
  13. package/Alert/AlertImage.module.css +15 -0
  14. package/Alert/package.json +3 -0
  15. package/Alert/tests/Alert-specs.js +204 -0
  16. package/BodyText/BodyText.d.ts +74 -0
  17. package/BodyText/BodyText.js +170 -0
  18. package/BodyText/BodyText.module.css +95 -0
  19. package/BodyText/package.json +3 -0
  20. package/BodyText/tests/BodyText-specs.js +55 -0
  21. package/Button/Button.d.ts +131 -0
  22. package/Button/Button.js +351 -0
  23. package/Button/Button.module.css +2518 -0
  24. package/Button/package.json +3 -0
  25. package/Button/tests/Button-specs.js +252 -0
  26. package/CHANGELOG.md +170 -0
  27. package/Card/Card.d.ts +138 -0
  28. package/Card/Card.js +396 -0
  29. package/Card/Card.module.css +1296 -0
  30. package/Card/package.json +3 -0
  31. package/Card/tests/Card-specs.js +65 -0
  32. package/Checkbox/Checkbox.d.ts +99 -0
  33. package/Checkbox/Checkbox.js +222 -0
  34. package/Checkbox/Checkbox.module.css +1395 -0
  35. package/Checkbox/package.json +3 -0
  36. package/Checkbox/tests/Checkbox-specs.js +79 -0
  37. package/CheckboxItem/CheckboxItem.d.ts +99 -0
  38. package/CheckboxItem/CheckboxItem.js +210 -0
  39. package/CheckboxItem/CheckboxItem.module.css +50 -0
  40. package/CheckboxItem/package.json +3 -0
  41. package/CheckboxItem/tests/CheckboxItem-specs.js +52 -0
  42. package/Chips/Chip.js +252 -0
  43. package/Chips/Chip.module.css +30 -0
  44. package/Chips/Chips.js +215 -0
  45. package/Chips/Chips.module.css +8 -0
  46. package/Chips/index.js +86 -0
  47. package/Chips/tests/Chip-specs.js +186 -0
  48. package/Chips/tests/Chips-specs.js +312 -0
  49. package/ColorPicker/ColorPicker.js +416 -0
  50. package/ColorPicker/ColorPicker.module.css +78 -0
  51. package/ColorPicker/package.json +3 -0
  52. package/ColorPicker/tests/ColorPicker-specs.js +225 -0
  53. package/ColorPicker/utils.js +135 -0
  54. package/ContextualMenuDecorator/ContextualMenuDecorator.d.ts +106 -0
  55. package/ContextualMenuDecorator/ContextualMenuDecorator.js +264 -0
  56. package/ContextualMenuDecorator/ContextualMenuDecorator.module.css +42 -0
  57. package/ContextualMenuDecorator/package.json +3 -0
  58. package/ContextualMenuDecorator/tests/ContextualMenuDecorator-specs.js +136 -0
  59. package/ContextualPopupDecorator/ContextualPopup.js +200 -0
  60. package/ContextualPopupDecorator/ContextualPopup.module.css +270 -0
  61. package/ContextualPopupDecorator/ContextualPopupDecorator.d.ts +182 -0
  62. package/ContextualPopupDecorator/ContextualPopupDecorator.js +867 -0
  63. package/ContextualPopupDecorator/ContextualPopupDecorator.module.css +3 -0
  64. package/ContextualPopupDecorator/HolePunchScrim.js +69 -0
  65. package/ContextualPopupDecorator/HolePunchScrim.module.css +38 -0
  66. package/ContextualPopupDecorator/package.json +3 -0
  67. package/ContextualPopupDecorator/tests/ContextualPopupDecorator-specs.js +621 -0
  68. package/DatePicker/DatePicker.d.ts +173 -0
  69. package/DatePicker/DatePicker.js +175 -0
  70. package/DatePicker/DatePicker.module.css +5 -0
  71. package/DatePicker/DatePickerBase.js +348 -0
  72. package/DatePicker/package.json +3 -0
  73. package/DatePicker/tests/DatePicker-specs.js +247 -0
  74. package/DayPicker/DayPicker.d.ts +92 -0
  75. package/DayPicker/DayPicker.js +188 -0
  76. package/DayPicker/DayPicker.module.css +35 -0
  77. package/DayPicker/DaySelectorDecorator.js +301 -0
  78. package/DayPicker/package.json +3 -0
  79. package/DayPicker/tests/DayPicker-specs.js +138 -0
  80. package/Dropdown/Dropdown.d.ts +135 -0
  81. package/Dropdown/Dropdown.js +460 -0
  82. package/Dropdown/Dropdown.module.css +160 -0
  83. package/Dropdown/DropdownList.js +360 -0
  84. package/Dropdown/package.json +3 -0
  85. package/Dropdown/tests/Dropdown-specs.js +267 -0
  86. package/FixedPopupPanels/FixedPopupPanels.d.ts +72 -0
  87. package/FixedPopupPanels/FixedPopupPanels.js +170 -0
  88. package/FixedPopupPanels/FixedPopupPanels.module.css +146 -0
  89. package/FixedPopupPanels/package.json +3 -0
  90. package/FixedPopupPanels/tests/FixedPopupPanels-specs.js +142 -0
  91. package/FlexiblePopupPanels/FlexiblePopupPanels.js +177 -0
  92. package/FlexiblePopupPanels/FlexiblePopupPanels.module.css +291 -0
  93. package/FlexiblePopupPanels/Header.js +110 -0
  94. package/FlexiblePopupPanels/Panel.js +256 -0
  95. package/FlexiblePopupPanels/index.d.ts +145 -0
  96. package/FlexiblePopupPanels/index.js +68 -0
  97. package/FlexiblePopupPanels/package.json +3 -0
  98. package/FlexiblePopupPanels/tests/FlexiblePopupPanels-specs.js +305 -0
  99. package/FlexiblePopupPanels/useNavButtonFocus.js +65 -0
  100. package/FormCheckboxItem/FormCheckboxItem.d.ts +87 -0
  101. package/FormCheckboxItem/FormCheckboxItem.js +200 -0
  102. package/FormCheckboxItem/FormCheckboxItem.module.css +374 -0
  103. package/FormCheckboxItem/package.json +3 -0
  104. package/FormCheckboxItem/tests/FormCheckboxItem-specs.js +164 -0
  105. package/Heading/Heading.d.ts +104 -0
  106. package/Heading/Heading.js +203 -0
  107. package/Heading/Heading.module.css +217 -0
  108. package/Heading/package.json +3 -0
  109. package/Heading/tests/Heading-specs.js +57 -0
  110. package/Icon/Icon.d.ts +377 -0
  111. package/Icon/Icon.js +503 -0
  112. package/Icon/Icon.module.css +121 -0
  113. package/Icon/IconList.js +611 -0
  114. package/Icon/package.json +3 -0
  115. package/Icon/tests/Icon-specs.js +131 -0
  116. package/IconItem/IconItem.d.ts +137 -0
  117. package/IconItem/IconItem.js +360 -0
  118. package/IconItem/IconItem.module.css +414 -0
  119. package/IconItem/package.json +3 -0
  120. package/IconItem/tests/IconItem-specs.js +106 -0
  121. package/Image/Image.d.ts +60 -0
  122. package/Image/Image.js +165 -0
  123. package/Image/Image.module.css +5 -0
  124. package/Image/package.json +3 -0
  125. package/Image/tests/Image-specs.js +62 -0
  126. package/ImageItem/ImageItem.d.ts +134 -0
  127. package/ImageItem/ImageItem.js +377 -0
  128. package/ImageItem/ImageItem.module.css +1079 -0
  129. package/ImageItem/package.json +3 -0
  130. package/ImageItem/tests/ImageItem-specs.js +223 -0
  131. package/Input/Input.js +715 -0
  132. package/Input/Input.module.css +699 -0
  133. package/Input/InputField.js +487 -0
  134. package/Input/InputField.module.css +763 -0
  135. package/Input/InputFieldDecoratorIcon.js +66 -0
  136. package/Input/InputFieldSpotlightDecorator.js +380 -0
  137. package/Input/Keypad.js +111 -0
  138. package/Input/NumberField.js +311 -0
  139. package/Input/index.d.ts +423 -0
  140. package/Input/index.js +87 -0
  141. package/Input/package.json +3 -0
  142. package/Input/pointer.js +103 -0
  143. package/Input/tests/Input-specs.js +537 -0
  144. package/Input/tests/InputField-specs.js +292 -0
  145. package/Input/tests/InputPopup-specs.js +56 -0
  146. package/Input/util.js +130 -0
  147. package/Item/Item.d.ts +108 -0
  148. package/Item/Item.js +360 -0
  149. package/Item/Item.module.css +665 -0
  150. package/Item/package.json +3 -0
  151. package/Item/tests/Item-specs.js +108 -0
  152. package/KeyGuide/KeyGuide.d.ts +103 -0
  153. package/KeyGuide/KeyGuide.js +254 -0
  154. package/KeyGuide/KeyGuide.module.css +431 -0
  155. package/KeyGuide/package.json +3 -0
  156. package/KeyGuide/tests/KeyGuide-specs.js +168 -0
  157. package/LICENSE +201 -0
  158. package/Marquee/Marquee.d.ts +42 -0
  159. package/Marquee/Marquee.js +45 -0
  160. package/Marquee/package.json +3 -0
  161. package/MediaOverlay/MediaOverlay.d.ts +134 -0
  162. package/MediaOverlay/MediaOverlay.js +304 -0
  163. package/MediaOverlay/MediaOverlay.module.css +292 -0
  164. package/MediaOverlay/package.json +3 -0
  165. package/MediaOverlay/tests/MediaOverlay-specs.js +127 -0
  166. package/MediaPlayer/MediaControls.js +934 -0
  167. package/MediaPlayer/MediaControls.module.css +86 -0
  168. package/MediaPlayer/MediaKnob.js +61 -0
  169. package/MediaPlayer/MediaSlider.js +131 -0
  170. package/MediaPlayer/MediaSlider.module.css +319 -0
  171. package/MediaPlayer/MediaSliderDecorator.js +245 -0
  172. package/MediaPlayer/Times.js +152 -0
  173. package/MediaPlayer/Times.module.css +34 -0
  174. package/MediaPlayer/index.d.ts +223 -0
  175. package/MediaPlayer/index.js +34 -0
  176. package/MediaPlayer/package.json +3 -0
  177. package/MediaPlayer/tests/MediaSlider-specs.js +126 -0
  178. package/MediaPlayer/tests/util-specs.js +114 -0
  179. package/MediaPlayer/util.js +83 -0
  180. package/PageViews/Page.js +77 -0
  181. package/PageViews/Page.module.css +3 -0
  182. package/PageViews/PageViews.js +440 -0
  183. package/PageViews/PageViews.module.css +175 -0
  184. package/PageViews/PageViewsRouter.js +150 -0
  185. package/PageViews/index.js +45 -0
  186. package/PageViews/tests/PageViews-specs.js +192 -0
  187. package/Panels/Header.js +599 -0
  188. package/Panels/Header.module.css +243 -0
  189. package/Panels/Panel.js +347 -0
  190. package/Panels/Panel.module.css +33 -0
  191. package/Panels/Panels.js +258 -0
  192. package/Panels/Panels.module.css +12 -0
  193. package/Panels/index.d.ts +376 -0
  194. package/Panels/index.js +66 -0
  195. package/Panels/package.json +3 -0
  196. package/Panels/tests/Header-specs.js +146 -0
  197. package/Panels/tests/Panels-specs.js +257 -0
  198. package/Picker/Picker.d.ts +193 -0
  199. package/Picker/Picker.js +389 -0
  200. package/Picker/Picker.module.css +46 -0
  201. package/Picker/package.json +3 -0
  202. package/Picker/tests/Picker-specs.js +91 -0
  203. package/Popup/Popup.d.ts +169 -0
  204. package/Popup/Popup.js +690 -0
  205. package/Popup/Popup.module.css +180 -0
  206. package/Popup/package.json +3 -0
  207. package/Popup/tests/Popup-specs.js +475 -0
  208. package/PopupTabLayout/PopupTabLayout.d.ts +196 -0
  209. package/PopupTabLayout/PopupTabLayout.js +605 -0
  210. package/PopupTabLayout/PopupTabLayout.module.css +226 -0
  211. package/PopupTabLayout/package.json +3 -0
  212. package/PopupTabLayout/tests/PopupTabLayout-specs.js +285 -0
  213. package/ProgressBar/ProgressBar.d.ts +171 -0
  214. package/ProgressBar/ProgressBar.js +223 -0
  215. package/ProgressBar/ProgressBar.module.css +264 -0
  216. package/ProgressBar/ProgressBarTooltip.js +359 -0
  217. package/ProgressBar/ProgressBarTooltip.module.css +86 -0
  218. package/ProgressBar/package.json +3 -0
  219. package/ProgressBar/tests/ProgressBar-specs.js +400 -0
  220. package/ProgressButton/ProgressButton.d.ts +57 -0
  221. package/ProgressButton/ProgressButton.js +143 -0
  222. package/ProgressButton/ProgressButton.module.css +147 -0
  223. package/ProgressButton/package.json +3 -0
  224. package/ProgressButton/tests/ProgressButton-specs.js +71 -0
  225. package/QuickGuidePanels/Panel.js +90 -0
  226. package/QuickGuidePanels/QuickGuidePanels.js +463 -0
  227. package/QuickGuidePanels/QuickGuidePanels.module.css +26 -0
  228. package/QuickGuidePanels/index.js +52 -0
  229. package/QuickGuidePanels/tests/QuickGuidePanels-specs.js +250 -0
  230. package/README.md +59 -0
  231. package/RadioItem/RadioItem.d.ts +59 -0
  232. package/RadioItem/RadioItem.js +146 -0
  233. package/RadioItem/RadioItem.module.css +233 -0
  234. package/RadioItem/package.json +3 -0
  235. package/RadioItem/tests/RadioItem-specs.js +62 -0
  236. package/RangePicker/RangePicker.d.ts +174 -0
  237. package/RangePicker/RangePicker.js +372 -0
  238. package/RangePicker/RangePicker.module.css +55 -0
  239. package/RangePicker/package.json +3 -0
  240. package/RangePicker/tests/RangePicker-specs.js +122 -0
  241. package/Region/Region.d.ts +33 -0
  242. package/Region/Region.js +91 -0
  243. package/Region/package.json +3 -0
  244. package/Region/tests/Region-specs.js +28 -0
  245. package/Scroller/ContentContainerDecorator.js +24 -0
  246. package/Scroller/EditableWrapper.js +1036 -0
  247. package/Scroller/EditableWrapper.module.css +22 -0
  248. package/Scroller/Scroller.d.ts +270 -0
  249. package/Scroller/Scroller.js +470 -0
  250. package/Scroller/Scroller.module.css +41 -0
  251. package/Scroller/package.json +3 -0
  252. package/Scroller/tests/ContentContainerDecorator-specs.js +20 -0
  253. package/Scroller/tests/EditableWrapper-specs.js +133 -0
  254. package/Scroller/tests/Scroller-specs.js +159 -0
  255. package/Scroller/useEvent.js +39 -0
  256. package/Scroller/useThemeScroller.js +410 -0
  257. package/Skinnable/Skinnable.d.ts +27 -0
  258. package/Skinnable/Skinnable.js +65 -0
  259. package/Skinnable/package.json +3 -0
  260. package/Slider/Slider.d.ts +218 -0
  261. package/Slider/Slider.js +441 -0
  262. package/Slider/Slider.module.css +880 -0
  263. package/Slider/SliderBehaviorDecorator.js +184 -0
  264. package/Slider/package.json +3 -0
  265. package/Slider/tests/Slider-specs.js +573 -0
  266. package/Slider/utils.js +114 -0
  267. package/Spinner/Spinner.d.ts +64 -0
  268. package/Spinner/Spinner.js +254 -0
  269. package/Spinner/Spinner.module.css +368 -0
  270. package/Spinner/package.json +3 -0
  271. package/Spinner/tests/Spinner-specs.js +70 -0
  272. package/Sprite/Sprite.d.ts +100 -0
  273. package/Sprite/Sprite.js +345 -0
  274. package/Sprite/Sprite.module.css +32 -0
  275. package/Sprite/package.json +3 -0
  276. package/Sprite/tests/Sprite-specs.js +59 -0
  277. package/Steps/Steps.d.ts +119 -0
  278. package/Steps/Steps.js +303 -0
  279. package/Steps/Steps.module.css +130 -0
  280. package/Steps/package.json +3 -0
  281. package/Steps/tests/Steps-specs.js +175 -0
  282. package/Switch/Switch.d.ts +54 -0
  283. package/Switch/Switch.js +143 -0
  284. package/Switch/Switch.module.css +714 -0
  285. package/Switch/package.json +3 -0
  286. package/Switch/tests/Switch-specs.js +54 -0
  287. package/SwitchItem/SwitchItem.d.ts +56 -0
  288. package/SwitchItem/SwitchItem.js +144 -0
  289. package/SwitchItem/SwitchItem.module.css +31 -0
  290. package/SwitchItem/package.json +3 -0
  291. package/SwitchItem/tests/SwitchItem-specs.js +49 -0
  292. package/TabLayout/RefocusDecorator.js +142 -0
  293. package/TabLayout/Tab.js +84 -0
  294. package/TabLayout/TabGroup.js +377 -0
  295. package/TabLayout/TabGroup.module.css +280 -0
  296. package/TabLayout/TabLayout.d.ts +161 -0
  297. package/TabLayout/TabLayout.js +661 -0
  298. package/TabLayout/TabLayout.module.css +101 -0
  299. package/TabLayout/package.json +3 -0
  300. package/TabLayout/tests/TabGroup-specs.js +214 -0
  301. package/TabLayout/tests/TabLayout-specs.js +740 -0
  302. package/ThemeDecorator/AccessibilityDecorator.js +151 -0
  303. package/ThemeDecorator/I18nFontDecorator.js +33 -0
  304. package/ThemeDecorator/ThemeDecorator.d.ts +143 -0
  305. package/ThemeDecorator/ThemeDecorator.js +307 -0
  306. package/ThemeDecorator/ThemeDecorator.module.css +1250 -0
  307. package/ThemeDecorator/fontGenerator.js +76 -0
  308. package/ThemeDecorator/package.json +3 -0
  309. package/ThemeDecorator/screenTypes.json +10 -0
  310. package/ThemeDecorator/tests/ThemeDecorator-specs.js +151 -0
  311. package/TimePicker/TimePicker.d.ts +147 -0
  312. package/TimePicker/TimePicker.js +255 -0
  313. package/TimePicker/TimePicker.module.css +61 -0
  314. package/TimePicker/TimePickerBase.js +396 -0
  315. package/TimePicker/package.json +3 -0
  316. package/TimePicker/tests/TimePicker-specs.js +248 -0
  317. package/TooltipDecorator/Tooltip.js +252 -0
  318. package/TooltipDecorator/Tooltip.module.css +496 -0
  319. package/TooltipDecorator/TooltipDecorator.d.ts +229 -0
  320. package/TooltipDecorator/TooltipDecorator.js +260 -0
  321. package/TooltipDecorator/TooltipLabel.js +117 -0
  322. package/TooltipDecorator/package.json +3 -0
  323. package/TooltipDecorator/tests/TooltipDecorator-specs.js +224 -0
  324. package/TooltipDecorator/tests/useTooltip-specs.js +266 -0
  325. package/TooltipDecorator/useTooltip.js +278 -0
  326. package/TooltipDecorator/util.js +273 -0
  327. package/VideoPlayer/Feedback.js +110 -0
  328. package/VideoPlayer/Feedback.module.css +55 -0
  329. package/VideoPlayer/FeedbackContent.js +99 -0
  330. package/VideoPlayer/FeedbackIcon.js +67 -0
  331. package/VideoPlayer/FeedbackIcons.js +76 -0
  332. package/VideoPlayer/FeedbackTooltip.js +242 -0
  333. package/VideoPlayer/FeedbackTooltip.module.css +160 -0
  334. package/VideoPlayer/MediaTitle.js +143 -0
  335. package/VideoPlayer/MediaTitle.module.css +95 -0
  336. package/VideoPlayer/Overlay.js +51 -0
  337. package/VideoPlayer/Video.js +345 -0
  338. package/VideoPlayer/VideoPlayer.d.ts +582 -0
  339. package/VideoPlayer/VideoPlayer.js +2116 -0
  340. package/VideoPlayer/VideoPlayer.module.css +164 -0
  341. package/VideoPlayer/package.json +3 -0
  342. package/VideoPlayer/tests/Video-specs.js +235 -0
  343. package/VideoPlayer/tests/VideoPlayer-specs.js +180 -0
  344. package/VirtualList/VirtualList.d.ts +411 -0
  345. package/VirtualList/VirtualList.js +931 -0
  346. package/VirtualList/VirtualList.module.css +52 -0
  347. package/VirtualList/package.json +3 -0
  348. package/VirtualList/tests/VirtualGridList-specs.js +289 -0
  349. package/VirtualList/tests/VirtualGridList-translate-specs.js +711 -0
  350. package/VirtualList/tests/VirtualList-specs.js +288 -0
  351. package/VirtualList/tests/VirtualList-translate-specs.js +704 -0
  352. package/VirtualList/tests/useEvent-specs.js +172 -0
  353. package/VirtualList/tests/useEvent-translate-specs.js +309 -0
  354. package/VirtualList/useEvent.js +324 -0
  355. package/VirtualList/usePreventScroll.js +31 -0
  356. package/VirtualList/useSpotlight.js +157 -0
  357. package/VirtualList/useThemeVirtualList.js +471 -0
  358. package/VirtualList/useThemeVirtualList.module.css +34 -0
  359. package/WizardPanels/Panel.js +99 -0
  360. package/WizardPanels/WizardPanels.js +501 -0
  361. package/WizardPanels/WizardPanels.module.css +15 -0
  362. package/WizardPanels/index.d.ts +182 -0
  363. package/WizardPanels/index.js +50 -0
  364. package/WizardPanels/package.json +3 -0
  365. package/WizardPanels/tests/WizardPanels-specs.js +713 -0
  366. package/codecov.yml +13 -0
  367. package/fonts/Limestone_Icons.ttf +0 -0
  368. package/fonts/Miso/LICENSE.txt +75 -0
  369. package/fonts/Miso/Miso-Bold.ttf +0 -0
  370. package/fonts/Miso/Miso-Light.ttf +0 -0
  371. package/fonts/Miso/Miso-Regular.ttf +0 -0
  372. package/fonts/MuseoSans/LICENSE.txt +75 -0
  373. package/fonts/MuseoSans/MuseoSans-Black.ttf +0 -0
  374. package/fonts/MuseoSans/MuseoSans-BlackItalic.ttf +0 -0
  375. package/fonts/MuseoSans/MuseoSans-Bold.ttf +0 -0
  376. package/fonts/MuseoSans/MuseoSans-BoldItalic.ttf +0 -0
  377. package/fonts/MuseoSans/MuseoSans-Light.ttf +0 -0
  378. package/fonts/MuseoSans/MuseoSans-Medium.ttf +0 -0
  379. package/fonts/MuseoSans/MuseoSans-MediumItalic.ttf +0 -0
  380. package/fonts/MuseoSans/MuseoSans-Thin.ttf +0 -0
  381. package/index.js +2 -0
  382. package/internal/$L/$L.d.ts +21 -0
  383. package/internal/$L/$L.js +97 -0
  384. package/internal/$L/package.json +3 -0
  385. package/internal/AsyncRenderChildren/AsyncRenderChildren.js +74 -0
  386. package/internal/AsyncRenderChildren/package.json +3 -0
  387. package/internal/AsyncRenderChildren/tests/AsyncRenderChildren-specs.js +49 -0
  388. package/internal/DateComponentPicker/DateComponentPicker.js +165 -0
  389. package/internal/DateComponentPicker/DateComponentPicker.module.css +53 -0
  390. package/internal/DateComponentPicker/DateComponentRangePicker.js +132 -0
  391. package/internal/DateComponentPicker/index.js +31 -0
  392. package/internal/DateComponentPicker/package.json +3 -0
  393. package/internal/DateTime/DateTime.js +83 -0
  394. package/internal/DateTime/DateTime.module.css +51 -0
  395. package/internal/DateTime/DateTimeDecorator.js +268 -0
  396. package/internal/DateTime/index.js +37 -0
  397. package/internal/DateTime/package.json +3 -0
  398. package/internal/DateTime/tests/DateTimeDecorator-specs.js +33 -0
  399. package/internal/DebounceDecorator/DebounceDecorator.js +125 -0
  400. package/internal/DebounceDecorator/package.json +3 -0
  401. package/internal/DebounceDecorator/tests/DebounceDecorator-specs.js +151 -0
  402. package/internal/Panels/Arrangers.js +248 -0
  403. package/internal/Panels/CancelDecorator.js +43 -0
  404. package/internal/Panels/FloatingLayerIdProvider.js +27 -0
  405. package/internal/Panels/NavigationButton.js +64 -0
  406. package/internal/Panels/NavigationButton.module.css +69 -0
  407. package/internal/Panels/PanelsRouter.js +223 -0
  408. package/internal/Panels/PopupDecorator.js +287 -0
  409. package/internal/Panels/TransitionDecorator.js +99 -0
  410. package/internal/Panels/Viewport.js +313 -0
  411. package/internal/Panels/Viewport.module.css +25 -0
  412. package/internal/Panels/captureKeys.js +48 -0
  413. package/internal/Panels/index.js +101 -0
  414. package/internal/Panels/package.json +3 -0
  415. package/internal/Panels/useAutoFocus.js +95 -0
  416. package/internal/Panels/useFocusOnTransition.js +45 -0
  417. package/internal/Panels/useToggleRole.js +30 -0
  418. package/internal/Panels/util.js +64 -0
  419. package/internal/Picker/Picker.js +942 -0
  420. package/internal/Picker/Picker.module.css +1145 -0
  421. package/internal/Picker/PickerButton.js +97 -0
  422. package/internal/Picker/PickerItem.js +38 -0
  423. package/internal/Picker/SpottablePicker.js +63 -0
  424. package/internal/Picker/package.json +3 -0
  425. package/internal/Picker/tests/Picker-specs.js +968 -0
  426. package/internal/SharedStateDecorator/SharedStateDecorator.js +167 -0
  427. package/internal/SharedStateDecorator/package.json +3 -0
  428. package/internal/SharedStateDecorator/tests/SharedStateDecorator-specs.js +277 -0
  429. package/internal/WindowEventable/WindowEventable.js +114 -0
  430. package/internal/WindowEventable/package.json +3 -0
  431. package/internal/util/package.json +3 -0
  432. package/internal/util/util.js +79 -0
  433. package/internal/validators/package.json +4 -0
  434. package/internal/validators/tests/validators-specs.js +80 -0
  435. package/internal/validators/validators.js +136 -0
  436. package/package.json +69 -0
  437. package/resources/ilibmanifest.json +3 -0
  438. package/styles/color-mixins.less +230 -0
  439. package/styles/colors-game-green.less +25 -0
  440. package/styles/colors-game-orange.less +25 -0
  441. package/styles/colors-game.less +56 -0
  442. package/styles/colors-highcontrast.less +21 -0
  443. package/styles/colors.less +435 -0
  444. package/styles/mixins.less +337 -0
  445. package/styles/skin.less +54 -0
  446. package/styles/variables-base.less +32 -0
  447. package/styles/variables-game.less +25 -0
  448. package/styles/variables.less +1182 -0
  449. package/useScroll/HoverToScroll.js +265 -0
  450. package/useScroll/HoverToScroll.module.css +38 -0
  451. package/useScroll/OverscrollEffect.module.css +14 -0
  452. package/useScroll/Scrollbar.js +171 -0
  453. package/useScroll/Scrollbar.module.css +19 -0
  454. package/useScroll/ScrollbarPlaceholder.js +64 -0
  455. package/useScroll/ScrollbarTrack.js +209 -0
  456. package/useScroll/ScrollbarTrack.module.css +136 -0
  457. package/useScroll/package.json +3 -0
  458. package/useScroll/useEvent.js +693 -0
  459. package/useScroll/useOverscrollEffect.js +105 -0
  460. package/useScroll/useScroll.js +523 -0
  461. package/useScroll/useScroll.module.css +49 -0
  462. package/useScroll/useSpotlight.js +32 -0
  463. 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;