@fynd-design-engineering/fynd-one-v2 3.4.63 → 3.4.65

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 (79) hide show
  1. package/dist/accordians/dropdown.js +1 -95
  2. package/dist/accordians/index.js +1 -391
  3. package/dist/cms-listing/index.js +1 -24
  4. package/dist/filters/clear-search.js +1 -32
  5. package/dist/filters/konnect.js +1 -165
  6. package/dist/filters/show-count.js +1 -66
  7. package/dist/form/country-dropdown.css +1 -160
  8. package/dist/form/cs-gated-redirection.js +1 -40
  9. package/dist/form/download-file.js +1 -70
  10. package/dist/form/validation.css +1 -1019
  11. package/dist/form/validation.js +7 -10611
  12. package/dist/global/anchor-scroll.js +1 -174
  13. package/dist/global/auth.js +1 -87
  14. package/dist/global/chat.js +1 -185
  15. package/dist/global/console-links.js +1 -89
  16. package/dist/global/contact-popup.js +2 -83
  17. package/dist/global/css/in-page-embed.css +1 -1043
  18. package/dist/global/css/in-project-settings.css +1 -173
  19. package/dist/global/css/temp.css +1 -89
  20. package/dist/global/custom-bg-video.js +1 -40
  21. package/dist/global/footer-accordion.js +1 -44
  22. package/dist/global/lazy-loader.js +1 -135
  23. package/dist/global/loader.js +2 -166
  24. package/dist/global/media-card.js +1 -166
  25. package/dist/global/miscellaneous.js +1 -136
  26. package/dist/global/number-count.js +1 -82
  27. package/dist/global/popup-video.js +1 -276
  28. package/dist/global/progressive-scroll.js +1 -222
  29. package/dist/global/responsive-video.js +1 -321
  30. package/dist/global/style.css +1 -1065
  31. package/dist/global/video-card.js +1 -50
  32. package/dist/hacktimus/2025.js +1 -177
  33. package/dist/hacktimus/styles.css +1 -91
  34. package/dist/home/index.js +1 -17
  35. package/dist/marquee/index.js +1 -3104
  36. package/dist/marquee/marquee-swiper.js +1 -36
  37. package/dist/navigation/announcement/index.js +1 -5169
  38. package/dist/navigation/context-menu/index.js +1 -31
  39. package/dist/navigation/desktop/index.js +1 -4603
  40. package/dist/navigation/initialization.js +1 -602
  41. package/dist/navigation/main.js +1 -4911
  42. package/dist/navigation/mobile/index.js +1 -286
  43. package/dist/navigation/scroll/index.js +1 -62
  44. package/dist/navigation/secondary-navigation/index.js +1 -437
  45. package/dist/navigation/style.css +1 -154
  46. package/dist/navigation/temp.css +0 -2
  47. package/dist/navigation/theme.css +1 -69
  48. package/dist/navigation-v2/index.js +1 -4990
  49. package/dist/navigation-v2/styles.css +1 -233
  50. package/dist/others/feature-detail.js +1 -75
  51. package/dist/others/geolocation.js +1 -50
  52. package/dist/others/hero-aniamtion.js +1 -53
  53. package/dist/others/hero-india-animation-2.js +1 -70
  54. package/dist/others/hero-india-animation.js +1 -93
  55. package/dist/others/home-solution-tab.js +1 -115
  56. package/dist/others/storefront-chat/index.js +1 -487
  57. package/dist/others/storefront-chat/styles.css +1 -107
  58. package/dist/playbook-2026/hero-reveal.js +1 -47
  59. package/dist/playbook-2026/index.js +1 -536
  60. package/dist/playbook-2026/styles.css +1 -110
  61. package/dist/posthog-and-ga/attributes.js +1 -190
  62. package/dist/posthog-and-ga/main.js +1 -528
  63. package/dist/progressive-scroll/index.js +1 -147
  64. package/dist/quick-fix/reload.js +1 -22
  65. package/dist/seo/schema.js +1 -465
  66. package/dist/slider/freescroll.js +1 -34
  67. package/dist/test/sample.js +1 -15
  68. package/dist/testimonials/index.js +1 -2654
  69. package/dist/timeline/index.js +1 -160
  70. package/dist/timeline/style.css +1 -42
  71. package/dist/tracking/custom-id.js +1 -75
  72. package/dist/tracking/fill-form-fields.js +1 -238
  73. package/dist/tracking/form-tracker.js +1 -146
  74. package/dist/tracking/page-categories.js +1 -20
  75. package/dist/tracking/user-journey.js +1 -839
  76. package/dist/tracking/utm-links.js +1 -194
  77. package/dist/utils/sample.js +1 -17
  78. package/dist/validations/localhost.js +1 -221
  79. package/package.json +1 -1
@@ -1,166 +1 @@
1
- "use strict";
2
- (() => {
3
- // bin/live-reload.js
4
- if (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
5
- new EventSource(`${"http://localhost:3000"}/esbuild`).addEventListener(
6
- "change",
7
- () => location.reload()
8
- );
9
- } else {
10
- }
11
-
12
- // src/global/media-card.ts
13
- document.addEventListener("DOMContentLoaded", () => {
14
- const cards = document.querySelectorAll("[media-card]");
15
- const isSmallViewport = window.innerWidth < 992;
16
- cards.forEach((card) => {
17
- const type = card.getAttribute("media-card");
18
- const hoverAttr = card.getAttribute("media-card-hover");
19
- const enableHover = hoverAttr !== "false";
20
- if (type === "image") {
21
- setupImageHover(card, enableHover);
22
- } else if (type === "video-on-hover") {
23
- if (isSmallViewport) {
24
- setupVideoLoop(card, false);
25
- } else {
26
- setupVideoHover(card, enableHover);
27
- }
28
- } else if (type === "video-on-loop") {
29
- setupVideoLoop(card, enableHover);
30
- }
31
- });
32
- });
33
- function setupImageHover(card, enableHover) {
34
- const img = card.querySelector("img");
35
- if (!img) return;
36
- img.style.transition = "transform 200ms ease";
37
- if (!enableHover) return;
38
- card.addEventListener("mouseenter", () => {
39
- img.style.transform = "scale(1)";
40
- });
41
- card.addEventListener("mouseleave", () => {
42
- img.style.transform = "scale(1)";
43
- });
44
- }
45
- function attemptVideoPlay(video, retries = 4) {
46
- return video.play().catch(() => {
47
- return new Promise((resolve, reject) => {
48
- if (retries <= 0) {
49
- reject();
50
- return;
51
- }
52
- setTimeout(() => {
53
- attemptVideoPlay(video, retries - 1).then(resolve).catch(reject);
54
- }, 120);
55
- });
56
- });
57
- }
58
- function setupVideoHover(card, enableHover) {
59
- const video = card.querySelector("video");
60
- const img = card.querySelector("img");
61
- if (!video || !img) return;
62
- const hasSrc = Boolean(video.currentSrc || video.src);
63
- if (!hasSrc) return;
64
- video.muted = true;
65
- video.playsInline = true;
66
- img.style.transition = "opacity 200ms ease";
67
- video.style.transition = "opacity 200ms ease, transform 200ms ease";
68
- video.style.transform = "scale(1)";
69
- video.style.opacity = "0";
70
- video.style.display = "block";
71
- img.style.opacity = "1";
72
- let hovering = false;
73
- let firstFullPlayDone = false;
74
- const isVideoReady = () => video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA;
75
- const showVideo = () => {
76
- img.style.opacity = "0";
77
- video.style.opacity = "1";
78
- };
79
- const showImage = () => {
80
- img.style.opacity = "1";
81
- video.style.opacity = "0";
82
- };
83
- const onEnded = () => {
84
- firstFullPlayDone = true;
85
- if (hovering) {
86
- video.loop = true;
87
- attemptVideoPlay(video).catch(() => {
88
- });
89
- }
90
- };
91
- video.addEventListener("ended", onEnded);
92
- if (!enableHover) return;
93
- card.addEventListener("mouseenter", () => {
94
- hovering = true;
95
- video.style.transform = "scale(1)";
96
- showVideo();
97
- if (isVideoReady()) {
98
- attemptVideoPlay(video).catch(() => {
99
- });
100
- } else {
101
- const onCanPlay = () => {
102
- video.removeEventListener("canplay", onCanPlay);
103
- showVideo();
104
- attemptVideoPlay(video).catch(() => {
105
- });
106
- };
107
- video.addEventListener("canplay", onCanPlay, { once: true });
108
- video.load();
109
- }
110
- });
111
- card.addEventListener("mouseleave", () => {
112
- hovering = false;
113
- video.style.transform = "scale(1)";
114
- video.loop = false;
115
- video.pause();
116
- showImage();
117
- });
118
- }
119
- function setupVideoLoop(card, enableHover) {
120
- const video = card.querySelector("video");
121
- const img = card.querySelector("img");
122
- if (!video) return;
123
- const hasSrc = Boolean(video.currentSrc || video.src);
124
- if (!hasSrc) return;
125
- video.muted = true;
126
- video.playsInline = true;
127
- video.loop = true;
128
- if (img) {
129
- img.style.transition = "opacity 200ms ease";
130
- img.style.opacity = "1";
131
- }
132
- video.style.transition = "opacity 200ms ease, transform 200ms ease";
133
- video.style.transform = "scale(1)";
134
- video.style.opacity = "0";
135
- video.style.display = "block";
136
- const isVideoReady = () => video.readyState >= HTMLMediaElement.HAVE_FUTURE_DATA;
137
- const showVideo = () => {
138
- if (img) img.style.opacity = "0";
139
- video.style.opacity = "1";
140
- };
141
- const startPlayback = () => {
142
- showVideo();
143
- attemptVideoPlay(video).catch(() => {
144
- });
145
- };
146
- if (isVideoReady()) {
147
- startPlayback();
148
- } else {
149
- const onCanPlay = () => {
150
- video.removeEventListener("canplay", onCanPlay);
151
- startPlayback();
152
- };
153
- video.addEventListener("canplay", onCanPlay, { once: true });
154
- video.load();
155
- }
156
- if (enableHover) {
157
- card.addEventListener("mouseenter", () => {
158
- video.style.transform = "scale(1)";
159
- });
160
- card.addEventListener("mouseleave", () => {
161
- video.style.transform = "scale(1)";
162
- });
163
- }
164
- }
165
- })();
166
- //# sourceMappingURL=media-card.js.map
1
+ "use strict";(()=>{document.addEventListener("DOMContentLoaded",()=>{let t=document.querySelectorAll("[media-card]"),s=window.innerWidth<992;t.forEach(e=>{let o=e.getAttribute("media-card"),n=e.getAttribute("media-card-hover")!=="false";o==="image"?f(e,n):o==="video-on-hover"?s?m(e,!1):p(e,n):o==="video-on-loop"&&m(e,n)})});function f(t,s){let e=t.querySelector("img");e&&(e.style.transition="transform 200ms ease",s&&(t.addEventListener("mouseenter",()=>{e.style.transform="scale(1)"}),t.addEventListener("mouseleave",()=>{e.style.transform="scale(1)"})))}function r(t,s=4){return t.play().catch(()=>new Promise((e,o)=>{if(s<=0){o();return}setTimeout(()=>{r(t,s-1).then(e).catch(o)},120)}))}function p(t,s){let e=t.querySelector("video"),o=t.querySelector("img");if(!e||!o||!!!(e.currentSrc||e.src))return;e.muted=!0,e.playsInline=!0,o.style.transition="opacity 200ms ease",e.style.transition="opacity 200ms ease, transform 200ms ease",e.style.transform="scale(1)",e.style.opacity="0",e.style.display="block",o.style.opacity="1";let n=!1,l=!1,i=()=>e.readyState>=HTMLMediaElement.HAVE_FUTURE_DATA,a=()=>{o.style.opacity="0",e.style.opacity="1"},d=()=>{o.style.opacity="1",e.style.opacity="0"},u=()=>{l=!0,n&&(e.loop=!0,r(e).catch(()=>{}))};e.addEventListener("ended",u),s&&(t.addEventListener("mouseenter",()=>{if(n=!0,e.style.transform="scale(1)",a(),i())r(e).catch(()=>{});else{let y=()=>{e.removeEventListener("canplay",y),a(),r(e).catch(()=>{})};e.addEventListener("canplay",y,{once:!0}),e.load()}}),t.addEventListener("mouseleave",()=>{n=!1,e.style.transform="scale(1)",e.loop=!1,e.pause(),d()}))}function m(t,s){let e=t.querySelector("video"),o=t.querySelector("img");if(!e||!!!(e.currentSrc||e.src))return;e.muted=!0,e.playsInline=!0,e.loop=!0,o&&(o.style.transition="opacity 200ms ease",o.style.opacity="1"),e.style.transition="opacity 200ms ease, transform 200ms ease",e.style.transform="scale(1)",e.style.opacity="0",e.style.display="block";let n=()=>e.readyState>=HTMLMediaElement.HAVE_FUTURE_DATA,l=()=>{o&&(o.style.opacity="0"),e.style.opacity="1"},i=()=>{l(),r(e).catch(()=>{})};if(n())i();else{let a=()=>{e.removeEventListener("canplay",a),i()};e.addEventListener("canplay",a,{once:!0}),e.load()}s&&(t.addEventListener("mouseenter",()=>{e.style.transform="scale(1)"}),t.addEventListener("mouseleave",()=>{e.style.transform="scale(1)"}))}})();
@@ -1,136 +1 @@
1
- "use strict";
2
- (() => {
3
- // bin/live-reload.js
4
- if (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
5
- new EventSource(`${"http://localhost:3000"}/esbuild`).addEventListener(
6
- "change",
7
- () => location.reload()
8
- );
9
- } else {
10
- }
11
-
12
- // src/global/preload-media.ts
13
- function preloadSrc(src, type) {
14
- if (!src) return;
15
- if (type === "image") {
16
- const img = new Image();
17
- img.src = src;
18
- } else if (type === "video") {
19
- const video = document.createElement("video");
20
- video.preload = "auto";
21
- video.src = src;
22
- }
23
- }
24
- function preloadFyndMedia() {
25
- document.addEventListener("DOMContentLoaded", () => {
26
- const images = document.querySelectorAll('img[fynd-image-preload="true"]');
27
- images.forEach((img) => {
28
- const src = img.getAttribute("src");
29
- if (src) {
30
- preloadSrc(src, "image");
31
- }
32
- });
33
- const videos = document.querySelectorAll('video[fynd-video-preload="true"]');
34
- videos.forEach((video) => {
35
- const src = video.getAttribute("src");
36
- if (src) {
37
- preloadSrc(src, "video");
38
- }
39
- });
40
- });
41
- }
42
-
43
- // src/global/miscellaneous.ts
44
- function replaceFooterFormLinks() {
45
- const footerLinks = document.querySelectorAll('a[href="#footer-form"]');
46
- footerLinks.forEach((link) => {
47
- const anchorElement = link;
48
- anchorElement.href = "/contact-us";
49
- });
50
- }
51
- document.addEventListener("DOMContentLoaded", replaceFooterFormLinks);
52
- if (document.readyState === "loading") {
53
- document.addEventListener("DOMContentLoaded", replaceFooterFormLinks);
54
- } else {
55
- replaceFooterFormLinks();
56
- }
57
- document.addEventListener("DOMContentLoaded", () => {
58
- const emTags = document.querySelectorAll("p > a > em");
59
- emTags.forEach((em) => {
60
- em.setAttribute("richtext-button", "primary");
61
- });
62
- });
63
- document.addEventListener("DOMContentLoaded", () => {
64
- setTimeout(() => {
65
- function updateLinks() {
66
- const getQueryParams = () => {
67
- return new URLSearchParams(window.location.search);
68
- };
69
- const utmParams = getQueryParams();
70
- utmParams.set("referrer_domain", window.location.hostname);
71
- utmParams.set("referrer_page", window.location.pathname);
72
- const links = document.querySelectorAll(
73
- '[href*="console.fynd.com"]'
74
- );
75
- links.forEach((link) => {
76
- const url = new URL(link.href);
77
- utmParams.forEach((value, key) => {
78
- url.searchParams.set(key, value);
79
- });
80
- link.href = url.toString();
81
- });
82
- }
83
- updateLinks();
84
- }, 100);
85
- });
86
- function applyPageUtmsToInternalLinks(options = {}) {
87
- const scope = options.scope ?? document;
88
- const base = new URL(options.baseUrl ?? window.location.href);
89
- const pageUtmParams = new URLSearchParams();
90
- for (const [k, v] of new URLSearchParams(base.search).entries()) {
91
- if (k.toLowerCase().startsWith("utm_")) pageUtmParams.set(k, v);
92
- }
93
- const anchors = Array.from(
94
- scope.querySelectorAll("a[href]")
95
- );
96
- const result = { updated: 0, details: [] };
97
- for (const a of anchors) {
98
- let url;
99
- try {
100
- url = new URL(a.getAttribute("href"), base);
101
- } catch {
102
- continue;
103
- }
104
- const isHttp = url.protocol === "http:" || url.protocol === "https:";
105
- const isInternal = url.hostname === base.hostname;
106
- if (!isHttp || !isInternal) continue;
107
- const before = a.href;
108
- const keysToDelete = [];
109
- for (const key of url.searchParams.keys()) {
110
- if (key.toLowerCase().startsWith("utm_")) keysToDelete.push(key);
111
- }
112
- keysToDelete.forEach((k) => url.searchParams.delete(k));
113
- if ([...pageUtmParams.keys()].length > 0) {
114
- for (const [k, v] of pageUtmParams.entries()) {
115
- url.searchParams.set(k, v);
116
- }
117
- }
118
- const after = url.toString();
119
- if (after !== before) {
120
- a.href = after;
121
- result.updated += 1;
122
- result.details.push({ element: a, before, after });
123
- }
124
- }
125
- return result;
126
- }
127
- document.addEventListener("DOMContentLoaded", () => {
128
- setTimeout(() => {
129
- applyPageUtmsToInternalLinks({ log: true });
130
- }, 200);
131
- });
132
- document.addEventListener("DOMContentLoaded", () => {
133
- preloadFyndMedia();
134
- });
135
- })();
136
- //# sourceMappingURL=miscellaneous.js.map
1
+ "use strict";(()=>{function f(o,n){if(o){if(n==="image"){let e=new Image;e.src=o}else if(n==="video"){let e=document.createElement("video");e.preload="auto",e.src=o}}}function h(){document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll('img[fynd-image-preload="true"]').forEach(e=>{let r=e.getAttribute("src");r&&f(r,"image")}),document.querySelectorAll('video[fynd-video-preload="true"]').forEach(e=>{let r=e.getAttribute("src");r&&f(r,"video")})})}function l(){document.querySelectorAll('a[href="#footer-form"]').forEach(n=>{let e=n;e.href="/contact-us"})}document.addEventListener("DOMContentLoaded",l);document.readyState==="loading"?document.addEventListener("DOMContentLoaded",l):l();document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("p > a > em").forEach(n=>{n.setAttribute("richtext-button","primary")})});document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{function o(){let e=new URLSearchParams(window.location.search);e.set("referrer_domain",window.location.hostname),e.set("referrer_page",window.location.pathname),document.querySelectorAll('[href*="console.fynd.com"]').forEach(i=>{let s=new URL(i.href);e.forEach((a,t)=>{s.searchParams.set(t,a)}),i.href=s.toString()})}o()},100)});function y(o={}){let n=o.scope??document,e=new URL(o.baseUrl??window.location.href),r=new URLSearchParams;for(let[a,t]of new URLSearchParams(e.search).entries())a.toLowerCase().startsWith("utm_")&&r.set(a,t);let i=Array.from(n.querySelectorAll("a[href]")),s={updated:0,details:[]};for(let a of i){let t;try{t=new URL(a.getAttribute("href"),e)}catch{continue}let p=t.protocol==="http:"||t.protocol==="https:",L=t.hostname===e.hostname;if(!p||!L)continue;let m=a.href,u=[];for(let c of t.searchParams.keys())c.toLowerCase().startsWith("utm_")&&u.push(c);if(u.forEach(c=>t.searchParams.delete(c)),[...r.keys()].length>0)for(let[c,g]of r.entries())t.searchParams.set(c,g);let d=t.toString();d!==m&&(a.href=d,s.updated+=1,s.details.push({element:a,before:m,after:d}))}return s}document.addEventListener("DOMContentLoaded",()=>{setTimeout(()=>{y({log:!0})},200)});document.addEventListener("DOMContentLoaded",()=>{h()});})();
@@ -1,82 +1 @@
1
- "use strict";
2
- (() => {
3
- // bin/live-reload.js
4
- if (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
5
- new EventSource(`${"http://localhost:3000"}/esbuild`).addEventListener(
6
- "change",
7
- () => location.reload()
8
- );
9
- } else {
10
- }
11
-
12
- // src/global/number-count.ts
13
- document.addEventListener("DOMContentLoaded", () => {
14
- const decimalsOf = (s) => {
15
- const dot = s.indexOf(".");
16
- return dot >= 0 ? s.length - dot - 1 : 0;
17
- };
18
- const elements = Array.from(
19
- document.querySelectorAll("[fynd-number-count]")
20
- );
21
- for (const el of elements) {
22
- const targetText = (el.textContent || "").trim();
23
- const targetVal = parseFloat(targetText);
24
- if (Number.isNaN(targetVal)) {
25
- continue;
26
- }
27
- const initialAttr = el.getAttribute("fynd-number-count") ?? "";
28
- const initial = initialAttr.trim() === "" ? 0 : parseFloat(initialAttr.trim());
29
- const startVal = Number.isNaN(initial) ? 0 : initial;
30
- const decimals = decimalsOf(targetText);
31
- el.textContent = startVal.toFixed(decimals);
32
- el._fyndTarget = { value: targetVal, decimals };
33
- }
34
- const animateCount = (el) => {
35
- const payload = el._fyndTarget;
36
- if (!payload) return;
37
- const durationAttr = el.getAttribute("fynd-number-count-duration");
38
- const durationParsed = durationAttr ? parseInt(durationAttr, 10) : NaN;
39
- const duration = Number.isNaN(durationParsed) ? 1500 : Math.max(0, durationParsed);
40
- const startText = (el.textContent || "0").trim();
41
- const start = parseFloat(startText);
42
- const end = payload.value;
43
- if (Number.isNaN(start) || Number.isNaN(end) || duration === 0 || start === end) {
44
- el.textContent = end.toFixed(payload.decimals);
45
- return;
46
- }
47
- const t0 = performance.now();
48
- const tick = (now) => {
49
- const t = Math.min(1, (now - t0) / duration);
50
- const current = start + (end - start) * t;
51
- el.textContent = current.toFixed(payload.decimals);
52
- if (t < 1) {
53
- requestAnimationFrame(tick);
54
- } else {
55
- el.textContent = end.toFixed(payload.decimals);
56
- }
57
- };
58
- requestAnimationFrame(tick);
59
- };
60
- const io = new IntersectionObserver(
61
- (entries) => {
62
- for (const entry of entries) {
63
- if (!entry.isIntersecting) continue;
64
- const el = entry.target;
65
- if (el._fyndAnimated) {
66
- io.unobserve(el);
67
- continue;
68
- }
69
- el._fyndAnimated = true;
70
- setTimeout(() => animateCount(el), 100);
71
- io.unobserve(el);
72
- }
73
- },
74
- { threshold: 0.2 }
75
- // start when ~20% visible (tweak as needed)
76
- );
77
- for (const el of elements) {
78
- io.observe(el);
79
- }
80
- });
81
- })();
82
- //# sourceMappingURL=number-count.js.map
1
+ "use strict";(()=>{document.addEventListener("DOMContentLoaded",()=>{let l=t=>{let e=t.indexOf(".");return e>=0?t.length-e-1:0},u=Array.from(document.querySelectorAll("[fynd-number-count]"));for(let t of u){let e=(t.textContent||"").trim(),n=parseFloat(e);if(Number.isNaN(n))continue;let a=t.getAttribute("fynd-number-count")??"",r=a.trim()===""?0:parseFloat(a.trim()),c=Number.isNaN(r)?0:r,o=l(e);t.textContent=c.toFixed(o),t._fyndTarget={value:n,decimals:o}}let f=t=>{let e=t._fyndTarget;if(!e)return;let n=t.getAttribute("fynd-number-count-duration"),a=n?parseInt(n,10):NaN,r=Number.isNaN(a)?1500:Math.max(0,a),c=(t.textContent||"0").trim(),o=parseFloat(c),s=e.value;if(Number.isNaN(o)||Number.isNaN(s)||r===0||o===s){t.textContent=s.toFixed(e.decimals);return}let y=performance.now(),d=b=>{let m=Math.min(1,(b-y)/r),N=o+(s-o)*m;t.textContent=N.toFixed(e.decimals),m<1?requestAnimationFrame(d):t.textContent=s.toFixed(e.decimals)};requestAnimationFrame(d)},i=new IntersectionObserver(t=>{for(let e of t){if(!e.isIntersecting)continue;let n=e.target;if(n._fyndAnimated){i.unobserve(n);continue}n._fyndAnimated=!0,setTimeout(()=>f(n),100),i.unobserve(n)}},{threshold:.2});for(let t of u)i.observe(t)});})();
@@ -1,276 +1 @@
1
- "use strict";
2
- (() => {
3
- // bin/live-reload.js
4
- if (window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1") {
5
- new EventSource(`${"http://localhost:3000"}/esbuild`).addEventListener(
6
- "change",
7
- () => location.reload()
8
- );
9
- } else {
10
- }
11
-
12
- // src/utils/is-staging.ts
13
- function IsStaging() {
14
- return window.location.hostname === "fynd-one-master.webflow.io";
15
- }
16
-
17
- // src/global/popup-video.ts
18
- document.addEventListener("DOMContentLoaded", () => {
19
- const gsap = window.gsap;
20
- if (!gsap) {
21
- console.error(
22
- "GSAP is not loaded. Please ensure the GSAP CDN is included."
23
- );
24
- return;
25
- }
26
- const wrapper = document.querySelector(
27
- '[data-popup-video="wrapper"]'
28
- );
29
- const content = document.querySelector(
30
- '[data-popup-video="content"]'
31
- );
32
- const overlay = document.querySelector(
33
- '[data-popup-video="overlay"]'
34
- );
35
- const openTriggers = document.querySelectorAll(
36
- '[data-popup-video-trigger="open"]'
37
- );
38
- const closeTriggers = document.querySelectorAll(
39
- '[data-popup-video-trigger="close"]'
40
- );
41
- if (IsStaging()) {
42
- }
43
- if (!openTriggers.length)
44
- console.warn('No [data-popup-video="open-trigger"] elements found.');
45
- if (!closeTriggers.length)
46
- console.warn('No [data-popup-video="close-trigger"] elements found.');
47
- if (!wrapper || !content || !overlay) return;
48
- gsap.set(wrapper, { display: "none" });
49
- gsap.set([overlay, content], { opacity: 0 });
50
- gsap.set(content, { scale: 0.9 });
51
- let ytPlayer = null;
52
- let ytContainer = null;
53
- function extractYouTubeId(url) {
54
- try {
55
- const u = new URL(url);
56
- if (u.hostname.includes("youtube.com")) {
57
- if (u.searchParams.get("v")) return u.searchParams.get("v");
58
- const parts = u.pathname.split("/").filter(Boolean);
59
- const embedIdx = parts.indexOf("embed");
60
- if (embedIdx !== -1 && parts[embedIdx + 1]) return parts[embedIdx + 1];
61
- }
62
- if (u.hostname === "youtu.be") {
63
- const parts = u.pathname.split("/").filter(Boolean);
64
- if (parts[0]) return parts[0];
65
- }
66
- return null;
67
- } catch {
68
- return null;
69
- }
70
- }
71
- let ytApiReadyPromise = null;
72
- function ensureYouTubeAPI() {
73
- if (window.YT && window.YT.Player) {
74
- return Promise.resolve();
75
- }
76
- if (ytApiReadyPromise) return ytApiReadyPromise;
77
- ytApiReadyPromise = new Promise((resolve) => {
78
- const callbackName = "onYouTubeIframeAPIReady";
79
- const w = window;
80
- if (w.YT && w.YT.Player) {
81
- resolve();
82
- return;
83
- }
84
- const script = document.createElement("script");
85
- script.src = "https://www.youtube.com/iframe_api";
86
- script.async = true;
87
- const prev = w[callbackName];
88
- w[callbackName] = function() {
89
- if (typeof prev === "function") prev();
90
- resolve();
91
- };
92
- document.head.appendChild(script);
93
- });
94
- return ytApiReadyPromise;
95
- }
96
- function removeYouTube() {
97
- if (ytPlayer && typeof ytPlayer.destroy === "function") {
98
- try {
99
- ytPlayer.stopVideo?.();
100
- ytPlayer.destroy();
101
- } catch {
102
- }
103
- }
104
- ytPlayer = null;
105
- if (ytContainer && ytContainer.parentElement) {
106
- ytContainer.parentElement.removeChild(ytContainer);
107
- }
108
- ytContainer = null;
109
- }
110
- function removeInjectedVideo() {
111
- if (!content) return;
112
- const existing = content.querySelector(
113
- 'video[data-popup-video="injected"]'
114
- );
115
- if (existing) {
116
- try {
117
- existing.pause();
118
- existing.removeAttribute("src");
119
- existing.querySelectorAll("source").forEach((s) => s.remove());
120
- existing.load();
121
- } catch {
122
- }
123
- existing.remove();
124
- }
125
- }
126
- function createVideoElement(linkMP4, linkWebm) {
127
- const hasMP4 = !!(linkMP4 && linkMP4.trim());
128
- const hasWebm = !!(linkWebm && linkWebm.trim());
129
- if (!hasMP4 && !hasWebm) {
130
- console.error(
131
- "openVideoModal requires at least one of linkMP4 or linkWebm when no YouTube URL is provided."
132
- );
133
- return null;
134
- }
135
- const video = document.createElement("video");
136
- video.setAttribute("data-popup-video", "injected");
137
- video.setAttribute("playsinline", "");
138
- video.setAttribute("controls", "");
139
- video.setAttribute("autoplay", "");
140
- if (hasWebm) {
141
- const s = document.createElement("source");
142
- s.src = linkWebm.trim();
143
- s.type = "video/webm";
144
- video.appendChild(s);
145
- }
146
- if (hasMP4) {
147
- const s = document.createElement("source");
148
- s.src = linkMP4.trim();
149
- s.type = "video/mp4";
150
- video.appendChild(s);
151
- }
152
- return video;
153
- }
154
- async function openVideoModal(linkMP4, linkWebm, youtubeUrl) {
155
- if (!wrapper || !content || !overlay) {
156
- console.error("Modal elements missing. Cannot open modal.");
157
- return;
158
- }
159
- removeYouTube();
160
- removeInjectedVideo();
161
- const useYouTube = !!(youtubeUrl && youtubeUrl.trim());
162
- let openOk = true;
163
- if (useYouTube) {
164
- const id = extractYouTubeId(youtubeUrl.trim());
165
- if (!id) {
166
- console.error("Invalid YouTube URL on trigger.");
167
- openOk = false;
168
- } else {
169
- ytContainer = document.createElement("div");
170
- ytContainer.setAttribute("data-popup-video", "youtube-container");
171
- ytContainer.style.width = "100%";
172
- ytContainer.style.aspectRatio = "16 / 9";
173
- content.appendChild(ytContainer);
174
- try {
175
- await ensureYouTubeAPI();
176
- ytPlayer = new window.YT.Player(ytContainer, {
177
- width: "100%",
178
- height: "100%",
179
- videoId: id,
180
- playerVars: {
181
- autoplay: 1,
182
- controls: 1,
183
- rel: 0,
184
- modestbranding: 1,
185
- playsinline: 1,
186
- origin: window.location.origin
187
- },
188
- events: {
189
- onReady: (ev) => {
190
- try {
191
- ev.target.unMute?.();
192
- ev.target.setVolume?.(100);
193
- ev.target.playVideo?.();
194
- } catch {
195
- }
196
- }
197
- }
198
- });
199
- } catch (e) {
200
- console.error("Failed to initialize YouTube player:", e);
201
- removeYouTube();
202
- openOk = false;
203
- }
204
- }
205
- } else {
206
- const videoEl = createVideoElement(linkMP4, linkWebm);
207
- if (!videoEl) {
208
- openOk = false;
209
- } else {
210
- content.appendChild(videoEl);
211
- }
212
- }
213
- if (!openOk) return;
214
- gsap.set([overlay, content], { opacity: 0 });
215
- gsap.set(content, { scale: 0.9 });
216
- gsap.set(wrapper, { display: "flex" });
217
- gsap.to(overlay, {
218
- opacity: 1,
219
- duration: 0.3,
220
- ease: "power2.out"
221
- });
222
- gsap.to(content, {
223
- opacity: 1,
224
- scale: 1,
225
- duration: 0.35,
226
- delay: 0.3,
227
- ease: "power2.out"
228
- });
229
- console.log("Video modal opened.");
230
- }
231
- function closeVideoModal() {
232
- if (!wrapper || !content || !overlay) {
233
- console.error("Modal elements missing. Cannot close modal.");
234
- return;
235
- }
236
- const tl = gsap.timeline({
237
- defaults: { ease: "power2.inOut" },
238
- onComplete: () => {
239
- removeYouTube();
240
- removeInjectedVideo();
241
- gsap.set(wrapper, { display: "none" });
242
- console.log("Video modal closed.");
243
- }
244
- });
245
- tl.to(content, { opacity: 0, scale: 0.9, duration: 0.25 }, 0).to(
246
- overlay,
247
- { opacity: 0, duration: 0.25 },
248
- 0
249
- );
250
- }
251
- openTriggers.forEach(
252
- (el) => el.addEventListener("click", () => {
253
- if (!wrapper) {
254
- console.error("Wrapper not found. Cannot open modal.");
255
- return;
256
- }
257
- const mp4 = el.getAttribute("data-video-mp4");
258
- const webm = el.getAttribute("data-video-webm");
259
- const youtubeUrl = el.getAttribute("data-youtube-url");
260
- void openVideoModal(mp4, webm, youtubeUrl);
261
- })
262
- );
263
- closeTriggers.forEach(
264
- (el) => el.addEventListener("click", () => {
265
- if (!wrapper) {
266
- console.error("Wrapper not found. Cannot close modal.");
267
- return;
268
- }
269
- closeVideoModal();
270
- })
271
- );
272
- window.openVideoModal = openVideoModal;
273
- window.closeVideoModal = closeVideoModal;
274
- });
275
- })();
276
- //# sourceMappingURL=popup-video.js.map
1
+ "use strict";(()=>{function b(){return window.location.hostname==="fynd-one-master.webflow.io"}document.addEventListener("DOMContentLoaded",()=>{let l=window.gsap;if(!l){console.error("GSAP is not loaded. Please ensure the GSAP CDN is included.");return}let d=document.querySelector('[data-popup-video="wrapper"]'),i=document.querySelector('[data-popup-video="content"]'),u=document.querySelector('[data-popup-video="overlay"]'),f=document.querySelectorAll('[data-popup-video-trigger="open"]'),g=document.querySelectorAll('[data-popup-video-trigger="close"]');if(b(),f.length||console.warn('No [data-popup-video="open-trigger"] elements found.'),g.length||console.warn('No [data-popup-video="close-trigger"] elements found.'),!d||!i||!u)return;l.set(d,{display:"none"}),l.set([u,i],{opacity:0}),l.set(i,{scale:.9});let c=null,s=null;function E(e){try{let o=new URL(e);if(o.hostname.includes("youtube.com")){if(o.searchParams.get("v"))return o.searchParams.get("v");let t=o.pathname.split("/").filter(Boolean),r=t.indexOf("embed");if(r!==-1&&t[r+1])return t[r+1]}if(o.hostname==="youtu.be"){let t=o.pathname.split("/").filter(Boolean);if(t[0])return t[0]}return null}catch{return null}}let m=null;function T(){return window.YT&&window.YT.Player?Promise.resolve():m||(m=new Promise(e=>{let o="onYouTubeIframeAPIReady",t=window;if(t.YT&&t.YT.Player){e();return}let r=document.createElement("script");r.src="https://www.youtube.com/iframe_api",r.async=!0;let n=t[o];t[o]=function(){typeof n=="function"&&n(),e()},document.head.appendChild(r)}),m)}function y(){if(c&&typeof c.destroy=="function")try{c.stopVideo?.(),c.destroy()}catch{}c=null,s&&s.parentElement&&s.parentElement.removeChild(s),s=null}function v(){if(!i)return;let e=i.querySelector('video[data-popup-video="injected"]');if(e){try{e.pause(),e.removeAttribute("src"),e.querySelectorAll("source").forEach(o=>o.remove()),e.load()}catch{}e.remove()}}function A(e,o){let t=!!(e&&e.trim()),r=!!(o&&o.trim());if(!t&&!r)return console.error("openVideoModal requires at least one of linkMP4 or linkWebm when no YouTube URL is provided."),null;let n=document.createElement("video");if(n.setAttribute("data-popup-video","injected"),n.setAttribute("playsinline",""),n.setAttribute("controls",""),n.setAttribute("autoplay",""),r){let a=document.createElement("source");a.src=o.trim(),a.type="video/webm",n.appendChild(a)}if(t){let a=document.createElement("source");a.src=e.trim(),a.type="video/mp4",n.appendChild(a)}return n}async function w(e,o,t){if(!d||!i||!u){console.error("Modal elements missing. Cannot open modal.");return}y(),v();let r=!!(t&&t.trim()),n=!0;if(r){let a=E(t.trim());if(!a)console.error("Invalid YouTube URL on trigger."),n=!1;else{s=document.createElement("div"),s.setAttribute("data-popup-video","youtube-container"),s.style.width="100%",s.style.aspectRatio="16 / 9",i.appendChild(s);try{await T(),c=new window.YT.Player(s,{width:"100%",height:"100%",videoId:a,playerVars:{autoplay:1,controls:1,rel:0,modestbranding:1,playsinline:1,origin:window.location.origin},events:{onReady:p=>{try{p.target.unMute?.(),p.target.setVolume?.(100),p.target.playVideo?.()}catch{}}}})}catch(p){console.error("Failed to initialize YouTube player:",p),y(),n=!1}}}else{let a=A(e,o);a?i.appendChild(a):n=!1}n&&(l.set([u,i],{opacity:0}),l.set(i,{scale:.9}),l.set(d,{display:"flex"}),l.to(u,{opacity:1,duration:.3,ease:"power2.out"}),l.to(i,{opacity:1,scale:1,duration:.35,delay:.3,ease:"power2.out"}),console.log("Video modal opened."))}function h(){if(!d||!i||!u){console.error("Modal elements missing. Cannot close modal.");return}l.timeline({defaults:{ease:"power2.inOut"},onComplete:()=>{y(),v(),l.set(d,{display:"none"}),console.log("Video modal closed.")}}).to(i,{opacity:0,scale:.9,duration:.25},0).to(u,{opacity:0,duration:.25},0)}f.forEach(e=>e.addEventListener("click",()=>{if(!d){console.error("Wrapper not found. Cannot open modal.");return}let o=e.getAttribute("data-video-mp4"),t=e.getAttribute("data-video-webm"),r=e.getAttribute("data-youtube-url");w(o,t,r)})),g.forEach(e=>e.addEventListener("click",()=>{if(!d){console.error("Wrapper not found. Cannot close modal.");return}h()})),window.openVideoModal=w,window.closeVideoModal=h});})();