@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.
Files changed (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +241 -0
  3. package/dist/css/components/ion-action-sheet.css +1 -0
  4. package/dist/css/components/ion-alert.css +1 -0
  5. package/dist/css/components/ion-button.css +1 -0
  6. package/dist/css/components/ion-card.css +1 -0
  7. package/dist/css/components/ion-content.css +1 -0
  8. package/dist/css/components/ion-datetime.css +1 -0
  9. package/dist/css/components/ion-fab.css +1 -0
  10. package/dist/css/components/ion-inputs.css +1 -0
  11. package/dist/css/components/ion-list.css +1 -0
  12. package/dist/css/components/ion-loading.css +1 -0
  13. package/dist/css/components/ion-menu.css +1 -0
  14. package/dist/css/components/ion-modal.css +1 -0
  15. package/dist/css/components/ion-picker.css +1 -0
  16. package/dist/css/components/ion-popover.css +1 -0
  17. package/dist/css/components/ion-range.css +1 -0
  18. package/dist/css/components/ion-searchbar.css +1 -0
  19. package/dist/css/components/ion-segment.css +1 -0
  20. package/dist/css/components/ion-tabs.css +1 -0
  21. package/dist/css/components/ion-toast.css +1 -0
  22. package/dist/css/components/ion-toggle.css +1 -0
  23. package/dist/css/components/ion-toolbar.css +1 -0
  24. package/dist/css/default-variables.css +1 -0
  25. package/dist/css/ionic-theme-ios26-dark-always.css +1 -0
  26. package/dist/css/ionic-theme-ios26-dark-class.css +1 -0
  27. package/dist/css/ionic-theme-ios26-dark-system.css +1 -0
  28. package/dist/css/ionic-theme-ios26.css +1 -0
  29. package/dist/css/md-ion-list-inset.css +1 -0
  30. package/dist/css/md-remove-ios-class-effect.css +1 -0
  31. package/dist/css/utils/api.css +1 -0
  32. package/dist/css/utils/dark/ion-button.css +1 -0
  33. package/dist/css/utils/dark/ion-fab.css +1 -0
  34. package/dist/css/utils/dark/ion-segment.css +1 -0
  35. package/dist/css/utils/dark/ion-tabs.css +1 -0
  36. package/dist/css/utils/searchable.css +1 -0
  37. package/dist/css/utils/structured-list.css +1 -0
  38. package/dist/css/utils/theme-dark.css +1 -0
  39. package/dist/css/utils/translucent.css +1 -0
  40. package/dist/docs.json +234 -0
  41. package/dist/focus-controller/index.d.ts +6 -0
  42. package/dist/focus-controller/index.d.ts.map +1 -0
  43. package/dist/focus-controller/index.js +62 -0
  44. package/dist/focus-controller /index.d.ts +6 -0
  45. package/dist/focus-controller /index.d.ts.map +1 -0
  46. package/dist/focus-controller /index.js +62 -0
  47. package/dist/index.d.ts +9 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +30 -0
  50. package/dist/popover/animations/ios.enter.d.ts +4 -0
  51. package/dist/popover/animations/ios.enter.d.ts.map +1 -0
  52. package/dist/popover/animations/ios.enter.js +97 -0
  53. package/dist/popover/animations/ios.leave.d.ts +3 -0
  54. package/dist/popover/animations/ios.leave.d.ts.map +1 -0
  55. package/dist/popover/animations/ios.leave.js +60 -0
  56. package/dist/popover/popover-interface.d.ts +38 -0
  57. package/dist/popover/popover-interface.d.ts.map +1 -0
  58. package/dist/popover/popover-interface.js +1 -0
  59. package/dist/popover/utils.d.ts +37 -0
  60. package/dist/popover/utils.d.ts.map +1 -0
  61. package/dist/popover/utils.js +377 -0
  62. package/dist/sheets-of-glass/animations.d.ts +8 -0
  63. package/dist/sheets-of-glass/animations.d.ts.map +1 -0
  64. package/dist/sheets-of-glass/animations.js +97 -0
  65. package/dist/sheets-of-glass/index.d.ts +3 -0
  66. package/dist/sheets-of-glass/index.d.ts.map +1 -0
  67. package/dist/sheets-of-glass/index.js +174 -0
  68. package/dist/sheets-of-glass/interfaces.d.ts +16 -0
  69. package/dist/sheets-of-glass/interfaces.d.ts.map +1 -0
  70. package/dist/sheets-of-glass/interfaces.js +1 -0
  71. package/dist/tab-bar-searchable/animations/enter.d.ts +8 -0
  72. package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -0
  73. package/dist/tab-bar-searchable/animations/enter.js +73 -0
  74. package/dist/tab-bar-searchable/animations/leave.d.ts +8 -0
  75. package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -0
  76. package/dist/tab-bar-searchable/animations/leave.js +66 -0
  77. package/dist/tab-bar-searchable/index.d.ts +4 -0
  78. package/dist/tab-bar-searchable/index.d.ts.map +1 -0
  79. package/dist/tab-bar-searchable/index.js +75 -0
  80. package/dist/tab-bar-searchable/interfaces.d.ts +41 -0
  81. package/dist/tab-bar-searchable/interfaces.d.ts.map +1 -0
  82. package/dist/tab-bar-searchable/interfaces.js +5 -0
  83. package/dist/tab-bar-searchable/utils.d.ts +12 -0
  84. package/dist/tab-bar-searchable/utils.d.ts.map +1 -0
  85. package/dist/tab-bar-searchable/utils.js +60 -0
  86. package/dist/transition/index.d.ts +19 -0
  87. package/dist/transition/index.d.ts.map +1 -0
  88. package/dist/transition/index.js +219 -0
  89. package/dist/transition/ios.transition.d.ts +5 -0
  90. package/dist/transition/ios.transition.d.ts.map +1 -0
  91. package/dist/transition/ios.transition.js +609 -0
  92. package/dist/utils.d.ts +17 -0
  93. package/dist/utils.d.ts.map +1 -0
  94. package/dist/utils.js +69 -0
  95. package/docs/e2e-testing.md +51 -0
  96. package/docs/eslint.md +73 -0
  97. package/docs/experimental-animation.md +85 -0
  98. package/docs/features.md +88 -0
  99. package/docs/feedback.md +65 -0
  100. package/docs/ios-18.md +16 -0
  101. package/docs/migration.md +94 -0
  102. package/docs/special-markup.md +145 -0
  103. package/docs/using-ion-item-group.md +47 -0
  104. package/package.json +63 -0
  105. package/src/focus-controller/index.ts +123 -0
  106. package/src/index.ts +33 -0
  107. package/src/popover/animations/ios.enter.ts +144 -0
  108. package/src/popover/animations/ios.leave.ts +76 -0
  109. package/src/popover/popover-interface.ts +44 -0
  110. package/src/popover/utils.ts +696 -0
  111. package/src/sheets-of-glass/animations.ts +120 -0
  112. package/src/sheets-of-glass/index.ts +214 -0
  113. package/src/sheets-of-glass/interfaces.ts +17 -0
  114. package/src/styles/components/ion-action-sheet.scss +85 -0
  115. package/src/styles/components/ion-alert.scss +66 -0
  116. package/src/styles/components/ion-button.scss +443 -0
  117. package/src/styles/components/ion-card.scss +7 -0
  118. package/src/styles/components/ion-content.scss +22 -0
  119. package/src/styles/components/ion-datetime.scss +9 -0
  120. package/src/styles/components/ion-fab.scss +104 -0
  121. package/src/styles/components/ion-inputs.scss +82 -0
  122. package/src/styles/components/ion-list.scss +44 -0
  123. package/src/styles/components/ion-loading.scss +11 -0
  124. package/src/styles/components/ion-menu.scss +110 -0
  125. package/src/styles/components/ion-modal.scss +42 -0
  126. package/src/styles/components/ion-picker.scss +4 -0
  127. package/src/styles/components/ion-popover.scss +33 -0
  128. package/src/styles/components/ion-range.scss +90 -0
  129. package/src/styles/components/ion-searchbar.scss +68 -0
  130. package/src/styles/components/ion-segment.scss +150 -0
  131. package/src/styles/components/ion-tabs.scss +118 -0
  132. package/src/styles/components/ion-toast.scss +35 -0
  133. package/src/styles/components/ion-toggle.scss +65 -0
  134. package/src/styles/components/ion-toolbar.scss +76 -0
  135. package/src/styles/default-variables.scss +38 -0
  136. package/src/styles/ionic-theme-ios26-dark-always.scss +6 -0
  137. package/src/styles/ionic-theme-ios26-dark-class.scss +6 -0
  138. package/src/styles/ionic-theme-ios26-dark-system.scss +8 -0
  139. package/src/styles/ionic-theme-ios26.scss +23 -0
  140. package/src/styles/md-ion-list-inset.scss +22 -0
  141. package/src/styles/md-remove-ios-class-effect.scss +14 -0
  142. package/src/styles/utils/api.scss +146 -0
  143. package/src/styles/utils/dark/ion-button.scss +58 -0
  144. package/src/styles/utils/dark/ion-fab.scss +18 -0
  145. package/src/styles/utils/dark/ion-segment.scss +12 -0
  146. package/src/styles/utils/dark/ion-tabs.scss +21 -0
  147. package/src/styles/utils/searchable.scss +0 -0
  148. package/src/styles/utils/structured-list.scss +170 -0
  149. package/src/styles/utils/theme-dark.scss +25 -0
  150. package/src/styles/utils/translucent.scss +95 -0
  151. package/src/tab-bar-searchable/animations/enter.ts +92 -0
  152. package/src/tab-bar-searchable/animations/leave.ts +89 -0
  153. package/src/tab-bar-searchable/index.ts +141 -0
  154. package/src/tab-bar-searchable/interfaces.ts +28 -0
  155. package/src/tab-bar-searchable/utils.ts +75 -0
  156. package/src/transition/index.ts +369 -0
  157. package/src/transition/ios.transition.ts +966 -0
  158. 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,6 @@
1
+ @use 'utils/theme-dark';
2
+
3
+ :root {
4
+ @include theme-dark.default-variables;
5
+ }
6
+ @include theme-dark.theme-dark;
@@ -0,0 +1,6 @@
1
+ @use 'utils/theme-dark';
2
+
3
+ .ion-palette-dark {
4
+ @include theme-dark.default-variables;
5
+ @include theme-dark.theme-dark;
6
+ }
@@ -0,0 +1,8 @@
1
+ @use 'utils/theme-dark';
2
+
3
+ @media (prefers-color-scheme: dark) {
4
+ :root {
5
+ @include theme-dark.default-variables;
6
+ }
7
+ @include theme-dark.theme-dark;
8
+ }
@@ -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