@moni-labs/moni-ui 0.4.4 → 0.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/custom-elements.json +4670 -16030
- package/dist/browser/moni-ui.iife.min.js +848 -117
- 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 +3138 -1813
- 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-color-field.js +9 -6
- 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-nav.js +5 -5
- package/dist/cdn/components/moni-select.js +2 -0
- package/dist/cdn/components/moni-side-sheet.js +18 -6
- package/dist/cdn/components/moni-snackbar.js +15 -2
- package/dist/cdn/components/moni-stepper.js +1 -1
- package/dist/cdn/components/moni-text-field.js +2 -0
- package/dist/cdn/components/moni-textarea.js +2 -0
- 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-color-field.d.ts +19 -0
- package/dist/components/moni-color-field.d.ts.map +1 -1
- package/dist/components/moni-color-field.js +43 -2
- 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 +574 -52
- package/dist/components/moni-nav.d.ts.map +1 -1
- package/dist/components/moni-nav.js +4 -3
- package/dist/components/moni-select-option.d.ts.map +1 -1
- package/dist/components/moni-select-option.js +19 -0
- package/dist/components/moni-select.d.ts.map +1 -1
- package/dist/components/moni-select.js +2 -0
- 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-stepper.d.ts.map +1 -1
- package/dist/components/moni-stepper.js +4 -0
- package/dist/components/moni-text-field.d.ts.map +1 -1
- package/dist/components/moni-text-field.js +2 -0
- package/dist/components/moni-textarea.d.ts.map +1 -1
- package/dist/components/moni-textarea.js +2 -0
- 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--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/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--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--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/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/modal--false.png +0 -0
- package/docs/assets/moni-morph-modal/modal--true.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-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/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--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--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 +220 -0
- package/docs/components/button-group.md +207 -0
- package/docs/components/button-segment.md +171 -0
- package/docs/components/button.md +277 -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 +193 -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 +181 -0
- package/docs/components/morph-modal.md +183 -0
- package/docs/components/nav-item.md +169 -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 +218 -0
- package/docs/components/slider.md +240 -0
- package/docs/components/snackbar.md +167 -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-color-field.test.ts +71 -0
- package/src/components/moni-color-field.ts +50 -1
- 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 +622 -55
- package/src/components/moni-nav.ts +6 -3
- package/src/components/moni-select-option.ts +19 -0
- package/src/components/moni-select.test.ts +16 -0
- package/src/components/moni-select.ts +2 -0
- 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-stepper.ts +4 -0
- package/src/components/moni-text-field.test.ts +25 -0
- package/src/components/moni-text-field.ts +2 -0
- package/src/components/moni-textarea.test.ts +16 -0
- package/src/components/moni-textarea.ts +2 -0
- 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
|
/**
|
|
@@ -108,7 +109,7 @@ interface MorphElements {
|
|
|
108
109
|
*
|
|
109
110
|
* @slot default - El contenido del cuerpo principal del modal.
|
|
110
111
|
* @slot header - Contenido de encabezado personalizado (sobrescribe el atributo `title`).
|
|
111
|
-
* @slot
|
|
112
|
+
* @slot footer - Botones de acción mostrados en la parte inferior derecha.
|
|
112
113
|
*/
|
|
113
114
|
|
|
114
115
|
const litBool = {
|
|
@@ -235,6 +236,10 @@ export class MoniMorphModal extends MoniElement {
|
|
|
235
236
|
@property({ type: Boolean, reflect: true, attribute: 'blur-content', converter: litBool })
|
|
236
237
|
blurContent = false;
|
|
237
238
|
|
|
239
|
+
/** Muestra en consola el origen, geometría y estrategia usada por cada morph. */
|
|
240
|
+
@property({ type: Boolean, reflect: true, converter: litBool })
|
|
241
|
+
debug = false;
|
|
242
|
+
|
|
238
243
|
@query('.panel') private _panel!: HTMLDivElement;
|
|
239
244
|
@query('.panel-inner') private _inner!: HTMLDivElement;
|
|
240
245
|
@query('.backdrop') private _backdrop!: HTMLDivElement;
|
|
@@ -250,6 +255,8 @@ export class MoniMorphModal extends MoniElement {
|
|
|
250
255
|
private _handlingOpenChange = false;
|
|
251
256
|
private _zIndex = 100;
|
|
252
257
|
private _morphEls: MorphElements = { text: null, icon: null };
|
|
258
|
+
private _targetSnapshot: HTMLElement | null = null;
|
|
259
|
+
private _originFallbacks: HTMLElement[] = [];
|
|
253
260
|
private static _openStack: MoniMorphModal[] = [];
|
|
254
261
|
private _targetStylesCache = new Map<HTMLElement, { opacity: string; color: string }>();
|
|
255
262
|
|
|
@@ -352,6 +359,7 @@ export class MoniMorphModal extends MoniElement {
|
|
|
352
359
|
console.warn('[moni-morph-modal] cannot show: target not found');
|
|
353
360
|
return;
|
|
354
361
|
}
|
|
362
|
+
this._captureOriginFallbacks(this._targetEl);
|
|
355
363
|
|
|
356
364
|
this._isAnimating = true;
|
|
357
365
|
|
|
@@ -369,6 +377,7 @@ export class MoniMorphModal extends MoniElement {
|
|
|
369
377
|
this.style.setProperty('--_z-index', String(this._zIndex));
|
|
370
378
|
this.style.setProperty('--_backdrop-duration', '0.38s');
|
|
371
379
|
this.style.setProperty('--_backdrop-ease', 'cubic-bezier(0.15, 0.85, 0.2, 1)');
|
|
380
|
+
if (this._backdrop) gsap.set(this._backdrop, { clearProps: 'opacity,transition' });
|
|
372
381
|
|
|
373
382
|
// Fase "First": Ocultamos o cubrimos el trigger original según la configuración del desarrollador
|
|
374
383
|
this._hideTargetContent();
|
|
@@ -388,15 +397,16 @@ export class MoniMorphModal extends MoniElement {
|
|
|
388
397
|
|
|
389
398
|
// 1. "First": Calculamos el estado visual actual del trigger
|
|
390
399
|
const targetState = this._getTargetState(this._targetEl);
|
|
400
|
+
this._debugMorph('open', this._targetEl, 'target', [this._targetEl]);
|
|
391
401
|
const panel = this._panel;
|
|
392
402
|
|
|
393
403
|
// 2. "Invert": Posicionamos el modal como un clon visual exacto del trigger.
|
|
394
404
|
// Desactivamos la sombra y forzamos el color/borde para coincidir con el botón/FAB.
|
|
395
|
-
this._applyRect(panel, targetState.rect);
|
|
405
|
+
this._applyRect(panel, this._toPanelCoordinateRect(targetState.rect));
|
|
396
406
|
panel.style.backgroundColor = targetState.backgroundColor;
|
|
397
407
|
panel.style.color = targetState.color;
|
|
398
408
|
panel.style.borderRadius = targetState.borderRadius;
|
|
399
|
-
panel.style.boxShadow =
|
|
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`;
|