@rdlabo/ionic-theme-ios26 0.3.3 → 0.3.5

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 (65) hide show
  1. package/README.md +29 -18
  2. package/dist/css/components/ion-segment.css +1 -1
  3. package/dist/css/components/ion-tabs.css +1 -1
  4. package/dist/css/ionic-theme-ios26.css +1 -1
  5. package/dist/css/md-remove-ios-class-effect.css +1 -1
  6. package/dist/gestures/gestures.d.ts +3 -0
  7. package/dist/gestures/gestures.d.ts.map +1 -0
  8. package/dist/gestures/gestures.js +240 -0
  9. package/dist/gestures/index.d.ts +3 -0
  10. package/dist/gestures/index.d.ts.map +1 -0
  11. package/dist/gestures/index.js +240 -0
  12. package/dist/gestures/interfaces.d.ts +10 -0
  13. package/dist/gestures/interfaces.d.ts.map +1 -0
  14. package/dist/gestures/interfaces.js +1 -0
  15. package/dist/gestures/utils.d.ts +3 -0
  16. package/dist/gestures/utils.d.ts.map +1 -0
  17. package/dist/gestures/utils.js +24 -0
  18. package/dist/index.d.ts +5 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +18 -0
  21. package/dist/utils.d.ts +3 -0
  22. package/dist/utils.d.ts.map +1 -0
  23. package/dist/utils.js +24 -0
  24. package/package.json +17 -4
  25. package/src/gestures/index.ts +290 -0
  26. package/src/gestures/interfaces.ts +10 -0
  27. package/src/gestures/utils.ts +28 -0
  28. package/src/index.ts +21 -0
  29. package/src/styles/components/ion-segment.scss +106 -0
  30. package/src/styles/components/ion-tabs.scss +117 -0
  31. package/src/{md-remove-ios-class-effect.scss → styles/md-remove-ios-class-effect.scss} +2 -2
  32. package/src/components/ion-segment.scss +0 -64
  33. package/src/components/ion-tabs.scss +0 -86
  34. /package/src/{components → styles/components}/ion-action-sheet.scss +0 -0
  35. /package/src/{components → styles/components}/ion-alert.scss +0 -0
  36. /package/src/{components → styles/components}/ion-breadcrumbs.scss +0 -0
  37. /package/src/{components → styles/components}/ion-button.scss +0 -0
  38. /package/src/{components → styles/components}/ion-card.scss +0 -0
  39. /package/src/{components → styles/components}/ion-chip.scss +0 -0
  40. /package/src/{components → styles/components}/ion-content.scss +0 -0
  41. /package/src/{components → styles/components}/ion-datetime.scss +0 -0
  42. /package/src/{components → styles/components}/ion-fab.scss +0 -0
  43. /package/src/{components → styles/components}/ion-list.scss +0 -0
  44. /package/src/{components → styles/components}/ion-loading.scss +0 -0
  45. /package/src/{components → styles/components}/ion-modal.scss +0 -0
  46. /package/src/{components → styles/components}/ion-picker.scss +0 -0
  47. /package/src/{components → styles/components}/ion-popover.scss +0 -0
  48. /package/src/{components → styles/components}/ion-range.scss +0 -0
  49. /package/src/{components → styles/components}/ion-searchbar.scss +0 -0
  50. /package/src/{components → styles/components}/ion-toast.scss +0 -0
  51. /package/src/{components → styles/components}/ion-toggle.scss +0 -0
  52. /package/src/{components → styles/components}/ion-toolbar.scss +0 -0
  53. /package/src/{default-variables.scss → styles/default-variables.scss} +0 -0
  54. /package/src/{ionic-theme-ios26-dark-always.scss → styles/ionic-theme-ios26-dark-always.scss} +0 -0
  55. /package/src/{ionic-theme-ios26-dark-class.scss → styles/ionic-theme-ios26-dark-class.scss} +0 -0
  56. /package/src/{ionic-theme-ios26-dark-system.scss → styles/ionic-theme-ios26-dark-system.scss} +0 -0
  57. /package/src/{ionic-theme-ios26.scss → styles/ionic-theme-ios26.scss} +0 -0
  58. /package/src/{md-ion-list-inset.scss → styles/md-ion-list-inset.scss} +0 -0
  59. /package/src/{utils → styles/utils}/api.scss +0 -0
  60. /package/src/{utils → styles/utils}/dark/ion-button.scss +0 -0
  61. /package/src/{utils → styles/utils}/dark/ion-fab.scss +0 -0
  62. /package/src/{utils → styles/utils}/dark/ion-tabs.scss +0 -0
  63. /package/src/{utils → styles/utils}/theme-dark.scss +0 -0
  64. /package/src/{utils → styles/utils}/theme-list-inset.scss +0 -0
  65. /package/src/{utils → styles/utils}/translucent.scss +0 -0
@@ -0,0 +1,240 @@
1
+ import { createGesture, createAnimation } from '@ionic/core';
2
+ import { cloneElement, getTransform } from './utils';
3
+ const GESTURE_NAME = 'ios26-enable-gesture';
4
+ const ANIMATED_NAME = 'ios26-animated';
5
+ export const registerEffect = (targetElement, effectTagName, selectedClassName, scales) => {
6
+ if (!targetElement.classList.contains('ios')) {
7
+ return undefined;
8
+ }
9
+ let gesture;
10
+ let moveAnimation;
11
+ let currentTouchedElement;
12
+ let animationLatestX;
13
+ let effectElementPositionY;
14
+ let enterAnimationPromise;
15
+ let moveAnimationPromise;
16
+ let clearActivatedTimer;
17
+ const effectElement = cloneElement(effectTagName);
18
+ const onPointerDown = () => {
19
+ clearActivated();
20
+ currentTouchedElement?.classList.remove('ion-activated');
21
+ gesture.destroy();
22
+ createAnimationGesture();
23
+ };
24
+ const onPointerUp = (event) => {
25
+ clearActivatedTimer = setTimeout(() => {
26
+ onEndGesture();
27
+ currentTouchedElement?.classList.remove('ion-activated');
28
+ gesture.destroy();
29
+ createAnimationGesture();
30
+ });
31
+ };
32
+ targetElement.addEventListener('pointerdown', onPointerDown);
33
+ targetElement.addEventListener('pointerup', onPointerUp);
34
+ const createAnimationGesture = () => {
35
+ targetElement.classList.add(GESTURE_NAME);
36
+ gesture = createGesture({
37
+ el: targetElement,
38
+ threshold: 0,
39
+ gestureName: `${GESTURE_NAME}_${effectTagName}_${crypto.randomUUID()}`,
40
+ onStart: (event) => onStartGesture(event),
41
+ onMove: (event) => onMoveGesture(event),
42
+ onEnd: (event) => onEndGesture(),
43
+ });
44
+ gesture.enable(true);
45
+ };
46
+ createAnimationGesture();
47
+ const clearActivated = () => {
48
+ if (!currentTouchedElement) {
49
+ return;
50
+ }
51
+ requestAnimationFrame(() => {
52
+ effectElement.style.display = 'none';
53
+ effectElement.innerHTML = '';
54
+ effectElement.style.transform = 'none';
55
+ });
56
+ targetElement.classList.remove(ANIMATED_NAME);
57
+ currentTouchedElement = undefined;
58
+ moveAnimation = undefined;
59
+ moveAnimationPromise = undefined;
60
+ enterAnimationPromise = undefined;
61
+ };
62
+ const onStartGesture = (detail) => {
63
+ enterAnimationPromise = undefined;
64
+ currentTouchedElement = detail.event.target.closest(effectTagName) || undefined;
65
+ const tabSelectedElement = targetElement.querySelector(`${effectTagName}.${selectedClassName}`);
66
+ if (currentTouchedElement === undefined || tabSelectedElement === null) {
67
+ return false;
68
+ }
69
+ effectElementPositionY = tabSelectedElement.getBoundingClientRect().top;
70
+ const startTransform = getTransform(tabSelectedElement.getBoundingClientRect().left + tabSelectedElement.clientWidth / 2, effectElementPositionY, tabSelectedElement);
71
+ const middleTransform = getTransform((tabSelectedElement.getBoundingClientRect().left + tabSelectedElement.clientWidth / 2 + detail.currentX) / 2, effectElementPositionY, currentTouchedElement);
72
+ const endTransform = getTransform(detail.currentX, effectElementPositionY, currentTouchedElement);
73
+ const enterAnimation = createAnimation();
74
+ enterAnimation
75
+ .addElement(effectElement)
76
+ .delay(70)
77
+ .beforeStyles({
78
+ width: `${tabSelectedElement.clientWidth}px`,
79
+ height: `${tabSelectedElement.clientHeight}px`,
80
+ display: 'block',
81
+ })
82
+ .beforeAddWrite(() => {
83
+ tabSelectedElement.childNodes.forEach((node) => {
84
+ effectElement.appendChild(node.cloneNode(true));
85
+ });
86
+ targetElement.classList.add(ANIMATED_NAME);
87
+ currentTouchedElement.classList.add('ion-activated');
88
+ currentTouchedElement.click();
89
+ });
90
+ if (currentTouchedElement === tabSelectedElement) {
91
+ enterAnimation
92
+ .keyframes([
93
+ {
94
+ transform: `${startTransform} ${scales.small}`,
95
+ opacity: 1,
96
+ offset: 0,
97
+ },
98
+ {
99
+ transform: `${middleTransform} ${scales.large}`,
100
+ opacity: 1,
101
+ offset: 0.6,
102
+ },
103
+ {
104
+ transform: `${endTransform} ${scales.medium}`,
105
+ opacity: 1,
106
+ offset: 1,
107
+ },
108
+ ])
109
+ .duration(160);
110
+ }
111
+ else {
112
+ enterAnimation
113
+ .keyframes([
114
+ {
115
+ transform: `${startTransform} ${scales.small}`,
116
+ opacity: 1,
117
+ offset: 0,
118
+ },
119
+ {
120
+ transform: `${middleTransform} ${scales.large}`,
121
+ opacity: 1,
122
+ offset: 0.65,
123
+ },
124
+ {
125
+ transform: `${endTransform} ${scales.medium}`,
126
+ opacity: 1,
127
+ offset: 1,
128
+ },
129
+ ])
130
+ .duration(280);
131
+ }
132
+ animationLatestX = detail.currentX;
133
+ enterAnimationPromise = enterAnimation.play().then(() => {
134
+ enterAnimationPromise = undefined;
135
+ });
136
+ return true;
137
+ };
138
+ const onMoveGesture = (detail) => {
139
+ if (currentTouchedElement === undefined || enterAnimationPromise || moveAnimationPromise) {
140
+ return true;
141
+ }
142
+ const startTransform = getTransform(animationLatestX, effectElementPositionY, currentTouchedElement);
143
+ const endTransform = getTransform(detail.currentX, effectElementPositionY, currentTouchedElement);
144
+ if (!moveAnimation) {
145
+ moveAnimation = createAnimation();
146
+ moveAnimation
147
+ .addElement(effectElement)
148
+ .duration(800)
149
+ .easing('ease-in-out')
150
+ .keyframes([
151
+ {
152
+ transform: `${startTransform} ${scales.medium}`,
153
+ opacity: 1,
154
+ offset: 0,
155
+ },
156
+ {
157
+ transform: `${startTransform} ${scales.xlarge}`,
158
+ opacity: 1,
159
+ offset: 0.2,
160
+ },
161
+ {
162
+ transform: `${endTransform} ${scales.medium}`,
163
+ opacity: 1,
164
+ offset: 1,
165
+ },
166
+ ]);
167
+ }
168
+ else {
169
+ moveAnimation.duration(0).keyframes([
170
+ {
171
+ transform: `${endTransform} ${scales.medium}`,
172
+ opacity: 1,
173
+ offset: 1,
174
+ },
175
+ {
176
+ transform: `${endTransform} ${scales.medium}`,
177
+ opacity: 1,
178
+ offset: 1,
179
+ },
180
+ ]);
181
+ }
182
+ animationLatestX = detail.currentX;
183
+ moveAnimationPromise = moveAnimation.play().then(() => {
184
+ moveAnimationPromise = undefined;
185
+ });
186
+ return true;
187
+ };
188
+ const onEndGesture = () => {
189
+ if (clearActivatedTimer !== undefined) {
190
+ clearTimeout(clearActivatedTimer);
191
+ clearActivatedTimer = undefined;
192
+ }
193
+ if (currentTouchedElement === undefined) {
194
+ return false;
195
+ }
196
+ const transform = getTransform(animationLatestX, effectElementPositionY, currentTouchedElement);
197
+ const leaveAnimation = createAnimation();
198
+ leaveAnimation.addElement(effectElement);
199
+ leaveAnimation
200
+ .onFinish(() => clearActivated())
201
+ .easing('ease-in')
202
+ .duration(80)
203
+ .keyframes([
204
+ {
205
+ transform: `${transform} ${scales.medium}`,
206
+ opacity: 1,
207
+ },
208
+ {
209
+ transform: `${transform} ${scales.small}`,
210
+ opacity: 0,
211
+ },
212
+ ]);
213
+ (async () => {
214
+ if (enterAnimationPromise) {
215
+ setTimeout(() => currentTouchedElement.classList.remove('ion-activated'), 50);
216
+ await enterAnimationPromise;
217
+ }
218
+ else {
219
+ currentTouchedElement.classList.remove('ion-activated');
220
+ }
221
+ leaveAnimation.play();
222
+ })();
223
+ return true;
224
+ };
225
+ return {
226
+ destroy: () => {
227
+ targetElement.removeEventListener('pointerdown', onPointerDown);
228
+ targetElement.removeEventListener('pointerup', onPointerUp);
229
+ if (clearActivatedTimer !== undefined) {
230
+ clearTimeout(clearActivatedTimer);
231
+ clearActivatedTimer = undefined;
232
+ }
233
+ clearActivated();
234
+ if (gesture) {
235
+ gesture.destroy();
236
+ }
237
+ targetElement.classList.remove(GESTURE_NAME);
238
+ },
239
+ };
240
+ };
@@ -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/gestures/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAS9D,eAAO,MAAM,cAAc,GACzB,eAAe,WAAW,EAC1B,eAAe,MAAM,EACrB,mBAAmB,MAAM,EACzB,QAAQ,YAAY,KACnB,gBAAgB,GAAG,SAmRrB,CAAC"}
@@ -0,0 +1,240 @@
1
+ import { createGesture, createAnimation } from '@ionic/core';
2
+ import { cloneElement, getTransform } from './utils';
3
+ const GESTURE_NAME = 'ios26-enable-gesture';
4
+ const ANIMATED_NAME = 'ios26-animated';
5
+ export const registerEffect = (targetElement, effectTagName, selectedClassName, scales) => {
6
+ if (!targetElement.classList.contains('ios')) {
7
+ return undefined;
8
+ }
9
+ let gesture;
10
+ let moveAnimation;
11
+ let currentTouchedElement;
12
+ let animationLatestX;
13
+ let effectElementPositionY;
14
+ let enterAnimationPromise;
15
+ let moveAnimationPromise;
16
+ let clearActivatedTimer;
17
+ const effectElement = cloneElement(effectTagName);
18
+ const onPointerDown = () => {
19
+ clearActivated();
20
+ currentTouchedElement?.classList.remove('ion-activated');
21
+ gesture.destroy();
22
+ createAnimationGesture();
23
+ };
24
+ const onPointerUp = (event) => {
25
+ clearActivatedTimer = setTimeout(() => {
26
+ onEndGesture();
27
+ currentTouchedElement?.classList.remove('ion-activated');
28
+ gesture.destroy();
29
+ createAnimationGesture();
30
+ });
31
+ };
32
+ targetElement.addEventListener('pointerdown', onPointerDown);
33
+ targetElement.addEventListener('pointerup', onPointerUp);
34
+ const createAnimationGesture = () => {
35
+ targetElement.classList.add(GESTURE_NAME);
36
+ gesture = createGesture({
37
+ el: targetElement,
38
+ threshold: 0,
39
+ gestureName: `${GESTURE_NAME}_${effectTagName}_${crypto.randomUUID()}`,
40
+ onStart: (event) => onStartGesture(event),
41
+ onMove: (event) => onMoveGesture(event),
42
+ onEnd: (event) => onEndGesture(),
43
+ });
44
+ gesture.enable(true);
45
+ };
46
+ createAnimationGesture();
47
+ const clearActivated = () => {
48
+ if (!currentTouchedElement) {
49
+ return;
50
+ }
51
+ requestAnimationFrame(() => {
52
+ effectElement.style.display = 'none';
53
+ effectElement.innerHTML = '';
54
+ effectElement.style.transform = 'none';
55
+ });
56
+ targetElement.classList.remove(ANIMATED_NAME);
57
+ currentTouchedElement = undefined;
58
+ moveAnimation = undefined;
59
+ moveAnimationPromise = undefined;
60
+ enterAnimationPromise = undefined;
61
+ };
62
+ const onStartGesture = (detail) => {
63
+ enterAnimationPromise = undefined;
64
+ currentTouchedElement = detail.event.target.closest(effectTagName) || undefined;
65
+ const tabSelectedElement = targetElement.querySelector(`${effectTagName}.${selectedClassName}`);
66
+ if (currentTouchedElement === undefined || tabSelectedElement === null) {
67
+ return false;
68
+ }
69
+ effectElementPositionY = tabSelectedElement.getBoundingClientRect().top;
70
+ const startTransform = getTransform(tabSelectedElement.getBoundingClientRect().left + tabSelectedElement.clientWidth / 2, effectElementPositionY, tabSelectedElement);
71
+ const middleTransform = getTransform((tabSelectedElement.getBoundingClientRect().left + tabSelectedElement.clientWidth / 2 + detail.currentX) / 2, effectElementPositionY, currentTouchedElement);
72
+ const endTransform = getTransform(detail.currentX, effectElementPositionY, currentTouchedElement);
73
+ const enterAnimation = createAnimation();
74
+ enterAnimation
75
+ .addElement(effectElement)
76
+ .delay(70)
77
+ .beforeStyles({
78
+ width: `${tabSelectedElement.clientWidth}px`,
79
+ height: `${tabSelectedElement.clientHeight}px`,
80
+ display: 'block',
81
+ })
82
+ .beforeAddWrite(() => {
83
+ tabSelectedElement.childNodes.forEach((node) => {
84
+ effectElement.appendChild(node.cloneNode(true));
85
+ });
86
+ targetElement.classList.add(ANIMATED_NAME);
87
+ currentTouchedElement.classList.add('ion-activated');
88
+ currentTouchedElement.click();
89
+ });
90
+ if (currentTouchedElement === tabSelectedElement) {
91
+ enterAnimation
92
+ .keyframes([
93
+ {
94
+ transform: `${startTransform} ${scales.small}`,
95
+ opacity: 1,
96
+ offset: 0,
97
+ },
98
+ {
99
+ transform: `${middleTransform} ${scales.large}`,
100
+ opacity: 1,
101
+ offset: 0.6,
102
+ },
103
+ {
104
+ transform: `${endTransform} ${scales.medium}`,
105
+ opacity: 1,
106
+ offset: 1,
107
+ },
108
+ ])
109
+ .duration(160);
110
+ }
111
+ else {
112
+ enterAnimation
113
+ .keyframes([
114
+ {
115
+ transform: `${startTransform} ${scales.small}`,
116
+ opacity: 1,
117
+ offset: 0,
118
+ },
119
+ {
120
+ transform: `${middleTransform} ${scales.large}`,
121
+ opacity: 1,
122
+ offset: 0.65,
123
+ },
124
+ {
125
+ transform: `${endTransform} ${scales.medium}`,
126
+ opacity: 1,
127
+ offset: 1,
128
+ },
129
+ ])
130
+ .duration(280);
131
+ }
132
+ animationLatestX = detail.currentX;
133
+ enterAnimationPromise = enterAnimation.play().then(() => {
134
+ enterAnimationPromise = undefined;
135
+ });
136
+ return true;
137
+ };
138
+ const onMoveGesture = (detail) => {
139
+ if (currentTouchedElement === undefined || enterAnimationPromise || moveAnimationPromise) {
140
+ return true;
141
+ }
142
+ const startTransform = getTransform(animationLatestX, effectElementPositionY, currentTouchedElement);
143
+ const endTransform = getTransform(detail.currentX, effectElementPositionY, currentTouchedElement);
144
+ if (!moveAnimation) {
145
+ moveAnimation = createAnimation();
146
+ moveAnimation
147
+ .addElement(effectElement)
148
+ .duration(800)
149
+ .easing('ease-in-out')
150
+ .keyframes([
151
+ {
152
+ transform: `${startTransform} ${scales.medium}`,
153
+ opacity: 1,
154
+ offset: 0,
155
+ },
156
+ {
157
+ transform: `${startTransform} ${scales.xlarge}`,
158
+ opacity: 1,
159
+ offset: 0.2,
160
+ },
161
+ {
162
+ transform: `${endTransform} ${scales.medium}`,
163
+ opacity: 1,
164
+ offset: 1,
165
+ },
166
+ ]);
167
+ }
168
+ else {
169
+ moveAnimation.duration(0).keyframes([
170
+ {
171
+ transform: `${endTransform} ${scales.medium}`,
172
+ opacity: 1,
173
+ offset: 1,
174
+ },
175
+ {
176
+ transform: `${endTransform} ${scales.medium}`,
177
+ opacity: 1,
178
+ offset: 1,
179
+ },
180
+ ]);
181
+ }
182
+ animationLatestX = detail.currentX;
183
+ moveAnimationPromise = moveAnimation.play().then(() => {
184
+ moveAnimationPromise = undefined;
185
+ });
186
+ return true;
187
+ };
188
+ const onEndGesture = () => {
189
+ if (clearActivatedTimer !== undefined) {
190
+ clearTimeout(clearActivatedTimer);
191
+ clearActivatedTimer = undefined;
192
+ }
193
+ if (currentTouchedElement === undefined) {
194
+ return false;
195
+ }
196
+ const transform = getTransform(animationLatestX, effectElementPositionY, currentTouchedElement);
197
+ const leaveAnimation = createAnimation();
198
+ leaveAnimation.addElement(effectElement);
199
+ leaveAnimation
200
+ .onFinish(() => clearActivated())
201
+ .easing('ease-in')
202
+ .duration(80)
203
+ .keyframes([
204
+ {
205
+ transform: `${transform} ${scales.medium}`,
206
+ opacity: 1,
207
+ },
208
+ {
209
+ transform: `${transform} ${scales.small}`,
210
+ opacity: 0,
211
+ },
212
+ ]);
213
+ (async () => {
214
+ if (enterAnimationPromise) {
215
+ setTimeout(() => currentTouchedElement.classList.remove('ion-activated'), 50);
216
+ await enterAnimationPromise;
217
+ }
218
+ else {
219
+ currentTouchedElement.classList.remove('ion-activated');
220
+ }
221
+ leaveAnimation.play();
222
+ })();
223
+ return true;
224
+ };
225
+ return {
226
+ destroy: () => {
227
+ targetElement.removeEventListener('pointerdown', onPointerDown);
228
+ targetElement.removeEventListener('pointerup', onPointerUp);
229
+ if (clearActivatedTimer !== undefined) {
230
+ clearTimeout(clearActivatedTimer);
231
+ clearActivatedTimer = undefined;
232
+ }
233
+ clearActivated();
234
+ if (gesture) {
235
+ gesture.destroy();
236
+ }
237
+ targetElement.classList.remove(GESTURE_NAME);
238
+ },
239
+ };
240
+ };
@@ -0,0 +1,10 @@
1
+ export interface EffectScales {
2
+ small: string;
3
+ medium: string;
4
+ large: string;
5
+ xlarge: string;
6
+ }
7
+ export interface registeredEffect {
8
+ destroy: () => void;
9
+ }
10
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/gestures/interfaces.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ export declare const cloneElement: (tagName: string) => HTMLElement;
2
+ export declare const getTransform: (detailCurrentX: number, tabEffectElY: number, tabSelectedActual: Element) => string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/gestures/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,WAY9C,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,gBAAgB,MAAM,EAAE,cAAc,MAAM,EAAE,mBAAmB,OAAO,KAAG,MAavG,CAAC"}
@@ -0,0 +1,24 @@
1
+ export const cloneElement = (tagName) => {
2
+ const getCachedEl = document.querySelector(`${tagName}.ion-cloned-element`);
3
+ if (getCachedEl !== null) {
4
+ return getCachedEl;
5
+ }
6
+ const clonedEl = document.createElement(tagName);
7
+ clonedEl.classList.add('ion-cloned-element');
8
+ clonedEl.style.setProperty('display', 'none');
9
+ document.body.appendChild(clonedEl);
10
+ return clonedEl;
11
+ };
12
+ export const getTransform = (detailCurrentX, tabEffectElY, tabSelectedActual) => {
13
+ const diff = -2;
14
+ const currentX = detailCurrentX - tabSelectedActual.clientWidth / 2;
15
+ const maxLeft = tabSelectedActual.getBoundingClientRect().left + diff;
16
+ const maxRight = tabSelectedActual.getBoundingClientRect().right - diff - tabSelectedActual.clientWidth;
17
+ if (maxLeft < currentX && currentX < maxRight) {
18
+ return `translate3d(${currentX}px, ${tabEffectElY}px, 0)`;
19
+ }
20
+ if (maxLeft > currentX) {
21
+ return `translate3d(${maxLeft}px, ${tabEffectElY}px, 0)`;
22
+ }
23
+ return `translate3d(${maxRight}px, ${tabEffectElY}px, 0)`;
24
+ };
@@ -0,0 +1,5 @@
1
+ import { registeredEffect } from './gestures/interfaces';
2
+ export * from './gestures/interfaces';
3
+ export declare const registerTabBarEffect: (targetElement: HTMLElement) => registeredEffect | undefined;
4
+ export declare const registerSegmentEffect: (targetElement: HTMLElement) => registeredEffect | undefined;
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,cAAc,uBAAuB,CAAC;AAEtC,eAAO,MAAM,oBAAoB,GAAI,eAAe,WAAW,KAAG,gBAAgB,GAAG,SAOpF,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,eAAe,WAAW,KAAG,gBAAgB,GAAG,SAOrF,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ import { registerEffect } from './gestures';
2
+ export * from './gestures/interfaces';
3
+ export const registerTabBarEffect = (targetElement) => {
4
+ return registerEffect(targetElement, 'ion-tab-button', 'tab-selected', {
5
+ small: 'scale(1.1)',
6
+ medium: 'scale(1.2)',
7
+ large: 'scale(1.3)',
8
+ xlarge: 'scale(1.3, 1.5)',
9
+ });
10
+ };
11
+ export const registerSegmentEffect = (targetElement) => {
12
+ return registerEffect(targetElement, 'ion-segment-button', 'segment-button-checked', {
13
+ small: 'scale(1.35)',
14
+ medium: 'scale(1.45)',
15
+ large: 'scale(1.55)',
16
+ xlarge: 'scale(1.55, 1.65)',
17
+ });
18
+ };
@@ -0,0 +1,3 @@
1
+ export declare const cloneElement: (tagName: string) => HTMLElement;
2
+ export declare const getTransform: (detailCurrentX: number, tabEffectElY: number, tabSelectedActual: Element) => string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,GAAI,SAAS,MAAM,KAAG,WAY9C,CAAC;AAEF,eAAO,MAAM,YAAY,GAAI,gBAAgB,MAAM,EAAE,cAAc,MAAM,EAAE,mBAAmB,OAAO,KAAG,MAavG,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,24 @@
1
+ export const cloneElement = (tagName) => {
2
+ const getCachedEl = document.querySelector(`${tagName}.ion-cloned-element`);
3
+ if (getCachedEl !== null) {
4
+ return getCachedEl;
5
+ }
6
+ const clonedEl = document.createElement(tagName);
7
+ clonedEl.classList.add('ion-cloned-element');
8
+ clonedEl.style.setProperty('display', 'none');
9
+ document.body.appendChild(clonedEl);
10
+ return clonedEl;
11
+ };
12
+ export const getTransform = (detailCurrentX, tabEffectElY, tabSelectedActual) => {
13
+ const diff = -2;
14
+ const currentX = detailCurrentX - tabSelectedActual.clientWidth / 2;
15
+ const maxLeft = tabSelectedActual.getBoundingClientRect().left + diff;
16
+ const maxRight = tabSelectedActual.getBoundingClientRect().right - diff - tabSelectedActual.clientWidth;
17
+ if (maxLeft < currentX && currentX < maxRight) {
18
+ return `translate3d(${currentX}px, ${tabEffectElY}px, 0)`;
19
+ }
20
+ if (maxLeft > currentX) {
21
+ return `translate3d(${maxLeft}px, ${tabEffectElY}px, 0)`;
22
+ }
23
+ return `translate3d(${maxRight}px, ${tabEffectElY}px, 0)`;
24
+ };
package/package.json CHANGED
@@ -1,15 +1,27 @@
1
1
  {
2
2
  "name": "@rdlabo/ionic-theme-ios26",
3
- "version": "0.3.3",
3
+ "version": "0.3.5",
4
4
  "description": "iOS26 CSS Theme for Ionic Framework",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./css/*": "./dist/css/*"
14
+ },
5
15
  "files": [
6
16
  "dist",
7
17
  "src",
8
18
  "package.json"
9
19
  ],
10
20
  "scripts": {
11
- "build": "rm -rf dist/css && sass src:dist/css --style=compressed --no-source-map",
12
- "build:demo": "cd demo && npm install && npm run build -- --configuration=production",
21
+ "build": "npm run build:css && npm run build:ts",
22
+ "build:css": "rm -rf dist/css && sass src/styles:dist/css --style=compressed --no-source-map",
23
+ "build:ts": "tsc",
24
+ "build:demo": "npm run build && cd demo && npm install && npm run build -- --configuration=production",
13
25
  "prepare": "husky install",
14
26
  "lint": "prettier --check \"./**/*.{scss,ts}\" && prettier --parser angular --check \"./**/*.html\"",
15
27
  "fmt": "prettier --write \"./**/*.{scss,ts}\" && prettier --parser angular --write \"./**/*.html\"",
@@ -39,6 +51,7 @@
39
51
  "lint-staged": "^16.2.1",
40
52
  "np": "^10.2.0",
41
53
  "prettier": "^3.6.2",
42
- "sass": "^1.93.2"
54
+ "sass": "^1.93.2",
55
+ "typescript": "^5.9.3"
43
56
  }
44
57
  }