@rdlabo/ionic-theme-ios27 0.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/LICENSE +21 -0
- package/README.md +241 -0
- package/dist/css/components/ion-action-sheet.css +1 -0
- package/dist/css/components/ion-alert.css +1 -0
- package/dist/css/components/ion-button.css +1 -0
- package/dist/css/components/ion-card.css +1 -0
- package/dist/css/components/ion-content.css +1 -0
- package/dist/css/components/ion-datetime.css +1 -0
- package/dist/css/components/ion-fab.css +1 -0
- package/dist/css/components/ion-inputs.css +1 -0
- package/dist/css/components/ion-list.css +1 -0
- package/dist/css/components/ion-loading.css +1 -0
- package/dist/css/components/ion-menu.css +1 -0
- package/dist/css/components/ion-modal.css +1 -0
- package/dist/css/components/ion-picker.css +1 -0
- package/dist/css/components/ion-popover.css +1 -0
- package/dist/css/components/ion-range.css +1 -0
- package/dist/css/components/ion-searchbar.css +1 -0
- package/dist/css/components/ion-segment.css +1 -0
- package/dist/css/components/ion-tabs.css +1 -0
- package/dist/css/components/ion-toast.css +1 -0
- package/dist/css/components/ion-toggle.css +1 -0
- package/dist/css/components/ion-toolbar.css +1 -0
- package/dist/css/default-variables.css +1 -0
- package/dist/css/ionic-theme-ios26-dark-always.css +1 -0
- package/dist/css/ionic-theme-ios26-dark-class.css +1 -0
- package/dist/css/ionic-theme-ios26-dark-system.css +1 -0
- package/dist/css/ionic-theme-ios26.css +1 -0
- package/dist/css/md-ion-list-inset.css +1 -0
- package/dist/css/md-remove-ios-class-effect.css +1 -0
- package/dist/css/utils/api.css +1 -0
- package/dist/css/utils/dark/ion-button.css +1 -0
- package/dist/css/utils/dark/ion-fab.css +1 -0
- package/dist/css/utils/dark/ion-segment.css +1 -0
- package/dist/css/utils/dark/ion-tabs.css +1 -0
- package/dist/css/utils/searchable.css +1 -0
- package/dist/css/utils/structured-list.css +1 -0
- package/dist/css/utils/theme-dark.css +1 -0
- package/dist/css/utils/translucent.css +1 -0
- package/dist/docs.json +234 -0
- package/dist/focus-controller/index.d.ts +6 -0
- package/dist/focus-controller/index.d.ts.map +1 -0
- package/dist/focus-controller/index.js +62 -0
- package/dist/focus-controller /index.d.ts +6 -0
- package/dist/focus-controller /index.d.ts.map +1 -0
- package/dist/focus-controller /index.js +62 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/popover/animations/ios.enter.d.ts +4 -0
- package/dist/popover/animations/ios.enter.d.ts.map +1 -0
- package/dist/popover/animations/ios.enter.js +97 -0
- package/dist/popover/animations/ios.leave.d.ts +3 -0
- package/dist/popover/animations/ios.leave.d.ts.map +1 -0
- package/dist/popover/animations/ios.leave.js +60 -0
- package/dist/popover/popover-interface.d.ts +38 -0
- package/dist/popover/popover-interface.d.ts.map +1 -0
- package/dist/popover/popover-interface.js +1 -0
- package/dist/popover/utils.d.ts +37 -0
- package/dist/popover/utils.d.ts.map +1 -0
- package/dist/popover/utils.js +377 -0
- package/dist/sheets-of-glass/animations.d.ts +8 -0
- package/dist/sheets-of-glass/animations.d.ts.map +1 -0
- package/dist/sheets-of-glass/animations.js +97 -0
- package/dist/sheets-of-glass/index.d.ts +3 -0
- package/dist/sheets-of-glass/index.d.ts.map +1 -0
- package/dist/sheets-of-glass/index.js +174 -0
- package/dist/sheets-of-glass/interfaces.d.ts +16 -0
- package/dist/sheets-of-glass/interfaces.d.ts.map +1 -0
- package/dist/sheets-of-glass/interfaces.js +1 -0
- package/dist/tab-bar-searchable/animations/enter.d.ts +8 -0
- package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -0
- package/dist/tab-bar-searchable/animations/enter.js +73 -0
- package/dist/tab-bar-searchable/animations/leave.d.ts +8 -0
- package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -0
- package/dist/tab-bar-searchable/animations/leave.js +66 -0
- package/dist/tab-bar-searchable/index.d.ts +4 -0
- package/dist/tab-bar-searchable/index.d.ts.map +1 -0
- package/dist/tab-bar-searchable/index.js +75 -0
- package/dist/tab-bar-searchable/interfaces.d.ts +41 -0
- package/dist/tab-bar-searchable/interfaces.d.ts.map +1 -0
- package/dist/tab-bar-searchable/interfaces.js +5 -0
- package/dist/tab-bar-searchable/utils.d.ts +12 -0
- package/dist/tab-bar-searchable/utils.d.ts.map +1 -0
- package/dist/tab-bar-searchable/utils.js +60 -0
- package/dist/transition/index.d.ts +19 -0
- package/dist/transition/index.d.ts.map +1 -0
- package/dist/transition/index.js +219 -0
- package/dist/transition/ios.transition.d.ts +5 -0
- package/dist/transition/ios.transition.d.ts.map +1 -0
- package/dist/transition/ios.transition.js +609 -0
- package/dist/utils.d.ts +17 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +69 -0
- package/docs/e2e-testing.md +51 -0
- package/docs/eslint.md +73 -0
- package/docs/experimental-animation.md +85 -0
- package/docs/features.md +88 -0
- package/docs/feedback.md +65 -0
- package/docs/ios-18.md +16 -0
- package/docs/migration.md +94 -0
- package/docs/special-markup.md +145 -0
- package/docs/using-ion-item-group.md +47 -0
- package/package.json +63 -0
- package/src/focus-controller/index.ts +123 -0
- package/src/index.ts +33 -0
- package/src/popover/animations/ios.enter.ts +144 -0
- package/src/popover/animations/ios.leave.ts +76 -0
- package/src/popover/popover-interface.ts +44 -0
- package/src/popover/utils.ts +696 -0
- package/src/sheets-of-glass/animations.ts +120 -0
- package/src/sheets-of-glass/index.ts +214 -0
- package/src/sheets-of-glass/interfaces.ts +17 -0
- package/src/styles/components/ion-action-sheet.scss +85 -0
- package/src/styles/components/ion-alert.scss +66 -0
- package/src/styles/components/ion-button.scss +443 -0
- package/src/styles/components/ion-card.scss +7 -0
- package/src/styles/components/ion-content.scss +22 -0
- package/src/styles/components/ion-datetime.scss +9 -0
- package/src/styles/components/ion-fab.scss +104 -0
- package/src/styles/components/ion-inputs.scss +82 -0
- package/src/styles/components/ion-list.scss +44 -0
- package/src/styles/components/ion-loading.scss +11 -0
- package/src/styles/components/ion-menu.scss +110 -0
- package/src/styles/components/ion-modal.scss +42 -0
- package/src/styles/components/ion-picker.scss +4 -0
- package/src/styles/components/ion-popover.scss +33 -0
- package/src/styles/components/ion-range.scss +90 -0
- package/src/styles/components/ion-searchbar.scss +68 -0
- package/src/styles/components/ion-segment.scss +150 -0
- package/src/styles/components/ion-tabs.scss +118 -0
- package/src/styles/components/ion-toast.scss +35 -0
- package/src/styles/components/ion-toggle.scss +65 -0
- package/src/styles/components/ion-toolbar.scss +76 -0
- package/src/styles/default-variables.scss +38 -0
- package/src/styles/ionic-theme-ios26-dark-always.scss +6 -0
- package/src/styles/ionic-theme-ios26-dark-class.scss +6 -0
- package/src/styles/ionic-theme-ios26-dark-system.scss +8 -0
- package/src/styles/ionic-theme-ios26.scss +23 -0
- package/src/styles/md-ion-list-inset.scss +22 -0
- package/src/styles/md-remove-ios-class-effect.scss +14 -0
- package/src/styles/utils/api.scss +146 -0
- package/src/styles/utils/dark/ion-button.scss +58 -0
- package/src/styles/utils/dark/ion-fab.scss +18 -0
- package/src/styles/utils/dark/ion-segment.scss +12 -0
- package/src/styles/utils/dark/ion-tabs.scss +21 -0
- package/src/styles/utils/searchable.scss +0 -0
- package/src/styles/utils/structured-list.scss +170 -0
- package/src/styles/utils/theme-dark.scss +25 -0
- package/src/styles/utils/translucent.scss +95 -0
- package/src/tab-bar-searchable/animations/enter.ts +92 -0
- package/src/tab-bar-searchable/animations/leave.ts +89 -0
- package/src/tab-bar-searchable/index.ts +141 -0
- package/src/tab-bar-searchable/interfaces.ts +28 -0
- package/src/tab-bar-searchable/utils.ts +75 -0
- package/src/transition/index.ts +369 -0
- package/src/transition/ios.transition.ts +966 -0
- package/src/utils.ts +91 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
@use '../utils/api';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Adjustments have been made to prevent the right edge from being cut off within the ion-item.
|
|
5
|
+
* When the native-inner part be added to the ion-item, it will be removed.
|
|
6
|
+
*/
|
|
7
|
+
ion-item.ios:not(.ios26-disabled) ion-toggle.ios:not(.ios26-disabled) {
|
|
8
|
+
&.toggle-checked.toggle-activated::part(track) {
|
|
9
|
+
transform-origin: left;
|
|
10
|
+
transform: scaleX(0.894) translateZ(0);
|
|
11
|
+
-webkit-transform: scaleX(0.894) translateZ(0);
|
|
12
|
+
}
|
|
13
|
+
&.toggle-activated::part(handle) {
|
|
14
|
+
transform: scale(1.4, 1.6) translateX(calc(38px * -0.15)) translateZ(0);
|
|
15
|
+
-webkit-transform: scale(1.4, 1.6) translateX(calc(38px * -0.15)) translateZ(0);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
ion-toggle.ios:not(.ios26-disabled) {
|
|
20
|
+
--handle-width: 38px;
|
|
21
|
+
--handle-height: 24px;
|
|
22
|
+
--handle-max-width: none;
|
|
23
|
+
--handle-max-height: none;
|
|
24
|
+
--handle-box-shadow: none;
|
|
25
|
+
&.ion-color {
|
|
26
|
+
--track-background: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.23);
|
|
27
|
+
}
|
|
28
|
+
&:not(.ion-color) {
|
|
29
|
+
--track-background: rgba(var(--ion-color-contrast-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 0.23);
|
|
30
|
+
}
|
|
31
|
+
&::part(track) {
|
|
32
|
+
overflow: visible;
|
|
33
|
+
width: 64px;
|
|
34
|
+
height: 28px;
|
|
35
|
+
transition: transform 280ms ease;
|
|
36
|
+
}
|
|
37
|
+
&.toggle-activated:not(.toggle-checked)::part(handle) {
|
|
38
|
+
transform: translateX(-4px) scale(1.4, 1.6) translateZ(0);
|
|
39
|
+
-webkit-transform: translateX(-4px) scale(1.4, 1.6) translateZ(0);
|
|
40
|
+
}
|
|
41
|
+
&.toggle-activated.toggle-checked::part(handle) {
|
|
42
|
+
transform: scale(1.4, 1.6) translateZ(0);
|
|
43
|
+
}
|
|
44
|
+
&.toggle-activated::part(handle) {
|
|
45
|
+
transform: scale(1.4, 1.6) translateZ(0);
|
|
46
|
+
-webkit-transform: scale(1.4, 1.6) translateZ(0);
|
|
47
|
+
--handle-transition: transform 280ms, width 120ms ease-in-out 80ms, left 110ms ease-in-out 80ms, right 110ms ease-in-out 80ms;
|
|
48
|
+
@include api.glass-background($opacity: 0.1, $blur: 0.5px, $saturate: 120%, $include-background: false, $include-box-shadow: false);
|
|
49
|
+
}
|
|
50
|
+
&.toggle-activated {
|
|
51
|
+
--handle-background: rgba(var(--ios26-glass-background-rgb), 0.1);
|
|
52
|
+
--handle-background-checked: rgba(var(--ios26-glass-background-rgb), 0.1);
|
|
53
|
+
--handle-box-shadow: inset 0 0 8px 0 var(--track-background);
|
|
54
|
+
}
|
|
55
|
+
&.ion-color.toggle-checked.toggle-activated {
|
|
56
|
+
--handle-box-shadow:
|
|
57
|
+
inset 0 8px 8px -8px var(--ion-color-base), inset 8px 0 8px -8px var(--track-background),
|
|
58
|
+
inset 8px 0 8px -8px var(--track-background), inset -8px 0 8px -8px var(--ion-color-base);
|
|
59
|
+
}
|
|
60
|
+
&.toggle-checked.toggle-activated {
|
|
61
|
+
--handle-box-shadow:
|
|
62
|
+
inset 0 8px 8px -8px var(--track-background-checked), inset 8px 0 8px -8px var(--track-background),
|
|
63
|
+
inset 8px 0 8px -8px var(--track-background), inset -8px 0 8px -8px var(--track-background-checked);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
@use 'ion-button';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* https://github.com/ionic-team/ionic-framework/blob/main/core/src/components/header/header.scss#L17-L19
|
|
5
|
+
* ion-header ion-toolbar:first-of-type {
|
|
6
|
+
* padding-top: var(--ion-safe-area-top, 0);
|
|
7
|
+
* }
|
|
8
|
+
*/
|
|
9
|
+
ion-header.ios:not(.ios26-disabled) ion-toolbar:not(.ios26-disabled):first-of-type {
|
|
10
|
+
padding-top: max(calc(var(--ion-safe-area-top) - 12px), 4px);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
ion-modal.ios:not(.ios26-disabled).modal-card,
|
|
14
|
+
ion-modal.ios:not(.ios26-disabled).modal-sheet {
|
|
15
|
+
ion-header.ios:not(.ios26-disabled) ion-toolbar.ios:not(.ios26-disabled):first-of-type {
|
|
16
|
+
padding-top: 6px;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
ion-header.ios.header-collapse-condense:not(.ios26-disabled) ion-toolbar:not(.ios26-disabled):first-of-type {
|
|
21
|
+
padding-top: 0;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
ion-toolbar.ios:not(.toolbar-title-large):not(.ios26-disabled):not(:has(ion-segment.segment-expand)) {
|
|
25
|
+
--min-height: 68px;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
ion-header.ios:not(.ios26-disabled):not(.header-collapse-condense):not(:where(ion-modal *))
|
|
29
|
+
> ion-toolbar.ios:not(.ios26-disabled):not(.toolbar-title-large):not(.toolbar-searchbar):not(
|
|
30
|
+
:has(ion-segment.segment-expand)
|
|
31
|
+
):first-of-type {
|
|
32
|
+
padding-top: max(calc(var(--ion-safe-area-top) - 10px), 6px);
|
|
33
|
+
--min-height: 64px;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
ion-toolbar.ios:not(.ios26-disabled).toolbar-searchbar {
|
|
37
|
+
*[slot='start'],
|
|
38
|
+
*[slot='end'] {
|
|
39
|
+
align-self: center;
|
|
40
|
+
}
|
|
41
|
+
&:has(ion-buttons[slot='start']) {
|
|
42
|
+
ion-buttons[slot='start'] {
|
|
43
|
+
margin-right: 6px;
|
|
44
|
+
}
|
|
45
|
+
ion-searchbar.ios:not(.ios26-disabled) {
|
|
46
|
+
.searchbar-input-container {
|
|
47
|
+
margin: 0 12px 0 6px;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
&:has(ion-buttons[slot='end']) {
|
|
52
|
+
ion-buttons[slot='end'] {
|
|
53
|
+
margin-left: 6px;
|
|
54
|
+
}
|
|
55
|
+
ion-searchbar.ios:not(.ios26-disabled) {
|
|
56
|
+
.searchbar-input-container {
|
|
57
|
+
margin: 0 6px 0 12px;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
ion-toolbar.ios:not(.ios26-disabled) {
|
|
64
|
+
ion-buttons {
|
|
65
|
+
margin-left: 12px;
|
|
66
|
+
margin-right: 12px;
|
|
67
|
+
}
|
|
68
|
+
ion-back-button {
|
|
69
|
+
margin-left: 12px;
|
|
70
|
+
margin-right: 12px;
|
|
71
|
+
}
|
|
72
|
+
ion-buttons > ion-back-button {
|
|
73
|
+
margin-left: 0;
|
|
74
|
+
margin-right: 0;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @naming
|
|
3
|
+
* prefix: ios26
|
|
4
|
+
* target-element: tab-button
|
|
5
|
+
* target css property: color
|
|
6
|
+
* status: selected
|
|
7
|
+
* additional information: rgb
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
:root {
|
|
11
|
+
--ios26-floating-safe-area-top: max(10px, var(--ion-safe-area-top, 0px));
|
|
12
|
+
--ios26-floating-safe-area-bottom: max(10px, calc(var(--ion-safe-area-bottom, 0px) - 12px));
|
|
13
|
+
|
|
14
|
+
--ios26-activated-transition-duration: 140ms;
|
|
15
|
+
|
|
16
|
+
--ios26-glass-background-rgb: 255, 255, 255;
|
|
17
|
+
--ios26-glass-box-shadow-color-rgb: 220, 220, 220;
|
|
18
|
+
--ios26-glass-border-color-rgb: 255, 255, 255;
|
|
19
|
+
--ios26-button-color-selected-rgb: 16, 16, 16;
|
|
20
|
+
|
|
21
|
+
--ios26-menu-width: 360px;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* `--ios26-color-background-rgb` is deprecated.
|
|
25
|
+
* You should replace to '--ios26-content-box-shadow-rgb'.
|
|
26
|
+
* This variable can also be defined in root, but if you want to set multiple background colors individually, it is easier to set them as follows.
|
|
27
|
+
* ion-content { --ios26-content-box-shadow-rgb: var(--ion-color-base-rgb); }
|
|
28
|
+
*/
|
|
29
|
+
--ios26-content-box-shadow-rgb: var(--ion-color-base-rgb, var(--ion-background-color-rgb, 255, 255, 255));
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* `--ion-color-**-brightness-rgb` is deprecated.
|
|
33
|
+
* You should replace to '--ion-color-**-brightness'
|
|
34
|
+
*/
|
|
35
|
+
@each $item in primary, secondary, tertiary, success, warning, danger, light, medium, dark {
|
|
36
|
+
--ion-color-#{$item}-brightness: rgb(var(--ion-color-#{$item}-brightness-rgb));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
@use 'utils/translucent';
|
|
2
|
+
|
|
3
|
+
@use 'components/ion-action-sheet';
|
|
4
|
+
@use 'components/ion-alert';
|
|
5
|
+
@use 'components/ion-button';
|
|
6
|
+
@use 'components/ion-card';
|
|
7
|
+
@use 'components/ion-content';
|
|
8
|
+
@use 'components/ion-datetime';
|
|
9
|
+
@use 'components/ion-fab';
|
|
10
|
+
@use 'components/ion-inputs';
|
|
11
|
+
@use 'components/ion-list';
|
|
12
|
+
@use 'components/ion-loading';
|
|
13
|
+
@use 'components/ion-menu';
|
|
14
|
+
@use 'components/ion-modal';
|
|
15
|
+
@use 'components/ion-picker';
|
|
16
|
+
@use 'components/ion-popover';
|
|
17
|
+
@use 'components/ion-range';
|
|
18
|
+
@use 'components/ion-searchbar';
|
|
19
|
+
@use 'components/ion-segment';
|
|
20
|
+
@use 'components/ion-tabs';
|
|
21
|
+
@use 'components/ion-toast';
|
|
22
|
+
@use 'components/ion-toggle';
|
|
23
|
+
@use 'components/ion-toolbar';
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
@use 'utils/structured-list';
|
|
2
|
+
|
|
3
|
+
ion-list.md {
|
|
4
|
+
@include structured-list.support-text;
|
|
5
|
+
|
|
6
|
+
&.list-inset {
|
|
7
|
+
@include structured-list.layout(8px, 16px);
|
|
8
|
+
:is(#{structured-list.$groups}) ion-item {
|
|
9
|
+
& > ion-input[labelplacement='floating'] {
|
|
10
|
+
transition: transform 200ms ease;
|
|
11
|
+
|
|
12
|
+
&:not(.label-floating) {
|
|
13
|
+
transform: translateY(-7px);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
&.label-floating {
|
|
17
|
+
transform: translateY(-4px);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
ion-buttons.md {
|
|
2
|
+
/**
|
|
3
|
+
* ion-buttons.ios26-disabled > ion-button.button-default is for ios26 structure.
|
|
4
|
+
* for .md, remove button-default styles. Will be button-clear.
|
|
5
|
+
*/
|
|
6
|
+
ion-button.md:not(.ios26-disabled).button-default {
|
|
7
|
+
// copy .button-clear
|
|
8
|
+
--color: initial;
|
|
9
|
+
--background: transparent;
|
|
10
|
+
--background-activated: transparent;
|
|
11
|
+
--background-focused: transparent;
|
|
12
|
+
--background-hover: transparent;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
$button-scaleup-small-icon-only: 1.18;
|
|
2
|
+
$button-scaleup-default-icon-only: 1.38;
|
|
3
|
+
$button-scaleup-large-icon-only: 1.22;
|
|
4
|
+
|
|
5
|
+
$_glass-surface: linear-gradient(
|
|
6
|
+
180deg,
|
|
7
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 4%,
|
|
8
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.01) 8%,
|
|
9
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.024) 16%,
|
|
10
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.027) 22%,
|
|
11
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.026) 28%,
|
|
12
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.018) 36%,
|
|
13
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.011) 44%,
|
|
14
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.009) 50%,
|
|
15
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 58%,
|
|
16
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.008) 80%,
|
|
17
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.006) 88%,
|
|
18
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0) 94%
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
@mixin glass-background(
|
|
22
|
+
$opacity: 0.72,
|
|
23
|
+
$blur: 2px,
|
|
24
|
+
$saturate: 360%,
|
|
25
|
+
$background-rgb: var(--ios26-glass-background-rgb),
|
|
26
|
+
$border-color-rgb: var(--ios26-glass-border-color-rgb),
|
|
27
|
+
$include-background: true,
|
|
28
|
+
$include-box-shadow: true,
|
|
29
|
+
$include-border: true,
|
|
30
|
+
$shadow-opacity: 0.18
|
|
31
|
+
) {
|
|
32
|
+
$surface: linear-gradient(transparent, transparent);
|
|
33
|
+
@if $include-background {
|
|
34
|
+
$surface: $_glass-surface;
|
|
35
|
+
}
|
|
36
|
+
@if $include-background {
|
|
37
|
+
background: $_glass-surface, rgba($background-rgb, $opacity);
|
|
38
|
+
}
|
|
39
|
+
backdrop-filter: blur($blur) saturate($saturate);
|
|
40
|
+
@if $include-box-shadow {
|
|
41
|
+
box-shadow:
|
|
42
|
+
inset 0 0 0 0.5px rgba($border-color-rgb, 0.6),
|
|
43
|
+
inset 0 0 1px 0 rgba(var(--ios26-glass-box-shadow-color-rgb), 0.18),
|
|
44
|
+
inset 0 1px 2px 0 rgba($border-color-rgb, 0.8),
|
|
45
|
+
inset 0 -1px 2px 0 rgba($border-color-rgb, 0.5),
|
|
46
|
+
0 0.5px 1px 0 rgba(var(--ios26-glass-box-shadow-color-rgb), $shadow-opacity);
|
|
47
|
+
}
|
|
48
|
+
@if $include-border {
|
|
49
|
+
border: 0.5px solid;
|
|
50
|
+
border-top-color: rgba($border-color-rgb, 1);
|
|
51
|
+
border-right-color: rgba($border-color-rgb, 0.8);
|
|
52
|
+
border-bottom-color: rgba($border-color-rgb, 1);
|
|
53
|
+
border-left-color: rgba($border-color-rgb, 0.6);
|
|
54
|
+
@supports (color: color-mix(in srgb, white, black)) {
|
|
55
|
+
border-top-color: color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 12%);
|
|
56
|
+
border-right-color: color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 32%);
|
|
57
|
+
border-bottom-color: color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 16%);
|
|
58
|
+
border-left-color: color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 28%);
|
|
59
|
+
}
|
|
60
|
+
@supports (background-clip: border-area) and (color: color-mix(in srgb, white, black)) {
|
|
61
|
+
border-color: transparent;
|
|
62
|
+
background-image:
|
|
63
|
+
linear-gradient(
|
|
64
|
+
180deg,
|
|
65
|
+
color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 12%) 0%,
|
|
66
|
+
color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 18%) 7%,
|
|
67
|
+
color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 29%) 25%,
|
|
68
|
+
color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 36%) 50%,
|
|
69
|
+
color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 28%) 75%,
|
|
70
|
+
color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 18%) 93%,
|
|
71
|
+
color-mix(in srgb, rgb($border-color-rgb), rgb(var(--ion-text-color-rgb, 0, 0, 0)) 16%) 100%
|
|
72
|
+
),
|
|
73
|
+
$surface;
|
|
74
|
+
background-origin: border-box, padding-box;
|
|
75
|
+
background-clip: border-area, padding-box;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Hardware acceleration optimization for glass effects
|
|
80
|
+
transform: translateZ(0);
|
|
81
|
+
-webkit-transform: translateZ(0);
|
|
82
|
+
-webkit-backface-visibility: hidden;
|
|
83
|
+
backface-visibility: hidden;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@mixin glass-background-button-activated {
|
|
87
|
+
background-color: rgba(var(--ios26-glass-background-rgb), 0.96);
|
|
88
|
+
border-color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.12) rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.32)
|
|
89
|
+
rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.16) rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.28);
|
|
90
|
+
box-shadow:
|
|
91
|
+
inset 0 0 0 0.5px rgba(var(--ios26-glass-border-color-rgb), 0.95),
|
|
92
|
+
inset 0 1px 3px 0 rgba(var(--ios26-glass-border-color-rgb), 0.85),
|
|
93
|
+
inset 0 -1px 2px 0 rgba(var(--ios26-glass-border-color-rgb), 0.6),
|
|
94
|
+
0 0.5px 1px 0 rgba(var(--ios26-glass-box-shadow-color-rgb), 0.12);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@mixin glass-background-button-activated-dark(
|
|
98
|
+
$opacity: 0.56,
|
|
99
|
+
$blur: 7px,
|
|
100
|
+
$saturate: 180%,
|
|
101
|
+
$include-background: true,
|
|
102
|
+
$include-box-shadow: true
|
|
103
|
+
) {
|
|
104
|
+
@if $include-background {
|
|
105
|
+
background: rgba(var(--ios26-button-color-selected-rgb), $opacity);
|
|
106
|
+
} @else {
|
|
107
|
+
background-color: rgba(var(--ios26-button-color-selected-rgb), $opacity);
|
|
108
|
+
}
|
|
109
|
+
backdrop-filter: blur($blur) saturate($saturate);
|
|
110
|
+
@if $include-box-shadow {
|
|
111
|
+
box-shadow: inset 0 0 16px 0 rgba(var(--ios26-glass-box-shadow-color-rgb), 0.55);
|
|
112
|
+
}
|
|
113
|
+
border-top: 0.8px solid rgba(var(--ios26-button-color-selected-rgb), 0.8);
|
|
114
|
+
border-right: 0.8px solid rgba(var(--ios26-button-color-selected-rgb), 0.4);
|
|
115
|
+
border-bottom: 0.8px solid rgba(var(--ios26-button-color-selected-rgb), 0.8);
|
|
116
|
+
border-left: 0.8px solid rgba(var(--ios26-button-color-selected-rgb), 0.6);
|
|
117
|
+
background-image: none;
|
|
118
|
+
background-clip: border-box;
|
|
119
|
+
background-origin: padding-box;
|
|
120
|
+
|
|
121
|
+
-webkit-backface-visibility: hidden;
|
|
122
|
+
backface-visibility: hidden;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
@mixin glass-background-overlay {
|
|
126
|
+
@include glass-background($opacity: 0.6667, $blur: 8px);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
@mixin glass-background-overlay-activated {
|
|
130
|
+
@include glass-background($opacity: 0.6667, $blur: 8px);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@mixin glass-background-overlay-button {
|
|
134
|
+
transition: background 0.2s ease;
|
|
135
|
+
background: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.1);
|
|
136
|
+
&.ion-activated {
|
|
137
|
+
background: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.022);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
@mixin glass-background-overlay-button-variable {
|
|
142
|
+
--button-background: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.1);
|
|
143
|
+
&.ion-activated {
|
|
144
|
+
--button-background: rgba(var(--ion-text-color-rgb, 0, 0, 0), 0.022);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
@use '../api';
|
|
2
|
+
|
|
3
|
+
@mixin theme-dark-buttons {
|
|
4
|
+
&:has(.ion-activated) {
|
|
5
|
+
@include api.glass-background-button-activated-dark;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
ion-button:not(.ios26-disabled).button-clear {
|
|
9
|
+
&.ion-activated {
|
|
10
|
+
color: rgb(var(--ion-text-color-rgb, 0, 0, 0));
|
|
11
|
+
&.ion-color {
|
|
12
|
+
color: rgb(var(--ion-color-base-rgb, var(--ion-text-color-rgb, 0, 0, 0)));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
ion-button:not(.ios26-disabled),
|
|
18
|
+
ion-back-button:not(.ios26-disabled) {
|
|
19
|
+
&.ion-activated {
|
|
20
|
+
--color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 1);
|
|
21
|
+
|
|
22
|
+
&.ion-color {
|
|
23
|
+
--color: rgba(var(--ion-color-base-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 1);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@mixin theme-dark-button($is-back-button: false) {
|
|
30
|
+
&.ion-activated:not(.button-solid):not(.button-outline):not(.button-clear) {
|
|
31
|
+
--background: rgba(var(--ios26-button-color-selected-rgb), 0.56);
|
|
32
|
+
--color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 1);
|
|
33
|
+
@if not $is-back-button {
|
|
34
|
+
--box-shadow: inset 0 0 16px 0 rgba(var(--ios26-glass-box-shadow-color-rgb), 0.55);
|
|
35
|
+
}
|
|
36
|
+
&.ion-color {
|
|
37
|
+
--color: rgba(var(--ion-color-base-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 1);
|
|
38
|
+
}
|
|
39
|
+
&::part(native) {
|
|
40
|
+
@include api.glass-background-button-activated-dark($include-background: false);
|
|
41
|
+
}
|
|
42
|
+
ion-icon {
|
|
43
|
+
color: rgb(255, 255, 255);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@mixin ion-button {
|
|
49
|
+
ion-buttons.ios:not(.ios26-disabled):not(:has(ion-back-button, ion-button:not(.button-clear))) {
|
|
50
|
+
@include theme-dark-buttons;
|
|
51
|
+
}
|
|
52
|
+
ion-button.ios:not(.ios26-disabled) {
|
|
53
|
+
@include theme-dark-button;
|
|
54
|
+
}
|
|
55
|
+
ion-back-button.ios:not(.ios26-disabled) {
|
|
56
|
+
@include theme-dark-button($is-back-button: true);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
@use '../api';
|
|
2
|
+
|
|
3
|
+
@mixin ion-fab {
|
|
4
|
+
ion-fab.ios:not(.ios26-disabled) {
|
|
5
|
+
ion-fab-button {
|
|
6
|
+
&.ion-activated {
|
|
7
|
+
&::part(native) {
|
|
8
|
+
@include api.glass-background-button-activated-dark($include-background: false);
|
|
9
|
+
}
|
|
10
|
+
--color: rgba(var(--ion-text-color-rgb, 0, 0, 0), 1);
|
|
11
|
+
|
|
12
|
+
&.ion-color {
|
|
13
|
+
--color: rgba(var(--ion-color-base-rgb, var(--ion-text-color-rgb, 0, 0, 0)), 1);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
@mixin ion-segment {
|
|
2
|
+
ion-segment.ios:not(.ios26-disabled) {
|
|
3
|
+
}
|
|
4
|
+
ion-segment-button.ios:not(.ios26-disabled) {
|
|
5
|
+
&.ion-cloned-element {
|
|
6
|
+
&::part(native) {
|
|
7
|
+
--ios26-glass-border-color-rgb: 120, 120, 120;
|
|
8
|
+
box-shadow: inset 0 0 8px 0 rgba(255, 255, 255, 0.2);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
@use '../api';
|
|
2
|
+
|
|
3
|
+
@mixin ion-tabs {
|
|
4
|
+
ion-tab-bar.ios:not(.ios26-disabled) {
|
|
5
|
+
}
|
|
6
|
+
ion-tab-button.ios:not(.ios26-disabled) {
|
|
7
|
+
&.ion-activated {
|
|
8
|
+
ion-label,
|
|
9
|
+
ion-icon {
|
|
10
|
+
filter: brightness(118%);
|
|
11
|
+
opacity: 0.95;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
&.ion-cloned-element {
|
|
15
|
+
&::part(native) {
|
|
16
|
+
--ios26-glass-border-color-rgb: 120, 120, 120;
|
|
17
|
+
box-shadow: inset 0 0 8px 0 rgba(255, 255, 255, 0.2);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
File without changes
|