@get-set/gs-zoom 0.0.4 → 0.0.6

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 (171) hide show
  1. package/README.md +129 -1
  2. package/actions/general.ts +29 -0
  3. package/actions/getAdjustTransform.ts +46 -0
  4. package/actions/getCurrentParams.ts +42 -0
  5. package/actions/getTranslateCoordToPoint.ts +37 -0
  6. package/actions/init.ts +25 -0
  7. package/actions/initActionEvents.ts +102 -0
  8. package/actions/initAdditionals.ts +91 -0
  9. package/actions/initAdjust.ts +120 -0
  10. package/actions/initAdjustAdditionalActive.ts +31 -0
  11. package/actions/initArrows.ts +36 -0
  12. package/actions/initAutoplay.ts +91 -0
  13. package/actions/initChange.ts +139 -0
  14. package/actions/initClose.ts +29 -0
  15. package/actions/initDraggle.ts +258 -0
  16. package/actions/initDraw.ts +83 -0
  17. package/actions/initDrawItem.ts +77 -0
  18. package/actions/initFullScreen.ts +30 -0
  19. package/actions/initLightBox.ts +13 -0
  20. package/actions/initMagnifier.ts +53 -0
  21. package/actions/initNavigateWithKeys.ts +22 -0
  22. package/actions/initOpen.ts +29 -0
  23. package/actions/initWheel.ts +44 -0
  24. package/actions/setStyles.ts +28 -0
  25. package/components/GSZoom.tsx +178 -0
  26. package/{dist/components → components}/styles/GSZoom.scss +252 -254
  27. package/components/styles/GSZoomCSS.ts +237 -0
  28. package/constants/defaultParams.ts +20 -0
  29. package/constants/icons.ts +25 -0
  30. package/constants/magnifierDefaultProps.ts +9 -0
  31. package/constants/types.ts +6 -0
  32. package/dist/GSZoom.d.ts +2 -0
  33. package/dist/actions/general.d.ts +7 -0
  34. package/dist/actions/general.d.ts.map +1 -0
  35. package/dist/actions/general.js +26 -30
  36. package/dist/actions/general.js.map +1 -0
  37. package/dist/actions/getAdjustTransform.d.ts +3 -0
  38. package/dist/actions/getAdjustTransform.d.ts.map +1 -0
  39. package/dist/actions/getAdjustTransform.js +41 -43
  40. package/dist/actions/getAdjustTransform.js.map +1 -0
  41. package/dist/actions/getCurrentParams.d.ts +4 -0
  42. package/dist/actions/getCurrentParams.d.ts.map +1 -0
  43. package/dist/actions/getCurrentParams.js +35 -42
  44. package/dist/actions/getCurrentParams.js.map +1 -0
  45. package/dist/actions/getTranslateCoordToPoint.d.ts +3 -0
  46. package/dist/actions/getTranslateCoordToPoint.d.ts.map +1 -0
  47. package/dist/actions/getTranslateCoordToPoint.js +21 -41
  48. package/dist/actions/getTranslateCoordToPoint.js.map +1 -0
  49. package/dist/actions/init.d.ts +4 -0
  50. package/dist/actions/init.d.ts.map +1 -0
  51. package/dist/actions/init.js +21 -21
  52. package/dist/actions/init.js.map +1 -0
  53. package/dist/actions/initActionEvents.d.ts +4 -0
  54. package/dist/actions/initActionEvents.d.ts.map +1 -0
  55. package/dist/actions/initActionEvents.js +80 -127
  56. package/dist/actions/initActionEvents.js.map +1 -0
  57. package/dist/actions/initAdditionals.d.ts +4 -0
  58. package/dist/actions/initAdditionals.d.ts.map +1 -0
  59. package/dist/actions/initAdditionals.js +78 -117
  60. package/dist/actions/initAdditionals.js.map +1 -0
  61. package/dist/actions/initAdjust.d.ts +4 -0
  62. package/dist/actions/initAdjust.d.ts.map +1 -0
  63. package/dist/actions/initAdjust.js +96 -107
  64. package/dist/actions/initAdjust.js.map +1 -0
  65. package/dist/actions/initAdjustAdditionalActive.d.ts +4 -0
  66. package/dist/actions/initAdjustAdditionalActive.d.ts.map +1 -0
  67. package/dist/actions/initAdjustAdditionalActive.js +25 -33
  68. package/dist/actions/initAdjustAdditionalActive.js.map +1 -0
  69. package/dist/actions/initArrows.d.ts +4 -0
  70. package/dist/actions/initArrows.d.ts.map +1 -0
  71. package/dist/actions/initArrows.js +28 -44
  72. package/dist/actions/initArrows.js.map +1 -0
  73. package/dist/actions/initAutoplay.d.ts +6 -0
  74. package/dist/actions/initAutoplay.d.ts.map +1 -0
  75. package/dist/actions/initAutoplay.js +85 -81
  76. package/dist/actions/initAutoplay.js.map +1 -0
  77. package/dist/actions/initChange.d.ts +4 -0
  78. package/dist/actions/initChange.d.ts.map +1 -0
  79. package/dist/actions/initChange.js +116 -137
  80. package/dist/actions/initChange.js.map +1 -0
  81. package/dist/actions/initClose.d.ts +3 -0
  82. package/dist/actions/initClose.d.ts.map +1 -0
  83. package/dist/actions/initClose.js +24 -28
  84. package/dist/actions/initClose.js.map +1 -0
  85. package/dist/actions/initDraggle.d.ts +4 -0
  86. package/dist/actions/initDraggle.d.ts.map +1 -0
  87. package/dist/actions/initDraggle.js +227 -303
  88. package/dist/actions/initDraggle.js.map +1 -0
  89. package/dist/actions/initDraw.d.ts +4 -0
  90. package/dist/actions/initDraw.d.ts.map +1 -0
  91. package/dist/actions/initDraw.js +74 -90
  92. package/dist/actions/initDraw.js.map +1 -0
  93. package/dist/actions/initDrawItem.d.ts +4 -0
  94. package/dist/actions/initDrawItem.d.ts.map +1 -0
  95. package/dist/actions/initDrawItem.js +63 -79
  96. package/dist/actions/initDrawItem.js.map +1 -0
  97. package/dist/actions/initFullScreen.d.ts +4 -0
  98. package/dist/actions/initFullScreen.d.ts.map +1 -0
  99. package/dist/actions/initFullScreen.js +32 -32
  100. package/dist/actions/initFullScreen.js.map +1 -0
  101. package/dist/actions/initLightBox.d.ts +4 -0
  102. package/dist/actions/initLightBox.d.ts.map +1 -0
  103. package/dist/actions/initLightBox.js +11 -12
  104. package/dist/actions/initLightBox.js.map +1 -0
  105. package/dist/actions/initMagnifier.d.ts +4 -0
  106. package/dist/actions/initMagnifier.d.ts.map +1 -0
  107. package/dist/actions/initMagnifier.js +42 -54
  108. package/dist/actions/initMagnifier.js.map +1 -0
  109. package/dist/actions/initNavigateWithKeys.d.ts +4 -0
  110. package/dist/actions/initNavigateWithKeys.d.ts.map +1 -0
  111. package/dist/actions/initNavigateWithKeys.js +18 -27
  112. package/dist/actions/initNavigateWithKeys.js.map +1 -0
  113. package/dist/actions/initOpen.d.ts +4 -0
  114. package/dist/actions/initOpen.d.ts.map +1 -0
  115. package/dist/actions/initOpen.js +27 -28
  116. package/dist/actions/initOpen.js.map +1 -0
  117. package/dist/actions/initWheel.d.ts +4 -0
  118. package/dist/actions/initWheel.d.ts.map +1 -0
  119. package/dist/actions/initWheel.js +27 -49
  120. package/dist/actions/initWheel.js.map +1 -0
  121. package/dist/actions/setStyles.d.ts +4 -0
  122. package/dist/actions/setStyles.d.ts.map +1 -0
  123. package/dist/actions/setStyles.js +23 -24
  124. package/dist/actions/setStyles.js.map +1 -0
  125. package/dist/components/GSZoom.d.ts +23 -0
  126. package/dist/components/GSZoom.d.ts.map +1 -0
  127. package/dist/components/GSZoom.js +122 -177
  128. package/dist/components/GSZoom.js.map +1 -0
  129. package/dist/components/styles/GSZoomCSS.d.ts +3 -0
  130. package/dist/components/styles/GSZoomCSS.d.ts.map +1 -0
  131. package/dist/components/styles/GSZoomCSS.js +238 -0
  132. package/dist/components/styles/GSZoomCSS.js.map +1 -0
  133. package/dist/constants/defaultParams.d.ts +4 -0
  134. package/dist/constants/defaultParams.d.ts.map +1 -0
  135. package/dist/constants/defaultParams.js +18 -19
  136. package/dist/constants/defaultParams.js.map +1 -0
  137. package/dist/constants/icons.d.ts +13 -0
  138. package/dist/constants/icons.d.ts.map +1 -0
  139. package/dist/constants/icons.js +16 -25
  140. package/dist/constants/icons.js.map +1 -0
  141. package/dist/constants/magnifierDefaultProps.d.ts +4 -0
  142. package/dist/constants/magnifierDefaultProps.d.ts.map +1 -0
  143. package/dist/constants/magnifierDefaultProps.js +7 -7
  144. package/dist/constants/magnifierDefaultProps.js.map +1 -0
  145. package/dist/constants/types.d.ts +6 -0
  146. package/dist/constants/types.d.ts.map +1 -0
  147. package/dist/constants/types.js +6 -6
  148. package/dist/constants/types.js.map +1 -0
  149. package/dist/helpers/uihelpers.d.ts +2 -0
  150. package/dist/helpers/uihelpers.d.ts.map +1 -0
  151. package/dist/helpers/uihelpers.js +8 -9
  152. package/dist/helpers/uihelpers.js.map +1 -0
  153. package/dist/types/params.d.ts +35 -0
  154. package/dist/types/params.d.ts.map +1 -0
  155. package/dist/types/params.js +2 -0
  156. package/dist/types/params.js.map +1 -0
  157. package/dist/types/ref.d.ts +23 -0
  158. package/dist/types/ref.d.ts.map +1 -0
  159. package/dist/types/ref.js +2 -0
  160. package/dist/types/ref.js.map +1 -0
  161. package/dist-js/bundle.js +1689 -0
  162. package/helpers/uihelpers.ts +7 -0
  163. package/package.json +74 -43
  164. package/styles/GSZoom.scss +252 -0
  165. package/types/global.d.ts +33 -0
  166. package/types/params.ts +36 -0
  167. package/types/ref.ts +23 -0
  168. package/dist/components/styles/GSZoom.css.map +0 -1
  169. package/index.js +0 -3
  170. /package/{dist → components/styles}/GSZoom.css +0 -0
  171. /package/{dist/components/styles → styles}/GSZoom.css +0 -0
@@ -0,0 +1,36 @@
1
+ import icons from '../constants/icons';
2
+ import initChange from './initChange';
3
+ import { Ref } from '../types/ref';
4
+
5
+ const initArrows = (ref: Ref): void => {
6
+ const params = ref.currentParams;
7
+ const $container = ref.$container!;
8
+
9
+ if (params.arrows && ref.list.length > 1) {
10
+ const $btnNavigations = document.createElement('div');
11
+ const $btnNext = document.createElement('button');
12
+ const $btnPrev = document.createElement('button');
13
+
14
+ $btnPrev.innerHTML = icons.arrPrev;
15
+ $btnNext.innerHTML = icons.arrNext;
16
+ $btnNavigations.classList.add('gs-zoom-navigations');
17
+ $btnNext.classList.add('gs-zoom-next', 'gs-zoom-hide-inzoomed');
18
+ $btnPrev.classList.add('gs-zoom-prev', 'gs-zoom-hide-inzoomed');
19
+ $btnNavigations.append($btnPrev, $btnNext);
20
+ $container.append($btnNavigations);
21
+
22
+ $btnNext.addEventListener('click', () => {
23
+ const newIndex =
24
+ ref.currentIndex < ref.list.length - 1 ? ref.currentIndex + 1 : 0;
25
+ initChange(ref, newIndex);
26
+ });
27
+
28
+ $btnPrev.addEventListener('click', () => {
29
+ const newIndex =
30
+ ref.currentIndex === 0 ? ref.list.length - 1 : ref.currentIndex - 1;
31
+ initChange(ref, newIndex);
32
+ });
33
+ }
34
+ };
35
+
36
+ export default initArrows;
@@ -0,0 +1,91 @@
1
+ import icons from '../constants/icons';
2
+ import initChange from './initChange';
3
+ import { Ref } from '../types/ref';
4
+
5
+ export const initAutoplay = (ref: Ref): void => {
6
+ const $container = ref.$container!;
7
+ const params = ref.currentParams;
8
+
9
+ if ($container.querySelector('.gs-zoom-autoplayline') != null) {
10
+ ($container.querySelector('.gs-zoom-autoplayline') as HTMLElement).remove();
11
+ }
12
+
13
+ const $autoplayLine = document.createElement('div');
14
+
15
+ setTimeout(() => {
16
+ $autoplayLine.classList.add('gs-zoom-autoplayline');
17
+ $container.prepend($autoplayLine);
18
+ $autoplayLine.style.width = '0px';
19
+
20
+ setTimeout(() => {
21
+ $autoplayLine.style.transition = `${params.autoplaySpeed}ms all linear`;
22
+ $autoplayLine.style.width = '100vw';
23
+ clearTimeout(ref.autoplay);
24
+ ref.autoplay = setTimeout(() => {
25
+ if ($container.querySelector('.gs-zoom-autoplayline') != null) {
26
+ ($container.querySelector('.gs-zoom-autoplayline') as HTMLElement).remove();
27
+ }
28
+ if (ref.currentIndex === ref.list.length - 1) {
29
+ initChange(ref, 0, true);
30
+ } else {
31
+ initChange(ref, ref.currentIndex + 1, true);
32
+ }
33
+ }, params.autoplaySpeed! - 100);
34
+ }, 100);
35
+ }, 0);
36
+ };
37
+
38
+ export const pauseAutoplay = (ref: Ref): void => {
39
+ if (ref.autoplay !== undefined) {
40
+ const $container = ref.$container!;
41
+ const $loader = $container.querySelector('.gs-zoom-autoplayline') as HTMLElement;
42
+ if ($loader) {
43
+ const loaded = $loader.clientWidth;
44
+ const all = $container.clientWidth;
45
+ const loadedPercent = loaded / all;
46
+ $loader.style.transition = 'unset';
47
+ $loader.style.width = `${loaded}px`;
48
+ $loader.dataset.loaded = String(loadedPercent);
49
+ clearTimeout(ref.autoplay);
50
+ ref.autoplay = undefined;
51
+ ref.autoplayStoped = true;
52
+ }
53
+ }
54
+ };
55
+
56
+ export const resumeAutoplay = (ref: Ref): void => {
57
+ if (ref.autoplayStoped) {
58
+ ref.autoplayStoped = false;
59
+ const params = ref.currentParams;
60
+ const $container = ref.$container!;
61
+ const $loader = $container.querySelector('.gs-zoom-autoplayline') as HTMLElement;
62
+ if ($loader != null) {
63
+ const loaded = +$loader.dataset.loaded!;
64
+ const timeLeft = params.autoplaySpeed! * (1 - loaded);
65
+ $loader.style.transition = `${timeLeft}ms all linear`;
66
+ $loader.style.width = '100vw';
67
+ clearTimeout(ref.autoplay);
68
+ ref.autoplay = setTimeout(() => {
69
+ if (ref.currentIndex === ref.list.length - 1) {
70
+ initChange(ref, 0, true);
71
+ } else {
72
+ initChange(ref, ref.currentIndex + 1, true);
73
+ }
74
+ }, timeLeft);
75
+ }
76
+ }
77
+ };
78
+
79
+ export const stopAutoplay = (ref: Ref): void => {
80
+ const $container = ref.$container!;
81
+ const $btn = $container.querySelector('.gs-zoom-btn-autoplay');
82
+ if ($btn) {
83
+ $btn.innerHTML = icons.autoplay;
84
+ }
85
+ if ($container.querySelector('.gs-zoom-autoplayline') != null) {
86
+ ($container.querySelector('.gs-zoom-autoplayline') as HTMLElement).remove();
87
+ clearTimeout(ref.autoplay);
88
+ ref.autoplay = undefined;
89
+ ref.autoplayStoped = false;
90
+ }
91
+ };
@@ -0,0 +1,139 @@
1
+ import initAdjustAdditionalActive from './initAdjustAdditionalActive';
2
+ import { initAutoplay, stopAutoplay } from './initAutoplay';
3
+ import initDraggle from './initDraggle';
4
+ import initDrawItem from './initDrawItem';
5
+ import setStyles from './setStyles';
6
+ import { Ref } from '../types/ref';
7
+
8
+ const initChange = (ref: Ref, index: number, isAutoplay: boolean = false): void => {
9
+ if (ref.inProcess === undefined || !ref.inProcess) {
10
+ ref.inProcess = true;
11
+ const params = ref.currentParams;
12
+ const $img = ref.$img!;
13
+ const $container = ref.$container!;
14
+ const $imgList = ref.$imgList!;
15
+
16
+ $img.dataset.scale = '1';
17
+ $img.dataset.translatex = '0';
18
+ $img.dataset.translatey = '0';
19
+
20
+ $container.classList.remove('gs-zoom-is-zoomed');
21
+ $imgList.style.transition = '.3s ease-in-out';
22
+
23
+ if (params.showAdditionals && ref.list.length > 1) {
24
+ const $active = $container.querySelector(
25
+ '.gs-zoom-additionals .gs-add-list .gs-add-item.active',
26
+ );
27
+ if ($active != null) {
28
+ $active.classList.remove('active');
29
+ }
30
+ $container
31
+ .querySelector(
32
+ `.gs-zoom-additionals .gs-add-list .gs-add-item[data-index='${index}']`,
33
+ )
34
+ ?.classList.add('active');
35
+ }
36
+
37
+ initAdjustAdditionalActive(ref);
38
+
39
+ if (ref.currentIndex === index) {
40
+ const drawed = $imgList.querySelectorAll('.gs-zoom-main-img').length;
41
+ if (drawed === 1) {
42
+ $imgList.style.transform = 'translate(0%)';
43
+ } else if (drawed === 2) {
44
+ $imgList.style.transform =
45
+ ref.currentIndex === 0 ? 'translate(0%)' : 'translate(-50%)';
46
+ } else {
47
+ $imgList.style.transform = 'translate(-33.3333%)';
48
+ }
49
+ } else {
50
+ if (index > ref.currentIndex) {
51
+ $imgList.style.transform =
52
+ $imgList.querySelectorAll('.gs-zoom-main-img').length === 3
53
+ ? 'translate(-66.6666%)'
54
+ : 'translate(-50%)';
55
+ } else {
56
+ $imgList.style.transform = 'translate(0%)';
57
+ }
58
+ }
59
+
60
+ if (ref.currentIndex !== index && Math.abs(index - ref.currentIndex) !== 1) {
61
+ const $el = $imgList.querySelector(
62
+ `.gs-zoom-main-img[data-index='${
63
+ ref.currentIndex + (index > ref.currentIndex ? 1 : -1)
64
+ }']`,
65
+ ) as HTMLElement;
66
+ if ($el != null) {
67
+ $el.dataset.index = String(index);
68
+ initDrawItem(ref, index);
69
+ }
70
+ }
71
+
72
+ setTimeout(() => {
73
+ ref.isZoomed = false;
74
+ $imgList.style.transition = 'unset';
75
+ setStyles(ref, $img, { transform: 'scale(1) translate(0, 0)' });
76
+
77
+ ref.$mainImg = $imgList.querySelector(
78
+ `.gs-zoom-main-img[data-index='${index}']`,
79
+ ) as HTMLElement;
80
+ ref.$imgTouch = ref.$mainImg.querySelector('.gs-zoom-img-touch') as HTMLElement;
81
+ ref.$img = ref.$mainImg.querySelector('.gs-zoom-img') as HTMLImageElement;
82
+
83
+ if (ref.list.length > 2 && ref.currentIndex !== index) {
84
+ [
85
+ ...$imgList.querySelectorAll(
86
+ `.gs-zoom-main-img:not([data-index='${index}'])`,
87
+ ),
88
+ ].forEach((el) => el.remove());
89
+
90
+ ref.currentIndex = index;
91
+
92
+ if (index < ref.list.length - 1) {
93
+ const $mainImg = document.createElement('div');
94
+ $mainImg.classList.add('gs-zoom-main-img');
95
+ $mainImg.dataset.index = String(index + 1);
96
+ $imgList.append($mainImg);
97
+ initDrawItem(ref, index + 1);
98
+ }
99
+ if (index > 0) {
100
+ const $mainImg = document.createElement('div');
101
+ $mainImg.classList.add('gs-zoom-main-img');
102
+ $mainImg.dataset.index = String(index - 1);
103
+ $imgList.prepend($mainImg);
104
+ initDrawItem(ref, index - 1);
105
+ }
106
+ } else {
107
+ ref.currentIndex = index;
108
+ }
109
+
110
+ const drawed = $imgList.querySelectorAll('.gs-zoom-main-img').length;
111
+ if (drawed === 1) {
112
+ $imgList.style.transform = 'translate(0%)';
113
+ } else if (drawed === 2) {
114
+ $imgList.style.transform =
115
+ ref.currentIndex === 0 ? 'translate(0%)' : 'translate(-50%)';
116
+ } else {
117
+ $imgList.style.transform = 'translate(-33.3333%)';
118
+ }
119
+
120
+ ref.inProcess = false;
121
+
122
+ if (typeof params.afterChange === 'function') {
123
+ params.afterChange();
124
+ }
125
+
126
+ initDraggle(ref, index);
127
+ }, 300);
128
+
129
+ $imgList.classList.remove('gs-zoom-listisdragging');
130
+
131
+ if (isAutoplay) {
132
+ initAutoplay(ref);
133
+ } else {
134
+ stopAutoplay(ref);
135
+ }
136
+ }
137
+ };
138
+
139
+ export default initChange;
@@ -0,0 +1,29 @@
1
+ import { stopAutoplay } from './initAutoplay';
2
+
3
+ const initClose = (): void => {
4
+ const ref =
5
+ window.GSZoomConfigue?.openedZoom !== undefined
6
+ ? window.GSZoomConfigue.references.find(
7
+ (x) => x.key === window.GSZoomConfigue!.openedZoom,
8
+ )?.ref
9
+ : null;
10
+
11
+ if (ref != null) {
12
+ if (typeof ref.currentParams.beforeLightBoxClose === 'function') {
13
+ ref.currentParams.beforeLightBoxClose();
14
+ }
15
+ document.onkeyup = null;
16
+ if (ref.autoplay !== undefined) {
17
+ clearTimeout(ref.autoplay);
18
+ stopAutoplay(ref);
19
+ }
20
+ ref.$container?.remove();
21
+ document.querySelector('html')!.classList.remove('gs-zoom-opened');
22
+ if (typeof ref.currentParams.afterLightBoxClose === 'function') {
23
+ ref.currentParams.afterLightBoxClose();
24
+ }
25
+ window.GSZoomConfigue!.openedZoom = undefined;
26
+ }
27
+ };
28
+
29
+ export default initClose;
@@ -0,0 +1,258 @@
1
+ import { getTranslateCoord } from './general';
2
+ import getAdjustTransform from './getAdjustTransform';
3
+ import getTranslateCoordToPoint from './getTranslateCoordToPoint';
4
+ import initAdjust from './initAdjust';
5
+ import { pauseAutoplay, resumeAutoplay } from './initAutoplay';
6
+ import initChange from './initChange';
7
+ import setStyles from './setStyles';
8
+ import { Ref } from '../types/ref';
9
+
10
+ const initDraggle = (ref: Ref, index: number): void => {
11
+ const params = ref.currentParams;
12
+ const $container = ref.$container!;
13
+ const $imgList = ref.$imgList!;
14
+
15
+ // Detach old handlers from non-active slides
16
+ [
17
+ ...ref.$imgList!.querySelectorAll(
18
+ `.gs-zoom-main-img:not([data-index='${index}']) .gs-zoom-img-touch`,
19
+ ),
20
+ ].forEach(($touch: Element) => {
21
+ const t = $touch as any;
22
+ t.onclick = null;
23
+ t.ontouchstart = null;
24
+ t.onmousedown = null;
25
+ t.ontouchmove = null;
26
+ t.onmousemove = null;
27
+ t.onmouseleave = null;
28
+ t.onmouseup = null;
29
+ t.ontouchend = null;
30
+ });
31
+
32
+ const item = ref.$imgList!.querySelector(
33
+ `.gs-zoom-main-img[data-index='${index}']`,
34
+ );
35
+ if (item == null) return;
36
+
37
+ const $imgTouch = item.querySelector('.gs-zoom-img-touch') as HTMLElement;
38
+ const $img = item.querySelector('.gs-zoom-img') as HTMLImageElement;
39
+
40
+ // Double-click / double-tap to toggle max zoom
41
+ $imgTouch.onclick = (e: MouseEvent) => {
42
+ const timeNow = new Date().getTime();
43
+ const timeDifference = timeNow - (window.lastClickTime || 0);
44
+ if (timeDifference < 300) {
45
+ const scale =
46
+ $img.dataset.scale !== undefined ? parseFloat($img.dataset.scale) : 1;
47
+ const newScale = scale < params.maxZoom! ? params.maxZoom! : 1;
48
+ const te = e as any;
49
+ const clientX =
50
+ te.targetTouches?.length > 0 ? te.targetTouches[0].clientX : e.clientX;
51
+ const clientY =
52
+ te.targetTouches?.length > 0 ? te.targetTouches[0].clientY : e.clientY;
53
+
54
+ let [newTranslatex, newTranslatey] = getTranslateCoordToPoint(
55
+ $img, $container, scale, newScale, clientX, clientY,
56
+ );
57
+ [newTranslatex, newTranslatey] = getAdjustTransform(
58
+ newScale, newTranslatex, newTranslatey, $img, $container,
59
+ );
60
+ $img.dataset.scale = String(newScale);
61
+ setStyles(ref, $img, {
62
+ transition: '4s ease-in-out',
63
+ transform: `scale(${newScale}) translate(${newTranslatex}px, ${newTranslatey}px)`,
64
+ });
65
+ $img.classList.add('gs-zoom-is-adjusting');
66
+ setTimeout(() => {
67
+ $img.classList.remove('gs-zoom-is-adjusting');
68
+ setStyles(ref, $img, { transition: 'unset' });
69
+ }, 400);
70
+ }
71
+ window.lastClickTime = timeNow;
72
+ };
73
+
74
+ $imgTouch.ontouchstart = (e: TouchEvent) => {
75
+ pauseAutoplay(ref);
76
+ if (e.targetTouches.length > 1) {
77
+ document.querySelector('html')!.classList.add('gs-disable-apple-touchzoom');
78
+ }
79
+ if (!ref.isZoomed && e.targetTouches.length === 1) {
80
+ const coords = getTranslateCoord($imgList);
81
+ window.initListX = e.targetTouches[0].clientX;
82
+ window.initListY = e.targetTouches[0].clientY;
83
+ window.initListTranslateX = coords.x;
84
+ window.initListTranslateY = coords.y;
85
+ $imgList.classList.add('gs-zoom-listisdragging');
86
+ } else {
87
+ if (!$img.classList.contains('gs-zoom-is-adjusting')) {
88
+ const coords = getTranslateCoord($img);
89
+ $img.dataset.translatex = String(coords.x);
90
+ $img.dataset.translatey = String(coords.y);
91
+ window.initX = e.targetTouches[0].clientX;
92
+ window.initY = e.targetTouches[0].clientY;
93
+ if (e.targetTouches.length > 1) {
94
+ window.initX2 = e.targetTouches[1].clientX;
95
+ window.initY2 = e.targetTouches[1].clientY;
96
+ window.touchDistance = Math.sqrt(
97
+ Math.pow(window.initX2 - window.initX, 2) +
98
+ Math.pow(window.initY2 - window.initY, 2),
99
+ );
100
+ window.initCenterX = (window.initX2 + window.initX) / 2;
101
+ window.initCenterY = (window.initY2 + window.initY) / 2;
102
+ }
103
+ window.initTranslateX = parseFloat($img.dataset.translatex);
104
+ window.initTranslateY = parseFloat($img.dataset.translatey);
105
+ $img.classList.add('gs-zoom-isdragging');
106
+ }
107
+ }
108
+ };
109
+
110
+ $imgTouch.onmousedown = (e: MouseEvent) => {
111
+ pauseAutoplay(ref);
112
+ if (!ref.isZoomed) {
113
+ const coords = getTranslateCoord($imgList);
114
+ window.initListX = e.clientX;
115
+ window.initListTranslateX = coords.x;
116
+ window.initListY = e.clientY;
117
+ window.initListTranslateY = coords.y;
118
+ $imgList.classList.add('gs-zoom-listisdragging');
119
+ } else {
120
+ if (!$img.classList.contains('gs-zoom-is-adjusting')) {
121
+ const coords = getTranslateCoord($img);
122
+ $img.dataset.translatex = String(coords.x);
123
+ $img.dataset.translatey = String(coords.y);
124
+ window.initX = e.clientX;
125
+ window.initTranslateX = parseFloat($img.dataset.translatex);
126
+ window.initY = e.clientY;
127
+ window.initTranslateY = parseFloat($img.dataset.translatey);
128
+ $img.classList.add('gs-zoom-isdragging');
129
+ }
130
+ }
131
+ };
132
+
133
+ $imgTouch.ontouchmove = (e: TouchEvent) => {
134
+ const twoTouchPoints = e.targetTouches.length > 1;
135
+ window.clientX = e.targetTouches[0].clientX;
136
+ window.clientY = e.targetTouches[0].clientY;
137
+ if (twoTouchPoints) {
138
+ window.clientX2 = e.targetTouches[1].clientX;
139
+ window.clientY2 = e.targetTouches[1].clientY;
140
+ }
141
+ if (!ref.isZoomed && !twoTouchPoints) {
142
+ if ($imgList.classList.contains('gs-zoom-listisdragging')) {
143
+ const movedX = window.clientX - window.initListX;
144
+ const newTranslateX = window.initListTranslateX + movedX;
145
+ $imgList.style.transform = `translateX(${newTranslateX}px)`;
146
+ $imgList.dataset.moved = String(movedX);
147
+ }
148
+ } else if (
149
+ $imgList.dataset.moved === undefined ||
150
+ $imgList.dataset.moved === '0'
151
+ ) {
152
+ if ($img.classList.contains('gs-zoom-isdragging')) {
153
+ if (twoTouchPoints) {
154
+ const clientCenterX = (window.clientX + window.clientX2) / 2;
155
+ const clientCenterY = (window.clientY + window.clientY2) / 2;
156
+ let scale =
157
+ $img.dataset.scale !== undefined ? parseFloat($img.dataset.scale) : 1;
158
+ const oldScale =
159
+ $img.dataset.tempscale !== undefined
160
+ ? parseFloat($img.dataset.tempscale)
161
+ : scale;
162
+ const currentDistance = Math.sqrt(
163
+ Math.pow(window.clientX - window.clientX2, 2) +
164
+ Math.pow(window.clientY - window.clientY2, 2),
165
+ );
166
+ scale = (scale * currentDistance) / window.touchDistance;
167
+ if (scale < 1) scale = 1;
168
+ $img.dataset.tempscale = String(scale);
169
+
170
+ let [newTranslatex, newTranslatey] = getTranslateCoordToPoint(
171
+ $img, $container, oldScale, scale, window.initCenterX, window.initCenterY,
172
+ );
173
+ const movedX = clientCenterX - window.initCenterX;
174
+ const movedY = clientCenterY - window.initCenterY;
175
+ window.initCenterX = clientCenterX;
176
+ window.initCenterY = clientCenterY;
177
+ $img.dataset.translatex = String(newTranslatex + movedX);
178
+ $img.dataset.translatey = String(newTranslatey + movedY);
179
+ setStyles(ref, $img, {
180
+ transform: `scale(${scale}) translate(${(newTranslatex + movedX) / scale}px, ${(newTranslatey + movedY) / scale}px)`,
181
+ });
182
+ } else {
183
+ const movedY = window.clientY - window.initY;
184
+ const movedX = window.clientX - window.initX;
185
+ $img.dataset.translatex = String(window.initTranslateX + movedX);
186
+ $img.dataset.translatey = String(window.initTranslateY + movedY);
187
+ const scale =
188
+ $img.dataset.scale !== undefined ? parseFloat($img.dataset.scale) : 1;
189
+ setStyles(ref, $img, {
190
+ transform: `scale(${scale}) translate(${(window.initTranslateX + movedX) / scale}px, ${(window.initTranslateY + movedY) / scale}px)`,
191
+ });
192
+ }
193
+ }
194
+ }
195
+ };
196
+
197
+ // Bug fix: original used bare `clientX`, `clientY`, `initTranslateX`, `initTranslateY`
198
+ // (undefined references). Correctly prefixed with `window.` here.
199
+ $imgTouch.onmousemove = (e: MouseEvent) => {
200
+ window.clientX = e.clientX;
201
+ window.clientY = e.clientY;
202
+ if (!ref.isZoomed) {
203
+ if ($imgList.classList.contains('gs-zoom-listisdragging')) {
204
+ const movedX = window.clientX - window.initListX;
205
+ const newTranslateX = window.initListTranslateX + movedX;
206
+ $imgList.style.transform = `translateX(${newTranslateX}px)`;
207
+ $imgList.dataset.moved = String(movedX);
208
+ }
209
+ } else if (
210
+ $imgList.dataset.moved === undefined ||
211
+ $imgList.dataset.moved === '0'
212
+ ) {
213
+ if ($img.classList.contains('gs-zoom-isdragging')) {
214
+ const movedY = window.clientY - window.initY;
215
+ const movedX = window.clientX - window.initX;
216
+ $img.dataset.translatex = String(window.initTranslateX + movedX);
217
+ $img.dataset.translatey = String(window.initTranslateY + movedY);
218
+ const scale =
219
+ $img.dataset.scale !== undefined ? parseFloat($img.dataset.scale) : 1;
220
+ setStyles(ref, $img, {
221
+ transform: `scale(${scale}) translate(${(window.initTranslateX + movedX) / scale}px, ${(window.initTranslateY + movedY) / scale}px)`,
222
+ });
223
+ }
224
+ }
225
+ };
226
+
227
+ const onDragEnd = () => {
228
+ if (
229
+ $img.classList.contains('gs-zoom-isdragging') &&
230
+ ($imgList.dataset.moved === undefined || $imgList.dataset.moved === '0')
231
+ ) {
232
+ if ($img.dataset.tempscale !== undefined) {
233
+ $img.dataset.scale = $img.dataset.tempscale;
234
+ $img.removeAttribute('data-tempscale');
235
+ }
236
+ initAdjust(ref, $container, $img);
237
+ resumeAutoplay(ref);
238
+ $imgList.classList.remove('gs-zoom-listisdragging');
239
+ } else if ($imgList.classList.contains('gs-zoom-listisdragging')) {
240
+ $imgList.classList.remove('gs-zoom-listisdragging');
241
+ if (+($imgList.dataset.moved ?? 0) < 0) {
242
+ initChange(ref, Math.min(ref.currentIndex + 1, ref.list.length - 1));
243
+ } else if (+($imgList.dataset.moved ?? 0) > 0) {
244
+ initChange(ref, Math.max(ref.currentIndex - 1, 0));
245
+ } else {
246
+ resumeAutoplay(ref);
247
+ }
248
+ $imgList.dataset.moved = '0';
249
+ }
250
+ document.querySelector('html')!.classList.remove('gs-disable-apple-touchzoom');
251
+ };
252
+
253
+ $imgTouch.onmouseleave = onDragEnd;
254
+ $imgTouch.onmouseup = onDragEnd;
255
+ $imgTouch.ontouchend = onDragEnd;
256
+ };
257
+
258
+ export default initDraggle;
@@ -0,0 +1,83 @@
1
+ import icons from '../constants/icons';
2
+ import initDrawItem from './initDrawItem';
3
+ import { Ref } from '../types/ref';
4
+
5
+ const initDraw = (ref: Ref): void => {
6
+ const list = ref.list;
7
+ const params = ref.currentParams;
8
+ const $body = document.querySelector('body')!;
9
+ const $container = document.createElement('div');
10
+ const $header = document.createElement('div');
11
+ const $imgList = document.createElement('div');
12
+
13
+ $container.classList.add('gs-zoom-container');
14
+ $imgList.classList.add('gs-zoom-img-list');
15
+ $header.classList.add('gs-zoom-header');
16
+ $container.append($imgList);
17
+ $container.prepend($header);
18
+ $body.append($container);
19
+ ref.$container = $container;
20
+ ref.$imgList = $imgList;
21
+
22
+ let drawed = 0;
23
+ list.forEach((_, index) => {
24
+ if (index <= ref.currentIndex + 1 && index >= ref.currentIndex - 1) {
25
+ drawed++;
26
+ const $mainImg = document.createElement('div');
27
+ $mainImg.classList.add('gs-zoom-main-img');
28
+ $mainImg.dataset.index = String(index);
29
+ $imgList.append($mainImg);
30
+ initDrawItem(ref, index);
31
+ }
32
+ });
33
+
34
+ if (drawed === 1) {
35
+ $imgList.style.transform = 'translate(0%)';
36
+ } else if (drawed === 2) {
37
+ $imgList.style.transform =
38
+ ref.currentIndex === 0 ? 'translate(0%)' : 'translate(-50%)';
39
+ } else {
40
+ $imgList.style.transform = 'translate(-33.3333%)';
41
+ }
42
+
43
+ // Actions bar
44
+ const $actions = document.createElement('div');
45
+ $actions.classList.add('gs-zoom-actions');
46
+ $header.append($actions);
47
+
48
+ if (params.showAdditionals && list.length > 1) {
49
+ const $btnAdditionals = document.createElement('button');
50
+ $btnAdditionals.classList.add('gs-zoom-btn-toggleadditionals', 'gs-zoom-action');
51
+ $btnAdditionals.innerHTML = icons.toggleadditionals;
52
+ $actions.append($btnAdditionals);
53
+ ref.$btnAdditionals = $btnAdditionals;
54
+ }
55
+
56
+ const $btnZoomIn = document.createElement('button');
57
+ $btnZoomIn.classList.add('gs-zoom-btn-in', 'gs-zoom-action');
58
+ $btnZoomIn.innerHTML = icons.zoomIn;
59
+ $actions.append($btnZoomIn);
60
+ ref.$btnZoomIn = $btnZoomIn;
61
+
62
+ const $btnZoomOut = document.createElement('button');
63
+ $btnZoomOut.classList.add('gs-zoom-btn-out', 'gs-zoom-action');
64
+ $btnZoomOut.innerHTML = icons.zoomOut;
65
+ $actions.append($btnZoomOut);
66
+ ref.$btnZoomOut = $btnZoomOut;
67
+
68
+ if (list.length > 1) {
69
+ const $btnAutoplay = document.createElement('button');
70
+ $btnAutoplay.classList.add('gs-zoom-btn-autoplay', 'gs-zoom-action');
71
+ $btnAutoplay.innerHTML = icons.autoplay;
72
+ $actions.append($btnAutoplay);
73
+ ref.$btnAutoplay = $btnAutoplay;
74
+ }
75
+
76
+ const $btnClose = document.createElement('button');
77
+ $btnClose.classList.add('gs-zoom-btn-close', 'gs-zoom-action');
78
+ $btnClose.innerHTML = icons.close;
79
+ $actions.append($btnClose);
80
+ ref.$btnClose = $btnClose;
81
+ };
82
+
83
+ export default initDraw;