@moni-labs/moni-ui 0.4.4 → 0.4.5
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.
- package/README.md +3 -3
- package/custom-elements.json +4670 -16030
- package/dist/browser/moni-ui.iife.min.js +836 -114
- package/dist/browser/moni-ui.iife.min.js.br +0 -0
- package/dist/browser/moni-ui.iife.min.js.gz +0 -0
- package/dist/browser/moni-ui.iife.min.js.map +1 -1
- package/dist/browser/moni-ui.min.js +3120 -1821
- package/dist/browser/moni-ui.min.js.br +0 -0
- package/dist/browser/moni-ui.min.js.gz +0 -0
- package/dist/browser/moni-ui.min.js.map +1 -1
- package/dist/cdn/components/moni-button-group.js +5 -3
- package/dist/cdn/components/moni-button.js +2 -2
- package/dist/cdn/components/moni-carousel.js +1 -1
- package/dist/cdn/components/moni-context-menu.js +4 -1
- package/dist/cdn/components/moni-file-field.js +9 -9
- package/dist/cdn/components/moni-morph-modal.js +2 -2
- package/dist/cdn/components/moni-side-sheet.js +18 -6
- package/dist/cdn/components/moni-snackbar.js +15 -2
- package/dist/cdn/components/moni-toolbar.js +3 -1
- package/dist/cdn/components/moni-tooltip.js +60 -4
- package/dist/cdn/importmap.json +98 -98
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +8 -0
- package/dist/components/moni-button-group.d.ts.map +1 -1
- package/dist/components/moni-button-group.js +15 -4
- package/dist/components/moni-button.js +2 -2
- package/dist/components/moni-carousel.d.ts +2 -0
- package/dist/components/moni-carousel.d.ts.map +1 -1
- package/dist/components/moni-carousel.js +18 -0
- package/dist/components/moni-context-menu.d.ts.map +1 -1
- package/dist/components/moni-context-menu.js +14 -3
- package/dist/components/moni-file-field.d.ts.map +1 -1
- package/dist/components/moni-file-field.js +6 -3
- package/dist/components/moni-morph-modal.d.ts +21 -0
- package/dist/components/moni-morph-modal.d.ts.map +1 -1
- package/dist/components/moni-morph-modal.js +573 -51
- package/dist/components/moni-side-sheet.d.ts +5 -0
- package/dist/components/moni-side-sheet.d.ts.map +1 -1
- package/dist/components/moni-side-sheet.js +48 -17
- package/dist/components/moni-snackbar.d.ts +1 -0
- package/dist/components/moni-snackbar.d.ts.map +1 -1
- package/dist/components/moni-snackbar.js +21 -1
- package/dist/components/moni-toolbar.d.ts.map +1 -1
- package/dist/components/moni-toolbar.js +3 -1
- package/dist/components/moni-tooltip.d.ts +11 -2
- package/dist/components/moni-tooltip.d.ts.map +1 -1
- package/dist/components/moni-tooltip.js +195 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/docs/COMPONENTS.md +10 -0
- package/docs/LLM-GUIDE.md +107 -0
- package/docs/PUBLISHING.md +31 -0
- package/docs/README.md +64 -0
- package/docs/api.json +6178 -0
- package/docs/assets/moni-app-bar/elevated--false.png +0 -0
- package/docs/assets/moni-app-bar/elevated--true.png +0 -0
- package/docs/assets/moni-app-bar/placement--bottom.png +0 -0
- package/docs/assets/moni-app-bar/placement--top.png +0 -0
- package/docs/assets/moni-app-bar/size--default.png +0 -0
- package/docs/assets/moni-app-bar/size--prominent.png +0 -0
- package/docs/assets/moni-app-bar/subtitle--default.png +0 -0
- package/docs/assets/moni-app-bar/title--default.png +0 -0
- package/docs/assets/moni-app-bar/variant--floating.png +0 -0
- package/docs/assets/moni-app-bar/variant--standard.png +0 -0
- package/docs/assets/moni-badge/border--false.png +0 -0
- package/docs/assets/moni-badge/border--true.png +0 -0
- package/docs/assets/moni-badge/color--error.png +0 -0
- package/docs/assets/moni-badge/color--primary.png +0 -0
- package/docs/assets/moni-badge/color--secondary.png +0 -0
- package/docs/assets/moni-badge/color--tertiary.png +0 -0
- package/docs/assets/moni-badge/inline--false.png +0 -0
- package/docs/assets/moni-badge/inline--true.png +0 -0
- package/docs/assets/moni-badge/position--bottom.png +0 -0
- package/docs/assets/moni-badge/position--empty.png +0 -0
- package/docs/assets/moni-badge/position--left.png +0 -0
- package/docs/assets/moni-badge/position--none.png +0 -0
- package/docs/assets/moni-badge/position--right.png +0 -0
- package/docs/assets/moni-badge/position--top.png +0 -0
- package/docs/assets/moni-badge/shape--circle.png +0 -0
- package/docs/assets/moni-badge/shape--empty.png +0 -0
- package/docs/assets/moni-badge/shape--min.png +0 -0
- package/docs/assets/moni-badge/shape--square.png +0 -0
- package/docs/assets/moni-badge/value--default.png +0 -0
- package/docs/assets/moni-bottom-sheet/expandedHeight--default.png +0 -0
- package/docs/assets/moni-bottom-sheet/handle--false.png +0 -0
- package/docs/assets/moni-bottom-sheet/handle--true.png +0 -0
- package/docs/assets/moni-bottom-sheet/maxWidth--default.png +0 -0
- package/docs/assets/moni-bottom-sheet/modal--false.png +0 -0
- package/docs/assets/moni-bottom-sheet/modal--true.png +0 -0
- package/docs/assets/moni-bottom-sheet/open--false.png +0 -0
- package/docs/assets/moni-bottom-sheet/open--true.png +0 -0
- package/docs/assets/moni-bottom-sheet/positioning--absolute.png +0 -0
- package/docs/assets/moni-bottom-sheet/positioning--body.png +0 -0
- package/docs/assets/moni-bottom-sheet/positioning--fixed.png +0 -0
- package/docs/assets/moni-bottom-sheet/positioning--static.png +0 -0
- package/docs/assets/moni-bottom-sheet/size--auto.png +0 -0
- package/docs/assets/moni-bottom-sheet/size--large.png +0 -0
- package/docs/assets/moni-bottom-sheet/size--medium.png +0 -0
- package/docs/assets/moni-bottom-sheet/size--small.png +0 -0
- package/docs/assets/moni-bottom-sheet/title--default.png +0 -0
- package/docs/assets/moni-button/active--false.png +0 -0
- package/docs/assets/moni-button/active--true.png +0 -0
- package/docs/assets/moni-button/disabled--false.png +0 -0
- package/docs/assets/moni-button/disabled--true.png +0 -0
- package/docs/assets/moni-button/href--default.png +0 -0
- package/docs/assets/moni-button/icon--default.png +0 -0
- package/docs/assets/moni-button/iconTrailing--default.png +0 -0
- package/docs/assets/moni-button/loading--false.png +0 -0
- package/docs/assets/moni-button/loading--true.png +0 -0
- package/docs/assets/moni-button/shape--bottom-round-flat.png +0 -0
- package/docs/assets/moni-button/shape--bottom-round.png +0 -0
- package/docs/assets/moni-button/shape--circle.png +0 -0
- package/docs/assets/moni-button/shape--inner-round.png +0 -0
- package/docs/assets/moni-button/shape--left-round-flat.png +0 -0
- package/docs/assets/moni-button/shape--left-round.png +0 -0
- package/docs/assets/moni-button/shape--no-round.png +0 -0
- package/docs/assets/moni-button/shape--right-round-flat.png +0 -0
- package/docs/assets/moni-button/shape--right-round.png +0 -0
- package/docs/assets/moni-button/shape--round.png +0 -0
- package/docs/assets/moni-button/shape--square.png +0 -0
- package/docs/assets/moni-button/shape--top-round-flat.png +0 -0
- package/docs/assets/moni-button/shape--top-round.png +0 -0
- package/docs/assets/moni-button/size--extra.png +0 -0
- package/docs/assets/moni-button/size--large.png +0 -0
- package/docs/assets/moni-button/size--medium.png +0 -0
- package/docs/assets/moni-button/size--small.png +0 -0
- package/docs/assets/moni-button/size--xlarge.png +0 -0
- package/docs/assets/moni-button/size--xsmall.png +0 -0
- package/docs/assets/moni-button/target--default.png +0 -0
- package/docs/assets/moni-button/type--button.png +0 -0
- package/docs/assets/moni-button/type--reset.png +0 -0
- package/docs/assets/moni-button/type--submit.png +0 -0
- package/docs/assets/moni-button/variant--elevated.png +0 -0
- package/docs/assets/moni-button/variant--error.png +0 -0
- package/docs/assets/moni-button/variant--fill.png +0 -0
- package/docs/assets/moni-button/variant--filled.png +0 -0
- package/docs/assets/moni-button/variant--outlined.png +0 -0
- package/docs/assets/moni-button/variant--text.png +0 -0
- package/docs/assets/moni-button/variant--tonal.png +0 -0
- package/docs/assets/moni-button-group/gap--default.png +0 -0
- package/docs/assets/moni-button-group/label--default.png +0 -0
- package/docs/assets/moni-button-group/labelledBy--default.png +0 -0
- package/docs/assets/moni-button-group/multi--false.png +0 -0
- package/docs/assets/moni-button-group/multi--true.png +0 -0
- package/docs/assets/moni-button-group/resizing--fixed.png +0 -0
- package/docs/assets/moni-button-group/resizing--flexible.png +0 -0
- package/docs/assets/moni-button-group/role--group.png +0 -0
- package/docs/assets/moni-button-group/role--radiogroup.png +0 -0
- package/docs/assets/moni-button-group/role--toolbar.png +0 -0
- package/docs/assets/moni-button-group/selectionRequired--false.png +0 -0
- package/docs/assets/moni-button-group/selectionRequired--true.png +0 -0
- package/docs/assets/moni-button-group/shape--round.png +0 -0
- package/docs/assets/moni-button-group/shape--square.png +0 -0
- package/docs/assets/moni-button-group/size--extra.png +0 -0
- package/docs/assets/moni-button-group/size--large.png +0 -0
- package/docs/assets/moni-button-group/size--medium.png +0 -0
- package/docs/assets/moni-button-group/size--small.png +0 -0
- package/docs/assets/moni-button-group/size--xlarge.png +0 -0
- package/docs/assets/moni-button-group/size--xsmall.png +0 -0
- package/docs/assets/moni-button-group/variant--connected.png +0 -0
- package/docs/assets/moni-button-group/variant--standard.png +0 -0
- package/docs/assets/moni-button-segment/checked--false.png +0 -0
- package/docs/assets/moni-button-segment/checked--true.png +0 -0
- package/docs/assets/moni-button-segment/disabled--false.png +0 -0
- package/docs/assets/moni-button-segment/disabled--true.png +0 -0
- package/docs/assets/moni-button-segment/hideCheck--false.png +0 -0
- package/docs/assets/moni-button-segment/hideCheck--true.png +0 -0
- package/docs/assets/moni-button-segment/position--first.png +0 -0
- package/docs/assets/moni-button-segment/position--last.png +0 -0
- package/docs/assets/moni-button-segment/position--middle.png +0 -0
- package/docs/assets/moni-button-segment/position--solo.png +0 -0
- package/docs/assets/moni-button-segment/size--extra.png +0 -0
- package/docs/assets/moni-button-segment/size--large.png +0 -0
- package/docs/assets/moni-button-segment/size--medium.png +0 -0
- package/docs/assets/moni-button-segment/size--small.png +0 -0
- package/docs/assets/moni-button-segment/size--xlarge.png +0 -0
- package/docs/assets/moni-button-segment/size--xsmall.png +0 -0
- package/docs/assets/moni-button-segment/value--default.png +0 -0
- package/docs/assets/moni-card/clickable--false.png +0 -0
- package/docs/assets/moni-card/clickable--true.png +0 -0
- package/docs/assets/moni-card/disabled--false.png +0 -0
- package/docs/assets/moni-card/disabled--true.png +0 -0
- package/docs/assets/moni-card/draggable--false.png +0 -0
- package/docs/assets/moni-card/draggable--true.png +0 -0
- package/docs/assets/moni-card/variant--elevated.png +0 -0
- package/docs/assets/moni-card/variant--filled.png +0 -0
- package/docs/assets/moni-card/variant--outlined.png +0 -0
- package/docs/assets/moni-carousel/auto--false.png +0 -0
- package/docs/assets/moni-carousel/auto--true.png +0 -0
- package/docs/assets/moni-carousel/autoplay--false.png +0 -0
- package/docs/assets/moni-carousel/autoplay--true.png +0 -0
- package/docs/assets/moni-carousel/autoplayInterval--default.png +0 -0
- package/docs/assets/moni-carousel/borderRadius--default.png +0 -0
- package/docs/assets/moni-carousel/gap--default.png +0 -0
- package/docs/assets/moni-carousel/headerText--default.png +0 -0
- package/docs/assets/moni-carousel/hideNav--false.png +0 -0
- package/docs/assets/moni-carousel/hideNav--true.png +0 -0
- package/docs/assets/moni-carousel/infinite--false.png +0 -0
- package/docs/assets/moni-carousel/infinite--true.png +0 -0
- package/docs/assets/moni-carousel/items--default.png +0 -0
- package/docs/assets/moni-carousel/largeWidth--default.png +0 -0
- package/docs/assets/moni-carousel/layout--hero.png +0 -0
- package/docs/assets/moni-carousel/layout--multi-browse.png +0 -0
- package/docs/assets/moni-carousel/layout--uncontained.png +0 -0
- package/docs/assets/moni-carousel/mediumWidth--default.png +0 -0
- package/docs/assets/moni-carousel/padding--default.png +0 -0
- package/docs/assets/moni-carousel/showAll--false.png +0 -0
- package/docs/assets/moni-carousel/showAll--true.png +0 -0
- package/docs/assets/moni-carousel/showAllText--default.png +0 -0
- package/docs/assets/moni-carousel/smallWidth--default.png +0 -0
- package/docs/assets/moni-checkbox/checked--false.png +0 -0
- package/docs/assets/moni-checkbox/checked--true.png +0 -0
- package/docs/assets/moni-checkbox/checkedIcon--default.png +0 -0
- package/docs/assets/moni-checkbox/disabled--false.png +0 -0
- package/docs/assets/moni-checkbox/disabled--true.png +0 -0
- package/docs/assets/moni-checkbox/label--default.png +0 -0
- package/docs/assets/moni-checkbox/name--default.png +0 -0
- package/docs/assets/moni-checkbox/size--extra.png +0 -0
- package/docs/assets/moni-checkbox/size--large.png +0 -0
- package/docs/assets/moni-checkbox/size--medium.png +0 -0
- package/docs/assets/moni-checkbox/size--small.png +0 -0
- package/docs/assets/moni-checkbox/uncheckedIcon--default.png +0 -0
- package/docs/assets/moni-checkbox/value--default.png +0 -0
- package/docs/assets/moni-chip/disabled--false.png +0 -0
- package/docs/assets/moni-chip/disabled--true.png +0 -0
- package/docs/assets/moni-chip/icon--default.png +0 -0
- package/docs/assets/moni-chip/loading--false.png +0 -0
- package/docs/assets/moni-chip/loading--true.png +0 -0
- package/docs/assets/moni-chip/removable--false.png +0 -0
- package/docs/assets/moni-chip/removable--true.png +0 -0
- package/docs/assets/moni-chip/selected--false.png +0 -0
- package/docs/assets/moni-chip/selected--true.png +0 -0
- package/docs/assets/moni-chip/shape--bottom-round.png +0 -0
- package/docs/assets/moni-chip/shape--circle.png +0 -0
- package/docs/assets/moni-chip/shape--left-round.png +0 -0
- package/docs/assets/moni-chip/shape--no-round.png +0 -0
- package/docs/assets/moni-chip/shape--right-round.png +0 -0
- package/docs/assets/moni-chip/shape--round.png +0 -0
- package/docs/assets/moni-chip/shape--square.png +0 -0
- package/docs/assets/moni-chip/shape--top-round.png +0 -0
- package/docs/assets/moni-chip/size--large.png +0 -0
- package/docs/assets/moni-chip/size--medium.png +0 -0
- package/docs/assets/moni-chip/size--small.png +0 -0
- package/docs/assets/moni-chip/variant--assist.png +0 -0
- package/docs/assets/moni-chip/variant--fill.png +0 -0
- package/docs/assets/moni-chip/variant--filter.png +0 -0
- package/docs/assets/moni-chip/variant--input.png +0 -0
- package/docs/assets/moni-chip/variant--outlined.png +0 -0
- package/docs/assets/moni-chip/variant--suggestion.png +0 -0
- package/docs/assets/moni-color-field/disabled--false.png +0 -0
- package/docs/assets/moni-color-field/disabled--true.png +0 -0
- package/docs/assets/moni-color-field/error--false.png +0 -0
- package/docs/assets/moni-color-field/error--true.png +0 -0
- package/docs/assets/moni-color-field/errorText--default.png +0 -0
- package/docs/assets/moni-color-field/helper--default.png +0 -0
- package/docs/assets/moni-color-field/label--default.png +0 -0
- package/docs/assets/moni-color-field/name--default.png +0 -0
- package/docs/assets/moni-color-field/shape--no-round.png +0 -0
- package/docs/assets/moni-color-field/shape--round.png +0 -0
- package/docs/assets/moni-color-field/shape--square.png +0 -0
- package/docs/assets/moni-color-field/size--extra.png +0 -0
- package/docs/assets/moni-color-field/size--large.png +0 -0
- package/docs/assets/moni-color-field/size--medium.png +0 -0
- package/docs/assets/moni-color-field/size--small.png +0 -0
- package/docs/assets/moni-color-field/value--default.png +0 -0
- package/docs/assets/moni-color-field/variant--filled.png +0 -0
- package/docs/assets/moni-color-field/variant--outlined.png +0 -0
- package/docs/assets/moni-context-menu/flip--false.png +0 -0
- package/docs/assets/moni-context-menu/flip--true.png +0 -0
- package/docs/assets/moni-context-menu/placement--bottom.png +0 -0
- package/docs/assets/moni-context-menu/placement--left.png +0 -0
- package/docs/assets/moni-context-menu/placement--right.png +0 -0
- package/docs/assets/moni-context-menu/placement--top.png +0 -0
- package/docs/assets/moni-dialog/modal--false.png +0 -0
- package/docs/assets/moni-dialog/modal--true.png +0 -0
- package/docs/assets/moni-dialog/open--false.png +0 -0
- package/docs/assets/moni-dialog/open--true.png +0 -0
- package/docs/assets/moni-dialog/side--bottom.png +0 -0
- package/docs/assets/moni-dialog/side--center.png +0 -0
- package/docs/assets/moni-dialog/side--left.png +0 -0
- package/docs/assets/moni-dialog/side--max.png +0 -0
- package/docs/assets/moni-dialog/side--right.png +0 -0
- package/docs/assets/moni-dialog/side--top.png +0 -0
- package/docs/assets/moni-dialog/size--large.png +0 -0
- package/docs/assets/moni-dialog/size--medium.png +0 -0
- package/docs/assets/moni-dialog/size--small.png +0 -0
- package/docs/assets/moni-dialog/title--default.png +0 -0
- package/docs/assets/moni-divider/inset--leading.png +0 -0
- package/docs/assets/moni-divider/inset--middle.png +0 -0
- package/docs/assets/moni-divider/inset--none.png +0 -0
- package/docs/assets/moni-expansion/open--false.png +0 -0
- package/docs/assets/moni-expansion/open--true.png +0 -0
- package/docs/assets/moni-expansion/title--default.png +0 -0
- package/docs/assets/moni-fab/accessibleLabel--default.png +0 -0
- package/docs/assets/moni-fab/color--default.png +0 -0
- package/docs/assets/moni-fab/disabled--false.png +0 -0
- package/docs/assets/moni-fab/disabled--true.png +0 -0
- package/docs/assets/moni-fab/expanded--false.png +0 -0
- package/docs/assets/moni-fab/expanded--true.png +0 -0
- package/docs/assets/moni-fab/extended--false.png +0 -0
- package/docs/assets/moni-fab/extended--true.png +0 -0
- package/docs/assets/moni-fab/icon--default.png +0 -0
- package/docs/assets/moni-fab/label--default.png +0 -0
- package/docs/assets/moni-fab/name--default.png +0 -0
- package/docs/assets/moni-fab/position--default.png +0 -0
- package/docs/assets/moni-fab/shape--circle.png +0 -0
- package/docs/assets/moni-fab/shape--rounded.png +0 -0
- package/docs/assets/moni-fab/size--default.png +0 -0
- package/docs/assets/moni-fab/type--button.png +0 -0
- package/docs/assets/moni-fab/type--reset.png +0 -0
- package/docs/assets/moni-fab/type--submit.png +0 -0
- package/docs/assets/moni-fab/value--default.png +0 -0
- package/docs/assets/moni-fab-menu/closeIcon--default.png +0 -0
- package/docs/assets/moni-fab-menu/closeLabel--default.png +0 -0
- package/docs/assets/moni-fab-menu/color--default.png +0 -0
- package/docs/assets/moni-fab-menu/direction--default.png +0 -0
- package/docs/assets/moni-fab-menu/disabled--false.png +0 -0
- package/docs/assets/moni-fab-menu/disabled--true.png +0 -0
- package/docs/assets/moni-fab-menu/icon--default.png +0 -0
- package/docs/assets/moni-fab-menu/label--default.png +0 -0
- package/docs/assets/moni-fab-menu/open--false.png +0 -0
- package/docs/assets/moni-fab-menu/open--true.png +0 -0
- package/docs/assets/moni-fab-menu/position--default.png +0 -0
- package/docs/assets/moni-fab-menu/shape--circle.png +0 -0
- package/docs/assets/moni-fab-menu/shape--rounded.png +0 -0
- package/docs/assets/moni-fab-menu/size--default.png +0 -0
- package/docs/assets/moni-file-field/accept--default.png +0 -0
- package/docs/assets/moni-file-field/buttonLabel--default.png +0 -0
- package/docs/assets/moni-file-field/disabled--false.png +0 -0
- package/docs/assets/moni-file-field/disabled--true.png +0 -0
- package/docs/assets/moni-file-field/error--false.png +0 -0
- package/docs/assets/moni-file-field/error--true.png +0 -0
- package/docs/assets/moni-file-field/errorText--default.png +0 -0
- package/docs/assets/moni-file-field/helper--default.png +0 -0
- package/docs/assets/moni-file-field/icon--default.png +0 -0
- package/docs/assets/moni-file-field/label--default.png +0 -0
- package/docs/assets/moni-file-field/multiple--false.png +0 -0
- package/docs/assets/moni-file-field/multiple--true.png +0 -0
- package/docs/assets/moni-file-field/name--default.png +0 -0
- package/docs/assets/moni-file-field/shape--no-round.png +0 -0
- package/docs/assets/moni-file-field/shape--round.png +0 -0
- package/docs/assets/moni-file-field/shape--square.png +0 -0
- package/docs/assets/moni-file-field/size--extra.png +0 -0
- package/docs/assets/moni-file-field/size--large.png +0 -0
- package/docs/assets/moni-file-field/size--medium.png +0 -0
- package/docs/assets/moni-file-field/size--small.png +0 -0
- package/docs/assets/moni-file-field/trailingIcon--default.png +0 -0
- package/docs/assets/moni-file-field/value--default.png +0 -0
- package/docs/assets/moni-file-field/variant--filled.png +0 -0
- package/docs/assets/moni-file-field/variant--outlined.png +0 -0
- package/docs/assets/moni-icon/filled--false.png +0 -0
- package/docs/assets/moni-icon/filled--true.png +0 -0
- package/docs/assets/moni-icon/name--default.png +0 -0
- package/docs/assets/moni-icon/size--extra.png +0 -0
- package/docs/assets/moni-icon/size--large.png +0 -0
- package/docs/assets/moni-icon/size--medium.png +0 -0
- package/docs/assets/moni-icon/size--small.png +0 -0
- package/docs/assets/moni-icon/size--tiny.png +0 -0
- package/docs/assets/moni-list/rounded--false.png +0 -0
- package/docs/assets/moni-list/rounded--true.png +0 -0
- package/docs/assets/moni-list/variant--border.png +0 -0
- package/docs/assets/moni-list/variant--empty.png +0 -0
- package/docs/assets/moni-list-item/active--false.png +0 -0
- package/docs/assets/moni-list-item/active--true.png +0 -0
- package/docs/assets/moni-list-item/avatar--default.png +0 -0
- package/docs/assets/moni-list-item/disabled--false.png +0 -0
- package/docs/assets/moni-list-item/disabled--true.png +0 -0
- package/docs/assets/moni-list-item/href--default.png +0 -0
- package/docs/assets/moni-list-item/icon--default.png +0 -0
- package/docs/assets/moni-list-item/lines--default.png +0 -0
- package/docs/assets/moni-list-item/trailingIcon--default.png +0 -0
- package/docs/assets/moni-loading-indicator/variant--contained.png +0 -0
- package/docs/assets/moni-loading-indicator/variant--uncontained.png +0 -0
- package/docs/assets/moni-menu/active--false.png +0 -0
- package/docs/assets/moni-menu/active--true.png +0 -0
- package/docs/assets/moni-menu/flip--false.png +0 -0
- package/docs/assets/moni-menu/flip--true.png +0 -0
- package/docs/assets/moni-menu/noWrap--false.png +0 -0
- package/docs/assets/moni-menu/noWrap--true.png +0 -0
- package/docs/assets/moni-menu/placement--bottom.png +0 -0
- package/docs/assets/moni-menu/placement--left.png +0 -0
- package/docs/assets/moni-menu/placement--max.png +0 -0
- package/docs/assets/moni-menu/placement--min.png +0 -0
- package/docs/assets/moni-menu/placement--right.png +0 -0
- package/docs/assets/moni-menu/placement--top.png +0 -0
- package/docs/assets/moni-menu/space--extra-space.png +0 -0
- package/docs/assets/moni-menu/space--large-space.png +0 -0
- package/docs/assets/moni-menu/space--medium-space.png +0 -0
- package/docs/assets/moni-menu/space--no-space.png +0 -0
- package/docs/assets/moni-menu/space--small-space.png +0 -0
- package/docs/assets/moni-menu/space--space.png +0 -0
- package/docs/assets/moni-menu-item/active--false.png +0 -0
- package/docs/assets/moni-menu-item/active--true.png +0 -0
- package/docs/assets/moni-menu-item/disabled--false.png +0 -0
- package/docs/assets/moni-menu-item/disabled--true.png +0 -0
- package/docs/assets/moni-menu-item/icon--default.png +0 -0
- package/docs/assets/moni-menu-item/label--default.png +0 -0
- package/docs/assets/moni-morph-modal/autoSize--false.png +0 -0
- package/docs/assets/moni-morph-modal/autoSize--true.png +0 -0
- package/docs/assets/moni-morph-modal/blurContent--false.png +0 -0
- package/docs/assets/moni-morph-modal/blurContent--true.png +0 -0
- package/docs/assets/moni-morph-modal/closeOnClickOutside--false.png +0 -0
- package/docs/assets/moni-morph-modal/closeOnClickOutside--true.png +0 -0
- package/docs/assets/moni-morph-modal/closeOnEsc--false.png +0 -0
- package/docs/assets/moni-morph-modal/closeOnEsc--true.png +0 -0
- package/docs/assets/moni-morph-modal/coverTarget--false.png +0 -0
- package/docs/assets/moni-morph-modal/coverTarget--true.png +0 -0
- package/docs/assets/moni-morph-modal/debug--false.png +0 -0
- package/docs/assets/moni-morph-modal/debug--true.png +0 -0
- package/docs/assets/moni-morph-modal/expandedHeight--default.png +0 -0
- package/docs/assets/moni-morph-modal/expandedWidth--default.png +0 -0
- package/docs/assets/moni-morph-modal/hasBackdrop--false.png +0 -0
- package/docs/assets/moni-morph-modal/hasBackdrop--true.png +0 -0
- package/docs/assets/moni-morph-modal/hideTarget--false.png +0 -0
- package/docs/assets/moni-morph-modal/hideTarget--true.png +0 -0
- package/docs/assets/moni-morph-modal/modal--false.png +0 -0
- package/docs/assets/moni-morph-modal/modal--true.png +0 -0
- package/docs/assets/moni-morph-modal/morphLabel--false.png +0 -0
- package/docs/assets/moni-morph-modal/morphLabel--true.png +0 -0
- package/docs/assets/moni-morph-modal/morphLabelSelector--default.png +0 -0
- package/docs/assets/moni-morph-modal/open--false.png +0 -0
- package/docs/assets/moni-morph-modal/open--true.png +0 -0
- package/docs/assets/moni-morph-modal/placement--default.png +0 -0
- package/docs/assets/moni-morph-modal/showCloseButton--false.png +0 -0
- package/docs/assets/moni-morph-modal/showCloseButton--true.png +0 -0
- package/docs/assets/moni-morph-modal/target--default.png +0 -0
- package/docs/assets/moni-nav/layout--auto.png +0 -0
- package/docs/assets/moni-nav/layout--horizontal.png +0 -0
- package/docs/assets/moni-nav/layout--vertical.png +0 -0
- package/docs/assets/moni-nav/modal--false.png +0 -0
- package/docs/assets/moni-nav/modal--true.png +0 -0
- package/docs/assets/moni-nav/open--false.png +0 -0
- package/docs/assets/moni-nav/open--true.png +0 -0
- package/docs/assets/moni-nav/placement--bottom.png +0 -0
- package/docs/assets/moni-nav/placement--left.png +0 -0
- package/docs/assets/moni-nav/placement--right.png +0 -0
- package/docs/assets/moni-nav/placement--top.png +0 -0
- package/docs/assets/moni-nav/variant--drawer.png +0 -0
- package/docs/assets/moni-nav/variant--rail.png +0 -0
- package/docs/assets/moni-nav-item/active--false.png +0 -0
- package/docs/assets/moni-nav-item/active--true.png +0 -0
- package/docs/assets/moni-nav-item/href--default.png +0 -0
- package/docs/assets/moni-nav-item/icon--default.png +0 -0
- package/docs/assets/moni-nav-item/label--default.png +0 -0
- package/docs/assets/moni-nav-item/layout--default.png +0 -0
- package/docs/assets/moni-nav-item/placement--default.png +0 -0
- package/docs/assets/moni-nav-item/target--default.png +0 -0
- package/docs/assets/moni-nav-item/variant--default.png +0 -0
- package/docs/assets/moni-progress/bufferValue--default.png +0 -0
- package/docs/assets/moni-progress/indeterminate--false.png +0 -0
- package/docs/assets/moni-progress/indeterminate--true.png +0 -0
- package/docs/assets/moni-progress/label--default.png +0 -0
- package/docs/assets/moni-progress/max--default.png +0 -0
- package/docs/assets/moni-progress/mode--default.png +0 -0
- package/docs/assets/moni-progress/size--default.png +0 -0
- package/docs/assets/moni-progress/stopIndicator--false.png +0 -0
- package/docs/assets/moni-progress/stopIndicator--true.png +0 -0
- package/docs/assets/moni-progress/value--default.png +0 -0
- package/docs/assets/moni-progress/variant--default.png +0 -0
- package/docs/assets/moni-progress/waveTransition--false.png +0 -0
- package/docs/assets/moni-progress/waveTransition--true.png +0 -0
- package/docs/assets/moni-radio/checked--false.png +0 -0
- package/docs/assets/moni-radio/checked--true.png +0 -0
- package/docs/assets/moni-radio/checkedIcon--default.png +0 -0
- package/docs/assets/moni-radio/disabled--false.png +0 -0
- package/docs/assets/moni-radio/disabled--true.png +0 -0
- package/docs/assets/moni-radio/iconContainer--circle.png +0 -0
- package/docs/assets/moni-radio/iconContainer--none.png +0 -0
- package/docs/assets/moni-radio/label--default.png +0 -0
- package/docs/assets/moni-radio/name--default.png +0 -0
- package/docs/assets/moni-radio/size--extra.png +0 -0
- package/docs/assets/moni-radio/size--large.png +0 -0
- package/docs/assets/moni-radio/size--medium.png +0 -0
- package/docs/assets/moni-radio/size--small.png +0 -0
- package/docs/assets/moni-radio/uncheckedIcon--default.png +0 -0
- package/docs/assets/moni-radio/value--default.png +0 -0
- package/docs/assets/moni-ripple/active--false.png +0 -0
- package/docs/assets/moni-ripple/active--true.png +0 -0
- package/docs/assets/moni-ripple/color--primary.png +0 -0
- package/docs/assets/moni-ripple/color--secondary.png +0 -0
- package/docs/assets/moni-ripple/color--surface.png +0 -0
- package/docs/assets/moni-ripple/speed--fast.png +0 -0
- package/docs/assets/moni-ripple/speed--normal.png +0 -0
- package/docs/assets/moni-ripple/speed--slow.png +0 -0
- package/docs/assets/moni-ripple/x--default.png +0 -0
- package/docs/assets/moni-ripple/y--default.png +0 -0
- package/docs/assets/moni-segmented-button/gap--default.png +0 -0
- package/docs/assets/moni-segmented-button/hideCheck--false.png +0 -0
- package/docs/assets/moni-segmented-button/hideCheck--true.png +0 -0
- package/docs/assets/moni-segmented-button/multi--false.png +0 -0
- package/docs/assets/moni-segmented-button/multi--true.png +0 -0
- package/docs/assets/moni-segmented-button/name--default.png +0 -0
- package/docs/assets/moni-segmented-button/size--extra.png +0 -0
- package/docs/assets/moni-segmented-button/size--large.png +0 -0
- package/docs/assets/moni-segmented-button/size--medium.png +0 -0
- package/docs/assets/moni-segmented-button/size--small.png +0 -0
- package/docs/assets/moni-segmented-button/size--xlarge.png +0 -0
- package/docs/assets/moni-segmented-button/size--xsmall.png +0 -0
- package/docs/assets/moni-select/clearable--false.png +0 -0
- package/docs/assets/moni-select/clearable--true.png +0 -0
- package/docs/assets/moni-select/disabled--false.png +0 -0
- package/docs/assets/moni-select/disabled--true.png +0 -0
- package/docs/assets/moni-select/dropdownMaxHeight--default.png +0 -0
- package/docs/assets/moni-select/dropdownWidth--default.png +0 -0
- package/docs/assets/moni-select/error--false.png +0 -0
- package/docs/assets/moni-select/error--true.png +0 -0
- package/docs/assets/moni-select/errorText--default.png +0 -0
- package/docs/assets/moni-select/helper--default.png +0 -0
- package/docs/assets/moni-select/icon--default.png +0 -0
- package/docs/assets/moni-select/label--default.png +0 -0
- package/docs/assets/moni-select/loading--false.png +0 -0
- package/docs/assets/moni-select/loading--true.png +0 -0
- package/docs/assets/moni-select/name--default.png +0 -0
- package/docs/assets/moni-select/placeholder--default.png +0 -0
- package/docs/assets/moni-select/placement--auto.png +0 -0
- package/docs/assets/moni-select/placement--bottom.png +0 -0
- package/docs/assets/moni-select/placement--left.png +0 -0
- package/docs/assets/moni-select/placement--right.png +0 -0
- package/docs/assets/moni-select/placement--top.png +0 -0
- package/docs/assets/moni-select/positioning--absolute.png +0 -0
- package/docs/assets/moni-select/positioning--body.png +0 -0
- package/docs/assets/moni-select/positioning--fixed.png +0 -0
- package/docs/assets/moni-select/searchable--false.png +0 -0
- package/docs/assets/moni-select/searchable--true.png +0 -0
- package/docs/assets/moni-select/shape--no-round.png +0 -0
- package/docs/assets/moni-select/shape--round.png +0 -0
- package/docs/assets/moni-select/shape--square.png +0 -0
- package/docs/assets/moni-select/sheet--false.png +0 -0
- package/docs/assets/moni-select/sheet--true.png +0 -0
- package/docs/assets/moni-select/size--extra.png +0 -0
- package/docs/assets/moni-select/size--large.png +0 -0
- package/docs/assets/moni-select/size--medium.png +0 -0
- package/docs/assets/moni-select/size--small.png +0 -0
- package/docs/assets/moni-select/trailingIcon--default.png +0 -0
- package/docs/assets/moni-select/value--default.png +0 -0
- package/docs/assets/moni-select/variant--filled.png +0 -0
- package/docs/assets/moni-select/variant--outlined.png +0 -0
- package/docs/assets/moni-select-option/disabled--false.png +0 -0
- package/docs/assets/moni-select-option/disabled--true.png +0 -0
- package/docs/assets/moni-select-option/group--default.png +0 -0
- package/docs/assets/moni-select-option/label--default.png +0 -0
- package/docs/assets/moni-select-option/selected--false.png +0 -0
- package/docs/assets/moni-select-option/selected--true.png +0 -0
- package/docs/assets/moni-select-option/value--default.png +0 -0
- package/docs/assets/moni-shape/border--false.png +0 -0
- package/docs/assets/moni-shape/border--true.png +0 -0
- package/docs/assets/moni-shape/color--primary.png +0 -0
- package/docs/assets/moni-shape/color--secondary.png +0 -0
- package/docs/assets/moni-shape/color--surface.png +0 -0
- package/docs/assets/moni-shape/color--tertiary.png +0 -0
- package/docs/assets/moni-shape/duration--default.png +0 -0
- package/docs/assets/moni-shape/easing--default.png +0 -0
- package/docs/assets/moni-shape/name--empty.png +0 -0
- package/docs/assets/moni-shape/shadow--false.png +0 -0
- package/docs/assets/moni-shape/shadow--true.png +0 -0
- package/docs/assets/moni-shape/shapeRadius--default.png +0 -0
- package/docs/assets/moni-shape/size--extra.png +0 -0
- package/docs/assets/moni-shape/size--large.png +0 -0
- package/docs/assets/moni-shape/size--medium.png +0 -0
- package/docs/assets/moni-shape/size--small.png +0 -0
- package/docs/assets/moni-shape/type--default.png +0 -0
- package/docs/assets/moni-side-sheet/detached--false.png +0 -0
- package/docs/assets/moni-side-sheet/detached--true.png +0 -0
- package/docs/assets/moni-side-sheet/expandedWidth--default.png +0 -0
- package/docs/assets/moni-side-sheet/hideClose--false.png +0 -0
- package/docs/assets/moni-side-sheet/hideClose--true.png +0 -0
- package/docs/assets/moni-side-sheet/maxWidth--default.png +0 -0
- package/docs/assets/moni-side-sheet/modal--false.png +0 -0
- package/docs/assets/moni-side-sheet/modal--true.png +0 -0
- package/docs/assets/moni-side-sheet/noBorder--false.png +0 -0
- package/docs/assets/moni-side-sheet/noBorder--true.png +0 -0
- package/docs/assets/moni-side-sheet/open--false.png +0 -0
- package/docs/assets/moni-side-sheet/open--true.png +0 -0
- package/docs/assets/moni-side-sheet/showBack--false.png +0 -0
- package/docs/assets/moni-side-sheet/showBack--true.png +0 -0
- package/docs/assets/moni-side-sheet/side--left.png +0 -0
- package/docs/assets/moni-side-sheet/side--right.png +0 -0
- package/docs/assets/moni-side-sheet/title--default.png +0 -0
- package/docs/assets/moni-side-sheet/withHandle--false.png +0 -0
- package/docs/assets/moni-side-sheet/withHandle--true.png +0 -0
- package/docs/assets/moni-slider/disabled--false.png +0 -0
- package/docs/assets/moni-slider/disabled--true.png +0 -0
- package/docs/assets/moni-slider/indicator--false.png +0 -0
- package/docs/assets/moni-slider/indicator--true.png +0 -0
- package/docs/assets/moni-slider/indicatorPlacement--bottom.png +0 -0
- package/docs/assets/moni-slider/indicatorPlacement--top.png +0 -0
- package/docs/assets/moni-slider/insetIcon--default.png +0 -0
- package/docs/assets/moni-slider/isVertical--false.png +0 -0
- package/docs/assets/moni-slider/isVertical--true.png +0 -0
- package/docs/assets/moni-slider/max--default.png +0 -0
- package/docs/assets/moni-slider/min--default.png +0 -0
- package/docs/assets/moni-slider/name--default.png +0 -0
- package/docs/assets/moni-slider/range--false.png +0 -0
- package/docs/assets/moni-slider/range--true.png +0 -0
- package/docs/assets/moni-slider/size--extra.png +0 -0
- package/docs/assets/moni-slider/size--large.png +0 -0
- package/docs/assets/moni-slider/size--medium.png +0 -0
- package/docs/assets/moni-slider/size--small.png +0 -0
- package/docs/assets/moni-slider/size--tiny.png +0 -0
- package/docs/assets/moni-slider/step--default.png +0 -0
- package/docs/assets/moni-slider/tickInterval--default.png +0 -0
- package/docs/assets/moni-slider/ticks--false.png +0 -0
- package/docs/assets/moni-slider/ticks--true.png +0 -0
- package/docs/assets/moni-snackbar/action--default.png +0 -0
- package/docs/assets/moni-snackbar/active--false.png +0 -0
- package/docs/assets/moni-snackbar/active--true.png +0 -0
- package/docs/assets/moni-snackbar/maxLines--default.png +0 -0
- package/docs/assets/moni-snackbar/placement--bottom.png +0 -0
- package/docs/assets/moni-snackbar/placement--top.png +0 -0
- package/docs/assets/moni-snackbar/text--default.png +0 -0
- package/docs/assets/moni-split-button/gap--default.png +0 -0
- package/docs/assets/moni-split-button/size--extra.png +0 -0
- package/docs/assets/moni-split-button/size--large.png +0 -0
- package/docs/assets/moni-split-button/size--medium.png +0 -0
- package/docs/assets/moni-split-button/size--small.png +0 -0
- package/docs/assets/moni-split-button/size--xlarge.png +0 -0
- package/docs/assets/moni-split-button/size--xsmall.png +0 -0
- package/docs/assets/moni-split-button/variant--elevated.png +0 -0
- package/docs/assets/moni-split-button/variant--filled.png +0 -0
- package/docs/assets/moni-split-button/variant--outlined.png +0 -0
- package/docs/assets/moni-split-button/variant--tonal.png +0 -0
- package/docs/assets/moni-step/active--false.png +0 -0
- package/docs/assets/moni-step/active--true.png +0 -0
- package/docs/assets/moni-step/completed--false.png +0 -0
- package/docs/assets/moni-step/completed--true.png +0 -0
- package/docs/assets/moni-step/description--default.png +0 -0
- package/docs/assets/moni-step/icon--default.png +0 -0
- package/docs/assets/moni-step/index--default.png +0 -0
- package/docs/assets/moni-step/orientation--horizontal.png +0 -0
- package/docs/assets/moni-step/orientation--vertical.png +0 -0
- package/docs/assets/moni-step/title--default.png +0 -0
- package/docs/assets/moni-stepper/current--default.png +0 -0
- package/docs/assets/moni-stepper/orientation--horizontal.png +0 -0
- package/docs/assets/moni-stepper/orientation--vertical.png +0 -0
- package/docs/assets/moni-switch/checked--false.png +0 -0
- package/docs/assets/moni-switch/checked--true.png +0 -0
- package/docs/assets/moni-switch/checkedIcon--default.png +0 -0
- package/docs/assets/moni-switch/disabled--false.png +0 -0
- package/docs/assets/moni-switch/disabled--true.png +0 -0
- package/docs/assets/moni-switch/icon--false.png +0 -0
- package/docs/assets/moni-switch/icon--true.png +0 -0
- package/docs/assets/moni-switch/label--default.png +0 -0
- package/docs/assets/moni-switch/name--default.png +0 -0
- package/docs/assets/moni-switch/uncheckedIcon--default.png +0 -0
- package/docs/assets/moni-switch/value--default.png +0 -0
- package/docs/assets/moni-tab/active--false.png +0 -0
- package/docs/assets/moni-tab/active--true.png +0 -0
- package/docs/assets/moni-tab/href--default.png +0 -0
- package/docs/assets/moni-tab/icon--default.png +0 -0
- package/docs/assets/moni-tab/label--default.png +0 -0
- package/docs/assets/moni-tabs/align--center.png +0 -0
- package/docs/assets/moni-tabs/align--default.png +0 -0
- package/docs/assets/moni-tabs/align--left.png +0 -0
- package/docs/assets/moni-tabs/align--right.png +0 -0
- package/docs/assets/moni-tabs/indicatorSize--default.png +0 -0
- package/docs/assets/moni-tabs/indicatorSize--max.png +0 -0
- package/docs/assets/moni-tabs/indicatorSize--min.png +0 -0
- package/docs/assets/moni-tabs/mode--primary.png +0 -0
- package/docs/assets/moni-tabs/mode--secondary.png +0 -0
- package/docs/assets/moni-tabs/scrollable--false.png +0 -0
- package/docs/assets/moni-tabs/scrollable--true.png +0 -0
- package/docs/assets/moni-tabs/vertical--false.png +0 -0
- package/docs/assets/moni-tabs/vertical--true.png +0 -0
- package/docs/assets/moni-text-field/disabled--false.png +0 -0
- package/docs/assets/moni-text-field/disabled--true.png +0 -0
- package/docs/assets/moni-text-field/error--false.png +0 -0
- package/docs/assets/moni-text-field/error--true.png +0 -0
- package/docs/assets/moni-text-field/errorText--default.png +0 -0
- package/docs/assets/moni-text-field/helper--default.png +0 -0
- package/docs/assets/moni-text-field/icon--default.png +0 -0
- package/docs/assets/moni-text-field/label--default.png +0 -0
- package/docs/assets/moni-text-field/loading--false.png +0 -0
- package/docs/assets/moni-text-field/loading--true.png +0 -0
- package/docs/assets/moni-text-field/mask--default.png +0 -0
- package/docs/assets/moni-text-field/maskAlias--default.png +0 -0
- package/docs/assets/moni-text-field/maskOptions--default.png +0 -0
- package/docs/assets/moni-text-field/name--default.png +0 -0
- package/docs/assets/moni-text-field/placeholder--default.png +0 -0
- package/docs/assets/moni-text-field/prefix--default.png +0 -0
- package/docs/assets/moni-text-field/shape--no-round.png +0 -0
- package/docs/assets/moni-text-field/shape--round.png +0 -0
- package/docs/assets/moni-text-field/size--extra.png +0 -0
- package/docs/assets/moni-text-field/size--large.png +0 -0
- package/docs/assets/moni-text-field/size--medium.png +0 -0
- package/docs/assets/moni-text-field/size--small.png +0 -0
- package/docs/assets/moni-text-field/suffix--default.png +0 -0
- package/docs/assets/moni-text-field/suffixButtonIcon--default.png +0 -0
- package/docs/assets/moni-text-field/suffixButtonLabel--default.png +0 -0
- package/docs/assets/moni-text-field/trailingIcon--default.png +0 -0
- package/docs/assets/moni-text-field/type--email.png +0 -0
- package/docs/assets/moni-text-field/type--number.png +0 -0
- package/docs/assets/moni-text-field/type--password.png +0 -0
- package/docs/assets/moni-text-field/type--search.png +0 -0
- package/docs/assets/moni-text-field/type--tel.png +0 -0
- package/docs/assets/moni-text-field/type--text.png +0 -0
- package/docs/assets/moni-text-field/type--url.png +0 -0
- package/docs/assets/moni-text-field/value--default.png +0 -0
- package/docs/assets/moni-text-field/variant--filled.png +0 -0
- package/docs/assets/moni-text-field/variant--outlined.png +0 -0
- package/docs/assets/moni-text-field/variant--underlined.png +0 -0
- package/docs/assets/moni-textarea/autosize--false.png +0 -0
- package/docs/assets/moni-textarea/autosize--true.png +0 -0
- package/docs/assets/moni-textarea/disabled--false.png +0 -0
- package/docs/assets/moni-textarea/disabled--true.png +0 -0
- package/docs/assets/moni-textarea/error--false.png +0 -0
- package/docs/assets/moni-textarea/error--true.png +0 -0
- package/docs/assets/moni-textarea/errorText--default.png +0 -0
- package/docs/assets/moni-textarea/helper--default.png +0 -0
- package/docs/assets/moni-textarea/icon--default.png +0 -0
- package/docs/assets/moni-textarea/label--default.png +0 -0
- package/docs/assets/moni-textarea/loading--false.png +0 -0
- package/docs/assets/moni-textarea/loading--true.png +0 -0
- package/docs/assets/moni-textarea/maxRows--default.png +0 -0
- package/docs/assets/moni-textarea/maxlength--default.png +0 -0
- package/docs/assets/moni-textarea/name--default.png +0 -0
- package/docs/assets/moni-textarea/noCounter--false.png +0 -0
- package/docs/assets/moni-textarea/noCounter--true.png +0 -0
- package/docs/assets/moni-textarea/placeholder--default.png +0 -0
- package/docs/assets/moni-textarea/prefix--default.png +0 -0
- package/docs/assets/moni-textarea/rows--default.png +0 -0
- package/docs/assets/moni-textarea/shape--no-round.png +0 -0
- package/docs/assets/moni-textarea/shape--round.png +0 -0
- package/docs/assets/moni-textarea/shape--square.png +0 -0
- package/docs/assets/moni-textarea/size--extra.png +0 -0
- package/docs/assets/moni-textarea/size--large.png +0 -0
- package/docs/assets/moni-textarea/size--medium.png +0 -0
- package/docs/assets/moni-textarea/size--small.png +0 -0
- package/docs/assets/moni-textarea/suffix--default.png +0 -0
- package/docs/assets/moni-textarea/trailingIcon--default.png +0 -0
- package/docs/assets/moni-textarea/value--default.png +0 -0
- package/docs/assets/moni-textarea/variant--filled.png +0 -0
- package/docs/assets/moni-textarea/variant--outlined.png +0 -0
- package/docs/assets/moni-time-picker/hideHeadline--false.png +0 -0
- package/docs/assets/moni-time-picker/hideHeadline--true.png +0 -0
- package/docs/assets/moni-time-picker/hideModeToggle--false.png +0 -0
- package/docs/assets/moni-time-picker/hideModeToggle--true.png +0 -0
- package/docs/assets/moni-time-picker/hourLabel--default.png +0 -0
- package/docs/assets/moni-time-picker/minuteLabel--default.png +0 -0
- package/docs/assets/moni-time-picker/mode--dial.png +0 -0
- package/docs/assets/moni-time-picker/mode--input.png +0 -0
- package/docs/assets/moni-time-picker/orientation--auto.png +0 -0
- package/docs/assets/moni-time-picker/orientation--horizontal.png +0 -0
- package/docs/assets/moni-time-picker/orientation--vertical.png +0 -0
- package/docs/assets/moni-time-picker/use24Hour--false.png +0 -0
- package/docs/assets/moni-time-picker/use24Hour--true.png +0 -0
- package/docs/assets/moni-time-picker/value--default.png +0 -0
- package/docs/assets/moni-toolbar/scrolled--false.png +0 -0
- package/docs/assets/moni-toolbar/scrolled--true.png +0 -0
- package/docs/assets/moni-toolbar/title--default.png +0 -0
- package/docs/assets/moni-toolbar/type--floating.png +0 -0
- package/docs/assets/moni-toolbar/type--standard.png +0 -0
- package/docs/assets/moni-tooltip/position--bottom-end.png +0 -0
- package/docs/assets/moni-tooltip/position--bottom-start.png +0 -0
- package/docs/assets/moni-tooltip/position--bottom.png +0 -0
- package/docs/assets/moni-tooltip/position--left.png +0 -0
- package/docs/assets/moni-tooltip/position--right.png +0 -0
- package/docs/assets/moni-tooltip/position--top-end.png +0 -0
- package/docs/assets/moni-tooltip/position--top-start.png +0 -0
- package/docs/assets/moni-tooltip/position--top.png +0 -0
- package/docs/assets/moni-tooltip/rich--false.png +0 -0
- package/docs/assets/moni-tooltip/rich--true.png +0 -0
- package/docs/assets/moni-tooltip/rotateWithTarget--false.png +0 -0
- package/docs/assets/moni-tooltip/rotateWithTarget--true.png +0 -0
- package/docs/assets/moni-tooltip/size--empty.png +0 -0
- package/docs/assets/moni-tooltip/size--large.png +0 -0
- package/docs/assets/moni-tooltip/size--medium.png +0 -0
- package/docs/assets/moni-tooltip/size--small.png +0 -0
- package/docs/assets/moni-tooltip/text--default.png +0 -0
- package/docs/assets/moni-typography/as--default.png +0 -0
- package/docs/assets/moni-typography/size--large.png +0 -0
- package/docs/assets/moni-typography/size--medium.png +0 -0
- package/docs/assets/moni-typography/size--small.png +0 -0
- package/docs/assets/moni-typography/text--default.png +0 -0
- package/docs/assets/moni-typography/variant--body.png +0 -0
- package/docs/assets/moni-typography/variant--display.png +0 -0
- package/docs/assets/moni-typography/variant--headline.png +0 -0
- package/docs/assets/moni-typography/variant--label.png +0 -0
- package/docs/assets/moni-typography/variant--title.png +0 -0
- package/docs/components/app-bar.md +192 -0
- package/docs/components/badge.md +207 -0
- package/docs/components/bottom-sheet.md +222 -0
- package/docs/components/button-group.md +207 -0
- package/docs/components/button-segment.md +171 -0
- package/docs/components/button.md +283 -0
- package/docs/components/card.md +181 -0
- package/docs/components/carousel.md +275 -0
- package/docs/components/checkbox.md +196 -0
- package/docs/components/chip.md +222 -0
- package/docs/components/color-field.md +195 -0
- package/docs/components/context-menu.md +132 -0
- package/docs/components/dialog.md +195 -0
- package/docs/components/divider.md +123 -0
- package/docs/components/expansion.md +130 -0
- package/docs/components/fab-menu.md +162 -0
- package/docs/components/fab.md +202 -0
- package/docs/components/file-field.md +244 -0
- package/docs/components/icon.md +156 -0
- package/docs/components/list-item.md +189 -0
- package/docs/components/list.md +121 -0
- package/docs/components/loading-indicator.md +124 -0
- package/docs/components/menu-item.md +131 -0
- package/docs/components/menu.md +183 -0
- package/docs/components/morph-modal.md +254 -0
- package/docs/components/nav-item.md +175 -0
- package/docs/components/nav.md +172 -0
- package/docs/components/progress.md +172 -0
- package/docs/components/radio.md +200 -0
- package/docs/components/ripple.md +177 -0
- package/docs/components/segmented-button.md +145 -0
- package/docs/components/select-option.md +148 -0
- package/docs/components/select.md +332 -0
- package/docs/components/shape.md +169 -0
- package/docs/components/side-sheet.md +220 -0
- package/docs/components/slider.md +240 -0
- package/docs/components/snackbar.md +169 -0
- package/docs/components/split-button.md +148 -0
- package/docs/components/step.md +169 -0
- package/docs/components/stepper.md +121 -0
- package/docs/components/switch.md +198 -0
- package/docs/components/tab.md +133 -0
- package/docs/components/tabs.md +163 -0
- package/docs/components/text-field.md +321 -0
- package/docs/components/textarea.md +290 -0
- package/docs/components/time-picker.md +184 -0
- package/docs/components/toolbar.md +142 -0
- package/docs/components/tooltip.md +184 -0
- package/docs/components/typography.md +148 -0
- package/docs/llms.txt +53 -0
- package/package.json +6 -1
- package/src/components/index.test.ts +24 -0
- package/src/components/index.ts +8 -1
- package/src/components/moni-button-group.test.ts +15 -1
- package/src/components/moni-button-group.ts +19 -4
- package/src/components/moni-button.test.ts +8 -2
- package/src/components/moni-button.ts +2 -2
- package/src/components/moni-carousel.test.ts +15 -1
- package/src/components/moni-carousel.ts +19 -2
- package/src/components/moni-context-menu.test.ts +16 -0
- package/src/components/moni-context-menu.ts +14 -2
- package/src/components/moni-file-field.test.ts +4 -2
- package/src/components/moni-file-field.ts +6 -3
- package/src/components/moni-morph-modal.test.ts +173 -2
- package/src/components/moni-morph-modal.ts +621 -54
- package/src/components/moni-side-sheet.test.ts +39 -2
- package/src/components/moni-side-sheet.ts +49 -17
- package/src/components/moni-snackbar.test.ts +16 -0
- package/src/components/moni-snackbar.ts +24 -1
- package/src/components/moni-toolbar.test.ts +6 -3
- package/src/components/moni-toolbar.ts +4 -2
- package/src/components/moni-tooltip.test.ts +77 -3
- package/src/components/moni-tooltip.ts +194 -3
- 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
|
/**
|
|
@@ -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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
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
|
-
|
|
1063
|
-
el.style.
|
|
1064
|
-
el.style.
|
|
1065
|
-
el.style.
|
|
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
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
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`;
|