@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,37 @@
1
+ import type { PopoverSize, PositionAlign, PositionReference, PositionSide, TriggerAction } from './popover-interface';
2
+ export interface ReferenceCoordinates {
3
+ top: number;
4
+ left: number;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ interface PopoverPosition {
9
+ top: number;
10
+ left: number;
11
+ referenceCoordinates?: ReferenceCoordinates;
12
+ originX: string;
13
+ originY: string;
14
+ }
15
+ export interface PopoverStyles {
16
+ top: number;
17
+ left: number;
18
+ bottom?: number;
19
+ originX: string;
20
+ originY: string;
21
+ checkSafeAreaLeft: boolean;
22
+ checkSafeAreaRight: boolean;
23
+ addPopoverBottomClass: boolean;
24
+ }
25
+ export declare const getPopoverDimensions: (size: PopoverSize, contentEl: HTMLElement, triggerEl?: HTMLElement) => {
26
+ contentWidth: number;
27
+ contentHeight: number;
28
+ };
29
+ export declare const configureDismissInteraction: (triggerEl: HTMLElement, triggerAction: TriggerAction, popoverEl: HTMLIonPopoverElement, parentPopoverEl: HTMLIonPopoverElement) => () => void;
30
+ export declare const configureTriggerInteraction: (triggerEl: HTMLElement, triggerAction: TriggerAction, popoverEl: HTMLIonPopoverElement) => () => void;
31
+ export declare const getIndexOfItem: (items: HTMLIonItemElement[], item: HTMLElement | null) => number;
32
+ export declare const getNextItem: (items: HTMLIonItemElement[], currentItem: HTMLElement | null) => HTMLIonItemElement;
33
+ export declare const getPrevItem: (items: HTMLIonItemElement[], currentItem: HTMLElement | null) => HTMLIonItemElement;
34
+ export declare const getPopoverPosition: (isRTL: boolean, contentWidth: number, contentHeight: number, reference: PositionReference, side: PositionSide, align: PositionAlign, defaultPosition: PopoverPosition, triggerEl?: HTMLElement, event?: MouseEvent | CustomEvent) => PopoverPosition;
35
+ export declare const calculateWindowAdjustment: (side: PositionSide, coordTop: number, coordLeft: number, bodyPadding: number, bodyWidth: number, bodyHeight: number, contentWidth: number, contentHeight: number, safeAreaMargin: number, contentOriginX: string, contentOriginY: string, triggerCoordinates?: ReferenceCoordinates, eventElementRect?: DOMRect, isReplace?: boolean) => PopoverStyles;
36
+ export {};
37
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/popover/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,iBAAiB,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQtH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;CAChC;AAOD,eAAO,MAAM,oBAAoB,GAAI,MAAM,WAAW,EAAE,WAAW,WAAW,EAAE,YAAY,WAAW;;;CActG,CAAC;AAEF,eAAO,MAAM,2BAA2B,GACtC,WAAW,WAAW,EACtB,eAAe,aAAa,EAC5B,WAAW,qBAAqB,EAChC,iBAAiB,qBAAqB,eAyEvC,CAAC;AAOF,eAAO,MAAM,2BAA2B,GAAI,WAAW,WAAW,EAAE,eAAe,aAAa,EAAE,WAAW,qBAAqB,eA4HjI,CAAC;AAKF,eAAO,MAAM,cAAc,GAAI,OAAO,kBAAkB,EAAE,EAAE,MAAM,WAAW,GAAG,IAAI,WAMnF,CAAC;AAOF,eAAO,MAAM,WAAW,GAAI,OAAO,kBAAkB,EAAE,EAAE,aAAa,WAAW,GAAG,IAAI,uBAGvF,CAAC;AAOF,eAAO,MAAM,WAAW,GAAI,OAAO,kBAAkB,EAAE,EAAE,aAAa,WAAW,GAAG,IAAI,uBAGvF,CAAC;AAiBF,eAAO,MAAM,kBAAkB,GAC7B,OAAO,OAAO,EACd,cAAc,MAAM,EACpB,eAAe,MAAM,EACrB,WAAW,iBAAiB,EAC5B,MAAM,YAAY,EAClB,OAAO,aAAa,EACpB,iBAAiB,eAAe,EAChC,YAAY,WAAW,EACvB,QAAQ,UAAU,GAAG,WAAW,KAC/B,eAqFF,CAAC;AA6LF,eAAO,MAAM,yBAAyB,GACpC,MAAM,YAAY,EAClB,UAAU,MAAM,EAChB,WAAW,MAAM,EACjB,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,YAAY,MAAM,EAClB,cAAc,MAAM,EACpB,eAAe,MAAM,EACrB,gBAAgB,MAAM,EACtB,gBAAgB,MAAM,EACtB,gBAAgB,MAAM,EACtB,qBAAqB,oBAAoB,EACzC,mBAAmB,OAAO,EAC1B,YAAW,OAAe,KACzB,aAmFF,CAAC"}
@@ -0,0 +1,377 @@
1
+ import { getElementRoot, raf } from '../utils';
2
+ import { POPOVER_IOS_BODY_MARGIN } from './animations/ios.enter';
3
+ export const getPopoverDimensions = (size, contentEl, triggerEl) => {
4
+ const contentDimentions = contentEl.getBoundingClientRect();
5
+ const contentHeight = contentDimentions.height;
6
+ let contentWidth = contentDimentions.width;
7
+ if (size === 'cover' && triggerEl) {
8
+ const triggerDimensions = triggerEl.getBoundingClientRect();
9
+ contentWidth = triggerDimensions.width;
10
+ }
11
+ return {
12
+ contentWidth,
13
+ contentHeight,
14
+ };
15
+ };
16
+ export const configureDismissInteraction = (triggerEl, triggerAction, popoverEl, parentPopoverEl) => {
17
+ let dismissCallbacks = [];
18
+ const root = getElementRoot(parentPopoverEl);
19
+ const parentContentEl = root.querySelector('.popover-content');
20
+ switch (triggerAction) {
21
+ case 'hover':
22
+ dismissCallbacks = [
23
+ {
24
+ eventName: 'mouseenter',
25
+ callback: (ev) => {
26
+ const element = document.elementFromPoint(ev.clientX, ev.clientY);
27
+ if (element === triggerEl) {
28
+ return;
29
+ }
30
+ popoverEl.dismiss(undefined, undefined, false);
31
+ },
32
+ },
33
+ ];
34
+ break;
35
+ case 'context-menu':
36
+ case 'click':
37
+ default:
38
+ dismissCallbacks = [
39
+ {
40
+ eventName: 'click',
41
+ callback: (ev) => {
42
+ const target = ev.target;
43
+ const closestTrigger = target.closest('[data-ion-popover-trigger]');
44
+ if (closestTrigger === triggerEl) {
45
+ ev.stopPropagation();
46
+ return;
47
+ }
48
+ popoverEl.dismiss(undefined, undefined, false);
49
+ },
50
+ },
51
+ ];
52
+ break;
53
+ }
54
+ dismissCallbacks.forEach(({ eventName, callback }) => parentContentEl.addEventListener(eventName, callback));
55
+ return () => {
56
+ dismissCallbacks.forEach(({ eventName, callback }) => parentContentEl.removeEventListener(eventName, callback));
57
+ };
58
+ };
59
+ export const configureTriggerInteraction = (triggerEl, triggerAction, popoverEl) => {
60
+ let triggerCallbacks = [];
61
+ switch (triggerAction) {
62
+ case 'hover':
63
+ let hoverTimeout;
64
+ triggerCallbacks = [
65
+ {
66
+ eventName: 'mouseenter',
67
+ callback: async (ev) => {
68
+ ev.stopPropagation();
69
+ if (hoverTimeout) {
70
+ clearTimeout(hoverTimeout);
71
+ }
72
+ hoverTimeout = setTimeout(() => {
73
+ raf(() => {
74
+ popoverEl.presentFromTrigger(ev);
75
+ hoverTimeout = undefined;
76
+ });
77
+ }, 100);
78
+ },
79
+ },
80
+ {
81
+ eventName: 'mouseleave',
82
+ callback: (ev) => {
83
+ if (hoverTimeout) {
84
+ clearTimeout(hoverTimeout);
85
+ }
86
+ const target = ev.relatedTarget;
87
+ if (!target) {
88
+ return;
89
+ }
90
+ if (target.closest('ion-popover') !== popoverEl) {
91
+ popoverEl.dismiss(undefined, undefined, false);
92
+ }
93
+ },
94
+ },
95
+ {
96
+ eventName: 'click',
97
+ callback: (ev) => ev.stopPropagation(),
98
+ },
99
+ {
100
+ eventName: 'ionPopoverActivateTrigger',
101
+ callback: (ev) => popoverEl.presentFromTrigger(ev, true),
102
+ },
103
+ ];
104
+ break;
105
+ case 'context-menu':
106
+ triggerCallbacks = [
107
+ {
108
+ eventName: 'contextmenu',
109
+ callback: (ev) => {
110
+ ev.preventDefault();
111
+ popoverEl.presentFromTrigger(ev);
112
+ },
113
+ },
114
+ {
115
+ eventName: 'click',
116
+ callback: (ev) => ev.stopPropagation(),
117
+ },
118
+ {
119
+ eventName: 'ionPopoverActivateTrigger',
120
+ callback: (ev) => popoverEl.presentFromTrigger(ev, true),
121
+ },
122
+ ];
123
+ break;
124
+ case 'click':
125
+ default:
126
+ triggerCallbacks = [
127
+ {
128
+ eventName: 'click',
129
+ callback: (ev) => popoverEl.presentFromTrigger(ev),
130
+ },
131
+ {
132
+ eventName: 'ionPopoverActivateTrigger',
133
+ callback: (ev) => popoverEl.presentFromTrigger(ev, true),
134
+ },
135
+ ];
136
+ break;
137
+ }
138
+ triggerCallbacks.forEach(({ eventName, callback }) => triggerEl.addEventListener(eventName, callback));
139
+ triggerEl.setAttribute('data-ion-popover-trigger', 'true');
140
+ return () => {
141
+ triggerCallbacks.forEach(({ eventName, callback }) => triggerEl.removeEventListener(eventName, callback));
142
+ triggerEl.removeAttribute('data-ion-popover-trigger');
143
+ };
144
+ };
145
+ export const getIndexOfItem = (items, item) => {
146
+ if (!item || item.tagName !== 'ION-ITEM') {
147
+ return -1;
148
+ }
149
+ return items.findIndex((el) => el === item);
150
+ };
151
+ export const getNextItem = (items, currentItem) => {
152
+ const currentItemIndex = getIndexOfItem(items, currentItem);
153
+ return items[currentItemIndex + 1];
154
+ };
155
+ export const getPrevItem = (items, currentItem) => {
156
+ const currentItemIndex = getIndexOfItem(items, currentItem);
157
+ return items[currentItemIndex - 1];
158
+ };
159
+ const focusItem = (item) => {
160
+ const root = getElementRoot(item);
161
+ const button = root.querySelector('button');
162
+ if (button) {
163
+ raf(() => button.focus());
164
+ }
165
+ };
166
+ export const getPopoverPosition = (isRTL, contentWidth, contentHeight, reference, side, align, defaultPosition, triggerEl, event) => {
167
+ let referenceCoordinates = {
168
+ top: 0,
169
+ left: 0,
170
+ width: 0,
171
+ height: 0,
172
+ };
173
+ switch (reference) {
174
+ case 'event':
175
+ if (!event) {
176
+ return defaultPosition;
177
+ }
178
+ const mouseEv = event;
179
+ referenceCoordinates = {
180
+ top: mouseEv.clientY,
181
+ left: mouseEv.clientX,
182
+ width: 1,
183
+ height: 1,
184
+ };
185
+ break;
186
+ case 'trigger':
187
+ default:
188
+ const customEv = event;
189
+ const actualTriggerEl = (triggerEl || customEv?.detail?.ionShadowTarget || customEv?.target);
190
+ if (!actualTriggerEl) {
191
+ return defaultPosition;
192
+ }
193
+ const triggerBoundingBox = actualTriggerEl.getBoundingClientRect();
194
+ referenceCoordinates = {
195
+ top: triggerBoundingBox.top,
196
+ left: triggerBoundingBox.left,
197
+ width: triggerBoundingBox.width,
198
+ height: triggerBoundingBox.height,
199
+ };
200
+ break;
201
+ }
202
+ const coordinates = calculatePopoverSide(side, referenceCoordinates, contentWidth, contentHeight, isRTL);
203
+ const alignedCoordinates = calculatePopoverAlign(align, side, referenceCoordinates, contentWidth, contentHeight);
204
+ const top = coordinates.top + alignedCoordinates.top;
205
+ const left = coordinates.left + alignedCoordinates.left;
206
+ const { originX, originY } = calculatePopoverOrigin(side, align, isRTL);
207
+ return { top, left, referenceCoordinates, originX, originY };
208
+ };
209
+ const calculatePopoverOrigin = (side, align, isRTL) => {
210
+ switch (side) {
211
+ case 'top':
212
+ return { originX: getOriginXAlignment(align), originY: 'bottom' };
213
+ case 'bottom':
214
+ return { originX: getOriginXAlignment(align), originY: 'top' };
215
+ case 'left':
216
+ return { originX: 'right', originY: getOriginYAlignment(align) };
217
+ case 'right':
218
+ return { originX: 'left', originY: getOriginYAlignment(align) };
219
+ case 'start':
220
+ return { originX: isRTL ? 'left' : 'right', originY: getOriginYAlignment(align) };
221
+ case 'end':
222
+ return { originX: isRTL ? 'right' : 'left', originY: getOriginYAlignment(align) };
223
+ }
224
+ };
225
+ const getOriginXAlignment = (align) => {
226
+ switch (align) {
227
+ case 'start':
228
+ return 'left';
229
+ case 'center':
230
+ return 'center';
231
+ case 'end':
232
+ return 'right';
233
+ }
234
+ };
235
+ const getOriginYAlignment = (align) => {
236
+ switch (align) {
237
+ case 'start':
238
+ return 'top';
239
+ case 'center':
240
+ return 'center';
241
+ case 'end':
242
+ return 'bottom';
243
+ }
244
+ };
245
+ const calculatePopoverSide = (side, triggerBoundingBox, contentWidth, contentHeight, isRTL) => {
246
+ const sideLeft = {
247
+ top: triggerBoundingBox.top,
248
+ left: triggerBoundingBox.left - contentWidth,
249
+ };
250
+ const sideRight = {
251
+ top: triggerBoundingBox.top,
252
+ left: triggerBoundingBox.left + triggerBoundingBox.width,
253
+ };
254
+ switch (side) {
255
+ case 'top':
256
+ return {
257
+ top: triggerBoundingBox.top - contentHeight,
258
+ left: triggerBoundingBox.left,
259
+ };
260
+ case 'right':
261
+ return sideRight;
262
+ case 'bottom':
263
+ return {
264
+ top: triggerBoundingBox.top + triggerBoundingBox.height,
265
+ left: triggerBoundingBox.left,
266
+ };
267
+ case 'left':
268
+ return sideLeft;
269
+ case 'start':
270
+ return isRTL ? sideRight : sideLeft;
271
+ case 'end':
272
+ return isRTL ? sideLeft : sideRight;
273
+ }
274
+ };
275
+ const calculatePopoverAlign = (align, side, triggerBoundingBox, contentWidth, contentHeight) => {
276
+ switch (align) {
277
+ case 'center':
278
+ return calculatePopoverCenterAlign(side, triggerBoundingBox, contentWidth, contentHeight);
279
+ case 'end':
280
+ return calculatePopoverEndAlign(side, triggerBoundingBox, contentWidth, contentHeight);
281
+ case 'start':
282
+ default:
283
+ return { top: 0, left: 0 };
284
+ }
285
+ };
286
+ const calculatePopoverEndAlign = (side, triggerBoundingBox, contentWidth, contentHeight) => {
287
+ switch (side) {
288
+ case 'start':
289
+ case 'end':
290
+ case 'left':
291
+ case 'right':
292
+ return {
293
+ top: -(contentHeight - triggerBoundingBox.height),
294
+ left: 0,
295
+ };
296
+ case 'top':
297
+ case 'bottom':
298
+ default:
299
+ return {
300
+ top: 0,
301
+ left: -(contentWidth - triggerBoundingBox.width),
302
+ };
303
+ }
304
+ };
305
+ const calculatePopoverCenterAlign = (side, triggerBoundingBox, contentWidth, contentHeight) => {
306
+ switch (side) {
307
+ case 'start':
308
+ case 'end':
309
+ case 'left':
310
+ case 'right':
311
+ return {
312
+ top: -(contentHeight / 2 - triggerBoundingBox.height / 2),
313
+ left: 0,
314
+ };
315
+ case 'top':
316
+ case 'bottom':
317
+ default:
318
+ return {
319
+ top: 0,
320
+ left: -(contentWidth / 2 - triggerBoundingBox.width / 2),
321
+ };
322
+ }
323
+ };
324
+ export const calculateWindowAdjustment = (side, coordTop, coordLeft, bodyPadding, bodyWidth, bodyHeight, contentWidth, contentHeight, safeAreaMargin, contentOriginX, contentOriginY, triggerCoordinates, eventElementRect, isReplace = false) => {
325
+ const triggerTop = triggerCoordinates ? triggerCoordinates.top + triggerCoordinates.height : bodyHeight / 2 - contentHeight / 2;
326
+ const triggerHeight = triggerCoordinates ? triggerCoordinates.height : 0;
327
+ let left = coordLeft;
328
+ let top = !isReplace ? coordTop + POPOVER_IOS_BODY_MARGIN : coordTop - triggerHeight;
329
+ let bottom;
330
+ let originX = contentOriginX;
331
+ let originY = contentOriginY;
332
+ let checkSafeAreaLeft = false;
333
+ let checkSafeAreaRight = false;
334
+ let addPopoverBottomClass = false;
335
+ if (left < bodyPadding + safeAreaMargin) {
336
+ left = !eventElementRect ? bodyPadding : eventElementRect.left;
337
+ if (left === 0) {
338
+ left = safeAreaMargin;
339
+ }
340
+ checkSafeAreaLeft = true;
341
+ originX = 'left';
342
+ }
343
+ else if (contentWidth + bodyPadding + left + safeAreaMargin > bodyWidth) {
344
+ checkSafeAreaRight = true;
345
+ left = !eventElementRect ? bodyWidth - contentWidth - bodyPadding : eventElementRect.right - contentWidth;
346
+ if (left + contentWidth === bodyWidth) {
347
+ left = left - safeAreaMargin;
348
+ }
349
+ originX = 'right';
350
+ }
351
+ const compareTop = triggerCoordinates ? triggerCoordinates.top + triggerCoordinates.height / 2 : bodyHeight / 2 - contentHeight / 2;
352
+ if (compareTop > bodyHeight / 2 && (side === 'top' || side === 'bottom')) {
353
+ if (triggerTop - contentHeight > 0) {
354
+ if (!isReplace) {
355
+ top = Math.max(12, triggerTop - contentHeight - triggerHeight) - POPOVER_IOS_BODY_MARGIN;
356
+ }
357
+ else {
358
+ top = Math.max(12, triggerTop - contentHeight);
359
+ }
360
+ originY = 'bottom';
361
+ addPopoverBottomClass = true;
362
+ }
363
+ else {
364
+ bottom = bodyPadding;
365
+ }
366
+ }
367
+ return {
368
+ top,
369
+ left,
370
+ bottom,
371
+ originX,
372
+ originY,
373
+ checkSafeAreaLeft,
374
+ checkSafeAreaRight,
375
+ addPopoverBottomClass,
376
+ };
377
+ };
@@ -0,0 +1,8 @@
1
+ import type { Animation, AnimationKeyFrames } from '@ionic/core';
2
+ import { AnimationPosition, EffectScales } from './interfaces';
3
+ import { GestureDetail } from '@ionic/core';
4
+ export declare const getScaleAnimation: (effectElement: Element) => Animation;
5
+ export declare const createPreMoveAnimation: (effectElement: Element, tabSelectedElement: Element, currentTouchedElement: Element, animationPosition: AnimationPosition) => Animation;
6
+ export declare const createMoveAnimation: (effectElement: Element, detail: GestureDetail, tabSelectedElement: Element, animationPosition: AnimationPosition) => Animation;
7
+ export declare const getMoveAnimationKeyframe: (type: "moveRight" | "moveLeft" | "slowly", scales: EffectScales) => AnimationKeyFrames;
8
+ //# sourceMappingURL=animations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"animations.d.ts","sourceRoot":"","sources":["../../src/sheets-of-glass/animations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC/D,OAAO,EAAmB,aAAa,EAAE,MAAM,aAAa,CAAC;AAG7D,eAAO,MAAM,iBAAiB,GAAI,eAAe,OAAO,KAAG,SAE1D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GACjC,eAAe,OAAO,EACtB,oBAAoB,OAAO,EAC3B,uBAAuB,OAAO,EAC9B,mBAAmB,iBAAiB,KACnC,SA0BF,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC9B,eAAe,OAAO,EACtB,QAAQ,aAAa,EACrB,oBAAoB,OAAO,EAC3B,mBAAmB,iBAAiB,KACnC,SAiBF,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAI,MAAM,WAAW,GAAG,UAAU,GAAG,QAAQ,EAAE,QAAQ,YAAY,KAAG,kBAqD1G,CAAC"}
@@ -0,0 +1,97 @@
1
+ import { createAnimation } from '@ionic/core';
2
+ import { getStep } from '../utils';
3
+ export const getScaleAnimation = (effectElement) => {
4
+ return createAnimation().addElement(effectElement.shadowRoot.querySelector('[part="native"]')).easing('ease-out');
5
+ };
6
+ export const createPreMoveAnimation = (effectElement, tabSelectedElement, currentTouchedElement, animationPosition) => {
7
+ const diff = Math.max(Math.abs(tabSelectedElement.getBoundingClientRect().left - currentTouchedElement.getBoundingClientRect().left), 140);
8
+ return createAnimation()
9
+ .duration(diff * 2.1)
10
+ .easing('ease-out')
11
+ .addElement(effectElement)
12
+ .beforeStyles({
13
+ width: `${tabSelectedElement.clientWidth}px`,
14
+ height: `${tabSelectedElement.clientHeight}px`,
15
+ display: 'block',
16
+ opacity: '1',
17
+ transform: 'none',
18
+ })
19
+ .keyframes([
20
+ {
21
+ offset: 0,
22
+ transform: `translate3d(${tabSelectedElement.getBoundingClientRect().left}px, ${animationPosition.positionY}px, 0)`,
23
+ },
24
+ {
25
+ offset: 1,
26
+ transform: `translate3d(${currentTouchedElement.getBoundingClientRect().left}px, ${animationPosition.positionY}px, 0)`,
27
+ },
28
+ ]);
29
+ };
30
+ export const createMoveAnimation = (effectElement, detail, tabSelectedElement, animationPosition) => {
31
+ return createAnimation()
32
+ .duration(500)
33
+ .addElement(effectElement)
34
+ .beforeStyles({
35
+ width: `${tabSelectedElement.clientWidth}px`,
36
+ height: `${tabSelectedElement.clientHeight}px`,
37
+ display: 'block',
38
+ opacity: '1',
39
+ transform: 'none',
40
+ })
41
+ .fromTo('transform', `translate3d(${animationPosition.minPositionX}px, ${animationPosition.positionY}px, 0)`, `translate3d(${animationPosition.maxPositionX}px, ${animationPosition.positionY}px, 0)`)
42
+ .progressStep(getStep(detail.currentX, animationPosition));
43
+ };
44
+ export const getMoveAnimationKeyframe = (type, scales) => {
45
+ return {
46
+ moveRight: [
47
+ {
48
+ offset: 0,
49
+ transform: scales.large,
50
+ },
51
+ {
52
+ offset: 0.4,
53
+ transform: scales.small,
54
+ },
55
+ {
56
+ offset: 0.75,
57
+ transform: scales.xlarge,
58
+ },
59
+ {
60
+ offset: 1,
61
+ transform: scales.large,
62
+ },
63
+ ],
64
+ moveLeft: [
65
+ {
66
+ offset: 0,
67
+ transform: scales.large,
68
+ },
69
+ {
70
+ offset: 0.1,
71
+ transform: scales.xlarge,
72
+ },
73
+ {
74
+ offset: 0.6,
75
+ transform: scales.small,
76
+ },
77
+ {
78
+ offset: 1,
79
+ transform: scales.large,
80
+ },
81
+ ],
82
+ slowly: [
83
+ {
84
+ offset: 0,
85
+ transform: scales.large,
86
+ },
87
+ {
88
+ offset: 0.4,
89
+ transform: scales.medium,
90
+ },
91
+ {
92
+ offset: 1,
93
+ transform: scales.large,
94
+ },
95
+ ],
96
+ }[type];
97
+ };
@@ -0,0 +1,3 @@
1
+ import { EffectScales, registeredEffect } from './interfaces';
2
+ export declare const registerEffect: (targetElement: HTMLElement, effectTagName: string, selectedClassName: string, scales: EffectScales) => registeredEffect | undefined;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sheets-of-glass/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AASjF,eAAO,MAAM,cAAc,GACzB,eAAe,WAAW,EAC1B,eAAe,MAAM,EACrB,mBAAmB,MAAM,EACzB,QAAQ,YAAY,KACnB,gBAAgB,GAAG,SAuMrB,CAAC"}