@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,210 @@
1
+ // https://www.w3.org/TR/wai-aria-practices/#tabpanel
2
+
3
+ import * as Keyboard from '../../core/aria/keyboard.js';
4
+ import * as RovingTabIndex from '../../core/aria/rovingtabindex.js';
5
+ import {
6
+ getPassiveEventListenerOption, iterateArrayLike, iterateSomeOfArrayLike, scrollToElement,
7
+ } from '../../core/dom.js';
8
+
9
+ import * as TabItem from './item.js';
10
+
11
+ /**
12
+ * @param {Event} event
13
+ * @return {void}
14
+ */
15
+ function onTabIndexZeroed(event) {
16
+ /** @type {HTMLElement} */
17
+ const tabListElement = (event.currentTarget);
18
+ /** @type {HTMLElement} */
19
+ const currentItem = (event.target);
20
+ RovingTabIndex.removeTabIndex(tabListElement.querySelectorAll('[role="tab"]'), [currentItem]);
21
+ }
22
+ /**
23
+ * @param {CustomEvent} event
24
+ * @return {void}
25
+ */
26
+ function onForwardArrowKey(event) {
27
+ if (event.detail.ctrlKey || event.detail.altKey
28
+ || event.detail.shiftKey || event.detail.metaKey) {
29
+ return;
30
+ }
31
+ event.preventDefault();
32
+ event.stopPropagation();
33
+ /** @type {HTMLElement} */
34
+ const tabListElement = (event.currentTarget);
35
+ RovingTabIndex.selectNext(tabListElement.querySelectorAll('[role="tab"]'));
36
+ }
37
+
38
+ /**
39
+ * @param {CustomEvent} event
40
+ * @return {void}
41
+ */
42
+ function onBackArrowKey(event) {
43
+ if (event.detail.ctrlKey || event.detail.altKey
44
+ || event.detail.shiftKey || event.detail.metaKey) {
45
+ return;
46
+ }
47
+ event.preventDefault();
48
+ event.stopPropagation();
49
+ /** @type {HTMLElement} */
50
+ const tabListElement = (event.currentTarget);
51
+ RovingTabIndex.selectPrevious(tabListElement.querySelectorAll('[role="tab"]'));
52
+ }
53
+
54
+ /**
55
+ * @param {Element} tabListElement
56
+ * @return {void}
57
+ */
58
+ export function setupARIA(tabListElement) {
59
+ if (tabListElement.hasAttribute('mdw-no-aria')) {
60
+ return;
61
+ }
62
+ tabListElement.setAttribute('role', 'tablist');
63
+ tabListElement.setAttribute('aria-multiselectable', 'false');
64
+ tabListElement.setAttribute('aria-orientation', 'horizontal');
65
+ const indicatorElement = tabListElement.getElementsByClassName('mdw-tab__indicator')[0];
66
+ if (indicatorElement) {
67
+ indicatorElement.setAttribute('role', 'presentation');
68
+ }
69
+ }
70
+
71
+ /**
72
+ * @param {Element} tabListElement
73
+ * @param {Element|number} item element or index
74
+ * @param {number} [percentage=0]
75
+ * @param {boolean} [animate=false]
76
+ * @return {void}
77
+ */
78
+ export function setIndicatorPosition(tabListElement, item, percentage, animate = false) {
79
+ /** @type {HTMLElement} */
80
+ const indicatorElement = (tabListElement.getElementsByClassName('mdw-tab__indicator')[0]);
81
+ if (!indicatorElement) {
82
+ return;
83
+ }
84
+ const items = (tabListElement.getElementsByClassName('mdw-tab__item'));
85
+ /** @type {HTMLElement} */
86
+ const leftItem = (item instanceof Element ? item : items.item(item));
87
+ let left = leftItem.offsetLeft;
88
+ let right = left + leftItem.offsetWidth;
89
+
90
+ if (percentage > 0) {
91
+ left += (percentage * leftItem.offsetWidth);
92
+ /** @type {HTMLElement} */
93
+ let nextItem = (leftItem.nextElementSibling);
94
+ if (!nextItem.classList.contains('mdw-tab__item')) {
95
+ // RTL
96
+ /** @type {HTMLElement} */
97
+ nextItem = (leftItem.previousElementSibling);
98
+ }
99
+ right = nextItem.offsetLeft + (percentage * nextItem.offsetWidth);
100
+ }
101
+
102
+ // RTL is inversed
103
+ const width = Math.abs(right - left);
104
+ indicatorElement.style.setProperty('transform', `translateX(${left}px) scaleX(${width / 1000})`);
105
+ if (animate) {
106
+ indicatorElement.setAttribute('mdw-animate', '');
107
+ } else {
108
+ indicatorElement.removeAttribute('mdw-animate');
109
+ }
110
+ }
111
+
112
+ /**
113
+ * @param {HTMLElement} tabListElement
114
+ * @param {HTMLElement} tabItemElement
115
+ * @return {number}
116
+ */
117
+ export function getTabItemIndex(tabListElement, tabItemElement) {
118
+ /** @type {HTMLCollectionOf<HTMLElement>} */
119
+ const items = (tabListElement.getElementsByClassName('mdw-tab__item'));
120
+ let tabItemIndex = -1;
121
+ iterateSomeOfArrayLike(items, (el, index) => {
122
+ if (el === tabItemElement) {
123
+ tabItemIndex = index;
124
+ return true;
125
+ }
126
+ return false;
127
+ });
128
+ return tabItemIndex;
129
+ }
130
+
131
+ /**
132
+ * @param {Element} tabListElement
133
+ * @param {number} tabItemIndex
134
+ * @param {boolean} [dispatchEvents=false]
135
+ * @return {void}
136
+ */
137
+ export function selectItemAtIndex(tabListElement, tabItemIndex, dispatchEvents = false) {
138
+ /** @type {HTMLCollectionOf<HTMLElement>} */
139
+ const items = (tabListElement.getElementsByClassName('mdw-tab__item'));
140
+ if (dispatchEvents) {
141
+ const item = items.item(tabItemIndex);
142
+ if (item) {
143
+ TabItem.setSelected(item, true, true);
144
+ }
145
+ return;
146
+ }
147
+ iterateArrayLike(items, (el, index) => {
148
+ if (tabItemIndex === index) {
149
+ TabItem.setSelected(el, true, false);
150
+ if (tabListElement.hasAttribute('mdw-scrollable')) {
151
+ scrollToElement(el, true);
152
+ }
153
+ } else {
154
+ TabItem.setSelected(el, false, false);
155
+ }
156
+ });
157
+ }
158
+
159
+ /**
160
+ * @param {CustomEvent} event
161
+ * @return {void}
162
+ */
163
+ export function onSelectedChangeEvent(event) {
164
+ if (event.detail.value !== 'true') {
165
+ return;
166
+ }
167
+ /** @type {HTMLElement} */
168
+ const itemElement = (event.target);
169
+ /** @type {HTMLElement} */
170
+ const tabListElement = (event.currentTarget);
171
+ iterateArrayLike(tabListElement.querySelectorAll('[role="tab"]'), (item) => {
172
+ if (item !== itemElement) {
173
+ TabItem.setSelected(item, false, false);
174
+ }
175
+ });
176
+ }
177
+
178
+ /**
179
+ * @param {Element} tabListElement
180
+ * @return {void}
181
+ */
182
+ export function attach(tabListElement) {
183
+ let indicatorElement = tabListElement.getElementsByClassName('mdw-tab__indicator')[0];
184
+ if (!indicatorElement) {
185
+ indicatorElement = document.createElement('div');
186
+ indicatorElement.classList.add('mdw-tab__indicator');
187
+ tabListElement.appendChild(indicatorElement);
188
+ }
189
+
190
+ setupARIA(tabListElement);
191
+ iterateArrayLike(tabListElement.getElementsByClassName('mdw-tab__item'), TabItem.attach);
192
+ RovingTabIndex.setupTabIndexes(tabListElement.querySelectorAll('[role="tab"]'));
193
+ tabListElement.addEventListener(TabItem.SELECTED_CHANGE_EVENT, onSelectedChangeEvent,
194
+ getPassiveEventListenerOption());
195
+ tabListElement.addEventListener(Keyboard.FORWARD_ARROW_KEY, onForwardArrowKey);
196
+ tabListElement.addEventListener(Keyboard.BACK_ARROW_KEY, onBackArrowKey);
197
+ tabListElement.addEventListener(RovingTabIndex.TABINDEX_ZEROED, onTabIndexZeroed);
198
+ }
199
+
200
+ /**
201
+ * @param {Element} tabListElement
202
+ * @return {void}
203
+ */
204
+ export function detach(tabListElement) {
205
+ tabListElement.removeEventListener(TabItem.SELECTED_CHANGE_EVENT, onSelectedChangeEvent);
206
+ tabListElement.removeEventListener(Keyboard.FORWARD_ARROW_KEY, onForwardArrowKey);
207
+ tabListElement.removeEventListener(Keyboard.BACK_ARROW_KEY, onBackArrowKey);
208
+ iterateArrayLike(tabListElement.querySelectorAll('[role="tab"]'), RovingTabIndex.detach);
209
+ iterateArrayLike(tabListElement.getElementsByClassName('mdw-tab__item'), TabItem.detach);
210
+ }
@@ -0,0 +1,54 @@
1
+ // https://www.w3.org/TR/wai-aria-1.1/#tabpanel
2
+
3
+ import * as Attributes from '../../core/aria/attributes.js';
4
+
5
+ export const EXPANDED_CHANGE_EVENT = 'mdw:tabpanel-expandedchange';
6
+
7
+ export const { isExpanded } = Attributes;
8
+
9
+ /**
10
+ * @param {Element} tabPanelElement
11
+ * @return {void}
12
+ */
13
+ export function attach(tabPanelElement) {
14
+ tabPanelElement.setAttribute('role', 'tabpanel');
15
+ if (!tabPanelElement.hasAttribute('aria-expanded')) {
16
+ tabPanelElement.setAttribute('aria-expanded', 'false');
17
+ tabPanelElement.setAttribute('aria-hidden', 'true');
18
+ } else if (!tabPanelElement.hasAttribute('aria-hidden')) {
19
+ tabPanelElement.setAttribute('aria-hidden', isExpanded(tabPanelElement) ? 'false' : 'true');
20
+ }
21
+ }
22
+
23
+ /**
24
+ * @param {Element} tabPanelElement
25
+ * @return {void}
26
+ */
27
+ export function detach(tabPanelElement) {
28
+ if (!tabPanelElement.hasAttribute('aria-expanded')) {
29
+ tabPanelElement.setAttribute('aria-expanded', 'false');
30
+ tabPanelElement.setAttribute('aria-hidden', 'true');
31
+ } else if (!tabPanelElement.hasAttribute('aria-hidden')) {
32
+ tabPanelElement.setAttribute('aria-hidden', isExpanded(tabPanelElement) ? 'false' : 'true');
33
+ }
34
+ }
35
+
36
+ /**
37
+ * @param {Element} element
38
+ * @param {string|boolean} value
39
+ * @param {boolean} [dispatchEvent=true]
40
+ * @return {boolean} successful
41
+ */
42
+ export function setExpanded(element, value, dispatchEvent = true) {
43
+ return Attributes.setExpanded(element, value, dispatchEvent ? EXPANDED_CHANGE_EVENT : null);
44
+ }
45
+
46
+ /**
47
+ * Hide element to avoid tabbing into next panel
48
+ * @param {Element} tabPanelElement
49
+ * @param {boolean} value
50
+ * @return {void}
51
+ */
52
+ export function setHidden(tabPanelElement, value) {
53
+ tabPanelElement.setAttribute('aria-hidden', value ? 'true' : 'false');
54
+ }
@@ -0,0 +1,27 @@
1
+ @use '../../core/theme/_mixins.scss' as theme;
2
+
3
+ $themeValues: (
4
+ text-color: (('foreground-light', 0.87), ('foreground-dark', 1.00)),
5
+ border-color: (('primary', '700', 0.87), ('primary', '200', 1.0)),
6
+ ) !default;
7
+
8
+ @function getThemeValue($key, $type) {
9
+ @return theme.getThemeValue('template', $themeValues, $key, $type);
10
+ }
11
+
12
+ @mixin addThemeRules($theme: null) {
13
+ .mdw-template[mdw-surface] {
14
+ border-color: templateThemeValue('border-color', null);
15
+ }
16
+ }
17
+
18
+ @include theme.addComponentFallbackRules('light') {
19
+ @include addThemeRules('light');
20
+ }
21
+ @include theme.addComponentFallbackRules('dark') {
22
+ @include addThemeRules('dark');
23
+ }
24
+
25
+ @include theme.addComponentCSSVariableRules('template', $themeValues) {
26
+ @include addThemeRules();
27
+ }
@@ -5,16 +5,18 @@
5
5
  ```
6
6
  label.mdw-textfield
7
7
  input.mdw-textfield__input(placeholder=" ")
8
- .mdw-textfield__label Title
9
- .mdw-textfield__border-line
8
+ .mdw-textfield__border
9
+ .mdw-textfield__outline-gap
10
+ .mdw-textfield__label Title
10
11
  ```
11
12
 
12
13
  ## Pre-filled
13
14
  ```
14
15
  label.mdw-textfield
15
16
  input.mdw-textfield__input(value="Vintage 50" placeholder=" ")
16
- .mdw-textfield__label Title
17
- .mdw-textfield__border-line
17
+ .mdw-textfield__border
18
+ .mdw-textfield__outline-gap
19
+ .mdw-textfield__label Title
18
20
  ```
19
21
 
20
22
  ## Custom font size
@@ -22,16 +24,18 @@ label.mdw-textfield
22
24
  label.mdw-textfield(style="font-size: 2.125rem")
23
25
  // Do not apply font changes to the input element
24
26
  input.mdw-textfield__input(placeholder=" ")
25
- .mdw-textfield__label Title
26
- .mdw-textfield__border-line
27
+ .mdw-textfield__border
28
+ .mdw-textfield__outline-gap
29
+ .mdw-textfield__label Title
27
30
  ```
28
31
 
29
32
  ## Helper Text
30
33
  ```
31
34
  label.mdw-textfield
32
35
  input.mdw-textfield__input(placeholder=" ")
33
- .mdw-textfield__label Title
34
- .mdw-textfield__border-line
36
+ .mdw-textfield__border
37
+ .mdw-textfield__outline-gap
38
+ .mdw-textfield__label Title
35
39
  .mdw-textfield__helper-text Helper Text
36
40
  ```
37
41
 
@@ -39,8 +43,9 @@ label.mdw-textfield
39
43
  ```
40
44
  label.mdw-textfield
41
45
  input.mdw-textfield__input(placeholder=" " required)
42
- .mdw-textfield__label Title
43
- .mdw-textfield__border-line
46
+ .mdw-textfield__border
47
+ .mdw-textfield__outline-gap
48
+ .mdw-textfield__label Title
44
49
  .mdw-textfield__error-text Helper Text
45
50
  ```
46
51
 
@@ -48,8 +53,9 @@ label.mdw-textfield
48
53
  ```
49
54
  label.mdw-textfield
50
55
  input.mdw-textfield__input(placeholder=" " required)
51
- .mdw-textfield__label Title
52
- .mdw-textfield__border-line
56
+ .mdw-textfield__border
57
+ .mdw-textfield__outline-gap
58
+ .mdw-textfield__label Title
53
59
  .mdw-textfield__helper-text Helper Text
54
60
  .mdw-textfield__error-text Helper Text
55
61
  ```
@@ -58,35 +64,39 @@ label.mdw-textfield
58
64
  ```
59
65
  label.mdw-textfield
60
66
  input.mdw-textfield__input(type="text" placeholder=" ")
61
- .mdw-textfield__label Amount
67
+ .mdw-textfield__border
68
+ .mdw-textfield__outline-gap
69
+ .mdw-textfield__label Amount
62
70
  .mdw-textfield__prefix $
63
- .mdw-textfield__border-line
64
71
  ```
65
72
 
66
73
  ## Suffixed text
67
74
  ```
68
75
  label.mdw-textfield
69
76
  input.mdw-textfield__input(type="email" placeholder=" ")
70
- .mdw-textfield__label Email
77
+ .mdw-textfield__border
78
+ .mdw-textfield__outline-gap
79
+ .mdw-textfield__label Email
71
80
  .mdw-textfield__suffix @gmail.com
72
- .mdw-textfield__border-line
73
81
  ```
74
82
 
75
83
  ## Icon
76
84
  ```
77
85
  label.mdw-textfield
78
- .mdw-textfield__icon.material-icons person
79
86
  input.mdw-textfield__input(type="text" placeholder=" " value="Ali Connors")
80
- .mdw-textfield__label Name
81
- .mdw-textfield__border-line
87
+ .mdw-textfield__icon.material-icons person
88
+ .mdw-textfield__border
89
+ .mdw-textfield__outline-gap
90
+ .mdw-textfield__label Name
82
91
  ```
83
92
 
84
- ## Accented
93
+ ## Secondary Color
85
94
  ```
86
- label.mdw-textfield(mdw-theme-color="accent")
95
+ label.mdw-textfield.mdw-theme(mdw-ink="secondary")
87
96
  input.mdw-textfield__input(type="text" placeholder=" ")
88
- .mdw-textfield__label Phone number
89
- .mdw-textfield__border-line
97
+ .mdw-textfield__border
98
+ .mdw-textfield__outline-gap
99
+ .mdw-textfield__label Phone number
90
100
  ```
91
101
 
92
102
  ## Multiline
@@ -94,66 +104,76 @@ label.mdw-textfield(mdw-theme-color="accent")
94
104
  ```
95
105
  label.mdw-textfield
96
106
  textarea.mdw-textfield__input(placeholder=" ")
97
- .mdw-textfield__label Description
98
- .mdw-textfield__border-line
107
+ .mdw-textfield__border
108
+ .mdw-textfield__outline-gap
109
+ .mdw-textfield__label Description
99
110
  ```
100
111
 
101
- ## Text Area
112
+ ## Mutiline with row count
102
113
 
103
114
  ```
104
- label.mdw-textfield(mdw-textarea)
115
+ label.mdw-textfield(mdw-autosize)
105
116
  textarea.mdw-textfield__input(placeholder=" " rows="5")
106
- .mdw-textfield__label Message
117
+ .mdw-textfield__border
118
+ .mdw-textfield__outline-gap
119
+ .mdw-textfield__label Message
107
120
  ```
108
121
 
109
- ## Boxed
122
+ ## Solo
110
123
  ```
111
- label.mdw-textfield(mdw-box)
124
+ label.mdw-textfield(mdw-solo)
112
125
  input.mdw-textfield__input(placeholder=" ")
113
- .mdw-textfield__label Title
114
126
  ```
115
127
 
116
- ## Boxed Text Area
128
+ ## Outlined
117
129
  ```
118
- label.mdw-textfield(mdw-textarea mdw-box)
119
- textarea.mdw-textfield__input(placeholder=" " rows="5")
120
- .mdw-textfield__label Title
130
+ label.mdw-textfield(mdw-outlined)
131
+ input.mdw-textfield__input(placeholder=" ")
132
+ .mdw-textfield__border
133
+ .mdw-textfield__outline-gap
134
+ .mdw-textfield__label Title
121
135
  ```
122
136
 
123
- ## Multiline with Auto-Expand (requires-JS)
137
+ ## Outlined Multiline
124
138
  ```
125
- label.mdw-textfield(mdw-multiline)
139
+ label.mdw-textfield
126
140
  textarea.mdw-textfield__input(placeholder=" ")
127
- .mdw-textfield__label Description
128
- .mdw-textfield__border-line
141
+ .mdw-textfield__border
142
+ .mdw-textfield__outline-gap
143
+ .mdw-textfield__label Title
129
144
  ```
130
145
 
131
- ## Multiline Text Area with Auto-Expand (requires-JS)
146
+ ## Multiline with Auto-Size (requires-JS)
132
147
  ```
133
- label.mdw-textfield(mdw-multiline mdw-textarea)
148
+ label.mdw-textfield(mdw-autosize)
134
149
  textarea.mdw-textfield__input(placeholder=" ")
135
- .mdw-textfield__label Description
136
- .mdw-textfield__border-line
150
+ .mdw-textfield__border
151
+ .mdw-textfield__outline-gap
152
+ .mdw-textfield__label Description
137
153
  ```
138
154
 
139
- ## Boxed Multiline Text Area with Auto-Expand (requires-JS)
155
+
156
+ ## Outlined Multiline with Auto-Size (requires-JS)
140
157
  ```
141
- label.mdw-textfield(mdw-multiline mdw-textarea mdw-box)
158
+ label.mdw-textfield(mdw-autosize mdw-outlined)
142
159
  textarea.mdw-textfield__input(placeholder=" ")
143
- .mdw-textfield__label Description
144
- .mdw-textfield__border-line
160
+ .mdw-textfield__border
161
+ .mdw-textfield__outline-gap
162
+ .mdw-textfield__label Description
145
163
  ```
146
164
 
147
165
  # Javascript
148
166
 
149
167
  ```
150
- document.querySelectorAll(".mdw-textfield").forEach((element) => {
151
- new TextField(element);
168
+ document.getElementsByClassName("mdw-textfield").forEach((element) => {
169
+ TextField.attach(element);
152
170
  });
153
171
  ```
154
172
 
155
173
  # Notes
156
174
 
157
- Use `rows` attribute to define minimum size of multiline or textarea fields. `.mdw-textfield__border-line` is not needed with textarea or boxed fields, but the element does not need to be removed since it is automatically hidden.
175
+ Use `rows` attribute to define minimum size of multiline or textarea fields.
176
+
177
+ `.mdw-textfield__outline-gap` is **always** needed.
158
178
 
159
179
  Detection as to whether the input value is filled is based on `:placeholder-shown`. The `placeholder` attribute needs to be present and not blank. Use an empty space (`placeholder=" "`) to appear blank instead of a blank or non-existant attribute. As a fallback, browsers that don't support support `:placeholder-shown` will have their labels permanently floated above the input box. Initializing the element with Javascript will ensure the label acts according to spec.
@@ -0,0 +1,52 @@
1
+ @use '../../core/_type.scss' as type;
2
+
3
+ @mixin centerLabel {
4
+ .mdw-textfield__label {
5
+ @include type.addRules('subtitle');
6
+
7
+ top: 50%;
8
+
9
+ transform: translateY(-50%);
10
+ }
11
+
12
+ .mdw-textfield__outline-gap {
13
+ &::before,
14
+ :root[dir="rtl"] &::after {
15
+ right: 50%;
16
+ left: 0;
17
+ }
18
+
19
+ &::after,
20
+ :root[dir="rtl"] &::before {
21
+ right: 0;
22
+ left: 50%;
23
+ }
24
+ }
25
+ }
26
+
27
+ @mixin floatLabel {
28
+ .mdw-textfield__label {
29
+ @include type.addRules('caption');
30
+ top: 0;
31
+
32
+ transform: translateY(0);
33
+
34
+ .mdw-textfield[mdw-outlined] & {
35
+ transform: translateY(-50%);
36
+ }
37
+ }
38
+
39
+ .mdw-textfield__outline-gap {
40
+ &::before,
41
+ :root[dir="rtl"] &::after {
42
+ right: 100%;
43
+ left: 0;
44
+ }
45
+
46
+ &::after,
47
+ :root[dir="rtl"] &::before {
48
+ right: 0;
49
+ left: 100%;
50
+ }
51
+ }
52
+ }