From 4f07eef844c0c21a9910f2ce393af433d923af84 Mon Sep 17 00:00:00 2001 From: Melvin Ragusa Date: Thu, 22 Jan 2026 00:23:52 +0100 Subject: [PATCH] feat: reworked HeroSection background --- build/assets/index-BAFm1LaZ.css | 1 + build/assets/index-D4N8_we_.css | 1 - build/assets/index-DpUrPOvK.js | 3 - build/assets/index-VO0wVEDp.js | 128 + build/assets/three-A7r-9XvZ.js | 4041 --------------------- build/assets/three-eMwtdKkp.js | 9 + build/favicon.ico | Bin 0 -> 22408 bytes build/favicon.svg | 5 - build/index.html | 8 +- build/logo.png | Bin 0 -> 175002 bytes build/logo.svg | 9 + index.html | 2 +- package.json | 2 + pnpm-lock.yaml | 44 + public/favicon.ico | Bin 0 -> 22408 bytes public/favicon.svg | 5 - public/logo.png | Bin 0 -> 175002 bytes public/logo.svg | 9 + src/components/effects/GradientBlinds.css | 6 + src/components/effects/GradientBlinds.tsx | 389 ++ src/components/effects/Scene3D.module.css | 20 - src/components/effects/Scene3D.tsx | 96 - src/components/effects/index.ts | 2 +- src/components/layout/Footer.module.css | 18 +- src/components/layout/Footer.tsx | 10 +- src/components/layout/Navbar.module.css | 16 +- src/components/layout/Navbar.tsx | 3 +- src/components/sections/Hero.module.css | 9 + src/components/sections/Hero.tsx | 55 +- src/i18n/de.ts | 4 +- src/i18n/en.ts | 4 +- 31 files changed, 665 insertions(+), 4234 deletions(-) create mode 100644 build/assets/index-BAFm1LaZ.css delete mode 100644 build/assets/index-D4N8_we_.css delete mode 100644 build/assets/index-DpUrPOvK.js create mode 100644 build/assets/index-VO0wVEDp.js delete mode 100644 build/assets/three-A7r-9XvZ.js create mode 100644 build/assets/three-eMwtdKkp.js create mode 100644 build/favicon.ico delete mode 100644 build/favicon.svg create mode 100644 build/logo.png create mode 100644 build/logo.svg create mode 100644 public/favicon.ico delete mode 100644 public/favicon.svg create mode 100644 public/logo.png create mode 100644 public/logo.svg create mode 100644 src/components/effects/GradientBlinds.css create mode 100644 src/components/effects/GradientBlinds.tsx delete mode 100644 src/components/effects/Scene3D.module.css delete mode 100644 src/components/effects/Scene3D.tsx diff --git a/build/assets/index-BAFm1LaZ.css b/build/assets/index-BAFm1LaZ.css new file mode 100644 index 0000000..d260bf3 --- /dev/null +++ b/build/assets/index-BAFm1LaZ.css @@ -0,0 +1 @@ +._header_6kz3c_1{position:fixed;top:0;left:0;right:0;z-index:100;padding:var(--space-md) 0;transition:background-color var(--transition-normal),backdrop-filter var(--transition-normal)}._header_6kz3c_1._scrolled_6kz3c_11{background-color:#0f1410d9;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--md-sys-color-outline-variant)}._nav_6kz3c_17{display:flex;align-items:center;justify-content:space-between;gap:var(--space-lg)}._logo_6kz3c_24{display:flex;align-items:center;text-decoration:none}._logoImage_6kz3c_30{height:2rem;width:auto}._navLinks_6kz3c_35{position:relative;display:flex;align-items:center;gap:var(--space-xl)}._navLink_6kz3c_35{position:relative;padding:var(--space-sm) var(--space-md);font-size:.95rem;font-weight:500;color:var(--md-sys-color-on-surface);text-decoration:none;opacity:.8;transition:opacity var(--transition-fast),color var(--transition-fast)}._navLink_6kz3c_35:hover,._navLink_6kz3c_35._active_6kz3c_58{opacity:1;color:var(--md-sys-color-primary)}._activeIndicator_6kz3c_63{position:absolute;bottom:0;left:0;width:4px;height:4px;border-radius:50%;background-color:var(--md-sys-color-primary);transform:translate(-50%);pointer-events:none}._actions_6kz3c_75{display:flex;align-items:center;gap:var(--space-md)}._langToggle_6kz3c_81{display:flex;align-items:center;gap:.25em;padding:var(--space-sm) var(--space-md);font-size:.85rem;font-weight:600;color:var(--md-sys-color-on-surface);background:transparent;border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-full);cursor:pointer;transition:border-color var(--transition-fast),background-color var(--transition-fast)}._langToggle_6kz3c_81:hover{border-color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container)}._langDivider_6kz3c_101{opacity:.5}._activeLang_6kz3c_105{color:var(--md-sys-color-primary)}._mobileMenuBtn_6kz3c_109{display:none;width:40px;height:40px;padding:0;background:transparent;border:none;cursor:pointer}._hamburger_6kz3c_119{position:relative;display:block;width:24px;height:2px;margin:0 auto;background-color:var(--md-sys-color-on-surface);border-radius:2px;transition:background-color var(--transition-fast)}._hamburger_6kz3c_119:before,._hamburger_6kz3c_119:after{content:"";position:absolute;left:0;width:24px;height:2px;background-color:var(--md-sys-color-on-surface);border-radius:2px;transition:transform var(--transition-normal)}._hamburger_6kz3c_119:before{top:-7px}._hamburger_6kz3c_119:after{bottom:-7px}._hamburger_6kz3c_119._open_6kz3c_150{background-color:transparent}._hamburger_6kz3c_119._open_6kz3c_150:before{transform:translateY(7px) rotate(45deg)}._hamburger_6kz3c_119._open_6kz3c_150:after{transform:translateY(-7px) rotate(-45deg)}@media(max-width:768px){._navLinks_6kz3c_35{position:fixed;top:70px;left:0;right:0;flex-direction:column;gap:0;padding:var(--space-lg);background-color:#0f1410fa;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--md-sys-color-outline-variant);transform:translateY(-100%);opacity:0;visibility:hidden;transition:transform var(--transition-normal),opacity var(--transition-normal),visibility var(--transition-normal)}._navLinks_6kz3c_35._open_6kz3c_150{transform:translateY(0);opacity:1;visibility:visible}._navLink_6kz3c_35{width:100%;padding:var(--space-md);text-align:center;font-size:1.1rem}._mobileMenuBtn_6kz3c_109{display:flex;align-items:center;justify-content:center}}._footer_qrb1s_1{margin-top:auto;padding:var(--space-2xl) 0;background-color:var(--md-sys-color-surface-container-lowest);border-top:1px solid var(--md-sys-color-outline-variant)}._content_qrb1s_8{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-lg)}._brand_qrb1s_16{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-sm)}._logoImage_qrb1s_23{height:1.75rem;width:auto}._copyright_qrb1s_28{font-size:.875rem;color:var(--md-sys-color-on-surface);opacity:.6}._links_qrb1s_34{display:flex;align-items:center;gap:var(--space-md)}._socialLink_qrb1s_40{display:flex;align-items:center;justify-content:center;width:44px;height:44px;color:var(--md-sys-color-on-surface);background-color:var(--md-sys-color-surface-container);border-radius:var(--radius-full);transition:color var(--transition-fast),background-color var(--transition-fast),transform var(--transition-fast)}._socialLink_qrb1s_40:hover{color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container-high);transform:translateY(-2px)}._credit_qrb1s_58{font-size:.875rem;color:var(--md-sys-color-on-surface);opacity:.6}._heart_qrb1s_64{color:var(--md-sys-color-primary);font-weight:500}@media(max-width:768px){._content_qrb1s_8{flex-direction:column;text-align:center}._brand_qrb1s_16{align-items:center}}._cursor_1b430_1{position:fixed;width:40px;height:40px;border:2px solid var(--md-sys-color-primary);border-radius:50%;pointer-events:none;z-index:9999;transform:translate(-50%,-50%);transition:width .15s ease-out,height .15s ease-out,border-color .15s ease-out,background-color .15s ease-out,opacity .15s ease-out;mix-blend-mode:difference}._cursorDot_1b430_19{position:fixed;width:6px;height:6px;background-color:var(--md-sys-color-primary);border-radius:50%;pointer-events:none;z-index:10000;transform:translate(-50%,-50%);transition:opacity .15s ease-out}._cursor_1b430_1._pointer_1b430_31{width:60px;height:60px;border-color:var(--md-sys-color-primary);background-color:#7fd9981a}._cursor_1b430_1._clicking_1b430_38{width:35px;height:35px;background-color:#7fd99833}._cursor_1b430_1._hidden_1b430_44,._cursorDot_1b430_19._hidden_1b430_44{opacity:0}@media(hover:none),(prefers-reduced-motion:reduce){._cursor_1b430_1,._cursorDot_1b430_19{display:none}}@media(hover:hover){body,a,button{cursor:none}}.gradient-blinds-container{position:relative;width:100%;height:100%;overflow:hidden}._button_yjd5k_1{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-sm);font-family:var(--md-sys-typescale-body-font);font-weight:600;border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}._button_yjd5k_1:disabled{opacity:.6;cursor:not-allowed}._sm_yjd5k_23{padding:var(--space-sm) var(--space-md);font-size:.875rem}._md_yjd5k_28{padding:var(--space-md) var(--space-xl);font-size:1rem}._lg_yjd5k_33{padding:var(--space-lg) var(--space-2xl);font-size:1.125rem}._primary_yjd5k_39{background-color:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}._primary_yjd5k_39:hover:not(:disabled){background-color:var(--md-sys-color-on-primary-container);box-shadow:0 4px 20px #7fd9984d}._secondary_yjd5k_49{background-color:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}._secondary_yjd5k_49:hover:not(:disabled){background-color:var(--md-sys-color-surface-container-highest)}._outline_yjd5k_58{background-color:transparent;color:var(--md-sys-color-primary);border:2px solid var(--md-sys-color-primary)}._outline_yjd5k_58:hover:not(:disabled){background-color:#7fd9981a}._loader_yjd5k_69{width:20px;height:20px;border:2px solid transparent;border-top-color:currentColor;border-radius:50%;animation:_spin_yjd5k_1 .8s linear infinite}@keyframes _spin_yjd5k_1{to{transform:rotate(360deg)}}._card_mghl3_1{position:relative;padding:var(--space-xl);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background-color var(--transition-fast)}._card_mghl3_1._hoverable_mghl3_13:hover{border-color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container-high);box-shadow:0 8px 32px #0000004d,0 0 0 1px #7fd9981a,inset 0 1px #7fd9981a}._icon_mghl3_22{display:flex;align-items:center;justify-content:center;width:56px;height:56px;margin-bottom:var(--space-lg);background-color:var(--md-sys-color-primary-container);border-radius:var(--radius-md);color:var(--md-sys-color-on-primary-container)}._icon_mghl3_22 svg{width:28px;height:28px}._title_mghl3_39{margin-bottom:var(--space-sm);font-size:1.25rem;font-weight:600;color:var(--md-sys-color-on-surface)}._description_mghl3_46{font-size:.95rem;line-height:1.6;color:var(--md-sys-color-on-surface);opacity:.75}._field_1azqc_1{display:flex;flex-direction:column;gap:var(--space-sm)}._label_1azqc_7{font-size:.875rem;font-weight:500;color:var(--md-sys-color-on-surface)}._input_1azqc_13{padding:var(--space-md);font-family:var(--md-sys-typescale-body-font);font-size:1rem;color:var(--md-sys-color-on-surface);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-md);transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background-color var(--transition-fast)}._input_1azqc_13::placeholder{color:var(--md-sys-color-outline)}._input_1azqc_13:hover{border-color:var(--md-sys-color-outline);background-color:var(--md-sys-color-surface-container-high)}._input_1azqc_13:focus{outline:none;border-color:var(--md-sys-color-primary);box-shadow:0 0 0 3px #7fd99826}._textarea_1azqc_42{min-height:150px;resize:vertical}._hasError_1azqc_47 ._input_1azqc_13{border-color:var(--md-sys-color-error)}._hasError_1azqc_47 ._input_1azqc_13:focus{box-shadow:0 0 0 3px #ffb4ab26}._error_1azqc_55{font-size:.8125rem;color:var(--md-sys-color-error)}._hero_lgffv_1{position:relative;display:flex;align-items:center;justify-content:center;height:100vh;height:100dvh;padding:var(--space-3xl) 0;overflow:hidden}._backgroundContainer_lgffv_12{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0}._content_lgffv_21{position:relative;z-index:1;display:flex;align-items:center;justify-content:center}._text_lgffv_29{max-width:800px;text-align:center}._greeting_lgffv_34{font-size:1.125rem;font-weight:500;color:var(--md-sys-color-primary);margin-bottom:var(--space-md);letter-spacing:.05em;text-transform:uppercase}._title_lgffv_43{font-size:clamp(2.5rem,6vw,5rem);font-weight:700;line-height:1.1;margin-bottom:var(--space-lg);background:linear-gradient(135deg,var(--md-sys-color-on-surface) 0%,var(--md-sys-color-primary) 50%,var(--md-sys-color-on-surface) 100%);background-size:200% auto;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;animation:_shimmer_lgffv_1 3s ease-in-out infinite}@keyframes _shimmer_lgffv_1{0%,to{background-position:0% center}50%{background-position:100% center}}._tagline_lgffv_70{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.5em;font-size:clamp(1.25rem,3vw,2rem);color:var(--md-sys-color-on-surface);opacity:.9;margin-bottom:var(--space-2xl)}._typed_lgffv_82{color:var(--md-sys-color-primary);font-weight:600;min-width:200px;text-align:left}._cursor_lgffv_89{display:inline-block;margin-left:2px;animation:_blink_lgffv_1 1s step-end infinite}@keyframes _blink_lgffv_1{0%,to{opacity:1}50%{opacity:0}}._cta_lgffv_104{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:var(--space-md)}._scrollIndicator_lgffv_112{position:absolute;bottom:var(--space-2xl);left:50%;transform:translate(-50%);z-index:1;display:flex;flex-direction:column;align-items:center;gap:var(--space-sm)}._scrollMouse_lgffv_124{width:26px;height:42px;border:2px solid var(--md-sys-color-outline);border-radius:13px;display:flex;justify-content:center;padding-top:8px}._scrollWheel_lgffv_134{width:4px;height:8px;background-color:var(--md-sys-color-primary);border-radius:2px}._scrollText_lgffv_141{font-size:.75rem;font-weight:500;color:var(--md-sys-color-on-surface);opacity:.4;text-transform:uppercase;letter-spacing:.1em}@media(max-width:768px){._typed_lgffv_82{min-width:auto;display:block;width:100%;text-align:center}._cta_lgffv_104{flex-direction:column}._cta_lgffv_104 a,._cta_lgffv_104 button{width:100%}}._services_1bb0v_1{padding:var(--space-3xl) 0;background-color:var(--md-sys-color-surface-container-lowest)}._header_1bb0v_6{text-align:center;margin-bottom:var(--space-3xl)}._title_1bb0v_11{font-size:clamp(2rem,4vw,3rem);font-weight:700;margin-bottom:var(--space-md);color:var(--md-sys-color-on-surface)}._subtitle_1bb0v_18{font-size:1.125rem;color:var(--md-sys-color-on-surface);opacity:.75;max-width:600px;margin:0 auto}._grid_1bb0v_26{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--space-xl)}@media(min-width:1024px){._grid_1bb0v_26{grid-template-columns:repeat(4,1fr)}}._about_1n62r_1{padding-top:80px}._hero_1n62r_6{padding:var(--space-3xl) 0;text-align:center;background:linear-gradient(180deg,var(--md-sys-color-surface-container-lowest) 0%,var(--md-sys-color-background) 100%)}._title_1n62r_16{font-size:clamp(2.5rem,5vw,4rem);font-weight:700;margin-bottom:var(--space-md)}._subtitle_1n62r_22{font-size:1.25rem;color:var(--md-sys-color-primary);font-weight:500}._intro_1n62r_29{padding:var(--space-3xl) 0}._introContent_1n62r_33{max-width:800px;margin:0 auto}._introText_1n62r_38{font-size:1.125rem;line-height:1.8;margin-bottom:var(--space-lg);color:var(--md-sys-color-on-surface);opacity:.9}._sectionHeader_1n62r_47{text-align:center;margin-bottom:var(--space-2xl)}._sectionHeader_1n62r_47 h2{font-size:clamp(1.75rem,3vw,2.5rem);margin-bottom:var(--space-sm)}._sectionHeader_1n62r_47 p{font-size:1rem;opacity:.75}._skills_1n62r_63{padding:var(--space-3xl) 0;background-color:var(--md-sys-color-surface-container-lowest)}._techGrid_1n62r_68{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-md);max-width:800px;margin:0 auto}._techCard_1n62r_76{display:flex;flex-direction:column;align-items:center;gap:var(--space-sm);padding:var(--space-lg);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);transition:border-color var(--transition-fast),background-color var(--transition-fast)}._techCard_1n62r_76:hover{border-color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container-high)}._techIcon_1n62r_93{font-size:2rem}._techName_1n62r_97{font-size:.875rem;font-weight:500;color:var(--md-sys-color-on-surface)}._values_1n62r_104{padding:var(--space-3xl) 0}._valuesGrid_1n62r_108{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:var(--space-xl)}._valueCard_1n62r_114{padding:var(--space-xl);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);transition:border-color var(--transition-fast)}._valueCard_1n62r_114:hover{border-color:var(--md-sys-color-primary)}._valueNumber_1n62r_126{font-size:2rem;font-weight:700;color:var(--md-sys-color-primary);opacity:.5;margin-bottom:var(--space-sm)}._valueTitle_1n62r_134{font-size:1.25rem;font-weight:600;margin-bottom:var(--space-sm)}._valueDescription_1n62r_140{font-size:.95rem;opacity:.75;line-height:1.6}._contact_1lm51_1{padding-top:80px}._hero_1lm51_6{padding:var(--space-3xl) 0;text-align:center;background:linear-gradient(180deg,var(--md-sys-color-surface-container-lowest) 0%,var(--md-sys-color-background) 100%)}._title_1lm51_16{font-size:clamp(2.5rem,5vw,4rem);font-weight:700;margin-bottom:var(--space-md)}._subtitle_1lm51_22{font-size:1.25rem;color:var(--md-sys-color-primary);font-weight:500}._content_1lm51_29{padding:var(--space-3xl) 0}._grid_1lm51_33{display:grid;grid-template-columns:1fr;gap:var(--space-3xl)}@media(min-width:768px){._grid_1lm51_33{grid-template-columns:1.5fr 1fr}}._formSection_1lm51_46{max-width:600px}._intro_1lm51_50{font-size:1.125rem;line-height:1.7;margin-bottom:var(--space-2xl);opacity:.9}._form_1lm51_46{display:flex;flex-direction:column;gap:var(--space-lg)}._success_1lm51_63{padding:var(--space-md);background-color:#7fd9981a;border:1px solid var(--md-sys-color-primary);border-radius:var(--radius-md);color:var(--md-sys-color-primary);font-size:.95rem}._error_1lm51_72{padding:var(--space-md);background-color:#ffb4ab1a;border:1px solid var(--md-sys-color-error);border-radius:var(--radius-md);color:var(--md-sys-color-error);font-size:.95rem}._infoSection_1lm51_82{padding:var(--space-xl);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);height:fit-content}._infoTitle_1lm51_90{font-size:1.5rem;font-weight:600;margin-bottom:var(--space-xl)}._infoList_1lm51_96{display:flex;flex-direction:column;gap:var(--space-xl)}._infoItem_1lm51_102{display:flex;align-items:flex-start;gap:var(--space-md)}._infoIcon_1lm51_108{display:flex;align-items:center;justify-content:center;width:44px;height:44px;background-color:var(--md-sys-color-primary-container);border-radius:var(--radius-md);color:var(--md-sys-color-on-primary-container);flex-shrink:0}._infoIcon_1lm51_108 svg{width:22px;height:22px}._infoItem_1lm51_102 h3{font-size:.875rem;font-weight:500;color:var(--md-sys-color-on-surface);opacity:.7;margin-bottom:var(--space-xs)}._infoItem_1lm51_102 a{font-size:1rem;color:var(--md-sys-color-primary);word-break:break-all}._infoItem_1lm51_102 a:hover{text-decoration:underline}:root{--md-sys-color-primary: #7FD998;--md-sys-color-on-primary: #003919;--md-sys-color-primary-container: #005227;--md-sys-color-on-primary-container: #9AF6B2;--md-sys-color-secondary: #B4CCB9;--md-sys-color-on-secondary: #202D24;--md-sys-color-secondary-container: #364339;--md-sys-color-on-secondary-container: #D0E8D4;--md-sys-color-tertiary: #F2B8B5;--md-sys-color-on-tertiary: #4C2524;--md-sys-color-tertiary-container: #6B3A39;--md-sys-color-on-tertiary-container: #FFDAD7;--md-sys-color-error: #FFB4AB;--md-sys-color-on-error: #690005;--md-sys-color-error-container: #93000A;--md-sys-color-on-error-container: #FFDAD6;--md-sys-color-background: #0F1410;--md-sys-color-on-background: #E1E3DF;--md-sys-color-surface: #0F1410;--md-sys-color-on-surface: #E1E3DF;--md-sys-color-surface-dim: #0F1410;--md-sys-color-surface-bright: #353A36;--md-sys-color-surface-container-lowest: #0A0F0B;--md-sys-color-surface-container-low: #171D18;--md-sys-color-surface-container: #1B211C;--md-sys-color-surface-container-high: #252B26;--md-sys-color-surface-container-highest: #303631;--md-sys-color-outline: #8B9389;--md-sys-color-outline-variant: #414942;--md-sys-color-inverse-surface: #E1E3DF;--md-sys-color-inverse-on-surface: #2E332F;--md-sys-color-inverse-primary: #006D36;--md-sys-color-shadow: #000000;--md-sys-color-scrim: #000000;--md-sys-typescale-display-font: "Inter", sans-serif;--md-sys-typescale-body-font: "Inter", sans-serif;--md-sys-typescale-code-font: "JetBrains Mono", monospace;--space-xs: .25rem;--space-sm: .5rem;--space-md: 1rem;--space-lg: 1.5rem;--space-xl: 2rem;--space-2xl: 3rem;--space-3xl: 4rem;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 16px;--radius-xl: 24px;--radius-full: 9999px;--transition-fast: .15s cubic-bezier(.4, 0, .2, 1);--transition-normal: .25s cubic-bezier(.4, 0, .2, 1);--transition-slow: .4s cubic-bezier(.4, 0, .2, 1);--container-sm: 640px;--container-md: 768px;--container-lg: 1024px;--container-xl: 1280px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--md-sys-typescale-body-font);background-color:var(--md-sys-color-background);color:var(--md-sys-color-on-background);line-height:1.6;min-height:100vh;overflow-x:hidden}#root{min-height:100vh;display:flex;flex-direction:column}h1,h2,h3,h4,h5,h6{font-family:var(--md-sys-typescale-display-font);font-weight:600;line-height:1.2;color:var(--md-sys-color-on-surface)}h1{font-size:clamp(2.5rem,5vw,4rem)}h2{font-size:clamp(2rem,4vw,3rem)}h3{font-size:clamp(1.5rem,3vw,2rem)}h4{font-size:clamp(1.25rem,2vw,1.5rem)}p{color:var(--md-sys-color-on-surface);opacity:.87}a{color:var(--md-sys-color-primary);text-decoration:none;transition:color var(--transition-fast)}a:hover{color:var(--md-sys-color-on-primary-container)}code{font-family:var(--md-sys-typescale-code-font);background:var(--md-sys-color-surface-container);padding:.2em .4em;border-radius:var(--radius-sm);font-size:.9em}:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}::selection{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--md-sys-color-surface-container)}::-webkit-scrollbar-thumb{background:var(--md-sys-color-outline);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--md-sys-color-outline-variant)}.container{width:100%;max-width:var(--container-xl);margin:0 auto;padding:0 var(--space-lg)}section{padding:var(--space-3xl) 0}.page-enter{opacity:0;transform:translateY(20px)}.page-enter-active{opacity:1;transform:translateY(0);transition:opacity .3s ease-out,transform .3s ease-out}@media(hover:none)and (pointer:coarse){.custom-cursor{display:none!important}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}html{scroll-behavior:auto}} diff --git a/build/assets/index-D4N8_we_.css b/build/assets/index-D4N8_we_.css deleted file mode 100644 index bf3037d..0000000 --- a/build/assets/index-D4N8_we_.css +++ /dev/null @@ -1 +0,0 @@ -._header_o0ezk_1{position:fixed;top:0;left:0;right:0;z-index:100;padding:var(--space-md) 0;transition:background-color var(--transition-normal),backdrop-filter var(--transition-normal)}._header_o0ezk_1._scrolled_o0ezk_11{background-color:#0f1410d9;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--md-sys-color-outline-variant)}._nav_o0ezk_17{display:flex;align-items:center;justify-content:space-between;gap:var(--space-lg)}._logo_o0ezk_24{display:flex;align-items:center;gap:.25em;font-size:1.5rem;font-weight:700;text-decoration:none;color:var(--md-sys-color-on-surface)}._logoText_o0ezk_34{color:var(--md-sys-color-on-surface)}._logoAccent_o0ezk_38{color:var(--md-sys-color-primary)}._navLinks_o0ezk_42{display:flex;align-items:center;gap:var(--space-xl)}._navLink_o0ezk_42{position:relative;padding:var(--space-sm) var(--space-md);font-size:.95rem;font-weight:500;color:var(--md-sys-color-on-surface);text-decoration:none;opacity:.8;transition:opacity var(--transition-fast),color var(--transition-fast)}._navLink_o0ezk_42:hover,._navLink_o0ezk_42._active_o0ezk_64{opacity:1;color:var(--md-sys-color-primary)}._activeIndicator_o0ezk_69{position:absolute;bottom:0;left:50%;transform:translate(-50%);width:4px;height:4px;border-radius:50%;background-color:var(--md-sys-color-primary)}._actions_o0ezk_80{display:flex;align-items:center;gap:var(--space-md)}._langToggle_o0ezk_86{display:flex;align-items:center;gap:.25em;padding:var(--space-sm) var(--space-md);font-size:.85rem;font-weight:600;color:var(--md-sys-color-on-surface);background:transparent;border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-full);cursor:pointer;transition:border-color var(--transition-fast),background-color var(--transition-fast)}._langToggle_o0ezk_86:hover{border-color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container)}._langDivider_o0ezk_106{opacity:.5}._activeLang_o0ezk_110{color:var(--md-sys-color-primary)}._mobileMenuBtn_o0ezk_114{display:none;width:40px;height:40px;padding:0;background:transparent;border:none;cursor:pointer}._hamburger_o0ezk_124{position:relative;display:block;width:24px;height:2px;margin:0 auto;background-color:var(--md-sys-color-on-surface);border-radius:2px;transition:background-color var(--transition-fast)}._hamburger_o0ezk_124:before,._hamburger_o0ezk_124:after{content:"";position:absolute;left:0;width:24px;height:2px;background-color:var(--md-sys-color-on-surface);border-radius:2px;transition:transform var(--transition-normal)}._hamburger_o0ezk_124:before{top:-7px}._hamburger_o0ezk_124:after{bottom:-7px}._hamburger_o0ezk_124._open_o0ezk_155{background-color:transparent}._hamburger_o0ezk_124._open_o0ezk_155:before{transform:translateY(7px) rotate(45deg)}._hamburger_o0ezk_124._open_o0ezk_155:after{transform:translateY(-7px) rotate(-45deg)}@media(max-width:768px){._navLinks_o0ezk_42{position:fixed;top:70px;left:0;right:0;flex-direction:column;gap:0;padding:var(--space-lg);background-color:#0f1410fa;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--md-sys-color-outline-variant);transform:translateY(-100%);opacity:0;visibility:hidden;transition:transform var(--transition-normal),opacity var(--transition-normal),visibility var(--transition-normal)}._navLinks_o0ezk_42._open_o0ezk_155{transform:translateY(0);opacity:1;visibility:visible}._navLink_o0ezk_42{width:100%;padding:var(--space-md);text-align:center;font-size:1.1rem}._mobileMenuBtn_o0ezk_114{display:flex;align-items:center;justify-content:center}}._footer_ala36_1{margin-top:auto;padding:var(--space-2xl) 0;background-color:var(--md-sys-color-surface-container-lowest);border-top:1px solid var(--md-sys-color-outline-variant)}._content_ala36_8{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-lg)}._brand_ala36_16{display:flex;flex-direction:column;gap:var(--space-sm)}._logo_ala36_22{display:flex;align-items:center;gap:.25em;font-size:1.25rem;font-weight:700}._logoText_ala36_30{color:var(--md-sys-color-on-surface)}._logoAccent_ala36_34{color:var(--md-sys-color-primary)}._copyright_ala36_38{font-size:.875rem;color:var(--md-sys-color-on-surface);opacity:.6}._links_ala36_44{display:flex;align-items:center;gap:var(--space-md)}._socialLink_ala36_50{display:flex;align-items:center;justify-content:center;width:44px;height:44px;color:var(--md-sys-color-on-surface);background-color:var(--md-sys-color-surface-container);border-radius:var(--radius-full);transition:color var(--transition-fast),background-color var(--transition-fast),transform var(--transition-fast)}._socialLink_ala36_50:hover{color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container-high);transform:translateY(-2px)}._credit_ala36_68{font-size:.875rem;color:var(--md-sys-color-on-surface);opacity:.6}._heart_ala36_74{color:var(--md-sys-color-primary);font-weight:500}@media(max-width:768px){._content_ala36_8{flex-direction:column;text-align:center}._brand_ala36_16{align-items:center}}._cursor_1b430_1{position:fixed;width:40px;height:40px;border:2px solid var(--md-sys-color-primary);border-radius:50%;pointer-events:none;z-index:9999;transform:translate(-50%,-50%);transition:width .15s ease-out,height .15s ease-out,border-color .15s ease-out,background-color .15s ease-out,opacity .15s ease-out;mix-blend-mode:difference}._cursorDot_1b430_19{position:fixed;width:6px;height:6px;background-color:var(--md-sys-color-primary);border-radius:50%;pointer-events:none;z-index:10000;transform:translate(-50%,-50%);transition:opacity .15s ease-out}._cursor_1b430_1._pointer_1b430_31{width:60px;height:60px;border-color:var(--md-sys-color-primary);background-color:#7fd9981a}._cursor_1b430_1._clicking_1b430_38{width:35px;height:35px;background-color:#7fd99833}._cursor_1b430_1._hidden_1b430_44,._cursorDot_1b430_19._hidden_1b430_44{opacity:0}@media(hover:none),(prefers-reduced-motion:reduce){._cursor_1b430_1,._cursorDot_1b430_19{display:none}}@media(hover:hover){body,a,button{cursor:none}}._container_kqnuj_1{position:absolute;top:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}._container_kqnuj_1 canvas{touch-action:none}@media(max-width:768px){._container_kqnuj_1{opacity:.5}}._button_yjd5k_1{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-sm);font-family:var(--md-sys-typescale-body-font);font-weight:600;border:none;border-radius:var(--radius-full);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast)}._button_yjd5k_1:disabled{opacity:.6;cursor:not-allowed}._sm_yjd5k_23{padding:var(--space-sm) var(--space-md);font-size:.875rem}._md_yjd5k_28{padding:var(--space-md) var(--space-xl);font-size:1rem}._lg_yjd5k_33{padding:var(--space-lg) var(--space-2xl);font-size:1.125rem}._primary_yjd5k_39{background-color:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}._primary_yjd5k_39:hover:not(:disabled){background-color:var(--md-sys-color-on-primary-container);box-shadow:0 4px 20px #7fd9984d}._secondary_yjd5k_49{background-color:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}._secondary_yjd5k_49:hover:not(:disabled){background-color:var(--md-sys-color-surface-container-highest)}._outline_yjd5k_58{background-color:transparent;color:var(--md-sys-color-primary);border:2px solid var(--md-sys-color-primary)}._outline_yjd5k_58:hover:not(:disabled){background-color:#7fd9981a}._loader_yjd5k_69{width:20px;height:20px;border:2px solid transparent;border-top-color:currentColor;border-radius:50%;animation:_spin_yjd5k_1 .8s linear infinite}@keyframes _spin_yjd5k_1{to{transform:rotate(360deg)}}._card_mghl3_1{position:relative;padding:var(--space-xl);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background-color var(--transition-fast)}._card_mghl3_1._hoverable_mghl3_13:hover{border-color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container-high);box-shadow:0 8px 32px #0000004d,0 0 0 1px #7fd9981a,inset 0 1px #7fd9981a}._icon_mghl3_22{display:flex;align-items:center;justify-content:center;width:56px;height:56px;margin-bottom:var(--space-lg);background-color:var(--md-sys-color-primary-container);border-radius:var(--radius-md);color:var(--md-sys-color-on-primary-container)}._icon_mghl3_22 svg{width:28px;height:28px}._title_mghl3_39{margin-bottom:var(--space-sm);font-size:1.25rem;font-weight:600;color:var(--md-sys-color-on-surface)}._description_mghl3_46{font-size:.95rem;line-height:1.6;color:var(--md-sys-color-on-surface);opacity:.75}._field_1azqc_1{display:flex;flex-direction:column;gap:var(--space-sm)}._label_1azqc_7{font-size:.875rem;font-weight:500;color:var(--md-sys-color-on-surface)}._input_1azqc_13{padding:var(--space-md);font-family:var(--md-sys-typescale-body-font);font-size:1rem;color:var(--md-sys-color-on-surface);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-md);transition:border-color var(--transition-fast),box-shadow var(--transition-fast),background-color var(--transition-fast)}._input_1azqc_13::placeholder{color:var(--md-sys-color-outline)}._input_1azqc_13:hover{border-color:var(--md-sys-color-outline);background-color:var(--md-sys-color-surface-container-high)}._input_1azqc_13:focus{outline:none;border-color:var(--md-sys-color-primary);box-shadow:0 0 0 3px #7fd99826}._textarea_1azqc_42{min-height:150px;resize:vertical}._hasError_1azqc_47 ._input_1azqc_13{border-color:var(--md-sys-color-error)}._hasError_1azqc_47 ._input_1azqc_13:focus{box-shadow:0 0 0 3px #ffb4ab26}._error_1azqc_55{font-size:.8125rem;color:var(--md-sys-color-error)}._hero_1fiuo_1{position:relative;display:flex;align-items:center;justify-content:center;height:100vh;height:100dvh;padding:var(--space-3xl) 0;overflow:hidden}._content_1fiuo_12{position:relative;z-index:1;display:flex;align-items:center;justify-content:center}._text_1fiuo_20{max-width:800px;text-align:center}._greeting_1fiuo_25{font-size:1.125rem;font-weight:500;color:var(--md-sys-color-primary);margin-bottom:var(--space-md);letter-spacing:.05em;text-transform:uppercase}._title_1fiuo_34{font-size:clamp(2.5rem,6vw,5rem);font-weight:700;line-height:1.1;margin-bottom:var(--space-lg);background:linear-gradient(135deg,var(--md-sys-color-on-surface) 0%,var(--md-sys-color-primary) 50%,var(--md-sys-color-on-surface) 100%);background-size:200% auto;-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;animation:_shimmer_1fiuo_1 3s ease-in-out infinite}@keyframes _shimmer_1fiuo_1{0%,to{background-position:0% center}50%{background-position:100% center}}._tagline_1fiuo_61{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.5em;font-size:clamp(1.25rem,3vw,2rem);color:var(--md-sys-color-on-surface);opacity:.9;margin-bottom:var(--space-2xl)}._typed_1fiuo_73{color:var(--md-sys-color-primary);font-weight:600;min-width:200px;text-align:left}._cursor_1fiuo_80{display:inline-block;margin-left:2px;animation:_blink_1fiuo_1 1s step-end infinite}@keyframes _blink_1fiuo_1{0%,to{opacity:1}50%{opacity:0}}._cta_1fiuo_95{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:var(--space-md)}._scrollIndicator_1fiuo_103{position:absolute;bottom:var(--space-2xl);left:50%;transform:translate(-50%);z-index:1;display:flex;flex-direction:column;align-items:center;gap:var(--space-sm)}._scrollMouse_1fiuo_115{width:26px;height:42px;border:2px solid var(--md-sys-color-outline);border-radius:13px;display:flex;justify-content:center;padding-top:8px}._scrollWheel_1fiuo_125{width:4px;height:8px;background-color:var(--md-sys-color-primary);border-radius:2px}._scrollText_1fiuo_132{font-size:.75rem;font-weight:500;color:var(--md-sys-color-on-surface);opacity:.4;text-transform:uppercase;letter-spacing:.1em}@media(max-width:768px){._typed_1fiuo_73{min-width:auto;display:block;width:100%;text-align:center}._cta_1fiuo_95{flex-direction:column}._cta_1fiuo_95 a,._cta_1fiuo_95 button{width:100%}}._services_1bb0v_1{padding:var(--space-3xl) 0;background-color:var(--md-sys-color-surface-container-lowest)}._header_1bb0v_6{text-align:center;margin-bottom:var(--space-3xl)}._title_1bb0v_11{font-size:clamp(2rem,4vw,3rem);font-weight:700;margin-bottom:var(--space-md);color:var(--md-sys-color-on-surface)}._subtitle_1bb0v_18{font-size:1.125rem;color:var(--md-sys-color-on-surface);opacity:.75;max-width:600px;margin:0 auto}._grid_1bb0v_26{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:var(--space-xl)}@media(min-width:1024px){._grid_1bb0v_26{grid-template-columns:repeat(4,1fr)}}._about_1n62r_1{padding-top:80px}._hero_1n62r_6{padding:var(--space-3xl) 0;text-align:center;background:linear-gradient(180deg,var(--md-sys-color-surface-container-lowest) 0%,var(--md-sys-color-background) 100%)}._title_1n62r_16{font-size:clamp(2.5rem,5vw,4rem);font-weight:700;margin-bottom:var(--space-md)}._subtitle_1n62r_22{font-size:1.25rem;color:var(--md-sys-color-primary);font-weight:500}._intro_1n62r_29{padding:var(--space-3xl) 0}._introContent_1n62r_33{max-width:800px;margin:0 auto}._introText_1n62r_38{font-size:1.125rem;line-height:1.8;margin-bottom:var(--space-lg);color:var(--md-sys-color-on-surface);opacity:.9}._sectionHeader_1n62r_47{text-align:center;margin-bottom:var(--space-2xl)}._sectionHeader_1n62r_47 h2{font-size:clamp(1.75rem,3vw,2.5rem);margin-bottom:var(--space-sm)}._sectionHeader_1n62r_47 p{font-size:1rem;opacity:.75}._skills_1n62r_63{padding:var(--space-3xl) 0;background-color:var(--md-sys-color-surface-container-lowest)}._techGrid_1n62r_68{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:var(--space-md);max-width:800px;margin:0 auto}._techCard_1n62r_76{display:flex;flex-direction:column;align-items:center;gap:var(--space-sm);padding:var(--space-lg);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);transition:border-color var(--transition-fast),background-color var(--transition-fast)}._techCard_1n62r_76:hover{border-color:var(--md-sys-color-primary);background-color:var(--md-sys-color-surface-container-high)}._techIcon_1n62r_93{font-size:2rem}._techName_1n62r_97{font-size:.875rem;font-weight:500;color:var(--md-sys-color-on-surface)}._values_1n62r_104{padding:var(--space-3xl) 0}._valuesGrid_1n62r_108{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:var(--space-xl)}._valueCard_1n62r_114{padding:var(--space-xl);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);transition:border-color var(--transition-fast)}._valueCard_1n62r_114:hover{border-color:var(--md-sys-color-primary)}._valueNumber_1n62r_126{font-size:2rem;font-weight:700;color:var(--md-sys-color-primary);opacity:.5;margin-bottom:var(--space-sm)}._valueTitle_1n62r_134{font-size:1.25rem;font-weight:600;margin-bottom:var(--space-sm)}._valueDescription_1n62r_140{font-size:.95rem;opacity:.75;line-height:1.6}._contact_1lm51_1{padding-top:80px}._hero_1lm51_6{padding:var(--space-3xl) 0;text-align:center;background:linear-gradient(180deg,var(--md-sys-color-surface-container-lowest) 0%,var(--md-sys-color-background) 100%)}._title_1lm51_16{font-size:clamp(2.5rem,5vw,4rem);font-weight:700;margin-bottom:var(--space-md)}._subtitle_1lm51_22{font-size:1.25rem;color:var(--md-sys-color-primary);font-weight:500}._content_1lm51_29{padding:var(--space-3xl) 0}._grid_1lm51_33{display:grid;grid-template-columns:1fr;gap:var(--space-3xl)}@media(min-width:768px){._grid_1lm51_33{grid-template-columns:1.5fr 1fr}}._formSection_1lm51_46{max-width:600px}._intro_1lm51_50{font-size:1.125rem;line-height:1.7;margin-bottom:var(--space-2xl);opacity:.9}._form_1lm51_46{display:flex;flex-direction:column;gap:var(--space-lg)}._success_1lm51_63{padding:var(--space-md);background-color:#7fd9981a;border:1px solid var(--md-sys-color-primary);border-radius:var(--radius-md);color:var(--md-sys-color-primary);font-size:.95rem}._error_1lm51_72{padding:var(--space-md);background-color:#ffb4ab1a;border:1px solid var(--md-sys-color-error);border-radius:var(--radius-md);color:var(--md-sys-color-error);font-size:.95rem}._infoSection_1lm51_82{padding:var(--space-xl);background-color:var(--md-sys-color-surface-container);border:1px solid var(--md-sys-color-outline-variant);border-radius:var(--radius-lg);height:fit-content}._infoTitle_1lm51_90{font-size:1.5rem;font-weight:600;margin-bottom:var(--space-xl)}._infoList_1lm51_96{display:flex;flex-direction:column;gap:var(--space-xl)}._infoItem_1lm51_102{display:flex;align-items:flex-start;gap:var(--space-md)}._infoIcon_1lm51_108{display:flex;align-items:center;justify-content:center;width:44px;height:44px;background-color:var(--md-sys-color-primary-container);border-radius:var(--radius-md);color:var(--md-sys-color-on-primary-container);flex-shrink:0}._infoIcon_1lm51_108 svg{width:22px;height:22px}._infoItem_1lm51_102 h3{font-size:.875rem;font-weight:500;color:var(--md-sys-color-on-surface);opacity:.7;margin-bottom:var(--space-xs)}._infoItem_1lm51_102 a{font-size:1rem;color:var(--md-sys-color-primary);word-break:break-all}._infoItem_1lm51_102 a:hover{text-decoration:underline}:root{--md-sys-color-primary: #7FD998;--md-sys-color-on-primary: #003919;--md-sys-color-primary-container: #005227;--md-sys-color-on-primary-container: #9AF6B2;--md-sys-color-secondary: #B4CCB9;--md-sys-color-on-secondary: #202D24;--md-sys-color-secondary-container: #364339;--md-sys-color-on-secondary-container: #D0E8D4;--md-sys-color-tertiary: #F2B8B5;--md-sys-color-on-tertiary: #4C2524;--md-sys-color-tertiary-container: #6B3A39;--md-sys-color-on-tertiary-container: #FFDAD7;--md-sys-color-error: #FFB4AB;--md-sys-color-on-error: #690005;--md-sys-color-error-container: #93000A;--md-sys-color-on-error-container: #FFDAD6;--md-sys-color-background: #0F1410;--md-sys-color-on-background: #E1E3DF;--md-sys-color-surface: #0F1410;--md-sys-color-on-surface: #E1E3DF;--md-sys-color-surface-dim: #0F1410;--md-sys-color-surface-bright: #353A36;--md-sys-color-surface-container-lowest: #0A0F0B;--md-sys-color-surface-container-low: #171D18;--md-sys-color-surface-container: #1B211C;--md-sys-color-surface-container-high: #252B26;--md-sys-color-surface-container-highest: #303631;--md-sys-color-outline: #8B9389;--md-sys-color-outline-variant: #414942;--md-sys-color-inverse-surface: #E1E3DF;--md-sys-color-inverse-on-surface: #2E332F;--md-sys-color-inverse-primary: #006D36;--md-sys-color-shadow: #000000;--md-sys-color-scrim: #000000;--md-sys-typescale-display-font: "Inter", sans-serif;--md-sys-typescale-body-font: "Inter", sans-serif;--md-sys-typescale-code-font: "JetBrains Mono", monospace;--space-xs: .25rem;--space-sm: .5rem;--space-md: 1rem;--space-lg: 1.5rem;--space-xl: 2rem;--space-2xl: 3rem;--space-3xl: 4rem;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 16px;--radius-xl: 24px;--radius-full: 9999px;--transition-fast: .15s cubic-bezier(.4, 0, .2, 1);--transition-normal: .25s cubic-bezier(.4, 0, .2, 1);--transition-slow: .4s cubic-bezier(.4, 0, .2, 1);--container-sm: 640px;--container-md: 768px;--container-lg: 1024px;--container-xl: 1280px}*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}html{scroll-behavior:smooth;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{font-family:var(--md-sys-typescale-body-font);background-color:var(--md-sys-color-background);color:var(--md-sys-color-on-background);line-height:1.6;min-height:100vh;overflow-x:hidden}#root{min-height:100vh;display:flex;flex-direction:column}h1,h2,h3,h4,h5,h6{font-family:var(--md-sys-typescale-display-font);font-weight:600;line-height:1.2;color:var(--md-sys-color-on-surface)}h1{font-size:clamp(2.5rem,5vw,4rem)}h2{font-size:clamp(2rem,4vw,3rem)}h3{font-size:clamp(1.5rem,3vw,2rem)}h4{font-size:clamp(1.25rem,2vw,1.5rem)}p{color:var(--md-sys-color-on-surface);opacity:.87}a{color:var(--md-sys-color-primary);text-decoration:none;transition:color var(--transition-fast)}a:hover{color:var(--md-sys-color-on-primary-container)}code{font-family:var(--md-sys-typescale-code-font);background:var(--md-sys-color-surface-container);padding:.2em .4em;border-radius:var(--radius-sm);font-size:.9em}:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}::selection{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}::-webkit-scrollbar{width:8px;height:8px}::-webkit-scrollbar-track{background:var(--md-sys-color-surface-container)}::-webkit-scrollbar-thumb{background:var(--md-sys-color-outline);border-radius:var(--radius-full)}::-webkit-scrollbar-thumb:hover{background:var(--md-sys-color-outline-variant)}.container{width:100%;max-width:var(--container-xl);margin:0 auto;padding:0 var(--space-lg)}section{padding:var(--space-3xl) 0}.page-enter{opacity:0;transform:translateY(20px)}.page-enter-active{opacity:1;transform:translateY(0);transition:opacity .3s ease-out,transform .3s ease-out}@media(hover:none)and (pointer:coarse){.custom-cursor{display:none!important}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}html{scroll-behavior:auto}} diff --git a/build/assets/index-DpUrPOvK.js b/build/assets/index-DpUrPOvK.js deleted file mode 100644 index 76bb10c..0000000 --- a/build/assets/index-DpUrPOvK.js +++ /dev/null @@ -1,3 +0,0 @@ -import{r as a,j as l,C as jn,u as Pt,F as Ln,M as Rn,R as G,c as kn}from"./three-A7r-9XvZ.js";import{g as Tn,s as St,i as Ct,a as Qe,b as jt,c as In,d as Mn,e as Nn,f as Dn,r as An,h as $n,j as Lt,k as Vn,l as On,m as Fn,o as zn,S as Wn,H as Bn,F,n as Hn,p as Rt,q as be,t as Un,u as Ze,v as A,w as kt,x as Gn,y as Kn,z as qn,A as we,B as $e,C as et,D as Yn,E as Jn,G as D,I as Xn,J as Qn,K as Zn,L as tt,M as er,N as tr,O as nr,P as rr,Q as pe,R as or,T as ir,U as Tt,V as sr,W as ar}from"./motion-BIOHP8Ul.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const o of document.querySelectorAll('link[rel="modulepreload"]'))r(o);new MutationObserver(o=>{for(const i of o)if(i.type==="childList")for(const s of i.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&r(s)}).observe(document,{childList:!0,subtree:!0});function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o.referrerPolicy&&(i.referrerPolicy=o.referrerPolicy),o.crossOrigin==="use-credentials"?i.credentials="include":o.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}})();var nt="popstate";function lr(e={}){function t(r,o){let{pathname:i,search:s,hash:c}=r.location;return Ve("",{pathname:i,search:s,hash:c},o.state&&o.state.usr||null,o.state&&o.state.key||"default")}function n(r,o){return typeof o=="string"?o:ie(o)}return ur(t,n,null,e)}function E(e,t){if(e===!1||e===null||typeof e>"u")throw new Error(t)}function N(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function cr(){return Math.random().toString(36).substring(2,10)}function rt(e,t){return{usr:e.state,key:e.key,idx:t}}function Ve(e,t,n=null,r){return{pathname:typeof e=="string"?e:e.pathname,search:"",hash:"",...typeof t=="string"?X(t):t,state:n,key:t&&t.key||r||cr()}}function ie({pathname:e="/",search:t="",hash:n=""}){return t&&t!=="?"&&(e+=t.charAt(0)==="?"?t:"?"+t),n&&n!=="#"&&(e+=n.charAt(0)==="#"?n:"#"+n),e}function X(e){let t={};if(e){let n=e.indexOf("#");n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf("?");r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function ur(e,t,n,r={}){let{window:o=document.defaultView,v5Compat:i=!1}=r,s=o.history,c="POP",u=null,m=h();m==null&&(m=0,s.replaceState({...s.state,idx:m},""));function h(){return(s.state||{idx:null}).idx}function d(){c="POP";let x=h(),b=x==null?null:x-m;m=x,u&&u({action:c,location:y.location,delta:b})}function f(x,b){c="PUSH";let v=Ve(y.location,x,b);m=h()+1;let w=rt(v,m),j=y.createHref(v);try{s.pushState(w,"",j)}catch(R){if(R instanceof DOMException&&R.name==="DataCloneError")throw R;o.location.assign(j)}i&&u&&u({action:c,location:y.location,delta:1})}function p(x,b){c="REPLACE";let v=Ve(y.location,x,b);m=h();let w=rt(v,m),j=y.createHref(v);s.replaceState(w,"",j),i&&u&&u({action:c,location:y.location,delta:0})}function g(x){return dr(x)}let y={get action(){return c},get location(){return e(o,s)},listen(x){if(u)throw new Error("A history only accepts one active listener");return o.addEventListener(nt,d),u=x,()=>{o.removeEventListener(nt,d),u=null}},createHref(x){return t(o,x)},createURL:g,encodeLocation(x){let b=g(x);return{pathname:b.pathname,search:b.search,hash:b.hash}},push:f,replace:p,go(x){return s.go(x)}};return y}function dr(e,t=!1){let n="http://localhost";typeof window<"u"&&(n=window.location.origin!=="null"?window.location.origin:window.location.href),E(n,"No window.location.(origin|href) available to create URL");let r=typeof e=="string"?e:ie(e);return r=r.replace(/ $/,"%20"),!t&&r.startsWith("//")&&(r=n+r),new URL(r,n)}function It(e,t,n="/"){return hr(e,t,n,!1)}function hr(e,t,n,r){let o=typeof t=="string"?X(t):t,i=V(o.pathname||"/",n);if(i==null)return null;let s=Mt(e);mr(s);let c=null;for(let u=0;c==null&&u{let h={relativePath:m===void 0?s.path||"":m,caseSensitive:s.caseSensitive===!0,childrenIndex:c,route:s};if(h.relativePath.startsWith("/")){if(!h.relativePath.startsWith(r)&&u)return;E(h.relativePath.startsWith(r),`Absolute route path "${h.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),h.relativePath=h.relativePath.slice(r.length)}let d=$([r,h.relativePath]),f=n.concat(h);s.children&&s.children.length>0&&(E(s.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${d}".`),Mt(s.children,t,f,d,u)),!(s.path==null&&!s.index)&&t.push({path:d,score:br(d,s.index),routesMeta:f})};return e.forEach((s,c)=>{if(s.path===""||!s.path?.includes("?"))i(s,c);else for(let u of Nt(s.path))i(s,c,!0,u)}),t}function Nt(e){let t=e.split("/");if(t.length===0)return[];let[n,...r]=t,o=n.endsWith("?"),i=n.replace(/\?$/,"");if(r.length===0)return o?[i,""]:[i];let s=Nt(r.join("/")),c=[];return c.push(...s.map(u=>u===""?i:[i,u].join("/"))),o&&c.push(...s),c.map(u=>e.startsWith("/")&&u===""?"/":u)}function mr(e){e.sort((t,n)=>t.score!==n.score?n.score-t.score:wr(t.routesMeta.map(r=>r.childrenIndex),n.routesMeta.map(r=>r.childrenIndex)))}var fr=/^:[\w-]+$/,pr=3,gr=2,vr=1,yr=10,xr=-2,ot=e=>e==="*";function br(e,t){let n=e.split("/"),r=n.length;return n.some(ot)&&(r+=xr),t&&(r+=gr),n.filter(o=>!ot(o)).reduce((o,i)=>o+(fr.test(i)?pr:i===""?vr:yr),r)}function wr(e,t){return e.length===t.length&&e.slice(0,-1).every((r,o)=>r===t[o])?e[e.length-1]-t[t.length-1]:0}function _r(e,t,n=!1){let{routesMeta:r}=e,o={},i="/",s=[];for(let c=0;c{if(h==="*"){let g=c[f]||"";s=i.slice(0,i.length-g.length).replace(/(.)\/+$/,"$1")}const p=c[f];return d&&!p?m[h]=void 0:m[h]=(p||"").replace(/%2F/g,"/"),m},{}),pathname:i,pathnameBase:s,pattern:e}}function Er(e,t=!1,n=!0){N(e==="*"||!e.endsWith("*")||e.endsWith("/*"),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,"/*")}".`);let r=[],o="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(s,c,u)=>(r.push({paramName:c,isOptional:u!=null}),u?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return e.endsWith("*")?(r.push({paramName:"*"}),o+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):n?o+="\\/*$":e!==""&&e!=="/"&&(o+="(?:(?=\\/|$))"),[new RegExp(o,t?void 0:"i"),r]}function Pr(e){try{return e.split("/").map(t=>decodeURIComponent(t).replace(/\//g,"%2F")).join("/")}catch(t){return N(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function V(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith("/")?t.length-1:t.length,r=e.charAt(n);return r&&r!=="/"?null:e.slice(n)||"/"}var Dt=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,Sr=e=>Dt.test(e);function Cr(e,t="/"){let{pathname:n,search:r="",hash:o=""}=typeof e=="string"?X(e):e,i;if(n)if(Sr(n))i=n;else{if(n.includes("//")){let s=n;n=n.replace(/\/\/+/g,"/"),N(!1,`Pathnames cannot have embedded double slashes - normalizing ${s} -> ${n}`)}n.startsWith("/")?i=it(n.substring(1),"/"):i=it(n,t)}else i=t;return{pathname:i,search:Rr(r),hash:kr(o)}}function it(e,t){let n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(o=>{o===".."?n.length>1&&n.pop():o!=="."&&n.push(o)}),n.length>1?n.join("/"):"/"}function Re(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function jr(e){return e.filter((t,n)=>n===0||t.route.path&&t.route.path.length>0)}function At(e){let t=jr(e);return t.map((n,r)=>r===t.length-1?n.pathname:n.pathnameBase)}function $t(e,t,n,r=!1){let o;typeof e=="string"?o=X(e):(o={...e},E(!o.pathname||!o.pathname.includes("?"),Re("?","pathname","search",o)),E(!o.pathname||!o.pathname.includes("#"),Re("#","pathname","hash",o)),E(!o.search||!o.search.includes("#"),Re("#","search","hash",o)));let i=e===""||o.pathname==="",s=i?"/":o.pathname,c;if(s==null)c=n;else{let d=t.length-1;if(!r&&s.startsWith("..")){let f=s.split("/");for(;f[0]==="..";)f.shift(),d-=1;o.pathname=f.join("/")}c=d>=0?t[d]:"/"}let u=Cr(o,c),m=s&&s!=="/"&&s.endsWith("/"),h=(i||s===".")&&n.endsWith("/");return!u.pathname.endsWith("/")&&(m||h)&&(u.pathname+="/"),u}var $=e=>e.join("/").replace(/\/\/+/g,"/"),Lr=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),Rr=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,kr=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e,Tr=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||"",this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function Ir(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}function Mr(e){return e.map(t=>t.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var Vt=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Ot(e,t){let n=e;if(typeof n!="string"||!Dt.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,o=!1;if(Vt)try{let i=new URL(window.location.href),s=n.startsWith("//")?new URL(i.protocol+n):new URL(n),c=V(s.pathname,t);s.origin===i.origin&&c!=null?n=c+s.search+s.hash:o=!0}catch{N(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:o,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Ft=["POST","PUT","PATCH","DELETE"];new Set(Ft);var Nr=["GET",...Ft];new Set(Nr);var Q=a.createContext(null);Q.displayName="DataRouter";var Ce=a.createContext(null);Ce.displayName="DataRouterState";var Dr=a.createContext(!1),zt=a.createContext({isTransitioning:!1});zt.displayName="ViewTransition";var Ar=a.createContext(new Map);Ar.displayName="Fetchers";var $r=a.createContext(null);$r.displayName="Await";var I=a.createContext(null);I.displayName="Navigation";var ae=a.createContext(null);ae.displayName="Location";var O=a.createContext({outlet:null,matches:[],isDataRoute:!1});O.displayName="Route";var Be=a.createContext(null);Be.displayName="RouteError";var Wt="REACT_ROUTER_ERROR",Vr="REDIRECT",Or="ROUTE_ERROR_RESPONSE";function Fr(e){if(e.startsWith(`${Wt}:${Vr}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t=="object"&&t&&typeof t.status=="number"&&typeof t.statusText=="string"&&typeof t.location=="string"&&typeof t.reloadDocument=="boolean"&&typeof t.replace=="boolean")return t}catch{}}function zr(e){if(e.startsWith(`${Wt}:${Or}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t=="object"&&t&&typeof t.status=="number"&&typeof t.statusText=="string")return new Tr(t.status,t.statusText,t.data)}catch{}}function Wr(e,{relative:t}={}){E(le(),"useHref() may be used only in the context of a component.");let{basename:n,navigator:r}=a.useContext(I),{hash:o,pathname:i,search:s}=ce(e,{relative:t}),c=i;return n!=="/"&&(c=i==="/"?n:$([n,i])),r.createHref({pathname:c,search:s,hash:o})}function le(){return a.useContext(ae)!=null}function z(){return E(le(),"useLocation() may be used only in the context of a component."),a.useContext(ae).location}var Bt="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Ht(e){a.useContext(I).static||a.useLayoutEffect(e)}function Br(){let{isDataRoute:e}=a.useContext(O);return e?no():Hr()}function Hr(){E(le(),"useNavigate() may be used only in the context of a component.");let e=a.useContext(Q),{basename:t,navigator:n}=a.useContext(I),{matches:r}=a.useContext(O),{pathname:o}=z(),i=JSON.stringify(At(r)),s=a.useRef(!1);return Ht(()=>{s.current=!0}),a.useCallback((u,m={})=>{if(N(s.current,Bt),!s.current)return;if(typeof u=="number"){n.go(u);return}let h=$t(u,JSON.parse(i),o,m.relative==="path");e==null&&t!=="/"&&(h.pathname=h.pathname==="/"?t:$([t,h.pathname])),(m.replace?n.replace:n.push)(h,m.state,m)},[t,n,i,o,e])}a.createContext(null);function ce(e,{relative:t}={}){let{matches:n}=a.useContext(O),{pathname:r}=z(),o=JSON.stringify(At(n));return a.useMemo(()=>$t(e,JSON.parse(o),r,t==="path"),[e,o,r,t])}function Ur(e,t){return Ut(e,t)}function Ut(e,t,n,r,o){E(le(),"useRoutes() may be used only in the context of a component.");let{navigator:i}=a.useContext(I),{matches:s}=a.useContext(O),c=s[s.length-1],u=c?c.params:{},m=c?c.pathname:"/",h=c?c.pathnameBase:"/",d=c&&c.route;{let v=d&&d.path||"";Kt(m,!d||v.endsWith("*")||v.endsWith("*?"),`You rendered descendant (or called \`useRoutes()\`) at "${m}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render. - -Please change the parent to .`)}let f=z(),p;if(t){let v=typeof t=="string"?X(t):t;E(h==="/"||v.pathname?.startsWith(h),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${h}" but pathname "${v.pathname}" was given in the \`location\` prop.`),p=v}else p=f;let g=p.pathname||"/",y=g;if(h!=="/"){let v=h.replace(/^\//,"").split("/");y="/"+g.replace(/^\//,"").split("/").slice(v.length).join("/")}let x=It(e,{pathname:y});N(d||x!=null,`No routes matched location "${p.pathname}${p.search}${p.hash}" `),N(x==null||x[x.length-1].route.element!==void 0||x[x.length-1].route.Component!==void 0||x[x.length-1].route.lazy!==void 0,`Matched leaf route at location "${p.pathname}${p.search}${p.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let b=Jr(x&&x.map(v=>Object.assign({},v,{params:Object.assign({},u,v.params),pathname:$([h,i.encodeLocation?i.encodeLocation(v.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:v.pathname]),pathnameBase:v.pathnameBase==="/"?h:$([h,i.encodeLocation?i.encodeLocation(v.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:v.pathnameBase])})),s,n,r,o);return t&&b?a.createElement(ae.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...p},navigationType:"POP"}},b):b}function Gr(){let e=to(),t=Ir(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r="rgba(200,200,200, 0.5)",o={padding:"0.5rem",backgroundColor:r},i={padding:"2px 4px",backgroundColor:r},s=null;return console.error("Error handled by React Router default ErrorBoundary:",e),s=a.createElement(a.Fragment,null,a.createElement("p",null,"💿 Hey developer 👋"),a.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",a.createElement("code",{style:i},"ErrorBoundary")," or"," ",a.createElement("code",{style:i},"errorElement")," prop on your route.")),a.createElement(a.Fragment,null,a.createElement("h2",null,"Unexpected Application Error!"),a.createElement("h3",{style:{fontStyle:"italic"}},t),n?a.createElement("pre",{style:o},n):null,s)}var Kr=a.createElement(Gr,null),Gt=class extends a.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!=="idle"&&e.revalidation==="idle"?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error!==void 0?e.error:t.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error("React Router caught the following error during render",e)}render(){let e=this.state.error;if(this.context&&typeof e=="object"&&e&&"digest"in e&&typeof e.digest=="string"){const n=zr(e.digest);n&&(e=n)}let t=e!==void 0?a.createElement(O.Provider,{value:this.props.routeContext},a.createElement(Be.Provider,{value:e,children:this.props.component})):this.props.children;return this.context?a.createElement(qr,{error:e},t):t}};Gt.contextType=Dr;var ke=new WeakMap;function qr({children:e,error:t}){let{basename:n}=a.useContext(I);if(typeof t=="object"&&t&&"digest"in t&&typeof t.digest=="string"){let r=Fr(t.digest);if(r){let o=ke.get(t);if(o)throw o;let i=Ot(r.location,n);if(Vt&&!ke.get(t))if(i.isExternal||r.reloadDocument)window.location.href=i.absoluteURL||i.to;else{const s=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:r.replace}));throw ke.set(t,s),s}return a.createElement("meta",{httpEquiv:"refresh",content:`0;url=${i.absoluteURL||i.to}`})}}return e}function Yr({routeContext:e,match:t,children:n}){let r=a.useContext(Q);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),a.createElement(O.Provider,{value:e},n)}function Jr(e,t=[],n=null,r=null,o=null){if(e==null){if(!n)return null;if(n.errors)e=n.matches;else if(t.length===0&&!n.initialized&&n.matches.length>0)e=n.matches;else return null}let i=e,s=n?.errors;if(s!=null){let h=i.findIndex(d=>d.route.id&&s?.[d.route.id]!==void 0);E(h>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(s).join(",")}`),i=i.slice(0,Math.min(i.length,h+1))}let c=!1,u=-1;if(n)for(let h=0;h=0?i=i.slice(0,u+1):i=[i[0]];break}}}let m=n&&r?(h,d)=>{r(h,{location:n.location,params:n.matches?.[0]?.params??{},unstable_pattern:Mr(n.matches),errorInfo:d})}:void 0;return i.reduceRight((h,d,f)=>{let p,g=!1,y=null,x=null;n&&(p=s&&d.route.id?s[d.route.id]:void 0,y=d.route.errorElement||Kr,c&&(u<0&&f===0?(Kt("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),g=!0,x=null):u===f&&(g=!0,x=d.route.hydrateFallbackElement||null)));let b=t.concat(i.slice(0,f+1)),v=()=>{let w;return p?w=y:g?w=x:d.route.Component?w=a.createElement(d.route.Component,null):d.route.element?w=d.route.element:w=h,a.createElement(Yr,{match:d,routeContext:{outlet:h,matches:b,isDataRoute:n!=null},children:w})};return n&&(d.route.ErrorBoundary||d.route.errorElement||f===0)?a.createElement(Gt,{location:n.location,revalidation:n.revalidation,component:y,error:p,children:v(),routeContext:{outlet:null,matches:b,isDataRoute:!0},onError:m}):v()},null)}function He(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function Xr(e){let t=a.useContext(Q);return E(t,He(e)),t}function Qr(e){let t=a.useContext(Ce);return E(t,He(e)),t}function Zr(e){let t=a.useContext(O);return E(t,He(e)),t}function Ue(e){let t=Zr(e),n=t.matches[t.matches.length-1];return E(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function eo(){return Ue("useRouteId")}function to(){let e=a.useContext(Be),t=Qr("useRouteError"),n=Ue("useRouteError");return e!==void 0?e:t.errors?.[n]}function no(){let{router:e}=Xr("useNavigate"),t=Ue("useNavigate"),n=a.useRef(!1);return Ht(()=>{n.current=!0}),a.useCallback(async(o,i={})=>{N(n.current,Bt),n.current&&(typeof o=="number"?await e.navigate(o):await e.navigate(o,{fromRouteId:t,...i}))},[e,t])}var st={};function Kt(e,t,n){!t&&!st[e]&&(st[e]=!0,N(!1,n))}a.memo(ro);function ro({routes:e,future:t,state:n,onError:r}){return Ut(e,void 0,n,r,t)}function ge(e){E(!1,"A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .")}function oo({basename:e="/",children:t=null,location:n,navigationType:r="POP",navigator:o,static:i=!1,unstable_useTransitions:s}){E(!le(),"You cannot render a inside another . You should never have more than one in your app.");let c=e.replace(/^\/*/,"/"),u=a.useMemo(()=>({basename:c,navigator:o,static:i,unstable_useTransitions:s,future:{}}),[c,o,i,s]);typeof n=="string"&&(n=X(n));let{pathname:m="/",search:h="",hash:d="",state:f=null,key:p="default"}=n,g=a.useMemo(()=>{let y=V(m,c);return y==null?null:{location:{pathname:y,search:h,hash:d,state:f,key:p},navigationType:r}},[c,m,h,d,f,p,r]);return N(g!=null,` is not able to match the URL "${m}${h}${d}" because it does not start with the basename, so the won't render anything.`),g==null?null:a.createElement(I.Provider,{value:u},a.createElement(ae.Provider,{children:t,value:g}))}function io({children:e,location:t}){return Ur(Oe(e),t)}function Oe(e,t=[]){let n=[];return a.Children.forEach(e,(r,o)=>{if(!a.isValidElement(r))return;let i=[...t,o];if(r.type===a.Fragment){n.push.apply(n,Oe(r.props.children,i));return}E(r.type===ge,`[${typeof r.type=="string"?r.type:r.type.name}] is not a component. All component children of must be a or `),E(!r.props.index||!r.props.children,"An index route cannot have child routes.");let s={id:r.props.id||i.join("-"),caseSensitive:r.props.caseSensitive,element:r.props.element,Component:r.props.Component,index:r.props.index,path:r.props.path,middleware:r.props.middleware,loader:r.props.loader,action:r.props.action,hydrateFallbackElement:r.props.hydrateFallbackElement,HydrateFallback:r.props.HydrateFallback,errorElement:r.props.errorElement,ErrorBoundary:r.props.ErrorBoundary,hasErrorBoundary:r.props.hasErrorBoundary===!0||r.props.ErrorBoundary!=null||r.props.errorElement!=null,shouldRevalidate:r.props.shouldRevalidate,handle:r.props.handle,lazy:r.props.lazy};r.props.children&&(s.children=Oe(r.props.children,i)),n.push(s)}),n}var ve="get",ye="application/x-www-form-urlencoded";function je(e){return typeof HTMLElement<"u"&&e instanceof HTMLElement}function so(e){return je(e)&&e.tagName.toLowerCase()==="button"}function ao(e){return je(e)&&e.tagName.toLowerCase()==="form"}function lo(e){return je(e)&&e.tagName.toLowerCase()==="input"}function co(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function uo(e,t){return e.button===0&&(!t||t==="_self")&&!co(e)}var he=null;function ho(){if(he===null)try{new FormData(document.createElement("form"),0),he=!1}catch{he=!0}return he}var mo=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function Te(e){return e!=null&&!mo.has(e)?(N(!1,`"${e}" is not a valid \`encType\` for \`
\`/\`\` and will default to "${ye}"`),null):e}function fo(e,t){let n,r,o,i,s;if(ao(e)){let c=e.getAttribute("action");r=c?V(c,t):null,n=e.getAttribute("method")||ve,o=Te(e.getAttribute("enctype"))||ye,i=new FormData(e)}else if(so(e)||lo(e)&&(e.type==="submit"||e.type==="image")){let c=e.form;if(c==null)throw new Error('Cannot submit a