@shortfuse/materialdesignweb 0.8.0 → 0.9.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 (394) hide show
  1. package/README.md +32 -24
  2. package/bin/mdw-css.js +1 -1
  3. package/components/Badge.js +12 -5
  4. package/components/Body.js +3 -0
  5. package/components/BottomAppBar.js +1 -8
  6. package/components/BottomSheet.js +424 -0
  7. package/components/Box.js +11 -49
  8. package/components/Button.js +61 -82
  9. package/components/Card.js +56 -61
  10. package/components/Checkbox.js +7 -25
  11. package/components/CheckboxIcon.js +10 -28
  12. package/components/Chip.js +13 -11
  13. package/components/Dialog.js +49 -98
  14. package/components/Display.js +55 -0
  15. package/components/Fab.js +83 -17
  16. package/components/FabContainer.js +48 -0
  17. package/components/FilterChip.js +34 -32
  18. package/components/Grid.js +176 -0
  19. package/components/Headline.js +5 -28
  20. package/components/Icon.js +54 -69
  21. package/components/IconButton.js +71 -120
  22. package/components/Input.js +669 -83
  23. package/components/InputChip.js +161 -0
  24. package/components/Label.js +3 -0
  25. package/components/List.js +1 -5
  26. package/components/ListItem.js +39 -23
  27. package/components/ListOption.js +79 -62
  28. package/components/Listbox.js +19 -10
  29. package/components/Menu.js +8 -18
  30. package/components/MenuItem.js +25 -26
  31. package/components/NavBar.js +53 -19
  32. package/components/NavDrawer.js +15 -15
  33. package/components/NavDrawerItem.js +2 -4
  34. package/components/NavItem.js +40 -33
  35. package/components/NavRail.js +23 -21
  36. package/components/NavRailItem.js +5 -2
  37. package/components/Page.js +105 -0
  38. package/components/Pane.js +18 -0
  39. package/components/Popup.js +17 -8
  40. package/components/Radio.js +2 -5
  41. package/components/RadioIcon.js +10 -14
  42. package/components/Ripple.js +11 -7
  43. package/components/Root.js +209 -0
  44. package/components/Scrim.js +87 -0
  45. package/components/Search.js +12 -20
  46. package/components/SegmentedButton.js +33 -36
  47. package/components/SegmentedButtonGroup.js +9 -3
  48. package/components/Select.js +6 -7
  49. package/components/Shape.js +5 -65
  50. package/components/SideSheet.js +308 -0
  51. package/components/Slider.js +71 -34
  52. package/components/Snackbar.js +22 -16
  53. package/components/SnackbarContainer.js +42 -0
  54. package/components/Surface.js +15 -10
  55. package/components/Switch.js +3 -16
  56. package/components/SwitchIcon.js +40 -32
  57. package/components/Tab.js +57 -38
  58. package/components/TabContent.js +1 -0
  59. package/components/TabList.js +60 -32
  60. package/components/TabPanel.js +1 -1
  61. package/components/Table.js +116 -0
  62. package/components/TextArea.js +16 -15
  63. package/components/Title.js +4 -9
  64. package/components/Tooltip.js +43 -21
  65. package/components/TopAppBar.js +56 -78
  66. package/constants/shapes.js +36 -0
  67. package/constants/typography.js +127 -0
  68. package/core/Composition.js +354 -192
  69. package/core/CompositionAdapter.js +11 -12
  70. package/core/CustomElement.js +588 -236
  71. package/core/css.js +117 -12
  72. package/core/customTypes.js +120 -25
  73. package/core/dom.js +17 -11
  74. package/core/jsonMergePatch.js +12 -10
  75. package/core/observe.js +298 -253
  76. package/core/optimizations.js +9 -9
  77. package/core/template.js +14 -57
  78. package/dist/index.min.js +85 -115
  79. package/dist/index.min.js.map +4 -4
  80. package/dist/meta.json +1 -1
  81. package/dom/HTMLOptionsCollectionProxy.js +106 -0
  82. package/{theming/themableMixinLoader.js → loaders/palette.js} +4 -3
  83. package/loaders/theme.js +12 -0
  84. package/mixins/AriaReflectorMixin.js +53 -13
  85. package/mixins/AriaToolbarMixin.js +3 -0
  86. package/mixins/ControlMixin.js +76 -33
  87. package/mixins/DelegatesFocusMixin.js +54 -0
  88. package/mixins/DensityMixin.js +2 -2
  89. package/mixins/ElevationMixin.js +62 -0
  90. package/mixins/FlexableMixin.js +66 -37
  91. package/mixins/FormAssociatedMixin.js +60 -8
  92. package/mixins/HyperlinkMixin.js +66 -0
  93. package/mixins/InputMixin.js +205 -32
  94. package/mixins/KeyboardNavMixin.js +8 -6
  95. package/mixins/NavigationListenerMixin.js +33 -0
  96. package/mixins/PopupMixin.js +176 -208
  97. package/mixins/ResizeObserverMixin.js +16 -4
  98. package/mixins/RippleMixin.js +8 -6
  99. package/mixins/ScrollListenerMixin.js +1 -1
  100. package/mixins/SemiStickyMixin.js +44 -98
  101. package/mixins/ShapeMaskedMixin.js +117 -0
  102. package/mixins/ShapeMixin.js +22 -204
  103. package/mixins/StateMixin.js +70 -34
  104. package/mixins/TextFieldMixin.js +107 -143
  105. package/mixins/ThemableMixin.js +44 -56
  106. package/mixins/TooltipTriggerMixin.js +291 -359
  107. package/mixins/TouchTargetMixin.js +1 -1
  108. package/mixins/TypographyMixin.js +121 -0
  109. package/package.json +110 -74
  110. package/services/rtl.js +10 -0
  111. package/services/svgAlias.js +17 -0
  112. package/{theming/index.js → services/theme.js} +24 -174
  113. package/types/bin/mdw-css.d.ts +3 -0
  114. package/types/bin/mdw-css.d.ts.map +1 -0
  115. package/types/components/Badge.d.ts +39 -0
  116. package/types/components/Badge.d.ts.map +1 -0
  117. package/types/components/Body.d.ts +29 -0
  118. package/types/components/Body.d.ts.map +1 -0
  119. package/types/components/BottomAppBar.d.ts +73 -0
  120. package/types/components/BottomAppBar.d.ts.map +1 -0
  121. package/types/components/BottomSheet.d.ts +109 -0
  122. package/types/components/BottomSheet.d.ts.map +1 -0
  123. package/types/components/Box.d.ts +16 -0
  124. package/types/components/Box.d.ts.map +1 -0
  125. package/types/components/Button.d.ts +714 -0
  126. package/types/components/Button.d.ts.map +1 -0
  127. package/types/components/Card.d.ts +412 -0
  128. package/types/components/Card.d.ts.map +1 -0
  129. package/types/components/Checkbox.d.ts +205 -0
  130. package/types/components/Checkbox.d.ts.map +1 -0
  131. package/types/components/CheckboxIcon.d.ts +44 -0
  132. package/types/components/CheckboxIcon.d.ts.map +1 -0
  133. package/types/components/Chip.d.ts +1425 -0
  134. package/types/components/Chip.d.ts.map +1 -0
  135. package/types/components/Dialog.d.ts +286 -0
  136. package/types/components/Dialog.d.ts.map +1 -0
  137. package/types/components/DialogActions.d.ts +4 -0
  138. package/types/components/DialogActions.d.ts.map +1 -0
  139. package/types/components/Display.d.ts +45 -0
  140. package/types/components/Display.d.ts.map +1 -0
  141. package/types/components/Divider.d.ts +10 -0
  142. package/types/components/Divider.d.ts.map +1 -0
  143. package/types/components/Fab.d.ts +741 -0
  144. package/types/components/Fab.d.ts.map +1 -0
  145. package/types/components/FabContainer.d.ts +10 -0
  146. package/types/components/FabContainer.d.ts.map +1 -0
  147. package/types/components/FilterChip.d.ts +4283 -0
  148. package/types/components/FilterChip.d.ts.map +1 -0
  149. package/types/components/Grid.d.ts +37 -0
  150. package/types/components/Grid.d.ts.map +1 -0
  151. package/types/components/Headline.d.ts +47 -0
  152. package/types/components/Headline.d.ts.map +1 -0
  153. package/types/components/Icon.d.ts +103 -0
  154. package/types/components/Icon.d.ts.map +1 -0
  155. package/types/components/IconButton.d.ts +1486 -0
  156. package/types/components/IconButton.d.ts.map +1 -0
  157. package/types/components/Input.d.ts +51288 -0
  158. package/types/components/Input.d.ts.map +1 -0
  159. package/types/components/InputChip.d.ts +243 -0
  160. package/types/components/InputChip.d.ts.map +1 -0
  161. package/types/components/Label.d.ts +29 -0
  162. package/types/components/Label.d.ts.map +1 -0
  163. package/types/components/List.d.ts +31 -0
  164. package/types/components/List.d.ts.map +1 -0
  165. package/types/components/ListItem.d.ts +349 -0
  166. package/types/components/ListItem.d.ts.map +1 -0
  167. package/types/components/ListOption.d.ts +1493 -0
  168. package/types/components/ListOption.d.ts.map +1 -0
  169. package/types/components/Listbox.d.ts +12012 -0
  170. package/types/components/Listbox.d.ts.map +1 -0
  171. package/types/components/Menu.d.ts +119 -0
  172. package/types/components/Menu.d.ts.map +1 -0
  173. package/types/components/MenuItem.d.ts +3109 -0
  174. package/types/components/MenuItem.d.ts.map +1 -0
  175. package/types/components/NavBar.d.ts +18 -0
  176. package/types/components/NavBar.d.ts.map +1 -0
  177. package/types/components/NavBarItem.d.ts +186 -0
  178. package/types/components/NavBarItem.d.ts.map +1 -0
  179. package/types/components/NavDrawer.d.ts +108 -0
  180. package/types/components/NavDrawer.d.ts.map +1 -0
  181. package/types/components/NavDrawerItem.d.ts +186 -0
  182. package/types/components/NavDrawerItem.d.ts.map +1 -0
  183. package/types/components/NavItem.d.ts +190 -0
  184. package/types/components/NavItem.d.ts.map +1 -0
  185. package/types/components/NavRail.d.ts +109 -0
  186. package/types/components/NavRail.d.ts.map +1 -0
  187. package/types/components/NavRailItem.d.ts +186 -0
  188. package/types/components/NavRailItem.d.ts.map +1 -0
  189. package/types/components/Page.d.ts +24 -0
  190. package/types/components/Page.d.ts.map +1 -0
  191. package/types/components/Pane.d.ts +44 -0
  192. package/types/components/Pane.d.ts.map +1 -0
  193. package/types/components/Popup.d.ts +76 -0
  194. package/types/components/Popup.d.ts.map +1 -0
  195. package/types/components/Progress.d.ts +19 -0
  196. package/types/components/Progress.d.ts.map +1 -0
  197. package/types/components/Radio.d.ts +199 -0
  198. package/types/components/Radio.d.ts.map +1 -0
  199. package/types/components/RadioIcon.d.ts +46 -0
  200. package/types/components/RadioIcon.d.ts.map +1 -0
  201. package/types/components/Ripple.d.ts +34 -0
  202. package/types/components/Ripple.d.ts.map +1 -0
  203. package/types/components/Root.d.ts +68 -0
  204. package/types/components/Root.d.ts.map +1 -0
  205. package/types/components/Scrim.d.ts +6 -0
  206. package/types/components/Scrim.d.ts.map +1 -0
  207. package/types/components/Search.d.ts +16 -0
  208. package/types/components/Search.d.ts.map +1 -0
  209. package/types/components/SegmentedButton.d.ts +718 -0
  210. package/types/components/SegmentedButton.d.ts.map +1 -0
  211. package/types/components/SegmentedButtonGroup.d.ts +44 -0
  212. package/types/components/SegmentedButtonGroup.d.ts.map +1 -0
  213. package/types/components/Select.d.ts +1361 -0
  214. package/types/components/Select.d.ts.map +1 -0
  215. package/types/components/Shape.d.ts +10 -0
  216. package/types/components/Shape.d.ts.map +1 -0
  217. package/types/components/SideSheet.d.ts +106 -0
  218. package/types/components/SideSheet.d.ts.map +1 -0
  219. package/types/components/Slider.d.ts +382 -0
  220. package/types/components/Slider.d.ts.map +1 -0
  221. package/types/components/Snackbar.d.ts +65 -0
  222. package/types/components/Snackbar.d.ts.map +1 -0
  223. package/types/components/SnackbarContainer.d.ts +6 -0
  224. package/types/components/SnackbarContainer.d.ts.map +1 -0
  225. package/types/components/Surface.d.ts +45 -0
  226. package/types/components/Surface.d.ts.map +1 -0
  227. package/types/components/Switch.d.ts +183 -0
  228. package/types/components/Switch.d.ts.map +1 -0
  229. package/types/components/SwitchIcon.d.ts +169 -0
  230. package/types/components/SwitchIcon.d.ts.map +1 -0
  231. package/types/components/Tab.d.ts +879 -0
  232. package/types/components/Tab.d.ts.map +1 -0
  233. package/types/components/TabContent.d.ts +122 -0
  234. package/types/components/TabContent.d.ts.map +1 -0
  235. package/types/components/TabList.d.ts +6266 -0
  236. package/types/components/TabList.d.ts.map +1 -0
  237. package/types/components/TabPanel.d.ts +28 -0
  238. package/types/components/TabPanel.d.ts.map +1 -0
  239. package/types/components/Table.d.ts +2 -0
  240. package/types/components/Table.d.ts.map +1 -0
  241. package/types/components/TextArea.d.ts +1394 -0
  242. package/types/components/TextArea.d.ts.map +1 -0
  243. package/types/components/Title.d.ts +47 -0
  244. package/types/components/Title.d.ts.map +1 -0
  245. package/types/components/Tooltip.d.ts +49 -0
  246. package/types/components/Tooltip.d.ts.map +1 -0
  247. package/types/components/TopAppBar.d.ts +130 -0
  248. package/types/components/TopAppBar.d.ts.map +1 -0
  249. package/types/constants/colorKeywords.d.ts +2 -0
  250. package/types/constants/colorKeywords.d.ts.map +1 -0
  251. package/types/constants/shapes.d.ts +38 -0
  252. package/types/constants/shapes.d.ts.map +1 -0
  253. package/types/constants/typography.d.ts +212 -0
  254. package/types/constants/typography.d.ts.map +1 -0
  255. package/types/core/Composition.d.ts +252 -0
  256. package/types/core/Composition.d.ts.map +1 -0
  257. package/types/core/CompositionAdapter.d.ts +92 -0
  258. package/types/core/CompositionAdapter.d.ts.map +1 -0
  259. package/types/core/CustomElement.d.ts +302 -0
  260. package/types/core/CustomElement.d.ts.map +1 -0
  261. package/types/core/css.d.ts +44 -0
  262. package/types/core/css.d.ts.map +1 -0
  263. package/types/core/customTypes.d.ts +26 -0
  264. package/types/core/customTypes.d.ts.map +1 -0
  265. package/types/core/dom.d.ts +32 -0
  266. package/types/core/dom.d.ts.map +1 -0
  267. package/types/core/jsonMergePatch.d.ts +31 -0
  268. package/types/core/jsonMergePatch.d.ts.map +1 -0
  269. package/types/core/observe.d.ts +113 -0
  270. package/types/core/observe.d.ts.map +1 -0
  271. package/types/core/optimizations.d.ts +7 -0
  272. package/types/core/optimizations.d.ts.map +1 -0
  273. package/types/core/template.d.ts +47 -0
  274. package/types/core/template.d.ts.map +1 -0
  275. package/types/core/uid.d.ts +6 -0
  276. package/types/core/uid.d.ts.map +1 -0
  277. package/types/dom/HTMLOptionsCollectionProxy.d.ts +18 -0
  278. package/types/dom/HTMLOptionsCollectionProxy.d.ts.map +1 -0
  279. package/types/index.d.ts +88 -0
  280. package/types/index.d.ts.map +1 -0
  281. package/types/loaders/palette.d.ts +2 -0
  282. package/types/loaders/palette.d.ts.map +1 -0
  283. package/types/loaders/theme.d.ts +2 -0
  284. package/types/loaders/theme.d.ts.map +1 -0
  285. package/types/mixins/AriaReflectorMixin.d.ts +23 -0
  286. package/types/mixins/AriaReflectorMixin.d.ts.map +1 -0
  287. package/types/mixins/AriaToolbarMixin.d.ts +32 -0
  288. package/types/mixins/AriaToolbarMixin.d.ts.map +1 -0
  289. package/types/mixins/ControlMixin.d.ts +124 -0
  290. package/types/mixins/ControlMixin.d.ts.map +1 -0
  291. package/types/mixins/DelegatesFocusMixin.d.ts +5 -0
  292. package/types/mixins/DelegatesFocusMixin.d.ts.map +1 -0
  293. package/types/mixins/DensityMixin.d.ts +5 -0
  294. package/types/mixins/DensityMixin.d.ts.map +1 -0
  295. package/types/mixins/ElevationMixin.d.ts +33 -0
  296. package/types/mixins/ElevationMixin.d.ts.map +1 -0
  297. package/types/mixins/FlexableMixin.d.ts +13 -0
  298. package/types/mixins/FlexableMixin.d.ts.map +1 -0
  299. package/types/mixins/FormAssociatedMixin.d.ts +122 -0
  300. package/types/mixins/FormAssociatedMixin.d.ts.map +1 -0
  301. package/types/mixins/HyperlinkMixin.d.ts +22 -0
  302. package/types/mixins/HyperlinkMixin.d.ts.map +1 -0
  303. package/types/mixins/InputMixin.d.ts +179 -0
  304. package/types/mixins/InputMixin.d.ts.map +1 -0
  305. package/types/mixins/KeyboardNavMixin.d.ts +47 -0
  306. package/types/mixins/KeyboardNavMixin.d.ts.map +1 -0
  307. package/types/mixins/NavigationListenerMixin.d.ts +8 -0
  308. package/types/mixins/NavigationListenerMixin.d.ts.map +1 -0
  309. package/types/mixins/PopupMixin.d.ts +82 -0
  310. package/types/mixins/PopupMixin.d.ts.map +1 -0
  311. package/types/mixins/RTLObserverMixin.d.ts +7 -0
  312. package/types/mixins/RTLObserverMixin.d.ts.map +1 -0
  313. package/types/mixins/ResizeObserverMixin.d.ts +12 -0
  314. package/types/mixins/ResizeObserverMixin.d.ts.map +1 -0
  315. package/types/mixins/RippleMixin.d.ts +92 -0
  316. package/types/mixins/RippleMixin.d.ts.map +1 -0
  317. package/types/mixins/ScrollListenerMixin.d.ts +41 -0
  318. package/types/mixins/ScrollListenerMixin.d.ts.map +1 -0
  319. package/types/mixins/SemiStickyMixin.d.ts +50 -0
  320. package/types/mixins/SemiStickyMixin.d.ts.map +1 -0
  321. package/types/mixins/ShapeMaskedMixin.d.ts +9 -0
  322. package/types/mixins/ShapeMaskedMixin.d.ts.map +1 -0
  323. package/types/mixins/ShapeMixin.d.ts +38 -0
  324. package/types/mixins/ShapeMixin.d.ts.map +1 -0
  325. package/types/mixins/StateMixin.d.ts +27 -0
  326. package/types/mixins/StateMixin.d.ts.map +1 -0
  327. package/types/mixins/TextFieldMixin.d.ts +1354 -0
  328. package/types/mixins/TextFieldMixin.d.ts.map +1 -0
  329. package/types/mixins/ThemableMixin.d.ts +9 -0
  330. package/types/mixins/ThemableMixin.d.ts.map +1 -0
  331. package/types/mixins/TooltipTriggerMixin.d.ts +106 -0
  332. package/types/mixins/TooltipTriggerMixin.d.ts.map +1 -0
  333. package/types/mixins/TouchTargetMixin.d.ts +3 -0
  334. package/types/mixins/TouchTargetMixin.d.ts.map +1 -0
  335. package/types/mixins/TypographyMixin.d.ts +17 -0
  336. package/types/mixins/TypographyMixin.d.ts.map +1 -0
  337. package/types/services/rtl.d.ts +3 -0
  338. package/types/services/rtl.d.ts.map +1 -0
  339. package/types/services/svgAlias.d.ts +13 -0
  340. package/types/services/svgAlias.d.ts.map +1 -0
  341. package/types/services/theme.d.ts +45 -0
  342. package/types/services/theme.d.ts.map +1 -0
  343. package/types/utils/cli.d.ts +3 -0
  344. package/types/utils/cli.d.ts.map +1 -0
  345. package/types/utils/function.d.ts +3 -0
  346. package/types/utils/function.d.ts.map +1 -0
  347. package/types/utils/jsx-runtime.d.ts +20 -0
  348. package/types/utils/jsx-runtime.d.ts.map +1 -0
  349. package/types/utils/material-color/blend.d.ts +34 -0
  350. package/types/utils/material-color/blend.d.ts.map +1 -0
  351. package/types/utils/material-color/hct/Cam16.d.ts +142 -0
  352. package/types/utils/material-color/hct/Cam16.d.ts.map +1 -0
  353. package/types/utils/material-color/hct/Hct.d.ts +93 -0
  354. package/types/utils/material-color/hct/Hct.d.ts.map +1 -0
  355. package/types/utils/material-color/hct/ViewingConditions.d.ts +69 -0
  356. package/types/utils/material-color/hct/ViewingConditions.d.ts.map +1 -0
  357. package/types/utils/material-color/hct/hctSolver.d.ts +30 -0
  358. package/types/utils/material-color/hct/hctSolver.d.ts.map +1 -0
  359. package/types/utils/material-color/helper.d.ts +8 -0
  360. package/types/utils/material-color/helper.d.ts.map +1 -0
  361. package/types/utils/material-color/palettes/CorePalette.d.ts +75 -0
  362. package/types/utils/material-color/palettes/CorePalette.d.ts.map +1 -0
  363. package/types/utils/material-color/palettes/TonalPalette.d.ts +38 -0
  364. package/types/utils/material-color/palettes/TonalPalette.d.ts.map +1 -0
  365. package/types/utils/material-color/scheme/Scheme.d.ts +264 -0
  366. package/types/utils/material-color/scheme/Scheme.d.ts.map +1 -0
  367. package/types/utils/material-color/utils/color.d.ts +172 -0
  368. package/types/utils/material-color/utils/color.d.ts.map +1 -0
  369. package/types/utils/material-color/utils/math.d.ts +94 -0
  370. package/types/utils/material-color/utils/math.d.ts.map +1 -0
  371. package/types/utils/pixelmatch.d.ts +22 -0
  372. package/types/utils/pixelmatch.d.ts.map +1 -0
  373. package/types/utils/popup.d.ts +106 -0
  374. package/types/utils/popup.d.ts.map +1 -0
  375. package/types/utils/searchParams.d.ts +3 -0
  376. package/types/utils/searchParams.d.ts.map +1 -0
  377. package/types/utils/svg.d.ts +7 -0
  378. package/types/utils/svg.d.ts.map +1 -0
  379. package/utils/material-color/scheme/Scheme.js +1 -1
  380. package/utils/pixelmatch.js +360 -0
  381. package/utils/popup.js +86 -10
  382. package/utils/searchParams.js +19 -0
  383. package/components/ExtendedFab.js +0 -32
  384. package/components/Layout.js +0 -504
  385. package/components/Nav.js +0 -38
  386. package/core/DomAdapter.js +0 -586
  387. package/core/ICustomElement.d.ts +0 -291
  388. package/core/ICustomElement.js +0 -1
  389. package/core/test.js +0 -126
  390. package/core/typings.d.ts +0 -142
  391. package/core/typings.js +0 -1
  392. package/mixins/SurfaceMixin.js +0 -127
  393. package/theming/loader.js +0 -22
  394. /package/{utils/color_keywords.js → constants/colorKeywords.js} +0 -0
@@ -21,19 +21,28 @@ export default function StateMixin(Base) {
21
21
  },
22
22
  _hovered: 'boolean',
23
23
  _focused: 'boolean',
24
- _pressed: 'boolean',
24
+ /** True if focus was synthetic */
25
+ _focusedSynthetic: 'boolean',
26
+ _keyPressed: 'boolean',
27
+ /** True if key was released this event loop. (Used to ignore clicks) */
28
+ _keyReleased: 'boolean',
29
+ _pointerPressed: 'boolean',
25
30
  stateLayer: 'boolean',
26
31
  })
27
32
  .observe({
28
33
  disabledState({ disabled }) { return disabled; },
29
34
  hoveredState({ _hovered, hovered }) { return _hovered || hovered; },
30
35
  focusedState({ _focused, focused }) { return _focused || focused; },
31
- pressedState({ _pressed, pressed }) { return _pressed || pressed; },
36
+ pressedState({ _keyPressed, _pointerPressed, pressed }) { return _keyPressed || _pointerPressed || pressed; },
32
37
  touchedState({ _lastInteraction }) {
33
38
  return _lastInteraction === 'touch';
34
39
  },
40
+ pointedState({ _lastInteraction }) {
41
+ return _lastInteraction === 'mouse' || _lastInteraction === 'pen';
42
+ },
35
43
  })
36
44
  .define({
45
+ /** @return {HTMLElement} */
37
46
  stateTargetElement() { return this; },
38
47
  })
39
48
  .html`
@@ -44,62 +53,72 @@ export default function StateMixin(Base) {
44
53
  pressed={pressedState}
45
54
  interaction={_lastInteraction}
46
55
  touched={touchedState}
56
+ pointed={pointedState}
47
57
  aria-hidden=true></div>
48
58
  `
49
59
  .events({
50
60
  pointerenter(event) {
61
+ if (!event.isTrusted) return;
51
62
  if (!event.isPrimary) return;
52
- this._pressed = this.stateTargetElement.matches(':active');
63
+ this._pointerPressed = this.stateTargetElement.matches(':active');
53
64
  if (event.pointerType === 'touch') return;
54
65
  this._hovered = true;
55
- // Firefox lags a frame before reporting :hover
56
- // requestAnimationFrame(() => {
57
- // this._hovered = this.stateTargetElement.matches(':hover');
58
- // });
59
66
  },
60
67
  '~pointerdown'(event) {
68
+ if (!event.isTrusted) return;
61
69
  if (!event.isPrimary) return;
62
70
  this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);
63
- this._pressed = true;
71
+ this._pointerPressed = true;
64
72
  },
65
73
  '~pointerup'(event) {
74
+ if (!event.isTrusted) return;
66
75
  if (!event.isPrimary) return;
67
76
  this._lastInteraction = /** @type {'touch'|'mouse'|'pen'} */ (event.pointerType);
68
- this._pressed = false;
77
+ this._pointerPressed = false;
69
78
  },
70
- pointercancel(e) {
71
- if (!e.isPrimary) return;
72
- this._pressed = this.stateTargetElement.matches(':active');
79
+ pointercancel(event) {
80
+ if (!event.isTrusted) return;
81
+ if (!event.isPrimary) return;
82
+ this._pointerPressed = this.stateTargetElement.matches(':active');
73
83
  },
74
84
  pointerleave(event) {
85
+ if (!event.isTrusted) return;
75
86
  if (!event.isPrimary) return;
76
- this._pressed = false;
87
+ this._pointerPressed = false;
77
88
  this._hovered = false;
78
89
  },
79
- '~keydown'(e) {
90
+ '~keydown'(event) {
91
+ if (!event.isTrusted) return;
80
92
  this._lastInteraction = 'key';
81
- if (e.repeat) return;
82
- // console.debug('keydown', this.stateTargetElement.matches(':active'));
83
- requestAnimationFrame(() => {
84
- this._pressed = this.stateTargetElement.matches(':active');
85
- // console.debug('pressed? after one keydown frame', this._pressed);
86
- });
93
+ if (event.repeat) return;
94
+ if (event.key !== ' ') return;
95
+ this._keyPressed = true;
87
96
  },
88
- '~keyup'() {
97
+ '~keyup'(event) {
98
+ if (!event.isTrusted) return;
89
99
  this._lastInteraction = 'key';
90
- // console.debug('keyup', this.stateTargetElement.matches(':active'));
91
- requestAnimationFrame(() => {
92
- this._pressed = this.stateTargetElement.matches(':active');
93
- // console.debug('pressed? after one keyUP frame?', this._pressed);
100
+ if (event.key !== ' ') return;
101
+ this._keyPressed = false;
102
+ this._keyReleased = true;
103
+ setTimeout(() => {
104
+ this._keyReleased = false;
94
105
  });
95
106
  },
96
- blur() {
107
+ blur(event) {
108
+ if (!event.isTrusted) return;
97
109
  this._focused = false;
110
+ this._focusedSynthetic = false;
111
+ this._keyPressed = false;
112
+ this._pointerPressed = false;
98
113
  if (!this._lastInteraction) return;
99
114
  lastInteractionWasTouch = (this._lastInteraction === 'touch');
100
- // this._lastInteraction = null;
115
+ this._lastInteraction = null;
101
116
  },
102
- focus() {
117
+ focus(event) {
118
+ if (!event.isTrusted) return;
119
+ this._focusedSynthetic = 'sourceCapabilities' in event
120
+ ? !event.sourceCapabilities
121
+ : (this._lastInteraction === null && !event.relatedTarget);
103
122
  this._focused = true;
104
123
  // Element was focused without a mouse or touch event (keyboard or programmatic)
105
124
  if (!this._lastInteraction && lastInteractionWasTouch) {
@@ -110,6 +129,9 @@ export default function StateMixin(Base) {
110
129
  })
111
130
  .on({
112
131
  disconnected() {
132
+ this._focused = false;
133
+ this._keyPressed = false;
134
+ this._pointerPressed = false;
113
135
  this._lastInteraction = null;
114
136
  },
115
137
  })
@@ -133,17 +155,19 @@ export default function StateMixin(Base) {
133
155
  }
134
156
 
135
157
  #state {
158
+ --mdw-state__opacity: calc(
159
+ var(--mdw-state__hovered-opacity) +
160
+ var(--mdw-state__focused-opacity) +
161
+ var(--mdw-state__pressed-opacity) +
162
+ var(--mdw-state__dragged-opacity)
163
+ );
164
+
136
165
  position: absolute;
137
166
  inset: 0;
138
167
 
139
168
  pointer-events: none;
140
169
 
141
- opacity: calc(
142
- var(--mdw-state__hovered-opacity) +
143
- var(--mdw-state__focused-opacity) +
144
- var(--mdw-state__pressed-opacity) +
145
- var(--mdw-state__dragged-opacity)
146
- );
170
+ opacity: var(--mdw-state__opacity);
147
171
  /* opacity handled by theme engine */
148
172
  background-color: currentColor;
149
173
  border-radius: inherit;
@@ -154,6 +178,18 @@ export default function StateMixin(Base) {
154
178
  will-change: opacity;
155
179
  }
156
180
 
181
+ /** Reduce RAM usage by not creating stack contexts */
182
+ @supports(background-color: color-mix(in srgb, red calc(100%), red)) {
183
+ #state {
184
+ opacity: 1;
185
+
186
+ background-color: color-mix(in srgb, currentColor calc(100% * var(--mdw-state__opacity)), transparent);
187
+
188
+ transition-property: color, background-color;
189
+ will-change: color, background-color;
190
+ }
191
+ }
192
+
157
193
  #state[touched] {
158
194
  --mdw-state__hovered-opacity: 0;
159
195
  --mdw-state__focused-opacity: 0;
@@ -17,6 +17,7 @@ export default function TextFieldMixin(Base) {
17
17
  .observe({
18
18
  type: { empty: 'text' },
19
19
  icon: 'string',
20
+ iconVariation: 'string',
20
21
  label: 'string',
21
22
  filled: 'boolean',
22
23
  outlined: 'boolean',
@@ -24,6 +25,7 @@ export default function TextFieldMixin(Base) {
24
25
  inputSuffix: 'string',
25
26
  trailingIcon: 'string',
26
27
  trailingIconInk: 'string',
28
+ trailingIconLabel: 'string',
27
29
  supporting: 'string',
28
30
  error: 'string',
29
31
  placeholder: { nullParser: String }, // DOMString
@@ -52,7 +54,27 @@ export default function TextFieldMixin(Base) {
52
54
  return label && (filled || outlined);
53
55
  },
54
56
  })
57
+ .expressions({
58
+ _shapeShapeTop({ shapeTop, filled }) {
59
+ return shapeTop || filled;
60
+ },
61
+ computedIconVariation({ iconVariation, outlined }) {
62
+ return iconVariation ?? (outlined ? null : 'filled');
63
+ },
64
+ })
55
65
  .html`
66
+ <div id=shape role=none filled={filled} icon={icon} trailing-icon={trailingIcon}
67
+ populated={populatedState} focused={focusedState} label={label} outlined={outlined}
68
+ shape-top={_shapeShapeTop}>
69
+ <mdw-icon mdw-if={icon} id=icon aria-hidden=true disabled={disabledState} icon={icon} variation={computedIconVariation}></mdw-icon>
70
+ <div id=inline role=none filled={filled} icon={icon} trailing-icon={trailingIcon}
71
+ populated={populatedState} focused={focusedState} label={label} outlined={outlined}>
72
+ <span mdw-if={inputPrefix} class=inline id=prefix aria-hidden=true focused={focusedState} populated={populatedState}>{inputPrefix}</span>
73
+ <span mdw-if={inputSuffix} class=inline id=suffix aria-hidden=true focused={focusedState} populated={populatedState}>{inputSuffix}</span>
74
+ </div>
75
+ <mdw-icon-button tabindex=-1 disabled={disabledState} mdw-if={trailingIcon} id=trailing-icon ink={trailingIconInk} disabled={disabledState} icon={trailingIcon}>{trailingIconLabel}</mdw-icon-button>
76
+ <div mdw-if={filled} id=indicator aria-hidden=true focused={focusedState} hovered={hoveredState} errored={erroredState} disabled={disabledState}></div>
77
+ </div>
56
78
  <div id=label-text mdw-if={_showLabelText} aria-hidden=true
57
79
  outlined={outlined}
58
80
  populated={populatedState}
@@ -65,52 +87,32 @@ export default function TextFieldMixin(Base) {
65
87
  {computeSupportingText}
66
88
  <slot id=supporting-slot name=supporting></slot>
67
89
  </div>
90
+
68
91
  `
92
+ .recompose(({ html, refs: { control, outline, state, shape, inline } }) => {
93
+ control.setAttribute('placeholder', '{computePlaceholder}');
94
+ control.setAttribute('aria-label', '{label}');
95
+ control.setAttribute('input-suffix', '{inputSuffix}');
96
+ control.setAttribute('errored', '{erroredState}');
97
+ control.setAttribute('aria-describedby', 'supporting');
98
+ control.removeAttribute('aria-labelledby');
99
+ control.classList.add('inline');
100
+
101
+ state.setAttribute('mdw-if', '{!outlined}');
102
+ outline.append(html`
103
+ <div id=outline-left class=outline-section focused={focusedState}></div>
104
+ <div id=gap label={label} populated={populatedState} focused={focusedState}>
105
+ <div id=gap-slot focused={focusedState}></div>
106
+ <span id=gap-label>{label}</span>
107
+ </div>
108
+ <div id=outline-right class=outline-section focused={focusedState}></div>
109
+ `);
110
+ outline.setAttribute('label', '{label}');
111
+ outline.setAttribute('errored', '{erroredState}');
112
+ shape.prepend(outline, state);
113
+ inline.prepend(control);
114
+ })
69
115
  .on({
70
- composed({ html, inline }) {
71
- const { control, outline, shape, outlineLeft, outlineRight, state } = this.refs;
72
- control.setAttribute('placeholder', '{computePlaceholder}');
73
- control.setAttribute('aria-label', '{label}');
74
- control.setAttribute('input-suffix', '{inputSuffix}');
75
- control.setAttribute('errored', '{erroredState}');
76
- control.setAttribute('aria-describedby', 'supporting');
77
- control.removeAttribute('aria-labelledby');
78
- control.classList.add('inline');
79
-
80
- state.setAttribute('mdw-if', '{!outlined}');
81
- shape.setAttribute('role', 'none');
82
- shape.setAttribute('filled', '{filled}');
83
- shape.setAttribute('icon', '{icon}');
84
- shape.setAttribute('trailingIcon', '{trailingIcon}');
85
- shape.setAttribute('populated', '{populatedState}');
86
- shape.setAttribute('focused', '{focusedState}');
87
- shape.setAttribute('label', '{label}');
88
- shape.setAttribute('shape-top', inline(({ shapeTop, filled }) => shapeTop || filled));
89
- shape.append(
90
- state,
91
- outline,
92
- control,
93
- html`
94
- <mdw-icon mdw-if={icon} id=icon aria-hidden=true disabled={disabledState}>{icon}</mdw-icon>
95
- <span mdw-if={inputPrefix} class=inline id=prefix aria-hidden=true focused={focusedState} populated={populatedState}>{inputPrefix}</span>
96
- <span mdw-if={inputSuffix} class=inline id=suffix aria-hidden=true focused={focusedState} populated={populatedState}>{inputSuffix}</span>
97
- <mdw-icon mdw-if={trailingIcon} id=trailing-icon ink={trailingIconInk} aria-hidden=true disabled={disabledState}>{trailingIcon}</mdw-icon>
98
- <div mdw-if={filled} id=indicator aria-hidden=true focused={focusedState} hovered={hoveredState} errored={erroredState} disabled={disabledState}></div>
99
- `,
100
- );
101
-
102
- outline.setAttribute('label', '{label}');
103
- outline.setAttribute('errored', '{erroredState}');
104
- outlineLeft.after(html`
105
- <div id=gap mdw-if={label} label={label} populated={populatedState} focused={focusedState}>
106
- <div id=gap-slot focused={focusedState}></div>
107
- <span id=gap-label>{label}</span>
108
- </div>
109
- `);
110
-
111
- outlineLeft.setAttribute('focused', '{focusedState}');
112
- outlineRight.setAttribute('focused', '{focusedState}');
113
- },
114
116
  sizeChanged(oldValue, newValue) {
115
117
  this.refs.control.style.setProperty('--size', `${newValue}ch`);
116
118
  },
@@ -163,6 +165,8 @@ export default function TextFieldMixin(Base) {
163
165
 
164
166
  display: inline-block;
165
167
 
168
+ border-radius: 0;
169
+
166
170
  /* State layer */
167
171
  color: rgb(var(--mdw-color__on-surface));
168
172
 
@@ -170,14 +174,6 @@ export default function TextFieldMixin(Base) {
170
174
  letter-spacing: var(--mdw-type__letter-spacing);
171
175
  }
172
176
 
173
- :host([icon]) {
174
- --padding-inline-start: 12px;
175
- }
176
-
177
- :host([trailing-icon]) {
178
- --padding-inline-end: 12px;
179
- }
180
-
181
177
  :host(:is([color], [ink])) {
182
178
  background-color: transparent;
183
179
  color: rgb(var(--mdw-color__on-surface));
@@ -189,7 +185,6 @@ export default function TextFieldMixin(Base) {
189
185
  --mdw-shape__size__bottom-start-size: min(var(--mdw-shape__size), 12px);
190
186
  --mdw-shape__size__top-end-size: min(var(--mdw-shape__size), 12px);
191
187
  --mdw-shape__size__bottom-end-size: min(var(--mdw-shape__size), 12px);
192
- -webkit-mask-box-image-width: min(var(--mdw-shape__size), 12px);
193
188
  }
194
189
 
195
190
  #shape {
@@ -197,15 +192,17 @@ export default function TextFieldMixin(Base) {
197
192
 
198
193
  display: flex;
199
194
 
200
- align-items: center;
201
- overflow: visible;
202
-
203
195
  cursor: inherit;
204
196
 
205
197
  z-index: 0;
206
198
 
207
199
  background-color: transparent;
208
200
 
201
+ border-start-start-radius: calc(var(--mdw-shape__size__top-start-size));
202
+ border-start-end-radius: calc(var(--mdw-shape__size__top-end-size));
203
+ border-end-start-radius: calc(var(--mdw-shape__size__bottom-start-size));
204
+ border-end-end-radius: calc(var(--mdw-shape__size__bottom-end-size));
205
+
209
206
  font-weight: inherit;
210
207
  font-size: inherit;
211
208
  line-height: inherit;
@@ -215,10 +212,28 @@ export default function TextFieldMixin(Base) {
215
212
  transition: none 200ms cubic-bezier(0.0, 0.0, 0.2, 1);
216
213
  }
217
214
 
218
- #shape:where([filled],[outlined]) {
219
- padding-inline: 16px;
215
+ #inline {
216
+ display: flex;
217
+
218
+ align-items: center;
219
+ overflow: visible;
220
+
221
+ flex: 1;
222
+ padding-block: var(--control__margin-top) var(--control__margin-bottom);
223
+
224
+ cursor: inherit;
225
+
226
+ font-weight: inherit;
227
+ font-size: inherit;
228
+ line-height: inherit;
229
+ font-family: inherit;
230
+ letter-spacing: inherit;
231
+
232
+ transition: none 200ms cubic-bezier(0.0, 0.0, 0.2, 1);
220
233
  }
221
234
 
235
+
236
+
222
237
  #shape:where([filled],[color]) {
223
238
  background-color: rgb(var(--mdw-bg));
224
239
  color: rgb(var(--mdw-color__on-surface));
@@ -237,14 +252,6 @@ export default function TextFieldMixin(Base) {
237
252
  color: rgb(var(--mdw-ink))
238
253
  }
239
254
 
240
- #shape:where([filled],[outlined])[icon] {
241
- padding-inline-start: 12px;
242
- }
243
-
244
- #shape[trailing-icon] {
245
- padding-inline-end: 12px;
246
- }
247
-
248
255
  #shape[focused] {
249
256
  transition: none 100ms cubic-bezier(0.4, 0.0, 1, 1);
250
257
  }
@@ -252,7 +259,6 @@ export default function TextFieldMixin(Base) {
252
259
  #shape[shape-top] {
253
260
  --mdw-shape__size__bottom-start-size: 0px;
254
261
  --mdw-shape__size__bottom-end-size: 0px;
255
- --mdw-shape__mask: linear-gradient(transparent 50%, black 50%);
256
262
  }
257
263
 
258
264
  #prefix,
@@ -277,16 +283,15 @@ export default function TextFieldMixin(Base) {
277
283
  inset: auto;
278
284
  align-self: flex-start;
279
285
 
280
- display: inline;
286
+ display: inline-block;
281
287
 
282
288
  box-sizing: border-box;
283
289
 
284
290
  block-size: auto;
285
- min-block-size: none;
291
+ min-block-size: 0;
286
292
  inline-size: 100%;
287
- min-inline-size: none;
293
+ min-inline-size: 0;
288
294
  flex: 1;
289
- border-block-start: solid var(--control__margin-top) transparent;
290
295
  border-block-end: solid var(--control__margin-bottom) transparent;
291
296
  padding-block: var(--control__padding-top) var(--control__padding-bottom);
292
297
 
@@ -296,7 +301,7 @@ export default function TextFieldMixin(Base) {
296
301
 
297
302
  transform: none;
298
303
 
299
- visibility: visible;
304
+ visibility: inherit;
300
305
 
301
306
  background-color: transparent;
302
307
  border-color: transparent;
@@ -308,6 +313,7 @@ export default function TextFieldMixin(Base) {
308
313
  line-height: inherit;
309
314
  font-family: inherit;
310
315
  letter-spacing: inherit;
316
+ text-align: initial;
311
317
 
312
318
  transition-duration: inherit;
313
319
  transition-property: color;
@@ -317,7 +323,6 @@ export default function TextFieldMixin(Base) {
317
323
  #suffix,
318
324
  #prefix {
319
325
  /* Symmetrical to allow centering */
320
- margin-block: var(--control__margin-top) var(--control__margin-bottom);
321
326
  padding-block: var(--control__padding-top) var(--control__padding-bottom);
322
327
  }
323
328
 
@@ -342,7 +347,7 @@ export default function TextFieldMixin(Base) {
342
347
  #icon {
343
348
  order: -2;
344
349
 
345
- margin-inline-end: 16px;
350
+ margin-inline-start: 12px;
346
351
 
347
352
  font-size: 24px;
348
353
  }
@@ -358,7 +363,8 @@ export default function TextFieldMixin(Base) {
358
363
  #trailing-icon {
359
364
  order: 2;
360
365
 
361
- margin-inline-start: 16px;
366
+ /* stylelint-disable-next-line declaration-property-value-disallowed-list */
367
+ margin-inline-end: 12px;
362
368
  }
363
369
 
364
370
  #indicator {
@@ -465,6 +471,31 @@ export default function TextFieldMixin(Base) {
465
471
 
466
472
  /** Outlined **/
467
473
 
474
+ #outline {
475
+ position: absolute;
476
+ inset: 0;
477
+
478
+ border-style: solid;
479
+ border-width: 0px;
480
+
481
+ pointer-events: none;
482
+
483
+ border-color: currentColor;
484
+ border-radius: inherit;
485
+ color: rgb(var(--mdw-color__outline));
486
+ }
487
+
488
+ #outline:is([pressed],[focused]) {
489
+ color: rgb(var(--mdw-ink));
490
+
491
+ transition-delay: 0;
492
+ transition-duration: 0;
493
+ }
494
+
495
+ #outline[disabled] {
496
+ color: rgba(var(--mdw-color__on-surface), 0.12);
497
+ }
498
+
468
499
  #outline::before {
469
500
  content: none;
470
501
  }
@@ -601,73 +632,6 @@ export default function TextFieldMixin(Base) {
601
632
  border-block-start-width: 2px;
602
633
  }
603
634
 
604
- @supports(-webkit-mask-box-image: none) {
605
- #outline[focused] {
606
- /** Fake 2px outline */
607
- filter:
608
- drop-shadow(1px 0px 0px currentColor)
609
- drop-shadow(0px 1px 0px currentColor)
610
- drop-shadow(-1px 0px 0px currentColor)
611
- drop-shadow(0px -1px 0px currentColor);
612
- }
613
-
614
- #outline::before {
615
- content: '';
616
-
617
- position: absolute;
618
- inset: 0;
619
-
620
- grid-column: calc(2 - var(--mdw-dir, 1)) / span 1;
621
- /* stylelint-disable-next-line liberty/use-logical-spec */
622
- margin-right: -0.99px;
623
- border: none;
624
-
625
- background-color: currentColor;
626
- -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)
627
- 8 fill /
628
- auto
629
- stretch;
630
- -webkit-mask-box-image-width: auto 0 auto auto;
631
- }
632
-
633
- #outline::after {
634
- grid-column: calc(2 + var(--mdw-dir, 1)) / span 1;
635
- grid-row: 1;
636
-
637
- /* stylelint-disable-next-line liberty/use-logical-spec */
638
- margin-left: -0.99px;
639
- -webkit-mask-box-image-width: auto auto auto 0;
640
- }
641
-
642
- .outline-section {
643
- border: none;
644
- }
645
-
646
- #gap::after {
647
- border: none;
648
-
649
- background-color: currentColor;
650
- -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)
651
- 8 fill /
652
- auto
653
- stretch;
654
- -webkit-mask-box-image-width: 0 0 auto 0;
655
- }
656
-
657
- #gap-slot::before,
658
- #gap-slot::after {
659
- border: none;
660
-
661
- background-color: currentColor;
662
-
663
- -webkit-mask-box-image: var(--mdw-shape__mask-image__edges)
664
- 8 fill /
665
- auto
666
- stretch;
667
- -webkit-mask-box-image-width: auto 0 0 0;
668
- }
669
- }
670
-
671
635
  #gap-slot::before {
672
636
  /* stylelint-disable-next-line liberty/use-logical-spec */
673
637
  margin-right: -0.99px;
@@ -693,7 +657,7 @@ export default function TextFieldMixin(Base) {
693
657
  padding: 0;
694
658
  }
695
659
 
696
- #shape[label][filled] {
660
+ #inline[label][filled] {
697
661
  align-items: flex-start;
698
662
  }
699
663