@rdlabo/ionic-theme-md3 0.0.19 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -0
- package/dist/css/components/ion-button.css +1 -1
- package/dist/css/components/ion-range.css +1 -1
- package/dist/css/ionic-theme-md3.css +1 -1
- package/package.json +1 -1
- package/src/focus-controller/index.ts +123 -0
- package/src/index.ts +1 -0
- package/src/styles/components/ion-button.scss +14 -5
- package/src/styles/components/ion-range.scss +3 -0
- package/src/transition/index.ts +26 -0
- package/src/transition/md.transition.ts +78 -0
package/README.md
CHANGED
|
@@ -48,6 +48,33 @@ And import the theme in your project's main CSS file (e.g., `src/styles.scss`).
|
|
|
48
48
|
@import '@rdlabo/ionic-theme-md3/dist/css/ionic-theme-md3.css';
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
+
|
|
52
|
+
Next, configure the animations for MD3. Add the following to your Ionic configuration options.
|
|
53
|
+
|
|
54
|
+
```ts
|
|
55
|
+
import { isPlatform } from '@ionic/core'; // or @ionic/angular/standalone, @ionic/react, @ionic/vue
|
|
56
|
+
import { mdTransitionAnimation } from '@rdlabo/ionic-theme-md3';
|
|
57
|
+
|
|
58
|
+
// Angular
|
|
59
|
+
provideIonicAngular({
|
|
60
|
+
...
|
|
61
|
+
navAnimation: isPlatform('ios') ? undefined: mdTransitionAnimation,
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
// React
|
|
65
|
+
setupIonicReact({
|
|
66
|
+
...
|
|
67
|
+
navAnimation: isPlatform('ios') ? undefined: mdTransitionAnimation,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Vue
|
|
71
|
+
createApp(App)
|
|
72
|
+
.use(IonicVue, {
|
|
73
|
+
...
|
|
74
|
+
navAnimation: isPlatform('ios') ? undefined: mdTransitionAnimation,
|
|
75
|
+
})
|
|
76
|
+
```
|
|
77
|
+
|
|
51
78
|
## Development & Testing
|
|
52
79
|
|
|
53
80
|
### Demo Application
|
|
@@ -1 +1 @@
|
|
|
1
|
-
ion-button.md:not(.md3-disabled){--box-shadow: none;--padding-start: 16px;--padding-end: 16px;--border-radius: 999px}ion-button.md:not(.md3-disabled)::part(native){height:40px}ion-button.md:not(.md3-disabled) ion-icon{font-size:24px}ion-button.md:not(.md3-disabled) ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled) ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-small{--padding-start: 12px;--padding-end: 12px}ion-button.md:not(.md3-disabled).button-small::part(native){height:32px}ion-button.md:not(.md3-disabled).button-small.button-has-icon-only::part(native){width:32px;height:32px}ion-button.md:not(.md3-disabled).button-small ion-icon{font-size:20px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:4px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=end]{margin-inline-start:4px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-large{--padding-start: 24px;--padding-end: 24px}ion-button.md:not(.md3-disabled).button-large
|
|
1
|
+
ion-button.md:not(.md3-disabled){--box-shadow: none;--padding-start: 16px;--padding-end: 16px;--border-radius: 999px}ion-button.md:not(.md3-disabled):not(.button-round){--border-radius: 999px}ion-button.md:not(.md3-disabled)::part(native){height:40px}ion-button.md:not(.md3-disabled) ion-icon{font-size:24px}ion-button.md:not(.md3-disabled) ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled) ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-small{--padding-start: 12px;--padding-end: 12px}ion-button.md:not(.md3-disabled).button-small::part(native){height:32px}ion-button.md:not(.md3-disabled).button-small.button-has-icon-only::part(native){width:32px;height:32px}ion-button.md:not(.md3-disabled).button-small ion-icon{font-size:20px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:4px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=end]{margin-inline-start:4px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-large{--padding-start: 24px;--padding-end: 24px}ion-button.md:not(.md3-disabled).button-large::part(native){height:56px}ion-button.md:not(.md3-disabled).button-large.button-has-icon-only::part(native){width:56px;height:56px}ion-button.md:not(.md3-disabled).button-large ion-icon{font-size:24px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-has-icon-only::part(native){width:40px;height:40px}ion-button.md:not(.md3-disabled).button-has-icon-only{--padding-start: 0;--padding-end: 0}ion-button.md:not(.md3-disabled).button-square{--border-radius: 8px}ion-button.md:not(.md3-disabled).button-square.button-square{--border-radius: 12px}ion-back-button.md:not(.md3-disabled){--border-radius: 999px;--padding-start: 16px;--padding-end: 16px}ion-back-button.md:not(.md3-disabled)::part(native){min-height:40px}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
ion-range.md:not(.md3-disabled){--height: 56px;--bar-height: 16px;--bar-border-radius: 8px;--knob-background: transparent;--knob-box-shadow: none;--knob-border-radius: 8px;--knob-size: 44px;--pin-background: var(--ion-background-color-step-700, #4a4458)}ion-range.md:not(.md3-disabled).range-has-pin{padding-top:2.6rem}ion-range.md:not(.md3-disabled)::part(knob){width:4px;height:var(--knob-size);background:var(--ion-color-primary);transform:translateX(calc(var(--knob-size) / 2 - 2px))}ion-range.md:not(.md3-disabled)::part(knob):before{content:none}ion-range.md:not(.md3-disabled).ion-color::part(knob){background:var(--ion-color-base, var(--ion-color-primary))}ion-range.md:not(.md3-disabled)::part(tick),ion-range.md:not(.md3-disabled)::part(tick-active){--bar-height: 4px}ion-range.md:not(.md3-disabled)::part(bar-active){border-top-right-radius:calc(var(--knob-border-radius)/2);border-bottom-right-radius:calc(var(--knob-border-radius)/2);margin-right:6px}ion-range.md:not(.md3-disabled)[dual-knobs]::part(bar-active){border-radius:calc(var(--knob-border-radius)/2);margin-left:6px}ion-range.md:not(.md3-disabled)::part(pin){padding:16px;min-width:36px;top:10px}ion-range.md:not(.md3-disabled)::part(pin):before{content:none}
|
|
1
|
+
ion-range.md:not(.md3-disabled){--height: 56px;--bar-height: 16px;--bar-border-radius: 8px;--knob-background: transparent;--knob-box-shadow: none;--knob-border-radius: 8px;--knob-size: 44px;--pin-background: var(--ion-background-color-step-700, #4a4458)}ion-range.md:not(.md3-disabled).range-has-pin{padding-top:2.6rem}ion-range.md:not(.md3-disabled)::part(knob){width:4px;height:var(--knob-size);background:var(--ion-color-primary);transform:translateX(calc(var(--knob-size) / 2 - 2px))}ion-range.md:not(.md3-disabled)::part(knob):before{content:none}ion-range.md:not(.md3-disabled).ion-color::part(knob){background:var(--ion-color-base, var(--ion-color-primary))}ion-range.md:not(.md3-disabled).range-pressed::part(knob){width:2px}ion-range.md:not(.md3-disabled)::part(tick),ion-range.md:not(.md3-disabled)::part(tick-active){--bar-height: 4px}ion-range.md:not(.md3-disabled)::part(bar-active){border-top-right-radius:calc(var(--knob-border-radius)/2);border-bottom-right-radius:calc(var(--knob-border-radius)/2);margin-right:6px}ion-range.md:not(.md3-disabled)[dual-knobs]::part(bar-active){border-radius:calc(var(--knob-border-radius)/2);margin-left:6px}ion-range.md:not(.md3-disabled)::part(pin){padding:16px;min-width:36px;top:10px}ion-range.md:not(.md3-disabled)::part(pin):before{content:none}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
ion-action-sheet.md:not(.md3-disabled){--max-width: 640px !important}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container{overflow:hidden;border-radius:28px 28px 0 0;box-shadow:var(--token-elevation-1)}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-title{padding:24px 24px 16px}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-button{padding:12px 24px}ion-alert.md:not(.md3-disabled){--backdrop-opacity: 0.2;--min-width: 280px;--max-width: min(560px, calc(100% - 48px * 2));transition:transform 200ms ease}ion-alert.md:not(.md3-disabled) .alert-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-head{padding-top:24px;padding-bottom:16px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message{padding-bottom:24px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message:empty{padding-bottom:0}ion-button.md:not(.md3-disabled){--box-shadow: none;--padding-start: 16px;--padding-end: 16px;--border-radius: 999px}ion-button.md:not(.md3-disabled)::part(native){height:40px}ion-button.md:not(.md3-disabled) ion-icon{font-size:24px}ion-button.md:not(.md3-disabled) ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled) ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-small{--padding-start: 12px;--padding-end: 12px}ion-button.md:not(.md3-disabled).button-small::part(native){height:32px}ion-button.md:not(.md3-disabled).button-small.button-has-icon-only::part(native){width:32px;height:32px}ion-button.md:not(.md3-disabled).button-small ion-icon{font-size:20px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:4px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=end]{margin-inline-start:4px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-large{--padding-start: 24px;--padding-end: 24px}ion-button.md:not(.md3-disabled).button-large.button-square{--border-radius: 16px}ion-button.md:not(.md3-disabled).button-large::part(native){height:56px}ion-button.md:not(.md3-disabled).button-large.button-has-icon-only::part(native){width:56px;height:56px}ion-button.md:not(.md3-disabled).button-large ion-icon{font-size:24px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-has-icon-only::part(native){width:40px;height:40px}ion-button.md:not(.md3-disabled).button-has-icon-only{--padding-start: 0;--padding-end: 0}ion-button.md:not(.md3-disabled).button-square{--border-radius: 12px}ion-back-button.md:not(.md3-disabled){--border-radius: 999px;--padding-start: 16px;--padding-end: 16px}ion-back-button.md:not(.md3-disabled)::part(native){min-height:40px}ion-card.md:not(.md3-disabled){border-radius:12px;box-shadow:var(--token-elevation-1)}ion-card.md:not(.md3-disabled) ion-list ion-item{--padding-start: 0}ion-chip.md:not(.md3-disabled){padding-inline-start:16px;padding-inline-end:16px;border-radius:8px}ion-chip.md:not(.md3-disabled) ion-icon{font-size:18px}ion-chip.md:not(.md3-disabled) ion-icon:first-child{margin-inline-start:-8px;margin-inline-end:8px}ion-chip.md:not(.md3-disabled) ion-icon:last-child{margin-inline-start:8px;margin-inline-end:-8px}ion-fab.md:not(.md3-disabled) ion-fab-button{width:56px;height:56px;--border-radius: 16px;--transition: border-radius var(--token-expressive-fast-special);--box-shadow: var(--token-elevation-3)}ion-fab.md:not(.md3-disabled) ion-fab-button ion-icon{width:24px;height:24px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-in-list{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small{width:40px;height:40px;--border-radius: 12px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled):has(.fab-button-small) ion-fab-button{width:40px;height:40px}ion-list.md:not(.md3-disabled):not(.list-inset){padding-top:0;padding-bottom:0}ion-list.md:not(.md3-disabled).list-inset{background:rgba(0,0,0,0)}ion-list.md:not(.md3-disabled).list-inset ion-list-header{display:flex;align-items:center}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-label{font-size:.9rem;margin:8px 4px 4px;color:var(--ion-color-medium-tint)}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-button{margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-note{font-size:.9rem;margin:8px 16px 4px 0}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label{width:100%;text-align:center;padding:32px 16px 16px;transform:translateX(5px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-header.header-collapse-condense>ion-toolbar{--min-height: 0;visibility:hidden}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-icon{font-size:2.8rem;color:#fff;border-radius:20%;padding:6px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label h2{font-size:1.2rem;font-weight:bold;margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-text{font-size:.9rem}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)):not(:first-of-type){margin-top:16px}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item ion-text[slot=end]{padding-left:8px}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item.item-disabled{opacity:1}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item.item-disabled>*{opacity:.4}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item.item-disabled::part(detail-icon){opacity:.1}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item ion-button[slot=end].ion-align-self-end{transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item ion-button[slot=end] ion-icon[slot=icon-only]{font-size:1.2rem !important;transform:translateY(4px)}ion-list.md:not(.md3-disabled).list-inset>ion-note{color:var(--ion-color-medium-tint);font-size:.9rem;display:block;margin:8px calc(20px + var(--ion-safe-area-right)) 8px calc(20px + var(--ion-safe-area-left))}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item{--border-color: var(--ion-color-light, #fff)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item:not(.item-lines-inset):not(.item-lines-none){--border-radius: 4px;--border-width: 0px 0px 2px 0px;--inner-border-width: 0;--show-inset-highlight: 0;--show-full-highlight: 1}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]{transition:transform 200ms ease}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]:not(.label-floating){transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating].label-floating{transform:translateY(-4px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group,ion-list.md:not(.md3-disabled).list-inset ion-radio-group{border-radius:16px;overflow:hidden}ion-list-header.md:not(.md3-disabled){padding-left:calc(var(--ion-safe-area-left, 0px) + 4px)}ion-loading.md:not(.md3-disabled) .loading-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}ion-modal.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}@media only screen and (min-width: 768px)and (min-height: 600px){ion-modal.md:not(.md3-disabled){--border-radius: 24px}}ion-modal.md:not(.md3-disabled) ion-toolbar{--min-height: 64px;padding-right:var(--ion-safe-area-right);padding-left:var(--ion-safe-area-left)}ion-modal.md:not(.md3-disabled) ion-toolbar ion-button.button-has-icon-only::part(native){width:48px;height:48px}ion-modal.md:not(.md3-disabled) ion-toolbar ion-button.button-has-icon-only ion-icon[name=close-outline]{font-size:2rem}ion-modal.md:not(.md3-disabled)::part(handle){width:80px}ion-modal.md:not(.md3-disabled).modal-sheet{--border-radius: 30px}ion-modal.md:not(.md3-disabled).modal-sheet ion-toolbar:first-of-type{padding-top:0}ion-modal.md:not(.md3-disabled).modal-sheet ion-toolbar{padding-right:calc(var(--ion-safe-area-right) + 4px);padding-left:calc(var(--ion-safe-area-left) + 4px)}ion-popover.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}ion-popover.md:not(.md3-disabled)::part(content){border-radius:12px}ion-popover.md:not(.md3-disabled) ion-select-popover ion-list{padding:0}ion-range.md:not(.md3-disabled){--height: 56px;--bar-height: 16px;--bar-border-radius: 8px;--knob-background: transparent;--knob-box-shadow: none;--knob-border-radius: 8px;--knob-size: 44px;--pin-background: var(--ion-background-color-step-700, #4a4458)}ion-range.md:not(.md3-disabled).range-has-pin{padding-top:2.6rem}ion-range.md:not(.md3-disabled)::part(knob){width:4px;height:var(--knob-size);background:var(--ion-color-primary);transform:translateX(calc(var(--knob-size) / 2 - 2px))}ion-range.md:not(.md3-disabled)::part(knob):before{content:none}ion-range.md:not(.md3-disabled).ion-color::part(knob){background:var(--ion-color-base, var(--ion-color-primary))}ion-range.md:not(.md3-disabled)::part(tick),ion-range.md:not(.md3-disabled)::part(tick-active){--bar-height: 4px}ion-range.md:not(.md3-disabled)::part(bar-active){border-top-right-radius:calc(var(--knob-border-radius)/2);border-bottom-right-radius:calc(var(--knob-border-radius)/2);margin-right:6px}ion-range.md:not(.md3-disabled)[dual-knobs]::part(bar-active){border-radius:calc(var(--knob-border-radius)/2);margin-left:6px}ion-range.md:not(.md3-disabled)::part(pin){padding:16px;min-width:36px;top:10px}ion-range.md:not(.md3-disabled)::part(pin):before{content:none}ion-searchbar.md:not(.md3-disabled){--box-shadow: none;--border-radius: 999px;--background: rgba(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 0.08);--color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)));--icon-color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)))}ion-segment.md:not(.md3-disabled){border-bottom:1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, var(--ion-background-color-step-150, rgba(0, 0, 0, 0.13)))))}ion-tab-bar.md:not(.md3-disabled){height:62px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button{--ripple-color: transparent;--color-selected: var(--ion-color-contrast, var(--ion-color-primary-shade))}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon{padding:4px 16px;margin-top:6px;border-radius:16px;width:24px;height:24px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon::before{content:"";position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(var(--ion-color-contrast-rgb, var(--ion-color-primary-rgb, 2, 137, 255)), 0.2);transform:scaleX(0);transition:transform var(--token-expressive-fast-effects);z-index:-1}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-label{margin-top:2px;margin-bottom:6px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button.tab-selected ion-icon::before{transform:scaleX(1)}ion-toast.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3);--border-radius: 8px}ion-toggle.md:not(.md3-disabled){--handle-width: 24px;--handle-height: 24px;--handle-border-radius: 16px;--border-radius: 16px;--handle-box-shadow: none;--handle-spacing: 2px;--handle-transition: transform var(--token-expressive-default-special), background-color var(--token-expressive-default-effects)}ion-toggle.md:not(.md3-disabled)::part(track){box-sizing:border-box;min-height:32px;min-width:52px;border:2px solid var(--ion-text-color-step-450, #79747e);background:var(--ion-background-color-step-100, #e6e0e9)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(track){border-color:var(--ion-color-base);background:var(--ion-color-base)}ion-toggle.md:not(.md3-disabled)::part(handle){background:var(--ion-text-color-step-450, #79747e)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(handle){background:var(--ion-color-contrast)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(track){border-color:var(--ion-color-primary);background:var(--ion-color-primary)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(handle){background:var(--ion-color-primary-contrast)}ion-header.md:not(.md3-disabled),ion-footer.md:not(.md3-disabled){box-shadow:none}ion-header.md:not(.md3-disabled) ion-buttons,ion-footer.md:not(.md3-disabled) ion-buttons{margin-left:12px;margin-right:12px}ion-header.md:not(.md3-disabled) ion-back-button,ion-footer.md:not(.md3-disabled) ion-back-button{margin-left:12px;margin-right:12px}ion-header.md:not(.md3-disabled) ion-toolbar ion-buttons ion-back-button,ion-footer.md:not(.md3-disabled) ion-toolbar ion-buttons ion-back-button{margin-left:0;margin-right:0}
|
|
1
|
+
ion-action-sheet.md:not(.md3-disabled){--max-width: 640px !important}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container{overflow:hidden;border-radius:28px 28px 0 0;box-shadow:var(--token-elevation-1)}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-title{padding:24px 24px 16px}ion-action-sheet.md:not(.md3-disabled) .action-sheet-container .action-sheet-button{padding:12px 24px}ion-alert.md:not(.md3-disabled){--backdrop-opacity: 0.2;--min-width: 280px;--max-width: min(560px, calc(100% - 48px * 2));transition:transform 200ms ease}ion-alert.md:not(.md3-disabled) .alert-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-head{padding-top:24px;padding-bottom:16px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message{padding-bottom:24px}ion-alert.md:not(.md3-disabled) .alert-wrapper .alert-message:empty{padding-bottom:0}ion-button.md:not(.md3-disabled){--box-shadow: none;--padding-start: 16px;--padding-end: 16px;--border-radius: 999px}ion-button.md:not(.md3-disabled):not(.button-round){--border-radius: 999px}ion-button.md:not(.md3-disabled)::part(native){height:40px}ion-button.md:not(.md3-disabled) ion-icon{font-size:24px}ion-button.md:not(.md3-disabled) ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled) ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-small{--padding-start: 12px;--padding-end: 12px}ion-button.md:not(.md3-disabled).button-small::part(native){height:32px}ion-button.md:not(.md3-disabled).button-small.button-has-icon-only::part(native){width:32px;height:32px}ion-button.md:not(.md3-disabled).button-small ion-icon{font-size:20px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:4px}ion-button.md:not(.md3-disabled).button-small ion-icon[slot=end]{margin-inline-start:4px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-large{--padding-start: 24px;--padding-end: 24px}ion-button.md:not(.md3-disabled).button-large::part(native){height:56px}ion-button.md:not(.md3-disabled).button-large.button-has-icon-only::part(native){width:56px;height:56px}ion-button.md:not(.md3-disabled).button-large ion-icon{font-size:24px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=start]{margin-inline-start:0;margin-inline-end:8px}ion-button.md:not(.md3-disabled).button-large ion-icon[slot=end]{margin-inline-start:8px;margin-inline-end:0}ion-button.md:not(.md3-disabled).button-has-icon-only::part(native){width:40px;height:40px}ion-button.md:not(.md3-disabled).button-has-icon-only{--padding-start: 0;--padding-end: 0}ion-button.md:not(.md3-disabled).button-square{--border-radius: 8px}ion-button.md:not(.md3-disabled).button-square.button-square{--border-radius: 12px}ion-back-button.md:not(.md3-disabled){--border-radius: 999px;--padding-start: 16px;--padding-end: 16px}ion-back-button.md:not(.md3-disabled)::part(native){min-height:40px}ion-card.md:not(.md3-disabled){border-radius:12px;box-shadow:var(--token-elevation-1)}ion-card.md:not(.md3-disabled) ion-list ion-item{--padding-start: 0}ion-chip.md:not(.md3-disabled){padding-inline-start:16px;padding-inline-end:16px;border-radius:8px}ion-chip.md:not(.md3-disabled) ion-icon{font-size:18px}ion-chip.md:not(.md3-disabled) ion-icon:first-child{margin-inline-start:-8px;margin-inline-end:8px}ion-chip.md:not(.md3-disabled) ion-icon:last-child{margin-inline-start:8px;margin-inline-end:-8px}ion-fab.md:not(.md3-disabled) ion-fab-button{width:56px;height:56px;--border-radius: 16px;--transition: border-radius var(--token-expressive-fast-special);--box-shadow: var(--token-elevation-3)}ion-fab.md:not(.md3-disabled) ion-fab-button ion-icon{width:24px;height:24px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-in-list{--border-radius: 50%}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small{width:40px;height:40px;--border-radius: 12px}ion-fab.md:not(.md3-disabled) ion-fab-button.fab-button-small.fab-button-close-active{--border-radius: 50%}ion-fab.md:not(.md3-disabled):has(.fab-button-small) ion-fab-button{width:40px;height:40px}ion-list.md:not(.md3-disabled):not(.list-inset){padding-top:0;padding-bottom:0}ion-list.md:not(.md3-disabled).list-inset{background:rgba(0,0,0,0)}ion-list.md:not(.md3-disabled).list-inset ion-list-header{display:flex;align-items:center}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-label{font-size:.9rem;margin:8px 4px 4px;color:var(--ion-color-medium-tint)}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-button{margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-list-header ion-note{font-size:.9rem;margin:8px 16px 4px 0}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label{width:100%;text-align:center;padding:32px 16px 16px;transform:translateX(5px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-header.header-collapse-condense>ion-toolbar{--min-height: 0;visibility:hidden}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-icon{font-size:2.8rem;color:#fff;border-radius:20%;padding:6px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label h2{font-size:1.2rem;font-weight:bold;margin-top:8px}ion-list.md:not(.md3-disabled).list-inset ion-item-group.header-item-group>ion-item>ion-label ion-text{font-size:.9rem}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)):not(:first-of-type){margin-top:16px}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item ion-text[slot=end]{padding-left:8px}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item.item-disabled{opacity:1}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item.item-disabled>*{opacity:.4}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item.item-disabled::part(detail-icon){opacity:.1}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item ion-button[slot=end].ion-align-self-end{transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group):not(:is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group) :is(ion-item-group,ion-reorder-group,ion-accordion-group,ion-radio-group)) ion-item ion-button[slot=end] ion-icon[slot=icon-only]{font-size:1.2rem !important;transform:translateY(4px)}ion-list.md:not(.md3-disabled).list-inset>ion-note{color:var(--ion-color-medium-tint);font-size:.9rem;display:block;margin:8px calc(20px + var(--ion-safe-area-right)) 8px calc(20px + var(--ion-safe-area-left))}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item{--border-color: var(--ion-color-light, #fff)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item:not(.item-lines-inset):not(.item-lines-none){--border-radius: 4px;--border-width: 0px 0px 2px 0px;--inner-border-width: 0;--show-inset-highlight: 0;--show-full-highlight: 1}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]{transition:transform 200ms ease}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating]:not(.label-floating){transform:translateY(-7px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group>ion-item>ion-input[labelplacement=floating].label-floating{transform:translateY(-4px)}ion-list.md:not(.md3-disabled).list-inset ion-item-group,ion-list.md:not(.md3-disabled).list-inset ion-reorder-group,ion-list.md:not(.md3-disabled).list-inset ion-accordion-group,ion-list.md:not(.md3-disabled).list-inset ion-radio-group{border-radius:16px;overflow:hidden}ion-list-header.md:not(.md3-disabled){padding-left:calc(var(--ion-safe-area-left, 0px) + 4px)}ion-loading.md:not(.md3-disabled) .loading-wrapper{border-radius:24px;box-shadow:var(--token-elevation-3)}ion-modal.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}@media only screen and (min-width: 768px)and (min-height: 600px){ion-modal.md:not(.md3-disabled){--border-radius: 24px}}ion-modal.md:not(.md3-disabled) ion-toolbar{--min-height: 64px;padding-right:var(--ion-safe-area-right);padding-left:var(--ion-safe-area-left)}ion-modal.md:not(.md3-disabled) ion-toolbar ion-button.button-has-icon-only::part(native){width:48px;height:48px}ion-modal.md:not(.md3-disabled) ion-toolbar ion-button.button-has-icon-only ion-icon[name=close-outline]{font-size:2rem}ion-modal.md:not(.md3-disabled)::part(handle){width:80px}ion-modal.md:not(.md3-disabled).modal-sheet{--border-radius: 30px}ion-modal.md:not(.md3-disabled).modal-sheet ion-toolbar:first-of-type{padding-top:0}ion-modal.md:not(.md3-disabled).modal-sheet ion-toolbar{padding-right:calc(var(--ion-safe-area-right) + 4px);padding-left:calc(var(--ion-safe-area-left) + 4px)}ion-popover.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3)}ion-popover.md:not(.md3-disabled)::part(content){border-radius:12px}ion-popover.md:not(.md3-disabled) ion-select-popover ion-list{padding:0}ion-range.md:not(.md3-disabled){--height: 56px;--bar-height: 16px;--bar-border-radius: 8px;--knob-background: transparent;--knob-box-shadow: none;--knob-border-radius: 8px;--knob-size: 44px;--pin-background: var(--ion-background-color-step-700, #4a4458)}ion-range.md:not(.md3-disabled).range-has-pin{padding-top:2.6rem}ion-range.md:not(.md3-disabled)::part(knob){width:4px;height:var(--knob-size);background:var(--ion-color-primary);transform:translateX(calc(var(--knob-size) / 2 - 2px))}ion-range.md:not(.md3-disabled)::part(knob):before{content:none}ion-range.md:not(.md3-disabled).ion-color::part(knob){background:var(--ion-color-base, var(--ion-color-primary))}ion-range.md:not(.md3-disabled).range-pressed::part(knob){width:2px}ion-range.md:not(.md3-disabled)::part(tick),ion-range.md:not(.md3-disabled)::part(tick-active){--bar-height: 4px}ion-range.md:not(.md3-disabled)::part(bar-active){border-top-right-radius:calc(var(--knob-border-radius)/2);border-bottom-right-radius:calc(var(--knob-border-radius)/2);margin-right:6px}ion-range.md:not(.md3-disabled)[dual-knobs]::part(bar-active){border-radius:calc(var(--knob-border-radius)/2);margin-left:6px}ion-range.md:not(.md3-disabled)::part(pin){padding:16px;min-width:36px;top:10px}ion-range.md:not(.md3-disabled)::part(pin):before{content:none}ion-searchbar.md:not(.md3-disabled){--box-shadow: none;--border-radius: 999px;--background: rgba(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 0.08);--color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)));--icon-color: rgb(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)))}ion-segment.md:not(.md3-disabled){border-bottom:1px solid var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, var(--ion-background-color-step-150, rgba(0, 0, 0, 0.13)))))}ion-tab-bar.md:not(.md3-disabled){height:62px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button{--ripple-color: transparent;--color-selected: var(--ion-color-contrast, var(--ion-color-primary-shade))}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon{padding:4px 16px;margin-top:6px;border-radius:16px;width:24px;height:24px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-icon::before{content:"";position:absolute;left:0;top:0;width:100%;height:100%;background-color:rgba(var(--ion-color-contrast-rgb, var(--ion-color-primary-rgb, 2, 137, 255)), 0.2);transform:scaleX(0);transition:transform var(--token-expressive-fast-effects);z-index:-1}ion-tab-bar.md:not(.md3-disabled) ion-tab-button ion-label{margin-top:2px;margin-bottom:6px}ion-tab-bar.md:not(.md3-disabled) ion-tab-button.tab-selected ion-icon::before{transform:scaleX(1)}ion-toast.md:not(.md3-disabled){--box-shadow: var(--token-elevation-3);--border-radius: 8px}ion-toggle.md:not(.md3-disabled){--handle-width: 24px;--handle-height: 24px;--handle-border-radius: 16px;--border-radius: 16px;--handle-box-shadow: none;--handle-spacing: 2px;--handle-transition: transform var(--token-expressive-default-special), background-color var(--token-expressive-default-effects)}ion-toggle.md:not(.md3-disabled)::part(track){box-sizing:border-box;min-height:32px;min-width:52px;border:2px solid var(--ion-text-color-step-450, #79747e);background:var(--ion-background-color-step-100, #e6e0e9)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(track){border-color:var(--ion-color-base);background:var(--ion-color-base)}ion-toggle.md:not(.md3-disabled)::part(handle){background:var(--ion-text-color-step-450, #79747e)}ion-toggle.md:not(.md3-disabled).toggle-checked::part(handle){background:var(--ion-color-contrast)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(track){border-color:var(--ion-color-primary);background:var(--ion-color-primary)}ion-toggle.md:not(.md3-disabled):not(.ion-color).toggle-checked::part(handle){background:var(--ion-color-primary-contrast)}ion-header.md:not(.md3-disabled),ion-footer.md:not(.md3-disabled){box-shadow:none}ion-header.md:not(.md3-disabled) ion-buttons,ion-footer.md:not(.md3-disabled) ion-buttons{margin-left:12px;margin-right:12px}ion-header.md:not(.md3-disabled) ion-back-button,ion-footer.md:not(.md3-disabled) ion-back-button{margin-left:12px;margin-right:12px}ion-header.md:not(.md3-disabled) ion-toolbar ion-buttons ion-back-button,ion-footer.md:not(.md3-disabled) ion-toolbar ion-buttons ion-back-button{margin-left:0;margin-right:0}
|
package/package.json
CHANGED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { config } from '../utils';
|
|
2
|
+
// import { printIonWarning} from '@ionic/core/dist/types/utils/logging';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Moves focus to a specified element. Note that we do not remove the tabindex
|
|
6
|
+
* because that can result in an unintentional blur. Non-focusables can't be
|
|
7
|
+
* focused, so the body will get focused again.
|
|
8
|
+
*/
|
|
9
|
+
const moveFocus = (el: HTMLElement) => {
|
|
10
|
+
el.tabIndex = -1;
|
|
11
|
+
el.focus();
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Elements that are hidden using `display: none` should not be focused even if
|
|
16
|
+
* they are present in the DOM.
|
|
17
|
+
*/
|
|
18
|
+
const isVisible = (el: HTMLElement) => {
|
|
19
|
+
return el.offsetParent !== null;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The focus controller allows us to manage focus within a view so assistive
|
|
24
|
+
* technologies can inform users of changes to the navigation state. Traditional
|
|
25
|
+
* native apps have a way of informing assistive technology about a navigation
|
|
26
|
+
* state change. Mobile browsers have this too, but only when doing a full page
|
|
27
|
+
* load. In a single page app we do not do that, so we need to build this
|
|
28
|
+
* integration ourselves.
|
|
29
|
+
*/
|
|
30
|
+
export const createFocusController = (): FocusController => {
|
|
31
|
+
const saveViewFocus = (referenceEl?: HTMLElement) => {
|
|
32
|
+
const focusManagerEnabled = config.get('focusManagerPriority', false);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* When going back to a previously visited page focus should typically be moved
|
|
36
|
+
* back to the element that was last focused when the user was on this view.
|
|
37
|
+
*/
|
|
38
|
+
if (focusManagerEnabled) {
|
|
39
|
+
const activeEl = document.activeElement;
|
|
40
|
+
if (activeEl !== null && referenceEl?.contains(activeEl)) {
|
|
41
|
+
activeEl.setAttribute(LAST_FOCUS, 'true');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const setViewFocus = (referenceEl: HTMLElement) => {
|
|
47
|
+
const focusManagerPriorities = config.get('focusManagerPriority', false);
|
|
48
|
+
/**
|
|
49
|
+
* If the focused element is a descendant of the referenceEl then it's possible
|
|
50
|
+
* that the app developer manually moved focus, so we do not want to override that.
|
|
51
|
+
* This can happen with inputs the are focused when a view transitions in.
|
|
52
|
+
*/
|
|
53
|
+
if (Array.isArray(focusManagerPriorities) && !referenceEl.contains(document.activeElement)) {
|
|
54
|
+
/**
|
|
55
|
+
* When going back to a previously visited view focus should always be moved back
|
|
56
|
+
* to the element that the user was last focused on when they were on this view.
|
|
57
|
+
*/
|
|
58
|
+
const lastFocus = referenceEl.querySelector<HTMLElement>(`[${LAST_FOCUS}]`);
|
|
59
|
+
if (lastFocus && isVisible(lastFocus)) {
|
|
60
|
+
moveFocus(lastFocus);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
for (const priority of focusManagerPriorities) {
|
|
65
|
+
/**
|
|
66
|
+
* For each recognized case (excluding the default case) make sure to return
|
|
67
|
+
* so that the fallback focus behavior does not run.
|
|
68
|
+
*
|
|
69
|
+
* We intentionally query for specific roles/semantic elements so that the
|
|
70
|
+
* transition manager can work with both Ionic and non-Ionic UI components.
|
|
71
|
+
*
|
|
72
|
+
* If new selectors are added, be sure to remove the outline ring by adding
|
|
73
|
+
* new selectors to rule in core.scss.
|
|
74
|
+
*/
|
|
75
|
+
switch (priority) {
|
|
76
|
+
case 'content':
|
|
77
|
+
const content = referenceEl.querySelector<HTMLElement>('main, [role="main"]');
|
|
78
|
+
if (content && isVisible(content)) {
|
|
79
|
+
moveFocus(content);
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
case 'heading':
|
|
84
|
+
const headingOne = referenceEl.querySelector<HTMLElement>('h1, [role="heading"][aria-level="1"]');
|
|
85
|
+
if (headingOne && isVisible(headingOne)) {
|
|
86
|
+
moveFocus(headingOne);
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
case 'banner':
|
|
91
|
+
const header = referenceEl.querySelector<HTMLElement>('header, [role="banner"]');
|
|
92
|
+
if (header && isVisible(header)) {
|
|
93
|
+
moveFocus(header);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
break;
|
|
97
|
+
default:
|
|
98
|
+
// printIonWarning(`Unrecognized focus manager priority value ${priority}`);
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* If there is nothing to focus then focus the page so focus at least moves to
|
|
105
|
+
* the correct view. The browser will then determine where within the page to
|
|
106
|
+
* move focus to.
|
|
107
|
+
*/
|
|
108
|
+
moveFocus(referenceEl);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
saveViewFocus,
|
|
114
|
+
setViewFocus,
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
export type FocusController = {
|
|
119
|
+
saveViewFocus: (referenceEl?: HTMLElement) => void;
|
|
120
|
+
setViewFocus: (referenceEl: HTMLElement) => void;
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
const LAST_FOCUS = 'ion-last-focus';
|
package/src/index.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './transition/md.transition';
|
|
@@ -5,6 +5,16 @@
|
|
|
5
5
|
--padding-end: 16px;
|
|
6
6
|
--border-radius: 999px;
|
|
7
7
|
|
|
8
|
+
&:not(.button-round) {
|
|
9
|
+
/**
|
|
10
|
+
* for remove default style:
|
|
11
|
+
* .sc-ion-buttons-md-s ion-button:not(.button-round) {
|
|
12
|
+
* --border-radius: 2px;
|
|
13
|
+
* }
|
|
14
|
+
*/
|
|
15
|
+
--border-radius: 999px;
|
|
16
|
+
}
|
|
17
|
+
|
|
8
18
|
&::part(native) {
|
|
9
19
|
height: 40px;
|
|
10
20
|
}
|
|
@@ -48,10 +58,6 @@
|
|
|
48
58
|
--padding-start: 24px;
|
|
49
59
|
--padding-end: 24px;
|
|
50
60
|
|
|
51
|
-
&.button-square {
|
|
52
|
-
--border-radius: 16px;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
61
|
&::part(native) {
|
|
56
62
|
height: 56px;
|
|
57
63
|
}
|
|
@@ -82,7 +88,10 @@
|
|
|
82
88
|
}
|
|
83
89
|
|
|
84
90
|
&.button-square {
|
|
85
|
-
--border-radius:
|
|
91
|
+
--border-radius: 8px;
|
|
92
|
+
&.button-square {
|
|
93
|
+
--border-radius: 12px;
|
|
94
|
+
}
|
|
86
95
|
}
|
|
87
96
|
}
|
|
88
97
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Animation, NavOptions } from '@ionic/core';
|
|
2
|
+
|
|
3
|
+
export const getIonPageElement = (element: HTMLElement) => {
|
|
4
|
+
if (element.classList.contains('ion-page')) {
|
|
5
|
+
return element;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const ionPage = element.querySelector(':scope > .ion-page, :scope > ion-nav, :scope > ion-tabs');
|
|
9
|
+
if (ionPage) {
|
|
10
|
+
return ionPage;
|
|
11
|
+
}
|
|
12
|
+
// idk, return the original element so at least something animates and we don't have a null pointer
|
|
13
|
+
return element;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export interface TransitionOptions extends NavOptions {
|
|
17
|
+
progressCallback?: (ani: Animation | undefined) => void;
|
|
18
|
+
baseEl: any;
|
|
19
|
+
enteringEl: HTMLElement;
|
|
20
|
+
leavingEl: HTMLElement | undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface TransitionResult {
|
|
24
|
+
hasCompleted: boolean;
|
|
25
|
+
animation?: Animation;
|
|
26
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { Animation } from '@ionic/core/dist/types/utils/animation/animation-interface';
|
|
2
|
+
import { createAnimation } from '@ionic/core';
|
|
3
|
+
import type { TransitionOptions } from './index';
|
|
4
|
+
import { getIonPageElement } from './index';
|
|
5
|
+
|
|
6
|
+
export const mdTransitionAnimation = (_: HTMLElement, opts: TransitionOptions): Animation => {
|
|
7
|
+
const OFF_BOTTOM = 40;
|
|
8
|
+
const CENTER = 0;
|
|
9
|
+
|
|
10
|
+
const backDirection = opts.direction === 'back';
|
|
11
|
+
const enteringEl = opts.enteringEl;
|
|
12
|
+
const leavingEl = opts.leavingEl;
|
|
13
|
+
|
|
14
|
+
const ionPageElement = getIonPageElement(enteringEl);
|
|
15
|
+
const enteringToolbarEle = ionPageElement.querySelector('ion-toolbar');
|
|
16
|
+
const rootTransition = createAnimation();
|
|
17
|
+
|
|
18
|
+
rootTransition.addElement(ionPageElement).fill('both').beforeRemoveClass('ion-page-invisible');
|
|
19
|
+
|
|
20
|
+
// animate the component itself
|
|
21
|
+
if (backDirection) {
|
|
22
|
+
rootTransition.duration((opts.duration ?? 0) || 200).easing('cubic-bezier(0.47,0,0.745,0.715)');
|
|
23
|
+
} else {
|
|
24
|
+
rootTransition
|
|
25
|
+
.duration((opts.duration ?? 0) || 280)
|
|
26
|
+
.easing('cubic-bezier(0.36,0.66,0.04,1)')
|
|
27
|
+
.fromTo('transform', `translateX(${OFF_BOTTOM}px)`, `translateX(${CENTER}px)`)
|
|
28
|
+
.fromTo('opacity', 0.01, 1);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Animate toolbar if it's there
|
|
32
|
+
if (enteringToolbarEle) {
|
|
33
|
+
const enteringToolBar = createAnimation();
|
|
34
|
+
enteringToolBar.addElement(enteringToolbarEle);
|
|
35
|
+
rootTransition.addAnimation(enteringToolBar);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
if (leavingEl) {
|
|
39
|
+
const stackedTransition = createAnimation();
|
|
40
|
+
const stackedElement = getIonPageElement(leavingEl);
|
|
41
|
+
const stackedAnimationElement = stackedElement.querySelectorAll('ion-toolbar, ion-content > *');
|
|
42
|
+
if (!backDirection) {
|
|
43
|
+
stackedTransition.addElement(stackedAnimationElement);
|
|
44
|
+
stackedTransition
|
|
45
|
+
.duration((opts.duration ?? 0) || 280)
|
|
46
|
+
.easing('cubic-bezier(0.36,0.66,0.04,1)')
|
|
47
|
+
.fromTo('transform', `translateX(${CENTER}px)`, `translateX(${OFF_BOTTOM * -1}px)`);
|
|
48
|
+
} else if (backDirection) {
|
|
49
|
+
stackedTransition.addElement(ionPageElement);
|
|
50
|
+
stackedTransition
|
|
51
|
+
.duration((opts.duration ?? 0) || 200)
|
|
52
|
+
.easing('cubic-bezier(0.36,0.66,0.04,1)')
|
|
53
|
+
.fromTo('transform', `translateX(${OFF_BOTTOM * -1}px)`, `translateX(${CENTER}px)`);
|
|
54
|
+
}
|
|
55
|
+
rootTransition.addAnimation(stackedTransition);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// setup leaving view
|
|
59
|
+
if (leavingEl && backDirection) {
|
|
60
|
+
// leaving content
|
|
61
|
+
rootTransition.duration((opts.duration ?? 0) || 200).easing('cubic-bezier(0.47,0,0.745,0.715)');
|
|
62
|
+
|
|
63
|
+
const leavingPage = createAnimation();
|
|
64
|
+
leavingPage
|
|
65
|
+
.addElement(getIonPageElement(leavingEl))
|
|
66
|
+
.onFinish((currentStep) => {
|
|
67
|
+
if (currentStep === 1 && leavingPage.elements.length > 0) {
|
|
68
|
+
leavingPage.elements[0].style.setProperty('display', 'none');
|
|
69
|
+
}
|
|
70
|
+
})
|
|
71
|
+
.fromTo('transform', `translateX(${CENTER}px)`, `translateX(${OFF_BOTTOM}px)`)
|
|
72
|
+
.fromTo('opacity', 1, 0);
|
|
73
|
+
|
|
74
|
+
rootTransition.addAnimation(leavingPage);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return rootTransition;
|
|
78
|
+
};
|