@ionic/angular 9.0.7-dev.11790887756.13f9320e → 9.0.7-dev.11791305593.188c8151
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/css/core.css.map +1 -1
- package/css/display.css.map +1 -1
- package/css/flex-utils.css.map +1 -1
- package/css/float-elements.css +1 -1
- package/css/float-elements.css.map +1 -1
- package/css/global.bundle.css.map +1 -1
- package/css/ionic.bundle.css +1 -1
- package/css/ionic.bundle.css.map +1 -1
- package/css/padding.css.map +1 -1
- package/css/structure.css.map +1 -1
- package/css/text-alignment.css.map +1 -1
- package/css/text-transformation.css.map +1 -1
- package/css/typography.css.map +1 -1
- package/css/utils.bundle.css +1 -1
- package/css/utils.bundle.css.map +1 -1
- package/dist/common/directives/navigation/router-outlet.d.ts +12 -0
- package/dist/common/directives/navigation/router-outlet.js +111 -1
- package/dist/common/directives/navigation/router-outlet.js.map +1 -1
- package/package.json +2 -2
package/css/utils.bundle.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sourceRoot":"","sources":["../src/css/padding.scss","../src/themes/ionic.mixins.scss","../src/css/float-elements.scss","../src/css/text-alignment.scss","../src/css/text-transformation.scss","../src/css/flex-utils.scss","../src/css/display.scss"],"names":[],"mappings":"AAeA,gBACE,mBACA,iBACA,iBACA,oBCsTE,aDpTe,ECqTf,cDrTe,ECyUjB,YDzUiB,EC0UjB,eD1UiB,EAGnB,aACE,0CACA,wCACA,wCACA,2CCiTE,sBDpUM,yBCqUN,qBDrUM,yBCsUN,oBDtUM,yBCuUN,mBDvUM,yBCqVR,YDrVQ,yBCsVR,eDtVQ,yBAwBV,iBACE,wCC4TA,YDrVQ,yBA8BV,mBACE,0CCqSE,sBDpUM,yBCqUN,qBDrUM,yBAoCV,iBACE,wCCiSE,oBDtUM,yBCuUN,mBDvUM,yBA0CV,oBACE,2CC2SA,eDtVQ,yBAgDV,sBACE,wCACA,2CCmSA,YDrVQ,yBCsVR,eDtVQ,yBAuDV,wBACE,0CACA,wCC2QE,sBDpUM,yBCqUN,qBDrUM,yBCsUN,oBDtUM,yBCuUN,mBDvUM,yBAkEV,eACE,kBACA,gBACA,gBACA,mBC0PE,YDxPc,ECyPd,aDzPc,EC6QhB,WD7QgB,EC8QhB,cD9QgB,EAGlB,YACE,wCACA,sCACA,sCACA,yCCqPE,qBDnUK,wBCoUL,oBDpUK,wBCqUL,mBDrUK,wBCsUL,kBDtUK,wBCoVP,WDpVO,wBCqVP,cDrVO,wBAmFT,gBACE,sCCgQA,WDpVO,wBAyFT,kBACE,wCCyOE,qBDnUK,wBCoUL,oBDpUK,wBA+FT,gBACE,sCCqOE,mBDrUK,wBCsUL,kBDtUK,wBAqGT,mBACE,yCC+OA,cDrVO,wBA2GT,qBACE,sCACA,yCCuOA,WDpVO,wBCqVP,cDrVO,wBAkHT,uBACE,wCACA,sCC+ME,qBDnUK,wBCoUL,oBDpUK,wBCqUL,mBDrUK,wBCsUL,kBDtUK,wBEGL,gBD2dE,sBCvdF,iBDudE,uBCndF,iBDqcE,sBAzNO,0CA4NP,uBArNO,2BAqNP,uBA/MJ,8BAcW,0BAiMP,wBCpcF,eDwcE,uBAhOO,wCAmOP,sBA5NO,yBA4NP,sBAtNJ,8BAcW,wBAwMP,uBAnUF,yBCpJA,mBD2dE,sBCvdF,oBDudE,uBCndF,oBDqcE,sBAzNO,6CA4NP,uBArNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCpcF,kBDwcE,uBAhOO,2CAmOP,sBA5NO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBAnUF,yBCpJA,mBD2dE,sBCvdF,oBDudE,uBCndF,oBDqcE,sBAzNO,6CA4NP,uBArNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCpcF,kBDwcE,uBAhOO,2CAmOP,sBA5NO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBAnUF,yBCpJA,mBD2dE,sBCvdF,oBDudE,uBCndF,oBDqcE,sBAzNO,6CA4NP,uBArNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCpcF,kBDwcE,uBAhOO,2CAmOP,sBA5NO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBAnUF,0BCpJA,mBD2dE,sBCvdF,oBDudE,uBCndF,oBDqcE,sBAzNO,6CA4NP,uBArNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCpcF,kBDwcE,uBAhOO,2CAmOP,sBA5NO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBEvdF,iBACE,6BAGF,kBACE,8BAGF,gBACE,4BAGF,cACE,0BAGF,eACE,2BAGF,gBACE,4BAGF,iBACE,8BAGF,eACE,8BFuHF,yBEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BFuHF,yBEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BFuHF,yBEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BFuHF,0BEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BC7BF,oBAEE,oCAGF,oBAEE,oCAGF,qBAEE,qCHwIF,yBGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCHwIF,yBGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCHwIF,yBGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCHwIF,0BGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCCCA,yBACE,oCADF,uBACE,kCADF,0BACE,gCADF,2BACE,uCADF,0BACE,sCADF,2BACE,iCJsIJ,yBIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCJsIJ,yBIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCJsIJ,yBIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCJsIJ,0BIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCAqBF,uBACE,6BADF,qBACE,2BADF,wBACE,8BADF,yBACE,+BADF,0BACE,gCJgHJ,yBIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCJgHJ,yBIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCJgHJ,yBIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCJgHJ,0BIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCAsBF,sBACE,4BADF,oBACE,0BADF,uBACE,6BADF,wBACE,8BADF,yBACE,+BADF,qBACE,2BJyFJ,yBI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BJyFJ,yBI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BJyFJ,yBI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BJyFJ,0BI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BAsBF,2BACE,sCADF,yBACE,oCADF,4BACE,kCADF,6BACE,yCADF,4BACE,wCADF,4BACE,wCJkEJ,yBInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCJkEJ,yBInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCJkEJ,yBInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCJkEJ,0BInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCAoBF,cACE,8BADF,sBACE,sCADF,iBACE,iCADF,yBACE,yCJ6CJ,yBI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CJ6CJ,yBI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CJ6CJ,yBI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CJ6CJ,0BI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CAmBN,UACE,0BADF,YACE,4BADF,kBACE,kCAQE,eACE,0BADF,iBACE,4BADF,uBACE,kCJgBJ,yBIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCJgBJ,yBIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCJgBJ,yBIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCJgBJ,0BIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCAoBF,YACE,kBADF,eACE,qBADF,kBACE,wBADF,eACE,qBJLJ,yBIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBJLJ,yBIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBJLJ,yBIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBJLJ,0BIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBAYJ,iBACE,uBAGF,iBACE,uBAGF,mBACE,yBAGF,mBACE,yBJ9BF,yBIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BJ9BF,yBIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BJ9BF,yBIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BJ9BF,0BIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BAWF,qCAGE,saAGF,oCJ/CA,yBIyCA,wCAGE,6cAGF,wCJ/CA,yBIyCA,wCAGE,6cAGF,wCJ/CA,yBIyCA,wCAGE,6cAGF,wCJ/CA,0BIyCA,wCAGE,6cAGF,wCCpMJ,UACE,wBAUE,aACE,wBAOF,eACE,wBLiIF,yBK1IA,gBACE,yBLkLF,4BK3KA,kBACE,yBLiIF,yBK1IA,gBACE,yBLkLF,4BK3KA,kBACE,yBLiIF,yBK1IA,gBACE,yBLkLF,4BK3KA,kBACE,yBLiIF,0BK1IA,gBACE,yBLkLF,6BK3KA,kBACE,yBAwBA,kBACE,wBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,0BKzGE,qBACE,yBADF,oBACE,0BLwGJ,yBKzGE,uBACE,2BLwGJ,yBKzGE,uBACE,2BLwGJ,yBKzGE,uBACE,2BLwGJ,0BKzGE,uBACE,2BADF,0BACE,gCLwGJ,yBKzGE,6BACE,iCLwGJ,yBKzGE,6BACE,iCLwGJ,yBKzGE,6BACE,iCLwGJ,0BKzGE,6BACE,iCADF,mBACE,yBLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,0BKzGE,sBACE,0BADF,kBACE,wBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,0BKzGE,qBACE,yBADF,yBACE,+BLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,0BKzGE,4BACE,gCADF,kBACE,wBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,0BKzGE,qBACE,yBADF,yBACE,+BLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,0BKzGE,4BACE,gCADF,mBACE,yBLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,0BKzGE,sBACE,0BADF,wBACE,8BLwGJ,yBKzGE,2BACE,+BLwGJ,yBKzGE,2BACE,+BLwGJ,yBKzGE,2BACE,+BLwGJ,0BKzGE,2BACE,+BADF,uBACE,6BLwGJ,yBKzGE,0BACE,8BLwGJ,yBKzGE,0BACE,8BLwGJ,yBKzGE,0BACE,8BLwGJ,0BKzGE,0BACE","file":"utils.bundle.css","sourcesContent":["@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n\n// Element Space\n// --------------------------------------------------\n// Creates padding and margin attributes to be used on\n// any element\n\n$padding: var(--ion-padding, 16px);\n$margin: var(--ion-margin, 16px);\n\n// Padding\n// --------------------------------------------------\n\n.ion-no-padding {\n --padding-start: 0;\n --padding-end: 0;\n --padding-top: 0;\n --padding-bottom: 0;\n\n @include padding(0);\n}\n\n.ion-padding {\n --padding-start: #{$padding};\n --padding-end: #{$padding};\n --padding-top: #{$padding};\n --padding-bottom: #{$padding};\n\n @include padding($padding);\n}\n\n.ion-padding-top {\n --padding-top: #{$padding};\n\n @include padding($padding, null, null, null);\n}\n\n.ion-padding-start {\n --padding-start: #{$padding};\n\n @include padding-horizontal($padding, null);\n}\n\n.ion-padding-end {\n --padding-end: #{$padding};\n\n @include padding-horizontal(null, $padding);\n}\n\n.ion-padding-bottom {\n --padding-bottom: #{$padding};\n\n @include padding(null, null, $padding, null);\n}\n\n.ion-padding-vertical {\n --padding-top: #{$padding};\n --padding-bottom: #{$padding};\n\n @include padding($padding, null, $padding, null);\n}\n\n.ion-padding-horizontal {\n --padding-start: #{$padding};\n --padding-end: #{$padding};\n\n @include padding-horizontal($padding);\n}\n\n\n// Margin\n// --------------------------------------------------\n\n.ion-no-margin {\n --margin-start: 0;\n --margin-end: 0;\n --margin-top: 0;\n --margin-bottom: 0;\n\n @include margin(0);\n}\n\n.ion-margin {\n --margin-start: #{$margin};\n --margin-end: #{$margin};\n --margin-top: #{$margin};\n --margin-bottom: #{$margin};\n\n @include margin($margin);\n}\n\n.ion-margin-top {\n --margin-top: #{$margin};\n\n @include margin($margin, null, null, null);\n}\n\n.ion-margin-start {\n --margin-start: #{$margin};\n\n @include margin-horizontal($margin, null);\n}\n\n.ion-margin-end {\n --margin-end: #{$margin};\n\n @include margin-horizontal(null, $margin);\n}\n\n.ion-margin-bottom {\n --margin-bottom: #{$margin};\n\n @include margin(null, null, $margin, null);\n}\n\n.ion-margin-vertical {\n --margin-top: #{$margin};\n --margin-bottom: #{$margin};\n\n @include margin($margin, null, $margin, null);\n}\n\n.ion-margin-horizontal {\n --margin-start: #{$margin};\n --margin-end: #{$margin};\n\n @include margin-horizontal($margin);\n}\n","\n/**\n * A heuristic that applies CSS to tablet\n * viewports.\n *\n * Usage:\n * @include tablet-viewport() {\n * :host {\n * background-color: green;\n * }\n * }\n */\n@mixin tablet-viewport() {\n @media screen and (min-width: 768px) {\n @content;\n }\n}\n\n/**\n * A heuristic that applies CSS to mobile\n * viewports (i.e. phones, not tablets).\n *\n * Usage:\n * @include mobile-viewport() {\n * :host {\n * background-color: blue;\n * }\n * }\n */\n@mixin mobile-viewport() {\n @media screen and (max-width: 767px) {\n @content;\n }\n}\n\n@mixin input-cover() {\n @include position(0, null, null, 0);\n @include margin(0);\n\n position: absolute;\n\n width: 100%;\n height: 100%;\n\n border: 0;\n background: transparent;\n cursor: pointer;\n\n appearance: none;\n outline: none;\n\n &::-moz-focus-inner {\n border: 0;\n }\n}\n\n@mixin visually-hidden() {\n position: absolute;\n\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n\n width: 100%;\n height: 100%;\n\n margin: 0;\n padding: 0;\n\n border: 0;\n outline: 0;\n clip: rect(0 0 0 0);\n\n opacity: 0;\n overflow: hidden;\n\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n\n@mixin text-inherit() {\n font-family: inherit;\n font-size: inherit;\n font-style: inherit;\n font-weight: inherit;\n letter-spacing: inherit;\n text-decoration: inherit;\n text-indent: inherit;\n text-overflow: inherit;\n text-transform: inherit;\n text-align: inherit;\n white-space: inherit;\n color: inherit;\n}\n\n@mixin button-state() {\n @include position(0, 0, 0, 0);\n\n position: absolute;\n\n content: \"\";\n\n opacity: 0;\n}\n\n// Font smoothing\n// --------------------------------------------------\n\n@mixin font-smoothing() {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n}\n\n// Get the key from a map based on the index\n@function index-to-key($map, $index) {\n $keys: map-keys($map);\n\n @return nth($keys, $index);\n}\n\n\n// Breakpoint Mixins\n// ---------------------------------------------------------------------------------\n\n// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$screen-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// ---------------------------------------------------------------------------------\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $screen-breakpoints) {\n $min: map-get($breakpoints, $name);\n\n @return if($name != index-to-key($breakpoints, 1), $min, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $screen-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $screen-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $screen-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Maximum breakpoint width. Null for the smallest (first) breakpoint.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n//\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\t// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\t// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $screen-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $screen-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n\n// Text Direction - ltr / rtl\n//\n// CSS defaults to use the ltr css, and adds [dir=rtl] selectors\n// to override ltr defaults.\n// ----------------------------------------------------------\n\n@mixin multi-dir() {\n @content;\n\n // $root: #{&};\n // @at-root [dir] {\n // #{$root} {\n // @content;\n // }\n // }\n}\n\n@mixin rtl() {\n $root: #{&};\n\n $rootSplit: str-split($root, \",\");\n $selectors: #{add-root-selector($root, \"[dir=rtl]\")};\n $selectorsSplit: str-split($selectors, \",\");\n\n $hostContextSelectors: ();\n $restSelectors: ();\n $dirSelectors: ();\n\n // Selectors must be split into individual selectors in case the browser\n // doesn't support a specific selector.\n // For example, Firefox and Safari doesn't support `:host-context()`.\n // If an invalid selector is used, then the entire group of selectors\n // will be ignored.\n // @link https://www.w3.org/TR/selectors-3/#grouping\n @each $selector in $selectorsSplit {\n // Group the selectors back into a single selector to optimize the output.\n @if str-index($selector, \":host-context\") {\n $hostContextSelectors: append($hostContextSelectors, $selector, comma);\n } @else {\n // Group the selectors back into a single selector to optimize the output.\n $restSelectors: append($restSelectors, $selector, comma);\n }\n }\n\n // Supported by Chrome.\n @if length($hostContextSelectors) > 0 {\n @at-root #{$hostContextSelectors} {\n @content;\n }\n }\n\n // Supported by all browsers.\n @if length($restSelectors) > 0 {\n @at-root #{$restSelectors} {\n @content;\n }\n }\n\n // If browser can support `:dir()`, then add the `:dir()` selectors.\n @supports selector(:dir(rtl)) {\n // Adding :dir() in case the browser doesn't support `:host-context()` and does support `:dir()`.\n // `:host-context()` is added:\n // - through the `add-root-selector()` function.\n // - first so that it takes precedence over `:dir()`.\n // For example,\n // - Firefox doesn't support `:host-context()`, but does support `:dir()`.\n // - Safari doesn't support `:host-context()`, but Safari 16.4+ supports `:dir()`\n // @link https://webkit.org/blog/13966/webkit-features-in-safari-16-4/\n // -- However, there is a Webkit bug on v16 that prevents `:dir()` from working when\n // -- the app direction is changed dynamically. v17+ works fine.\n // -- @link https://bugs.webkit.org/show_bug.cgi?id=257133\n\n // Supported by Firefox.\n @at-root #{add-root-selector($root, \":dir(rtl)\", false)} {\n @content;\n }\n }\n}\n\n@mixin ltr() {\n @content;\n}\n\n\n// SVG Background Image Mixin\n// @param {string} $svg\n// ----------------------------------------------------------\n@mixin svg-background-image($svg, $flip-rtl: false) {\n $url: url-encode($svg);\n $viewBox: str-split(str-extract($svg, \"viewBox='\", \"'\"), \" \");\n\n @if $flip-rtl != true or $viewBox == null {\n @include multi-dir() {\n background-image: url(\"data:image/svg+xml;charset=utf-8,#{$url}\");\n }\n } @else {\n $transform: \"transform='translate(#{nth($viewBox, 3)}, 0) scale(-1, 1)'\";\n $flipped-url: $svg;\n $flipped-url: str-replace($flipped-url, \"<path\", \"<path #{$transform}\");\n $flipped-url: str-replace($flipped-url, \"<line\", \"<line #{$transform}\");\n $flipped-url: str-replace($flipped-url, \"<polygon\", \"<polygon #{$transform}\");\n $flipped-url: url-encode($flipped-url);\n\n @include ltr () {\n background-image: url(\"data:image/svg+xml;charset=utf-8,#{$url}\");\n }\n @include rtl() {\n background-image: url(\"data:image/svg+xml;charset=utf-8,#{$flipped-url}\");\n }\n }\n}\n\n// Add property horizontal\n// @param {string} $start\n// @param {string} $end\n// ----------------------------------------------------------\n@mixin property-horizontal($prop, $start, $end: $start) {\n @if $start == 0 and $end == 0 {\n #{$prop}-left: $start;\n #{$prop}-right: $end;\n\n } @else {\n -webkit-#{$prop}-start: $start;\n #{$prop}-inline-start: $start;\n -webkit-#{$prop}-end: $end;\n #{$prop}-inline-end: $end;\n }\n}\n\n// Add property for all directions\n// @param {string} $prop\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// @param {boolean} $content include content or use default\n// ----------------------------------------------------------\n@mixin property($prop, $top, $end: $top, $bottom: $top, $start: $end) {\n @include property-horizontal($prop, $start, $end);\n #{$prop}-top: $top;\n #{$prop}-bottom: $bottom;\n}\n\n// Add padding horizontal\n// @param {string} $start\n// @param {string} $end\n// ----------------------------------------------------------\n@mixin padding-horizontal($start, $end: $start) {\n @include property-horizontal(padding, $start, $end);\n}\n\n// Add padding for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin padding($top, $end: $top, $bottom: $top, $start: $end) {\n @include property(padding, $top, $end, $bottom, $start);\n}\n\n// Add margin horizontal\n// @param {string} $start\n// @param {string} $end\n// ----------------------------------------------------------\n@mixin margin-horizontal($start, $end: $start) {\n @include property-horizontal(margin, $start, $end);\n}\n\n// Add margin for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin margin($top, $end: $top, $bottom: $top, $start: $end) {\n @include property(margin, $top, $end, $bottom, $start);\n}\n\n// Add position horizontal\n// @param {string} $start - amount to position start\n// @param {string} $end - amount to left: 0; end\n// ----------------------------------------------------------\n@mixin position-horizontal($start: null, $end: null) {\n @if $start == $end {\n @include multi-dir() {\n left: $start;\n right: $end;\n }\n } @else {\n @at-root {\n & {\n inset-inline-start: $start;\n inset-inline-end: $end;\n }\n }\n }\n}\n\n// Add position for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin position($top: null, $end: null, $bottom: null, $start: null) {\n @include position-horizontal($start, $end);\n top: $top;\n bottom: $bottom;\n}\n\n// Add border for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin border($top, $end: $top, $bottom: $top, $start: $end) {\n @include property(border, $top, $end, $bottom, $start);\n}\n\n// Add border radius for all directions\n// @param {string} $top-start\n// @param {string} $top-end\n// @param {string} $bottom-end\n// @param {string} $bottom-start\n// ----------------------------------------------------------\n@mixin border-radius($top-start, $top-end: $top-start, $bottom-end: $top-start, $bottom-start: $top-end) {\n @if $top-start == $top-end and $top-start == $bottom-end and $top-start == $bottom-start {\n border-radius: $top-start;\n } @else {\n border-start-start-radius: $top-start;\n border-start-end-radius: $top-end;\n border-end-end-radius: $bottom-end;\n border-end-start-radius: $bottom-start;\n }\n}\n\n// Add direction for all directions\n// @param {string} $dir - Direction on LTR\n@mixin direction($dir) {\n $other-dir: null;\n\n @if $dir == ltr {\n $other-dir: rtl;\n } @else {\n $other-dir: ltr;\n }\n\n @include ltr() {\n direction: $dir;\n }\n @include rtl() {\n direction: $other-dir;\n }\n}\n\n// Add float for all directions\n// @param {string} $side\n// @param {string} $decorator - !important\n@mixin float($side, $decorator: null) {\n @if $side == start {\n @include ltr() {\n float: left $decorator;\n }\n @include rtl() {\n float: right $decorator;\n }\n } @else if $side == end {\n @include ltr() {\n float: right $decorator;\n }\n @include rtl() {\n float: left $decorator;\n }\n } @else {\n @include multi-dir() {\n float: $side $decorator;\n }\n }\n}\n\n@mixin background-position($horizontal, $horizontal-amount: null, $vertical: null, $vertical-amount: null) {\n @if $horizontal == start or $horizontal == end {\n $horizontal-ltr: null;\n $horizontal-rtl: null;\n @if $horizontal == start {\n $horizontal-ltr: left;\n $horizontal-rtl: right;\n } @else {\n $horizontal-ltr: right;\n $horizontal-rtl: left;\n }\n\n @include ltr() {\n background-position: $horizontal-ltr $horizontal-amount $vertical $vertical-amount;\n }\n @include rtl() {\n background-position: $horizontal-rtl $horizontal-amount $vertical $vertical-amount;\n }\n } @else {\n @include multi-dir() {\n background-position: $horizontal $horizontal-amount $vertical $vertical-amount;\n }\n }\n}\n\n@mixin transform-origin($x-axis, $y-axis: null) {\n @if $x-axis == start {\n @include ltr() {\n transform-origin: left $y-axis;\n }\n @include rtl() {\n transform-origin: right $y-axis;\n }\n } @else if $x-axis == end {\n @include ltr() {\n transform-origin: right $y-axis;\n }\n @include rtl() {\n transform-origin: left $y-axis;\n }\n } @else if $x-axis == left or $x-axis == right {\n @include multi-dir() {\n transform-origin: $x-axis $y-axis;\n }\n } @else {\n @include ltr() {\n transform-origin: $x-axis $y-axis;\n }\n @include rtl() {\n transform-origin: calc(100% - #{$x-axis}) $y-axis;\n }\n }\n}\n\n// Add transform for all directions\n// @param {string} $transforms - comma separated list of transforms\n@mixin transform($transforms...) {\n $extra: null;\n\n $x: null;\n $ltr-translate: null;\n $rtl-translate: null;\n\n @each $transform in $transforms {\n @if (str-index($transform, translate3d)) {\n $transform: str-replace($transform, 'translate3d(');\n $transform: str-replace($transform, ')');\n\n $coordinates: str-split($transform, ',');\n\n $x: nth($coordinates, 1);\n $y: nth($coordinates, 2);\n $z: nth($coordinates, 3);\n\n $ltr-translate: translate3d($x, $y, $z);\n $rtl-translate: translate3d(calc(-1 * #{$x}), $y, $z);\n } @else {\n @if $extra == null {\n $extra: $transform;\n } @else {\n $extra: $extra $transform;\n }\n }\n }\n\n @if $x == '0' or $x == null {\n @include multi-dir() {\n transform: $ltr-translate $extra;\n }\n } @else {\n @include ltr() {\n transform: $ltr-translate $extra;\n }\n\n @include rtl() {\n transform: $rtl-translate $extra;\n }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Float Elements\n// --------------------------------------------------\n// Creates float classes based on screen size\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `.ion-float-{bp}-{side}` classes for floating the element based\n // on the breakpoint and side\n .ion-float#{$infix}-left {\n @include float(left, !important);\n }\n\n .ion-float#{$infix}-right {\n @include float(right, !important);\n }\n\n .ion-float#{$infix}-start {\n @include float(start, !important);\n }\n\n .ion-float#{$infix}-end {\n @include float(end, !important);\n }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Text Alignment\n// --------------------------------------------------\n// Creates text alignment attributes based on screen size\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `.ion-text-{bp}` classes for aligning the text based\n // on the breakpoint\n .ion-text#{$infix}-center {\n text-align: center !important;\n }\n\n .ion-text#{$infix}-justify {\n text-align: justify !important;\n }\n\n .ion-text#{$infix}-start {\n text-align: start !important;\n }\n\n .ion-text#{$infix}-end {\n text-align: end !important;\n }\n\n .ion-text#{$infix}-left {\n text-align: left !important;\n }\n\n .ion-text#{$infix}-right {\n text-align: right !important;\n }\n\n .ion-text#{$infix}-nowrap {\n white-space: nowrap !important;\n }\n\n .ion-text#{$infix}-wrap {\n white-space: normal !important;\n }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Text Transformation\n// --------------------------------------------------\n// Creates text transform attributes based on screen size\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `.ion-text-{bp}` classes for transforming the text based\n // on the breakpoint\n .ion-text#{$infix}-uppercase {\n /* stylelint-disable-next-line declaration-no-important */\n text-transform: uppercase !important;\n }\n\n .ion-text#{$infix}-lowercase {\n /* stylelint-disable-next-line declaration-no-important */\n text-transform: lowercase !important;\n }\n\n .ion-text#{$infix}-capitalize {\n /* stylelint-disable-next-line declaration-no-important */\n text-transform: capitalize !important;\n }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Flex Utilities\n// ------------------------------------------------------------------\n// Provides utility classes to control flexbox layout, alignment,\n// and sizing of elements. Includes responsive variants for managing\n// flex direction, alignment, justification, wrapping, growth,\n// shrinking, and ordering at different breakpoints.\n\n// Align Content\n// ------------------------------------------------------------------\n\n$align-content-values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n stretch: stretch\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $key, $value in $align-content-values {\n .ion-align-content#{$infix}-#{$key} {\n align-content: #{$value} !important;\n }\n }\n }\n}\n\n// Align Items\n// ------------------------------------------------------------------\n\n$align-items-values: (\n start,\n end,\n center,\n stretch,\n baseline\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $align-items-values {\n .ion-align-items#{$infix}-#{$value} {\n align-items: #{$value} !important;\n }\n }\n }\n}\n\n// Align Self\n// ------------------------------------------------------------------\n\n$align-self-values: (\n start,\n end,\n center,\n stretch,\n baseline,\n auto\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $align-self-values {\n .ion-align-self#{$infix}-#{$value} {\n align-self: #{$value} !important;\n }\n }\n }\n}\n\n// Justify Content\n// ------------------------------------------------------------------\n\n$justify-content-values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n evenly: space-evenly\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $key, $value in $justify-content-values {\n .ion-justify-content#{$infix}-#{$key} {\n justify-content: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Direction\n// ------------------------------------------------------------------\n\n$flex-direction-values: (\n row,\n row-reverse,\n column,\n column-reverse\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $flex-direction-values {\n .ion-flex#{$infix}-#{$value} {\n flex-direction: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Wrap\n// ------------------------------------------------------------------\n\n$flex-wrap-values: (\n wrap,\n nowrap,\n wrap-reverse\n);\n\n@each $value in $flex-wrap-values {\n // TODO(FW-6697): remove ion-wrap, ion-nowrap, ion-wrap-reverse\n // in favor of the new ion-flex-wrap, ion-flex-nowrap, and\n // ion-flex-wrap-reverse classes\n .ion-#{$value} {\n flex-wrap: #{$value} !important;\n }\n}\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $flex-wrap-values {\n .ion-flex#{$infix}-#{$value} {\n flex-wrap: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Fill\n// ------------------------------------------------------------------\n\n$flex-fill-values: (\n 1,\n auto,\n initial,\n none\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $flex-fill-values {\n .ion-flex#{$infix}-#{$value} {\n flex: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Grow and Shrink\n// ------------------------------------------------------------------\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n .ion-flex#{$infix}-grow-0 {\n flex-grow: 0 !important;\n }\n\n .ion-flex#{$infix}-grow-1 {\n flex-grow: 1 !important;\n }\n\n .ion-flex#{$infix}-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .ion-flex#{$infix}-shrink-1 {\n flex-shrink: 1 !important;\n }\n }\n}\n\n// Flex Order\n// ------------------------------------------------------------------\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n .ion-order#{$infix}-first { order: -1 !important; }\n\n @for $i from 0 through 12 {\n .ion-order#{$infix}-#{$i} { order: #{$i} !important; }\n }\n\n .ion-order#{$infix}-last { order: 13 !important; }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Display\n// ------------------------------------------------------------------\n// Provides utility classes to control the CSS display property\n// of elements. Includes responsive variants for toggling between\n// block, inline, flex, grid, and other display values at different\n// breakpoints.\n\n// TODO(FW-6697): remove ion-hide-* classes in favor of the new\n// ion-display-* classes\n.ion-hide {\n display: none !important;\n}\n\n// Adds hidden classes\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `ion-hide-{bp}-up` classes for hiding the element based\n // on the breakpoint\n .ion-hide#{$infix}-up {\n display: none !important;\n }\n }\n\n @include media-breakpoint-down($breakpoint, $screen-breakpoints) {\n // Provide `ion-hide-{bp}-down` classes for hiding the element based\n // on the breakpoint\n .ion-hide#{$infix}-down {\n display: none !important;\n }\n }\n}\n\n$display-values: (\n none,\n inline,\n inline-block,\n block,\n flex,\n inline-flex,\n grid,\n inline-grid,\n table,\n table-cell,\n table-row\n);\n\n@each $display in $display-values {\n @each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n .ion-display#{$infix}-#{$display} {\n display: #{$display} !important;\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sourceRoot":"","sources":["../src/css/padding.scss","../src/themes/ionic.mixins.scss","../src/css/float-elements.scss","../src/css/text-alignment.scss","../src/css/text-transformation.scss","../src/css/flex-utils.scss","../src/css/display.scss"],"names":[],"mappings":"AAeA,gBACE,mBACA,iBACA,iBACA,oBC2TE,aDzTe,EC0Tf,cD1Te,EC8UjB,YD9UiB,EC+UjB,eD/UiB,EAGnB,aACE,0CACA,wCACA,wCACA,2CCsTE,sBDzUM,yBC0UN,qBD1UM,yBC2UN,oBD3UM,yBC4UN,mBD5UM,yBC0VR,YD1VQ,yBC2VR,eD3VQ,yBAwBV,iBACE,wCCiUA,YD1VQ,yBA8BV,mBACE,0CC0SE,sBDzUM,yBC0UN,qBD1UM,yBAoCV,iBACE,wCCsSE,oBD3UM,yBC4UN,mBD5UM,yBA0CV,oBACE,2CCgTA,eD3VQ,yBAgDV,sBACE,wCACA,2CCwSA,YD1VQ,yBC2VR,eD3VQ,yBAuDV,wBACE,0CACA,wCCgRE,sBDzUM,yBC0UN,qBD1UM,yBC2UN,oBD3UM,yBC4UN,mBD5UM,yBAkEV,eACE,kBACA,gBACA,gBACA,mBC+PE,YD7Pc,EC8Pd,aD9Pc,ECkRhB,WDlRgB,ECmRhB,cDnRgB,EAGlB,YACE,wCACA,sCACA,sCACA,yCC0PE,qBDxUK,wBCyUL,oBDzUK,wBC0UL,mBD1UK,wBC2UL,kBD3UK,wBCyVP,WDzVO,wBC0VP,cD1VO,wBAmFT,gBACE,sCCqQA,WDzVO,wBAyFT,kBACE,wCC8OE,qBDxUK,wBCyUL,oBDzUK,wBA+FT,gBACE,sCC0OE,mBD1UK,wBC2UL,kBD3UK,wBAqGT,mBACE,yCCoPA,cD1VO,wBA2GT,qBACE,sCACA,yCC4OA,WDzVO,wBC0VP,cD1VO,wBAkHT,uBACE,wCACA,sCCoNE,qBDxUK,wBCyUL,oBDzUK,wBC0UL,mBD1UK,wBC2UL,kBD3UK,wBEML,gBD6dE,sBCzdF,iBDydE,uBCrdF,iBDucE,sBAlNO,2BAqNP,uBA/MJ,8BAcW,0BAiMP,wBCtcF,eD0cE,uBAzNO,yBA4NP,sBAtNJ,8BAcW,wBAwMP,uBAxUF,yBCjJA,mBD6dE,sBCzdF,oBDydE,uBCrdF,oBDucE,sBAlNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCtcF,kBD0cE,uBAzNO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBAxUF,yBCjJA,mBD6dE,sBCzdF,oBDydE,uBCrdF,oBDucE,sBAlNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCtcF,kBD0cE,uBAzNO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBAxUF,yBCjJA,mBD6dE,sBCzdF,oBDydE,uBCrdF,oBDucE,sBAlNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCtcF,kBD0cE,uBAzNO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBAxUF,0BCjJA,mBD6dE,sBCzdF,oBDydE,uBCrdF,oBDucE,sBAlNO,8BAqNP,uBA/MJ,8BAcW,6BAiMP,wBCtcF,kBD0cE,uBAzNO,4BA4NP,sBAtNJ,8BAcW,2BAwMP,wBE5dF,iBACE,6BAGF,kBACE,8BAGF,gBACE,4BAGF,cACE,0BAGF,eACE,2BAGF,gBACE,4BAGF,iBACE,8BAGF,eACE,8BFuHF,yBEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BFuHF,yBEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BFuHF,yBEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BFuHF,0BEpJA,oBACE,6BAGF,qBACE,8BAGF,mBACE,4BAGF,iBACE,0BAGF,kBACE,2BAGF,mBACE,4BAGF,oBACE,8BAGF,kBACE,+BC7BF,oBAEE,oCAGF,oBAEE,oCAGF,qBAEE,qCHwIF,yBGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCHwIF,yBGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCHwIF,yBGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCHwIF,0BGpJA,uBAEE,oCAGF,uBAEE,oCAGF,wBAEE,sCCCA,yBACE,oCADF,uBACE,kCADF,0BACE,gCADF,2BACE,uCADF,0BACE,sCADF,2BACE,iCJsIJ,yBIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCJsIJ,yBIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCJsIJ,yBIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCJsIJ,0BIvIE,4BACE,oCADF,0BACE,kCADF,6BACE,gCADF,8BACE,uCADF,6BACE,sCADF,8BACE,kCAqBF,uBACE,6BADF,qBACE,2BADF,wBACE,8BADF,yBACE,+BADF,0BACE,gCJgHJ,yBIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCJgHJ,yBIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCJgHJ,yBIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCJgHJ,0BIjHE,0BACE,6BADF,wBACE,2BADF,2BACE,8BADF,4BACE,+BADF,6BACE,iCAsBF,sBACE,4BADF,oBACE,0BADF,uBACE,6BADF,wBACE,8BADF,yBACE,+BADF,qBACE,2BJyFJ,yBI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BJyFJ,yBI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BJyFJ,yBI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BJyFJ,0BI1FE,yBACE,4BADF,uBACE,0BADF,0BACE,6BADF,2BACE,8BADF,4BACE,+BADF,wBACE,4BAsBF,2BACE,sCADF,yBACE,oCADF,4BACE,kCADF,6BACE,yCADF,4BACE,wCADF,4BACE,wCJkEJ,yBInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCJkEJ,yBInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCJkEJ,yBInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCJkEJ,0BInEE,8BACE,sCADF,4BACE,oCADF,+BACE,kCADF,gCACE,yCADF,+BACE,wCADF,+BACE,yCAoBF,cACE,8BADF,sBACE,sCADF,iBACE,iCADF,yBACE,yCJ6CJ,yBI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CJ6CJ,yBI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CJ6CJ,yBI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CJ6CJ,0BI9CE,iBACE,8BADF,yBACE,sCADF,oBACE,iCADF,4BACE,0CAmBN,UACE,0BADF,YACE,4BADF,kBACE,kCAQE,eACE,0BADF,iBACE,4BADF,uBACE,kCJgBJ,yBIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCJgBJ,yBIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCJgBJ,yBIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCJgBJ,0BIjBE,kBACE,0BADF,oBACE,4BADF,0BACE,mCAoBF,YACE,kBADF,eACE,qBADF,kBACE,wBADF,eACE,qBJLJ,yBIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBJLJ,yBIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBJLJ,yBIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBJLJ,0BIIE,eACE,kBADF,kBACE,qBADF,qBACE,wBADF,kBACE,sBAYJ,iBACE,uBAGF,iBACE,uBAGF,mBACE,yBAGF,mBACE,yBJ9BF,yBIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BJ9BF,yBIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BJ9BF,yBIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BJ9BF,0BIiBA,oBACE,uBAGF,oBACE,uBAGF,sBACE,yBAGF,sBACE,0BAWF,qCAGE,saAGF,oCJ/CA,yBIyCA,wCAGE,6cAGF,wCJ/CA,yBIyCA,wCAGE,6cAGF,wCJ/CA,yBIyCA,wCAGE,6cAGF,wCJ/CA,0BIyCA,wCAGE,6cAGF,wCCpMJ,UACE,wBAUE,aACE,wBAOF,eACE,wBLiIF,yBK1IA,gBACE,yBLkLF,4BK3KA,kBACE,yBLiIF,yBK1IA,gBACE,yBLkLF,4BK3KA,kBACE,yBLiIF,yBK1IA,gBACE,yBLkLF,4BK3KA,kBACE,yBLiIF,0BK1IA,gBACE,yBLkLF,6BK3KA,kBACE,yBAwBA,kBACE,wBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,0BKzGE,qBACE,yBADF,oBACE,0BLwGJ,yBKzGE,uBACE,2BLwGJ,yBKzGE,uBACE,2BLwGJ,yBKzGE,uBACE,2BLwGJ,0BKzGE,uBACE,2BADF,0BACE,gCLwGJ,yBKzGE,6BACE,iCLwGJ,yBKzGE,6BACE,iCLwGJ,yBKzGE,6BACE,iCLwGJ,0BKzGE,6BACE,iCADF,mBACE,yBLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,0BKzGE,sBACE,0BADF,kBACE,wBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,0BKzGE,qBACE,yBADF,yBACE,+BLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,0BKzGE,4BACE,gCADF,kBACE,wBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,yBKzGE,qBACE,yBLwGJ,0BKzGE,qBACE,yBADF,yBACE,+BLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,yBKzGE,4BACE,gCLwGJ,0BKzGE,4BACE,gCADF,mBACE,yBLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,yBKzGE,sBACE,0BLwGJ,0BKzGE,sBACE,0BADF,wBACE,8BLwGJ,yBKzGE,2BACE,+BLwGJ,yBKzGE,2BACE,+BLwGJ,yBKzGE,2BACE,+BLwGJ,0BKzGE,2BACE,+BADF,uBACE,6BLwGJ,yBKzGE,0BACE,8BLwGJ,yBKzGE,0BACE,8BLwGJ,yBKzGE,0BACE,8BLwGJ,0BKzGE,0BACE","file":"utils.bundle.css","sourcesContent":["@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n\n// Element Space\n// --------------------------------------------------\n// Creates padding and margin attributes to be used on\n// any element\n\n$padding: var(--ion-padding, 16px);\n$margin: var(--ion-margin, 16px);\n\n// Padding\n// --------------------------------------------------\n\n.ion-no-padding {\n --padding-start: 0;\n --padding-end: 0;\n --padding-top: 0;\n --padding-bottom: 0;\n\n @include padding(0);\n}\n\n.ion-padding {\n --padding-start: #{$padding};\n --padding-end: #{$padding};\n --padding-top: #{$padding};\n --padding-bottom: #{$padding};\n\n @include padding($padding);\n}\n\n.ion-padding-top {\n --padding-top: #{$padding};\n\n @include padding($padding, null, null, null);\n}\n\n.ion-padding-start {\n --padding-start: #{$padding};\n\n @include padding-horizontal($padding, null);\n}\n\n.ion-padding-end {\n --padding-end: #{$padding};\n\n @include padding-horizontal(null, $padding);\n}\n\n.ion-padding-bottom {\n --padding-bottom: #{$padding};\n\n @include padding(null, null, $padding, null);\n}\n\n.ion-padding-vertical {\n --padding-top: #{$padding};\n --padding-bottom: #{$padding};\n\n @include padding($padding, null, $padding, null);\n}\n\n.ion-padding-horizontal {\n --padding-start: #{$padding};\n --padding-end: #{$padding};\n\n @include padding-horizontal($padding);\n}\n\n\n// Margin\n// --------------------------------------------------\n\n.ion-no-margin {\n --margin-start: 0;\n --margin-end: 0;\n --margin-top: 0;\n --margin-bottom: 0;\n\n @include margin(0);\n}\n\n.ion-margin {\n --margin-start: #{$margin};\n --margin-end: #{$margin};\n --margin-top: #{$margin};\n --margin-bottom: #{$margin};\n\n @include margin($margin);\n}\n\n.ion-margin-top {\n --margin-top: #{$margin};\n\n @include margin($margin, null, null, null);\n}\n\n.ion-margin-start {\n --margin-start: #{$margin};\n\n @include margin-horizontal($margin, null);\n}\n\n.ion-margin-end {\n --margin-end: #{$margin};\n\n @include margin-horizontal(null, $margin);\n}\n\n.ion-margin-bottom {\n --margin-bottom: #{$margin};\n\n @include margin(null, null, $margin, null);\n}\n\n.ion-margin-vertical {\n --margin-top: #{$margin};\n --margin-bottom: #{$margin};\n\n @include margin($margin, null, $margin, null);\n}\n\n.ion-margin-horizontal {\n --margin-start: #{$margin};\n --margin-end: #{$margin};\n\n @include margin-horizontal($margin);\n}\n","\n/**\n * A heuristic that applies CSS to tablet\n * viewports.\n *\n * Usage:\n * @include tablet-viewport() {\n * :host {\n * background-color: green;\n * }\n * }\n */\n@mixin tablet-viewport() {\n @media screen and (min-width: 768px) {\n @content;\n }\n}\n\n/**\n * A heuristic that applies CSS to mobile\n * viewports (i.e. phones, not tablets).\n *\n * Usage:\n * @include mobile-viewport() {\n * :host {\n * background-color: blue;\n * }\n * }\n */\n@mixin mobile-viewport() {\n @media screen and (max-width: 767px) {\n @content;\n }\n}\n\n@mixin input-cover() {\n @include position(0, null, null, 0);\n @include margin(0);\n\n position: absolute;\n\n width: 100%;\n height: 100%;\n\n border: 0;\n background: transparent;\n cursor: pointer;\n\n appearance: none;\n outline: none;\n\n &::-moz-focus-inner {\n border: 0;\n }\n}\n\n@mixin visually-hidden() {\n position: absolute;\n\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n\n width: 100%;\n height: 100%;\n\n margin: 0;\n padding: 0;\n\n border: 0;\n outline: 0;\n clip: rect(0 0 0 0);\n\n opacity: 0;\n overflow: hidden;\n\n -webkit-appearance: none;\n -moz-appearance: none;\n}\n\n@mixin text-inherit() {\n font-family: inherit;\n font-size: inherit;\n font-style: inherit;\n font-weight: inherit;\n letter-spacing: inherit;\n text-decoration: inherit;\n text-indent: inherit;\n text-overflow: inherit;\n text-transform: inherit;\n text-align: inherit;\n white-space: inherit;\n color: inherit;\n}\n\n@mixin button-state() {\n @include position(0, 0, 0, 0);\n\n position: absolute;\n\n content: \"\";\n\n opacity: 0;\n}\n\n// Font smoothing\n// --------------------------------------------------\n\n@mixin font-smoothing() {\n -moz-osx-font-smoothing: grayscale;\n -webkit-font-smoothing: antialiased;\n}\n\n// Get the key from a map based on the index\n@function index-to-key($map, $index) {\n $keys: map-keys($map);\n\n @return nth($keys, $index);\n}\n\n\n// Breakpoint Mixins\n// ---------------------------------------------------------------------------------\n\n// Breakpoint viewport sizes and media queries.\n//\n// Breakpoints are defined as a map of (name: minimum width), order from small to large:\n//\n// (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px)\n//\n// The map defined in the `$screen-breakpoints` global variable is used as the `$breakpoints` argument by default.\n\n// ---------------------------------------------------------------------------------\n\n// Minimum breakpoint width. Null for the smallest (first) breakpoint.\n//\n// >> breakpoint-min(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 576px\n@function breakpoint-min($name, $breakpoints: $screen-breakpoints) {\n $min: map-get($breakpoints, $name);\n\n @return if($name != index-to-key($breakpoints, 1), $min, null);\n}\n\n// Returns a blank string if smallest breakpoint, otherwise returns the name with a dash infront.\n// Useful for making responsive utilities.\n//\n// >> breakpoint-infix(xs, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"\" (Returns a blank string)\n// >> breakpoint-infix(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// \"-sm\"\n@function breakpoint-infix($name, $breakpoints: $screen-breakpoints) {\n @return if(breakpoint-min($name, $breakpoints) == null, \"\", \"-#{$name}\");\n}\n\n// Media of at least the minimum breakpoint width. No query for the smallest breakpoint.\n// Makes the @content apply to the given breakpoint and wider.\n@mixin media-breakpoint-up($name, $breakpoints: $screen-breakpoints) {\n $min: breakpoint-min($name, $breakpoints);\n @if $min {\n @media (min-width: $min) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Name of the next breakpoint, or null for the last breakpoint.\n//\n// >> breakpoint-next(sm)\n// md\n// >> breakpoint-next(sm, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// md\n// >> breakpoint-next(sm, $breakpoint-names: (xs sm md lg xl))\n// md\n@function breakpoint-next($name, $breakpoints: $screen-breakpoints, $breakpoint-names: map-keys($breakpoints)) {\n $n: index($breakpoint-names, $name);\n @return if($n < length($breakpoint-names), nth($breakpoint-names, $n + 1), null);\n}\n\n// Maximum breakpoint width. Null for the smallest (first) breakpoint.\n// The maximum value is reduced by 0.02px to work around the limitations of\n// `min-` and `max-` prefixes and viewports with fractional widths.\n//\n// See https://www.w3.org/TR/mediaqueries-4/#mq-min-max\n// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\t// Uses 0.02px rather than 0.01px to work around a current rounding bug in Safari.\n// See https://bugs.webkit.org/show_bug.cgi?id=178261\t// See https://bugs.webkit.org/show_bug.cgi?id=178261\n//\n// >> breakpoint-max(md, (xs: 0, sm: 576px, md: 768px, lg: 992px, xl: 1200px))\n// 767.98px\n@function breakpoint-max($name, $breakpoints: $screen-breakpoints) {\n $max: map-get($breakpoints, $name);\n @return if($max and $max > 0, $max - .02, null);\n}\n\n// Media of at most the maximum breakpoint width. No query for the largest breakpoint.\n// Makes the @content apply to the given breakpoint and narrower.\n@mixin media-breakpoint-down($name, $breakpoints: $screen-breakpoints) {\n $max: breakpoint-max($name, $breakpoints);\n @if $max {\n @media (max-width: $max) {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n\n// Text Direction - ltr / rtl\n//\n// CSS defaults to use the ltr css, and adds [dir=rtl] selectors\n// to override ltr defaults.\n// ----------------------------------------------------------\n\n@mixin multi-dir() {\n @content;\n\n // $root: #{&};\n // @at-root [dir] {\n // #{$root} {\n // @content;\n // }\n // }\n}\n\n// Whether `rtl()` emits `:host-context()` selectors. Global stylesheets\n// set this to false: they apply to the document, where `:host-context()`\n// never matches, and Lightning CSS warns about every occurrence.\n$rtl-use-host-context: true !default;\n\n@mixin rtl() {\n $root: #{&};\n\n $rootSplit: str-split($root, \",\");\n $selectors: #{add-root-selector($root, \"[dir=rtl]\")};\n $selectorsSplit: str-split($selectors, \",\");\n\n $hostContextSelectors: ();\n $restSelectors: ();\n $dirSelectors: ();\n\n // Selectors must be split into individual selectors in case the browser\n // doesn't support a specific selector.\n // For example, Firefox and Safari doesn't support `:host-context()`.\n // If an invalid selector is used, then the entire group of selectors\n // will be ignored.\n // @link https://www.w3.org/TR/selectors-3/#grouping\n @each $selector in $selectorsSplit {\n // Group the selectors back into a single selector to optimize the output.\n @if str-index($selector, \":host-context\") {\n $hostContextSelectors: append($hostContextSelectors, $selector, comma);\n } @else {\n // Group the selectors back into a single selector to optimize the output.\n $restSelectors: append($restSelectors, $selector, comma);\n }\n }\n\n // Supported by Chrome.\n @if $rtl-use-host-context and length($hostContextSelectors) > 0 {\n @at-root #{$hostContextSelectors} {\n @content;\n }\n }\n\n // Supported by all browsers.\n @if length($restSelectors) > 0 {\n @at-root #{$restSelectors} {\n @content;\n }\n }\n\n // If browser can support `:dir()`, then add the `:dir()` selectors.\n @supports selector(:dir(rtl)) {\n // Adding :dir() in case the browser doesn't support `:host-context()` and does support `:dir()`.\n // `:host-context()` is added:\n // - through the `add-root-selector()` function.\n // - first so that it takes precedence over `:dir()`.\n // For example,\n // - Firefox doesn't support `:host-context()`, but does support `:dir()`.\n // - Safari doesn't support `:host-context()`, but Safari 16.4+ supports `:dir()`\n // @link https://webkit.org/blog/13966/webkit-features-in-safari-16-4/\n // -- However, there is a Webkit bug on v16 that prevents `:dir()` from working when\n // -- the app direction is changed dynamically. v17+ works fine.\n // -- @link https://bugs.webkit.org/show_bug.cgi?id=257133\n\n // Supported by Firefox.\n @at-root #{add-root-selector($root, \":dir(rtl)\", false)} {\n @content;\n }\n }\n}\n\n@mixin ltr() {\n @content;\n}\n\n\n// SVG Background Image Mixin\n// @param {string} $svg\n// ----------------------------------------------------------\n@mixin svg-background-image($svg, $flip-rtl: false) {\n $url: url-encode($svg);\n $viewBox: str-split(str-extract($svg, \"viewBox='\", \"'\"), \" \");\n\n @if $flip-rtl != true or $viewBox == null {\n @include multi-dir() {\n background-image: url(\"data:image/svg+xml;charset=utf-8,#{$url}\");\n }\n } @else {\n $transform: \"transform='translate(#{nth($viewBox, 3)}, 0) scale(-1, 1)'\";\n $flipped-url: $svg;\n $flipped-url: str-replace($flipped-url, \"<path\", \"<path #{$transform}\");\n $flipped-url: str-replace($flipped-url, \"<line\", \"<line #{$transform}\");\n $flipped-url: str-replace($flipped-url, \"<polygon\", \"<polygon #{$transform}\");\n $flipped-url: url-encode($flipped-url);\n\n @include ltr () {\n background-image: url(\"data:image/svg+xml;charset=utf-8,#{$url}\");\n }\n @include rtl() {\n background-image: url(\"data:image/svg+xml;charset=utf-8,#{$flipped-url}\");\n }\n }\n}\n\n// Add property horizontal\n// @param {string} $start\n// @param {string} $end\n// ----------------------------------------------------------\n@mixin property-horizontal($prop, $start, $end: $start) {\n @if $start == 0 and $end == 0 {\n #{$prop}-left: $start;\n #{$prop}-right: $end;\n\n } @else {\n -webkit-#{$prop}-start: $start;\n #{$prop}-inline-start: $start;\n -webkit-#{$prop}-end: $end;\n #{$prop}-inline-end: $end;\n }\n}\n\n// Add property for all directions\n// @param {string} $prop\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// @param {boolean} $content include content or use default\n// ----------------------------------------------------------\n@mixin property($prop, $top, $end: $top, $bottom: $top, $start: $end) {\n @include property-horizontal($prop, $start, $end);\n #{$prop}-top: $top;\n #{$prop}-bottom: $bottom;\n}\n\n// Add padding horizontal\n// @param {string} $start\n// @param {string} $end\n// ----------------------------------------------------------\n@mixin padding-horizontal($start, $end: $start) {\n @include property-horizontal(padding, $start, $end);\n}\n\n// Add padding for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin padding($top, $end: $top, $bottom: $top, $start: $end) {\n @include property(padding, $top, $end, $bottom, $start);\n}\n\n// Add margin horizontal\n// @param {string} $start\n// @param {string} $end\n// ----------------------------------------------------------\n@mixin margin-horizontal($start, $end: $start) {\n @include property-horizontal(margin, $start, $end);\n}\n\n// Add margin for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin margin($top, $end: $top, $bottom: $top, $start: $end) {\n @include property(margin, $top, $end, $bottom, $start);\n}\n\n// Add position horizontal\n// @param {string} $start - amount to position start\n// @param {string} $end - amount to left: 0; end\n// ----------------------------------------------------------\n@mixin position-horizontal($start: null, $end: null) {\n @if $start == $end {\n @include multi-dir() {\n left: $start;\n right: $end;\n }\n } @else {\n @at-root {\n & {\n inset-inline-start: $start;\n inset-inline-end: $end;\n }\n }\n }\n}\n\n// Add position for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin position($top: null, $end: null, $bottom: null, $start: null) {\n @include position-horizontal($start, $end);\n top: $top;\n bottom: $bottom;\n}\n\n// Add border for all directions\n// @param {string} $top\n// @param {string} $end\n// @param {string} $bottom\n// @param {string} $start\n// ----------------------------------------------------------\n@mixin border($top, $end: $top, $bottom: $top, $start: $end) {\n @include property(border, $top, $end, $bottom, $start);\n}\n\n// Add border radius for all directions\n// @param {string} $top-start\n// @param {string} $top-end\n// @param {string} $bottom-end\n// @param {string} $bottom-start\n// ----------------------------------------------------------\n@mixin border-radius($top-start, $top-end: $top-start, $bottom-end: $top-start, $bottom-start: $top-end) {\n @if $top-start == $top-end and $top-start == $bottom-end and $top-start == $bottom-start {\n border-radius: $top-start;\n } @else {\n border-start-start-radius: $top-start;\n border-start-end-radius: $top-end;\n border-end-end-radius: $bottom-end;\n border-end-start-radius: $bottom-start;\n }\n}\n\n// Add direction for all directions\n// @param {string} $dir - Direction on LTR\n@mixin direction($dir) {\n $other-dir: null;\n\n @if $dir == ltr {\n $other-dir: rtl;\n } @else {\n $other-dir: ltr;\n }\n\n @include ltr() {\n direction: $dir;\n }\n @include rtl() {\n direction: $other-dir;\n }\n}\n\n// Add float for all directions\n// @param {string} $side\n// @param {string} $decorator - !important\n@mixin float($side, $decorator: null) {\n @if $side == start {\n @include ltr() {\n float: left $decorator;\n }\n @include rtl() {\n float: right $decorator;\n }\n } @else if $side == end {\n @include ltr() {\n float: right $decorator;\n }\n @include rtl() {\n float: left $decorator;\n }\n } @else {\n @include multi-dir() {\n float: $side $decorator;\n }\n }\n}\n\n@mixin background-position($horizontal, $horizontal-amount: null, $vertical: null, $vertical-amount: null) {\n @if $horizontal == start or $horizontal == end {\n $horizontal-ltr: null;\n $horizontal-rtl: null;\n @if $horizontal == start {\n $horizontal-ltr: left;\n $horizontal-rtl: right;\n } @else {\n $horizontal-ltr: right;\n $horizontal-rtl: left;\n }\n\n @include ltr() {\n background-position: $horizontal-ltr $horizontal-amount $vertical $vertical-amount;\n }\n @include rtl() {\n background-position: $horizontal-rtl $horizontal-amount $vertical $vertical-amount;\n }\n } @else {\n @include multi-dir() {\n background-position: $horizontal $horizontal-amount $vertical $vertical-amount;\n }\n }\n}\n\n@mixin transform-origin($x-axis, $y-axis: null) {\n @if $x-axis == start {\n @include ltr() {\n transform-origin: left $y-axis;\n }\n @include rtl() {\n transform-origin: right $y-axis;\n }\n } @else if $x-axis == end {\n @include ltr() {\n transform-origin: right $y-axis;\n }\n @include rtl() {\n transform-origin: left $y-axis;\n }\n } @else if $x-axis == left or $x-axis == right {\n @include multi-dir() {\n transform-origin: $x-axis $y-axis;\n }\n } @else {\n @include ltr() {\n transform-origin: $x-axis $y-axis;\n }\n @include rtl() {\n transform-origin: calc(100% - #{$x-axis}) $y-axis;\n }\n }\n}\n\n// Add transform for all directions\n// @param {string} $transforms - comma separated list of transforms\n@mixin transform($transforms...) {\n $extra: null;\n\n $x: null;\n $ltr-translate: null;\n $rtl-translate: null;\n\n @each $transform in $transforms {\n @if (str-index($transform, translate3d)) {\n $transform: str-replace($transform, 'translate3d(');\n $transform: str-replace($transform, ')');\n\n $coordinates: str-split($transform, ',');\n\n $x: nth($coordinates, 1);\n $y: nth($coordinates, 2);\n $z: nth($coordinates, 3);\n\n $ltr-translate: translate3d($x, $y, $z);\n $rtl-translate: translate3d(calc(-1 * #{$x}), $y, $z);\n } @else {\n @if $extra == null {\n $extra: $transform;\n } @else {\n $extra: $extra $transform;\n }\n }\n }\n\n @if $x == '0' or $x == null {\n @include multi-dir() {\n transform: $ltr-translate $extra;\n }\n } @else {\n @include ltr() {\n transform: $ltr-translate $extra;\n }\n\n @include rtl() {\n transform: $rtl-translate $extra;\n }\n }\n}\n","// Global stylesheet: `:host-context()` never matches outside a shadow root\n$rtl-use-host-context: false;\n\n@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Float Elements\n// --------------------------------------------------\n// Creates float classes based on screen size\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `.ion-float-{bp}-{side}` classes for floating the element based\n // on the breakpoint and side\n .ion-float#{$infix}-left {\n @include float(left, !important);\n }\n\n .ion-float#{$infix}-right {\n @include float(right, !important);\n }\n\n .ion-float#{$infix}-start {\n @include float(start, !important);\n }\n\n .ion-float#{$infix}-end {\n @include float(end, !important);\n }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Text Alignment\n// --------------------------------------------------\n// Creates text alignment attributes based on screen size\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `.ion-text-{bp}` classes for aligning the text based\n // on the breakpoint\n .ion-text#{$infix}-center {\n text-align: center !important;\n }\n\n .ion-text#{$infix}-justify {\n text-align: justify !important;\n }\n\n .ion-text#{$infix}-start {\n text-align: start !important;\n }\n\n .ion-text#{$infix}-end {\n text-align: end !important;\n }\n\n .ion-text#{$infix}-left {\n text-align: left !important;\n }\n\n .ion-text#{$infix}-right {\n text-align: right !important;\n }\n\n .ion-text#{$infix}-nowrap {\n white-space: nowrap !important;\n }\n\n .ion-text#{$infix}-wrap {\n white-space: normal !important;\n }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Text Transformation\n// --------------------------------------------------\n// Creates text transform attributes based on screen size\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `.ion-text-{bp}` classes for transforming the text based\n // on the breakpoint\n .ion-text#{$infix}-uppercase {\n /* stylelint-disable-next-line declaration-no-important */\n text-transform: uppercase !important;\n }\n\n .ion-text#{$infix}-lowercase {\n /* stylelint-disable-next-line declaration-no-important */\n text-transform: lowercase !important;\n }\n\n .ion-text#{$infix}-capitalize {\n /* stylelint-disable-next-line declaration-no-important */\n text-transform: capitalize !important;\n }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Flex Utilities\n// ------------------------------------------------------------------\n// Provides utility classes to control flexbox layout, alignment,\n// and sizing of elements. Includes responsive variants for managing\n// flex direction, alignment, justification, wrapping, growth,\n// shrinking, and ordering at different breakpoints.\n\n// Align Content\n// ------------------------------------------------------------------\n\n$align-content-values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n stretch: stretch\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $key, $value in $align-content-values {\n .ion-align-content#{$infix}-#{$key} {\n align-content: #{$value} !important;\n }\n }\n }\n}\n\n// Align Items\n// ------------------------------------------------------------------\n\n$align-items-values: (\n start,\n end,\n center,\n stretch,\n baseline\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $align-items-values {\n .ion-align-items#{$infix}-#{$value} {\n align-items: #{$value} !important;\n }\n }\n }\n}\n\n// Align Self\n// ------------------------------------------------------------------\n\n$align-self-values: (\n start,\n end,\n center,\n stretch,\n baseline,\n auto\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $align-self-values {\n .ion-align-self#{$infix}-#{$value} {\n align-self: #{$value} !important;\n }\n }\n }\n}\n\n// Justify Content\n// ------------------------------------------------------------------\n\n$justify-content-values: (\n start: flex-start,\n end: flex-end,\n center: center,\n between: space-between,\n around: space-around,\n evenly: space-evenly\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $key, $value in $justify-content-values {\n .ion-justify-content#{$infix}-#{$key} {\n justify-content: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Direction\n// ------------------------------------------------------------------\n\n$flex-direction-values: (\n row,\n row-reverse,\n column,\n column-reverse\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $flex-direction-values {\n .ion-flex#{$infix}-#{$value} {\n flex-direction: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Wrap\n// ------------------------------------------------------------------\n\n$flex-wrap-values: (\n wrap,\n nowrap,\n wrap-reverse\n);\n\n@each $value in $flex-wrap-values {\n // TODO(FW-6697): remove ion-wrap, ion-nowrap, ion-wrap-reverse\n // in favor of the new ion-flex-wrap, ion-flex-nowrap, and\n // ion-flex-wrap-reverse classes\n .ion-#{$value} {\n flex-wrap: #{$value} !important;\n }\n}\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $flex-wrap-values {\n .ion-flex#{$infix}-#{$value} {\n flex-wrap: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Fill\n// ------------------------------------------------------------------\n\n$flex-fill-values: (\n 1,\n auto,\n initial,\n none\n);\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n @each $value in $flex-fill-values {\n .ion-flex#{$infix}-#{$value} {\n flex: #{$value} !important;\n }\n }\n }\n}\n\n// Flex Grow and Shrink\n// ------------------------------------------------------------------\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n .ion-flex#{$infix}-grow-0 {\n flex-grow: 0 !important;\n }\n\n .ion-flex#{$infix}-grow-1 {\n flex-grow: 1 !important;\n }\n\n .ion-flex#{$infix}-shrink-0 {\n flex-shrink: 0 !important;\n }\n\n .ion-flex#{$infix}-shrink-1 {\n flex-shrink: 1 !important;\n }\n }\n}\n\n// Flex Order\n// ------------------------------------------------------------------\n\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n .ion-order#{$infix}-first { order: -1 !important; }\n\n @for $i from 0 through 12 {\n .ion-order#{$infix}-#{$i} { order: #{$i} !important; }\n }\n\n .ion-order#{$infix}-last { order: 13 !important; }\n }\n}\n","@import \"../themes/ionic.globals\";\n@import \"../themes/ionic.mixins\";\n\n// Display\n// ------------------------------------------------------------------\n// Provides utility classes to control the CSS display property\n// of elements. Includes responsive variants for toggling between\n// block, inline, flex, grid, and other display values at different\n// breakpoints.\n\n// TODO(FW-6697): remove ion-hide-* classes in favor of the new\n// ion-display-* classes\n.ion-hide {\n display: none !important;\n}\n\n// Adds hidden classes\n@each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n // Provide `ion-hide-{bp}-up` classes for hiding the element based\n // on the breakpoint\n .ion-hide#{$infix}-up {\n display: none !important;\n }\n }\n\n @include media-breakpoint-down($breakpoint, $screen-breakpoints) {\n // Provide `ion-hide-{bp}-down` classes for hiding the element based\n // on the breakpoint\n .ion-hide#{$infix}-down {\n display: none !important;\n }\n }\n}\n\n$display-values: (\n none,\n inline,\n inline-block,\n block,\n flex,\n inline-flex,\n grid,\n inline-grid,\n table,\n table-cell,\n table-row\n);\n\n@each $display in $display-values {\n @each $breakpoint in map-keys($screen-breakpoints) {\n $infix: breakpoint-infix($breakpoint, $screen-breakpoints);\n\n @include media-breakpoint-up($breakpoint, $screen-breakpoints) {\n .ion-display#{$infix}-#{$display} {\n display: #{$display} !important;\n }\n }\n }\n}\n"]}
|
|
@@ -16,6 +16,7 @@ export declare abstract class IonRouterOutlet implements OnDestroy, OnInit {
|
|
|
16
16
|
private proxyMap;
|
|
17
17
|
private currentActivatedRoute$;
|
|
18
18
|
private activated;
|
|
19
|
+
private unbindParentLifecycle?;
|
|
19
20
|
/** @internal */
|
|
20
21
|
get activatedComponentRef(): ComponentRef<any> | null;
|
|
21
22
|
private _activatedRoute;
|
|
@@ -45,6 +46,17 @@ export declare abstract class IonRouterOutlet implements OnDestroy, OnInit {
|
|
|
45
46
|
getContext(): OutletContext | null;
|
|
46
47
|
ngOnInit(): void;
|
|
47
48
|
private initializeOutletWithName;
|
|
49
|
+
/**
|
|
50
|
+
* Core doesn't bubble lifecycle events, so forward the ones on the page
|
|
51
|
+
* hosting this outlet (such as a page containing `ion-tabs`) to the page
|
|
52
|
+
* active in this outlet. Enter events only go to a page that left with the
|
|
53
|
+
* parent page.
|
|
54
|
+
*/
|
|
55
|
+
private bindParentLifecycle;
|
|
56
|
+
/**
|
|
57
|
+
* The page in the parent outlet that contains this outlet, if any.
|
|
58
|
+
*/
|
|
59
|
+
private getParentPageElement;
|
|
48
60
|
get isActivated(): boolean;
|
|
49
61
|
get component(): Record<string, unknown>;
|
|
50
62
|
get activatedRoute(): ActivatedRoute;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ViewContainerRef, inject, Attribute, Directive, EventEmitter, Optional, Output, SkipSelf, EnvironmentInjector, Input, InjectionToken, Injectable, reflectComponentType, } from '@angular/core';
|
|
2
2
|
import { Router, ActivatedRoute, ChildrenOutletContexts, PRIMARY_OUTLET } from '@angular/router';
|
|
3
|
-
import { componentOnReady } from '@ionic/core/components';
|
|
3
|
+
import { LIFECYCLE_DID_ENTER, LIFECYCLE_DID_LEAVE, LIFECYCLE_WILL_ENTER, LIFECYCLE_WILL_LEAVE, componentOnReady, } from '@ionic/core/components';
|
|
4
4
|
import { BehaviorSubject, combineLatest, of } from 'rxjs';
|
|
5
5
|
import { distinctUntilChanged, filter, switchMap } from 'rxjs/operators';
|
|
6
6
|
import { Config } from '../../providers/config';
|
|
@@ -10,6 +10,24 @@ import { getUrl, isTabSwitch } from './stack-utils';
|
|
|
10
10
|
import * as i0 from "@angular/core";
|
|
11
11
|
import * as i1 from "@angular/common";
|
|
12
12
|
import * as i2 from "@angular/router";
|
|
13
|
+
/**
|
|
14
|
+
* A page that left along with its parent page is still the active view of its
|
|
15
|
+
* outlet. If the user comes back to a different page in that outlet, the
|
|
16
|
+
* outlet's own transition fires leave on it a second time, so swallow leave
|
|
17
|
+
* events on it until it enters again. Unblock on `ionViewDidEnter`, since a
|
|
18
|
+
* cancelled swipe back only fires `ionViewWillEnter`.
|
|
19
|
+
*/
|
|
20
|
+
const blockRepeatLeave = (pageEl) => {
|
|
21
|
+
// Capture so this runs before the page's own lifecycle listeners.
|
|
22
|
+
const block = (ev) => ev.stopImmediatePropagation();
|
|
23
|
+
const unblock = () => {
|
|
24
|
+
pageEl.removeEventListener(LIFECYCLE_WILL_LEAVE, block, true);
|
|
25
|
+
pageEl.removeEventListener(LIFECYCLE_DID_LEAVE, block, true);
|
|
26
|
+
};
|
|
27
|
+
pageEl.addEventListener(LIFECYCLE_WILL_LEAVE, block, true);
|
|
28
|
+
pageEl.addEventListener(LIFECYCLE_DID_LEAVE, block, true);
|
|
29
|
+
pageEl.addEventListener(LIFECYCLE_DID_ENTER, unblock, { capture: true, once: true });
|
|
30
|
+
};
|
|
13
31
|
// TODO(FW-2827): types
|
|
14
32
|
export class IonRouterOutlet {
|
|
15
33
|
parentOutlet;
|
|
@@ -23,6 +41,7 @@ export class IonRouterOutlet {
|
|
|
23
41
|
// Keep the latest activated route in a subject for the proxy routes to switch map to
|
|
24
42
|
currentActivatedRoute$ = new BehaviorSubject(null);
|
|
25
43
|
activated = null;
|
|
44
|
+
unbindParentLifecycle;
|
|
26
45
|
/** @internal */
|
|
27
46
|
get activatedComponentRef() {
|
|
28
47
|
return this.activated;
|
|
@@ -75,6 +94,7 @@ export class IonRouterOutlet {
|
|
|
75
94
|
this.parentContexts.onChildOutletCreated(this.name, this);
|
|
76
95
|
}
|
|
77
96
|
ngOnDestroy() {
|
|
97
|
+
this.unbindParentLifecycle?.();
|
|
78
98
|
this.stackCtrl.destroy();
|
|
79
99
|
this.inputBinder?.unsubscribeFromRouteData(this);
|
|
80
100
|
}
|
|
@@ -83,6 +103,7 @@ export class IonRouterOutlet {
|
|
|
83
103
|
}
|
|
84
104
|
ngOnInit() {
|
|
85
105
|
this.initializeOutletWithName();
|
|
106
|
+
this.bindParentLifecycle();
|
|
86
107
|
}
|
|
87
108
|
// Note: Ionic deviates from the Angular Router implementation here
|
|
88
109
|
initializeOutletWithName() {
|
|
@@ -100,6 +121,95 @@ export class IonRouterOutlet {
|
|
|
100
121
|
}
|
|
101
122
|
});
|
|
102
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Core doesn't bubble lifecycle events, so forward the ones on the page
|
|
126
|
+
* hosting this outlet (such as a page containing `ion-tabs`) to the page
|
|
127
|
+
* active in this outlet. Enter events only go to a page that left with the
|
|
128
|
+
* parent page.
|
|
129
|
+
*/
|
|
130
|
+
bindParentLifecycle() {
|
|
131
|
+
const parentPageEl = this.getParentPageElement();
|
|
132
|
+
if (!parentPageEl) {
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
let leftWithParent;
|
|
136
|
+
/**
|
|
137
|
+
* Apps using the workaround from
|
|
138
|
+
* https://github.com/ionic-team/ionic-framework/issues/16834 already
|
|
139
|
+
* re-dispatch the parent's lifecycle events onto the active tab, so track
|
|
140
|
+
* whether the active page got the event to avoid firing it twice.
|
|
141
|
+
*/
|
|
142
|
+
let parentEventType;
|
|
143
|
+
let activeViewReceived = false;
|
|
144
|
+
const onParentEventStart = (ev) => {
|
|
145
|
+
if (ev.target === parentPageEl) {
|
|
146
|
+
parentEventType = ev.type;
|
|
147
|
+
activeViewReceived = false;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const onOutletEvent = (ev) => {
|
|
151
|
+
if (ev.type === parentEventType && ev.target === this.stackCtrl.getActiveView()?.element) {
|
|
152
|
+
activeViewReceived = true;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
const forward = (ev) => {
|
|
156
|
+
const alreadyReceived = activeViewReceived;
|
|
157
|
+
parentEventType = undefined;
|
|
158
|
+
activeViewReceived = false;
|
|
159
|
+
const activeView = this.stackCtrl.getActiveView();
|
|
160
|
+
if (!activeView) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const isEnter = ev.type === LIFECYCLE_WILL_ENTER || ev.type === LIFECYCLE_DID_ENTER;
|
|
164
|
+
if (isEnter && activeView !== leftWithParent) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
if (!alreadyReceived) {
|
|
168
|
+
activeView.element.dispatchEvent(new CustomEvent(ev.type, { bubbles: false, cancelable: false }));
|
|
169
|
+
}
|
|
170
|
+
if (ev.type === LIFECYCLE_DID_LEAVE) {
|
|
171
|
+
leftWithParent = activeView;
|
|
172
|
+
blockRepeatLeave(activeView.element);
|
|
173
|
+
}
|
|
174
|
+
else if (ev.type === LIFECYCLE_DID_ENTER) {
|
|
175
|
+
leftWithParent = undefined;
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Capture listeners see the event before the parent page's own hooks run,
|
|
180
|
+
* and see events dispatched on pages in this outlet even though they
|
|
181
|
+
* don't bubble. The bubble-phase `forward` listener runs after the parent
|
|
182
|
+
* page's own hooks because those are bound when the page is created,
|
|
183
|
+
* before this outlet inits.
|
|
184
|
+
*/
|
|
185
|
+
const events = [LIFECYCLE_WILL_ENTER, LIFECYCLE_DID_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_LEAVE];
|
|
186
|
+
events.forEach((eventName) => {
|
|
187
|
+
parentPageEl.addEventListener(eventName, onParentEventStart, true);
|
|
188
|
+
parentPageEl.addEventListener(eventName, forward);
|
|
189
|
+
this.nativeEl.addEventListener(eventName, onOutletEvent, true);
|
|
190
|
+
});
|
|
191
|
+
this.unbindParentLifecycle = () => {
|
|
192
|
+
events.forEach((eventName) => {
|
|
193
|
+
parentPageEl.removeEventListener(eventName, onParentEventStart, true);
|
|
194
|
+
parentPageEl.removeEventListener(eventName, forward);
|
|
195
|
+
this.nativeEl.removeEventListener(eventName, onOutletEvent, true);
|
|
196
|
+
});
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* The page in the parent outlet that contains this outlet, if any.
|
|
201
|
+
*/
|
|
202
|
+
getParentPageElement() {
|
|
203
|
+
const parentOutletEl = this.parentOutlet?.nativeEl;
|
|
204
|
+
if (!parentOutletEl) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
let el = this.nativeEl;
|
|
208
|
+
while (el && el.parentElement !== parentOutletEl) {
|
|
209
|
+
el = el.parentElement;
|
|
210
|
+
}
|
|
211
|
+
return el ?? undefined;
|
|
212
|
+
}
|
|
103
213
|
get isActivated() {
|
|
104
214
|
return !!this.activated;
|
|
105
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router-outlet.js","sourceRoot":"","sources":["../../../../src/common/directives/navigation/router-outlet.ts"],"names":[],"mappings":"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","sourcesContent":["import { Location } from '@angular/common';\nimport {\n ComponentRef,\n ElementRef,\n Injector,\n NgZone,\n OnDestroy,\n OnInit,\n ViewContainerRef,\n inject,\n Attribute,\n Directive,\n EventEmitter,\n Optional,\n Output,\n SkipSelf,\n EnvironmentInjector,\n Input,\n InjectionToken,\n Injectable,\n reflectComponentType,\n} from '@angular/core';\nimport type { Provider } from '@angular/core';\nimport { OutletContext, Router, ActivatedRoute, ChildrenOutletContexts, PRIMARY_OUTLET, Data } from '@angular/router';\nimport { componentOnReady } from '@ionic/core/components';\nimport type { AnimationBuilder } from '@ionic/core/components';\nimport { Observable, BehaviorSubject, Subscription, combineLatest, of } from 'rxjs';\nimport { distinctUntilChanged, filter, switchMap } from 'rxjs/operators';\n\nimport { Config } from '../../providers/config';\nimport { NavController } from '../../providers/nav-controller';\n\nimport { StackController } from './stack-controller';\nimport { RouteView, StackDidChangeEvent, StackWillChangeEvent, getUrl, isTabSwitch } from './stack-utils';\n\n// TODO(FW-2827): types\n\n@Directive({\n selector: 'ion-router-outlet',\n exportAs: 'outlet',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['animated', 'animation', 'mode', 'swipeGesture'],\n})\nexport abstract class IonRouterOutlet implements OnDestroy, OnInit {\n abstract outletContent: any;\n\n nativeEl: HTMLIonRouterOutletElement;\n activatedView: RouteView | null = null;\n tabsPrefix: string | undefined;\n\n private _swipeGesture?: boolean;\n private stackCtrl: StackController;\n\n // Maintain map of activated route proxies for each component instance\n private proxyMap = new WeakMap<any, ActivatedRoute>();\n // Keep the latest activated route in a subject for the proxy routes to switch map to\n private currentActivatedRoute$ = new BehaviorSubject<{ component: any; activatedRoute: ActivatedRoute } | null>(null);\n\n private activated: ComponentRef<any> | null = null;\n /** @internal */\n get activatedComponentRef(): ComponentRef<any> | null {\n return this.activated;\n }\n private _activatedRoute: ActivatedRoute | null = null;\n\n /**\n * The name of the outlet\n */\n @Input() name = PRIMARY_OUTLET;\n\n /** @internal */\n @Output() stackWillChange = new EventEmitter<StackWillChangeEvent>();\n /** @internal */\n @Output() stackDidChange = new EventEmitter<StackDidChangeEvent>();\n\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('activate') activateEvents = new EventEmitter<any>();\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('deactivate') deactivateEvents = new EventEmitter<any>();\n\n private parentContexts = inject(ChildrenOutletContexts);\n private location = inject(ViewContainerRef);\n private environmentInjector = inject(EnvironmentInjector);\n private inputBinder = inject(INPUT_BINDER, { optional: true });\n /** @nodoc */\n readonly supportsBindingToComponentInputs = true;\n\n // Ionic providers\n private config = inject(Config);\n private navCtrl = inject(NavController);\n\n set animation(animation: AnimationBuilder) {\n this.nativeEl.animation = animation;\n }\n\n set animated(animated: boolean) {\n this.nativeEl.animated = animated;\n }\n\n set swipeGesture(swipe: boolean) {\n this._swipeGesture = swipe;\n\n this.nativeEl.swipeHandler = swipe\n ? {\n canStart: () => this.stackCtrl.canGoBack(1) && !this.stackCtrl.hasRunningTask(),\n onStart: () => this.stackCtrl.startBackTransition(),\n onEnd: (shouldContinue) => this.stackCtrl.endBackTransition(shouldContinue),\n }\n : undefined;\n\n this.nativeEl.swipeGesture = swipe;\n }\n\n constructor(\n @Attribute('name') name: string,\n @Optional() @Attribute('tabs') tabs: string,\n commonLocation: Location,\n elementRef: ElementRef,\n router: Router,\n zone: NgZone,\n activatedRoute: ActivatedRoute,\n @SkipSelf() @Optional() readonly parentOutlet?: IonRouterOutlet\n ) {\n this.nativeEl = elementRef.nativeElement;\n this.name = name || PRIMARY_OUTLET;\n this.tabsPrefix = tabs === 'true' ? getUrl(router, activatedRoute) : undefined;\n this.stackCtrl = new StackController(this.tabsPrefix, this.nativeEl, router, this.navCtrl, zone, commonLocation);\n this.parentContexts.onChildOutletCreated(this.name, this as any);\n }\n\n ngOnDestroy(): void {\n this.stackCtrl.destroy();\n this.inputBinder?.unsubscribeFromRouteData(this);\n }\n\n getContext(): OutletContext | null {\n return this.parentContexts.getContext(this.name);\n }\n\n ngOnInit(): void {\n this.initializeOutletWithName();\n }\n\n // Note: Ionic deviates from the Angular Router implementation here\n private initializeOutletWithName() {\n if (!this.activated) {\n // If the outlet was not instantiated at the time the route got activated we need to populate\n // the outlet when it is initialized (ie inside a NgIf)\n const context = this.getContext();\n if (context?.route) {\n this.activateWith(context.route, context.injector);\n }\n }\n\n new Promise((resolve) => componentOnReady(this.nativeEl, resolve)).then(() => {\n if (this._swipeGesture === undefined) {\n this.swipeGesture = this.config.getBoolean('swipeBackEnabled', (this.nativeEl as any).mode === 'ios');\n }\n });\n }\n\n get isActivated(): boolean {\n return !!this.activated;\n }\n\n get component(): Record<string, unknown> {\n if (!this.activated) {\n throw new Error('Outlet is not activated');\n }\n return this.activated.instance;\n }\n\n get activatedRoute(): ActivatedRoute {\n if (!this.activated) {\n throw new Error('Outlet is not activated');\n }\n return this._activatedRoute as ActivatedRoute;\n }\n\n get activatedRouteData(): Data {\n if (this._activatedRoute) {\n return this._activatedRoute.snapshot.data;\n }\n return {};\n }\n\n /**\n * Called when the `RouteReuseStrategy` instructs to detach the subtree\n */\n detach(): ComponentRef<any> {\n throw new Error('incompatible reuse strategy');\n }\n\n /**\n * Called when the `RouteReuseStrategy` instructs to re-attach a previously detached subtree\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n attach(_ref: ComponentRef<any>, _activatedRoute: ActivatedRoute): void {\n throw new Error('incompatible reuse strategy');\n }\n\n deactivate(): void {\n if (this.activated) {\n if (this.activatedView) {\n const context = this.getContext()!;\n this.activatedView.savedData = new Map(context.children['contexts']);\n\n /**\n * Angular v11.2.10 introduced a change\n * where this route context is cleared out when\n * a router-outlet is deactivated, However,\n * we need this route information in order to\n * return a user back to the correct tab when\n * leaving and then going back to the tab context.\n */\n const primaryOutlet = this.activatedView.savedData.get('primary');\n if (primaryOutlet && context.route) {\n primaryOutlet.route = { ...context.route };\n }\n\n /**\n * Ensure we are saving the NavigationExtras\n * data otherwise it will be lost\n */\n this.activatedView.savedExtras = {};\n if (context.route) {\n const contextSnapshot = context.route.snapshot;\n\n this.activatedView.savedExtras.queryParams = contextSnapshot.queryParams;\n (this.activatedView.savedExtras.fragment as string | null) = contextSnapshot.fragment;\n }\n }\n const c = this.component;\n this.activatedView = null;\n this.activated = null;\n this._activatedRoute = null;\n this.deactivateEvents.emit(c);\n }\n }\n\n activateWith(activatedRoute: ActivatedRoute, environmentInjector: EnvironmentInjector | null): void {\n if (this.isActivated) {\n throw new Error('Cannot activate an already activated outlet');\n }\n this._activatedRoute = activatedRoute;\n\n let cmpRef: any;\n let enteringView = this.stackCtrl.getExistingView(activatedRoute);\n if (enteringView) {\n cmpRef = this.activated = enteringView.ref;\n const saved = enteringView.savedData;\n if (saved) {\n // self-restore\n const context = this.getContext()!;\n context.children['contexts'] = saved;\n }\n // Updated activated route proxy for this component\n this.updateActivatedRouteProxy(cmpRef.instance, activatedRoute);\n } else {\n const snapshot = (activatedRoute as any)._futureSnapshot;\n\n /**\n * Angular 14 introduces a new `loadComponent` property to the route config.\n * This function will assign a `component` property to the route snapshot.\n * We check for the presence of this property to determine if the route is\n * using standalone components.\n */\n const childContexts = this.parentContexts.getOrCreateContext(this.name).children;\n\n // We create an activated route proxy object that will maintain future updates for this component\n // over its lifecycle in the stack.\n const component$ = new BehaviorSubject<any>(null);\n const activatedRouteProxy = this.createActivatedRouteProxy(component$, activatedRoute);\n\n const injector = new OutletInjector(activatedRouteProxy, childContexts, this.location.injector);\n\n const component = snapshot.routeConfig!.component ?? snapshot.component;\n\n /**\n * View components need to be added as a child of ion-router-outlet\n * for page transitions and swipe to go back.\n * However, createComponent mounts components as siblings of the\n * ViewContainerRef. As a result, outletContent must reference\n * an ng-container inside of ion-router-outlet and not\n * ion-router-outlet itself.\n */\n cmpRef = this.activated = this.outletContent.createComponent(component, {\n index: this.outletContent.length,\n injector,\n environmentInjector: environmentInjector ?? this.environmentInjector,\n });\n\n // Once the component is created we can push it to our local subject supplied to the proxy\n component$.next(cmpRef.instance);\n\n // Calling `markForCheck` to make sure we will run the change detection when the\n // `RouterOutlet` is inside a `ChangeDetectionStrategy.OnPush` component.\n\n /**\n * At this point this.activated has been set earlier\n * in this function, so it is guaranteed to be non-null.\n */\n enteringView = this.stackCtrl.createView(this.activated!, activatedRoute);\n\n // Store references to the proxy by component\n this.proxyMap.set(cmpRef.instance, activatedRouteProxy);\n this.currentActivatedRoute$.next({ component: cmpRef.instance, activatedRoute });\n }\n\n this.inputBinder?.bindActivatedRouteToOutletComponent(this);\n\n this.activatedView = enteringView;\n\n /**\n * The top outlet is set prior to the entering view's transition completing,\n * so that when we have nested outlets (e.g. ion-tabs inside an ion-router-outlet),\n * the tabs outlet will be assigned as the top outlet when a view inside tabs is\n * activated.\n *\n * In this scenario, activeWith is called for both the tabs and the root router outlet.\n * To avoid a race condition, we assign the top outlet synchronously.\n */\n this.navCtrl.setTopOutlet(this);\n\n const leavingView = this.stackCtrl.getActiveView();\n\n this.stackWillChange.emit({\n enteringView,\n tabSwitch: isTabSwitch(enteringView, leavingView),\n });\n\n this.stackCtrl.setActive(enteringView).then((data) => {\n this.activateEvents.emit(cmpRef.instance);\n this.stackDidChange.emit(data);\n });\n }\n\n /**\n * Returns `true` if there are pages in the stack to go back.\n */\n canGoBack(deep = 1, stackId?: string): boolean {\n return this.stackCtrl.canGoBack(deep, stackId);\n }\n\n /**\n * Resolves to `true` if it the outlet was able to sucessfully pop the last N pages.\n */\n pop(deep = 1, stackId?: string): Promise<boolean> {\n return this.stackCtrl.pop(deep, stackId);\n }\n\n /**\n * Returns the URL of the active page of each stack.\n */\n getLastUrl(stackId?: string): string | undefined {\n const active = this.stackCtrl.getLastUrl(stackId);\n return active ? active.url : undefined;\n }\n\n /**\n * Returns the RouteView of the active page of each stack.\n * @internal\n */\n getLastRouteView(stackId?: string): RouteView | undefined {\n return this.stackCtrl.getLastUrl(stackId);\n }\n\n /**\n * Returns the root view in the tab stack.\n * @internal\n */\n getRootView(stackId?: string): RouteView | undefined {\n return this.stackCtrl.getRootUrl(stackId);\n }\n\n /**\n * Returns the active stack ID. In the context of ion-tabs, it means the active tab.\n */\n getActiveStackId(): string | undefined {\n return this.stackCtrl.getActiveStackId();\n }\n\n /**\n * Since the activated route can change over the life time of a component in an ion router outlet, we create\n * a proxy so that we can update the values over time as a user navigates back to components already in the stack.\n */\n private createActivatedRouteProxy(component$: Observable<any>, activatedRoute: ActivatedRoute): ActivatedRoute {\n const proxy: any = new ActivatedRoute();\n\n proxy._futureSnapshot = (activatedRoute as any)._futureSnapshot;\n proxy._routerState = (activatedRoute as any)._routerState;\n proxy.snapshot = activatedRoute.snapshot;\n proxy.outlet = activatedRoute.outlet;\n proxy.component = activatedRoute.component;\n\n // Setup wrappers for the observables so consumers don't have to worry about switching to new observables as the state updates\n (proxy as any)._paramMap = this.proxyObservable(component$, 'paramMap');\n (proxy as any)._queryParamMap = this.proxyObservable(component$, 'queryParamMap');\n proxy.url = this.proxyObservable(component$, 'url');\n proxy.params = this.proxyObservable(component$, 'params');\n proxy.queryParams = this.proxyObservable(component$, 'queryParams');\n proxy.fragment = this.proxyObservable(component$, 'fragment');\n proxy.data = this.proxyObservable(component$, 'data');\n\n return proxy as ActivatedRoute;\n }\n\n /**\n * Create a wrapped observable that will switch to the latest activated route matched by the given component\n */\n private proxyObservable(component$: Observable<any>, path: string): Observable<any> {\n return component$.pipe(\n // First wait until the component instance is pushed\n filter((component) => !!component),\n switchMap((component) =>\n this.currentActivatedRoute$.pipe(\n filter((current) => current !== null && current.component === component),\n switchMap((current) => current && (current.activatedRoute as any)[path]),\n distinctUntilChanged()\n )\n )\n );\n }\n\n /**\n * Updates the activated route proxy for the given component to the new incoming router state\n */\n private updateActivatedRouteProxy(component: any, activatedRoute: ActivatedRoute): void {\n const proxy = this.proxyMap.get(component);\n if (!proxy) {\n throw new Error(`Could not find activated route proxy for view`);\n }\n\n (proxy as any)._futureSnapshot = (activatedRoute as any)._futureSnapshot;\n (proxy as any)._routerState = (activatedRoute as any)._routerState;\n proxy.snapshot = activatedRoute.snapshot;\n proxy.outlet = activatedRoute.outlet;\n proxy.component = activatedRoute.component;\n\n this.currentActivatedRoute$.next({ component, activatedRoute });\n }\n}\n\nclass OutletInjector implements Injector {\n constructor(private route: ActivatedRoute, private childContexts: ChildrenOutletContexts, private parent: Injector) {}\n\n get(token: any, notFoundValue?: any): any {\n if (token === ActivatedRoute) {\n return this.route;\n }\n\n if (token === ChildrenOutletContexts) {\n return this.childContexts;\n }\n\n return this.parent.get(token, notFoundValue);\n }\n}\n\n// TODO: FW-4785 - Remove this once Angular 15 support is dropped\nconst INPUT_BINDER = new InjectionToken<RoutedComponentInputBinder>('');\n\n/**\n * Injectable used as a tree-shakable provider for opting in to binding router data to component\n * inputs.\n *\n * The RouterOutlet registers itself with this service when an `ActivatedRoute` is attached or\n * activated. When this happens, the service subscribes to the `ActivatedRoute` observables (params,\n * queryParams, data) and sets the inputs of the component using `ComponentRef.setInput`.\n * Importantly, when an input does not have an item in the route data with a matching key, this\n * input is set to `undefined`. If it were not done this way, the previous information would be\n * retained if the data got removed from the route (i.e. if a query parameter is removed).\n *\n * The `RouterOutlet` should unregister itself when destroyed via `unsubscribeFromRouteData` so that\n * the subscriptions are cleaned up.\n */\n@Injectable()\nclass RoutedComponentInputBinder {\n private outletDataSubscriptions = new Map<IonRouterOutlet, Subscription>();\n\n bindActivatedRouteToOutletComponent(outlet: IonRouterOutlet): void {\n this.unsubscribeFromRouteData(outlet);\n this.subscribeToRouteData(outlet);\n }\n\n unsubscribeFromRouteData(outlet: IonRouterOutlet): void {\n this.outletDataSubscriptions.get(outlet)?.unsubscribe();\n this.outletDataSubscriptions.delete(outlet);\n }\n\n private subscribeToRouteData(outlet: IonRouterOutlet) {\n const { activatedRoute } = outlet;\n const dataSubscription = combineLatest([activatedRoute.queryParams, activatedRoute.params, activatedRoute.data])\n .pipe(\n switchMap(([queryParams, params, data], index) => {\n data = { ...queryParams, ...params, ...data };\n // Get the first result from the data subscription synchronously so it's available to\n // the component as soon as possible (and doesn't require a second change detection).\n if (index === 0) {\n return of(data);\n }\n // Promise.resolve is used to avoid synchronously writing the wrong data when\n // two of the Observables in the `combineLatest` stream emit one after\n // another.\n return Promise.resolve(data);\n })\n )\n .subscribe((data) => {\n // Outlet may have been deactivated or changed names to be associated with a different\n // route\n if (\n !outlet.isActivated ||\n !outlet.activatedComponentRef ||\n outlet.activatedRoute !== activatedRoute ||\n activatedRoute.component === null\n ) {\n this.unsubscribeFromRouteData(outlet);\n return;\n }\n\n const mirror = reflectComponentType(activatedRoute.component);\n if (!mirror) {\n this.unsubscribeFromRouteData(outlet);\n return;\n }\n\n for (const { templateName } of mirror.inputs) {\n outlet.activatedComponentRef.setInput(templateName, data[templateName]);\n }\n });\n\n this.outletDataSubscriptions.set(outlet, dataSubscription);\n }\n}\n\nexport const provideComponentInputBinding = (): Provider => {\n return {\n provide: INPUT_BINDER,\n useFactory: componentInputBindingFactory,\n deps: [Router],\n };\n};\n\nfunction componentInputBindingFactory(router?: Router) {\n /**\n * We cast the router to any here, since the componentInputBindingEnabled\n * property is not available until Angular v16.\n */\n if ((router as any)?.componentInputBindingEnabled) {\n return new RoutedComponentInputBinder();\n }\n return null;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"router-outlet.js","sourceRoot":"","sources":["../../../../src/common/directives/navigation/router-outlet.ts"],"names":[],"mappings":"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","sourcesContent":["import { Location } from '@angular/common';\nimport {\n ComponentRef,\n ElementRef,\n Injector,\n NgZone,\n OnDestroy,\n OnInit,\n ViewContainerRef,\n inject,\n Attribute,\n Directive,\n EventEmitter,\n Optional,\n Output,\n SkipSelf,\n EnvironmentInjector,\n Input,\n InjectionToken,\n Injectable,\n reflectComponentType,\n} from '@angular/core';\nimport type { Provider } from '@angular/core';\nimport { OutletContext, Router, ActivatedRoute, ChildrenOutletContexts, PRIMARY_OUTLET, Data } from '@angular/router';\nimport {\n LIFECYCLE_DID_ENTER,\n LIFECYCLE_DID_LEAVE,\n LIFECYCLE_WILL_ENTER,\n LIFECYCLE_WILL_LEAVE,\n componentOnReady,\n} from '@ionic/core/components';\nimport type { AnimationBuilder } from '@ionic/core/components';\nimport { Observable, BehaviorSubject, Subscription, combineLatest, of } from 'rxjs';\nimport { distinctUntilChanged, filter, switchMap } from 'rxjs/operators';\n\nimport { Config } from '../../providers/config';\nimport { NavController } from '../../providers/nav-controller';\n\nimport { StackController } from './stack-controller';\nimport { RouteView, StackDidChangeEvent, StackWillChangeEvent, getUrl, isTabSwitch } from './stack-utils';\n\n/**\n * A page that left along with its parent page is still the active view of its\n * outlet. If the user comes back to a different page in that outlet, the\n * outlet's own transition fires leave on it a second time, so swallow leave\n * events on it until it enters again. Unblock on `ionViewDidEnter`, since a\n * cancelled swipe back only fires `ionViewWillEnter`.\n */\nconst blockRepeatLeave = (pageEl: HTMLElement) => {\n // Capture so this runs before the page's own lifecycle listeners.\n const block = (ev: Event) => ev.stopImmediatePropagation();\n const unblock = () => {\n pageEl.removeEventListener(LIFECYCLE_WILL_LEAVE, block, true);\n pageEl.removeEventListener(LIFECYCLE_DID_LEAVE, block, true);\n };\n\n pageEl.addEventListener(LIFECYCLE_WILL_LEAVE, block, true);\n pageEl.addEventListener(LIFECYCLE_DID_LEAVE, block, true);\n pageEl.addEventListener(LIFECYCLE_DID_ENTER, unblock, { capture: true, once: true });\n};\n\n// TODO(FW-2827): types\n\n@Directive({\n selector: 'ion-router-outlet',\n exportAs: 'outlet',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['animated', 'animation', 'mode', 'swipeGesture'],\n})\nexport abstract class IonRouterOutlet implements OnDestroy, OnInit {\n abstract outletContent: any;\n\n nativeEl: HTMLIonRouterOutletElement;\n activatedView: RouteView | null = null;\n tabsPrefix: string | undefined;\n\n private _swipeGesture?: boolean;\n private stackCtrl: StackController;\n\n // Maintain map of activated route proxies for each component instance\n private proxyMap = new WeakMap<any, ActivatedRoute>();\n // Keep the latest activated route in a subject for the proxy routes to switch map to\n private currentActivatedRoute$ = new BehaviorSubject<{ component: any; activatedRoute: ActivatedRoute } | null>(null);\n\n private activated: ComponentRef<any> | null = null;\n private unbindParentLifecycle?: () => void;\n /** @internal */\n get activatedComponentRef(): ComponentRef<any> | null {\n return this.activated;\n }\n private _activatedRoute: ActivatedRoute | null = null;\n\n /**\n * The name of the outlet\n */\n @Input() name = PRIMARY_OUTLET;\n\n /** @internal */\n @Output() stackWillChange = new EventEmitter<StackWillChangeEvent>();\n /** @internal */\n @Output() stackDidChange = new EventEmitter<StackDidChangeEvent>();\n\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('activate') activateEvents = new EventEmitter<any>();\n // eslint-disable-next-line @angular-eslint/no-output-rename\n @Output('deactivate') deactivateEvents = new EventEmitter<any>();\n\n private parentContexts = inject(ChildrenOutletContexts);\n private location = inject(ViewContainerRef);\n private environmentInjector = inject(EnvironmentInjector);\n private inputBinder = inject(INPUT_BINDER, { optional: true });\n /** @nodoc */\n readonly supportsBindingToComponentInputs = true;\n\n // Ionic providers\n private config = inject(Config);\n private navCtrl = inject(NavController);\n\n set animation(animation: AnimationBuilder) {\n this.nativeEl.animation = animation;\n }\n\n set animated(animated: boolean) {\n this.nativeEl.animated = animated;\n }\n\n set swipeGesture(swipe: boolean) {\n this._swipeGesture = swipe;\n\n this.nativeEl.swipeHandler = swipe\n ? {\n canStart: () => this.stackCtrl.canGoBack(1) && !this.stackCtrl.hasRunningTask(),\n onStart: () => this.stackCtrl.startBackTransition(),\n onEnd: (shouldContinue) => this.stackCtrl.endBackTransition(shouldContinue),\n }\n : undefined;\n\n this.nativeEl.swipeGesture = swipe;\n }\n\n constructor(\n @Attribute('name') name: string,\n @Optional() @Attribute('tabs') tabs: string,\n commonLocation: Location,\n elementRef: ElementRef,\n router: Router,\n zone: NgZone,\n activatedRoute: ActivatedRoute,\n @SkipSelf() @Optional() readonly parentOutlet?: IonRouterOutlet\n ) {\n this.nativeEl = elementRef.nativeElement;\n this.name = name || PRIMARY_OUTLET;\n this.tabsPrefix = tabs === 'true' ? getUrl(router, activatedRoute) : undefined;\n this.stackCtrl = new StackController(this.tabsPrefix, this.nativeEl, router, this.navCtrl, zone, commonLocation);\n this.parentContexts.onChildOutletCreated(this.name, this as any);\n }\n\n ngOnDestroy(): void {\n this.unbindParentLifecycle?.();\n this.stackCtrl.destroy();\n this.inputBinder?.unsubscribeFromRouteData(this);\n }\n\n getContext(): OutletContext | null {\n return this.parentContexts.getContext(this.name);\n }\n\n ngOnInit(): void {\n this.initializeOutletWithName();\n this.bindParentLifecycle();\n }\n\n // Note: Ionic deviates from the Angular Router implementation here\n private initializeOutletWithName() {\n if (!this.activated) {\n // If the outlet was not instantiated at the time the route got activated we need to populate\n // the outlet when it is initialized (ie inside a NgIf)\n const context = this.getContext();\n if (context?.route) {\n this.activateWith(context.route, context.injector);\n }\n }\n\n new Promise((resolve) => componentOnReady(this.nativeEl, resolve)).then(() => {\n if (this._swipeGesture === undefined) {\n this.swipeGesture = this.config.getBoolean('swipeBackEnabled', (this.nativeEl as any).mode === 'ios');\n }\n });\n }\n\n /**\n * Core doesn't bubble lifecycle events, so forward the ones on the page\n * hosting this outlet (such as a page containing `ion-tabs`) to the page\n * active in this outlet. Enter events only go to a page that left with the\n * parent page.\n */\n private bindParentLifecycle() {\n const parentPageEl = this.getParentPageElement();\n if (!parentPageEl) {\n return;\n }\n\n let leftWithParent: RouteView | undefined;\n\n /**\n * Apps using the workaround from\n * https://github.com/ionic-team/ionic-framework/issues/16834 already\n * re-dispatch the parent's lifecycle events onto the active tab, so track\n * whether the active page got the event to avoid firing it twice.\n */\n let parentEventType: string | undefined;\n let activeViewReceived = false;\n const onParentEventStart = (ev: Event) => {\n if (ev.target === parentPageEl) {\n parentEventType = ev.type;\n activeViewReceived = false;\n }\n };\n const onOutletEvent = (ev: Event) => {\n if (ev.type === parentEventType && ev.target === this.stackCtrl.getActiveView()?.element) {\n activeViewReceived = true;\n }\n };\n\n const forward = (ev: Event) => {\n const alreadyReceived = activeViewReceived;\n parentEventType = undefined;\n activeViewReceived = false;\n\n const activeView = this.stackCtrl.getActiveView();\n if (!activeView) {\n return;\n }\n\n const isEnter = ev.type === LIFECYCLE_WILL_ENTER || ev.type === LIFECYCLE_DID_ENTER;\n if (isEnter && activeView !== leftWithParent) {\n return;\n }\n\n if (!alreadyReceived) {\n activeView.element.dispatchEvent(new CustomEvent(ev.type, { bubbles: false, cancelable: false }));\n }\n\n if (ev.type === LIFECYCLE_DID_LEAVE) {\n leftWithParent = activeView;\n blockRepeatLeave(activeView.element);\n } else if (ev.type === LIFECYCLE_DID_ENTER) {\n leftWithParent = undefined;\n }\n };\n\n /**\n * Capture listeners see the event before the parent page's own hooks run,\n * and see events dispatched on pages in this outlet even though they\n * don't bubble. The bubble-phase `forward` listener runs after the parent\n * page's own hooks because those are bound when the page is created,\n * before this outlet inits.\n */\n const events = [LIFECYCLE_WILL_ENTER, LIFECYCLE_DID_ENTER, LIFECYCLE_WILL_LEAVE, LIFECYCLE_DID_LEAVE];\n events.forEach((eventName) => {\n parentPageEl.addEventListener(eventName, onParentEventStart, true);\n parentPageEl.addEventListener(eventName, forward);\n this.nativeEl.addEventListener(eventName, onOutletEvent, true);\n });\n this.unbindParentLifecycle = () => {\n events.forEach((eventName) => {\n parentPageEl.removeEventListener(eventName, onParentEventStart, true);\n parentPageEl.removeEventListener(eventName, forward);\n this.nativeEl.removeEventListener(eventName, onOutletEvent, true);\n });\n };\n }\n\n /**\n * The page in the parent outlet that contains this outlet, if any.\n */\n private getParentPageElement(): HTMLElement | undefined {\n const parentOutletEl = this.parentOutlet?.nativeEl;\n if (!parentOutletEl) {\n return undefined;\n }\n\n let el: HTMLElement | null = this.nativeEl;\n while (el && el.parentElement !== parentOutletEl) {\n el = el.parentElement;\n }\n return el ?? undefined;\n }\n\n get isActivated(): boolean {\n return !!this.activated;\n }\n\n get component(): Record<string, unknown> {\n if (!this.activated) {\n throw new Error('Outlet is not activated');\n }\n return this.activated.instance;\n }\n\n get activatedRoute(): ActivatedRoute {\n if (!this.activated) {\n throw new Error('Outlet is not activated');\n }\n return this._activatedRoute as ActivatedRoute;\n }\n\n get activatedRouteData(): Data {\n if (this._activatedRoute) {\n return this._activatedRoute.snapshot.data;\n }\n return {};\n }\n\n /**\n * Called when the `RouteReuseStrategy` instructs to detach the subtree\n */\n detach(): ComponentRef<any> {\n throw new Error('incompatible reuse strategy');\n }\n\n /**\n * Called when the `RouteReuseStrategy` instructs to re-attach a previously detached subtree\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n attach(_ref: ComponentRef<any>, _activatedRoute: ActivatedRoute): void {\n throw new Error('incompatible reuse strategy');\n }\n\n deactivate(): void {\n if (this.activated) {\n if (this.activatedView) {\n const context = this.getContext()!;\n this.activatedView.savedData = new Map(context.children['contexts']);\n\n /**\n * Angular v11.2.10 introduced a change\n * where this route context is cleared out when\n * a router-outlet is deactivated, However,\n * we need this route information in order to\n * return a user back to the correct tab when\n * leaving and then going back to the tab context.\n */\n const primaryOutlet = this.activatedView.savedData.get('primary');\n if (primaryOutlet && context.route) {\n primaryOutlet.route = { ...context.route };\n }\n\n /**\n * Ensure we are saving the NavigationExtras\n * data otherwise it will be lost\n */\n this.activatedView.savedExtras = {};\n if (context.route) {\n const contextSnapshot = context.route.snapshot;\n\n this.activatedView.savedExtras.queryParams = contextSnapshot.queryParams;\n (this.activatedView.savedExtras.fragment as string | null) = contextSnapshot.fragment;\n }\n }\n const c = this.component;\n this.activatedView = null;\n this.activated = null;\n this._activatedRoute = null;\n this.deactivateEvents.emit(c);\n }\n }\n\n activateWith(activatedRoute: ActivatedRoute, environmentInjector: EnvironmentInjector | null): void {\n if (this.isActivated) {\n throw new Error('Cannot activate an already activated outlet');\n }\n this._activatedRoute = activatedRoute;\n\n let cmpRef: any;\n let enteringView = this.stackCtrl.getExistingView(activatedRoute);\n if (enteringView) {\n cmpRef = this.activated = enteringView.ref;\n const saved = enteringView.savedData;\n if (saved) {\n // self-restore\n const context = this.getContext()!;\n context.children['contexts'] = saved;\n }\n // Updated activated route proxy for this component\n this.updateActivatedRouteProxy(cmpRef.instance, activatedRoute);\n } else {\n const snapshot = (activatedRoute as any)._futureSnapshot;\n\n /**\n * Angular 14 introduces a new `loadComponent` property to the route config.\n * This function will assign a `component` property to the route snapshot.\n * We check for the presence of this property to determine if the route is\n * using standalone components.\n */\n const childContexts = this.parentContexts.getOrCreateContext(this.name).children;\n\n // We create an activated route proxy object that will maintain future updates for this component\n // over its lifecycle in the stack.\n const component$ = new BehaviorSubject<any>(null);\n const activatedRouteProxy = this.createActivatedRouteProxy(component$, activatedRoute);\n\n const injector = new OutletInjector(activatedRouteProxy, childContexts, this.location.injector);\n\n const component = snapshot.routeConfig!.component ?? snapshot.component;\n\n /**\n * View components need to be added as a child of ion-router-outlet\n * for page transitions and swipe to go back.\n * However, createComponent mounts components as siblings of the\n * ViewContainerRef. As a result, outletContent must reference\n * an ng-container inside of ion-router-outlet and not\n * ion-router-outlet itself.\n */\n cmpRef = this.activated = this.outletContent.createComponent(component, {\n index: this.outletContent.length,\n injector,\n environmentInjector: environmentInjector ?? this.environmentInjector,\n });\n\n // Once the component is created we can push it to our local subject supplied to the proxy\n component$.next(cmpRef.instance);\n\n // Calling `markForCheck` to make sure we will run the change detection when the\n // `RouterOutlet` is inside a `ChangeDetectionStrategy.OnPush` component.\n\n /**\n * At this point this.activated has been set earlier\n * in this function, so it is guaranteed to be non-null.\n */\n enteringView = this.stackCtrl.createView(this.activated!, activatedRoute);\n\n // Store references to the proxy by component\n this.proxyMap.set(cmpRef.instance, activatedRouteProxy);\n this.currentActivatedRoute$.next({ component: cmpRef.instance, activatedRoute });\n }\n\n this.inputBinder?.bindActivatedRouteToOutletComponent(this);\n\n this.activatedView = enteringView;\n\n /**\n * The top outlet is set prior to the entering view's transition completing,\n * so that when we have nested outlets (e.g. ion-tabs inside an ion-router-outlet),\n * the tabs outlet will be assigned as the top outlet when a view inside tabs is\n * activated.\n *\n * In this scenario, activeWith is called for both the tabs and the root router outlet.\n * To avoid a race condition, we assign the top outlet synchronously.\n */\n this.navCtrl.setTopOutlet(this);\n\n const leavingView = this.stackCtrl.getActiveView();\n\n this.stackWillChange.emit({\n enteringView,\n tabSwitch: isTabSwitch(enteringView, leavingView),\n });\n\n this.stackCtrl.setActive(enteringView).then((data) => {\n this.activateEvents.emit(cmpRef.instance);\n this.stackDidChange.emit(data);\n });\n }\n\n /**\n * Returns `true` if there are pages in the stack to go back.\n */\n canGoBack(deep = 1, stackId?: string): boolean {\n return this.stackCtrl.canGoBack(deep, stackId);\n }\n\n /**\n * Resolves to `true` if it the outlet was able to sucessfully pop the last N pages.\n */\n pop(deep = 1, stackId?: string): Promise<boolean> {\n return this.stackCtrl.pop(deep, stackId);\n }\n\n /**\n * Returns the URL of the active page of each stack.\n */\n getLastUrl(stackId?: string): string | undefined {\n const active = this.stackCtrl.getLastUrl(stackId);\n return active ? active.url : undefined;\n }\n\n /**\n * Returns the RouteView of the active page of each stack.\n * @internal\n */\n getLastRouteView(stackId?: string): RouteView | undefined {\n return this.stackCtrl.getLastUrl(stackId);\n }\n\n /**\n * Returns the root view in the tab stack.\n * @internal\n */\n getRootView(stackId?: string): RouteView | undefined {\n return this.stackCtrl.getRootUrl(stackId);\n }\n\n /**\n * Returns the active stack ID. In the context of ion-tabs, it means the active tab.\n */\n getActiveStackId(): string | undefined {\n return this.stackCtrl.getActiveStackId();\n }\n\n /**\n * Since the activated route can change over the life time of a component in an ion router outlet, we create\n * a proxy so that we can update the values over time as a user navigates back to components already in the stack.\n */\n private createActivatedRouteProxy(component$: Observable<any>, activatedRoute: ActivatedRoute): ActivatedRoute {\n const proxy: any = new ActivatedRoute();\n\n proxy._futureSnapshot = (activatedRoute as any)._futureSnapshot;\n proxy._routerState = (activatedRoute as any)._routerState;\n proxy.snapshot = activatedRoute.snapshot;\n proxy.outlet = activatedRoute.outlet;\n proxy.component = activatedRoute.component;\n\n // Setup wrappers for the observables so consumers don't have to worry about switching to new observables as the state updates\n (proxy as any)._paramMap = this.proxyObservable(component$, 'paramMap');\n (proxy as any)._queryParamMap = this.proxyObservable(component$, 'queryParamMap');\n proxy.url = this.proxyObservable(component$, 'url');\n proxy.params = this.proxyObservable(component$, 'params');\n proxy.queryParams = this.proxyObservable(component$, 'queryParams');\n proxy.fragment = this.proxyObservable(component$, 'fragment');\n proxy.data = this.proxyObservable(component$, 'data');\n\n return proxy as ActivatedRoute;\n }\n\n /**\n * Create a wrapped observable that will switch to the latest activated route matched by the given component\n */\n private proxyObservable(component$: Observable<any>, path: string): Observable<any> {\n return component$.pipe(\n // First wait until the component instance is pushed\n filter((component) => !!component),\n switchMap((component) =>\n this.currentActivatedRoute$.pipe(\n filter((current) => current !== null && current.component === component),\n switchMap((current) => current && (current.activatedRoute as any)[path]),\n distinctUntilChanged()\n )\n )\n );\n }\n\n /**\n * Updates the activated route proxy for the given component to the new incoming router state\n */\n private updateActivatedRouteProxy(component: any, activatedRoute: ActivatedRoute): void {\n const proxy = this.proxyMap.get(component);\n if (!proxy) {\n throw new Error(`Could not find activated route proxy for view`);\n }\n\n (proxy as any)._futureSnapshot = (activatedRoute as any)._futureSnapshot;\n (proxy as any)._routerState = (activatedRoute as any)._routerState;\n proxy.snapshot = activatedRoute.snapshot;\n proxy.outlet = activatedRoute.outlet;\n proxy.component = activatedRoute.component;\n\n this.currentActivatedRoute$.next({ component, activatedRoute });\n }\n}\n\nclass OutletInjector implements Injector {\n constructor(private route: ActivatedRoute, private childContexts: ChildrenOutletContexts, private parent: Injector) {}\n\n get(token: any, notFoundValue?: any): any {\n if (token === ActivatedRoute) {\n return this.route;\n }\n\n if (token === ChildrenOutletContexts) {\n return this.childContexts;\n }\n\n return this.parent.get(token, notFoundValue);\n }\n}\n\n// TODO: FW-4785 - Remove this once Angular 15 support is dropped\nconst INPUT_BINDER = new InjectionToken<RoutedComponentInputBinder>('');\n\n/**\n * Injectable used as a tree-shakable provider for opting in to binding router data to component\n * inputs.\n *\n * The RouterOutlet registers itself with this service when an `ActivatedRoute` is attached or\n * activated. When this happens, the service subscribes to the `ActivatedRoute` observables (params,\n * queryParams, data) and sets the inputs of the component using `ComponentRef.setInput`.\n * Importantly, when an input does not have an item in the route data with a matching key, this\n * input is set to `undefined`. If it were not done this way, the previous information would be\n * retained if the data got removed from the route (i.e. if a query parameter is removed).\n *\n * The `RouterOutlet` should unregister itself when destroyed via `unsubscribeFromRouteData` so that\n * the subscriptions are cleaned up.\n */\n@Injectable()\nclass RoutedComponentInputBinder {\n private outletDataSubscriptions = new Map<IonRouterOutlet, Subscription>();\n\n bindActivatedRouteToOutletComponent(outlet: IonRouterOutlet): void {\n this.unsubscribeFromRouteData(outlet);\n this.subscribeToRouteData(outlet);\n }\n\n unsubscribeFromRouteData(outlet: IonRouterOutlet): void {\n this.outletDataSubscriptions.get(outlet)?.unsubscribe();\n this.outletDataSubscriptions.delete(outlet);\n }\n\n private subscribeToRouteData(outlet: IonRouterOutlet) {\n const { activatedRoute } = outlet;\n const dataSubscription = combineLatest([activatedRoute.queryParams, activatedRoute.params, activatedRoute.data])\n .pipe(\n switchMap(([queryParams, params, data], index) => {\n data = { ...queryParams, ...params, ...data };\n // Get the first result from the data subscription synchronously so it's available to\n // the component as soon as possible (and doesn't require a second change detection).\n if (index === 0) {\n return of(data);\n }\n // Promise.resolve is used to avoid synchronously writing the wrong data when\n // two of the Observables in the `combineLatest` stream emit one after\n // another.\n return Promise.resolve(data);\n })\n )\n .subscribe((data) => {\n // Outlet may have been deactivated or changed names to be associated with a different\n // route\n if (\n !outlet.isActivated ||\n !outlet.activatedComponentRef ||\n outlet.activatedRoute !== activatedRoute ||\n activatedRoute.component === null\n ) {\n this.unsubscribeFromRouteData(outlet);\n return;\n }\n\n const mirror = reflectComponentType(activatedRoute.component);\n if (!mirror) {\n this.unsubscribeFromRouteData(outlet);\n return;\n }\n\n for (const { templateName } of mirror.inputs) {\n outlet.activatedComponentRef.setInput(templateName, data[templateName]);\n }\n });\n\n this.outletDataSubscriptions.set(outlet, dataSubscription);\n }\n}\n\nexport const provideComponentInputBinding = (): Provider => {\n return {\n provide: INPUT_BINDER,\n useFactory: componentInputBindingFactory,\n deps: [Router],\n };\n};\n\nfunction componentInputBindingFactory(router?: Router) {\n /**\n * We cast the router to any here, since the componentInputBindingEnabled\n * property is not available until Angular v16.\n */\n if ((router as any)?.componentInputBindingEnabled) {\n return new RoutedComponentInputBinder();\n }\n return null;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ionic/angular",
|
|
3
|
-
"version": "9.0.7-dev.
|
|
3
|
+
"version": "9.0.7-dev.11791305593.188c8151",
|
|
4
4
|
"description": "Angular specific wrappers for @ionic/core",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ionic",
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
"css/"
|
|
169
169
|
],
|
|
170
170
|
"dependencies": {
|
|
171
|
-
"@ionic/core": "9.0.7-dev.
|
|
171
|
+
"@ionic/core": "9.0.7-dev.11791305593.188c8151",
|
|
172
172
|
"ionicons": "^8.0.13",
|
|
173
173
|
"jsonc-parser": "^3.0.0",
|
|
174
174
|
"tslib": "^2.3.0"
|