@rdlabo/ionic-theme-ios27 1.2.0-3 → 1.2.0-4

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 (175) hide show
  1. package/README.md +15 -2
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/css/ionic-theme-ios27.css +1 -1
  4. package/dist/css/vertical-bars.css +1 -1
  5. package/dist/focus-controller/index.d.ts +4 -2
  6. package/dist/focus-controller/index.d.ts.map +1 -1
  7. package/dist/focus-controller/index.js +100 -57
  8. package/dist/focus-controller/index.js.map +1 -0
  9. package/dist/index.d.ts +10 -8
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +54 -60
  12. package/dist/index.js.map +1 -0
  13. package/dist/native/components/index.d.ts +13 -10
  14. package/dist/native/components/index.d.ts.map +1 -1
  15. package/dist/native/components/index.js +39 -41
  16. package/dist/native/components/index.js.map +1 -0
  17. package/dist/native/components/ion-back-button.d.ts +6 -1
  18. package/dist/native/components/ion-back-button.d.ts.map +1 -1
  19. package/dist/native/components/ion-back-button.js +19 -13
  20. package/dist/native/components/ion-back-button.js.map +1 -0
  21. package/dist/native/components/ion-button.d.ts +8 -2
  22. package/dist/native/components/ion-button.d.ts.map +1 -1
  23. package/dist/native/components/ion-button.js +22 -17
  24. package/dist/native/components/ion-button.js.map +1 -0
  25. package/dist/native/components/ion-buttons.d.ts +8 -2
  26. package/dist/native/components/ion-buttons.d.ts.map +1 -1
  27. package/dist/native/components/ion-buttons.js +29 -33
  28. package/dist/native/components/ion-buttons.js.map +1 -0
  29. package/dist/native/components/ion-fab.d.ts +6 -1
  30. package/dist/native/components/ion-fab.d.ts.map +1 -1
  31. package/dist/native/components/ion-fab.js +131 -151
  32. package/dist/native/components/ion-fab.js.map +1 -0
  33. package/dist/native/components/ion-menu-button.d.ts +8 -2
  34. package/dist/native/components/ion-menu-button.d.ts.map +1 -1
  35. package/dist/native/components/ion-menu-button.js +29 -19
  36. package/dist/native/components/ion-menu-button.js.map +1 -0
  37. package/dist/native/components/ion-segment.d.ts +6 -1
  38. package/dist/native/components/ion-segment.d.ts.map +1 -1
  39. package/dist/native/components/ion-segment.js +29 -23
  40. package/dist/native/components/ion-segment.js.map +1 -0
  41. package/dist/native/components/ion-tab-bar.d.ts +6 -1
  42. package/dist/native/components/ion-tab-bar.d.ts.map +1 -1
  43. package/dist/native/components/ion-tab-bar.js +49 -40
  44. package/dist/native/components/ion-tab-bar.js.map +1 -0
  45. package/dist/native/components/searchable-tabs.d.ts +17 -15
  46. package/dist/native/components/searchable-tabs.d.ts.map +1 -1
  47. package/dist/native/components/searchable-tabs.js +382 -434
  48. package/dist/native/components/searchable-tabs.js.map +1 -0
  49. package/dist/native/definitions.d.ts +118 -111
  50. package/dist/native/definitions.d.ts.map +1 -1
  51. package/dist/native/definitions.js +0 -1
  52. package/dist/native/foldable/fold-state.d.ts +5 -0
  53. package/dist/native/foldable/fold-state.d.ts.map +1 -0
  54. package/dist/native/foldable/fold-state.js +14 -0
  55. package/dist/native/foldable/fold-state.js.map +1 -0
  56. package/dist/native/foldable/types.d.ts +12 -0
  57. package/dist/native/foldable/types.d.ts.map +1 -0
  58. package/dist/native/foldable/types.js +0 -0
  59. package/dist/native/index.d.ts +6 -3
  60. package/dist/native/index.d.ts.map +1 -1
  61. package/dist/native/index.js +228 -204
  62. package/dist/native/index.js.map +1 -0
  63. package/dist/native/prehide.d.ts +4 -2
  64. package/dist/native/prehide.d.ts.map +1 -1
  65. package/dist/native/prehide.js +220 -242
  66. package/dist/native/prehide.js.map +1 -0
  67. package/dist/native/runtime.d.ts +3 -1
  68. package/dist/native/runtime.d.ts.map +1 -1
  69. package/dist/native/runtime.js +626 -730
  70. package/dist/native/runtime.js.map +1 -0
  71. package/dist/native/shared/candidate.d.ts +16 -11
  72. package/dist/native/shared/candidate.d.ts.map +1 -1
  73. package/dist/native/shared/candidate.js +96 -95
  74. package/dist/native/shared/candidate.js.map +1 -0
  75. package/dist/native/shared/crossfade.d.ts +6 -4
  76. package/dist/native/shared/crossfade.d.ts.map +1 -1
  77. package/dist/native/shared/crossfade.js +49 -45
  78. package/dist/native/shared/crossfade.js.map +1 -0
  79. package/dist/native/shared/dom.d.ts +7 -5
  80. package/dist/native/shared/dom.d.ts.map +1 -1
  81. package/dist/native/shared/dom.js +163 -211
  82. package/dist/native/shared/dom.js.map +1 -0
  83. package/dist/native/shared/events.d.ts +8 -6
  84. package/dist/native/shared/events.d.ts.map +1 -1
  85. package/dist/native/shared/events.js +12 -7
  86. package/dist/native/shared/events.js.map +1 -0
  87. package/dist/native/shared/icons.d.ts +4 -2
  88. package/dist/native/shared/icons.d.ts.map +1 -1
  89. package/dist/native/shared/icons.js +59 -53
  90. package/dist/native/shared/icons.js.map +1 -0
  91. package/dist/native/shared/modal.d.ts +3 -1
  92. package/dist/native/shared/modal.d.ts.map +1 -1
  93. package/dist/native/shared/modal.js +156 -139
  94. package/dist/native/shared/modal.js.map +1 -0
  95. package/dist/native/vertical-bars-web.d.ts +3 -1
  96. package/dist/native/vertical-bars-web.d.ts.map +1 -1
  97. package/dist/native/vertical-bars-web.js +332 -346
  98. package/dist/native/vertical-bars-web.js.map +1 -0
  99. package/dist/native-integration/index.d.ts +10 -8
  100. package/dist/native-integration/index.d.ts.map +1 -1
  101. package/dist/native-integration/index.js +102 -100
  102. package/dist/native-integration/index.js.map +1 -0
  103. package/dist/native-integration/transition.d.ts +3 -1
  104. package/dist/native-integration/transition.d.ts.map +1 -1
  105. package/dist/native-integration/transition.js +15 -6
  106. package/dist/native-integration/transition.js.map +1 -0
  107. package/dist/searchbar/index.d.ts +4 -2
  108. package/dist/searchbar/index.d.ts.map +1 -1
  109. package/dist/searchbar/index.js +64 -56
  110. package/dist/searchbar/index.js.map +1 -0
  111. package/dist/segment/index.d.ts +3 -1
  112. package/dist/segment/index.d.ts.map +1 -1
  113. package/dist/segment/index.js +465 -324
  114. package/dist/segment/index.js.map +1 -0
  115. package/dist/sheets-of-glass/animations.d.ts +13 -12
  116. package/dist/sheets-of-glass/animations.d.ts.map +1 -1
  117. package/dist/sheets-of-glass/animations.js +496 -306
  118. package/dist/sheets-of-glass/animations.js.map +1 -0
  119. package/dist/sheets-of-glass/index.d.ts +3 -1
  120. package/dist/sheets-of-glass/index.d.ts.map +1 -1
  121. package/dist/sheets-of-glass/index.js +294 -357
  122. package/dist/sheets-of-glass/index.js.map +1 -0
  123. package/dist/sheets-of-glass/interfaces.d.ts +11 -9
  124. package/dist/sheets-of-glass/interfaces.d.ts.map +1 -1
  125. package/dist/sheets-of-glass/interfaces.js +0 -1
  126. package/dist/tab-bar-searchable/animations/enter.d.ts +4 -2
  127. package/dist/tab-bar-searchable/animations/enter.d.ts.map +1 -1
  128. package/dist/tab-bar-searchable/animations/enter.js +50 -69
  129. package/dist/tab-bar-searchable/animations/enter.js.map +1 -0
  130. package/dist/tab-bar-searchable/animations/leave.d.ts +4 -2
  131. package/dist/tab-bar-searchable/animations/leave.d.ts.map +1 -1
  132. package/dist/tab-bar-searchable/animations/leave.js +48 -62
  133. package/dist/tab-bar-searchable/animations/leave.js.map +1 -0
  134. package/dist/tab-bar-searchable/index.d.ts +5 -3
  135. package/dist/tab-bar-searchable/index.d.ts.map +1 -1
  136. package/dist/tab-bar-searchable/index.js +123 -135
  137. package/dist/tab-bar-searchable/index.js.map +1 -0
  138. package/dist/transition/index.d.ts +9 -8
  139. package/dist/transition/index.d.ts.map +1 -1
  140. package/dist/transition/index.js +203 -192
  141. package/dist/transition/index.js.map +1 -0
  142. package/dist/transition/ios.transition.d.ts +7 -5
  143. package/dist/transition/ios.transition.d.ts.map +1 -1
  144. package/dist/transition/ios.transition.js +15 -11
  145. package/dist/transition/ios.transition.js.map +1 -0
  146. package/dist/utils.d.ts +10 -8
  147. package/dist/utils.d.ts.map +1 -1
  148. package/dist/utils.js +58 -66
  149. package/dist/utils.js.map +1 -0
  150. package/dist/vertical-bars.d.ts +5 -4
  151. package/dist/vertical-bars.js +4 -2
  152. package/docs/iphone-duo-with-original-theme.md +18 -29
  153. package/docs/iphone-duo.md +44 -204
  154. package/docs/native-ui-shell.md +10 -8
  155. package/docs/special-markup.md +2 -0
  156. package/docs/vertical-bars.md +283 -0
  157. package/ios/Sources/IonicNativeUIShellPlugin/Components/ShellVerticalBars.swift +34 -14
  158. package/ios/Sources/IonicNativeUIShellPlugin/Shared/ShellSnapshot.swift +2 -0
  159. package/ios/Tests/IonicNativeUIShellPluginTests/ShellSnapshotTests.swift +3 -0
  160. package/package.json +9 -6
  161. package/src/native/components/index.ts +3 -2
  162. package/src/native/components/ion-button.ts +3 -2
  163. package/src/native/components/ion-buttons.ts +4 -3
  164. package/src/native/components/ion-menu-button.ts +3 -2
  165. package/src/native/definitions.ts +22 -1
  166. package/src/native/foldable/fold-state.ts +9 -0
  167. package/src/native/foldable/types.ts +4 -0
  168. package/src/native/index.ts +17 -3
  169. package/src/native/prehide.ts +3 -1
  170. package/src/native/runtime.ts +2 -2
  171. package/src/native/shared/candidate.ts +39 -10
  172. package/src/native/shared/dom.ts +4 -4
  173. package/src/styles/vertical-bars.scss +4 -2
  174. package/src/vertical-bars.ts +9 -1
  175. package/dist/vertical-bars.d.ts.map +0 -1
@@ -1,216 +1,168 @@
1
- import { fadeMarker } from './crossfade';
2
- import { modalUsesVerticalBars } from './modal';
3
- export const marker = 'data-native-ui-shell';
4
- const childNodesGet = typeof Node === 'undefined' ? undefined : Object.getOwnPropertyDescriptor(Node.prototype, 'childNodes')?.get;
5
- export const childNodesOf = (element) => childNodesGet ? Array.from(childNodesGet.call(element)) : Array.from(element.childNodes);
6
- export const childElements = (element) => childNodesOf(element).filter((node) => node.nodeType === 1);
7
- export const prehiddenClass = 'ios-theme-native-ui-shell-prehidden';
8
- export const prehideRootClass = 'ios-theme-native-ui-shell-prehide';
9
- export const rejectedClass = 'ios-theme-native-ui-shell-rejected';
10
- export const verticalBarsBackWebClass = 'ios-theme-vertical-bars-back-web-owned';
11
- const prehideClasses = new Set([prehiddenClass, prehideRootClass]);
12
- export const prehideOnlyMutation = (record) => {
13
- if (record.attributeName !== 'class' || record.oldValue === null)
14
- return false;
15
- const withoutPrehide = (value) => value
16
- .split(/\s+/)
17
- .filter((name) => name && !prehideClasses.has(name))
18
- .join(' ');
19
- return withoutPrehide(record.oldValue) === withoutPrehide(record.target.getAttribute('class') ?? '');
20
- };
21
- export const withoutPrehide = (element, read) => {
22
- const changed = [];
23
- for (let current = element; current; current = current.parentElement) {
24
- if (current.classList.contains(prehiddenClass)) {
25
- current.classList.remove(prehiddenClass);
26
- changed.push(current);
27
- }
28
- }
29
- const root = element.ownerDocument.documentElement;
30
- if (element.matches('ion-back-button') && root.classList.contains(prehideRootClass)) {
31
- root.classList.remove(prehideRootClass);
32
- changed.push(root);
33
- }
34
- try {
35
- return read();
36
- }
37
- finally {
38
- changed.forEach((current) => current.classList.add(current === root ? prehideRootClass : prehiddenClass));
39
- }
40
- };
41
- export const isDark = (style) => {
42
- const themeScheme = style.getPropertyValue('--ios27-color-scheme').trim();
43
- if (themeScheme)
44
- return themeScheme === 'dark';
45
- const background = style.getPropertyValue('--ion-background-color-rgb').match(/\d+/g)?.slice(0, 3).map(Number);
46
- return !!background && background.length === 3 && background[0] * 0.2126 + background[1] * 0.7152 + background[2] * 0.0722 < 128;
47
- };
48
- const permanentlyExcluded = '.ionic-theme-disabled, .ios-theme-disabled, .ios26-disabled, .ion-cloned-element, [hidden], [inert]';
49
- export const excluded = `${permanentlyExcluded}, .ion-page-hidden, .ion-page-invisible`;
50
- const enteringPages = new WeakSet();
51
- export const setVerticalBarsEnteringPage = (page, entering) => {
52
- if (entering)
53
- enteringPages.add(page);
54
- else
55
- enteringPages.delete(page);
56
- };
57
- export const verticalBarsEnteringPage = (element) => {
58
- const page = element.closest('.ion-page-invisible');
59
- return page && enteringPages.has(page) && page.closest('ion-app.ios-theme-vertical-bars') ? page : undefined;
60
- };
61
- export const createVerticalBarsPageState = () => {
62
- const departed = new WeakSet();
63
- return {
64
- isDeparted(element) {
65
- const page = element.closest('.ion-page');
66
- return !!page && departed.has(page) && !!element.closest('ion-app.ios-theme-vertical-bars');
67
- },
68
- lifecycle(event) {
69
- const page = event.target && event.target.nodeType === 1 ? event.target : undefined;
70
- if (!page?.matches('.ion-page'))
71
- return;
72
- const entering = event.type === 'ionViewWillEnter';
73
- if (entering || event.type === 'ionViewDidEnter')
74
- departed.delete(page);
75
- else if (event.type === 'ionViewWillLeave' || event.type === 'ionViewDidLeave')
76
- departed.add(page);
77
- setVerticalBarsEnteringPage(page, entering);
78
- },
79
- cancel(entering, leaving) {
80
- if (entering) {
81
- departed.add(entering);
82
- setVerticalBarsEnteringPage(entering, false);
83
- }
84
- if (leaving)
85
- departed.delete(leaving);
86
- },
87
- };
88
- };
89
- const disabledButtonGroup = 'ion-buttons:is(.ionic-theme-disabled, .ios-theme-disabled, .ios26-disabled)';
90
- const shellDisabledSelector = '.ios-theme-shell-disabled';
91
- export const isDisabledButtonGroupChild = (element) => element.matches('ion-button') && element.parentElement?.matches(disabledButtonGroup) === true;
92
- const verticalBarsTags = new Set(['ion-button', 'ion-back-button', 'ion-buttons', 'ion-menu-button', 'ion-tab-bar']);
93
- export const isVerticalBarsSource = (element) => verticalBarsTags.has(element.localName) &&
94
- (element.matches('ion-tab-bar') || verticalBarsOwned(element)) &&
95
- !element.closest('ion-menu, ion-popover') &&
96
- modalUsesVerticalBars(element) &&
97
- !!element.closest('ion-app.ios-theme-vertical-bars');
98
- export const isVerticalBarsBackPosition = (element) => {
99
- if (element.closest('ion-header[collapse], ion-footer[collapse]'))
100
- return false;
101
- const page = element.closest('.ion-page');
102
- if (!page)
103
- return true;
104
- const candidates = Array.from(page.querySelectorAll('ion-back-button')).filter((back) => back.closest('.ion-page') === page &&
105
- !back.matches('.ion-cloned-element') &&
106
- !back.closest('ion-header[collapse], ion-footer[collapse], ion-menu, ion-popover') &&
107
- modalUsesVerticalBars(back));
108
- const rank = (back) => inFixedToolbar(back) ? 0 : back.closest('ion-header ion-toolbar, ion-footer ion-toolbar') ? 1 : back.closest('ion-toolbar') ? 3 : 2;
109
- const best = candidates.reduce((winner, back) => (!winner || rank(back) < rank(winner) ? back : winner), undefined);
110
- return best === element;
111
- };
112
- export const preferredVerticalBarsBack = (elements, doc) => {
113
- const pages = Array.from(doc.querySelectorAll('.ion-page'));
114
- const pageOrder = (element) => pages.indexOf(element.closest('.ion-page'));
115
- return elements.sort((a, b) => pageOrder(b) - pageOrder(a) || Number(!!b.closest('ion-header')) - Number(!!a.closest('ion-header')))[0];
1
+ import { modalUsesVerticalBars } from "./modal.js";
2
+ import "./crossfade.js";
3
+ //#region src/native/shared/dom.ts
4
+ const marker = "data-native-ui-shell";
5
+ const childNodesGet = typeof Node === "undefined" ? void 0 : Object.getOwnPropertyDescriptor(Node.prototype, "childNodes")?.get;
6
+ const childNodesOf = (element) => childNodesGet ? Array.from(childNodesGet.call(element)) : Array.from(element.childNodes);
7
+ const childElements = (element) => childNodesOf(element).filter((node) => node.nodeType === 1);
8
+ const prehiddenClass = "ios-theme-native-ui-shell-prehidden";
9
+ const prehideRootClass = "ios-theme-native-ui-shell-prehide";
10
+ const rejectedClass = "ios-theme-native-ui-shell-rejected";
11
+ const verticalBarsBackWebClass = "ios-theme-vertical-bars-back-web-owned";
12
+ const prehideClasses = /* @__PURE__ */ new Set([prehiddenClass, prehideRootClass]);
13
+ const prehideOnlyMutation = (record) => {
14
+ if (record.attributeName !== "class" || record.oldValue === null) return false;
15
+ const withoutPrehide = (value) => value.split(/\s+/).filter((name) => name && !prehideClasses.has(name)).join(" ");
16
+ return withoutPrehide(record.oldValue) === withoutPrehide(record.target.getAttribute("class") ?? "");
17
+ };
18
+ const withoutPrehide = (element, read) => {
19
+ const changed = [];
20
+ for (let current = element; current; current = current.parentElement) if (current.classList.contains("ios-theme-native-ui-shell-prehidden")) {
21
+ current.classList.remove(prehiddenClass);
22
+ changed.push(current);
23
+ }
24
+ const root = element.ownerDocument.documentElement;
25
+ if (element.matches("ion-back-button") && root.classList.contains("ios-theme-native-ui-shell-prehide")) {
26
+ root.classList.remove(prehideRootClass);
27
+ changed.push(root);
28
+ }
29
+ try {
30
+ return read();
31
+ } finally {
32
+ changed.forEach((current) => current.classList.add(current === root ? prehideRootClass : prehiddenClass));
33
+ }
34
+ };
35
+ const isDark = (style) => {
36
+ const themeScheme = style.getPropertyValue("--ios27-color-scheme").trim();
37
+ if (themeScheme) return themeScheme === "dark";
38
+ const background = style.getPropertyValue("--ion-background-color-rgb").match(/\d+/g)?.slice(0, 3).map(Number);
39
+ return !!background && background.length === 3 && background[0] * .2126 + background[1] * .7152 + background[2] * .0722 < 128;
40
+ };
41
+ const permanentlyExcluded = ".ios-theme-disabled, .ios26-disabled, .ion-cloned-element, [hidden], [inert]";
42
+ const excluded = `${permanentlyExcluded}, .ion-page-hidden, .ion-page-invisible`;
43
+ const enteringPages = /* @__PURE__ */ new WeakSet();
44
+ const setVerticalBarsEnteringPage = (page, entering) => {
45
+ if (entering) enteringPages.add(page);
46
+ else enteringPages.delete(page);
47
+ };
48
+ const verticalBarsEnteringPage = (element) => {
49
+ const page = element.closest(".ion-page-invisible");
50
+ return page && enteringPages.has(page) && page.closest("ion-app.ios-theme-vertical-bars") ? page : void 0;
51
+ };
52
+ const createVerticalBarsPageState = () => {
53
+ const departed = /* @__PURE__ */ new WeakSet();
54
+ return {
55
+ isDeparted(element) {
56
+ const page = element.closest(".ion-page");
57
+ return !!page && departed.has(page) && !!element.closest("ion-app.ios-theme-vertical-bars");
58
+ },
59
+ lifecycle(event) {
60
+ const page = event.target && event.target.nodeType === 1 ? event.target : void 0;
61
+ if (!page?.matches(".ion-page")) return;
62
+ const entering = event.type === "ionViewWillEnter";
63
+ if (entering || event.type === "ionViewDidEnter") departed.delete(page);
64
+ else if (event.type === "ionViewWillLeave" || event.type === "ionViewDidLeave") departed.add(page);
65
+ setVerticalBarsEnteringPage(page, entering);
66
+ },
67
+ cancel(entering, leaving) {
68
+ if (entering) {
69
+ departed.add(entering);
70
+ setVerticalBarsEnteringPage(entering, false);
71
+ }
72
+ if (leaving) departed.delete(leaving);
73
+ }
74
+ };
75
+ };
76
+ const disabledButtonGroup = "ion-buttons:is(.ios-theme-disabled, .ios26-disabled)";
77
+ const shellDisabledSelector = ".ios-theme-shell-disabled, [data-shell=\"disabled\"]";
78
+ const isDisabledButtonGroupChild = (element) => element.matches("ion-button") && element.parentElement?.matches(disabledButtonGroup) === true;
79
+ const verticalBarsTags = /* @__PURE__ */ new Set([
80
+ "ion-button",
81
+ "ion-back-button",
82
+ "ion-buttons",
83
+ "ion-menu-button",
84
+ "ion-tab-bar"
85
+ ]);
86
+ const isVerticalBarsSource = (element) => verticalBarsTags.has(element.localName) && (element.matches("ion-tab-bar") || verticalBarsOwned(element)) && !element.closest("ion-menu, ion-popover") && modalUsesVerticalBars(element) && !!element.closest("ion-app.ios-theme-vertical-bars");
87
+ const isVerticalBarsBackPosition = (element) => {
88
+ if (element.closest("ion-header[collapse], ion-footer[collapse]")) return false;
89
+ const page = element.closest(".ion-page");
90
+ if (!page) return true;
91
+ const candidates = Array.from(page.querySelectorAll("ion-back-button")).filter((back) => back.closest(".ion-page") === page && !back.matches(".ion-cloned-element") && !back.closest("ion-header[collapse], ion-footer[collapse], ion-menu, ion-popover") && modalUsesVerticalBars(back));
92
+ const rank = (back) => inFixedToolbar(back) ? 0 : back.closest("ion-header ion-toolbar, ion-footer ion-toolbar") ? 1 : back.closest("ion-toolbar") ? 3 : 2;
93
+ return candidates.reduce((winner, back) => !winner || rank(back) < rank(winner) ? back : winner, void 0) === element;
94
+ };
95
+ const preferredVerticalBarsBack = (elements, doc) => {
96
+ const pages = Array.from(doc.querySelectorAll(".ion-page"));
97
+ const pageOrder = (element) => pages.indexOf(element.closest(".ion-page"));
98
+ return elements.sort((a, b) => pageOrder(b) - pageOrder(a) || Number(!!b.closest("ion-header")) - Number(!!a.closest("ion-header")))[0];
116
99
  };
117
100
  const excludedBy = (element, selector) => {
118
- const owner = element.closest(selector);
119
- return !!owner && !(element.parentElement === owner && isDisabledButtonGroupChild(element));
120
- };
121
- export const isPermanentlyExcluded = (element) => excludedBy(element, permanentlyExcluded);
122
- export const isExcluded = (element, enteringPage) => excludedBy(element, `${permanentlyExcluded}, .ion-page-hidden`) || (!!element.closest('.ion-page-invisible') && !enteringPage);
123
- export const isShellDisabled = (element) => !!element.closest(shellDisabledSelector) || !!element.querySelector(shellDisabledSelector);
124
- export const isVerticalBarsToolbarActionShape = (element) => element.matches('ion-menu-button') ||
125
- (element.matches('ion-button') && !!element.querySelector('ion-icon[slot="icon-only"], svg[slot="icon-only"]'));
126
- const verticalBarsPlacement = new WeakMap();
127
- export const setVerticalBarsPlacement = (element, rail) => {
128
- verticalBarsPlacement.set(element, rail);
129
- };
130
- export const clearVerticalBarsPlacement = (element) => {
131
- verticalBarsPlacement.delete(element);
132
- };
133
- export const verticalBarsOwned = (element) => verticalBarsPlacement.get(element) === true;
134
- export const isVerticalBarsToolbarAction = (element) => verticalBarsOwned(element) && !isExcluded(element, verticalBarsEnteringPage(element)) && !isShellDisabled(element);
135
- const overlays = 'ion-menu, ion-popover';
136
- export const verticalBarsActionCandidate = (element) => inFixedToolbar(element) &&
137
- !element.closest('ion-buttons.ios-theme-horizontal-only, ion-button.ios-theme-horizontal-only') &&
138
- !isPermanentlyExcluded(element) &&
139
- !isShellDisabled(element) &&
140
- !element.closest(overlays) &&
141
- modalUsesVerticalBars(element);
142
- export const verticalBarsBackCandidate = (element) => isVerticalBarsBackPosition(element) &&
143
- !element.closest('ion-buttons.ios-theme-horizontal-only') &&
144
- !isPermanentlyExcluded(element) &&
145
- !isShellDisabled(element) &&
146
- !element.closest(overlays) &&
147
- modalUsesVerticalBars(element);
148
- export const verticalBarsToolbarActions = (element) => childElements(element).filter((child) => !child.matches('ion-back-button') && isVerticalBarsToolbarAction(child));
149
- export const isVerticalBarsToolbarGroup = (element) => {
150
- return (element.matches('ion-buttons') &&
151
- verticalBarsOwned(element) &&
152
- !element.matches('.ionic-theme-disabled, .ios-theme-disabled, .ios26-disabled') &&
153
- !isShellDisabled(element));
154
- };
155
- export const activateProjectedElement = (element) => {
156
- const target = element.matches('ion-button, ion-back-button, ion-menu-button')
157
- ? element.shadowRoot?.querySelector('[part~="native"]')
158
- : undefined;
159
- (target ?? element).click();
160
- };
161
- export const unprojected = (elements, read) => {
162
- const hidden = Array.from(elements).filter((element) => element.hasAttribute(marker));
163
- hidden.forEach((element) => element.removeAttribute(marker));
164
- try {
165
- return read();
166
- }
167
- finally {
168
- hidden.forEach((element) => element.setAttribute(marker, ''));
169
- }
101
+ const owner = element.closest(selector);
102
+ return !!owner && !(element.parentElement === owner && isDisabledButtonGroupChild(element));
103
+ };
104
+ const isPermanentlyExcluded = (element) => excludedBy(element, permanentlyExcluded);
105
+ const isExcluded = (element, enteringPage) => excludedBy(element, `${permanentlyExcluded}, .ion-page-hidden`) || !!element.closest(".ion-page-invisible") && !enteringPage;
106
+ const isShellDisabled = (element) => !!element.closest(shellDisabledSelector) || !!element.querySelector(shellDisabledSelector);
107
+ const isVerticalBarsToolbarActionShape = (element) => element.matches("ion-menu-button") || element.matches("ion-button") && !!element.querySelector("ion-icon[slot=\"icon-only\"], svg[slot=\"icon-only\"]");
108
+ const verticalBarsPlacement = /* @__PURE__ */ new WeakMap();
109
+ const setVerticalBarsPlacement = (element, rail) => {
110
+ verticalBarsPlacement.set(element, rail);
111
+ };
112
+ const clearVerticalBarsPlacement = (element) => {
113
+ verticalBarsPlacement.delete(element);
114
+ };
115
+ const verticalBarsOwned = (element) => verticalBarsPlacement.get(element) === true;
116
+ const isVerticalBarsToolbarAction = (element) => verticalBarsOwned(element) && !isExcluded(element, verticalBarsEnteringPage(element)) && !isShellDisabled(element);
117
+ const overlays = "ion-menu, ion-popover";
118
+ /** Shared eligibility for a toolbar action candidate, before placement is decided (prehide) or consumed (projection). */
119
+ const verticalBarsActionCandidate = (element) => inFixedToolbar(element) && !element.closest("ion-buttons.ios-theme-horizontal-only, ion-button.ios-theme-horizontal-only") && !isPermanentlyExcluded(element) && !isShellDisabled(element) && !element.closest(overlays) && modalUsesVerticalBars(element);
120
+ /** Shared eligibility for a back-button candidate; the back button may sit outside a fixed toolbar. */
121
+ const verticalBarsBackCandidate = (element) => isVerticalBarsBackPosition(element) && !element.closest("ion-buttons.ios-theme-horizontal-only") && !isPermanentlyExcluded(element) && !isShellDisabled(element) && !element.closest(overlays) && modalUsesVerticalBars(element);
122
+ const verticalBarsToolbarActions = (element) => childElements(element).filter((child) => !child.matches("ion-back-button") && isVerticalBarsToolbarAction(child));
123
+ const isVerticalBarsToolbarGroup = (element) => {
124
+ return element.matches("ion-buttons") && verticalBarsOwned(element) && !element.matches(".ios-theme-disabled, .ios26-disabled") && !isShellDisabled(element);
125
+ };
126
+ const activateProjectedElement = (element) => {
127
+ ((element.matches("ion-button, ion-back-button, ion-menu-button") ? element.shadowRoot?.querySelector("[part~=\"native\"]") : void 0) ?? element).click();
128
+ };
129
+ const unprojected = (elements, read) => {
130
+ const hidden = Array.from(elements).filter((element) => element.hasAttribute(marker));
131
+ hidden.forEach((element) => element.removeAttribute(marker));
132
+ try {
133
+ return read();
134
+ } finally {
135
+ hidden.forEach((element) => element.setAttribute(marker, ""));
136
+ }
170
137
  };
171
138
  const readVisible = (element, allowOutsideViewport) => {
172
- const enteringPage = isVerticalBarsSource(element) ? verticalBarsEnteringPage(element) : undefined;
173
- if (!element.isConnected || isExcluded(element, enteringPage) || isShellDisabled(element))
174
- return false;
175
- for (let current = element; current; current = current.parentElement) {
176
- const style = getComputedStyle(current);
177
- if (style.display === 'none' ||
178
- style.visibility !== 'visible' ||
179
- (Number(style.opacity) === 0 && !current.hasAttribute(fadeMarker) && current !== enteringPage))
180
- return false;
181
- if (!allowOutsideViewport &&
182
- style.transform !== 'none' &&
183
- !new DOMMatrixReadOnly(style.transform).isIdentity &&
184
- current !== element &&
185
- !current.matches('ion-tab-bar'))
186
- return false;
187
- }
188
- const rect = element.getBoundingClientRect();
189
- return (rect.width > 0 &&
190
- rect.height > 0 &&
191
- (allowOutsideViewport || (rect.left >= -1 && rect.top >= -1 && rect.right <= innerWidth + 1 && rect.bottom <= innerHeight + 1)));
192
- };
193
- export const visible = (element, allowOutsideViewport = false) => withoutPrehide(element, () => readVisible(element, allowOutsideViewport));
194
- export const frame = (rect, origin) => ({
195
- x: rect.x - (origin?.x ?? 0),
196
- y: rect.y - (origin?.y ?? 0),
197
- width: rect.width,
198
- height: rect.height,
139
+ const enteringPage = isVerticalBarsSource(element) ? verticalBarsEnteringPage(element) : void 0;
140
+ if (!element.isConnected || isExcluded(element, enteringPage) || isShellDisabled(element)) return false;
141
+ for (let current = element; current; current = current.parentElement) {
142
+ const style = getComputedStyle(current);
143
+ if (style.display === "none" || style.visibility !== "visible" || Number(style.opacity) === 0 && !current.hasAttribute("data-native-ui-shell-fading") && current !== enteringPage) return false;
144
+ if (!allowOutsideViewport && style.transform !== "none" && !new DOMMatrixReadOnly(style.transform).isIdentity && current !== element && !current.matches("ion-tab-bar")) return false;
145
+ }
146
+ const rect = element.getBoundingClientRect();
147
+ return rect.width > 0 && rect.height > 0 && (allowOutsideViewport || rect.left >= -1 && rect.top >= -1 && rect.right <= innerWidth + 1 && rect.bottom <= innerHeight + 1);
148
+ };
149
+ const visible = (element, allowOutsideViewport = false) => withoutPrehide(element, () => readVisible(element, allowOutsideViewport));
150
+ const frame = (rect, origin) => ({
151
+ x: rect.x - (origin?.x ?? 0),
152
+ y: rect.y - (origin?.y ?? 0),
153
+ width: rect.width,
154
+ height: rect.height
199
155
  });
200
- export const text = (element) => {
201
- if (element.matches('ion-icon, svg, ion-badge, .ios27-segment-lens, .ion-cloned-element'))
202
- return '';
203
- return childNodesOf(element)
204
- .map((node) => (node.nodeType === 3 ? node.textContent : node.nodeType === 1 ? text(node) : ''))
205
- .join('')
206
- .replace(/\s+/g, ' ')
207
- .trim();
208
- };
209
- export const inFixedToolbar = (element) => {
210
- const edge = element.closest('ion-toolbar')?.parentElement;
211
- const verticalBars = !!element.closest('ion-app.ios-theme-vertical-bars');
212
- return (!!edge?.matches('ion-header, ion-footer') &&
213
- !element.closest('ion-content') &&
214
- !edge.hasAttribute('collapse') &&
215
- (verticalBars || !edge.matches('.header-collapse-main, .header-collapse-condense')));
216
- };
156
+ const text = (element) => {
157
+ if (element.matches("ion-icon, svg, ion-badge, .ios27-segment-lens, .ion-cloned-element")) return "";
158
+ return childNodesOf(element).map((node) => node.nodeType === 3 ? node.textContent : node.nodeType === 1 ? text(node) : "").join("").replace(/\s+/g, " ").trim();
159
+ };
160
+ const inFixedToolbar = (element) => {
161
+ const edge = element.closest("ion-toolbar")?.parentElement;
162
+ const verticalBars = !!element.closest("ion-app.ios-theme-vertical-bars");
163
+ return !!edge?.matches("ion-header, ion-footer") && !element.closest("ion-content") && !edge.hasAttribute("collapse") && (verticalBars || !edge.matches(".header-collapse-main, .header-collapse-condense"));
164
+ };
165
+ //#endregion
166
+ export { activateProjectedElement, childElements, childNodesOf, clearVerticalBarsPlacement, createVerticalBarsPageState, excluded, frame, inFixedToolbar, isDark, isDisabledButtonGroupChild, isExcluded, isPermanentlyExcluded, isShellDisabled, isVerticalBarsBackPosition, isVerticalBarsSource, isVerticalBarsToolbarAction, isVerticalBarsToolbarActionShape, isVerticalBarsToolbarGroup, marker, preferredVerticalBarsBack, prehiddenClass, prehideOnlyMutation, prehideRootClass, rejectedClass, setVerticalBarsEnteringPage, setVerticalBarsPlacement, text, unprojected, verticalBarsActionCandidate, verticalBarsBackCandidate, verticalBarsBackWebClass, verticalBarsEnteringPage, verticalBarsOwned, verticalBarsToolbarActions, visible, withoutPrehide };
167
+
168
+ //# sourceMappingURL=dom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom.js","names":[],"sources":["../../../src/native/shared/dom.ts"],"sourcesContent":["import { fadeMarker } from './crossfade';\nimport { modalUsesVerticalBars } from './modal';\n\nimport type { Frame } from '../definitions';\n\nexport const marker = 'data-native-ui-shell';\n// Scoped runtimes (Stencil slot emulation) patch child accessors on upgraded\n// elements and may report none before hydration; the prototype getter still\n// reports the real light DOM.\nconst childNodesGet = typeof Node === 'undefined' ? undefined : Object.getOwnPropertyDescriptor(Node.prototype, 'childNodes')?.get;\nexport const childNodesOf = (element: Element): Node[] =>\n childNodesGet ? Array.from(childNodesGet.call(element)) : Array.from(element.childNodes);\nexport const childElements = (element: Element): HTMLElement[] =>\n childNodesOf(element).filter((node) => node.nodeType === 1) as HTMLElement[];\nexport const prehiddenClass = 'ios-theme-native-ui-shell-prehidden';\nexport const prehideRootClass = 'ios-theme-native-ui-shell-prehide';\nexport const rejectedClass = 'ios-theme-native-ui-shell-rejected';\nexport const verticalBarsBackWebClass = 'ios-theme-vertical-bars-back-web-owned';\nconst prehideClasses = new Set([prehiddenClass, prehideRootClass]);\nexport const prehideOnlyMutation = (record: MutationRecord): boolean => {\n if (record.attributeName !== 'class' || record.oldValue === null) return false;\n const withoutPrehide = (value: string) =>\n value\n .split(/\\s+/)\n .filter((name) => name && !prehideClasses.has(name))\n .join(' ');\n return withoutPrehide(record.oldValue) === withoutPrehide((record.target as Element).getAttribute('class') ?? '');\n};\n\nexport const withoutPrehide = <T>(element: HTMLElement, read: () => T): T => {\n const changed: HTMLElement[] = [];\n for (let current: HTMLElement | null = element; current; current = current.parentElement) {\n if (current.classList.contains(prehiddenClass)) {\n current.classList.remove(prehiddenClass);\n changed.push(current);\n }\n }\n const root = element.ownerDocument.documentElement;\n if (element.matches('ion-back-button') && root.classList.contains(prehideRootClass)) {\n root.classList.remove(prehideRootClass);\n changed.push(root);\n }\n try {\n return read();\n } finally {\n changed.forEach((current) => current.classList.add(current === root ? prehideRootClass : prehiddenClass));\n }\n};\nexport const isDark = (style: CSSStyleDeclaration): boolean => {\n const themeScheme = style.getPropertyValue('--ios27-color-scheme').trim();\n if (themeScheme) return themeScheme === 'dark';\n const background = style.getPropertyValue('--ion-background-color-rgb').match(/\\d+/g)?.slice(0, 3).map(Number);\n return !!background && background.length === 3 && background[0] * 0.2126 + background[1] * 0.7152 + background[2] * 0.0722 < 128;\n};\nconst permanentlyExcluded = '.ios-theme-disabled, .ios26-disabled, .ion-cloned-element, [hidden], [inert]';\nexport const excluded = `${permanentlyExcluded}, .ion-page-hidden, .ion-page-invisible`;\nconst enteringPages = new WeakSet<HTMLElement>();\nexport const setVerticalBarsEnteringPage = (page: HTMLElement, entering: boolean): void => {\n if (entering) enteringPages.add(page);\n else enteringPages.delete(page);\n};\nexport const verticalBarsEnteringPage = (element: HTMLElement): HTMLElement | undefined => {\n const page = element.closest<HTMLElement>('.ion-page-invisible');\n return page && enteringPages.has(page) && page.closest('ion-app.ios-theme-vertical-bars') ? page : undefined;\n};\nexport const createVerticalBarsPageState = () => {\n const departed = new WeakSet<HTMLElement>();\n return {\n isDeparted(element: HTMLElement): boolean {\n const page = element.closest<HTMLElement>('.ion-page');\n return !!page && departed.has(page) && !!element.closest('ion-app.ios-theme-vertical-bars');\n },\n lifecycle(event: Event): void {\n // Avoid instanceof so stale listeners stay safe after global teardown.\n const page = event.target && (event.target as Node).nodeType === 1 ? (event.target as HTMLElement) : undefined;\n if (!page?.matches('.ion-page')) return;\n const entering = event.type === 'ionViewWillEnter';\n if (entering || event.type === 'ionViewDidEnter') departed.delete(page);\n else if (event.type === 'ionViewWillLeave' || event.type === 'ionViewDidLeave') departed.add(page);\n setVerticalBarsEnteringPage(page, entering);\n },\n cancel(entering?: HTMLElement, leaving?: HTMLElement): void {\n if (entering) {\n departed.add(entering);\n setVerticalBarsEnteringPage(entering, false);\n }\n if (leaving) departed.delete(leaving);\n },\n };\n};\nconst disabledButtonGroup = 'ion-buttons:is(.ios-theme-disabled, .ios26-disabled)';\nconst shellDisabledSelector = '.ios-theme-shell-disabled, [data-shell=\"disabled\"]';\n\nexport const isDisabledButtonGroupChild = (element: HTMLElement): boolean =>\n element.matches('ion-button') && element.parentElement?.matches(disabledButtonGroup) === true;\n\nconst verticalBarsTags = new Set(['ion-button', 'ion-back-button', 'ion-buttons', 'ion-menu-button', 'ion-tab-bar']);\n\nexport const isVerticalBarsSource = (element: HTMLElement): boolean =>\n verticalBarsTags.has(element.localName) &&\n (element.matches('ion-tab-bar') || verticalBarsOwned(element)) &&\n !element.closest('ion-menu, ion-popover') &&\n modalUsesVerticalBars(element) &&\n !!element.closest('ion-app.ios-theme-vertical-bars');\n\nexport const isVerticalBarsBackPosition = (element: HTMLElement): boolean => {\n if (element.closest('ion-header[collapse], ion-footer[collapse]')) return false;\n const page = element.closest('.ion-page');\n if (!page) return true;\n const candidates = Array.from(page.querySelectorAll<HTMLElement>('ion-back-button')).filter(\n (back) =>\n back.closest('.ion-page') === page &&\n !back.matches('.ion-cloned-element') &&\n !back.closest('ion-header[collapse], ion-footer[collapse], ion-menu, ion-popover') &&\n modalUsesVerticalBars(back),\n );\n const rank = (back: HTMLElement) =>\n inFixedToolbar(back) ? 0 : back.closest('ion-header ion-toolbar, ion-footer ion-toolbar') ? 1 : back.closest('ion-toolbar') ? 3 : 2;\n const best = candidates.reduce<HTMLElement | undefined>(\n (winner, back) => (!winner || rank(back) < rank(winner) ? back : winner),\n undefined,\n );\n return best === element;\n};\n\nexport const preferredVerticalBarsBack = <T extends HTMLElement>(elements: T[], doc: Document): T | undefined => {\n const pages = Array.from(doc.querySelectorAll('.ion-page'));\n const pageOrder = (element: Element) => pages.indexOf(element.closest('.ion-page')!);\n return elements.sort((a, b) => pageOrder(b) - pageOrder(a) || Number(!!b.closest('ion-header')) - Number(!!a.closest('ion-header')))[0];\n};\n\nconst excludedBy = (element: HTMLElement, selector: string): boolean => {\n const owner = element.closest<HTMLElement>(selector);\n return !!owner && !(element.parentElement === owner && isDisabledButtonGroupChild(element));\n};\n\nexport const isPermanentlyExcluded = (element: HTMLElement): boolean => excludedBy(element, permanentlyExcluded);\nexport const isExcluded = (element: HTMLElement, enteringPage?: HTMLElement): boolean =>\n excludedBy(element, `${permanentlyExcluded}, .ion-page-hidden`) || (!!element.closest('.ion-page-invisible') && !enteringPage);\n\n// A shared native surface must not cover an opted-out descendant either.\nexport const isShellDisabled = (element: Element): boolean =>\n !!element.closest(shellDisabledSelector) || !!element.querySelector(shellDisabledSelector);\n\nexport const isVerticalBarsToolbarActionShape = (element: HTMLElement): boolean =>\n element.matches('ion-menu-button') ||\n (element.matches('ion-button') && !!element.querySelector('ion-icon[slot=\"icon-only\"], svg[slot=\"icon-only\"]'));\n\n// Placement belongs to the DOM identity for one routed-page epoch. Changes to\n// content/disabled state affect rendering, never its chosen surface.\nconst verticalBarsPlacement = new WeakMap<HTMLElement, boolean>();\nexport const setVerticalBarsPlacement = (element: HTMLElement, rail: boolean): void => {\n verticalBarsPlacement.set(element, rail);\n};\nexport const clearVerticalBarsPlacement = (element: HTMLElement): void => {\n verticalBarsPlacement.delete(element);\n};\nexport const verticalBarsOwned = (element: HTMLElement): boolean => verticalBarsPlacement.get(element) === true;\n\nexport const isVerticalBarsToolbarAction = (element: HTMLElement): boolean =>\n verticalBarsOwned(element) && !isExcluded(element, verticalBarsEnteringPage(element)) && !isShellDisabled(element);\n\nconst overlays = 'ion-menu, ion-popover';\n\n/** Shared eligibility for a toolbar action candidate, before placement is decided (prehide) or consumed (projection). */\nexport const verticalBarsActionCandidate = (element: HTMLElement): boolean =>\n inFixedToolbar(element) &&\n !element.closest('ion-buttons.ios-theme-horizontal-only, ion-button.ios-theme-horizontal-only') &&\n !isPermanentlyExcluded(element) &&\n !isShellDisabled(element) &&\n !element.closest(overlays) &&\n modalUsesVerticalBars(element);\n\n/** Shared eligibility for a back-button candidate; the back button may sit outside a fixed toolbar. */\nexport const verticalBarsBackCandidate = (element: HTMLElement): boolean =>\n isVerticalBarsBackPosition(element) &&\n !element.closest('ion-buttons.ios-theme-horizontal-only') &&\n !isPermanentlyExcluded(element) &&\n !isShellDisabled(element) &&\n !element.closest(overlays) &&\n modalUsesVerticalBars(element);\n\nexport const verticalBarsToolbarActions = (element: HTMLElement): HTMLElement[] =>\n // Back buttons use the dedicated rail slot; they are never toolbar actions.\n childElements(element).filter((child) => !child.matches('ion-back-button') && isVerticalBarsToolbarAction(child));\n\nexport const isVerticalBarsToolbarGroup = (element: HTMLElement): boolean => {\n return (\n element.matches('ion-buttons') &&\n verticalBarsOwned(element) &&\n !element.matches('.ios-theme-disabled, .ios26-disabled') &&\n !isShellDisabled(element)\n );\n};\n\nexport const activateProjectedElement = (element: HTMLElement): void => {\n const target = element.matches('ion-button, ion-back-button, ion-menu-button')\n ? element.shadowRoot?.querySelector<HTMLElement>('[part~=\"native\"]')\n : undefined;\n (target ?? element).click();\n};\n\nexport const unprojected = <T>(elements: Iterable<HTMLElement>, read: () => T): T => {\n const hidden = Array.from(elements).filter((element) => element.hasAttribute(marker));\n hidden.forEach((element) => element.removeAttribute(marker));\n try {\n return read();\n } finally {\n hidden.forEach((element) => element.setAttribute(marker, ''));\n }\n};\n\nconst readVisible = (element: HTMLElement, allowOutsideViewport: boolean): boolean => {\n const enteringPage = isVerticalBarsSource(element) ? verticalBarsEnteringPage(element) : undefined;\n if (!element.isConnected || isExcluded(element, enteringPage) || isShellDisabled(element)) return false;\n for (let current: HTMLElement | null = element; current; current = current.parentElement) {\n const style = getComputedStyle(current);\n if (\n style.display === 'none' ||\n style.visibility !== 'visible' ||\n (Number(style.opacity) === 0 && !current.hasAttribute(fadeMarker) && current !== enteringPage)\n )\n return false;\n // Ordinary controls on moving/collapsing/custom transformed surfaces stay in Web coordinates.\n // VerticalBars rail controls are placed independently of their Web coordinates and must remain\n // owned while Ionic transforms the content behind an open menu.\n if (\n !allowOutsideViewport &&\n style.transform !== 'none' &&\n !new DOMMatrixReadOnly(style.transform).isIdentity &&\n current !== element &&\n !current.matches('ion-tab-bar')\n )\n return false;\n }\n const rect = element.getBoundingClientRect();\n return (\n rect.width > 0 &&\n rect.height > 0 &&\n (allowOutsideViewport || (rect.left >= -1 && rect.top >= -1 && rect.right <= innerWidth + 1 && rect.bottom <= innerHeight + 1))\n );\n};\n\nexport const visible = (element: HTMLElement, allowOutsideViewport = false): boolean =>\n withoutPrehide(element, () => readVisible(element, allowOutsideViewport));\n\nexport const frame = (rect: DOMRect, origin?: DOMRect): Frame => ({\n x: rect.x - (origin?.x ?? 0),\n y: rect.y - (origin?.y ?? 0),\n width: rect.width,\n height: rect.height,\n});\n\nexport const text = (element: Element): string => {\n if (element.matches('ion-icon, svg, ion-badge, .ios27-segment-lens, .ion-cloned-element')) return '';\n return childNodesOf(element)\n .map((node) => (node.nodeType === 3 ? node.textContent : node.nodeType === 1 ? text(node as Element) : ''))\n .join('')\n .replace(/\\s+/g, ' ')\n .trim();\n};\n\nexport const inFixedToolbar = (element: Element): boolean => {\n const edge = element.closest('ion-toolbar')?.parentElement;\n const verticalBars = !!element.closest('ion-app.ios-theme-vertical-bars');\n return (\n !!edge?.matches('ion-header, ion-footer') &&\n !element.closest('ion-content') &&\n !edge.hasAttribute('collapse') &&\n (verticalBars || !edge.matches('.header-collapse-main, .header-collapse-condense'))\n );\n};\n"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
+ //#region src/native/shared/events.d.ts
1
2
  export declare const CSS_MOTION_EVENTS: {
2
- readonly transitionRun: "transitionrun";
3
- readonly transitionEnd: "transitionend";
4
- readonly transitionCancel: "transitioncancel";
5
- readonly animationStart: "animationstart";
6
- readonly animationEnd: "animationend";
7
- readonly animationCancel: "animationcancel";
3
+ readonly transitionRun: "transitionrun";
4
+ readonly transitionEnd: "transitionend";
5
+ readonly transitionCancel: "transitioncancel";
6
+ readonly animationStart: "animationstart";
7
+ readonly animationEnd: "animationend";
8
+ readonly animationCancel: "animationcancel";
8
9
  };
10
+ //#endregion
9
11
  //# sourceMappingURL=events.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/native/shared/events.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB;;;;;;;CAOpB,CAAC"}
1
+ {"version":3,"file":"events.d.ts","names":[],"sources":["../../../src/native/shared/events.ts"],"mappings":";qBAAa"}
@@ -1,8 +1,13 @@
1
- export const CSS_MOTION_EVENTS = {
2
- transitionRun: 'transitionrun',
3
- transitionEnd: 'transitionend',
4
- transitionCancel: 'transitioncancel',
5
- animationStart: 'animationstart',
6
- animationEnd: 'animationend',
7
- animationCancel: 'animationcancel',
1
+ //#region src/native/shared/events.ts
2
+ const CSS_MOTION_EVENTS = {
3
+ transitionRun: "transitionrun",
4
+ transitionEnd: "transitionend",
5
+ transitionCancel: "transitioncancel",
6
+ animationStart: "animationstart",
7
+ animationEnd: "animationend",
8
+ animationCancel: "animationcancel"
8
9
  };
10
+ //#endregion
11
+ export { CSS_MOTION_EVENTS };
12
+
13
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","names":[],"sources":["../../../src/native/shared/events.ts"],"sourcesContent":["export const CSS_MOTION_EVENTS = {\n transitionRun: 'transitionrun',\n transitionEnd: 'transitionend',\n transitionCancel: 'transitioncancel',\n animationStart: 'animationstart',\n animationEnd: 'animationend',\n animationCancel: 'animationcancel',\n} as const;\n"],"mappings":";AAAA,MAAa,oBAAoB;CAC/B,eAAe;CACf,eAAe;CACf,kBAAkB;CAClB,gBAAgB;CAChB,cAAc;CACd,iBAAiB;AACnB"}
@@ -1,6 +1,8 @@
1
+ //#region src/native/shared/icons.d.ts
1
2
  export declare const iconSource: (svg: SVGElement, mirrored?: boolean) => string | undefined;
2
3
  export declare const createIconRenderer: () => {
3
- clear: () => void;
4
- render(source: string, width: number, height: number): Promise<string>;
4
+ clear: () => void;
5
+ render(source: string, width: number, height: number): Promise<string>;
5
6
  };
7
+ //#endregion
6
8
  //# sourceMappingURL=icons.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../../src/native/shared/icons.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,KAAK,UAAU,EAAE,WAAW,OAAO,KAAG,MAAM,GAAG,SA2BzE,CAAC;AAEF,eAAO,MAAM,kBAAkB;;mBAIN,MAAM,SAAS,MAAM,UAAU,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuB/E,CAAC"}
1
+ {"version":3,"file":"icons.d.ts","names":[],"sources":["../../../src/native/shared/icons.ts"],"mappings":";qBAAa,aAAc,KAAK,YAAY;qBA6B/B;;EAIY,OAAA,gBAAM,eAAe,iBAAmB"}