@moni-labs/moni-ui 0.4.4 → 0.4.6

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 (862) hide show
  1. package/README.md +3 -3
  2. package/custom-elements.json +4670 -16030
  3. package/dist/browser/moni-ui.iife.min.js +848 -117
  4. package/dist/browser/moni-ui.iife.min.js.br +0 -0
  5. package/dist/browser/moni-ui.iife.min.js.gz +0 -0
  6. package/dist/browser/moni-ui.iife.min.js.map +1 -1
  7. package/dist/browser/moni-ui.min.js +3138 -1813
  8. package/dist/browser/moni-ui.min.js.br +0 -0
  9. package/dist/browser/moni-ui.min.js.gz +0 -0
  10. package/dist/browser/moni-ui.min.js.map +1 -1
  11. package/dist/cdn/components/moni-button-group.js +5 -3
  12. package/dist/cdn/components/moni-button.js +2 -2
  13. package/dist/cdn/components/moni-carousel.js +1 -1
  14. package/dist/cdn/components/moni-color-field.js +9 -6
  15. package/dist/cdn/components/moni-context-menu.js +4 -1
  16. package/dist/cdn/components/moni-file-field.js +9 -9
  17. package/dist/cdn/components/moni-morph-modal.js +2 -2
  18. package/dist/cdn/components/moni-nav.js +5 -5
  19. package/dist/cdn/components/moni-select.js +2 -0
  20. package/dist/cdn/components/moni-side-sheet.js +18 -6
  21. package/dist/cdn/components/moni-snackbar.js +15 -2
  22. package/dist/cdn/components/moni-stepper.js +1 -1
  23. package/dist/cdn/components/moni-text-field.js +2 -0
  24. package/dist/cdn/components/moni-textarea.js +2 -0
  25. package/dist/cdn/components/moni-toolbar.js +3 -1
  26. package/dist/cdn/components/moni-tooltip.js +60 -4
  27. package/dist/cdn/importmap.json +98 -98
  28. package/dist/components/index.d.ts +8 -0
  29. package/dist/components/index.d.ts.map +1 -1
  30. package/dist/components/index.js +8 -0
  31. package/dist/components/moni-button-group.d.ts.map +1 -1
  32. package/dist/components/moni-button-group.js +15 -4
  33. package/dist/components/moni-button.js +2 -2
  34. package/dist/components/moni-carousel.d.ts +2 -0
  35. package/dist/components/moni-carousel.d.ts.map +1 -1
  36. package/dist/components/moni-carousel.js +18 -0
  37. package/dist/components/moni-color-field.d.ts +19 -0
  38. package/dist/components/moni-color-field.d.ts.map +1 -1
  39. package/dist/components/moni-color-field.js +43 -2
  40. package/dist/components/moni-context-menu.d.ts.map +1 -1
  41. package/dist/components/moni-context-menu.js +14 -3
  42. package/dist/components/moni-file-field.d.ts.map +1 -1
  43. package/dist/components/moni-file-field.js +6 -3
  44. package/dist/components/moni-morph-modal.d.ts +21 -0
  45. package/dist/components/moni-morph-modal.d.ts.map +1 -1
  46. package/dist/components/moni-morph-modal.js +574 -52
  47. package/dist/components/moni-nav.d.ts.map +1 -1
  48. package/dist/components/moni-nav.js +4 -3
  49. package/dist/components/moni-select-option.d.ts.map +1 -1
  50. package/dist/components/moni-select-option.js +19 -0
  51. package/dist/components/moni-select.d.ts.map +1 -1
  52. package/dist/components/moni-select.js +2 -0
  53. package/dist/components/moni-side-sheet.d.ts +5 -0
  54. package/dist/components/moni-side-sheet.d.ts.map +1 -1
  55. package/dist/components/moni-side-sheet.js +48 -17
  56. package/dist/components/moni-snackbar.d.ts +1 -0
  57. package/dist/components/moni-snackbar.d.ts.map +1 -1
  58. package/dist/components/moni-snackbar.js +21 -1
  59. package/dist/components/moni-stepper.d.ts.map +1 -1
  60. package/dist/components/moni-stepper.js +4 -0
  61. package/dist/components/moni-text-field.d.ts.map +1 -1
  62. package/dist/components/moni-text-field.js +2 -0
  63. package/dist/components/moni-textarea.d.ts.map +1 -1
  64. package/dist/components/moni-textarea.js +2 -0
  65. package/dist/components/moni-toolbar.d.ts.map +1 -1
  66. package/dist/components/moni-toolbar.js +3 -1
  67. package/dist/components/moni-tooltip.d.ts +11 -2
  68. package/dist/components/moni-tooltip.d.ts.map +1 -1
  69. package/dist/components/moni-tooltip.js +195 -2
  70. package/dist/index.d.ts +1 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +1 -1
  73. package/docs/COMPONENTS.md +10 -0
  74. package/docs/LLM-GUIDE.md +107 -0
  75. package/docs/PUBLISHING.md +31 -0
  76. package/docs/README.md +64 -0
  77. package/docs/api.json +6178 -0
  78. package/docs/assets/moni-app-bar/elevated--false.png +0 -0
  79. package/docs/assets/moni-app-bar/elevated--true.png +0 -0
  80. package/docs/assets/moni-app-bar/placement--bottom.png +0 -0
  81. package/docs/assets/moni-app-bar/placement--top.png +0 -0
  82. package/docs/assets/moni-app-bar/size--default.png +0 -0
  83. package/docs/assets/moni-app-bar/size--prominent.png +0 -0
  84. package/docs/assets/moni-app-bar/subtitle--default.png +0 -0
  85. package/docs/assets/moni-app-bar/title--default.png +0 -0
  86. package/docs/assets/moni-app-bar/variant--floating.png +0 -0
  87. package/docs/assets/moni-app-bar/variant--standard.png +0 -0
  88. package/docs/assets/moni-badge/border--false.png +0 -0
  89. package/docs/assets/moni-badge/border--true.png +0 -0
  90. package/docs/assets/moni-badge/color--error.png +0 -0
  91. package/docs/assets/moni-badge/color--primary.png +0 -0
  92. package/docs/assets/moni-badge/color--secondary.png +0 -0
  93. package/docs/assets/moni-badge/color--tertiary.png +0 -0
  94. package/docs/assets/moni-badge/inline--false.png +0 -0
  95. package/docs/assets/moni-badge/inline--true.png +0 -0
  96. package/docs/assets/moni-badge/position--bottom.png +0 -0
  97. package/docs/assets/moni-badge/position--empty.png +0 -0
  98. package/docs/assets/moni-badge/position--left.png +0 -0
  99. package/docs/assets/moni-badge/position--none.png +0 -0
  100. package/docs/assets/moni-badge/position--right.png +0 -0
  101. package/docs/assets/moni-badge/position--top.png +0 -0
  102. package/docs/assets/moni-badge/shape--circle.png +0 -0
  103. package/docs/assets/moni-badge/shape--empty.png +0 -0
  104. package/docs/assets/moni-badge/shape--min.png +0 -0
  105. package/docs/assets/moni-badge/shape--square.png +0 -0
  106. package/docs/assets/moni-badge/value--default.png +0 -0
  107. package/docs/assets/moni-bottom-sheet/expandedHeight--default.png +0 -0
  108. package/docs/assets/moni-bottom-sheet/handle--false.png +0 -0
  109. package/docs/assets/moni-bottom-sheet/handle--true.png +0 -0
  110. package/docs/assets/moni-bottom-sheet/maxWidth--default.png +0 -0
  111. package/docs/assets/moni-bottom-sheet/modal--false.png +0 -0
  112. package/docs/assets/moni-bottom-sheet/modal--true.png +0 -0
  113. package/docs/assets/moni-bottom-sheet/open--true.png +0 -0
  114. package/docs/assets/moni-bottom-sheet/positioning--absolute.png +0 -0
  115. package/docs/assets/moni-bottom-sheet/positioning--body.png +0 -0
  116. package/docs/assets/moni-bottom-sheet/positioning--fixed.png +0 -0
  117. package/docs/assets/moni-bottom-sheet/positioning--static.png +0 -0
  118. package/docs/assets/moni-bottom-sheet/size--auto.png +0 -0
  119. package/docs/assets/moni-bottom-sheet/size--large.png +0 -0
  120. package/docs/assets/moni-bottom-sheet/size--medium.png +0 -0
  121. package/docs/assets/moni-bottom-sheet/size--small.png +0 -0
  122. package/docs/assets/moni-bottom-sheet/title--default.png +0 -0
  123. package/docs/assets/moni-button/active--false.png +0 -0
  124. package/docs/assets/moni-button/active--true.png +0 -0
  125. package/docs/assets/moni-button/disabled--false.png +0 -0
  126. package/docs/assets/moni-button/disabled--true.png +0 -0
  127. package/docs/assets/moni-button/href--default.png +0 -0
  128. package/docs/assets/moni-button/icon--default.png +0 -0
  129. package/docs/assets/moni-button/iconTrailing--default.png +0 -0
  130. package/docs/assets/moni-button/loading--false.png +0 -0
  131. package/docs/assets/moni-button/loading--true.png +0 -0
  132. package/docs/assets/moni-button/shape--bottom-round-flat.png +0 -0
  133. package/docs/assets/moni-button/shape--bottom-round.png +0 -0
  134. package/docs/assets/moni-button/shape--circle.png +0 -0
  135. package/docs/assets/moni-button/shape--inner-round.png +0 -0
  136. package/docs/assets/moni-button/shape--left-round-flat.png +0 -0
  137. package/docs/assets/moni-button/shape--left-round.png +0 -0
  138. package/docs/assets/moni-button/shape--no-round.png +0 -0
  139. package/docs/assets/moni-button/shape--right-round-flat.png +0 -0
  140. package/docs/assets/moni-button/shape--right-round.png +0 -0
  141. package/docs/assets/moni-button/shape--round.png +0 -0
  142. package/docs/assets/moni-button/shape--square.png +0 -0
  143. package/docs/assets/moni-button/shape--top-round-flat.png +0 -0
  144. package/docs/assets/moni-button/shape--top-round.png +0 -0
  145. package/docs/assets/moni-button/size--extra.png +0 -0
  146. package/docs/assets/moni-button/size--large.png +0 -0
  147. package/docs/assets/moni-button/size--medium.png +0 -0
  148. package/docs/assets/moni-button/size--small.png +0 -0
  149. package/docs/assets/moni-button/size--xlarge.png +0 -0
  150. package/docs/assets/moni-button/size--xsmall.png +0 -0
  151. package/docs/assets/moni-button/type--button.png +0 -0
  152. package/docs/assets/moni-button/type--reset.png +0 -0
  153. package/docs/assets/moni-button/type--submit.png +0 -0
  154. package/docs/assets/moni-button/variant--elevated.png +0 -0
  155. package/docs/assets/moni-button/variant--error.png +0 -0
  156. package/docs/assets/moni-button/variant--fill.png +0 -0
  157. package/docs/assets/moni-button/variant--filled.png +0 -0
  158. package/docs/assets/moni-button/variant--outlined.png +0 -0
  159. package/docs/assets/moni-button/variant--text.png +0 -0
  160. package/docs/assets/moni-button/variant--tonal.png +0 -0
  161. package/docs/assets/moni-button-group/gap--default.png +0 -0
  162. package/docs/assets/moni-button-group/label--default.png +0 -0
  163. package/docs/assets/moni-button-group/labelledBy--default.png +0 -0
  164. package/docs/assets/moni-button-group/multi--false.png +0 -0
  165. package/docs/assets/moni-button-group/multi--true.png +0 -0
  166. package/docs/assets/moni-button-group/resizing--fixed.png +0 -0
  167. package/docs/assets/moni-button-group/resizing--flexible.png +0 -0
  168. package/docs/assets/moni-button-group/role--group.png +0 -0
  169. package/docs/assets/moni-button-group/role--radiogroup.png +0 -0
  170. package/docs/assets/moni-button-group/role--toolbar.png +0 -0
  171. package/docs/assets/moni-button-group/selectionRequired--false.png +0 -0
  172. package/docs/assets/moni-button-group/selectionRequired--true.png +0 -0
  173. package/docs/assets/moni-button-group/shape--round.png +0 -0
  174. package/docs/assets/moni-button-group/shape--square.png +0 -0
  175. package/docs/assets/moni-button-group/size--extra.png +0 -0
  176. package/docs/assets/moni-button-group/size--large.png +0 -0
  177. package/docs/assets/moni-button-group/size--medium.png +0 -0
  178. package/docs/assets/moni-button-group/size--small.png +0 -0
  179. package/docs/assets/moni-button-group/size--xlarge.png +0 -0
  180. package/docs/assets/moni-button-group/size--xsmall.png +0 -0
  181. package/docs/assets/moni-button-group/variant--connected.png +0 -0
  182. package/docs/assets/moni-button-group/variant--standard.png +0 -0
  183. package/docs/assets/moni-button-segment/checked--false.png +0 -0
  184. package/docs/assets/moni-button-segment/checked--true.png +0 -0
  185. package/docs/assets/moni-button-segment/disabled--false.png +0 -0
  186. package/docs/assets/moni-button-segment/disabled--true.png +0 -0
  187. package/docs/assets/moni-button-segment/hideCheck--false.png +0 -0
  188. package/docs/assets/moni-button-segment/hideCheck--true.png +0 -0
  189. package/docs/assets/moni-button-segment/position--first.png +0 -0
  190. package/docs/assets/moni-button-segment/position--last.png +0 -0
  191. package/docs/assets/moni-button-segment/position--middle.png +0 -0
  192. package/docs/assets/moni-button-segment/position--solo.png +0 -0
  193. package/docs/assets/moni-button-segment/size--extra.png +0 -0
  194. package/docs/assets/moni-button-segment/size--large.png +0 -0
  195. package/docs/assets/moni-button-segment/size--medium.png +0 -0
  196. package/docs/assets/moni-button-segment/size--small.png +0 -0
  197. package/docs/assets/moni-button-segment/size--xlarge.png +0 -0
  198. package/docs/assets/moni-button-segment/size--xsmall.png +0 -0
  199. package/docs/assets/moni-button-segment/value--default.png +0 -0
  200. package/docs/assets/moni-card/clickable--false.png +0 -0
  201. package/docs/assets/moni-card/clickable--true.png +0 -0
  202. package/docs/assets/moni-card/disabled--false.png +0 -0
  203. package/docs/assets/moni-card/disabled--true.png +0 -0
  204. package/docs/assets/moni-card/draggable--false.png +0 -0
  205. package/docs/assets/moni-card/draggable--true.png +0 -0
  206. package/docs/assets/moni-card/variant--elevated.png +0 -0
  207. package/docs/assets/moni-card/variant--filled.png +0 -0
  208. package/docs/assets/moni-card/variant--outlined.png +0 -0
  209. package/docs/assets/moni-carousel/auto--false.png +0 -0
  210. package/docs/assets/moni-carousel/auto--true.png +0 -0
  211. package/docs/assets/moni-carousel/autoplay--false.png +0 -0
  212. package/docs/assets/moni-carousel/autoplay--true.png +0 -0
  213. package/docs/assets/moni-carousel/autoplayInterval--default.png +0 -0
  214. package/docs/assets/moni-carousel/borderRadius--default.png +0 -0
  215. package/docs/assets/moni-carousel/gap--default.png +0 -0
  216. package/docs/assets/moni-carousel/headerText--default.png +0 -0
  217. package/docs/assets/moni-carousel/hideNav--false.png +0 -0
  218. package/docs/assets/moni-carousel/hideNav--true.png +0 -0
  219. package/docs/assets/moni-carousel/infinite--false.png +0 -0
  220. package/docs/assets/moni-carousel/infinite--true.png +0 -0
  221. package/docs/assets/moni-carousel/items--default.png +0 -0
  222. package/docs/assets/moni-carousel/largeWidth--default.png +0 -0
  223. package/docs/assets/moni-carousel/layout--hero.png +0 -0
  224. package/docs/assets/moni-carousel/layout--multi-browse.png +0 -0
  225. package/docs/assets/moni-carousel/layout--uncontained.png +0 -0
  226. package/docs/assets/moni-carousel/mediumWidth--default.png +0 -0
  227. package/docs/assets/moni-carousel/padding--default.png +0 -0
  228. package/docs/assets/moni-carousel/showAll--false.png +0 -0
  229. package/docs/assets/moni-carousel/showAll--true.png +0 -0
  230. package/docs/assets/moni-carousel/showAllText--default.png +0 -0
  231. package/docs/assets/moni-carousel/smallWidth--default.png +0 -0
  232. package/docs/assets/moni-checkbox/checked--false.png +0 -0
  233. package/docs/assets/moni-checkbox/checked--true.png +0 -0
  234. package/docs/assets/moni-checkbox/checkedIcon--default.png +0 -0
  235. package/docs/assets/moni-checkbox/disabled--false.png +0 -0
  236. package/docs/assets/moni-checkbox/disabled--true.png +0 -0
  237. package/docs/assets/moni-checkbox/label--default.png +0 -0
  238. package/docs/assets/moni-checkbox/name--default.png +0 -0
  239. package/docs/assets/moni-checkbox/size--extra.png +0 -0
  240. package/docs/assets/moni-checkbox/size--large.png +0 -0
  241. package/docs/assets/moni-checkbox/size--medium.png +0 -0
  242. package/docs/assets/moni-checkbox/size--small.png +0 -0
  243. package/docs/assets/moni-checkbox/uncheckedIcon--default.png +0 -0
  244. package/docs/assets/moni-checkbox/value--default.png +0 -0
  245. package/docs/assets/moni-chip/disabled--false.png +0 -0
  246. package/docs/assets/moni-chip/disabled--true.png +0 -0
  247. package/docs/assets/moni-chip/icon--default.png +0 -0
  248. package/docs/assets/moni-chip/loading--false.png +0 -0
  249. package/docs/assets/moni-chip/loading--true.png +0 -0
  250. package/docs/assets/moni-chip/removable--false.png +0 -0
  251. package/docs/assets/moni-chip/removable--true.png +0 -0
  252. package/docs/assets/moni-chip/selected--false.png +0 -0
  253. package/docs/assets/moni-chip/selected--true.png +0 -0
  254. package/docs/assets/moni-chip/shape--bottom-round.png +0 -0
  255. package/docs/assets/moni-chip/shape--circle.png +0 -0
  256. package/docs/assets/moni-chip/shape--left-round.png +0 -0
  257. package/docs/assets/moni-chip/shape--no-round.png +0 -0
  258. package/docs/assets/moni-chip/shape--right-round.png +0 -0
  259. package/docs/assets/moni-chip/shape--round.png +0 -0
  260. package/docs/assets/moni-chip/shape--square.png +0 -0
  261. package/docs/assets/moni-chip/shape--top-round.png +0 -0
  262. package/docs/assets/moni-chip/size--large.png +0 -0
  263. package/docs/assets/moni-chip/size--medium.png +0 -0
  264. package/docs/assets/moni-chip/size--small.png +0 -0
  265. package/docs/assets/moni-chip/variant--assist.png +0 -0
  266. package/docs/assets/moni-chip/variant--fill.png +0 -0
  267. package/docs/assets/moni-chip/variant--filter.png +0 -0
  268. package/docs/assets/moni-chip/variant--input.png +0 -0
  269. package/docs/assets/moni-chip/variant--outlined.png +0 -0
  270. package/docs/assets/moni-chip/variant--suggestion.png +0 -0
  271. package/docs/assets/moni-color-field/disabled--false.png +0 -0
  272. package/docs/assets/moni-color-field/disabled--true.png +0 -0
  273. package/docs/assets/moni-color-field/error--false.png +0 -0
  274. package/docs/assets/moni-color-field/error--true.png +0 -0
  275. package/docs/assets/moni-color-field/errorText--default.png +0 -0
  276. package/docs/assets/moni-color-field/helper--default.png +0 -0
  277. package/docs/assets/moni-color-field/label--default.png +0 -0
  278. package/docs/assets/moni-color-field/name--default.png +0 -0
  279. package/docs/assets/moni-color-field/shape--no-round.png +0 -0
  280. package/docs/assets/moni-color-field/shape--round.png +0 -0
  281. package/docs/assets/moni-color-field/shape--square.png +0 -0
  282. package/docs/assets/moni-color-field/size--extra.png +0 -0
  283. package/docs/assets/moni-color-field/size--large.png +0 -0
  284. package/docs/assets/moni-color-field/size--medium.png +0 -0
  285. package/docs/assets/moni-color-field/size--small.png +0 -0
  286. package/docs/assets/moni-color-field/value--default.png +0 -0
  287. package/docs/assets/moni-color-field/variant--filled.png +0 -0
  288. package/docs/assets/moni-color-field/variant--outlined.png +0 -0
  289. package/docs/assets/moni-context-menu/flip--false.png +0 -0
  290. package/docs/assets/moni-context-menu/flip--true.png +0 -0
  291. package/docs/assets/moni-context-menu/placement--bottom.png +0 -0
  292. package/docs/assets/moni-context-menu/placement--left.png +0 -0
  293. package/docs/assets/moni-context-menu/placement--right.png +0 -0
  294. package/docs/assets/moni-context-menu/placement--top.png +0 -0
  295. package/docs/assets/moni-dialog/modal--false.png +0 -0
  296. package/docs/assets/moni-dialog/modal--true.png +0 -0
  297. package/docs/assets/moni-dialog/open--true.png +0 -0
  298. package/docs/assets/moni-dialog/side--bottom.png +0 -0
  299. package/docs/assets/moni-dialog/side--center.png +0 -0
  300. package/docs/assets/moni-dialog/side--left.png +0 -0
  301. package/docs/assets/moni-dialog/side--max.png +0 -0
  302. package/docs/assets/moni-dialog/side--right.png +0 -0
  303. package/docs/assets/moni-dialog/side--top.png +0 -0
  304. package/docs/assets/moni-dialog/size--large.png +0 -0
  305. package/docs/assets/moni-dialog/size--medium.png +0 -0
  306. package/docs/assets/moni-dialog/size--small.png +0 -0
  307. package/docs/assets/moni-dialog/title--default.png +0 -0
  308. package/docs/assets/moni-divider/inset--leading.png +0 -0
  309. package/docs/assets/moni-divider/inset--middle.png +0 -0
  310. package/docs/assets/moni-divider/inset--none.png +0 -0
  311. package/docs/assets/moni-expansion/open--false.png +0 -0
  312. package/docs/assets/moni-expansion/open--true.png +0 -0
  313. package/docs/assets/moni-expansion/title--default.png +0 -0
  314. package/docs/assets/moni-fab/accessibleLabel--default.png +0 -0
  315. package/docs/assets/moni-fab/color--default.png +0 -0
  316. package/docs/assets/moni-fab/disabled--false.png +0 -0
  317. package/docs/assets/moni-fab/disabled--true.png +0 -0
  318. package/docs/assets/moni-fab/expanded--false.png +0 -0
  319. package/docs/assets/moni-fab/expanded--true.png +0 -0
  320. package/docs/assets/moni-fab/extended--false.png +0 -0
  321. package/docs/assets/moni-fab/extended--true.png +0 -0
  322. package/docs/assets/moni-fab/icon--default.png +0 -0
  323. package/docs/assets/moni-fab/label--default.png +0 -0
  324. package/docs/assets/moni-fab/name--default.png +0 -0
  325. package/docs/assets/moni-fab/position--default.png +0 -0
  326. package/docs/assets/moni-fab/shape--circle.png +0 -0
  327. package/docs/assets/moni-fab/shape--rounded.png +0 -0
  328. package/docs/assets/moni-fab/size--default.png +0 -0
  329. package/docs/assets/moni-fab/type--button.png +0 -0
  330. package/docs/assets/moni-fab/type--reset.png +0 -0
  331. package/docs/assets/moni-fab/type--submit.png +0 -0
  332. package/docs/assets/moni-fab/value--default.png +0 -0
  333. package/docs/assets/moni-fab-menu/closeIcon--default.png +0 -0
  334. package/docs/assets/moni-fab-menu/closeLabel--default.png +0 -0
  335. package/docs/assets/moni-fab-menu/color--default.png +0 -0
  336. package/docs/assets/moni-fab-menu/direction--default.png +0 -0
  337. package/docs/assets/moni-fab-menu/disabled--false.png +0 -0
  338. package/docs/assets/moni-fab-menu/disabled--true.png +0 -0
  339. package/docs/assets/moni-fab-menu/icon--default.png +0 -0
  340. package/docs/assets/moni-fab-menu/label--default.png +0 -0
  341. package/docs/assets/moni-fab-menu/open--false.png +0 -0
  342. package/docs/assets/moni-fab-menu/open--true.png +0 -0
  343. package/docs/assets/moni-fab-menu/position--default.png +0 -0
  344. package/docs/assets/moni-fab-menu/shape--circle.png +0 -0
  345. package/docs/assets/moni-fab-menu/shape--rounded.png +0 -0
  346. package/docs/assets/moni-fab-menu/size--default.png +0 -0
  347. package/docs/assets/moni-file-field/accept--default.png +0 -0
  348. package/docs/assets/moni-file-field/buttonLabel--default.png +0 -0
  349. package/docs/assets/moni-file-field/disabled--false.png +0 -0
  350. package/docs/assets/moni-file-field/disabled--true.png +0 -0
  351. package/docs/assets/moni-file-field/error--false.png +0 -0
  352. package/docs/assets/moni-file-field/error--true.png +0 -0
  353. package/docs/assets/moni-file-field/errorText--default.png +0 -0
  354. package/docs/assets/moni-file-field/helper--default.png +0 -0
  355. package/docs/assets/moni-file-field/icon--default.png +0 -0
  356. package/docs/assets/moni-file-field/label--default.png +0 -0
  357. package/docs/assets/moni-file-field/multiple--false.png +0 -0
  358. package/docs/assets/moni-file-field/multiple--true.png +0 -0
  359. package/docs/assets/moni-file-field/name--default.png +0 -0
  360. package/docs/assets/moni-file-field/shape--no-round.png +0 -0
  361. package/docs/assets/moni-file-field/shape--round.png +0 -0
  362. package/docs/assets/moni-file-field/shape--square.png +0 -0
  363. package/docs/assets/moni-file-field/size--extra.png +0 -0
  364. package/docs/assets/moni-file-field/size--large.png +0 -0
  365. package/docs/assets/moni-file-field/size--medium.png +0 -0
  366. package/docs/assets/moni-file-field/size--small.png +0 -0
  367. package/docs/assets/moni-file-field/trailingIcon--default.png +0 -0
  368. package/docs/assets/moni-file-field/value--default.png +0 -0
  369. package/docs/assets/moni-file-field/variant--filled.png +0 -0
  370. package/docs/assets/moni-file-field/variant--outlined.png +0 -0
  371. package/docs/assets/moni-icon/filled--false.png +0 -0
  372. package/docs/assets/moni-icon/filled--true.png +0 -0
  373. package/docs/assets/moni-icon/name--default.png +0 -0
  374. package/docs/assets/moni-icon/size--extra.png +0 -0
  375. package/docs/assets/moni-icon/size--large.png +0 -0
  376. package/docs/assets/moni-icon/size--medium.png +0 -0
  377. package/docs/assets/moni-icon/size--small.png +0 -0
  378. package/docs/assets/moni-icon/size--tiny.png +0 -0
  379. package/docs/assets/moni-list/rounded--false.png +0 -0
  380. package/docs/assets/moni-list/rounded--true.png +0 -0
  381. package/docs/assets/moni-list/variant--border.png +0 -0
  382. package/docs/assets/moni-list/variant--empty.png +0 -0
  383. package/docs/assets/moni-list-item/active--false.png +0 -0
  384. package/docs/assets/moni-list-item/active--true.png +0 -0
  385. package/docs/assets/moni-list-item/avatar--default.png +0 -0
  386. package/docs/assets/moni-list-item/disabled--false.png +0 -0
  387. package/docs/assets/moni-list-item/disabled--true.png +0 -0
  388. package/docs/assets/moni-list-item/href--default.png +0 -0
  389. package/docs/assets/moni-list-item/icon--default.png +0 -0
  390. package/docs/assets/moni-list-item/lines--default.png +0 -0
  391. package/docs/assets/moni-list-item/trailingIcon--default.png +0 -0
  392. package/docs/assets/moni-loading-indicator/variant--contained.png +0 -0
  393. package/docs/assets/moni-loading-indicator/variant--uncontained.png +0 -0
  394. package/docs/assets/moni-menu/active--true.png +0 -0
  395. package/docs/assets/moni-menu/flip--false.png +0 -0
  396. package/docs/assets/moni-menu/flip--true.png +0 -0
  397. package/docs/assets/moni-menu/noWrap--false.png +0 -0
  398. package/docs/assets/moni-menu/noWrap--true.png +0 -0
  399. package/docs/assets/moni-menu/placement--bottom.png +0 -0
  400. package/docs/assets/moni-menu/placement--left.png +0 -0
  401. package/docs/assets/moni-menu/placement--max.png +0 -0
  402. package/docs/assets/moni-menu/placement--min.png +0 -0
  403. package/docs/assets/moni-menu/placement--right.png +0 -0
  404. package/docs/assets/moni-menu/placement--top.png +0 -0
  405. package/docs/assets/moni-menu/space--extra-space.png +0 -0
  406. package/docs/assets/moni-menu/space--large-space.png +0 -0
  407. package/docs/assets/moni-menu/space--medium-space.png +0 -0
  408. package/docs/assets/moni-menu/space--no-space.png +0 -0
  409. package/docs/assets/moni-menu/space--small-space.png +0 -0
  410. package/docs/assets/moni-menu/space--space.png +0 -0
  411. package/docs/assets/moni-menu-item/active--false.png +0 -0
  412. package/docs/assets/moni-menu-item/active--true.png +0 -0
  413. package/docs/assets/moni-menu-item/disabled--false.png +0 -0
  414. package/docs/assets/moni-menu-item/disabled--true.png +0 -0
  415. package/docs/assets/moni-menu-item/icon--default.png +0 -0
  416. package/docs/assets/moni-menu-item/label--default.png +0 -0
  417. package/docs/assets/moni-morph-modal/autoSize--false.png +0 -0
  418. package/docs/assets/moni-morph-modal/autoSize--true.png +0 -0
  419. package/docs/assets/moni-morph-modal/expandedHeight--default.png +0 -0
  420. package/docs/assets/moni-morph-modal/expandedWidth--default.png +0 -0
  421. package/docs/assets/moni-morph-modal/hasBackdrop--false.png +0 -0
  422. package/docs/assets/moni-morph-modal/hasBackdrop--true.png +0 -0
  423. package/docs/assets/moni-morph-modal/modal--false.png +0 -0
  424. package/docs/assets/moni-morph-modal/modal--true.png +0 -0
  425. package/docs/assets/moni-morph-modal/open--true.png +0 -0
  426. package/docs/assets/moni-morph-modal/placement--default.png +0 -0
  427. package/docs/assets/moni-morph-modal/showCloseButton--false.png +0 -0
  428. package/docs/assets/moni-morph-modal/showCloseButton--true.png +0 -0
  429. package/docs/assets/moni-nav/layout--auto.png +0 -0
  430. package/docs/assets/moni-nav/layout--horizontal.png +0 -0
  431. package/docs/assets/moni-nav/layout--vertical.png +0 -0
  432. package/docs/assets/moni-nav/modal--false.png +0 -0
  433. package/docs/assets/moni-nav/modal--true.png +0 -0
  434. package/docs/assets/moni-nav/open--false.png +0 -0
  435. package/docs/assets/moni-nav/open--true.png +0 -0
  436. package/docs/assets/moni-nav/placement--bottom.png +0 -0
  437. package/docs/assets/moni-nav/placement--left.png +0 -0
  438. package/docs/assets/moni-nav/placement--right.png +0 -0
  439. package/docs/assets/moni-nav/placement--top.png +0 -0
  440. package/docs/assets/moni-nav/variant--drawer.png +0 -0
  441. package/docs/assets/moni-nav/variant--rail.png +0 -0
  442. package/docs/assets/moni-nav-item/active--false.png +0 -0
  443. package/docs/assets/moni-nav-item/active--true.png +0 -0
  444. package/docs/assets/moni-nav-item/href--default.png +0 -0
  445. package/docs/assets/moni-nav-item/icon--default.png +0 -0
  446. package/docs/assets/moni-nav-item/label--default.png +0 -0
  447. package/docs/assets/moni-nav-item/layout--default.png +0 -0
  448. package/docs/assets/moni-nav-item/placement--default.png +0 -0
  449. package/docs/assets/moni-nav-item/variant--default.png +0 -0
  450. package/docs/assets/moni-progress/bufferValue--default.png +0 -0
  451. package/docs/assets/moni-progress/indeterminate--false.png +0 -0
  452. package/docs/assets/moni-progress/indeterminate--true.png +0 -0
  453. package/docs/assets/moni-progress/label--default.png +0 -0
  454. package/docs/assets/moni-progress/max--default.png +0 -0
  455. package/docs/assets/moni-progress/mode--default.png +0 -0
  456. package/docs/assets/moni-progress/size--default.png +0 -0
  457. package/docs/assets/moni-progress/stopIndicator--false.png +0 -0
  458. package/docs/assets/moni-progress/stopIndicator--true.png +0 -0
  459. package/docs/assets/moni-progress/value--default.png +0 -0
  460. package/docs/assets/moni-progress/variant--default.png +0 -0
  461. package/docs/assets/moni-progress/waveTransition--false.png +0 -0
  462. package/docs/assets/moni-progress/waveTransition--true.png +0 -0
  463. package/docs/assets/moni-radio/checked--false.png +0 -0
  464. package/docs/assets/moni-radio/checked--true.png +0 -0
  465. package/docs/assets/moni-radio/checkedIcon--default.png +0 -0
  466. package/docs/assets/moni-radio/disabled--false.png +0 -0
  467. package/docs/assets/moni-radio/disabled--true.png +0 -0
  468. package/docs/assets/moni-radio/iconContainer--circle.png +0 -0
  469. package/docs/assets/moni-radio/iconContainer--none.png +0 -0
  470. package/docs/assets/moni-radio/label--default.png +0 -0
  471. package/docs/assets/moni-radio/name--default.png +0 -0
  472. package/docs/assets/moni-radio/size--extra.png +0 -0
  473. package/docs/assets/moni-radio/size--large.png +0 -0
  474. package/docs/assets/moni-radio/size--medium.png +0 -0
  475. package/docs/assets/moni-radio/size--small.png +0 -0
  476. package/docs/assets/moni-radio/uncheckedIcon--default.png +0 -0
  477. package/docs/assets/moni-radio/value--default.png +0 -0
  478. package/docs/assets/moni-ripple/active--false.png +0 -0
  479. package/docs/assets/moni-ripple/active--true.png +0 -0
  480. package/docs/assets/moni-ripple/color--primary.png +0 -0
  481. package/docs/assets/moni-ripple/color--secondary.png +0 -0
  482. package/docs/assets/moni-ripple/color--surface.png +0 -0
  483. package/docs/assets/moni-ripple/speed--fast.png +0 -0
  484. package/docs/assets/moni-ripple/speed--normal.png +0 -0
  485. package/docs/assets/moni-ripple/speed--slow.png +0 -0
  486. package/docs/assets/moni-ripple/x--default.png +0 -0
  487. package/docs/assets/moni-ripple/y--default.png +0 -0
  488. package/docs/assets/moni-segmented-button/gap--default.png +0 -0
  489. package/docs/assets/moni-segmented-button/hideCheck--false.png +0 -0
  490. package/docs/assets/moni-segmented-button/hideCheck--true.png +0 -0
  491. package/docs/assets/moni-segmented-button/multi--false.png +0 -0
  492. package/docs/assets/moni-segmented-button/multi--true.png +0 -0
  493. package/docs/assets/moni-segmented-button/name--default.png +0 -0
  494. package/docs/assets/moni-segmented-button/size--extra.png +0 -0
  495. package/docs/assets/moni-segmented-button/size--large.png +0 -0
  496. package/docs/assets/moni-segmented-button/size--medium.png +0 -0
  497. package/docs/assets/moni-segmented-button/size--small.png +0 -0
  498. package/docs/assets/moni-segmented-button/size--xlarge.png +0 -0
  499. package/docs/assets/moni-segmented-button/size--xsmall.png +0 -0
  500. package/docs/assets/moni-select/clearable--false.png +0 -0
  501. package/docs/assets/moni-select/clearable--true.png +0 -0
  502. package/docs/assets/moni-select/disabled--false.png +0 -0
  503. package/docs/assets/moni-select/disabled--true.png +0 -0
  504. package/docs/assets/moni-select/dropdownMaxHeight--default.png +0 -0
  505. package/docs/assets/moni-select/dropdownWidth--default.png +0 -0
  506. package/docs/assets/moni-select/error--false.png +0 -0
  507. package/docs/assets/moni-select/error--true.png +0 -0
  508. package/docs/assets/moni-select/errorText--default.png +0 -0
  509. package/docs/assets/moni-select/helper--default.png +0 -0
  510. package/docs/assets/moni-select/icon--default.png +0 -0
  511. package/docs/assets/moni-select/label--default.png +0 -0
  512. package/docs/assets/moni-select/loading--false.png +0 -0
  513. package/docs/assets/moni-select/loading--true.png +0 -0
  514. package/docs/assets/moni-select/name--default.png +0 -0
  515. package/docs/assets/moni-select/placeholder--default.png +0 -0
  516. package/docs/assets/moni-select/placement--auto.png +0 -0
  517. package/docs/assets/moni-select/placement--bottom.png +0 -0
  518. package/docs/assets/moni-select/placement--left.png +0 -0
  519. package/docs/assets/moni-select/placement--right.png +0 -0
  520. package/docs/assets/moni-select/placement--top.png +0 -0
  521. package/docs/assets/moni-select/positioning--absolute.png +0 -0
  522. package/docs/assets/moni-select/positioning--body.png +0 -0
  523. package/docs/assets/moni-select/positioning--fixed.png +0 -0
  524. package/docs/assets/moni-select/searchable--false.png +0 -0
  525. package/docs/assets/moni-select/searchable--true.png +0 -0
  526. package/docs/assets/moni-select/shape--no-round.png +0 -0
  527. package/docs/assets/moni-select/shape--round.png +0 -0
  528. package/docs/assets/moni-select/shape--square.png +0 -0
  529. package/docs/assets/moni-select/sheet--false.png +0 -0
  530. package/docs/assets/moni-select/sheet--true.png +0 -0
  531. package/docs/assets/moni-select/size--extra.png +0 -0
  532. package/docs/assets/moni-select/size--large.png +0 -0
  533. package/docs/assets/moni-select/size--medium.png +0 -0
  534. package/docs/assets/moni-select/size--small.png +0 -0
  535. package/docs/assets/moni-select/trailingIcon--default.png +0 -0
  536. package/docs/assets/moni-select/value--default.png +0 -0
  537. package/docs/assets/moni-select/variant--filled.png +0 -0
  538. package/docs/assets/moni-select/variant--outlined.png +0 -0
  539. package/docs/assets/moni-select-option/disabled--false.png +0 -0
  540. package/docs/assets/moni-select-option/disabled--true.png +0 -0
  541. package/docs/assets/moni-select-option/group--default.png +0 -0
  542. package/docs/assets/moni-select-option/label--default.png +0 -0
  543. package/docs/assets/moni-select-option/selected--false.png +0 -0
  544. package/docs/assets/moni-select-option/selected--true.png +0 -0
  545. package/docs/assets/moni-select-option/value--default.png +0 -0
  546. package/docs/assets/moni-shape/border--false.png +0 -0
  547. package/docs/assets/moni-shape/border--true.png +0 -0
  548. package/docs/assets/moni-shape/color--primary.png +0 -0
  549. package/docs/assets/moni-shape/color--secondary.png +0 -0
  550. package/docs/assets/moni-shape/color--surface.png +0 -0
  551. package/docs/assets/moni-shape/color--tertiary.png +0 -0
  552. package/docs/assets/moni-shape/duration--default.png +0 -0
  553. package/docs/assets/moni-shape/easing--default.png +0 -0
  554. package/docs/assets/moni-shape/name--empty.png +0 -0
  555. package/docs/assets/moni-shape/shadow--false.png +0 -0
  556. package/docs/assets/moni-shape/shadow--true.png +0 -0
  557. package/docs/assets/moni-shape/shapeRadius--default.png +0 -0
  558. package/docs/assets/moni-shape/size--extra.png +0 -0
  559. package/docs/assets/moni-shape/size--large.png +0 -0
  560. package/docs/assets/moni-shape/size--medium.png +0 -0
  561. package/docs/assets/moni-shape/size--small.png +0 -0
  562. package/docs/assets/moni-shape/type--default.png +0 -0
  563. package/docs/assets/moni-side-sheet/detached--false.png +0 -0
  564. package/docs/assets/moni-side-sheet/detached--true.png +0 -0
  565. package/docs/assets/moni-side-sheet/expandedWidth--default.png +0 -0
  566. package/docs/assets/moni-side-sheet/hideClose--false.png +0 -0
  567. package/docs/assets/moni-side-sheet/hideClose--true.png +0 -0
  568. package/docs/assets/moni-side-sheet/maxWidth--default.png +0 -0
  569. package/docs/assets/moni-side-sheet/modal--false.png +0 -0
  570. package/docs/assets/moni-side-sheet/modal--true.png +0 -0
  571. package/docs/assets/moni-side-sheet/noBorder--false.png +0 -0
  572. package/docs/assets/moni-side-sheet/noBorder--true.png +0 -0
  573. package/docs/assets/moni-side-sheet/open--true.png +0 -0
  574. package/docs/assets/moni-side-sheet/showBack--false.png +0 -0
  575. package/docs/assets/moni-side-sheet/showBack--true.png +0 -0
  576. package/docs/assets/moni-side-sheet/side--left.png +0 -0
  577. package/docs/assets/moni-side-sheet/side--right.png +0 -0
  578. package/docs/assets/moni-side-sheet/title--default.png +0 -0
  579. package/docs/assets/moni-side-sheet/withHandle--false.png +0 -0
  580. package/docs/assets/moni-side-sheet/withHandle--true.png +0 -0
  581. package/docs/assets/moni-slider/disabled--false.png +0 -0
  582. package/docs/assets/moni-slider/disabled--true.png +0 -0
  583. package/docs/assets/moni-slider/indicator--false.png +0 -0
  584. package/docs/assets/moni-slider/indicator--true.png +0 -0
  585. package/docs/assets/moni-slider/indicatorPlacement--bottom.png +0 -0
  586. package/docs/assets/moni-slider/indicatorPlacement--top.png +0 -0
  587. package/docs/assets/moni-slider/insetIcon--default.png +0 -0
  588. package/docs/assets/moni-slider/isVertical--false.png +0 -0
  589. package/docs/assets/moni-slider/isVertical--true.png +0 -0
  590. package/docs/assets/moni-slider/max--default.png +0 -0
  591. package/docs/assets/moni-slider/min--default.png +0 -0
  592. package/docs/assets/moni-slider/name--default.png +0 -0
  593. package/docs/assets/moni-slider/range--false.png +0 -0
  594. package/docs/assets/moni-slider/range--true.png +0 -0
  595. package/docs/assets/moni-slider/size--extra.png +0 -0
  596. package/docs/assets/moni-slider/size--large.png +0 -0
  597. package/docs/assets/moni-slider/size--medium.png +0 -0
  598. package/docs/assets/moni-slider/size--small.png +0 -0
  599. package/docs/assets/moni-slider/size--tiny.png +0 -0
  600. package/docs/assets/moni-slider/step--default.png +0 -0
  601. package/docs/assets/moni-slider/tickInterval--default.png +0 -0
  602. package/docs/assets/moni-slider/ticks--false.png +0 -0
  603. package/docs/assets/moni-slider/ticks--true.png +0 -0
  604. package/docs/assets/moni-snackbar/action--default.png +0 -0
  605. package/docs/assets/moni-snackbar/active--true.png +0 -0
  606. package/docs/assets/moni-snackbar/maxLines--default.png +0 -0
  607. package/docs/assets/moni-snackbar/placement--bottom.png +0 -0
  608. package/docs/assets/moni-snackbar/placement--top.png +0 -0
  609. package/docs/assets/moni-snackbar/text--default.png +0 -0
  610. package/docs/assets/moni-split-button/gap--default.png +0 -0
  611. package/docs/assets/moni-split-button/size--extra.png +0 -0
  612. package/docs/assets/moni-split-button/size--large.png +0 -0
  613. package/docs/assets/moni-split-button/size--medium.png +0 -0
  614. package/docs/assets/moni-split-button/size--small.png +0 -0
  615. package/docs/assets/moni-split-button/size--xlarge.png +0 -0
  616. package/docs/assets/moni-split-button/size--xsmall.png +0 -0
  617. package/docs/assets/moni-split-button/variant--elevated.png +0 -0
  618. package/docs/assets/moni-split-button/variant--filled.png +0 -0
  619. package/docs/assets/moni-split-button/variant--outlined.png +0 -0
  620. package/docs/assets/moni-split-button/variant--tonal.png +0 -0
  621. package/docs/assets/moni-step/active--false.png +0 -0
  622. package/docs/assets/moni-step/active--true.png +0 -0
  623. package/docs/assets/moni-step/completed--false.png +0 -0
  624. package/docs/assets/moni-step/completed--true.png +0 -0
  625. package/docs/assets/moni-step/description--default.png +0 -0
  626. package/docs/assets/moni-step/icon--default.png +0 -0
  627. package/docs/assets/moni-step/index--default.png +0 -0
  628. package/docs/assets/moni-step/orientation--horizontal.png +0 -0
  629. package/docs/assets/moni-step/orientation--vertical.png +0 -0
  630. package/docs/assets/moni-step/title--default.png +0 -0
  631. package/docs/assets/moni-stepper/current--default.png +0 -0
  632. package/docs/assets/moni-stepper/orientation--horizontal.png +0 -0
  633. package/docs/assets/moni-stepper/orientation--vertical.png +0 -0
  634. package/docs/assets/moni-switch/checked--false.png +0 -0
  635. package/docs/assets/moni-switch/checked--true.png +0 -0
  636. package/docs/assets/moni-switch/checkedIcon--default.png +0 -0
  637. package/docs/assets/moni-switch/disabled--false.png +0 -0
  638. package/docs/assets/moni-switch/disabled--true.png +0 -0
  639. package/docs/assets/moni-switch/icon--false.png +0 -0
  640. package/docs/assets/moni-switch/icon--true.png +0 -0
  641. package/docs/assets/moni-switch/label--default.png +0 -0
  642. package/docs/assets/moni-switch/name--default.png +0 -0
  643. package/docs/assets/moni-switch/uncheckedIcon--default.png +0 -0
  644. package/docs/assets/moni-switch/value--default.png +0 -0
  645. package/docs/assets/moni-tab/active--false.png +0 -0
  646. package/docs/assets/moni-tab/active--true.png +0 -0
  647. package/docs/assets/moni-tab/href--default.png +0 -0
  648. package/docs/assets/moni-tab/icon--default.png +0 -0
  649. package/docs/assets/moni-tab/label--default.png +0 -0
  650. package/docs/assets/moni-tabs/align--center.png +0 -0
  651. package/docs/assets/moni-tabs/align--default.png +0 -0
  652. package/docs/assets/moni-tabs/align--left.png +0 -0
  653. package/docs/assets/moni-tabs/align--right.png +0 -0
  654. package/docs/assets/moni-tabs/indicatorSize--default.png +0 -0
  655. package/docs/assets/moni-tabs/indicatorSize--max.png +0 -0
  656. package/docs/assets/moni-tabs/indicatorSize--min.png +0 -0
  657. package/docs/assets/moni-tabs/mode--primary.png +0 -0
  658. package/docs/assets/moni-tabs/mode--secondary.png +0 -0
  659. package/docs/assets/moni-tabs/scrollable--false.png +0 -0
  660. package/docs/assets/moni-tabs/scrollable--true.png +0 -0
  661. package/docs/assets/moni-tabs/vertical--false.png +0 -0
  662. package/docs/assets/moni-tabs/vertical--true.png +0 -0
  663. package/docs/assets/moni-text-field/disabled--false.png +0 -0
  664. package/docs/assets/moni-text-field/disabled--true.png +0 -0
  665. package/docs/assets/moni-text-field/error--false.png +0 -0
  666. package/docs/assets/moni-text-field/error--true.png +0 -0
  667. package/docs/assets/moni-text-field/errorText--default.png +0 -0
  668. package/docs/assets/moni-text-field/helper--default.png +0 -0
  669. package/docs/assets/moni-text-field/icon--default.png +0 -0
  670. package/docs/assets/moni-text-field/label--default.png +0 -0
  671. package/docs/assets/moni-text-field/loading--false.png +0 -0
  672. package/docs/assets/moni-text-field/loading--true.png +0 -0
  673. package/docs/assets/moni-text-field/mask--default.png +0 -0
  674. package/docs/assets/moni-text-field/maskAlias--default.png +0 -0
  675. package/docs/assets/moni-text-field/maskOptions--default.png +0 -0
  676. package/docs/assets/moni-text-field/name--default.png +0 -0
  677. package/docs/assets/moni-text-field/placeholder--default.png +0 -0
  678. package/docs/assets/moni-text-field/prefix--default.png +0 -0
  679. package/docs/assets/moni-text-field/shape--no-round.png +0 -0
  680. package/docs/assets/moni-text-field/shape--round.png +0 -0
  681. package/docs/assets/moni-text-field/size--extra.png +0 -0
  682. package/docs/assets/moni-text-field/size--large.png +0 -0
  683. package/docs/assets/moni-text-field/size--medium.png +0 -0
  684. package/docs/assets/moni-text-field/size--small.png +0 -0
  685. package/docs/assets/moni-text-field/suffix--default.png +0 -0
  686. package/docs/assets/moni-text-field/suffixButtonIcon--default.png +0 -0
  687. package/docs/assets/moni-text-field/suffixButtonLabel--default.png +0 -0
  688. package/docs/assets/moni-text-field/trailingIcon--default.png +0 -0
  689. package/docs/assets/moni-text-field/type--email.png +0 -0
  690. package/docs/assets/moni-text-field/type--number.png +0 -0
  691. package/docs/assets/moni-text-field/type--password.png +0 -0
  692. package/docs/assets/moni-text-field/type--search.png +0 -0
  693. package/docs/assets/moni-text-field/type--tel.png +0 -0
  694. package/docs/assets/moni-text-field/type--text.png +0 -0
  695. package/docs/assets/moni-text-field/type--url.png +0 -0
  696. package/docs/assets/moni-text-field/value--default.png +0 -0
  697. package/docs/assets/moni-text-field/variant--filled.png +0 -0
  698. package/docs/assets/moni-text-field/variant--outlined.png +0 -0
  699. package/docs/assets/moni-text-field/variant--underlined.png +0 -0
  700. package/docs/assets/moni-textarea/autosize--false.png +0 -0
  701. package/docs/assets/moni-textarea/autosize--true.png +0 -0
  702. package/docs/assets/moni-textarea/disabled--false.png +0 -0
  703. package/docs/assets/moni-textarea/disabled--true.png +0 -0
  704. package/docs/assets/moni-textarea/error--false.png +0 -0
  705. package/docs/assets/moni-textarea/error--true.png +0 -0
  706. package/docs/assets/moni-textarea/errorText--default.png +0 -0
  707. package/docs/assets/moni-textarea/helper--default.png +0 -0
  708. package/docs/assets/moni-textarea/icon--default.png +0 -0
  709. package/docs/assets/moni-textarea/label--default.png +0 -0
  710. package/docs/assets/moni-textarea/loading--false.png +0 -0
  711. package/docs/assets/moni-textarea/loading--true.png +0 -0
  712. package/docs/assets/moni-textarea/maxRows--default.png +0 -0
  713. package/docs/assets/moni-textarea/maxlength--default.png +0 -0
  714. package/docs/assets/moni-textarea/name--default.png +0 -0
  715. package/docs/assets/moni-textarea/noCounter--false.png +0 -0
  716. package/docs/assets/moni-textarea/noCounter--true.png +0 -0
  717. package/docs/assets/moni-textarea/placeholder--default.png +0 -0
  718. package/docs/assets/moni-textarea/prefix--default.png +0 -0
  719. package/docs/assets/moni-textarea/rows--default.png +0 -0
  720. package/docs/assets/moni-textarea/shape--no-round.png +0 -0
  721. package/docs/assets/moni-textarea/shape--round.png +0 -0
  722. package/docs/assets/moni-textarea/shape--square.png +0 -0
  723. package/docs/assets/moni-textarea/size--extra.png +0 -0
  724. package/docs/assets/moni-textarea/size--large.png +0 -0
  725. package/docs/assets/moni-textarea/size--medium.png +0 -0
  726. package/docs/assets/moni-textarea/size--small.png +0 -0
  727. package/docs/assets/moni-textarea/suffix--default.png +0 -0
  728. package/docs/assets/moni-textarea/trailingIcon--default.png +0 -0
  729. package/docs/assets/moni-textarea/value--default.png +0 -0
  730. package/docs/assets/moni-textarea/variant--filled.png +0 -0
  731. package/docs/assets/moni-textarea/variant--outlined.png +0 -0
  732. package/docs/assets/moni-time-picker/hideHeadline--false.png +0 -0
  733. package/docs/assets/moni-time-picker/hideHeadline--true.png +0 -0
  734. package/docs/assets/moni-time-picker/hideModeToggle--false.png +0 -0
  735. package/docs/assets/moni-time-picker/hideModeToggle--true.png +0 -0
  736. package/docs/assets/moni-time-picker/hourLabel--default.png +0 -0
  737. package/docs/assets/moni-time-picker/minuteLabel--default.png +0 -0
  738. package/docs/assets/moni-time-picker/mode--dial.png +0 -0
  739. package/docs/assets/moni-time-picker/mode--input.png +0 -0
  740. package/docs/assets/moni-time-picker/orientation--auto.png +0 -0
  741. package/docs/assets/moni-time-picker/orientation--horizontal.png +0 -0
  742. package/docs/assets/moni-time-picker/orientation--vertical.png +0 -0
  743. package/docs/assets/moni-time-picker/use24Hour--false.png +0 -0
  744. package/docs/assets/moni-time-picker/use24Hour--true.png +0 -0
  745. package/docs/assets/moni-time-picker/value--default.png +0 -0
  746. package/docs/assets/moni-toolbar/scrolled--false.png +0 -0
  747. package/docs/assets/moni-toolbar/scrolled--true.png +0 -0
  748. package/docs/assets/moni-toolbar/title--default.png +0 -0
  749. package/docs/assets/moni-toolbar/type--floating.png +0 -0
  750. package/docs/assets/moni-toolbar/type--standard.png +0 -0
  751. package/docs/assets/moni-tooltip/position--bottom-end.png +0 -0
  752. package/docs/assets/moni-tooltip/position--bottom-start.png +0 -0
  753. package/docs/assets/moni-tooltip/position--bottom.png +0 -0
  754. package/docs/assets/moni-tooltip/position--left.png +0 -0
  755. package/docs/assets/moni-tooltip/position--right.png +0 -0
  756. package/docs/assets/moni-tooltip/position--top-end.png +0 -0
  757. package/docs/assets/moni-tooltip/position--top-start.png +0 -0
  758. package/docs/assets/moni-tooltip/position--top.png +0 -0
  759. package/docs/assets/moni-tooltip/rich--false.png +0 -0
  760. package/docs/assets/moni-tooltip/rich--true.png +0 -0
  761. package/docs/assets/moni-tooltip/rotateWithTarget--false.png +0 -0
  762. package/docs/assets/moni-tooltip/rotateWithTarget--true.png +0 -0
  763. package/docs/assets/moni-tooltip/size--empty.png +0 -0
  764. package/docs/assets/moni-tooltip/size--large.png +0 -0
  765. package/docs/assets/moni-tooltip/size--medium.png +0 -0
  766. package/docs/assets/moni-tooltip/size--small.png +0 -0
  767. package/docs/assets/moni-tooltip/text--default.png +0 -0
  768. package/docs/assets/moni-typography/as--default.png +0 -0
  769. package/docs/assets/moni-typography/size--large.png +0 -0
  770. package/docs/assets/moni-typography/size--medium.png +0 -0
  771. package/docs/assets/moni-typography/size--small.png +0 -0
  772. package/docs/assets/moni-typography/text--default.png +0 -0
  773. package/docs/assets/moni-typography/variant--body.png +0 -0
  774. package/docs/assets/moni-typography/variant--display.png +0 -0
  775. package/docs/assets/moni-typography/variant--headline.png +0 -0
  776. package/docs/assets/moni-typography/variant--label.png +0 -0
  777. package/docs/assets/moni-typography/variant--title.png +0 -0
  778. package/docs/components/app-bar.md +192 -0
  779. package/docs/components/badge.md +207 -0
  780. package/docs/components/bottom-sheet.md +220 -0
  781. package/docs/components/button-group.md +207 -0
  782. package/docs/components/button-segment.md +171 -0
  783. package/docs/components/button.md +277 -0
  784. package/docs/components/card.md +181 -0
  785. package/docs/components/carousel.md +275 -0
  786. package/docs/components/checkbox.md +196 -0
  787. package/docs/components/chip.md +222 -0
  788. package/docs/components/color-field.md +195 -0
  789. package/docs/components/context-menu.md +132 -0
  790. package/docs/components/dialog.md +193 -0
  791. package/docs/components/divider.md +123 -0
  792. package/docs/components/expansion.md +130 -0
  793. package/docs/components/fab-menu.md +162 -0
  794. package/docs/components/fab.md +202 -0
  795. package/docs/components/file-field.md +244 -0
  796. package/docs/components/icon.md +156 -0
  797. package/docs/components/list-item.md +189 -0
  798. package/docs/components/list.md +121 -0
  799. package/docs/components/loading-indicator.md +124 -0
  800. package/docs/components/menu-item.md +131 -0
  801. package/docs/components/menu.md +181 -0
  802. package/docs/components/morph-modal.md +183 -0
  803. package/docs/components/nav-item.md +169 -0
  804. package/docs/components/nav.md +172 -0
  805. package/docs/components/progress.md +172 -0
  806. package/docs/components/radio.md +200 -0
  807. package/docs/components/ripple.md +177 -0
  808. package/docs/components/segmented-button.md +145 -0
  809. package/docs/components/select-option.md +148 -0
  810. package/docs/components/select.md +332 -0
  811. package/docs/components/shape.md +169 -0
  812. package/docs/components/side-sheet.md +218 -0
  813. package/docs/components/slider.md +240 -0
  814. package/docs/components/snackbar.md +167 -0
  815. package/docs/components/split-button.md +148 -0
  816. package/docs/components/step.md +169 -0
  817. package/docs/components/stepper.md +121 -0
  818. package/docs/components/switch.md +198 -0
  819. package/docs/components/tab.md +133 -0
  820. package/docs/components/tabs.md +163 -0
  821. package/docs/components/text-field.md +321 -0
  822. package/docs/components/textarea.md +290 -0
  823. package/docs/components/time-picker.md +184 -0
  824. package/docs/components/toolbar.md +142 -0
  825. package/docs/components/tooltip.md +184 -0
  826. package/docs/components/typography.md +148 -0
  827. package/docs/llms.txt +53 -0
  828. package/package.json +6 -1
  829. package/src/components/index.test.ts +24 -0
  830. package/src/components/index.ts +8 -1
  831. package/src/components/moni-button-group.test.ts +15 -1
  832. package/src/components/moni-button-group.ts +19 -4
  833. package/src/components/moni-button.test.ts +8 -2
  834. package/src/components/moni-button.ts +2 -2
  835. package/src/components/moni-carousel.test.ts +15 -1
  836. package/src/components/moni-carousel.ts +19 -2
  837. package/src/components/moni-color-field.test.ts +71 -0
  838. package/src/components/moni-color-field.ts +50 -1
  839. package/src/components/moni-context-menu.test.ts +16 -0
  840. package/src/components/moni-context-menu.ts +14 -2
  841. package/src/components/moni-file-field.test.ts +4 -2
  842. package/src/components/moni-file-field.ts +6 -3
  843. package/src/components/moni-morph-modal.test.ts +173 -2
  844. package/src/components/moni-morph-modal.ts +622 -55
  845. package/src/components/moni-nav.ts +6 -3
  846. package/src/components/moni-select-option.ts +19 -0
  847. package/src/components/moni-select.test.ts +16 -0
  848. package/src/components/moni-select.ts +2 -0
  849. package/src/components/moni-side-sheet.test.ts +39 -2
  850. package/src/components/moni-side-sheet.ts +49 -17
  851. package/src/components/moni-snackbar.test.ts +16 -0
  852. package/src/components/moni-snackbar.ts +24 -1
  853. package/src/components/moni-stepper.ts +4 -0
  854. package/src/components/moni-text-field.test.ts +25 -0
  855. package/src/components/moni-text-field.ts +2 -0
  856. package/src/components/moni-textarea.test.ts +16 -0
  857. package/src/components/moni-textarea.ts +2 -0
  858. package/src/components/moni-toolbar.test.ts +6 -3
  859. package/src/components/moni-toolbar.ts +4 -2
  860. package/src/components/moni-tooltip.test.ts +77 -3
  861. package/src/components/moni-tooltip.ts +194 -3
  862. package/src/index.ts +8 -0
@@ -53,6 +53,7 @@ interface TargetState {
53
53
  backgroundColor: string;
54
54
  color: string;
55
55
  borderRadius: string;
56
+ boxShadow: string;
56
57
  }
57
58
 
58
59
  /**
@@ -108,7 +109,7 @@ interface MorphElements {
108
109
  *
109
110
  * @slot default - El contenido del cuerpo principal del modal.
110
111
  * @slot header - Contenido de encabezado personalizado (sobrescribe el atributo `title`).
111
- * @slot actions - Botones de acción mostrados en la parte inferior derecha.
112
+ * @slot footer - Botones de acción mostrados en la parte inferior derecha.
112
113
  */
113
114
 
114
115
  const litBool = {
@@ -235,6 +236,10 @@ export class MoniMorphModal extends MoniElement {
235
236
  @property({ type: Boolean, reflect: true, attribute: 'blur-content', converter: litBool })
236
237
  blurContent = false;
237
238
 
239
+ /** Muestra en consola el origen, geometría y estrategia usada por cada morph. */
240
+ @property({ type: Boolean, reflect: true, converter: litBool })
241
+ debug = false;
242
+
238
243
  @query('.panel') private _panel!: HTMLDivElement;
239
244
  @query('.panel-inner') private _inner!: HTMLDivElement;
240
245
  @query('.backdrop') private _backdrop!: HTMLDivElement;
@@ -250,6 +255,8 @@ export class MoniMorphModal extends MoniElement {
250
255
  private _handlingOpenChange = false;
251
256
  private _zIndex = 100;
252
257
  private _morphEls: MorphElements = { text: null, icon: null };
258
+ private _targetSnapshot: HTMLElement | null = null;
259
+ private _originFallbacks: HTMLElement[] = [];
253
260
  private static _openStack: MoniMorphModal[] = [];
254
261
  private _targetStylesCache = new Map<HTMLElement, { opacity: string; color: string }>();
255
262
 
@@ -352,6 +359,7 @@ export class MoniMorphModal extends MoniElement {
352
359
  console.warn('[moni-morph-modal] cannot show: target not found');
353
360
  return;
354
361
  }
362
+ this._captureOriginFallbacks(this._targetEl);
355
363
 
356
364
  this._isAnimating = true;
357
365
 
@@ -369,6 +377,7 @@ export class MoniMorphModal extends MoniElement {
369
377
  this.style.setProperty('--_z-index', String(this._zIndex));
370
378
  this.style.setProperty('--_backdrop-duration', '0.38s');
371
379
  this.style.setProperty('--_backdrop-ease', 'cubic-bezier(0.15, 0.85, 0.2, 1)');
380
+ if (this._backdrop) gsap.set(this._backdrop, { clearProps: 'opacity,transition' });
372
381
 
373
382
  // Fase "First": Ocultamos o cubrimos el trigger original según la configuración del desarrollador
374
383
  this._hideTargetContent();
@@ -388,15 +397,16 @@ export class MoniMorphModal extends MoniElement {
388
397
 
389
398
  // 1. "First": Calculamos el estado visual actual del trigger
390
399
  const targetState = this._getTargetState(this._targetEl);
400
+ this._debugMorph('open', this._targetEl, 'target', [this._targetEl]);
391
401
  const panel = this._panel;
392
402
 
393
403
  // 2. "Invert": Posicionamos el modal como un clon visual exacto del trigger.
394
404
  // Desactivamos la sombra y forzamos el color/borde para coincidir con el botón/FAB.
395
- this._applyRect(panel, targetState.rect);
405
+ this._applyRect(panel, this._toPanelCoordinateRect(targetState.rect));
396
406
  panel.style.backgroundColor = targetState.backgroundColor;
397
407
  panel.style.color = targetState.color;
398
408
  panel.style.borderRadius = targetState.borderRadius;
399
- panel.style.boxShadow = 'none';
409
+ panel.style.boxShadow = targetState.boxShadow;
400
410
  panel.style.zIndex = String(this._zIndex);
401
411
  panel.style.visibility = 'visible';
402
412
  panel.style.opacity = '1';
@@ -662,7 +672,6 @@ export class MoniMorphModal extends MoniElement {
662
672
 
663
673
  hide(): void {
664
674
  if (this._isAnimating || !this._visible) return;
665
- if (!this._targetEl) return;
666
675
 
667
676
  this._isAnimating = true;
668
677
  this._panel.classList.add('is-animating');
@@ -676,10 +685,13 @@ export class MoniMorphModal extends MoniElement {
676
685
  const body = this.shadowRoot!.querySelector('.body');
677
686
  const footer = this.shadowRoot!.querySelector('footer');
678
687
  const closeBtn = this.shadowRoot!.querySelector('.close-btn');
679
- const fadeTargets = [body, footer, closeBtn].filter(Boolean) as HTMLElement[];
680
688
  const headerWrapper = this.shadowRoot!.querySelector('.header-morph-wrapper') as HTMLElement;
689
+ const fadeTargets = [body, footer, closeBtn, headerWrapper].filter(Boolean) as HTMLElement[];
681
690
 
682
- const targetBlur = this.blurContent ? 'blur(12px)' : 'blur(0px)';
691
+ // El contenido pierde definición al retirarse, evitando un corte plano
692
+ // antes de que la superficie comience su recorrido. `blurContent`
693
+ // conserva la variante más expresiva para quienes desean mayor intensidad.
694
+ const targetBlur = this.blurContent ? 'blur(12px)' : 'blur(6px)';
683
695
  gsap.fromTo(
684
696
  fadeTargets,
685
697
  { opacity: 1, filter: 'blur(0px)' },
@@ -690,14 +702,19 @@ export class MoniMorphModal extends MoniElement {
690
702
  ease: 'power2.in',
691
703
  onComplete: () => {
692
704
  const panel = this._panel;
705
+ const closingTarget = this._resolveClosingTarget();
693
706
 
694
707
  this._cleanupMorphElements();
695
708
  const prefersReducedMotion = window.matchMedia(
696
709
  '(prefers-reduced-motion: reduce)'
697
710
  ).matches;
698
- let shouldMorph = this._shouldMorphLabel() && !prefersReducedMotion;
711
+ // El cierre usa un único snapshot compuesto. La ruta histórica que
712
+ // creaba `morph-text` y `morph-icon` por separado podía ejecutarse a
713
+ // la vez que el snapshot y dejar etiquetas flotando sobre el modal.
714
+ let shouldMorph = false;
699
715
  const morphTargets: HTMLElement[] = [];
700
716
  let source: any = null;
717
+ let destinationMorph: { element: HTMLElement; rect: DOMRect; source: HTMLElement } | null = null;
701
718
 
702
719
  if (shouldMorph) {
703
720
  this._animateLabelClose();
@@ -726,6 +743,25 @@ export class MoniMorphModal extends MoniElement {
726
743
  if (morphTargets.length === 0) shouldMorph = false;
727
744
  }
728
745
 
746
+ // Si el destino de cierre cambió, el contenido final debe ser una
747
+ // representación completa del target (no solamente su icono). Esto
748
+ // permite hacer morph hacia rich buttons, cards, imágenes y cualquier
749
+ // otra superficie compuesta.
750
+ if (closingTarget && !shouldMorph && !prefersReducedMotion) {
751
+ const visualTarget = this._resolveVisualTarget(closingTarget);
752
+ const destinationRect = visualTarget.getBoundingClientRect();
753
+ if (destinationRect.width > 0 && destinationRect.height > 0) {
754
+ // El contenido del trigger permanece oculto mientras el modal está
755
+ // abierto. Lo restauramos únicamente durante la captura para que el
756
+ // snapshot no herede opacity:0/color:transparent.
757
+ if (closingTarget === this._targetEl) this._restoreTargetContent();
758
+ const element = this._createTargetSnapshot(visualTarget, destinationRect);
759
+ if (closingTarget === this._targetEl) this._hideTargetContent();
760
+ element.style.opacity = '0';
761
+ destinationMorph = { element, rect: destinationRect, source: visualTarget };
762
+ }
763
+ }
764
+
729
765
  if (shouldMorph && headerWrapper) {
730
766
  headerWrapper.style.opacity = '0';
731
767
  }
@@ -734,10 +770,41 @@ export class MoniMorphModal extends MoniElement {
734
770
  props: 'backgroundColor,borderRadius,color,boxShadow'
735
771
  });
736
772
  const morphState = Flip.getState(morphTargets, {
737
- props: 'color,fontSize,fontWeight,lineHeight'
773
+ props: 'color,fontSize,fontWeight,lineHeight,opacity'
738
774
  });
739
775
 
740
- const targetState = this._getTargetState(this._targetEl!);
776
+ if (!closingTarget) {
777
+ gsap.to(this._backdrop, {
778
+ opacity: 0,
779
+ duration: prefersReducedMotion ? 0.01 : 0.22,
780
+ ease: 'power2.in'
781
+ });
782
+ gsap.to(panel, {
783
+ autoAlpha: 0,
784
+ scale: 0.92,
785
+ duration: prefersReducedMotion ? 0.01 : 0.22,
786
+ ease: 'power2.in',
787
+ overwrite: true,
788
+ onComplete: () => {
789
+ gsap.set(panel, { clearProps: 'transform' });
790
+ this._finishHide(fadeTargets, headerWrapper);
791
+ }
792
+ });
793
+ return;
794
+ }
795
+
796
+ const targetState = this._getTargetState(closingTarget);
797
+ if (destinationMorph) {
798
+ this._runTargetMorphTimeline(
799
+ panel,
800
+ targetState,
801
+ destinationMorph,
802
+ fadeTargets,
803
+ headerWrapper,
804
+ prefersReducedMotion
805
+ );
806
+ return;
807
+ }
741
808
 
742
809
  let naturalSize: { width: number; height: number } | undefined;
743
810
  if (this.autoSize) {
@@ -769,11 +836,11 @@ export class MoniMorphModal extends MoniElement {
769
836
  panel.style.setProperty('--_panel-width', `${finalRect.width}px`);
770
837
  panel.style.setProperty('--_panel-height', `${finalRect.height}px`);
771
838
 
772
- this._applyRect(panel, targetState.rect);
839
+ this._applyRect(panel, this._toPanelCoordinateRect(targetState.rect));
773
840
  panel.style.backgroundColor = targetState.backgroundColor;
774
841
  panel.style.color = targetState.color;
775
842
  panel.style.borderRadius = targetState.borderRadius;
776
- panel.style.boxShadow = 'none';
843
+ panel.style.boxShadow = targetState.boxShadow;
777
844
 
778
845
  if (shouldMorph && source) {
779
846
  if (this._morphEls.text && source.text) {
@@ -793,38 +860,17 @@ export class MoniMorphModal extends MoniElement {
793
860
  window.getComputedStyle(source.icon.element).color || 'inherit';
794
861
  }
795
862
  }
796
-
797
863
  Flip.from(state, {
798
864
  targets: panel,
799
865
  duration: 0.3,
800
866
  ease: 'morph-close',
801
867
  zIndex: this._zIndex,
802
- onComplete: () => {
803
- panel.style.visibility = 'hidden';
804
- panel.style.opacity = '0';
805
- panel.style.pointerEvents = 'none';
806
-
807
- this._visible = false;
808
- this._handlingOpenChange = true;
809
- this.open = false;
810
- this._handlingOpenChange = false;
811
- this._isAnimating = false;
812
- this._panel.classList.remove('is-animating');
813
- this._panel.style.removeProperty('--_panel-width');
814
- this._panel.style.removeProperty('--_panel-height');
815
- this._cleanupMorphElements();
816
- this._restoreTargetContent();
817
-
818
- gsap.set(fadeTargets, { clearProps: 'opacity,transform,filter' });
819
- if (headerWrapper) headerWrapper.style.opacity = '1';
820
- this.style.removeProperty('z-index');
821
- this.style.removeProperty('--_z-index');
822
- this.style.removeProperty('--_backdrop-duration');
823
- this.style.removeProperty('--_backdrop-ease');
824
-
825
- const idx = MoniMorphModal._openStack.indexOf(this);
826
- if (idx > -1) MoniMorphModal._openStack.splice(idx, 1);
827
- }
868
+ onComplete: () => this._finishHide(fadeTargets, headerWrapper)
869
+ });
870
+ gsap.to(this._backdrop, {
871
+ opacity: 0,
872
+ duration: 0.3,
873
+ ease: 'power2.inOut'
828
874
  });
829
875
 
830
876
  if (morphTargets.length > 0) {
@@ -847,6 +893,325 @@ export class MoniMorphModal extends MoniElement {
847
893
  );
848
894
  }
849
895
 
896
+ private _runTargetMorphTimeline(
897
+ panel: HTMLElement,
898
+ target: TargetState,
899
+ destination: { element: HTMLElement; rect: DOMRect; source: HTMLElement },
900
+ fadeTargets: HTMLElement[],
901
+ headerWrapper: HTMLElement | null,
902
+ prefersReducedMotion: boolean
903
+ ): void {
904
+ const current = this._toPanelCoordinateRect(panel.getBoundingClientRect());
905
+ const targetRect = this._toPanelCoordinateRect(target.rect);
906
+ const destinationRect = this._toPanelCoordinateRect(destination.rect);
907
+ const destinationContent = destination.element;
908
+ const activeTargetAnimations = destination.source.getAnimations?.({ subtree: true }) ?? [];
909
+ const remainingTargetMotion = activeTargetAnimations.reduce((remaining, animation) => {
910
+ const timing = animation.effect?.getComputedTiming();
911
+ const endTime = typeof timing?.endTime === 'number' ? timing.endTime : 0;
912
+ const currentTime = typeof animation.currentTime === 'number' ? animation.currentTime : 0;
913
+ return Math.max(remaining, Math.max(0, endTime - currentTime) / 1000);
914
+ }, 0);
915
+ const morphDuration = Math.min(1.2, Math.max(0.46, remainingTargetMotion));
916
+ const start = {
917
+ x: current.left + current.width / 2,
918
+ y: current.top + current.height / 2
919
+ };
920
+ const end = {
921
+ x: targetRect.left + targetRect.width / 2,
922
+ y: targetRect.top + targetRect.height / 2
923
+ };
924
+ const dx = end.x - start.x;
925
+ const dy = end.y - start.y;
926
+ const distance = Math.hypot(dx, dy) || 1;
927
+ // En una Bézier cuadrática el desplazamiento máximo visible equivale
928
+ // aproximadamente a la mitad del offset del control. 0.72 produce una
929
+ // curva expresiva visible (~36% de la distancia) sin formar un bucle.
930
+ const arc = Math.min(360, Math.max(48, distance * 0.72));
931
+ const perpendicular = { x: -dy / distance, y: dx / distance };
932
+ const midpoint = { x: (start.x + end.x) / 2, y: (start.y + end.y) / 2 };
933
+ const viewportCenter = this._toPanelCoordinateRect(
934
+ new DOMRect(window.innerWidth / 2, window.innerHeight / 2, 0, 0)
935
+ );
936
+ const candidates = [1, -1].map((direction) => ({
937
+ x: midpoint.x + perpendicular.x * arc * direction,
938
+ y: midpoint.y + perpendicular.y * arc * direction
939
+ }));
940
+ const centerDistance = (point: { x: number; y: number }) =>
941
+ Math.abs(
942
+ Math.abs(dy) >= Math.abs(dx)
943
+ ? point.x - viewportCenter.x
944
+ : point.y - viewportCenter.y
945
+ );
946
+ const control = centerDistance(candidates[0]) <= centerDistance(candidates[1])
947
+ ? candidates[0]
948
+ : candidates[1];
949
+
950
+ Object.assign(destinationContent.style, {
951
+ position: 'absolute',
952
+ inset: '50% auto auto 50%',
953
+ width: `${destinationRect.width}px`,
954
+ height: `${destinationRect.height}px`,
955
+ transform: 'translate(-50%, -50%) scale(.78)',
956
+ color: window.getComputedStyle(destination.source).color || target.color,
957
+ opacity: '0'
958
+ });
959
+
960
+ if (prefersReducedMotion) {
961
+ panel.appendChild(destinationContent);
962
+ this._applyRect(panel, targetRect);
963
+ panel.style.backgroundColor = target.backgroundColor;
964
+ panel.style.color = target.color;
965
+ panel.style.borderRadius = target.borderRadius;
966
+ panel.style.boxShadow = target.boxShadow;
967
+ this._backdrop.style.opacity = '0';
968
+ destinationContent.style.opacity = '1';
969
+ this._finishHide(fadeTargets, headerWrapper);
970
+ return;
971
+ }
972
+
973
+ const timeline = gsap.timeline({
974
+ onComplete: () => {
975
+ gsap.set(panel, { clearProps: 'transform' });
976
+ this._finishHide(fadeTargets, headerWrapper);
977
+ }
978
+ });
979
+ panel.style.left = `${current.left}px`;
980
+ panel.style.top = `${current.top}px`;
981
+ panel.style.width = `${current.width}px`;
982
+ panel.style.height = `${current.height}px`;
983
+ const panelStartStyle = window.getComputedStyle(panel);
984
+ const panelStartVisual = {
985
+ backgroundColor: panelStartStyle.backgroundColor,
986
+ color: panelStartStyle.color,
987
+ borderRadius: panelStartStyle.borderRadius,
988
+ boxShadow: panelStartStyle.boxShadow
989
+ };
990
+ // GSAP es el único propietario de la opacidad durante el recorrido.
991
+ // La transición CSS del estado `.open` produciría un segundo easing y
992
+ // haría que el scrim pareciera desaparecer al final de golpe.
993
+ this._backdrop.style.transition = 'none';
994
+ this._backdrop.style.opacity = '1';
995
+ const motion = { progress: 0 };
996
+ let contentAttached = false;
997
+ if (this.debug) {
998
+ console.log('[moni-morph-modal] arc', { start, control, end, distance, arc, morphDuration });
999
+ }
1000
+ timeline
1001
+ .addLabel('morph', 0)
1002
+ .to(motion, {
1003
+ progress: 1,
1004
+ duration: morphDuration,
1005
+ ease: 'power2.inOut',
1006
+ onUpdate: () => {
1007
+ const progress = motion.progress;
1008
+ const liveState = this._getTargetState(destination.source);
1009
+ const liveRect = this._toPanelCoordinateRect(liveState.rect);
1010
+ const liveTransform = this._readTransformState(destination.source);
1011
+ const liveEnd = {
1012
+ x: liveRect.left + liveRect.width / 2,
1013
+ y: liveRect.top + liveRect.height / 2
1014
+ };
1015
+ const liveDx = liveEnd.x - start.x;
1016
+ const liveDy = liveEnd.y - start.y;
1017
+ const liveDistance = Math.hypot(liveDx, liveDy) || 1;
1018
+ const liveArc = Math.min(360, Math.max(48, liveDistance * 0.72));
1019
+ const livePerpendicular = { x: -liveDy / liveDistance, y: liveDx / liveDistance };
1020
+ const liveMidpoint = {
1021
+ x: (start.x + liveEnd.x) / 2,
1022
+ y: (start.y + liveEnd.y) / 2
1023
+ };
1024
+ const liveCandidates = [1, -1].map((direction) => ({
1025
+ x: liveMidpoint.x + livePerpendicular.x * liveArc * direction,
1026
+ y: liveMidpoint.y + livePerpendicular.y * liveArc * direction
1027
+ }));
1028
+ const liveControl = centerDistance(liveCandidates[0]) <= centerDistance(liveCandidates[1])
1029
+ ? liveCandidates[0]
1030
+ : liveCandidates[1];
1031
+ // El backdrop comparte exactamente el playhead del arco. Se mantiene
1032
+ // algo más presente al comienzo y luego se retira progresivamente.
1033
+ this._backdrop.style.opacity = String(Math.max(0, 1 - progress));
1034
+ const inverse = 1 - progress;
1035
+ const centerX =
1036
+ inverse * inverse * start.x +
1037
+ 2 * inverse * progress * liveControl.x +
1038
+ progress * progress * liveEnd.x;
1039
+ const centerY =
1040
+ inverse * inverse * start.y +
1041
+ 2 * inverse * progress * liveControl.y +
1042
+ progress * progress * liveEnd.y;
1043
+ // La contracción modal mantiene su easing, pero cualquier mutación
1044
+ // adicional del target se suma completa para seguirla en tiempo real.
1045
+ const liveVisualWidth = destination.source.offsetWidth || liveRect.width;
1046
+ const liveVisualHeight = destination.source.offsetHeight || liveRect.height;
1047
+ const initialVisualWidth = destination.source.offsetWidth || targetRect.width;
1048
+ const initialVisualHeight = destination.source.offsetHeight || targetRect.height;
1049
+ const width =
1050
+ current.width + (initialVisualWidth - current.width) * progress +
1051
+ (liveVisualWidth - initialVisualWidth);
1052
+ const height =
1053
+ current.height + (initialVisualHeight - current.height) * progress +
1054
+ (liveVisualHeight - initialVisualHeight);
1055
+ panel.style.width = `${width}px`;
1056
+ panel.style.height = `${height}px`;
1057
+ gsap.set(panel, {
1058
+ x: centerX - width / 2 - current.left,
1059
+ y: centerY - height / 2 - current.top,
1060
+ rotation: liveTransform.rotation * progress,
1061
+ skewX: liveTransform.skewX * progress,
1062
+ scaleX: 1 + (liveTransform.scaleX - 1) * progress,
1063
+ scaleY: 1 + (liveTransform.scaleY - 1) * progress,
1064
+ backgroundColor: gsap.utils.interpolate(
1065
+ panelStartVisual.backgroundColor,
1066
+ liveState.backgroundColor,
1067
+ progress
1068
+ ),
1069
+ color: gsap.utils.interpolate(panelStartVisual.color, liveState.color, progress),
1070
+ borderRadius: gsap.utils.interpolate(
1071
+ panelStartVisual.borderRadius,
1072
+ liveState.borderRadius,
1073
+ progress
1074
+ ),
1075
+ boxShadow: gsap.utils.interpolate(
1076
+ panelStartVisual.boxShadow,
1077
+ liveState.boxShadow,
1078
+ progress
1079
+ )
1080
+ });
1081
+ // El contenido del target no debe flotar sobre el modal grande. Solo
1082
+ // comienza a materializarse cuando posición y relación de aspecto ya
1083
+ // se aproximan al destino, pero continúa viajando con la superficie.
1084
+ const contentProgress = Math.max(0, Math.min(1, (progress - 0.6) / 0.4));
1085
+ if (!contentAttached && contentProgress > 0) {
1086
+ panel.appendChild(destinationContent);
1087
+ contentAttached = true;
1088
+ }
1089
+ // Conservamos el layout nativo del target y escalamos toda su
1090
+ // composición. Redimensionar el wrapper convertiría porcentajes
1091
+ // computados en píxeles fijos y dejaría la imagen arriba a la izquierda.
1092
+ destinationContent.style.width = `${liveVisualWidth}px`;
1093
+ destinationContent.style.height = `${liveVisualHeight}px`;
1094
+ const revealScale = 0.82 + contentProgress * 0.18;
1095
+ gsap.set(destinationContent, {
1096
+ opacity: contentProgress,
1097
+ scaleX: (width / Math.max(1, liveVisualWidth)) * revealScale,
1098
+ scaleY: (height / Math.max(1, liveVisualHeight)) * revealScale
1099
+ });
1100
+ }
1101
+ }, 'morph')
1102
+ .addLabel('target-fade')
1103
+ .to(panel, {
1104
+ autoAlpha: 0,
1105
+ duration: 0.08,
1106
+ ease: 'power1.out',
1107
+ onStart: () => {
1108
+ // Handoff atómico: el contenido real ocupa el lugar del snapshot
1109
+ // antes de retirar la última superficie. Evita un frame vacío o una
1110
+ // duplicación perceptible al finalizar el morph.
1111
+ destinationContent.style.visibility = 'hidden';
1112
+ this._restoreTargetContent();
1113
+ panel.style.backgroundColor = 'transparent';
1114
+ panel.style.boxShadow = 'none';
1115
+ panel.style.borderColor = 'transparent';
1116
+ }
1117
+ }, `morph+=${morphDuration}`);
1118
+ }
1119
+
1120
+ private _finishHide(fadeTargets: HTMLElement[], headerWrapper: HTMLElement | null): void {
1121
+ const panel = this._panel;
1122
+ panel.style.visibility = 'hidden';
1123
+ panel.style.opacity = '0';
1124
+ panel.style.pointerEvents = 'none';
1125
+ this._visible = false;
1126
+ this._handlingOpenChange = true;
1127
+ this.open = false;
1128
+ this._handlingOpenChange = false;
1129
+ this._isAnimating = false;
1130
+ panel.classList.remove('is-animating');
1131
+ panel.style.removeProperty('--_panel-width');
1132
+ panel.style.removeProperty('--_panel-height');
1133
+ this._cleanupMorphElements();
1134
+ this._restoreTargetContent();
1135
+ gsap.set(fadeTargets, { clearProps: 'opacity,transform,filter' });
1136
+ if (headerWrapper) headerWrapper.style.opacity = '1';
1137
+ this.style.removeProperty('z-index');
1138
+ this.style.removeProperty('--_z-index');
1139
+ this.style.removeProperty('--_backdrop-duration');
1140
+ this.style.removeProperty('--_backdrop-ease');
1141
+ // Conservamos opacity:0 hasta la próxima apertura. Limpiarla aquí puede
1142
+ // producir un flash de scrim antes de que Lit retire la clase `.open`.
1143
+ const idx = MoniMorphModal._openStack.indexOf(this);
1144
+ if (idx > -1) MoniMorphModal._openStack.splice(idx, 1);
1145
+ }
1146
+
1147
+ private _captureOriginFallbacks(origin: HTMLElement): void {
1148
+ this._originFallbacks = [];
1149
+ let current: HTMLElement | null = this._getComposedParent(origin);
1150
+ while (current && current !== document.body && current !== document.documentElement) {
1151
+ this._originFallbacks.push(current);
1152
+ current = this._getComposedParent(current);
1153
+ }
1154
+ }
1155
+
1156
+ private _getComposedParent(el: HTMLElement): HTMLElement | null {
1157
+ if (el.parentElement) return el.parentElement;
1158
+ const root = el.getRootNode();
1159
+ return root instanceof ShadowRoot ? (root.host as HTMLElement) : null;
1160
+ }
1161
+
1162
+ private _resolveClosingTarget(): HTMLElement | null {
1163
+ if (this.target) this._resolveTarget();
1164
+ const candidates = [this._targetEl, ...this._originFallbacks].filter(
1165
+ (candidate, index, all): candidate is HTMLElement => !!candidate && all.indexOf(candidate) === index
1166
+ );
1167
+ const resolved = candidates.find((candidate) => this._isUsableClosingTarget(candidate)) ?? null;
1168
+ const strategy = !resolved ? 'fade' : resolved === this._targetEl ? 'target' : 'ancestor';
1169
+ this._debugMorph('close', resolved, strategy, candidates);
1170
+ return resolved;
1171
+ }
1172
+
1173
+ private _debugMorph(
1174
+ phase: 'open' | 'close',
1175
+ resolved: HTMLElement | null,
1176
+ strategy: 'target' | 'ancestor' | 'fade',
1177
+ candidates: HTMLElement[]
1178
+ ): void {
1179
+ if (!this.debug) return;
1180
+ const rows = candidates.map((element, index) => {
1181
+ const rect = element.getBoundingClientRect();
1182
+ return {
1183
+ index,
1184
+ element: `${element.tagName.toLowerCase()}${element.id ? `#${element.id}` : ''}`,
1185
+ connected: element.isConnected,
1186
+ usable: this._isUsableClosingTarget(element),
1187
+ x: Math.round(rect.x),
1188
+ y: Math.round(rect.y),
1189
+ width: Math.round(rect.width),
1190
+ height: Math.round(rect.height)
1191
+ };
1192
+ });
1193
+ console.groupCollapsed(`[moni-morph-modal] ${phase} → ${strategy}`);
1194
+ console.log('Origin:', this._targetEl);
1195
+ console.log('Resolved morph target:', resolved);
1196
+ console.table(rows);
1197
+ console.groupEnd();
1198
+ }
1199
+
1200
+ private _isUsableClosingTarget(el: HTMLElement | null): el is HTMLElement {
1201
+ if (!el?.isConnected) return false;
1202
+ const rect = el.getBoundingClientRect();
1203
+ if (rect.width < 2 || rect.height < 2) return false;
1204
+ if (rect.right <= 0 || rect.bottom <= 0 || rect.left >= window.innerWidth || rect.top >= window.innerHeight) return false;
1205
+ let current: HTMLElement | null = el;
1206
+ while (current && current !== document.body) {
1207
+ const style = getComputedStyle(current);
1208
+ if (style.display === 'none' || style.visibility === 'hidden' || style.contentVisibility === 'hidden') return false;
1209
+ if (Number.parseFloat(style.opacity || '1') === 0 && !this._targetStylesCache.has(current)) return false;
1210
+ current = this._getComposedParent(current);
1211
+ }
1212
+ return true;
1213
+ }
1214
+
850
1215
  toggle(): void {
851
1216
  if (this._visible || this.open) this.hide();
852
1217
  else this.show();
@@ -887,6 +1252,11 @@ export class MoniMorphModal extends MoniElement {
887
1252
  if (parts.label) saveAndHide(parts.label as HTMLElement, 'opacity');
888
1253
  if (parts.icon) saveAndHide(parts.icon as HTMLElement, 'opacity');
889
1254
  if (parts.iconTrailing) saveAndHide(parts.iconTrailing as HTMLElement, 'opacity');
1255
+ } else if (this._targetEl.tagName === 'MONI-FAB') {
1256
+ const icon = this._targetEl.shadowRoot?.querySelector('.icon') as HTMLElement | null;
1257
+ const label = this._targetEl.shadowRoot?.querySelector('.label') as HTMLElement | null;
1258
+ if (icon) saveAndHide(icon, 'opacity');
1259
+ if (label) saveAndHide(label, 'opacity');
890
1260
  } else {
891
1261
  saveAndHide(this._targetEl, 'color');
892
1262
  const icon = this._targetEl.querySelector('moni-icon, svg, [class*="icon"]');
@@ -920,6 +1290,11 @@ export class MoniMorphModal extends MoniElement {
920
1290
  if (parts.label) restore(parts.label as HTMLElement);
921
1291
  if (parts.icon) restore(parts.icon as HTMLElement);
922
1292
  if (parts.iconTrailing) restore(parts.iconTrailing as HTMLElement);
1293
+ } else if (this._targetEl.tagName === 'MONI-FAB') {
1294
+ const icon = this._targetEl.shadowRoot?.querySelector('.icon') as HTMLElement | null;
1295
+ const label = this._targetEl.shadowRoot?.querySelector('.label') as HTMLElement | null;
1296
+ if (icon) restore(icon);
1297
+ if (label) restore(label);
923
1298
  } else {
924
1299
  restore(this._targetEl);
925
1300
  const icon = this._targetEl.querySelector('moni-icon, svg, [class*="icon"]');
@@ -960,6 +1335,10 @@ export class MoniMorphModal extends MoniElement {
960
1335
  // =========================================================================
961
1336
 
962
1337
  private _cleanupMorphElements(): void {
1338
+ if (this._targetSnapshot) {
1339
+ this._targetSnapshot.remove();
1340
+ this._targetSnapshot = null;
1341
+ }
963
1342
  if (this._morphEls.text) {
964
1343
  this._morphEls.text.remove();
965
1344
  this._morphEls.text = null;
@@ -1059,10 +1438,46 @@ export class MoniMorphModal extends MoniElement {
1059
1438
  }
1060
1439
 
1061
1440
  private _positionElement(el: HTMLElement, rect: DOMRect): void {
1062
- el.style.top = `${rect.top}px`;
1063
- el.style.left = `${rect.left}px`;
1064
- el.style.width = `${rect.width}px`;
1065
- el.style.height = `${rect.height}px`;
1441
+ const localRect = this._toPanelCoordinateRect(rect);
1442
+ el.style.top = `${localRect.top}px`;
1443
+ el.style.left = `${localRect.left}px`;
1444
+ el.style.width = `${localRect.width}px`;
1445
+ el.style.height = `${localRect.height}px`;
1446
+ }
1447
+
1448
+ private _toPanelCoordinateRect(rect: DOMRect): DOMRect {
1449
+ const ancestor = this.parentElement?.closest<HTMLElement>(
1450
+ '.lab-canvas, [data-morph-coordinate-space]'
1451
+ );
1452
+ if (!ancestor) return rect;
1453
+ const transform = getComputedStyle(ancestor).transform;
1454
+ if (!transform || transform === 'none') return rect;
1455
+ let scaleX = 1;
1456
+ let scaleY = 1;
1457
+ if (typeof DOMMatrix !== 'undefined') {
1458
+ const matrix = new DOMMatrix(transform);
1459
+ scaleX = Math.hypot(matrix.a, matrix.b) || 1;
1460
+ scaleY = Math.hypot(matrix.c, matrix.d) || 1;
1461
+ } else {
1462
+ const matrixMatch = transform.match(/^matrix\(([^)]+)\)$/);
1463
+ const scaleMatch = transform.match(/^scale\(([^)]+)\)$/);
1464
+ if (matrixMatch) {
1465
+ const values = matrixMatch[1].split(',').map(Number);
1466
+ scaleX = Math.hypot(values[0], values[1]) || 1;
1467
+ scaleY = Math.hypot(values[2], values[3]) || 1;
1468
+ } else if (scaleMatch) {
1469
+ const values = scaleMatch[1].split(/[,\s]+/).map(Number);
1470
+ scaleX = values[0] || 1;
1471
+ scaleY = values[1] || scaleX;
1472
+ }
1473
+ }
1474
+ const ancestorRect = ancestor.getBoundingClientRect();
1475
+ return new DOMRect(
1476
+ (rect.left - ancestorRect.left) / scaleX,
1477
+ (rect.top - ancestorRect.top) / scaleY,
1478
+ rect.width / scaleX,
1479
+ rect.height / scaleY
1480
+ );
1066
1481
  }
1067
1482
 
1068
1483
  private _getMoniButtonParts(): {
@@ -1262,18 +1677,10 @@ export class MoniMorphModal extends MoniElement {
1262
1677
  }
1263
1678
 
1264
1679
  private _getTargetState(el: HTMLElement): TargetState {
1265
- const rect = el.getBoundingClientRect();
1266
-
1267
- // Para <moni-button> el botón visual vive dentro del shadow DOM;
1268
- // el host es transparente y sin border-radius, así que leemos
1269
- // los estilos del <button> interno para que la morph coincida.
1270
- let visualEl: Element = el;
1271
- if (el.tagName === 'MONI-BUTTON') {
1272
- const inner = el.shadowRoot?.querySelector('.button') as
1273
- | HTMLElement
1274
- | undefined;
1275
- if (inner) visualEl = inner;
1276
- }
1680
+ // Los Web Components interactivos exponen un host transparente. El morph
1681
+ // debe usar la superficie pintada real dentro de su Shadow DOM.
1682
+ const visualEl = this._resolveVisualTarget(el);
1683
+ const rect = visualEl.getBoundingClientRect();
1277
1684
 
1278
1685
  let bg = window.getComputedStyle(visualEl).backgroundColor;
1279
1686
 
@@ -1306,10 +1713,125 @@ export class MoniMorphModal extends MoniElement {
1306
1713
  rect,
1307
1714
  backgroundColor: bg,
1308
1715
  color: computed.color || 'var(--on-surface)',
1309
- borderRadius: computed.borderRadius || '1.25rem'
1716
+ borderRadius: computed.borderRadius || '1.25rem',
1717
+ boxShadow: computed.boxShadow || 'none'
1310
1718
  };
1311
1719
  }
1312
1720
 
1721
+ private _resolveVisualTarget(el: HTMLElement): HTMLElement {
1722
+ if (el.tagName === 'MONI-BUTTON') {
1723
+ return (el.shadowRoot?.querySelector('.button') as HTMLElement | null) ?? el;
1724
+ }
1725
+ if (el.tagName === 'MONI-FAB') {
1726
+ return (el.shadowRoot?.querySelector('button') as HTMLElement | null) ?? el;
1727
+ }
1728
+ if (el.tagName === 'MONI-FAB-MENU') {
1729
+ const trigger = el.shadowRoot?.querySelector('.trigger') as HTMLElement | null;
1730
+ return (trigger?.shadowRoot?.querySelector('button') as HTMLElement | null) ?? trigger ?? el;
1731
+ }
1732
+ return el;
1733
+ }
1734
+
1735
+ /**
1736
+ * Crea una copia visual inerte del árbol compuesto del target. Los `<slot>`
1737
+ * se sustituyen por sus nodos asignados, por lo que la captura incluye tanto
1738
+ * contenido light DOM como superficies internas de Web Components.
1739
+ */
1740
+ private _createTargetSnapshot(source: HTMLElement, rect: DOMRect): HTMLElement {
1741
+ this._targetSnapshot?.remove();
1742
+ const snapshot = document.createElement('div');
1743
+ snapshot.className = 'morph-target-snapshot';
1744
+ snapshot.setAttribute('aria-hidden', 'true');
1745
+ const clone = this._cloneComposedNode(source);
1746
+ if (clone) {
1747
+ snapshot.appendChild(clone);
1748
+ // La geometría, el color y la elevación pertenecen al panel animado.
1749
+ // Repetirlos en el snapshot crea una segunda píldora encima del morph.
1750
+ // En medios visuales, en cambio, la propia superficie sí es contenido.
1751
+ if (
1752
+ clone instanceof HTMLElement &&
1753
+ !['IMG', 'VIDEO', 'CANVAS', 'SVG', 'PICTURE'].includes(source.tagName)
1754
+ ) {
1755
+ Object.assign(clone.style, {
1756
+ background: 'transparent',
1757
+ backgroundColor: 'transparent',
1758
+ boxShadow: 'none',
1759
+ borderColor: 'transparent',
1760
+ outline: 'none',
1761
+ position: 'relative',
1762
+ inset: 'auto',
1763
+ transform: 'none',
1764
+ opacity: '1',
1765
+ visibility: 'visible',
1766
+ width: '100%',
1767
+ height: '100%'
1768
+ });
1769
+ if (source.tagName === 'BUTTON') {
1770
+ clone.style.whiteSpace = 'nowrap';
1771
+ clone.querySelectorAll<HTMLElement>('span, [part~="label"]').forEach((child) => {
1772
+ child.style.whiteSpace = 'nowrap';
1773
+ });
1774
+ }
1775
+ }
1776
+ }
1777
+ Object.assign(snapshot.style, {
1778
+ width: `${rect.width}px`,
1779
+ height: `${rect.height}px`,
1780
+ overflow: 'hidden',
1781
+ pointerEvents: 'none'
1782
+ });
1783
+ this._targetSnapshot = snapshot;
1784
+ return snapshot;
1785
+ }
1786
+
1787
+ private _cloneComposedNode(source: Node): Node | null {
1788
+ if (source.nodeType === Node.TEXT_NODE) return source.cloneNode(false);
1789
+ if (!(source instanceof Element)) return null;
1790
+
1791
+ if (source instanceof HTMLSlotElement) {
1792
+ const fragment = document.createDocumentFragment();
1793
+ const nodes = source.assignedNodes({ flatten: true });
1794
+ for (const node of nodes.length ? nodes : Array.from(source.childNodes)) {
1795
+ const child = this._cloneComposedNode(node);
1796
+ if (child) fragment.appendChild(child);
1797
+ }
1798
+ return fragment;
1799
+ }
1800
+
1801
+ // No clonamos directamente un Custom Element con Shadow DOM: su
1802
+ // constructor crearía una segunda sombra y duplicaría el render. Una
1803
+ // superficie neutra recibe en cambio el árbol visual ya compuesto.
1804
+ const clone = (source.shadowRoot
1805
+ ? document.createElement('div')
1806
+ : source.cloneNode(false)) as HTMLElement;
1807
+ if (source instanceof HTMLImageElement && clone instanceof HTMLImageElement) {
1808
+ // El snapshot vive menos de medio segundo: no puede depender de que el
1809
+ // lazy-loader observe nuevamente una imagen que ya estaba renderizada.
1810
+ clone.loading = 'eager';
1811
+ clone.decoding = 'sync';
1812
+ if (source.currentSrc) clone.src = source.currentSrc;
1813
+ }
1814
+ clone.removeAttribute('id');
1815
+ clone.removeAttribute('name');
1816
+ clone.setAttribute('aria-hidden', 'true');
1817
+ const computed = window.getComputedStyle(source);
1818
+ for (let index = 0; index < computed.length; index += 1) {
1819
+ const property = computed.item(index);
1820
+ clone.style.setProperty(property, computed.getPropertyValue(property), computed.getPropertyPriority(property));
1821
+ }
1822
+
1823
+ const children = source.shadowRoot
1824
+ ? Array.from(source.shadowRoot.childNodes).filter(
1825
+ (node) => !(node instanceof HTMLStyleElement)
1826
+ )
1827
+ : Array.from(source.childNodes);
1828
+ for (const node of children) {
1829
+ const child = this._cloneComposedNode(node);
1830
+ if (child) clone.appendChild(child);
1831
+ }
1832
+ return clone;
1833
+ }
1834
+
1313
1835
  private _isColorTransparent(color: string | null | undefined): boolean {
1314
1836
  if (!color) return true;
1315
1837
  const c = color.replace(/\s/g, '').toLowerCase();
@@ -1322,6 +1844,51 @@ export class MoniMorphModal extends MoniElement {
1322
1844
  );
1323
1845
  }
1324
1846
 
1847
+ private _readTransformState(el: HTMLElement): {
1848
+ rotation: number;
1849
+ skewX: number;
1850
+ scaleX: number;
1851
+ scaleY: number;
1852
+ } {
1853
+ const transform = window.getComputedStyle(el).transform;
1854
+ if (!transform || transform === 'none') {
1855
+ return { rotation: 0, skewX: 0, scaleX: 1, scaleY: 1 };
1856
+ }
1857
+ try {
1858
+ const values = transform.match(/matrix(?:3d)?\(([^)]+)\)/)?.[1]
1859
+ .split(',')
1860
+ .map((value) => Number.parseFloat(value.trim()));
1861
+ let a: number;
1862
+ let b: number;
1863
+ let c: number;
1864
+ let d: number;
1865
+ if (values?.length === 6) {
1866
+ [a, b, c, d] = values;
1867
+ } else if (values?.length === 16) {
1868
+ a = values[0];
1869
+ b = values[1];
1870
+ c = values[4];
1871
+ d = values[5];
1872
+ } else {
1873
+ const matrix = new DOMMatrix(transform);
1874
+ ({ a, b, c, d } = matrix);
1875
+ }
1876
+ const scaleX = Math.hypot(a, b) || 1;
1877
+ const determinant = a * d - b * c;
1878
+ const scaleY = determinant / scaleX || 1;
1879
+ return {
1880
+ rotation: Math.atan2(b, a) * (180 / Math.PI),
1881
+ skewX:
1882
+ Math.atan2(a * c + b * d, scaleX * scaleX) *
1883
+ (180 / Math.PI),
1884
+ scaleX,
1885
+ scaleY
1886
+ };
1887
+ } catch {
1888
+ return { rotation: 0, skewX: 0, scaleX: 1, scaleY: 1 };
1889
+ }
1890
+ }
1891
+
1325
1892
  private _applyRect(el: HTMLElement, rect: DOMRect): void {
1326
1893
  el.style.top = `${rect.top}px`;
1327
1894
  el.style.left = `${rect.left}px`;