@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
@@ -0,0 +1,161 @@
1
+ import { EVENT_HANDLER_TYPE } from '../core/customTypes.js';
2
+ import DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';
3
+ import HyperlinkMixin from '../mixins/HyperlinkMixin.js';
4
+ import ShapeMixin from '../mixins/ShapeMixin.js';
5
+
6
+ import Box from './Box.js';
7
+ import './Button.js';
8
+ import './Icon.js';
9
+ import './IconButton.js';
10
+
11
+ export default Box
12
+ .extend()
13
+ .mixin(ShapeMixin)
14
+ .mixin(DelegatesFocusMixin)
15
+ .mixin(HyperlinkMixin)
16
+ .observe({
17
+ avatar: 'boolean',
18
+ closeButton: 'boolean',
19
+ closeIcon: { empty: 'close' },
20
+ closeInk: { empty: 'inherit' },
21
+ readOnly: { attr: 'readonly', type: 'boolean' },
22
+ disabled: 'boolean',
23
+ icon: 'string',
24
+ iconInk: 'string',
25
+ src: 'string',
26
+ svg: 'string',
27
+ viewBox: 'string',
28
+ svgPath: 'string',
29
+ onclose: EVENT_HANDLER_TYPE,
30
+ selected: 'boolean',
31
+ })
32
+ .set({
33
+ outlined: true,
34
+ })
35
+ .expressions({
36
+ hasIcon({ icon, svg, src, svgPath } = this) {
37
+ return icon ?? svg ?? src ?? svgPath;
38
+ },
39
+ showCloseIcon({ disabled, readOnly, closeButton }) {
40
+ return closeButton && !disabled && !readOnly;
41
+ },
42
+ })
43
+ .html`
44
+ <mdw-button
45
+ role=none
46
+ tabindex=-1
47
+ href={href}
48
+ target={target}
49
+ download={download}
50
+ ping={ping}
51
+ rel={rel}
52
+ hreflang={hreflang}
53
+ referrerpolicy={referrerPolicy} id=action disabled={disabled}></mdw-button>
54
+ <mdw-icon mdw-if={hasIcon} id=icon ink={iconInk} disabled={disabled}
55
+ outlined={outlined} variation={iconVariation} aria-hidden=true svg={svg} src={src}
56
+ svg-path={svgPath} view-box={viewBox} icon={icon} avatar={avatar}></mdw-icon>
57
+ <mdw-icon-button role=none disabled={disabled} tabindex=-1 mdw-if={showCloseIcon} id=close class=button icon={closeIcon} ink={closeInk}>Close</mdw-icon-button>
58
+ `
59
+ .css`
60
+ /* https://m3.material.io/components/chips/specs */
61
+
62
+ :host {
63
+ --mdw-shape__size: 8px;
64
+ --mdw-ink: var(--mdw-color__on-surface);
65
+ position: relative;
66
+
67
+ display: inline-flex;
68
+ align-items: center;
69
+ flex-direction: row;
70
+ gap: 8px;
71
+
72
+ padding-block: calc(4px + (var(--mdw-density) * 2px));
73
+ padding-inline: calc(12px + (var(--mdw-density) * 2px));
74
+
75
+ color: rgb(var(--mdw-ink));
76
+ }
77
+
78
+ :host(:where([icon])) {
79
+ padding-inline-start: calc(8px + (var(--mdw-density) * 2px));
80
+ }
81
+
82
+ :host(:where([avatar])) {
83
+ padding-inline-start: calc(4px + (var(--mdw-density) * 2px));
84
+ }
85
+
86
+ :host(:where([close-button]:not([disabled]):not([readonly]))) {
87
+ padding-inline-end: calc(8px + 18px + 8px + (var(--mdw-density) * 2px));
88
+ }
89
+
90
+ #action {
91
+ --mdw-shape__size: inherit;
92
+ position: absolute;
93
+ inset: 0;
94
+
95
+ padding: 0;
96
+ }
97
+
98
+ #close {
99
+ position: absolute;
100
+ inset-inline-end: calc(8px - 3px);
101
+
102
+ padding: 3px; /* Pad to 24px */
103
+
104
+ font-size: 18px;
105
+ }
106
+
107
+ #icon {
108
+ font-size: 18px;
109
+ }
110
+
111
+ #icon[avatar] {
112
+ font-size: 24px;
113
+ }
114
+
115
+ #close::part(control) {
116
+ min-inline-size: calc(18px + (2 * 8px)); /* Reach up to edge of chip */
117
+ }
118
+
119
+ #outline {
120
+ --mdw-ink: rgb(var(--mdw-color__on-surface-variant));
121
+ }
122
+
123
+ #outline:is([ink],[color],[disabled]) {
124
+ /* stylelint-disable-next-line rule-selector-property-disallowed-list */
125
+ --mdw-ink: inherit;
126
+ }
127
+
128
+ :host([disabled]) {
129
+ color: rgba(var(--mdw-color__on-surface), 0.38);
130
+ }
131
+
132
+ `
133
+ .childEvents({
134
+ action: {
135
+ click() {
136
+ this.dispatchEvent(new Event('action'));
137
+ },
138
+ },
139
+ close: {
140
+ click() {
141
+ this.dispatchEvent(new Event('close'));
142
+ },
143
+ },
144
+ })
145
+ .on({
146
+ selectedChanged(previous, current) {
147
+ this.refs.action._focused = current;
148
+ },
149
+ })
150
+ .recompose(({ refs: { anchor, slot, icon, outline } }) => {
151
+ icon.after(slot);
152
+ anchor.remove();
153
+ slot.setAttribute('disabled', '{disabled}');
154
+ slot.removeAttribute('ink');
155
+ slot.removeAttribute('color');
156
+ outline.removeAttribute('mdw-if');
157
+ outline.setAttribute('ink', '{ink}');
158
+ outline.setAttribute('color', '{color}');
159
+ outline.setAttribute('disabled', '{disabled}');
160
+ })
161
+ .autoRegister('mdw-input-chip');
@@ -1,7 +1,10 @@
1
+ import TypographyMixin from '../mixins/TypographyMixin.js';
2
+
1
3
  import Box from './Box.js';
2
4
 
3
5
  export default Box
4
6
  .extend()
7
+ .mixin(TypographyMixin)
5
8
  .css`
6
9
  :host {
7
10
  font: var(--mdw-typescale__label-large__font);
@@ -17,14 +17,10 @@ export default Box
17
17
  /* https://m3.material.io/components/lists/specs */
18
18
 
19
19
  :host {
20
- --mdw-bg: var(--mdw-color__surface);
21
- --mdw-ink: var(--mdw-color__on-surface);
22
- display: flex;
23
- flex-direction: column;
20
+ display: block;
24
21
 
25
22
  padding-block: 8px;
26
23
 
27
- background-color: rgb(var(--mdw-bg));
28
24
  color: rgb(var(--mdw-ink));
29
25
  }
30
26
 
@@ -1,5 +1,6 @@
1
1
  // https://www.w3.org/WAI/ARIA/apg/patterns/listbox/
2
2
 
3
+ import './Box.js';
3
4
  import './CheckboxIcon.js';
4
5
  import './RadioIcon.js';
5
6
  import './Divider.js';
@@ -7,6 +8,7 @@ import './Icon.js';
7
8
 
8
9
  import CustomElement from '../core/CustomElement.js';
9
10
  import AriaReflectorMixin from '../mixins/AriaReflectorMixin.js';
11
+ import HyperlinkMixin from '../mixins/HyperlinkMixin.js';
10
12
  import RippleMixin from '../mixins/RippleMixin.js';
11
13
  import StateMixin from '../mixins/StateMixin.js';
12
14
  import ThemableMixin from '../mixins/ThemableMixin.js';
@@ -17,9 +19,9 @@ export default CustomElement
17
19
  .mixin(StateMixin)
18
20
  .mixin(RippleMixin)
19
21
  .mixin(AriaReflectorMixin)
22
+ .mixin(HyperlinkMixin)
20
23
  .set({
21
24
  _ariaRole: 'listitem',
22
- delegatesFocus: false,
23
25
  stateLayer: true,
24
26
  })
25
27
  .observe({
@@ -30,9 +32,9 @@ export default CustomElement
30
32
  src: 'string',
31
33
  alt: 'string',
32
34
  icon: 'string',
33
- href: 'string',
34
35
  iconInk: 'string',
35
36
  iconSrc: 'string',
37
+ iconVariation: 'string',
36
38
  checkbox: 'string',
37
39
  radio: 'string',
38
40
  selectionColor: { value: 'primary' },
@@ -42,7 +44,7 @@ export default CustomElement
42
44
  trailingIcon: 'string',
43
45
  trailingIconInk: 'string',
44
46
  trailingIconSrc: 'string',
45
- divider: 'boolean',
47
+ divider: 'string',
46
48
  video: 'boolean',
47
49
  lines: 'integer',
48
50
  _supportingSlotted: 'boolean',
@@ -67,33 +69,36 @@ export default CustomElement
67
69
  radioClass() {
68
70
  return this.radio || 'leading';
69
71
  },
72
+ computedIconVariation({ iconVariation }) {
73
+ return iconVariation ?? 'filled';
74
+ },
70
75
  })
71
76
  .html`
72
- <a id=anchor mdw-if={href} href={href} disabled={disabledState} aria-labelledby=content></a>
73
77
  <mdw-checkbox-icon id=checkbox mdw-if={checkbox} aria-hidden=true class={checkboxClass} color={selectionColor} disabled={disabledState} icon=check selected={selected}></mdw-checkbox-icon>
74
78
  <mdw-radio-icon id=radio mdw-if={radio} aria-hidden=true class={radioClass} disabled={disabledState} ink={selectionColor} selected={selected}></mdw-radio-icon>
75
- <mdw-box mdw-if={avatar} id=avatar color={avatarColor} type-style=title-medium src={AvatarSrc}
79
+ <mdw-box mdw-if={avatar} id=avatar color={avatarColor} x=center y=center type-style=title-medium src={AvatarSrc}
76
80
  aria-hidden=true>{avatar}</mdw-box>
77
- <mdw-icon mdw-if={icon} id=icon ink={iconInk} src={iconSrc} aria-hidden=true>{icon}</mdw-icon>
81
+ <mdw-icon mdw-if={icon} id=icon ink={iconInk} src={iconSrc} aria-hidden=true icon={icon} variation={computedIconVariation}></mdw-icon>
78
82
  <img id=img mdw-if={src} src={src} alt={alt} video={video} />
79
83
  <slot name=leading>{leading}</slot>
80
84
  <div id=content has-supporting={hasSupporting} lines={lines}>
81
85
  <slot id=slot></slot>
82
86
  <slot id=supporting name=supporting class=text lines={lines}>{supporting}</slot>
83
87
  </div>
84
- <mdw-icon mdw-if={trailingIcon} id=trailing-icon ink={trailingIconInk} src={trailingIconSrc} aria-hidden=true>{trailingIcon}</mdw-icon>
88
+ <mdw-icon mdw-if={trailingIcon} id=trailing-icon ink={trailingIconInk} src={trailingIconSrc} aria-hidden=true icon={trailingIcon}></mdw-icon>
85
89
  <slot id=trailing name=trailing role=note>{trailing}</slot>
86
- <mdw-divider mdw-if={divider} id=divider divder={divider}></mdw-divider>
90
+ <mdw-divider mdw-if={divider} id=divider divider={divider}></mdw-divider>
87
91
  `
92
+ .recompose(({ refs: { state, rippleContainer, anchor } }) => {
93
+ anchor.setAttribute('mdw-if', '{href}');
94
+ anchor.setAttribute('aria-labelledby', 'content');
95
+ anchor.append(
96
+ state,
97
+ rippleContainer,
98
+ );
99
+ state.setAttribute('state-disabled', 'focus hover');
100
+ })
88
101
  .on({
89
- composed() {
90
- const { state, rippleContainer, anchor } = this.refs;
91
- anchor.append(
92
- state,
93
- rippleContainer,
94
- );
95
- state.setAttribute('state-disabled', 'focus hover');
96
- },
97
102
  disabledStateChanged(oldValue, newValue) {
98
103
  this.updateAriaProperty('ariaDisabled', newValue ? 'true' : 'false');
99
104
  },
@@ -111,7 +116,7 @@ export default CustomElement
111
116
 
112
117
  border: none;
113
118
  padding-block: 8px;
114
- padding-inline: 16px 24px;
119
+ padding-inline: 16px;
115
120
 
116
121
  cursor: auto;
117
122
 
@@ -122,6 +127,20 @@ export default CustomElement
122
127
  text-decoration: none;
123
128
  }
124
129
 
130
+ :host(:where([color])) {
131
+ background-color: rgb(var(--mdw-bg));
132
+ color: rgb(var(--mdw-ink));
133
+ }
134
+
135
+ :host(:is([color="none"],[color="transparent"])) {
136
+ background-color: transparent;
137
+ color: inherit;
138
+ }
139
+
140
+ :host([ink]) {
141
+ color: rgb(var(--mdw-ink));
142
+ }
143
+
125
144
  :host([href]) {
126
145
  cursor: pointer;
127
146
  }
@@ -180,6 +199,7 @@ export default CustomElement
180
199
  #divider {
181
200
  position: absolute;
182
201
  inset-block-end: 0;
202
+ inset-inline: 0;
183
203
 
184
204
  display: block;
185
205
 
@@ -215,8 +235,8 @@ export default CustomElement
215
235
  #trailing {
216
236
  color: var(--mdw-color__on-surface-variant);
217
237
 
218
- font: var(--mdw-typescale__body-medium__font);
219
- letter-spacing: var(--mdw-typescale__body-medium__letter-spacing);
238
+ font: var(--mdw-typescale__label-small__font);
239
+ letter-spacing: var(--mdw-typescale__label-small__letter-spacing);
220
240
  }
221
241
 
222
242
  #slot, #supporting {
@@ -280,10 +300,6 @@ export default CustomElement
280
300
  }
281
301
 
282
302
  #avatar {
283
- display: flex;
284
- align-items: center;
285
- justify-content: center;
286
-
287
303
  block-size: 40px;
288
304
  inline-size: 40px;
289
305
 
@@ -1,17 +1,19 @@
1
1
  // https://www.w3.org/WAI/ARIA/apg/patterns/listbox/
2
2
 
3
+ import DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';
4
+
3
5
  import ListItem from './ListItem.js';
4
6
 
5
7
  // https://html.spec.whatwg.org/multipage/form-elements.html#htmloptionelement
6
8
 
7
- export default class ListOption extends ListItem
9
+ export default ListItem
8
10
  .extend()
11
+ .mixin(DelegatesFocusMixin)
9
12
  .setStatic({
10
13
  formAssociated: true,
11
14
  })
12
15
  .set({
13
16
  _ariaRole: 'none',
14
- delegatesFocus: true,
15
17
  _index: -1,
16
18
  _selectedDirty: false,
17
19
  isInteractive: true,
@@ -45,7 +47,7 @@ export default class ListOption extends ListItem
45
47
  })
46
48
  .define({
47
49
  index() { return this._index; },
48
- form() { return (this.parentElement)?.form; },
50
+ form() { return /** @type {HTMLInputElement} */ (this.parentElement)?.form; },
49
51
  label: {
50
52
  get() { return this._label ?? this.textContent; },
51
53
  /** @param {string} value */
@@ -56,7 +58,7 @@ export default class ListOption extends ListItem
56
58
  value: {
57
59
  get() { return this._value ?? this.textContent; },
58
60
  /** @param {string} value */
59
- set(value) { this._label = value; },
61
+ set(value) { this._value = value; },
60
62
  },
61
63
  })
62
64
  .methods({
@@ -69,38 +71,48 @@ export default class ListOption extends ListItem
69
71
  this.refs.anchor.focus(...options);
70
72
  },
71
73
  })
72
- .on({
73
- composed({ inline }) {
74
- const { anchor, state, content } = this.refs;
74
+ .expressions({
75
+ anchorAriaLabelledBy({ _label }) {
76
+ return _label ? null : 'content';
77
+ },
78
+ anchorAriaDescribedBy({ _label }) {
79
+ return _label ? 'content' : null;
80
+ },
81
+ computedIconVariation({ iconVariation, selected }) {
82
+ if (iconVariation != null) return iconVariation;
83
+ return selected ? 'filled' : null;
84
+ },
85
+ })
86
+ .recompose(({ inline, refs: { checkbox, radio, anchor, state, content } }) => {
87
+ // Form Associated elements cannot receive focus unless using delegatesFocus
88
+ // Workaround by redirecting focus to an inner element
89
+ // Reuse HTMLAnchorElement with no HREF
90
+ // Issues: Siblings (images) are not contained within tree
75
91
 
76
- // Form Associated elements cannot receive focus unless using delegatesFocus
77
- // Workaround by redirecting focus to an inner element
78
- // Reuse HTMLAnchorElement with no HREF
79
- // Issues: Siblings (images) are not contained within tree
92
+ anchor.setAttribute('disabled', '{disabledState}');
93
+ anchor.setAttribute('role', 'option');
94
+ anchor.setAttribute('aria-disabled', inline(({ disabledState }) => `${disabledState}`));
95
+ anchor.setAttribute('tabindex', '0');
96
+ anchor.setAttribute('aria-selected', inline(({ selected }) => `${selected}`));
97
+ anchor.setAttribute('selected', '{selected}');
98
+ anchor.setAttribute('aria-labelledby', '{anchorAriaLabelledBy}');
99
+ anchor.setAttribute('aria-describedby', '{anchorAriaDescribedBy}');
100
+ anchor.setAttribute('aria-label', '{_label}');
101
+ anchor.removeAttribute('href');
102
+ anchor.removeAttribute('mdw-if');
80
103
 
81
- anchor.setAttribute('disabled', '{disabledState}');
82
- anchor.setAttribute('role', 'option');
83
- anchor.setAttribute('aria-disabled', inline(({ disabledState }) => `${disabledState}`));
84
- anchor.setAttribute('tabindex', '0');
85
- anchor.setAttribute('aria-selected', inline(({ selected }) => `${selected}`));
86
- anchor.setAttribute('selected', '{selected}');
87
- anchor.removeAttribute('href');
88
- anchor.removeAttribute('mdw-if');
104
+ // eslint-disable-next-line no-shadow
105
+ checkbox.setAttribute('mdw-if', inline(({ checkbox, icon }) => !icon && checkbox));
89
106
 
90
- content.setAttribute('selected', '{selected}');
107
+ // eslint-disable-next-line no-shadow
108
+ radio.setAttribute('mdw-if', inline(({ radio, icon }) => !icon && radio));
91
109
 
92
- state.setAttribute('state-disabled', 'focus');
93
- },
94
- _labelChanged(previous, current) {
95
- const { anchor } = this.refs;
96
- if (current == null) {
97
- anchor.setAttribute('aria-labelledby', 'content');
98
- anchor.removeAttribute('aria-label');
99
- } else {
100
- anchor.setAttribute('aria-label', current);
101
- anchor.removeAttribute('aria-labelledby');
102
- }
103
- },
110
+ content.setAttribute('aria-hidden', 'true');
111
+ content.setAttribute('selected', '{selected}');
112
+
113
+ state.setAttribute('state-disabled', 'focus');
114
+ })
115
+ .on({
104
116
  selectedChanged(previous, current) {
105
117
  // Used by HTMLCollection
106
118
  this.classList.toggle('mdw-list-option__selected', current);
@@ -115,7 +127,11 @@ export default class ListOption extends ListItem
115
127
 
116
128
  z-index: 0;
117
129
  }
118
-
130
+
131
+ :host([hidden]) {
132
+ display: none;
133
+ }
134
+
119
135
  :host([href]) {
120
136
  cursor: pointer;
121
137
  }
@@ -128,6 +144,7 @@ export default class ListOption extends ListItem
128
144
  #content {
129
145
  -webkit-user-select: none;
130
146
  user-select: none;
147
+ pointer-events: none;
131
148
  }
132
149
 
133
150
  #content[selected] {
@@ -142,35 +159,35 @@ export default class ListOption extends ListItem
142
159
  background-color: rgb(var(--mdw-bg));
143
160
  color: rgb(var(--mdw-ink));
144
161
  }
145
- ` {
146
- static { this.autoRegister('mdw-list-option'); }
147
-
148
- /**
149
- * @param {string} [text]
150
- * @param {string} [value]
151
- * @param {boolean} [defaultSelected]
152
- * @param {boolean} [selected]
153
- */
154
- constructor(text, value, defaultSelected, selected) {
155
- super();
156
- if (text !== undefined) {
157
- this.text = text;
158
- }
159
- if (value !== undefined) {
160
- this._value = value;
161
- }
162
- if (defaultSelected !== undefined) {
163
- this.defaultSelected = defaultSelected;
164
- }
165
- if (selected !== undefined) {
166
- this._selected = selected;
162
+ `
163
+ .extend((BaseClass) => class extends BaseClass {
164
+ /**
165
+ * @param {string} [text]
166
+ * @param {string} [value]
167
+ * @param {boolean} [defaultSelected]
168
+ * @param {boolean} [selected]
169
+ */
170
+ constructor(text, value, defaultSelected, selected) {
171
+ super();
172
+ if (text !== undefined) {
173
+ this.text = text;
174
+ }
175
+ if (value !== undefined) {
176
+ this._value = value;
177
+ }
178
+ if (defaultSelected !== undefined) {
179
+ this.defaultSelected = defaultSelected;
180
+ }
181
+ if (selected !== undefined) {
182
+ this._selected = selected;
183
+ }
167
184
  }
168
- }
169
185
 
170
- connectedCallback() {
171
- super.connectedCallback();
172
- if (!this.hasAttribute('tabindex')) {
173
- this.tabIndex = 0;
186
+ connectedCallback() {
187
+ super.connectedCallback();
188
+ if (!this.hasAttribute('tabindex')) {
189
+ this.tabIndex = 0;
190
+ }
174
191
  }
175
- }
176
- }
192
+ })
193
+ .autoRegister('mdw-list-option');
@@ -1,4 +1,5 @@
1
1
  import { constructHTMLOptionsCollectionProxy } from '../dom/HTMLOptionsCollectionProxy.js';
2
+ import DelegatesFocusMixin from '../mixins/DelegatesFocusMixin.js';
2
3
  import FormAssociatedMixin from '../mixins/FormAssociatedMixin.js';
3
4
  import KeyboardNavMixin from '../mixins/KeyboardNavMixin.js';
4
5
  import StateMixin from '../mixins/StateMixin.js';
@@ -6,25 +7,25 @@ import StateMixin from '../mixins/StateMixin.js';
6
7
  import List from './List.js';
7
8
  import ListOption from './ListOption.js';
8
9
 
9
- /** @implements {HTMLSelectElement} */
10
- // @ts-expect-error Can't implement index signatures (use `item()`)
10
+ /** -implements {HTMLSelectElement} */
11
11
  export default List
12
12
  .extend()
13
13
  .mixin(StateMixin)
14
14
  .mixin(FormAssociatedMixin)
15
15
  .mixin(KeyboardNavMixin)
16
+ .mixin(DelegatesFocusMixin)
16
17
  .observe({
17
18
  multiple: 'boolean',
18
19
  size: { type: 'integer', empty: 0 },
19
20
  })
20
21
  .set({
21
22
  _ariaRole: 'listbox',
22
- delegatesFocus: true,
23
- /** @type {HTMLCollectionOf<ListOption> & HTMLOptionsCollection} */
23
+ /** @type {HTMLCollectionOf<InstanceType<ListOption>> & HTMLOptionsCollection} */
24
24
  _optionsCollection: null,
25
- /** @type {HTMLCollectionOf<ListOption>} */
25
+ /** @type {HTMLCollectionOf<InstanceType<ListOption>>} */
26
26
  _selectedOptionsCollection: null,
27
27
  _handlingSelectedness: false,
28
+ _handleFormReset: true,
28
29
  })
29
30
  .define({
30
31
  options() {
@@ -39,17 +40,17 @@ export default List
39
40
  return this._optionsCollection;
40
41
  },
41
42
 
42
- /** @return {HTMLCollectionOf<ListOption>} */
43
+ /** @return {HTMLCollectionOf<InstanceType<ListOption>>} */
43
44
  selectedOptions() {
44
45
  // eslint-disable-next-line no-return-assign
45
46
  return (this._selectedOptionsCollection
46
47
  ??= (
47
- /** @type {HTMLCollectionOf<ListOption>} */
48
+ /** @type {HTMLCollectionOf<InstanceType<ListOption>>} */
48
49
  (this.getElementsByClassName('mdw-list-option__selected')))
49
50
  );
50
51
  },
51
52
 
52
- type() { return 'select'; },
53
+ type() { return this.multiple ? 'select-multiple' : 'select-one'; },
53
54
 
54
55
  kbdNavQuery() { return ListOption.elementName; },
55
56
 
@@ -66,9 +67,11 @@ export default List
66
67
  },
67
68
  set(value) {
68
69
  const itemToSelect = this.options[value];
70
+ this._handlingSelectedness = true;
69
71
  for (const option of this.options) {
70
72
  option.selected = (option === itemToSelect);
71
73
  }
74
+ this._handlingSelectedness = false;
72
75
  this._value = this.value;
73
76
  },
74
77
  },
@@ -80,11 +83,13 @@ export default List
80
83
  set(v) {
81
84
  let newValue = '';
82
85
  const vString = `${v}`;
86
+ this._handlingSelectedness = true;
83
87
  for (const option of this.options) {
84
88
  if ((option.selected = (option.value === vString))) {
85
89
  newValue = vString;
86
90
  }
87
91
  }
92
+ this._handlingSelectedness = false;
88
93
  this._value = newValue;
89
94
  },
90
95
  },
@@ -99,7 +104,9 @@ export default List
99
104
  this.updateAriaProperty('ariaMultiSelectable', newValue ? 'true' : 'false');
100
105
  },
101
106
  _formResetChanged(oldValue, newValue) {
102
- // TODO: Unset dirty
107
+ if (!newValue) return;
108
+ if (!this._handleFormReset) return;
109
+ this.value = this.defaultValue;
103
110
  },
104
111
  connected() {
105
112
  if (!this.hasAttribute('tabindex')) {
@@ -143,6 +150,7 @@ export default List
143
150
  onListboxClick(event) {
144
151
  const target = event.target;
145
152
  if (!(target instanceof ListOption)) return;
153
+ event.stopImmediatePropagation();
146
154
  event.stopPropagation();
147
155
  if (target.disabledState) return;
148
156
 
@@ -170,6 +178,7 @@ export default List
170
178
 
171
179
  this._value = this.value;
172
180
  this._handlingSelectedness = false;
181
+ this._updateFormAssociatedValue();
173
182
 
174
183
  if (sendUpdateNotifications) {
175
184
  this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
@@ -194,7 +203,7 @@ export default List
194
203
  if (this.multiple) return;
195
204
  if (this._handlingSelectedness) return;
196
205
 
197
- const target = /** @type {ListOption} */ (/** @type {unknown} */ (event.target));
206
+ const target = /** @type {InstanceType<ListOption>} */ (/** @type {unknown} */ (event.target));
198
207
  if (target.selected) return;
199
208
  this._handlingSelectedness = true;
200
209