@m3e/core 1.0.0-rc.1

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 (357) hide show
  1. package/LICENSE +22 -0
  2. package/NOTICE.md +8 -0
  3. package/README.md +59 -0
  4. package/cem.config.mjs +16 -0
  5. package/demo/index.html +58 -0
  6. package/dist/a11y.js +1431 -0
  7. package/dist/a11y.js.map +1 -0
  8. package/dist/a11y.min.js +87 -0
  9. package/dist/a11y.min.js.map +1 -0
  10. package/dist/anchoring.js +1748 -0
  11. package/dist/anchoring.js.map +1 -0
  12. package/dist/anchoring.min.js +7 -0
  13. package/dist/anchoring.min.js.map +1 -0
  14. package/dist/bidi.js +106 -0
  15. package/dist/bidi.js.map +1 -0
  16. package/dist/bidi.min.js +16 -0
  17. package/dist/bidi.min.js.map +1 -0
  18. package/dist/css-custom-data.json +257 -0
  19. package/dist/custom-elements.json +13504 -0
  20. package/dist/html-custom-data.json +199 -0
  21. package/dist/index.js +4342 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/index.min.js +520 -0
  24. package/dist/index.min.js.map +1 -0
  25. package/dist/layout.js +64 -0
  26. package/dist/layout.js.map +1 -0
  27. package/dist/layout.min.js +15 -0
  28. package/dist/layout.min.js.map +1 -0
  29. package/dist/platform.js +56 -0
  30. package/dist/platform.js.map +1 -0
  31. package/dist/platform.min.js +15 -0
  32. package/dist/platform.min.js.map +1 -0
  33. package/dist/src/a11y/AriaDescriber.d.ts +31 -0
  34. package/dist/src/a11y/AriaDescriber.d.ts.map +1 -0
  35. package/dist/src/a11y/FocusTrapElement.d.ts +25 -0
  36. package/dist/src/a11y/FocusTrapElement.d.ts.map +1 -0
  37. package/dist/src/a11y/InteractivityChecker.d.ts +22 -0
  38. package/dist/src/a11y/InteractivityChecker.d.ts.map +1 -0
  39. package/dist/src/a11y/LiveAnnouncer.d.ts +56 -0
  40. package/dist/src/a11y/LiveAnnouncer.d.ts.map +1 -0
  41. package/dist/src/a11y/aria-reference.d.ts +30 -0
  42. package/dist/src/a11y/aria-reference.d.ts.map +1 -0
  43. package/dist/src/a11y/index.d.ts +8 -0
  44. package/dist/src/a11y/index.d.ts.map +1 -0
  45. package/dist/src/a11y/keycodes/KeyCode.d.ts +118 -0
  46. package/dist/src/a11y/keycodes/KeyCode.d.ts.map +1 -0
  47. package/dist/src/a11y/keycodes/ModifierKeys.d.ts +5 -0
  48. package/dist/src/a11y/keycodes/ModifierKeys.d.ts.map +1 -0
  49. package/dist/src/a11y/keycodes/getKeyCode.d.ts +7 -0
  50. package/dist/src/a11y/keycodes/getKeyCode.d.ts.map +1 -0
  51. package/dist/src/a11y/keycodes/hasModifierKey.d.ts +9 -0
  52. package/dist/src/a11y/keycodes/hasModifierKey.d.ts.map +1 -0
  53. package/dist/src/a11y/keycodes/index.d.ts +6 -0
  54. package/dist/src/a11y/keycodes/index.d.ts.map +1 -0
  55. package/dist/src/a11y/keycodes/isModifierAllowed.d.ts +9 -0
  56. package/dist/src/a11y/keycodes/isModifierAllowed.d.ts.map +1 -0
  57. package/dist/src/a11y/list-key/FocusKeyManager.d.ts +17 -0
  58. package/dist/src/a11y/list-key/FocusKeyManager.d.ts.map +1 -0
  59. package/dist/src/a11y/list-key/ListKeyManager.d.ts +114 -0
  60. package/dist/src/a11y/list-key/ListKeyManager.d.ts.map +1 -0
  61. package/dist/src/a11y/list-key/ListManager.d.ts +37 -0
  62. package/dist/src/a11y/list-key/ListManager.d.ts.map +1 -0
  63. package/dist/src/a11y/list-key/RadioKeyManager.d.ts +20 -0
  64. package/dist/src/a11y/list-key/RadioKeyManager.d.ts.map +1 -0
  65. package/dist/src/a11y/list-key/RovingTabIndexManager.d.ts +22 -0
  66. package/dist/src/a11y/list-key/RovingTabIndexManager.d.ts.map +1 -0
  67. package/dist/src/a11y/list-key/SelectionManager.d.ts +46 -0
  68. package/dist/src/a11y/list-key/SelectionManager.d.ts.map +1 -0
  69. package/dist/src/a11y/list-key/Typeahead.d.ts +64 -0
  70. package/dist/src/a11y/list-key/Typeahead.d.ts.map +1 -0
  71. package/dist/src/a11y/list-key/index.d.ts +8 -0
  72. package/dist/src/a11y/list-key/index.d.ts.map +1 -0
  73. package/dist/src/a11y/visuallyHide.d.ts +6 -0
  74. package/dist/src/a11y/visuallyHide.d.ts.map +1 -0
  75. package/dist/src/anchoring/AnchorOptions.d.ts +15 -0
  76. package/dist/src/anchoring/AnchorOptions.d.ts.map +1 -0
  77. package/dist/src/anchoring/AnchorPosition.d.ts +3 -0
  78. package/dist/src/anchoring/AnchorPosition.d.ts.map +1 -0
  79. package/dist/src/anchoring/index.d.ts +4 -0
  80. package/dist/src/anchoring/index.d.ts.map +1 -0
  81. package/dist/src/anchoring/positionAnchor.d.ts +12 -0
  82. package/dist/src/anchoring/positionAnchor.d.ts.map +1 -0
  83. package/dist/src/bidi/Directionality.d.ts +27 -0
  84. package/dist/src/bidi/Directionality.d.ts.map +1 -0
  85. package/dist/src/bidi/index.d.ts +2 -0
  86. package/dist/src/bidi/index.d.ts.map +1 -0
  87. package/dist/src/index.d.ts +2 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/layout/Breakpoint.d.ts +26 -0
  90. package/dist/src/layout/Breakpoint.d.ts.map +1 -0
  91. package/dist/src/layout/BreakpointObserver.d.ts +18 -0
  92. package/dist/src/layout/BreakpointObserver.d.ts.map +1 -0
  93. package/dist/src/layout/index.d.ts +3 -0
  94. package/dist/src/layout/index.d.ts.map +1 -0
  95. package/dist/src/platform/Platform.d.ts +34 -0
  96. package/dist/src/platform/Platform.d.ts.map +1 -0
  97. package/dist/src/platform/index.d.ts +2 -0
  98. package/dist/src/platform/index.d.ts.map +1 -0
  99. package/dist/src/shared/controllers/FocusController.d.ts +30 -0
  100. package/dist/src/shared/controllers/FocusController.d.ts.map +1 -0
  101. package/dist/src/shared/controllers/HoverController.d.ts +40 -0
  102. package/dist/src/shared/controllers/HoverController.d.ts.map +1 -0
  103. package/dist/src/shared/controllers/IntersectionController.d.ts +40 -0
  104. package/dist/src/shared/controllers/IntersectionController.d.ts.map +1 -0
  105. package/dist/src/shared/controllers/LongPressController.d.ts +32 -0
  106. package/dist/src/shared/controllers/LongPressController.d.ts.map +1 -0
  107. package/dist/src/shared/controllers/MonitorControllerBase.d.ts +62 -0
  108. package/dist/src/shared/controllers/MonitorControllerBase.d.ts.map +1 -0
  109. package/dist/src/shared/controllers/MutationController.d.ts +37 -0
  110. package/dist/src/shared/controllers/MutationController.d.ts.map +1 -0
  111. package/dist/src/shared/controllers/PressedController.d.ts +45 -0
  112. package/dist/src/shared/controllers/PressedController.d.ts.map +1 -0
  113. package/dist/src/shared/controllers/ResizeController.d.ts +40 -0
  114. package/dist/src/shared/controllers/ResizeController.d.ts.map +1 -0
  115. package/dist/src/shared/controllers/ScrollController.d.ts +34 -0
  116. package/dist/src/shared/controllers/ScrollController.d.ts.map +1 -0
  117. package/dist/src/shared/controllers/index.d.ts +9 -0
  118. package/dist/src/shared/controllers/index.d.ts.map +1 -0
  119. package/dist/src/shared/decorators/debounce.d.ts +7 -0
  120. package/dist/src/shared/decorators/debounce.d.ts.map +1 -0
  121. package/dist/src/shared/decorators/index.d.ts +2 -0
  122. package/dist/src/shared/decorators/index.d.ts.map +1 -0
  123. package/dist/src/shared/directives/index.d.ts +2 -0
  124. package/dist/src/shared/directives/index.d.ts.map +1 -0
  125. package/dist/src/shared/directives/safeStyleMap.d.ts +44 -0
  126. package/dist/src/shared/directives/safeStyleMap.d.ts.map +1 -0
  127. package/dist/src/shared/index.d.ts +8 -0
  128. package/dist/src/shared/index.d.ts.map +1 -0
  129. package/dist/src/shared/mixins/AttachInternals.d.ts +24 -0
  130. package/dist/src/shared/mixins/AttachInternals.d.ts.map +1 -0
  131. package/dist/src/shared/mixins/Checked.d.ts +24 -0
  132. package/dist/src/shared/mixins/Checked.d.ts.map +1 -0
  133. package/dist/src/shared/mixins/CheckedIndeterminate.d.ts +25 -0
  134. package/dist/src/shared/mixins/CheckedIndeterminate.d.ts.map +1 -0
  135. package/dist/src/shared/mixins/CheckedOrSelected.d.ts +23 -0
  136. package/dist/src/shared/mixins/CheckedOrSelected.d.ts.map +1 -0
  137. package/dist/src/shared/mixins/ConstraintValidation.d.ts +48 -0
  138. package/dist/src/shared/mixins/ConstraintValidation.d.ts.map +1 -0
  139. package/dist/src/shared/mixins/Constructor.d.ts +3 -0
  140. package/dist/src/shared/mixins/Constructor.d.ts.map +1 -0
  141. package/dist/src/shared/mixins/Dirty.d.ts +27 -0
  142. package/dist/src/shared/mixins/Dirty.d.ts.map +1 -0
  143. package/dist/src/shared/mixins/Disabled.d.ts +25 -0
  144. package/dist/src/shared/mixins/Disabled.d.ts.map +1 -0
  145. package/dist/src/shared/mixins/DisabledInteractive.d.ts +25 -0
  146. package/dist/src/shared/mixins/DisabledInteractive.d.ts.map +1 -0
  147. package/dist/src/shared/mixins/EventAttribute.d.ts +11 -0
  148. package/dist/src/shared/mixins/EventAttribute.d.ts.map +1 -0
  149. package/dist/src/shared/mixins/Focusable.d.ts +11 -0
  150. package/dist/src/shared/mixins/Focusable.d.ts.map +1 -0
  151. package/dist/src/shared/mixins/FormAssociated.d.ts +34 -0
  152. package/dist/src/shared/mixins/FormAssociated.d.ts.map +1 -0
  153. package/dist/src/shared/mixins/FormSubmitter.d.ts +31 -0
  154. package/dist/src/shared/mixins/FormSubmitter.d.ts.map +1 -0
  155. package/dist/src/shared/mixins/HtmlFor.d.ts +30 -0
  156. package/dist/src/shared/mixins/HtmlFor.d.ts.map +1 -0
  157. package/dist/src/shared/mixins/KeyboardClick.d.ts +11 -0
  158. package/dist/src/shared/mixins/KeyboardClick.d.ts.map +1 -0
  159. package/dist/src/shared/mixins/Labelled.d.ts +22 -0
  160. package/dist/src/shared/mixins/Labelled.d.ts.map +1 -0
  161. package/dist/src/shared/mixins/LinkButton.d.ts +36 -0
  162. package/dist/src/shared/mixins/LinkButton.d.ts.map +1 -0
  163. package/dist/src/shared/mixins/ReadOnly.d.ts +25 -0
  164. package/dist/src/shared/mixins/ReadOnly.d.ts.map +1 -0
  165. package/dist/src/shared/mixins/Required.d.ts +26 -0
  166. package/dist/src/shared/mixins/Required.d.ts.map +1 -0
  167. package/dist/src/shared/mixins/RequiredConstraintValidation.d.ts +21 -0
  168. package/dist/src/shared/mixins/RequiredConstraintValidation.d.ts.map +1 -0
  169. package/dist/src/shared/mixins/Role.d.ts +13 -0
  170. package/dist/src/shared/mixins/Role.d.ts.map +1 -0
  171. package/dist/src/shared/mixins/Selected.d.ts +24 -0
  172. package/dist/src/shared/mixins/Selected.d.ts.map +1 -0
  173. package/dist/src/shared/mixins/Touched.d.ts +27 -0
  174. package/dist/src/shared/mixins/Touched.d.ts.map +1 -0
  175. package/dist/src/shared/mixins/Vertical.d.ts +24 -0
  176. package/dist/src/shared/mixins/Vertical.d.ts.map +1 -0
  177. package/dist/src/shared/mixins/hasKeys.d.ts +9 -0
  178. package/dist/src/shared/mixins/hasKeys.d.ts.map +1 -0
  179. package/dist/src/shared/mixins/index.d.ts +25 -0
  180. package/dist/src/shared/mixins/index.d.ts.map +1 -0
  181. package/dist/src/shared/primitives/CollapsibleElement.d.ts +58 -0
  182. package/dist/src/shared/primitives/CollapsibleElement.d.ts.map +1 -0
  183. package/dist/src/shared/primitives/ElevationElement.d.ts +88 -0
  184. package/dist/src/shared/primitives/ElevationElement.d.ts.map +1 -0
  185. package/dist/src/shared/primitives/ElevationLevel.d.ts +3 -0
  186. package/dist/src/shared/primitives/ElevationLevel.d.ts.map +1 -0
  187. package/dist/src/shared/primitives/ElevationToken.d.ts +15 -0
  188. package/dist/src/shared/primitives/ElevationToken.d.ts.map +1 -0
  189. package/dist/src/shared/primitives/FocusRingElement.d.ts +78 -0
  190. package/dist/src/shared/primitives/FocusRingElement.d.ts.map +1 -0
  191. package/dist/src/shared/primitives/FocusRingToken.d.ts +17 -0
  192. package/dist/src/shared/primitives/FocusRingToken.d.ts.map +1 -0
  193. package/dist/src/shared/primitives/PseudoCheckboxElement.d.ts +50 -0
  194. package/dist/src/shared/primitives/PseudoCheckboxElement.d.ts.map +1 -0
  195. package/dist/src/shared/primitives/PseudoRadioElement.d.ts +41 -0
  196. package/dist/src/shared/primitives/PseudoRadioElement.d.ts.map +1 -0
  197. package/dist/src/shared/primitives/RippleElement.d.ts +110 -0
  198. package/dist/src/shared/primitives/RippleElement.d.ts.map +1 -0
  199. package/dist/src/shared/primitives/RippleToken.d.ts +12 -0
  200. package/dist/src/shared/primitives/RippleToken.d.ts.map +1 -0
  201. package/dist/src/shared/primitives/ScrollContainerElement.d.ts +64 -0
  202. package/dist/src/shared/primitives/ScrollContainerElement.d.ts.map +1 -0
  203. package/dist/src/shared/primitives/ScrollDividers.d.ts +3 -0
  204. package/dist/src/shared/primitives/ScrollDividers.d.ts.map +1 -0
  205. package/dist/src/shared/primitives/SlideElement.d.ts +48 -0
  206. package/dist/src/shared/primitives/SlideElement.d.ts.map +1 -0
  207. package/dist/src/shared/primitives/StateLayerElement.d.ts +77 -0
  208. package/dist/src/shared/primitives/StateLayerElement.d.ts.map +1 -0
  209. package/dist/src/shared/primitives/StateLayerToken.d.ts +13 -0
  210. package/dist/src/shared/primitives/StateLayerToken.d.ts.map +1 -0
  211. package/dist/src/shared/primitives/TextOverflowElement.d.ts +39 -0
  212. package/dist/src/shared/primitives/TextOverflowElement.d.ts.map +1 -0
  213. package/dist/src/shared/primitives/index.d.ts +13 -0
  214. package/dist/src/shared/primitives/index.d.ts.map +1 -0
  215. package/dist/src/shared/tokens/ColorToken.d.ts +96 -0
  216. package/dist/src/shared/tokens/ColorToken.d.ts.map +1 -0
  217. package/dist/src/shared/tokens/DensityToken.d.ts +15 -0
  218. package/dist/src/shared/tokens/DensityToken.d.ts.map +1 -0
  219. package/dist/src/shared/tokens/DesignToken.d.ts +366 -0
  220. package/dist/src/shared/tokens/DesignToken.d.ts.map +1 -0
  221. package/dist/src/shared/tokens/ElevationToken.d.ts +16 -0
  222. package/dist/src/shared/tokens/ElevationToken.d.ts.map +1 -0
  223. package/dist/src/shared/tokens/MotionToken.d.ts +69 -0
  224. package/dist/src/shared/tokens/MotionToken.d.ts.map +1 -0
  225. package/dist/src/shared/tokens/ScrollbarToken.d.ts +10 -0
  226. package/dist/src/shared/tokens/ScrollbarToken.d.ts.map +1 -0
  227. package/dist/src/shared/tokens/ShapeToken.d.ts +79 -0
  228. package/dist/src/shared/tokens/ShapeToken.d.ts.map +1 -0
  229. package/dist/src/shared/tokens/StateToken.d.ts +10 -0
  230. package/dist/src/shared/tokens/StateToken.d.ts.map +1 -0
  231. package/dist/src/shared/tokens/TypescaleToken.d.ts +220 -0
  232. package/dist/src/shared/tokens/TypescaleToken.d.ts.map +1 -0
  233. package/dist/src/shared/tokens/index.d.ts +2 -0
  234. package/dist/src/shared/tokens/index.d.ts.map +1 -0
  235. package/dist/src/shared/utils/getTextContent.d.ts +8 -0
  236. package/dist/src/shared/utils/getTextContent.d.ts.map +1 -0
  237. package/dist/src/shared/utils/guid.d.ts +6 -0
  238. package/dist/src/shared/utils/guid.d.ts.map +1 -0
  239. package/dist/src/shared/utils/hasAssignedNodes.d.ts +7 -0
  240. package/dist/src/shared/utils/hasAssignedNodes.d.ts.map +1 -0
  241. package/dist/src/shared/utils/index.d.ts +6 -0
  242. package/dist/src/shared/utils/index.d.ts.map +1 -0
  243. package/dist/src/shared/utils/prefersReducedMotion.d.ts +6 -0
  244. package/dist/src/shared/utils/prefersReducedMotion.d.ts.map +1 -0
  245. package/dist/src/shared/utils/scrollIntoViewIfNeeded.d.ts +8 -0
  246. package/dist/src/shared/utils/scrollIntoViewIfNeeded.d.ts.map +1 -0
  247. package/eslint.config.mjs +21 -0
  248. package/package.json +87 -0
  249. package/rollup.config.js +132 -0
  250. package/src/a11y/AriaDescriber.ts +130 -0
  251. package/src/a11y/FocusTrapElement.ts +136 -0
  252. package/src/a11y/InteractivityChecker.ts +62 -0
  253. package/src/a11y/LiveAnnouncer.ts +143 -0
  254. package/src/a11y/aria-reference.ts +51 -0
  255. package/src/a11y/index.ts +8 -0
  256. package/src/a11y/keycodes/KeyCode.ts +128 -0
  257. package/src/a11y/keycodes/ModifierKeys.ts +5 -0
  258. package/src/a11y/keycodes/getKeyCode.ts +8 -0
  259. package/src/a11y/keycodes/hasModifierKey.ts +11 -0
  260. package/src/a11y/keycodes/index.ts +5 -0
  261. package/src/a11y/keycodes/isModifierAllowed.ts +12 -0
  262. package/src/a11y/list-key/FocusKeyManager.ts +25 -0
  263. package/src/a11y/list-key/ListKeyManager.ts +350 -0
  264. package/src/a11y/list-key/ListManager.ts +66 -0
  265. package/src/a11y/list-key/RadioKeyManager.ts +49 -0
  266. package/src/a11y/list-key/RovingTabIndexManager.ts +56 -0
  267. package/src/a11y/list-key/SelectionManager.ts +132 -0
  268. package/src/a11y/list-key/Typeahead.ts +131 -0
  269. package/src/a11y/list-key/index.ts +7 -0
  270. package/src/a11y/visuallyHide.ts +18 -0
  271. package/src/anchoring/AnchorOptions.ts +19 -0
  272. package/src/anchoring/AnchorPosition.ts +14 -0
  273. package/src/anchoring/index.ts +3 -0
  274. package/src/anchoring/positionAnchor.ts +53 -0
  275. package/src/bidi/Directionality.ts +85 -0
  276. package/src/bidi/index.ts +1 -0
  277. package/src/index.ts +1 -0
  278. package/src/layout/Breakpoint.ts +26 -0
  279. package/src/layout/BreakpointObserver.ts +44 -0
  280. package/src/layout/index.ts +2 -0
  281. package/src/platform/Platform.ts +67 -0
  282. package/src/platform/index.ts +1 -0
  283. package/src/shared/controllers/FocusController.ts +60 -0
  284. package/src/shared/controllers/HoverController.ts +140 -0
  285. package/src/shared/controllers/IntersectionController.ts +81 -0
  286. package/src/shared/controllers/LongPressController.ts +87 -0
  287. package/src/shared/controllers/MonitorControllerBase.ts +99 -0
  288. package/src/shared/controllers/MutationController.ts +89 -0
  289. package/src/shared/controllers/PressedController.ts +137 -0
  290. package/src/shared/controllers/ResizeController.ts +83 -0
  291. package/src/shared/controllers/ScrollController.ts +100 -0
  292. package/src/shared/controllers/index.ts +8 -0
  293. package/src/shared/decorators/debounce.ts +19 -0
  294. package/src/shared/decorators/index.ts +1 -0
  295. package/src/shared/directives/index.ts +1 -0
  296. package/src/shared/directives/safeStyleMap.ts +108 -0
  297. package/src/shared/index.ts +7 -0
  298. package/src/shared/mixins/AttachInternals.ts +48 -0
  299. package/src/shared/mixins/Checked.ts +50 -0
  300. package/src/shared/mixins/CheckedIndeterminate.ts +47 -0
  301. package/src/shared/mixins/CheckedOrSelected.ts +36 -0
  302. package/src/shared/mixins/ConstraintValidation.ts +213 -0
  303. package/src/shared/mixins/Constructor.ts +2 -0
  304. package/src/shared/mixins/Dirty.ts +71 -0
  305. package/src/shared/mixins/Disabled.ts +49 -0
  306. package/src/shared/mixins/DisabledInteractive.ts +78 -0
  307. package/src/shared/mixins/EventAttribute.ts +25 -0
  308. package/src/shared/mixins/Focusable.ts +52 -0
  309. package/src/shared/mixins/FormAssociated.ts +152 -0
  310. package/src/shared/mixins/FormSubmitter.ts +123 -0
  311. package/src/shared/mixins/HtmlFor.ts +89 -0
  312. package/src/shared/mixins/KeyboardClick.ts +46 -0
  313. package/src/shared/mixins/Labelled.ts +88 -0
  314. package/src/shared/mixins/LinkButton.ts +169 -0
  315. package/src/shared/mixins/ReadOnly.ts +48 -0
  316. package/src/shared/mixins/Required.ts +50 -0
  317. package/src/shared/mixins/RequiredConstraintValidation.ts +45 -0
  318. package/src/shared/mixins/Role.ts +134 -0
  319. package/src/shared/mixins/Selected.ts +50 -0
  320. package/src/shared/mixins/Touched.ts +71 -0
  321. package/src/shared/mixins/Vertical.ts +44 -0
  322. package/src/shared/mixins/hasKeys.ts +10 -0
  323. package/src/shared/mixins/index.ts +24 -0
  324. package/src/shared/primitives/CollapsibleElement.ts +227 -0
  325. package/src/shared/primitives/ElevationElement.ts +254 -0
  326. package/src/shared/primitives/ElevationLevel.ts +2 -0
  327. package/src/shared/primitives/ElevationToken.ts +18 -0
  328. package/src/shared/primitives/FocusRingElement.ts +199 -0
  329. package/src/shared/primitives/FocusRingToken.ts +24 -0
  330. package/src/shared/primitives/PseudoCheckboxElement.ts +116 -0
  331. package/src/shared/primitives/PseudoRadioElement.ts +83 -0
  332. package/src/shared/primitives/RippleElement.ts +289 -0
  333. package/src/shared/primitives/RippleToken.ts +15 -0
  334. package/src/shared/primitives/ScrollContainerElement.ts +151 -0
  335. package/src/shared/primitives/ScrollDividers.ts +2 -0
  336. package/src/shared/primitives/SlideElement.ts +128 -0
  337. package/src/shared/primitives/StateLayerElement.ts +191 -0
  338. package/src/shared/primitives/StateLayerToken.ts +16 -0
  339. package/src/shared/primitives/TextOverflowElement.ts +60 -0
  340. package/src/shared/primitives/index.ts +12 -0
  341. package/src/shared/tokens/ColorToken.ts +142 -0
  342. package/src/shared/tokens/DensityToken.ts +23 -0
  343. package/src/shared/tokens/DesignToken.ts +35 -0
  344. package/src/shared/tokens/ElevationToken.ts +115 -0
  345. package/src/shared/tokens/MotionToken.ts +107 -0
  346. package/src/shared/tokens/ScrollbarToken.ts +13 -0
  347. package/src/shared/tokens/ShapeToken.ts +138 -0
  348. package/src/shared/tokens/StateToken.ts +13 -0
  349. package/src/shared/tokens/TypescaleToken.ts +230 -0
  350. package/src/shared/tokens/index.ts +1 -0
  351. package/src/shared/utils/getTextContent.ts +31 -0
  352. package/src/shared/utils/guid.ts +11 -0
  353. package/src/shared/utils/hasAssignedNodes.ts +8 -0
  354. package/src/shared/utils/index.ts +5 -0
  355. package/src/shared/utils/prefersReducedMotion.ts +9 -0
  356. package/src/shared/utils/scrollIntoViewIfNeeded.ts +18 -0
  357. package/tsconfig.json +9 -0
@@ -0,0 +1,220 @@
1
+ /** Design tokens that control typescale. */
2
+ export declare const TypescaleToken: {
3
+ /** Standard typescale variant. */
4
+ readonly standard: {
5
+ /** Short, important text or numerals. */
6
+ readonly display: {
7
+ readonly large: {
8
+ readonly fontSize: import("lit").CSSResult;
9
+ readonly fontWeight: import("lit").CSSResult;
10
+ readonly lineHeight: import("lit").CSSResult;
11
+ readonly tracking: import("lit").CSSResult;
12
+ };
13
+ readonly medium: {
14
+ readonly fontSize: import("lit").CSSResult;
15
+ readonly fontWeight: import("lit").CSSResult;
16
+ readonly lineHeight: import("lit").CSSResult;
17
+ readonly tracking: import("lit").CSSResult;
18
+ };
19
+ readonly small: {
20
+ readonly fontSize: import("lit").CSSResult;
21
+ readonly fontWeight: import("lit").CSSResult;
22
+ readonly lineHeight: import("lit").CSSResult;
23
+ readonly tracking: import("lit").CSSResult;
24
+ };
25
+ };
26
+ /** Short, high-emphasis text on smaller screens. */
27
+ readonly headline: {
28
+ readonly large: {
29
+ readonly fontSize: import("lit").CSSResult;
30
+ readonly fontWeight: import("lit").CSSResult;
31
+ readonly lineHeight: import("lit").CSSResult;
32
+ readonly tracking: import("lit").CSSResult;
33
+ };
34
+ readonly medium: {
35
+ readonly fontSize: import("lit").CSSResult;
36
+ readonly fontWeight: import("lit").CSSResult;
37
+ readonly lineHeight: import("lit").CSSResult;
38
+ readonly tracking: import("lit").CSSResult;
39
+ };
40
+ readonly small: {
41
+ readonly fontSize: import("lit").CSSResult;
42
+ readonly fontWeight: import("lit").CSSResult;
43
+ readonly lineHeight: import("lit").CSSResult;
44
+ readonly tracking: import("lit").CSSResult;
45
+ };
46
+ };
47
+ /** Medium-emphasis text that remains relatively short. */
48
+ readonly title: {
49
+ readonly large: {
50
+ readonly fontSize: import("lit").CSSResult;
51
+ readonly fontWeight: import("lit").CSSResult;
52
+ readonly lineHeight: import("lit").CSSResult;
53
+ readonly tracking: import("lit").CSSResult;
54
+ };
55
+ readonly medium: {
56
+ readonly fontSize: import("lit").CSSResult;
57
+ readonly fontWeight: import("lit").CSSResult;
58
+ readonly lineHeight: import("lit").CSSResult;
59
+ readonly tracking: import("lit").CSSResult;
60
+ };
61
+ readonly small: {
62
+ readonly fontSize: import("lit").CSSResult;
63
+ readonly fontWeight: import("lit").CSSResult;
64
+ readonly lineHeight: import("lit").CSSResult;
65
+ readonly tracking: import("lit").CSSResult;
66
+ };
67
+ };
68
+ /** Longer passages of text. */
69
+ readonly body: {
70
+ readonly large: {
71
+ readonly fontSize: import("lit").CSSResult;
72
+ readonly fontWeight: import("lit").CSSResult;
73
+ readonly lineHeight: import("lit").CSSResult;
74
+ readonly tracking: import("lit").CSSResult;
75
+ };
76
+ readonly medium: {
77
+ readonly fontSize: import("lit").CSSResult;
78
+ readonly fontWeight: import("lit").CSSResult;
79
+ readonly lineHeight: import("lit").CSSResult;
80
+ readonly tracking: import("lit").CSSResult;
81
+ };
82
+ readonly small: {
83
+ readonly fontSize: import("lit").CSSResult;
84
+ readonly fontWeight: import("lit").CSSResult;
85
+ readonly lineHeight: import("lit").CSSResult;
86
+ readonly tracking: import("lit").CSSResult;
87
+ };
88
+ };
89
+ /** Smaller, utilitarian text. */
90
+ readonly label: {
91
+ readonly large: {
92
+ readonly fontSize: import("lit").CSSResult;
93
+ readonly fontWeight: import("lit").CSSResult;
94
+ readonly lineHeight: import("lit").CSSResult;
95
+ readonly tracking: import("lit").CSSResult;
96
+ };
97
+ readonly medium: {
98
+ readonly fontSize: import("lit").CSSResult;
99
+ readonly fontWeight: import("lit").CSSResult;
100
+ readonly lineHeight: import("lit").CSSResult;
101
+ readonly tracking: import("lit").CSSResult;
102
+ };
103
+ readonly small: {
104
+ readonly fontSize: import("lit").CSSResult;
105
+ readonly fontWeight: import("lit").CSSResult;
106
+ readonly lineHeight: import("lit").CSSResult;
107
+ readonly tracking: import("lit").CSSResult;
108
+ };
109
+ };
110
+ };
111
+ /** Emphasized typescale variant. */
112
+ readonly emphasized: {
113
+ /** Short, important text or numerals. */
114
+ readonly display: {
115
+ readonly large: {
116
+ readonly fontSize: import("lit").CSSResult;
117
+ readonly fontWeight: import("lit").CSSResult;
118
+ readonly lineHeight: import("lit").CSSResult;
119
+ readonly tracking: import("lit").CSSResult;
120
+ };
121
+ readonly medium: {
122
+ readonly fontSize: import("lit").CSSResult;
123
+ readonly fontWeight: import("lit").CSSResult;
124
+ readonly lineHeight: import("lit").CSSResult;
125
+ readonly tracking: import("lit").CSSResult;
126
+ };
127
+ readonly small: {
128
+ readonly fontSize: import("lit").CSSResult;
129
+ readonly fontWeight: import("lit").CSSResult;
130
+ readonly lineHeight: import("lit").CSSResult;
131
+ readonly tracking: import("lit").CSSResult;
132
+ };
133
+ };
134
+ /** Short, high-emphasis text on smaller screens. */
135
+ readonly headline: {
136
+ readonly large: {
137
+ readonly fontSize: import("lit").CSSResult;
138
+ readonly fontWeight: import("lit").CSSResult;
139
+ readonly lineHeight: import("lit").CSSResult;
140
+ readonly tracking: import("lit").CSSResult;
141
+ };
142
+ readonly medium: {
143
+ readonly fontSize: import("lit").CSSResult;
144
+ readonly fontWeight: import("lit").CSSResult;
145
+ readonly lineHeight: import("lit").CSSResult;
146
+ readonly tracking: import("lit").CSSResult;
147
+ };
148
+ readonly small: {
149
+ readonly fontSize: import("lit").CSSResult;
150
+ readonly fontWeight: import("lit").CSSResult;
151
+ readonly lineHeight: import("lit").CSSResult;
152
+ readonly tracking: import("lit").CSSResult;
153
+ };
154
+ };
155
+ /** Medium-emphasis text that remains relatively short. */
156
+ readonly title: {
157
+ readonly large: {
158
+ readonly fontSize: import("lit").CSSResult;
159
+ readonly fontWeight: import("lit").CSSResult;
160
+ readonly lineHeight: import("lit").CSSResult;
161
+ readonly tracking: import("lit").CSSResult;
162
+ };
163
+ readonly medium: {
164
+ readonly fontSize: import("lit").CSSResult;
165
+ readonly fontWeight: import("lit").CSSResult;
166
+ readonly lineHeight: import("lit").CSSResult;
167
+ readonly tracking: import("lit").CSSResult;
168
+ };
169
+ readonly small: {
170
+ readonly fontSize: import("lit").CSSResult;
171
+ readonly fontWeight: import("lit").CSSResult;
172
+ readonly lineHeight: import("lit").CSSResult;
173
+ readonly tracking: import("lit").CSSResult;
174
+ };
175
+ };
176
+ /** Longer passages of text. */
177
+ readonly body: {
178
+ readonly large: {
179
+ readonly fontSize: import("lit").CSSResult;
180
+ readonly fontWeight: import("lit").CSSResult;
181
+ readonly lineHeight: import("lit").CSSResult;
182
+ readonly tracking: import("lit").CSSResult;
183
+ };
184
+ readonly medium: {
185
+ readonly fontSize: import("lit").CSSResult;
186
+ readonly fontWeight: import("lit").CSSResult;
187
+ readonly lineHeight: import("lit").CSSResult;
188
+ readonly tracking: import("lit").CSSResult;
189
+ };
190
+ readonly small: {
191
+ readonly fontSize: import("lit").CSSResult;
192
+ readonly fontWeight: import("lit").CSSResult;
193
+ readonly lineHeight: import("lit").CSSResult;
194
+ readonly tracking: import("lit").CSSResult;
195
+ };
196
+ };
197
+ /** Smaller, utilitarian text. */
198
+ readonly label: {
199
+ readonly large: {
200
+ readonly fontSize: import("lit").CSSResult;
201
+ readonly fontWeight: import("lit").CSSResult;
202
+ readonly lineHeight: import("lit").CSSResult;
203
+ readonly tracking: import("lit").CSSResult;
204
+ };
205
+ readonly medium: {
206
+ readonly fontSize: import("lit").CSSResult;
207
+ readonly fontWeight: import("lit").CSSResult;
208
+ readonly lineHeight: import("lit").CSSResult;
209
+ readonly tracking: import("lit").CSSResult;
210
+ };
211
+ readonly small: {
212
+ readonly fontSize: import("lit").CSSResult;
213
+ readonly fontWeight: import("lit").CSSResult;
214
+ readonly lineHeight: import("lit").CSSResult;
215
+ readonly tracking: import("lit").CSSResult;
216
+ };
217
+ };
218
+ };
219
+ };
220
+ //# sourceMappingURL=TypescaleToken.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypescaleToken.d.ts","sourceRoot":"","sources":["../../../../src/shared/tokens/TypescaleToken.ts"],"names":[],"mappings":"AAEA,4CAA4C;AAC5C,eAAO,MAAM,cAAc;IACzB,kCAAkC;;QAEhC,yCAAyC;;;;;;;;;;;;;;;;;;;;;QAsBzC,oDAAoD;;;;;;;;;;;;;;;;;;;;;QAsBpD,0DAA0D;;;;;;;;;;;;;;;;;;;;;QAsB1D,+BAA+B;;;;;;;;;;;;;;;;;;;;;QAsB/B,iCAAiC;;;;;;;;;;;;;;;;;;;;;;IAuBnC,oCAAoC;;QAElC,yCAAyC;;;;;;;;;;;;;;;;;;;;;QAsBzC,oDAAoD;;;;;;;;;;;;;;;;;;;;;QAsBpD,0DAA0D;;;;;;;;;;;;;;;;;;;;;QAsB1D,+BAA+B;;;;;;;;;;;;;;;;;;;;;QAsB/B,iCAAiC;;;;;;;;;;;;;;;;;;;;;;CAsB3B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./DesignToken";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/tokens/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Gets the text content of a given node, including slotted content.
3
+ * @param {Node} node The node for which to get text content.
4
+ * @param {boolean} [trim = false] A value indicating whether to trim content.
5
+ * @returns {string} The text content of `node`.
6
+ */
7
+ export declare function getTextContent(node: Node, trim?: boolean): string;
8
+ //# sourceMappingURL=getTextContent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getTextContent.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/getTextContent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,GAAE,OAAe,GAAG,MAAM,CAwBxE"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Generates a new globally unique identifier (GUID).
3
+ * @returns {string} A new globally unique identifier.
4
+ */
5
+ export declare function guid(): string;
6
+ //# sourceMappingURL=guid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guid.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/guid.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,IAAI,IAAI,MAAM,CAM7B"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Determines whether a slot has any assigned nodes.
3
+ * @param {HTMLSlotElement} slot The slot to test.
4
+ * @returns {boolean} Whether `slot` has any assigned nodes.
5
+ */
6
+ export declare function hasAssignedNodes(slot: HTMLSlotElement): boolean;
7
+ //# sourceMappingURL=hasAssignedNodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hasAssignedNodes.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/hasAssignedNodes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAE/D"}
@@ -0,0 +1,6 @@
1
+ export * from "./getTextContent";
2
+ export * from "./guid";
3
+ export * from "./hasAssignedNodes";
4
+ export * from "./prefersReducedMotion";
5
+ export * from "./scrollIntoViewIfNeeded";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,QAAQ,CAAC;AACvB,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Determines whether reduced motion is preferred.
3
+ * @returns {boolean} Whether reduced motion is preferred.
4
+ */
5
+ export declare function prefersReducedMotion(): boolean;
6
+ //# sourceMappingURL=prefersReducedMotion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefersReducedMotion.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/prefersReducedMotion.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * If needed, scrolls an element into view within a given scroll container.
3
+ * @param {HTMLElement} element The element to scroll into view.
4
+ * @param {HTMLElement} scrollContainer The scrollable container.
5
+ * @param {ScrollBehavior} [behavior="auto"] The scroll behavior.
6
+ */
7
+ export declare function scrollIntoViewIfNeeded(element: HTMLElement, scrollContainer: HTMLElement, behavior?: ScrollBehavior): void;
8
+ //# sourceMappingURL=scrollIntoViewIfNeeded.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scrollIntoViewIfNeeded.d.ts","sourceRoot":"","sources":["../../../../src/shared/utils/scrollIntoViewIfNeeded.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,WAAW,EACpB,eAAe,EAAE,WAAW,EAC5B,QAAQ,GAAE,cAAuB,GAChC,IAAI,CAON"}
@@ -0,0 +1,21 @@
1
+ import eslint from "@eslint/js";
2
+ import tseslint from "typescript-eslint";
3
+ import { fileURLToPath } from "url";
4
+ import { dirname } from "path";
5
+
6
+ export default tseslint.config(eslint.configs.recommended, tseslint.configs.recommended, {
7
+ languageOptions: {
8
+ parserOptions: {
9
+ project: true,
10
+ tsconfigRootDir: dirname(fileURLToPath(import.meta.url)),
11
+ },
12
+ },
13
+ rules: {
14
+ "@typescript-eslint/no-explicit-any": [
15
+ "error",
16
+ {
17
+ ignoreRestArgs: true,
18
+ },
19
+ ],
20
+ },
21
+ });
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@m3e/core",
3
+ "version": "1.0.0-rc.1",
4
+ "description": "Core for M3E",
5
+ "author": "matraic <matraic@yahoo.com>",
6
+ "license": "MIT",
7
+ "homepage": "https://matraic.github.io/m3e/",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/matraic/m3e.git"
11
+ },
12
+ "keywords": [
13
+ "material design",
14
+ "web components",
15
+ "a11y",
16
+ "anchoring",
17
+ "bidi",
18
+ "controllers",
19
+ "decorators",
20
+ "layout",
21
+ "mixins",
22
+ "platform",
23
+ "primitives",
24
+ "tokens",
25
+ "utils"
26
+ ],
27
+ "main": "dist/index.js",
28
+ "module": "dist/index.js",
29
+ "browser": "dist/index.min.js",
30
+ "unpkg": "dist/index.min.js",
31
+ "types": "dist/src/index.d.ts",
32
+ "type": "module",
33
+ "exports": {
34
+ ".": {
35
+ "types": "./dist/src/index.d.ts",
36
+ "default": "./dist/index.js"
37
+ },
38
+ "./a11y": {
39
+ "types": "./dist/src/a11y/index.d.ts",
40
+ "default": "./dist/a11y.js"
41
+ },
42
+ "./anchoring": {
43
+ "types": "./dist/src/anchoring/index.d.ts",
44
+ "default": "./dist/anchoring.js"
45
+ },
46
+ "./bidi": {
47
+ "types": "./dist/src/bidi/index.d.ts",
48
+ "default": "./dist/bidi.js"
49
+ },
50
+ "./layout": {
51
+ "types": "./dist/src/layout/index.d.ts",
52
+ "default": "./dist/layout.js"
53
+ },
54
+ "./platform": {
55
+ "types": "./dist/src/platform/index.d.ts",
56
+ "default": "./dist/platform.js"
57
+ }
58
+ },
59
+ "scripts": {
60
+ "build": "rollup -c",
61
+ "cem": "cem analyze --config cem.config.mjs",
62
+ "lint": "npx eslint ./src",
63
+ "clean": "rimraf dist"
64
+ },
65
+ "dependencies": {
66
+ "@floating-ui/dom": "^1.6.13",
67
+ "composed-offset-position": "^0.0.6"
68
+ },
69
+ "peerDependencies": {
70
+ "lit": "^3.3.0"
71
+ },
72
+ "devDependencies": {
73
+ "@custom-elements-manifest/analyzer": "^0.10.4",
74
+ "@eslint/js": "^9.30.1",
75
+ "@rollup/plugin-node-resolve": "^16.0.0",
76
+ "@rollup/plugin-terser": "^0.4.4",
77
+ "@rollup/plugin-typescript": "12.1.0",
78
+ "custom-element-vs-code-integration": "^1.5.0",
79
+ "eslint": "^9.32.0",
80
+ "rimraf": "^6.0.1",
81
+ "rollup": "^4.44.2",
82
+ "tslib": "^2.8.1",
83
+ "typescript": "~5.8.2",
84
+ "typescript-eslint": "^8.38.0"
85
+ },
86
+ "customElements": "dist/custom-elements.json"
87
+ }
@@ -0,0 +1,132 @@
1
+ import resolve from "@rollup/plugin-node-resolve";
2
+ import terser from "@rollup/plugin-terser";
3
+ import typescript from "@rollup/plugin-typescript";
4
+
5
+ const banner = `/**
6
+ * @license MIT
7
+ * Copyright (c) 2025 matraic
8
+ * See LICENSE file in the project root for full license text.
9
+ */`;
10
+
11
+ export default [
12
+ {
13
+ input: "src/index.ts",
14
+ output: [
15
+ {
16
+ file: "dist/index.js",
17
+ format: "esm",
18
+ sourcemap: true,
19
+ banner: banner,
20
+ },
21
+ {
22
+ file: "dist/index.min.js",
23
+ format: "esm",
24
+ sourcemap: true,
25
+ banner: banner,
26
+ plugins: [terser({ mangle: true })],
27
+ },
28
+ ],
29
+ external: ["lit"],
30
+ plugins: [resolve(), typescript()],
31
+ },
32
+ {
33
+ input: "src/a11y/index.ts",
34
+ output: [
35
+ {
36
+ file: "dist/a11y.js",
37
+ format: "esm",
38
+ sourcemap: true,
39
+ banner: banner,
40
+ },
41
+ {
42
+ file: "dist/a11y.min.js",
43
+ format: "esm",
44
+ sourcemap: true,
45
+ banner: banner,
46
+ plugins: [terser({ mangle: true })],
47
+ },
48
+ ],
49
+ external: ["lit"],
50
+ plugins: [resolve(), typescript()],
51
+ },
52
+ {
53
+ input: "src/anchoring/index.ts",
54
+ output: [
55
+ {
56
+ file: "dist/anchoring.js",
57
+ format: "esm",
58
+ sourcemap: true,
59
+ banner: banner,
60
+ },
61
+ {
62
+ file: "dist/anchoring.min.js",
63
+ format: "esm",
64
+ sourcemap: true,
65
+ banner: banner,
66
+ plugins: [terser({ mangle: true })],
67
+ },
68
+ ],
69
+ external: ["lit"],
70
+ plugins: [resolve(), typescript()],
71
+ },
72
+ {
73
+ input: "src/bidi/index.ts",
74
+ output: [
75
+ {
76
+ file: "dist/bidi.js",
77
+ format: "esm",
78
+ sourcemap: true,
79
+ banner: banner,
80
+ },
81
+ {
82
+ file: "dist/bidi.min.js",
83
+ format: "esm",
84
+ sourcemap: true,
85
+ banner: banner,
86
+ plugins: [terser({ mangle: true })],
87
+ },
88
+ ],
89
+ external: ["lit"],
90
+ plugins: [resolve(), typescript()],
91
+ },
92
+ {
93
+ input: "src/layout/index.ts",
94
+ output: [
95
+ {
96
+ file: "dist/layout.js",
97
+ format: "esm",
98
+ sourcemap: true,
99
+ banner: banner,
100
+ },
101
+ {
102
+ file: "dist/layout.min.js",
103
+ format: "esm",
104
+ sourcemap: true,
105
+ banner: banner,
106
+ plugins: [terser({ mangle: true })],
107
+ },
108
+ ],
109
+ external: ["lit"],
110
+ plugins: [resolve(), typescript()],
111
+ },
112
+ {
113
+ input: "src/platform/index.ts",
114
+ output: [
115
+ {
116
+ file: "dist/platform.js",
117
+ format: "esm",
118
+ sourcemap: true,
119
+ banner: banner,
120
+ },
121
+ {
122
+ file: "dist/platform.min.js",
123
+ format: "esm",
124
+ sourcemap: true,
125
+ banner: banner,
126
+ plugins: [terser({ mangle: true })],
127
+ },
128
+ ],
129
+ external: ["lit"],
130
+ plugins: [resolve(), typescript()],
131
+ },
132
+ ];
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Adapted from Angular Material CDK ARIA Describer
3
+ * Source: https://github.com/angular/components/blob/main/src/cdk/a11y/aria-describer/aria-describer.ts
4
+ *
5
+ * @license MIT
6
+ * Copyright (c) 2025 Google LLC
7
+ * See LICENSE file in the project root for full license text.
8
+ */
9
+
10
+ import { isServer } from "lit";
11
+
12
+ import { addAriaReferencedId, removeAriaReferencedId } from "./aria-reference";
13
+ import { visuallyHide } from "./visuallyHide";
14
+
15
+ /** Utility for generating visually hidden elements that convey descriptive messages using `aria-describedby`. */
16
+ export class M3eAriaDescriber {
17
+ /** @private */ static #nextId = 0;
18
+ /** @private */ static #messageContainers = new Map<
19
+ ParentNode,
20
+ {
21
+ containerElement: HTMLElement;
22
+ messageRegistry: Map<string, { messageElement: Element; count: number }>;
23
+ }
24
+ >();
25
+
26
+ /**
27
+ * Adds an `aria-describedby` reference to a hidden element that contains the message.
28
+ * @param {Element} element The element for which to provide a visually hidden description.
29
+ * @param {string} message The message used to describe `element`.
30
+ * @param {string} [role="tooltip"] The ARIA role of the message.
31
+ */
32
+ static describe(element: Element, message: string, role: string = "tooltip"): void {
33
+ if (isServer) {
34
+ return;
35
+ }
36
+
37
+ const rootNode = element.getRootNode() as ParentNode;
38
+ if (!(rootNode instanceof ShadowRoot || rootNode instanceof Document)) {
39
+ return;
40
+ }
41
+
42
+ let container = this.#messageContainers.get(rootNode);
43
+ if (!container) {
44
+ container = {
45
+ containerElement: this.#createMessageContainer(),
46
+ messageRegistry: new Map<string, { messageElement: Element; count: number }>(),
47
+ };
48
+
49
+ // Append to body if document, otherwise, append as a child of shadow root.
50
+ (rootNode instanceof Document ? rootNode.body : rootNode).appendChild(container.containerElement);
51
+ this.#messageContainers.set(rootNode, container);
52
+ }
53
+
54
+ const key = `${role}:${message}`;
55
+ let entry = container.messageRegistry.get(key);
56
+ if (!entry) {
57
+ entry = { messageElement: this.#createMessageElement(message, role), count: 0 };
58
+ container.containerElement.appendChild(entry.messageElement);
59
+ container.messageRegistry.set(key, entry);
60
+ }
61
+
62
+ entry.count++;
63
+
64
+ addAriaReferencedId(element, "aria-describedby", entry.messageElement.id);
65
+ }
66
+
67
+ /**
68
+ * Removes an `aria-describedby` reference to a hidden element that contains the message.
69
+ * @param {Element} element The element from which to remove a visually hidden description.
70
+ * @param {string} message The message used to describe `element`.
71
+ * @param {string} [role="tooltip"] The ARIA role of the message.
72
+ */
73
+ static removeDescription(element: Element, message: string, role: string = "tooltip"): void {
74
+ if (isServer) {
75
+ return;
76
+ }
77
+
78
+ const rootNode = element.getRootNode() as ParentNode;
79
+ const container = this.#messageContainers.get(rootNode);
80
+ if (!container) {
81
+ return;
82
+ }
83
+
84
+ const key = `${role}:${message}`;
85
+ const entry = container.messageRegistry.get(key);
86
+ if (!entry) {
87
+ return;
88
+ }
89
+
90
+ entry.count--;
91
+ removeAriaReferencedId(element, "aria-describedby", entry.messageElement.id);
92
+
93
+ // If there are no more elements referencing the message, remove it from the DOM.
94
+ if (entry.count <= 0) {
95
+ entry.messageElement.remove();
96
+ container.messageRegistry.delete(key);
97
+ }
98
+
99
+ // If there are no more registered messages, remove the container from the DOM.
100
+ if (container.messageRegistry.size == 0) {
101
+ container.containerElement?.remove();
102
+ this.#messageContainers.delete(rootNode);
103
+ }
104
+ }
105
+
106
+ /** @private */
107
+ static #createMessageContainer(): HTMLElement {
108
+ const messageContainer = document.createElement("div");
109
+ messageContainer.classList.add("m3e-describedby-message-container");
110
+ visuallyHide(messageContainer.style);
111
+ return messageContainer;
112
+ }
113
+
114
+ /** @private */
115
+ static #createMessageElement(message: string, role: string): HTMLElement {
116
+ const messageElement = document.createElement("span");
117
+ messageElement.id = `m3e-describedby-message-${this.#nextId++}`;
118
+ messageElement.role = role;
119
+ messageElement.ariaAtomic = "true";
120
+ messageElement.innerText = message.trim();
121
+ return messageElement;
122
+ }
123
+ }
124
+
125
+ declare global {
126
+ /** Utility for generating visually hidden elements that convey descriptive messages using `aria-describedby`. */
127
+ var M3eAriaDescriber: M3eAriaDescriber;
128
+ }
129
+
130
+ globalThis.M3eAriaDescriber = M3eAriaDescriber;