{
  "browserTitle": "Jordan & Dani | Adventure-Driven Photographers & Directors",
  "copyright": "DIRECTORS | PHOTOGRAPHERS",
  "metaDescription": "Jordan & Dani are photographers and directors passionate about capturing authentic stories through bold, cinematic visuals. They specialize in outdoor adventure, lifestyle, and automotive advertising, blending artistry with real, unscripted moments. Their work brings energy and emotion to every frame, creating immersive stories that inspire exploration.",
  "metaKeywords": "Jordan and Dani, adventure photographers, commercial directors, outdoor lifestyle photography, automotive advertising photography, adventure film directors, commercial photography duo, lifestyle advertising, sports photography, cinematic storytelling",
  "backgroundImages": [],
  "filters": [
    "HOME",
    "Social Media Links",
    "JD Photo Index Links",
    "JD Personal Index Links",
    "JD Projects Index Links"
  ],
  "portfolioEmailMessage": "Hi J&D",
  "socialLinks": [
    {
      "type": "instagram",
      "url": "https://www.instagram.com/jordanxdani/",
      "label": "Instagram"
    }
  ],
  "useHTML": true,
  "globalBrowserTitle": false,
  "facebookImage": "jordandani-og-home.jpg",
  "facebookAdmins": "",
  "facebookUseMeta": true,
  "podUseDesktop": true,
  "padUseDesktop": true,
  "generalEmail": "hello@jordandani.com",
  "inquiryTitle": "",
  "inquiryInfo": "",
  "lang": "en",
  "advancedSeo": true,
  "adminSortDefault": "dateAdded descending",
  "enablePinterest": false,
  "currentTemplate": 2,
  "enableCookieBanner": false,
  "cookieBannerPosition": "bottom",
  "cookieBannerLink": "",
  "cookieBannerMessage": "By continuing to visit this site you agree to our use of cookies.",
  "siteHead": "<link rel=\"stylesheet\" href=\"https://use.typekit.net/ava3izu.css\">\n<!-- JD_SEO_PRELOAD_V1 -->\n<!-- critical origins -->\n<link rel=\"dns-prefetch\" href=\"//use.typekit.net\">\n<link rel=\"dns-prefetch\" href=\"//cdn.prod.website-files.com\">\n<link rel=\"dns-prefetch\" href=\"//static.photofolio.com\">\n<link rel=\"dns-prefetch\" href=\"//jordandani.s3.us-west-2.amazonaws.com\">\n<link rel=\"preconnect\" href=\"https://use.typekit.net\" crossorigin=\"\">\n<link rel=\"preconnect\" href=\"https://cdn.prod.website-files.com\" crossorigin=\"\">\n<link rel=\"preconnect\" href=\"https://static.photofolio.com\" crossorigin=\"\">\n<link rel=\"preload\" as=\"font\" type=\"font/otf\" href=\"/pf-media/MidnightSansSt36Heavy.otf\" crossorigin=\"\">\n<link rel=\"preload\" as=\"font\" type=\"font/otf\" href=\"/pf-media/MidnightSansRd36Heavy.otf\" crossorigin=\"\">\n<link rel=\"preload\" as=\"image\" href=\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/6732322489e2b00afce86696_jd_logo_ampersandMark_pine.svg\" fetchpriority=\"high\">\n<link rel=\"preload\" as=\"image\" href=\"/pf-media/altitude__image.jpg\" fetchpriority=\"high\">\n<link rel=\"prefetch\" as=\"fetch\" href=\"/pf-data/sections.json\" crossorigin=\"\">\n<link rel=\"prefetch\" as=\"fetch\" href=\"/pf-data/media.json\" crossorigin=\"\">\n<!-- /JD_SEO_PRELOAD_V1 -->\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<!-- JD_SEO_CORE_V1 -->\n<link rel=\"icon\" href=\"https://jordandani.live.photofolio.com/pf-media/jordandani-favicon.png\" type=\"image/png\">\n<link rel=\"shortcut icon\" href=\"https://jordandani.live.photofolio.com/pf-media/jordandani-favicon.png\" type=\"image/png\">\n<link rel=\"apple-touch-icon\" href=\"https://jordandani.live.photofolio.com/pf-media/jordandani-webclip.jpg\">\n<meta property=\"og:image\" content=\"https://jordandani.live.photofolio.com/pf-media/jordandani-og-home.jpg\">\n<meta name=\"twitter:card\" content=\"summary_large_image\">\n<meta name=\"twitter:image\" content=\"https://jordandani.live.photofolio.com/pf-media/jordandani-og-home.jpg\">\n<!-- /JD_SEO_CORE_V1 -->\n<!-- JD_SEO_CORE_V1 -->\n<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@graph\": [\n    {\n      \"@type\": [\n        \"ProfessionalService\",\n        \"Organization\"\n      ],\n      \"@id\": \"https://www.jordandani.com/#business\",\n      \"name\": \"Jordan & Dani\",\n      \"url\": \"https://www.jordandani.com/\",\n      \"email\": \"hello@jordandani.com\",\n      \"image\": [\n        \"https://www.jordandani.com/pf-media/jordandani-og-home.jpg\"\n      ],\n      \"logo\": \"https://www.jordandani.com/pf-media/jordandani-og-home.jpg\",\n      \"sameAs\": [\n        \"https://www.instagram.com/jordanxdani/\"\n      ],\n      \"description\": \"Jordan & Dani are photographers and directors passionate about capturing authentic stories through bold, cinematic visuals. They specialize in outdoor adventure, lifestyle, and automotive advertising, blending artistry with real, unscripted moments. Their work brings energy and emotion to every frame, creating immersive stories that inspire exploration.\",\n      \"areaServed\": [\n        {\n          \"@type\": \"Place\",\n          \"name\": \"United States\"\n        },\n        {\n          \"@type\": \"Place\",\n          \"name\": \"Worldwide\"\n        }\n      ],\n      \"knowsAbout\": [\n        \"Adventure photography\",\n        \"Lifestyle photography\",\n        \"Automotive advertising\",\n        \"Commercial directing\",\n        \"Outdoor sports photography\",\n        \"Cinematic storytelling\"\n      ],\n      \"hasOfferCatalog\": {\n        \"@type\": \"OfferCatalog\",\n        \"name\": \"Photography & directing\",\n        \"itemListElement\": [\n          {\n            \"@type\": \"Offer\",\n            \"itemOffered\": {\n              \"@type\": \"Service\",\n              \"name\": \"Adventure photography\"\n            }\n          },\n          {\n            \"@type\": \"Offer\",\n            \"itemOffered\": {\n              \"@type\": \"Service\",\n              \"name\": \"Lifestyle photography\"\n            }\n          },\n          {\n            \"@type\": \"Offer\",\n            \"itemOffered\": {\n              \"@type\": \"Service\",\n              \"name\": \"Automotive advertising\"\n            }\n          },\n          {\n            \"@type\": \"Offer\",\n            \"itemOffered\": {\n              \"@type\": \"Service\",\n              \"name\": \"Commercial directing\"\n            }\n          },\n          {\n            \"@type\": \"Offer\",\n            \"itemOffered\": {\n              \"@type\": \"Service\",\n              \"name\": \"Outdoor sports photography\"\n            }\n          },\n          {\n            \"@type\": \"Offer\",\n            \"itemOffered\": {\n              \"@type\": \"Service\",\n              \"name\": \"Cinematic storytelling\"\n            }\n          }\n        ]\n      }\n    },\n    {\n      \"@type\": \"WebSite\",\n      \"@id\": \"https://www.jordandani.com/#website\",\n      \"url\": \"https://www.jordandani.com/\",\n      \"name\": \"Jordan & Dani | Adventure-Driven Photographers & Directors\",\n      \"description\": \"Jordan & Dani are photographers and directors passionate about capturing authentic stories through bold, cinematic visuals. They specialize in outdoor adventure, lifestyle, and automotive advertising, blending artistry with real, unscripted moments. Their work brings energy and emotion to every frame, creating immersive stories that inspire exploration.\",\n      \"publisher\": {\n        \"@id\": \"https://www.jordandani.com/#business\"\n      },\n      \"inLanguage\": \"en-US\",\n      \"hasPart\": [\n        {\n          \"@id\": \"https://www.jordandani.com/PHOTO/thumbs#nav\"\n        },\n        {\n          \"@id\": \"https://www.jordandani.com/MOTION/thumbs#nav\"\n        },\n        {\n          \"@id\": \"https://www.jordandani.com/COMMISIONS/thumbs#nav\"\n        },\n        {\n          \"@id\": \"https://www.jordandani.com/CONTACT-+-INFO#nav\"\n        }\n      ]\n    },\n    {\n      \"@type\": \"SiteNavigationElement\",\n      \"@id\": \"https://www.jordandani.com/PHOTO/thumbs#nav\",\n      \"name\": \"Photo\",\n      \"url\": \"https://www.jordandani.com/PHOTO/thumbs\",\n      \"position\": 1,\n      \"isPartOf\": {\n        \"@id\": \"https://www.jordandani.com/#website\"\n      }\n    },\n    {\n      \"@type\": \"SiteNavigationElement\",\n      \"@id\": \"https://www.jordandani.com/MOTION/thumbs#nav\",\n      \"name\": \"Motion\",\n      \"url\": \"https://www.jordandani.com/MOTION/thumbs\",\n      \"position\": 2,\n      \"isPartOf\": {\n        \"@id\": \"https://www.jordandani.com/#website\"\n      }\n    },\n    {\n      \"@type\": \"SiteNavigationElement\",\n      \"@id\": \"https://www.jordandani.com/COMMISIONS/thumbs#nav\",\n      \"name\": \"Commissions\",\n      \"url\": \"https://www.jordandani.com/COMMISIONS/thumbs\",\n      \"position\": 3,\n      \"isPartOf\": {\n        \"@id\": \"https://www.jordandani.com/#website\"\n      }\n    },\n    {\n      \"@type\": \"SiteNavigationElement\",\n      \"@id\": \"https://www.jordandani.com/CONTACT-+-INFO#nav\",\n      \"name\": \"Info + Contact\",\n      \"url\": \"https://www.jordandani.com/CONTACT-+-INFO\",\n      \"position\": 4,\n      \"isPartOf\": {\n        \"@id\": \"https://www.jordandani.com/#website\"\n      }\n    },\n    {\n      \"@type\": \"CollectionPage\",\n      \"@id\": \"https://www.jordandani.com/PHOTO/thumbs#webpage\",\n      \"url\": \"https://www.jordandani.com/PHOTO/thumbs\",\n      \"name\": \"Photo | Visual Storytelling Through Bold Imagery | Jordan & Dani\",\n      \"description\": \"A visual archive of Jordan & Dani’s most powerful still photography & directing, blending action, lifestyle, and storytelling & direction.\",\n      \"isPartOf\": {\n        \"@id\": \"https://www.jordandani.com/#website\"\n      },\n      \"about\": {\n        \"@id\": \"https://www.jordandani.com/#business\"\n      }\n    },\n    {\n      \"@type\": \"CollectionPage\",\n      \"@id\": \"https://www.jordandani.com/MOTION/thumbs#webpage\",\n      \"url\": \"https://www.jordandani.com/MOTION/thumbs\",\n      \"name\": \"Directing & Motion | Cinematic Storytelling & Adventure Films | Jordan & Dani\",\n      \"description\": \"A collection of stunning directing & motion projects blending adventure, cinematic storytelling & direction, and captivating visuals.\",\n      \"isPartOf\": {\n        \"@id\": \"https://www.jordandani.com/#website\"\n      },\n      \"about\": {\n        \"@id\": \"https://www.jordandani.com/#business\"\n      }\n    },\n    {\n      \"@type\": \"ContactPage\",\n      \"@id\": \"https://www.jordandani.com/CONTACT-+-INFO#webpage\",\n      \"url\": \"https://www.jordandani.com/CONTACT-+-INFO\",\n      \"name\": \"Info + Contact | Work With Jordan & Dani | Photographers & Directors\",\n      \"description\": \"Get in touch with Jordan & Dani to collaborate on photography, film, & directing projects.\",\n      \"isPartOf\": {\n        \"@id\": \"https://www.jordandani.com/#website\"\n      },\n      \"about\": {\n        \"@id\": \"https://www.jordandani.com/#business\"\n      }\n    }\n  ]\n}\n</script>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
  "siteBody": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n",
  "customFonts": [
    "Montserrat:100:latin:google",
    "Montserrat:300:latin:google",
    "Montserrat:700:latin:google"
  ],
  "favicon": "jordandani-favicon.png",
  "blogSectionId": "",
  "logoFile": "",
  "logoText": "Glycia",
  "logoHtml": "<svg preserveAspectRatio=\"xMidYMid meet\" id=\"jordan-dani-logo\" viewBox=\"-4 -4 465.8 165.3\" xmlns=\"http://www.w3.org/2000/svg\" width=\"300\" height=\"106\" aria-label=\"Jordan Dani\"><g id=\"logo-fill\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"1.5\"><path d=\"m191.4 111.8c0 1.5-1.2 1.9-2.8 2.9-2.6 1.6-4.1 3.8-5.2 6.7-1.6 4.3-2.6 9.3-5.1 14.1-.1.2-.2.4-.2.6s.3.4.4.6c1.7 1.4 2.8 2.5 3.8 3.7 4.3 5 6 9.3 6 13.9 0 1.2-.7 1.8-2 1.8h-9.1c-1.5 0-2-.6-2.2-1.7-.6-2.5-1.8-4.6-3.8-6.6-.1-.1-.2-.2-.5-.2-.2 0-.3.1-.4.2-6 6.5-15.4 9.4-24.3 9.4-15.1 0-29-9.1-29-23.6 0-8.4 5.4-16.1 14.2-18.8-1.6-3.3-2.5-6.2-2.5-10 0-12.5 10.7-19.5 21.1-19.5 5.6 0 10.9 1.3 13.7 4.5 1.5 1.7 1.9 5.1 1.9 7.9 0 4.4-.3 8-3.9 8-1.9 0-2.7-.6-3.6-2.1-.8-1.4-2.1-5.1-4.2-7.5-1.6-2-3.4-3.5-6.9-3.5-3.8 0-7.8 3.3-7.8 8.9 0 7.2 7 12.9 18.3 20.2 5.6 3.6 10.7 7.1 14.6 9.9.3.2.6.3.6.3 1.2-2 1.9-5.6 1.9-7.9 0-4.4-2-7.2-6.1-9.4-2-1-2.7-1.7-2.7-2.9 0-1.5 1.2-2.4 3.7-2.4h18.7c2 .1 3.4.8 3.4 2.5zm-26.2 31.8c0-.1 0-.2-.2-.4-8.6-6.4-22.7-13.9-30-22.6-.1-.1-.2-.2-.4-.2-.1 0-.3 0-.6.3-2.1 2.9-3 6.1-3 9.2 0 10.5 9.3 19.2 20.5 19.2 4.9 0 9.9-1.8 13.6-5.1-.1-.1.1-.2.1-.4z\"/><path d=\"m204.1 156.3c-1.2 0-2-.8-2-2v-66.3c0-1.2.8-2 2-2h30.6c22.2 0 36 12 36 34.1v2c0 22.2-13.8 34.3-36 34.3h-30.6zm29.2-17.9c9.4 0 14.6-5.7 14.6-14.8v-5.1c0-9.1-5.1-14.7-14.6-14.7h-7.6c-.6 0-1 .4-1 1v32.6c0 .6.4 1 1 1z\"/><path d=\"m273.5 156.3c-2.1 0-2.5-1.4-1.8-3l24.2-64.6c.7-1.8 1.9-2.7 3.8-2.7h20.9c1.9 0 3.1.9 3.8 2.7l24.3 64.6c.6 1.6.3 3-1.8 3h-18.4c-1.6 0-2.6-.8-3.1-2.3l-3.2-8.8c-.4-1-1-1.5-2-1.5h-20.1c-1 0-1.6.5-2 1.5l-3.2 8.8c-.5 1.5-1.5 2.3-3.1 2.3zm41.7-29.2c.7 0 1.3-.5 1-1.3l-5.2-16.3c-.3-.7-1.3-.7-1.5 0l-5.3 16.3c-.2.8.3 1.3 1 1.3z\"/><path d=\"m356.8 156.3c-1.2 0-2-.8-2-2v-66.3c0-1.2.8-2 2-2h18.7c1.6 0 2.5.5 3.4 1.8l23.7 35.1c.5.7 1.4.6 1.4-.3v-34.6c0-1.2.8-2 2-2h18c1.2 0 2 .8 2 2v66.3c0 1.2-.8 2-2 2h-19.7c-1.6 0-2.5-.5-3.4-1.9l-22.6-34.4c-.5-.8-1.4-.6-1.4.3v34c0 1.2-.8 2-2 2z\"/><path d=\"m437.3 156.3c-1.2 0-2-.8-2-2v-66.3c0-1.3.8-2 2-2h18.5c1.3 0 2 .7 2 2v66.3c0 1.2-.7 2-2 2z\"/><path d=\"m32.2 73.4c-23.2 0-32.2-13.3-32.2-29.4v-1.8c0-1.2.8-2 2-2h18.5c1.2 0 2 .8 2 2v1.9c0 7.5 5.1 11.5 11.4 11.5h.1c6.8 0 11.3-4.5 11.3-14.1v-38c0-1.2.8-2 2-2h18.5c1.2 0 2 .8 2 2v36.6c0 20.7-12.1 33.3-32.7 33.3z\"/><path d=\"m111.7 73.4c-20.5 0-35.8-13.4-35.8-35.7v-2c0-22.3 15.2-35.7 35.9-35.7h3c20.6 0 35.9 13.4 35.9 35.7v2c0 22.3-15.3 35.7-35.8 35.7zm16.1-35.2v-3c0-12.1-5.7-17.5-14.6-17.5s-14.6 5.4-14.6 17.5v3c0 12.1 5.7 17.4 14.6 17.4s14.6-5.3 14.6-17.4z\"/><path d=\"m160.8 71.9c-1.2 0-2-.8-2-2v-66.4c0-1.2.8-2 2-2h35.5c17.7 0 27.3 8.7 27.3 23.2 0 8.3-3.4 14.1-9.2 18.3-.6.5-.7 1.3-.4 2.1l12 24.6c.6 1.2 0 2.1-1.3 2.1h-19.6c-1.2 0-2-.6-2.6-1.9l-9.6-19.6c-.4-.7-.9-1.1-2-1.1h-8.5c-.6 0-1 .4-1 1v19.6c0 1.2-.8 2-2 2h-18.6zm32.9-39.7c4.7 0 7.5-2.4 7.5-6.6v-.6c0-4.2-2.8-6.6-7.5-6.6h-11.4c-.6 0-1 .4-1 1v11.9c0 .6.4 1 1 1h11.4z\"/><path d=\"m235.9 71.9c-1.2 0-2-.8-2-2v-66.4c0-1.2.8-2 2-2h30.6c22.2 0 36 12 36 34.1v2c0 22.2-13.8 34.3-36 34.3zm29.1-17.9c9.4 0 14.6-5.7 14.6-14.8v-5.1c0-9.1-5.1-14.7-14.6-14.7h-7.6c-.6 0-1 .4-1 1v32.6c0 .6.4 1 1 1z\"/><path d=\"m305.2 71.9c-2.1 0-2.5-1.4-1.8-3l24.2-64.6c.7-1.8 1.9-2.7 3.8-2.7h20.9c1.9 0 3.1.9 3.8 2.7l24.3 64.6c.6 1.6.3 3-1.8 3h-18.4c-1.6 0-2.6-.8-3.1-2.3l-3.2-8.8c-.4-1-1-1.5-2-1.5h-20.1c-1 0-1.6.5-2 1.5l-3.2 8.8c-.5 1.5-1.5 2.3-3.1 2.3zm41.7-29.3c.7 0 1.3-.5 1-1.3l-5.2-16.3c-.3-.7-1.3-.7-1.5 0l-5.3 16.3c-.2.8.3 1.3 1 1.3z\"/><path d=\"m388.5 71.9c-1.2 0-2-.8-2-2v-66.4c0-1.2.8-2 2-2h18.7c1.6 0 2.5.5 3.4 1.8l23.7 35.1c.5.7 1.4.6 1.4-.3v-34.6c0-1.2.8-2 2-2h18c1.2 0 2 .8 2 2v66.3c0 1.2-.8 2-2 2h-19.7c-1.6 0-2.5-.5-3.4-1.9l-22.6-34.3c-.5-.8-1.4-.6-1.4.3v34c0 1.2-.8 2-2 2z\"/></g></svg>",
  "introFile": "",
  "tabletLogoFile": "",
  "demoDataIds": {
    "mediaIds": [],
    "sectionIds": []
  },
  "cdnSslUri": "/pf-media",
  "defaultEditorMode": "source",
  "contactInfo": "",
  "accountName": "jordandani",
  "redirects": [],
  "siteCss": "\n/* JD_LOGO_CSS_V14 */\n/* Webflow nav-left-wrapper: 250@30/40 · 180@≤991 · 20/20@≤767 */\n.logoText,\nbody.jd-home-snap-on .logoText,\nbody:not(.jd-home-snap-on) .logoText,\n.LogoView,\n#logo{\nposition:fixed!important;\ntop:30px!important;\nleft:40px!important;\nz-index:55!important;\nwidth:250px!important;\nmax-width:min(250px,calc(100vw - 168px))!important;\nheight:auto!important;\nmax-height:89px!important;\nline-height:0!important;\noverflow:visible!important;\nopacity:1!important;\nvisibility:visible!important;\npointer-events:auto!important;\ntransform-origin:left center!important;\n}\nbody.jd-home-snap-on .logoText{\nz-index:100045!important;\nfilter:drop-shadow(0 1px 1px rgba(0,0,0,.55)) drop-shadow(0 0 14px rgba(0,0,0,.28))!important;\n}\n.logoText #jordan-dani-logo,\nbody.jd-home-snap-on .logoText #jordan-dani-logo,\nbody:not(.jd-home-snap-on) .logoText #jordan-dani-logo{\nwidth:100%!important;\nmax-width:100%!important;\nheight:auto!important;\nmax-height:89px!important;\naspect-ratio:300/106;\ndisplay:block!important;\nmargin:0!important;\noverflow:visible!important;\nopacity:1!important;\n}\nbody.jd-home-snap-on #logo-fill{fill:none!important;stroke:#ffffff!important;}\nbody:not(.jd-home-snap-on) #logo-fill{fill:#45503B!important;stroke:#45503B!important;}\nbody:not(.jd-home-snap-on) #logo-fill path{fill:#45503B!important;stroke:#45503B!important;}\n@media (max-width:991px){\n.logoText,\nbody.jd-home-snap-on .logoText,\nbody:not(.jd-home-snap-on) .logoText,\n.LogoView,\n#logo{\ntop:30px!important;\nleft:40px!important;\nwidth:180px!important;\nmax-width:180px!important;\nmax-height:64px!important;\n}\n.logoText #jordan-dani-logo,\nbody.jd-home-snap-on .logoText #jordan-dani-logo,\nbody:not(.jd-home-snap-on) .logoText #jordan-dani-logo{\nmax-height:64px!important;\n}\n}\n@media (max-width:767px){\n.logoText,\nbody.jd-home-snap-on .logoText,\nbody:not(.jd-home-snap-on) .logoText,\n.LogoView,\n#logo{\ntop:20px!important;\nleft:20px!important;\nwidth:180px!important;\nmax-width:min(180px,calc(100vw - 120px))!important;\nmax-height:64px!important;\n}\n.logoText #jordan-dani-logo,\nbody.jd-home-snap-on .logoText #jordan-dani-logo,\nbody:not(.jd-home-snap-on) .logoText #jordan-dani-logo{\nmax-height:64px!important;\n}\n}\n\n\n\n/* JD_CHROME_CSS_V4 */\n@font-face{font-family:\"MidnightSansSt36Heavy\";src:url(\"/pf-media/MidnightSansSt36Heavy.otf\") format(\"opentype\");font-weight:900;font-style:normal;font-display:swap;}\n@font-face{font-family:\"MidnightSansRd36Heavy\";src:url(\"/pf-media/MidnightSansRd36Heavy.otf\") format(\"opentype\");font-weight:900;font-style:normal;font-display:swap;}\n@font-face{font-family:\"Midnight Sans St 36 Pro\";src:url(\"/pf-media/MidnightSansSt36Heavy.otf\") format(\"opentype\");font-weight:900;font-style:normal;font-display:swap;}\n@font-face{font-family:\"Midnight Sans Rd 36 Pro\";src:url(\"/pf-media/MidnightSansRd36Heavy.otf\") format(\"opentype\");font-weight:900;font-style:normal;font-display:swap;}\nbody,.dxSite,.siteBackground{background-color:#C5C7AD!important;}\n.jd-chrome{position:fixed;top:28px;right:28px;z-index:100050;display:flex;align-items:center;gap:18px;pointer-events:auto;}\nbody.jd-menu-open .jd-chrome{z-index:100080;}\nbody.jd-menu-open .jd-chrome__link,body.jd-menu-open .jd-chrome__ig,body.jd-menu-open .ampersand-menu-trigger,body.jd-menu-open #jd-amp-trigger{display:none!important;}\n.jd-chrome__link{font-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Montserrat,Helvetica,Arial,sans-serif;font-weight:900;font-size:clamp(22px,2.2vw,40px);line-height:1;letter-spacing:.02em;text-transform:uppercase;color:#45503B;text-decoration:none;transition:color .25s ease;}\n.jd-chrome__link:hover{color:#CCA958;text-decoration:none;}\n.jd-chrome__ig{display:inline-flex;width:22px;height:22px;opacity:.9;}\n.jd-chrome__ig img{width:22px;height:22px;display:block;}\n.ampersand-menu-trigger{width:48px;position:relative;display:inline-block;transition:250ms;line-height:0;cursor:pointer;}\n.ampersand-menu-trigger .image-2{display:block;width:48px;height:auto;}\n.ampersand-menu-trigger .amp-grow{position:absolute;inset:0;width:48px;height:auto;animation-name:jd-amp-lookatme;animation-duration:1s;animation-iteration-count:infinite;pointer-events:none;}\n.ampersand-menu-trigger:hover{transform:scale(1.1);}\n@keyframes jd-amp-lookatme{0%{transform:scale(1);opacity:.7;}100%{transform:scale(1.2);opacity:0;}}\nbody.jd-home-snap-on .jd-chrome__link{color:#fff!important;}\nbody.jd-home-snap-on .jd-chrome__link:hover{color:#CCA958!important;}\nbody.jd-home-snap-on .ampersand-menu-trigger img,body.jd-home-snap-on .jd-chrome__ig img{filter:brightness(0) invert(1);}\nbody:not(.jd-home-snap-on) .jd-chrome__link{color:#45503B!important;}\nbody:not(.jd-home-snap-on) .ampersand-menu-trigger img,body:not(.jd-home-snap-on) .jd-chrome__ig img{filter:none;}\n.menuIcon,.menuIconOverlay,.menuBar .menuIcon,div.menuIcon{opacity:0!important;pointer-events:none!important;width:0!important;height:0!important;overflow:hidden!important;}\n#jd-chrome .ampersand-menu-trigger{opacity:1!important;pointer-events:auto!important;width:48px!important;height:auto!important;overflow:visible!important;}\n.menu,.menuBar,.menuOverlay,[data-identity=menu]{opacity:0!important;pointer-events:none!important;}\n#jd-athleta-title{max-width:920px;margin:0 0 28px;padding:120px 4vw 8px;color:#292F22;}\n#jd-athleta-title .jd-athleta-title__h{margin:0 0 12px;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Helvetica,Arial,sans-serif;font-weight:900;font-size:clamp(42px,7vw,94px);line-height:.95;letter-spacing:.01em;text-transform:uppercase;color:#292F22;}\n#jd-athleta-title .jd-athleta-title__p{margin:0;max-width:520px;font-family:Montserrat,Helvetica,Arial,sans-serif;font-weight:300;font-size:15px;line-height:1.45;color:#45503B;}\n#jd-overlay{position:fixed;inset:0;z-index:100070;display:none;background:#C5C7AD center/cover no-repeat;}\n#jd-overlay.is-on{display:block;}\n#jd-overlay::before{content:\"\";position:absolute;inset:0;background:#C5C7AD;opacity:.55;pointer-events:none;transition:opacity .25s ease;}\n#jd-overlay.has-media::before{opacity:.55;}\n.jd-overlay__close{position:absolute;top:28px;right:28px;left:auto;z-index:2;border:0;background:transparent;color:#45503B;font:900 42px/1 \"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Arial,sans-serif;cursor:pointer;padding:0 6px;}\n.jd-overlay__grid{position:relative;z-index:1;display:grid;grid-template-columns:minmax(280px,42vw) 1fr;gap:48px;height:100%;padding:10vh 6vw 18vh;box-sizing:border-box;align-content:center;}\n.jd-overlay__parents,.jd-overlay__kids{display:flex;flex-direction:column;gap:10px;justify-content:center;}\n.jd-overlay__parents{align-self:center;}\n.jd-overlay__kids{align-self:center;padding-left:2vw;}\n.jd-overlay__item{display:inline-flex;align-items:center;gap:14px;width:fit-content;max-width:100%;font-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Montserrat,Arial,sans-serif;font-weight:900;letter-spacing:.02em;text-transform:uppercase;text-decoration:none;color:#45503B;cursor:pointer;line-height:1.05;}\n.jd-overlay__item--parent{font-size:clamp(36px,5.2vw,72px);}\n.jd-overlay__item--child{font-size:clamp(20px,2.4vw,34px);}\n.jd-overlay__item.is-active,.jd-overlay__item:hover{color:#292F22;}\n.jd-overlay__bar{width:8px;height:1.05em;background:#292F22;opacity:0;flex:0 0 auto;}\n.jd-overlay__item.is-active .jd-overlay__bar,.jd-overlay__item:hover .jd-overlay__bar{opacity:1;}\n.jd-overlay__mark{position:absolute;left:4vw;right:4vw;bottom:1.5vh;z-index:1;font-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Arial,sans-serif;font-weight:900;font-size:clamp(52px,10.5vw,132px);line-height:.82;letter-spacing:-.04em;text-transform:uppercase;color:transparent;-webkit-text-stroke:1px rgba(69,80,59,.28);opacity:.95;pointer-events:none;white-space:nowrap;overflow:hidden;}\n@media (max-width:900px){.jd-overlay__grid{grid-template-columns:1fr;gap:28px;padding-top:12vh;}.jd-overlay__kids{padding-left:0;}.jd-chrome{top:14px;right:14px;gap:10px;}.jd-chrome__link{font-size:16px;}.ampersand-menu-trigger,.ampersand-menu-trigger .image-2,.ampersand-menu-trigger .amp-grow{width:36px;}#jd-athleta-title{padding-top:88px;}.jd-overlay__close{top:14px;right:14px;left:auto;font-size:32px;}}\n@media (max-width:800px){.jd-chrome{top:14px;right:14px;gap:10px;}.jd-chrome__link{font-size:16px;}.ampersand-menu-trigger,.ampersand-menu-trigger .image-2,.ampersand-menu-trigger .amp-grow{width:36px;}#jd-athleta-title{padding-top:88px;}}\n\n/* JD_CHROME_HIDE_LINKS_TABLET */\n/* V2: keep MOTION visible; PHOTO is menu trigger. Sized for tablet/phone. */\n@media (max-width:991px){\n.jd-chrome__link{display:inline-block!important;font-size:16px!important;line-height:1!important;}\n}\n/* JD_NAVBAR_BAR_EMBED */\n/* Shared Webflow menu sizing + grow (home + galleries) */\n.jd-chrome{\ntop:40px!important;\nright:40px!important;\ngap:20px!important;\nalign-items:center!important;\n}\n.jd-chrome__link{\nfont-size:40px!important;\nline-height:40px!important;\nletter-spacing:0!important;\ntransition:transform 250ms ease!important;\ntransform-origin:center center;\n}\n.jd-chrome__link:hover{transform:scale(1.15)!important;}\n.jd-chrome__ig{\ntransition:transform 250ms ease!important;\ntransform-origin:center center;\n}\n.jd-chrome__ig:hover{transform:scale(1.15)!important;}\n.jd-chrome__ig,.jd-chrome__ig img{\nwidth:20px!important;\nheight:20px!important;\nmax-width:20px!important;\n}\n#jd-amp-trigger,.ampersand-menu-trigger{\nwidth:48px!important;\ntransition:transform 250ms ease!important;\n}\n#jd-amp-trigger:hover,.ampersand-menu-trigger:hover{transform:scale(1.15)!important;}\n.ampersand-menu-trigger .image-2,.ampersand-menu-trigger .amp-grow{width:48px!important;}\n.logoText,.LogoView,#logo{\ntransition:transform 250ms ease!important;\ntransform-origin:left center;\n}\n.logoText:hover,.LogoView:hover,#logo:hover{transform:scale(1.15)!important;}\n.logoText #jordan-dani-logo{\n/* size owned by JD_LOGO_CSS_V8 + sizeLogo() */\nheight:auto!important;\n}\n/* Gallery sticky bar under DX Live Admin (z=100). Do NOT use Webflow 99999. */\nbody:not(.jd-home-snap-on)::before{\ncontent:\"\";\nposition:fixed;\ninset:0 0 auto;\ntop:0;left:0;right:0;\nheight:130px;\nbackground-color:#C5C7AD;\nz-index:40;\npointer-events:none;\n}\nbody:not(.jd-home-snap-on) .jd-chrome{z-index:60!important;}\nbody:not(.jd-home-snap-on) .logoText,\nbody:not(.jd-home-snap-on) .LogoView,\nbody:not(.jd-home-snap-on) #logo{\nz-index:55!important;\n}\n/* Home: allow grow (beats logo CSS transform:none) */\nbody.jd-home-snap-on .logoText{\n/* size owned by JD_LOGO_CSS_V8 */\n}\nbody.jd-home-snap-on .logoText:hover{transform:scale(1.15)!important;}\n@media (max-width:991px){\nbody:not(.jd-home-snap-on)::before{height:130px;}\n.jd-chrome{top:40px!important;right:40px!important;gap:20px!important;}\n.jd-chrome__ig,.jd-chrome__ig img{width:28px!important;height:28px!important;max-width:28px!important;}\n/* logo widths owned by JD_LOGO_CSS_V14 */\n#jd-amp-trigger,.ampersand-menu-trigger,\n.ampersand-menu-trigger .image-2,.ampersand-menu-trigger .amp-grow{\nwidth:48px!important;\n}\n}\n@media (max-width:767px){\nbody:not(.jd-home-snap-on)::before{height:100px;}\n.jd-chrome{top:20px!important;right:20px!important;gap:16px!important;}\n.jd-chrome__ig,.jd-chrome__ig img{width:28px!important;height:28px!important;max-width:28px!important;}\n#jd-amp-trigger,.ampersand-menu-trigger,\n.ampersand-menu-trigger .image-2,.ampersand-menu-trigger .amp-grow{\nwidth:48px!important;\n}\n}\n\n\n/* JD_OVERLAY_LAYOUT_CSS_V2 */\n#jd-overlay{position:fixed;inset:0;z-index:100070;display:none;background:#C5C7AD center/cover no-repeat;}\n#jd-overlay.is-on{display:block;}\n#jd-overlay::before{content:\"\";position:absolute;inset:0;background:#C5C7AD;opacity:.55;pointer-events:none;transition:opacity .25s ease;}\n#jd-overlay.has-media::before{opacity:.55;}\n.jd-overlay__close{position:absolute;top:28px;right:28px;left:auto;z-index:3;border:0;background:transparent;color:#45503B;font:300 34px/1 \"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Arial,sans-serif;cursor:pointer;padding:0 4px;opacity:.9;}\n.jd-overlay__close:hover{opacity:1;color:#292F22;}\n.jd-overlay__grid{position:relative;z-index:1;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;column-gap:clamp(24px,4vw,80px);height:100%;width:100%;padding:10vh clamp(28px,4vw,56px) 18vh clamp(40px,6vw,88px);box-sizing:border-box;}\n.jd-overlay__parents{display:flex;flex-direction:column;gap:clamp(16px,2.4vh,30px);justify-content:center;align-items:flex-start;align-self:center;min-width:0;}\n.jd-overlay__kids{display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:9px;align-self:center;justify-self:end;max-height:72vh;overflow:auto;padding:0;scrollbar-width:thin;text-align:right;}\n.jd-overlay__kids::-webkit-scrollbar{width:6px;}\n.jd-overlay__kids::-webkit-scrollbar-thumb{background:rgba(69,80,59,.28);border-radius:4px;}\n.jd-overlay__kids.is-dense{display:grid;grid-template-columns:repeat(2,max-content);justify-content:end;align-content:center;column-gap:clamp(28px,3.5vw,56px);row-gap:8px;}\n.jd-overlay__item{display:inline-flex;align-items:center;gap:12px;width:fit-content;max-width:100%;font-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Montserrat,Arial,sans-serif;font-weight:900;letter-spacing:.02em;text-transform:uppercase;text-decoration:none;color:#45503B;cursor:pointer;line-height:1.05;}\n.jd-overlay__item--parent{font-size:clamp(36px,5vw,72px);}\n.jd-overlay__item--child{font-size:clamp(15px,1.35vw,22px);letter-spacing:.04em;justify-content:flex-end;margin-left:auto;}\n.jd-overlay__item.is-active,.jd-overlay__item:hover{color:#292F22;}\n.jd-overlay__bar{width:7px;height:.92em;background:#292F22;opacity:0;flex:0 0 auto;border-radius:1px;}\n.jd-overlay__item.is-active .jd-overlay__bar,.jd-overlay__item:hover .jd-overlay__bar{opacity:1;}\n.jd-overlay__mark{position:absolute;left:3vw;right:3vw;bottom:1.2vh;z-index:1;font-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Arial,sans-serif;font-weight:900;font-size:clamp(56px,11vw,150px);line-height:.8;letter-spacing:-.04em;text-transform:uppercase;text-align:center;color:transparent;-webkit-text-stroke:1px rgba(69,80,59,.22);opacity:.95;pointer-events:none;white-space:nowrap;overflow:hidden;}\nbody.jd-menu-open .jd-chrome__link,body.jd-menu-open .jd-chrome__ig,body.jd-menu-open .ampersand-menu-trigger,body.jd-menu-open #jd-amp-trigger{display:none!important;}\nbody.jd-menu-open .menu,body.jd-menu-open .menuBar,body.jd-menu-open .menuOverlay,body.jd-menu-open [data-identity=menu]{display:none!important;opacity:0!important;pointer-events:none!important;visibility:hidden!important;}\n@media (max-width:900px){\n.jd-overlay__grid{grid-template-columns:1fr;align-content:start;gap:28px;padding:12vh 18px 14vh;}\n.jd-overlay__parents{gap:14px;}\n.jd-overlay__kids,.jd-overlay__kids.is-dense{display:flex;flex-direction:column;align-items:flex-start;justify-self:start;max-height:42vh;text-align:left;}\n.jd-overlay__item--child{margin-left:0;justify-content:flex-start;}\n.jd-overlay__close{top:14px;right:14px;left:auto;font-size:28px;}\n}\n\n\n#jd-proj-title,.jd-proj-title{max-width:920px;margin:0 0 24px;padding:100px 4vw 4px;color:#292F22;}\n#jd-proj-title .jd-proj-title__h,.jd-proj-title .jd-proj-title__h{margin:0;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Helvetica,Arial,sans-serif;font-weight:900;font-size:clamp(36px,6vw,78px);line-height:.95;letter-spacing:.01em;text-transform:uppercase;color:#292F22;}\n#jd-proj-title .jd-proj-title__p,.jd-proj-title .jd-proj-title__p{margin:10px 0 0;max-width:520px;font-family:Montserrat,Helvetica,Arial,sans-serif;font-weight:300;font-size:15px;line-height:1.45;color:#45503B;}\n#jd-motion-title{max-width:920px;margin:0 0 20px;padding:100px 4vw 4px;}\n#jd-motion-title .jd-proj-title__h{margin:0;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Helvetica,Arial,sans-serif;font-weight:900;font-size:clamp(36px,6vw,78px);line-height:.95;text-transform:uppercase;color:#292F22;}\n\n\n/* JD_HOME_SNAP_VIDEO_CSS_V1 */\n.jd-home-snap__panel.is-video{background-image:none!important;background-color:#C5C7AD;}\n.jd-home-snap__vid{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block;pointer-events:none;z-index:0;}\n.jd-home-snap__panel.is-video .jd-home-snap__label{z-index:2;}\n\n\n/* JD_HOME_SNAP_CSS_V7 */\nbody.jd-home-snap-on .Thumbs\\.container,\nbody.jd-home-snap-on [class*=\"Thumbs\"],\nbody.jd-home-snap-on .MediaView\\.container,\nbody.jd-home-snap-on #jd-athleta-title,\nbody.jd-home-snap-on #jd-proj-title,\nbody.jd-home-snap-on .jd-proj-title{opacity:0!important;pointer-events:none!important;visibility:hidden!important;}\n#jd-home-snap{position:fixed;inset:0;z-index:30;display:none;background:#C5C7AD;}\n#jd-home-snap.is-on{display:block;}\n.jd-home-snap__scroller{position:absolute;inset:0;overflow-y:auto;overflow-x:hidden;scroll-snap-type:none;scrollbar-width:none;-webkit-overflow-scrolling:touch;background:#C5C7AD;}\n.jd-home-snap__scroller::-webkit-scrollbar{display:none;width:0;height:0;}\n@keyframes jd-slide-in{\n0%{opacity:0;transform:translate3d(0,18vh,0) scale(.84);}\n55%{opacity:1;transform:translate3d(0,-1.2vh,0) scale(.985);}\n100%{opacity:1;transform:translate3d(0,0,0) scale(1);}\n}\n@keyframes jd-slide-out{\n0%{opacity:1;transform:translate3d(0,0,0) scale(1);}\n100%{opacity:0;transform:translate3d(0,-8vh,0) scale(.78);}\n}\n.jd-home-snap__panel{position:relative;width:100vw;height:100svh;min-height:100vh;overflow:hidden;background:#C5C7AD center/cover no-repeat;display:block;text-decoration:none;color:inherit;will-change:transform,opacity;transform-origin:center center;animation-duration:720ms;animation-timing-function:cubic-bezier(.16,1,.3,1);animation-fill-mode:both;}\n.jd-home-snap__panel.is-active{animation-name:jd-slide-in;z-index:2;}\n.jd-home-snap__panel.is-leaving{animation-name:jd-slide-out;z-index:1;}\n.jd-home-snap__panel.is-idle{opacity:0;transform:translate3d(0,14vh,0) scale(.78);pointer-events:none;}\n.jd-home-snap__panel::after{content:\"\";position:absolute;inset:0;background:linear-gradient(180deg,rgba(41,47,34,.18) 0%,rgba(41,47,34,0) 28%,rgba(41,47,34,.28) 100%);pointer-events:none;}\n.jd-home-snap__label{position:absolute;left:40px;bottom:40px;z-index:2;margin:0;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Arial,sans-serif;font-weight:900;font-size:clamp(28px,3.1vw,36px);line-height:1;letter-spacing:.01em;text-transform:uppercase;color:#fff;opacity:0;transform:translate3d(-110px,10px,0) scale(.9);filter:blur(7px);text-shadow:0 1px 12px rgba(0,0,0,.3);transition:opacity .9s cubic-bezier(.16,1,.3,1),transform 1s cubic-bezier(.16,1,.3,1),filter .85s cubic-bezier(.16,1,.3,1);pointer-events:none;will-change:transform,opacity,filter;}\n.jd-home-snap__panel.is-active .jd-home-snap__label{opacity:1;transform:translate3d(0,0,0) scale(1);filter:blur(0);transition-delay:.12s;}\n.jd-home-snap__panel.is-leaving .jd-home-snap__label{opacity:0;transform:translate3d(-36px,0,0);filter:blur(4px);transition:opacity .22s ease,transform .22s ease,filter .22s ease;transition-delay:0s;}\n.jd-home-snap__tag{position:fixed;right:40px;bottom:40px;z-index:55;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Arial,sans-serif;font-weight:900;font-size:clamp(22px,2.5vw,30px);letter-spacing:.04em;text-transform:uppercase;color:#fff;opacity:0;pointer-events:none;transition:opacity .35s ease;}\nbody.jd-home-snap-on .jd-home-snap__tag{opacity:.95;}\n@media (max-width:800px){.jd-home-snap__label{left:18px;bottom:24px;font-size:clamp(22px,5.5vw,30px);}.jd-home-snap__tag{right:18px;bottom:24px;font-size:clamp(16px,3.8vw,22px);}}\n\n\n/* JD_GALLERY_MOTION_CSS_V2 */\n@keyframes jd-ltr-in{0%{opacity:0;transform:translate3d(-72px,0,0);}100%{opacity:1;transform:translate3d(0,0,0);}}\n@keyframes jd-rtl-in{0%{opacity:0;transform:translate3d(72px,0,0);}100%{opacity:1;transform:translate3d(0,0,0);}}\n@keyframes jd-nav-top-in{0%{opacity:0;transform:translate3d(0,-28px,0);}100%{opacity:1;transform:translate3d(0,0,0);}}\n@keyframes jd-foot-ltr-in{0%{opacity:0;transform:translate3d(56px,0,0);}100%{opacity:1;transform:translate3d(0,0,0);}}\nbody:not(.jd-home-snap-on) #jd-proj-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) .jd-proj-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-photo-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-athleta-title .jd-athleta-title__h,\nbody:not(.jd-home-snap-on) #jd-motion-title .jd-proj-title__h{\nopacity:0;transform:translate3d(-72px,0,0);\nanimation:jd-ltr-in .9s cubic-bezier(.16,1,.3,1) .12s forwards;\n}\nbody:not(.jd-home-snap-on) #jd-proj-title .jd-proj-title__p,\nbody:not(.jd-home-snap-on) .jd-proj-title .jd-proj-title__p,\nbody:not(.jd-home-snap-on) #jd-athleta-title .jd-athleta-title__p{\nopacity:0;transform:translate3d(72px,0,0);\nanimation:jd-rtl-in .85s cubic-bezier(.16,1,.3,1) .22s forwards;\n}\n/* Menu load-in (Webflow nav-left / nav-right slideInTop) */\nbody:not(.jd-home-snap-on) .logoText,\nbody:not(.jd-home-snap-on) .LogoView,\nbody:not(.jd-home-snap-on) #logo{\nanimation:jd-nav-top-in .7s cubic-bezier(.16,1,.3,1) .05s both;\n}\nbody:not(.jd-home-snap-on) #jd-chrome.jd-chrome{\nanimation:jd-nav-top-in .7s cubic-bezier(.16,1,.3,1) .1s both;\n}\nbody.jd-home-snap-on .logoText,\nbody.jd-home-snap-on #jd-chrome{animation:none;}\n/* Footer viewport slide (right → left) */\nbody:not(.jd-home-snap-on) .jd-gal-footer{\nopacity:0;transform:translate3d(56px,0,0);\n}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in{\nanimation:jd-foot-ltr-in .85s cubic-bezier(.16,1,.3,1) forwards;\n}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__link,\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__bottom > *{\nopacity:0;transform:translate3d(36px,0,0);\nanimation:jd-foot-ltr-in .7s cubic-bezier(.16,1,.3,1) forwards;\n}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__link:nth-child(1){animation-delay:.05s;}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__link:nth-child(2){animation-delay:.1s;}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__link:nth-child(3){animation-delay:.15s;}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__link:nth-child(4){animation-delay:.2s;}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__bottom > *:nth-child(1){animation-delay:.22s;}\nbody:not(.jd-home-snap-on) .jd-gal-footer.is-in .jd-gal-footer__bottom > *:nth-child(2){animation-delay:.28s;}\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div{\nopacity:1!important;animation:none!important;will-change:auto;\n}\nbody:not(.jd-home-snap-on) .footerview{\ndisplay:none!important;visibility:hidden!important;opacity:0!important;pointer-events:none!important;\n}\nbody.jd-home-snap-on .jd-gal-footer{opacity:0!important;visibility:hidden!important;pointer-events:none!important;}\n.jd-gal-footer{width:100%;clear:both;box-sizing:border-box;margin:clamp(56px,7vw,96px) 0 0;padding:28px 4vw 26px;background:#C5C7AD;color:#45503B;font-family:Montserrat,Helvetica,Arial,sans-serif;}\n.jd-gal-footer *{box-sizing:border-box;}\n.jd-gal-footer__nav{display:flex;align-items:center;justify-content:center;gap:clamp(22px,3.2vw,44px);flex-wrap:wrap;padding:4px 0 20px;}\n.jd-gal-footer__link{font-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Montserrat,Arial,sans-serif;font-weight:900;font-size:clamp(14px,1.2vw,16px);letter-spacing:.04em;text-transform:uppercase;color:#45503B;text-decoration:none;}\n.jd-gal-footer__link:hover{color:#292F22;}\n.jd-gal-footer__rule{height:1px;width:100%;background:rgba(69,80,59,.28);margin:0 0 14px;}\n.jd-gal-footer__bottom{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;}\n.jd-gal-footer__copy,.jd-gal-footer__legal{margin:0;font-family:Georgia,\"Times New Roman\",serif;font-size:13px;line-height:1.45;color:#45503B;}\n.jd-gal-footer__sep{margin:0 .35em;opacity:.7;}\n.jd-gal-footer__legal{display:flex;gap:18px;flex-wrap:wrap;}\n.jd-gal-footer__ext{color:#45503B;text-decoration:underline;text-underline-offset:2px;}\n.jd-gal-footer__ext:hover{color:#292F22;}\n@media (max-width:700px){\n.jd-gal-footer__nav{gap:16px 22px;}\n.jd-gal-footer__bottom{align-items:flex-start;flex-direction:column;}\n}\n\n\n/* JD_TITLE_WEBFLOW_V2 */\n/* Webflow category header + Mackinac blurb */\nbody:not(.jd-home-snap-on) #jd-proj-title,\nbody:not(.jd-home-snap-on) .jd-proj-title,\nbody:not(.jd-home-snap-on) #jd-motion-title,\nbody:not(.jd-home-snap-on) #jd-photo-title,\nbody:not(.jd-home-snap-on) #jd-athleta-title{\nmax-width:100%;\nmargin:0 0 18px;\npadding:100px 40px 10px;\ncolor:#fff;\n}\nbody:not(.jd-home-snap-on) #jd-proj-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) .jd-proj-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-motion-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-photo-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-athleta-title .jd-athleta-title__h{\nmargin:0;\nfont-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Helvetica,Arial,sans-serif;\nfont-weight:700;\nfont-size:clamp(42px,6.6vw,94px);\nline-height:.98;\nletter-spacing:.01em;\ntext-transform:uppercase;\ncolor:#fff!important;\ntext-shadow:0 1px 10px rgba(0,0,0,.18);\n}\nbody:not(.jd-home-snap-on) #jd-proj-title .jd-proj-title__p,\nbody:not(.jd-home-snap-on) .jd-proj-title .jd-proj-title__p,\nbody:not(.jd-home-snap-on) #jd-athleta-title .jd-athleta-title__p{\nmargin:14px 0 0;\nmax-width:min(720px,92%);\nmargin-left:auto;\nmargin-right:0;\nfont-family:\"p22-mackinac-pro\",p22-mackinac-pro,Georgia,\"Times New Roman\",serif;\nfont-weight:400;\nfont-size:clamp(13px,1.05vw,15px);\nline-height:1.75;\ncolor:rgba(255,255,255,.94)!important;\ntext-align:left;\n}\n#jd-bottom-title{\nposition:fixed;\nleft:20px;\nbottom:-110px;\nz-index:100040;\nmargin:0;\npadding:0 0 10px;\nfont-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Helvetica,Arial,sans-serif;\nfont-weight:700;\nfont-size:clamp(28px,3.4vw,48px);\nline-height:1.15;\nletter-spacing:.01em;\ntext-transform:uppercase;\ncolor:#fff;\ntext-shadow:0 1px 10px rgba(0,0,0,.28);\npointer-events:none;\nopacity:0;\nvisibility:hidden;\ntransition:bottom .25s ease,opacity .25s ease,visibility .25s ease;\n}\n#jd-bottom-title.is-on{bottom:0;opacity:1;visibility:visible;}\nbody.jd-home-snap-on #jd-bottom-title,\nbody.jd-menu-open #jd-bottom-title{bottom:-110px!important;opacity:0!important;visibility:hidden!important;}\n@media (max-width:700px){\nbody:not(.jd-home-snap-on) #jd-proj-title,\nbody:not(.jd-home-snap-on) .jd-proj-title,\nbody:not(.jd-home-snap-on) #jd-motion-title,\nbody:not(.jd-home-snap-on) #jd-photo-title,\nbody:not(.jd-home-snap-on) #jd-athleta-title{padding:72px 18px 8px;}\nbody:not(.jd-home-snap-on) #jd-proj-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) .jd-proj-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-motion-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-photo-title .jd-proj-title__h,\nbody:not(.jd-home-snap-on) #jd-athleta-title .jd-athleta-title__h{font-size:clamp(34px,10vw,64px);}\nbody:not(.jd-home-snap-on) #jd-proj-title .jd-proj-title__p,\nbody:not(.jd-home-snap-on) .jd-proj-title .jd-proj-title__p,\nbody:not(.jd-home-snap-on) #jd-athleta-title .jd-athleta-title__p{max-width:100%;font-size:13px;}\n#jd-bottom-title{left:14px;font-size:clamp(22px,7vw,32px);}\n}\n\n\n/* JD_NEXT_PROJECT_CSS_V1 */\n/* footer tour — ↑ left of nav, next+bar right of nav */\n#jd-next-project,#jd-back-top{display:none!important;opacity:0!important;visibility:hidden!important;pointer-events:none!important;}\n.jd-tour-dock{\nposition:fixed;left:0;right:0;bottom:0;z-index:100046;\nbackground:#C5C7AD;color:#45503B;\npadding:14px 4vw 16px;\nbox-shadow:0 -1px 0 rgba(69,80,59,.18);\n}\nbody:not(.jd-home-snap-on) .jd-tour-dock{display:none!important;}\nbody.jd-home-snap-on .jd-tour-dock{display:none!important;}\nbody.jd-home-snap-on .jd-tour-row{display:none!important;}\n.jd-tour-row{\ndisplay:flex;align-items:center;justify-content:space-between;gap:16px;\nwidth:100%;box-sizing:border-box;\n}\n.jd-gal-footer .jd-tour-row{\nmargin:0 0 4px;padding:0;\n}\n.jd-tour-row .jd-gal-footer__nav{\nflex:1 1 auto;justify-content:center;margin:0;padding:4px 0 20px;\n}\n.jd-tour-row__spacer{flex:1 1 auto;}\n.jd-tour-chrome__up{\nappearance:none;border:0;cursor:pointer;\nflex:0 0 auto;width:42px;height:42px;padding:0;margin:0 0 16px;\ndisplay:inline-flex;align-items:center;justify-content:center;\ncolor:#45503B;\nbackground:rgba(69,80,59,.08);\nborder:1px solid rgba(69,80,59,.22);\nborder-radius:999px;\nopacity:.92;\ntransition:background .2s ease,border-color .2s ease,opacity .2s ease,transform .2s ease;\n}\n.jd-tour-chrome__up:hover{\nopacity:1;\nbackground:rgba(69,80,59,.14);\nborder-color:rgba(69,80,59,.34);\n}\n.jd-tour-chrome__up:focus-visible{outline:2px solid rgba(69,80,59,.35);outline-offset:2px;}\n.jd-tour-chrome__arrow{\ndisplay:block;width:14px;height:14px;\nanimation:jd-tour-bounce 1.85s ease-in-out infinite;\n}\n.jd-tour-chrome__arrow svg{display:block;width:100%;height:100%;}\n@keyframes jd-tour-bounce{\n0%,100%{transform:translateY(2px);}\n50%{transform:translateY(-3px);}\n}\n.jd-tour-chrome__next{\nappearance:none;border:0;background:transparent;color:#45503B;cursor:pointer;\nflex:0 1 240px;min-width:160px;max-width:280px;margin:0 0 16px;padding:8px 4px 10px 12px;\ndisplay:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:7px;text-align:right;\nposition:relative;z-index:2;-webkit-tap-highlight-color:transparent;\n}\n.jd-tour-chrome__next:hover .jd-tour-chrome__name{opacity:.88;}\n.jd-tour-chrome__next:focus-visible{outline:2px solid rgba(69,80,59,.35);outline-offset:3px;}\n.jd-tour-chrome__meta{display:flex;flex-direction:column;align-items:flex-end;gap:2px;width:100%;}\n.jd-tour-chrome__kicker{\nfont-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Montserrat,Arial,sans-serif;\nfont-weight:900;font-size:11px;letter-spacing:.14em;text-transform:uppercase;opacity:.8;\n}\n.jd-tour-chrome__name{\nfont-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Arial,sans-serif;\nfont-weight:700;font-size:clamp(16px,1.8vw,24px);line-height:1.05;letter-spacing:.01em;text-transform:uppercase;\n}\n.jd-tour-chrome__track{\ndisplay:block;width:100%;height:2px;background:rgba(69,80,59,.18);overflow:hidden;\n}\n.jd-tour-chrome__fill{\ndisplay:block;height:100%;width:0;background:#45503B;\n}\n@media (max-width:700px){\n.jd-tour-row{flex-wrap:wrap;gap:10px 12px;}\n.jd-tour-row .jd-gal-footer__nav{order:3;flex:1 1 100%;padding:8px 0 12px;}\n.jd-tour-chrome__up{margin:0;order:1;}\n.jd-tour-chrome__next{margin:0;order:2;flex:1 1 auto;max-width:none;}\n.jd-tour-chrome__name{font-size:clamp(15px,5vw,20px);}\n}\nbody.jd-menu-open .jd-tour-row,body.jd-menu-open .jd-tour-dock{opacity:0;pointer-events:none;}\n/* section label lives again — JS hides within 200px of bottom */\n#jd-bottom-title{\nposition:fixed;left:20px;bottom:-110px;z-index:100040;margin:0;padding:0 0 10px;\nfont-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Helvetica,Arial,sans-serif;\nfont-weight:700;font-size:clamp(28px,3.4vw,48px);line-height:1.15;letter-spacing:.01em;text-transform:uppercase;\ncolor:#fff;text-shadow:0 1px 10px rgba(0,0,0,.28);pointer-events:none;\nopacity:0;visibility:hidden;\ntransition:bottom .25s ease,opacity .25s ease,visibility .25s ease;\n}\n#jd-bottom-title.is-on{bottom:0;opacity:1;visibility:visible;}\n#jd-bottom-title.is-exit{bottom:-110px!important;opacity:0!important;visibility:hidden!important;}\nbody.jd-home-snap-on #jd-bottom-title,\nbody.jd-menu-open #jd-bottom-title{bottom:-110px!important;opacity:0!important;visibility:hidden!important;}\n.jd-gal-footer > .jd-tour-chrome{display:none!important;}\n\n\n\n/* JD_OVERLAY_VIDEO_CSS_V2 */\n#jd-overlay{overflow:hidden;}\n#jd-overlay-video{\nposition:absolute;inset:0;z-index:0;width:100%;height:100%;\nobject-fit:cover;object-position:center center;\ndisplay:none;pointer-events:none;background:#C5C7AD;\n}\n#jd-overlay.has-video #jd-overlay-video{display:block;}\n#jd-overlay.has-video{background-image:none!important;}\n/* Sage wash above video, same as image menu backgrounds */\n#jd-overlay::before{\ncontent:\"\";\nposition:absolute;inset:0;z-index:1;\nbackground:#C5C7AD;opacity:.55;pointer-events:none;\n}\n#jd-overlay.has-video::before,#jd-overlay.has-media::before{opacity:.55;}\n#jd-overlay .jd-overlay__grid,#jd-overlay .jd-overlay__mark{position:relative;z-index:2;}\n#jd-overlay .jd-overlay__close{position:absolute;z-index:3;}\n\n\n/* JD_INFO_CONTACT_CSS_V3 */\n/* Title/footer break out of thumbs margins; Webflow type + stack */\nbody.jd-info-contact-on #jd-info-page.jd-info-page,\nbody.jd-info-contact-on #jd-info-foot.jd-info-foot{\nwidth:100vw!important;max-width:100vw!important;position:relative!important;left:50%!important;transform:translateX(-50%)!important;box-sizing:border-box!important;margin-left:0!important;margin-right:0!important;\n}\n#jd-info-page.jd-info-page{padding:130px 20px 10px;color:#000;box-sizing:border-box;z-index:2;overflow-x:clip;}\n#jd-info-page *,#jd-info-page *::before,#jd-info-page *::after{box-sizing:border-box;}\n#jd-info-page .jd-info-hero{display:flex;align-items:flex-start;justify-content:flex-start;gap:0;max-width:1200px;width:100%;margin:0 auto;}\n#jd-info-page .jd-info-hero__img{width:50%;max-width:50%;height:auto;display:block;object-fit:cover;}\n#jd-info-page .jd-info-hero__copy{width:50%;max-width:50%;padding:0 0 0 25px;min-width:0;}\n#jd-info-page .jd-info-title{margin:0 0 .2em;color:#45503B;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Arial,sans-serif;font-weight:700;font-size:clamp(34px,4.4em,70px);line-height:1.15;text-transform:uppercase;}\n#jd-info-page .jd-info-bio{margin:0 0 18px;color:#000;font-family:Montserrat,Helvetica,Arial,sans-serif;font-size:15px;font-weight:400;line-height:28px;text-align:justify;border-bottom:2px solid #939680;padding-bottom:5px;}\n#jd-info-page .jd-info-hey{margin:0;color:#000;font-family:Montserrat,Helvetica,Arial,sans-serif;font-size:16px;line-height:30px;}\n#jd-info-page .jd-info-hey__mail{color:#1d2118;font-weight:600;text-decoration:underline;text-underline-offset:2px;}\n#jd-info-page .jd-info-panel{display:flex;align-items:stretch;gap:25px;max-width:1200px;width:100%;margin:40px auto 24px;border:1px solid #45503B;padding-right:25px;}\n#jd-info-page .jd-info-reps{width:40%;background:#45503B;color:#ebe8df;padding:25px;}\n#jd-info-page .jd-info-sub{margin:0 0 14px;color:#45503B;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Arial,sans-serif;font-weight:700;font-size:clamp(22px,2.4vw,34px);line-height:1.1;text-transform:none;}\n#jd-info-page .jd-info-sub--light{color:#ebe8df;}\n#jd-info-page .jd-info-reps__logo{display:block;width:100%;max-width:280px;height:auto;margin:0 0 18px;}\n#jd-info-page .jd-info-reps__name{margin:16px 0 6px;color:#ebe8df;font-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Arial,sans-serif;font-size:14px;font-weight:500;letter-spacing:1px;line-height:23px;}\n#jd-info-page .jd-info-reps__mail{margin:0;font-family:Montserrat,Helvetica,Arial,sans-serif;font-size:16px;line-height:1.4;}\n#jd-info-page .jd-info-reps__mail a{color:#ebe8df;text-decoration:underline;text-underline-offset:2px;}\n#jd-info-page .jd-info-clients{width:60%;padding:22px 0;min-width:0;}\n#jd-info-page .jd-info-clients__list{margin:0;color:#000;font-family:Montserrat,Helvetica,Arial,sans-serif;font-size:15px;line-height:28px;text-align:justify;}\nbody.jd-info-contact-on .footerview,\nbody.jd-info-contact-on .jd-proj-title,\nbody.jd-info-contact-on .bottomTitle,\nbody.jd-info-contact-on [class*=\"bottomTitle\"]{display:none!important;}\nbody.jd-info-contact-on .Thumbs\\.container{padding-top:0!important;}\nbody.jd-info-contact-on #jd-info-page .jd-info-title{color:#45503B!important;text-shadow:none!important;}\nbody.jd-info-contact-on #jd-info-page .jd-info-bio,\nbody.jd-info-contact-on #jd-info-page .jd-info-hey,\nbody.jd-info-contact-on #jd-info-page .jd-info-clients__list{color:#000!important;}\n#jd-info-foot.jd-info-foot{padding:0;box-sizing:border-box;}\n#jd-info-foot .jd-info-form-wrap{max-width:1200px;margin:28px auto 8px;padding:0 20px 10px;}\n#jd-info-foot .jd-info-form{min-height:140px;}\n#jd-info-foot .jd-gal-footer{margin-top:18px!important;}\n.ff-671c8d4c6056304e3a6c5f50__title{color:#45503b!important;font-family:\"Midnight Sans Rd 36 Pro\",sans-serif!important;}\n.ff-671c8d4c6056304e3a6c5f50__subtitle{color:#000!important;}\n.fd-form-label{color:#000!important;font-family:Montserrat,sans-serif!important;border-color:#45503b!important;}\n.ff-671c8d4c6056304e3a6c5f50__control{color:#000!important;font-family:Montserrat,sans-serif!important;border-color:#45503b!important;}\n.ff-671c8d4c6056304e3a6c5f50__button{background:#45503b!important;border:1px solid #45503b!important;font-family:Montserrat,sans-serif!important;}\n.ff-671c8d4c6056304e3a6c5f50__container,.ff-671c8d4c6056304e3a6c5f50{background:#c5c7ac!important;}\n@media (max-width:991px){\n#jd-info-page.jd-info-page{padding:110px 20px 10px;}\n#jd-info-page .jd-info-hero{flex-direction:column;max-width:none;}\n#jd-info-page .jd-info-hero__img,#jd-info-page .jd-info-hero__copy{width:100%;max-width:100%;}\n#jd-info-page .jd-info-hero__copy{padding:18px 0 0;}\n#jd-info-page .jd-info-title{text-align:center;font-size:3.6em;line-height:1.15;}\n#jd-info-page .jd-info-panel{flex-direction:column;gap:0;margin:24px 0;padding-right:0;max-width:none;}\n#jd-info-page .jd-info-reps,#jd-info-page .jd-info-clients{width:100%;}\n#jd-info-page .jd-info-clients{padding:18px 20px 20px;}\n#jd-info-page .jd-info-reps__name,#jd-info-page .jd-info-reps__mail{text-align:center;}\n#jd-info-page .jd-info-reps__logo{margin-left:auto;margin-right:auto;}\n#jd-info-foot .jd-info-form-wrap{padding:0 16px 10px;}\n}\n@media (max-width:479px){\n#jd-info-page.jd-info-page{padding:110px 15px 10px;}\n#jd-info-page .jd-info-title{font-size:2.2em;line-height:1.2;}\n#jd-info-page .jd-info-bio{font-size:13px;line-height:21px;text-align:left;margin-top:10px;}\n#jd-info-page .jd-info-hey{font-size:14px;line-height:24px;}\n#jd-info-page .jd-info-clients__list{font-size:13px;line-height:21px;}\n#jd-info-page .jd-info-sub{font-size:24px;line-height:24px;}\n#jd-info-page .jd-info-reps__name{font-size:12px;}\n}\n\n\n\n/* JD_HOVER_SCALE_V2 */\n/* Chrome / home grow; thumbs: grow the cell lightly (1.03) */\n.jd-chrome__link,\n.jd-chrome__ig,\n#jd-amp-trigger,\n.ampersand-menu-trigger,\n.logoText,\n.LogoView,\n#logo{\ntransition:transform 250ms ease!important;\ntransform-origin:center center!important;\n}\n.jd-chrome__link:hover,\n.jd-chrome__ig:hover,\n#jd-amp-trigger:hover,\n.ampersand-menu-trigger:hover,\n.logoText:hover,\n.LogoView:hover,\n#logo:hover{\ntransform:scale(1.15)!important;\n}\nbody.jd-home-snap-on .logoText:hover{transform:scale(1.15)!important;}\n.jd-home-snap__panel{overflow:hidden;}\n.jd-home-snap__bg{\nposition:absolute;inset:0;display:block;\nbackground-position:center;background-size:cover;background-repeat:no-repeat;\ntransition:transform 450ms cubic-bezier(.16,1,.3,1)!important;\ntransform-origin:center center!important;will-change:transform;z-index:0;\n}\n.jd-home-snap__panel .jd-home-snap__vid{\ntransition:transform 450ms cubic-bezier(.16,1,.3,1)!important;\ntransform-origin:center center!important;will-change:transform;\n}\n.jd-home-snap__panel .jd-home-snap__label{z-index:2;}\n.jd-home-snap__panel:hover .jd-home-snap__vid,\n.jd-home-snap__panel:hover .jd-home-snap__bg{\ntransform:scale(1.15)!important;\n}\n/* Gallery thumbs: light cell grow */\nbody:not(.jd-home-snap-on) .Thumbs\\.grid{\noverflow:visible!important;\n}\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div{\ntransition:transform 280ms cubic-bezier(.16,1,.3,1)!important;\ntransform-origin:center center!important;\nwill-change:transform;\n}\n\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div > div{\noverflow:hidden!important;\n}\n/* Info-contact BTS tiles */\n#jd-info-page .jd-info-tile{overflow:hidden;}\n#jd-info-page .jd-info-tile__img{\ntransition:transform 280ms cubic-bezier(.16,1,.3,1)!important;\ntransform-origin:center center!important;\n}\n#jd-info-page .jd-info-tile:hover .jd-info-tile__img{transform:scale(1.15)!important;}\n\n\n\n/* JD_HOME_SCROLL_CUE_V1 */\n.jd-home-snap__panel{overflow:visible;}\n.jd-scroll-wrapper{width:200px;height:200px;display:flex;flex-direction:row;align-items:center;justify-content:space-between;transform:rotate(90deg);position:absolute;bottom:0;left:calc(50% - 100px);z-index:4;pointer-events:none;animation:jd-scrollIconBounce 3.5s infinite ease-in-out;-webkit-animation:jd-scrollIconBounce 3.5s infinite ease-in-out;opacity:0;visibility:hidden;}\n.jd-home-snap__panel.is-active .jd-scroll-wrapper{opacity:1;visibility:visible;}\n.jd-home-snap__panel:not(.is-active) .jd-scroll-wrapper{opacity:0;visibility:hidden;animation:none;}\n.jd-scroll-line-wrapper{display:flex;flex-direction:column;width:100%;}\n.jd-scroll-text{font-family:p22-mackinac-pro,Georgia,\"Times New Roman\",serif;padding-right:10px;color:#fff;letter-spacing:.08em;font-size:12px;line-height:1;text-transform:uppercase;}\n.jd-scroll-line-wrapper span:last-child{border-top:2px solid #fff;}\n@keyframes jd-scrollIconBounce{0%{bottom:0;}50%{bottom:-50px;}100%{bottom:0;}}\n@media only screen and (max-width:991px){\n.jd-scroll-wrapper{bottom:-50px;}\n@keyframes jd-scrollIconBounce{0%{bottom:-50px;}50%{bottom:-90px;}100%{bottom:-50px;}}\n}\n#jd-home-snap:not(.is-on) .jd-scroll-wrapper,.jd-home-snap:not(.is-on) .jd-scroll-wrapper{display:none!important;}\n\n\n\n/* JD_WF_BP_V1 */\n/* Webflow chrome + home corner breakpoints (overrides earlier pads) */\n.jd-chrome{top:40px!important;right:40px!important;gap:20px!important;align-items:center!important;}\n.jd-chrome__link{font-size:40px!important;line-height:40px!important;}\n.jd-chrome__ig,.jd-chrome__ig img{width:20px!important;height:20px!important;max-width:20px!important;}\n#jd-amp-trigger,.ampersand-menu-trigger,.ampersand-menu-trigger .image-2,.ampersand-menu-trigger .amp-grow{width:48px!important;}\n.jd-home-snap__label{left:40px!important;bottom:40px!important;font-size:36px!important;line-height:36px!important;}\n.jd-home-snap__tag{right:40px!important;bottom:40px!important;font-size:28px!important;line-height:28px!important;transform:none!important;}\n@media (max-width:991px){\n.jd-chrome{top:40px!important;right:40px!important;gap:20px!important;}\n.jd-chrome__ig,.jd-chrome__ig img{width:28px!important;height:28px!important;max-width:28px!important;}\n#jd-amp-trigger,.ampersand-menu-trigger,.ampersand-menu-trigger .image-2,.ampersand-menu-trigger .amp-grow{width:48px!important;}\nbody:not(.jd-home-snap-on)::before{height:130px!important;}\n.jd-home-snap__tag{bottom:240px!important;right:-200px!important;transform:rotate(90deg)!important;transform-origin:center center!important;font-size:28px!important;line-height:28px!important;}\n}\n@media (max-width:767px){\n.jd-chrome{top:20px!important;right:20px!important;gap:16px!important;}\n.jd-chrome__ig,.jd-chrome__ig img{width:28px!important;height:28px!important;max-width:28px!important;}\nbody:not(.jd-home-snap-on)::before{height:100px!important;}\n.jd-home-snap__label{left:20px!important;bottom:20px!important;font-size:18px!important;line-height:18px!important;}\n.jd-home-snap__tag{bottom:130px!important;right:-95px!important;transform:rotate(90deg)!important;font-size:14px!important;line-height:14px!important;}\n}\n@media (max-width:479px){\n.jd-chrome{top:20px!important;right:20px!important;gap:14px!important;}\n.jd-home-snap__label{left:20px!important;bottom:20px!important;font-size:18px!important;line-height:18px!important;}\n.jd-home-snap__tag{bottom:130px!important;right:-95px!important;font-size:14px!important;line-height:14px!important;}\n}\n\n\n\n/* JD_MOTION_THUMB_LOOP_CSS_V1 */\nbody.jd-motion-thumbs-on .Thumbs\\.grid [class*=\"play\"],\nbody.jd-motion-thumbs-on .Thumbs\\.grid [class*=\"Play\"],\nbody.jd-motion-thumbs-on .Thumbs\\.grid .videoPlayIcon,\nbody.jd-motion-thumbs-on .Thumbs\\.grid svg[class*=\"play\" i]{\nopacity:0!important;visibility:hidden!important;pointer-events:none!important;\n}\nbody.jd-motion-thumbs-on .Thumbs\\.grid video{\nobject-fit:cover!important;\n}\n\n\n\n/* JD_OVERLAY_CLOSE_SIZE_V1 */\n.jd-overlay__close{\nfont-size:72px!important;\nline-height:.9!important;\nfont-weight:300!important;\ntop:18px!important;\nright:22px!important;\npadding:6px 10px!important;\n}\n@media (max-width:900px){\n.jd-overlay__close{\nfont-size:56px!important;\ntop:10px!important;\nright:12px!important;\npadding:4px 8px!important;\n}\n}\n\n\n\n/* JD_THUMBS_DIRECTOR_CSS_V1 */\n/* Single scroller + thumbs unlock surface */\nbody.jd-thumbs-page .SiteView{\nheight:auto!important;\nmin-height:100vh!important;\noverflow:visible!important;\n}\nbody.jd-thumbs-page .Thumbs\\.container,\nbody.jd-thumbs-page .Thumbs\\.mask,\nbody.jd-thumbs-page .Thumbs\\.grid\\.container{\noverflow:visible!important;\n}\nhtml:has(body.jd-thumbs-page){\nheight:auto!important;\noverflow-x:hidden!important;\noverflow-y:auto!important;\n}\n/* Body must be overflow:visible on BOTH axes. Mixing x:hidden + y:visible\n   computes y to auto and creates a second scrollport (wheel-dead feel). */\nhtml:has(body.jd-thumbs-page) body,\nbody.jd-thumbs-page{\nheight:auto!important;\nmin-height:100vh!important;\noverflow:visible!important;\n}\nbody.jd-thumbs-page .OverlayView{\noverflow:visible!important;\nmax-height:none!important;\n}\n\n\n\n/* JD_THUMBS_SCROLL_UNLOCK_CSS_V2 */\n/* Single scroller + thumbs unlock surface */\nbody.jd-thumbs-page .SiteView{\nheight:auto!important;\nmin-height:100vh!important;\noverflow:visible!important;\n}\nbody.jd-thumbs-page .Thumbs\\.container,\nbody.jd-thumbs-page .Thumbs\\.mask,\nbody.jd-thumbs-page .Thumbs\\.grid\\.container{\noverflow:visible!important;\n}\nhtml:has(body.jd-thumbs-page){\nheight:auto!important;\noverflow-x:hidden!important;\noverflow-y:auto!important;\n}\n/* Body must be overflow:visible on BOTH axes. Mixing x:hidden + y:visible\n   computes y to auto and creates a second scrollport (wheel-dead feel). */\nhtml:has(body.jd-thumbs-page) body,\nbody.jd-thumbs-page{\nheight:auto!important;\nmin-height:100vh!important;\noverflow:visible!important;\n}\nbody.jd-thumbs-page .OverlayView{\noverflow:visible!important;\nmax-height:none!important;\n}\n\n\n\n/* JD_THUMB_SCROLL_ZOOM_CSS_V2 */\n/* Clip media wraps only — cells stay visible so hover labels can show */\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div{\noverflow:visible!important;\n}\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div > div:has(img),\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div > div:has(video){\noverflow:hidden!important;\n}\nbody:not(.jd-home-snap-on) .Thumbs\\.grid img,\nbody:not(.jd-home-snap-on) .Thumbs\\.grid video{\ndisplay:block;\nwidth:100%!important;\nheight:100%!important;\nobject-fit:cover;\nobject-position:center 50%;\nwill-change:transform,object-position;\nbackface-visibility:hidden;\n}\n@media (prefers-reduced-motion:reduce){\nbody:not(.jd-home-snap-on) .Thumbs\\.grid img,\nbody:not(.jd-home-snap-on) .Thumbs\\.grid video{\ntransform:none!important;\nwill-change:auto;\n}\n}\n\n\n/* JD_PHOTO_LABEL_TITLE_CLEAR_V1 */\n/* PHOTO hover labels + title clearance above organic thumbs */\n/* Keep scroll-zoom crop on media only — never clip label spans */\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div{\noverflow:visible!important;\n}\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div > div:has(img),\nbody:not(.jd-home-snap-on) .Thumbs\\.grid > div > div:has(video){\noverflow:hidden!important;\n}\n/* PHOTO index labels */\nbody.jd-photo-index .Thumbs\\.grid > div > span{\npointer-events:none!important;\nz-index:6!important;\ncolor:#fff!important;\ntext-shadow:0 1px 10px rgba(0,0,0,.35);\nfont-family:\"Midnight Sans Rd 36 Pro\",MidnightSansRd36Heavy,Montserrat,Helvetica,Arial,sans-serif!important;\nfont-weight:700!important;\nletter-spacing:.02em;\ntext-transform:uppercase;\ntext-align:center;\ntop:auto!important;\nbottom:14px!important;\nleft:0!important;\nwidth:100%!important;\n/* DX already drives label opacity — our transition stuck at 0 forever */\ntransition:none!important;\n}\nbody.jd-photo-index .Thumbs\\.grid > div:hover > span,\nbody.jd-photo-index .Thumbs\\.grid > div.jd-thumb-hov > span,\nbody.jd-photo-index .Thumbs\\.grid > div:focus-within > span{\nopacity:1!important;\nvisibility:visible!important;\n}\n/* COMMISSIONS + personal title blocks sit above overlapping organic thumbs */\nbody:not(.jd-home-snap-on) #jd-proj-title,\nbody:not(.jd-home-snap-on) .jd-proj-title,\nbody:not(.jd-home-snap-on) #jd-photo-title,\nbody:not(.jd-home-snap-on) #jd-motion-title,\nbody:not(.jd-home-snap-on) #jd-athleta-title{\nposition:relative!important;\nz-index:20!important;\nmargin:0 0 28px!important;\npadding:100px 40px 72px!important;\npointer-events:none;\n}\n@media (max-width:700px){\nbody:not(.jd-home-snap-on) #jd-proj-title,\nbody:not(.jd-home-snap-on) .jd-proj-title,\nbody:not(.jd-home-snap-on) #jd-photo-title,\nbody:not(.jd-home-snap-on) #jd-motion-title,\nbody:not(.jd-home-snap-on) #jd-athleta-title{\npadding:72px 18px 56px!important;\nmargin-bottom:20px!important;\n}\n}\n\n\n/* JD_HOME_SNAP_MOBILE_V2 */\n/* Phone home: true full-bleed. Keep home slide and media scale effects enabled. */\nhtml:has(body.jd-home-snap-on),\nbody.jd-home-snap-on{\nheight:100%!important;\nheight:100dvh!important;\nheight:-webkit-fill-available!important;\noverflow:hidden!important;\noverscroll-behavior:none!important;\nbackground:#C5C7AD!important;\n}\n#jd-home-snap{\nposition:fixed!important;\ninset:0!important;\ntop:0!important;\nleft:0!important;\nright:0!important;\nbottom:0!important;\nwidth:100%!important;\nheight:100%!important;\nheight:100dvh!important;\nheight:-webkit-fill-available!important;\nmax-height:none!important;\noverflow:hidden!important;\nbackground:#C5C7AD!important;\ntransform:none!important;\n}\n.jd-home-snap__scroller{\nposition:absolute!important;\ninset:0!important;\nwidth:100%!important;\nheight:100%!important;\noverflow-x:hidden!important;\noverflow-y:auto!important;\noverscroll-behavior-y:none!important;\n-webkit-overflow-scrolling:touch;\ntouch-action:pan-y;\nbackground:#C5C7AD!important;\n}\n.jd-home-snap__panel{\nposition:relative!important;\nwidth:100%!important;\nheight:100%!important;\nheight:100dvh!important;\nheight:-webkit-fill-available!important;\nmin-height:100%!important;\nmin-height:100dvh!important;\nmin-height:-webkit-fill-available!important;\nmax-height:none!important;\noverflow:hidden!important;\nbox-sizing:border-box!important;\nfilter:none!important;\nopacity:1!important;\nwill-change:auto!important;\n}\n.jd-home-snap__panel.is-active{\nz-index:2!important;\nopacity:1!important;\nvisibility:visible!important;\n}\n.jd-home-snap__panel.is-leaving,\n.jd-home-snap__panel.is-idle{\nopacity:0!important;\nvisibility:hidden!important;\npointer-events:none!important;\n}\n.jd-home-snap__bg,\n.jd-home-snap__vid{\nposition:absolute!important;\ninset:0!important;\nwidth:100%!important;\nheight:100%!important;\nobject-fit:cover!important;\nbackground-size:cover!important;\nbackground-position:center center!important;\nbackground-repeat:no-repeat!important;\n}\n.jd-home-snap__panel.is-active .jd-home-snap__label{\nopacity:1!important;\nfilter:none!important;\n}\n.jd-home-snap__panel:hover .jd-home-snap__vid,\n.jd-home-snap__panel:hover .jd-home-snap__bg{\n}\nbody:not(.jd-home-snap-on) .Thumbs\\.container,\nbody:not(.jd-home-snap-on) [class*=\"Thumbs\"],\nbody:not(.jd-home-snap-on) .MediaView\\.container,\nbody:not(.jd-home-snap-on) #jd-proj-title,\nbody:not(.jd-home-snap-on) .jd-proj-title,\nbody:not(.jd-home-snap-on) #jd-photo-title,\nbody:not(.jd-home-snap-on) #jd-athleta-title,\nbody:not(.jd-home-snap-on) #jd-motion-title{\nopacity:1!important;\nvisibility:visible!important;\npointer-events:auto!important;\n}\n\n\n/* JD_PHOTO_MENU_CSS_V1 */\n.jd-photo-menu-trigger {\n  position: relative;\n  display: inline-block !important;\n  cursor: pointer;\n  isolation: isolate;\n}\n.jd-photo-menu-trigger .jd-photo-menu__label {\n  position: relative;\n  z-index: 1;\n  display: inline-block;\n}\n.jd-photo-menu-trigger::after {\n  content: attr(data-jd-glow-label);\n  position: absolute;\n  inset: 0;\n  z-index: 0;\n  color: currentColor;\n  opacity: .65;\n  pointer-events: none;\n  transform-origin: center center;\n  filter: blur(.5px);\n  animation: jd-photo-menu-glow-v1 1s ease-out infinite;\n}\n@keyframes jd-photo-menu-glow-v1 {\n  0% { opacity: .65; transform: scale(1); filter: blur(.5px); }\n  100% { opacity: 0; transform: scale(1.2); filter: blur(4px); }\n}\n@media (max-width: 991px) {\n  .jd-chrome .jd-photo-menu-trigger {\n    display: inline-block !important;\n    font-size: 16px !important;\n  }\n}\n@media (max-width: 800px) {\n  .jd-chrome .jd-photo-menu-trigger {\n    font-size: 16px !important;\n  }\n}\nbody.jd-menu-open .jd-chrome .jd-photo-menu-trigger {\n  display: none !important;\n}\n.jd-photo-flat-menu .jd-overlay__kids {\n  display: none !important;\n}\n@media (prefers-reduced-motion: reduce) {\n  .jd-photo-menu-trigger::after {\n    animation: none;\n    opacity: .25;\n  }\n}\n\n\n/* JD_FOOTER_SANS_V1 */\n.jd-gal-footer__copy,.jd-gal-footer__legal{\nfont-family:\"Midnight Sans St 36 Pro\",MidnightSansSt36Heavy,Montserrat,Helvetica,Arial,sans-serif!important;\nfont-weight:500;\nletter-spacing:.02em;\n}\n\n\n/* JD_CHROME_MOBILE_LINKS_SIZE_V1 */\n@media (max-width:991px){\n.jd-chrome__link{display:inline-block!important;font-size:16px!important;line-height:1!important;}\n}\n@media (max-width:767px){\n.jd-chrome__link{font-size:16px!important;line-height:1!important;}\n}\n\n\n/* JD_FOOTER_MOBILE_V1 */\n@media (max-width:767px){\n.jd-gal-footer{margin:40px 0 0;padding:18px 18px 22px;}\n.jd-gal-footer .jd-tour-row{margin:0 0 10px;gap:10px;align-items:flex-end;}\n.jd-tour-chrome__up{width:36px;height:36px;margin:0 0 8px;}\n.jd-tour-chrome__next{padding:0;min-width:0;}\n.jd-tour-chrome__kicker{font-size:10px;letter-spacing:.08em;}\n.jd-tour-chrome__name{font-size:18px;line-height:1.05;}\n.jd-gal-footer__nav{\ndisplay:grid;grid-template-columns:1fr 1fr;gap:12px 18px;\njustify-items:center;padding:2px 0 14px;\n}\n.jd-gal-footer__link{font-size:13px;letter-spacing:.03em;}\n.jd-gal-footer__rule{margin:0 0 10px;}\n.jd-gal-footer__bottom{\nalign-items:center;flex-direction:column;gap:6px;text-align:center;\n}\n.jd-gal-footer__copy,.jd-gal-footer__legal{\nfont-size:11px;line-height:1.35;letter-spacing:.01em;font-weight:400;\n}\n.jd-gal-footer__legal{justify-content:center;gap:14px;}\n}\n\n\n/* JD_OVERLAY_MENU_SIZE_V1 */\n/* Longer PHOTO flat menu: keep readable, stop overflow squeeze */\n.jd-photo-flat-menu .jd-overlay__parents{\ngap:clamp(10px,1.6vh,18px)!important;\n}\n.jd-photo-flat-menu .jd-overlay__item,\n.jd-photo-flat-menu .jd-photo-flat-item,\n.jd-photo-flat-menu .jd-overlay__item--parent{\nfont-size:clamp(22px,3.2vw,48px)!important;\nline-height:1.05!important;\n}\n.jd-photo-flat-menu .jd-overlay__bar{\nwidth:6px!important;\n}\n@media (max-width:900px){\n.jd-photo-flat-menu .jd-overlay__grid{padding-top:10vh!important;}\n.jd-photo-flat-menu .jd-overlay__item,\n.jd-photo-flat-menu .jd-photo-flat-item,\n.jd-photo-flat-menu .jd-overlay__item--parent{\nfont-size:clamp(20px,5.4vw,34px)!important;\n}\n}\n@media (max-width:479px){\n.jd-photo-flat-menu .jd-overlay__item,\n.jd-photo-flat-menu .jd-photo-flat-item,\n.jd-photo-flat-menu .jd-overlay__item--parent{\nfont-size:clamp(18px,5vw,28px)!important;\n}\n}\n",
  "siteJs": "\n/* JD_LOGO_BODY_V13 */\n(function(){\nif(window.__JD_LOGO_BODY_V13__)return;\nwindow.__JD_LOGO_BODY_V13__=true;\nvar GSAP_SRC=\"https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.2/gsap.min.js\";\nvar tl=null, mode=\"\", syncTimer=null;\nvar park={el:null,parent:null,next:null};\nfunction loadGsap(){\nif(window.gsap)return Promise.resolve(window.gsap);\nreturn new Promise(function(resolve,reject){\nif(document.querySelector('script[data-jd-logo-draw-gsap=\"1\"]')){\nvar wait=setInterval(function(){if(window.gsap){clearInterval(wait);resolve(window.gsap);}},40);\nreturn;\n}\nvar s=document.createElement(\"script\");\ns.src=GSAP_SRC;s.async=true;s.setAttribute(\"data-jd-logo-draw-gsap\",\"1\");\ns.onload=function(){resolve(window.gsap);};s.onerror=reject;\n(document.head||document.documentElement).appendChild(s);\n});\n}\nfunction pathsReady(){return document.querySelectorAll(\"#logo-fill path\").length>0;}\nfunction killTl(){if(tl&&tl.kill)tl.kill();tl=null;if(window.gsap)gsap.killTweensOf([\"#logo-fill path\",\"#logo-fill\"]);}\nfunction sizeLogo(){\nvar svg=document.querySelector(\"#jordan-dani-logo\");\nif(!svg)return;\nvar vw=Math.max(320,window.innerWidth||1200);\nvar topPad=30,leftPad=40,w=250,h=89;\nif(vw<=767){topPad=20;leftPad=20;w=180;h=64;}\nelse if(vw<=991){topPad=30;leftPad=40;w=180;h=64;}\nelse{topPad=30;leftPad=40;w=250;h=89;}\nsvg.setAttribute(\"width\",String(w));svg.setAttribute(\"height\",String(h));\nsvg.setAttribute(\"preserveAspectRatio\",\"xMinYMid meet\");\nsvg.style.setProperty(\"width\",w+\"px\",\"important\");\nsvg.style.setProperty(\"height\",h+\"px\",\"important\");\nsvg.style.setProperty(\"max-width\",w+\"px\",\"important\");\nsvg.style.setProperty(\"max-height\",h+\"px\",\"important\");\nsvg.style.setProperty(\"display\",\"block\",\"important\");\nsvg.style.setProperty(\"opacity\",\"1\",\"important\");\nvar lt=document.querySelector(\".logoText\");\nif(lt){\nlt.style.setProperty(\"width\",w+\"px\",\"important\");\nlt.style.setProperty(\"max-width\",w+\"px\",\"important\");\nlt.style.setProperty(\"height\",\"auto\",\"important\");\nlt.style.setProperty(\"max-height\",h+\"px\",\"important\");\nlt.style.setProperty(\"top\",topPad+\"px\",\"important\");\nlt.style.setProperty(\"left\",leftPad+\"px\",\"important\");\n}\n}\nfunction parkLogo(on){\nvar lt=document.querySelector(\".logoText\");\nif(!lt)return;\nif(on){\nif(lt.parentElement===document.body)return;\npark.el=lt;park.parent=lt.parentElement;park.next=lt.nextSibling;\ndocument.body.appendChild(lt);\n}else if(park.el&&park.parent){\nif(park.next&&park.next.parentElement===park.parent)park.parent.insertBefore(park.el,park.next);\nelse park.parent.appendChild(park.el);\npark.el=null;park.parent=null;park.next=null;\n}\n}\nfunction prepStroke(){\nsizeLogo();\ndocument.querySelectorAll(\"#logo-fill path\").forEach(function(path){\nvar length=path.getTotalLength();\npath.style.strokeDasharray=String(length);\npath.style.strokeDashoffset=String(length);\npath.style.opacity=\"1\";\n});\nvar fill=document.querySelector(\"#logo-fill\");\nif(fill){fill.style.fill=\"none\";fill.style.stroke=\"#ffffff\";}\n}\nfunction runHomeAnim(){\nif(!window.gsap||!pathsReady())return false;\nparkLogo(true);sizeLogo();\nif(mode===\"home\"&&tl)return true;\nkillTl();mode=\"home\";prepStroke();\ntl=gsap.timeline({repeat:-1,repeatDelay:1.2});\ntl.to(\"#logo-fill path\",{strokeDashoffset:0,duration:1.35,ease:\"power2.out\",stagger:0.04})\n.to(\"#logo-fill\",{fill:\"#ffffff\",stroke:\"#ffffff\",duration:0.7},\"+=0.2\")\n.to(\"#logo-fill\",{stroke:\"#68B1AA\",fill:\"#68B1AA\",duration:0.9})\n.to(\"#logo-fill\",{stroke:\"#CCA958\",fill:\"#CCA958\",duration:0.9})\n.to(\"#logo-fill\",{stroke:\"#ffffff\",fill:\"#ffffff\",duration:0.9});\nreturn true;\n}\nfunction runGreenLogo(){\nif(!window.gsap||!pathsReady())return false;\nparkLogo(true);sizeLogo();\nif(mode===\"green\")return true;\nkillTl();mode=\"green\";\ndocument.querySelectorAll(\"#logo-fill path\").forEach(function(path){\npath.style.strokeDasharray=\"none\";path.style.strokeDashoffset=\"0\";path.style.opacity=\"1\";\n});\ngsap.set(\"#logo-fill\",{fill:\"#45503B\",stroke:\"#45503B\"});\ngsap.set(\"#logo-fill path\",{strokeDashoffset:0});\nreturn true;\n}\nfunction isHome(){return document.body.classList.contains(\"jd-home-snap-on\");}\nfunction syncLogo(){\nif(syncTimer)clearTimeout(syncTimer);\nsyncTimer=setTimeout(function(){if(isHome())runHomeAnim();else runGreenLogo();},40);\n}\nfunction boot(){\nif(!document.documentElement.dataset.jdLogoResizeBound){document.documentElement.dataset.jdLogoResizeBound=\"1\";window.addEventListener(\"resize\",function(){sizeLogo();});}\n\nloadGsap().then(function(){\nvar n=0;var t=setInterval(function(){syncLogo();if((mode&&pathsReady())||++n>60)clearInterval(t);},120);\nsyncLogo();\n}).catch(function(){});\ndocument.addEventListener(\"menuClosed\",syncLogo);\ntry{if(window.dx&&dx.address&&typeof dx.address.addListener===\"function\")dx.address.addListener(function(){setTimeout(syncLogo,50);});}catch(e){}\nnew MutationObserver(function(){syncLogo();}).observe(document.body,{attributes:true,attributeFilter:[\"class\"]});\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\n})();\n\n\n/* JD_CHROME_V16 */\n(function(){\nif(window.__JD_CHROME_V16__)return;\nwindow.__JD_CHROME_V16__=true;\nvar isMenuOpen=false;\nvar cache={sections:null,media:null,tree:[],byKey:{},defaultSrc:\"\"};\nvar OVERLAY_OPEN_VIDEO=\"https://jordandani.s3.us-west-2.amazonaws.com/homepage-videos/SIZZLE_REEL.mp4\";\nvar activeParentKey=\"\";\nvar PATH_ALIAS={\"CONTACT + INFO\":\"/CONTACT-+-INFO\",\"CONTACT-+-INFO\":\"/CONTACT-+-INFO\",\"CONTACT\":\"/CONTACT-+-INFO\",\"MAKERS\":\"/HOME/Makers/thumbs\",\"HOME/Makers\":\"/HOME/Makers/thumbs\",\"HOME/Athleta\":\"/HOME/Athleta/thumbs\"};\nvar PARENT_LABEL={COMMISIONS:\"COMMISSIONS\",\"CONTACT + INFO\":\"CONTACT+INFO\",HOME:\"PERSONAL\"};\nvar PARENT_BG={MOTION:OVERLAY_OPEN_VIDEO,PHOTO:\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/67dc6b8e834b7ef7dcea1dfd_SCO_0024%20(1)%20(1).jpg\",HOME:\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/670deab672e79e458a96a5ff_Surf.jpg\",PERSONAL:\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/670deab672e79e458a96a5ff_Surf.jpg\",COMMISIONS:\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/670deab5251e46afcd204fcd_Royal%20Caribbean.jpg\",COMMISSIONS:\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/670deab5251e46afcd204fcd_Royal%20Caribbean.jpg\",\"CONTACT + INFO\":\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/671f3f7df664f503f69f1cad_jdbts.jpg\",\"CONTACT+INFO\":\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/671f3f7df664f503f69f1cad_jdbts.jpg\"};\nfunction parentBgFor(section){\nvar k=String(section&&section.key||\"\");\nif(PARENT_BG[k])return PARENT_BG[k];\nvar lab=normalizeLabel(section&&section.label||\"\");\nif(PARENT_BG[lab])return PARENT_BG[lab];\nif(lab===\"PERSONAL\")return PARENT_BG.HOME||\"\";\nif(lab===\"COMMISSIONS\")return PARENT_BG.COMMISIONS||\"\";\nif(lab===\"CONTACT+INFO\"||lab===\"CONTACT + INFO\"||lab===\"CONTACT-+-INFO\")return PARENT_BG[\"CONTACT + INFO\"]||\"\";\nreturn \"\";\n}\nfunction withThumbs(path){var p=String(path||\"/\").replace(/\\/+$/,\"\");if(!p||p===\"/\")return \"/\";if(/\\/thumbs$/i.test(p))return p;if(/\\/\\d+$/.test(p))return p.replace(/\\/\\d+$/,\"/thumbs\");return p+\"/thumbs\";}\nfunction routeTo(path){\nvar raw=String(path||\"/\");\nvar bare=raw.replace(/^\\/+/,\"\");\nvar upper=bare.toUpperCase();\nif(PATH_ALIAS[upper])raw=PATH_ALIAS[upper];\nelse if(PATH_ALIAS[bare])raw=PATH_ALIAS[bare];\nif(raw!==\"/\"&&raw.indexOf(\"/CONTACT\")!==0)raw=withThumbs(raw);\ntry{if(window.__jdMarkNav)window.__jdMarkNav();}catch(e){}\ntry{if(window.__jdHideHome)window.__jdHideHome();}catch(e){}\ntry{if(window.dx&&dx.address&&typeof dx.address.setValue===\"function\"){dx.address.setValue(raw);try{if(window.__jdHideHome)window.__jdHideHome();}catch(e2){}return;}}catch(e){}\ntry{if(window.__jdHideHome)window.__jdHideHome();}catch(e){}\nwindow.location.href=raw;\n}\nfunction menuView(){\ntry{return window.dx&&dx.site&&dx.site.menuController&&dx.site.menuController.menuView;}catch(e){return null;}\n}\nfunction openMenu(focusKey){\nif(isMenuOpen){\nif(focusKey){activeParentKey=focusKey;ensureData(true).then(function(){renderOverlay();var n=cache.tree.find(function(x){return x.key===activeParentKey;});if(n)showOverlayBg(n.src||cache.defaultSrc||\"\");});}\nreturn;\n}\nvar mv=menuView();\ntry{if(mv&&typeof mv.openDock===\"function\")mv.openDock();}catch(e){}\nisMenuOpen=true;\ndocument.body.classList.add(\"jd-menu-open\");\ndocument.dispatchEvent(new Event(\"menuOpened\"));\nif(focusKey)activeParentKey=focusKey;\nelse{var routeKey=routeParentKey();if(routeKey)activeParentKey=routeKey;}\nensureData(true).then(function(){renderOverlay();playOverlayVideo(OVERLAY_OPEN_VIDEO);});\n}\nfunction closeMenu(){\nif(!isMenuOpen)return;\nvar mv=menuView();\ntry{if(mv&&typeof mv.closeDock===\"function\")mv.closeDock();}catch(e){}\nisMenuOpen=false;\nstopOverlayVideo();\ndocument.body.classList.remove(\"jd-menu-open\");\ndocument.dispatchEvent(new Event(\"menuClosed\"));\nvar ov=document.getElementById(\"jd-overlay\");\nif(ov){ov.classList.remove(\"is-on\");ov.classList.remove(\"has-media\");ov.style.backgroundImage=\"\";}\n}\nfunction toggleMenu(){if(isMenuOpen)closeMenu();else openMenu();}\nwindow.openMenu=openMenu;window.closeMenu=closeMenu;window.toggleMenu=toggleMenu;\nfunction ensureChrome(){\nvar existing=document.getElementById(\"jd-chrome\");\nif(existing)return existing;\nvar el=document.createElement(\"div\");\nel.id=\"jd-chrome\";el.className=\"jd-chrome\";\nel.innerHTML='<a class=\"jd-chrome__link\" data-jd-route=\"/PHOTO/thumbs\" href=\"/PHOTO/thumbs\">PHOTO</a><a class=\"jd-chrome__link\" data-jd-route=\"/MOTION/thumbs\" href=\"/MOTION/thumbs\">MOTION</a><a href=\"javascript:void(0)\" class=\"ampersand-menu-trigger\" id=\"jd-amp-trigger\" aria-label=\"Menu\"><img src=\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/6732322489e2b00afce86696_jd_logo_ampersandMark_pine.svg\" width=\"48\" alt=\"\" class=\"image-2\"><img src=\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/6732322489e2b00afce86696_jd_logo_ampersandMark_pine.svg\" width=\"48\" alt=\"\" class=\"amp-grow\"></a><a class=\"jd-chrome__ig\" href=\"https://www.instagram.com/jordanxdani/\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Instagram\"><img src=\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/67acfc640d5a905f3ee762eb_instagram_green%20(1).png\" alt=\"\"></a>';\ndocument.body.appendChild(el);return el;\n}\nfunction ensureOverlay(){\nvar el=document.getElementById(\"jd-overlay\");\nif(el){\nvar mark=el.querySelector(\".jd-overlay__mark\"); if(mark)mark.textContent=\"JORDAN&DANI\";\nvar close=el.querySelector(\".jd-overlay__close\"); if(close)close.textContent=\"×\";\nreturn el;\n}\nel=document.createElement(\"div\");\nel.id=\"jd-overlay\";\nel.innerHTML='<video id=\"jd-overlay-video\" class=\"jd-overlay__video\" muted loop playsinline webkit-playsinline preload=\"auto\"></video><button type=\"button\" class=\"jd-overlay__close\" aria-label=\"Close\">×</button><div class=\"jd-overlay__grid\"><div class=\"jd-overlay__parents\"></div><div class=\"jd-overlay__kids\"></div></div><div class=\"jd-overlay__mark\">JORDAN&DANI</div>';\ndocument.body.appendChild(el);\nel.querySelector(\".jd-overlay__close\").addEventListener(\"click\",function(e){e.preventDefault();closeMenu();});\nel.addEventListener(\"click\",function(e){if(e.target===el)closeMenu();});\nreturn el;\n}\nfunction overlayVideoEl(){\nvar el=ensureOverlay();\nvar v=el.querySelector(\"#jd-overlay-video\");\nif(!v){\nv=document.createElement(\"video\");\nv.id=\"jd-overlay-video\";\nv.className=\"jd-overlay__video\";\nv.muted=true;v.loop=true;v.playsInline=true;v.setAttribute(\"webkit-playsinline\",\"\");\nv.preload=\"auto\";\nel.insertBefore(v, el.firstChild);\n}\nreturn v;\n}\nfunction playOverlayVideo(url){\nvar el=ensureOverlay();\nvar v=overlayVideoEl();\nvar src=String(url||OVERLAY_OPEN_VIDEO||\"\");\nif(!src){stopOverlayVideo();return;}\nel.classList.add(\"is-on\");\nel.classList.add(\"has-video\");\nel.classList.add(\"has-media\");\nel.style.backgroundImage=\"none\";\nif(v.getAttribute(\"src\")!==src){v.setAttribute(\"src\",src);v.load();}\nv.muted=true;\nvar p=v.play();\nif(p&&typeof p.catch===\"function\")p.catch(function(){});\n}\nfunction stopOverlayVideo(){\nvar el=document.getElementById(\"jd-overlay\");\nif(!el)return;\nel.classList.remove(\"has-video\");\nvar v=el.querySelector(\"#jd-overlay-video\");\nif(!v)return;\ntry{v.pause();}catch(e){}\n}\nfunction showOverlayBg(src){\nvar el=ensureOverlay();\nel.classList.add(\"is-on\");\nvar raw=String(src||\"\");\nif(/\\.mp4($|\\?)/i.test(raw)||raw===OVERLAY_OPEN_VIDEO){\nplayOverlayVideo(raw||OVERLAY_OPEN_VIDEO);\nreturn;\n}\nstopOverlayVideo();\nif(raw){el.style.backgroundImage='url(\"'+raw.replace(/\"/g,\"%22\")+'\")';el.classList.add(\"has-media\");}\nelse{el.style.backgroundImage=\"none\";el.classList.remove(\"has-media\");}\n}\nfunction normalizeLabel(t){return String(t||\"\").replace(/\\s+/g,\" \").trim().toUpperCase();}\nfunction routeParentKey(){\nvar p=String(location.pathname||\"/\");\ntry{p=decodeURIComponent(p);}catch(e){}\np=(\"/\"+p.replace(/^\\/+/,\"\")).toUpperCase();\nif(p.indexOf(\"/PHOTO\")===0)return \"PHOTO\";\nif(p.indexOf(\"/MOTION\")===0)return \"MOTION\";\nif(p.indexOf(\"/HOME\")===0||p.indexOf(\"/PERSONAL\")===0)return \"HOME\";\nif(p.indexOf(\"/COMMISIONS\")===0||p.indexOf(\"/COMMISSIONS\")===0)return \"COMMISIONS\";\nif(p.indexOf(\"/CONTACT\")===0)return \"CONTACT + INFO\";\nreturn \"\";\n}\nfunction displayLabel(label,key){\nvar n=normalizeLabel(label); var k=normalizeLabel(key);\nif(PARENT_LABEL[key])return PARENT_LABEL[key];\nif(PARENT_LABEL[label])return PARENT_LABEL[label];\nif(n===\"COMMISIONS\")return \"COMMISSIONS\";\nif(n===\"CONTACT + INFO\"||n===\"CONTACT-+-INFO\")return \"CONTACT+INFO\";\nif(n===\"HOME\")return \"PERSONAL\";\nif(/^ATHLETA/.test(n)||k.indexOf(\"HOME/ATHLETA\")===0||k.indexOf(\"COMMISIONS/ATHLETA\")===0)return \"ATHLETA GIRL\";\nif(/^MAKERS/.test(n)||k.indexOf(\"HOME/MAKERS\")===0)return \"MAKERS\";\nreturn String(label||key||\"\");\n}\nfunction isMediaId(id){return Number(id)>9999;}\nfunction mediaUrl(row){\nif(!row)return \"\";\nvar type=String(row.type||\"image\");\nif(type===\"image\"){\nvar file=String(row.content||\"\").replace(/^\\/+/,\"\");\nif(!file||/^https?:/i.test(file)||/^vimeo:/i.test(file))return \"\";\nreturn \"/pf-media/\"+encodeURIComponent(\"dxthm1000.\"+file);\n}\nif(type===\"link\"){\nvar thumb=String(row.thumb||\"\").replace(/^\\/+/,\"\");\nif(thumb)return \"/pf-media/\"+encodeURIComponent(\"dxthm1000.\"+thumb);\nreturn \"\";\n}\nreturn \"\";\n}\nfunction sectionById(sections,id){\nfor(var key in sections){if(sections[key]&&Number(sections[key].id)===Number(id))return sections[key];}\nreturn null;\n}\nfunction firstMediaFromSection(section, sections, media, depth){\nif(!section||depth>5)return \"\";\nvar ids=[].concat(section.mediaItems||[], section.media||[]);\nvar seen={};\nfor(var i=0;i<ids.length;i++){\nvar id=ids[i]; if(seen[id])continue; seen[id]=1;\nif(isMediaId(id)){var url=mediaUrl(media[String(id)]); if(url)return url;}\n}\nfor(var j=0;j<ids.length;j++){\nvar childId=ids[j]; if(isMediaId(childId))continue;\nvar nested=firstMediaFromSection(sectionById(sections,childId), sections, media, (depth||0)+1);\nif(nested)return nested;\n}\nreturn \"\";\n}\nfunction sectionPath(section){\nvar key=String(section.key||section.label||\"\").replace(/^\\/+/,\"\");\nif(PATH_ALIAS[key])return PATH_ALIAS[key];\nif(PATH_ALIAS[key.toUpperCase()])return PATH_ALIAS[key.toUpperCase()];\nvar label=normalizeLabel(section.label||\"\");\nif(label===\"CONTACT + INFO\"||label===\"CONTACT-+-INFO\")return \"/CONTACT-+-INFO\";\nif(label===\"MAKERS\")return \"/HOME/Makers/thumbs\";\nkey=key.replace(/ /g,\"-\").replace(/%20/g,\"-\");\nvar path=\"/\"+key;\nif(String(section.key||\"\")===\"MOTION\"||String(section.key||\"\").indexOf(\"/\")>=0)return withThumbs(path);\nif([\"PHOTO\",\"HOME\",\"COMMISIONS\",\"MOTION\"].indexOf(String(section.key||\"\"))>=0)return withThumbs(path);\nreturn withThumbs(path);\n}\nfunction buildTree(sections, media){\nvar root=sections.ROOT_SECTION;\nvar tree=[]; var byKey={}; var defaultSrc=\"\";\nvar rootIds=root&&root.media?root.media.slice():[];\nrootIds.forEach(function(id){\nvar s=sectionById(sections,id);\nif(!s||s.hideFromMenu)return;\nif(String(s.key||\"\")===\"home\")return;\nvar kids=[];\n(s.media||[]).forEach(function(cid){\nif(isMediaId(cid))return;\nvar child=sectionById(sections,cid);\nif(!child||child.hideFromMenu)return;\nvar csrc=firstMediaFromSection(child, sections, media, 0);\nvar childNode={key:child.key,label:displayLabel(child.label,child.key),src:csrc,path:sectionPath(child),kids:[]};\nkids.push(childNode);\nif(csrc&&!defaultSrc)defaultSrc=csrc;\n});\nif(!kids.length){\nObject.keys(sections).forEach(function(k){\nif(k===s.key)return;\nif(k.indexOf(String(s.key)+\"/\")!==0)return;\nif(k.slice(String(s.key).length+1).indexOf(\"/\")>=0)return;\nvar child=sections[k];\nif(!child||child.hideFromMenu)return;\nvar csrc=firstMediaFromSection(child, sections, media, 0);\nkids.push({key:child.key,label:displayLabel(child.label,child.key),src:csrc,path:sectionPath(child),kids:[]});\nif(csrc&&!defaultSrc)defaultSrc=csrc;\n});\n}\nvar src=parentBgFor(s)||firstMediaFromSection(s, sections, media, 0);\nvar path=sectionPath(s);\nvar node={key:s.key,label:displayLabel(s.label,s.key),src:src||(kids[0]&&kids[0].src)||\"\",path:path,kids:kids};\ntree.push(node);\nbyKey[normalizeLabel(node.label)]=node; byKey[normalizeLabel(node.key)]=node;\nkids.forEach(function(k){byKey[normalizeLabel(k.label)]=k;byKey[normalizeLabel(k.key)]=k;});\nif((src||node.src)&&!defaultSrc)defaultSrc=src||node.src;\n});\nreturn {tree:tree, byKey:byKey, defaultSrc:defaultSrc};\n}\nfunction ensureData(force){\nif(!force&&cache.sections&&cache.media&&cache.tree.length)return Promise.resolve(cache);\nreturn Promise.all([\nfetch(\"/pf-data/sections.json\",{cache:\"no-store\"}).then(function(r){return r.json();}),\nfetch(\"/pf-data/media.json\",{cache:\"no-store\"}).then(function(r){return r.json();})\n]).then(function(pair){\ncache.tree=[];\ncache.sections=pair[0]||{}; cache.media=pair[1]||{};\nvar built=buildTree(cache.sections, cache.media);\ncache.tree=built.tree; cache.byKey=built.byKey; cache.defaultSrc=built.defaultSrc||\"\";\nif(!activeParentKey&&cache.tree[0])activeParentKey=cache.tree[0].key;\nreturn cache;\n}).catch(function(){return cache;});\n}\nfunction activateParent(node){\nactiveParentKey=node.key; renderKids();\ndocument.querySelectorAll(\".jd-overlay__item--parent\").forEach(function(el){el.classList.toggle(\"is-active\", el.dataset.jdKey===node.key);});\nshowOverlayBg(node.src||cache.defaultSrc||\"\");\nvar kidsWrap=ensureOverlay().querySelector(\".jd-overlay__kids\");\nif(kidsWrap)kidsWrap.scrollTop=0;\n}\nfunction makeItem(node, kind){\nvar a=document.createElement(\"a\");\na.className=\"jd-overlay__item jd-overlay__item--\"+kind;\na.href=node.path||\"#\"; a.dataset.jdKey=node.key||\"\";\na.innerHTML='<span class=\"jd-overlay__bar\"></span><span class=\"jd-overlay__txt\"></span>';\na.querySelector(\".jd-overlay__txt\").textContent=node.label||\"\";\na.addEventListener(\"mouseenter\",function(){\nif(kind===\"parent\")activateParent(node);\nelse showOverlayBg(node.src||cache.defaultSrc||\"\");\n});\na.addEventListener(\"click\",function(e){\ne.preventDefault(); e.stopPropagation();\nif(kind===\"parent\"){\nvar pk=String(node.key||\"\");\n/* PHOTO/MOTION → index pages (match chrome). Hover still expands kids. */\nif(pk===\"PHOTO\"||pk===\"MOTION\"){\nvar indexPath=pk===\"PHOTO\"?\"/PHOTO/thumbs\":\"/MOTION/thumbs\";\nrouteTo(node.path&&/\\/thumbs$/i.test(node.path)?node.path:indexPath);\nsetTimeout(function(){closeMenu();},90);\nreturn;\n}\nactivateParent(node);\nif(node.kids&&node.kids.length)return;\nif(pk===\"HOME\"||pk===\"COMMISIONS\"){\nrouteTo(node.path||sectionPath({key:pk,label:node.label}));\nsetTimeout(function(){closeMenu();},90);\nreturn;\n}\n}\nvar path=node.path||\"/\";\nrouteTo(path);\nsetTimeout(function(){closeMenu();},90);\n});\nreturn a;\n}\nfunction renderKids(){\nvar kidsWrap=ensureOverlay().querySelector(\".jd-overlay__kids\");\nif(!kidsWrap)return;\nkidsWrap.innerHTML=\"\";\nvar parent=cache.tree.find(function(n){return n.key===activeParentKey;})||cache.tree[0];\nif(!parent)return;\n(parent.kids||[]).forEach(function(k){kidsWrap.appendChild(makeItem(k,\"child\"));});\nkidsWrap.classList.toggle(\"is-dense\", (parent.kids||[]).length>12);\n}\nfunction renderOverlay(){\nvar ov=ensureOverlay();\nvar parents=ov.querySelector(\".jd-overlay__parents\");\nparents.innerHTML=\"\";\ncache.tree.forEach(function(n){\nvar item=makeItem(n,\"parent\");\nif(n.key===activeParentKey)item.classList.add(\"is-active\");\nparents.appendChild(item);\n});\nif(!activeParentKey&&cache.tree[0])activeParentKey=cache.tree[0].key;\nrenderKids(); ov.classList.add(\"is-on\");\n}\nfunction bind(){\nensureChrome(); ensureOverlay();\nvar amp=document.getElementById(\"jd-amp-trigger\");\nif(amp&&!amp.dataset.jdBound){\namp.dataset.jdBound=\"1\";\namp.addEventListener(\"click\",function(e){e.preventDefault();e.stopPropagation();toggleMenu();},true);\n}\ndocument.querySelectorAll(\"[data-jd-route]\").forEach(function(a){\nif(a.dataset.jdRouteBound)return;\na.dataset.jdRouteBound=\"1\";\na.addEventListener(\"click\",function(e){\ne.preventDefault();\nvar focus=a.getAttribute(\"data-jd-menu-focus\");\nvar route=a.getAttribute(\"data-jd-route\");\n/* Chrome PHOTO/MOTION navigate to index pages; ampersand opens overlay */\nif(route){\nif(isMenuOpen)closeMenu();\nrouteTo(route);\nreturn;\n}\nif(focus){\nensureData(true).then(function(){\nvar node=cache.tree.find(function(n){return normalizeLabel(n.key)===normalizeLabel(focus)||normalizeLabel(n.label)===normalizeLabel(focus);});\nif(node){openMenu(node.key);return;}\nopenMenu(focus);\n});\n}\n});\n});\ndocument.addEventListener(\"keydown\",function(e){if(e.key===\"Escape\"&&isMenuOpen)closeMenu();});\n}\nfunction init(){bind();[400,1200,2500].forEach(function(ms){setTimeout(bind,ms);});ensureData(true);}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",init);else init();\n})();\n\n\n/* JD_HOME_SNAP_V16 */\n(function(){\nif(window.__JD_HOME_SNAP_V17__)return;\nwindow.__JD_HOME_SNAP_V17__=true;\nvar root=null,scroller=null,panels=[],observer=null,built=false,snapLock=false,anim=null,lastIdx=0,itemsCache=null,itemsPromise=null,navLockUntil=0,leavingHome=false;\nvar SNAP_MS=680;\nvar homeAutoIv=null,homeIdleT=null,homeProgUntil=0;\nvar HOME_IDLE_MS=10000,HOME_STEP_MS=5000;\nfunction stopHomeAuto(){\nif(homeAutoIv){clearInterval(homeAutoIv);homeAutoIv=null;}\nif(homeIdleT){clearTimeout(homeIdleT);homeIdleT=null;}\n}\nfunction markHomeProg(){homeProgUntil=Date.now()+(SNAP_MS||680)+240;}\nfunction homeAutoTick(){\nif(!document.body.classList.contains(\"jd-home-snap-on\")){stopHomeAuto();return;}\nif(document.body.classList.contains(\"jd-menu-open\"))return;\nif(snapLock||!panels.length||!scroller)return;\nvar idx=nearestIdx();\nif(idx>=panels.length-1){\nstopHomeAuto();\nmarkHomeProg();\ntry{routeTo(withThumbs(\"/PHOTO\"));}catch(e){try{routeTo(\"/PHOTO/thumbs\");}catch(err){}}\nreturn;\n}\nmarkHomeProg();\nanimateTo(idx+1);\n}\nfunction armHomeAuto(){\nif(!document.body.classList.contains(\"jd-home-snap-on\"))return;\nif(document.body.classList.contains(\"jd-menu-open\"))return;\nstopHomeAuto();\nhomeIdleT=setTimeout(function(){\nhomeIdleT=null;\nhomeAutoTick();\nhomeAutoIv=setInterval(homeAutoTick,HOME_STEP_MS);\n},HOME_IDLE_MS);\n}\nfunction noteHomeActivity(){\nif(!document.body.classList.contains(\"jd-home-snap-on\"))return;\nif(Date.now()<homeProgUntil)return;\nstopHomeAuto();\narmHomeAuto();\n}\n\nvar COVER_BY_KEY={\"home/ALTITUDE\":{src:\"/pf-media/jd-hp-altitude-short.mp4\",kind:\"video\"},\"home/RIGBY GO FURTHER\":{src:\"/pf-media/jd-hp-rigby-go-further-short.mp4\",kind:\"video\"},\"home/SCOUT MOTORS\":{src:\"/pf-media/dxthm1000.SCO_0001.jpg\",kind:\"image\"},\"home/FUTBOL\":{src:\"/pf-media/jd-hp-football-short.mp4\",kind:\"video\"},\"home/VOLVO XC90\":{src:\"/pf-media/dxthm1000.VOLVO_0001.jpg\",kind:\"image\"},\"home/ARROWHEAD\":{src:\"/pf-media/jd-hp-arrowhead.mp4\",kind:\"video\"},\"home/KIA EV9 CGI\":{src:\"/pf-media/dxthm1000.KIA_0001.jpg\",kind:\"image\"},\"home/ATHLETA GIRL\":{src:\"/pf-media/jd-hp-athleta-landing.jpg\",kind:\"image\"},\"home/TOPO DESIGNS\":{src:\"/pf-media/jd-hp-topo-short.mp4\",kind:\"video\"},\"home/ROYAL CARIBBEAN COME SEEK\":{src:\"/pf-media/jd-hp-royal-caribbean-landing.jpg\",kind:\"image\"},\"home/RIVIAN SPEC\":{src:\"/pf-media/jd-home-RIVIAN.mp4\",kind:\"video\"},\"home/SPEEDO\":{src:\"/pf-media/jd-hp-speedo-landing.jpg\",kind:\"image\"},\"home/SNOWPEAK\":{src:\"/pf-media/jd-hp-snowpeak.mp4\",kind:\"video\"},\"home/RNWY\":{src:\"/pf-media/jd-hp-rnwy.mov\",kind:\"video\"},\"home/RIGBY\":{src:\"/pf-media/jd-hp-rigby-landing.jpg\",kind:\"image\"},\"home/PEDAL ELECTRIC\":{src:\"/pf-media/jd-hp-pedal-e.mp4\",kind:\"video\"}};\nvar PANEL_PATH={\"home/KIA EV9 CGI\":\"/HOME/KIA-EV9-CGI/thumbs\",\"home/ALTITUDE\":\"/HOME/ALTITUDE/thumbs\",\"home/ARROWHEAD\":\"/COMMISIONS/ARROWHEAD/thumbs\",\"home/ATHLETA GIRL\":\"/HOME/Athleta/thumbs\",\"home/FUTBOL\":\"/HOME/FUTBOL/thumbs\",\"home/PEDAL ELECTRIC\":\"/COMMISIONS/PEDAL-ELECTRIC/thumbs\",\"home/RIGBY\":\"/COMMISIONS/RIGBY/thumbs\",\"home/RIGBY GO FURTHER\":\"/COMMISIONS/RIGBY-GO-FURTHER/thumbs\",\"home/RIVIAN SPEC\":\"/home/RIVIAN-SPEC/thumbs\",\"home/RNWY\":\"/COMMISIONS/RNWY/thumbs\",\"home/ROYAL CARIBBEAN COME SEEK\":\"/COMMISIONS/ROYAL-CARIBBEAN-COME-SEEK/thumbs\",\"home/SCOUT MOTORS\":\"/COMMISIONS/SCOUT-MOTORS/thumbs\",\"home/SNOWPEAK\":\"/COMMISIONS/SNOWPEAK/thumbs\",\"home/SPEEDO\":\"/COMMISIONS/SPEEDO/thumbs\",\"home/TOPO DESIGNS\":\"/COMMISIONS/TOPO-DESIGNS/thumbs\",\"home/VOLVO XC90\":\"/HOME/VOLVO-XC90/thumbs\"};\nfunction normalize(t){return String(t||\"\").replace(/\\s+/g,\" \").trim().toUpperCase();}\nfunction displayLabel(label){var n=normalize(label);if(/^ATHLETA/.test(n))return \"ATHLETA GIRL\";if(/^MAKERS/.test(n))return \"MAKERS\";return n;}\n\nfunction withThumbs(path){var p=String(path||\"/\").replace(/\\/+$/,\"\");if(!p||p===\"/\")return \"/\";if(/\\/thumbs$/i.test(p))return p;if(/\\/\\d+$/.test(p))return p.replace(/\\/\\d+$/,\"/thumbs\");return p+\"/thumbs\";}\nfunction targetPath(label,key){\nvar k=String(key||\"\");\nif(PANEL_PATH[k])return PANEL_PATH[k];\nvar n=normalize(label);\nif(n===\"ATHLETA GIRL\"||/^ATHLETA/.test(n))return \"/HOME/Athleta/thumbs\";\nif(n===\"MAKERS\")return \"/HOME/Makers/thumbs\";\nif(n===\"RIVIAN SPEC\")return \"/home/RIVIAN-SPEC/thumbs\";\nif(k.indexOf(\"home/\")===0){\nvar leaf=k.slice(5).replace(/ /g,\"-\");\nreturn withThumbs(\"/COMMISIONS/\"+leaf.toUpperCase());\n}\nreturn withThumbs(\"/\"+k.replace(/^\\/+/,\"\").replace(/ /g,\"-\"));\n}\nfunction isMediaId(id){return Number(id)>9999;}\nfunction mediaUrl(row){\nif(!row)return \"\";\nvar file=String(row.content||\"\").replace(/^\\/+/,\"\");\nif(!file)return \"\";\nif(String(row.type||\"image\")===\"image\")return \"/pf-media/\"+encodeURIComponent(\"dxthm1000.\"+file);\nreturn \"/pf-media/\"+encodeURIComponent(file);\n}\nfunction sectionById(sections,id){for(var key in sections){if(sections[key]&&Number(sections[key].id)===Number(id))return sections[key];}return null;}\nfunction currentPath(){\ntry{\nif(window.dx&&dx.address){\nif(dx.address.path!=null&&String(dx.address.path).length)return String(dx.address.path);\nif(dx.address.url!=null&&String(dx.address.url).length)return String(dx.address.url);\n}\n}catch(e){}\ntry{var hash=String(location.hash||\"\").replace(/^#\\/?/,\"\");if(hash)return hash;}catch(e){}\nreturn String(location.pathname||\"/\");\n}\nfunction isHomeRoute(path){\nvar raw=String(path==null?\"/\":path).trim();\nif(!raw||raw===\"/\"||raw===\"#\")return true;\nraw=raw.replace(/^#\\/?/,\"\");\nvar p=raw.replace(/^\\/+/,\"\").replace(/\\/+$/,\"\");\nif(!p)return true;\nif(p===\"home\")return true;\nreturn false;\n}\nfunction markLeaving(){leavingHome=true;navLockUntil=Date.now()+1800;}\nfunction clearLeaving(){leavingHome=false;navLockUntil=0;}\nwindow.__jdMarkNav=markLeaving;\nwindow.__jdHideHome=function(){try{hideHome();}catch(e){}};\nfunction routeTo(path){\nmarkLeaving();\ntry{if(window.dx&&dx.address&&typeof dx.address.setValue===\"function\"){dx.address.setValue(path);hideHome();return;}}catch(e){}\nwindow.location.href=path;\n}\nfunction easeOutExpo(t){return t===1?1:1-Math.pow(2,-10*t);}\nfunction viewportH(){\nvar h=0;\ntry{if(window.visualViewport&&visualViewport.height>80)h=Math.round(visualViewport.height);}catch(e){}\nvar inner=Math.round(window.innerHeight||0);\nif(inner>h)h=inner;\ntry{if(window.screen&&screen.height&&h<80)h=Math.round(screen.height);}catch(e){}\nreturn h||(scroller&&scroller.clientHeight)||1;\n}\nfunction viewportTop(){\ntry{if(window.visualViewport)return Math.round(visualViewport.offsetTop||0);}catch(e){}\nreturn 0;\n}\nfunction syncShellSize(){\nif(!root)return;\nvar h=viewportH();\nvar top=viewportTop();\nif(h<80)return h;\nroot.style.position=\"fixed\";\nroot.style.height=h+\"px\";\nroot.style.top=top+\"px\";\nroot.style.bottom=\"auto\";\nroot.style.left=\"0px\";\nroot.style.right=\"0px\";\nroot.style.width=\"100%\";\nroot.style.transform=\"none\";\nif(scroller){\nscroller.style.height=h+\"px\";\nscroller.style.top=\"0px\";\nscroller.style.bottom=\"auto\";\nscroller.style.transform=\"none\";\n}\npanels.forEach(function(p){\np.style.height=h+\"px\";\np.style.minHeight=h+\"px\";\np.style.maxHeight=h+\"px\";\np.style.width=\"100%\";\np.style.transform=\"none\";\np.style.animation=\"none\";\np.style.filter=\"none\";\n});\nreturn h;\n}\nfunction panelStep(){\nsyncShellSize();\nif(panels[0]&&panels[0].offsetHeight>1)return panels[0].offsetHeight;\nif(scroller&&scroller.clientHeight>1)return scroller.clientHeight;\nreturn viewportH()||1;\n}\nfunction nearestIdx(){\nif(!scroller||!panels.length)return 0;\nvar step=panelStep()||1;\nreturn Math.max(0,Math.min(panels.length-1,Math.round(scroller.scrollTop/step)));\n}\nfunction targetTop(idx){\nif(panels[idx])return panels[idx].offsetTop;\nreturn idx*panelStep();\n}\nfunction bindViewport(){\nif(document.documentElement.dataset.jdHomeVvBound)return;\ndocument.documentElement.dataset.jdHomeVvBound=\"1\";\nvar t=null;\nfunction onVv(){\nif(!document.body.classList.contains(\"jd-home-snap-on\"))return;\nif(t)clearTimeout(t);\nt=setTimeout(function(){\nt=null;\nsyncShellSize();\nif(scroller&&panels.length)revealAt(lastIdx,{skipAnim:true});\n},60);\n}\nwindow.addEventListener(\"resize\",onVv,{passive:true});\nwindow.addEventListener(\"orientationchange\",onVv,{passive:true});\ntry{if(window.visualViewport){visualViewport.addEventListener(\"resize\",onVv);visualViewport.addEventListener(\"scroll\",onVv);}}catch(e){}\n}\nfunction ensureDom(){root=document.getElementById(\"jd-home-snap\");if(root){scroller=root.querySelector(\".jd-home-snap__scroller\");return root;}root=document.createElement(\"div\");root.id=\"jd-home-snap\";root.innerHTML='<div class=\"jd-home-snap__scroller\"></div><div class=\"jd-home-snap__tag\">DIRECTORS | PHOTOGRAPHERS</div>';(document.body||document.documentElement).appendChild(root);scroller=root.querySelector(\".jd-home-snap__scroller\");return root;}\nfunction ensureVideoLoaded(v){\nif(!v||v.dataset.jdLoaded===\"1\")return;\nvar src=String(v.dataset.src||\"\");\nif(!src)return;\nv.preload=\"auto\";\nv.src=src;\nv.dataset.jdLoaded=\"1\";\ntry{v.load();}catch(e){}\n}\nfunction syncVideos(active){\nvar activeIdx=panels.indexOf(active);\npanels.forEach(function(p,idx){\nvar v=p.querySelector(\"video.jd-home-snap__vid\");\nif(!v)return;\nif(idx===activeIdx||idx===activeIdx+1)ensureVideoLoaded(v);\nif(p===active){\ntry{var promise=v.play();if(promise&&typeof promise.catch===\"function\")promise.catch(function(){});}catch(e){}\n}else{try{v.pause();}catch(e){}}\n});\n}\nfunction setActive(panel,opts){\nopts=opts||{};\nvar skipAnim=!!opts.skipAnim;\npanels.forEach(function(p){\nif(p===panel){\np.classList.remove(\"is-leaving\",\"is-idle\");\nif(!skipAnim){p.classList.remove(\"is-active\");void p.offsetWidth;}\np.classList.add(\"is-active\");\n}else if(p.classList.contains(\"is-active\")){\np.classList.remove(\"is-active\");p.classList.add(\"is-leaving\");p.classList.remove(\"is-idle\");\nsetTimeout(function(){if(!p.classList.contains(\"is-active\")){p.classList.add(\"is-idle\");p.classList.remove(\"is-leaving\");}},500);\n}else{p.classList.remove(\"is-leaving\");p.classList.add(\"is-idle\");}\n});\nvar idx=panels.indexOf(panel);if(idx>=0)lastIdx=idx;\nsyncVideos(panel);\n}\nfunction settleActive(){\nif(!scroller||!panels.length)return;\nvar idx=nearestIdx();\nsetActive(panels[idx],{skipAnim:true});\nlastIdx=idx;\n}\nfunction animateTo(idx){\nif(!scroller||!panels.length)return;\nsyncShellSize();\nidx=Math.max(0,Math.min(panels.length-1,idx));\nvar target=targetTop(idx);\nvar start=scroller.scrollTop;\nvar dist=target-start;\nif(Math.abs(dist)<2){setActive(panels[idx]);snapLock=false;return;}\nif(anim)cancelAnimationFrame(anim);\nsnapLock=true;\nsetActive(panels[idx]);\nvar t0=performance.now();\nfunction frame(now){\nvar t=Math.min(1,(now-t0)/SNAP_MS);\nscroller.scrollTop=start+dist*easeOutExpo(t);\nif(t<1){anim=requestAnimationFrame(frame);}\nelse{anim=null;scroller.scrollTop=targetTop(idx);snapLock=false;settleActive();}\n}\nanim=requestAnimationFrame(frame);\n}\nfunction bindWheel(){\nif(!root||root.dataset.jdWheelBound)return;\nroot.dataset.jdWheelBound=\"1\";\nvar touchY=0;\nroot.addEventListener(\"wheel\",function(e){\nif(!document.body.classList.contains(\"jd-home-snap-on\"))return;\ne.preventDefault();e.stopPropagation();\nnoteHomeActivity();\nif(snapLock)return;\nvar idx=nearestIdx();\nif(e.deltaY>16)animateTo(idx+1);\nelse if(e.deltaY<-16)animateTo(idx-1);\n},{passive:false});\nroot.addEventListener(\"touchstart\",function(e){noteHomeActivity();if(e.touches&&e.touches[0])touchY=e.touches[0].clientY;},{passive:true});\nroot.addEventListener(\"touchend\",function(e){\nnoteHomeActivity();\nif(snapLock||!e.changedTouches||!e.changedTouches[0])return;\nvar dy=touchY-e.changedTouches[0].clientY;\nvar idx=nearestIdx();\nif(dy>42)animateTo(idx+1);\nelse if(dy<-42)animateTo(idx-1);\n},{passive:true});\nscroller.addEventListener(\"scroll\",function(){if(!snapLock){settleActive();try{noteHomeActivity();}catch(e){}}},{passive:true});\n}\nfunction bindObserver(){\nif(observer)observer.disconnect();\nobserver=new IntersectionObserver(function(entries){\nif(snapLock)return;\nentries.forEach(function(entry){\nif(entry.isIntersecting&&entry.intersectionRatio>=0.55)setActive(entry.target,{skipAnim:true});\n});\n},{root:scroller,threshold:[0.55,0.75]});\npanels.forEach(function(p){observer.observe(p);});\n}\nfunction preload(src){if(!src)return;var img=new Image();img.decoding=\"async\";img.src=src;}\nfunction buildPanels(items){\nensureDom();scroller.innerHTML=\"\";panels=[];\nitems.forEach(function(item,idx){\nvar a=document.createElement(\"a\");\na.className=\"jd-home-snap__panel\"+(idx===0?\" is-active\":\" is-idle\")+(item.kind===\"video\"?\" is-video\":\"\");\na.href=item.path;a.dataset.jdHomePanel=item.key;\na.innerHTML='<span class=\"jd-home-snap__bg\" aria-hidden=\"true\"></span><span class=\"jd-home-snap__label\"></span>'+(idx===0?'<div class=\"jd-scroll-wrapper\" aria-hidden=\"true\"><span class=\"jd-scroll-text\">SCROLL</span><div class=\"jd-scroll-line-wrapper\"><span></span><span></span></div></div>':'');\na.querySelector(\".jd-home-snap__label\").textContent=item.label;\nif(item.kind===\"video\"&&item.src){\nvar v=document.createElement(\"video\");\nv.className=\"jd-home-snap__vid\";\nv.dataset.src=item.src;v.muted=true;v.loop=true;v.playsInline=true;v.setAttribute(\"playsinline\",\"\");v.setAttribute(\"muted\",\"\");v.preload=\"none\";\na.insertBefore(v,a.firstChild);\n}else if(item.src){\nvar bg=a.querySelector(\".jd-home-snap__bg\");\nif(bg){bg.style.backgroundImage='url(\"'+String(item.src).replace(/\"/g,\"%22\")+'\")';}\nelse{a.style.backgroundImage='url(\"'+String(item.src).replace(/\"/g,\"%22\")+'\")';}\npreload(item.src);\n}\na.addEventListener(\"click\",function(e){e.preventDefault();noteHomeActivity();routeTo(item.path);});\nscroller.appendChild(a);panels.push(a);\n});\nbindObserver();bindWheel();bindViewport();syncShellSize();built=true;\nif(panels[0])syncVideos(panels[0]);\n}\nfunction parseItems(sections,media){\nvar home=sections.home;if(!home)return [];\nvar items=[];\n(home.media||[]).forEach(function(id){\nif(isMediaId(id))return;\nvar child=sectionById(sections,id);if(!child)return;\nvar mids=[].concat(child.mediaItems||[],child.media||[]).filter(isMediaId);\nif(!mids.length)return;\nvar cover=COVER_BY_KEY[child.key]||null;\nvar row=mids[0]?media[String(mids[0])]:null;\nvar src=cover&&cover.src?cover.src:mediaUrl(row);\nif(!src&&row&&row.content)src=\"/pf-media/\"+encodeURIComponent(String(row.content).replace(/^\\/+/, \"\"));\nif(!src)return;\nvar kind=cover&&cover.kind?cover.kind:(String(row&&row.type||\"image\")===\"video\"?\"video\":\"image\");\nitems.push({key:child.key,label:displayLabel(child.label||child.key),path:targetPath(child.label,child.key),src:src,kind:kind});\n});\nreturn items;\n}\nfunction loadHomePanels(){\nif(itemsCache)return Promise.resolve(itemsCache);\nif(itemsPromise)return itemsPromise;\nitemsPromise=Promise.all([\nfetch(\"/pf-data/sections.json\",{cache:\"no-store\"}).then(function(r){return r.json();}),\nfetch(\"/pf-data/media.json\",{cache:\"no-store\"}).then(function(r){return r.json();})\n]).then(function(pair){\nitemsCache=parseItems(pair[0]||{},pair[1]||{});\nif(itemsCache[0]&&itemsCache[0].kind!==\"video\")preload(itemsCache[0].src);\nreturn itemsCache;\n}).catch(function(){itemsPromise=null;return [];});\nreturn itemsPromise;\n}\nfunction revealAt(idx,opts){\nopts=opts||{};\nif(!scroller||!panels.length)return;\nsyncShellSize();\nidx=Math.max(0,Math.min(panels.length-1,idx|0));\nscroller.scrollTop=targetTop(idx);\nsetActive(panels[idx],{skipAnim:!!opts.skipAnim});\nlastIdx=idx;\n}\nfunction showHome(opts){\nopts=opts||{};\n/* Do not re-flash home snap while chrome PHOTO/MOTION is leaving */\nif(!opts.force && (leavingHome || Date.now()<navLockUntil) && !isHomeRoute(currentPath()))return;\nif(leavingHome && !isHomeRoute(currentPath()))return;\nclearLeaving();\nensureDom();\nvar alreadyOn=document.body.classList.contains(\"jd-home-snap-on\")&&root&&root.classList.contains(\"is-on\")&&root.style.display!==\"none\";\ndocument.body.classList.add(\"jd-home-snap-on\");\nroot.classList.add(\"is-on\");\nsyncShellSize();\ntry{root.style.display=\"block\";}catch(e){}\nfunction afterBuild(){\n/* keepIdx + already on home: do not yank scroller back to lastIdx mid-scroll */\nif(built&&alreadyOn&&opts.keepIdx&&!opts.reset){\ntry{noteHomeActivity();}catch(e){}\nreturn;\n}\nvar idx=opts.reset?0:(opts.keepIdx?lastIdx:0);\nrevealAt(idx,{skipAnim:opts.skipAnim!==false});\narmHomeAuto();\n}\nif(built){afterBuild();return;}\nloadHomePanels().then(function(items){\nif(!items.length){hideHome();return;}\nbuildPanels(items);afterBuild();\n});\n}\nfunction hideHome(){\nstopHomeAuto();\ndocument.body.classList.remove(\"jd-home-snap-on\");\nif(root){root.classList.remove(\"is-on\");try{root.style.display=\"none\";}catch(e){}}\npanels.forEach(function(p){var v=p.querySelector(\"video.jd-home-snap__vid\");if(v){try{v.pause();}catch(e){}}});\n}\nfunction sync(){\n/* JD_HOME_LEAVE_FAILSAFE */\nif(document.body.classList.contains(\"jd-menu-open\")){hideHome();return;}\nvar onHome=isHomeRoute(currentPath());\nif(onHome){\nif(leavingHome||Date.now()<navLockUntil)return;\nshowHome({skipAnim:true,keepIdx:true,force:true});\nreturn;\n}\nhideHome();\ntry{document.body.classList.remove(\"jd-home-snap-on\");}catch(e){}\n}\nfunction goHome(e){\nif(e){e.preventDefault();e.stopPropagation();}\nclearLeaving();\ntry{if(window.dx&&dx.address&&typeof dx.address.setValue===\"function\")dx.address.setValue(\"/\");else window.location.href=\"/\";}catch(err){window.location.href=\"/\";}\nshowHome({skipAnim:false,reset:true});\nsetTimeout(sync,60);setTimeout(sync,200);setTimeout(sync,450);\n}\nfunction bindLogoHome(){\nif(document.documentElement.dataset.jdLogoHomeBound)return;\ndocument.documentElement.dataset.jdLogoHomeBound=\"1\";\ndocument.addEventListener(\"click\",function(e){\nvar t=e.target&&e.target.closest?e.target.closest(\".logoText,#jordan-dani-logo,.logo\"):null;\nif(!t)return;goHome(e);\n},true);\n}\nfunction bindAddress(){\ntry{\nif(window.dx&&dx.address){\nvar h=function(){setTimeout(sync,30);setTimeout(sync,160);setTimeout(sync,320);};\nif(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(h);\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(h);\nelse if(typeof dx.address.addListener===\"function\")dx.address.addListener(h);\n}\n}catch(e){}\nwindow.addEventListener(\"hashchange\",sync);\nwindow.addEventListener(\"popstate\",sync);\ndocument.addEventListener(\"menuOpened\",hideHome);\ndocument.addEventListener(\"menuClosed\",function(){setTimeout(sync,120);setTimeout(sync,280);});\nbindLogoHome();\n}\nfunction bootShell(){\nif(!isHomeRoute(currentPath()))return;\nensureDom();\ndocument.body.classList.add(\"jd-home-snap-on\");\nroot.classList.add(\"is-on\");\n}\nfunction init(){bootShell();bindAddress();loadHomePanels();sync();[80,250,700,1600].forEach(function(ms){setTimeout(sync,ms);});}\nloadHomePanels();\nif(document.body)bootShell();\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",init);else init();\n})();\n\n\n/* JD_PFDATA_CACHE_V1 */\n(function(){\nif(window.__JD_PFDATA_CACHE_V1__)return;\nwindow.__JD_PFDATA_CACHE_V1__=true;\n/* Shared sections/media cache for hydrate + next + route preloads */\nvar cache=null,loading=null,waiters=[];\nfunction done(data){\ncache=data;\nvar w=waiters.splice(0,waiters.length);\nfor(var i=0;i<w.length;i++)try{w[i](cache);}catch(e){}\n}\nfunction start(){\nif(cache||loading)return loading;\nloading=Promise.all([\nfetch(\"/pf-data/sections.json\",{credentials:\"same-origin\"}).then(function(r){return r.json();}),\nfetch(\"/pf-data/media.json\",{credentials:\"same-origin\"}).then(function(r){return r.json();})\n]).then(function(pair){\ndone({sections:pair[0]||{},media:pair[1]||{},at:Date.now()});\nloading=null;\nreturn cache;\n}).catch(function(){\nloading=null;\ndone({sections:{},media:{},at:Date.now(),error:true});\nreturn cache;\n});\nreturn loading;\n}\nwindow.__jdPfData=function(cb,opts){\nopts=opts||{};\nvar maxAge=opts.maxAge!=null?opts.maxAge:120000;\nif(cache&&!opts.force&&cache.at&&Date.now()-cache.at<maxAge){\nif(typeof cb===\"function\")cb(cache);\nreturn Promise.resolve(cache);\n}\nif(typeof cb===\"function\")waiters.push(cb);\nreturn start();\n};\nwindow.__jdPfDataGet=function(){return cache;};\nstart();\n})();\n\n\n/* JD_THUMBS_DIRECTOR_V1 */\n(function(){\nif(window.__JD_THUMBS_DIRECTOR_V1__)return;\nwindow.__JD_THUMBS_DIRECTOR_V1__=true;\n/**\n * One owner for thumbs page height, idle auto-glide, and Next trail.\n * Modes: measuring | gliding | user | bottom | leaving | off\n */\nvar IDLE_MS=5000;\nvar START_MS=4500;\nvar SPEED=170;\nvar EASE_MS=900;\nvar HEIGHT_QUIET_MS=1200;\nvar DWELL_MS=5000;\nvar BOTTOM_PX=10;\nvar THUMB_LAYERS=[\"Thumbs.container\",\"Thumbs.mask\",\"Thumbs.grid.container\"];\nvar EXTRA_LAYERS=[\"OverlayView\",\"MediaView.container\",\"MediaView.mask\"];\n\nvar mode=\"off\";\nvar lastPath=\"\";\nvar lastSetH=0;\nvar routeTimers=[];\nvar heightT=null;\nvar glideRaf=null;\nvar idleT=null;\nvar bootT=null;\nvar barRaf=null;\nvar barStart=0;\nvar barRunning=false;\nvar carry=0;\nvar glideStartedAt=0;\nvar alignIv=null;\nvar navLockUntil=0;\nvar goToken=0;\nvar queue=null,queueAt=0,loading=false,waiters=[],TTL=8e3;\nvar chrome=null,fill=null,nameEl=null,kickerEl=null,upBtn=null,nextBtn=null;\n\nfunction api(){return window.__jdThumbs;}\nfunction now(){return Date.now();}\nfunction pathNow(){\ntry{\nif(window.dx&&dx.address){\nvar a=dx.address;\nif(a.url!=null&&String(a.url).length)return String(a.url);\nif(a.path!=null&&String(a.path).length)return String(a.path);\n}\n}catch(e){}\nreturn String(location.pathname||\"/\");\n}\nfunction cleanPath(p){\nreturn String(p||\"\").split(\"#\")[0].split(\"?\")[0].replace(/^\\/+/,\"\").replace(/\\/+$/,\"\");\n}\nfunction isThumbsRoute(){\nvar p=cleanPath(pathNow()).toLowerCase();\nreturn /(^|\\/)thumbs$/.test(p)||/\\/thumbs\\//.test(p);\n}\nfunction isMediaSlide(){return /\\/\\d+$/.test(cleanPath(pathNow()));}\nfunction onHomeSnap(){\ntry{return !!(document.body&&document.body.classList.contains(\"jd-home-snap-on\"));}catch(e){return false;}\n}\nfunction menuOpen(){\ntry{return !!(document.body&&document.body.classList.contains(\"jd-menu-open\"));}catch(e){return false;}\n}\nfunction thumbsOk(){return isThumbsRoute()&&!isMediaSlide()&&!onHomeSnap()&&!menuOpen();}\nfunction scrollY(){\nreturn window.pageYOffset||document.documentElement.scrollTop||0;\n}\nfunction maxScroll(){\nvar vh=window.innerHeight||0;\nvar se=document.scrollingElement||document.documentElement;\nvar max=Math.max(\nse?se.scrollHeight:0,\ndocument.documentElement?document.documentElement.scrollHeight:0,\ndocument.body?document.body.scrollHeight:0\n);\nreturn Math.max(0,max-vh);\n}\nfunction setMode(next){\nif(mode===next)return;\nmode=next;\ntry{window.__jdThumbsMode=mode;}catch(e){}\ntry{window.__jdIsGliding=mode===\"gliding\";}catch(e){}\n}\nfunction markProg(ms){\ntry{window.__jdProgrammaticScrollUntil=now()+(ms==null?1200:ms);}catch(e){}\n}\nfunction isProg(){\ntry{return now()<(window.__jdProgrammaticScrollUntil||0);}catch(e){return false;}\n}\nfunction setThumbsClass(on){\ntry{if(document.body)document.body.classList.toggle(\"jd-thumbs-page\",!!on);}catch(e){}\n}\nfunction mark(el){if(el)try{el.setAttribute(\"data-jd-unlock\",\"1\");}catch(e){}}\nfunction clearMarked(el){\nif(!el||!el.style||el.getAttribute(\"data-jd-unlock\")!==\"1\")return;\nel.style.removeProperty(\"height\");\nel.style.removeProperty(\"min-height\");\nel.style.removeProperty(\"max-height\");\ntry{el.removeAttribute(\"data-jd-unlock\");}catch(e){}\n}\nfunction clearHeights(){\nclearMarked(document.querySelector(\".SiteView\"));\nTHUMB_LAYERS.forEach(function(name){\nvar list=document.getElementsByClassName(name);\nfor(var i=0;i<list.length;i++)clearMarked(list[i]);\n});\nEXTRA_LAYERS.forEach(function(name){\nvar list=document.getElementsByClassName(name);\nfor(var i=0;i<list.length;i++)clearMarked(list[i]);\n});\ntry{\nvar mask=document.getElementsByClassName(\"MediaView.mask\")[0];\nif(mask&&mask.parentElement)clearMarked(mask.parentElement);\n}catch(e){}\nvar grids=document.getElementsByClassName(\"Thumbs.grid\");\nfor(var g=0;g<grids.length;g++)clearMarked(grids[g]);\n}\nfunction releaseDoc(){\n[\"height\",\"min-height\",\"max-height\",\"overflow\",\"overflow-x\",\"overflow-y\"].forEach(function(prop){\ndocument.documentElement.style.removeProperty(prop);\ndocument.body.style.removeProperty(prop);\n});\ntry{document.body.scrollTop=0;}catch(e){}\nlastSetH=0;\n}\nfunction autoDoc(h){\nsetThumbsClass(true);\nvar min=Math.max(window.innerHeight||0,h||0);\nvar html=document.documentElement;\nvar body=document.body;\nhtml.style.setProperty(\"height\",\"auto\",\"important\");\nhtml.style.setProperty(\"min-height\",min+\"px\",\"important\");\nhtml.style.setProperty(\"overflow-x\",\"hidden\",\"important\");\nhtml.style.setProperty(\"overflow-y\",\"auto\",\"important\");\nbody.style.setProperty(\"height\",\"auto\",\"important\");\nbody.style.setProperty(\"min-height\",min+\"px\",\"important\");\n/* Do not mix overflow-x:hidden with overflow-y:visible on body —\n   CSS computes visible → auto, creating a second scrollport. */\nbody.style.setProperty(\"overflow\",\"visible\",\"important\");\ntry{if(body.scrollTop)body.scrollTop=0;}catch(e){}\n}\nfunction sizeLayer(el,h){\nif(!el||!(h>0))return;\nmark(el);\nel.style.setProperty(\"height\",h+\"px\",\"important\");\nel.style.setProperty(\"min-height\",h+\"px\",\"important\");\nel.style.setProperty(\"max-height\",\"none\",\"important\");\n}\nfunction bestInnerGrid(){\nvar best=null,n=0;\nvar list=document.getElementsByClassName(\"Thumbs.grid\");\nfor(var i=0;i<list.length;i++){\nvar el=list[i];\nif(String(el.className)===\"Thumbs.grid.container\")continue;\nvar count=el.children?el.children.length:0;\nif(count>n){best=el;n=count;}\n}\nreturn best||document.getElementsByClassName(\"Thumbs.grid.container\")[0]||null;\n}\nfunction contentBottom(){\n/* Measure cells, not zoom-scaled media, so height does not fight scroll-zoom. */\nvar y=scrollY();\nvar max=window.innerHeight||0;\nfunction bump(el){\nif(!el||!el.isConnected)return;\nmax=Math.max(max,y+el.getBoundingClientRect().bottom);\n}\nbump(document.querySelector(\"#jd-photo-title\"));\nbump(document.querySelector(\"#jd-proj-title\"));\nbump(document.querySelector(\".jd-proj-title\"));\nvar grid=bestInnerGrid();\nif(grid){\nvar kids=grid.children||[];\nif(kids.length){\nfor(var i=0;i<kids.length;i++)bump(kids[i]);\n}else bump(grid);\n}\nbump(document.querySelector(\".jd-gal-footer\"));\n/* Tiny pad only — large trailing space was page-height overshoot. */\nreturn Math.ceil(max+6);\n}\nfunction layoutReady(count,h){\nif(count<6)return true;\nreturn h>(window.innerHeight||0)+Math.min(900,count*55);\n}\nfunction releaseAll(){\nstopGlide();\nstopBar(true);\nclearTimeouts();\nsetThumbsClass(false);\nclearHeights();\nreleaseDoc();\nclearMediaShell();\nsetMode(\"off\");\n}\nfunction clearMediaShell(){\nvar site=document.querySelector(\".SiteView\");\nif(site&&site.getAttribute(\"data-jd-mediafix\")===\"1\"){\nsite.style.removeProperty(\"height\");\nsite.style.removeProperty(\"min-height\");\nsite.style.removeProperty(\"max-height\");\ntry{site.removeAttribute(\"data-jd-mediafix\");}catch(e){}\n}\n}\nfunction fixMediaShell(){\nif(!isMediaSlide()){clearMediaShell();return;}\ntry{\nvar site=document.querySelector(\".SiteView\");\nif(!site)return;\nvar vh=window.innerHeight||0;\nif(!(vh>0))return;\nif(site.offsetHeight<vh*0.6||site.getAttribute(\"data-jd-mediafix\")===\"1\"){\nsite.setAttribute(\"data-jd-mediafix\",\"1\");\nsite.style.setProperty(\"height\",vh+\"px\",\"important\");\nsite.style.setProperty(\"min-height\",vh+\"px\",\"important\");\nsite.style.setProperty(\"max-height\",\"none\",\"important\");\n}\n}catch(e){}\n}\nfunction armMediaAlign(){\nif(alignIv){clearInterval(alignIv);alignIv=null;}\nif(!isMediaSlide())return;\nvar n=0;\nfixMediaShell();\nalignIv=setInterval(function(){\nfixMediaShell();\nn+=1;\nif(n>40||!isMediaSlide()){clearInterval(alignIv);alignIv=null;}\n},100);\n}\nfunction ensureHeight(opts){\nopts=opts||{};\nif(isMediaSlide()){releasePageToMedia();return;}\nif(onHomeSnap()||!isThumbsRoute()){releaseAll();return;}\nif(mode===\"leaving\")return;\nif(!opts.force&&(mode===\"gliding\"||isProg()))return;\nif(!opts.force&&mode===\"user\"&&!opts.afterQuiet)return;\nsetThumbsClass(true);\nvar grid=bestInnerGrid();\nif(!grid||!grid.children||!grid.children.length){\nif(opts.force)autoDoc(window.innerHeight||0);\nreturn;\n}\nvar count=grid.children.length;\nvar h=contentBottom();\nif(!layoutReady(count,h))return;\nif(!(h>(window.innerHeight||0)+20)){autoDoc(window.innerHeight||0);return;}\nif(opts.growOnly&&lastSetH>0&&h<lastSetH-24)return;\nif(lastSetH>0&&Math.abs(h-lastSetH)<20&&!opts.force)return;\nvar yBefore=scrollY();\nsizeLayer(document.querySelector(\".SiteView\"),h);\nTHUMB_LAYERS.forEach(function(name){\nvar el=document.getElementsByClassName(name)[0];\nif(!el)return;\nvar top=yBefore+el.getBoundingClientRect().top;\nsizeLayer(el,Math.max(160,Math.ceil(h-Math.max(0,top))));\n});\n/* DX OverlayView / MediaView shells often sit top:50px with oversized height\n   and overshoot past the footer, leaving empty scroll space below. */\nEXTRA_LAYERS.forEach(function(name){\nvar el=document.getElementsByClassName(name)[0];\nif(!el)return;\nvar top=el.offsetTop||0;\ntry{\nvar csTop=parseFloat(getComputedStyle(el).top);\nif(isFinite(csTop))top=Math.max(top,csTop);\n}catch(e){}\nsizeLayer(el,Math.max(160,Math.ceil(h-Math.max(0,top))));\n});\n/* Classless MediaView wrap (parent of MediaView.mask) */\ntry{\nvar mask=document.getElementsByClassName(\"MediaView.mask\")[0];\nvar wrap=mask&&mask.parentElement;\nif(wrap&&wrap!==document.querySelector(\".SiteView\")&&String(wrap.className||\"\").indexOf(\"Thumbs\")<0){\nvar wTop=wrap.offsetTop||0;\nvar wCs=parseFloat(getComputedStyle(wrap).top);\nif(isFinite(wCs))wTop=Math.max(wTop,wCs);\nsizeLayer(wrap,Math.max(160,Math.ceil(h-Math.max(0,wTop))));\n}\n}catch(e){}\nautoDoc(h);\nlastSetH=h;\n/* Stay in measuring until intro glide or user input — do not promote to user here\n   or boot/idle startGlide gets blocked. */\n}\nfunction releasePageToMedia(){\nstopGlide();\nstopBar(true);\nsetThumbsClass(false);\nclearHeights();\nreleaseDoc();\narmMediaAlign();\nsetMode(\"off\");\n}\nfunction scheduleHeight(){\nif(!thumbsOk())return;\nif(heightT)clearTimeout(heightT);\nheightT=setTimeout(function(){\nheightT=null;\nensureHeight({growOnly:true,afterQuiet:true});\n},HEIGHT_QUIET_MS);\n}\nfunction burstHeight(){\nif(!thumbsOk()){\nif(isMediaSlide())releasePageToMedia();\nelse releaseAll();\nreturn;\n}\nlastSetH=0;\nsetMode(\"measuring\");\nclearHeights();\nautoDoc(window.innerHeight||0);\nrouteTimers.forEach(clearTimeout);\nrouteTimers=[];\n[120,400,900,1600,2800,5000].forEach(function(ms){\nrouteTimers.push(setTimeout(function(){ensureHeight({force:true});},ms));\n});\n}\nfunction stopGlide(){\nif(glideRaf){cancelAnimationFrame(glideRaf);glideRaf=null;}\ncarry=0;\ntry{window.__jdIsGliding=false;}catch(e){}\n}\nfunction atTrueBottom(){\nif(!thumbsOk())return false;\nif(scrollY()<maxScroll()-BOTTOM_PX)return false;\nvar f=document.querySelector(\".jd-gal-footer\");\nif(!f)return true;\nvar fr=f.getBoundingClientRect();\nvar vh=window.innerHeight||0;\nreturn fr.top<vh-24&&fr.bottom>vh*0.35;\n}\nfunction startGlide(){\nif(!thumbsOk())return;\nif(mode===\"bottom\"||mode===\"leaving\")return;\nif(menuOpen())return;\nif(atTrueBottom()){enterBottom();return;}\nif(glideRaf)return;\n/* Idle resume + intro must be allowed from measuring/user/off. */\nif(mode!==\"measuring\"&&mode!==\"user\"&&mode!==\"off\"&&mode!==\"gliding\")return;\nensureHeight({force:true});\nsetMode(\"gliding\");\nglideStartedAt=performance.now();\ncarry=0;\nfunction frame(t){\nif(mode!==\"gliding\"||!thumbsOk()){stopGlide();return;}\nif(atTrueBottom()){stopGlide();enterBottom();return;}\nvar p=Math.min(1,(t-glideStartedAt)/EASE_MS);\n/* smoother ease-in: slow start, settles to full SPEED without a hard step */\nvar ease=p*p*p*(p*(p*6-15)+10);\nvar dt=Math.min(34,t-(frame._last||t));\nframe._last=t;\ncarry+=SPEED*ease*(dt/1000);\nvar step=Math.floor(carry);\nif(step>=1){\ncarry-=step;\nmarkProg(60);\nwindow.scrollBy(0,step);\n}\nglideRaf=requestAnimationFrame(frame);\n}\nglideRaf=requestAnimationFrame(frame);\n}\nfunction armIdleGlide(delay){\nif(idleT){clearTimeout(idleT);idleT=null;}\nif(!thumbsOk())return;\nif(mode===\"bottom\"||mode===\"leaving\")return;\nidleT=setTimeout(function(){\nidleT=null;\nif(!thumbsOk()||mode===\"bottom\"||mode===\"leaving\")return;\nif(atTrueBottom()){enterBottom();return;}\nstartGlide();\n},delay==null?IDLE_MS:delay);\n}\nfunction noteUser(){\nif(!thumbsOk())return;\n/* Always yield to real input — do not gate on programmatic glide marks. */\nstopGlide();\nstopBar(true);\nsetMode(\"user\");\nscheduleHeight();\narmIdleGlide(IDLE_MS);\ncheckBottomSoon();\n}\nfunction clearTimeouts(){\nif(idleT){clearTimeout(idleT);idleT=null;}\nif(bootT){clearTimeout(bootT);bootT=null;}\nif(heightT){clearTimeout(heightT);heightT=null;}\nrouteTimers.forEach(clearTimeout);\nrouteTimers=[];\n}\nfunction checkBottomSoon(){\nsetTimeout(function(){\nif(thumbsOk()&&atTrueBottom())enterBottom();\n},80);\n}\nfunction enterBottom(){\nif(!thumbsOk())return;\nif(mode===\"leaving\")return;\nstopGlide();\nsetMode(\"bottom\");\nensureMount();\nloadQueue(function(list){\nvar next=nextOf(list,pathNow());\nif(next)setNextLabel(next);\n});\nstartBar();\n}\n\n/* ---------- Next trail ---------- */\nfunction strip(p){\nvar r=String(p||\"\").trim().split(\"#\")[0].split(\"?\")[0].replace(/^https?:\\/\\/[^/]+/i,\"\").replace(/^#\\/?/,\"\").replace(/^\\/+|\\/+$/g,\"\");\nreturn r.replace(/\\/thumbs$/i,\"\").replace(/\\/\\d+$/,\"\");\n}\nfunction norm(v){return String(v||\"\").replace(/ |%20/g,\"-\").toUpperCase();}\nfunction dashes(v){\nvar s=String(v==null?\"\":v);\ntry{if(window.dx&&dx.address&&typeof dx.address.addDashes===\"function\")return dx.address.addDashes(s);}catch(e){}\nreturn s.replace(/ |%20/g,\"-\");\n}\nfunction routeKey(key){\nvar d=dashes(String(key||\"\").replace(/^\\+/,\"\"));\nreturn /CONTACT/i.test(d)?(\"/\"+d.replace(/^\\/+/,\"\")):(\"/\"+d.replace(/^\\/+/,\"\")+\"/thumbs\");\n}\nfunction labelOf(sec,key){\nif(sec&&sec.label!=null&&String(sec.label).trim())return String(sec.label).replace(/\\s+/g,\" \").trim();\nreturn String((String(key||\"\").split(\"/\").pop())||key).replace(/-/g,\" \").replace(/\\s+/g,\" \").trim();\n}\nfunction findKey(map,raw){\nvar want=norm(strip(raw));if(!want)return null;\nif(map[raw])return raw;\nvar k;\nfor(k in map){if(norm(k)===want||norm(strip(k))===want)return k;}\nfor(k in map){if(norm(strip(routeKey(k)))===want)return k;}\n/* Unique leaf match helps renamed parents keep Next after reorders. */\nvar leaf=want.split(\"/\").pop(),hits=[];\nfor(k in map){if(norm(String(k).split(\"/\").pop())===leaf)hits.push(k);}\nif(hits.length===1)return hits[0];\nreturn null;\n}\nfunction hrefOfMedia(m){\nif(!m)return \"\";\nvar raw=String(m.link||m.content||m.href||\"\").trim();\nif(!raw||raw.charAt(0)!==\"/\")return \"\";\nreturn raw.split(\"#\")[0].split(\"?\")[0];\n}\nfunction item(map,key,modeName,labelOverride,pathOverride){\nvar sec=map[key];if(!sec||sec.visible===false)return null;\nvar href=String(pathOverride||routeKey(key)||\"\").trim();\nif(!href)return null;\nif(href.charAt(0)!==\"/\")href=\"/\"+href.replace(/^\\/+/,\"\");\nreturn {\nkey:key,\nlabel:String(labelOverride||labelOf(sec,key)).replace(/\\s+/g,\" \").trim(),\npath:href,\nrouteKey:strip(href).toLowerCase(),\nmode:modeName||\"project\"\n};\n}\nfunction invalidateQueue(){queue=null;queueAt=0;}\nfunction pushLinkTiles(map,sec,media,pushKey){\nif(!sec||!Array.isArray(sec.media))return;\nsec.media.forEach(function(id){\nvar m=media&&media[id];\nif(!m)return;\nvar href=hrefOfMedia(m);\nif(!href)return;\n/* Homepage + PHOTO tiles must land on /thumbs (CONTACT stays bare). */\nif(!/CONTACT/i.test(href)&&!/\\/thumbs$/i.test(href)&&!/\\/\\d+$/.test(href))href=String(href).replace(/\\/+$/,\"\")+\"/thumbs\";\nvar key=findKey(map,href);\nif(!key)return;\nvar label=String(m.label||m.name||\"\").trim()||null;\n/* Keep the tile's real href so renamed section keys still land correctly. */\npushKey(key,\"project\",label,href);\n});\n}\nfunction buildQueue(map,media){\n/* Source of truth = HOME then PHOTO link tiles. Add/reorder on homepage and Next/jump follows. */\nvar out=[],seenKey={},seenRoute={};\nfunction pushRow(row){\nif(!row)return;\nvar kk=norm(row.key),rk=norm(row.routeKey||strip(row.path));\nif(!kk||!rk||seenKey[kk]||seenRoute[rk])return;\nseenKey[kk]=true;seenRoute[rk]=true;out.push(row);\n}\nfunction pushKey(key,modeName,labelOverride,pathOverride){\nif(!key)return;\npushRow(item(map,key,modeName,labelOverride,pathOverride));\n}\n/* HOME first = homepage scroll order joins jump/Next automatically. */\npushLinkTiles(map,map.HOME,media,pushKey);\npushLinkTiles(map,map.PHOTO,media,pushKey);\npushKey(findKey(map,\"MOTION\")||\"MOTION\",\"section\");\npushKey(findKey(map,\"CONTACT + INFO\")||\"CONTACT + INFO\",\"section\");\nreturn out;\n}\nfunction loadQueue(cb){\nif(queue&&now()-queueAt<TTL){cb(queue);return;}\nwaiters.push(cb);if(loading)return;loading=true;\nfunction done(list){\nqueue=list||[];queueAt=now();loading=false;\nvar w=waiters.splice(0,waiters.length);\nfor(var i=0;i<w.length;i++)try{w[i](queue);}catch(e){}\n}\nfunction fail(){done(queue||[]);}\nif(typeof window.__jdPfData===\"function\"){\nwindow.__jdPfData(function(data){\nif(!data||data.error){fail();return;}\ndone(buildQueue(data.sections||{},data.media||{}));\n});\nreturn;\n}\nvar bust=\"?jdq=\"+now();\nPromise.all([\nfetch(\"/pf-data/sections.json\"+bust,{credentials:\"same-origin\",cache:\"no-store\"}).then(function(r){return r.json();}),\nfetch(\"/pf-data/media.json\"+bust,{credentials:\"same-origin\",cache:\"no-store\"}).then(function(r){return r.json();})\n]).then(function(pair){done(buildQueue(pair[0]||{},pair[1]||{}));}).catch(fail);\n}\nfunction sameRoute(a,b){\n/* Exact only — prefix matching made PHOTO match PHOTO/AUTOMOTIVE and broke Next. */\nvar A=norm(strip(a)),B=norm(strip(b));\nif(!A||!B)return false;\nreturn A===B;\n}\nfunction nextOf(list,p){\nif(!list||!list.length)return null;\nvar cur=norm(strip(p)),idx=-1;\nfor(var i=0;i<list.length;i++){\nvar key=norm(list[i].routeKey||strip(list[i].path));\nif(key===cur){idx=i;break;}\n}\nif(idx<0){\n/* Index pages + removed/renamed galleries restart at the first live HOME/PHOTO link. */\nreturn list[0];\n}\nreturn list[(idx+1)%list.length];\n}\nfunction stopBar(reset){\nbarRunning=false;\nif(barRaf){cancelAnimationFrame(barRaf);barRaf=null;}\nif(reset)setFill(0);\n}\nfunction setFill(p){\nif(!fill)return;\nfill.style.width=Math.max(0,Math.min(1,p))*100+\"%\";\n}\nfunction setNextLabel(next){\nif(!nextBtn||!next)return;\nnextBtn.setAttribute(\"data-href\",next.path);\nnextBtn.setAttribute(\"data-key\",next.key||\"\");\nif(nameEl)nameEl.textContent=String(next.label||\"\").toUpperCase();\nif(kickerEl)kickerEl.textContent=next.mode===\"section\"?\"Next section\":\"Next project\";\nsoftPrefetch(next.path);\n}\nfunction softPrefetch(href){\ntry{\nvar path=String(href||\"\");\nif(!path||path.charAt(0)!==\"/\")return;\nif(document.querySelector('link[data-jd-next-prefetch=\"'+path+'\"]'))return;\nvar link=document.createElement(\"link\");\nlink.rel=\"prefetch\";\nlink.href=path;\nlink.setAttribute(\"data-jd-next-prefetch\",path);\ndocument.head.appendChild(link);\n}catch(e){}\n}\nfunction scrollTopHard(){\nmarkProg(1200);\nstopGlide();\nvar nodes=[document.scrollingElement,document.documentElement,document.body];\nfor(var i=0;i<nodes.length;i++){if(nodes[i])try{nodes[i].scrollTop=0;}catch(e){}}\ntry{window.scrollTo(0,0);}catch(e){}\n}\nfunction go(href){\nif(!href||now()<navLockUntil)return;\nnavLockUntil=now()+1600;\nvar token=++goToken;\nsetMode(\"leaving\");\nstopBar(true);\nstopGlide();\ntry{if(window.__jdMarkNav)window.__jdMarkNav();}catch(e){}\nscrollTopHard();\nvar target=String(href);\nfunction applyRoute(){\ntry{\nif(window.dx&&dx.address&&typeof dx.address.setValue===\"function\"){\ndx.address.setValue(target);return;\n}\n}catch(e){}\ntry{location.assign(target);}catch(err){location.href=target;}\n}\napplyRoute();\n[300,800,1600].forEach(function(ms){\nsetTimeout(function(){\nif(token!==goToken)return;\nif(!sameRoute(pathNow(),target)){\ntry{location.assign(target);}catch(e){}\n}\nburstHeight();\n},ms);\n});\n}\nfunction onNextActivate(e){\nif(e){e.preventDefault();e.stopPropagation();}\n/* Always honor the href already shown on the bar — never recalculate a different next. */\nvar href=nextBtn&&nextBtn.getAttribute(\"data-href\");\nif(href){go(href);return;}\nloadQueue(function(list){\nvar next=nextOf(list,pathNow());\nif(next){setNextLabel(next);go(next.path);}\n});\n}\nfunction startBar(){\nif(!thumbsOk()||now()<navLockUntil)return;\nif(barRunning)return;\nif(mode!==\"bottom\")return;\nensureMount();\nfill=nextBtn?nextBtn.querySelector(\".jd-tour-chrome__fill\"):null;\nif(!fill)return;\n/* Refresh the promised destination before the fill starts. */\nloadQueue(function(list){\nvar next=nextOf(list,pathNow());\nif(next)setNextLabel(next);\n});\nbarRunning=true;\nbarStart=performance.now();\nvar bottomLostSince=0;\nsetFill(0);\nfunction tick(t){\nif(!barRunning||mode!==\"bottom\"){stopBar(false);return;}\nif(!atTrueBottom()){\nif(!bottomLostSince)bottomLostSince=t;\nif(t-bottomLostSince>480){\nstopBar(true);\nsetMode(\"user\");\narmIdleGlide(IDLE_MS);\nreturn;\n}\n}else bottomLostSince=0;\nvar p=(t-barStart)/DWELL_MS;\nif(p>=1){\nsetFill(1);barRunning=false;barRaf=null;\nvar href=nextBtn&&nextBtn.getAttribute(\"data-href\");\nif(href)go(href);\nelse onNextActivate(null);\nreturn;\n}\nsetFill(p);\nbarRaf=requestAnimationFrame(tick);\n}\nbarRaf=requestAnimationFrame(tick);\n}\nfunction hideLegacyFloats(){\n[\"jd-next-project\",\"jd-back-top\"].forEach(function(id){\nvar el=document.getElementById(id);\nif(el){el.classList.remove(\"is-on\");el.style.display=\"none\";}\n});\n}\nfunction ensureMount(){\nvar foot=document.querySelector(\".jd-gal-footer\");\nvar dock=document.getElementById(\"jd-tour-dock\");\nif(onHomeSnap()||isMediaSlide()||!isThumbsRoute()){\nif(dock){try{dock.remove();}catch(e){}}\nstopBar(true);\nchrome=null;upBtn=null;nextBtn=null;fill=null;nameEl=null;kickerEl=null;\nreturn null;\n}\nif(foot&&dock){try{dock.remove();}catch(e){}}\nif(!foot)return null;\nvar row=foot.querySelector(\".jd-tour-row\");\nvar nav=foot.querySelector(\".jd-gal-footer__nav\");\nif(!row){\nrow=document.createElement(\"div\");\nrow.className=\"jd-tour-row\";\nif(nav&&nav.parentNode===foot){foot.insertBefore(row,nav);row.appendChild(nav);}\nelse{\nvar rule=foot.querySelector(\".jd-gal-footer__rule\");\nif(rule)foot.insertBefore(row,rule);else foot.insertBefore(row,foot.firstChild);\n}\n}\nupBtn=row.querySelector(\".jd-tour-chrome__up\");\nif(!upBtn){\nupBtn=document.createElement(\"button\");\nupBtn.type=\"button\";\nupBtn.className=\"jd-tour-chrome__up\";\nupBtn.setAttribute(\"aria-label\",\"Back to top\");\nrow.insertBefore(upBtn,row.firstChild);\n}\nif(!upBtn.querySelector(\"svg\")){\nupBtn.innerHTML='<span class=\"jd-tour-chrome__arrow\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M12 5v14\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\"/><path d=\"M7.5 9.5 12 5l4.5 4.5\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg></span>';\n}\nnextBtn=row.querySelector(\".jd-tour-chrome__next\");\nif(!nextBtn){\nnextBtn=document.createElement(\"button\");\nnextBtn.type=\"button\";\nnextBtn.className=\"jd-tour-chrome__next\";\nnextBtn.setAttribute(\"aria-label\",\"Next project\");\nnextBtn.innerHTML='<span class=\"jd-tour-chrome__meta\"><span class=\"jd-tour-chrome__kicker\">Next</span><span class=\"jd-tour-chrome__name\"></span></span><span class=\"jd-tour-chrome__track\" aria-hidden=\"true\"><span class=\"jd-tour-chrome__fill\"></span></span>';\nrow.appendChild(nextBtn);\n}\nnav=row.querySelector(\".jd-gal-footer__nav\")||nav;\nif(nav&&nav.parentNode!==row)row.insertBefore(nav,nextBtn);\nif(upBtn.nextSibling!==nav&&nav)row.insertBefore(upBtn,nav);\nif(nextBtn.parentNode===row)row.appendChild(nextBtn);\nchrome=row;\nwire();\nreturn chrome;\n}\nfunction wire(){\nif(!chrome||!chrome.isConnected)return;\nupBtn=chrome.querySelector(\".jd-tour-chrome__up\");\nnextBtn=chrome.querySelector(\".jd-tour-chrome__next\");\nfill=nextBtn?nextBtn.querySelector(\".jd-tour-chrome__fill\"):null;\nnameEl=nextBtn?nextBtn.querySelector(\".jd-tour-chrome__name\"):null;\nkickerEl=nextBtn?nextBtn.querySelector(\".jd-tour-chrome__kicker\"):null;\nif(!upBtn||!nextBtn)return;\nif(chrome.getAttribute(\"data-jd-wired\")===\"1\")return;\nchrome.setAttribute(\"data-jd-wired\",\"1\");\nupBtn.addEventListener(\"click\",function(e){\ne.preventDefault();e.stopPropagation();\nstopBar(true);\nsetMode(\"user\");\nscrollTopHard();\narmIdleGlide(IDLE_MS);\n});\nnextBtn.addEventListener(\"click\",onNextActivate);\n}\nfunction syncMount(){\nhideLegacyFloats();\nif(!thumbsOk()){ensureMount();return;}\nensureMount();\nloadQueue(function(list){\nvar next=nextOf(list,pathNow());\nif(next)setNextLabel(next);\n});\n}\n\n/* ---------- Route + boot ---------- */\nfunction onRoute(){\nclearTimeouts();\nstopGlide();\nstopBar(true);\ninvalidateQueue();\nlastPath=pathNow();\nif(isMediaSlide()){releasePageToMedia();return;}\nif(onHomeSnap()||!isThumbsRoute()){releaseAll();return;}\nsetMode(\"measuring\");\nburstHeight();\nsyncMount();\nif(bootT)clearTimeout(bootT);\nbootT=setTimeout(function(){\nbootT=null;\nif(!thumbsOk())return;\nif(mode===\"user\"||mode===\"bottom\"||mode===\"leaving\")return;\nstartGlide();\n},START_MS);\n}\nfunction watchPath(){\nvar p=pathNow();\nif(p!==lastPath)onRoute();\n}\nfunction onScroll(){\nif(isProg())return;\nif(!thumbsOk())return;\nif(mode===\"gliding\")return;\nif(mode===\"bottom\"&&!atTrueBottom()){\nstopBar(true);\nsetMode(\"user\");\narmIdleGlide(IDLE_MS);\nreturn;\n}\nif(mode===\"user\"||mode===\"measuring\"){\nscheduleHeight();\nif(atTrueBottom())enterBottom();\n}\n}\nfunction bind(){\nlastPath=pathNow();\nwindow.__jdThumbs={\nmode:function(){return mode;},\nnoteUser:noteUser,\nnoteProgrammatic:markProg,\nburstHeight:burstHeight,\nensureHeight:ensureHeight,\nrelease:releaseAll,\natTrueBottom:atTrueBottom,\narmIdleGlide:armIdleGlide,\nrequestNext:function(opts){\nopts=opts||{};\nif(opts.reason===\"click\")onNextActivate(null);\nelse if(atTrueBottom())enterBottom();\n},\ngoNext:onNextActivate,\ngetLinkMap:function(){return queue?queue.slice():null;},\ninvalidateLinkMap:invalidateQueue\n};\ndocument.addEventListener(\"visibilitychange\",function(){\nif(!document.hidden)invalidateQueue();\n});\nwindow.__jdUnlockThumbs=burstHeight;\nwindow.__jdTightenPageEnd=function(){ensureHeight({force:true});};\nwindow.__jdReleaseScrollLocks=releaseAll;\nwindow.__jdStopSectionGlide=noteUser;\nwindow.__jdArmSectionGlide=armIdleGlide;\nwindow.__jdOnGlideBottom=function(){if(atTrueBottom())enterBottom();};\n\nwindow.addEventListener(\"wheel\",noteUser,{passive:true,capture:true});\nwindow.addEventListener(\"touchstart\",noteUser,{passive:true,capture:true});\nwindow.addEventListener(\"keydown\",function(e){\nif([\"ArrowDown\",\"ArrowUp\",\"PageDown\",\"PageUp\",\"Home\",\"End\",\" \"].indexOf(e.key)>=0)noteUser();\n},{passive:true});\nwindow.addEventListener(\"scroll\",onScroll,{passive:true});\nwindow.addEventListener(\"resize\",function(){if(thumbsOk())scheduleHeight();});\nwindow.addEventListener(\"hashchange\",onRoute);\nwindow.addEventListener(\"popstate\",onRoute);\ntry{\nif(window.dx&&dx.address){\nvar h=function(){setTimeout(onRoute,80);};\nif(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(h);\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(h);\nelse if(typeof dx.address.addListener===\"function\")dx.address.addListener(h);\n}\n}catch(e){}\nsetInterval(watchPath,400);\ntry{\nnew MutationObserver(function(){\nif(onHomeSnap()||isMediaSlide()||!isThumbsRoute()){\nif(isMediaSlide())releasePageToMedia();\nelse if(!isThumbsRoute()||onHomeSnap())releaseAll();\n}else if(mode===\"off\")onRoute();\n}).observe(document.body,{attributes:true,attributeFilter:[\"class\"]});\n}catch(e){}\nonRoute();\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",bind);else bind();\n})();\n\n\n\n/* JD_THUMBS_SCROLL_UNLOCK_V1 */\n(function(){\nif(window.__JD_THUMBS_SCROLL_UNLOCK_V21__)return;\nwindow.__JD_THUMBS_SCROLL_UNLOCK_V21__=true;\n/* Owned by JD_THUMBS_DIRECTOR_V1 */\nfunction bridge(){\nif(!window.__jdThumbs)return;\nwindow.__jdUnlockThumbs=function(){window.__jdThumbs.burstHeight();};\nwindow.__jdTightenPageEnd=function(){window.__jdThumbs.ensureHeight({force:true});};\nwindow.__jdReleaseScrollLocks=function(){window.__jdThumbs.release();};\n}\nbridge();\nsetTimeout(bridge,50);\nsetTimeout(bridge,500);\n})();\n\n\n/* JD_SECTION_AUTOSCROLL_V1 */\n(function(){\nif(window.__JD_SECTION_AUTOSCROLL_V10__)return;\nwindow.__JD_SECTION_AUTOSCROLL_V10__=true;\n/* Owned by JD_THUMBS_DIRECTOR_V1 */\nfunction bridge(){\nif(!window.__jdThumbs)return;\nwindow.__jdStopSectionGlide=function(){window.__jdThumbs.noteUser();};\nwindow.__jdArmSectionGlide=function(delay){\ntry{\nif(typeof window.__jdThumbs.armIdleGlide===\"function\")window.__jdThumbs.armIdleGlide(delay);\n}catch(e){}\n};\n}\nbridge();\nsetTimeout(bridge,50);\n})();\n\n\n/* JD_GALLERY_MOTION_V1 */\n(function(){\nif(window.__JD_GALLERY_MOTION_V2__)return;\nwindow.__JD_GALLERY_MOTION_V2__=true;\n/* Thumb stagger removed — title motion is CSS-only. */\ntry{\ndocument.querySelectorAll(\"[class='Thumbs.grid'] > div.jd-thumb-in\").forEach(function(el){\nel.classList.remove(\"jd-thumb-in\");\nel.style.animationDelay=\"\";\n});\n}catch(e){}\n})();\n\n\n/* JD_INDEX_LINK_CLICK_V1 */\n(function(){\nif(window.__JD_INDEX_LINK_CLICK_V3__)return;\nwindow.__JD_INDEX_LINK_CLICK_V3__=true;\nvar MAP={\"OUT_0001.jpg\":\"/PHOTO/OUTDOOR/thumbs\",\"LIF_0001.jpg\":\"/PHOTO/LIFESTYLE/thumbs\",\"AUTO_0001.jpg\":\"/PHOTO/AUTOMOTIVE/thumbs\",\"KIDS_0001.jpg\":\"/PHOTO/KIDS/thumbs\",\"SPORT_0001.jpg\":\"/PHOTO/SPORT/thumbs\",\"foot-ball__fB_0001.jpg\":\"/HOME/FUTBOL/thumbs\",\"SCO_0001.jpg\":\"/COMMISIONS/SCOUT-MOTORS/thumbs\",\"TOPO_0001.jpg\":\"/COMMISIONS/TOPO-DESIGNS/thumbs\",\"rigby-go-further__RIGBY-GO_0001.jpg\":\"/COMMISIONS/RIGBY-GO-FURTHER/thumbs\",\"VOLVO_0001.jpg\":\"/HOME/VOLVO-XC90/thumbs\",\"KIA_0001.jpg\":\"/HOME/KIA-EV9-CGI/thumbs\",\"RAIN_0001.jpg\":\"/HOME/RAINBOW-PARK/thumbs\",\"RIG_0001.jpg\":\"/COMMISIONS/RIGBY/thumbs\",\"SHELL_0001.jpg\":\"/COMMISIONS/SHELL-RECHARGE/thumbs\",\"PED_0001.jpg\":\"/COMMISIONS/PEDAL-ELECTRIC/thumbs\",\"ARROW_0001.jpg\":\"/COMMISIONS/ARROWHEAD/thumbs\",\"SPEEDO_0001.jpg\":\"/COMMISIONS/SPEEDO/thumbs\",\"ONS_0001.jpg\":\"/COMMISIONS/ONSTAR/thumbs\",\"SNOW_0001.jpg\":\"/COMMISIONS/SNOWPEAK/thumbs\",\"target__Target_0001.jpg\":\"/COMMISIONS/TARGET/thumbs\",\"ROY_0001.jpg\":\"/COMMISIONS/ROYAL-CARIBBEAN-COME-SEEK/thumbs\",\"RNWY_0001.jpg\":\"/COMMISIONS/RNWY/thumbs\",\"HONDA_0001.jpg\":\"/COMMISIONS/HONDA/thumbs\",\"ASHOC_0001.jpg\":\"/COMMISIONS/ASHOC-ENERGY/thumbs\",\"GDY_0001.jpg\":\"/COMMISIONS/GOODYEAR/thumbs\",\"subaru-x-rei__SUBxREI_0001.jpg\":\"/COMMISIONS/SUBARU-X-REI/thumbs\",\"BODY_0001.jpg\":\"/HOME/SURF-BODY/thumbs\",\"MAK_0001.jpg\":\"/HOME/Makers/thumbs\",\"COAST_0001.jpg\":\"/HOME/COASTAL/thumbs\",\"ATH_0001.jpg\":\"/COMMISIONS/ATHLETA-GIRL/thumbs\",\"WIS_0001.jpg\":\"/COMMISIONS/TRAVEL-WISCONSIN/thumbs\",\"AV_0001.jpg\":\"/HOME/AVALANCHE-DOGS/thumbs\",\"royal-caribbean-perfect-day__RCI-PD_0001.jpg\":\"/COMMISIONS/ROYAL-CARIBBEAN-PERFECT-DAY/thumbs\",\"altitude__image.jpg\":\"/HOME/ALTITUDE/thumbs\",\"portland-thorns__Thorns_0001.jpg\":\"/HOME/PORTLAND-THORNS/thumbs\"};\nfunction onIndex(){\ntry{\nvar p=String(location.pathname||\"\");\nreturn /\\/(PHOTO|HOME|COMMISIONS)\\/thumbs\\/?$/i.test(p);\n}catch(e){return false;}\n}\nfunction fileOf(img){\nvar src=String((img&&(img.currentSrc||img.src))||\"\");\ntry{src=decodeURIComponent(src);}catch(e){}\nvar file=src.split(\"/\").pop().split(\"?\")[0];\nreturn file||\"\";\n}\nfunction routeTo(path){\nvar raw=String(path||\"/\");\ntry{if(window.__jdMarkNav)window.__jdMarkNav();}catch(e){}\ntry{\nif(window.dx&&dx.address&&typeof dx.address.setValue===\"function\"){\ndx.address.setValue(raw);return;\n}\n}catch(e){}\nwindow.location.href=raw;\n}\nfunction ensureCss(){\nif(document.getElementById(\"JD_INDEX_LINK_CLICK_CSS\"))return;\nvar s=document.createElement(\"style\");\ns.id=\"JD_INDEX_LINK_CLICK_CSS\";\ns.textContent='body:is(.jd-photo-index,.jd-personal-index,.jd-projects-index) .Thumbs.grid img,body:is(.jd-photo-index,.jd-personal-index,.jd-projects-index) .Thumbs.grid{cursor:pointer!important;}';\n(document.head||document.documentElement).appendChild(s);\n}\nfunction markBody(){\ntry{\nvar p=String(location.pathname||\"\");\ndocument.body.classList.toggle(\"jd-photo-index\", /\\/PHOTO\\/thumbs\\/?$/i.test(p));\ndocument.body.classList.toggle(\"jd-personal-index\", /\\/HOME\\/thumbs\\/?$/i.test(p));\ndocument.body.classList.toggle(\"jd-projects-index\", /\\/COMMISIONS\\/thumbs\\/?$/i.test(p));\n}catch(e){}\n}\nvar LABEL_MAP={\n\"ALTITUDE\":\"/HOME/ALTITUDE/thumbs\",\"PORTLAND THORNS\":\"/HOME/PORTLAND-THORNS/thumbs\",\"FUTBOL\":\"/HOME/FUTBOL/thumbs\",\"VOLVO XC90\":\"/HOME/VOLVO-XC90/thumbs\",\"RAINBOW PARK\":\"/HOME/RAINBOW-PARK/thumbs\",\"KIA EV9 CGI\":\"/HOME/KIA-EV9-CGI/thumbs\",\"SURF BODY\":\"/HOME/SURF-BODY/thumbs\",\"MAKERS\":\"/HOME/Makers/thumbs\",\"AVALANCHE DOGS\":\"/HOME/AVALANCHE-DOGS/thumbs\",\"COASTAL\":\"/HOME/COASTAL/thumbs\",\n\"RIGBY – SALMON\":\"/COMMISIONS/RIGBY-SALMON/thumbs\",\"RIGBY - SALMON\":\"/COMMISIONS/RIGBY-SALMON/thumbs\",\"BANANA BOAT\":\"/COMMISIONS/BANANA-BOAT/thumbs\",\"SIX FLAGS\":\"/COMMISIONS/SIX-FLAGS/thumbs\",\"RIGBY GO FURTHER\":\"/COMMISIONS/RIGBY-GO-FURTHER/thumbs\",\"TOPO DESIGNS\":\"/COMMISIONS/TOPO-DESIGNS/thumbs\",\"SCOUT MOTORS\":\"/COMMISIONS/SCOUT-MOTORS/thumbs\",\"ARROWHEAD\":\"/COMMISIONS/ARROWHEAD/thumbs\",\"SHELL RECHARGE\":\"/COMMISIONS/SHELL-RECHARGE/thumbs\",\"RNWY\":\"/COMMISIONS/RNWY/thumbs\",\"ROYAL CARIBBEAN COME SEEK\":\"/COMMISIONS/ROYAL-CARIBBEAN-COME-SEEK/thumbs\",\"PEDAL ELECTRIC\":\"/COMMISIONS/PEDAL-ELECTRIC/thumbs\",\"ASHOC ENERGY\":\"/COMMISIONS/ASHOC-ENERGY/thumbs\",\"GOODYEAR\":\"/COMMISIONS/GOODYEAR/thumbs\",\"ONSTAR\":\"/COMMISIONS/ONSTAR/thumbs\",\"ROYAL CARIBBEAN PERFECT DAY\":\"/COMMISIONS/ROYAL-CARIBBEAN-PERFECT-DAY/thumbs\",\"ATHLETA GIRL\":\"/COMMISIONS/ATHLETA-GIRL/thumbs\",\"SNOWPEAK\":\"/COMMISIONS/SNOWPEAK/thumbs\",\"RIGBY\":\"/COMMISIONS/RIGBY/thumbs\",\"SPEEDO\":\"/COMMISIONS/SPEEDO/thumbs\",\"HONDA\":\"/COMMISIONS/HONDA/thumbs\",\"SUBARU X REI\":\"/COMMISIONS/SUBARU-X-REI/thumbs\",\"TRAVEL WISCONSIN\":\"/COMMISIONS/TRAVEL-WISCONSIN/thumbs\",\"TARGET\":\"/COMMISIONS/TARGET/thumbs\"\n};\nfunction labelOf(a){return String(a&&a.textContent||\"\").replace(/\\s+/g,\" \").trim().toUpperCase();}\nfunction routeForTarget(target){\nvar canonical=target&&target.closest?target.closest(\"[data-jd-canonical-route]\"):null;\nif(canonical&&canonical.dataset.jdCanonicalRoute)return canonical.dataset.jdCanonicalRoute;\nvar label=target&&target.closest?target.closest(\"a.menuLabel\"):null;\nif(label){var byLabel=LABEL_MAP[labelOf(label)];if(byLabel)return byLabel;}\nvar img=target&&target.closest?target.closest(\"img\"):null;\nif(img)return MAP[fileOf(img)]||\"\";\nreturn \"\";\n}\nfunction syncLabelLinks(){\nif(!onIndex())return;\ndocument.querySelectorAll(\"a.menuLabel\").forEach(function(a){\nvar route=LABEL_MAP[labelOf(a)];\nif(route){a.href=route;a.dataset.jdCanonicalRoute=route;}\n});\nif(!document.body.classList.contains(\"jd-projects-index\"))return;\ndocument.querySelectorAll(\"span\").forEach(function(span){\nvar route=LABEL_MAP[labelOf(span)];\nif(!route||span.closest(\"a\"))return;\nvar link=document.createElement(\"a\");\nfor(var i=0;i<span.attributes.length;i++)link.setAttribute(span.attributes[i].name,span.attributes[i].value);\nlink.href=route;\nlink.dataset.jdCanonicalRoute=route;\nlink.textContent=span.textContent;\nlink.style.cursor=\"pointer\";\nlink.style.textDecoration=\"none\";\nspan.replaceWith(link);\n});\n}\nfunction onClick(e){\nif(!onIndex())return;\nvar route=routeForTarget(e.target);\nif(!route)return;\ne.preventDefault();\ne.stopPropagation();\nrouteTo(route);\n}\ndocument.addEventListener(\"click\",onClick,true);\nmarkBody();ensureCss();syncLabelLinks();\ntry{new MutationObserver(function(){syncLabelLinks();}).observe(document.body,{childList:true,subtree:true});}catch(e){}\ntry{if(window.dx&&dx.address&&typeof dx.address.addListener===\"function\")dx.address.addListener(function(){setTimeout(function(){markBody();syncLabelLinks();},30);});}catch(e){}\nwindow.addEventListener(\"popstate\",function(){setTimeout(function(){markBody();syncLabelLinks();},30);});\n[80,250,700,1600].forEach(function(ms){setTimeout(syncLabelLinks,ms);});\n})();\n\n\n/* JD_MOTION_REPLAY_V1 */\n(function(){\nif(window.__JD_MOTION_REPLAY_V1__)return;\nwindow.__JD_MOTION_REPLAY_V1__=true;\nfunction replay(sel){\ndocument.querySelectorAll(sel).forEach(function(el){\nel.style.animation=\"none\";\nvoid el.offsetWidth;\nel.style.animation=\"\";\n});\n}\nfunction replayAll(){\nreplay(\"#jd-proj-title .jd-proj-title__h, .jd-proj-title .jd-proj-title__h, #jd-photo-title .jd-proj-title__h, #jd-motion-title .jd-proj-title__h, #jd-athleta-title .jd-athleta-title__h, #jd-proj-title .jd-proj-title__p, .jd-proj-title .jd-proj-title__p, #jd-athleta-title .jd-athleta-title__p\");\nreplay(\".logoText, #jd-chrome\");\ndocument.querySelectorAll(\".jd-gal-footer\").forEach(function(f){f.classList.remove(\"is-in\");});\nsetTimeout(observeFooters,40);\n}\nfunction observeFooters(){\ndocument.querySelectorAll(\".jd-gal-footer\").forEach(function(f){\nif(f.dataset.jdFootObs)return;\nf.dataset.jdFootObs=\"1\";\nif(!(\"IntersectionObserver\" in window)){f.classList.add(\"is-in\");return;}\nvar io=new IntersectionObserver(function(entries){\nentries.forEach(function(en){\nif(en.isIntersecting){en.target.classList.add(\"is-in\");}\n});\n},{threshold:0.12,rootMargin:\"0px 0px -8% 0px\"});\nio.observe(f);\n});\n}\nfunction onRoute(){setTimeout(replayAll,80);setTimeout(replayAll,280);setTimeout(observeFooters,320);}\ntry{\nif(window.dx&&dx.address){\nvar h=onRoute;\nif(typeof dx.address.addListener===\"function\")dx.address.addListener(h);\nelse if(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(h);\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(h);\n}\n}catch(e){}\nwindow.addEventListener(\"hashchange\",onRoute);\nwindow.addEventListener(\"popstate\",onRoute);\ndocument.addEventListener(\"menuClosed\",function(){setTimeout(replayAll,120);});\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",function(){observeFooters();});\nelse observeFooters();\nnew MutationObserver(function(){observeFooters();}).observe(document.body,{childList:true,subtree:true});\n})();\n\n\n/* JD_INFO_CONTACT_V2 */\n(function(){\nif(window.__JD_INFO_CONTACT_V2__)return;\nwindow.__JD_INFO_CONTACT_V2__=true;\nvar FORM_ID=\"671c8d4c6056304e3a6c5f50\";\nvar booted=false;\nvar wasContact=false;\nfunction onContact(){\ntry{\nvar p=\"\";\nif(window.dx&&dx.address){\nif(dx.address.path!=null&&String(dx.address.path).length)p=String(dx.address.path);\nelse if(dx.address.url!=null&&String(dx.address.url).length)p=String(dx.address.url);\n}\nif(!p)p=String(location.pathname||\"\");\np=decodeURIComponent(p).toUpperCase();\nreturn p.indexOf(\"CONTACT\")>=0;\n}catch(e){return String(location.pathname||\"\").toUpperCase().indexOf(\"CONTACT\")>=0;}\n}\nfunction loadFlodesk(){\nif(window.fd&&window.fd.q!==undefined)return Promise.resolve();\nif(window.__jdFlodeskP)return window.__jdFlodeskP;\nwindow.__jdFlodeskP=new Promise(function(resolve){\nvar w=window,d=document,t=\"script\",h=\"https://assets.flodesk.com\",s=\"/universal\",n=\"fd\";\nw.FlodeskObject=n;\nvar fn=function(){(w[n].q=w[n].q||[]).push(arguments);};\nw[n]=w[n]||fn;\nvar f=d.getElementsByTagName(t)[0];\nvar v=\"?v=\"+Math.floor(new Date().getTime()/(120*1000))*60;\nvar sm=d.createElement(t);sm.async=true;sm.type=\"module\";sm.src=h+s+\".mjs\"+v;\nvar sn=d.createElement(t);sn.async=true;sn.noModule=true;sn.src=h+s+\".js\"+v;\nvar done=false;function fin(){if(done)return;done=true;resolve();}\nsm.onload=fin;sn.onload=fin;setTimeout(fin,2500);\nf.parentNode.insertBefore(sm,f);f.parentNode.insertBefore(sn,f);\n});\nreturn window.__jdFlodeskP;\n}\nfunction mountForm(){\nif(!onContact())return;\nvar el=document.getElementById(\"fd-form-\"+FORM_ID);\nif(!el)return;\nloadFlodesk().then(function(){\ntry{\nif(typeof window.fd===\"function\"){\nwindow.fd(\"form\",{formId:FORM_ID,containerEl:\"#fd-form-\"+FORM_ID});\nbooted=true;\n}\n}catch(e){}\n});\n}\nfunction sync(){\nif(onContact()){\nvar entering=!wasContact;\nwasContact=true;\ndocument.body.classList.add(\"jd-info-contact-on\");\ndocument.body.classList.remove(\"jd-home-snap-on\");\n/* Only jump to top when first entering CONTACT — never on later DX address pings */\nif(entering){\ntry{window.scrollTo(0,0);}catch(e){}\n}\nsetTimeout(mountForm,60);\nsetTimeout(mountForm,400);\nsetTimeout(mountForm,1200);\n}else{\nwasContact=false;\ndocument.body.classList.remove(\"jd-info-contact-on\");\n}\n}\ntry{\nif(window.dx&&dx.address){\nvar h=function(){setTimeout(sync,50);setTimeout(sync,250);setTimeout(sync,700);};\nif(typeof dx.address.addListener===\"function\")dx.address.addListener(h);\nelse if(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(h);\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(h);\n}\n}catch(e){}\nwindow.addEventListener(\"hashchange\",sync);\nwindow.addEventListener(\"popstate\",sync);\nnew MutationObserver(function(){if(onContact()&&!booted)mountForm();}).observe(document.body,{childList:true,subtree:true});\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",sync);else sync();\n})();\n\n\n\n/* JD_MOTION_THUMB_LOOP_V1 */\n(function(){\nif(window.__JD_MOTION_THUMB_LOOP_V2__)return;\nwindow.__JD_MOTION_THUMB_LOOP_V2__=true;\nfunction onMotionThumbs(){\ntry{\nvar p=\"\";\nif(window.dx&&dx.address){\nif(dx.address.path!=null&&String(dx.address.path).length)p=String(dx.address.path);\nelse if(dx.address.url!=null&&String(dx.address.url).length)p=String(dx.address.url);\n}\nif(!p)p=String(location.pathname||\"\");\np=decodeURIComponent(p).toUpperCase().replace(/\\/+$/,\"\");\nreturn p===\"/MOTION\"||p===\"/MOTION/THUMBS\"||p.indexOf(\"/MOTION/THUMBS\")===0;\n}catch(e){return /^\\/MOTION\\/THUMBS/i.test(String(location.pathname||\"\"));}\n}\nfunction getGrid(){return document.getElementsByClassName(\"Thumbs.grid\")[0]||null;}\nfunction isThumbVid(v){\ntry{\nif(!v||!getGrid()||!getGrid().contains(v))return false;\nvar s=String(v.currentSrc||v.src||\"\");\nif(!s){\nvar sources=v.querySelectorAll(\"source\");\nfor(var i=0;i<sources.length;i++)s+=String(sources[i].src||\"\")+\" \";\n}\nreturn /thumb4s/i.test(s);\n}catch(e){return false;}\n}\nfunction kick(v){\ntry{\nif(!v||!v.isConnected)return;\nv.muted=true;\nv.defaultMuted=true;\nv.loop=true;\nv.playsInline=true;\nv.setAttribute(\"muted\",\"\");\nv.setAttribute(\"playsinline\",\"\");\nv.setAttribute(\"autoplay\",\"\");\nv.setAttribute(\"loop\",\"\");\nvar p=v.play();\nif(p&&typeof p.catch===\"function\")p.catch(function(){});\n}catch(e){}\n}\nfunction sync(){\nvar on=onMotionThumbs();\ntry{\nif(on)document.body.classList.add(\"jd-motion-thumbs-on\");\nelse document.body.classList.remove(\"jd-motion-thumbs-on\");\n}catch(e){}\nif(!on)return;\nvar grid=getGrid();\nif(!grid)return;\nvar vids=grid.querySelectorAll(\"video\");\nfor(var i=0;i<vids.length;i++){\nif(isThumbVid(vids[i]))kick(vids[i]);\n}\n}\nvar t=null;\nfunction schedule(){if(t)clearTimeout(t);t=setTimeout(sync,100);}\nfunction boot(){\nsync();\nwindow.addEventListener(\"scroll\",schedule,{passive:true});\nwindow.addEventListener(\"resize\",schedule);\ndocument.addEventListener(\"visibilitychange\",function(){if(!document.hidden)sync();});\ntry{\nif(window.dx&&dx.address){\nif(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(schedule);\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(schedule);\nelse if(typeof dx.address.addListener===\"function\")dx.address.addListener(schedule);\n}\n}catch(e){}\ntry{\nif(window.MutationObserver){\nvar mo=new MutationObserver(schedule);\nvar grid=getGrid();\nif(grid)mo.observe(grid,{childList:true,subtree:true,attributes:true,attributeFilter:[\"src\"]});\nelse mo.observe(document.documentElement,{childList:true,subtree:true});\n}\n}catch(e){}\n[300,900,1800,3500].forEach(function(ms){setTimeout(sync,ms);});\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\n})();\n\n\n/* JD_THUMB_HYDRATE_V4 */\n(function(){\nif(window.__JD_THUMB_HYDRATE_V4__)return;\nwindow.__JD_THUMB_HYDRATE_V4__=true;\nvar cache=null;\nvar loading=false;\nvar t=null;\nvar seenEmpty=new WeakMap();\nvar bootAt=Date.now();\nfunction routePath(){\ntry{\nvar p=\"\";\nif(window.dx&&dx.address){\nif(dx.address.path!=null&&String(dx.address.path).length)p=String(dx.address.path);\nelse if(dx.address.url!=null&&String(dx.address.url).length)p=String(dx.address.url);\n}\nif(!p)p=String(location.pathname||\"/\");\np=decodeURIComponent(p).split(\"#\")[0].split(\"?\")[0];\nif(p.charAt(0)!==\"/\")p=\"/\"+p;\nreturn p.replace(/\\/+$/,\"\")||\"/\";\n}catch(e){return String(location.pathname||\"/\");}\n}\nfunction sectionKeyFromPath(p){\nvar parts=String(p||\"/\").replace(/^\\/+/,\"\").split(\"/\").filter(Boolean);\nif(!parts.length)return \"HOME\";\nif(/^thumbs$/i.test(parts[parts.length-1]))parts=parts.slice(0,-1);\nif(!parts.length)return \"HOME\";\nreturn parts.join(\"/\");\n}\nfunction mediaUrl(raw){\nvar s=String(raw||\"\").trim();\nif(!s)return \"\";\nif(/^vimeo:/i.test(s)||/^youtube:/i.test(s))return \"\";\nif(/^https?:\\/\\//i.test(s))return s;\nif(s.indexOf(\"/pf-media/\")===0)return s;\nif(s.charAt(0)===\"/\"&&!/\\.(jpe?g|png|gif|webp|mp4|webm|mov)(\\?|$)/i.test(s))return \"\";\nif(/\\.(jpe?g|png|gif|webp|mp4|webm|mov)(\\?|$)/i.test(s)){\nreturn s.charAt(0)===\"/\" ? s : (\"/pf-media/\"+s.replace(/^\\/+/, \"\"));\n}\nreturn \"\";\n}\nfunction sourceForItem(item){\nif(!item)return \"\";\nvar fromThumb=mediaUrl(item.thumb);\nif(fromThumb)return fromThumb;\nreturn mediaUrl(item.content);\n}\nfunction isVideoUrl(u){return /\\.(mp4|webm|mov)(\\?|$)/i.test(String(u||\"\"));}\nfunction cellLabel(cell){\nreturn String((cell&&cell.innerText)||\"\").trim().split(\"\\n\")[0].replace(/\\s+/g,\" \").trim();\n}\nfunction norm(s){return String(s||\"\").toUpperCase().replace(/[^A-Z0-9]+/g,\"\");}\nfunction loadData(cb){\nif(cache){cb(cache);return;}\nif(typeof window.__jdPfData===\"function\"){\nwindow.__jdPfData(function(data){\nif(!data||data.error)return;\ncache={sections:data.sections||{},media:data.media||{}};\ncb(cache);\n});\nreturn;\n}\nif(loading)return;\nloading=true;\nPromise.all([\nfetch(\"/pf-data/sections.json\",{credentials:\"same-origin\"}).then(function(r){return r.json();}),\nfetch(\"/pf-data/media.json\",{credentials:\"same-origin\"}).then(function(r){return r.json();})\n]).then(function(pair){\ncache={sections:pair[0]||{},media:pair[1]||{}};\nloading=false;\ncb(cache);\n}).catch(function(){loading=false;});\n}\nfunction mediaListForRoute(data){\nvar key=sectionKeyFromPath(routePath());\nvar sec=(data.sections&&data.sections[key])||null;\nif(!sec){\nvar up=key.toUpperCase();\nvar hit=Object.keys(data.sections||{}).find(function(k){return String(k).toUpperCase()===up;});\nsec=hit?data.sections[hit]:null;\n}\nvar ids=(sec&&Array.isArray(sec.media))?sec.media:[];\nreturn ids.map(function(id){return data.media&&data.media[id]?data.media[id]:null;}).filter(Boolean);\n}\nfunction findItem(list,cell,index){\nvar byIndex=list[index]||null;\nvar label=cellLabel(cell);\nvar nLabel=norm(label);\nif(byIndex&&sourceForItem(byIndex)){\nvar nItem=norm(byIndex.label||byIndex.name||byIndex.title||\"\");\nif(!nLabel||!nItem||nLabel===nItem)return byIndex;\n}\nfor(var i=0;i<list.length;i++){\nvar it=list[i];\nif(!it||!sourceForItem(it))continue;\nif(norm(it.label||it.name||it.title||\"\")===nLabel)return it;\n}\nreturn byIndex&&sourceForItem(byIndex)?byIndex:null;\n}\nfunction cleanupBadHydrate(cell){\nif(!cell)return;\nvar nodes=cell.querySelectorAll('[data-jd-hydrate=\"1\"]');\nfor(var i=0;i<nodes.length;i++){\nvar el=nodes[i];\nvar src=el.currentSrc||el.src||\"\";\nif(el.tagName===\"IMG\"&&isVideoUrl(src)){\nif(el.parentNode)el.parentNode.removeChild(el);\n}\n}\nvar media=cell.querySelectorAll(\"img,video\");\nif(media.length<2)return;\nvar native=null;\nvar kill=[];\nfor(var j=0;j<media.length;j++){\nvar m=media[j];\nif(m.getAttribute(\"data-jd-hydrate\")===\"1\")kill.push(m);\nelse if(!native)native=m;\n}\nif(native){\nfor(var k=0;k<kill.length;k++){if(kill[k].parentNode)kill[k].parentNode.removeChild(kill[k]);}\n}\n}\nfunction hasNativeMedia(cell){\nvar media=cell?cell.querySelectorAll(\"img,video\"):[];\nfor(var i=0;i<media.length;i++){\nif(media[i].getAttribute(\"data-jd-hydrate\")!==\"1\")return true;\n}\nreturn false;\n}\nfunction ensureMedia(cell,item){\nif(!cell||!item)return false;\ncleanupBadHydrate(cell);\nif(hasNativeMedia(cell))return false;\nif(cell.querySelector('[data-jd-hydrate=\"1\"]'))return false;\nvar now=Date.now();\nvar first=seenEmpty.get(cell)||now;\nseenEmpty.set(cell,first);\nif(now-first<1200&&now-bootAt<4000)return false;\nvar src=sourceForItem(item);\nif(!src)return false;\nvar wrap=cell.children&&cell.children[0];\nif(!wrap)return false;\nif(wrap.querySelector(\"img,video\"))return false;\nvar label=cellLabel(cell)||String(item.label||item.name||item.title||\"\");\nvar el;\nif(isVideoUrl(src)){\nel=document.createElement(\"video\");\nel.src=src;\nel.muted=true;\nel.defaultMuted=true;\nel.loop=true;\nel.playsInline=true;\nel.setAttribute(\"muted\",\"\");\nel.setAttribute(\"playsinline\",\"\");\nel.setAttribute(\"autoplay\",\"\");\nel.setAttribute(\"loop\",\"\");\nel.preload=\"metadata\";\ntry{var p=el.play();if(p&&typeof p.catch===\"function\")p.catch(function(){});}catch(e){}\n}else{\nel=document.createElement(\"img\");\nel.src=src;\nel.decoding=\"async\";\nel.loading=\"eager\";\n}\nel.alt=label;\nel.setAttribute(\"data-jd-hydrate\",\"1\");\nel.style.cssText=\"cursor:default;user-select:none;position:absolute;display:block;z-index:1;border-radius:0px;width:100%;height:100%;left:0px;top:0px;object-fit:cover;\";\nwrap.appendChild(el);\nreturn true;\n}\nfunction hydrate(){\ntry{\nif(document.body&&document.body.classList.contains(\"jd-home-snap-on\"))return;\nvar grid=document.getElementsByClassName(\"Thumbs.grid\")[0];\nif(!grid||!grid.children||!grid.children.length)return;\nloadData(function(data){\nvar list=mediaListForRoute(data);\nif(!list.length)return;\nvar cells=grid.children;\nvar added=0;\nfor(var i=0;i<cells.length;i++){\nvar cell=cells[i];\ncleanupBadHydrate(cell);\nif(hasNativeMedia(cell)){\nseenEmpty.delete(cell);\ncell.style.removeProperty(\"display\");\ncontinue;\n}\nif(i>=list.length){\nvar orphanItem=findItem(list,cell,i);\nif(!orphanItem){\ncell.style.setProperty(\"display\",\"none\",\"important\");\ncontinue;\n}\n}\ncell.style.removeProperty(\"display\");\nif(ensureMedia(cell,findItem(list,cell,i)))added++;\n}\nif(added&&typeof window.__jdUnlockThumbs===\"function\")window.__jdUnlockThumbs();\n});\n}catch(e){}\n}\nfunction schedule(){\nif(t)clearTimeout(t);\nt=setTimeout(hydrate,180);\n}\nfunction boot(){\nschedule();\nwindow.addEventListener(\"scroll\",schedule,{passive:true});\nwindow.addEventListener(\"resize\",schedule);\ndocument.addEventListener(\"visibilitychange\",function(){if(!document.hidden)schedule();});\ntry{\nif(window.dx&&dx.address){\nif(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(function(){bootAt=Date.now();seenEmpty=new WeakMap();schedule();});\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(schedule);\nelse if(typeof dx.address.addListener===\"function\")dx.address.addListener(schedule);\n}\n}catch(e){}\ntry{new MutationObserver(schedule).observe(document.documentElement,{childList:true,subtree:true});}catch(e){}\nsetInterval(function(){\nvar grid=document.getElementsByClassName(\"Thumbs.grid\")[0];\nif(!grid)return;\nfor(var i=0;i<grid.children.length;i++)cleanupBadHydrate(grid.children[i]);\n},900);\n[500,1500,2800,5000,9000].forEach(function(ms){setTimeout(hydrate,ms);});\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\n})();\n\n\n/* JD_SEO_ROUTE_PRELOAD_V1 */\n(function(){\nif(window.__JD_SEO_ROUTE_PRELOAD_V1__)return;\nwindow.__JD_SEO_ROUTE_PRELOAD_V1__=true;\n/* Route-aware first-thumb preloads + next-route prefetch (perf/CWV, crawl-friendly) */\nvar links=Object.create(null),routeTimers=[],MAX_IMGS=4;\nfunction ensureLink(rel,href,attrs){\nif(!href||links[rel+\"|\"+href])return;\nlinks[rel+\"|\"+href]=true;\nvar el=document.createElement(\"link\");\nel.rel=rel;el.href=href;\nif(attrs)for(var k in attrs)if(attrs[k]!=null)el.setAttribute(k,attrs[k]);\n(document.head||document.documentElement).appendChild(el);\n}\nfunction pathNow(){\ntry{if(location.pathname&&location.pathname!==\"/\")return String(location.pathname);}catch(e){}\ntry{if(window.dx&&dx.address){var a=dx.address;if(a.url!=null&&String(a.url))return String(a.url);if(a.path!=null&&String(a.path))return String(a.path);}}catch(e){}\nreturn String(location.pathname||\"/\");\n}\nfunction strip(p){\nreturn String(p||\"\").trim().split(\"#\")[0].split(\"?\")[0].replace(/^https?:\\/\\/[^/]+/i,\"\").replace(/^\\/+|\\/+$/g,\"\").replace(/\\/thumbs$/i,\"\").replace(/\\/\\d+$/,\"\");\n}\nfunction mediaUrl(raw){\nvar s=String(raw||\"\").trim();\nif(!s)return \"\";\nif(/^vimeo:|^youtube:/i.test(s))return \"\";\nif(/^https?:\\/\\//i.test(s))return s;\nif(s.indexOf(\"/pf-media/\")===0)return s;\nif(/\\.(jpe?g|png|gif|webp|mp4|webm)(\\?|$)/i.test(s))return s.charAt(0)===\"/\" ? s : (\"/pf-media/\"+s.replace(/^\\/+/,\"\"));\nreturn \"\";\n}\nfunction sectionKey(p){\nvar parts=strip(p).split(\"/\").filter(Boolean);\nreturn parts.length?parts.join(\"/\"):\"HOME\";\n}\nfunction findSec(map,key){\nif(!map)return null;\nif(map[key])return map[key];\nvar up=String(key).toUpperCase();\nfor(var k in map)if(String(k).toUpperCase()===up)return map[k];\nreturn null;\n}\nfunction preloadSection(data,key){\nvar sec=findSec(data.sections,key);\nif(!sec||!sec.media)return;\nvar n=0;\nfor(var i=0;i<sec.media.length&&n<MAX_IMGS;i++){\nvar item=data.media&&data.media[sec.media[i]];\nif(!item)continue;\nvar u=mediaUrl(item.thumb)||mediaUrl(item.content);\nif(!u||/\\.(mp4|webm|mov)(\\?|$)/i.test(u))continue;\nensureLink(\"preload\",u,{as:\"image\",fetchpriority:n===0?\"high\":\"low\"});\nn++;\n}\n}\nfunction prefetchPath(href){\nif(!href)return;\nensureLink(\"prefetch\",href);\n}\nfunction sync(){\nif(!window.__jdPfData)return;\nwindow.__jdPfData(function(data){\nif(!data||data.error)return;\nvar p=pathNow();\nvar key=sectionKey(p);\npreloadSection(data,key);\n/* HOME index also warms PHOTO first tiles (primary nav destination) */\nif(!key||/^home$/i.test(key))preloadSection(data,\"PHOTO\");\n/* near-bottom next path is handled by next chrome; warm PHOTO→MOTION */\nif(/^photo$/i.test(key))prefetchPath(\"/MOTION/thumbs\");\nif(/^motion$/i.test(key))prefetchPath(\"/CONTACT-+-INFO\");\n});\n}\nfunction onRoute(){\nrouteTimers.forEach(clearTimeout);routeTimers=[];\n[0,120,600,1600].forEach(function(ms){routeTimers.push(setTimeout(sync,ms));});\n}\nfunction boot(){\nsync();\ntry{\nif(window.dx&&dx.address){\nif(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(onRoute);\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(onRoute);\nelse if(typeof dx.address.addListener===\"function\")dx.address.addListener(onRoute);\n}\n}catch(e){}\nwindow.addEventListener(\"load\",sync);\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\n})();\n\n\n/* JD_BOTTOM_TITLE_V2 */\n(function(){\nif(window.__JD_BOTTOM_TITLE_V2__)return;\nwindow.__JD_BOTTOM_TITLE_V2__=true;\n/* Section label: show after scroll, hide within 200px of section bottom */\nvar el=null,timer=null;\nvar SHOW_AFTER=60,HIDE_NEAR=200;\nfunction onChromeOverlay(){\ntry{return !!(document.body&&(document.body.classList.contains(\"jd-home-snap-on\")||document.body.classList.contains(\"jd-menu-open\")));}catch(e){return false;}\n}\nfunction ensure(){\nel=document.getElementById(\"jd-bottom-title\");\nif(el)return el;\nel=document.createElement(\"div\");\nel.id=\"jd-bottom-title\";\nel.setAttribute(\"aria-hidden\",\"true\");\n(document.body||document.documentElement).appendChild(el);\nreturn el;\n}\nfunction titleText(){\nvar nodes=[\ndocument.querySelector(\"#jd-proj-title .jd-proj-title__h\"),\ndocument.querySelector(\".jd-proj-title .jd-proj-title__h\"),\ndocument.querySelector(\"#jd-athleta-title .jd-athleta-title__h\"),\ndocument.querySelector(\"#jd-motion-title .jd-proj-title__h\")\n];\nfor(var i=0;i<nodes.length;i++){\nif(nodes[i]&&nodes[i].textContent&&nodes[i].textContent.trim())return nodes[i].textContent.trim();\n}\nreturn \"\";\n}\nfunction scrollY(){\nreturn window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;\n}\nfunction remainingToBottom(){\nvar se=document.scrollingElement||document.documentElement;\nvar sh=Math.max(document.documentElement.scrollHeight||0,document.body.scrollHeight||0,se&&se.scrollHeight||0);\nvar max=Math.max(0,sh-(window.innerHeight||0));\nreturn Math.max(0,max-scrollY());\n}\nfunction nearSectionBottom(){\nif(remainingToBottom()<=HIDE_NEAR)return true;\nvar f=document.querySelector(\".jd-gal-footer\");\nif(!f||!f.isConnected)return false;\nvar fr=f.getBoundingClientRect();\nvar vh=window.innerHeight||0;\n/* footer within 200px of viewport bottom = near end of section */\nreturn fr.bottom<=vh+HIDE_NEAR&&fr.top<vh;\n}\nfunction sync(){\nensure();\nif(onChromeOverlay()){el.classList.remove(\"is-on\");el.classList.remove(\"is-exit\");el.textContent=\"\";return;}\nvar t=titleText();\nif(!t){el.classList.remove(\"is-on\");el.classList.remove(\"is-exit\");el.textContent=\"\";return;}\nif(el.textContent!==t)el.textContent=t;\nif(nearSectionBottom()){\nel.classList.remove(\"is-on\");\nel.classList.add(\"is-exit\");\nreturn;\n}\nel.classList.remove(\"is-exit\");\nif(scrollY()>=SHOW_AFTER)el.classList.add(\"is-on\");\nelse el.classList.remove(\"is-on\");\n}\nfunction schedule(){if(timer)clearTimeout(timer);timer=setTimeout(sync,24);}\nfunction boot(){\nensure();\nsync();\nwindow.addEventListener(\"scroll\",schedule,{passive:true});\nwindow.addEventListener(\"resize\",schedule);\n[80,250,700,1600,3200].forEach(function(ms){setTimeout(sync,ms);});\ntry{\nif(window.dx&&dx.address){\nvar h=function(){el&&el.classList.remove(\"is-on\");el&&el.classList.remove(\"is-exit\");schedule();setTimeout(sync,200);setTimeout(sync,700);};\nif(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(h);\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(h);\nelse if(typeof dx.address.addListener===\"function\")dx.address.addListener(h);\n}\n}catch(e){}\ntry{\nnew MutationObserver(schedule).observe(document.body,{attributes:true,attributeFilter:[\"class\"]});\n}catch(e){}\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\n})();\n\n\n/* JD_FOOTER_TOUR_V11 */\n(function(){\nif(window.__JD_FOOTER_TOUR_V13__)return;\nwindow.__JD_FOOTER_TOUR_V13__=true;\n/* Owned by JD_THUMBS_DIRECTOR_V1 — Next dwell + click live in director */\nwindow.__jdOnGlideBottom=function(){\ntry{if(window.__jdThumbs&&window.__jdThumbs.atTrueBottom())window.__jdThumbs.requestNext({reason:\"dwell\"});}catch(e){}\n};\n})();\n\n\n/* JD_THUMB_SCROLL_ZOOM_V2 */\n(function(){\nif(window.__JD_THUMB_SCROLL_ZOOM_V3__)return;\nwindow.__JD_THUMB_SCROLL_ZOOM_V3__=true;\nvar CROP_PX=28;\nvar TOP_CROP_EXTRA=14;\nvar END_VH=0.42;\nvar START_VH=1.08;\nvar LERP=0.12;\nvar SCALE_CAP=1.12;\nvar IDLE_STOP_MS=480;\nvar PF_THUMBS_GRID=\"Thumbs.grid\";\nvar states=new WeakMap();\nvar reduceMotion=false;\nvar loopOn=false;\nvar idleStopT=null;\nfunction clamp(v,min,max){return Math.max(min,Math.min(max,v));}\nfunction smoothstep(t){return t*t*(3-2*t);}\nfunction readReduceMotion(){\ntry{reduceMotion=window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches;}\ncatch(_){reduceMotion=false;}\n}\nfunction pfClass(el,name){return !!(el&&el.classList&&el.classList.contains(name));}\nfunction pfClosest(el,name){\nwhile(el){if(pfClass(el,name))return el;el=el.parentElement;}\nreturn null;\n}\nfunction getThumbsGrid(){return document.getElementsByClassName(PF_THUMBS_GRID)[0]||null;}\nfunction onThumbRoute(){\ntry{if(document.body&&document.body.classList.contains(\"jd-home-snap-on\"))return false;}catch(e){}\nreturn !!getThumbsGrid();\n}\nfunction getThumbMedia(){\nvar grid=getThumbsGrid();\nif(!grid)return [];\nvar out=[],nodes=grid.querySelectorAll(\"img,video\");\nfor(var i=0;i<nodes.length;i++){\nvar el=nodes[i];\nvar r=el.getBoundingClientRect();\nvar src=el.currentSrc||el.src||\"\";\nif(r.width<32||r.height<32)continue;\nif(el.tagName===\"IMG\"&&(!src||/loader/i.test(src)))continue;\nout.push(el);\n}\nreturn out;\n}\nfunction getWrap(el){\nvar grid=pfClosest(el,PF_THUMBS_GRID);\nvar cell=el.parentElement;\nif(grid&&cell&&cell!==grid){\nif(cell.parentElement&&cell.parentElement!==grid)return cell.parentElement;\nreturn cell;\n}\nreturn cell;\n}\nfunction ensureWrap(wrap){\nif(!wrap)return wrap;\nif(wrap.dataset.jdZoomWrap!==\"1\")wrap.dataset.jdZoomWrap=\"1\";\nwrap.style.setProperty(\"overflow\",\"visible\",\"important\");\nvar mediaBox=null;\nfor(var i=0;i<(wrap.children?wrap.children.length:0);i++){\nvar ch=wrap.children[i];\nif(ch&&ch.tagName===\"DIV\"&&ch.querySelector&&(ch.querySelector(\"img\")||ch.querySelector(\"video\"))){mediaBox=ch;break;}\n}\nif(mediaBox)mediaBox.style.setProperty(\"overflow\",\"hidden\",\"important\");\nreturn wrap;\n}\nfunction maxScale(w,h){\nif(!(w>0&&h>0))return 1.08;\nvar sx=(w+CROP_PX*2)/w;\nvar sy=(h+(CROP_PX+TOP_CROP_EXTRA)*2)/h;\nreturn Math.min(SCALE_CAP,Math.max(sx,sy,1.04));\n}\nfunction targetProgressForWrap(wrap){\nvar rect=wrap.getBoundingClientRect();\nif(rect.width<1||rect.height<1)return 1;\nvar vh=window.innerHeight||1;\nvar endY=vh*END_VH,startY=vh*START_VH,range=startY-endY;\nif(range<=0)return 1;\nreturn smoothstep(clamp((startY-rect.top)/range,0,1));\n}\nfunction applyThumbState(el,progress){\nvar wrap=getWrap(el);if(!wrap)return;\nvar rect=wrap.getBoundingClientRect();\nvar scaleMax=maxScale(rect.width,rect.height);\nvar inv=1-progress;\nvar scale=1+(scaleMax-1)*inv;\nvar originY=50+inv*22;\nvar posY=50+inv*12;\nel.style.setProperty(\"transform-origin\",\"center \"+originY.toFixed(1)+\"%\",\"important\");\nel.style.setProperty(\"transform\",\"scale(\"+scale.toFixed(4)+\")\",\"important\");\nel.style.setProperty(\"object-fit\",\"cover\",\"important\");\nel.style.setProperty(\"object-position\",\"center \"+posY.toFixed(1)+\"%\",\"important\");\n}\nfunction resetThumb(el){\nel.style.removeProperty(\"transform\");\nel.style.removeProperty(\"transform-origin\");\nel.style.removeProperty(\"object-position\");\nel.style.removeProperty(\"object-fit\");\n}\nfunction bindScroll(el){\nif(!el||el._jdZoomScrollBound)return;\nel._jdZoomScrollBound=true;\ntry{el.addEventListener(\"scroll\",schedule,{passive:true,capture:true});}catch(_){}\n}\nfunction bindScrollTargets(){\nbindScroll(window);bindScroll(document);bindScroll(document.documentElement);bindScroll(document.body);\n[\"Thumbs.mask\",\"Thumbs.grid.container\",\"Thumbs.container\"].forEach(function(name){\nvar els=document.getElementsByClassName(name);\nfor(var i=0;i<els.length;i++)bindScroll(els[i]);\n});\n}\nfunction tick(){\nreadReduceMotion();\nif(!onThumbRoute())return;\nvar media=getThumbMedia();\nif(!media.length)return;\nif(reduceMotion){media.forEach(resetThumb);return;}\nmedia.forEach(function(el){\nvar wrap=ensureWrap(getWrap(el));\nif(!wrap)return;\nvar targetT=targetProgressForWrap(wrap);\nvar prevT=states.has(el)?states.get(el):targetT;\nvar nextT=prevT+(targetT-prevT)*LERP;\nstates.set(el,nextT);\napplyThumbState(el,nextT);\n});\n}\nfunction schedule(){\nif(idleStopT)clearTimeout(idleStopT);\nidleStopT=setTimeout(function(){loopOn=false;idleStopT=null;},IDLE_STOP_MS);\nif(loopOn)return;\nloopOn=true;\n(function frame(){\nif(!onThumbRoute()||!loopOn){loopOn=false;return;}\ntick();\nrequestAnimationFrame(frame);\n})();\n}\nfunction boot(){\nreadReduceMotion();\nbindScrollTargets();\nschedule();\nwindow.addEventListener(\"resize\",schedule,{passive:true});\nwindow.addEventListener(\"wheel\",schedule,{passive:true});\ntry{\nnew MutationObserver(function(){bindScrollTargets();schedule();})\n.observe(document.body,{childList:true,subtree:true});\n}catch(e){}\ntry{\nif(window.dx&&dx.address){\nvar prev=dx.address.onUriChange;\ndx.address.onUriChange=function(){\nstates=new WeakMap();loopOn=false;\nif(typeof prev===\"function\")prev.apply(this,arguments);\nsetTimeout(function(){bindScrollTargets();schedule();},150);\nsetTimeout(schedule,800);\n};\n}\n}catch(e){}\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\nsetTimeout(boot,600);setTimeout(boot,2000);\n})();\n\n\n/* JD_PHOTO_HOVER_LABELS_V1 */\n(function(){\nif(window.__JD_PHOTO_HOVER_LABELS_V1__)return;\nwindow.__JD_PHOTO_HOVER_LABELS_V1__=true;\nfunction pathNow(){\ntry{if(window.dx&&dx.address){var a=dx.address;if(a.url!=null&&String(a.url))return String(a.url);if(a.path!=null&&String(a.path))return String(a.path);}}catch(e){}\nreturn String(location.pathname||\"/\");\n}\nfunction isPhotoIndex(){\nvar p=pathNow().split(\"?\")[0].split(\"#\")[0].replace(/\\/+$/,\"\");\nreturn /(^|\\/)PHOTO\\/thumbs$/i.test(p)||/(^|\\/)PHOTO$/i.test(p);\n}\nfunction syncBody(){\ntry{\nif(!document.body)return;\ndocument.body.classList.toggle(\"jd-photo-index\",isPhotoIndex());\n}catch(e){}\n}\nfunction cellOf(grid,el){\nvar n=el;\nwhile(n&&n!==grid){\nif(n.parentElement===grid)return n;\nn=n.parentElement;\n}\nreturn null;\n}\nfunction bind(grid){\nif(!grid||grid.getAttribute(\"data-jd-photo-lab\")===\"1\")return;\ngrid.setAttribute(\"data-jd-photo-lab\",\"1\");\ngrid.addEventListener(\"pointerover\",function(e){\nif(!isPhotoIndex())return;\nvar cell=cellOf(grid,e.target);\nif(!cell)return;\ncell.classList.add(\"jd-thumb-hov\");\n},true);\ngrid.addEventListener(\"pointerout\",function(e){\nvar cell=cellOf(grid,e.target);\nif(!cell)return;\nif(e.relatedTarget&&cell.contains(e.relatedTarget))return;\ncell.classList.remove(\"jd-thumb-hov\");\n},true);\n}\nfunction tick(){\nsyncBody();\nif(!isPhotoIndex())return;\nvar grid=document.getElementsByClassName(\"Thumbs.grid\")[0];\nif(grid)bind(grid);\n}\nfunction boot(){\ntick();\ntry{\nif(window.dx&&dx.address){\nif(typeof dx.address.onUriChange===\"function\")dx.address.onUriChange(function(){setTimeout(tick,80);});\nelse if(typeof dx.address.onChange===\"function\")dx.address.onChange(function(){setTimeout(tick,80);});\n}\n}catch(e){}\nwindow.addEventListener(\"hashchange\",function(){setTimeout(tick,80);});\nwindow.addEventListener(\"popstate\",function(){setTimeout(tick,80);});\nsetInterval(tick,700);\ntry{new MutationObserver(function(){if(isPhotoIndex())tick();}).observe(document.body,{childList:true,subtree:true});}catch(e){}\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\n})();\n\n\n/* JD_PHOTO_MENU_V1 */\n(function(){\nif(window.__JD_PHOTO_MENU_V1__)return;\nwindow.__JD_PHOTO_MENU_V1__=true;\nvar ITEMS=[\n  {key:\"PHOTO/OUTDOOR\",label:\"Outdoor\",path:\"/PHOTO/OUTDOOR/thumbs\"},\n  {key:\"PHOTO/AUTOMOTIVE\",label:\"Automotive\",path:\"/PHOTO/AUTOMOTIVE/thumbs\"},\n  {key:\"PHOTO/LIFESTYLE\",label:\"Lifestyle\",path:\"/PHOTO/LIFESTYLE/thumbs\"},\n  {key:\"PHOTO/KIDS\",label:\"Kids\",path:\"/PHOTO/KIDS/thumbs\"},\n  {key:\"PHOTO/SPORT\",label:\"Sport\",path:\"/PHOTO/SPORT/thumbs\"},\n  {key:\"HOME\",label:\"Personal\",path:\"/HOME/thumbs\"},\n  {key:\"COMMISIONS\",label:\"Projects\",path:\"/COMMISIONS/thumbs\"},\n  {key:\"CONTACT + INFO\",label:\"Contact + Info\",path:\"/CONTACT-+-INFO\"}\n];\nvar FALLBACK_BG={\n  \"HOME\":\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/670deab672e79e458a96a5ff_Surf.jpg\",\n  \"COMMISIONS\":\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/670deab5251e46afcd204fcd_Royal%20Caribbean.jpg\",\n  \"CONTACT + INFO\":\"https://cdn.prod.website-files.com/66a5639946bfbbbbdcbbd8ca/671f3f7df664f503f69f1cad_jdbts.jpg\"\n};\nvar backgrounds=Object.assign({},FALLBACK_BG);\nvar parentObserver=null;\nvar rebuilding=false;\nvar dataPromise=null;\n\nfunction photoTrigger(){\n  return document.querySelector(\"#jd-chrome .jd-photo-menu-trigger\");\n}\nfunction installPhotoTrigger(){\n  var chrome=document.getElementById(\"jd-chrome\");\n  if(!chrome){setTimeout(installPhotoTrigger,120);return;}\n  var amp=chrome.querySelector(\"#jd-amp-trigger,.ampersand-menu-trigger\");\n  if(amp)amp.remove();\n  var photo=photoTrigger()||chrome.querySelector(\"a[data-jd-route=\\\"/PHOTO/thumbs\\\"],a[data-jd-route=\\\"/PHOTO\\\"]\");\n  if(photo&&!photo.classList.contains(\"jd-photo-menu-trigger\")){\n    var replacement=photo.cloneNode(true);\n    replacement.removeAttribute(\"data-jd-route\");\n    replacement.removeAttribute(\"data-jd-section\");\n    replacement.setAttribute(\"href\",\"javascript:void(0)\");\n    replacement.setAttribute(\"data-jd-photo-menu\",\"1\");\n    replacement.setAttribute(\"data-jd-glow-label\",\"PHOTO\");\n    replacement.setAttribute(\"aria-label\",\"Open menu\");\n    replacement.setAttribute(\"aria-haspopup\",\"dialog\");\n    replacement.setAttribute(\"aria-expanded\",\"false\");\n    replacement.setAttribute(\"role\",\"button\");\n    replacement.className=\"jd-chrome__link jd-photo-menu-trigger\";\n    replacement.innerHTML=\"<span class=\\\"jd-photo-menu__label\\\">PHOTO</span>\";\n    photo.parentNode.replaceChild(replacement,photo);\n    photo=replacement;\n  }\n  photo=photoTrigger();\n  var motion=chrome.querySelector(\"a[data-jd-route=\\\"/MOTION/thumbs\\\"],a[data-jd-route=\\\"/MOTION\\\"]\");\n  if(photo&&motion&&motion.nextSibling!==photo)chrome.insertBefore(motion,photo);\n  if(photo&&!photo.dataset.jdPhotoMenuBound){\n    photo.dataset.jdPhotoMenuBound=\"1\";\n    photo.addEventListener(\"click\",function(e){\n      e.preventDefault();\n      e.stopPropagation();\n      openPhotoMenu();\n    },true);\n  }\n  updateExpanded();\n}\nfunction updateExpanded(){\n  var trigger=photoTrigger();\n  if(trigger)trigger.setAttribute(\"aria-expanded\",document.body.classList.contains(\"jd-menu-open\")?\"true\":\"false\");\n}\nfunction closePhotoMenu(){\n  document.body.classList.remove(\"jd-menu-open\");\n  var overlay=document.getElementById(\"jd-overlay\");\n  if(overlay){\n    overlay.classList.remove(\"is-on\");\n    overlay.classList.remove(\"has-media\");\n    overlay.style.backgroundImage=\"\";\n    overlay.setAttribute(\"aria-hidden\",\"true\");\n  }\n  updateExpanded();\n}\nfunction bindFallbackClose(){\n  var close=document.querySelector(\"#jd-overlay .jd-overlay__close\");\n  if(close&&!close.dataset.jdPhotoMenuCloseBound){\n    close.dataset.jdPhotoMenuCloseBound=\"1\";\n    close.addEventListener(\"click\",function(e){e.preventDefault();e.stopPropagation();closePhotoMenu();},true);\n  }\n}\nfunction openPhotoMenu(){\n  var overlay=document.getElementById(\"jd-overlay\");\n  if(!overlay)return;\n  bindFallbackClose();\n  document.body.classList.add(\"jd-menu-open\");\n  overlay.classList.add(\"is-on\");\n  overlay.setAttribute(\"aria-hidden\",\"false\");\n  rebuildFlatMenu();\n  document.dispatchEvent(new Event(\"menuOpened\"));\n  loadBackgrounds();\n  updateExpanded();\n}\nfunction safeRoute(path){\n  try{if(window.__jdMarkNav)window.__jdMarkNav();}catch(e){}\n  try{if(window.__jdHideHome)window.__jdHideHome();}catch(e){}\n  try{\n    if(window.dx&&dx.address&&typeof dx.address.setValue===\"function\"){\n      dx.address.setValue(path);\n      return;\n    }\n  }catch(e){}\n  window.location.href=path;\n}\nfunction firstImageFor(key,sections,media){\n  var section=sections&&sections[key];\n  if(!section)return \"\";\n  var ids=[].concat(section.mediaItems||[],section.media||[]);\n  for(var i=0;i<ids.length;i++){\n    if(Number(ids[i])<=9999)continue;\n    var row=media&&media[String(ids[i])];\n    if(!row||String(row.type||\"image\")!==\"image\")continue;\n    var file=String(row.content||\"\").replace(/^\\/+/,\"\");\n    if(file)return \"/pf-media/\"+encodeURIComponent(\"dxthm1000.\"+file);\n  }\n  return \"\";\n}\nfunction loadBackgrounds(){\n  if(dataPromise)return dataPromise;\n  dataPromise=Promise.all([\n    fetch(\"/pf-data/sections.json\",{cache:\"no-store\"}).then(function(r){return r.json();}),\n    fetch(\"/pf-data/media.json\",{cache:\"no-store\"}).then(function(r){return r.json();})\n  ]).then(function(pair){\n    var sections=pair[0]||{},media=pair[1]||{};\n    ITEMS.forEach(function(item){\n      var src=firstImageFor(item.key,sections,media);\n      if(src)backgrounds[item.key]=src;\n    });\n    return backgrounds;\n  }).catch(function(){return backgrounds;});\n  return dataPromise;\n}\nfunction showItemBackground(item){\n  var overlay=document.getElementById(\"jd-overlay\");\n  if(!overlay)return;\n  var video=overlay.querySelector(\"#jd-overlay-video\");\n  if(video){try{video.pause();}catch(e){}}\n  overlay.classList.remove(\"has-video\");\n  overlay.classList.add(\"is-on\");\n  var src=backgrounds[item.key]||\"\";\n  if(src){\n    overlay.style.backgroundImage='url(\"'+src.replace(/\"/g,\"%22\")+'\")';\n    overlay.classList.add(\"has-media\");\n  }else{\n    overlay.style.backgroundImage=\"none\";\n    overlay.classList.remove(\"has-media\");\n  }\n}\nfunction makeFlatItem(item){\n  var a=document.createElement(\"a\");\n  a.className=\"jd-overlay__item jd-overlay__item--parent jd-photo-flat-item\";\n  a.href=item.path;\n  a.dataset.jdKey=item.key;\n  a.setAttribute(\"data-jd-flat-item\",\"1\");\n  a.innerHTML=\"<span class=\\\"jd-overlay__bar\\\"></span><span class=\\\"jd-overlay__txt\\\"></span>\";\n  a.querySelector(\".jd-overlay__txt\").textContent=item.label;\n  a.addEventListener(\"mouseenter\",function(){\n    document.querySelectorAll(\".jd-photo-flat-item\").forEach(function(el){el.classList.remove(\"is-active\");});\n    a.classList.add(\"is-active\");\n    showItemBackground(item);\n  });\n  a.addEventListener(\"focus\",function(){showItemBackground(item);});\n  a.addEventListener(\"click\",function(e){\n    e.preventDefault();\n    e.stopPropagation();\n    safeRoute(item.path);\n    setTimeout(closePhotoMenu,90);\n  });\n  return a;\n}\nfunction rebuildFlatMenu(){\n  if(rebuilding||!document.body.classList.contains(\"jd-menu-open\"))return;\n  var overlay=document.getElementById(\"jd-overlay\");\n  var parents=overlay&&overlay.querySelector(\".jd-overlay__parents\");\n  if(!parents)return;\n  if(parents.querySelector(\"[data-jd-flat-item=\\\"1\\\"]\"))return;\n  rebuilding=true;\n  overlay.classList.add(\"jd-photo-flat-menu\");\n  parents.innerHTML=\"\";\n  ITEMS.forEach(function(item){parents.appendChild(makeFlatItem(item));});\n  var kids=overlay.querySelector(\".jd-overlay__kids\");\n  if(kids){kids.innerHTML=\"\";kids.setAttribute(\"aria-hidden\",\"true\");}\n  rebuilding=false;\n  loadBackgrounds();\n}\nfunction watchOverlay(){\n  var overlay=document.getElementById(\"jd-overlay\");\n  var parents=overlay&&overlay.querySelector(\".jd-overlay__parents\");\n  if(!parents){setTimeout(watchOverlay,80);return;}\n  if(parentObserver)parentObserver.disconnect();\n  parentObserver=new MutationObserver(function(){\n    if(!document.body.classList.contains(\"jd-menu-open\"))return;\n    if(!parents.querySelector(\"[data-jd-flat-item=\\\"1\\\"]\"))setTimeout(rebuildFlatMenu,0);\n  });\n  parentObserver.observe(parents,{childList:true});\n  [0,80,180,360,700,1200].forEach(function(ms){setTimeout(rebuildFlatMenu,ms);});\n}\nfunction boot(){\n  installPhotoTrigger();\n  [160,400,900,1800,3000].forEach(function(ms){setTimeout(installPhotoTrigger,ms);});\n  try{\n    new MutationObserver(function(){installPhotoTrigger();}).observe(document.body,{childList:true,subtree:true});\n  }catch(e){}\n  document.addEventListener(\"menuOpened\",function(){updateExpanded();watchOverlay();loadBackgrounds();});\n  document.addEventListener(\"menuClosed\",updateExpanded);\n}\nif(document.readyState===\"loading\")document.addEventListener(\"DOMContentLoaded\",boot);else boot();\n})();\n"
}