diff --git a/.env b/.env deleted file mode 100644 index 54bd8539..00000000 --- a/.env +++ /dev/null @@ -1,3 +0,0 @@ -VITE_SHOPIFY_API_VERSION=2025-01 # Update this as needed once any breaking changes are resolved -VITE_SHOPIFY_STORE_URL=comma-dev.myshopify.com # e.g. store.myshopify.com (without protocol) -VITE_SHOPIFY_STOREFRONT_API_TOKEN=ee9baaeb9964250671e3abe92cef70e6 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..eec827ec --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# vendored third-party builds: collapse in PR diffs +assets/js/vendor/** linguist-generated=true linguist-vendored=true diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index c6e92182..dde3c28b 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -16,42 +16,30 @@ permissions: contents: read pull-requests: write -jobs: - test: - name: Run tests - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - - - run: bun install --frozen-lockfile +env: + HUGO_VERSION: 0.147.8 +jobs: build: name: Build site runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: oven-sh/setup-bun@v2 - - run: bun install --frozen-lockfile - - - name: Cache imagetools directory - uses: actions/cache@v4 - with: - path: ./node_modules/.cache/imagetools - key: imagetools-${{ hashFiles('**/*.png', '**/*.jpg', '**/*.jpeg', '**/*.gif') }} - restore-keys: | - imagetools- + - name: Install Hugo + run: | + curl -sL "https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz" | tar xz hugo + sudo mv hugo /usr/local/bin/hugo - if: github.event_name != 'pull_request' && github.ref == 'refs/heads/master' name: Build (production) - run: bun run build + run: hugo --gc --cleanDestinationDir env: - VITE_SHOPIFY_STOREFRONT_API_TOKEN: ${{ secrets.VITE_SHOPIFY_STOREFRONT_API_TOKEN }} + HUGO_PARAMS_SHOPIFY_STOREFRONTAPITOKEN: ${{ secrets.VITE_SHOPIFY_STOREFRONT_API_TOKEN }} - if: github.event_name == 'pull_request' || github.ref != 'refs/heads/master' name: Build (development) - run: bun run build + run: hugo --gc --cleanDestinationDir - name: Upload built project uses: actions/upload-artifact@v4 diff --git a/.github/workflows/compatibility.yaml b/.github/workflows/compatibility.yaml index c8a1543d..97cd4ed5 100644 --- a/.github/workflows/compatibility.yaml +++ b/.github/workflows/compatibility.yaml @@ -28,7 +28,7 @@ jobs: run: | CHANGED_FILES="$(git diff --name-only)" echo "$CHANGED_FILES" - if [ "$(echo "$CHANGED_FILES" | wc -l)" -eq 1 ] && grep -qx 'src/lib/compatibility-meta.json' <<< "$CHANGED_FILES"; then + if [ "$(echo "$CHANGED_FILES" | wc -l)" -eq 1 ] && grep -qx 'data/compatibility_meta.json' <<< "$CHANGED_FILES"; then echo "skip_pr=true" >> "$GITHUB_OUTPUT" fi - name: Create Pull Request diff --git a/.github/workflows/spellcheck.yaml b/.github/workflows/spellcheck.yaml index d738c42c..fed1eb49 100644 --- a/.github/workflows/spellcheck.yaml +++ b/.github/workflows/spellcheck.yaml @@ -14,4 +14,5 @@ jobs: - uses: codespell-project/actions-codespell@bcf481f4d5cce7b92b65f05aebe8f552d4f1442c with: ignore_words_list: hda,som,tge - path: src + path: layouts content data assets/js scripts + skip: '*/vendor/*' diff --git a/.gitignore b/.gitignore index 91b75008..388031b7 100644 --- a/.gitignore +++ b/.gitignore @@ -8,9 +8,9 @@ node_modules !.vscode/extensions.json # Output -.output -/.svelte-kit /build +/resources +.hugo_build.lock .firebase firebase-debug.log @@ -18,10 +18,3 @@ firebase-debug.log .DS_Store Thumbs.db -# Env -.env.local -.env.production - -# Vite -vite.config.js.timestamp-* -vite.config.ts.timestamp-* diff --git a/.npmrc b/.npmrc deleted file mode 100644 index b6f27f13..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -engine-strict=true diff --git a/.vscode/extensions.json b/.vscode/extensions.json index b869ef8e..ae45d486 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,5 @@ { "recommendations": [ - "svelte.svelte-vscode" + "budparr.language-hugo-vscode" ] } diff --git a/README.md b/README.md index ca3dd20d..fa70842f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # https://comma.ai -Built on [Svelte 4](https://svelte.dev). +Built with [Hugo](https://gohugo.io) (extended edition) — no JS framework, no node build step. ## Develop @@ -10,15 +10,27 @@ Built on [Svelte 4](https://svelte.dev). Other commands to know: ```bash -# install dependencies -bun install +# start dev server (http://localhost:1313) +hugo server -# start dev server -bun run dev - -# production build -bun run build +# production build (flat .html files into build/, served by firebase cleanUrls) +hugo --gc --cleanDestinationDir firebase serve # or `bun run preview` without firebase login ``` use `./encode.sh ` to update the hero video + +## Layout + +- `content/` — every page lives here as ONE file: front matter (title, `js:` bundle, head extras) + the full page markup inside `{{< body.inline >}}`. Exception: the 17 `/shop` product pages are front-matter-only stubs stamped from `data/products.json` by the shared `layouts/shop/single.html` template. +- `layouts/` — the shell (`baseof`, header/footer/cart partials, the shared product template); page markup does NOT live here +- `assets/js/` — vanilla JS; `main.js` is the global shell (cart, menus), `pages/.js` are per-page entries (each starts with `import '../main.js'`), bundled by Hugo's esbuild +- `assets/css/site.css` — the stylesheet (scoped class names `svelte-*` are kept from the old build; HTML and CSS must agree on them) +- `data/` — products, vehicles (regenerated nightly by the compatibility workflow), harnesses, faq +- `static/img/` — images; each jpg/jpeg/png/gif has committed `.avif`/`.webp` siblings rendered by `partials/picture.html`. After adding images, run `bun install && bun run images` (uses sharp) and commit the variants. + +Shopify Storefront credentials live in `hugo.toml` under `params.shopify` (dev store). +Production overrides via env: `HUGO_PARAMS_SHOPIFY_STOREFRONTAPITOKEN` (set in CI). +The build fetches the blog feed (header menu, /openpilot) and Shopify product data +(/shop/*) at build time and fails hard if either is unreachable — same behavior as +the old SvelteKit prerender. diff --git a/assets/css/site.css b/assets/css/site.css new file mode 100644 index 00000000..4184e9da --- /dev/null +++ b/assets/css/site.css @@ -0,0 +1,52 @@ +/*! ==== 0.CBMiBSJ6.css :: +layout chunk: space.css + app.css globals, fontsource Inter/JetBrains Mono @font-face, MonumentExtended @font-face, +layout.svelte(navbar/footer), HeaderBanner, HeaderMenu, ShoppingCart, SteppableInput, SocialIcons ==== */ +.mt-1{margin-top:1rem}.mt-2{margin-top:2rem}.mt-3{margin-top:3rem}.mt-4{margin-top:4rem}.mt-5{margin-top:5rem}.mt-6{margin-top:6rem}.mt-7{margin-top:7rem}.mt-8{margin-top:8rem}.mb-1{margin-bottom:1rem}.mb-2{margin-bottom:2rem}.mb-3{margin-bottom:3rem}.mb-4{margin-bottom:4rem}.mb-5{margin-bottom:5rem}.mb-6{margin-bottom:6rem}.mb-7{margin-bottom:7rem}.mb-8{margin-bottom:8rem}@media (max-width: 768px){.sm-mt-1{margin-top:1rem!important}.sm-mt-2{margin-top:2rem!important}.sm-mt-3{margin-top:3rem!important}.sm-mt-4{margin-top:4rem!important}.sm-mt-5{margin-top:5rem!important}.sm-mt-6{margin-top:6rem!important}.sm-mt-7{margin-top:7rem!important}.sm-mt-8{margin-top:8rem!important}.sm-mb-1{margin-bottom:1rem!important}.sm-mb-2{margin-bottom:2rem!important}.sm-mb-3{margin-bottom:3rem!important}.sm-mb-4{margin-bottom:4rem!important}.sm-mb-5{margin-bottom:5rem!important}.sm-mb-6{margin-bottom:6rem!important}.sm-mb-7{margin-bottom:7rem!important}.sm-mb-8{margin-bottom:8rem!important}}html{scroll-padding-top:6rem}body>div{display:flex;flex-direction:column;min-height:100vh}body>div>main{flex:1;display:flex;flex-direction:column}body{color:#000;font-family:Inter,sans-serif;font-size:16px;font-weight:400;line-height:1.4;letter-spacing:-.04em;margin:0;min-height:100%;background-color:#fff;overflow-x:hidden;-webkit-tap-highlight-color:transparent;touch-action:manipulation}::selection{background-color:#51ff0080;color:var(--color-black)}::-moz-selection{background-color:#51ff0080;color:var(--color-black)}.dark ::selection{background-color:#51ff00cc;color:var(--color-black)}.dark ::-moz-selection{background-color:#51ff00cc;color:var(--color-black)}:root{--color-white: #fff;--color-black: #000;--color-red: #ff4133;--color-foreground: white;--color-background: black;--color-accent: #51ff00;--color-accent-hover: #51b124;--color-card-background: #f8f9fa;--color-card-background-hover: #e8eaec}:root h1,:root h2,:root h3,:root h4,:root h5,:root h6,:root span,:root a,:root li{color:var(--color-foreground)}:root h1.muted,:root h2.muted,:root h3.muted,:root h4.muted,:root h5.muted,:root h6.muted,:root span.muted,:root a.muted,:root li.muted{color:var(--color-muted)}:root h1.highlight,:root h2.highlight,:root h3.highlight,:root h4.highlight,:root h5.highlight,:root h6.highlight,:root span.highlight,:root a.highlight,:root li.highlight{display:inline-block;border-bottom:4px solid var(--color-accent);background-image:linear-gradient(145deg,#51ff0000,#51ff0066);transition:background-color .2s}@media (hover: hover) and (pointer: fine){:root h1.highlight:hover,:root h2.highlight:hover,:root h3.highlight:hover,:root h4.highlight:hover,:root h5.highlight:hover,:root h6.highlight:hover,:root span.highlight:hover,:root a.highlight:hover,:root li.highlight:hover{background-color:#51ff0040}}:root h1.highlight:active,:root h2.highlight:active,:root h3.highlight:active,:root h4.highlight:active,:root h5.highlight:active,:root h6.highlight:active,:root span.highlight:active,:root a.highlight:active,:root li.highlight:active{background-color:#51ff0040}:root h1.highlight.muted,:root h2.highlight.muted,:root h3.highlight.muted,:root h4.highlight.muted,:root h5.highlight.muted,:root h6.highlight.muted,:root span.highlight.muted,:root a.highlight.muted,:root li.highlight.muted{color:var(--color-foreground);border-bottom-color:var(--color-foreground);background-image:linear-gradient(145deg,#51ff0000,#aaa6)}.dark{--color-foreground: white;--color-background: black;--color-muted: #9e9e9e}.light{--color-foreground: black;--color-background: white;--color-muted: #00000080}h1{font-size:4rem;font-weight:600;margin-top:0;margin-bottom:2rem;line-height:1}h2{font-size:3rem;font-weight:400;margin-top:0;margin-bottom:2rem;line-height:1}h3{font-size:2rem;font-weight:400;margin-top:2rem;margin-bottom:0;line-height:1}h4{font-size:1.5rem;font-weight:400;margin-top:0;margin-bottom:2rem;line-height:1.2}li{font-size:1.5rem;font-weight:400;line-height:1.25}@media (max-width: 1024px){h1{font-size:3rem}h2{font-size:2.5rem}h3{font-size:1.75rem}h4{font-size:1.25rem}}@media (max-width: 768px){h1{font-size:2.3rem;margin-bottom:1rem}h2{font-size:1.75rem;margin-bottom:1rem}h3{font-size:1.5rem;margin-bottom:1rem}h4{font-size:1.25rem;margin-bottom:1rem}}a,a:visited,a:active{color:inherit;text-decoration:none}blockquote{font-size:1.2rem;font-style:italic;line-height:1.4;border-left:2px solid #000;padding:1.2rem 2rem;margin:1rem 0}section{padding-top:2rem;padding-bottom:5rem;background-color:var(--color-background)}section .container{width:85%;max-width:90rem;margin-left:auto;margin-right:auto}section.light+section.light,section.dark+section.dark{padding-top:1rem;padding-bottom:1rem}img{max-width:100%}hr{border:none;height:1px;color:#333;background-color:#333}button,select{color:#000;font-family:Inter,sans-serif}@media only screen and (max-width: 1024px){.mobile-first{order:-1}}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-cyrillic-ext-400-normal.woff2) format("woff2"),url(/fonts/inter-cyrillic-ext-400-normal.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-cyrillic-400-normal.woff2) format("woff2"),url(/fonts/inter-cyrillic-400-normal.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-greek-ext-400-normal.woff2) format("woff2"),url(/fonts/inter-greek-ext-400-normal.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-greek-400-normal.woff2) format("woff2"),url(/fonts/inter-greek-400-normal.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-vietnamese-400-normal.woff2) format("woff2"),url(/fonts/inter-vietnamese-400-normal.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-latin-ext-400-normal.woff2) format("woff2"),url(/fonts/inter-latin-ext-400-normal.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/inter-latin-400-normal.woff2) format("woff2"),url(/fonts/inter-latin-400-normal.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-cyrillic-ext-600-normal.woff2) format("woff2"),url(/fonts/inter-cyrillic-ext-600-normal.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-cyrillic-600-normal.woff2) format("woff2"),url(/fonts/inter-cyrillic-600-normal.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-greek-ext-600-normal.woff2) format("woff2"),url(/fonts/inter-greek-ext-600-normal.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-greek-600-normal.woff2) format("woff2"),url(/fonts/inter-greek-600-normal.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-vietnamese-600-normal.woff2) format("woff2"),url(/fonts/inter-vietnamese-600-normal.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-latin-ext-600-normal.woff2) format("woff2"),url(/fonts/inter-latin-ext-600-normal.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:600;src:url(/fonts/inter-latin-600-normal.woff2) format("woff2"),url(/fonts/inter-latin-600-normal.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/fonts/inter-cyrillic-ext-700-normal.woff2) format("woff2"),url(/fonts/inter-cyrillic-ext-700-normal.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/fonts/inter-cyrillic-700-normal.woff2) format("woff2"),url(/fonts/inter-cyrillic-700-normal.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/fonts/inter-greek-ext-700-normal.woff2) format("woff2"),url(/fonts/inter-greek-ext-700-normal.woff) format("woff");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/fonts/inter-greek-700-normal.woff2) format("woff2"),url(/fonts/inter-greek-700-normal.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/fonts/inter-vietnamese-700-normal.woff2) format("woff2"),url(/fonts/inter-vietnamese-700-normal.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/fonts/inter-latin-ext-700-normal.woff2) format("woff2"),url(/fonts/inter-latin-ext-700-normal.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-display:swap;font-weight:700;src:url(/fonts/inter-latin-700-normal.woff2) format("woff2"),url(/fonts/inter-latin-700-normal.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,d09GMgABAAAAAARsABAAAAAACMwAAAQRAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGhwbHhwoBmA/U1RBVF4AXBEICoRkg3oLGgABNgIkAy4EIAWFAAeBAwwHGy8HyI7Cca8UYSlFWGJzMUTEQ/1+r2f33Q+oAgAFVkiO0LMiG92pzNTWmEogIUHV6LrA3+vU9yUZFWCUyyYpAGzHxMo5cgl5YpzSCUM8NWtp6sXT3zttbOqD96hLoIAijvawNWhs2hMogzEXBdQFssAy6shdkO6VPDXsvEGgCwihJoRAvaBtQgx0vqymBYQK7HoBasgsSYO9G/Rcy7nAD9pML9mFjgKPfId1ALiW9o7HQAUNkLR49NmAP3T1LIDvcKYsVP8XB0G1hXJmAH2cGQG5lOOYwRNCU2IAjgXYW7OFQ8CTV1oH8oewJAxfJWQEAAQqZBDoKEB+BpBwZjwGiJ8gUY0sCREiXJZ0Z5xVnPERYcR9YmHXCwDxHvHzot3vXmY3QADqmqhp5Ikhdr38OX/dCICxm8BvYCH0UMn7GeAIgauF0qTguFDk7y8SBckPFlz8SJ4vofPlGew+ZC+pEreJW7rJtuvDYZuDCR28i+w8dyn0zJXobrID0+4fRvi2EfLAEOTG4GDbgRGExLDxt4tE24bF+weByZRhiC0zZSqYNu2tUI+nPHcOqi9cGNO3BzbcIVs2dDMjcutbRfQlWX6wa/zmuKowR6r0Zq/KAerL2Lo3Y935H6eCJozvi+Wz3sDWmBhZuQjZkIkB1dHsF9/Dh+dfHMpWgeBA2S0d26erjNSsTjymkqHUKoquk8qL6V2/dtGKYkXHL46WF0mlnIhu2YRWU5SaOcVQqqwJTaskkh76NC1pj5MoYYpm6X/SaWWx8u+fZCVQSVdpS8Li4yefUh+ucay5uzkR4ODLF2bO0Y0d8wl8z2VZD2hdByDoV+rl9nqmPN2bkemffokxXwJsCUJde4rDdejqUOJFLY4CDoFcqp6l8OTYoznu+G5NxvTaNI+Vmn8L13v9Zf+FOP4T/n2/fT61j3/9JbmdaGm/7qAuQXAZlHm3BrezpAbEs3eyA7rCYipEJ8O75LL0p4A/8B5C1wLcNHwkWdbAP8RGEQGfI68EYSKCQOoHASrHDYBij4ugZsx2ULemg9R3TBIFAl1DgIB+EMAfutr3CiDGdSwnLZdKHC0HK712RlZmFlzYlNOn3yr58qV2PTcrJuJEKE//czjkYbmZ5atXpkYVI04RNy0rl361WC6sXE2MzDwctNzaGLn1s9Z9KwElD6VQYX9FgkorQdCjrkhVKSKdPRVkP2NiMVafddwnw16rpCDUJGjB4MYc1rxJAzeWjZEeJwHDc8JalrtVTRlOW2dmrf2eh04ePZZT/gzV5u/XlgnjMbprRAHhpi4WfEYYHA8cEYiH+EiAhEjEZ3T/A4gSeFzWgiVMaUooXcGC6LL3V/LMWqdT66fVezjj9znYL+kQ+zB0koJlTuAL5N31gDgEAA==) format("woff2"),url(data:font/woff;base64,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) format("woff");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/jetbrains-mono-cyrillic-400-normal.woff2) format("woff2"),url(/fonts/jetbrains-mono-cyrillic-400-normal.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/jetbrains-mono-greek-400-normal.woff2) format("woff2"),url(/fonts/jetbrains-mono-greek-400-normal.woff) format("woff");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2"),url(/fonts/jetbrains-mono-vietnamese-400-normal.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/jetbrains-mono-latin-ext-400-normal.woff2) format("woff2"),url(/fonts/jetbrains-mono-latin-ext-400-normal.woff) format("woff");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:JetBrains Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/fonts/jetbrains-mono-latin-400-normal.woff2) format("woff2"),url(/fonts/jetbrains-mono-latin-400-normal.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}.social-icons.svelte-y50ryu{display:flex;flex-flow:row;align-items:center;justify-content:start;gap:1rem}.social-icons.svelte-y50ryu svg{width:var(--size);height:var(--size)}@media (hover: hover) and (pointer: fine){.social-icons.svelte-y50ryu svg:hover{color:var(--color-accent)}}.social-icons.svelte-y50ryu svg:active{color:var(--color-accent)}.banner.svelte-13beqlz{color:#000;position:relative;z-index:1;background-color:var(--color-card-background-hover)}.wrapper.svelte-13beqlz{padding:1rem 0;margin-left:auto;margin-right:auto;width:85%;max-width:90rem;font-size:.875rem;line-height:1.2;text-align:center;display:flex;flex-direction:column;grid-row-gap:.5rem}.headline.svelte-13beqlz{font-family:Inter,sans-serif;font-size:1.25rem;font-weight:400;margin:0 .5rem}.cta.svelte-13beqlz{color:inherit;font-weight:700;text-decoration:underline;text-underline-offset:.15em}.cta.svelte-13beqlz:hover,.cta.svelte-13beqlz:focus-visible{text-decoration-thickness:2px}.toggle-button.svelte-1u2audz.svelte-1u2audz{display:block;border:none;border-right:1px solid #000;background-color:transparent;height:65px;width:90px;padding:0;text-align:center;cursor:pointer;transition:background-color .2s}@media (hover: hover) and (pointer: fine){.toggle-button.svelte-1u2audz.svelte-1u2audz:hover{background-color:var(--color-accent)}}.toggle-button.svelte-1u2audz.svelte-1u2audz svg{margin:auto;display:block;height:100%}.menu-container.svelte-1u2audz.svelte-1u2audz{position:absolute;left:0;right:0;display:flex;padding:0 3rem;z-index:2;background-color:#000;border-bottom:1px solid rgba(255,255,255,.25);color:#fff;display:none}@media (hover: hover) and (pointer: fine){.menu-container.svelte-1u2audz.svelte-1u2audz a:hover{color:var(--color-accent)}}.menu-container.svelte-1u2audz.svelte-1u2audz a:active{color:var(--color-accent)}nav.svelte-1u2audz.svelte-1u2audz:focus-within .toggle-button{background-color:#000;color:#fff;transition:background-color .25s,color .25s;cursor:pointer;pointer-events:none}nav.svelte-1u2audz.svelte-1u2audz:focus-within .toggle-button svg{fill:#fff}nav.svelte-1u2audz.svelte-1u2audz:focus-within .menu-container{opacity:1;display:flex}nav.svelte-1u2audz.svelte-1u2audz:focus-within .menu-container a{opacity:1}.section-links.svelte-1u2audz.svelte-1u2audz{flex:1;justify-content:flex-start;display:flex;flex-flow:column;width:62%;padding:4rem 0}.section-links.svelte-1u2audz.svelte-1u2audz a{color:#fff;margin-bottom:2rem;padding:0;font-size:2.5rem;line-height:.9;text-decoration:none}.news-feed.svelte-1u2audz.svelte-1u2audz{display:flex;flex-direction:column;justify-content:space-between;width:32%;border-left:1px solid rgba(255,255,255,.25);padding:4rem 0 4rem 4rem}.news-feed.svelte-1u2audz.svelte-1u2audz .title{color:#ffffff73;letter-spacing:1px;text-transform:uppercase;margin-bottom:1rem;font-size:.875rem}.news-feed.svelte-1u2audz.svelte-1u2audz .entry{margin-top:1rem;margin-bottom:2rem}.news-feed.svelte-1u2audz.svelte-1u2audz .entry a{font-size:1.5rem;text-decoration:none}.news-feed.svelte-1u2audz.svelte-1u2audz .entry div{color:#ffffffa6;font-size:.875rem}@media only screen and (max-width: 768px){.menu-container.svelte-1u2audz.svelte-1u2audz{flex-flow:column nowrap;row-gap:1.75rem;justify-content:flex-start}.section-links.svelte-1u2audz.svelte-1u2audz{width:100%;padding:2.5rem 0 0;flex:unset}.section-links.svelte-1u2audz a.svelte-1u2audz{font-size:1.5rem}.news-feed.svelte-1u2audz.svelte-1u2audz{display:none}}div.svelte-1m6ox4m{display:flex;height:35px}input.svelte-1m6ox4m{width:45px;text-align:center;border:none;border-top:1px solid #000;border-bottom:1px solid #000;font-size:1rem;border-radius:0}input.svelte-1m6ox4m[type=number],input.svelte-1m6ox4m::-webkit-outer-spin-button,input.svelte-1m6ox4m::-webkit-inner-spin-button{appearance:none;-webkit-appearance:none;-moz-appearance:textfield;margin:0}button.svelte-1m6ox4m{width:2rem;padding:0;border:1px solid #000;background-color:transparent;color:#000;font-size:1rem;font-weight:700;text-align:center;cursor:pointer}.overlay.svelte-10ouxai{position:fixed;top:0;left:0;bottom:0;right:0;z-index:10}.sidemenu.svelte-10ouxai{display:flex;flex-direction:column;position:fixed;right:0;top:6rem;bottom:2rem;width:340px;background-color:#fff;box-shadow:-5px 0 5px #0000001a;z-index:11;border-radius:.5rem 0 0 .5rem}@media screen and (max-width: 1300px){.sidemenu.svelte-10ouxai{top:9rem}}.header.svelte-10ouxai{display:flex;align-items:center;justify-content:space-between;padding:1rem 1.5rem 1rem 1rem}.header.svelte-10ouxai span{font-size:1.25rem;color:#000}.header.svelte-10ouxai button{background-color:transparent;border:none;cursor:pointer;font-size:2rem}.inventory.svelte-10ouxai{flex-grow:1;overflow-y:auto;padding:1rem}.inventory.svelte-10ouxai .empty{text-align:center}.inventory.svelte-10ouxai .item{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem;flex:1}.inventory.svelte-10ouxai .item img{width:65px;height:auto}.inventory.svelte-10ouxai .item .details{flex:1;margin:0 .75rem}.inventory.svelte-10ouxai .item .details .title{font-size:1rem;font-weight:700}.inventory.svelte-10ouxai .item .details .variant{font-size:.875rem;opacity:.8}.footer.svelte-10ouxai{padding:1rem;display:flex;flex-flow:column;gap:1rem}.footer.svelte-10ouxai .price{display:flex;justify-content:space-between;font-size:.875rem;text-transform:uppercase}.footer.svelte-10ouxai .price span{color:#000}.footer.svelte-10ouxai .price s{margin-right:.25rem}.footer.svelte-10ouxai .disclaimer{font-size:.75rem;text-align:center}@font-face{font-display:block;font-family:Monument Extended Black;font-style:normal;src:url(/fonts/MonumentExtended-Black.woff2)}.navbar.svelte-uhk6nj{top:0;position:sticky;left:0;right:0;bottom:0;width:100%;z-index:10;background-color:#f5f5f5bf;border-bottom:1px solid #000;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.navbar-container.svelte-uhk6nj{display:flex;align-items:stretch;justify-content:space-between}.navbar-section-logo.svelte-uhk6nj{flex-direction:row-reverse;align-items:center;display:flex;border-right:1px solid #000}.navbar-section-logo.svelte-uhk6nj>.title{font-family:Monument Extended Black,sans-serif;font-size:20px;color:#000;height:20px;text-transform:uppercase;padding:0 2rem}@media only screen and (max-width: 1280px){.navbar-section-logo.svelte-uhk6nj{border-right:none}}@media only screen and (max-width: 768px){.navbar-section-logo.svelte-uhk6nj{flex:1}.navbar-section-logo.svelte-uhk6nj>.title{display:flex;flex:1;justify-content:center}}@media only screen and (max-width: 375px){.navbar-section-logo.svelte-uhk6nj>.title{padding:0 .25rem}}.navbar-section-links.svelte-uhk6nj{display:flex;flex:1;align-items:center;justify-content:center}.navbar-section-links.svelte-uhk6nj a{color:#000;margin:0 1.75rem;font-family:Inter,sans-serif;font-size:1.125rem;transition:text-shadow .2s}.navbar-section-links.svelte-uhk6nj a.active{text-shadow:0 0 8px rgba(81,255,0,.8),0 0 12px rgba(81,255,0,.5)}@media only screen and (max-width: 1280px){.navbar-section-links.svelte-uhk6nj{display:none}}.navbar-section-buttons.svelte-uhk6nj{display:flex}.navbar-section-buttons.svelte-uhk6nj .cart,.navbar-section-buttons.svelte-uhk6nj .shop{border:none}.navbar-section-buttons.svelte-uhk6nj .cart svg,.navbar-section-buttons.svelte-uhk6nj .shop svg{margin-right:.5rem}.navbar-section-buttons.svelte-uhk6nj .button{color:#000;text-transform:uppercase;font-family:Inter,sans-serif;border-left:1px solid #000;padding-left:56px;padding-right:56px;font-size:1rem;font-weight:700;letter-spacing:1px;display:flex;align-items:center;cursor:pointer;background-color:var(--color-accent)}@media (hover: hover) and (pointer: fine){.navbar-section-buttons.svelte-uhk6nj .button:hover{background-color:var(--color-accent-hover)}}.navbar-section-buttons.svelte-uhk6nj .button:active{background-color:var(--color-accent-hover)}@media only screen and (max-width: 768px){.navbar-section-buttons.svelte-uhk6nj.navbar-section-buttons>:first-child:not(:only-child){display:none}.navbar-section-buttons.svelte-uhk6nj .cart .cart-text{display:none}.navbar-section-buttons.svelte-uhk6nj .cart{padding-left:25px;padding-right:25px}.navbar-section-buttons.svelte-uhk6nj .shop{padding-left:10px;padding-right:10px}}footer.svelte-uhk6nj{color:#fff;background-color:#000;padding:6rem 6rem 1.25rem}@media screen and (max-width: 1024px){footer.svelte-uhk6nj{padding:2rem}footer.svelte-uhk6nj .footer-links{margin-bottom:1rem}}footer.svelte-uhk6nj .container{max-width:1440px;margin-left:auto;margin-right:auto}footer.svelte-uhk6nj .footer-links{display:flex;flex-direction:column;align-items:flex-start;gap:.75rem}footer.svelte-uhk6nj .footer-links strong{color:#fff;opacity:.65;letter-spacing:1px;text-transform:uppercase;font-size:1rem;font-weight:600}footer.svelte-uhk6nj .footer-links a{color:#fff;font-size:1.25rem;transition:opacity .2s}@media (hover: hover) and (pointer: fine){footer.svelte-uhk6nj .footer-links a:hover{opacity:.65}}footer.svelte-uhk6nj .footer-links a:active{opacity:.65}footer.svelte-uhk6nj .footer-links .badged{display:flex;align-items:center;transition:opacity .2s}footer.svelte-uhk6nj .footer-links .badged span{margin-right:.75rem}footer.svelte-uhk6nj .footer-links .badged div{padding:.25rem .4rem;text-wrap:nowrap;margin:0}footer.svelte-uhk6nj .footer-links .tagline{display:flex}footer.svelte-uhk6nj .footer-links .tagline svg{width:16px;height:28px;margin-right:.75rem;color:#fff}footer.svelte-uhk6nj .footer-links .tagline span{font-size:1.2rem;font-weight:400}footer.svelte-uhk6nj .mailing-list{margin-top:2rem;width:100%;color:#fff}@media only screen and (max-width: 1024px) and (min-width: 512px){footer.svelte-uhk6nj .mailing-list{width:unset}}footer.svelte-uhk6nj .copyright{display:flex;justify-content:space-between;align-items:center;font-size:.875rem;margin-top:4rem;opacity:.65;padding-top:20px;border-top:1px solid rgba(255,255,255,.25)} +/*! ==== Badge.Db9ZKe7r.css :: Badge.svelte (svelte-57k9f5) ==== */ +div.svelte-57k9f5{font-family:JetBrains Mono,monospace;font-size:.875rem;text-transform:uppercase;width:fit-content;padding:.5rem;margin-bottom:.5rem}.dark.svelte-57k9f5{background-color:#232323;color:#fff}.light.svelte-57k9f5{background-color:#fff;color:#000}.accent.svelte-57k9f5{background-color:var(--color-accent);color:var(--color-background)} +/*! ==== Grid.D6EcXAPH.css :: Grid.svelte (svelte-7tyzqm) ==== */ +.grid.svelte-7tyzqm{grid-column-gap:var(--column-gap);grid-row-gap:var(--row-gap);margin-bottom:var(--margin-bottom);grid-template-rows:auto auto;grid-template-columns:var(--template-columns);grid-auto-columns:1fr;display:grid;align-items:var(--align-items)}@media (max-width: 480px){.grid.small.svelte-7tyzqm{grid-template-columns:repeat(var(--wrapped-columns),1fr)}}@media (max-width: 768px){.grid.medium.svelte-7tyzqm{grid-template-columns:repeat(var(--wrapped-columns),1fr)}}@media (max-width: 1024px){.grid.large.svelte-7tyzqm{grid-template-columns:repeat(var(--wrapped-columns),1fr)}.grid.svelte-7tyzqm{grid-template-columns:var(--lg-template-columns);column-gap:var(--lg-column-gap)}} +/*! ==== MailingListForm.CEQr4qc-.css :: MailingListForm.svelte (svelte-q96sfc) ==== */ +form.primary.svelte-q96sfc label{color:#ffffffa6}form.primary.svelte-q96sfc input[type=email]{color:#fff;background-color:transparent;border:1px solid rgba(2555,255,255,.65);height:2rem;font-size:1rem}form.primary.svelte-q96sfc input[type=submit]{color:#fff;background-color:#525252}@media (hover: hover) and (pointer: fine){form.primary.svelte-q96sfc input[type=submit]:hover{background-color:#727171}}form.primary.svelte-q96sfc input[type=submit]:active{background-color:#727171}form.accent.svelte-q96sfc input[type=submit]{color:#000;background-color:var(--color-accent)}label.svelte-q96sfc{display:block;text-transform:uppercase;font-family:Inter,sans-serif;font-size:1rem;font-weight:600;margin-bottom:.25rem;letter-spacing:.5px}input[type=email].svelte-q96sfc{padding:1.4rem 1rem;border:1px solid #000;font-size:.875rem;font-family:Inter,sans-serif;margin-bottom:1rem;width:100%;box-sizing:border-box}input[type=email].svelte-q96sfc:active,input[type=email].svelte-q96sfc:focus,input[type=email].svelte-q96sfc:hover{border-color:#fff!important}input[type=submit].svelte-q96sfc{border:none;text-align:center;text-transform:uppercase;letter-spacing:.5px;justify-content:center;padding:1rem 4rem;font-size:1.125rem;font-weight:600;font-family:Inter,sans-serif;display:flex;cursor:pointer;transition:all .2s;width:100%}input[type=submit].svelte-q96sfc[disabled]{cursor:not-allowed}.success.svelte-q96sfc,.error.svelte-q96sfc{padding:1rem;text-align:center}.success.svelte-q96sfc{background-color:#51ff001a;border:1px solid rgba(81,255,0,.35)}.error.svelte-q96sfc{background-color:#ff00001f;border:1px solid red} +/*! ==== Button.JvjR6oQb.css :: Button.svelte (svelte-1io34pc) ==== */ +button.svelte-1io34pc{background-color:var(--color-accent);border:none;text-align:center;text-transform:uppercase;letter-spacing:.5px;justify-content:center;padding:1.25rem 4rem;font-size:1.125rem;font-weight:600;display:flex;width:fit-content;cursor:pointer;transition:all .2s}@media (hover: hover) and (pointer: fine){button.svelte-1io34pc.primary:hover:not(.disabled){opacity:.75}button.svelte-1io34pc.secondary:hover:not(.disabled){opacity:.8}button.svelte-1io34pc.accent:hover:not(.disabled){background-color:var(--color-accent-hover)}}button.svelte-1io34pc.primary:active:not(.disabled){opacity:.75}button.svelte-1io34pc.secondary:active:not(.disabled){opacity:.8}button.svelte-1io34pc.accent:active:not(.disabled){background-color:var(--color-accent-hover)}.full-width.svelte-1io34pc{width:100%}.primary.svelte-1io34pc{background-color:#000;color:#fff}.secondary.svelte-1io34pc{background-color:#fff;color:#000}.accent.svelte-1io34pc{background-color:var(--color-accent);color:#000}.disabled.svelte-1io34pc{cursor:not-allowed;color:#fff;background-color:var(--color-muted)} +/*! ==== 1.D4XmzJMP.css :: +error.svelte (svelte-177x5sy) - 404 page ==== */ +.page.svelte-177x5sy{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;padding:3rem}h1.svelte-177x5sy{color:#000!important;margin:3rem 0 1rem}span.svelte-177x5sy{color:#000!important;font-size:1.5rem;margin-top:1rem} +/*! ==== 2.CANtpFuV.css :: / home: +page.svelte, SectionHeader, FeaturedCarsList, FeaturedArticles ==== */ +.table.svelte-2ajqwq{mask:linear-gradient(to bottom,rgba(0,0,0,1) 0,rgba(0,0,0,1) 80%,rgba(0,0,0,0) 97%) 100% 50% / 100% 100% repeat-x}.compatibility-item.svelte-2ajqwq{align-items:center;display:flex;font-size:1.125rem}.compatibility-item.svelte-2ajqwq .car-brand-logo{width:3rem;display:inline-block;vertical-align:middle}.compatibility-item.svelte-2ajqwq .car{display:flex;flex-direction:row;flex-wrap:wrap;justify-content:flex-start;flex:1;margin:0 .875rem}.compatibility-item.svelte-2ajqwq .car-identifier{width:12rem;line-height:1.2}@media screen and (max-width: 768px){.compatibility-item.svelte-2ajqwq .car-identifier{width:100%}}.compatibility-item.svelte-2ajqwq .car-year{color:#00000080;line-height:1.2;flex:1}hr.svelte-2ajqwq{margin-top:1rem;margin-bottom:1rem;margin-left:3.875rem}.featured-articles.svelte-yixopr{margin:10rem 0;display:flex;flex-flow:column;align-items:center}@media screen and (max-width: 768px){.featured-articles.svelte-yixopr{margin:6rem 0}}span.svelte-yixopr{opacity:.5;text-align:center;font-size:1.25rem;margin-bottom:2rem;display:block}a.svelte-yixopr{display:flex;background-color:#fff;color:#000!important;border:1px solid #000;justify-content:center;align-items:center;padding:1.25rem;text-decoration:none;max-width:100%;height:40px;transition:background-color .2s}a.svelte-yixopr img{height:45px;display:inline-block;vertical-align:middle;object-fit:contain}a.svelte-yixopr img.greyscale{filter:grayscale(100%) brightness(20%)}@media (hover: hover) and (pointer: fine){a.svelte-yixopr:hover{background-color:var(--color-card-background-hover)}}a.svelte-yixopr:active{background-color:var(--color-card-background-hover)}.wrapper.svelte-1ebayn7{justify-content:space-around;align-items:center;display:flex;margin-bottom:4rem}@media screen and (max-width: 512px){.wrapper.svelte-1ebayn7{margin-bottom:3rem}}.label.svelte-1ebayn7{color:var(--color-foreground);flex:none;font-size:1.25rem;line-height:1}.line.svelte-1ebayn7{background-color:var(--color-foreground);width:100%;height:1px;margin-left:1rem;margin-right:1rem}.hero-image.svelte-ghphk8{position:relative;margin:-66px 0 0;width:100%;height:100vh;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none;background-size:cover;background-position:center;background-repeat:no-repeat}@media screen and (max-width: 768px){.hero-image.svelte-ghphk8.desktop{display:none}}.hero-image.svelte-ghphk8.mobile{height:unset;aspect-ratio:3 / 4}@media screen and (min-width: 769px){.hero-image.svelte-ghphk8.mobile{display:none}}.hero-image.svelte-ghphk8 video{width:100%;height:100%;object-fit:cover;object-position:center;display:block;-webkit-user-select:none;user-select:none;-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none;opacity:0;transition:opacity .3s ease-in}.hero-image.svelte-ghphk8 video.ready{opacity:1}.hero-image.svelte-ghphk8:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none}.hero-image.svelte-ghphk8:after{content:"";position:absolute;bottom:0;left:0;right:0;height:180px;background:linear-gradient(to bottom,transparent,black);z-index:2;pointer-events:none}#hero.svelte-ghphk8 .feature-item{align-items:center;display:flex;color:#fff}#hero.svelte-ghphk8 .feature-item img{border:1px solid #000;width:52px;margin-right:.5rem;padding:.375rem;display:inline-block}#hero.svelte-ghphk8 .feature-item span{color:var(--color-muted);text-transform:uppercase;flex:1;font-family:JetBrains Mono,monospace;font-size:1rem;font-weight:400;line-height:1.25;margin-left:1rem}#hero.svelte-ghphk8 h3{line-height:1.4}@media screen and (max-width: 375px){#hero.svelte-ghphk8 .feature-item span{font-size:.75rem}}#recruit.svelte-ghphk8 .recruiting-card{display:flex;flex-direction:column;align-items:flex-start;padding:1.5rem;border:1px solid #000}#recruit.svelte-ghphk8 .recruiting-card span{display:block}#recruit.svelte-ghphk8 .recruiting-card span:first-child{font-family:JetBrains Mono,monospace;font-size:.875rem;font-weight:400;line-height:1;margin-bottom:.375rem}#recruit.svelte-ghphk8 .recruiting-card span:last-child{font-size:2rem;font-weight:600;line-height:1}@media screen and (max-width: 768px){#recruit.svelte-ghphk8 h4{margin-bottom:2rem}}.device-image-container.svelte-ghphk8{position:relative;display:inline-block;transform:scale(1.1)}.device-image-container.svelte-ghphk8 img{display:block;width:100%;height:auto}.device-image-container.svelte-ghphk8 .screen-video-overlay{position:absolute;left:23.21%;top:63.97%;width:40.21%;height:25.8%;mix-blend-mode:screen;opacity:0;transition:opacity .3s ease-in}.device-image-container.svelte-ghphk8 .screen-video-overlay.ready{opacity:1} +/*! ==== 3.D8pMBWY4.css :: /connect: connect/+page.svelte (svelte-gtmdcg) ==== */ +.banner.svelte-gtmdcg{background-image:linear-gradient(#00000080,#0009),url(/img/vehicles/cover-vehicles-v2-3x-optimized_1.jpg);background-position:50% 38%;background-size:cover;background-attachment:scroll}.banner.svelte-gtmdcg img{width:90%;max-width:1360px;margin:0 auto;padding:5rem 1rem 0;display:block}.icon.svelte-gtmdcg{max-width:65px;min-width:65px;max-height:65px}.icon.svelte-gtmdcg svg,.icon.svelte-gtmdcg img{background-color:#000;color:#fff}.icon.svelte-gtmdcg svg{padding:.5rem}#connect.svelte-gtmdcg h1{font-size:2.5rem;font-weight:600;line-height:1.2;margin-top:1rem}#connect.svelte-gtmdcg p{font-size:1.5rem;text-wrap:balance}#connect.svelte-gtmdcg .header hgroup a{text-transform:uppercase;font-family:JetBrains Mono,monospace}#connect.svelte-gtmdcg .header hgroup a{border-bottom:1px solid #000}#connect.svelte-gtmdcg .features-banner{display:flex;flex-direction:row;justify-content:center;align-items:center;margin:6rem 0;padding:8.25rem 0rem;background-image:radial-gradient(circle,#f8fff5,#ccffb4)}@media screen and (max-width: 768px){#connect.svelte-gtmdcg .features-banner{margin:3rem 0}}#connect.svelte-gtmdcg .badge-prefix{font-family:JetBrains Mono,monospace;text-transform:uppercase;margin-bottom:.5rem;margin-right:.5rem}#connect.svelte-gtmdcg #features-table{padding-top:2rem}@media screen and (max-width: 768px){#connect.svelte-gtmdcg #features-table{padding-top:1rem}}#connect.svelte-gtmdcg #features-table .row{display:flex;padding:1rem 0;border-bottom:1px solid rgba(0,0,0,.25)}@media screen and (max-width: 768px){#connect.svelte-gtmdcg #features-table .row>div:not(:first-child){display:none!important}}#connect.svelte-gtmdcg #features-table .row .title{font-size:1.25rem;font-weight:600;display:flex;width:40%}#connect.svelte-gtmdcg #features-table .row .content{font-weight:600;text-align:center;margin:auto}#connect.svelte-gtmdcg #features-table .row .content.badge{display:flex;align-items:center;justify-content:center}#connect.svelte-gtmdcg #features-table .row .check{color:var(--color-accent-hover)}#connect.svelte-gtmdcg #features-table .row .cross{color:var(--color-red)}#connect.svelte-gtmdcg #features-table .row .feature-overview{display:flex}#connect.svelte-gtmdcg #features-table .row .feature-overview .icon{margin-right:1rem}#connect.svelte-gtmdcg #features-table .row .feature-overview hgroup{display:flex;flex-direction:column;justify-content:center}#connect.svelte-gtmdcg #features-table .row .feature-overview hgroup div{font-size:1.25rem;font-weight:600;line-height:1.25}#connect.svelte-gtmdcg #features-table .row .feature-overview .mobile-badge{display:none}#connect.svelte-gtmdcg #features-table .row .feature-overview .mobile-badge div{display:inline-flex;align-items:center;padding:.25rem .75rem;margin:.5rem 0}#connect.svelte-gtmdcg #features-table .row .feature-overview .mobile-badge div span{margin-right:.5rem}@media screen and (max-width: 768px){#connect.svelte-gtmdcg #features-table .row .feature-overview .mobile-badge{display:initial}}#connect.svelte-gtmdcg #features-table .row>div{flex:1}#price.svelte-gtmdcg h1{margin-top:2rem}#price.svelte-gtmdcg .checkmark-list li{list-style-image:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20height='24px'%20width='24px'%20viewBox='0%200%2024%2024'%20fill='%2351b124'%3e%3cpath%20d='M0%200h24v24H0z'%20fill='none'%3e%3c/path%3e%3cpath%20d='M9%2016.17L4.83%2012l-1.42%201.41L9%2019%2021%207l-1.41-1.41z'%3e%3c/path%3e%3c/svg%3e");margin:1rem 0}#price.svelte-gtmdcg .price-card{display:flex;flex-direction:column;padding:3rem;margin-top:1rem;align-items:center;justify-content:center;color:#fff;border:1px solid #fff}#price.svelte-gtmdcg .price-card span{font-size:2rem;margin-top:1.5rem}#price.svelte-gtmdcg .price-card .muted{opacity:.65;margin-top:.75rem;line-height:1.5;text-align:center}#price.svelte-gtmdcg .centered{display:flex;justify-content:center;margin-top:2rem}#price.svelte-gtmdcg .free-trial{padding:6rem 0 0}@media screen and (max-width: 480px){#price.svelte-gtmdcg .centered a,#price.svelte-gtmdcg .free-trial a{width:100%;box-sizing:border-box}} +/*! ==== 4.Bc6k-nPt.css :: /jobs: jobs/+page.svelte (svelte-11te7oe) ==== */ +.jobs-page.svelte-11te7oe.svelte-11te7oe{--jobs-container:min(1180px, calc(100vw - 3rem) );--jobs-section-y:clamp(4rem, 7vw, 6rem);background:#fff;color:#000;letter-spacing:0;overflow-x:hidden;width:100%}.jobs-page.svelte-11te7oe.svelte-11te7oe,.jobs-page.svelte-11te7oe *{box-sizing:border-box}.container.svelte-11te7oe.svelte-11te7oe{max-width:var(--jobs-container);width:100%;margin:0 auto}.jobs-hero.svelte-11te7oe.svelte-11te7oe{border-bottom:1px solid #000;min-height:0;padding:clamp(3.5rem,8vw,7rem) 0 clamp(2rem,4vw,3.5rem);display:flex;align-items:flex-start}.jobs-hero.svelte-11te7oe h1.svelte-11te7oe{color:#000;font-size:clamp(3rem,6vw,5.5rem);font-weight:600;line-height:.95;margin:0;max-width:14ch}.jobs-intro.svelte-11te7oe.svelte-11te7oe,.jobs-section.svelte-11te7oe.svelte-11te7oe,.benefits-section.svelte-11te7oe.svelte-11te7oe,.challenge-section.svelte-11te7oe.svelte-11te7oe,.quote-section.svelte-11te7oe.svelte-11te7oe{padding:var(--jobs-section-y) 0}.jobs-intro.svelte-11te7oe.svelte-11te7oe{padding-top:clamp(3rem,6vw,5rem);padding-bottom:clamp(3rem,6vw,5rem)}.split-grid.svelte-11te7oe.svelte-11te7oe{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:clamp(2.5rem,5vw,5rem);align-items:start}.split-grid.svelte-11te7oe>.svelte-11te7oe,.challenge-grid.svelte-11te7oe>.svelte-11te7oe,.openings-grid.svelte-11te7oe>.svelte-11te7oe{min-width:0}.section-title.svelte-11te7oe.svelte-11te7oe{color:#000;font-family:Inter,sans-serif;font-size:clamp(1.6rem,2.4vw,2.5rem);font-weight:700;line-height:1.1;margin:0;overflow-wrap:anywhere;text-transform:uppercase;word-break:break-word}.large-text.svelte-11te7oe.svelte-11te7oe,.body-copy.svelte-11te7oe.svelte-11te7oe,.challenge-copy.svelte-11te7oe.svelte-11te7oe,.trait-card.svelte-11te7oe p.svelte-11te7oe{color:#000;font-size:clamp(1.0625rem,1.35vw,1.25rem);font-weight:400;line-height:1.45}.large-text.svelte-11te7oe.svelte-11te7oe{margin:0}.jobs-intro.svelte-11te7oe .large-text.svelte-11te7oe{margin-bottom:2rem}.body-copy.svelte-11te7oe.svelte-11te7oe{margin:1rem 0 2rem}.eyebrow.svelte-11te7oe.svelte-11te7oe{color:#0000008c;font-family:JetBrains Mono,monospace;font-size:1rem;line-height:1.2;margin:0 0 .5rem;text-transform:uppercase}.jobs-video.svelte-11te7oe.svelte-11te7oe{padding:0 0 var(--jobs-section-y)}.video-shell.svelte-11te7oe.svelte-11te7oe{aspect-ratio:16 / 9;min-height:24rem;max-height:42rem;overflow:hidden;position:relative;width:100%}.video-frame.svelte-11te7oe.svelte-11te7oe{border:0;display:block;height:100%;width:100%}.section-spacer.svelte-11te7oe.svelte-11te7oe{height:clamp(3rem,5vw,5rem)}.photo-grid.svelte-11te7oe.svelte-11te7oe{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:clamp(1.5rem,4vw,4rem)}.photo-grid.svelte-11te7oe img.svelte-11te7oe,.challenge-image.svelte-11te7oe.svelte-11te7oe{border:1px solid #000;display:block;width:100%}.photo-grid.svelte-11te7oe img.svelte-11te7oe{aspect-ratio:4 / 3;object-fit:cover}.quote-section.svelte-11te7oe.svelte-11te7oe{border-bottom:1px solid #000;border-top:1px solid #000}.quote-container.svelte-11te7oe.svelte-11te7oe{display:grid;grid-template-rows:auto auto;align-items:center;gap:3rem}.quote.svelte-11te7oe.svelte-11te7oe{margin:0 auto;max-width:70rem;text-align:center}.quote.svelte-11te7oe blockquote.svelte-11te7oe{border:0;color:#000;font-size:clamp(1.75rem,3vw,2.5rem);font-style:normal;line-height:1.25;margin:0;padding:0}.quote.svelte-11te7oe figcaption.svelte-11te7oe{color:#000;font-size:1.25rem;line-height:1.2;margin-top:2rem}.quote-controls.svelte-11te7oe.svelte-11te7oe{display:grid;grid-template-columns:48px 1fr 48px;align-items:center;gap:1rem}.quote-arrow.svelte-11te7oe.svelte-11te7oe{align-items:center;background:#000;border:0;color:#fff;cursor:pointer;display:flex;height:48px;justify-content:center;padding:0;transition:opacity .2s;width:48px}.quote-arrow.svelte-11te7oe.svelte-11te7oe:hover,.quote-arrow.svelte-11te7oe.svelte-11te7oe:focus-visible{opacity:.75}.quote-arrow.previous.svelte-11te7oe svg{transform:rotate(180deg)}.quote-arrow.svelte-11te7oe svg{height:24px;width:24px}.quote-dots.svelte-11te7oe.svelte-11te7oe{display:flex;justify-content:center;gap:4px}.quote-dots.svelte-11te7oe button.svelte-11te7oe{background:#e4e4e4;border:0;cursor:pointer;height:4px;padding:0;transition:background-color .2s;width:24px}.quote-dots.svelte-11te7oe button.active.svelte-11te7oe{background:#000}.traits-grid.svelte-11te7oe.svelte-11te7oe{border:1px solid #000;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin-top:clamp(2rem,4vw,3rem)}.trait-card.svelte-11te7oe.svelte-11te7oe{padding:2rem}.trait-card.svelte-11te7oe+.trait-card.svelte-11te7oe{border-left:1px solid #000}.trait-card.svelte-11te7oe h3.svelte-11te7oe{color:#000;font-size:1.5rem;font-weight:600;line-height:1.2;margin:0 0 1rem}.trait-card.svelte-11te7oe p.svelte-11te7oe{margin:0}.challenge-section.svelte-11te7oe.svelte-11te7oe{background:#000;color:#fff}.challenge-section.svelte-11te7oe .eyebrow.svelte-11te7oe{color:#ffffffa6}.challenge-grid.svelte-11te7oe.svelte-11te7oe{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.5fr);gap:clamp(2.5rem,5vw,5rem);align-items:start}.challenge-section.svelte-11te7oe h2.svelte-11te7oe{color:#fff;font-size:clamp(2rem,3vw,2.75rem);font-weight:600;line-height:1.2;margin:0 0 1rem}.challenge-copy.svelte-11te7oe.svelte-11te7oe{color:#fff;margin:0 0 1.25rem}.trait-card.svelte-11te7oe a,.challenge-copy.svelte-11te7oe a.svelte-11te7oe,.job-description.svelte-11te7oe a{border-bottom:2px solid var(--color-accent);text-decoration:none;transition:background-color .2s}.trait-card.svelte-11te7oe a:hover,.trait-card.svelte-11te7oe a:focus-visible,.challenge-copy.svelte-11te7oe a.svelte-11te7oe:hover,.challenge-copy.svelte-11te7oe a.svelte-11te7oe:focus-visible,.job-description.svelte-11te7oe a:hover,.job-description.svelte-11te7oe a:focus-visible{background:#51ff0040}.challenge-image.svelte-11te7oe.svelte-11te7oe{aspect-ratio:4 / 3;align-self:start;object-fit:cover}.benefits-section.svelte-11te7oe.svelte-11te7oe{background:#f5f5f5}.benefits-list.svelte-11te7oe.svelte-11te7oe{display:flex;flex-direction:column}.benefit-item.svelte-11te7oe.svelte-11te7oe{align-items:center;border-bottom:1px solid #000;display:flex;margin-bottom:1rem;padding-bottom:1rem}.benefit-item.svelte-11te7oe img.svelte-11te7oe{flex:none;height:48px;width:48px}.benefit-item.svelte-11te7oe span.svelte-11te7oe{color:#000;font-size:1.4rem;font-weight:600;line-height:1.2;margin-left:1rem}.openings-grid.svelte-11te7oe.svelte-11te7oe{display:grid;grid-template-columns:minmax(0,.5fr) minmax(0,1fr);gap:clamp(2rem,4vw,4rem);align-items:start}.openings-intro.svelte-11te7oe.svelte-11te7oe{position:sticky;top:6rem}.openings-intro.svelte-11te7oe p.svelte-11te7oe{color:#000;font-size:1.5rem;line-height:1.3;margin:1.5rem 0 0}.openings-intro.svelte-11te7oe .section-title.svelte-11te7oe{font-size:2rem;line-height:1.2}.jobs-list.svelte-11te7oe.svelte-11te7oe{border-top:1px solid #000}.job-item.svelte-11te7oe.svelte-11te7oe{border-bottom:1px solid #000;margin-bottom:0;padding:1.5rem 0;scroll-margin-top:6rem}.job-item.svelte-11te7oe.svelte-11te7oe:last-child{margin-bottom:0}.job-header.svelte-11te7oe.svelte-11te7oe{align-items:center;display:flex;gap:1rem;justify-content:space-between;margin-bottom:0}.job-toggle.svelte-11te7oe.svelte-11te7oe{align-items:center;background:transparent;border:0;color:#000;cursor:pointer;display:flex;flex:1;font-family:inherit;justify-content:space-between;min-width:0;padding:0;text-align:left}.job-toggle.svelte-11te7oe.svelte-11te7oe:focus-visible{outline:2px solid var(--color-accent);outline-offset:4px}.job-header-title.svelte-11te7oe.svelte-11te7oe{align-items:flex-start;display:flex;flex-direction:column;flex:1;min-width:0;margin-right:1rem}.job-title-line.svelte-11te7oe.svelte-11te7oe{align-items:center;column-gap:.75rem;display:flex;flex-wrap:wrap;min-width:0;row-gap:.5rem;width:100%}.job-title.svelte-11te7oe.svelte-11te7oe{color:#000;display:block;flex:0 1 auto;font-size:1.875rem;font-weight:600;line-height:1.2;margin:0;min-width:0;overflow-wrap:anywhere}.job-toggle-icon.svelte-11te7oe.svelte-11te7oe{align-items:center;color:#000;display:flex;flex:none;height:2rem;justify-content:center;transition:transform .2s;width:2rem}.job-toggle-icon.svelte-11te7oe svg{height:12px;width:18px}.job-item.expanded.svelte-11te7oe .job-toggle-icon.svelte-11te7oe{transform:rotate(180deg)}.job-team.svelte-11te7oe.svelte-11te7oe,.job-location.svelte-11te7oe.svelte-11te7oe{color:#000;font-family:JetBrains Mono,monospace;font-size:1rem;line-height:1.2}.job-team.svelte-11te7oe.svelte-11te7oe{border:1px solid #000;display:inline-block;flex:none;opacity:.65;padding:.25rem .5rem}.job-location.svelte-11te7oe.svelte-11te7oe{margin-top:.75rem;opacity:.65;text-transform:uppercase}.job-actions.svelte-11te7oe.svelte-11te7oe{align-items:stretch;display:flex;flex:none;gap:.5rem}.share-button.svelte-11te7oe.svelte-11te7oe{align-items:center;background:transparent;border:1px solid #000;color:#000;cursor:pointer;display:flex;flex:none;justify-content:center;padding:0;transition:opacity .2s;width:2.55rem}.share-button.svelte-11te7oe.svelte-11te7oe:hover,.share-button.svelte-11te7oe.svelte-11te7oe:focus-visible{opacity:.6}.share-button.svelte-11te7oe.svelte-11te7oe:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.share-button.svelte-11te7oe svg{height:20px;width:20px}.apply-wrap.svelte-11te7oe.svelte-11te7oe{display:flex;flex:none;position:relative}.email-tooltip.svelte-11te7oe.svelte-11te7oe{background:#000;bottom:calc(100% + .625rem);color:#fff;font-family:JetBrains Mono,monospace;font-size:.875rem;line-height:1.2;padding:.5rem .75rem;position:absolute;right:0;white-space:nowrap;z-index:2}.email-tooltip.svelte-11te7oe.svelte-11te7oe:after{border:6px solid transparent;border-top-color:#000;content:"";position:absolute;right:1.5rem;top:100%}.apply-button.svelte-11te7oe.svelte-11te7oe{background:#000;border:0;color:#fff;cursor:pointer;flex:none;font-family:inherit;font-size:.875rem;font-weight:600;letter-spacing:.8px;line-height:1.2;padding:.75rem 1rem;text-decoration:none;text-transform:uppercase;transition:opacity .2s;white-space:nowrap}.apply-button.svelte-11te7oe.svelte-11te7oe:focus-visible{outline:2px solid var(--color-accent);outline-offset:2px}.apply-button.svelte-11te7oe.svelte-11te7oe:hover,.apply-button.svelte-11te7oe.svelte-11te7oe:focus-visible{opacity:.8}.job-panel.svelte-11te7oe.svelte-11te7oe{margin-top:1.25rem}.job-description.svelte-11te7oe.svelte-11te7oe{color:#000;font-size:1.125rem;font-weight:400;line-height:1.45;margin-bottom:1.5rem}.job-qualifications.svelte-11te7oe.svelte-11te7oe{color:#000;font-family:JetBrains Mono,monospace;font-size:1.0625rem;line-height:1.25;margin-bottom:1.5rem;text-transform:uppercase}.job-item.svelte-11te7oe ul.svelte-11te7oe{color:#000;margin:0 0 10px;padding-left:2.5rem}.job-item.svelte-11te7oe li.svelte-11te7oe{color:#000;font-size:1.125rem;font-weight:400;line-height:1.45;margin-bottom:0}.job-how-to-apply.svelte-11te7oe.svelte-11te7oe{margin-top:1.5rem}.job-how-to-apply.svelte-11te7oe .job-qualifications.svelte-11te7oe{margin-bottom:.75rem}.job-how-to-apply.svelte-11te7oe p.svelte-11te7oe{color:#000;font-size:1.125rem;line-height:1.45;margin:0}.job-how-to-apply.svelte-11te7oe a{color:#000;text-decoration:underline;text-underline-offset:.15em}@media screen and (max-width: 1024px){.jobs-hero.svelte-11te7oe h1.svelte-11te7oe{font-size:3rem}.split-grid.svelte-11te7oe.svelte-11te7oe,.photo-grid.svelte-11te7oe.svelte-11te7oe,.challenge-grid.svelte-11te7oe.svelte-11te7oe,.openings-grid.svelte-11te7oe.svelte-11te7oe{grid-template-columns:1fr}.split-grid.svelte-11te7oe.svelte-11te7oe,.challenge-grid.svelte-11te7oe.svelte-11te7oe,.openings-grid.svelte-11te7oe.svelte-11te7oe{gap:2rem}.video-shell.svelte-11te7oe.svelte-11te7oe{min-height:0;max-height:none}.photo-grid.svelte-11te7oe.svelte-11te7oe{gap:2rem}.job-header.svelte-11te7oe.svelte-11te7oe{align-items:flex-start;flex-wrap:wrap}.job-toggle.svelte-11te7oe.svelte-11te7oe{align-items:flex-start}.openings-intro.svelte-11te7oe.svelte-11te7oe{position:static}}@media screen and (max-width: 768px){.jobs-page.svelte-11te7oe.svelte-11te7oe{--jobs-container: calc(100vw - 2rem) ;--jobs-section-y:3.5rem}.jobs-hero.svelte-11te7oe.svelte-11te7oe{min-height:auto;padding-top:3rem;padding-bottom:2rem}.jobs-hero.svelte-11te7oe h1.svelte-11te7oe{font-size:2.4rem;max-width:none}.jobs-intro.svelte-11te7oe.svelte-11te7oe{padding-top:2.5rem;padding-bottom:3rem}.section-title.svelte-11te7oe.svelte-11te7oe{font-size:1.45rem;font-weight:700;line-height:1.12;max-width:100%}.large-text.svelte-11te7oe.svelte-11te7oe,.body-copy.svelte-11te7oe.svelte-11te7oe,.challenge-copy.svelte-11te7oe.svelte-11te7oe,.trait-card.svelte-11te7oe p.svelte-11te7oe{font-size:1rem;max-width:100%;overflow-wrap:normal}.section-spacer.svelte-11te7oe.svelte-11te7oe{height:3rem}.quote.svelte-11te7oe blockquote.svelte-11te7oe{font-size:1.35rem}.quote.svelte-11te7oe figcaption.svelte-11te7oe{font-size:1rem;margin-top:1.5rem}.quote-controls.svelte-11te7oe.svelte-11te7oe{grid-template-columns:44px 1fr 44px}.quote-arrow.svelte-11te7oe.svelte-11te7oe{height:44px;width:44px}.traits-grid.svelte-11te7oe.svelte-11te7oe{grid-template-columns:1fr}.trait-card.svelte-11te7oe.svelte-11te7oe{padding:2rem 1.25rem}.trait-card.svelte-11te7oe+.trait-card.svelte-11te7oe{border-left:0;border-top:1px solid #000}.challenge-section.svelte-11te7oe h2.svelte-11te7oe{font-size:1.875rem}.benefit-item.svelte-11te7oe span.svelte-11te7oe{font-size:1rem;margin-left:.5rem}.benefit-item.svelte-11te7oe img.svelte-11te7oe{height:40px;width:40px}.openings-intro.svelte-11te7oe p.svelte-11te7oe{font-size:1.25rem}.openings-intro.svelte-11te7oe .section-title.svelte-11te7oe{font-size:1.5rem}.job-item.svelte-11te7oe.svelte-11te7oe{padding:1.25rem 0}.job-header.svelte-11te7oe.svelte-11te7oe{align-items:stretch;flex-direction:column}.job-toggle.svelte-11te7oe.svelte-11te7oe{width:100%}.job-header-title.svelte-11te7oe.svelte-11te7oe{margin-bottom:0;margin-right:0}.job-title.svelte-11te7oe.svelte-11te7oe{font-size:1.5rem}.job-title-line.svelte-11te7oe.svelte-11te7oe{column-gap:.5rem}.job-location.svelte-11te7oe.svelte-11te7oe{display:none;margin-top:.5rem}.job-actions.svelte-11te7oe.svelte-11te7oe{display:none}.job-item.expanded.svelte-11te7oe .job-location.svelte-11te7oe{display:block}.job-item.expanded.svelte-11te7oe .job-actions.svelte-11te7oe{display:flex}.job-panel.svelte-11te7oe.svelte-11te7oe{margin-top:1rem}.job-team.svelte-11te7oe.svelte-11te7oe,.job-location.svelte-11te7oe.svelte-11te7oe{font-size:.875rem}.apply-wrap.svelte-11te7oe.svelte-11te7oe{flex:1}.apply-button.svelte-11te7oe.svelte-11te7oe{flex:1;text-align:center}} +/*! ==== 5.CaIOs1zA.css :: /openpilot: openpilot/+page.svelte, ReleaseNote ==== */ +.release-note.svelte-s17iji{border-top:1px solid #000;padding-top:1.5rem;padding-bottom:1.5rem}img.svelte-s17iji{border:1px solid rgba(0,0,0,.12);margin-right:1.5rem}hgroup.svelte-s17iji span{text-transform:uppercase;margin-bottom:.25rem;font-family:JetBrains Mono,monospace;font-size:.875rem}hgroup.svelte-s17iji a{font-size:1.5rem;display:block!important;width:fit-content;margin-top:.25rem}.stats-item.svelte-40iujj{display:flex;align-items:flex-start;flex-flow:column;color:#fff}.stats-item.svelte-40iujj span:first-of-type{margin-top:.5rem;margin-bottom:.25rem;font-size:2rem;font-weight:600}.stats-item.svelte-40iujj span:last-of-type{color:var(--color-muted);text-transform:uppercase;font-family:JetBrains Mono,monospace;font-size:1rem;font-weight:400}@media screen and (max-width: 1024px){.stats-item.svelte-40iujj span:first-of-type{font-size:1.5rem}.stats-item.svelte-40iujj span:last-of-type{font-size:.875rem}}.feature-item.svelte-40iujj{display:flex;align-items:center;flex-flow:row}.feature-item.svelte-40iujj div{border:1px solid #000;width:48px;padding:.375rem;display:inline-block;color:#000}.feature-item.svelte-40iujj span{color:var(--color-muted);text-transform:uppercase;font-family:JetBrains Mono,monospace;font-size:1rem;font-weight:400;margin-left:1rem}.headline.svelte-40iujj{margin-top:4rem;margin-bottom:6rem}.headline.svelte-40iujj h1{font-size:2.5rem;line-height:1.2}.headline.svelte-40iujj ul{padding-left:0;list-style:none}.headline.svelte-40iujj ul li{margin-bottom:.5rem;padding-left:2rem;background:url("data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20height='24px'%20width='24px'%20viewBox='0%200%2024%2024'%20fill='%2351b124'%3e%3cpath%20d='M0%200h24v24H0z'%20fill='none'%3e%3c/path%3e%3cpath%20d='M9%2016.17L4.83%2012l-1.42%201.41L9%2019%2021%207l-1.41-1.41z'%3e%3c/path%3e%3c/svg%3e") left center no-repeat}@media screen and (max-width: 512px){.headline.svelte-40iujj h1{font-size:2rem}.headline.svelte-40iujj ul{padding-top:1rem}.headline.svelte-40iujj ul li{font-size:1.25rem}}article.svelte-40iujj{margin-bottom:6rem}article.svelte-40iujj hgroup p{opacity:.5;font-family:JetBrains Mono,monospace;margin:0 0 .5rem;font-size:1.5rem}article.svelte-40iujj hgroup h2{font-weight:600;font-size:2.5rem;text-transform:lowercase;line-height:1.2;margin-bottom:1rem}article.svelte-40iujj p{font-size:1.5rem}article.svelte-40iujj h3{margin-top:4rem;margin-bottom:1rem}@media screen and (max-width: 512px){article.svelte-40iujj{margin-bottom:4rem}article.svelte-40iujj hgroup h2{font-size:2rem}article.svelte-40iujj p{font-size:1.25rem}article.svelte-40iujj .release-notes{width:100%}}.release-notes.svelte-40iujj{width:80%} +/*! ==== 6.CtjvlLKy.css :: /setup: setup/+page.svelte (svelte-6r52kx) ==== */ +#installation-guide.svelte-6r52kx{padding-bottom:2rem}#installation-guide.svelte-6r52kx .header hgroup{margin-bottom:2rem}#installation-guide.svelte-6r52kx .header hgroup h1{margin:0;font-size:3rem}#installation-guide.svelte-6r52kx .header hgroup h2{margin:.5rem 0 0;font-size:2rem;font-weight:400}#installation-guide.svelte-6r52kx .header .media-container{position:relative;padding-bottom:56.25%;height:0}#installation-guide.svelte-6r52kx .header .media-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}#installation-guide.svelte-6r52kx .header .overview{display:flex;align-items:center;justify-content:space-evenly;margin:2rem 0}#installation-guide.svelte-6r52kx .header .overview div{display:flex;align-items:center;justify-content:center}#installation-guide.svelte-6r52kx .header .overview span{margin-left:1rem}#installation-guide.svelte-6r52kx .header .overview .divider{width:1px;height:3rem;background-color:#0003;margin:0 2.5rem}#installation-guide.svelte-6r52kx .header .parts-card{border:1px solid #000;border-bottom:0;margin-bottom:1.5rem}#installation-guide.svelte-6r52kx .header .parts-card .header{font-size:.875rem;font-family:JetBrains Mono,monospace;text-transform:uppercase;color:#fff;background-color:#000;padding:.75rem 1rem}#installation-guide.svelte-6r52kx .header .parts-card .contents{display:flex;flex-flow:column;align-items:start;justify-content:space-between;padding:.875rem 1rem;border-bottom:1px solid #000}#installation-guide.svelte-6r52kx .header .parts-card .contents div{width:100%}#installation-guide.svelte-6r52kx .header .parts-card .contents div .content-header{display:flex;align-items:center;justify-content:start;gap:1rem}#installation-guide.svelte-6r52kx .header .parts-card .contents div .content-header img{min-width:45px;max-width:60px;object-fit:contain;border:1px solid rgba(0,0,0,.12);padding:.5rem}#installation-guide.svelte-6r52kx .header .parts-card .contents div .content-header span{white-space:nowrap}@media screen and (max-width: 480px){#installation-guide.svelte-6r52kx .header .parts-card .contents div .content-header span{white-space:normal}}#installation-guide.svelte-6r52kx .header .parts-card .contents span{text-align:end}#installation-guide.svelte-6r52kx .header .parts-card .contents li{font-size:1rem;text-wrap:balance}.card.svelte-6r52kx{border:1px solid #000;border-bottom:0;margin-bottom:4rem}.card.svelte-6r52kx .header{font-size:.875rem;font-family:JetBrains Mono,monospace;text-transform:uppercase;color:#fff;background-color:#000;padding:.75rem 1rem}.card.svelte-6r52kx .contents{display:flex;flex-flow:column;align-items:start;justify-content:space-between;padding:.875rem 1rem;border-bottom:1px solid #000}.step.svelte-6r52kx h2{margin-top:1rem}.step.svelte-6r52kx p,.step.svelte-6r52kx li{font-size:1.5rem}@media screen and (max-width: 1024px){.step.svelte-6r52kx p,.step.svelte-6r52kx li{font-size:1.25rem}}.step.svelte-6r52kx li,.step.svelte-6r52kx .card{margin-bottom:1rem}.step.svelte-6r52kx .image-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.7rem;align-items:start}.step.svelte-6r52kx .image-grid img{width:100%;height:auto}.step.svelte-6r52kx .image-grid .crop-wrapper{overflow:hidden;position:relative;aspect-ratio:1 / 1}.step.svelte-6r52kx .image-grid .crop-wrapper img{width:100%;height:100%;display:block;object-fit:cover;object-position:top}#faq.svelte-6r52kx{margin-bottom:2rem}hr.svelte-6r52kx{margin:2rem 0 3rem}.vehicle-notes.svelte-6r52kx{margin-top:1rem;font-size:1.25rem}.vehicle-notes.svelte-6r52kx p{margin:.25rem 0 0}.vehicle-notes.svelte-6r52kx .setup-notes{width:100%;margin:1rem 0 .5rem}.vehicle-notes.svelte-6r52kx .setup-notes .note-heading{font-weight:600;margin-bottom:.5rem}.vehicle-notes.svelte-6r52kx .setup-notes ul{margin:0;padding-left:1.5rem}.vehicle-notes.svelte-6r52kx .setup-notes li{margin-bottom:.5rem;font-size:1.25rem}.vehicle-notes.svelte-6r52kx .setup-notes a{color:#000;border-bottom:2px solid #86ff4e;background-color:#86ff4e26}.vehicle-notes.svelte-6r52kx .setup-notes .media-container{position:relative;padding-bottom:56.25%}.vehicle-notes.svelte-6r52kx .setup-notes .media-container iframe{position:absolute;top:0;left:0;width:100%;height:100%} +/*! ==== 7.DGTEg-9U.css :: /shop: shop/+page.svelte, ProductCard ==== */ +.product-card.svelte-1hz5z8s.svelte-1hz5z8s{border:1px solid #000;background-color:var(--color-card-background);padding-top:1rem;transition:all .2s;display:flex;flex-direction:column;justify-content:space-between}@media (hover: hover) and (pointer: fine){.product-card.svelte-1hz5z8s.svelte-1hz5z8s:hover{background-color:var(--color-card-background-hover);transform:scale(1.02)}}.product-card.svelte-1hz5z8s.svelte-1hz5z8s:active{background-color:var(--color-card-background-hover);transform:scale(1.02)}.product-card.svelte-1hz5z8s.svelte-1hz5z8s img{display:inline-block;mix-blend-mode:multiply}.product-card.svelte-1hz5z8s.svelte-1hz5z8s div{display:flex;gap:1rem;flex-wrap:nowrap;justify-content:space-between;align-items:center;padding:1rem 1.25rem}.product-card.svelte-1hz5z8s.svelte-1hz5z8s div hgroup h2{font-size:1.25rem;font-weight:600;line-height:1.2;margin-bottom:.375rem;overflow:hidden;text-wrap:balance;text-overflow:ellipsis}.product-card.svelte-1hz5z8s.svelte-1hz5z8s div>span{color:#fff;background-color:#000;padding:.5rem 1rem;text-transform:uppercase}@media screen and (max-width: 1500px){.product-card.svelte-1hz5z8s div.svelte-1hz5z8s{flex-direction:column;align-items:flex-start}}@media screen and (max-width: 768px){.product-card.svelte-1hz5z8s div.svelte-1hz5z8s{flex-direction:row}}section.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi{background-color:unset}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi{padding-bottom:0}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi article{border:1px solid #000}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi article:first-of-type{margin-bottom:4rem}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .gradient-bg{background:linear-gradient(135deg,#111 50%,#023807)}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display{padding:6rem;background-color:#000}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display hgroup{margin-bottom:2rem}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display hgroup h1{font-size:2.5rem}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display hgroup span{display:block}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display hgroup span:first-of-type{font-size:1.5rem}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display hgroup span.muted{font-size:1rem;margin-top:.25rem}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display p{font-size:1.125rem;color:#fff}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display .muted{color:#fff;opacity:.75}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .traits{align-items:stretch}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .traits .trait{display:flex;align-content:flex-start;padding:1.5rem;border-right:1px solid #000}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .traits .trait svg{margin-right:1rem}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .traits .trait h2{font-size:1rem;font-weight:600;text-transform:uppercase;margin-bottom:.5rem}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .traits .trait:last-of-type{border-right:none}@media only screen and (max-width: 1160px){#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display{padding:2rem;text-align:center}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display .product-content{display:flex;flex-direction:column;align-items:center}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .product-display .product-content>a{width:100%;box-sizing:border-box}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .trait{flex-wrap:wrap}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .trait svg{margin-right:0;margin-bottom:1rem}}@media only screen and (max-width: 768px){#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .trait{flex-wrap:nowrap;border-right:none!important;border-bottom:1px solid #000}#devices.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .trait:last-of-type{border-bottom:none}}section.svelte-sbpcoi .container.svelte-sbpcoi>hr.svelte-sbpcoi{margin-top:0rem;margin-bottom:2rem}section.svelte-sbpcoi .container.svelte-sbpcoi>hr.svelte-sbpcoi+h1{margin-bottom:3rem}.products-list.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi{margin:2rem 0}#accessories.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .shop-accessories-label{text-align:center;padding:2rem 0;margin-bottom:0;font-size:1.25rem;font-weight:600}#accessories.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .shop-accessories-list{margin-top:2rem}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi{margin-bottom:3rem}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-label{background-color:#000;padding:2rem;color:#fff;font-size:1.5rem;font-weight:600}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-label hgroup *{color:#fff;line-height:1.25}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-label hgroup h2{margin-bottom:.25rem;font-size:1.75rem;font-weight:600}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-label hgroup p{opacity:.65;font-size:1.25rem;margin-top:0}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-label hgroup span{margin-top:.875rem;font-size:1.25rem}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details{border:1px solid #000;padding:3rem 2rem;color:#000}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details h3{margin-top:0}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details span{font-weight:700}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details hr{margin:1.5rem 0}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details .side-by-side{display:flex;align-items:center;color:#000}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details .side-by-side hgroup{margin-left:1rem}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details .side-by-side hgroup *{margin:0}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details .side-by-side hgroup h4{font-weight:600}.service-item.svelte-sbpcoi.svelte-sbpcoi.svelte-sbpcoi .service-details .price{display:block;margin-bottom:1rem;color:#4a4a4a} +/*! ==== 8.Psnc-YtG.css :: /shop/[product]: Product.svelte, Select.svelte ==== */ +.select.svelte-zt3auu{box-sizing:border-box;width:100%;background:#fff;border:1px solid #a0a0a0;padding:.25em .5em;font-size:1.25rem;cursor:pointer}select.svelte-zt3auu{font-size:inherit;font-weight:600;text-wrap:balance;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:none;outline:none;padding:1rem;width:100%;background-image:url("data:image/svg+xml;utf8,");background-repeat:no-repeat;background-position-x:100%;background-position-y:50%}h1.svelte-vml9z1{font-size:2.5rem;font-weight:600}.preview.svelte-vml9z1 img{display:block;margin:0 auto}.product-images.svelte-vml9z1{display:flex;flex-wrap:wrap}.variant.svelte-vml9z1{width:120px;max-width:25%;cursor:pointer;background-color:transparent;border:none;margin-top:1rem}.variant.svelte-vml9z1 img{width:100%;height:100%;object-fit:scale-down}.variant-selector.svelte-vml9z1{margin:1rem 0}.variant-selector.svelte-vml9z1 h1{margin-bottom:1rem}.variant-selector.svelte-vml9z1 .price{font-size:1.5rem;display:flex;flex-direction:column;gap:.25rem}.variant-selector.svelte-vml9z1 img{width:120px;height:120px;object-fit:scale-down}.description.svelte-vml9z1 strong{font-size:1.25rem}.description.svelte-vml9z1 hr{margin:2rem 0}.description.svelte-vml9z1 hgroup{display:flex;align-items:center}.description.svelte-vml9z1 hgroup img{border:1px solid rgba(0,0,0,.12);margin-right:1rem;max-width:150px}.description.svelte-vml9z1 hgroup div{display:flex;flex-direction:column}.description.svelte-vml9z1 hgroup div span{font-size:.875rem;text-transform:uppercase;font-family:JetBrains Mono,monospace}.description.svelte-vml9z1 hgroup div strong{font-size:1.25rem;font-weight:600}.description.svelte-vml9z1 li{font-size:1rem}.description.svelte-vml9z1 a{color:#000;border-bottom:2px solid #86ff4e;background-color:#86ff4e26}.description.svelte-vml9z1 .video-container{position:relative;padding-bottom:56.25%;height:0}.description.svelte-vml9z1 .video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}hr.svelte-vml9z1{margin:2rem 0} +/*! ==== 9.BBgpNrRL.css :: /shop/body: body/+page.svelte (svelte-prxxnf) ==== */ +p.svelte-prxxnf{font-size:1.25rem}hr.svelte-prxxnf{margin:3rem 0}h1.svelte-prxxnf{font-size:3rem;font-weight:400;line-height:1.4}@media screen and (max-width: 768px){h1.svelte-prxxnf{font-size:2rem}}#overview.svelte-prxxnf{text-align:center}#overview.svelte-prxxnf img{display:block;margin:6rem auto}@media screen and (max-width: 768px){#overview.svelte-prxxnf img{margin:3rem auto}}.features.svelte-prxxnf h1{text-align:center}.features.svelte-prxxnf .image-grid{margin-bottom:5rem}.features.svelte-prxxnf .image-grid img{width:100%;height:auto;border-radius:8px}@media screen and (max-width: 768px){.features.svelte-prxxnf .image-grid{margin-bottom:3rem}}.features.svelte-prxxnf .item{padding:.5rem 0;border-bottom:1px solid rgba(255,255,255,.85)}.features.svelte-prxxnf .item .label{font-size:1.2rem;font-family:JetBrains Mono,monospace;font-weight:400;text-transform:uppercase;padding:1rem 0;display:flex;align-items:center}.features.svelte-prxxnf .item .label span{margin-left:1rem}.features.svelte-prxxnf .item .details{max-width:90%;font-size:1.2rem;line-height:1.6;margin-bottom:1rem}#technical-specs.svelte-prxxnf{border-bottom:1px solid #000;margin-bottom:3rem}#technical-specs.svelte-prxxnf .technical-specs h1{text-align:center}#technical-specs.svelte-prxxnf .technical-specs img{display:block}#technical-specs.svelte-prxxnf .technical-specs .chart{margin:4rem auto}#technical-specs.svelte-prxxnf .technical-specs .chart .body-assembly img{margin:0 auto 2rem;max-width:50%}#technical-specs.svelte-prxxnf .technical-specs .header{margin-bottom:1rem}#technical-specs.svelte-prxxnf .technical-specs .spec{padding-bottom:1.5rem}#technical-specs.svelte-prxxnf .technical-specs .spec span{display:block}#technical-specs.svelte-prxxnf .mailing-list{display:flex;flex-direction:column;align-items:center}#technical-specs.svelte-prxxnf .mailing-list .form{width:45ch;color:#000}@media screen and (max-width: 480px){#technical-specs.svelte-prxxnf .mailing-list .form{width:100%}}#description.svelte-prxxnf h3{font-weight:600}#description.svelte-prxxnf h3:first-of-type{margin-top:1rem}#description.svelte-prxxnf li{font-size:1.25rem}@media screen and (max-width: 1024px){#description.svelte-prxxnf{margin-bottom:3rem}}#description.svelte-prxxnf .fine-print-copy{padding:1rem 3rem;background-color:#fafafa}#description.svelte-prxxnf .fine-print-copy strong+p{margin-top:.5rem} +/*! ==== 10.D-ldDHYF.css :: /shop/comma-four: comma-four/+page.svelte, SetupGuide ==== */ +.installation-guide.svelte-19dr0ra{max-width:80%}@media screen and (max-width: 1024px){.installation-guide.svelte-19dr0ra{max-width:100%}}.installation-guide.svelte-19dr0ra hgroup span{display:block;font-size:1.25rem;margin-bottom:.5rem}.installation-guide.svelte-19dr0ra .overview{display:flex;align-items:center;max-width:375px;margin:2rem 0}.installation-guide.svelte-19dr0ra .overview div{display:flex;align-items:center;justify-content:center}.installation-guide.svelte-19dr0ra .overview span{margin-left:1rem}.installation-guide.svelte-19dr0ra .overview .divider{width:1px;height:3rem;background-color:#0003;margin:0 2.5rem}h2.svelte-1xdco7o{font-size:1.875rem;font-weight:600}p.svelte-1xdco7o{font-size:1.25rem}a.svelte-1xdco7o{color:#000}hr.svelte-1xdco7o{margin:3rem 0}.max-gradient.svelte-1xdco7o{background:linear-gradient(to bottom left,#8027fc,#cfa9ff);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text;font-weight:700}.cooling-section.svelte-1xdco7o{padding-top:2rem}#description.svelte-1xdco7o .description p:first-of-type{margin-top:0}#description.svelte-1xdco7o .description p:last-of-type{margin-bottom:0}@media screen and (max-width: 1024px){#description.svelte-1xdco7o{margin-bottom:3rem}}#description.svelte-1xdco7o .box-contents{display:flex;flex-wrap:wrap;text-align:center}#description.svelte-1xdco7o .box-contents>div{width:300px;margin-bottom:2rem}#description.svelte-1xdco7o .box-contents>div img{max-height:150px}#description.svelte-1xdco7o .box-contents>div p{margin:0 2rem}#description.svelte-1xdco7o .spec-card{border:1px solid #000;margin-bottom:1.5rem}#description.svelte-1xdco7o .spec-card .header{display:flex;align-items:center;border-bottom:1px solid #000}#description.svelte-1xdco7o .spec-card .header div{display:flex;align-items:center;justify-content:center;background-color:#000;color:#fff;width:48px;height:48px}#description.svelte-1xdco7o .spec-card .header div svg{width:36px;height:36px;color:#fff}#description.svelte-1xdco7o .spec-card .header span{font-family:JetBrains Mono,monospace;font-size:.875rem;font-weight:400;text-transform:uppercase;margin-left:1rem}#description.svelte-1xdco7o .spec-card .contents{display:flex;align-items:center;justify-content:space-between;padding:.875rem 1rem}#description.svelte-1xdco7o .spec-card .contents hgroup strong{display:block;font-size:1.25rem;font-weight:600}#description.svelte-1xdco7o .spec-card .contents hgroup .unit{font-size:.875rem;text-transform:uppercase}#description.svelte-1xdco7o .spec-card .contents li{font-size:1rem}hgroup.svelte-1xdco7o span{font-family:JetBrains Mono,monospace;font-size:1rem;margin-bottom:.5rem}hgroup.svelte-1xdco7o h2{font-size:2.5rem;font-weight:600;line-height:1.2}.compatibility.svelte-1xdco7o{margin-bottom:5rem}@media screen and (max-width: 768px){.compatibility.svelte-1xdco7o{margin-bottom:5rem}}.compatibility.svelte-1xdco7o hgroup h2{text-wrap:balance}.compatibility.svelte-1xdco7o hgroup span{text-transform:uppercase}.compatibility.svelte-1xdco7o p,.compatibility.svelte-1xdco7o p>a{color:#fff}.guarantee.svelte-1xdco7o{font-size:3rem;line-height:1.25}.guarantee.svelte-1xdco7o a{color:#fff}.fine-print-copy.svelte-1xdco7o{padding:1.5rem;background-color:#fafafa}.fine-print-copy.svelte-1xdco7o strong,.fine-print-copy.svelte-1xdco7o p{color:#545458;font-size:.875rem;line-height:1.25}.fine-print-copy.svelte-1xdco7o strong+p{margin-top:.25rem}.ui-grid.svelte-1xdco7o{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}.ui-card.svelte-1xdco7o .device-container{position:relative;display:inline-block;width:100%;margin-bottom:1rem}.ui-card.svelte-1xdco7o .device-frame{display:block;width:100%;height:auto}.ui-card.svelte-1xdco7o .screen-overlay{position:absolute;left:23.21%;top:63.97%;width:40.21%;height:25.8%;mix-blend-mode:screen;z-index:2}.ui-card.svelte-1xdco7o p{margin:0;font-size:1.25rem}@media screen and (max-width: 768px){.guarantee.svelte-1xdco7o{font-size:2rem}.ui-grid.svelte-1xdco7o{grid-template-columns:1fr}} +/*! ==== 11.CsJoBSAe.css :: /shop/comma-four-trade-in: +page.svelte (svelte-2awri7) ==== */ +h1.svelte-2awri7.svelte-2awri7{font-size:2.5rem;font-weight:600;margin-bottom:2rem}li.svelte-2awri7.svelte-2awri7{font-size:1rem;margin-bottom:1rem}.content.svelte-2awri7.svelte-2awri7{max-width:800px;line-height:1.6}.content.svelte-2awri7 strong.svelte-2awri7{display:block;margin-top:2rem;margin-bottom:1rem;font-size:1.25rem}.content.svelte-2awri7 p.svelte-2awri7{margin:1rem 0}.content.svelte-2awri7 hr.svelte-2awri7{margin:2rem 0;border:none;border-top:1px solid rgba(0,0,0,.15)} +/*! ==== 12.CGzG1vw1.css :: /support: support/+page.svelte (svelte-1i4ufcs) ==== */ +#support.svelte-1i4ufcs .breadcrumbs{display:flex;flex-wrap:wrap;padding:1rem;background-color:var(--color-card-background);margin-bottom:2rem;font-size:1.25rem}#support.svelte-1i4ufcs .breadcrumbs span{margin:0 .5rem;-webkit-user-select:none;user-select:none}#support.svelte-1i4ufcs .breadcrumbs :last-child{font-weight:600}#support.svelte-1i4ufcs h2{margin-bottom:2rem}#support.svelte-1i4ufcs h3{font-size:1.875rem;font-weight:600;margin-top:0;margin-bottom:2rem}#support.svelte-1i4ufcs a{color:#000;border-bottom:2px solid #86ff4e;background-color:#86ff4e26}#support.svelte-1i4ufcs li{font-size:1.25rem}#support.svelte-1i4ufcs .support-card{border:1px solid #000;background-color:var(--color-card-background);padding:1rem;transition:all .2s;display:flex;flex-direction:column;align-items:center;justify-content:center;cursor:pointer}@media (hover: hover) and (pointer: fine){#support.svelte-1i4ufcs .support-card:hover{background-color:var(--color-card-background-hover);transform:scale(1.02)}}#support.svelte-1i4ufcs .support-card:active{background-color:var(--color-card-background-hover);transform:scale(1.02)}#support.svelte-1i4ufcs .support-card img{display:inline-block;mix-blend-mode:multiply;padding-bottom:1rem;object-fit:contain}#support.svelte-1i4ufcs .support-card div{font-size:1.25rem;font-weight:600}@media only screen and (max-width: 375px){#support.svelte-1i4ufcs .support-card div{font-size:1rem;text-wrap:wrap}}#support.svelte-1i4ufcs .header-line{display:flex;justify-content:space-around;align-items:center}#support.svelte-1i4ufcs .header-line span{font-size:1.4rem;font-weight:600;line-height:1;margin:1.5rem 0}#support.svelte-1i4ufcs .header-line .line{width:100%;height:1px;background-color:#000;margin-left:1rem}#faq.svelte-1i4ufcs .faq-card{margin-bottom:3rem}#faq.svelte-1i4ufcs .contact-card{display:flex;flex-direction:column;align-items:center;color:#fff;background-color:#000;margin:4rem 0;padding:6rem 4rem}#faq.svelte-1i4ufcs .contact-card h2{color:#fff;font-size:2rem;margin-bottom:2rem}#faq.svelte-1i4ufcs .contact-card span{color:#fff;font-size:1.25rem;line-height:1.5;margin-bottom:1rem}#faq.svelte-1i4ufcs .contact-card a{color:#fff}.faq-sections.svelte-1i4ufcs{margin:2rem 0}.faq-section.svelte-1i4ufcs{margin-bottom:3rem}.label.svelte-1i4ufcs{font-size:1.25rem;font-weight:600;margin:1rem .75rem 1rem 0}.details.svelte-1i4ufcs{font-size:1.25rem!important;line-height:1.4;padding:.25rem 0 1rem}.details.svelte-1i4ufcs a{color:#000;border-bottom:2px solid #86ff4e;background-color:#86ff4e26;text-decoration:none}hr.svelte-1i4ufcs{border:none;border-top:1px solid var(--surface-2);margin:0} +/*! ==== 13.dJqKs7H8.css :: /terms: terms/+page.svelte (svelte-1sy2yfk) ==== */ +h1.svelte-1sy2yfk{margin-bottom:6rem}h2.svelte-1sy2yfk,h3.svelte-1sy2yfk{font-weight:600}p.svelte-1sy2yfk{font-size:1.25rem}.links.svelte-1sy2yfk{position:sticky;top:8rem}.links.svelte-1sy2yfk a{display:block;margin-bottom:1rem;text-decoration:underline}.links.svelte-1sy2yfk a:hover{opacity:.8}@media screen and (max-width: 768px){h1.svelte-1sy2yfk{margin-bottom:3rem}.links.svelte-1sy2yfk{position:unset;top:unset}} +/*! ==== 14.DU0G9C4y.css :: /vehicles: vehicles/+page.svelte (svelte-1nborgx) ==== */ +section.svelte-1nborgx{padding-top:4rem;padding-bottom:4rem}.vehicles-cover-image.svelte-1nborgx{background-image:url(/videos/hero-landscape/poster.jpg);background-position:50% 30%;background-size:cover;background-attachment:scroll;height:287px}#vehicles.svelte-1nborgx{padding-bottom:0}#vehicles.svelte-1nborgx .title{text-transform:uppercase;font-family:Monument Extended Black,sans-serif;font-size:2rem;font-weight:600;line-height:1.2}@media screen and (max-width: 512px){#vehicles.svelte-1nborgx .title{font-size:1.5rem}}#vehicles.svelte-1nborgx .description{font-size:1.25rem;font-weight:400;line-height:1.3}#vehicles.svelte-1nborgx .headline{margin:3rem auto 0}#vehicles.svelte-1nborgx .headline span{margin-bottom:.5rem}#vehicles.svelte-1nborgx .headline p{margin:0;text-wrap:balance}#vehicles.svelte-1nborgx hgroup{text-align:center;font-size:1.25rem}#vehicles.svelte-1nborgx hgroup span{font-size:1.5rem;font-weight:700;display:block}#vehicles.svelte-1nborgx hgroup p{margin-top:.5rem}#vehicles.svelte-1nborgx .compatibility-make-links{display:grid;grid-gap:1rem;grid-template-columns:repeat(auto-fit,105px);justify-content:space-between;margin:2rem 0 3rem}#vehicles.svelte-1nborgx .compatibility-make-element{width:105px;margin-bottom:1.5rem}@media screen and (max-width: 480px){#vehicles.svelte-1nborgx .compatibility-make-links{grid-template-columns:repeat(auto-fit,85px)}#vehicles.svelte-1nborgx .compatibility-make-element{width:85px}}#vehicles.svelte-1nborgx .compatibility-make-anchor-link{border:1px solid rgba(0,0,0,.12);padding:4px;transition:all .2s;display:block}@media (hover: hover) and (pointer: fine){#vehicles.svelte-1nborgx .compatibility-make-anchor-link:hover{transform:scale(1.02);border:1px solid rgba(0,0,0,.5)}}#vehicles.svelte-1nborgx .compatibility-make-anchor-link:active{transform:scale(1.02);border:1px solid rgba(0,0,0,.5)}#vehicles.svelte-1nborgx .compatibility-make-name{text-align:center;margin-top:.5rem;line-height:1.2}.last-updated.svelte-1nborgx{text-align:center;font-style:italic;margin-bottom:1rem}.recommended-cars.svelte-1nborgx{width:85%;margin:2rem auto;background-color:var(--color-card-background);border:1px solid rgba(0,0,0,.4);padding:2rem 1rem}.recommended-cars.svelte-1nborgx .recommended-car-columns{margin-top:3rem}.recommended-cars.svelte-1nborgx .recommended-car-columns .recommended-car-stack{text-align:center;font-size:1.25rem}.recommended-cars.svelte-1nborgx .recommended-car-columns .recommended-car-stack strong{margin-bottom:.5rem;font-weight:700}.car-make-header.svelte-1nborgx{background-color:#000;justify-content:flex-start;align-items:center;margin-top:2rem;margin-bottom:0;padding:1rem;display:flex}.car-make-header.svelte-1nborgx img{width:48px;margin-right:1rem}.car-make-header.svelte-1nborgx h3{color:#fff;font-weight:700;font-size:1.5em;margin:0}.car-make-header.svelte-1nborgx h3 .muted{color:#fff;font-weight:700;opacity:.65}.car-row.svelte-1nborgx{background-color:var(--color-card-background);border-bottom:1px solid rgba(0,0,0,.4)}.car-details-wrapper.svelte-1nborgx{display:flex;justify-content:space-between;align-items:center;padding:14px 16px}.car-details-wrapper.svelte-1nborgx .car-details{display:flex;flex:1}@media screen and (max-width: 768px){.car-details-wrapper.svelte-1nborgx .car-details{flex-flow:column wrap}}.car-details-wrapper.svelte-1nborgx .car-details .model{flex:1;margin-right:8px;font-weight:600;padding-right:20px}.car-details-wrapper.svelte-1nborgx .car-details .year{flex:2}.car-details-wrapper.svelte-1nborgx .video-icon-wrapper{width:20px;height:20px;margin-left:2rem}.car-details-wrapper.svelte-1nborgx .video-icon-wrapper svg{color:red}.detail-content.svelte-1nborgx{width:100%!important}.car-detail-content-wrapper.svelte-1nborgx{padding:12px 16px 16px;display:block}.car-detail-tier.svelte-1nborgx{margin-bottom:1rem;font-size:1.25rem}@media screen and (min-width: 768px){.cards.svelte-1nborgx div:last-of-type{margin-bottom:0}}.device-promotion-card.svelte-1nborgx{background-color:#44413a1f;border:1px solid rgba(117,93,36,.25);padding:.75rem;font-size:14px}.device-promotion-card.svelte-1nborgx .product-wrapper{justify-content:space-between;align-items:center;display:flex;margin-bottom:.75rem}.device-promotion-card.svelte-1nborgx .product-wrapper .strikethrough-price{text-decoration:line-through;margin-right:.5rem}.device-promotion-card.svelte-1nborgx .product-wrapper .red-price{color:var(--color-red);font-weight:700}.device-promotion-card.svelte-1nborgx .product-wrapper img{width:64px;height:64px;padding:.25rem;margin-right:.75rem;background-color:#fff;border:1px solid #ccc;object-fit:contain}.device-promotion-card.svelte-1nborgx .product-wrapper hgroup{flex:1;margin-right:.75rem}.device-promotion-card.svelte-1nborgx .product-wrapper hgroup strong{font-size:1rem;font-weight:600}.device-promotion-card.svelte-1nborgx .product-wrapper hgroup .understated-price{opacity:.65}.device-promotion-card.svelte-1nborgx .product-wrapper hgroup div{font-size:.875rem}.device-promotion-card.svelte-1nborgx .description{border-top:1px solid rgba(117,93,36,.25);margin:.5rem 0;padding-top:.75rem;font-size:1rem}#faq.svelte-1nborgx{margin-bottom:3rem} +/*! ==== LinkButton.B4XvTg7G.css :: LinkButton.svelte (svelte-slt5la) ==== */ +a.svelte-slt5la{background-color:var(--color-accent);text-align:center;letter-spacing:.5px;text-transform:uppercase;justify-content:center;padding:1.25rem 3rem;font-size:1.125rem;font-weight:600;width:fit-content;display:flex;align-items:center;text-wrap:balance;transition:color .2s,background-color .2s,opacity .2s}@media (hover: hover) and (pointer: fine){a.svelte-slt5la.primary:hover{opacity:.75}a.svelte-slt5la.secondary:hover{opacity:.8}a.svelte-slt5la.accent:hover{color:#000;background-color:var(--color-accent-hover)}}a.svelte-slt5la.primary:active{opacity:.75}a.svelte-slt5la.secondary:active{opacity:.8}a.svelte-slt5la.accent:active{color:#000;background-color:var(--color-accent-hover)}@media screen and (max-width: 768px){a.svelte-slt5la{padding-left:2rem;padding-right:2rem}}a.thin.svelte-slt5la{font-size:1rem;padding:.25rem 1rem}svg.svelte-slt5la{margin-left:.75rem}.full-width.svelte-slt5la{width:auto}.primary.svelte-slt5la{background-color:#000;color:#fff}.secondary.svelte-slt5la{background-color:#fff;color:#000}.accent.svelte-slt5la{background-color:var(--color-accent);color:#000} +/*! ==== faq.HPMlVXmg.css :: Faq.svelte (svelte-1olhv4k) ==== */ +.header.svelte-1olhv4k{width:100%;background-color:#000;margin-top:2rem;margin-bottom:2rem}.header.svelte-1olhv4k h1{font-size:3rem;font-weight:600;margin:1rem 2rem;color:#fff;text-wrap:balance}@media screen and (max-width: 1024px){.header.svelte-1olhv4k h1{font-size:2.5rem}}@media screen and (max-width: 480px){.header.svelte-1olhv4k h1{font-size:2rem}}@media screen and (max-width: 375px){.header.svelte-1olhv4k h1{font-size:1.5rem}}.header.svelte-1olhv4k img{color:#fff;width:100%}.questions.svelte-1olhv4k .label{font-size:1.25rem;font-weight:600;margin:1rem .75rem 1rem 0}.questions.svelte-1olhv4k .details{font-size:1.25rem!important;line-height:1.4;padding:.25rem 0 1rem}.questions.svelte-1olhv4k .details *:first-child{margin-top:0}.questions.svelte-1olhv4k .details *:last-child{margin-bottom:0}.questions.svelte-1olhv4k .details a{color:#000;border-bottom:2px solid #86ff4e;background-color:#86ff4e26}.questions.svelte-1olhv4k .details li{font-size:1.25rem}.questions.svelte-1olhv4k .details .video-container{position:relative;padding-bottom:56.25%;height:0}.questions.svelte-1olhv4k .details .video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%} +/*! ==== Accordion.Cg_lhePQ.css :: Accordion.svelte (svelte-f0pxdy) ==== */ +.tab.svelte-f0pxdy input.svelte-f0pxdy.svelte-f0pxdy{position:absolute;opacity:0;z-index:-1}.content.svelte-f0pxdy.svelte-f0pxdy.svelte-f0pxdy{display:none;overflow:hidden;color:var(--foreground-color)}.tab.svelte-f0pxdy input.svelte-f0pxdy:checked~.content.svelte-f0pxdy{display:block;overflow:visible}label.svelte-f0pxdy.svelte-f0pxdy.svelte-f0pxdy{cursor:pointer;display:grid;align-items:center;position:relative;background-color:var(--background-color);padding-right:4rem}label.svelte-f0pxdy.svelte-f0pxdy.svelte-f0pxdy>*{color:var(--foreground-color)}.chevron.svelte-f0pxdy.svelte-f0pxdy.svelte-f0pxdy{position:absolute;right:2rem;color:var(--foreground-color)}.chevron.svelte-f0pxdy.svelte-f0pxdy.svelte-f0pxdy>svg{color:var(--foreground-color);width:18px;height:12px}input:checked+label.svelte-f0pxdy .chevron.svelte-f0pxdy.svelte-f0pxdy{transform:rotate(180deg)} +/*! ==== HarnessSelector.Cviem_Zz.css :: HarnessSelector.svelte + HarnessDropdownItem.svelte ==== */ +.dropdown-item.svelte-1c3kfyc{display:flex;justify-content:space-between;align-items:center;cursor:pointer;color:#222;background-color:#fff;border:1px solid #a0a0a0;padding:1.25rem 3rem;box-sizing:border-box;min-height:84px;transition:border-color .2s}.dropdown-item.svelte-1c3kfyc:hover{border-color:#464646}.item-info.svelte-1c3kfyc{display:flex;flex-direction:column;justify-content:center}.title.svelte-1c3kfyc{font-size:1rem;font-weight:600;margin-right:.5rem}.subtitle.svelte-1c3kfyc{font-size:.875rem;font-weight:400;color:#515151;margin-right:.5rem}.accessory-label.svelte-1c3kfyc{font-size:1.25rem;font-weight:600;text-wrap:nowrap}.dropdown.svelte-1dmkgpz{position:relative;display:inline-block;margin:1.25rem auto 0;width:100%}.dropdown-content.svelte-1dmkgpz{display:none;position:absolute;border:1px solid #ddd;z-index:1;width:100%;max-height:400px;overflow-y:auto}.show.svelte-1dmkgpz{display:block}.search-input.svelte-1dmkgpz{box-sizing:border-box;width:100%;min-height:84px;border:1px solid #a0a0a0;padding:14px;outline:none;font-size:1rem}.search-input.svelte-1dmkgpz::placeholder{font-size:1rem;color:#656565}.selection-placeholder.svelte-1dmkgpz{display:flex;justify-content:space-between;align-items:center;cursor:pointer;color:#222;background-color:#fff;border:1px solid #a0a0a0;padding:1rem 3rem 1rem 1.5rem;box-sizing:border-box;min-height:84px;transition:border-color .2s}.selection-placeholder.svelte-1dmkgpz:hover{border-color:#464646}.selection-placeholder.svelte-1dmkgpz .label{font-size:1rem;font-weight:600;color:#515151;text-wrap:balance}.selection-placeholder.svelte-1dmkgpz .accessory{font-size:1.25rem;font-weight:600;text-wrap:nowrap}.chevron.svelte-1dmkgpz{position:absolute;top:50%;right:13px;transform:translate(-50%,-50%);pointer-events:none}.chevron.svelte-1dmkgpz>svg{width:18px;height:12px}.clear.svelte-1dmkgpz{position:absolute;left:13px;height:100%;padding:0;cursor:pointer;background-color:transparent;border:none} +/*! ==== NoteCard.CrbBJRtM.css :: NoteCard.svelte (svelte-1328bir) ==== */ +.card.svelte-1328bir{display:flex;margin:1rem 0;padding:1rem;align-items:center;color:#000;border:1px solid #616161}.card.svelte-1328bir hgroup{margin-left:1rem;display:block!important}.card.svelte-1328bir hgroup span{font-family:JetBrains Mono,monospace;font-size:.875rem;font-weight:400;text-transform:uppercase;line-height:1.1;margin-bottom:.25rem;color:#000}.card.svelte-1328bir hgroup div{display:block;color:#000000a6;font-size:.875rem;line-height:1.25}.card.svelte-1328bir hgroup a{color:#000;border-bottom:2px solid #616161}.card.svelte-1328bir hgroup a:hover{opacity:.8}.elevated.svelte-1328bir{color:#000;border:1px solid rgba(0,0,0,.15);background-color:#44413a1f}.elevated.svelte-1328bir hgroup span{color:#000} +/*! ==== CommaFour.CYP0XABj.css :: Modal.svelte, ProductDescriptions/CommaFour.svelte, CheckboxCard.svelte ==== */ +.backdrop.svelte-1jwweco{display:block;position:fixed;left:0;top:0;width:100%;height:100%;z-index:2000;background-color:#0006;animation:.5s ease-in-out fade-in}.modal-container.svelte-1jwweco{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.modal.svelte-1jwweco{z-index:1000;display:flex;flex-direction:column;gap:1rem;align-items:center;padding:48px;max-width:600px;max-height:100%;overflow:auto;border-radius:8px;text-align:center;background-color:#fff}@media screen and (max-width: 768px){.modal.svelte-1jwweco{margin:1.25rem;padding:1rem}}span.svelte-1jwweco{font-size:1.5rem;font-weight:600}.checkbox-card.svelte-3bw1mc{cursor:pointer;display:block;color:green}.checkbox-card.disabled.svelte-3bw1mc{cursor:not-allowed;opacity:.6}.checkbox-card.svelte-3bw1mc input[type=checkbox]{width:1.25rem;height:1.25rem;cursor:pointer;accent-color:var(--color-accent)}.checkbox-card.disabled.svelte-3bw1mc input[type=checkbox]{cursor:not-allowed}.checkbox-card.checked.svelte-3bw1mc .card hgroup span{background-color:#86ff4e;color:#000}.item.svelte-1qobqhj{padding:1rem 0;border-bottom:1px solid rgba(0,0,0,.15)}.badges.svelte-1qobqhj{display:flex;flex-wrap:wrap;align-items:center;gap:.75rem;margin:1rem 0}.label.svelte-1qobqhj{display:flex;align-items:center;color:#000}.label.svelte-1qobqhj div{height:24px;width:2.5rem}.label.svelte-1qobqhj span{vertical-align:middle;margin-right:1rem;color:#000}.details.svelte-1qobqhj{max-width:80%;margin-left:2.5rem;margin-top:.875rem}.disclaimer.svelte-1qobqhj{margin:0}.disclaimer.svelte-1qobqhj.warning{color:#c53e3e;font-weight:600}hr.svelte-1qobqhj{margin:2rem 0}.price-due-today.svelte-1qobqhj{font-size:1rem;color:#515151} +/*! ==== CommunityBanner.D4W8Z2PG.css :: CommunityBanner.svelte (svelte-13qdnfo) ==== */ +span.svelte-13qdnfo{display:block;color:#fff;font-size:2rem}p.svelte-13qdnfo{color:#fff;font-size:1.25rem;margin-bottom:1.5rem} diff --git a/src/lib/icons/arrow-right.svg b/assets/icons/arrow-right.svg similarity index 100% rename from src/lib/icons/arrow-right.svg rename to assets/icons/arrow-right.svg diff --git a/src/lib/icons/brands/hyundai.svg b/assets/icons/brands/hyundai.svg similarity index 100% rename from src/lib/icons/brands/hyundai.svg rename to assets/icons/brands/hyundai.svg diff --git a/src/lib/icons/brands/kia.svg b/assets/icons/brands/kia.svg similarity index 100% rename from src/lib/icons/brands/kia.svg rename to assets/icons/brands/kia.svg diff --git a/src/lib/icons/brands/lexus.svg b/assets/icons/brands/lexus.svg similarity index 100% rename from src/lib/icons/brands/lexus.svg rename to assets/icons/brands/lexus.svg diff --git a/src/lib/icons/brands/toyota.svg b/assets/icons/brands/toyota.svg similarity index 100% rename from src/lib/icons/brands/toyota.svg rename to assets/icons/brands/toyota.svg diff --git a/src/lib/icons/comma.svg b/assets/icons/comma.svg similarity index 100% rename from src/lib/icons/comma.svg rename to assets/icons/comma.svg diff --git a/src/lib/icons/features/360-vision.svg b/assets/icons/features/360-vision.svg similarity index 100% rename from src/lib/icons/features/360-vision.svg rename to assets/icons/features/360-vision.svg diff --git a/src/lib/icons/features/adaptive-cruise.svg b/assets/icons/features/adaptive-cruise.svg similarity index 100% rename from src/lib/icons/features/adaptive-cruise.svg rename to assets/icons/features/adaptive-cruise.svg diff --git a/src/lib/icons/features/business.svg b/assets/icons/features/business.svg similarity index 100% rename from src/lib/icons/features/business.svg rename to assets/icons/features/business.svg diff --git a/src/lib/icons/features/cable.svg b/assets/icons/features/cable.svg similarity index 100% rename from src/lib/icons/features/cable.svg rename to assets/icons/features/cable.svg diff --git a/src/lib/icons/features/calendar.svg b/assets/icons/features/calendar.svg similarity index 100% rename from src/lib/icons/features/calendar.svg rename to assets/icons/features/calendar.svg diff --git a/src/lib/icons/features/car.svg b/assets/icons/features/car.svg similarity index 100% rename from src/lib/icons/features/car.svg rename to assets/icons/features/car.svg diff --git a/src/lib/icons/features/commacare.svg b/assets/icons/features/commacare.svg similarity index 100% rename from src/lib/icons/features/commacare.svg rename to assets/icons/features/commacare.svg diff --git a/src/lib/icons/features/command-line.svg b/assets/icons/features/command-line.svg similarity index 100% rename from src/lib/icons/features/command-line.svg rename to assets/icons/features/command-line.svg diff --git a/src/lib/icons/features/connectivity.svg b/assets/icons/features/connectivity.svg similarity index 100% rename from src/lib/icons/features/connectivity.svg rename to assets/icons/features/connectivity.svg diff --git a/src/lib/icons/features/contact.svg b/assets/icons/features/contact.svg similarity index 100% rename from src/lib/icons/features/contact.svg rename to assets/icons/features/contact.svg diff --git a/src/lib/icons/features/currency.svg b/assets/icons/features/currency.svg similarity index 100% rename from src/lib/icons/features/currency.svg rename to assets/icons/features/currency.svg diff --git a/src/lib/icons/features/dials.svg b/assets/icons/features/dials.svg similarity index 100% rename from src/lib/icons/features/dials.svg rename to assets/icons/features/dials.svg diff --git a/src/lib/icons/features/display.svg b/assets/icons/features/display.svg similarity index 100% rename from src/lib/icons/features/display.svg rename to assets/icons/features/display.svg diff --git a/src/lib/icons/features/immediate.svg b/assets/icons/features/immediate.svg similarity index 100% rename from src/lib/icons/features/immediate.svg rename to assets/icons/features/immediate.svg diff --git a/src/lib/icons/features/lane-centering.svg b/assets/icons/features/lane-centering.svg similarity index 100% rename from src/lib/icons/features/lane-centering.svg rename to assets/icons/features/lane-centering.svg diff --git a/src/lib/icons/features/location.svg b/assets/icons/features/location.svg similarity index 100% rename from src/lib/icons/features/location.svg rename to assets/icons/features/location.svg diff --git a/src/lib/icons/features/marker.png b/assets/icons/features/marker.png similarity index 100% rename from src/lib/icons/features/marker.png rename to assets/icons/features/marker.png diff --git a/src/lib/icons/features/memory.svg b/assets/icons/features/memory.svg similarity index 100% rename from src/lib/icons/features/memory.svg rename to assets/icons/features/memory.svg diff --git a/src/lib/icons/features/money-back-guarantee.svg b/assets/icons/features/money-back-guarantee.svg similarity index 100% rename from src/lib/icons/features/money-back-guarantee.svg rename to assets/icons/features/money-back-guarantee.svg diff --git a/src/lib/icons/features/moon.svg b/assets/icons/features/moon.svg similarity index 100% rename from src/lib/icons/features/moon.svg rename to assets/icons/features/moon.svg diff --git a/src/lib/icons/features/ota-updates.svg b/assets/icons/features/ota-updates.svg similarity index 100% rename from src/lib/icons/features/ota-updates.svg rename to assets/icons/features/ota-updates.svg diff --git a/src/lib/icons/features/people.svg b/assets/icons/features/people.svg similarity index 100% rename from src/lib/icons/features/people.svg rename to assets/icons/features/people.svg diff --git a/src/lib/icons/features/processor.svg b/assets/icons/features/processor.svg similarity index 100% rename from src/lib/icons/features/processor.svg rename to assets/icons/features/processor.svg diff --git a/src/lib/icons/features/recordings.svg b/assets/icons/features/recordings.svg similarity index 100% rename from src/lib/icons/features/recordings.svg rename to assets/icons/features/recordings.svg diff --git a/src/lib/icons/features/road.svg b/assets/icons/features/road.svg similarity index 100% rename from src/lib/icons/features/road.svg rename to assets/icons/features/road.svg diff --git a/src/lib/icons/features/shipping.svg b/assets/icons/features/shipping.svg similarity index 100% rename from src/lib/icons/features/shipping.svg rename to assets/icons/features/shipping.svg diff --git a/src/lib/icons/features/snapshot.png b/assets/icons/features/snapshot.png similarity index 100% rename from src/lib/icons/features/snapshot.png rename to assets/icons/features/snapshot.png diff --git a/src/lib/icons/features/steer.svg b/assets/icons/features/steer.svg similarity index 100% rename from src/lib/icons/features/steer.svg rename to assets/icons/features/steer.svg diff --git a/src/lib/icons/features/twenty-four-seven.png b/assets/icons/features/twenty-four-seven.png similarity index 100% rename from src/lib/icons/features/twenty-four-seven.png rename to assets/icons/features/twenty-four-seven.png diff --git a/src/lib/icons/features/ubuntu.svg b/assets/icons/features/ubuntu.svg similarity index 100% rename from src/lib/icons/features/ubuntu.svg rename to assets/icons/features/ubuntu.svg diff --git a/src/lib/icons/features/warranty.svg b/assets/icons/features/warranty.svg similarity index 100% rename from src/lib/icons/features/warranty.svg rename to assets/icons/features/warranty.svg diff --git a/src/lib/icons/icon-chevron.svg b/assets/icons/icon-chevron.svg similarity index 100% rename from src/lib/icons/icon-chevron.svg rename to assets/icons/icon-chevron.svg diff --git a/src/lib/icons/social/discord.svg b/assets/icons/social/discord.svg similarity index 100% rename from src/lib/icons/social/discord.svg rename to assets/icons/social/discord.svg diff --git a/src/lib/icons/social/github.svg b/assets/icons/social/github.svg similarity index 100% rename from src/lib/icons/social/github.svg rename to assets/icons/social/github.svg diff --git a/src/lib/icons/social/instagram.svg b/assets/icons/social/instagram.svg similarity index 100% rename from src/lib/icons/social/instagram.svg rename to assets/icons/social/instagram.svg diff --git a/src/lib/icons/social/x.svg b/assets/icons/social/x.svg similarity index 100% rename from src/lib/icons/social/x.svg rename to assets/icons/social/x.svg diff --git a/src/lib/icons/social/youtube.svg b/assets/icons/social/youtube.svg similarity index 100% rename from src/lib/icons/social/youtube.svg rename to assets/icons/social/youtube.svg diff --git a/src/lib/icons/ui/basket.svg b/assets/icons/ui/basket.svg similarity index 100% rename from src/lib/icons/ui/basket.svg rename to assets/icons/ui/basket.svg diff --git a/src/lib/icons/ui/cart.svg b/assets/icons/ui/cart.svg similarity index 100% rename from src/lib/icons/ui/cart.svg rename to assets/icons/ui/cart.svg diff --git a/src/lib/icons/ui/checkmark.svg b/assets/icons/ui/checkmark.svg similarity index 100% rename from src/lib/icons/ui/checkmark.svg rename to assets/icons/ui/checkmark.svg diff --git a/src/lib/icons/ui/close.svg b/assets/icons/ui/close.svg similarity index 100% rename from src/lib/icons/ui/close.svg rename to assets/icons/ui/close.svg diff --git a/src/lib/icons/ui/external.svg b/assets/icons/ui/external.svg similarity index 100% rename from src/lib/icons/ui/external.svg rename to assets/icons/ui/external.svg diff --git a/src/lib/icons/ui/info.svg b/assets/icons/ui/info.svg similarity index 100% rename from src/lib/icons/ui/info.svg rename to assets/icons/ui/info.svg diff --git a/src/lib/icons/ui/link.svg b/assets/icons/ui/link.svg similarity index 100% rename from src/lib/icons/ui/link.svg rename to assets/icons/ui/link.svg diff --git a/src/lib/icons/ui/play.svg b/assets/icons/ui/play.svg similarity index 100% rename from src/lib/icons/ui/play.svg rename to assets/icons/ui/play.svg diff --git a/src/lib/icons/ui/search.png b/assets/icons/ui/search.png similarity index 100% rename from src/lib/icons/ui/search.png rename to assets/icons/ui/search.png diff --git a/assets/js/lib/cart.js b/assets/js/lib/cart.js new file mode 100644 index 00000000..d7a684f0 --- /dev/null +++ b/assets/js/lib/cart.js @@ -0,0 +1,134 @@ +/** + * Cross-page cart API (port of src/store.js). + * + * Pages must talk to the cart ONLY through this module: + * + * import { addToCart, openCart, refreshCart } from '../lib/cart.js'; + * + * addToCart(variantId, additionalProductIds = [], note = "") + * Adds the variant (qty 1 each, plus optional extra product ids and cart + * note) to the Shopify cart, reloads it and opens the cart drawer. + * openCart() + * Reloads the cart, then opens the drawer. + * refreshCart() + * Reloads the cart from Shopify into the stores below (the old + * store.js `loadCart`). Errors are caught and logged. + * + * State is exposed as tiny Svelte-compatible writable stores (set/update/ + * subscribe — subscribe fires immediately with the current value): + * cart, search — dead code carried over from store.js + * showCart — drawer visibility (main.js renders the drawer) + * cartId, checkoutUrl, cartCreatedAt, cartTotalQuantity + * — initialized from localStorage and written back on + * EVERY change via `window.localStorage. = v`, + * which stringifies: undefined becomes the literal + * string "undefined" (load-bearing — shopify.js + * treats "undefined"/"null" as "create new cart") + * cartItems, cartDiscount, cartSubtotal — current cart contents + * selectedCar — localStorage-synced (setItem when truthy, + * removeItem when falsy); used by other pages + * + * localStorage keys (exact): cartId, checkoutUrl, cartCreatedAt, + * cartTotalQuantity, selectedCar. + */ +import { + addToCart as requestAddToCart, + loadCart as requestLoadCart, +} from './shopify.js'; + +// --- minimal svelte/store replacement ------------------------------------- + +// Svelte's safe_not_equal: objects/functions always notify, primitives only +// when changed (NaN-safe). +const safeNotEqual = (a, b) => + a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function'; + +export function writable(value) { + const subscribers = new Set(); + return { + set(newValue) { + if (safeNotEqual(value, newValue)) { + value = newValue; + subscribers.forEach((fn) => fn(value)); + } + }, + update(fn) { + this.set(fn(value)); + }, + subscribe(fn) { + subscribers.add(fn); + fn(value); // svelte stores fire immediately on subscribe + return () => subscribers.delete(fn); + }, + get() { + return value; + }, + }; +} + +export const get = (store) => store.get(); + +// --- stores (src/store.js) ------------------------------------------------- + +export const cart = writable([]); +export const search = writable(''); +export const showCart = writable(false); + +export const cartId = writable(window.localStorage.getItem('cartId')); +export const checkoutUrl = writable(window.localStorage.getItem('checkoutUrl')); +export const cartCreatedAt = writable(window.localStorage.getItem('cartCreatedAt')); +export const cartTotalQuantity = writable(window.localStorage.getItem('cartTotalQuantity')); + +export const cartItems = writable([]); +export const cartDiscount = writable({}); +export const cartSubtotal = writable({}); +export const selectedCar = writable(localStorage.getItem('selectedCar') || ''); + +selectedCar.subscribe((value) => { + if (value) localStorage.setItem('selectedCar', value); + else localStorage.removeItem('selectedCar'); +}); + +// Write-through on every change. Property assignment stringifies the value, +// so undefined/null become the strings "undefined"/"null" — keep as-is. +cartId.subscribe((value) => (window.localStorage.cartId = value)); +checkoutUrl.subscribe((value) => (window.localStorage.checkoutUrl = value)); +cartCreatedAt.subscribe((value) => (window.localStorage.cartCreatedAt = value)); +cartTotalQuantity.subscribe((value) => (window.localStorage.cartTotalQuantity = value)); + +// --- cart actions (src/store.js loadCart/addToCart) ------------------------- + +// src/store.js `loadCart` — exported as refreshCart (cross-page contract name). +export const refreshCart = async () => { + try { + const shopifyResponse = await requestLoadCart(); + cartItems.set(shopifyResponse?.body?.data?.cart?.lines?.edges); + cartDiscount.set(getTotalDiscount(shopifyResponse?.body?.data?.cart?.discountAllocations)); + cartSubtotal.set(shopifyResponse?.body?.data?.cart?.cost?.subtotalAmount); + cartTotalQuantity.set(shopifyResponse.body?.data?.cart?.totalQuantity); + } catch (error) { + console.error(error); + } +}; + +export const addToCart = async (itemId, additionalProductIds = [], note = "") => { + await requestAddToCart({ cartId: get(cartId), variantId: itemId, additionalProductIds, note }); + await refreshCart(); + showCart.set(true); +}; + +// src/routes/+layout.svelte `openCart` +export const openCart = async () => { + await refreshCart(); + showCart.set(true); +}; + +export const getTotalDiscount = (discountAllocations) => { + if (!discountAllocations || discountAllocations.length === 0) return null; + + const discountAmount = discountAllocations.reduce((totalAmount, allocation) => { + return totalAmount + Number(allocation.discountedAmount.amount); + }, 0); + + return { amount: discountAmount, currencyCode: discountAllocations[0].discountedAmount.currencyCode }; +}; diff --git a/assets/js/lib/click-outside.js b/assets/js/lib/click-outside.js new file mode 100644 index 00000000..aada410e --- /dev/null +++ b/assets/js/lib/click-outside.js @@ -0,0 +1,41 @@ +/** + * Verbatim port of src/lib/utils/clickOutside.js (Svelte action). + * + * Attaches document-level CAPTURE listeners for `click` (dispatches a + * `clickOutside` CustomEvent on the node when the click lands outside it) and + * `keydown` (dispatches on Escape). NOTE: destroy() forgets to remove the + * keydown listener — that leak is part of the original and is kept on purpose + * (irrelevant under full page loads). The CustomEvent is constructed with the + * node as the init object, exactly like the original. + * + * Usage: + * const action = clickOutside(node); + * node.addEventListener('clickOutside', handler); + * // action.destroy() when tearing down (never needed on these pages) + */ +export function clickOutside(node) { + const handleClick = event => { + if (node && !node.contains(event.target) && !event.defaultPrevented) { + node.dispatchEvent( + new CustomEvent('clickOutside', node) + ) + } + } + + const handleKeydown = event => { + if (event.key === 'Escape') { + node.dispatchEvent( + new CustomEvent('clickOutside', node) + ) + } + } + + document.addEventListener('click', handleClick, true); + document.addEventListener('keydown', handleKeydown, true); + + return { + destroy() { + document.removeEventListener('click', handleClick, true); + } + } +} diff --git a/src/lib/utils/currency.js b/assets/js/lib/currency.js similarity index 54% rename from src/lib/utils/currency.js rename to assets/js/lib/currency.js index 0e21599c..367291dd 100644 --- a/src/lib/utils/currency.js +++ b/assets/js/lib/currency.js @@ -1,4 +1,10 @@ -const getCurrencySymbol = (currencyCode) => { +/** + * Currency formatting (port of src/lib/utils/currency.js). + * getCurrencySymbol("USD") -> "$" + * formatCurrency({ currencyCode, amount }, decimals = 2) -> "$1250.00" + * (no thousands separators, matching the old site) + */ +export const getCurrencySymbol = (currencyCode) => { return (0).toLocaleString("en-US", { style: "currency", currency: currencyCode, diff --git a/assets/js/lib/faq.js b/assets/js/lib/faq.js new file mode 100644 index 00000000..8acd2702 --- /dev/null +++ b/assets/js/lib/faq.js @@ -0,0 +1,31 @@ +// Shared FAQ hash-sync, porting Faq.svelte's `checked={id === activehash}` reactivity. +// - On load: check the input whose id matches location.hash (native scroll already happened). +// - On hashchange: uncheck only the input previously opened BY hash (manually-opened stay open), +// then check the new target. +// - Every click on a FAQ input rewrites the hash via replaceState — on open AND close clicks — +// without firing hashchange (matches Svelte's router-bypassing goto/replaceState). +// Scoped to `.questions .tab > input` so non-FAQ accordions (e.g. /support top section) are untouched. +export function initFaq(root = document) { + let hashOpened = null; + + const openFromHash = () => { + const id = location.hash.slice(1); + if (hashOpened && hashOpened.id !== id) { + hashOpened.checked = false; + hashOpened = null; + } + if (!id) return; + const inp = root.querySelector(`.questions .tab > input[id="${CSS.escape(id)}"]`); + if (inp) { + inp.checked = true; + hashOpened = inp; + } + }; + + openFromHash(); + window.addEventListener('hashchange', openFromHash); + + root.querySelectorAll('.questions .tab > input').forEach((inp) => + inp.addEventListener('click', () => history.replaceState(null, null, '#' + inp.id)) + ); +} diff --git a/assets/js/lib/harness-selector.js b/assets/js/lib/harness-selector.js new file mode 100644 index 00000000..01f10e26 --- /dev/null +++ b/assets/js/lib/harness-selector.js @@ -0,0 +1,321 @@ +/** + * HarnessSelector.svelte behaviors (scope svelte-1dmkgpz; rows svelte-1c3kfyc) + * over the server-rendered dropdown emitted by + * layouts/partials/product/harness-selector.html. + * + * The partial prerenders the closed state plus ALL dropdown rows, and embeds + * the per-row harness objects (1:1 with src/lib/utils/harnesses.js) in a + * + + + + + + + + + + + + +{{ if eq .Kind "404" }}{{ site.Title }}{{ else }}{{ .Title | default site.Title }}{{ end }} + + + + + + + + + + + + + + + + + + + + + +{{ with .Params.description }} +{{ end }}{{ range .Params.preloadImages }} +{{ end }} +{{ with resources.Get "css/site.css" | minify | fingerprint }}{{ end }} diff --git a/layouts/partials/header.html b/layouts/partials/header.html new file mode 100644 index 00000000..38460ff5 --- /dev/null +++ b/layouts/partials/header.html @@ -0,0 +1,26 @@ +{{- /* Global navbar + header banner. Ports src/routes/+layout.svelte (header, + scope svelte-uhk6nj), HeaderMenu.svelte (svelte-1u2audz, CSS-only + :focus-within dropdown, no JS), SocialIcons.svelte (svelte-y50ryu) and + HeaderBanner.svelte (svelte-13beqlz). The cart button and the cart + drawer are client-only: assets/js/main.js appends the button to + .navbar-section-buttons and inserts the drawer right after + (its mount point), exactly like the Svelte hydration path. */ -}} +{{- $path := strings.TrimSuffix ".html" .RelPermalink -}} +{{- /* Blog posts for the menu: build-time fetch of the RSS feed, like + src/routes/+layout.js load() — 3 latest posts in feed order. + Fetch failure hard-fails the build (matches SvelteKit prerender). */ -}} +{{- $feedURL := "https://blog.comma.ai/feed" -}} +{{- $blogPosts := slice -}} +{{- $res := try (resources.GetRemote $feedURL) -}} +{{- with $res.Err -}} + {{- errorf "header: failed to fetch blog feed %s: %s" $feedURL . -}} +{{- else -}} + {{- with $res.Value -}} + {{- $blogPosts = first 3 ((transform.Unmarshal .Content).channel.item) -}} + {{- else -}} + {{- errorf "header: no response for blog feed %s" $feedURL -}} + {{- end -}} +{{- end -}} + diff --git a/layouts/partials/icon.html b/layouts/partials/icon.html new file mode 100644 index 00000000..5bb6b0c3 --- /dev/null +++ b/layouts/partials/icon.html @@ -0,0 +1,3 @@ +{{- /* Inline an SVG from assets/icons (replaces Svelte `?raw` imports). + Usage: {{ partial "icon.html" "ui/cart.svg" }} */ -}} +{{- with resources.Get (printf "icons/%s" .) -}}{{ .Content | safeHTML }}{{- else -}}{{ errorf "icon not found: %s" . }}{{- end -}} diff --git a/layouts/partials/picture.html b/layouts/partials/picture.html new file mode 100644 index 00000000..6f53fea1 --- /dev/null +++ b/layouts/partials/picture.html @@ -0,0 +1,17 @@ +{{- /* + Replicates the SvelteKit optimize-image preprocessor output: + + .src logical image path, e.g. /img/products/comma-four/four_back.png + .attrs map of extra attributes (alt, loading, class, style, width, ...) + Variants exist as siblings generated by scripts/optimize-images.mjs. + jpg/jpeg/png/gif sources get treatment; everything else renders a bare . +*/ -}} +{{- $src := .src -}} +{{- $ext := path.Ext $src -}} +{{- $stem := strings.TrimSuffix $ext $src -}} +{{- $attrs := .attrs | default dict -}} +{{- if in (slice ".jpg" ".jpeg" ".png" ".gif") (lower $ext) -}} + +{{- else -}} + +{{- end -}} diff --git a/layouts/partials/product/car-harness-description.html b/layouts/partials/product/car-harness-description.html new file mode 100644 index 00000000..4d1b6739 --- /dev/null +++ b/layouts/partials/product/car-harness-description.html @@ -0,0 +1,9 @@ +{{- /* CarHarness.svelte description slot, ported verbatim from the prerendered + build/shop/car-harness.html (data-svelte-h attributes dropped). The + YouTube iframe is EAGERLY loaded on purpose — same as the old site. */ -}} +{{- `Description

The car harness is our universal interface to your car. Use the car + harness to connect your comma device to your vehicle.

We designed it to be invisible in your car while being easy to install and + use. Car harness allows seamlessly switching back + to the stock system when unplugging your comma device.


Highlights
  • Stealth install; car parts remain in place, no messy cables
  • Easy to set up; watch us do it in 3 minutes + here

What's in the box?

Each vehicle has a specific harness based on make, model and year. Each + kit includes the following:

  • comma power
  • harness connector
  • harness box

Exceptions to the above include:

OBD II

  • OBD-II connector
  • long OBD-C cable (9.5 ft)

Rivian A, Ford Q4, Nissan, and J533

  • comma power
  • harness connector
  • harness box
  • long OBD-C cable (9.5 ft)

Tesla A, Tesla B

  • harness connector
  • harness box
  • long OBD-C cable (9.5 ft)
` | safeHTML -}} diff --git a/layouts/partials/product/car-harness-notes.html b/layouts/partials/product/car-harness-notes.html new file mode 100644 index 00000000..41fa1480 --- /dev/null +++ b/layouts/partials/product/car-harness-notes.html @@ -0,0 +1,6 @@ +{{- /* CarHarness.svelte notes slot — two NoteCards (plain-text slots, so no + trailing space after the body text, unlike products.json notes). */ -}} +{{- partial "product/note-card.html" (dict "title" "Compatibility" "contentHTML" "Harness compatibility based on the US car market.") -}} +{{ partial "product/note-card.html" (dict "title" "Note" "contentHTML" `Does not include the + OBD-C cable, sold + separately.`) -}} diff --git a/layouts/partials/product/comma-four-accessory.html b/layouts/partials/product/comma-four-accessory.html new file mode 100644 index 00000000..647f0423 --- /dev/null +++ b/layouts/partials/product/comma-four-accessory.html @@ -0,0 +1,15 @@ +{{- /* + CommaFour.svelte price-accessory slot (scope svelte-1qobqhj): badges row, + divider, harness prompt, the harness selector (377 rows: NO_HARNESS first, + then 333 vehicles + 43 generic harnesses) and the $250 trade-in CheckboxCard + (CheckboxCard.svelte scope svelte-3bw1mc over a NoteCard svelte-1328bir). + Rendered through product/product.html's `variantSelector` hook so it lands + right after the price slot, exactly where the prerendered span sits. + Initial SSR state: no "$xxx due today" span (trade-in unchecked), checkbox + unchecked + disabled (class string "checkbox-card svelte-3bw1mc disabled" + — double space from the empty `checked` slot — and ` disabled` on the + input where `checked` would go). assets/js/pages/comma-four.js mutates all + of it at runtime. +*/ -}} +
Free rush shipping

Select a harness to connect the comma four to your car. {{ partial "product/harness-selector.html" (dict "label" "Select your car" "showNoHarnessOption" true) }}
diff --git a/layouts/partials/product/comma-four-description.html b/layouts/partials/product/comma-four-description.html new file mode 100644 index 00000000..4a1a66c7 --- /dev/null +++ b/layouts/partials/product/comma-four-description.html @@ -0,0 +1,16 @@ +{{- /* + CommaFour.svelte description slot: the three buy-box accordions + (Accordion.svelte scope svelte-f0pxdy, items/labels/details scope + svelte-1qobqhj). Pure-CSS open/close, no hash behavior (unlike the FAQ + accordions further down the page). The old build baked random hex ids + (e.g. 67c15e396205d.4); the port uses stable slugs — the normalize harness + canonicalizes Accordion ids, and the only hard requirement is + input[name][id] == label[for] and per-page uniqueness. +*/ -}} +
US only. Rush orders are fulfilled on the next business day. +

+ International shipping is $30 flat rate. + See fine print below for details. Common shipping questions are answered on + the FAQ.
See for yourself why Consumer Reports rated us as the + top driver assistance system. + We think you’ll love it, but if you’re not satisfied, send it back for a full refund.
1-year limited warranty against hardware defects. Extend it with commacare.
diff --git a/layouts/partials/product/harness-selector.html b/layouts/partials/product/harness-selector.html new file mode 100644 index 00000000..de121f01 --- /dev/null +++ b/layouts/partials/product/harness-selector.html @@ -0,0 +1,73 @@ +{{- /* + HarnessSelector.svelte (scope svelte-1dmkgpz; rows HarnessDropdownItem.svelte + scope svelte-1c3kfyc) — closed/empty initial state, with every dropdown row + prerendered (vehicles.json × car_harnesses.json join, vehicles first in the + raw file order of vehicles.json makes, then the generic/developer harnesses + in car_harnesses.json order; `comma body` skipped). + + Args (dict, all optional): + label placeholder label (default "Select vehicle") + placeholder search input placeholder + (default "Search for a vehicle or harness") + showNoHarnessOption prepend the "I already have a car harness (‑$50)" + row (comma-four only; default false) + showGenericHarnesses exclude the developer/generic-make harnesses when + false (HarnessSelector.svelte showGenericHarnesses + prop -> vehicleHarnesses store; /setup; default true) + prerenderRows when false, emit the empty dropdown-content the old + build shipped on pages whose rows were 100% + client-rendered (/setup); the metadata config tag is + still emitted and assets/js/lib/harness-selector.js + builds the rows after the stock fetch (default true) + + Runtime metadata (one object per rendered row, in DOM order, mirroring the + harness objects built by src/lib/utils/harnesses.js) is embedded in a + diff --git a/layouts/partials/product/note-card.html b/layouts/partials/product/note-card.html new file mode 100644 index 00000000..2d9bb2b2 --- /dev/null +++ b/layouts/partials/product/note-card.html @@ -0,0 +1,13 @@ +{{- /* + NoteCard.svelte (scope svelte-1328bir). + Args (dict): + title card label (plain text) + contentHTML inner HTML of the body
— pass EXACTLY what should land + between
and
(products.json notes carry a trailing + space after the {@html} block in the old SSR output; plain-text + slots like the Shipping card do not — the caller decides) + icon optional icon path under assets/icons (default "ui/info.svg") + elevated optional bool — adds the `elevated` class (unused on shop pages) +*/ -}} +{{- $icon := .icon | default "ui/info.svg" -}} +
{{ partial "icon.html" $icon }}
{{ .title }}
{{ .contentHTML | safeHTML }}
diff --git a/layouts/partials/product/product.html b/layouts/partials/product/product.html new file mode 100644 index 00000000..79163734 --- /dev/null +++ b/layouts/partials/product/product.html @@ -0,0 +1,96 @@ +{{- /* + Product.svelte (scope svelte-vml9z1) + Select.svelte (svelte-zt3auu) + + Grid/Button/NoteCard wrappers — the generic product component used by every + /shop/ page (and reused by the comma-four / body / setup slices). + + Args (dict): + key product key in data/products.json (e.g. "panda") + product the data/products.json entry + snapshot build-time Shopify product (partial product/shopify-snapshot.html) + + Optional overrides (defaults follow src/routes/shop/[product]/+page.svelte): + autoSelectFirstVariant bool, default true (car-harness passes false) + variantSelector partial path rendered instead of the variant + image + - -
- -
-
- - diff --git a/src/lib/components/Badge.svelte b/src/lib/components/Badge.svelte deleted file mode 100644 index e62204a3..00000000 --- a/src/lib/components/Badge.svelte +++ /dev/null @@ -1,39 +0,0 @@ - - -
- -
- - diff --git a/src/lib/components/Button.svelte b/src/lib/components/Button.svelte deleted file mode 100644 index 1ceaf1e0..00000000 --- a/src/lib/components/Button.svelte +++ /dev/null @@ -1,88 +0,0 @@ - - - - - diff --git a/src/lib/components/CheckboxCard.svelte b/src/lib/components/CheckboxCard.svelte deleted file mode 100644 index e87bd08d..00000000 --- a/src/lib/components/CheckboxCard.svelte +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/src/lib/components/CommunityBanner.svelte b/src/lib/components/CommunityBanner.svelte deleted file mode 100644 index 6cea5333..00000000 --- a/src/lib/components/CommunityBanner.svelte +++ /dev/null @@ -1,46 +0,0 @@ - - - -
- {@html DiscordIcon} - Join the conversation -

- Have a question or want to learn more? - There are thousands of knowledgeable community members on the Discord. -

- - Join our Discord - -
-
- {@html GitHubIcon} - Developer Resources -

- Check out the code behind the comma four and openpilot. - Review, fork, and contribute to the open source ecosystem. -

- - Visit our GitHub - -
-
- - diff --git a/src/lib/components/Faq.svelte b/src/lib/components/Faq.svelte deleted file mode 100644 index 5ce877a8..00000000 --- a/src/lib/components/Faq.svelte +++ /dev/null @@ -1,126 +0,0 @@ - - -
-
- -

{title ?? topic.title}

-
- {title ?? topic.title} banner -
-
-
-
- {#each topic.questions as entry} - {@const id = entry.question.toLowerCase().replace(/[^\w\s]/g, '').replaceAll(' ', '-')} - handleExpand(id)} {id}> -
- {entry.question} -
-
- {@html entry.answer} -
-
-
- {/each} -
-
- - diff --git a/src/lib/components/FeaturedArticles.svelte b/src/lib/components/FeaturedArticles.svelte deleted file mode 100644 index 4d7340c1..00000000 --- a/src/lib/components/FeaturedArticles.svelte +++ /dev/null @@ -1,92 +0,0 @@ - - - - - diff --git a/src/lib/components/FeaturedCarsList.svelte b/src/lib/components/FeaturedCarsList.svelte deleted file mode 100644 index 35632668..00000000 --- a/src/lib/components/FeaturedCarsList.svelte +++ /dev/null @@ -1,119 +0,0 @@ - - -
- {#each featuredCars as car} -
- -
-
{car.make} {car.model}
-
{car.year}
-
-
-
- {/each} -
- - diff --git a/src/lib/components/Grid.svelte b/src/lib/components/Grid.svelte deleted file mode 100644 index 4298d1bb..00000000 --- a/src/lib/components/Grid.svelte +++ /dev/null @@ -1,71 +0,0 @@ - - -
- -
- - diff --git a/src/lib/components/HarnessSelector/HarnessDropdownItem.svelte b/src/lib/components/HarnessSelector/HarnessDropdownItem.svelte deleted file mode 100644 index e55083ef..00000000 --- a/src/lib/components/HarnessSelector/HarnessDropdownItem.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - - - - diff --git a/src/lib/components/HarnessSelector/HarnessSelector.svelte b/src/lib/components/HarnessSelector/HarnessSelector.svelte deleted file mode 100644 index 4c679cdd..00000000 --- a/src/lib/components/HarnessSelector/HarnessSelector.svelte +++ /dev/null @@ -1,282 +0,0 @@ - - - - -{#if selection && selection.package && !hideSupportNoteCard} - - {@html selection.package === 'All' ? - 'openpilot will work with all packages and trims of this car.' : - `openpilot requires ${selection.car} to come equipped with ${selection.package}.` - } - -{/if} - - - diff --git a/src/lib/components/HeaderBanner.svelte b/src/lib/components/HeaderBanner.svelte deleted file mode 100644 index 6f8a58b4..00000000 --- a/src/lib/components/HeaderBanner.svelte +++ /dev/null @@ -1,51 +0,0 @@ - - - diff --git a/src/lib/components/HeaderMenu.svelte b/src/lib/components/HeaderMenu.svelte deleted file mode 100644 index a300b14f..00000000 --- a/src/lib/components/HeaderMenu.svelte +++ /dev/null @@ -1,199 +0,0 @@ - - - - - diff --git a/src/lib/components/LinkButton.svelte b/src/lib/components/LinkButton.svelte deleted file mode 100644 index bef9b135..00000000 --- a/src/lib/components/LinkButton.svelte +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - diff --git a/src/lib/components/MailingListForm.svelte b/src/lib/components/MailingListForm.svelte deleted file mode 100644 index f5a90b1f..00000000 --- a/src/lib/components/MailingListForm.svelte +++ /dev/null @@ -1,144 +0,0 @@ - - -{#if !completed} -
- - - -
-{:else} - {#await submissionPromise then response} -
-

Thanks for signing up! We only send emails we would want to receive.

-
- {:catch error} -
-

Oops! Something went wrong while submitting the form.

-

{@html error.message}

-
- {/await} -{/if} - diff --git a/src/lib/components/Modal.svelte b/src/lib/components/Modal.svelte deleted file mode 100644 index 3d113034..00000000 --- a/src/lib/components/Modal.svelte +++ /dev/null @@ -1,76 +0,0 @@ - - -{#if show} -
- -
-{/if} - - diff --git a/src/lib/components/NoteCard.svelte b/src/lib/components/NoteCard.svelte deleted file mode 100644 index db756456..00000000 --- a/src/lib/components/NoteCard.svelte +++ /dev/null @@ -1,75 +0,0 @@ - - -
-
- - {@html icon} - -
-
- {title} -
- -
-
-
- - diff --git a/src/lib/components/Product.svelte b/src/lib/components/Product.svelte deleted file mode 100644 index 0199b3c2..00000000 --- a/src/lib/components/Product.svelte +++ /dev/null @@ -1,287 +0,0 @@ - - -{#if product} - -
-
- product preview -
- {#if product?.images?.length > 1} -
- {#each product?.images as image, i} - - {/each} -
- {/if} -
-
-
-
-

{product?.title}

-
- - {priceLabel} - -
- - {#if VariantSelector} - - {:else} - {#if variants.length > 1} - - - {/if} - {/if} -
- - - - {#if product?.freeRush} - Free Rush (UPS 2nd Day Air) shipping. $30 flat rate internationally. - {:else} - Free US shipping, $30 flat rate internationally. - {/if} - - - -
-
- -
-
-
-
-{/if} - - diff --git a/src/lib/components/ProductCard.svelte b/src/lib/components/ProductCard.svelte deleted file mode 100644 index 94905451..00000000 --- a/src/lib/components/ProductCard.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - - - {product.title} product -
-
-

{product.title}

- {product.price ?? 0} -
- Buy -
-
- - diff --git a/src/lib/components/ProductDescriptions/CarHarness.svelte b/src/lib/components/ProductDescriptions/CarHarness.svelte deleted file mode 100644 index bfd49db3..00000000 --- a/src/lib/components/ProductDescriptions/CarHarness.svelte +++ /dev/null @@ -1,83 +0,0 @@ - - - -
- - Harness compatibility based on the US car market. - - - Does not include the - OBD-C cable, sold - separately. - -
- -
- Description -

- The car harness is our universal interface to your car. Use the car - harness to connect your comma device to your vehicle. -

-

- We designed it to be invisible in your car while being easy to install and - use. Car harness allows seamlessly switching back - to the stock system when unplugging your comma device. -

-
- -
-
- Highlights -
    -
  • Stealth install; car parts remain in place, no messy cables
  • -
  • - Easy to set up; watch us do it in 3 minutes - - here - -
  • -
-
- What's in the box? -

- Each vehicle has a specific harness based on make, model and year. Each - kit includes the following: -

-
    -
  • comma power
  • -
  • harness connector
  • -
  • harness box
  • -
-

Exceptions to the above include:

-

OBD II

-
    -
  • OBD-II connector
  • -
  • long OBD-C cable (9.5 ft)
  • -
-

Rivian A, Ford Q4, Nissan, and J533

-
    -
  • comma power
  • -
  • harness connector
  • -
  • harness box
  • -
  • long OBD-C cable (9.5 ft)
  • -
-

Tesla A, Tesla B

-
    -
  • harness connector
  • -
  • harness box
  • -
  • long OBD-C cable (9.5 ft)
  • -
-
-
diff --git a/src/lib/components/ProductDescriptions/CommaFour.svelte b/src/lib/components/ProductDescriptions/CommaFour.svelte deleted file mode 100644 index 50ad9e4c..00000000 --- a/src/lib/components/ProductDescriptions/CommaFour.svelte +++ /dev/null @@ -1,306 +0,0 @@ - - - - - -
- -
- {#if tradeInChecked && tradeInCredit > 0} - {formatCurrency({ amount: priceAfterTradeIn, currencyCode: 'USD' }, 0)} after trade-in received - {:else if showDiscount && discountAmount > 0} - {formatCurrency({ amount: priceDueToday, currencyCode: 'USD' }, 0)} - {:else} - {formatCurrency({ amount: FOUR_PRICE, currencyCode: 'USD' }, 0)} - {/if} -
- - -
- Free rush shipping - {#if tradeInChecked && tradeInCredit > 0} - {formatCurrency({ amount: priceDueToday, currencyCode: 'USD' }, 0)} due today - {/if} -
- -
- - Select a harness to connect the comma four to your car. - - - - Get $250 credit when you trade in your old comma device. Any comma device, in any condition. - Instructions and Terms - -
- -
- - You do not need a new car harness. All comma devices use the same harness. - -
- -
-
- -
-
{@html ShippingIcon}
- Free Rush (UPS 2nd Day Air) shipping -
-
- US only. Rush orders are fulfilled on the next business day. -

- International shipping is $30 flat rate. - See fine print below for details. Common shipping questions are answered on - the FAQ. -
-
-
-
- -
-
{@html MoneyBackGuaranteeIcon}
- Try our 30-day money-back trial -
-
- See for yourself why Consumer Reports rated us as the - top driver assistance system. - We think you’ll love it, but if you’re not satisfied, send it back for a full refund. -
-
-
-
- -
-
{@html WarrantyIcon}
- 1-year hardware warranty -
-
- 1-year limited warranty against hardware defects. Extend it with commacare. -
-
-
-
-
- - showDisclaimerModal = false} - bind:show={showDisclaimerModal} - primaryButtonText={backordered ? `Add to cart (ships in ${backordered})` : "Add to cart"} -> - {#if additionalProductIds.length === 0} -

- A car harness is required to connect the comma four to your vehicle. - You currently have no car harness selected. -

- {/if} -

- The comma four does not ship with any software. - Once you have the device you will be able to install any software you choose at your own risk. -

-

- Regardless of what software you choose to install, this device in no way substitutes for a licensed, sober, and attentive driver in the drivers seat. - If you are not going to always pay careful attention while driving, do not buy this product. -

-
- - diff --git a/src/lib/components/ReleaseNote.svelte b/src/lib/components/ReleaseNote.svelte deleted file mode 100644 index cd195930..00000000 --- a/src/lib/components/ReleaseNote.svelte +++ /dev/null @@ -1,47 +0,0 @@ - - -
- - {releaseNote.title} feature highlights -
-
- {releaseNote.date} - {releaseNote.title} -
-

{releaseNote.excerpt}

-
-
-
- - diff --git a/src/lib/components/SectionHeader.svelte b/src/lib/components/SectionHeader.svelte deleted file mode 100644 index 6fdaafff..00000000 --- a/src/lib/components/SectionHeader.svelte +++ /dev/null @@ -1,43 +0,0 @@ - - -
-
{leftLabel}
-
- {#if rightIcon} -
{@html rightIcon}
- {:else} -
{rightLabel}
- {/if} -
- - diff --git a/src/lib/components/Select.svelte b/src/lib/components/Select.svelte deleted file mode 100644 index e91e60fb..00000000 --- a/src/lib/components/Select.svelte +++ /dev/null @@ -1,38 +0,0 @@ - - -
- -
- - diff --git a/src/lib/components/SetupGuide.svelte b/src/lib/components/SetupGuide.svelte deleted file mode 100644 index a7aedc6b..00000000 --- a/src/lib/components/SetupGuide.svelte +++ /dev/null @@ -1,77 +0,0 @@ - - - -
-
- {productName} -

{title}

-
-
-
- {@html ImmediateIcon} - {estimatedMinutes} min -
-
- View Guide -
-
- {productName} -
-
- - diff --git a/src/lib/components/SetupStep.svelte b/src/lib/components/SetupStep.svelte deleted file mode 100644 index 452b2413..00000000 --- a/src/lib/components/SetupStep.svelte +++ /dev/null @@ -1,154 +0,0 @@ - - -
-
step {stepNumber}
-
- {#if images.length > 0} -
- {#if images.length > 0} - {header - {/if} - {#each images.slice(1) as img} - {header - {/each} -
- {/if} -
- {#if header} -
{header}
- {/if} - {#if body} -
{@html body}
- {/if} -
- {#if images.length > 1} -
- {#each images.slice(1) as img} - {header - {/each} -
- {/if} -
-
- - - diff --git a/src/lib/components/ShoppingCart.svelte b/src/lib/components/ShoppingCart.svelte deleted file mode 100644 index 28cc237b..00000000 --- a/src/lib/components/ShoppingCart.svelte +++ /dev/null @@ -1,220 +0,0 @@ - - -