@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,1136 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { html, css, nothing } from 'lit';
8
+ import { customElement, property, state, query } from 'lit/decorators.js';
9
+ import { ifDefined } from 'lit/directives/if-defined.js';
10
+ import { classMap } from 'lit/directives/class-map.js';
11
+ import { MoniElement, sharedStyles, fieldStyles } from './_base/index.js';
12
+ import './moni-icon.js';
13
+ import './moni-progress.js';
14
+ import './moni-select-option.js';
15
+ /**
16
+ * Custom Searchable Select Component with Subcategories, Animations, and Drawer/Sheet option.
17
+ */
18
+ let MoniSelect = class MoniSelect extends MoniElement {
19
+ constructor() {
20
+ super(...arguments);
21
+ this.name = '';
22
+ this.label = '';
23
+ this.variant = 'filled';
24
+ this.size = 'medium';
25
+ this.shape = 'no-round';
26
+ this.disabled = false;
27
+ this.loading = false;
28
+ this.helper = '';
29
+ this.errorText = '';
30
+ this.error = false;
31
+ this.value = '';
32
+ this.icon = '';
33
+ this.trailingIcon = 'arrow_drop_down';
34
+ this.searchable = false;
35
+ this.clearable = false;
36
+ this.sheet = false;
37
+ this.placeholder = '';
38
+ this.positioning = 'absolute';
39
+ this.placement = 'auto';
40
+ this.dropdownWidth = 'trigger';
41
+ this._open = false;
42
+ this._searchQuery = '';
43
+ this._actualPlacement = 'bottom';
44
+ this._parsedOptions = [];
45
+ this._activeIndex = -1;
46
+ this._menuStyle = '';
47
+ this._useInlineCategories = false;
48
+ this._drilldownPath = [];
49
+ this._handleOutsideClick = (e) => {
50
+ if (this._open && !e.composedPath().includes(this)) {
51
+ this._closeDropdown();
52
+ }
53
+ };
54
+ this._handleScroll = () => {
55
+ if (this._open) {
56
+ this._determineActualPlacement();
57
+ this._updateMenuPosition();
58
+ }
59
+ };
60
+ this._handleResize = () => {
61
+ if (this._open) {
62
+ this._determineActualPlacement();
63
+ this._updateMenuPosition();
64
+ }
65
+ };
66
+ }
67
+ static { this.styles = [
68
+ sharedStyles,
69
+ fieldStyles,
70
+ css `
71
+ :host {
72
+ position: relative;
73
+ display: block;
74
+ }
75
+
76
+ .field {
77
+ cursor: pointer;
78
+ }
79
+
80
+ input[type='text'] {
81
+ cursor: pointer;
82
+ width: 100%;
83
+ }
84
+
85
+ input[type='text'][readonly] {
86
+ caret-color: transparent;
87
+ user-select: none;
88
+ }
89
+
90
+ /* Dropdown menu overlay */
91
+ .dropdown-menu {
92
+ position: absolute;
93
+ top: 100%;
94
+ left: 0;
95
+ right: 0;
96
+ z-index: 100;
97
+ background-color: var(--surface-container);
98
+ box-shadow: var(--elevate3);
99
+ border-radius: 0.5rem;
100
+ margin-top: 4px;
101
+ padding: 4px 0;
102
+ list-style: none;
103
+ opacity: 0;
104
+ visibility: hidden;
105
+ transform: scale(0.95) translateY(-8px);
106
+ transform-origin: top;
107
+ transition:
108
+ opacity var(--speed3) cubic-bezier(0.2, 0.8, 0.2, 1),
109
+ transform var(--speed3) cubic-bezier(0.34, 1.56, 0.64, 1),
110
+ visibility var(--speed3);
111
+ }
112
+
113
+ .dropdown-menu.open {
114
+ opacity: 1;
115
+ visibility: visible;
116
+ transform: scale(1) translateY(0);
117
+ }
118
+
119
+ .dropdown-menu.placement-top {
120
+ top: auto;
121
+ bottom: 100%;
122
+ margin-top: 0;
123
+ margin-bottom: 4px;
124
+ transform-origin: bottom;
125
+ transform: scale(0.95) translateY(8px);
126
+ }
127
+
128
+ .dropdown-menu.placement-top.open {
129
+ transform: scale(1) translateY(0);
130
+ }
131
+
132
+ .dropdown-menu.placement-left {
133
+ top: 0;
134
+ left: auto;
135
+ right: 100%;
136
+ margin-top: 0;
137
+ margin-right: 4px;
138
+ transform-origin: right center;
139
+ transform: scale(0.95) translateX(8px);
140
+ }
141
+
142
+ .dropdown-menu.placement-left.open {
143
+ transform: scale(1) translateX(0);
144
+ }
145
+
146
+ .dropdown-menu.placement-right {
147
+ top: 0;
148
+ left: 100%;
149
+ right: auto;
150
+ margin-top: 0;
151
+ margin-left: 4px;
152
+ transform-origin: left center;
153
+ transform: scale(0.95) translateX(-8px);
154
+ }
155
+
156
+ .dropdown-menu.placement-right.open {
157
+ transform: scale(1) translateX(0);
158
+ }
159
+
160
+ .dropdown-menu.open.searching,
161
+ .dropdown-menu.open.inline-categories {
162
+ max-height: 250px;
163
+ overflow-y: auto;
164
+ }
165
+
166
+ .dropdown-menu.open:not(.searching):not(.inline-categories) {
167
+ overflow: visible;
168
+ }
169
+
170
+ /* Bottom sheet drawer styles */
171
+ .sheet-backdrop {
172
+ position: fixed;
173
+ inset: 0;
174
+ z-index: 1000;
175
+ background-color: rgba(0, 0, 0, 0.4);
176
+ opacity: 0;
177
+ visibility: hidden;
178
+ transition: opacity var(--speed3) cubic-bezier(0.2, 0.8, 0.2, 1), visibility var(--speed3);
179
+ display: flex;
180
+ flex-direction: column;
181
+ justify-content: flex-end;
182
+ }
183
+
184
+ .sheet-backdrop.open {
185
+ opacity: 1;
186
+ visibility: visible;
187
+ }
188
+
189
+ .sheet-drawer {
190
+ background-color: var(--surface-container);
191
+ border-radius: 1.75rem 1.75rem 0 0;
192
+ box-shadow: var(--elevate3);
193
+ max-height: 70vh;
194
+ display: flex;
195
+ flex-direction: column;
196
+ transform: translateY(100%);
197
+ transition: transform var(--speed3) cubic-bezier(0.16, 1, 0.3, 1);
198
+ padding: 16px 0;
199
+ }
200
+
201
+ .sheet-drawer.open {
202
+ transform: translateY(0);
203
+ }
204
+
205
+ .sheet-handle {
206
+ width: 40px;
207
+ height: 4px;
208
+ background-color: var(--outline-variant);
209
+ border-radius: 2px;
210
+ margin: 0 auto 16px;
211
+ }
212
+
213
+ .sheet-title {
214
+ padding: 0 24px 8px;
215
+ font-size: 1.125rem;
216
+ font-weight: 700;
217
+ color: var(--on-surface);
218
+ }
219
+
220
+ .sheet-search-wrapper {
221
+ padding: 0 16px 12px;
222
+ }
223
+
224
+ .sheet-search-input {
225
+ width: 100%;
226
+ box-sizing: border-box;
227
+ padding: 10px 16px;
228
+ border: 1px solid var(--outline);
229
+ border-radius: 9999px;
230
+ background: var(--surface-container-high);
231
+ color: var(--on-surface);
232
+ font-size: 1rem;
233
+ outline: none;
234
+ }
235
+
236
+ .sheet-search-input:focus {
237
+ border-color: var(--primary);
238
+ }
239
+
240
+ .sheet-options-list {
241
+ list-style: none;
242
+ padding: 0;
243
+ margin: 0;
244
+ overflow-y: auto;
245
+ flex: 1;
246
+ }
247
+
248
+ /* Animated Drilldown Slide Layout */
249
+ .drilldown-wrapper {
250
+ width: 100%;
251
+ overflow: hidden;
252
+ position: relative;
253
+ transition: height var(--speed3) cubic-bezier(0.2, 0.8, 0.2, 1);
254
+ }
255
+
256
+ .drilldown-track {
257
+ display: flex;
258
+ width: 200%;
259
+ transition: transform var(--speed3) cubic-bezier(0.2, 0.8, 0.2, 1);
260
+ }
261
+
262
+ .drilldown-track.slide-active {
263
+ transform: translateX(-50%);
264
+ }
265
+
266
+ .drilldown-panel {
267
+ width: 50%;
268
+ box-sizing: border-box;
269
+ list-style: none;
270
+ padding: 0;
271
+ margin: 0;
272
+ flex-shrink: 0;
273
+ }
274
+
275
+ .drilldown-panel.panel-active {
276
+ max-height: none;
277
+ }
278
+
279
+ .drilldown-panel.panel-inactive {
280
+ max-height: 0;
281
+ overflow: hidden;
282
+ }
283
+
284
+ /* Group / Subcategory header (Browsing mode - acts as a hover trigger for submenus) */
285
+ .group-header {
286
+ padding: 8px 16px;
287
+ font-size: 0.875rem;
288
+ font-weight: 500;
289
+ color: var(--on-surface);
290
+ cursor: pointer;
291
+ display: flex;
292
+ align-items: center;
293
+ position: relative;
294
+ user-select: none;
295
+ transition: background-color var(--speed2) ease, color var(--speed2) ease;
296
+ }
297
+
298
+ .group-header:hover,
299
+ .group-header.active {
300
+ background-color: var(--surface-container-high);
301
+ color: var(--primary);
302
+ }
303
+
304
+ /* Inline header (Searching mode & Sheet mode - flat layout) */
305
+ .group-header-flat {
306
+ padding: 6px 16px;
307
+ font-size: 0.75rem;
308
+ font-weight: 700;
309
+ text-transform: uppercase;
310
+ color: var(--primary);
311
+ letter-spacing: 0.05em;
312
+ background-color: var(--surface-container-low);
313
+ user-select: none;
314
+ }
315
+
316
+ /* Hierarchical sub-menu with premium flyout animation */
317
+ .submenu {
318
+ display: block;
319
+ opacity: 0;
320
+ visibility: hidden;
321
+ position: absolute;
322
+ top: 0;
323
+ background-color: var(--surface-container-highest);
324
+ box-shadow: var(--elevate3);
325
+ border-radius: 0.5rem;
326
+ padding: 4px 0;
327
+ list-style: none;
328
+ min-width: 160px;
329
+ z-index: 110;
330
+ transition:
331
+ opacity var(--speed2) cubic-bezier(0.2, 0.8, 0.2, 1),
332
+ transform var(--speed2) cubic-bezier(0.34, 1.56, 0.64, 1),
333
+ visibility var(--speed2);
334
+ }
335
+
336
+ .submenu.open-right {
337
+ left: 100%;
338
+ margin-left: 2px;
339
+ transform: scale(0.9) translateX(-10px);
340
+ transform-origin: top left;
341
+ }
342
+
343
+ .submenu.open-left {
344
+ right: 100%;
345
+ margin-right: 2px;
346
+ transform: scale(0.9) translateX(10px);
347
+ transform-origin: top right;
348
+ }
349
+
350
+ .group-header:hover > .submenu.active,
351
+ .group-header.active > .submenu.active {
352
+ opacity: 1;
353
+ visibility: visible;
354
+ transform: scale(1) translateX(0);
355
+ }
356
+
357
+ .option-item {
358
+ cursor: pointer;
359
+ padding: 8px 16px;
360
+ font-size: 0.875rem;
361
+ color: var(--on-surface);
362
+ display: flex;
363
+ align-items: center;
364
+ transition: background-color var(--speed2) ease;
365
+ }
366
+
367
+ .option-item:hover,
368
+ .option-item.active-nav {
369
+ background-color: var(--surface-container-high);
370
+ }
371
+
372
+ .option-item.selected {
373
+ background-color: var(--tertiary-container);
374
+ color: var(--on-tertiary-container);
375
+ font-weight: 500;
376
+ }
377
+
378
+ .option-item.disabled {
379
+ opacity: 0.5;
380
+ pointer-events: none;
381
+ }
382
+
383
+ .no-options {
384
+ padding: 12px 16px;
385
+ font-size: 0.875rem;
386
+ color: var(--outline);
387
+ text-align: center;
388
+ }
389
+ `
390
+ ]; }
391
+ connectedCallback() {
392
+ super.connectedCallback();
393
+ document.addEventListener('click', this._handleOutsideClick);
394
+ window.addEventListener('scroll', this._handleScroll, { capture: true });
395
+ window.addEventListener('resize', this._handleResize);
396
+ }
397
+ disconnectedCallback() {
398
+ super.disconnectedCallback();
399
+ document.removeEventListener('click', this._handleOutsideClick);
400
+ window.removeEventListener('scroll', this._handleScroll, { capture: true });
401
+ window.removeEventListener('resize', this._handleResize);
402
+ }
403
+ updated(changedProperties) {
404
+ super.updated(changedProperties);
405
+ if (changedProperties.has('_open') ||
406
+ changedProperties.has('_drilldownPath') ||
407
+ changedProperties.has('_searchQuery') ||
408
+ changedProperties.has('_useInlineCategories') ||
409
+ changedProperties.has('_parsedOptions')) {
410
+ this._updateWrapperHeight();
411
+ }
412
+ }
413
+ _updateWrapperHeight() {
414
+ const wrapper = this.shadowRoot?.querySelector('.drilldown-wrapper');
415
+ if (!wrapper)
416
+ return;
417
+ if (!this._open || this.sheet) {
418
+ wrapper.style.height = '';
419
+ return;
420
+ }
421
+ // Wait for Lit render and styles to apply
422
+ requestAnimationFrame(() => {
423
+ const activePanel = this.shadowRoot?.querySelector('.drilldown-panel.panel-active');
424
+ if (activePanel) {
425
+ wrapper.style.height = `${activePanel.scrollHeight}px`;
426
+ }
427
+ else {
428
+ wrapper.style.height = '';
429
+ }
430
+ });
431
+ }
432
+ _determineActualPlacement() {
433
+ if (this.sheet) {
434
+ this._actualPlacement = 'bottom';
435
+ return;
436
+ }
437
+ const rect = this.getBoundingClientRect();
438
+ const viewportHeight = window.innerHeight;
439
+ const viewportWidth = window.innerWidth;
440
+ const spaceBelow = viewportHeight - rect.bottom;
441
+ const spaceAbove = rect.top;
442
+ const spaceRight = viewportWidth - rect.right;
443
+ const spaceLeft = rect.left;
444
+ const menuHeight = 260; // 250px max-height + 10px buffer
445
+ const menuWidth = 180; // Estimated menu width buffer
446
+ let preferred = this.placement;
447
+ if (preferred === 'auto') {
448
+ preferred = spaceBelow >= menuHeight ? 'bottom' : (spaceAbove > spaceBelow ? 'top' : 'bottom');
449
+ }
450
+ if (preferred === 'top') {
451
+ if (spaceAbove < menuHeight && spaceBelow > spaceAbove) {
452
+ this._actualPlacement = 'bottom';
453
+ }
454
+ else {
455
+ this._actualPlacement = 'top';
456
+ }
457
+ }
458
+ else if (preferred === 'bottom') {
459
+ if (spaceBelow < menuHeight && spaceAbove > spaceBelow) {
460
+ this._actualPlacement = 'top';
461
+ }
462
+ else {
463
+ this._actualPlacement = 'bottom';
464
+ }
465
+ }
466
+ else if (preferred === 'left') {
467
+ if (spaceLeft < menuWidth && spaceRight > spaceLeft) {
468
+ this._actualPlacement = 'right';
469
+ }
470
+ else {
471
+ this._actualPlacement = 'left';
472
+ }
473
+ }
474
+ else if (preferred === 'right') {
475
+ if (spaceRight < menuWidth && spaceLeft > spaceRight) {
476
+ this._actualPlacement = 'left';
477
+ }
478
+ else {
479
+ this._actualPlacement = 'right';
480
+ }
481
+ }
482
+ }
483
+ _updateMenuPosition() {
484
+ if (!this._open || this.sheet)
485
+ return;
486
+ this._determineActualPlacement();
487
+ if (this.positioning !== 'fixed')
488
+ return;
489
+ const rect = this.getBoundingClientRect();
490
+ let widthStyle = '';
491
+ if (this.dropdownWidth === 'trigger') {
492
+ widthStyle = `width: ${rect.width}px;`;
493
+ }
494
+ else if (this.dropdownWidth === 'auto') {
495
+ widthStyle = 'width: auto; min-width: 160px; max-width: 320px;';
496
+ }
497
+ else {
498
+ widthStyle = `width: ${this.dropdownWidth};`;
499
+ }
500
+ if (this._actualPlacement === 'top') {
501
+ this._menuStyle = `
502
+ position: fixed;
503
+ bottom: ${window.innerHeight - rect.top}px;
504
+ left: ${rect.left}px;
505
+ ${widthStyle}
506
+ top: auto;
507
+ right: auto;
508
+ `;
509
+ }
510
+ else if (this._actualPlacement === 'bottom') {
511
+ this._menuStyle = `
512
+ position: fixed;
513
+ top: ${rect.bottom}px;
514
+ left: ${rect.left}px;
515
+ ${widthStyle}
516
+ bottom: auto;
517
+ right: auto;
518
+ `;
519
+ }
520
+ else if (this._actualPlacement === 'left') {
521
+ this._menuStyle = `
522
+ position: fixed;
523
+ top: ${rect.top}px;
524
+ right: ${window.innerWidth - rect.left + 4}px;
525
+ ${widthStyle}
526
+ left: auto;
527
+ bottom: auto;
528
+ `;
529
+ }
530
+ else if (this._actualPlacement === 'right') {
531
+ this._menuStyle = `
532
+ position: fixed;
533
+ top: ${rect.top}px;
534
+ left: ${rect.right + 4}px;
535
+ ${widthStyle}
536
+ right: auto;
537
+ bottom: auto;
538
+ `;
539
+ }
540
+ }
541
+ _getMenuStyle() {
542
+ if (this.positioning === 'fixed') {
543
+ return this._menuStyle;
544
+ }
545
+ if (this.dropdownWidth === 'auto') {
546
+ return 'width: max-content; min-width: 160px; max-width: 320px;';
547
+ }
548
+ else if (this.dropdownWidth !== 'trigger') {
549
+ return `width: ${this.dropdownWidth};`;
550
+ }
551
+ return '';
552
+ }
553
+ _onSlotChange() {
554
+ if (!this._slot)
555
+ return;
556
+ const assigned = this._slot.assignedElements({ flatten: true });
557
+ const tree = [];
558
+ const findOrCreateGroup = (nodes, label) => {
559
+ let group = nodes.find(n => n.type === 'group' && n.label === label);
560
+ if (!group) {
561
+ group = { type: 'group', label, children: [] };
562
+ nodes.push(group);
563
+ }
564
+ return group;
565
+ };
566
+ const insertOption = (targetTree, opt, groupPath) => {
567
+ let currentLevel = targetTree;
568
+ if (groupPath.length > 0) {
569
+ opt.group = groupPath.join(' / ');
570
+ }
571
+ groupPath.forEach(part => {
572
+ const group = findOrCreateGroup(currentLevel, part);
573
+ currentLevel = group.children;
574
+ });
575
+ currentLevel.push(opt);
576
+ };
577
+ const parseElement = (el, parentGroupPath) => {
578
+ const tag = el.tagName.toLowerCase();
579
+ if (tag === 'option' || tag === 'moni-select-option') {
580
+ const opt = {
581
+ type: 'option',
582
+ value: el.getAttribute('value') || '',
583
+ label: el.textContent?.trim() || el.getAttribute('label') || el.getAttribute('value') || '',
584
+ disabled: el.hasAttribute('disabled'),
585
+ element: el
586
+ };
587
+ const groupAttr = el.getAttribute('group');
588
+ const localPath = groupAttr ? groupAttr.split('/').map(s => s.trim()).filter(Boolean) : [];
589
+ const finalPath = [...parentGroupPath, ...localPath];
590
+ insertOption(tree, opt, finalPath);
591
+ }
592
+ else if (tag === 'optgroup') {
593
+ const label = el.getAttribute('label') || '';
594
+ const localPath = [...parentGroupPath, label];
595
+ Array.from(el.children).forEach(child => parseElement(child, localPath));
596
+ }
597
+ };
598
+ assigned.forEach(el => parseElement(el, []));
599
+ this._parsedOptions = tree;
600
+ this.requestUpdate();
601
+ }
602
+ _toggleDropdown(e) {
603
+ if (e) {
604
+ e.stopPropagation();
605
+ }
606
+ if (this.disabled)
607
+ return;
608
+ if (this._open) {
609
+ this._closeDropdown();
610
+ }
611
+ else {
612
+ this._openDropdown();
613
+ }
614
+ }
615
+ _onInputClick(e) {
616
+ if (this.disabled)
617
+ return;
618
+ if (this.searchable && !this.sheet) {
619
+ if (!this._open) {
620
+ this._openDropdown();
621
+ }
622
+ }
623
+ else {
624
+ this._toggleDropdown(e);
625
+ }
626
+ }
627
+ _openDropdown() {
628
+ this._open = true;
629
+ this._activeIndex = -1;
630
+ this._drilldownPath = [];
631
+ this._determineActualPlacement();
632
+ // Measure viewport to determine if we should fall back to inline categories
633
+ const rect = this.getBoundingClientRect();
634
+ const spaceOnRight = window.innerWidth - rect.right;
635
+ const spaceOnLeft = rect.left;
636
+ this._useInlineCategories = window.innerWidth < 600 || (spaceOnRight < 160 && spaceOnLeft < 160);
637
+ if (this.positioning === 'fixed') {
638
+ this._updateMenuPosition();
639
+ }
640
+ if (this.searchable) {
641
+ const selectedOpt = this._findOptionByValue(this.value);
642
+ this._searchQuery = selectedOpt ? selectedOpt.label : '';
643
+ setTimeout(() => {
644
+ if (this._input && !this.sheet) {
645
+ this._input.focus();
646
+ this._input.select();
647
+ }
648
+ else if (this.sheet) {
649
+ const sheetInput = this.shadowRoot?.querySelector('.sheet-search-input');
650
+ if (sheetInput) {
651
+ sheetInput.focus();
652
+ sheetInput.select();
653
+ }
654
+ }
655
+ }, 50);
656
+ }
657
+ }
658
+ _closeDropdown() {
659
+ this._open = false;
660
+ this._searchQuery = '';
661
+ this.requestUpdate();
662
+ }
663
+ _findOptionByValue(value) {
664
+ return this._getFlatOptions(this._parsedOptions).find(opt => opt.value === value);
665
+ }
666
+ _onSearchInput(e) {
667
+ const query = e.target.value;
668
+ this._searchQuery = query;
669
+ this._open = true;
670
+ this._activeIndex = -1;
671
+ if (this.clearable && query.trim() === '') {
672
+ this.value = '';
673
+ this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
674
+ this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
675
+ return;
676
+ }
677
+ const flat = this._getFlatOptions(this._parsedOptions);
678
+ const exactMatch = flat.find(opt => opt.label.toLowerCase() === query.trim().toLowerCase());
679
+ if (exactMatch && !exactMatch.disabled) {
680
+ this._selectOption(exactMatch);
681
+ }
682
+ }
683
+ _selectOption(option) {
684
+ if (option.disabled)
685
+ return;
686
+ this.value = option.value;
687
+ this._closeDropdown();
688
+ this.dispatchEvent(new Event('input', { bubbles: true, composed: true }));
689
+ this.dispatchEvent(new Event('change', { bubbles: true, composed: true }));
690
+ }
691
+ _onSubmenuMouseEnter(e) {
692
+ const headerEl = e.currentTarget;
693
+ const submenu = headerEl.querySelector(':scope > .submenu');
694
+ if (!submenu)
695
+ return;
696
+ const rect = headerEl.getBoundingClientRect();
697
+ const spaceOnRight = window.innerWidth - rect.right;
698
+ const spaceOnLeft = rect.left;
699
+ const submenuWidth = 160;
700
+ if (spaceOnRight < submenuWidth && spaceOnLeft > spaceOnRight) {
701
+ submenu.classList.remove('open-right');
702
+ submenu.classList.add('open-left');
703
+ }
704
+ else {
705
+ submenu.classList.remove('open-left');
706
+ submenu.classList.add('open-right');
707
+ }
708
+ }
709
+ _onKeyDown(e) {
710
+ if (this.disabled)
711
+ return;
712
+ const visible = this._getVisibleOptions();
713
+ if (e.key === 'ArrowDown') {
714
+ e.preventDefault();
715
+ if (!this._open) {
716
+ this._openDropdown();
717
+ }
718
+ else if (visible.length > 0) {
719
+ this._activeIndex = (this._activeIndex + 1) % visible.length;
720
+ this._scrollToActive();
721
+ }
722
+ }
723
+ else if (e.key === 'ArrowUp') {
724
+ e.preventDefault();
725
+ if (this._open && visible.length > 0) {
726
+ this._activeIndex = (this._activeIndex - 1 + visible.length) % visible.length;
727
+ this._scrollToActive();
728
+ }
729
+ }
730
+ else if (e.key === 'Enter') {
731
+ e.preventDefault();
732
+ if (this._open) {
733
+ if (this._activeIndex >= 0 && this._activeIndex < visible.length) {
734
+ this._selectOption(visible[this._activeIndex]);
735
+ }
736
+ }
737
+ else {
738
+ this._openDropdown();
739
+ }
740
+ }
741
+ else if (e.key === 'Escape') {
742
+ e.preventDefault();
743
+ this._closeDropdown();
744
+ }
745
+ }
746
+ _scrollToActive() {
747
+ setTimeout(() => {
748
+ const activeEl = this.shadowRoot?.querySelector('.option-item.active-nav');
749
+ if (activeEl) {
750
+ activeEl.scrollIntoView({ block: 'nearest' });
751
+ }
752
+ }, 0);
753
+ }
754
+ _getFlatOptions(nodes) {
755
+ const flat = [];
756
+ const traverse = (n) => {
757
+ if (n.type === 'option') {
758
+ flat.push(n);
759
+ }
760
+ else {
761
+ n.children.forEach(traverse);
762
+ }
763
+ };
764
+ nodes.forEach(traverse);
765
+ return flat;
766
+ }
767
+ _getFilteredOptions() {
768
+ const flat = this._getFlatOptions(this._parsedOptions);
769
+ if (!this._searchQuery)
770
+ return flat;
771
+ const query = this._searchQuery.toLowerCase();
772
+ return flat.filter(opt => opt.label.toLowerCase().includes(query) || opt.value.toLowerCase().includes(query));
773
+ }
774
+ _getVisibleOptions() {
775
+ const filtered = this._getFilteredOptions();
776
+ if (this._searchQuery)
777
+ return filtered;
778
+ if (this.sheet || this._useInlineCategories) {
779
+ if (this._drilldownPath.length > 0) {
780
+ const activeGroup = this._drilldownPath[this._drilldownPath.length - 1];
781
+ return activeGroup.children.filter(n => n.type === 'option');
782
+ }
783
+ return this._parsedOptions.filter(n => n.type === 'option');
784
+ }
785
+ return filtered;
786
+ }
787
+ _renderRootList() {
788
+ let visibleIndex = 0;
789
+ return this._parsedOptions.map(node => {
790
+ if (node.type === 'option') {
791
+ const currentIdx = visibleIndex++;
792
+ const isSelected = node.value === this.value;
793
+ const isActiveNav = this._drilldownPath.length === 0 && currentIdx === this._activeIndex;
794
+ return html `
795
+ <li
796
+ class="option-item ${isSelected ? 'selected' : ''} ${isActiveNav ? 'active-nav' : ''} ${node.disabled ? 'disabled' : ''}"
797
+ @click=${() => this._selectOption(node)}
798
+ >
799
+ ${node.label}
800
+ </li>
801
+ `;
802
+ }
803
+ return html `
804
+ <li class="group-header" @click=${(e) => { e.stopPropagation(); this._drilldownPath = [...this._drilldownPath, node]; }}>
805
+ <span>${node.label}</span>
806
+ <moni-icon name="chevron_right" style="margin-inline-start: auto; font-size: 1.125rem;"></moni-icon>
807
+ </li>
808
+ `;
809
+ });
810
+ }
811
+ _renderSubcategoryList() {
812
+ if (this._drilldownPath.length === 0)
813
+ return nothing;
814
+ const activeGroup = this._drilldownPath[this._drilldownPath.length - 1];
815
+ let visibleIndex = 0;
816
+ return html `
817
+ <li class="group-header" @click=${(e) => { e.stopPropagation(); this._drilldownPath = this._drilldownPath.slice(0, -1); }}>
818
+ <moni-icon name="arrow_back" style="font-size: 1.25rem; margin-inline-end: 8px;"></moni-icon>
819
+ <span>Regresar</span>
820
+ </li>
821
+ <li class="group-header-flat">${activeGroup.label}</li>
822
+ ${activeGroup.children.map(node => {
823
+ if (node.type === 'option') {
824
+ const currentIdx = visibleIndex++;
825
+ const isSelected = node.value === this.value;
826
+ const isActiveNav = this._drilldownPath.length > 0 && currentIdx === this._activeIndex;
827
+ return html `
828
+ <li
829
+ class="option-item ${isSelected ? 'selected' : ''} ${isActiveNav ? 'active-nav' : ''} ${node.disabled ? 'disabled' : ''}"
830
+ @click=${() => this._selectOption(node)}
831
+ >
832
+ ${node.label}
833
+ </li>
834
+ `;
835
+ }
836
+ return html `
837
+ <li class="group-header" @click=${(e) => { e.stopPropagation(); this._drilldownPath = [...this._drilldownPath, node]; }}>
838
+ <span>${node.label}</span>
839
+ <moni-icon name="chevron_right" style="margin-inline-start: auto; font-size: 1.125rem;"></moni-icon>
840
+ </li>
841
+ `;
842
+ })}
843
+ `;
844
+ }
845
+ _renderDesktopNode(node, flatIndexRef) {
846
+ if (node.type === 'option') {
847
+ const currentIdx = flatIndexRef.value++;
848
+ const isSelected = node.value === this.value;
849
+ const isActiveNav = currentIdx === this._activeIndex;
850
+ return html `
851
+ <li
852
+ class="option-item ${isSelected ? 'selected' : ''} ${isActiveNav ? 'active-nav' : ''} ${node.disabled ? 'disabled' : ''}"
853
+ @click=${() => this._selectOption(node)}
854
+ >
855
+ ${node.label}
856
+ </li>
857
+ `;
858
+ }
859
+ return html `
860
+ <li
861
+ class="group-header"
862
+ @mouseenter=${this._onSubmenuMouseEnter}
863
+ @click=${(e) => e.stopPropagation()}
864
+ >
865
+ <span>${node.label}</span>
866
+ <moni-icon name="chevron_right" style="margin-inline-start: auto; font-size: 1.125rem;"></moni-icon>
867
+
868
+ <ul class="submenu active open-right">
869
+ ${node.children.map(child => this._renderDesktopNode(child, flatIndexRef))}
870
+ </ul>
871
+ </li>
872
+ `;
873
+ }
874
+ _renderOptionsList(filtered) {
875
+ if (this._parsedOptions.length === 0) {
876
+ return html `<li class="no-options">No options found</li>`;
877
+ }
878
+ if (this._searchQuery) {
879
+ const groups = {};
880
+ filtered.forEach(opt => {
881
+ const gName = opt.group || '';
882
+ if (!groups[gName])
883
+ groups[gName] = [];
884
+ groups[gName].push(opt);
885
+ });
886
+ let flatIndex = 0;
887
+ return Object.entries(groups).map(([groupName, groupOpts]) => html `
888
+ ${groupName ? html `<li class="group-header-flat">${groupName}</li>` : nothing}
889
+ ${groupOpts.map(opt => {
890
+ const currentIdx = flatIndex++;
891
+ const isSelected = opt.value === this.value;
892
+ const isActiveNav = currentIdx === this._activeIndex;
893
+ return html `
894
+ <li
895
+ class="option-item ${isSelected ? 'selected' : ''} ${isActiveNav ? 'active-nav' : ''} ${opt.disabled ? 'disabled' : ''}"
896
+ @click=${() => this._selectOption(opt)}
897
+ >
898
+ ${opt.label}
899
+ </li>
900
+ `;
901
+ })}
902
+ `);
903
+ }
904
+ if (this.sheet || this._useInlineCategories) {
905
+ const isRootActive = this._drilldownPath.length === 0;
906
+ const isSubActive = !isRootActive;
907
+ return html `
908
+ <div class="drilldown-wrapper">
909
+ <div class="drilldown-track ${this._drilldownPath.length > 0 ? 'slide-active' : ''}">
910
+ <ul class="drilldown-panel ${isRootActive ? 'panel-active' : 'panel-inactive'}">
911
+ ${this._renderRootList()}
912
+ </ul>
913
+ <ul class="drilldown-panel ${isSubActive ? 'panel-active' : 'panel-inactive'}">
914
+ ${this._renderSubcategoryList()}
915
+ </ul>
916
+ </div>
917
+ </div>
918
+ `;
919
+ }
920
+ const flatIndexRef = { value: 0 };
921
+ return this._parsedOptions.map(node => this._renderDesktopNode(node, flatIndexRef));
922
+ }
923
+ render() {
924
+ const hasLeading = Boolean(this.icon);
925
+ const filtered = this._getFilteredOptions();
926
+ // Find selected option label
927
+ const selectedOpt = this._findOptionByValue(this.value);
928
+ const displayValue = this._open && this.searchable && !this.sheet
929
+ ? this._searchQuery
930
+ : (selectedOpt ? selectedOpt.label : '');
931
+ const isActive = Boolean(displayValue || this.placeholder);
932
+ const fieldClasses = {
933
+ field: true,
934
+ label: Boolean(this.label),
935
+ fill: this.variant === 'filled',
936
+ border: this.variant === 'outlined',
937
+ small: this.size === 'small',
938
+ large: this.size === 'large',
939
+ extra: this.size === 'extra',
940
+ prefix: hasLeading,
941
+ suffix: true,
942
+ invalid: this.error,
943
+ round: this.shape === 'round',
944
+ square: this.shape === 'no-round'
945
+ };
946
+ const leading = this.icon
947
+ ? html `<i class="leading-icon" part="leading-icon"
948
+ ><moni-icon name="${this.icon}"></moni-icon
949
+ ></i>`
950
+ : nothing;
951
+ const trailing = this.loading
952
+ ? html `<i class="trailing-icon" part="trailing-icon"
953
+ ><moni-progress
954
+ variant="circular"
955
+ indeterminate
956
+ size="small"
957
+ style="inline-size: 1.25rem; block-size: 1.25rem; color: currentColor;"
958
+ ></moni-progress
959
+ ></i>`
960
+ : html `<i class="trailing-icon" part="trailing-icon" @click=${this._toggleDropdown}
961
+ ><moni-icon name="${this.trailingIcon}"></moni-icon
962
+ ></i>`;
963
+ const menuClasses = {
964
+ 'dropdown-menu': true,
965
+ open: this._open,
966
+ searching: Boolean(this._searchQuery),
967
+ 'inline-categories': this._useInlineCategories,
968
+ 'placement-top': this._actualPlacement === 'top',
969
+ 'placement-bottom': this._actualPlacement === 'bottom'
970
+ };
971
+ return html `<div class=${classMap(fieldClasses)} part="field">
972
+ ${leading}
973
+ <input
974
+ type="text"
975
+ part="input"
976
+ .value=${displayValue}
977
+ ?readonly=${!this.searchable || this.sheet}
978
+ ?disabled=${this.disabled}
979
+ inputmode=${ifDefined(!this.searchable || this.sheet ? 'none' : undefined)}
980
+ placeholder=${this.placeholder || ''}
981
+ class=${isActive ? 'active' : ''}
982
+ @click=${this._onInputClick}
983
+ @input=${this._onSearchInput}
984
+ @keydown=${this._onKeyDown}
985
+ />
986
+ ${this.label
987
+ ? html `<label
988
+ part="label"
989
+ class=${classMap({ active: isActive })}
990
+ >${this.label}</label
991
+ >`
992
+ : nothing}
993
+ ${trailing}
994
+
995
+ ${this.sheet
996
+ ? html `
997
+ <div class="sheet-backdrop ${this._open ? 'open' : ''}" @click=${this._closeDropdown}>
998
+ <div class="sheet-drawer ${this._open ? 'open' : ''}" @click=${(e) => e.stopPropagation()}>
999
+ <div class="sheet-handle"></div>
1000
+ ${this.label ? html `<div class="sheet-title">${this.label}</div>` : nothing}
1001
+ ${this.searchable
1002
+ ? html `
1003
+ <div class="sheet-search-wrapper">
1004
+ <input
1005
+ type="text"
1006
+ class="sheet-search-input"
1007
+ .value=${this._searchQuery}
1008
+ placeholder="Buscar..."
1009
+ @input=${this._onSearchInput}
1010
+ />
1011
+ </div>
1012
+ `
1013
+ : nothing}
1014
+ <ul class="sheet-options-list">
1015
+ ${this._renderOptionsList(filtered)}
1016
+ </ul>
1017
+ </div>
1018
+ </div>
1019
+ `
1020
+ : html `
1021
+ <ul
1022
+ class=${classMap(menuClasses)}
1023
+ part="menu"
1024
+ style=${this._getMenuStyle()}
1025
+ >
1026
+ ${this._renderOptionsList(filtered)}
1027
+ </ul>
1028
+ `}
1029
+
1030
+ <slot style="display: none;" @slotchange=${this._onSlotChange}></slot>
1031
+
1032
+ ${this.error
1033
+ ? html `<output part="helper" class="invalid"
1034
+ >${this.errorText || this.helper}</output
1035
+ >`
1036
+ : this.helper
1037
+ ? html `<output part="helper">${this.helper}</output>`
1038
+ : nothing}
1039
+ </div>`;
1040
+ }
1041
+ };
1042
+ __decorate([
1043
+ property({ reflect: true })
1044
+ ], MoniSelect.prototype, "name", void 0);
1045
+ __decorate([
1046
+ property({ reflect: true })
1047
+ ], MoniSelect.prototype, "label", void 0);
1048
+ __decorate([
1049
+ property({ reflect: true })
1050
+ ], MoniSelect.prototype, "variant", void 0);
1051
+ __decorate([
1052
+ property({ reflect: true })
1053
+ ], MoniSelect.prototype, "size", void 0);
1054
+ __decorate([
1055
+ property({ reflect: true })
1056
+ ], MoniSelect.prototype, "shape", void 0);
1057
+ __decorate([
1058
+ property({ type: Boolean, reflect: true })
1059
+ ], MoniSelect.prototype, "disabled", void 0);
1060
+ __decorate([
1061
+ property({ type: Boolean, reflect: true })
1062
+ ], MoniSelect.prototype, "loading", void 0);
1063
+ __decorate([
1064
+ property({ reflect: true })
1065
+ ], MoniSelect.prototype, "helper", void 0);
1066
+ __decorate([
1067
+ property({ reflect: true, attribute: 'error-text' })
1068
+ ], MoniSelect.prototype, "errorText", void 0);
1069
+ __decorate([
1070
+ property({ type: Boolean, reflect: true })
1071
+ ], MoniSelect.prototype, "error", void 0);
1072
+ __decorate([
1073
+ property({ reflect: true })
1074
+ ], MoniSelect.prototype, "value", void 0);
1075
+ __decorate([
1076
+ property({ reflect: true })
1077
+ ], MoniSelect.prototype, "icon", void 0);
1078
+ __decorate([
1079
+ property({ reflect: true, attribute: 'trailing-icon' })
1080
+ ], MoniSelect.prototype, "trailingIcon", void 0);
1081
+ __decorate([
1082
+ property({ type: Boolean, reflect: true })
1083
+ ], MoniSelect.prototype, "searchable", void 0);
1084
+ __decorate([
1085
+ property({ type: Boolean, reflect: true })
1086
+ ], MoniSelect.prototype, "clearable", void 0);
1087
+ __decorate([
1088
+ property({ type: Boolean, reflect: true })
1089
+ ], MoniSelect.prototype, "sheet", void 0);
1090
+ __decorate([
1091
+ property({ reflect: true })
1092
+ ], MoniSelect.prototype, "placeholder", void 0);
1093
+ __decorate([
1094
+ property({ reflect: true })
1095
+ ], MoniSelect.prototype, "positioning", void 0);
1096
+ __decorate([
1097
+ property({ reflect: true })
1098
+ ], MoniSelect.prototype, "placement", void 0);
1099
+ __decorate([
1100
+ property({ reflect: true, attribute: 'dropdown-width' })
1101
+ ], MoniSelect.prototype, "dropdownWidth", void 0);
1102
+ __decorate([
1103
+ state()
1104
+ ], MoniSelect.prototype, "_open", void 0);
1105
+ __decorate([
1106
+ state()
1107
+ ], MoniSelect.prototype, "_searchQuery", void 0);
1108
+ __decorate([
1109
+ state()
1110
+ ], MoniSelect.prototype, "_actualPlacement", void 0);
1111
+ __decorate([
1112
+ state()
1113
+ ], MoniSelect.prototype, "_parsedOptions", void 0);
1114
+ __decorate([
1115
+ state()
1116
+ ], MoniSelect.prototype, "_activeIndex", void 0);
1117
+ __decorate([
1118
+ state()
1119
+ ], MoniSelect.prototype, "_menuStyle", void 0);
1120
+ __decorate([
1121
+ state()
1122
+ ], MoniSelect.prototype, "_useInlineCategories", void 0);
1123
+ __decorate([
1124
+ state()
1125
+ ], MoniSelect.prototype, "_drilldownPath", void 0);
1126
+ __decorate([
1127
+ query('slot')
1128
+ ], MoniSelect.prototype, "_slot", void 0);
1129
+ __decorate([
1130
+ query('input')
1131
+ ], MoniSelect.prototype, "_input", void 0);
1132
+ MoniSelect = __decorate([
1133
+ customElement('moni-select')
1134
+ ], MoniSelect);
1135
+ export { MoniSelect };
1136
+ export default MoniSelect;