@shortfuse/materialdesignweb 0.0.9 → 0.4.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 (392) hide show
  1. package/.browserslistrc +3 -0
  2. package/.eslintrc.json +146 -27
  3. package/.stylelintrc.json +598 -2
  4. package/.vscode/launch.json +20 -5
  5. package/.vscode/settings.json +3 -0
  6. package/.vscode/tasks.json +19 -10
  7. package/CHANGELOG.md +24 -0
  8. package/README.md +84 -2
  9. package/adapters/datatable/column.js +203 -0
  10. package/adapters/datatable/index.js +972 -0
  11. package/adapters/dom/index.js +601 -0
  12. package/adapters/list/index.js +69 -0
  13. package/adapters/search/index.js +521 -0
  14. package/components/appbar/_spec.scss +225 -0
  15. package/components/appbar/_theme.scss +0 -0
  16. package/components/appbar/index.scss +2 -0
  17. package/components/banner/_spec.scss +118 -0
  18. package/components/banner/_theme.scss +0 -0
  19. package/components/banner/index.scss +2 -0
  20. package/components/bottomnav/README.md +85 -0
  21. package/components/bottomnav/_spec.scss +157 -0
  22. package/components/bottomnav/_theme.scss +0 -0
  23. package/components/bottomnav/index.js +122 -0
  24. package/components/bottomnav/index.scss +2 -0
  25. package/components/bottomnav/item.js +89 -0
  26. package/components/{core/button → button}/README.md +16 -22
  27. package/components/button/_spec.scss +161 -0
  28. package/components/button/_theme.scss +65 -0
  29. package/components/button/index.eta +32 -0
  30. package/components/button/index.js +43 -0
  31. package/components/button/index.pug +18 -0
  32. package/components/button/index.scss +2 -0
  33. package/components/card/_spec.scss +249 -0
  34. package/components/card/_theme.scss +0 -0
  35. package/components/card/index.scss +2 -0
  36. package/components/chip/_spec.scss +134 -0
  37. package/components/chip/_theme.scss +177 -0
  38. package/components/chip/index.js +21 -0
  39. package/components/chip/index.scss +2 -0
  40. package/components/chip/item.js +20 -0
  41. package/components/datatable/_spec.scss +288 -0
  42. package/components/datatable/_theme.scss +154 -0
  43. package/components/datatable/cell.js +45 -0
  44. package/components/datatable/columnheader.js +47 -0
  45. package/components/datatable/index.js +388 -0
  46. package/components/datatable/index.scss +2 -0
  47. package/components/datatable/row.js +49 -0
  48. package/components/datatable/rowheader.js +18 -0
  49. package/components/dialog/_spec.scss +213 -0
  50. package/components/dialog/_theme.scss +0 -0
  51. package/components/dialog/index.js +627 -0
  52. package/components/dialog/index.scss +2 -0
  53. package/components/divider/_spec.scss +13 -0
  54. package/components/divider/_theme.scss +0 -0
  55. package/components/divider/index.scss +2 -0
  56. package/components/elevation/_spec.scss +9 -0
  57. package/components/elevation/_theme.scss +0 -0
  58. package/components/elevation/index.scss +2 -0
  59. package/components/fab/_spec.scss +222 -0
  60. package/components/fab/_theme.scss +0 -0
  61. package/components/fab/index.js +103 -0
  62. package/components/fab/index.scss +2 -0
  63. package/components/grid/_spec.scss +312 -0
  64. package/components/grid/_theme.scss +0 -0
  65. package/components/grid/index.scss +2 -0
  66. package/components/layout/_mixins.scss +33 -0
  67. package/components/layout/_spec.scss +1012 -0
  68. package/components/layout/_theme.scss +44 -0
  69. package/components/layout/index.js +464 -0
  70. package/components/layout/index.scss +2 -0
  71. package/components/list/_spec.scss +397 -0
  72. package/components/list/_theme.scss +111 -0
  73. package/components/list/content.js +110 -0
  74. package/components/list/index.js +260 -0
  75. package/components/list/index.scss +2 -0
  76. package/components/list/item.js +170 -0
  77. package/components/list/secondary.js +46 -0
  78. package/components/menu/_spec.scss +362 -0
  79. package/components/menu/_theme.scss +0 -0
  80. package/components/menu/index.js +721 -0
  81. package/components/menu/index.scss +2 -0
  82. package/components/menu/item.js +239 -0
  83. package/components/{core/progress/style.scss → progress/_spec.scss} +36 -25
  84. package/components/progress/_theme.scss +0 -0
  85. package/components/progress/index.js +36 -0
  86. package/components/progress/index.scss +2 -0
  87. package/components/selection/_spec.scss +386 -0
  88. package/components/selection/_theme.scss +166 -0
  89. package/components/selection/index.eta +60 -0
  90. package/components/selection/index.js +76 -0
  91. package/components/selection/index.pug +30 -0
  92. package/components/selection/index.scss +2 -0
  93. package/components/selection/input.js +56 -0
  94. package/components/selection/radiogroup.js +47 -0
  95. package/components/slider/_spec.scss +64 -0
  96. package/components/slider/_theme.scss +0 -0
  97. package/components/slider/index.scss +2 -0
  98. package/components/snackbar/_spec.scss +195 -0
  99. package/components/snackbar/_theme.scss +0 -0
  100. package/components/snackbar/index.js +344 -0
  101. package/components/snackbar/index.scss +2 -0
  102. package/components/tab/_spec.scss +235 -0
  103. package/components/tab/_theme.scss +0 -0
  104. package/components/tab/content.js +205 -0
  105. package/components/tab/index.js +260 -0
  106. package/components/tab/index.scss +2 -0
  107. package/components/tab/item.js +89 -0
  108. package/components/tab/list.js +210 -0
  109. package/components/tab/panel.js +54 -0
  110. package/components/template/_theme.scss +27 -0
  111. package/components/{core/textfield → textfield}/README.md +70 -50
  112. package/components/textfield/_mixins.scss +52 -0
  113. package/components/textfield/_spec.scss +809 -0
  114. package/components/textfield/_theme.scss +299 -0
  115. package/components/textfield/index.eta +74 -0
  116. package/components/textfield/index.js +168 -0
  117. package/components/textfield/index.pug +30 -0
  118. package/components/textfield/index.scss +2 -0
  119. package/components/tooltip/_spec.scss +188 -0
  120. package/components/tooltip/_theme.scss +0 -0
  121. package/components/tooltip/index.scss +2 -0
  122. package/components/type/_spec.scss +224 -0
  123. package/components/type/_theme.scss +0 -0
  124. package/components/type/index.scss +2 -0
  125. package/core/_breakpoint.scss +189 -0
  126. package/core/_elevation.scss +38 -0
  127. package/core/_length.scss +9 -0
  128. package/core/_motion.scss +31 -0
  129. package/core/_platform.scss +34 -0
  130. package/core/_type.scss +127 -0
  131. package/core/aria/attributes.js +141 -0
  132. package/core/aria/button.js +50 -0
  133. package/core/aria/keyboard.js +93 -0
  134. package/core/aria/rovingtabindex.js +178 -0
  135. package/core/aria/tab.js +60 -0
  136. package/core/color/_spec.scss +0 -0
  137. package/core/color/_theme.scss +390 -0
  138. package/core/color/index.scss +2 -0
  139. package/core/document/index.js +39 -0
  140. package/core/dom.js +271 -0
  141. package/core/overlay/_spec.scss +31 -0
  142. package/core/overlay/_theme.scss +171 -0
  143. package/core/overlay/index.js +108 -0
  144. package/core/overlay/index.scss +2 -0
  145. package/core/ripple/_spec.scss +197 -0
  146. package/core/ripple/_theme.scss +40 -0
  147. package/core/ripple/index.js +294 -0
  148. package/core/ripple/index.scss +2 -0
  149. package/core/theme/_config.scss +2 -0
  150. package/core/theme/_mixins.scss +172 -0
  151. package/{components/theming/palettes.scss → core/theme/_palettes.scss} +173 -150
  152. package/core/theme/_variables.scss +24 -0
  153. package/core/theme/index.js +50 -0
  154. package/core/throttler.js +42 -0
  155. package/core/transition/index.js +468 -0
  156. package/docs/_flex.scss +22 -0
  157. package/docs/_menuoptions.js +183 -0
  158. package/docs/_mixins.pug +155 -0
  159. package/docs/_partials/_androidnavbar.eta +5 -0
  160. package/docs/_partials/_androidstatusbar.eta +13 -0
  161. package/docs/_partials/_appbar.eta +29 -0
  162. package/docs/_partials/_buttontest.eta +31 -0
  163. package/docs/_partials/_header.eta +149 -0
  164. package/docs/_partials/_navlistitem.eta +16 -0
  165. package/docs/_partials/_target.eta +1 -0
  166. package/docs/_sample-utils.js +93 -0
  167. package/docs/_storage.js +33 -0
  168. package/docs/docs.scss +295 -0
  169. package/docs/index.eta +16 -0
  170. package/docs/index.js +0 -0
  171. package/docs/pages/appbar.eta +114 -0
  172. package/docs/pages/appbar.js +0 -0
  173. package/docs/pages/appbar.pug +78 -0
  174. package/docs/pages/bottomnav.eta +188 -0
  175. package/docs/pages/bottomnav.js +115 -0
  176. package/docs/pages/bottomnav.pug +137 -0
  177. package/docs/pages/button.eta +124 -0
  178. package/docs/pages/button.js +224 -0
  179. package/docs/pages/button.pug +121 -0
  180. package/docs/pages/card.eta +90 -0
  181. package/docs/pages/card.js +177 -0
  182. package/docs/pages/card.pug +74 -0
  183. package/docs/pages/chip.eta +122 -0
  184. package/docs/pages/chip.js +82 -0
  185. package/docs/pages/chip.pug +91 -0
  186. package/docs/pages/color.eta +143 -0
  187. package/docs/pages/color.js +262 -0
  188. package/docs/pages/color.pug +121 -0
  189. package/docs/pages/datatable.eta +323 -0
  190. package/docs/pages/datatable.js +164 -0
  191. package/docs/pages/datatable.pug +283 -0
  192. package/docs/pages/dialog.eta +186 -0
  193. package/docs/pages/dialog.js +177 -0
  194. package/docs/pages/dialog.pug +132 -0
  195. package/docs/pages/dom.eta +26 -0
  196. package/docs/pages/dom.js +143 -0
  197. package/docs/pages/dom.pug +22 -0
  198. package/docs/pages/elevation.eta +35 -0
  199. package/docs/pages/elevation.js +0 -0
  200. package/docs/pages/elevation.pug +25 -0
  201. package/docs/pages/fab.eta +99 -0
  202. package/docs/pages/fab.js +44 -0
  203. package/docs/pages/fab.pug +66 -0
  204. package/docs/pages/grid.eta +135 -0
  205. package/docs/pages/grid.js +128 -0
  206. package/docs/pages/grid.pug +95 -0
  207. package/docs/pages/layout.eta +8 -0
  208. package/docs/pages/layout.js +0 -0
  209. package/docs/pages/layout.pug +7 -0
  210. package/docs/pages/list.eta +465 -0
  211. package/docs/pages/list.js +9 -0
  212. package/docs/pages/list.pug +326 -0
  213. package/docs/pages/menu.eta +276 -0
  214. package/docs/pages/menu.js +217 -0
  215. package/docs/pages/menu.pug +205 -0
  216. package/docs/pages/overlay.eta +69 -0
  217. package/docs/pages/overlay.js +4 -0
  218. package/docs/pages/overlay.pug +55 -0
  219. package/docs/pages/progress.eta +23 -0
  220. package/docs/pages/progress.js +12 -0
  221. package/docs/pages/progress.pug +16 -0
  222. package/docs/pages/ripple.eta +27 -0
  223. package/docs/pages/ripple.js +4 -0
  224. package/docs/pages/ripple.pug +21 -0
  225. package/docs/pages/search.eta +246 -0
  226. package/docs/pages/search.js +243 -0
  227. package/docs/pages/search.pug +165 -0
  228. package/docs/pages/selection.eta +111 -0
  229. package/docs/pages/selection.js +13 -0
  230. package/docs/pages/selection.pug +74 -0
  231. package/docs/pages/slider.eta +23 -0
  232. package/docs/pages/slider.js +0 -0
  233. package/docs/pages/slider.pug +17 -0
  234. package/docs/pages/snackbar.eta +83 -0
  235. package/docs/pages/snackbar.js +158 -0
  236. package/docs/pages/snackbar.pug +60 -0
  237. package/docs/pages/tab.eta +421 -0
  238. package/docs/pages/tab.js +151 -0
  239. package/docs/pages/tab.pug +304 -0
  240. package/docs/pages/textfield.eta +486 -0
  241. package/docs/pages/textfield.js +254 -0
  242. package/docs/pages/textfield.pug +360 -0
  243. package/docs/pages/tooltip.eta +94 -0
  244. package/docs/pages/tooltip.js +0 -0
  245. package/docs/pages/tooltip.pug +78 -0
  246. package/docs/pages/transition.eta +117 -0
  247. package/docs/pages/transition.js +54 -0
  248. package/docs/pages/transition.pug +76 -0
  249. package/docs/pages/type.eta +31 -0
  250. package/docs/pages/type.js +0 -0
  251. package/docs/pages/type.pug +29 -0
  252. package/docs/postrender.js +39 -0
  253. package/docs/prerender.js +16 -0
  254. package/docs/pwa/_dialogs.eta +143 -0
  255. package/docs/pwa/_dialogs.pug +96 -0
  256. package/docs/pwa/_menus.eta +16 -0
  257. package/docs/pwa/_menus.pug +11 -0
  258. package/docs/pwa/pwa-prerender.js +3 -0
  259. package/docs/pwa/pwa.eta +480 -0
  260. package/docs/pwa/pwa.js +306 -0
  261. package/docs/pwa/pwa.pug +325 -0
  262. package/docs/pwa/pwa.scss +26 -0
  263. package/docs/spec.scss +26 -0
  264. package/docs/themes/_component-themes.scss +26 -0
  265. package/docs/themes/theme-colored-fallbacks.scss +17 -0
  266. package/docs/themes/theme-colored.scss +17 -0
  267. package/docs/themes/theme-default-fallbacks.scss +17 -0
  268. package/docs/themes/theme-default.scss +17 -0
  269. package/jsconfig.json +4 -2
  270. package/package.json +43 -28
  271. package/scripts/deploy-docs.sh +9 -0
  272. package/templates/index.eta +2 -0
  273. package/templates/index.pug +3 -0
  274. package/utils/function.js +3 -0
  275. package/webpack.config.cjs +257 -0
  276. package/components/_index.scss +0 -4
  277. package/components/all-components.scss +0 -14
  278. package/components/common/functions.scss +0 -173
  279. package/components/common/mixins.scss +0 -107
  280. package/components/common/motion.scss +0 -36
  281. package/components/common/ripple.scss +0 -92
  282. package/components/common/variables.scss +0 -48
  283. package/components/complex/dialog/style.scss +0 -159
  284. package/components/complex/dialog/theming.scss +0 -29
  285. package/components/complex/navdrawer/style.scss +0 -477
  286. package/components/complex/navdrawer/theming.scss +0 -58
  287. package/components/complex/search/index.js +0 -492
  288. package/components/core/bottomnav/README.md +0 -85
  289. package/components/core/bottomnav/index.js +0 -140
  290. package/components/core/bottomnav/style.scss +0 -173
  291. package/components/core/bottomnav/theming.scss +0 -42
  292. package/components/core/button/index.js +0 -52
  293. package/components/core/button/style.scss +0 -283
  294. package/components/core/button/theming.scss +0 -131
  295. package/components/core/list/index.js +0 -94
  296. package/components/core/list/style.scss +0 -269
  297. package/components/core/list/theming.scss +0 -74
  298. package/components/core/menu/index.js +0 -127
  299. package/components/core/menu/style.scss +0 -239
  300. package/components/core/menu/theming.scss +0 -55
  301. package/components/core/progress/index.js +0 -33
  302. package/components/core/selection/style.scss +0 -249
  303. package/components/core/selection/theming.scss +0 -49
  304. package/components/core/switch/style.scss +0 -3
  305. package/components/core/tab/index.js +0 -174
  306. package/components/core/tab/style.scss +0 -202
  307. package/components/core/tab/theming.scss +0 -43
  308. package/components/core/textfield/index.js +0 -169
  309. package/components/core/textfield/style.scss +0 -672
  310. package/components/core/textfield/theming.scss +0 -262
  311. package/components/core/toolbar/style.scss +0 -109
  312. package/components/core/toolbar/theming.scss +0 -28
  313. package/components/core/tooltip/style.scss +0 -127
  314. package/components/core/type/style.scss +0 -133
  315. package/components/core/type/theming.scss +0 -25
  316. package/components/index.js +0 -24
  317. package/components/template/theming.scss +0 -31
  318. package/components/theming/theming.scss +0 -504
  319. package/docs/bottomnav.html +0 -171
  320. package/docs/bottomnav.min.js +0 -383
  321. package/docs/button.html +0 -322
  322. package/docs/button.min.js +0 -251
  323. package/docs/components.min.css +0 -1
  324. package/docs/components.min.js +0 -83
  325. package/docs/dialog.html +0 -103
  326. package/docs/dialog.min.js +0 -160
  327. package/docs/docs.min.css +0 -1
  328. package/docs/docs.min.js +0 -83
  329. package/docs/index.html +0 -55
  330. package/docs/index.min.js +0 -83
  331. package/docs/list.html +0 -442
  332. package/docs/list.min.js +0 -312
  333. package/docs/menu.html +0 -185
  334. package/docs/menu.min.js +0 -370
  335. package/docs/navdrawer.html +0 -199
  336. package/docs/navdrawer.min.js +0 -244
  337. package/docs/progress.html +0 -75
  338. package/docs/progress.min.js +0 -162
  339. package/docs/search.html +0 -230
  340. package/docs/search.min.js +0 -1202
  341. package/docs/selection.html +0 -188
  342. package/docs/selection.min.js +0 -160
  343. package/docs/src/complex/dialog.js +0 -3
  344. package/docs/src/complex/dialog.pug +0 -44
  345. package/docs/src/complex/navdrawer.js +0 -82
  346. package/docs/src/complex/navdrawer.pug +0 -109
  347. package/docs/src/complex/search.js +0 -207
  348. package/docs/src/complex/search.pug +0 -143
  349. package/docs/src/components.scss +0 -1
  350. package/docs/src/core/bottomnav.js +0 -22
  351. package/docs/src/core/bottomnav.pug +0 -93
  352. package/docs/src/core/button.js +0 -16
  353. package/docs/src/core/button.pug +0 -73
  354. package/docs/src/core/list.js +0 -21
  355. package/docs/src/core/list.pug +0 -246
  356. package/docs/src/core/menu.js +0 -33
  357. package/docs/src/core/menu.pug +0 -108
  358. package/docs/src/core/progress.js +0 -11
  359. package/docs/src/core/progress.pug +0 -17
  360. package/docs/src/core/selection.js +0 -4
  361. package/docs/src/core/selection.pug +0 -92
  362. package/docs/src/core/tab.js +0 -21
  363. package/docs/src/core/tab.pug +0 -180
  364. package/docs/src/core/textfield.js +0 -15
  365. package/docs/src/core/textfield.pug +0 -274
  366. package/docs/src/core/toolbar.js +0 -4
  367. package/docs/src/core/toolbar.pug +0 -79
  368. package/docs/src/core/tooltip.js +0 -4
  369. package/docs/src/core/tooltip.pug +0 -76
  370. package/docs/src/core/type.js +0 -4
  371. package/docs/src/core/type.pug +0 -36
  372. package/docs/src/docs.scss +0 -200
  373. package/docs/src/index.pug +0 -5
  374. package/docs/src/mixins.pug +0 -72
  375. package/docs/src/targetHandler.js +0 -50
  376. package/docs/src/theming.ie11.scss +0 -35
  377. package/docs/src/theming.scss +0 -36
  378. package/docs/tab.html +0 -301
  379. package/docs/tab.min.js +0 -397
  380. package/docs/textfield.html +0 -476
  381. package/docs/textfield.min.js +0 -381
  382. package/docs/theming.ie11.min.css +0 -1
  383. package/docs/theming.ie11.min.js +0 -83
  384. package/docs/theming.min.css +0 -1
  385. package/docs/theming.min.js +0 -83
  386. package/docs/toolbar.html +0 -213
  387. package/docs/toolbar.min.js +0 -160
  388. package/docs/tooltip.html +0 -138
  389. package/docs/tooltip.min.js +0 -160
  390. package/docs/type.html +0 -94
  391. package/docs/type.min.js +0 -160
  392. package/webpack.config.js +0 -176
@@ -0,0 +1,44 @@
1
+ @use '../../core/_breakpoint.scss' as breakpoint;
2
+ @use '../../core/theme/_mixins.scss' as theme;
3
+
4
+ $themeValues: () !default;
5
+
6
+ @function getThemeValue($key, $type) {
7
+ @return theme.getThemeValue('layout', $themeValues, $key, $type);
8
+ }
9
+
10
+ @mixin addThemeRules($type: 'var') {
11
+ @if ($type == 'var') {
12
+ .mdw-layout__appbar[mdw-fab-cut],
13
+ .mdw-layout__appbar.mdw-theme[mdw-fab-cut] {
14
+ background-color: transparent;
15
+ }
16
+
17
+ .mdw-layout__appbar-shape {
18
+ color: RGB(var(--mdw-surface));
19
+ }
20
+ }
21
+
22
+ @include breakpoint.minMediumWindow {
23
+ .mdw-layout__body[mdw-navdrawer-style~="floating"]:not([mdw-navdrawer-style~="card"]) > .mdw-layout__navdrawer,
24
+ .mdw-layout__body[mdw-sidesheet-style~="floating"]:not([mdw-sidesheet-style~="card"]) > .mdw-layout__sidesheet {
25
+ & > .mdw-layout__sheet-content {
26
+ background-color: transparent;
27
+ }
28
+ }
29
+ }
30
+ }
31
+
32
+
33
+ @include theme.addComponentFallbackRules('light') {
34
+ @include addThemeRules('light');
35
+ }
36
+ @include theme.addComponentFallbackRules('dark') {
37
+ @include addThemeRules('dark');
38
+ }
39
+
40
+
41
+ @include theme.addComponentCSSVariableRules('layout', $themeValues) {
42
+ @include addThemeRules();
43
+ }
44
+
@@ -0,0 +1,464 @@
1
+ import { getPassiveEventListenerOption, iterateArrayLike } from '../../core/dom.js';
2
+ import Throttler from '../../core/throttler.js';
3
+
4
+ const MIN_SCROLL_DELTA = 24; // Avoid finger bounce
5
+
6
+ const MOBILE_BREAKPOINT = 600;
7
+ const TABLET_BREAKPOINT = 1024;
8
+
9
+ // Throttler will execute at earliest convenience
10
+ // Smoother than using requestAnimationFrame
11
+ const SCROLL_THROTTLE_TIME_MS = 20;
12
+
13
+ /** @type {number} */
14
+ let lastScrollY = null;
15
+ /** @type {number} */
16
+ let penultimateScrollY = null;
17
+ let scrolledPastAppBar = false;
18
+ /** @type {HTMLElement} */
19
+ let appBarElement = null;
20
+ /** @type {HTMLElement} */
21
+ let layoutContentElement = null;
22
+ /** @type {number} */
23
+ let lastScrollBottomDistance = null;
24
+ /** @type {Throttler} */
25
+ let scrollThrottler = null;
26
+
27
+ /** @return {Throttler} */
28
+ export function getScrollThrottler() {
29
+ if (!scrollThrottler) {
30
+ scrollThrottler = new Throttler(SCROLL_THROTTLE_TIME_MS);
31
+ }
32
+ return scrollThrottler;
33
+ }
34
+
35
+ /**
36
+ * @param {Event} event
37
+ * @return {void}
38
+ */
39
+ export function onScrimScroll(event) {
40
+ // JS needed for Safari
41
+ event.stopPropagation();
42
+ if (event.type !== 'scroll') {
43
+ event.preventDefault();
44
+ return;
45
+ }
46
+ /** @type {HTMLElement} */
47
+ const element = (event.currentTarget);
48
+ if (element.scrollTop !== element.scrollHeight / 4) {
49
+ element.scrollTop = element.scrollHeight / 4;
50
+ }
51
+ if (element.scrollLeft !== element.scrollWidth / 4) {
52
+ element.scrollLeft = element.scrollWidth / 4;
53
+ }
54
+ }
55
+
56
+ /** @return {boolean} */
57
+ export function isNavDrawerModalShowing() {
58
+ const navDrawer = document.getElementsByClassName('mdw-layout__navdrawer')[0];
59
+ if (!navDrawer) {
60
+ return false;
61
+ }
62
+ if (window.location.hash !== `#${navDrawer.id}` && navDrawer.getAttribute('aria-hidden') !== 'false') {
63
+ return false;
64
+ }
65
+ return (window.innerWidth < TABLET_BREAKPOINT || document.body.getAttribute('mdw-navdrawer-style') === 'modal');
66
+ }
67
+
68
+ /**
69
+ * @param {MouseEvent} [event]
70
+ * @return {void}
71
+ */
72
+ export function showNavDrawer(event) {
73
+ if (event && event.target instanceof HTMLAnchorElement) {
74
+ event.preventDefault();
75
+ }
76
+ document.getElementsByClassName('mdw-layout__navdrawer')[0].setAttribute('aria-hidden', 'false');
77
+ }
78
+
79
+ /**
80
+ * @param {MouseEvent} [event]
81
+ * @return {void}
82
+ */
83
+ export function hideNavDrawer(event) {
84
+ if (event && event.target instanceof HTMLAnchorElement) {
85
+ event.preventDefault();
86
+ }
87
+ const navDrawer = document.getElementsByClassName('mdw-layout__navdrawer')[0];
88
+ navDrawer.setAttribute('aria-hidden', 'true');
89
+ if (window.location.hash === `#${navDrawer.id}`) {
90
+ window.location.hash = '';
91
+ }
92
+ }
93
+
94
+ /**
95
+ * @param {MouseEvent} [event]
96
+ * @return {void}
97
+ */
98
+ export function toggleNavDrawer(event) {
99
+ if (document.getElementsByClassName('mdw-layout__navdrawer')[0].getAttribute('aria-hidden') === 'false') {
100
+ hideNavDrawer(event);
101
+ } else {
102
+ showNavDrawer(event);
103
+ }
104
+ }
105
+
106
+ /**
107
+ * @param {MouseEvent} [event]
108
+ * @return {void}
109
+ */
110
+ export function showSideSheet(event) {
111
+ if (event && event.target instanceof HTMLAnchorElement) {
112
+ event.preventDefault();
113
+ }
114
+ document.getElementsByClassName('mdw-layout__sidesheet')[0].setAttribute('aria-hidden', 'false');
115
+ }
116
+
117
+ /**
118
+ * @param {MouseEvent} [event]
119
+ * @return {void}
120
+ */
121
+ export function hideSideSheet(event) {
122
+ if (event && event.target instanceof HTMLAnchorElement) {
123
+ event.preventDefault();
124
+ }
125
+ document.getElementsByClassName('mdw-layout__sidesheet')[0].setAttribute('aria-hidden', 'true');
126
+ }
127
+
128
+ /**
129
+ * @param {MouseEvent} [event]
130
+ * @return {void}
131
+ */
132
+ export function onScrimClick(event) {
133
+ if (event && event.target instanceof HTMLAnchorElement) {
134
+ event.preventDefault();
135
+ }
136
+ if (isNavDrawerModalShowing()) {
137
+ hideNavDrawer();
138
+ }
139
+ const sidesheet = document.getElementsByClassName('mdw-layout__sidesheet')[0];
140
+ if (sidesheet && sidesheet.getAttribute('aria-hidden') === 'false') {
141
+ if (window.innerWidth < TABLET_BREAKPOINT || document.body.getAttribute('mdw-sidesheet-style') === 'modal') {
142
+ hideSideSheet();
143
+ }
144
+ }
145
+ }
146
+
147
+ /**
148
+ * @param {MouseEvent} [event]
149
+ * @return {void}
150
+ */
151
+ export function toggleSideSheet(event) {
152
+ if (document.getElementsByClassName('mdw-layout__sidesheet')[0].getAttribute('aria-hidden') === 'false') {
153
+ hideSideSheet(event);
154
+ } else {
155
+ showSideSheet(event);
156
+ }
157
+ }
158
+
159
+ /** @return {boolean} */
160
+ export function isMobile() {
161
+ return window.innerWidth < MOBILE_BREAKPOINT;
162
+ }
163
+
164
+ /** @return {boolean} */
165
+ export function isTablet() {
166
+ return window.innerWidth >= MOBILE_BREAKPOINT
167
+ && window.innerWidth < TABLET_BREAKPOINT;
168
+ }
169
+
170
+ /** @return {HTMLElement} */
171
+ export function getAppBarElement() {
172
+ if (!appBarElement) {
173
+ /** @type {HTMLElement} */
174
+ appBarElement = (document.getElementsByClassName('mdw-layout__appbar')[0]);
175
+ }
176
+ return appBarElement;
177
+ }
178
+
179
+ /** @return {boolean} */
180
+ export function shouldAutoHideAppBar() {
181
+ const appBar = getAppBarElement();
182
+ if (!appBar) {
183
+ return false;
184
+ }
185
+ const autoHide = appBar.getAttribute('mdw-autohide');
186
+ if (autoHide == null) {
187
+ return false;
188
+ }
189
+ if (autoHide === '') {
190
+ return true;
191
+ }
192
+ if (autoHide.indexOf('tablet') !== -1 && isTablet()) {
193
+ return true;
194
+ }
195
+ if (autoHide.indexOf('mobile') !== -1 && isMobile()) {
196
+ return true;
197
+ }
198
+ return false;
199
+ }
200
+
201
+ /** @return {void} */
202
+ export function openAppBarFabCut() {
203
+ const appBar = getAppBarElement();
204
+ if (!appBar) {
205
+ return;
206
+ }
207
+ const fabCutAttr = appBar.getAttribute('mdw-fab-cut');
208
+ if (fabCutAttr == null) {
209
+ return;
210
+ }
211
+ if (fabCutAttr.indexOf('open') === -1) {
212
+ appBar.setAttribute('mdw-fab-cut', `open ${fabCutAttr}`.trim());
213
+ }
214
+ }
215
+
216
+ /**
217
+ * @param {boolean} [changeFabCut=true]
218
+ * @return {void}
219
+ */
220
+ export function showFab(changeFabCut) {
221
+ const fabElement = document.getElementsByClassName('mdw-layout__fab')[0];
222
+ if (!fabElement) {
223
+ return;
224
+ }
225
+ fabElement.setAttribute('aria-hidden', 'false');
226
+ if (changeFabCut !== false) {
227
+ openAppBarFabCut();
228
+ }
229
+ }
230
+
231
+ /** @return {void} */
232
+ export function closeAppBarFabCut() {
233
+ const appBar = getAppBarElement();
234
+ if (!appBar) {
235
+ return;
236
+ }
237
+ const fabCutAttr = appBar.getAttribute('mdw-fab-cut');
238
+ if (!fabCutAttr) {
239
+ return;
240
+ }
241
+ if (fabCutAttr.indexOf('open') !== -1) {
242
+ appBar.setAttribute('mdw-fab-cut', fabCutAttr.replace('open', '').trim());
243
+ }
244
+ }
245
+
246
+ /**
247
+ * @param {boolean} [changeFabCut=true]
248
+ * @return {void}
249
+ */
250
+ export function hideFab(changeFabCut) {
251
+ const fabElement = document.getElementsByClassName('mdw-layout__fab')[0];
252
+ if (!fabElement) {
253
+ return;
254
+ }
255
+ fabElement.setAttribute('aria-hidden', 'true');
256
+ if (changeFabCut !== false) {
257
+ closeAppBarFabCut();
258
+ }
259
+ }
260
+
261
+ /** @return {boolean} */
262
+ export function isFabShown() {
263
+ const fabElement = document.getElementsByClassName('mdw-layout__fab')[0];
264
+ if (!fabElement) {
265
+ return false;
266
+ }
267
+ return fabElement.getAttribute('aria-hidden') !== 'true';
268
+ }
269
+
270
+ /** @return {HTMLElement} */
271
+ export function getContentElement() {
272
+ if (!layoutContentElement) {
273
+ /** @type {HTMLElement} */
274
+ layoutContentElement = (document.getElementsByClassName('mdw-layout__content')[0]);
275
+ }
276
+ return layoutContentElement;
277
+ }
278
+
279
+ /**
280
+ * @param {boolean} isBody
281
+ * @return {void}
282
+ */
283
+ export function onScroll(isBody) {
284
+ const contentElement = getContentElement();
285
+ const scrollElement = isBody ? document.body : contentElement;
286
+ const currentScrollY = scrollElement.scrollTop;
287
+ const change = currentScrollY - lastScrollY;
288
+ const delta = Math.abs(change);
289
+ if (delta === 0) {
290
+ // Horizontal scroll?
291
+ return;
292
+ }
293
+ if (currentScrollY < 0 && lastScrollY <= 0) {
294
+ // Repeated overscroll event
295
+ return;
296
+ }
297
+
298
+ const scrollBottom = scrollElement.scrollHeight - scrollElement.clientHeight;
299
+ const scrollBottomDistance = scrollBottom - currentScrollY;
300
+ const scrollTopChange = currentScrollY <= 0
301
+ || lastScrollY <= 0;
302
+ const scrollBottomChange = scrollBottomDistance === 0 && lastScrollBottomDistance !== 0;
303
+
304
+ lastScrollBottomDistance = scrollBottomDistance;
305
+ if (delta < MIN_SCROLL_DELTA && !scrollTopChange && !scrollBottomChange) {
306
+ return;
307
+ }
308
+
309
+ const didScrollUp = (scrollBottomDistance > 0) && (change < 0);
310
+ const isAtScrollTop = didScrollUp && currentScrollY <= 0;
311
+ const newScrollUp = didScrollUp && lastScrollY >= penultimateScrollY;
312
+ const didScrollDown = (change > 0);
313
+ const isAtScrollBottom = didScrollDown && (scrollBottomDistance <= 0);
314
+ const newScrollDown = didScrollDown && lastScrollY <= penultimateScrollY;
315
+
316
+ penultimateScrollY = lastScrollY;
317
+ lastScrollY = currentScrollY;
318
+
319
+ // To avoid DOM read, abort if scrolling in same direction and has already past app bar
320
+ if ((change === 0) || (!isAtScrollTop && !newScrollUp && !isAtScrollBottom && !newScrollDown
321
+ && scrolledPastAppBar)) {
322
+ return;
323
+ }
324
+
325
+ const appBar = getAppBarElement();
326
+ if (!appBar) {
327
+ return;
328
+ }
329
+
330
+ const bottomAppBar = appBar.hasAttribute('mdw-bottom');
331
+
332
+ const scrolledAway = bottomAppBar ? didScrollUp : didScrollDown;
333
+ const newScrollAway = scrolledAway && (bottomAppBar ? newScrollUp : newScrollDown);
334
+
335
+ // For code readability
336
+ const scrolledBack = !scrolledAway;
337
+ const newScrollBack = scrolledBack && (bottomAppBar ? newScrollDown : newScrollUp);
338
+
339
+ const isAtRest = (bottomAppBar ? isAtScrollBottom : isAtScrollTop);
340
+
341
+ if (scrolledBack) {
342
+ // scrolledPastAppBar needs to be recalculated
343
+ scrolledPastAppBar = false;
344
+ }
345
+
346
+ // Don't perform on each scroll back, only on first
347
+ if (newScrollBack || isAtRest) {
348
+ if (appBar.hasAttribute('mdw-autohide')) {
349
+ appBar.removeAttribute('mdw-hide');
350
+ appBar.style.removeProperty('margin-top');
351
+ }
352
+ }
353
+
354
+ if (!scrolledPastAppBar) {
355
+ if (bottomAppBar) {
356
+ scrolledPastAppBar = currentScrollY <= scrollBottom - appBar.clientHeight;
357
+ } else {
358
+ scrolledPastAppBar = currentScrollY > appBar.clientHeight;
359
+ }
360
+ }
361
+
362
+ if (isAtRest) {
363
+ if (appBar.hasAttribute('mdw-autoprominent')) {
364
+ appBar.setAttribute('mdw-prominent', '');
365
+ }
366
+ if (appBar.hasAttribute('mdw-autoraise')) {
367
+ appBar.removeAttribute('mdw-raise');
368
+ }
369
+ return;
370
+ }
371
+
372
+ // Not at rest
373
+ if (scrolledAway && scrolledPastAppBar) {
374
+ if (shouldAutoHideAppBar()) {
375
+ appBar.setAttribute('mdw-hide', '');
376
+ if (!isBody) {
377
+ appBar.style.setProperty('margin-top', `${-appBar.clientHeight}px`);
378
+ }
379
+ }
380
+ if (appBar.hasAttribute('mdw-autoprominent')) {
381
+ appBar.removeAttribute('mdw-prominent');
382
+ }
383
+ }
384
+
385
+ if (newScrollAway) {
386
+ if (appBar.hasAttribute('mdw-autoraise')) {
387
+ appBar.setAttribute('mdw-raise', '');
388
+ }
389
+ }
390
+ }
391
+
392
+ /** @return {void} */
393
+ export function onContentScroll() {
394
+ getScrollThrottler().run(() => onScroll(false));
395
+ }
396
+
397
+ /** @return {void} */
398
+ export function onBodyScroll() {
399
+ // position:sticky scrolling
400
+ getScrollThrottler().run(() => onScroll(true));
401
+ }
402
+
403
+ /** @return {void} */
404
+ export function resetScroll() {
405
+ const appBar = getAppBarElement();
406
+ if (appBar) {
407
+ appBar.removeAttribute('mdw-hide');
408
+ appBar.removeAttribute('mdw-raise');
409
+ }
410
+ scrolledPastAppBar = false;
411
+ lastScrollY = 0 + MIN_SCROLL_DELTA;
412
+ penultimateScrollY = lastScrollY;
413
+ onScroll(true);
414
+ }
415
+
416
+ /** @return {void} */
417
+ export function attach() {
418
+ const appBar = getAppBarElement();
419
+ if (appBar) {
420
+ // Initialize with scroll up
421
+ document.body.addEventListener('scroll', onBodyScroll, getPassiveEventListenerOption());
422
+ const contentElement = getContentElement();
423
+ if (contentElement) {
424
+ contentElement.addEventListener('scroll', onContentScroll, getPassiveEventListenerOption());
425
+ }
426
+ resetScroll();
427
+ }
428
+
429
+ iterateArrayLike(document.getElementsByClassName('mdw-layout__navdrawer-toggle'),
430
+ (el) => el.addEventListener('click', toggleNavDrawer));
431
+ iterateArrayLike(document.getElementsByClassName('mdw-layout__navdrawer-show'),
432
+ (el) => el.addEventListener('click', showNavDrawer));
433
+ iterateArrayLike(document.getElementsByClassName('mdw-layout__navdrawer-hide'),
434
+ (el) => el.addEventListener('click', hideNavDrawer));
435
+ iterateArrayLike(document.getElementsByClassName('mdw-layout__sidesheet-toggle'),
436
+ (el) => el.addEventListener('click', toggleSideSheet));
437
+ iterateArrayLike(document.getElementsByClassName('mdw-layout__sidesheet-show'),
438
+ (el) => el.addEventListener('click', showSideSheet));
439
+ iterateArrayLike(document.getElementsByClassName('mdw-layout__sidesheet-hide'),
440
+ (el) => el.addEventListener('click', hideSideSheet));
441
+ const scrim = document.getElementsByClassName('mdw-layout__scrim')[0];
442
+ if (scrim) {
443
+ scrim.addEventListener('click', onScrimClick);
444
+ scrim.addEventListener('scroll', onScrimScroll);
445
+ scrim.addEventListener('touchmove', onScrimScroll);
446
+ scrim.addEventListener('wheel', onScrimScroll);
447
+ }
448
+ }
449
+
450
+ /** @return {void} */
451
+ export function detach() {
452
+ document.removeEventListener('scroll', onBodyScroll, getPassiveEventListenerOption());
453
+ const content = getContentElement();
454
+ if (content) {
455
+ content.removeEventListener('scroll', onContentScroll, getPassiveEventListenerOption());
456
+ }
457
+ const scrim = document.getElementsByClassName('mdw-layout__scrim')[0];
458
+ if (scrim) {
459
+ scrim.removeEventListener('click', onScrimClick);
460
+ scrim.removeEventListener('scroll', onScrimScroll);
461
+ scrim.removeEventListener('touchmove', onScrimScroll);
462
+ scrim.removeEventListener('wheel', onScrimScroll);
463
+ }
464
+ }
@@ -0,0 +1,2 @@
1
+ @forward './_spec.scss';
2
+ @forward './_theme.scss';