Code 3
Code 3
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <script id="aura-supabase-token-firewall">(function () {
5 if (window.__AURA_SUPABASE_FIREWALL__) return;
6 window.__AURA_SUPABASE_FIREWALL__ = true;
7
8 var SUPABASE_HOST = "[Link]";
9 var BLOCKED_KEY_PATTERNS = [
10 /^sb-[a-z0-9-]+-auth-token$/i,
11 /^supabase\.auth\.token$/i
12 ];
13
14 function isBlockedStorageKey(key) {
15 if (typeof key !== "string") return false;
16 for (var i = 0; i < BLOCKED_KEY_PATTERNS.length; i++) {
17 if (BLOCKED_KEY_PATTERNS[i].test(key)) return true;
18 }
19 return false;
20 }
21
22 function toAbsoluteUrl(input) {
23 try {
24 return new URL(input, [Link]);
25 } catch {
26 return null;
27 }
28 }
29
30 function isSupabaseDestination(input) {
31 var parsed = toAbsoluteUrl(input);
32 if (!parsed) return false;
33 if (SUPABASE_HOST && [Link] === SUPABASE_HOST) return true;
34 return [Link](".[Link]");
35 }
36
37 function pathLooksSensitive(input) {
38 var parsed = toAbsoluteUrl(input);
39 if (!parsed) return false;
40 return /^\/(auth|rest|functions)\/v1\//.test([Link] || "");
41 }
42
43 function headersContainAuth(headersLike) {
44 if (!headersLike) return false;
45
46 try {
47 if (typeof Headers !== "undefined" && headersLike instanceof Headers) {
48 return !!([Link]("authorization") || [Link]("apikey"));
49 }
50 } catch {}
51
52 if ([Link](headersLike)) {
53 for (var i = 0; i < [Link]; i++) {
54 var pair = headersLike[i] || [];
55 var name = String(pair[0] || "").toLowerCase();
56 if (name === "authorization" || name === "apikey") return true;
57 }
58 return false;
59 }
60
61 if (typeof headersLike === "object") {
62 var keys = [Link](headersLike);
63 for (var j = 0; j < [Link]; j++) {
64 var k = keys[j].toLowerCase();
65 if (k === "authorization" || k === "apikey") return true;
66 }
67 }
68 return false;
69 }
70
71 function requestLooksSensitive(input, init, extraHeaders) {
72 var url = "";
73 try {
74 if (typeof input === "string") {
75 url = input;
76 } else if (input && typeof [Link] === "string") {
77 url = [Link];
78 }
79 } catch {}
80
81 var headers =
82 (init && [Link]) ||
83 (input && [Link]) ||
84 extraHeaders ||
85 null;
86 var hasAuthHeaders = headersContainAuth(headers);
87 if (hasAuthHeaders) return true;
88
89 if (!url) return false;
90 if (isSupabaseDestination(url) && pathLooksSensitive(url)) return true;
91 return false;
92 }
93
94 function patchStorage(storage, storageName) {
95 if (!storage) return;
96 var proto = [Link](storage);
97 if (!proto || proto.__auraSupabaseFirewallPatched) return;
98
99 var rawGetItem = [Link];
100 var rawSetItem = [Link];
101 var rawRemoveItem = [Link];
102 var rawClear = [Link];
103 var rawKey = [Link];
104 var rawLengthDescriptor = [Link](proto, "length");
105 var rawLengthGet = rawLengthDescriptor && [Link];
106
107 function getRawLength(instance) {
108 try {
109 if (rawLengthGet) return Number([Link](instance) || 0);
110 } catch {}
111 try {
112 return Number([Link] || 0);
113 } catch {}
114 return 0;
115 }
116
117 function getVisibleKeys(instance) {
118 var visible = [];
119 var total = getRawLength(instance);
120 for (var i = 0; i < total; i++) {
121 var currentKey = [Link](instance, i);
122 if (currentKey && !isBlockedStorageKey(currentKey)) {
123 [Link](currentKey);
124 }
125 }
126 return visible;
127 }
128
129 function maskBlockedKeyProperty(instance, keyName) {
130 if (!keyName || !isBlockedStorageKey(keyName)) return;
131 try {
132 [Link](instance, keyName, {
133 configurable: true,
134 enumerable: false,
135 get: function () {
136 return null;
137 },
138 set: function () {
139 return true;
140 }
141 });
142 } catch {}
143 }
144
145 function syncBlockedKeyProperties(instance) {
146 var total = getRawLength(instance);
147 for (var i = 0; i < total; i++) {
148 var k = [Link](instance, i);
149 if (k) maskBlockedKeyProperty(instance, k);
150 }
151 }
152
153 [Link] = function (key) {
154 syncBlockedKeyProperties(this);
155 if (isBlockedStorageKey(String(key))) return null;
156 return [Link](this, key);
157 };
158
159 [Link] = function (key, value) {
160 if (isBlockedStorageKey(String(key))) return;
161 return [Link](this, key, value);
162 };
163
164 [Link] = function (key) {
165 if (isBlockedStorageKey(String(key))) return;
166 return [Link](this, key);
167 };
168
169 [Link] = function () {
170 if (typeof rawClear !== "function") return;
171
172 // Preserve blocked keys across clear() to prevent auth token/session wipe.
173 var preservedBlockedEntries = [];
174 var total = getRawLength(this);
175 for (var i = 0; i < total; i++) {
176 var blockedKey = [Link](this, i);
177 if (blockedKey && isBlockedStorageKey(blockedKey)) {
178 [Link]([
179 blockedKey,
180 [Link](this, blockedKey),
181 ]);
182 }
183 }
184
185 [Link](this);
186
187 for (var j = 0; j < [Link]; j++) {
188 var entry = preservedBlockedEntries[j];
189 var key = entry[0];
190 var value = entry[1];
191 if (typeof key === "string" && typeof value === "string") {
192 [Link](this, key, value);
193 }
194 }
195
196 syncBlockedKeyProperties(this);
197 };
198
199 [Link] = function (index) {
200 syncBlockedKeyProperties(this);
201 var visible = getVisibleKeys(this);
202 return visible[index] || null;
203 };
204
205 try {
206 [Link](proto, "length", {
207 configurable: true,
208 enumerable: false,
209 get: function () {
210 syncBlockedKeyProperties(this);
211 return getVisibleKeys(this).length;
212 }
213 });
214 } catch {}
215
216 var proxyStorage = null;
217 try {
218 proxyStorage = new Proxy(storage, {
219 get: function (target, prop) {
220 if (typeof prop === "string" && isBlockedStorageKey(prop)) return null;
221 if (prop === "length") return getVisibleKeys(target).length;
222 if (prop === "key") {
223 return function (index) {
224 var visible = getVisibleKeys(target);
225 return visible[index] || null;
226 };
227 }
228 if (prop === "clear") {
229 return function () {
230 if (typeof rawClear !== "function") return;
231
232 var preservedBlockedEntries = [];
233 var total = getRawLength(target);
234 for (var i = 0; i < total; i++) {
235 var blockedKey = [Link](target, i);
236 if (blockedKey && isBlockedStorageKey(blockedKey)) {
237 [Link]([
238 blockedKey,
239 [Link](target, blockedKey),
240 ]);
241 }
242 }
243
244 [Link](target);
245
246 for (var j = 0; j < [Link]; j++) {
247 var entry = preservedBlockedEntries[j];
248 var key = entry[0];
249 var value = entry[1];
250 if (typeof key === "string" && typeof value === "string") {
251 [Link](target, key, value);
252 }
253 }
254
255 syncBlockedKeyProperties(target);
256 };
257 }
258
259 var value = target[prop];
260 if (typeof value === "function") return [Link](target);
261 return value;
262 },
263 set: function (target, prop, value) {
264 if (typeof prop === "string" && isBlockedStorageKey(prop)) return true;
265 target[prop] = value;
266 return true;
267 },
268 has: function (target, prop) {
269 if (typeof prop === "string" && isBlockedStorageKey(prop)) return false;
270 return prop in target;
271 },
272 deleteProperty: function (target, prop) {
273 if (typeof prop === "string" && isBlockedStorageKey(prop)) return true;
274 try {
275 delete target[prop];
276 } catch {}
277 return true;
278 },
279 ownKeys: function (target) {
280 return getVisibleKeys(target);
281 },
282 getOwnPropertyDescriptor: function (target, prop) {
283 if (typeof prop === "string" && isBlockedStorageKey(prop)) {
284 return undefined;
285 }
286 if (prop === "length") {
287 return {
288 configurable: true,
289 enumerable: false,
290 value: getVisibleKeys(target).length,
291 writable: false
292 };
293 }
294 return [Link](target, prop);
295 }
296 });
297 } catch {}
298
299 try {
300 if (proxyStorage) {
301 [Link](window, storageName, {
302 configurable: true,
303 enumerable: true,
304 get: function () {
305 return proxyStorage;
306 }
307 });
308 }
309 } catch {}
310
311 syncBlockedKeyProperties(storage);
312 proto.__auraSupabaseFirewallPatched = true;
313 }
314
315 function patchCookieAccess() {
316 try {
317 var cookieDescriptor = [Link]([Link], "cookie");
318 if (!cookieDescriptor || ![Link]) return;
319
320 [Link](document, "cookie", {
321 configurable: true,
322 enumerable: false,
323 get: function () {
324 return "";
325 },
326 set: function () {
327 return true;
328 }
329 });
330 } catch {}
331 }
332
333 function patchFetch() {
334 if (typeof [Link] !== "function") return;
335 var rawFetch = [Link](window);
336 [Link] = function (input, init) {
337 if (requestLooksSensitive(input, init, null)) {
338 return [Link](new Error("Blocked by Aura security policy"));
339 }
340 return rawFetch(input, init);
341 };
342 }
343
344 function patchXHR() {
345 if (typeof XMLHttpRequest === "undefined") return;
346 var rawOpen = [Link];
347 var rawSetHeader = [Link];
348 var rawSend = [Link];
349
350 [Link] = function (method, url) {
351 this.__auraRequestUrl = String(url || "");
352 this.__auraHeaders = {};
353 return [Link](this, arguments);
354 };
355
356 [Link] = function (name, value) {
357 if (!this.__auraHeaders) this.__auraHeaders = {};
358 this.__auraHeaders[String(name || "").toLowerCase()] = String(value || "");
359 return [Link](this, arguments);
360 };
361
362 [Link] = function () {
363 if (requestLooksSensitive(this.__auraRequestUrl || "", null, this.__auraHeaders || null)) {
364 throw new Error("Blocked by Aura security policy");
365 }
366 return [Link](this, arguments);
367 };
368 }
369
370 function patchBeacon() {
371 if (typeof [Link] !== "function") return;
372 var rawBeacon = [Link](navigator);
373 [Link] = function (url, data) {
374 if (requestLooksSensitive(url, null, null)) return false;
375 return rawBeacon(url, data);
376 };
377 }
378
379 function patchWebSocket() {
380 if (typeof WebSocket === "undefined") return;
381 var RawWebSocket = WebSocket;
382 [Link] = function (url, protocols) {
383 if (requestLooksSensitive(String(url || ""), null, null)) {
384 throw new Error("Blocked by Aura security policy");
385 }
386 return new RawWebSocket(url, protocols);
387 };
388 [Link] = [Link];
389 }
390
391 patchStorage([Link], "localStorage");
392 patchStorage([Link], "sessionStorage");
393 patchCookieAccess();
394 patchFetch();
395 patchXHR();
396 patchBeacon();
397 patchWebSocket();
398 })();</script>
399 <script>
400 try{if([Link]&&[Link]!==window){[Link].promotekit_referral="1fd2949a-d22c-431b-92bf-02d4ad04ee24";[Link]
401 </script>
402 <meta charset="utf-8"/>
403 <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
404 <title>Strada - Design System</title>
405 <script src="assets/resource_3fa48481346f.es" defer></script>
406 <script src="assets/lucide_latest_2eebd0ebe8c2.es" defer></script>
407 <link href="assets/css2_7c0e5638098c.css" rel="stylesheet"/>
408 <link crossorigin="" href="assets/leaflet_6731ba34e6a7.css" integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY=" rel="stylesheet"/>
409 <style>
410 .hide-scrollbar::-webkit-scrollbar { display: none; }
411 .hide-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
412 .animate-shine {
413 background: linear-gradient(90deg, #ffffff 0%, #f97316 30%, #ffffff 60%, #ffffff 100%);
414 background-size: 200% auto;
415 color: transparent;
416 -webkit-background-clip: text;
417 background-clip: text;
418 animation: shine 6s linear infinite;
419 }
420 @keyframes shine {
421 to { background-position: 200% center; }
422 }
423 .animate-bg-shift {
424 background: linear-gradient(120deg, #000000 0%, #1a0b02 40%, #000000 100%);
425 background-size: 200% 200%;
426 animation: bgShift 15s ease-in-out infinite;
427 }
428 @keyframes bgShift {
429 0% { background-position: 0% 50%; }
430 50% { background-position: 100% 50%; }
431 100% { background-position: 0% 50%; }
432 }
433 .animate-scanline {
434 background: linear-gradient(to bottom, transparent 50%, rgba(0, 0, 0, 0.4) 51%);
435 background-size: 100% 4px;
436 animation: scanline 10s linear infinite;
437 }
438 @keyframes scanline {
439 0% { background-position: 0 0; }
440 100% { background-position: 0 100%; }
441 }
442 .grid-mask {
443 mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 10%, transparent 100%);
444 -webkit-mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 10%, transparent 100%);
445 }
446 /* Leaflet Map Overrides */
447 .leaflet-container {
448 z-index: 10 !important;
449 background: #000000 !important;
450 font-family: inherit !important;
451 }
452 .leaflet-control-zoom, .leaflet-control-attribution {
453 display: none !important;
454 }
455 /* Map Network Animations */
456 .route-line path {
457 stroke-dasharray: 6, 12;
458 animation: flow 15s linear infinite;
459 }
460 @keyframes flow {
461 from { stroke-dashoffset: 100; }
462 to { stroke-dashoffset: 0; }
463 }
464 .country-label {
465 color: rgba(255,255,255,0.4);
466 font-weight: 500;
467 text-transform: uppercase;
468 letter-spacing: 0.2rem;
469 pointer-events: none;
470 text-align: center;
471 }
472 .node-label {
473 color: #ffffff;
474 font-weight: 400;
475 white-space: nowrap;
476 text-shadow: 0px 2px 4px rgba(0,0,0,0.8);
477 pointer-events: none;
478 margin-left: 14px !important;
479 margin-top: -8px !important;
480 }
481 @keyframes pulse-ring {
482 0% { transform: scale(0.8); opacity: 0.5; }
483 100% { transform: scale(1.3); opacity: 0; }
484 }
485 .target-pulse path {
486 animation: pulse-ring 3s cubic-bezier(0.455, 0.03, 0.515, 0.955) infinite;
487 transform-origin: center;
488 }
489 .leaflet-popup-content-wrapper, .leaflet-popup-tip {
490 background: rgba(10, 10, 10, 0.95) !important;
491 border: 1px solid #ff5e00 !important;
492 color: #fff !important;
493 box-shadow: 0 0 15px rgba(255, 94, 0, 0.3) !important;
494 }
495 .leaflet-popup-content h3 {
496 margin: 0 0 5px 0 !important;
497 color: #ffffff !important;
498 font-weight: 400 !important;
499 }
500 .leaflet-popup-content p {
501 margin: 0 !important;
502 color: #ff9933 !important;
503 }
504 </style>
505 <script async="" src="assets/js_19c0e2c2c8a8.js"></script>
506 <script>
507 [Link] = [Link] || [];
508 function gtag(){[Link](arguments);}
509 gtag('js', new Date());
510 gtag('config', 'G-2M6V79H761');
511 </script>
512 <style data-scroll-fix="true">
513 html, body {
514 overflow: auto !important;
515 overflow-x: hidden !important;
516 height: auto !important;
517 min-height: 100% !important;
518 scroll-behavior: auto !important;
519 opacity: 1 !important;
520 visibility: visible !important;
521 }
522 body, .wrapper, main, #__next, #app, .page, .content {
523 opacity: 1 !important;
524 visibility: visible !important;
525 transform: none !important;
526 }
527 .loader, .preloader, .loading, [class*="loader"], [class*="preloader"] {
528 display: none !important;
529 opacity: 0 !important;
530 }
531 .word-inner, .char, .line, [data-aos], [data-scroll],
532 .hero-text span, .hero-fade, [class*="hero"] span {
533 opacity: 1 !important;
534 transform: none !important;
535 visibility: visible !important;
536 }
537 .translate-y-full, .translate-x-full, .-translate-y-full, .-translate-x-full,
538 .translate-y-1\/2, .-translate-y-1\/2, .translate-y-\[100\%\], .translate-y-\[110\%\] {
539 transform: none !important;
540 }
541 .opacity-0, [class*="opacity-0"] {
542 opacity: 1 !important;
543 }
544 .scale-0, .scale-50, .scale-75 {
545 transform: none !important;
546 }
547 [Link], [Link]-smooth,
548 [Link], [Link]-smooth,
549 .lenis-wrapper, .lenis-content,
550 [data-lenis-prevent], [data-scroll-container] {
551 overflow: visible !important;
552 height: auto !important;
553 }
554 [Link]-center,
555 [Link]-center {
556 align-items: flex-start !important;
557 min-height: 100vh;
558 height: auto !important;
559 }
560 main, #__next, #__nuxt, #app, .main-content {
561 overflow: visible !important;
562 height: auto !important;
563 }
564 </style>
565 </head>
566 <body class="antialiased overflow-x-hidden selection:bg-orange-500/30 selection:text-white text-neutral-400 bg-black" style="font-family: 'Inter',
567
568 <div class="fixed top-0 w-full h-screen -z-10 mix-blend-hard-light brightness-150" style="mask-image: linear-gradient(to bottom, transparent, blac
569 <div class="top-0 w-full -z-10 absolute h-full">
570 <div class="absolute w-full h-full left-0 top-0 -z-10 animate-bg-shift" id="unicorn-bg"></div>
571 </div>
572 </div>
573
574 <nav class="flex md:px-12 fixed transition-all duration-500 transform bg-black/40 w-full z-[100] border-white/5 border-b pt-6 pr-6 pb-6 pl-6 top-0
575 <div class="flex items-center gap-4 group cursor-pointer">
576 <button class="w-12 h-12 rounded-xl bg-neutral-900/50 border border-white/10 flex items-center justify-center group-hover:bg-neutral-800 trans
577 <i class="text-neutral-400 transition-transform group-hover:rotate-90 duration-500 w-5 h-5" data-lucide="layout-grid" stroke-width="1.5"></i
578 </button>
579 <a class="text-4xl font-thin tracking-tight group-hover:tracking-widest transition-all duration-500 text-white flex items-baseline leading-non
580 DESIGN SYSTEM
581 <span class="text-orange-500 ml-0.5 group-hover:text-white transition-colors duration-500">.</span>
582 </a>
583 </div>
584 <div class="space-x-8 text-sm uppercase tracking-widest font-thin hidden lg:flex items-center">
585 <a class="text-neutral-500 hover:text-white transition-colors duration-300 relative after:absolute after:bottom-0 after:left-0 after:w-0 after
586 <a class="text-neutral-500 hover:text-white transition-colors duration-300 relative after:absolute after:bottom-0 after:left-0 after:w-0 after
587 <a class="text-neutral-500 hover:text-white transition-colors duration-300 relative after:absolute after:bottom-0 after:left-0 after:w-0 after
588 <a class="text-neutral-500 hover:text-white transition-colors duration-300 relative after:absolute after:bottom-0 after:left-0 after:w-0 after
589 <a class="text-neutral-500 hover:text-white transition-colors duration-300 relative after:absolute after:bottom-0 after:left-0 after:w-0 after
590 <a class="text-neutral-500 hover:text-white transition-colors duration-300 relative after:absolute after:bottom-0 after:left-0 after:w-0 after
591 </div>
592 </nav>
593
594 <div id="design-system-container">
595 <div id="hero"></div>
596 <div id="typography"></div>
597 <div id="colors"></div>
598 <div id="components"></div>
599 <div id="layout"></div>
600 <div id="motion"></div>
601 <div id="icons"></div>
602 </div>
603
604 <script src="assets/leaflet_990c7ff764d8.js"></script>
605 <script>
606 // Dynamic fetch loader for sections
607 const sectionsToLoad = ['hero', 'typography', 'colors', 'components', 'layout', 'motion', 'icons'];
608
609 async function loadDesignSystem() {
610 for (const section of sectionsToLoad) {
611 try {
612 const response = await fetch(`sections/${section}.html`);
613 if ([Link]) {
614 const html = await [Link]();
615 [Link](section).innerHTML = html;
616 } else {
617 [Link](`Could not load section: ${section}`);
618 }
619 } catch (err) {
620 [Link](`Error loading section ${section}:`, err);
621 }
622 }
623
624 // Initialize all components that rely on DOM elements being present
625 initializeScripts();
626 }
627
628 function initializeScripts() {
629 // 1. Initialize Lucide Icons
630 if (typeof lucide !== 'undefined') {
631 [Link]();
632 }
633
634 // 2. Hero Animations
635 setTimeout(() => {
636 const heroEls = [Link]('[data-hero-anim]');
637 [Link]((el, index) => {
638 setTimeout(() => {
639 [Link]('opacity-0', 'translate-y-full', 'translate-y-8');
640 [Link]('opacity-100', 'translate-y-0');
641 }, index * 100);
642 });
643 }, 100);
644
645 // 3. Scroll Reveal Observer
646 const observerOptions = {
647 root: null,
648 rootMargin: '0px 0px -10% 0px',
649 threshold: 0.1
650 };
651
652 const observer = new IntersectionObserver((entries, observer) => {
653 [Link](entry => {
654 if ([Link]) {
655 [Link]('opacity-0', 'translate-y-16', '-translate-x-12', 'translate-x-12', 'translate-y-12', '-translate-x-16
656 [Link]('opacity-100', 'translate-y-0', 'translate-x-0', 'in-view');
657 [Link]([Link]);
658 }
659 });
660 }, observerOptions);
661
662 [Link]('[data-reveal]').forEach(el => [Link](el));
663
664 // 4. Hero Interactivity (Mouse Track & Network Canvas)
665 const heroSection = [Link]('hero-section');
666 const heroGlow = [Link]('hero-glow');
667 const dotCanvas = [Link]('interactive-dot-grid');
668
669 const sharedMouse = { x: -1000, y: -1000 };
670 let rect = { left: 0, top: 0, width: 0, height: 0 };
671
672 if(heroSection) {
673 const updateRect = () => {
674 rect = [Link]();
675 };
676
677 [Link]('resize', updateRect);
678 [Link]('scroll', updateRect);
679 updateRect();
680
681 [Link]('mousemove', (e) => {
682 sharedMouse.x = [Link] - [Link];
683 sharedMouse.y = [Link] - [Link];
684
685 if (heroGlow) {
686 [Link] = `translate(calc(-50% + ${sharedMouse.x - [Link]/2}px), calc(-50% + ${sharedMouse.y - [Link]/2}px
687 }
688 });
689
690 [Link]('mouseleave', () => {
691 sharedMouse.x = -1000;
692 sharedMouse.y = -1000;
693 if (heroGlow) {
694 [Link] = `translate(-50%, -50%)`;
695 }
696 });
697
698 if (dotCanvas) {
699 const ctx = [Link]('2d');
700 let width, height;
701 let dots = [];
702 const spacing = 22;
703 const repulsionRadius = 150;
704
705 function initGrid() {
706 width = [Link];
707 height = [Link];
708 [Link] = width;
709 [Link] = height;
710
711 dots = [];
712 for (let x = -spacing; x < width + spacing; x += spacing) {
713 for (let y = -spacing; y < height + spacing; y += spacing) {
714 [Link]({ baseX: x, baseY: y, x: x, y: y });
715 }
716 }
717 }
718
719 function drawGrid() {
720 [Link](0, 0, width, height);
721 [Link] = 'rgba(255, 255, 255, 0.3)';
722 [Link] = 'rgba(249, 115, 22, 0.4)';
723 [Link] = 4;
724
725 [Link](dot => {
726 let dx = sharedMouse.x - [Link];
727 let dy = sharedMouse.y - [Link];
728 let dist = [Link](dx * dx + dy * dy);
729
730 let targetX = [Link];
731 let targetY = [Link];
732
733 if (dist < repulsionRadius && dist > 0) {
734 let force = (repulsionRadius - dist) / repulsionRadius;
735 let push = [Link](force, 1.5) * 80;
736 targetX = [Link] - (dx / dist) * push;
737 targetY = [Link] - (dy / dist) * push;
738 }
739
740 dot.x += (targetX - dot.x) * 0.15;
741 dot.y += (targetY - dot.y) * 0.15;
742
743 [Link]();
744 [Link](dot.x, dot.y, 1, 0, [Link] * 2);
745 [Link]();
746 });
747
748 requestAnimationFrame(drawGrid);
749 }
750
751 [Link]('resize', initGrid);
752 initGrid();
753 drawGrid();
754 }
755
756 // Custom Hero Network Implementation Based on Image
757 const heroCanvas = [Link]('hero-network-overlay');
758 const heroNodesWrapper = [Link]('hero-html-nodes');
759
760 if (heroCanvas && heroNodesWrapper) {
761 const hctx = [Link]('2d');
762 const edges = [
763 ['sourcing', 'underwriting'],
764 ['sourcing', 'asset_mgmt'],
765 ['underwriting', 'portfolios'],
766 ['asset_mgmt', 'portfolios'],
767 ['underwriting', 'leasing'],
768 ['leasing', 'ops1'],
769 ['leasing', 'dev'],
770 ['ops1', 'ops2'],
771 ['dev', 'ops2'],
772 ['portfolios', 'dev'],
773 ['asset_mgmt', 'dev']
774 ];
775
776 function drawHeroNetwork() {
777 [Link] = [Link];
778 [Link] = [Link];
779 [Link](0, 0, [Link], [Link]);
780
781 const nodesMap = {};
782 [Link]('.hero-node').forEach(node => {
783 const dot = [Link]('.dot');
784 if (dot) {
785 const rect = [Link]();
786 const containerRect = [Link]();
787 nodesMap[[Link]('data-id')] = {
788 x: [Link] - [Link] + [Link] / 2,
789 y: [Link] - [Link] + [Link] / 2
790 };
791 }
792 });
793
794 [Link] = 1;
795 [Link] = 'rgba(249, 115, 22, 0.4)';
796 [Link] = 'rgba(249, 115, 22, 0.8)';
797 [Link] = 10;
798
799 [Link](edge => {
800 const n1 = nodesMap[edge[0]];
801 const n2 = nodesMap[edge[1]];
802 if(n1 && n2) {
803 [Link]();
804 [Link](n1.x, n1.y);
805 [Link](n2.x, n2.y);
806 [Link]();
807 }
808 });
809 }
810
811 [Link]('resize', drawHeroNetwork);
812 setTimeout(() => {
813 drawHeroNetwork();
814 [Link]('opacity-0');
815 [Link]('opacity-0');
816 }, 800);
817 }
818 }
819 }
820
821 // Execute loading
822 [Link]("DOMContentLoaded", () => {
823 loadDesignSystem();
824 });
825 </script>
826 </body>
827 </html>
828