@moni-labs/moni-ui 0.2.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 (451) hide show
  1. package/LICENSE +34 -0
  2. package/README.md +264 -0
  3. package/custom-elements.json +12510 -0
  4. package/dist/actions/index.d.ts +2 -0
  5. package/dist/actions/index.d.ts.map +1 -0
  6. package/dist/actions/index.js +1 -0
  7. package/dist/assets/arch.svg +1 -0
  8. package/dist/assets/arrow.svg +1 -0
  9. package/dist/assets/boom.svg +1 -0
  10. package/dist/assets/bun.svg +1 -0
  11. package/dist/assets/burst.svg +1 -0
  12. package/dist/assets/circle.svg +1 -0
  13. package/dist/assets/clamshell.svg +1 -0
  14. package/dist/assets/diamond.svg +1 -0
  15. package/dist/assets/fan.svg +1 -0
  16. package/dist/assets/flower.svg +1 -0
  17. package/dist/assets/gem.svg +1 -0
  18. package/dist/assets/ghost-ish.svg +1 -0
  19. package/dist/assets/heart.svg +1 -0
  20. package/dist/assets/leaf-clover4.svg +1 -0
  21. package/dist/assets/leaf-clover8.svg +1 -0
  22. package/dist/assets/loading-indicator.svg +1 -0
  23. package/dist/assets/material-symbols-rounded.woff2 +0 -0
  24. package/dist/assets/material-symbols-subset.woff2 +0 -0
  25. package/dist/assets/oval.svg +1 -0
  26. package/dist/assets/pentagon.svg +1 -0
  27. package/dist/assets/pill.svg +1 -0
  28. package/dist/assets/pixel-circle.svg +1 -0
  29. package/dist/assets/pixel-triangle.svg +1 -0
  30. package/dist/assets/puffy-diamond.svg +1 -0
  31. package/dist/assets/puffy.svg +1 -0
  32. package/dist/assets/semicircle.svg +1 -0
  33. package/dist/assets/shapes/arch.svg +1 -0
  34. package/dist/assets/shapes/arrow.svg +1 -0
  35. package/dist/assets/shapes/boom.svg +1 -0
  36. package/dist/assets/shapes/burst.svg +1 -0
  37. package/dist/assets/shapes/circle.svg +1 -0
  38. package/dist/assets/shapes/clamshell.svg +1 -0
  39. package/dist/assets/shapes/diamond.svg +1 -0
  40. package/dist/assets/shapes/fan.svg +1 -0
  41. package/dist/assets/shapes/flower.svg +1 -0
  42. package/dist/assets/shapes/gem.svg +1 -0
  43. package/dist/assets/shapes/ghost-ish.svg +1 -0
  44. package/dist/assets/shapes/heart.svg +1 -0
  45. package/dist/assets/shapes/leaf-clover4.svg +1 -0
  46. package/dist/assets/shapes/leaf-clover8.svg +1 -0
  47. package/dist/assets/shapes/loading-indicator.svg +1 -0
  48. package/dist/assets/shapes/oval.svg +1 -0
  49. package/dist/assets/shapes/pentagon.svg +1 -0
  50. package/dist/assets/shapes/pill.svg +1 -0
  51. package/dist/assets/shapes/pixel-circle.svg +1 -0
  52. package/dist/assets/shapes/pixel-triangle.svg +1 -0
  53. package/dist/assets/shapes/puffy-diamond.svg +1 -0
  54. package/dist/assets/shapes/puffy.svg +1 -0
  55. package/dist/assets/shapes/semicircle.svg +1 -0
  56. package/dist/assets/shapes/sided-cookie12.svg +1 -0
  57. package/dist/assets/shapes/sided-cookie4.svg +1 -0
  58. package/dist/assets/shapes/sided-cookie6.svg +1 -0
  59. package/dist/assets/shapes/sided-cookie7.svg +1 -0
  60. package/dist/assets/shapes/sided-cookie9.svg +1 -0
  61. package/dist/assets/shapes/slanted.svg +1 -0
  62. package/dist/assets/shapes/soft-boom.svg +1 -0
  63. package/dist/assets/shapes/soft-burst.svg +1 -0
  64. package/dist/assets/shapes/square.svg +1 -0
  65. package/dist/assets/shapes/sunny.svg +1 -0
  66. package/dist/assets/shapes/triangle.svg +1 -0
  67. package/dist/assets/shapes/very-sunny.svg +1 -0
  68. package/dist/assets/shapes/wavy-circle.svg +1 -0
  69. package/dist/assets/shapes/wavy.svg +1 -0
  70. package/dist/assets/sided-cookie12.svg +1 -0
  71. package/dist/assets/sided-cookie4.svg +1 -0
  72. package/dist/assets/sided-cookie6.svg +1 -0
  73. package/dist/assets/sided-cookie7.svg +1 -0
  74. package/dist/assets/sided-cookie9.svg +1 -0
  75. package/dist/assets/slanted.svg +1 -0
  76. package/dist/assets/soft-boom.svg +1 -0
  77. package/dist/assets/soft-burst.svg +1 -0
  78. package/dist/assets/square.svg +1 -0
  79. package/dist/assets/star.svg +1 -0
  80. package/dist/assets/sunny.svg +1 -0
  81. package/dist/assets/triangle.svg +1 -0
  82. package/dist/assets/very-sunny.svg +1 -0
  83. package/dist/assets/wavy-circle.svg +1 -0
  84. package/dist/assets/wavy.svg +1 -0
  85. package/dist/components/_base/field-styles.d.ts +24 -0
  86. package/dist/components/_base/field-styles.d.ts.map +1 -0
  87. package/dist/components/_base/field-styles.js +504 -0
  88. package/dist/components/_base/index.d.ts +4 -0
  89. package/dist/components/_base/index.d.ts.map +1 -0
  90. package/dist/components/_base/index.js +3 -0
  91. package/dist/components/_base/interaction-styles.d.ts +22 -0
  92. package/dist/components/_base/interaction-styles.d.ts.map +1 -0
  93. package/dist/components/_base/interaction-styles.js +123 -0
  94. package/dist/components/_base/moni-element.d.ts +18 -0
  95. package/dist/components/_base/moni-element.d.ts.map +1 -0
  96. package/dist/components/_base/moni-element.js +19 -0
  97. package/dist/components/_base/shared-styles.d.ts +22 -0
  98. package/dist/components/_base/shared-styles.d.ts.map +1 -0
  99. package/dist/components/_base/shared-styles.js +146 -0
  100. package/dist/components/index.d.ts +42 -0
  101. package/dist/components/index.d.ts.map +1 -0
  102. package/dist/components/index.js +43 -0
  103. package/dist/components/loading-shapes.d.ts +10 -0
  104. package/dist/components/loading-shapes.d.ts.map +1 -0
  105. package/dist/components/loading-shapes.js +9 -0
  106. package/dist/components/moni-app-bar.d.ts +52 -0
  107. package/dist/components/moni-app-bar.d.ts.map +1 -0
  108. package/dist/components/moni-app-bar.js +207 -0
  109. package/dist/components/moni-badge.d.ts +37 -0
  110. package/dist/components/moni-badge.d.ts.map +1 -0
  111. package/dist/components/moni-badge.js +153 -0
  112. package/dist/components/moni-bottom-sheet.d.ts +52 -0
  113. package/dist/components/moni-bottom-sheet.d.ts.map +1 -0
  114. package/dist/components/moni-bottom-sheet.js +440 -0
  115. package/dist/components/moni-button-group.d.ts +55 -0
  116. package/dist/components/moni-button-group.d.ts.map +1 -0
  117. package/dist/components/moni-button-group.js +278 -0
  118. package/dist/components/moni-button-segment.d.ts +29 -0
  119. package/dist/components/moni-button-segment.d.ts.map +1 -0
  120. package/dist/components/moni-button-segment.js +300 -0
  121. package/dist/components/moni-button.d.ts +70 -0
  122. package/dist/components/moni-button.d.ts.map +1 -0
  123. package/dist/components/moni-button.js +727 -0
  124. package/dist/components/moni-card.d.ts +48 -0
  125. package/dist/components/moni-card.d.ts.map +1 -0
  126. package/dist/components/moni-card.js +216 -0
  127. package/dist/components/moni-carousel.d.ts +111 -0
  128. package/dist/components/moni-carousel.d.ts.map +1 -0
  129. package/dist/components/moni-carousel.js +1007 -0
  130. package/dist/components/moni-checkbox.d.ts +39 -0
  131. package/dist/components/moni-checkbox.d.ts.map +1 -0
  132. package/dist/components/moni-checkbox.js +212 -0
  133. package/dist/components/moni-chip.d.ts +57 -0
  134. package/dist/components/moni-chip.d.ts.map +1 -0
  135. package/dist/components/moni-chip.js +340 -0
  136. package/dist/components/moni-color-field.d.ts +33 -0
  137. package/dist/components/moni-color-field.d.ts.map +1 -0
  138. package/dist/components/moni-color-field.js +170 -0
  139. package/dist/components/moni-context-menu.d.ts +55 -0
  140. package/dist/components/moni-context-menu.d.ts.map +1 -0
  141. package/dist/components/moni-context-menu.js +184 -0
  142. package/dist/components/moni-dialog.d.ts +37 -0
  143. package/dist/components/moni-dialog.d.ts.map +1 -0
  144. package/dist/components/moni-dialog.js +257 -0
  145. package/dist/components/moni-divider.d.ts +33 -0
  146. package/dist/components/moni-divider.d.ts.map +1 -0
  147. package/dist/components/moni-divider.js +81 -0
  148. package/dist/components/moni-expansion.d.ts +25 -0
  149. package/dist/components/moni-expansion.d.ts.map +1 -0
  150. package/dist/components/moni-expansion.js +94 -0
  151. package/dist/components/moni-fab-menu.d.ts +58 -0
  152. package/dist/components/moni-fab-menu.d.ts.map +1 -0
  153. package/dist/components/moni-fab-menu.js +247 -0
  154. package/dist/components/moni-fab.d.ts +48 -0
  155. package/dist/components/moni-fab.d.ts.map +1 -0
  156. package/dist/components/moni-fab.js +284 -0
  157. package/dist/components/moni-file-field.d.ts +47 -0
  158. package/dist/components/moni-file-field.d.ts.map +1 -0
  159. package/dist/components/moni-file-field.js +189 -0
  160. package/dist/components/moni-icon.d.ts +30 -0
  161. package/dist/components/moni-icon.d.ts.map +1 -0
  162. package/dist/components/moni-icon.js +107 -0
  163. package/dist/components/moni-list-item.d.ts +51 -0
  164. package/dist/components/moni-list-item.d.ts.map +1 -0
  165. package/dist/components/moni-list-item.js +239 -0
  166. package/dist/components/moni-list.d.ts +32 -0
  167. package/dist/components/moni-list.d.ts.map +1 -0
  168. package/dist/components/moni-list.js +67 -0
  169. package/dist/components/moni-loading-indicator.d.ts +32 -0
  170. package/dist/components/moni-loading-indicator.d.ts.map +1 -0
  171. package/dist/components/moni-loading-indicator.js +189 -0
  172. package/dist/components/moni-menu-item.d.ts +27 -0
  173. package/dist/components/moni-menu-item.d.ts.map +1 -0
  174. package/dist/components/moni-menu-item.js +99 -0
  175. package/dist/components/moni-menu.d.ts +55 -0
  176. package/dist/components/moni-menu.d.ts.map +1 -0
  177. package/dist/components/moni-menu.js +295 -0
  178. package/dist/components/moni-morph-modal.d.ts +78 -0
  179. package/dist/components/moni-morph-modal.d.ts.map +1 -0
  180. package/dist/components/moni-morph-modal.js +1223 -0
  181. package/dist/components/moni-nav-item.d.ts +38 -0
  182. package/dist/components/moni-nav-item.d.ts.map +1 -0
  183. package/dist/components/moni-nav-item.js +262 -0
  184. package/dist/components/moni-nav.d.ts +46 -0
  185. package/dist/components/moni-nav.d.ts.map +1 -0
  186. package/dist/components/moni-nav.js +272 -0
  187. package/dist/components/moni-progress.d.ts +45 -0
  188. package/dist/components/moni-progress.d.ts.map +1 -0
  189. package/dist/components/moni-progress.js +333 -0
  190. package/dist/components/moni-radio.d.ts +38 -0
  191. package/dist/components/moni-radio.d.ts.map +1 -0
  192. package/dist/components/moni-radio.js +218 -0
  193. package/dist/components/moni-ripple.d.ts +35 -0
  194. package/dist/components/moni-ripple.d.ts.map +1 -0
  195. package/dist/components/moni-ripple.js +156 -0
  196. package/dist/components/moni-segmented-button.d.ts +52 -0
  197. package/dist/components/moni-segmented-button.d.ts.map +1 -0
  198. package/dist/components/moni-segmented-button.js +208 -0
  199. package/dist/components/moni-select-option.d.ts +27 -0
  200. package/dist/components/moni-select-option.d.ts.map +1 -0
  201. package/dist/components/moni-select-option.js +102 -0
  202. package/dist/components/moni-select.d.ts +76 -0
  203. package/dist/components/moni-select.d.ts.map +1 -0
  204. package/dist/components/moni-select.js +1136 -0
  205. package/dist/components/moni-shape.d.ts +30 -0
  206. package/dist/components/moni-shape.d.ts.map +1 -0
  207. package/dist/components/moni-shape.js +146 -0
  208. package/dist/components/moni-side-sheet.d.ts +62 -0
  209. package/dist/components/moni-side-sheet.d.ts.map +1 -0
  210. package/dist/components/moni-side-sheet.js +576 -0
  211. package/dist/components/moni-slider.d.ts +73 -0
  212. package/dist/components/moni-slider.d.ts.map +1 -0
  213. package/dist/components/moni-slider.js +422 -0
  214. package/dist/components/moni-snackbar.d.ts +40 -0
  215. package/dist/components/moni-snackbar.d.ts.map +1 -0
  216. package/dist/components/moni-snackbar.js +161 -0
  217. package/dist/components/moni-split-button.d.ts +33 -0
  218. package/dist/components/moni-split-button.d.ts.map +1 -0
  219. package/dist/components/moni-split-button.js +122 -0
  220. package/dist/components/moni-step.d.ts +30 -0
  221. package/dist/components/moni-step.d.ts.map +1 -0
  222. package/dist/components/moni-step.js +175 -0
  223. package/dist/components/moni-stepper.d.ts +35 -0
  224. package/dist/components/moni-stepper.d.ts.map +1 -0
  225. package/dist/components/moni-stepper.js +101 -0
  226. package/dist/components/moni-switch.d.ts +39 -0
  227. package/dist/components/moni-switch.d.ts.map +1 -0
  228. package/dist/components/moni-switch.js +258 -0
  229. package/dist/components/moni-tab.d.ts +27 -0
  230. package/dist/components/moni-tab.d.ts.map +1 -0
  231. package/dist/components/moni-tab.js +147 -0
  232. package/dist/components/moni-tabs.d.ts +31 -0
  233. package/dist/components/moni-tabs.d.ts.map +1 -0
  234. package/dist/components/moni-tabs.js +106 -0
  235. package/dist/components/moni-text-field.d.ts +46 -0
  236. package/dist/components/moni-text-field.d.ts.map +1 -0
  237. package/dist/components/moni-text-field.js +190 -0
  238. package/dist/components/moni-textarea.d.ts +57 -0
  239. package/dist/components/moni-textarea.d.ts.map +1 -0
  240. package/dist/components/moni-textarea.js +228 -0
  241. package/dist/components/moni-time-picker.d.ts +51 -0
  242. package/dist/components/moni-time-picker.d.ts.map +1 -0
  243. package/dist/components/moni-time-picker.js +823 -0
  244. package/dist/components/moni-toolbar.d.ts +35 -0
  245. package/dist/components/moni-toolbar.d.ts.map +1 -0
  246. package/dist/components/moni-toolbar.js +128 -0
  247. package/dist/components/moni-tooltip.d.ts +65 -0
  248. package/dist/components/moni-tooltip.d.ts.map +1 -0
  249. package/dist/components/moni-tooltip.js +320 -0
  250. package/dist/components/moni-typography.d.ts +42 -0
  251. package/dist/components/moni-typography.d.ts.map +1 -0
  252. package/dist/components/moni-typography.js +205 -0
  253. package/dist/index.d.ts +7 -0
  254. package/dist/index.d.ts.map +1 -0
  255. package/dist/index.js +7 -0
  256. package/dist/styles/animations.css +46 -0
  257. package/dist/styles/base.css +248 -0
  258. package/dist/styles/index.css +3 -0
  259. package/dist/styles/tokens.css +190 -0
  260. package/dist/utils/color.d.ts +51 -0
  261. package/dist/utils/color.d.ts.map +1 -0
  262. package/dist/utils/color.js +107 -0
  263. package/dist/utils/theme.svelte.d.ts +45 -0
  264. package/dist/utils/theme.svelte.d.ts.map +1 -0
  265. package/dist/utils/theme.svelte.js +168 -0
  266. package/dist/web-components.d.ts +3 -0
  267. package/dist/web-components.d.ts.map +1 -0
  268. package/dist/web-components.js +4 -0
  269. package/package.json +76 -0
  270. package/src/actions/index.ts +2 -0
  271. package/src/assets/arch.svg +1 -0
  272. package/src/assets/arrow.svg +1 -0
  273. package/src/assets/boom.svg +1 -0
  274. package/src/assets/bun.svg +1 -0
  275. package/src/assets/burst.svg +1 -0
  276. package/src/assets/circle.svg +1 -0
  277. package/src/assets/clamshell.svg +1 -0
  278. package/src/assets/diamond.svg +1 -0
  279. package/src/assets/fan.svg +1 -0
  280. package/src/assets/flower.svg +1 -0
  281. package/src/assets/gem.svg +1 -0
  282. package/src/assets/ghost-ish.svg +1 -0
  283. package/src/assets/heart.svg +1 -0
  284. package/src/assets/leaf-clover4.svg +1 -0
  285. package/src/assets/leaf-clover8.svg +1 -0
  286. package/src/assets/loading-indicator.svg +1 -0
  287. package/src/assets/material-symbols-rounded.woff2 +0 -0
  288. package/src/assets/material-symbols-subset.woff2 +0 -0
  289. package/src/assets/oval.svg +1 -0
  290. package/src/assets/pentagon.svg +1 -0
  291. package/src/assets/pill.svg +1 -0
  292. package/src/assets/pixel-circle.svg +1 -0
  293. package/src/assets/pixel-triangle.svg +1 -0
  294. package/src/assets/puffy-diamond.svg +1 -0
  295. package/src/assets/puffy.svg +1 -0
  296. package/src/assets/semicircle.svg +1 -0
  297. package/src/assets/shapes/arch.svg +1 -0
  298. package/src/assets/shapes/arrow.svg +1 -0
  299. package/src/assets/shapes/boom.svg +1 -0
  300. package/src/assets/shapes/burst.svg +1 -0
  301. package/src/assets/shapes/circle.svg +1 -0
  302. package/src/assets/shapes/clamshell.svg +1 -0
  303. package/src/assets/shapes/diamond.svg +1 -0
  304. package/src/assets/shapes/fan.svg +1 -0
  305. package/src/assets/shapes/flower.svg +1 -0
  306. package/src/assets/shapes/gem.svg +1 -0
  307. package/src/assets/shapes/ghost-ish.svg +1 -0
  308. package/src/assets/shapes/heart.svg +1 -0
  309. package/src/assets/shapes/leaf-clover4.svg +1 -0
  310. package/src/assets/shapes/leaf-clover8.svg +1 -0
  311. package/src/assets/shapes/loading-indicator.svg +1 -0
  312. package/src/assets/shapes/oval.svg +1 -0
  313. package/src/assets/shapes/pentagon.svg +1 -0
  314. package/src/assets/shapes/pill.svg +1 -0
  315. package/src/assets/shapes/pixel-circle.svg +1 -0
  316. package/src/assets/shapes/pixel-triangle.svg +1 -0
  317. package/src/assets/shapes/puffy-diamond.svg +1 -0
  318. package/src/assets/shapes/puffy.svg +1 -0
  319. package/src/assets/shapes/semicircle.svg +1 -0
  320. package/src/assets/shapes/sided-cookie12.svg +1 -0
  321. package/src/assets/shapes/sided-cookie4.svg +1 -0
  322. package/src/assets/shapes/sided-cookie6.svg +1 -0
  323. package/src/assets/shapes/sided-cookie7.svg +1 -0
  324. package/src/assets/shapes/sided-cookie9.svg +1 -0
  325. package/src/assets/shapes/slanted.svg +1 -0
  326. package/src/assets/shapes/soft-boom.svg +1 -0
  327. package/src/assets/shapes/soft-burst.svg +1 -0
  328. package/src/assets/shapes/square.svg +1 -0
  329. package/src/assets/shapes/sunny.svg +1 -0
  330. package/src/assets/shapes/triangle.svg +1 -0
  331. package/src/assets/shapes/very-sunny.svg +1 -0
  332. package/src/assets/shapes/wavy-circle.svg +1 -0
  333. package/src/assets/shapes/wavy.svg +1 -0
  334. package/src/assets/sided-cookie12.svg +1 -0
  335. package/src/assets/sided-cookie4.svg +1 -0
  336. package/src/assets/sided-cookie6.svg +1 -0
  337. package/src/assets/sided-cookie7.svg +1 -0
  338. package/src/assets/sided-cookie9.svg +1 -0
  339. package/src/assets/slanted.svg +1 -0
  340. package/src/assets/soft-boom.svg +1 -0
  341. package/src/assets/soft-burst.svg +1 -0
  342. package/src/assets/square.svg +1 -0
  343. package/src/assets/star.svg +1 -0
  344. package/src/assets/sunny.svg +1 -0
  345. package/src/assets/triangle.svg +1 -0
  346. package/src/assets/very-sunny.svg +1 -0
  347. package/src/assets/wavy-circle.svg +1 -0
  348. package/src/assets/wavy.svg +1 -0
  349. package/src/assets.d.ts +12 -0
  350. package/src/components/_base/field-styles.ts +507 -0
  351. package/src/components/_base/index.ts +3 -0
  352. package/src/components/_base/interaction-styles.ts +125 -0
  353. package/src/components/_base/moni-element.ts +21 -0
  354. package/src/components/_base/shared-styles.ts +148 -0
  355. package/src/components/index.ts +45 -0
  356. package/src/components/loading-shapes.ts +9 -0
  357. package/src/components/moni-app-bar.test.ts +86 -0
  358. package/src/components/moni-app-bar.ts +190 -0
  359. package/src/components/moni-badge.ts +138 -0
  360. package/src/components/moni-bottom-sheet.test.ts +420 -0
  361. package/src/components/moni-bottom-sheet.ts +425 -0
  362. package/src/components/moni-button-group.test.ts +148 -0
  363. package/src/components/moni-button-group.ts +277 -0
  364. package/src/components/moni-button-segment.ts +291 -0
  365. package/src/components/moni-button.test.ts +166 -0
  366. package/src/components/moni-button.ts +709 -0
  367. package/src/components/moni-card.test.ts +83 -0
  368. package/src/components/moni-card.ts +203 -0
  369. package/src/components/moni-carousel.test.ts +238 -0
  370. package/src/components/moni-carousel.ts +1027 -0
  371. package/src/components/moni-checkbox.test.ts +78 -0
  372. package/src/components/moni-checkbox.ts +192 -0
  373. package/src/components/moni-chip.test.ts +168 -0
  374. package/src/components/moni-chip.ts +335 -0
  375. package/src/components/moni-color-field.test.ts +56 -0
  376. package/src/components/moni-color-field.ts +135 -0
  377. package/src/components/moni-context-menu.test.ts +99 -0
  378. package/src/components/moni-context-menu.ts +166 -0
  379. package/src/components/moni-dialog.ts +240 -0
  380. package/src/components/moni-divider.test.ts +42 -0
  381. package/src/components/moni-divider.ts +77 -0
  382. package/src/components/moni-expansion.ts +86 -0
  383. package/src/components/moni-fab-menu.test.ts +118 -0
  384. package/src/components/moni-fab-menu.ts +237 -0
  385. package/src/components/moni-fab.test.ts +128 -0
  386. package/src/components/moni-fab.ts +262 -0
  387. package/src/components/moni-file-field.test.ts +81 -0
  388. package/src/components/moni-file-field.ts +149 -0
  389. package/src/components/moni-icon.test.ts +70 -0
  390. package/src/components/moni-icon.ts +97 -0
  391. package/src/components/moni-list-item.test.ts +114 -0
  392. package/src/components/moni-list-item.ts +222 -0
  393. package/src/components/moni-list.ts +59 -0
  394. package/src/components/moni-loading-indicator.test.ts +41 -0
  395. package/src/components/moni-loading-indicator.ts +188 -0
  396. package/src/components/moni-menu-item.ts +85 -0
  397. package/src/components/moni-menu.test.ts +87 -0
  398. package/src/components/moni-menu.ts +287 -0
  399. package/src/components/moni-morph-modal.test.ts +286 -0
  400. package/src/components/moni-morph-modal.ts +1312 -0
  401. package/src/components/moni-nav-item.ts +243 -0
  402. package/src/components/moni-nav.test.ts +139 -0
  403. package/src/components/moni-nav.ts +266 -0
  404. package/src/components/moni-progress.test.ts +90 -0
  405. package/src/components/moni-progress.ts +322 -0
  406. package/src/components/moni-radio.test.ts +86 -0
  407. package/src/components/moni-radio.ts +196 -0
  408. package/src/components/moni-ripple.ts +146 -0
  409. package/src/components/moni-segmented-button.test.ts +99 -0
  410. package/src/components/moni-segmented-button.ts +220 -0
  411. package/src/components/moni-select-option.ts +85 -0
  412. package/src/components/moni-select.test.ts +210 -0
  413. package/src/components/moni-select.ts +1107 -0
  414. package/src/components/moni-shape.ts +128 -0
  415. package/src/components/moni-side-sheet.test.ts +128 -0
  416. package/src/components/moni-side-sheet.ts +544 -0
  417. package/src/components/moni-slider.test.ts +82 -0
  418. package/src/components/moni-slider.ts +387 -0
  419. package/src/components/moni-snackbar.test.ts +82 -0
  420. package/src/components/moni-snackbar.ts +146 -0
  421. package/src/components/moni-split-button.ts +121 -0
  422. package/src/components/moni-step.test.ts +57 -0
  423. package/src/components/moni-step.ts +155 -0
  424. package/src/components/moni-stepper.test.ts +116 -0
  425. package/src/components/moni-stepper.ts +100 -0
  426. package/src/components/moni-switch.test.ts +117 -0
  427. package/src/components/moni-switch.ts +237 -0
  428. package/src/components/moni-tab.test.ts +54 -0
  429. package/src/components/moni-tab.ts +133 -0
  430. package/src/components/moni-tabs.ts +92 -0
  431. package/src/components/moni-text-field.test.ts +115 -0
  432. package/src/components/moni-text-field.ts +149 -0
  433. package/src/components/moni-textarea.test.ts +147 -0
  434. package/src/components/moni-textarea.ts +176 -0
  435. package/src/components/moni-time-picker.test.ts +61 -0
  436. package/src/components/moni-time-picker.ts +800 -0
  437. package/src/components/moni-toolbar.test.ts +93 -0
  438. package/src/components/moni-toolbar.ts +119 -0
  439. package/src/components/moni-tooltip.test.ts +122 -0
  440. package/src/components/moni-tooltip.ts +324 -0
  441. package/src/components/moni-typography.test.ts +119 -0
  442. package/src/components/moni-typography.ts +195 -0
  443. package/src/index.ts +65 -0
  444. package/src/styles/animations.css +46 -0
  445. package/src/styles/base.css +248 -0
  446. package/src/styles/index.css +3 -0
  447. package/src/styles/tokens.css +190 -0
  448. package/src/types/svelte-runes.d.ts +7 -0
  449. package/src/utils/color.ts +170 -0
  450. package/src/utils/theme.svelte.ts +206 -0
  451. package/src/web-components.ts +5 -0
@@ -0,0 +1,425 @@
1
+ import { html, css } from 'lit';
2
+ import { customElement, property, query } from 'lit/decorators.js';
3
+ import { MoniElement, sharedStyles } from './_base/index.js';
4
+
5
+ /**
6
+ * Visual-only bottom sheet. Renders a `<dialog>` that the consumer opens
7
+ * by calling `dialog.showModal()` from the light DOM. The `open` attribute
8
+ * mirrors that state.
9
+ *
10
+ * Attributes:
11
+ * - open: present → visibility on
12
+ * - size: small | medium (default) | large | auto
13
+ * - modal: present → backdrop rendered
14
+ * - title: heading text
15
+ *
16
+ * Slots:
17
+ * - handle: grab handle
18
+ * - default: body
19
+ * - footer: action buttons
20
+ */
21
+ @customElement('moni-bottom-sheet')
22
+ export class MoniBottomSheet extends MoniElement {
23
+ @property({ type: Boolean, reflect: true }) open = false;
24
+ @property({ reflect: true })
25
+ size: 'small' | 'medium' | 'large' | 'auto' = 'medium';
26
+ @property({ type: Boolean, reflect: true }) modal = true;
27
+ @property({ reflect: true }) title = '';
28
+ @property({ reflect: true })
29
+ positioning: 'body' | 'fixed' | 'absolute' | 'static' = 'fixed';
30
+ @property({ reflect: true, attribute: 'expanded-height' })
31
+ expandedHeight = '85%';
32
+ @property({ reflect: true, attribute: 'max-width' })
33
+ maxWidth = '';
34
+
35
+ private _originalParent: Node | null = null;
36
+ private _originalSibling: Node | null = null;
37
+
38
+ @query('dialog') private _dialog!: HTMLDialogElement;
39
+
40
+ private _isDragging = false;
41
+ private _startY = 0;
42
+ private _currentTranslationY = 0;
43
+ private _sheetHeight = 0;
44
+ private _defaultHeight = 0;
45
+ private _justDragged = false;
46
+
47
+ private _getMaxHeightPx(): number {
48
+ const val = this.expandedHeight || '85%';
49
+ if (val.endsWith('%')) {
50
+ return window.innerHeight * (parseFloat(val) / 100);
51
+ }
52
+ if (val.endsWith('vh')) {
53
+ return window.innerHeight * (parseFloat(val) / 100);
54
+ }
55
+ if (val.endsWith('px')) {
56
+ return parseFloat(val);
57
+ }
58
+ return window.innerHeight * 0.85;
59
+ }
60
+
61
+ private _onPointerDown(e: PointerEvent) {
62
+ const target = e.target as HTMLElement;
63
+ if (!target.closest('.handle') && !target.closest('header')) return;
64
+
65
+ this._isDragging = true;
66
+ this._startY = e.clientY;
67
+ this._sheetHeight = this._dialog.getBoundingClientRect().height;
68
+ this._currentTranslationY = 0;
69
+
70
+ const isExpanded = this._dialog.classList.contains('expanded');
71
+ if (!isExpanded) {
72
+ this._defaultHeight = this._sheetHeight;
73
+ }
74
+
75
+ target.setPointerCapture(e.pointerId);
76
+ this._dialog.classList.add('dragging');
77
+ }
78
+
79
+ private _onPointerMove(e: PointerEvent) {
80
+ if (!this._isDragging) return;
81
+
82
+ const deltaY = e.clientY - this._startY;
83
+ const isExpanded = this._dialog.classList.contains('expanded');
84
+ const maxHeight = this._getMaxHeightPx();
85
+
86
+ if (isExpanded) {
87
+ if (deltaY > 0) {
88
+ // Dragging down from expanded: shrink height
89
+ const newHeight = this._sheetHeight - deltaY;
90
+ this._dialog.style.transform = '';
91
+ this._dialog.style.height = `${Math.max(0, newHeight)}px`;
92
+ } else {
93
+ // Pulling up from expanded: resistance
94
+ const newHeight = this._sheetHeight - deltaY * 0.2;
95
+ this._dialog.style.transform = '';
96
+ this._dialog.style.height = `${Math.min(maxHeight, newHeight)}px`;
97
+ }
98
+ } else {
99
+ if (deltaY > 0) {
100
+ // Dragging down from normal: translate down
101
+ this._currentTranslationY = deltaY;
102
+ this._dialog.style.transform = `translateY(${deltaY}px)`;
103
+ this._dialog.style.height = '';
104
+ } else {
105
+ // Dragging up from normal: grow height
106
+ const newHeight = this._sheetHeight - deltaY;
107
+ this._dialog.style.transform = '';
108
+ this._dialog.style.height = `${Math.min(maxHeight, newHeight)}px`;
109
+ }
110
+ }
111
+ }
112
+
113
+ private _onPointerUp(e: PointerEvent) {
114
+ if (!this._isDragging) return;
115
+
116
+ const target = e.target as HTMLElement;
117
+ target.releasePointerCapture(e.pointerId);
118
+ this._isDragging = false;
119
+ this._dialog.classList.remove('dragging');
120
+
121
+ const deltaY = e.clientY - this._startY;
122
+ if (Math.abs(deltaY) > 5) {
123
+ this._justDragged = true;
124
+ setTimeout(() => {
125
+ this._justDragged = false;
126
+ }, 50);
127
+ }
128
+ const isExpanded = this._dialog.classList.contains('expanded');
129
+ const maxHeight = this._getMaxHeightPx();
130
+
131
+ if (isExpanded) {
132
+ const finalHeight = this._sheetHeight - deltaY;
133
+ if (finalHeight < this._defaultHeight - 80) {
134
+ // Close completely
135
+ this._dialog.classList.remove('expanded');
136
+ this._dialog.style.transform = 'translateY(100%)';
137
+ this._dialog.style.height = '';
138
+
139
+ const onTransitionEnd = () => {
140
+ this._dialog.removeEventListener('transitionend', onTransitionEnd);
141
+ this._dialog.style.transform = '';
142
+ this._dialog.style.height = '';
143
+ this.open = false;
144
+ this.dispatchEvent(new CustomEvent('close'));
145
+ };
146
+ this._dialog.addEventListener('transitionend', onTransitionEnd);
147
+ setTimeout(() => {
148
+ if (this.open) onTransitionEnd();
149
+ }, 300);
150
+ } else if (finalHeight < (maxHeight + this._defaultHeight) / 2) {
151
+ // Collapse back to normal height
152
+ this._dialog.classList.remove('expanded');
153
+ this._dialog.style.transform = '';
154
+ this._dialog.style.height = '';
155
+ } else {
156
+ // Snap back to expanded
157
+ this._dialog.style.transform = '';
158
+ this._dialog.style.height = '';
159
+ }
160
+ } else {
161
+ if (deltaY < 0) {
162
+ // Dragged up
163
+ const finalHeight = this._sheetHeight - deltaY;
164
+ const threshold = (maxHeight + this._sheetHeight) / 2;
165
+ if (finalHeight > threshold || -deltaY > 80) {
166
+ // Snap to expanded
167
+ this._dialog.classList.add('expanded');
168
+ this._dialog.style.transform = '';
169
+ this._dialog.style.height = '';
170
+ } else {
171
+ // Revert to normal
172
+ this._dialog.style.transform = '';
173
+ this._dialog.style.height = '';
174
+ }
175
+ } else {
176
+ // Dragged down
177
+ const threshold = Math.min(150, this._sheetHeight * 0.4);
178
+ if (this._currentTranslationY > threshold) {
179
+ this._dialog.style.transform = 'translateY(100%)';
180
+ this._dialog.style.height = '';
181
+
182
+ const onTransitionEnd = () => {
183
+ this._dialog.removeEventListener('transitionend', onTransitionEnd);
184
+ this._dialog.style.transform = '';
185
+ this._dialog.style.height = '';
186
+ this.open = false;
187
+ this.dispatchEvent(new CustomEvent('close'));
188
+ };
189
+ this._dialog.addEventListener('transitionend', onTransitionEnd);
190
+ setTimeout(() => {
191
+ if (this.open) onTransitionEnd();
192
+ }, 300);
193
+ } else {
194
+ this._dialog.style.transform = '';
195
+ this._dialog.style.height = '';
196
+ }
197
+ }
198
+ }
199
+ }
200
+
201
+ private _onPointerCancel(e: PointerEvent) {
202
+ if (!this._isDragging) return;
203
+
204
+ const target = e.target as HTMLElement;
205
+ target.releasePointerCapture(e.pointerId);
206
+ this._isDragging = false;
207
+ this._dialog.classList.remove('dragging');
208
+ this._dialog.style.transform = '';
209
+ this._dialog.style.height = '';
210
+ }
211
+
212
+ private _onDialogClick(e: MouseEvent) {
213
+ if (this._justDragged) {
214
+ this._justDragged = false;
215
+ return;
216
+ }
217
+ if (!this.modal) return;
218
+ // Click on backdrop targets the dialog element itself. Clicks on children target the children.
219
+ if (e.target !== this._dialog) return;
220
+
221
+ this._dialog.style.transform = 'translateY(100%)';
222
+ this._dialog.style.height = '';
223
+
224
+ const onTransitionEnd = () => {
225
+ this._dialog.removeEventListener('transitionend', onTransitionEnd);
226
+ this._dialog.style.transform = '';
227
+ this._dialog.style.height = '';
228
+ this.open = false;
229
+ this.dispatchEvent(new CustomEvent('close'));
230
+ };
231
+ this._dialog.addEventListener('transitionend', onTransitionEnd);
232
+ setTimeout(() => {
233
+ if (this.open) onTransitionEnd();
234
+ }, 300);
235
+ }
236
+
237
+ override updated(changed: Map<string, unknown>) {
238
+ super.updated(changed);
239
+ if (changed.has('expandedHeight')) {
240
+ this.style.setProperty('--moni-bottom-sheet-expanded-height', this.expandedHeight);
241
+ }
242
+ if (changed.has('maxWidth')) {
243
+ this.style.setProperty('--moni-bottom-sheet-max-width', this.maxWidth || '100%');
244
+ }
245
+ if (changed.has('open')) {
246
+ if (this.open) {
247
+ if (this.positioning === 'body' && this.parentNode !== document.body) {
248
+ this._originalParent = this.parentNode;
249
+ this._originalSibling = this.nextSibling;
250
+ document.body.appendChild(this);
251
+ }
252
+ } else {
253
+ if (this._dialog) {
254
+ this._dialog.classList.remove('expanded');
255
+ }
256
+ if (this.positioning === 'body' && this._originalParent && this.parentNode === document.body) {
257
+ this._originalParent.insertBefore(this, this._originalSibling);
258
+ this._originalParent = null;
259
+ this._originalSibling = null;
260
+ }
261
+ }
262
+ }
263
+ }
264
+
265
+ override disconnectedCallback() {
266
+ super.disconnectedCallback();
267
+ if (this.parentNode === document.body && this.positioning === 'body' && this._originalParent) {
268
+ this._originalParent.insertBefore(this, this._originalSibling);
269
+ }
270
+ }
271
+
272
+ static override styles = [
273
+ sharedStyles,
274
+ css`
275
+ :host {
276
+ display: contents;
277
+ }
278
+
279
+ dialog {
280
+ --_padding: 1rem;
281
+ display: block;
282
+ visibility: hidden;
283
+ border: none;
284
+ opacity: 0;
285
+ box-shadow: var(--elevate3);
286
+ color: var(--on-surface);
287
+ background-color: var(--surface);
288
+ padding: var(--_padding);
289
+ z-index: 100;
290
+ inline-size: 100%;
291
+ max-inline-size: var(--moni-bottom-sheet-max-width, 100%);
292
+ margin-inline: auto;
293
+ block-size: auto;
294
+ max-block-size: var(--moni-bottom-sheet-expanded-height, 85%);
295
+ min-inline-size: auto;
296
+ border-radius: 1.75rem 1.75rem 0 0;
297
+ overflow-y: auto;
298
+ transition:
299
+ transform var(--speed3),
300
+ height var(--speed3),
301
+ opacity var(--speed3);
302
+ transform: translateY(100%);
303
+ outline: none;
304
+ }
305
+
306
+ dialog[open] {
307
+ visibility: visible;
308
+ opacity: 1;
309
+ transform: translateY(0);
310
+ }
311
+
312
+ dialog.fixed {
313
+ position: fixed;
314
+ inset: auto 0 0 0;
315
+ }
316
+
317
+ dialog.absolute {
318
+ position: absolute;
319
+ inset: auto 0 0 0;
320
+ }
321
+
322
+ dialog.static {
323
+ position: relative;
324
+ inset: auto;
325
+ transform: none !important;
326
+ opacity: 1 !important;
327
+ visibility: visible !important;
328
+ display: none;
329
+ }
330
+ dialog.static[open] {
331
+ display: block;
332
+ }
333
+
334
+ dialog.dragging {
335
+ transition: none !important;
336
+ }
337
+
338
+ dialog.small {
339
+ block-size: 16rem;
340
+ }
341
+ dialog.medium {
342
+ block-size: 24rem;
343
+ }
344
+ dialog.large {
345
+ block-size: 32rem;
346
+ }
347
+ dialog.auto {
348
+ block-size: auto;
349
+ }
350
+
351
+ dialog.expanded {
352
+ block-size: var(--moni-bottom-sheet-expanded-height, 85%) !important;
353
+ }
354
+
355
+ header,
356
+ footer {
357
+ display: grid;
358
+ align-content: center;
359
+ border-radius: 0;
360
+ padding: 0;
361
+ }
362
+ header {
363
+ min-block-size: 3rem;
364
+ padding-block-start: 0.5rem;
365
+ cursor: grab;
366
+ touch-action: none;
367
+ user-select: none;
368
+ }
369
+ header:active {
370
+ cursor: grabbing;
371
+ }
372
+ footer {
373
+ min-block-size: 3.5rem;
374
+ }
375
+
376
+ /* M3 spec: the drag handle is a 4dp tall x 32dp wide pill at
377
+ the top center of the sheet. Color is on-surface-variant with
378
+ 40% opacity for reduced emphasis. */
379
+ .handle {
380
+ inline-size: 2rem;
381
+ block-size: 0.25rem;
382
+ background: var(--on-surface-variant);
383
+ opacity: 0.4;
384
+ border-radius: 999px;
385
+ margin: 0.5rem auto 1rem;
386
+ cursor: grab;
387
+ touch-action: none;
388
+ }
389
+ .handle:active {
390
+ cursor: grabbing;
391
+ }
392
+ `
393
+ ];
394
+
395
+ override render() {
396
+ const posClass = this.positioning === 'body' ? 'fixed' : this.positioning;
397
+ const dialogClasses = `${this.size} ${posClass}`;
398
+
399
+ return html`<dialog
400
+ part="dialog"
401
+ ?open=${this.open}
402
+ class=${dialogClasses}
403
+ @click=${this._onDialogClick}
404
+ @pointerdown=${this._onPointerDown}
405
+ @pointermove=${this._onPointerMove}
406
+ @pointerup=${this._onPointerUp}
407
+ @pointercancel=${this._onPointerCancel}
408
+ >
409
+ <div class="handle" aria-hidden="true"></div>
410
+ <header part="header">
411
+ <slot name="handle">${this.title}</slot>
412
+ </header>
413
+ <div part="content"><slot></slot></div>
414
+ <footer part="footer"><slot name="footer"></slot></footer>
415
+ </dialog>`;
416
+ }
417
+ }
418
+
419
+ declare global {
420
+ interface HTMLElementTagNameMap {
421
+ 'moni-bottom-sheet': MoniBottomSheet;
422
+ }
423
+ }
424
+
425
+ export default MoniBottomSheet;
@@ -0,0 +1,148 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
2
+ import './moni-button.js';
3
+ import './moni-button-group.js';
4
+ import type { MoniButtonGroup } from './moni-button-group.js';
5
+ import type { MoniButton } from './moni-button.js';
6
+
7
+ describe('moni-button-group', () => {
8
+ let group: MoniButtonGroup;
9
+
10
+ beforeEach(() => {
11
+ group = document.createElement('moni-button-group') as MoniButtonGroup;
12
+ document.body.appendChild(group);
13
+ });
14
+
15
+ afterEach(() => {
16
+ group.remove();
17
+ });
18
+
19
+ it('propagates size to children buttons', async () => {
20
+ group.size = 'large';
21
+ const btn1 = document.createElement('moni-button') as MoniButton;
22
+ const btn2 = document.createElement('moni-button') as MoniButton;
23
+ group.appendChild(btn1);
24
+ group.appendChild(btn2);
25
+
26
+ await group.updateComplete;
27
+ await btn1.updateComplete;
28
+ await btn2.updateComplete;
29
+
30
+ expect(btn1.getAttribute('size')).toBe('large');
31
+ expect(btn2.getAttribute('size')).toBe('large');
32
+ });
33
+
34
+ it('sets appropriate shapes for connected variant', async () => {
35
+ group.variant = 'connected';
36
+ const btn1 = document.createElement('moni-button') as MoniButton;
37
+ const btn2 = document.createElement('moni-button') as MoniButton;
38
+ const btn3 = document.createElement('moni-button') as MoniButton;
39
+ group.appendChild(btn1);
40
+ group.appendChild(btn2);
41
+ group.appendChild(btn3);
42
+
43
+ await group.updateComplete;
44
+ await btn1.updateComplete;
45
+ await btn2.updateComplete;
46
+ await btn3.updateComplete;
47
+
48
+ expect(btn1.getAttribute('shape')).toBe('left-round-flat');
49
+ expect(btn2.getAttribute('shape')).toBe('no-round');
50
+ expect(btn3.getAttribute('shape')).toBe('right-round-flat');
51
+ });
52
+
53
+ it('uses round shapes for connected variant when gap is set', async () => {
54
+ group.variant = 'connected';
55
+ group.gap = '8px';
56
+ const btn1 = document.createElement('moni-button') as MoniButton;
57
+ const btn2 = document.createElement('moni-button') as MoniButton;
58
+ group.appendChild(btn1);
59
+ group.appendChild(btn2);
60
+
61
+ await group.updateComplete;
62
+ await btn1.updateComplete;
63
+ await btn2.updateComplete;
64
+
65
+ expect(btn1.getAttribute('shape')).toBe('left-round');
66
+ expect(btn2.getAttribute('shape')).toBe('right-round');
67
+ });
68
+
69
+ it('manages active toggles in single-select mode (multi=false)', async () => {
70
+ const btn1 = document.createElement('moni-button') as MoniButton;
71
+ const btn2 = document.createElement('moni-button') as MoniButton;
72
+ group.appendChild(btn1);
73
+ group.appendChild(btn2);
74
+
75
+ await group.updateComplete;
76
+ await btn1.updateComplete;
77
+ await btn2.updateComplete;
78
+
79
+ // Click btn1
80
+ btn1.click();
81
+ await btn1.updateComplete;
82
+ await btn2.updateComplete;
83
+ expect(btn1.active).toBe(true);
84
+ expect(btn2.active).toBe(false);
85
+
86
+ // Click btn2
87
+ btn2.click();
88
+ await btn1.updateComplete;
89
+ await btn2.updateComplete;
90
+ expect(btn1.active).toBe(false);
91
+ expect(btn2.active).toBe(true);
92
+ });
93
+
94
+ it('manages active toggles in multi-select mode (multi=true)', async () => {
95
+ group.multi = true;
96
+ const btn1 = document.createElement('moni-button') as MoniButton;
97
+ const btn2 = document.createElement('moni-button') as MoniButton;
98
+ group.appendChild(btn1);
99
+ group.appendChild(btn2);
100
+
101
+ await group.updateComplete;
102
+ await btn1.updateComplete;
103
+ await btn2.updateComplete;
104
+
105
+ btn1.click();
106
+ btn2.click();
107
+ await btn1.updateComplete;
108
+ await btn2.updateComplete;
109
+ expect(btn1.active).toBe(true);
110
+ expect(btn2.active).toBe(true);
111
+ });
112
+
113
+ it('renders role="group" on the container by default (M3 a11y)', async () => {
114
+ await group.updateComplete;
115
+ const container = group.shadowRoot?.querySelector('[part="container"]');
116
+ expect(container?.getAttribute('role')).toBe('group');
117
+ });
118
+
119
+ it('supports role="toolbar" override for app-action groups', async () => {
120
+ group.role = 'toolbar';
121
+ await group.updateComplete;
122
+ const container = group.shadowRoot?.querySelector('[part="container"]');
123
+ expect(container?.getAttribute('role')).toBe('toolbar');
124
+ });
125
+
126
+ it('forwards aria-label to the container', async () => {
127
+ group.label = 'Text formatting';
128
+ await group.updateComplete;
129
+ const container = group.shadowRoot?.querySelector('[part="container"]');
130
+ expect(container?.getAttribute('aria-label')).toBe('Text formatting');
131
+ });
132
+
133
+ it('forwards aria-labelledby to the container', async () => {
134
+ group.labelledBy = 'group-title';
135
+ await group.updateComplete;
136
+ const container = group.shadowRoot?.querySelector('[part="container"]');
137
+ expect(container?.getAttribute('aria-labelledby')).toBe('group-title');
138
+ });
139
+
140
+ it('does not emit aria-label when label is empty (M3 a11y cleanliness)', async () => {
141
+ await group.updateComplete;
142
+ const container = group.shadowRoot?.querySelector('[part="container"]');
143
+ // aria-label attribute should be either absent or empty string;
144
+ // using `nothing` in lit removes the attribute entirely.
145
+ const aria = container?.getAttribute('aria-label');
146
+ expect(aria === null || aria === '').toBe(true);
147
+ });
148
+ });