Skip to content

feat: DR-7730 About page#7719

Open
carlagn wants to merge 10 commits intomainfrom
feat/DR-7730-about
Open

feat: DR-7730 About page#7719
carlagn wants to merge 10 commits intomainfrom
feat/DR-7730-about

Conversation

@carlagn
Copy link
Contributor

@carlagn carlagn commented Mar 27, 2026

Summary by CodeRabbit

  • New Features

    • Added a full "About" page with hero, investor highlights, values, masonry image gallery, and team CTA.
    • New responsive masonry gallery component and per-card alignment options for improved layout control.
  • Chores

    • Added runtime packages for masonry and prop validation.
    • Integrated client-side assets for analytics, surveys, consent/banner, feedback toolbar, referral/tracking, and related UI/styles.

@vercel
Copy link

vercel bot commented Mar 27, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
blog Ready Ready Preview, Comment Mar 27, 2026 2:26pm
docs Ready Ready Preview, Comment Mar 27, 2026 2:26pm
eclipse Ready Ready Preview, Comment Mar 27, 2026 2:26pm
site Error Error Mar 27, 2026 2:26pm

Request Review

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 27, 2026

Walkthrough

Adds an "about" page and supporting UI components, multiple new public CSS and JS assets (styling bundles, consent/analytics/survey/tracking scripts, webpack chunks), and two package dependencies to enable a responsive masonry gallery.

Changes

Cohort / File(s) Summary
Dependencies
apps/site/package.json
Added runtime dependencies: react-responsive-masonry ^2.7.1, prop-types ^15.8.1.
About page
apps/site/src/app/about/page.tsx
New Next.js route exporting metadata and default About page with hero, investor/team sections, masonry gallery, CTAs.
Components
apps/site/src/components/careers/masonry.tsx, apps/site/src/components/homepage/card-section/card-section.tsx
Added MasonryPict component using ResponsiveMasonry; extended TwoColumnItem with optional alignItems prop and applied in CardSection.
Styling bundles
apps/site/public/illustrations/about/prisma_files/*\.css
Added numerous CSS assets providing normalize baseline, global variables, typography, responsive rules, animations/keyframes, SVG reveal transitions, utility/minified classes and theme tokens.
Consent / Cookie handling
apps/site/public/illustrations/about/prisma_files/banner.js, script.js
Added CookieYes banner and consent management scripts, consent state storage, content blocking logic and placeholder behavior for blocked embeds.
Analytics / Remote config
apps/site/public/illustrations/about/prisma_files/config.js, surveys.js
Added PostHog remote config and bundled PostHog Surveys runtime (survey rendering, targeting, lifecycle events, global extension hooks).
Third‑party integrations / tracking
apps/site/public/illustrations/about/prisma_files/feedback.js, tolt.js, uwt.js, f.txt, webpack-6e25fd0d2f931c77.js
Added Vercel live feedback widget, Tolt referral/Stripe integration, UWT/Twitter pixel and helper wrappers, generic tracking snippet, and conditional Vercel toolbar loader.
Build/runtime chunks
apps/site/public/illustrations/about/prisma_files/layout-cf24a85dfe968efb.js, main-app-4bd62aea08e7cb65.js
Added Webpack/Next.js chunk bundles for layout wrapper (head preloads, structured data, UTM persistence) and main app bootstrapping.
Misc public assets
`apps/site/public/illustrations/about/prisma_files/*.(js
txt)`

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: DR-7730 About page' is directly related to the main change—a new About page component and route added to the site.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@argos-ci
Copy link

argos-ci bot commented Mar 27, 2026

The latest updates on your projects. Learn more about Argos notifications ↗︎

Build Status Details Updated (UTC)
default (Inspect) ✅ No changes detected - Mar 27, 2026, 2:32 PM

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 12

🧹 Nitpick comments (1)
apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css (1)

1-1: Prefer shipping source CSS (or preserve readable build artifact) for maintainability.

On Line 1, having a single-line minified stylesheet in the repo makes review/debugging extremely hard and increases risk when future edits are needed. Prefer committing source styles (or non-minified artifact) and generating minified output in build/deploy.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css` at
line 1, The committed file is a single-line minified stylesheet (e.g. classes
like _1jljjz60, ruictu26, r3ds9x1) which is hard to review and maintain; replace
this minified CSS with the original source (precompiled SASS/LESS/PostCSS) or a
beautified/unminified CSS build artifact, and update the repo to store the
readable source alongside generated outputs (and/or add the minified file to
CI/build artifacts rather than committing it). Ensure classes referenced in the
codebase (such as ._1jljjz60, .ruictu26, .r3ds9x1) continue to match the
compiled output and add a source map or link to the build pipeline so
minification happens during CI/deploy instead of in the repo.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/site/public/illustrations/about/prisma_files/f.txt`:
- Line 1: The bundle currently calls s.ss_(...) immediately which triggers D/F/E
and sends Google Ads beacons; modify the code so the final s.ss_(window,
'OjE3...',['https://www.google.com/...', ...], []) invocation only runs after a
marketing consent check (e.g., call a hasMarketingConsent() or
getUserConsent('marketing') function). Specifically, locate the IIFE that
defines D, E, F and the final s.ss_ call and wrap that final invocation in a
conditional that verifies marketing consent before calling s.ss_, and ensure
D/F/E still safely no-op or queue when consent is denied to avoid runtime
errors.

In `@apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css`:
- Line 1: The generated CSS bundle contains many Stylelint violations (see long
selector names like ._1jljjz60, ._1jljjz61, etc.), so either fix the generator
output (ensure font-family values, url() quoting, and deprecated properties are
corrected at the source that emits these hashed/minified classes) or exclude
generated bundles from strict linting by adding an ignore rule/pattern to your
Stylelint config (e.g., via ignoreFiles or .stylelintignore) that matches the
hashed/minified CSS outputs (the files that include selectors like ._1jljjz60),
so the CI lint step no longer blocks merges.
- Line 1: The file contains invalid top-level nested selectors like
"(._1jljjz67:hover) &:before{...}" which browsers drop; find occurrences of
those patterns (e.g. the invalid selectors referencing ._1jljjz67, ._1jljjz6d,
._1jljjz6f, ._1jljjz68, ._1jljjz69) and replace them with valid, flattened
selectors: remove the parentheses and the "&" and compose a proper selector that
expresses the intended relationship (for example "._1jljjz67:hover:before" or,
if the pseudo-element is on a child, "._1jljjz67:hover .<child-class>:before");
if this CSS is generated, fix the generator configuration to emit flattened
selectors instead of nested "&" at top level.

In
`@apps/site/public/illustrations/about/prisma_files/layout-cf24a85dfe968efb.js`:
- Line 1: Remove or document the unused production bundle file
layout-cf24a85dfe968efb.js inside the public/illustrations/about/prisma_files/
directory: if this is an accidental CMS/export artifact, delete the file (and
similar dated content-hash artifacts) and update the commit to remove them; if
this directory is an intentional CMS cache layer, add documentation (README)
explaining its purpose and add an entry to .gitignore or repository docs to
prevent future accidental commits; reference the prisma_files directory and the
layout-cf24a85dfe968efb.js filename when making the change so reviewers can
verify the removal or added documentation.

In `@apps/site/public/illustrations/about/prisma_files/tolt.js`:
- Line 1: The signup handler in function f sets window.tolt_data.customer_id
without ensuring window.tolt_data exists and always uses a 30-day TTL; update
the "signup" branch inside f (the expression that currently does "return
'signup'===e&&r.customer_id&&(window.tolt_data.customer_id=r.customer_id,u('tolt_data',window.tolt_data,30)),r")
to first ensure window.tolt_data is an object (create it if null), assign
customer_id into it, and call u('tolt_data', window.tolt_data, ttl) where ttl
preserves an existing window.tolt_data.cookie_duration or uses r.cookie_duration
if present, falling back to 30 only as a last resort; reference symbols:
function f, helper u, and global window.tolt_data.
- Line 1: The code posts full window.location.href and document.referrer when
building the referral payload (see the block that creates the local variable i
assigned from window.location.href and the object literal
{public_id:s,param:r,code:...,page:i,referrer:document?.referrer}); change these
to sanitized versions that strip query strings and fragments (e.g. use
location.origin + location.pathname for the current page and parse
document.referrer with URL to keep only origin+pathname) before placing them
into the payload, and also ensure any other places referencing
window.location.href or document.referrer (e.g. where click/signup payloads are
assembled) use the same sanitized values.
- Line 1: The psl script onerror handler only logs the error and never calls the
initialization callback t, preventing the fallback path in the self-invoking
initializer from running; update the onerror handler for the created script
element (variable e) so it calls the same init callback t() after logging the
error (or invokes the initializer directly) to ensure the code path that uses
window.location.hostname runs even when psl fails to load; reference the script
element variable e, its onerror handler, and the init callback t in your change
(ensure any existing console.error("Failed to load the PSL script") remains).

In `@apps/site/src/app/about/page.tsx`:
- Around line 208-216: The card object with icon "fa-regular fa-cubes-stacked"
has a mismatched title "Built on open source" versus a description about Data
DX; update the title in that card (the object containing icon/title/description)
to reflect the body copy (e.g., "Built on Data DX" or "Data DX principles") so
the heading and description match across the hero grid.
- Around line 333-336: The /about page is reusing SITE_HOME_TITLE and
SITE_HOME_DESCRIPTION (from blog-metadata) which are home-specific; update the
exported metadata object in page.tsx to use about-specific values instead:
either create and import new constants (e.g., SITE_ABOUT_TITLE,
SITE_ABOUT_DESCRIPTION) from a new or existing about-metadata module, or replace
the values with the correct about page strings inline in the metadata export;
ensure the symbol metadata in page.tsx references the new about constants (not
SITE_HOME_TITLE/SITE_HOME_DESCRIPTION) so search engines and previews show the
correct copy.
- Around line 494-497: The footer CTA using the Button component rendering the
text "View open positions" is inert; make it navigate to the careers page by
either wrapping the Button with a Link (next/link) pointing to the desired route
(e.g. "/careers" or external jobs URL) or by adding an onClick that calls
router.push("/careers"); update the element that contains Button in
apps/site/src/app/about/page.tsx (the Button instance with the <i
className="fa-regular fa-arrow-right ml-2" />) to perform the navigation so the
CTA is actionable.
- Around line 135-145: Remove the pasted OSS nomination copy that follows the
climate action list: delete the <ul> with the three <li> items starting with
"Usage within Prisma..." and the trailing <h6> that begins "Projects owned or
managed by Prisma employees cannot be nominated." (these strings appear in
page.tsx within the climate accordion). Replace them with the intended
climate-specific content or simply remove the block so the accordion shows only
climate-related items.

In `@apps/site/src/components/careers/masonry.tsx`:
- Around line 20-27: The Image tiles currently hardcode alt="hello" inside the
images.map rendering; update the Image component to use each item's alt text
(e.g., replace alt="hello" with alt={e.imageAlt ?? ''} or alt={e.alt ?? ''}
depending on your data shape) so each image announces its own descriptive text,
and fallback to an empty string when the image is decorative or no alt provided.

---

Nitpick comments:
In `@apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css`:
- Line 1: The committed file is a single-line minified stylesheet (e.g. classes
like _1jljjz60, ruictu26, r3ds9x1) which is hard to review and maintain; replace
this minified CSS with the original source (precompiled SASS/LESS/PostCSS) or a
beautified/unminified CSS build artifact, and update the repo to store the
readable source alongside generated outputs (and/or add the minified file to
CI/build artifacts rather than committing it). Ensure classes referenced in the
codebase (such as ._1jljjz60, .ruictu26, .r3ds9x1) continue to match the
compiled output and add a source map or link to the build pipeline so
minification happens during CI/deploy instead of in the repo.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d9795d65-2682-4268-9296-897c42aa31c0

📥 Commits

Reviewing files that changed from the base of the PR and between 6f79795 and 343649d.

⛔ Files ignored due to path filters (71)
  • apps/site/public/icons/companies/about/altimeter.svg is excluded by !**/*.svg
  • apps/site/public/icons/companies/about/amplify.svg is excluded by !**/*.svg
  • apps/site/public/icons/companies/about/fathom.svg is excluded by !**/*.svg
  • apps/site/public/icons/companies/about/ivp.svg is excluded by !**/*.svg
  • apps/site/public/icons/companies/about/kleiner-perkins.svg is excluded by !**/*.svg
  • apps/site/public/icons/companies/about/system-one.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/about_0.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/about_0_light.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/about_1.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/about_1_light.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/hero_bg.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/hero_bg_light.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/01d73ffd0742aee4bb8f5094755bbf4c8a6f83d5-225x225.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/0296c63e6cb358789ee2e8e8bbe373b5be0d2b21-200x200.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/07c17958b386a607bfce5428de6ee46ec751a91a-3792x2845.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/0db0ed93bc58ad5cf6985a3e781a32b6d948c43e-519x680.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/0e8b284f045c3aa0c3f389678402137028920c68-461x263.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/10bfd6ecaa49258e970f665796456121df77f3fe-2048x1365.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/1b3698c250765f09e18bbf2b799e683c4cd54947-178x29.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/1c34bce335f90fe52fb95c1df232caa3bb637588-200x200.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/2e019733d341be788cc69ef340d8a3140f5383e4-227x222.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/354e0720283c6c4d95a40a351f4d56756d28dceb-400x400.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/394d186f400227fff5e71467b6161836f20fd06a-188x188.png is excluded by !**/*.png
  • apps/site/public/illustrations/about/prisma_files/42c637eaaed5341ca3d58401a6df89d4b7f78cd8-2758x4142.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/4bd99e8b741a8134cb0684ff92e091398d6d6a6c-300x300.png is excluded by !**/*.png
  • apps/site/public/illustrations/about/prisma_files/6614514c52c46a2c0dca3387761dfbf110ea6e8f-53x40.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/6ddac71dbf7aef73e7ac36a4c1e2991af1d51568-245x24.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/6f2151ed08d45abd2e313f97d2961b01cfcfab0b-461x263.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/7a8b63cf5b1857d758c2cedf8abae7bf46a4fb5d-2196x1464.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/815e3639bf5015b8fb73c8e04ba013ae2e308d26-400x400.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/9435edc784d96be94591febcbeba2ddcef634f0d-3024x4032.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/9dde2ecce5c1a7eb6d26bcd67a9977a3bf6add84-240x239.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/a287aa7afa807276e1c1b2f4f066bc39d4812750-170x29.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/a7d8e10d8a79776b14ef16aa697ee5aed11eada3-1000x667.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/a92221e0f1209b27e3e08e0c7585a602498170e3-126x126.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/a97e3b4e19dbcd0ffe56405050ced0a2cab2b1e1-400x400.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/aa05e441e8ce81c2b660fbce6ce333e06482d97b-6000x4000.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/ab64fadb9a1e6b2dc4d7a85aee7da95a54358d70-300x300.png is excluded by !**/*.png
  • apps/site/public/illustrations/about/prisma_files/ab8da63ccc0309c00b55e2b87a5c834f5e39b68b-227x222.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/bd84f47217c32edff355162d73d991f0d533eac2-502x683.png is excluded by !**/*.png
  • apps/site/public/illustrations/about/prisma_files/cb32ce5bc133b0f22f8e8416a6e897ea84c7715b-139x31.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/close.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/d030a86003f4ccda292bdcb7ff5dfbb4e03066a3-200x200.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/dd6ee90c01850a6e35416bf7a3c087c6725c5461-200x113.png is excluded by !**/*.png
  • apps/site/public/illustrations/about/prisma_files/fd62c80d50a331ecf48d34e10ef78e3b938a6a34-6118x4079.jpg is excluded by !**/*.jpg
  • apps/site/public/illustrations/about/prisma_files/fd6f119163e2aaeac4bbcab5e947e5849555281a-124x35.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/gdpr.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/hipaa.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/insight.min.js is excluded by !**/*.min.js
  • apps/site/public/illustrations/about/prisma_files/iso27.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/logo-white.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/about/prisma_files/psl.min.js is excluded by !**/*.min.js
  • apps/site/public/illustrations/about/prisma_files/soc2.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/careers/hero_lines.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/careers/hero_lines_light.svg is excluded by !**/*.svg
  • apps/site/public/illustrations/careers/hero_lines_mobile_light.svg is excluded by !**/*.svg
  • apps/site/public/photos/people/adam-gross.jpg is excluded by !**/*.jpg
  • apps/site/public/photos/people/adam-wiggins.jpg is excluded by !**/*.jpg
  • apps/site/public/photos/people/andy-chung.png is excluded by !**/*.png
  • apps/site/public/photos/people/augusto-marietti.jpeg is excluded by !**/*.jpeg
  • apps/site/public/photos/people/christian-bach.png is excluded by !**/*.png
  • apps/site/public/photos/people/guillermo-rauch.jpeg is excluded by !**/*.jpeg
  • apps/site/public/photos/people/james.png is excluded by !**/*.png
  • apps/site/public/photos/people/jeremy-yap.png is excluded by !**/*.png
  • apps/site/public/photos/people/nick-schrock.jpg is excluded by !**/*.jpg
  • apps/site/public/photos/people/nicolas-dessaigne.jpg is excluded by !**/*.jpg
  • apps/site/public/photos/people/philip-moehring.png is excluded by !**/*.png
  • apps/site/public/photos/people/robin-vasan.jpg is excluded by !**/*.jpg
  • apps/site/public/photos/people/spencer-kimball.jpeg is excluded by !**/*.jpeg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (52)
  • apps/site/package.json
  • apps/site/public/illustrations/about/prisma.html
  • apps/site/public/illustrations/about/prisma_files/2815-807c31d5443cd91b.js
  • apps/site/public/illustrations/about/prisma_files/2a6fb28cfeead51d.css
  • apps/site/public/illustrations/about/prisma_files/3f3d7f98fd449ef4.css
  • apps/site/public/illustrations/about/prisma_files/468d1dc45841be39.css
  • apps/site/public/illustrations/about/prisma_files/7615-27c1a37f2e576ab0.js
  • apps/site/public/illustrations/about/prisma_files/7ccc8ba673eb4091.css
  • apps/site/public/illustrations/about/prisma_files/__enzuzo-cookiebar.js
  • apps/site/public/illustrations/about/prisma_files/adsct
  • apps/site/public/illustrations/about/prisma_files/adsct(1)
  • apps/site/public/illustrations/about/prisma_files/banner.js
  • apps/site/public/illustrations/about/prisma_files/be30ea5f-09b6c7eb0dcd4b70.js
  • apps/site/public/illustrations/about/prisma_files/beddc1125f0bc184.css
  • apps/site/public/illustrations/about/prisma_files/c876cebdff8dd769.css
  • apps/site/public/illustrations/about/prisma_files/c8d2c7ba52084189.css
  • apps/site/public/illustrations/about/prisma_files/config.js
  • apps/site/public/illustrations/about/prisma_files/d22b7bbe7e7112a8.css
  • apps/site/public/illustrations/about/prisma_files/ea94d1a48123726c.css
  • apps/site/public/illustrations/about/prisma_files/f.txt
  • apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css
  • apps/site/public/illustrations/about/prisma_files/feedback.js
  • apps/site/public/illustrations/about/prisma_files/gtm.js
  • apps/site/public/illustrations/about/prisma_files/js
  • apps/site/public/illustrations/about/prisma_files/layout-cf24a85dfe968efb.js
  • apps/site/public/illustrations/about/prisma_files/main-app-4bd62aea08e7cb65.js
  • apps/site/public/illustrations/about/prisma_files/polyfills-42372ed130431b0a.js
  • apps/site/public/illustrations/about/prisma_files/posthog-recorder.js
  • apps/site/public/illustrations/about/prisma_files/script.js
  • apps/site/public/illustrations/about/prisma_files/surveys.js
  • apps/site/public/illustrations/about/prisma_files/tolt.js
  • apps/site/public/illustrations/about/prisma_files/uwt.js
  • apps/site/public/illustrations/about/prisma_files/webpack-6e25fd0d2f931c77.js
  • apps/site/public/photos/careers/masonry_1.webp
  • apps/site/public/photos/careers/masonry_10.webp
  • apps/site/public/photos/careers/masonry_11.webp
  • apps/site/public/photos/careers/masonry_12.webp
  • apps/site/public/photos/careers/masonry_13.webp
  • apps/site/public/photos/careers/masonry_14.webp
  • apps/site/public/photos/careers/masonry_2.webp
  • apps/site/public/photos/careers/masonry_3.webp
  • apps/site/public/photos/careers/masonry_4.webp
  • apps/site/public/photos/careers/masonry_5.webp
  • apps/site/public/photos/careers/masonry_6.webp
  • apps/site/public/photos/careers/masonry_7.webp
  • apps/site/public/photos/careers/masonry_8.webp
  • apps/site/public/photos/careers/masonry_9.webp
  • apps/site/public/photos/people/sam-lambert.webp
  • apps/site/public/photos/people/tom-preston-warner.webp
  • apps/site/src/app/about/page.tsx
  • apps/site/src/components/careers/masonry.tsx
  • apps/site/src/components/homepage/card-section/card-section.tsx

@@ -0,0 +1 @@
(function(){var s = {};(function(){var k=typeof Object.defineProperties=="function"?Object.defineProperty:function(a,d,b){if(a==Array.prototype||a==Object.prototype)return a;a[d]=b.value;return a};function l(a){a=["object"==typeof globalThis&&globalThis,a,"object"==typeof window&&window,"object"==typeof self&&self,"object"==typeof global&&global];for(var d=0;d<a.length;++d){var b=a[d];if(b&&b.Math==Math)return b}throw Error("Cannot find global object");} var p=l(this),q=typeof Symbol==="function"&&typeof Symbol("x")==="symbol",r={},t={};function u(a,d,b){if(!b||a!=null){b=t[d];if(b==null)return a[d];b=a[b];return b!==void 0?b:a[d]}} function v(a,d,b){if(d)a:{var c=a.split(".");a=c.length===1;var e=c[0],g;!a&&e in r?g=r:g=p;for(e=0;e<c.length-1;e++){var f=c[e];if(!(f in g))break a;g=g[f]}c=c[c.length-1];b=q&&b==="es6"?g[c]:null;d=d(b);d!=null&&(a?k(r,c,{configurable:!0,writable:!0,value:d}):d!==b&&(t[c]===void 0&&(a=Math.random()*1E9>>>0,t[c]=q?p.Symbol(c):"$jscp$"+a+"$"+c),k(g,t[c],{configurable:!0,writable:!0,value:d})))}} var w=q&&typeof u(Object,"assign")=="function"?u(Object,"assign"):function(a,d){if(a==null)throw new TypeError("No nullish arg");a=Object(a);for(var b=1;b<arguments.length;b++){var c=arguments[b];if(c)for(var e in c)Object.prototype.hasOwnProperty.call(c,e)&&(a[e]=c[e])}return a};v("Object.assign",function(a){return a||w},"es6");/* Copyright The Closure Library Authors. SPDX-License-Identifier: Apache-2.0 */ var x=this||self;var y={};var z=window,A=navigator,C={cache:"no-store",credentials:"include",keepalive:!0,method:"POST",mode:"no-cors",redirect:"follow"};function D(a){if(typeof z.fetch==="function"){var d=u(Object,"assign").call(Object,{},C);try{var b=z.fetch(a,d);if(b)return b.then(function(){}).catch(function(){}),!0}catch(c){}}E(a);return!0}function F(a){var d=new Image(1,1);d.onload=function(){d.onload=null};d.onerror=function(){d.onerror=null};d.src=a} function E(a){try{var d=A.sendBeacon&&A.sendBeacon(a)}catch(c){var b=y.TAGGING;b||(b=y.TAGGING=[]);b[15]=!0}d||F(a)};var G=/#|$/;function H(a){var d=a.search(G),b;a:{for(b=0;(b=a.indexOf("fmt",b))>=0&&b<d;){var c=a.charCodeAt(b-1);if(c==38||c==63)if(c=a.charCodeAt(b+3),!c||c==61||c==38||c==35)break a;b+=4}b=-1}if(b<0)return null;c=a.indexOf("&",b);if(c<0||c>d)c=d;return decodeURIComponent(a.slice(b+4,c!==-1?c:0).replace(/\+/g," "))};function I(a,d,b,c){function e(){--g;if(g<=0){var h;(h=a.GooglebQhCsO)||(h={});var B=h[d];B&&(delete h[d],h=B[0],typeof h==="function"&&h())}}c=c===void 0?[]:c;for(var g=b.length+1,f={g:0};f.g<b.length;f={g:f.g},f.g++){var n=Number(H(b[f.g])),m=null;n!==1&&n!==2||!(n=a.document.getElementById("goog_conv_iframe"))||n.src||(m=n);m||(m=new Image,c&&c[f.g]&&(m.onerror=function(h){return function(){D(c[h.g])&&e()}}(f)));m.onload=e;m.src=b[f.g]}e()} for(var J=["ss_"],K=s||x,L;J.length&&(L=J.shift());)J.length||I===void 0?K[L]&&K[L]!==Object.prototype[L]?K=K[L]:K=K[L]={}:K[L]=I;}).call(this);;s.ss_(window,'OjE3NzQ2MDgyOTE3MTc',['https://www.google.com/pagead/1p-user-list/16616231659/?random\x3d1774608291717\x26cv\x3d11\x26fst\x3d1774605600000\x26bg\x3dffffff\x26guid\x3dON\x26async\x3d1\x26en\x3dgtag.config\x26gtm\x3d45je63p1v897598904z8834999587za20gzb834999587zd834999587xec\x26gcd\x3d13r3r3r2r5l1\x26dma_cps\x3da\x26dma\x3d1\x26tag_exp\x3d0~115938466~115938468~116133313~117384406~117484252\x26u_w\x3d1920\x26u_h\x3d1080\x26url\x3dhttps%3A%2F%2Fwww.prisma.io%2Fabout\x26frm\x3d0\x26tiba\x3dAbout%20%7C%20Prisma\x26did\x3ddNTg2Nz\x26gdid\x3ddNTg2Nz\x26hn\x3dwww.googleadservices.com\x26npa\x3d0\x26pscdl\x3dnoapi\x26auid\x3d1721195419.1767640703\x26uaa\x3darm\x26uab\x3d64\x26uafvl\x3dNot(A%253ABrand%3B8.0.0.0%7CChromium%3B144.0.7559.133%7CGoogle%2520Chrome%3B144.0.7559.133\x26uamb\x3d0\x26uam\x3d\x26uap\x3dmacOS\x26uapv\x3d15.4.1\x26uaw\x3d0\x26data\x3devent%3Dgtag.config%3Bcontent_group%3DWebsite\x26rfmt\x3d3\x26fmt\x3d3\x26is_vtc\x3d1\x26cid\x3dCAQSaQAFq6B9MpOdyRADhLE9m80cPfZeKzshg3pUYBJzYTLElVy3qJ1tAs9_M7ZgkXq4F1dlF-ysxaH7SFcZL65uFpyG-Zhpjvo5G32ewi4L41pYv-VUaAdKiTVlisDHhUIPzStjiIT_qy0uUg\x26random\x3d2876921221\x26rmt_tld\x3d0\x26ipr\x3dy','https://www.google.pt/pagead/1p-user-list/16616231659/?random\x3d1774608291717\x26cv\x3d11\x26fst\x3d1774605600000\x26bg\x3dffffff\x26guid\x3dON\x26async\x3d1\x26en\x3dgtag.config\x26gtm\x3d45je63p1v897598904z8834999587za20gzb834999587zd834999587xec\x26gcd\x3d13r3r3r2r5l1\x26dma_cps\x3da\x26dma\x3d1\x26tag_exp\x3d0~115938466~115938468~116133313~117384406~117484252\x26u_w\x3d1920\x26u_h\x3d1080\x26url\x3dhttps%3A%2F%2Fwww.prisma.io%2Fabout\x26frm\x3d0\x26tiba\x3dAbout%20%7C%20Prisma\x26did\x3ddNTg2Nz\x26gdid\x3ddNTg2Nz\x26hn\x3dwww.googleadservices.com\x26npa\x3d0\x26pscdl\x3dnoapi\x26auid\x3d1721195419.1767640703\x26uaa\x3darm\x26uab\x3d64\x26uafvl\x3dNot(A%253ABrand%3B8.0.0.0%7CChromium%3B144.0.7559.133%7CGoogle%2520Chrome%3B144.0.7559.133\x26uamb\x3d0\x26uam\x3d\x26uap\x3dmacOS\x26uapv\x3d15.4.1\x26uaw\x3d0\x26data\x3devent%3Dgtag.config%3Bcontent_group%3DWebsite\x26rfmt\x3d3\x26fmt\x3d3\x26is_vtc\x3d1\x26cid\x3dCAQSaQAFq6B9MpOdyRADhLE9m80cPfZeKzshg3pUYBJzYTLElVy3qJ1tAs9_M7ZgkXq4F1dlF-ysxaH7SFcZL65uFpyG-Zhpjvo5G32ewi4L41pYv-VUaAdKiTVlisDHhUIPzStjiIT_qy0uUg\x26random\x3d2876921221\x26rmt_tld\x3d1\x26ipr\x3dy'], []);})(); No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Gate this Google Ads beacon behind marketing consent.

This script sends page and device data to Google as soon as it executes, and apps/site/public/illustrations/about/prisma.html:29 loads it via a normal async <script> tag. As written, the About illustration page fires ad-tech tracking without any consent check in this bundle.

🧰 Tools
🪛 LanguageTool

[style] ~1-~1: Using many exclamation marks might seem excessive (in this case: 21 exclamation marks for a text that’s 5252 characters long)
Context: ...hift());)J.length||I===void 0?K[L]&&K[L]!==Object.prototype[L]?K=K[L]:K=K[L]={}:K...

(EN_EXCESSIVE_EXCLAMATION)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/f.txt` at line 1, The
bundle currently calls s.ss_(...) immediately which triggers D/F/E and sends
Google Ads beacons; modify the code so the final s.ss_(window,
'OjE3...',['https://www.google.com/...', ...], []) invocation only runs after a
marketing consent check (e.g., call a hasMarketingConsent() or
getUserConsent('marketing') function). Specifically, locate the IIFE that
defines D, E, F and the final s.ss_ call and wrap that final invocation in a
conditional that verifies marketing consent before calling s.ss_, and ensure
D/F/E still safely no-op or queue when consent is denied to avoid runtime
errors.

@@ -0,0 +1 @@
._1jljjz60{display:inline-flex;justify-content:center;max-width:100%;text-align:left;z-index:10;width:max-content;align-items:center;box-sizing:border-box;border-radius:6px;text-decoration:none;position:relative;line-height:1;font-size:18px}._1jljjz60:disabled{border:none}._1jljjz60:active:disabled,._1jljjz60:disabled{background-color:var(--_1s2yh9l2e);color:var(--_1s2yh9l2h)}._1jljjz61{font-family:system-ui;display:inline-block;transition:transform .15s ease-in-out}._1jljjz60:hover ._1jljjz61{transform:translate(8px,2px)}._1jljjz62{text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:4px}._1jljjz60:focus:after{content:"";position:absolute;border-radius:9px;box-sizing:content-box}._1jljjz63{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:2px;padding-left:10px!important;flex-direction:row-reverse;display:inline-block;line-height:24px;margin-left:12px!important}._1jljjz63:before{right:0}._1jljjz64{text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:2px;padding-right:10px!important;display:inline-block;line-height:24px;margin-right:12px!important}._1jljjz64:before{left:0}._1jljjz65{padding-left:40px!important;flex-direction:row-reverse}._1jljjz65,._1jljjz66{display:inline-block;line-height:24px}._1jljjz66{padding-right:40px!important}._1jljjz67{border:var(--_1s2yh9l63);background-color:var(--_1s2yh9l62);color:var(--_1s2yh9l64);padding:var(--_1s2yh9l65)}._1jljjz67:hover{border:var(--_1s2yh9l66);background-color:var(--_1s2yh9l67);color:var(--_1s2yh9l68)}._1jljjz67:active,._1jljjz67:active:not(:disabled){border:var(--_1s2yh9l69);background-color:var(--_1s2yh9l6a);color:var(--_1s2yh9l6b)}._1jljjz68{border:var(--_1s2yh9l6d);background-color:var(--_1s2yh9l6c);color:var(--_1s2yh9l6e);padding:var(--_1s2yh9l6f)}._1jljjz68:hover{border:var(--_1s2yh9l6g);background-color:var(--_1s2yh9l6h);color:var(--_1s2yh9l6i)}._1jljjz68:active,._1jljjz68:active:not(:disabled){border:var(--_1s2yh9l6j);background-color:var(--_1s2yh9l6k);color:var(--_1s2yh9l6l)}._1jljjz69{border:var(--_1s2yh9l6n);background-color:var(--_1s2yh9l6m);color:var(--_1s2yh9l6o);padding:var(--_1s2yh9l6p)}._1jljjz69:hover{border:var(--_1s2yh9l6q);background-color:var(--_1s2yh9l6r);color:var(--_1s2yh9l6s)}._1jljjz69:active,._1jljjz69:active:not(:disabled){border:var(--_1s2yh9l6t);background-color:var(--_1s2yh9l6u);color:var(--_1s2yh9l6v)}._1jljjz6a{border:1px solid var(--_1s2yh9l31);background-color:transparent;color:var(--_1s2yh9l31);padding:var(--_1s2yh9l65)}._1jljjz6a:active,._1jljjz6a:active:not(:disabled),._1jljjz6a:hover{border:1px solid var(--_1s2yh9l33);background-color:transparent;color:var(--_1s2yh9l33)}._1jljjz6b{border:1px solid var(--_1s2yh9l3a);background-color:transparent;color:var(--_1s2yh9l3a);padding:var(--_1s2yh9l6f)}._1jljjz6b:active,._1jljjz6b:active:not(:disabled),._1jljjz6b:hover{border:1px solid var(--_1s2yh9l3c);background-color:transparent;color:var(--_1s2yh9l3c)}._1jljjz6c{padding:var(--_1s2yh9l6p)}._1jljjz6c,._1jljjz6c:active,._1jljjz6c:active:not(:disabled),._1jljjz6c:hover{border:1px solid #fff;background-color:transparent;color:#fff}._1jljjz6d{border:var(--_1s2yh9l6x);background-color:var(--_1s2yh9l6w);color:var(--_1s2yh9l6y);padding:var(--_1s2yh9l6z)}._1jljjz6d:hover{border:var(--_1s2yh9l70);background-color:var(--_1s2yh9l71);color:var(--_1s2yh9l72)}._1jljjz6d:active,._1jljjz6d:active:not(:disabled){border:var(--_1s2yh9l73);background-color:var(--_1s2yh9l74);color:var(--_1s2yh9l75)}._1jljjz6e{border:1px solid var(--_1s2yh9l2z);background-color:transparent;color:var(--_1s2yh9l2z);padding:var(--_1s2yh9l65)}._1jljjz6e:active,._1jljjz6e:active:not(:disabled),._1jljjz6e:hover{border:1px solid var(--_1s2yh9l31);background-color:transparent;color:var(--_1s2yh9l31)}._1jljjz6f{border:var(--_1s2yh9l77);background-color:var(--_1s2yh9l76);color:var(--_1s2yh9l78);padding:var(--_1s2yh9l79)}._1jljjz6f:hover{border:var(--_1s2yh9l7a);background-color:var(--_1s2yh9l7b);color:var(--_1s2yh9l7c)}._1jljjz6f:active,._1jljjz6f:active:not(:disabled){border:var(--_1s2yh9l7d);background-color:var(--_1s2yh9l7e);color:var(--_1s2yh9l7f)}._1jljjz6g{border:1px solid var(--_1s2yh9l38);background-color:transparent;color:var(--_1s2yh9l38);padding:var(--_1s2yh9l6f)}._1jljjz6g:active,._1jljjz6g:active:not(:disabled),._1jljjz6g:hover{border:1px solid var(--_1s2yh9l3a);background-color:transparent;color:var(--_1s2yh9l3a)}._1jljjz6h{border:var(--_1s2yh9l6n);background-color:var(--_1s2yh9l6m);color:var(--_1s2yh9l6o);padding:var(--_1s2yh9l6p)}._1jljjz6h:hover{border:var(--_1s2yh9l6q);background-color:var(--_1s2yh9l6r);color:var(--_1s2yh9l6s)}._1jljjz6h:active,._1jljjz6h:active:not(:disabled){border:var(--_1s2yh9l6t);background-color:var(--_1s2yh9l6u);color:var(--_1s2yh9l6v)}._1jljjz6i{border:var(--_1s2yh9l6n);background-color:var(--_1s2yh9l6m);color:var(--_1s2yh9l6o);padding:var(--_1s2yh9l6p)}._1jljjz6i:hover{border:var(--_1s2yh9l6q);background-color:var(--_1s2yh9l6r);color:var(--_1s2yh9l6s)}._1jljjz6i:active,._1jljjz6i:active:not(:disabled){border:var(--_1s2yh9l6t);background-color:var(--_1s2yh9l6u);color:var(--_1s2yh9l6v)}(._1jljjz67:hover) &:before{background-color:var(--_1s2yh9l68)}(._1jljjz6d:hover) &:before{background-color:var(--_1s2yh9l72)}(._1jljjz6f:hover) &:before{background-color:var(--_1s2yh9l7c)}(._1jljjz68:hover) &:before{background-color:var(--_1s2yh9l6i)}(._1jljjz69:hover) &:before{background-color:var(--_1s2yh9l6s)}._1jljjz6j{background-color:var(--_1s2yh9l5f)}._1jljjz6n{fill:currentColor;color:inherit;transition:transform .2s ease;position:absolute;top:50%;transform:translateY(-50%)}._1jljjz61._1jljjz6n{position:static;transform:translate(4px,2px);display:inline-block}._1jljjz6n path{transition:left,right .2s ease;fill:inherit}._1jljjz6o{left:-10px}._1jljjz6p{right:16px}._1jljjz6q{left:16px}._1jljjz6r{right:-6px}.ruictu26{--ruictu0:#fff;--ruictu1:#fff;--ruictu2:940;--ruictu3:/logo-dark.svg;--ruictu4:#2d3748;--ruictu5:#5a67d8;--ruictu6:#187367;--ruictu7:#5a67d8;--ruictu8:#2d3748;--ruictu9:#e2e8f0;--ruictua:#090a15;--ruictub:#718096;--ruictuc:#2d3748;--ruictud:#718096;--ruictue:linear-gradient(180deg,#fff,transparent);--ruictuf:#fff;--ruictug:0 4px 20px 0 rgba(0,0,0,.1);--ruictuh:940;--ruictui:#fff;--ruictuj:#4a5568;--ruictuk:1rem;--ruictul:#2d3748;--ruictum:#5a67d8;--ruictun:#187367;--ruictuo:#5a67d8;--ruictup:1.125rem;--ruictuq:/logo-dark.svg;--ruictur:#fff;--ruictus:940;--ruictut:/grid-left.svg;--ruictuu:/grid-right.svg;--ruictuv:#2d3748;--ruictuw:#5a67d8;--ruictux:#2d3748;--ruictuy:#e2e8f0;--ruictuz:#fff;--ruictu10:940;--ruictu11:/placeholder.png;--ruictu12:/card-icon.svg;--ruictu13:#2d3748;--ruictu14:#5a67d8;--ruictu15:#2d3748;--ruictu16:#e2e8f0;--ruictu17:#fff;--ruictu18:940;--ruictu19:/placeholder.png;--ruictu1a:/card-icon.svg;--ruictu1b:#2d3748;--ruictu1c:#5a67d8;--ruictu1d:#2d3748;--ruictu1e:#e2e8f0;--ruictu1f:#000;--ruictu1g:940;--ruictu1h:/placeholder.png;--ruictu1i:/card-icon.svg;--ruictu1j:#2d3748;--ruictu1k:#5a67d8;--ruictu1l:#2d3748;--ruictu1m:#e2e8f0;--ruictu1n:#cbd5e0;--ruictu1o:#2d3748;--ruictu1p:#4a5568;--ruictu1q:#718096;--ruictu1r:#fff;--ruictu1s:#2d3748;--ruictu1t:#161d2b;--ruictu1u:#f7fafc;--ruictu1v:#f7fafc;--ruictu1w:#edf2f7;--ruictu1x:#4c51bf;--ruictu1y:#434190;--ruictu1z:#f7fafc;--ruictu20:#5a67d8;--ruictu21:#e2e8f0;--ruictu22:linear-gradient(180deg,#edeef9,#fff);--ruictu23:linear-gradient(180deg,#e6f9f8,#fff);--ruictu24:url(/illustrations/oss-friends/hero-lines.svg) center -50px no-repeat,linear-gradient(180deg,#fff,#f7fafc);--ruictu25:#f7fafc}.ruictu27{--ruictu0:#0a0a0a;--ruictu1:#090a15;--ruictu3:/logo-white.svg;--ruictu2:940;--ruictu4:#fff;--ruictu5:#a3bffa;--ruictu6:#92efe6;--ruictu7:#a3bffa;--ruictu9:#4a5568;--ruictu8:#fff;--ruictua:#fff;--ruictub:#cbd5e0;--ruictuc:#fff;--ruictud:#fff;--ruictue:linear-gradient(180deg,#090a15,rgba(9,10,21,0));--ruictuf:#090a15;--ruictug:0 4px 20px 0 rgba(0,0,0,.5);--ruictuh:940;--ruictui:#1a202c;--ruictuj:#fff;--ruictuk:1rem;--ruictul:#a0aec0;--ruictum:#5a67d8;--ruictun:#16a394;--ruictuo:#5a67d8;--ruictup:1.125rem;--ruictuq:/logo-white.svg;--ruictur:#1a202c;--ruictus:940;--ruictut:/grid-left.svg;--ruictuu:/grid-right.svg;--ruictuv:#fff;--ruictuw:#a3bffa;--ruictuy:#4a5568;--ruictux:#fff;--ruictuz:#1a202c;--ruictu10:940;--ruictu11:/placeholder.png;--ruictu12:/card-icon.svg;--ruictu13:#fff;--ruictu14:#a3bffa;--ruictu16:#4a5568;--ruictu15:#fff;--ruictu17:#1a202c;--ruictu18:940;--ruictu19:/placeholder.png;--ruictu1a:/card-icon.svg;--ruictu1b:#fff;--ruictu1c:#a3bffa;--ruictu1e:#4a5568;--ruictu1d:#fff;--ruictu1f:#1a202c;--ruictu1g:940;--ruictu1h:/placeholder.png;--ruictu1i:/card-icon.svg;--ruictu1j:#fff;--ruictu1k:#a3bffa;--ruictu1m:#4a5568;--ruictu1l:#fff;--ruictu1o:#fff;--ruictu1p:#e2e8f0;--ruictu1q:#a0aec0;--ruictu1n:#4a5568;--ruictu1r:#090a15;--ruictu1s:#e2e8f0;--ruictu1t:#fff;--ruictu1u:#161d2b;--ruictu1v:#121521;--ruictu1w:#2d3748;--ruictu1y:#c3dafe;--ruictu1x:#7f9cf5;--ruictu1z:#161d2b;--ruictu20:#5a67d8;--ruictu21:#2d3748;--ruictu22:linear-gradient(180deg,#edeef9,#fff);--ruictu23:linear-gradient(180deg,#e6f9f8,#fff);--ruictu24:linear-gradient(180deg,#171937,#090a15);--ruictu25:#090a15}.ruictu28{background:var(--ruictu0)}@media (max-width:1446px){.ruictu29{height:100vh;position:absolute;left:0}}.r3ds9x1:has(.r3ds9x0){position:fixed;z-index:2;height:88px;display:flex;align-items:center}.r3ds9x1:has(.r3ds9x0):before{content:"";height:100%;width:100vw;left:-32px;position:absolute;background:var(--ruictu1);z-index:2}.r3ds9x2{width:100vw;z-index:10000;position:fixed;top:0;margin-top:96px;height:64px;transition:margin-top .1s ease-out;padding:0 20px}.r3ds9x2:has(.r3ds9x0){margin-top:0;height:100vh;display:block;background:var(--ruictu1)}.r3ds9x2.r3ds9x3{margin-top:16px;-webkit-backdrop-filter:unset;backdrop-filter:unset;box-shadow:unset}.r3ds9x2.r3ds9x3:has(.r3ds9x0){margin-top:0;background:var(--ruictu1)}.r3ds9x4{display:grid;max-width:1304px;padding:0 32px;align-items:center;height:100%;grid-template-columns:repeat(2,1fr);transition:max-width .5s cubic-bezier(.075,.82,.165,1);background-color:var(--ruictuf);border-radius:99px;margin:0 auto}.r3ds9x4:has(.r3ds9x0){background:var(--ruictu1);display:block;margin:0;border-radius:unset;overflow:scroll}.r3ds9x5{font-size:16px;font-family:var(--barlow);text-align:left;font-weight:700}.r3ds9x6{position:relative;width:100%}.r3ds9x7{font-size:16px;font-family:var(--barlow);cursor:pointer;font-weight:700;font-style:normal;line-height:140%;text-transform:capitalize;color:var(--ruictu1p);max-height:unset;text-align:left;padding:32px;width:-webkit-fill-available;border-top:1px solid var(--ruictu21)}.r3ds9x7:hover{color:var(--ruictu1o)}.r3ds9x7>div:first-child{padding-bottom:15px}.r3ds9x7>div{display:inline-flex;align-items:center;gap:6px}.r3ds9x0.r3ds9x8{z-index:2}.r3ds9x8>div:first-of-type{height:64px}.r3ds9x9{display:none;width:auto;align-items:center}.r3ds9x0.r3ds9x9{display:flex;flex-direction:column;width:100vw;margin:0 -32px;padding:88px 0 0;align-items:flex-start;border-radius:none}.r3ds9xa{z-index:1}.r3ds9xc{padding-top:34px}.r3ds9x6 .r3ds9xe{margin:0}.r3ds9xf{margin-left:8px;transition:opacity .15s ease-in-out;min-width:25px;font-family:var(--barlow);font-size:20px;font-weight:700;margin-right:32px}.r3ds9xg{color:var(--ruictu1o);display:flex;align-items:center;justify-content:flex-end;text-align:right}.r3ds9x0.r3ds9xg{z-index:2}.r3ds9xh{display:none;border-top:1px solid var(--ruictu21)}.r3ds9xg.r3ds9x0 .r3ds9xh{display:grid;grid-template-rows:96px 120px;bottom:0;background:var(--ruictu1);height:auto;width:100vw;justify-content:center;flex-direction:column;margin:0 -32px}.r3ds9xg a{width:max-content}.r3ds9xi{display:flex;align-items:center;opacity:1;transition:opacity .1s ease-in-out}.r3ds9xg.r3ds9x0 .r3ds9xi{justify-content:center}.r3ds9x3 .r3ds9xi{opacity:0;position:absolute}.r3ds9xi .r3ds9xj{display:contents;cursor:pointer}.r3ds9xk{display:flex;align-items:center}.r3ds9xk>*{white-space:nowrap}.r3ds9xl{display:inline-flex;background-color:transparent!important;cursor:pointer;border:none!important;color:var(--ruictu8);padding:5px 12px!important;position:relative;top:0}.r3ds9xl:hover{background-color:#4c51bf!important}.r3ds9x0 .r3ds9xl{top:23px;position:absolute}.r3ds9xl:hover>i{transform:unset}@media (min-width:636px){.r3ds9x2{margin-top:64px}}@media (min-width:1147px){.r3ds9x1:has(.r3ds9x0):before{content:unset}.r3ds9x2{height:70px}.r3ds9x4{-webkit-backdrop-filter:blur(7px);backdrop-filter:blur(7px);gap:24px;grid-template-columns:max-content 1fr auto}.r3ds9x3 .r3ds9x4{max-width:1002px}.r3ds9x6,.r3ds9x7{width:auto}.r3ds9x7{max-height:22px;border-top:none;padding:0}.r3ds9x8>div:first-of-type{height:70px}.r3ds9x9{gap:40px;display:flex;padding:12px 32px;max-width:-moz-fit-content;max-width:fit-content;width:100%}.r3ds9x0.r3ds9x9{position:static;padding:12px 32px;border-radius:99px}.r3ds9xb{position:absolute;left:0;min-width:max-content;top:100%}.r3ds9xd{display:block!important}.r3ds9xl{display:none!important}}@media (max-width:1146px){.r3ds9xc{padding-top:0}.r3ds9xc>div{width:100%!important;max-width:100%;box-shadow:none;border-radius:0}}@media (min-width:768px){.r3ds9xf{font-size:.875rem;margin-right:4px}.r3ds9xh{display:flex;width:auto;border-top:none}}@media (min-width:600px){.r3ds9xg a{padding:5px 12px;font-size:16px;line-height:140%}}._1t1yxnn3{--_1t1yxnn0:#fff;--_1t1yxnn1:#e2e8f0;--_1t1yxnn2:#edf2f7}._1t1yxnn4{--_1t1yxnn0:#090a15;--_1t1yxnn1:#2d3748;--_1t1yxnn2:#2d3748}._1t1yxnn5{position:relative}._1t1yxnn6{height:88px;display:flex;align-items:center}._1t1yxnn7{opacity:0;pointer-events:none}._1t1yxnn8{opacity:1;pointer-events:auto}._1t1yxnn9{background:var(--_1t1yxnn0);border:1px solid var(--_1t1yxnn1);box-shadow:0 0 46px 0 rgba(23,43,77,.01),0 4px 26px 0 rgba(23,43,77,.05),0 18px 42px 0 rgba(23,43,77,.08);padding:8px;border-radius:8px;bottom:0;position:absolute;width:100%;left:0;transition:transform .3s ease;display:flex;flex-direction:column;gap:8px}._1t1yxnn7 ._1t1yxnn9{transform:translateY(100%)}._1t1yxnn8 ._1t1yxnn9{transform:translateY(0)}.r3ds9x8 ._1t1yxnn9{margin-top:-16px}._1t1yxnna{border-radius:8px;color:var(--_1s2yh9l59);width:max-content;min-width:100%;cursor:pointer;padding:8px 12px;background:var(--_1t1yxnn0);transition:background .3s ease-out}._1t1yxnna:hover{background:var(--_1t1yxnn2)}._1t1yxnna>*{width:100%;display:inline-block}@media (max-width:599px){._1t1yxnn7{position:fixed;height:100vh;z-index:102;width:100vw;background:rgba(9,10,21,.75);top:0;left:0}}@media (min-width:600px){._1t1yxnn9{top:100%;margin-top:16px;bottom:unset;width:auto}._1t1yxnnb{top:unset!important;transform:unset!important;bottom:100%!important;left:0!important}}@media (min-width:768px){._1t1yxnnb{left:unset!important;right:0}}.nikjvq0{position:relative;display:flex;align-items:center;flex-direction:column}.nikjvq1{margin-bottom:24px}.nikjvq1,.nikjvq2{width:100%;position:relative}.nikjvq2{margin-bottom:32px}.nikjvq3{left:24px;display:none;position:absolute;top:50%;transform:translateY(-50%)}.nikjvq3,.nikjvq4{color:var(--_16ohvvsm)}.nikjvq4{box-sizing:border-box;width:100%;line-height:1.25rem;font-size:18px;height:48px;border-radius:10px;border:1px solid #e2e8f0;padding:12px 25px 12px 58px}.nikjvq4::placeholder{color:var(--_16ohvvsm)}.nikjvq2 .nikjvq4{background-color:var(--_16ohvvss);border:1px solid #2d3748}.nikjvq5{outline:1px 0 solid}.nikjvq5:focus{outline:1px solid var(--_16ohvvst)}.nikjvq6,.nikjvq6:focus{outline:1px solid #c53030}.nikjvq7{content:"Subscribe for updates";max-height:48px;white-space:nowrap;width:100%}.nikjvq8{background-color:transparent;background-image:none;color:inherit;cursor:pointer;font-weight:inherit;line-height:118%;font-size:100%;margin:0;padding:0;border:0}@media only screen and (min-width:768px){.nikjvq0{flex-direction:row}.nikjvq1{max-width:264px}.nikjvq1,.nikjvq2{width:auto;margin-right:24px;margin-bottom:0}.nikjvq2{max-width:312px}.nikjvq7{width:max-content}}@media only screen and (min-width:360px){.nikjvq3{display:flex}}._195sk010{width:100vw;overflow:hidden visible;max-width:100%}._195sk010,._195sk011{background-color:var(--_16ohvvsl)}._195sk011{padding:72px 10px 24px;max-width:1288px;margin:0 auto}._195sk012{background-color:#090a15}._195sk013{font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI;display:grid;grid-template-columns:repeat(2,50%);grid-gap:8px;gap:8px;position:relative;padding-top:64px}._195sk014{display:flex;justify-content:space-between;align-items:center}._195sk015{display:flex;justify-content:center;flex-direction:column}._195sk016{color:var(--_16ohvvso);font-size:var(--_16ohvvsu);font-weight:400}._195sk016,._195sk017{font-family:Inter,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI}._195sk018{border-top:1px solid #2d3748;border-bottom:1px solid #2d3748;padding:32px 0;margin-bottom:32px}._195sk019{height:1px;width:100%;background:#2d3748;margin:16px 0 64px;display:none}._195sk01a{text-transform:uppercase;display:inline-block;font-family:var(--barlow);font-weight:700;font-size:var(--_16ohvvsn);color:var(--_16ohvvsm);letter-spacing:.1em;margin-top:0;margin-bottom:1rem}._195sk018 ._195sk01a{margin-bottom:16px;margin-right:32px;color:var(--_16ohvvso)}._195sk01b{margin-bottom:48px;flex:1 1}._195sk01d{position:absolute;width:100%;top:0;justify-content:space-between;align-items:center;display:flex}._195sk01e{color:var(--_16ohvvso);font-size:var(--_16ohvvsu);display:flex;cursor:pointer;font-weight:500;box-sizing:border-box;text-decoration:none;line-height:1.3888888888888888;padding:.5rem 0}._195sk01e:hover{color:var(--_16ohvvsp)}._195sk01g:hover{color:var(--_16ohvvsq)}._195sk01h:hover{color:var(--_16ohvvsr)}._195sk01j{position:relative;cursor:pointer;width:max-content;display:flex;align-items:center}._195sk01e>i{margin:5px 0 0 3px}._195sk01e>span{margin-left:6px}._195sk01k,._195sk01l{display:flex;align-items:center}._195sk01l{margin-left:8px;background:#5a67d8;border-radius:99px;padding:6px 8px;font-family:Barlow;font-style:normal;font-weight:700;font-size:8px;line-height:100%;white-space:nowrap;letter-spacing:.1em;text-transform:uppercase;color:#fff}._195sk01o{background:#16a394}._195sk01p{background:#fff}._195sk01q{justify-content:flex-start;gap:16px;display:flex}._195sk01q i{pointer-events:none}._195sk01r{font-size:1.375rem;color:var(--_16ohvvso)}._195sk01s:hover{color:var(--_16ohvvsp)}._195sk01t:hover{color:var(--_16ohvvsq)}._195sk01u:hover{color:var(--_16ohvvsr)}._195sk01v{font-size:16px;font-family:var(--inter);font-weight:400;text-align:left;text-transform:capitalize}._195sk01w{display:flex;justify-content:space-around;width:100%;align-items:center}._195sk01x{display:flex;justify-content:space-between;flex-direction:column-reverse;align-items:flex-start;gap:24px}@media only screen and (min-width:768px){._195sk011{padding:46px 24px 100px}._195sk013,._195sk018{display:flex;justify-content:space-between}._195sk018{margin-top:32px;flex-direction:row;align-items:center}._195sk019{margin:64px 0;display:block}._195sk01q{max-width:190px}}@media only screen and (min-width:940px){._195sk013{padding-top:0}._195sk01a{margin-bottom:12px}._195sk01b{margin-bottom:0;padding:0 .5rem;flex:1 1}._195sk01c{margin-bottom:24px}._195sk01d{display:block;position:relative}._195sk01e{padding:.25rem 0}}@media print{._195sk017{display:none}}@media (min-width:768px){._195sk018 ._195sk01a{margin-bottom:0}._195sk01w{width:-moz-fit-content;width:fit-content;gap:56px}._195sk01x{align-items:center;flex-direction:row}}.hgtwl90{width:80px;height:80px;padding:23px;background:#fff;border-radius:100%;display:flex;align-items:center;justify-content:center;cursor:pointer;position:absolute;bottom:24px;left:24px}.hgtwl91{width:100%;height:100%;padding-left:4px;color:var(--_1s2yh9l31)!important}.hgtwl91:hover{transition:color .1s ease-in;color:var(--_1s2yh9l33)!important}.hgtwl92{position:relative;z-index:20;display:block;width:100%;height:100%;object-fit:cover}.hgtwl94{display:none!important}.hgtwl95{background-color:#151630;position:absolute;z-index:21}.hgtwl96{width:100%;object-fit:cover;height:100%;cursor:pointer}.hgtwl98{object-fit:contain}.hgtwl99{position:relative;z-index:20;width:100%;display:none}.hgtwl9b{display:block}.hgtwl9c{max-width:100%;padding-top:56.25%;position:relative;width:100%;height:min-content}.hgtwl9d{width:100%;border-width:0!important;border-radius:10px}.hgtwl9f{position:absolute;top:0;left:0;width:100%;height:100%}.hgtwl9g{filter:drop-shadow(0 0 46px rgba(23,43,77,.01)) drop-shadow(0 4px 26px rgba(23,43,77,.05)) drop-shadow(0 18px 42px rgba(23,43,77,.08))}.hgtwl9g,.hgtwl9h{width:100%;border-radius:8px}.hgtwl9h{height:100%;top:0;left:0;position:absolute;z-index:100;pointer-events:none;background:linear-gradient(171.59deg,#8f55ff .98%,#642cea 24.71%,#7048ff 49.46%,#8862ff);mix-blend-mode:hard-light;opacity:.28}@keyframes _1unb94h2{0%{opacity:0;transform:translateY(5px)}25%{opacity:1}to{opacity:1;transform:translateY(0)}}@keyframes _1unb94h3{0%{opacity:0;transform:translateY(-5px)}25%{opacity:1}to{opacity:1;transform:translateY(0)}}@keyframes _1unb94h4{0%{opacity:0;transform:translateX(5px)}25%{opacity:1}to{opacity:1;transform:translateX(0)}}@keyframes _1unb94h5{0%{opacity:0;transform:translateX(-5px)}25%{opacity:1}to{opacity:1;transform:translateX(0)}}._1unb94h0{position:absolute;left:50%;transform:translateX(-50%);border-color:var(--_1s2yh9l2j)}._1unb94h1{display:flex;align-items:center;border-radius:.375rem;padding:.375rem .75rem;background:var(--_1s2yh9l2j);color:#fff;font-size:.875rem;line-height:1.25rem}._1unb94h6{animation:_1unb94h2 .1s cubic-bezier(0,0,.2,1) forwards}._1unb94h7{animation:_1unb94h3 .1s cubic-bezier(0,0,.2,1) forwards}._1unb94h8{animation:_1unb94h4 .1s cubic-bezier(0,0,.2,1) forwards}._1unb94h9{animation:_1unb94h5 .1s cubic-bezier(0,0,.2,1) forwards}.z5gmbb0{display:flex;column-gap:16px;flex-wrap:wrap;justify-content:flex-start}.z5gmbb0,.z5gmbb1{align-items:center}.z5gmbb1{margin-top:2rem}.z5gmbb2 a:last-child{color:var(--_1s2yh9l4x);border-color:var(--_1s2yh9l4x)}.z5gmbb2 a:hover:last-child{color:var(--_1s2yh9l2e);background:transparent}.z5gmbb1 a:first-child{color:var(--_1s2yh9l4w)!important;border-color:var(--_1s2yh9l4x)}.z5gmbb1 a:hover:first-child{background:var(--_1s2yh9l2e)}.z5gmbb1 a:last-child{color:var(--_1s2yh9l4x);border-color:var(--_1s2yh9l4x)}.z5gmbb1 a:hover:last-child{color:var(--_1s2yh9l2e);background:transparent}.z5gmbb0 a{border-radius:6px;font-family:var(--_1s2yh9lh);display:flex;align-items:flex-end;font-size:var(--_1s2yh9lo)}.z5gmbb0 a svg{width:12px;margin-left:8px}.z5gmbb0 a .secondary{background:transparent}@media (max-width:768px){.z5gmbb0{row-gap:8px;flex-direction:column}}._16i7ca60{color:var(--_1s2yh9l59);width:100%;scroll-margin-top:100px;margin:10px 0}._16i7ca61{cursor:pointer}._16i7ca62{color:var(--_1s2yh9l58);display:flex;width:100%;justify-content:space-between;padding:8px 8px 8px 0;border-bottom:1px solid var(--_1s2yh9l5m);align-items:center;font-family:Inter;text-decoration:none!important;font-size:18px;font-weight:700;line-height:25px;letter-spacing:0}._16i7ca62>span:has(i){display:flex;align-items:center}._16i7ca62 i{color:var(--_1s2yh9l5a)}._16i7ca63{color:var(--_1s2yh9l59);text-align:left}._16i7ca63 p{margin:16px 0}._16i7ca63 a{text-decoration:underline;transition:color .15s ease-in-out}._16i7ca63 a:hover{color:var(--_1s2yh9l58)}._16i7ca63 ol,._16i7ca63 ul{list-style:revert!important;margin:revert!important;padding:revert!important}._16i7ca63 ol li,._16i7ca63 ul li{margin:8px}._16i7ca64{margin:0 auto;width:100%;padding:0 0 96px}._16i7ca65{font-family:Inter;text-align:center;display:flex;align-items:flex-start;flex-direction:row-reverse;gap:16px;justify-content:space-between;top:120px;align-self:flex-start;padding:60px 0 56px}._16i7ca66{color:var(--_1s2yh9l2z);transition:all .3s ease-in}._16i7ca66:hover{color:var(--_1s2yh9l31)}._16i7ca65>button>span{font-size:18px;line-height:24px;letter-spacing:0;font-weight:600;text-decoration:underline}._16i7ca67{box-sizing:border-box;margin:auto;width:100%;z-index:10;position:relative;padding:0 10px;display:grid;grid-gap:16px;gap:16px;grid-template-rows:auto 1fr}@media (min-width:768px){._16i7ca65{justify-content:center}}@media (min-width:940px){._16i7ca60{scroll-margin-top:64px}._16i7ca64{padding:42px 0 96px}._16i7ca65{position:-webkit-sticky;position:sticky;flex-direction:column;padding:60px 0 96px}._16i7ca67{padding:0 1.5rem;grid-template-columns:150px 1fr;max-width:1248px}}@media (min-width:1040px){._16i7ca67{grid-template-columns:1fr 640px 1fr}}@media print{._16i7ca63{color:var(--_1s2yh9l58)}._16i7ca65{display:none}._16i7ca67{grid-template-columns:100%}}._1id366o5{--_1id366o0:var(--_1s2yh9l57);--_1id366o1:var(--_1s2yh9l58);--_1id366o2:var(--_1s2yh9l58);--_1id366o3:var(--_1s2yh9l57);--_1id366o4:var(--_1s2yh9l59)}._1id366o6{--_1id366o0:var(--_1s2yh9l57);--_1id366o1:var(--_1s2yh9l59);--_1id366o2:var(--_1s2yh9l58);--_1id366o3:var(--_1s2yh9l57);--_1id366o4:var(--_1s2yh9l59)}._1id366o7{--_1id366o0:var(--_1s2yh9l5c);--_1id366o1:var(--_1s2yh9l5d);--_1id366o2:var(--_1s2yh9l5d);--_1id366o3:var(--_1s2yh9l5c);--_1id366o4:var(--_1s2yh9l2h)}._1id366o8{display:flex;justify-content:space-between;flex-direction:column;gap:24px}._1id366o8 .eyebrow-headline{display:block;text-decoration:none;margin-bottom:8px;text-align:left;transition:opacity 50ms ease-in;color:var(--_1id366o4)}._1id366o8 .z5gmbb0{justify-content:flex-start}._1id366oa{width:100%;max-width:460px;margin:0 auto}._1id366oa._1id366ob{max-width:559px;margin:0 auto}._1id366oc{align-items:flex-start}._1id366od{align-items:flex-end}._1id366oe{align-items:center}._1id366of{color:var(--_1id366o1);margin:0 auto;text-wrap:pretty;text-align:left;max-width:460px;overflow-wrap:anywhere;width:100%}._1id366oa>p,._1id366of>p{margin:24px 0}._1id366oa p>a,._1id366of p>a{text-decoration:underline;transition:color .3s ease-in-out}._1id366oa p>a:hover,._1id366of p>a:hover{color:var(--_1id366o3)}._1id366oa h2,._1id366oa h3,._1id366oa h4,._1id366of h2,._1id366of h3,._1id366of h4{color:var(--_1id366o0);margin-top:0;margin-bottom:24px}._1id366oa ul,._1id366of ul{color:var(--_1id366o0)}._1id366oa ul em,._1id366of ul em{color:var(--_1id366o4);display:block}._1id366og{margin:0;width:100%}._1id366oh{margin:auto 0;width:auto;height:259px;max-width:calc(50% - 56px)}._1id366oh canvas{width:100%!important;height:100%!important}._1id366og>img{max-width:460px;object-fit:contain;flex-shrink:0;height:min-content;margin:0 auto;width:100%}@media (min-width:815px){._1id366o8{gap:112px;flex-direction:row}._1id366o9{flex-direction:row-reverse}._1id366oa{flex:1 1;width:0}._1id366oa._1id366ob{max-width:100%}._1id366of{flex:1 1;text-align:left;width:0;max-width:544px;margin:unset}._1id366og{width:0;flex:1 1;margin:auto 0}._1id366og>img{margin:0;max-width:unset}}@media (max-width:815px){._1id366oh{max-width:600px;margin:0 auto;height:auto;width:100%}}.olwa8g0{border-radius:8px;overflow:hidden;width:100%;text-align:left;font-size:12px;margin:8px 0}.olwa8g1{background:var(--_16ohvvs1n);vertical-align:top;color:var(--_16ohvvs1r);padding:16px 8px;border:1px solid var(--_16ohvvs1m)}.olwa8g2{background:var(--_16ohvvs1o);padding:8px}.olwa8g3{color:var(--_16ohvvs1q);background:var(--_16ohvvs1p);vertical-align:top;border:1px solid var(--_16ohvvs1m);padding:8px}._16i7ca63 .olwa8g0 p{margin:0}._16i7ca63 .olwa8g0 a{text-decoration:underline;transition:color .1s ease-in}._16i7ca63 .olwa8g0 a:hover{color:var(--_16ohvvs1r)}._16i7ca63 .olwa8g0 ul{padding-left:12px!important}.olwa8g4{display:table}.olwa8g4 thead{display:table-caption}.olwa8g4 thead>tr{display:table;width:100%}.olwa8g5{display:none}@media (min-width:640px){.olwa8g0{margin:24px 0}.olwa8g4{display:none}.olwa8g5{display:table}}._19ycqz10{padding:40px;background:var(--ruictu1u);border-radius:10px;box-shadow:0 0 46px 0 rgba(23,43,77,.01),0 4px 26px 0 rgba(23,43,77,.05),0 18px 42px 0 rgba(23,43,77,.08);display:flex;flex-direction:column;height:100%}._19ycqz11{text-wrap:pretty;color:var(--ruictu1p);text-align:center;font-family:var(--barlow);font-size:24px;font-style:normal;font-weight:400;line-height:29.92px}._19ycqz12{display:flex;gap:16px;align-items:center;margin-top:29px;justify-content:center}._19ycqz12>img{flex-shrink:0;overflow:hidden;border-radius:999px;width:48px!important;height:48px;object-fit:cover}._19ycqz13{color:var(--ruictu1o);font-weight:600}._19ycqz13>span:last-of-type{color:var(--ruictu1q);font-weight:400}._19ycqz13>a{display:block;margin-left:-1px}.h4okyv0{background:var(--_123a9qe5j);color:var(--_123a9qe5d)}.h4okyv0 h2,.h4okyv0 h3{color:var(--_123a9qe5b)}.h4okyv0 ._16i7ca62 i{color:#7f9cf5!important}.h4okyv1 [_type=websiteBtn]{width:100%;max-width:266px}.h4okyv1 .z5gmbb0{margin-top:16px!important;column-gap:24px!important}.h4okyv1 .z5gmbb0 span[role=img]{display:none}.h4okyv1 .z5gmbb0>a{margin:0!important;font-size:18px!important;padding:0!important}.h4okyv2{margin:80px 0}.h4okyv2:first-of-type{margin:80px auto}.h4okyv2:first-of-type,.h4okyv2:nth-of-type(3){padding:40px;width:-moz-fit-content;width:fit-content;border-radius:16px;border:1px solid var(--_123a9qe5p);background:var(--_123a9qe2p)}.h4okyv2:nth-of-type(3){margin:120px auto 80px}.h4okyv2 ._1id366o8 .eyebrow-headline{text-align:center}.h4okyv2 ._1id366o8{gap:57px}.h4okyv3{background:var(--_123a9qe5j);color:var(--_123a9qe5b);max-width:800px!important;width:100%;margin:0 auto;position:relative;padding-bottom:80px;text-align:center}.h4okyv3 p{max-width:768px;margin:0 auto}.h4okyv3>div>p:last-child{color:var(--_123a9qe5d);margin-top:32px;margin-bottom:40px}.h4okyv3>div>p:last-child a{text-decoration:underline;transition:all .15s ease-in-out}.h4okyv3>div>p:last-child a:hover{color:var(--_123a9qe5b)}.h4okyv3 #contact-us{position:absolute;top:-120px}.h4okyv4{max-width:1220px;margin:0 auto;text-align:center;padding:40px 10px}.h4okyv4 ._16i7ca60{max-width:800px;margin:10px auto}.h4okyv4>div>p:first-of-type{max-width:880px;margin:0 auto}.h4okyv5{margin-top:40px;margin-bottom:-40px;text-align:left}.h4okyv5 h2{font-size:24px}.h4okyv6.h4okyv4 h2{margin:0 0 56px}.h4okyv7{display:grid;grid-gap:24px;gap:24px}.h4okyv4 thead tr th:nth-of-type(2){border-top-left-radius:8px}.h4okyv4 thead tr th{background-color:#2d3748;color:var(--_123a9qe5c);line-height:140%;width:20%;font-size:20px}.h4okyv4 tbody th{background-color:#121521;color:var(--_123a9qe5c);vertical-align:middle;font-size:16px}.h4okyv4 tbody th p strong{font-weight:400}.h4okyv4 tbody td{background-color:#121521;padding:16px;color:var(--_123a9qe5d);font-size:16px}.h4okyv4 .eyebrow-headline{color:var(--_123a9qe5d);margin:0 auto 40px;text-align:center}.h4okyv4 .eyebrow-headline b,.h4okyv4 .eyebrow-headline strong{color:var(--_123a9qe5m);text-align:center}.h4okyv2>div>*>a{margin-bottom:16px}.h4okyv2>div>*>a:last-of-type{margin-bottom:4px}.h4okyv4 .olwa8g3{vertical-align:middle}.h4okyv4 .olwa8g3 a{text-decoration:underline;text-underline-offset:3px;transition:color .15s ease-in-out}.h4okyv4 .olwa8g3 a:hover{color:var(--_123a9qe5b)}.h4okyv4 ._19ycqz10{max-width:582px;margin:0 auto 120px}.h4okyv4 h6{font-size:16px;font-style:normal;font-weight:400;line-height:140%;margin-top:16px}.h4okyv4 .subtitle:last-of-type,.h4okyv4 .subtitle:nth-last-of-type(2){color:var(--_123a9qe5c)}.h4okyv4 .z5gmbb0{align-items:flex-start}em>a{text-decoration:underline}@media (min-width:815px){.h4okyv2:first-of-type{width:100%}}@media (min-width:768px){.h4okyv2:nth-of-type(3){width:100%}.h4okyv4{padding:80px 10px}.h4okyv4.h4okyv6{padding-bottom:120px}.h4okyv7{grid-template-columns:repeat(2,1fr)}.h4okyv4 thead tr th{padding:16px;font-size:24px}.h4okyv4 tbody th{padding:16px;font-size:18px}.h4okyv4 tbody th p:has(strong){white-space:nowrap}.h4okyv4 tbody td{font-size:18px}}@media (min-width:640px){.h4okyv4 thead tr th:first-of-type{opacity:0}}._1ri0qby0{position:absolute;left:50%;top:97px;min-width:100%;height:100%;display:none;transform:translateX(-50%)}._1ri0qby0 canvas{width:100%!important;height:auto!important;transform:scale(1.1)}._1ri0qby2{position:absolute;top:48px;height:100%;display:block;width:1000px;left:50%;transform:translateX(-50%);transform-origin:center}._1ri0qby2 canvas{width:100%!important;height:auto!important}._1ri0qby3{position:absolute;height:100%;z-index:1;width:100%;top:0;left:0}._1ri0qby3._1ri0qby4{z-index:2;pointer-events:none}._1ri0qby5{position:absolute;height:50%;z-index:1;pointer-events:none;width:100%;left:0}._1ri0qby6{bottom:-62px;background:linear-gradient(0deg,var(--_1s2yh9l2m) 0,rgba(9,10,21,.948) 26.04%,rgba(9,10,21,0) 100%)}._1ri0qby7{top:0;background:linear-gradient(180deg,var(--_1s2yh9l2m) 0,rgba(9,10,21,.948) 26.04%,rgba(9,10,21,0) 100%)}._1ri0qby8{background:inherit;color:#fff;text-align:center;display:flex;align-items:center;position:relative;overflow:hidden;padding-top:226px;margin-top:0;padding-bottom:80px}._1ri0qby9{min-height:650px;padding-top:226px}._1ri0qby8._1ri0qbya{overflow:visible}._1ri0qbyb{text-wrap:balance}._1ri0qby8 ._1ri0qbyb{width:100%;max-width:886px;z-index:10;margin:0 auto}.h4okyv0 ._1ri0qby8 ._1ri0qbyb{max-width:1074px}._1ri0qbyb._1ri0qbyc{display:flex;align-items:center;justify-content:center}._1ri0qby8 ._1ri0qbyb._1ri0qbyc{max-width:100%;flex-wrap:wrap}._1ri0qbyd{box-sizing:border-box;position:relative;margin:auto;z-index:1;width:100%;color:var(--_1s2yh9l58);padding:0 10px}._1ri0qby8 ._1ri0qbyd{margin-bottom:auto}._1ri0qbyd:has(._1ri0qbyc){pointer-events:none}._1ri0qby8 ._1ri0qbyb._1ri0qbyc ._1ri0qbye{max-width:560px;width:100%;margin:0 auto 32px;text-align:center}._1ri0qbye._1ri0qbyf{max-width:771px!important}._1ri0qby8 ._1ri0qbyb._1ri0qbyc ._1ri0qbyg{max-width:512px;display:flex;width:100%;align-items:center;justify-content:center;margin:0 auto}._1ri0qbyg._1ri0qbyh{max-width:unset!important;width:auto!important;padding-bottom:0!important;display:none!important}._1ri0qbyj{cursor:pointer}._1ri0qby8 ._1ri0qbyb._1ri0qbyc ._1ri0qbye h1{text-align:center}._1ri0qby8 ._1ri0qbyb._1ri0qbyc ._1ri0qbye>:not(a){text-shadow:0 0 16px var(--_1s2yh9l5f)}._1ri0qbyk{width:228px;height:176px;display:flex;align-items:center;justify-content:center;border-radius:16px;border:1px solid #fff;background:#fff;box-shadow:0 0 46px 0 rgba(23,43,77,.01),0 4px 26px 0 rgba(23,43,77,.05),0 18px 42px 0 rgba(23,43,77,.08)}._1ri0qbyk:first-child{margin-bottom:135px;margin-right:-37px}._1ri0qbyk:last-child{margin-bottom:-135px}._1ri0qbyk img{max-width:152px;max-height:104px;height:auto;width:auto}._1ri0qby8 ._1ri0qbyb a{flex-shrink:0;padding:12px 24px;font-family:var(--barlow);pointer-events:auto;white-space:nowrap}._1ri0qbyl{text-wrap:balance}._1ri0qbyl h1{margin-bottom:24px!important}._1ri0qbyl p{margin-bottom:32px!important}._1ri0qbyq{--_1ri0qbym:var(--_1s2yh9l38);--_1ri0qbyn:var(--_1s2yh9l39);--_1ri0qbyo:var(--_1s2yh9l3a);--_1ri0qbyp:var(--_1s2yh9l3b)}._1ri0qbyr{--_1ri0qbym:var(--_1s2yh9l2z);--_1ri0qbyn:var(--_1s2yh9l30);--_1ri0qbyo:var(--_1s2yh9l31);--_1ri0qbyp:var(--_1s2yh9l32)}._1ri0qby8 ._1ri0qbyb .eyebrow-headline{color:var(--_1ri0qbym)}._1ri0qby8 ._1ri0qbyb h1{color:#fff;margin-top:16px;margin-bottom:32px;position:relative;z-index:2;text-align:center}._1ri0qby8 ._1ri0qbyb h1 strong{color:var(--_1ri0qbyn);font-weight:700}._1ri0qby8 ._1ri0qbyb ._1ri0qbys{font-weight:400;line-height:150%;color:var(--_1s2yh9l2e);font-size:16px;margin:0 auto 32px}._1ri0qbyb pre{width:-moz-fit-content;width:fit-content;position:relative;background-color:#121521!important;border-radius:8px;padding:16px 52px!important;outline:2px solid transparent;outline-offset:-1.5px;max-width:100%;pointer-events:auto;margin:32px auto 0!important}._1ri0qbyb pre:after{content:"";position:absolute;inset:0;width:100%;left:0;top:0;z-index:0;height:100%;pointer-events:none;background-repeat:no-repeat;border-radius:8px;transition:background .3s ease-in-out;padding:1.5px;-webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:destination-out;mask-composite:exclude}._1ri0qbyg.teal pre:after,._1ri0qbyl.teal pre:after{background:linear-gradient(0deg,#2d3748 -33.33%,#71e8df 250%)}._1ri0qbyl.indigo pre:after{background:linear-gradient(0deg,#2d3748 -33.33%,#7f9cf5 250%)}._1ri0qbyt{display:flex;align-items:center;justify-content:center;max-width:700px;gap:24px;flex-wrap:wrap;margin:32px auto 0}._1ri0qbyu{color:var(--_1s2yh9l2f);font-size:16px;font-weight:500;font-family:var(--_1s2yh9lh)}._1ri0qbyt pre{margin:0!important}._1ri0qbyg pre{margin-top:0!important}._1ri0qbyb pre:before{content:"$";position:absolute;color:var(--_1s2yh9l5a);left:24px}._1ri0qbyb pre>code{padding-bottom:0}._1ri0qbyb pre>div{top:50%;transform:translateY(-50%);display:flex;justify-content:center;align-items:center}._1ri0qbyb pre>code .token.plain{font-weight:400;text-underline-position:from-font;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none;color:var(--_1s2yh9l58)}._1ri0qbyv._1ri0qbys{font-size:16px}._1ri0qbys ol,._1ri0qbys ul{list-style:revert;margin:revert;padding:revert}._1ri0qbyw{text-align:left}._1ri0qbyx{text-align:right}._1ri0qbyy{text-align:center}._1ri0qby8 ._1ri0qbyb ._1ri0qbys p{margin:revert}._1ri0qbyb .z5gmbb0{margin-top:60px;justify-content:center;flex-direction:column;flex-wrap:wrap;align-items:center;row-gap:3px;column-gap:16px}._1ri0qby8 ._1ri0qbyb .z5gmbb0 a{width:95%;margin-left:auto;margin-right:auto}._1ri0qby8 ._1ri0qbyb .z5gmbb0 a:nth-child(2){color:var(--_1ri0qbym);border-color:var(--_1ri0qbym)}._1ri0qby8 ._1ri0qbyb .z5gmbb0 a:nth-child(2):hover{color:var(--_1ri0qbyo);border-color:var(--_1ri0qbyo)}._1ri0qby11{opacity:.5}._1ri0qby11,._1ri0qby12{width:100%;height:100%;position:absolute;top:0;left:0;mask-image:linear-gradient(180deg,#000 80%,transparent);-webkit-mask-image:linear-gradient(180deg,#000 80%,transparent)}@media (min-width:580px){._1ri0qby2{transform:translate(-50%)}}@media (min-width:768px){._1ri0qby0{display:block}._1ri0qby2{display:none}._1ri0qby9{min-height:780px}._1ri0qby8 ._1ri0qbyd{margin-bottom:0;margin-top:0}}@media (min-width:940px){._1ri0qby0{top:62px}._1ri0qby8{padding-top:242px}._1ri0qby9{min-height:745px}._1ri0qby8 ._1ri0qbyb h1{margin-bottom:46px}._1ri0qby8 ._1ri0qbyb ._1ri0qbys{font-size:24px}._1ri0qbyv._1ri0qbys{font-size:18px!important}}@media (max-width:767px){._1ri0qby1{display:block;width:100%}}@media (min-width:1004px){._1ri0qbyb._1ri0qbyc{gap:48px}._1ri0qby8 ._1ri0qbyb._1ri0qbyc{flex-wrap:nowrap}._1ri0qby8 ._1ri0qbyb._1ri0qbyc ._1ri0qbye{text-align:left;margin:0}._1ri0qby8 ._1ri0qbyb._1ri0qbyc ._1ri0qbyg{margin:0;padding-bottom:96px}._1ri0qbyg._1ri0qbyh{display:flex!important}._1ri0qby8 ._1ri0qbyb._1ri0qbyc ._1ri0qbye h1{text-align:left}}@media only screen and (min-width:940px){._1ri0qbyd{padding:0 1.5rem;max-width:1248px}}@media (min-width:992px){._1ri0qby8 ._1ri0qbyd{margin-top:0}}@media (prefers-color-scheme:dark){._1ri0qbyk{background:var(--_1s2yh9l5f);border:1px solid var(--_1s2yh9l5m)}}@media (prefers-color-scheme:light){._1ri0qbyi ._1ri0qbyk img,._1ri0qbyk:last-child img{filter:invert(1)}}@media (max-width:768px){._1ri0qbyt{flex-direction:column;gap:16px}}@media (min-width:500px){._1ri0qbyb .z5gmbb0{flex-direction:row;align-items:unset}._1ri0qby8 ._1ri0qbyb .z5gmbb0 a{width:unset;margin-left:unset;margin-right:unset;font-size:20px}}@media screen and (max-width:768px){._1ri0qbyz{display:none}}@media screen and (min-width:768px){._1ri0qby10{display:none}}._1yfjkub0{overflow-x:auto;display:block;position:relative;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.2) transparent}._1yfjkub0::-webkit-scrollbar{width:10px;height:10px;background-color:transparent}._1yfjkub0::-webkit-scrollbar-thumb{border-radius:10px;background-color:rgba(0,0,0,.2)}._1yfjkub0::-webkit-scrollbar-track{border-radius:10px;background-color:transparent}._1yfjkub0::-webkit-scrollbar-corner{background-color:transparent;border-color:transparent}._1yfjkub0 .token-line{min-width:max-content;width:100%;text-align:left}._1yfjkub0:has(.line-no) .line-content{padding-left:2.5rem}._1yfjkub1::-webkit-scrollbar-thumb{background-color:var(--_1s2yh9l5m)}._1yfjkub2{display:grid;grid-template-columns:100%;width:max-content}._1yfjkub3{position:absolute;top:16px;height:-moz-fit-content;height:fit-content;width:-moz-fit-content;width:fit-content;right:16px;color:var(--_1s2yh9l58);cursor:pointer}._1yfjkub3:hover{color:var(--_1s2yh9l57)}._1a0uwno0{opacity:1}._1a0uwno0,._1a0uwno1{transition:opacity .1s ease-in-out}._1a0uwno1{opacity:0}._1a0uwno2{max-width:100%;max-height:100%}._1a0uwno3{display:none}._1a0uwno4{display:block;text-align:left}._1a0uwno5{height:3.45rem;margin:0}._1a0uwno5,._1a0uwno6{width:45%;flex:0 0 45%}._1a0uwno6 pre{width:100%!important}@media (min-width:815px){._1a0uwno3{display:block}._1a0uwno4{display:none}}@media (max-width:768px){._1a0uwno5,._1a0uwno6{width:100%;flex:0 0 100%}}._1t293bi0{color:var(--_1s2yh9l59);display:flex;flex-direction:column;text-wrap:pretty;gap:24px;flex:1 1}._1t293bi1{text-align:center}._1t293bi0 a{margin-top:auto;display:block}._1t293bi0 p>a{width:unset!important;padding:0!important;display:inline;text-decoration:underline;transition:color .15s ease-in-out}._1t293bi0 p{margin:0}._1t293bi0 p>a:hover{color:var(--_1s2yh9l58)}._1t293bi2{display:flex;align-items:center;color:var(--_1s2yh9l57);gap:1rem}._1t293bi2._1t293bi3{flex-direction:column;align-items:center}._1t293bi2 .eyebrow-headline{margin:0 0 8px;color:var(--_1s2yh9l59)}._1t293bi4{display:flex;justify-content:center;align-items:center;flex-shrink:0;font-size:32px}._1t293bi5{width:48px;height:48px;font-size:22px;border-radius:8px;background-color:var(--_1s2yh9l5f)}._1t293bi0 h3,._1t293bi0 h4{margin:0;display:flex;align-items:center;color:var(--_1s2yh9l57)}._1t293bi4._1t293bi6{width:84px;height:84px;font-size:36px}._1t293bib{--_1t293bi7:unset;--_1t293bi8:var(--_1s2yh9l31);--_1t293bi9:var(--_1s2yh9l31);--_1t293bia:var(--_1s2yh9l33)}._1t293bic{--_1t293bi7:unset;--_1t293bi8:var(--_1s2yh9l2z);--_1t293bi9:var(--_1s2yh9l2z);--_1t293bia:var(--_1s2yh9l31)}._1t293bid{--_1t293bi7:unset;--_1t293bi8:var(--_1s2yh9l3a);--_1t293bi9:var(--_1s2yh9l3a);--_1t293bia:var(--_1s2yh9l3c)}._1t293bie{--_1t293bi7:unset;--_1t293bi8:var(--_1s2yh9l38);--_1t293bi9:var(--_1s2yh9l38);--_1t293bia:var(--_1s2yh9l3a)}._1t293bif{--_1t293bi7:unset;--_1t293bi8:var(--_1s2yh9l4x);--_1t293bi9:var(--_1s2yh9l4x);--_1t293bia:var(--_1s2yh9l2d)}._1t293big{--_1t293bi7:#2d3748;--_1t293bi9:var(--_1s2yh9l57);--_1t293bi8:unset;--_1t293bia:var(--_1s2yh9l5a)}._1t293bih{--_1t293bi7:#edf2f7;--_1t293bi9:var(--_1s2yh9l5c);--_1t293bi8:unset;--_1t293bia:var(--_1s2yh9l5b)}._1t293bii{font-family:var(--barlow);font-weight:700;line-height:100%;border:1px solid var(--_1t293bi8);white-space:nowrap;color:var(--_1t293bi9);background-color:var(--_1t293bi7);width:min-content;border-radius:99px;cursor:pointer;padding:6px 8px;text-transform:uppercase}._1t293bii:hover{background:var(--_1t293bia)}._1t293bij{cursor:default}._1t293bii._1t293bij:hover{background:var(--_1t293bi7)}._1t293bik{padding:6px 8px;font-size:10px;letter-spacing:1px}._1t293bil{padding:8px 12px;font-size:14px;letter-spacing:1.4px}._1t293bim{padding:8px 16px;font-size:20px;line-height:110%;letter-spacing:2px}._1t293bin{background:var(--_1s2yh9l31);color:var(--_1s2yh9l57)}._1t293bin:hover{background:var(--_1s2yh9l33);color:var(--_1s2yh9l57)}._1t293bii._1t293bio{margin-left:8px}._1t293bii._1t293bip{margin-right:8px}@media (min-width:768px){._1t293bi0,._1t293bi2{text-align:left}._1t293bi2{justify-content:flex-start}._1t293bi2._1t293bi3{align-items:flex-start}}@media (max-width:767px){._1t293bi1{justify-content:center}}._1hw57x40{opacity:0;transform:translateY(20px);transition:opacity .9s ease-out,transform .6s ease-out}._1hw57x40.fade-in{opacity:1!important;transform:translateY(0)!important}@keyframes h95ojee{0%{transform:translateY(0)}to{transform:translateY(100%)}}@keyframes h95ojef{0%{transform:translateY(-100%)}to{transform:translateY(0)}}@keyframes h95ojeg{0%{transform:translateY(0)}to{transform:translateY(-100%)}}@keyframes h95ojeh{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes h95ojel{0%{opacity:0}to{opacity:1}}.h95oje0{display:grid;max-width:100%;grid-gap:30px;gap:30px;position:relative;grid-template-columns:1fr}.h95oje0:before{top:0;background:linear-gradient(180deg,#0b0c17,rgba(11,12,23,0))}.h95oje0:after,.h95oje0:before{content:"";position:absolute;left:0;width:100%;height:30%;pointer-events:none;z-index:1}.h95oje0:after{bottom:0;background:linear-gradient(0deg,#1a202b,rgba(26,32,43,0))}.h95oje1:after,.h95oje1:before{content:unset}.h95oje2{color:var(--_1s2yh9l58)}.h95oje0>div:nth-child(2),.h95oje0>div:nth-child(3){display:none}.h95oje0>*{flex:1 1}.h95oje3{display:grid}.h95oje4,.h95oje5{display:none}.h95oje6{color:var(--_1s2yh9l57);padding:24px;margin:12px 0;font-family:var(--barlow);font-weight:400;font-size:18px;background:var(--_1s2yh9l5f);border:1px solid var(--_1s2yh9l5m);border-radius:10px;line-height:25.2px}.h95oje7{display:grid;margin:0}.h95oje8{display:flex;gap:16px;align-items:center;font-weight:700;line-height:19.8px;letter-spacing:.02em;margin-top:32px}.h95oje8>img{width:48px;height:48px;border-radius:99px}.h95oje9{font-family:var(--inter);font-size:16px;font-weight:400;line-height:22px;margin-top:4px}.h95ojea{font-family:var(--barlow)}.h95ojea:not(.h95ojeb)>:nth-child(2){color:var(--_1s2yh9l59)}.h95ojeb>:nth-child(2){color:var(--_1s2yh9l57)}.h95ojeb>:first-child{font-size:18px}.h95ojeb>:first-child,.h95ojec{color:var(--_1s2yh9l5j);font-weight:700}.h95ojec{position:relative;line-height:22px}.h95ojec:before{content:" / ";color:var(--_1s2yh9l5a)}.h95ojed{position:relative;color:var(--_1s2yh9l59);line-height:22px}.h95ojed:before{content:" / ";font-size:20px;line-height:22px;color:var(--_1s2yh9l5a)}.h95ojei{flex-direction:row;align-items:center;display:flex;overflow:hidden;position:relative;max-width:1200px;min-height:680px;width:100%;margin:0 auto;height:100px;animation-delay:50s}.h95ojei:hover{animation-duration:0s!important}.h95ojej{margin:0 auto;width:100%;position:absolute;animation-name:h95ojee;animation-timing-function:linear;animation-duration:130s;animation-iteration-count:infinite;justify-content:space-around;flex-direction:column;animation-play-state:running}.h95ojej,.h95ojek{flex-shrink:0;min-width:100%;display:flex}.h95ojek{margin:1rem 31px;align-items:center;justify-content:center}.h95ojem{display:inline-flex;align-self:center;animation:h95ojel .5s cubic-bezier(.455,.03,.515,.955) forwards;padding:0}.h95ojeo{filter:grayscale(1) opacity(.7)}.h95ojeo:hover{filter:none}.h95ojep{display:flex;flex-wrap:wrap;justify-content:center}.h95ojeq{flex-shrink:0;position:absolute;animation-name:h95ojee;animation-duration:100s;animation-timing-function:linear;animation-iteration-count:infinite;width:max-content;min-width:100%;display:flex;justify-content:space-around}.h95ojer{animation-duration:100s;animation-name:h95ojeg}.h95ojes{transform:translateY(100%);animation-name:h95ojef}.h95ojer.h95ojes{animation-name:h95ojeh}.h95ojet:after,.h95ojet:before{display:none!important}@media (min-width:768px){.h95oje0{grid-template-columns:repeat(2,1fr)}.h95oje0>div:nth-child(2){display:flex}.h95oje3{display:none}.h95oje4{display:grid}.h95ojei:hover>.h95ojej{animation-play-state:paused}}@media (min-width:940px){.h95oje0{grid-template-columns:repeat(3,1fr)}.h95oje0>div:nth-child(3){display:flex}.h95oje4{display:none}.h95oje5{display:grid}}._1felcm20{max-width:100%;width:100%}._1felcm21{display:flex;gap:8px;margin-bottom:4px}._1felcm22{border-radius:8px;border:1px solid;color:var(--_1s2yh9l5a);background:var(--_1s2yh9l2l);padding:8px 12px;cursor:pointer;font-size:14px;transition:all .3s ease-in-out}._1felcm22._1felcm23,._1felcm22:hover{background:var(--_1s2yh9l2k);color:var(--_1s2yh9l57)}._1felcm20 .language-typescript .token.keyword{color:var(--_1s2yh9l2z)!important}._1felcm20 pre{padding:24px}._1felcm20 pre code{height:100%}._1felcm20 .language-typescript .token.class-name,._1felcm20 .language-typescript .token.function,._1felcm20 .language-typescript .token.string{color:#71e8df!important}@media (min-width:815px){._1felcm20{flex:1 1;max-width:unset;width:0}}@keyframes _1r8xle3f{0%{filter:drop-shadow(0 0 0 transparent);opacity:0}5%{filter:drop-shadow(0 0 2px rgba(113,232,223,.8));opacity:.4}6%{filter:drop-shadow(0 0 0 transparent);opacity:.2}7%{filter:drop-shadow(0 0 5px rgba(113,232,223,.8));opacity:.6}8%{filter:drop-shadow(0 0 0 transparent);opacity:.3}9%{filter:drop-shadow(0 0 8px rgba(113,232,223,.8));opacity:.8}10%{filter:drop-shadow(0 0 2px rgba(113,232,223,.2));opacity:.4}20%{filter:drop-shadow(0 0 10px rgba(113,232,223,.9));opacity:.9}25%{filter:drop-shadow(0 0 2px rgba(113,232,223,.4));opacity:.6}30%{filter:drop-shadow(0 0 12px rgba(113,232,223,1));opacity:1}70%{filter:drop-shadow(0 0 12px rgba(113,232,223,.9));opacity:.9}80%{filter:drop-shadow(0 0 12px rgba(113,232,223,1));opacity:1}to{filter:drop-shadow(0 0 0 transparent);opacity:1}}@keyframes _1r8xle3h{0%{opacity:0}10%{opacity:.4}25%{opacity:.8}70%{opacity:1}80%{opacity:1}to{opacity:1}}._1r8xle30{overflow:clip hidden;background:var(--_123a9qe5j)}._1r8xle30 .eyebrow-headline{text-decoration:none}._1r8xle31{padding-bottom:64px;margin-bottom:0!important}._1r8xle31 pre:hover{outline:1px solid var(--_123a9qe33);background:#121521;box-shadow:0 0 15.9px 0 rgba(113,232,223,.3)}._1r8xle31.teal pre:hover{outline:1px solid var(--_123a9qe3c)}._1r8xle31 pre{transition:all .3s ease-in-out}._1r8xle31 pre span::selection{background:var(--_123a9qe5h)}._1r8xle32{margin:0 auto;padding:40px 160px;max-width:596px;text-align:center;color:var(--_123a9qe5b)}._1r8xle32 p{color:var(--_123a9qe5d)}._1r8xle33{max-width:1074px;padding:0 20px;margin:96px 16px;position:relative}._1r8xle33 pre{position:relative;font-size:14px!important;padding:24px;margin:0;border-radius:8px;border:1px solid var(--_123a9qe5p);background:var(--_123a9qe2p)!important;color:var(--_123a9qe51)!important}._1r8xle33 ._1felcm20 pre{height:100%}._1r8xle33 pre code{padding:0}._1r8xle33 pre .token.number{color:var(--_123a9qe32)!important}._1r8xle33 pre .token.operator{color:var(--_123a9qe51)!important}._1r8xle34{position:absolute;height:calc(100% + 219px);top:-123px;pointer-events:none;width:calc(100% - 40px)}._1r8xle35{overflow:hidden;display:block;max-height:100%;-webkit-clip-path:inset(0 0 0 0);clip-path:inset(0 0 0 0);position:static}._1r8xle35,._1r8xle35:after{min-height:149px;pointer-events:none}._1r8xle35:after{content:"";height:inherit;width:100%;box-shadow:inset 0 -20px 20px 20px #090a15;position:absolute;top:0;left:0}._1r8xle36{background:linear-gradient(180deg,#090a15,#16a394 8%,#16a394 67.02%,#5a67d8 81.46%,#5a67d8 86.71%,#090a15);width:1px;left:50%;height:100%;display:block;position:absolute;margin:0 auto}._1r8xle37{margin-bottom:200px;position:relative}._1r8xle37:nth-child(2n){text-align:right}._1r8xle37 ._1r8xle38{position:absolute;left:50%;transform:translateX(-50%);width:48px;height:48px;display:flex;justify-content:center;align-items:center;top:-50px;background:var(--_123a9qe5j)}._1r8xle38.indigo>i:after{box-shadow:0 0 20px 7px #7f9cf5}._1r8xle38>i:after{content:"";box-shadow:0 0 20px 7px #71e8df;width:1px;height:1px;position:absolute;top:50%;left:50%;transform:translate(-50%)}._1r8xle33 ._1r8xle37>div{gap:40px}._1r8xle33 ._1r8xle37 h3{margin-bottom:16px}._1r8xle33 ._1r8xle37 p{margin:16px 0}._1r8xle39{color:var(--_123a9qe5d);text-decoration:none;position:relative;z-index:2;text-align:center;margin:48px 0 20px}._1r8xle3a{padding:40px 8px;overflow:hidden}._1r8xle3b{max-width:1240px;margin:0 auto}._1r8xle3b .h5{color:var(--_123a9qe5b);text-align:center;padding:0 55px;margin:0 0 60px}._1r8xle3b .h5>b{color:var(--_123a9qe5m)}._1r8xle3c{color:var(--_123a9qe5b);text-align:center;padding:85px 8px}._1r8xle3c>div{max-width:574px;width:100%;margin:0 auto}._1r8xle3c h2{margin:0}._1r8xle3c p{margin:32px auto}._1r8xle3d{text-align:left;text-wrap:pretty}._1id366o9._1r8xle3d{text-align:center}._1r8xle3d>:last-child{background-color:var(--_123a9qe5j)}._1r8xle3d.byod pre{height:354px}._1r8xle3d.accelerate pre{height:197px}._1r8xle3e{position:absolute;top:0}._1r8xle3g{mask-type:alpha;position:absolute;left:50%;transform:translateX(-50%);width:720px;top:-192px}._1r8xle3g rect{filter:drop-shadow(0 0 0 transparent);animation:_1r8xle3f 2.5s forwards}._1r8xle30:has(._1r8xle3g) h1{text-shadow:0 100px 80px rgba(4,21,23,.61),0 30.147px 24.118px rgba(4,21,23,.4),0 12.522px 10.017px rgba(4,21,23,.31),0 4.529px 3.623px rgba(4,21,23,.21);opacity:0;animation:_1r8xle3h 2s forwards}._1r8xle3i{padding-top:80px}._1r8xle31 h1{margin-bottom:24px!important}._1r8xle3j{text-align:center;display:flex;flex-direction:column;align-items:center;position:relative;padding-bottom:64px;color:#fff}._1r8xle3j p{color:#e2e8f0}._1r8xle3j a{margin-top:40px}@media (min-width:768px){._1r8xle37 ._1r8xle38{top:24px}._1r8xle38.postgres{top:0}._1r8xle3c{padding:75px 0}._1id366o9._1r8xle3d{text-align:right}}@media (min-width:815px){._1r8xle33 ._1r8xle37>div{gap:120px}}@media (max-width:767px){._1r8xle3d{flex-direction:column-reverse;align-items:center}._1r8xle3d>:last-child{margin-top:-2px}._1r8xle3d>:first-child{background-color:var(--_123a9qe5j);box-shadow:0 -.925px 123.905px 0 rgba(9,10,21,.68),0 -.529px 70.895px 0 rgba(9,10,21,.58),0 -.321px 43.033px 0 rgba(9,10,21,.5),0 -.194px 25.929px 0 rgba(9,10,21,.42),0 -.108px 14.439px 0 rgba(9,10,21,.34),0 -.046px 6.21px 0 rgba(9,10,21,.24)}}@media (min-width:940px){._1r8xle3g{width:1440px}._1r8xle31 h1{font-size:84px}} No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

This generated bundle currently fails Stylelint error rules.

On Line 1, the file contains many lint-level errors from your pipeline (font-family-name-quotes, font-family-no-missing-generic-family-keyword, function-url-quotes, property-no-deprecated, etc.). If lint is enforced, this will block merges.

For generated third-party/minified assets, either:

  1. fix at source before bundling, or
  2. explicitly exclude this directory from strict Stylelint checks.
🧰 Tools
🪛 Stylelint (17.5.0)

[error] 1-1: Expected quotes around "Segoe UI" (font-family-name-quotes)

(font-family-name-quotes)


[error] 1-1: Expected quotes around "Segoe UI" (font-family-name-quotes)

(font-family-name-quotes)


[error] 1-1: Unexpected missing generic font family (font-family-no-missing-generic-family-keyword)

(font-family-no-missing-generic-family-keyword)


[error] 1-1: Unexpected missing generic font family (font-family-no-missing-generic-family-keyword)

(font-family-no-missing-generic-family-keyword)


[error] 1-1: Unexpected missing generic font family (font-family-no-missing-generic-family-keyword)

(font-family-no-missing-generic-family-keyword)


[error] 1-1: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected keyframe name "_1unb94h2" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1unb94h3" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1unb94h4" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1unb94h5" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1r8xle3f" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1r8xle3h" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "currentColor" to be "currentcolor" (value-keyword-case)

(value-keyword-case)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-webkit-sticky" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css` at
line 1, The generated CSS bundle contains many Stylelint violations (see long
selector names like ._1jljjz60, ._1jljjz61, etc.), so either fix the generator
output (ensure font-family values, url() quoting, and deprecated properties are
corrected at the source that emits these hashed/minified classes) or exclude
generated bundles from strict linting by adding an ignore rule/pattern to your
Stylelint config (e.g., via ignoreFiles or .stylelintignore) that matches the
hashed/minified CSS outputs (the files that include selectors like ._1jljjz60),
so the CI lint step no longer blocks merges.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify suspicious top-level nested selector patterns in the CSS bundle.
rg -n '\)\s*&:before\s*\{' apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css
rg -n '\(\._[a-z0-9]+:hover\)' apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css

Repository: prisma/web

Length of output: 50367


Top-level nesting selectors will be dropped by browsers, silently breaking hover styles.

The CSS contains selectors like (._1jljjz67:hover) &:before{...} at the top level. The & nesting combinator is only valid inside nested rule blocks; at the top level of a static stylesheet, these rules are invalid and browsers will silently drop them entirely. This causes the associated hover and pseudo-element styles to fail silently.

Check if this CSS is hand-authored or generated. If generated, the source tool may need configuration to avoid emitting invalid nesting syntax for top-level rules. If hand-authored, flatten these rules into standard CSS selectors.

🧰 Tools
🪛 Stylelint (17.5.0)

[error] 1-1: Expected quotes around "Segoe UI" (font-family-name-quotes)

(font-family-name-quotes)


[error] 1-1: Expected quotes around "Segoe UI" (font-family-name-quotes)

(font-family-name-quotes)


[error] 1-1: Unexpected missing generic font family (font-family-no-missing-generic-family-keyword)

(font-family-no-missing-generic-family-keyword)


[error] 1-1: Unexpected missing generic font family (font-family-no-missing-generic-family-keyword)

(font-family-no-missing-generic-family-keyword)


[error] 1-1: Unexpected missing generic font family (font-family-no-missing-generic-family-keyword)

(font-family-no-missing-generic-family-keyword)


[error] 1-1: Expected quotes around "url" function argument (function-url-quotes)

(function-url-quotes)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected "to" to be "100%" (keyframe-selector-notation)

(keyframe-selector-notation)


[error] 1-1: Expected keyframe name "_1unb94h2" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1unb94h3" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1unb94h4" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1unb94h5" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1r8xle3f" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected keyframe name "_1r8xle3h" to be kebab-case (keyframes-name-pattern)

(keyframes-name-pattern)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "grid-gap" to be "gap" (property-no-deprecated)

(property-no-deprecated)


[error] 1-1: Expected "currentColor" to be "currentcolor" (value-keyword-case)

(value-keyword-case)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-webkit-sticky" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)


[error] 1-1: Unexpected vendor-prefixed value "-moz-fit-content" (value-no-vendor-prefix)

(value-no-vendor-prefix)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.css` at
line 1, The file contains invalid top-level nested selectors like
"(._1jljjz67:hover) &:before{...}" which browsers drop; find occurrences of
those patterns (e.g. the invalid selectors referencing ._1jljjz67, ._1jljjz6d,
._1jljjz6f, ._1jljjz68, ._1jljjz69) and replace them with valid, flattened
selectors: remove the parentheses and the "&" and compose a proper selector that
expresses the intended relationship (for example "._1jljjz67:hover:before" or,
if the pseudo-element is on a child, "._1jljjz67:hover .<child-class>:before");
if this CSS is generated, fix the generator configuration to emit flattened
selectors instead of nested "&" at top level.

@@ -0,0 +1 @@
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3185],{48789:function(e,t,r){Promise.resolve().then(r.bind(r,63632)),Promise.resolve().then(r.bind(r,80284)),Promise.resolve().then(r.bind(r,10165)),Promise.resolve().then(r.bind(r,78833)),Promise.resolve().then(r.bind(r,72724)),Promise.resolve().then(r.bind(r,74236)),Promise.resolve().then(r.bind(r,67127)),Promise.resolve().then(r.bind(r,33020)),Promise.resolve().then(r.bind(r,90497)),Promise.resolve().then(r.bind(r,27391)),Promise.resolve().then(r.bind(r,95163)),Promise.resolve().then(r.bind(r,20121)),Promise.resolve().then(r.bind(r,22199)),Promise.resolve().then(r.bind(r,10860)),Promise.resolve().then(r.bind(r,47374)),Promise.resolve().then(r.bind(r,25902)),Promise.resolve().then(r.bind(r,58175)),Promise.resolve().then(r.bind(r,86880)),Promise.resolve().then(r.bind(r,21385)),Promise.resolve().then(r.bind(r,71809)),Promise.resolve().then(r.bind(r,29185)),Promise.resolve().then(r.bind(r,76170)),Promise.resolve().then(r.bind(r,24319)),Promise.resolve().then(r.bind(r,30265)),Promise.resolve().then(r.bind(r,57360)),Promise.resolve().then(r.bind(r,91801)),Promise.resolve().then(r.bind(r,8043)),Promise.resolve().then(r.bind(r,21804)),Promise.resolve().then(r.bind(r,71273)),Promise.resolve().then(r.bind(r,39413)),Promise.resolve().then(r.bind(r,41499)),Promise.resolve().then(r.bind(r,31067)),Promise.resolve().then(r.bind(r,85921)),Promise.resolve().then(r.bind(r,16599)),Promise.resolve().then(r.t.bind(r,23119,23)),Promise.resolve().then(r.t.bind(r,58447,23)),Promise.resolve().then(r.t.bind(r,38660,23)),Promise.resolve().then(r.t.bind(r,88464,23)),Promise.resolve().then(r.t.bind(r,90575,23)),Promise.resolve().then(r.t.bind(r,44398,23)),Promise.resolve().then(r.t.bind(r,15207,23)),Promise.resolve().then(r.t.bind(r,5590,23)),Promise.resolve().then(r.t.bind(r,29959,23)),Promise.resolve().then(r.t.bind(r,8724,23)),Promise.resolve().then(r.bind(r,30881)),Promise.resolve().then(r.t.bind(r,4668,23)),Promise.resolve().then(r.t.bind(r,83418,23)),Promise.resolve().then(r.t.bind(r,39888,23)),Promise.resolve().then(r.t.bind(r,61931,23)),Promise.resolve().then(r.t.bind(r,36149,23)),Promise.resolve().then(r.t.bind(r,3891,23)),Promise.resolve().then(r.t.bind(r,87604,23))},16599:function(e,t,r){"use strict";r.d(t,{default:function(){return j}});var s=r(29262),n=r(9690),o=r(27654),i=r(45028),l=r(10165),a=r(71273),f=r(34952),d=r(74811);let m=()=>(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("link",{rel:"preload",as:"image",href:"/illustrations/home-page/hero.svg",type:"image/svg+xml"}),(0,s.jsx)("link",{rel:"preload",as:"image",href:"/logo-white.svg",type:"image/svg+xml"}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/barlow-v12-latin-600.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/barlow-v12-latin-700.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-regular.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-italic.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-500.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-600.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-700.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-500italic.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-600italic.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/inter-v18-latin-700italic.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/barlow-v12-latin-regular.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/barlow-v12-latin-italic.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/barlow-v12-latin-600italic.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/barlow-v12-latin-700italic.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"https://calculator.prisma.io/",as:"document"}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/fa-regular-400.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/fa-solid-900.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/fa-light-300.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/fonts/fa-brands-400.woff2",as:"font",type:"font/woff2",crossOrigin:""}),(0,s.jsx)("link",{rel:"preload",href:"/rive.wasm",as:"fetch",type:"application/wasm",crossOrigin:"anonymous"})]});function h(){return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(m,{}),(0,s.jsx)(f.default,{id:"cookieyes",type:"text/javascript",src:"https://cdn-cookieyes.com/client_data/96980f76df67ad5235fc3f0d/script.js"}),(0,s.jsx)(f.default,{id:"gmanager",dangerouslySetInnerHTML:{__html:"(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\n new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\n j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n })(window,document,'script','dataLayer','GTM-KCGZPWB');\n "}}),(0,s.jsx)(f.default,{id:"website",...(0,d.h6)({"@context":"https://schema.org","@type":"WebSite",name:"Prisma",description:"Prisma is a next-generation Node.js and TypeScript ORM for PostgreSQL, MySQL, SQL Server, SQLite, MongoDB, and CockroachDB. It provides type-safety, automated migrations, and an intuitive data model.",url:"https://www.prisma.io"})}),(0,s.jsx)(f.default,{async:!0,src:"https://cdn.tolt.io/tolt.js","data-tolt":"fda67739-7ed0-42d2-b716-6da0edbec191"}),(0,s.jsx)(f.default,{id:"org",...(0,d.h6)({"@context":"https://schema.org","@type":"Organization",name:"Prisma",url:"https://www.prisma.io",sameAs:["https://github.com/prisma","https://twitter.com/prisma","https://www.linkedin.com/company/prisma-io","https://www.youtube.com/prismadata","https://www.facebook.com/prisma.io/"]})})]})}var c=r(37633),p=r(58126),u=r(28711),w=r(88525),v=r(59110);let g=!1;var b=()=>{let e=null,t=null,r=!1;try{e=(0,p.usePathname)(),t=(0,p.useRouter)(),r=!0}catch(n){let s=(0,u.useRouter)();e=s.pathname,t=s,r=!1}let s=(0,w.useRef)(null),n=(0,w.useRef)(!0);(0,w.useRef)(Math.random().toString(36).substring(7)),(0,w.useEffect)(()=>{let t=e;return()=>{s.current=t}},[e]),(0,w.useEffect)(()=>{if(null==e?void 0:e.includes("/sanity-studio"))return;let s=new URLSearchParams(window.location.search),o=s.has("utm_source")||s.has("utm_medium")||s.has("utm_campaign"),i=!n.current,l=localStorage.getItem("utm_params");if(!g){if(g=!0,i&&!o&&l){r?t.replace("".concat(e,"?").concat(l)):t.replace("".concat(e,"?").concat(l),void 0,{shallow:!0}),n.current=!1,setTimeout(()=>{g=!1},50);return}if(o){let e=(0,v.SB)(s);localStorage.setItem("utm_params",e.toString())}else i||(!document.referrer||document.referrer&&new URL(document.referrer).origin!==window.location.origin)&&localStorage.removeItem("utm_params");n.current=!1,g=!1}},[e,t])};let P=e=>{let{children:t,className:r,id:f}=e,{mode:d,tealPage:m,variant:p,openNav:u}=(0,c.F)();return b(),(0,s.jsxs)("html",{lang:"en",className:"light"===d?i.By:i.ai,children:[(0,s.jsx)("head",{children:(0,s.jsx)(h,{})}),(0,s.jsxs)("body",{className:(0,n.Z)(a.body,u&&a.openNav),...p?{id:p,"data-testid":p}:{},children:[(0,s.jsx)("noscript",{dangerouslySetInnerHTML:{__html:'<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KCGZPWB" height="0" width="0" style="display:none;visibility:hidden"></iframe>'}}),(0,s.jsx)(l.default,{mode:d||"dark",content:[(0,s.jsxs)("a",{href:"/postgres?utm_source=website&utm_medium=banner",className:"banner-url",children:["Ship faster with Postgres designed for the way you build today"," ","->"," Try Prisma Postgres."]},"postgres-banner"),(0,s.jsxs)(o.default,{href:"/startups",className:"banner-url",children:["Building a startup? Get ",(0,s.jsx)("b",{children:"$10K database credits"})," ","->"," Apply now"]},"startups-banner")]}),(0,s.jsx)(i.JL,{theme:d||"dark",color:m?"teal":"indigo"}),(0,s.jsx)("div",{"data-testid":f,id:f,className:(0,n.Z)(r),children:t}),(0,s.jsx)(i.$_,{hideNewsletter:!0,color:"indigo",darker:!0})]})]})};function j(e){let{children:t}=e;return(0,s.jsx)(c.Z,{children:(0,s.jsx)(P,{children:t})})}},36149:function(){}},function(e){e.O(0,[695,3438,4578,7630,4995,6991,7302,5715,2038,3874,3156,2815,4952,5830,265,9166,7615,1744],function(){return e(e.s=48789)}),_N_E=e.O()}]); No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if this JS file is referenced anywhere in the active codebase
rg -l "layout-cf24a85dfe968efb" --type=html --type=tsx --type=ts -g '!**/prisma_files/**'

Repository: prisma/web

Length of output: 81


🏁 Script executed:

#!/bin/bash
# Search for references to this build artifact using valid file types
rg "layout-cf24a85dfe968efb" --type js --type ts -g '!**/prisma_files/**'

Repository: prisma/web

Length of output: 36


🏁 Script executed:

#!/bin/bash
# Explore the prisma_files directory to understand its purpose
find apps/site/public/illustrations/about/prisma_files -type f | head -20

Repository: prisma/web

Length of output: 1991


🏁 Script executed:

#!/bin/bash
# Check the size and age of files in this directory
ls -lh apps/site/public/illustrations/about/prisma_files/ | head -20

Repository: prisma/web

Length of output: 1880


🏁 Script executed:

#!/bin/bash
# Look for any README or documentation about this directory
find apps/site/public/illustrations -name "README*" -o -name "*.md" | xargs cat 2>/dev/null

Repository: prisma/web

Length of output: 36


This production bundle is not referenced anywhere in the codebase — consider removing it.

This file is part of a batch of build artifacts (images, JS, and CSS) all dated March 27 with content-hash naming, suggesting a CMS export or bulk download. However, rg found zero references to this specific bundle in the active codebase, making it dead code.

A few points:

  1. Unused: Since nothing references layout-cf24a85dfe968efb, this bundle isn't executed anywhere. It's purely taking up space.

  2. Stale by definition: If it's not referenced, it won't receive updates when the original layout component changes. You're locked into whatever this snapshot contained at the time it was dumped here.

  3. Mixing concerns: The public/illustrations/about/prisma_files/ directory blends actual image assets with executable JavaScript and CSS bundles. If these are imported from a CMS (Sanity or similar), that makes sense as a cache layer — but it's worth documenting why, and ensuring they're not accidentally served in unexpected contexts.

Action: Either document the purpose of prisma_files/ (if it's intentional CMS caching), or remove this unused artifact to clean up the repository.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/layout-cf24a85dfe968efb.js`
at line 1, Remove or document the unused production bundle file
layout-cf24a85dfe968efb.js inside the public/illustrations/about/prisma_files/
directory: if this is an accidental CMS/export artifact, delete the file (and
similar dated content-hash artifacts) and update the commit to remove them; if
this directory is an intentional CMS cache layer, add documentation (README)
explaining its purpose and add an entry to .gitignore or repository docs to
prevent future accidental commits; reference the prisma_files directory and the
layout-cf24a85dfe968efb.js filename when making the change so reviewers can
verify the removal or added documentation.

@@ -0,0 +1 @@
(()=>{let n="https://58qr5yci46.execute-api.us-east-1.amazonaws.com/v1",s=null,d=null;function t(t,e){r.push({command:t,data:e})}var r;window.tolt_referral=null,window.tolt_data=null,window.tolt=window.tolt||(r=[],t.queue=r,t);let c=(e,t)=>{((e,r)=>{let n=0,o=setInterval(()=>{var t=document.querySelectorAll(e);(0<t.length||10<=n)&&(clearInterval(o),0<t.length)&&r(t),n++},500)})({payment_links:t?`a[href^="${t}"], a[href^="https://buy.stripe.com"]`:'a[href^="https://buy.stripe.com"]',pricing_table:"stripe-pricing-table",buy_button:"stripe-buy-button"}[e],t=>{("payment_links"===e?t=>{if(window.tolt_referral&&0<t.length)for(var e=0;e<t.length;e++){var r=t[e];-1===r.href.indexOf("client_reference_id")&&(-1===r.href.indexOf("?")?r.href=r.href+"?client_reference_id="+window.tolt_referral:r.href=r.href+"&client_reference_id="+window.tolt_referral)}}:t=>{if(window.tolt_referral&&0<t.length)for(var e=0;e<t.length;e++){var r=t[e];r.hasAttribute("client-reference-id")||r.setAttribute("client-reference-id",window.tolt_referral)}})(t)})};function u(t,e,r){var n=new Date,r=(n.setTime(n.getTime()+24*r*60*60*1e3),"expires="+n.toUTCString());document.cookie="tolt_referral"===t?`tolt_referral=${e};${r};path=/;domain=${d};samesite=none;secure`:`${t}=${encodeURIComponent(JSON.stringify(e))};${r};path=/;domain=${d};samesite=none;secure`}function w(e){e=("; "+document.cookie).split(`; ${e}=`);if(2===e.length){e=decodeURIComponent(e.pop().split(";").shift());try{return JSON.parse(e)}catch(t){return e}}}async function f(e,t){if(s&&d)try{var r=await(await fetch(n+`/${e}?id=`+window.tolt_referral,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,public_id:s})})).json();return"signup"===e&&r.customer_id&&(window.tolt_data.customer_id=r.customer_id,u("tolt_data",window.tolt_data,30)),r}catch(t){console.error(`API call to ${e} failed:`,t)}else console.warn("Public ID (data-tolt) or domain is missing. API calls will not be made.")}async function p(t,e){switch(t){case"signup":case"conversion":case"clicks":return f(t,e);default:console.warn("Unknown command:",t,e)}}(async()=>{var t,e;t=document.querySelector("script[data-tolt]"),(s=t?t.getAttribute("data-tolt"):null)?(t=async()=>{var t,e;d=(l=window.location.hostname).endsWith(".local")?2<(n=l.split(".")).length?n.slice(-2).join("."):l:"undefined"!=typeof psl&&psl.parse(l).domain||l,w("tolt_referral");if(w("tolt_referral")||w("tolt_data"))window.tolt_referral=w("tolt_referral"),window.tolt_data=w("tolt_data");else{var r,n,o=new URLSearchParams(window.location.search);let t={};for(r of["tolt","ref","aff","via","lmref","fpr","tap_s","afmc","f2f-ref","join","ali"])if(o.has(r)){var i=window.location.href;t={public_id:s,param:r,code:o.get(r),page:i,referrer:document?.referrer};break}0!==Object.keys(t).length&&(n=await f("clicks",t))&&n.click_id&&(l=n.cookie_duration||30,console.log("Referral code:",n.referral),u("tolt_referral",n.referral,l),window.tolt_referral=n.referral,window.tolt_data={click_id:n.click_id||null,cookie_duration:l||null,partner_id:n.partner_id||null,customer_id:n.customer_id||null,program_id:n.program_id||null},u("tolt_data",window.tolt_data,l))}await 0;for({command:t,data:e}of window.tolt.queue||[])await p(t,e);window.tolt.queue=[],await 0,window.tolt=async function(t,e){return p(t,e)},window.tolt.signup=async function(t){var e="signup_"+t;if(window.tolt._signupInProgress&&window.tolt._signupInProgress[e])return console.warn("Signup already in progress for email: "+t),{message:"Signup already in progress"};window.tolt._signupInProgress||(window.tolt._signupInProgress={}),window.tolt._signupInProgress[e]=!0;try{return await p("signup",{email:t,public_id:s})}finally{delete window.tolt._signupInProgress[e]}};var a,l=document.querySelector("script[data-tolt]");l&&l.hasAttribute("data-stripe-type")&&(a=l.getAttribute("data-stripe-type"),l=l.getAttribute("data-stripe-domain"),c(a,l)),document.dispatchEvent(new Event("toltScriptLoaded"))},(e=document.createElement("script")).src="https://cdn.jsdelivr.net/npm/psl/dist/psl.min.js",e.onload=t,e.onerror=()=>console.error("Failed to load the PSL script"),document.head.appendChild(e)):console.warn("Public ID (data-tolt) is missing. Script initialization aborted.")})()})(); No newline at end of file
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Guard window.tolt_data before writing customer_id.

Line 1 updates window.tolt_data.customer_id on a successful signup response, but window.tolt_data is still null when signup happens before any click cookie/state is hydrated. That turns a successful API response into a client-side exception. This block also resets the cookie TTL to 30 days instead of preserving the configured duration already stored in tolt_data.

Suggested patch
- return "signup"===e&&r.customer_id&&(window.tolt_data.customer_id=r.customer_id,u("tolt_data",window.tolt_data,30)),r
+ if (e === "signup" && r.customer_id) {
+   window.tolt_data = {
+     ...(window.tolt_data ?? {}),
+     customer_id: r.customer_id,
+   };
+   u("tolt_data", window.tolt_data, window.tolt_data.cookie_duration ?? 30);
+ }
+ return r
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
(()=>{let n="https://58qr5yci46.execute-api.us-east-1.amazonaws.com/v1",s=null,d=null;function t(t,e){r.push({command:t,data:e})}var r;window.tolt_referral=null,window.tolt_data=null,window.tolt=window.tolt||(r=[],t.queue=r,t);let c=(e,t)=>{((e,r)=>{let n=0,o=setInterval(()=>{var t=document.querySelectorAll(e);(0<t.length||10<=n)&&(clearInterval(o),0<t.length)&&r(t),n++},500)})({payment_links:t?`a[href^="${t}"], a[href^="https://buy.stripe.com"]`:'a[href^="https://buy.stripe.com"]',pricing_table:"stripe-pricing-table",buy_button:"stripe-buy-button"}[e],t=>{("payment_links"===e?t=>{if(window.tolt_referral&&0<t.length)for(var e=0;e<t.length;e++){var r=t[e];-1===r.href.indexOf("client_reference_id")&&(-1===r.href.indexOf("?")?r.href=r.href+"?client_reference_id="+window.tolt_referral:r.href=r.href+"&client_reference_id="+window.tolt_referral)}}:t=>{if(window.tolt_referral&&0<t.length)for(var e=0;e<t.length;e++){var r=t[e];r.hasAttribute("client-reference-id")||r.setAttribute("client-reference-id",window.tolt_referral)}})(t)})};function u(t,e,r){var n=new Date,r=(n.setTime(n.getTime()+24*r*60*60*1e3),"expires="+n.toUTCString());document.cookie="tolt_referral"===t?`tolt_referral=${e};${r};path=/;domain=${d};samesite=none;secure`:`${t}=${encodeURIComponent(JSON.stringify(e))};${r};path=/;domain=${d};samesite=none;secure`}function w(e){e=("; "+document.cookie).split(`; ${e}=`);if(2===e.length){e=decodeURIComponent(e.pop().split(";").shift());try{return JSON.parse(e)}catch(t){return e}}}async function f(e,t){if(s&&d)try{var r=await(await fetch(n+`/${e}?id=`+window.tolt_referral,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,public_id:s})})).json();return"signup"===e&&r.customer_id&&(window.tolt_data.customer_id=r.customer_id,u("tolt_data",window.tolt_data,30)),r}catch(t){console.error(`API call to ${e} failed:`,t)}else console.warn("Public ID (data-tolt) or domain is missing. API calls will not be made.")}async function p(t,e){switch(t){case"signup":case"conversion":case"clicks":return f(t,e);default:console.warn("Unknown command:",t,e)}}(async()=>{var t,e;t=document.querySelector("script[data-tolt]"),(s=t?t.getAttribute("data-tolt"):null)?(t=async()=>{var t,e;d=(l=window.location.hostname).endsWith(".local")?2<(n=l.split(".")).length?n.slice(-2).join("."):l:"undefined"!=typeof psl&&psl.parse(l).domain||l,w("tolt_referral");if(w("tolt_referral")||w("tolt_data"))window.tolt_referral=w("tolt_referral"),window.tolt_data=w("tolt_data");else{var r,n,o=new URLSearchParams(window.location.search);let t={};for(r of["tolt","ref","aff","via","lmref","fpr","tap_s","afmc","f2f-ref","join","ali"])if(o.has(r)){var i=window.location.href;t={public_id:s,param:r,code:o.get(r),page:i,referrer:document?.referrer};break}0!==Object.keys(t).length&&(n=await f("clicks",t))&&n.click_id&&(l=n.cookie_duration||30,console.log("Referral code:",n.referral),u("tolt_referral",n.referral,l),window.tolt_referral=n.referral,window.tolt_data={click_id:n.click_id||null,cookie_duration:l||null,partner_id:n.partner_id||null,customer_id:n.customer_id||null,program_id:n.program_id||null},u("tolt_data",window.tolt_data,l))}await 0;for({command:t,data:e}of window.tolt.queue||[])await p(t,e);window.tolt.queue=[],await 0,window.tolt=async function(t,e){return p(t,e)},window.tolt.signup=async function(t){var e="signup_"+t;if(window.tolt._signupInProgress&&window.tolt._signupInProgress[e])return console.warn("Signup already in progress for email: "+t),{message:"Signup already in progress"};window.tolt._signupInProgress||(window.tolt._signupInProgress={}),window.tolt._signupInProgress[e]=!0;try{return await p("signup",{email:t,public_id:s})}finally{delete window.tolt._signupInProgress[e]}};var a,l=document.querySelector("script[data-tolt]");l&&l.hasAttribute("data-stripe-type")&&(a=l.getAttribute("data-stripe-type"),l=l.getAttribute("data-stripe-domain"),c(a,l)),document.dispatchEvent(new Event("toltScriptLoaded"))},(e=document.createElement("script")).src="https://cdn.jsdelivr.net/npm/psl/dist/psl.min.js",e.onload=t,e.onerror=()=>console.error("Failed to load the PSL script"),document.head.appendChild(e)):console.warn("Public ID (data-tolt) is missing. Script initialization aborted.")})()})();
(()=>{let n="https://58qr5yci46.execute-api.us-east-1.amazonaws.com/v1",s=null,d=null;function t(t,e){r.push({command:t,data:e})}var r;window.tolt_referral=null,window.tolt_data=null,window.tolt=window.tolt||(r=[],t.queue=r,t);let c=(e,t)=>{((e,r)=>{let n=0,o=setInterval(()=>{var t=document.querySelectorAll(e);(0<t.length||10<=n)&&(clearInterval(o),0<t.length)&&r(t),n++},500)})({payment_links:t?`a[href^="${t}"], a[href^="https://buy.stripe.com"]`:'a[href^="https://buy.stripe.com"]',pricing_table:"stripe-pricing-table",buy_button:"stripe-buy-button"}[e],t=>{("payment_links"===e?t=>{if(window.tolt_referral&&0<t.length)for(var e=0;e<t.length;e++){var r=t[e];-1===r.href.indexOf("client_reference_id")&&(-1===r.href.indexOf("?")?r.href=r.href+"?client_reference_id="+window.tolt_referral:r.href=r.href+"&client_reference_id="+window.tolt_referral)}}:t=>{if(window.tolt_referral&&0<t.length)for(var e=0;e<t.length;e++){var r=t[e];r.hasAttribute("client-reference-id")||r.setAttribute("client-reference-id",window.tolt_referral)}})(t)})};function u(t,e,r){var n=new Date,r=(n.setTime(n.getTime()+24*r*60*60*1e3),"expires="+n.toUTCString());document.cookie="tolt_referral"===t?`tolt_referral=${e};${r};path=/;domain=${d};samesite=none;secure`:`${t}=${encodeURIComponent(JSON.stringify(e))};${r};path=/;domain=${d};samesite=none;secure`}function w(e){e=("; "+document.cookie).split(`; ${e}=`);if(2===e.length){e=decodeURIComponent(e.pop().split(";").shift());try{return JSON.parse(e)}catch(t){return e}}}async function f(e,t){if(s&&d)try{var r=await(await fetch(n+`/${e}?id=`+window.tolt_referral,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,public_id:s})})).json();if(e==="signup"&&r.customer_id){window.tolt_data={...(window.tolt_data??{}),customer_id:r.customer_id};u("tolt_data",window.tolt_data,window.tolt_data.cookie_duration??30)}return r}catch(t){console.error(`API call to ${e} failed:`,t)}else console.warn("Public ID (data-tolt) or domain is missing. API calls will not be made.")}async function p(t,e){switch(t){case"signup":case"conversion":case"clicks":return f(t,e);default:console.warn("Unknown command:",t,e)}}(async()=>{var t,e;t=document.querySelector("script[data-tolt]"),(s=t?t.getAttribute("data-tolt"):null)?(t=async()=>{var t,e;d=(l=window.location.hostname).endsWith(".local")?2<(n=l.split(".")).length?n.slice(-2).join("."):l:"undefined"!=typeof psl&&psl.parse(l).domain||l,w("tolt_referral");if(w("tolt_referral")||w("tolt_data"))window.tolt_referral=w("tolt_referral"),window.tolt_data=w("tolt_data");else{var r,n,o=new URLSearchParams(window.location.search);let t={};for(r of["tolt","ref","aff","via","lmref","fpr","tap_s","afmc","f2f-ref","join","ali"])if(o.has(r)){var i=window.location.href;t={public_id:s,param:r,code:o.get(r),page:i,referrer:document?.referrer};break}0!==Object.keys(t).length&&(n=await f("clicks",t))&&n.click_id&&(l=n.cookie_duration||30,console.log("Referral code:",n.referral),u("tolt_referral",n.referral,l),window.tolt_referral=n.referral,window.tolt_data={click_id:n.click_id||null,cookie_duration:l||null,partner_id:n.partner_id||null,customer_id:n.customer_id||null,program_id:n.program_id||null},u("tolt_data",window.tolt_data,l))}await 0;for({command:t,data:e}of window.tolt.queue||[])await p(t,e);window.tolt.queue=[],await 0,window.tolt=async function(t,e){return p(t,e)},window.tolt.signup=async function(t){var e="signup_"+t;if(window.tolt._signupInProgress&&window.tolt._signupInProgress[e])return console.warn("Signup already in progress for email: "+t),{message:"Signup already in progress"};window.tolt._signupInProgress||(window.tolt._signupInProgress={}),window.tolt._signupInProgress[e]=!0;try{return await p("signup",{email:t,public_id:s})}finally{delete window.tolt._signupInProgress[e]}};var a,l=document.querySelector("script[data-tolt]");l&&l.hasAttribute("data-stripe-type")&&(a=l.getAttribute("data-stripe-type"),l=l.getAttribute("data-stripe-domain"),c(a,l)),document.dispatchEvent(new Event("toltScriptLoaded"))},(e=document.createElement("script")).src="https://cdn.jsdelivr.net/npm/psl/dist/psl.min.js",e.onload=t,e.onerror=()=>console.error("Failed to load the PSL script"),document.head.appendChild(e)):console.warn("Public ID (data-tolt) is missing. Script initialization aborted.")})()})();
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/tolt.js` at line 1, The
signup handler in function f sets window.tolt_data.customer_id without ensuring
window.tolt_data exists and always uses a 30-day TTL; update the "signup" branch
inside f (the expression that currently does "return
'signup'===e&&r.customer_id&&(window.tolt_data.customer_id=r.customer_id,u('tolt_data',window.tolt_data,30)),r")
to first ensure window.tolt_data is an object (create it if null), assign
customer_id into it, and call u('tolt_data', window.tolt_data, ttl) where ttl
preserves an existing window.tolt_data.cookie_duration or uses r.cookie_duration
if present, falling back to 30 only as a last resort; reference symbols:
function f, helper u, and global window.tolt_data.

⚠️ Potential issue | 🟠 Major

Strip query/hash data before sending page and referrer.

Line 1 posts window.location.href and document.referrer verbatim to the referral API. That can leak tokens, emails, or other sensitive query/fragment data from the current page or the upstream referrer even though the referral code is already sent separately.

Suggested patch
- var i=window.location.href;
- t={public_id:s,param:r,code:o.get(r),page:i,referrer:document?.referrer};
+ const pageUrl = new URL(window.location.href);
+ const referrerUrl = document.referrer ? new URL(document.referrer) : null;
+ t = {
+   public_id: s,
+   param: r,
+   code: o.get(r),
+   page: `${pageUrl.origin}${pageUrl.pathname}`,
+   referrer: referrerUrl ? `${referrerUrl.origin}${referrerUrl.pathname}` : "",
+ };
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/tolt.js` at line 1, The
code posts full window.location.href and document.referrer when building the
referral payload (see the block that creates the local variable i assigned from
window.location.href and the object literal
{public_id:s,param:r,code:...,page:i,referrer:document?.referrer}); change these
to sanitized versions that strip query strings and fragments (e.g. use
location.origin + location.pathname for the current page and parse
document.referrer with URL to keep only origin+pathname) before placing them
into the payload, and also ensure any other places referencing
window.location.href or document.referrer (e.g. where click/signup payloads are
assembled) use the same sanitized values.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# Check if the file exists and get its size
if [ -f "apps/site/public/illustrations/about/prisma_files/tolt.js" ]; then
  echo "File exists"
  wc -l "apps/site/public/illustrations/about/prisma_files/tolt.js"
else
  echo "File not found; searching for tolt.js"
  find . -name "tolt.js" -type f 2>/dev/null | head -20
fi

Repository: prisma/web

Length of output: 125


🏁 Script executed:

# Extract relevant sections from the minified code
# Look for the psl script loading and error handling pattern
cat "apps/site/public/illustrations/about/prisma_files/tolt.js" | grep -o 'psl[^,}]*onload[^}]*onerror[^}]*appendChild' || echo "Pattern not found with simple grep"

Repository: prisma/web

Length of output: 88


🏁 Script executed:

# Use Python to parse and extract the psl loader section more intelligently
python3 << 'EOF'
import re

try:
    with open("apps/site/public/illustrations/about/prisma_files/tolt.js", "r") as f:
        content = f.read()
    
    # Find the psl script creation and loading section
    # Look for patterns like: createElement("script"), .src=, .onload=, .onerror=, .appendChild
    psl_section = re.search(r'e\.src\s*=\s*["\']https://[^"\']*psl[^"\']*["\'].*?document\.head\.appendChild\(e\)', content, re.DOTALL)
    
    if psl_section:
        print("PSL loader section found:")
        print(psl_section.group(0)[:500])  # Print first 500 chars
    else:
        print("PSL loader section not found")
        
    # Also search for the fallback logic with window.location.hostname
    fallback_check = re.search(r'endsWith.*?\.local.*?window\.location\.hostname', content, re.DOTALL)
    if fallback_check:
        print("\n\nFallback logic found:")
        print(fallback_check.group(0)[:300])
    else:
        print("\n\nNo fallback logic found")
        
except FileNotFoundError:
    print("File not found")
EOF

Repository: prisma/web

Length of output: 108


🏁 Script executed:

# Check file stats
stat "apps/site/public/illustrations/about/prisma_files/tolt.js"

Repository: prisma/web

Length of output: 98


🏁 Script executed:

# Sample the first 500 characters
head -c 500 "apps/site/public/illustrations/about/prisma_files/tolt.js"
echo ""

Repository: prisma/web

Length of output: 554


🏁 Script executed:

# Check if file is actually a symlink or has special encoding
file "apps/site/public/illustrations/about/prisma_files/tolt.js"

Repository: prisma/web

Length of output: 98


🏁 Script executed:

# Get full content and search for psl-related patterns
cat "apps/site/public/illustrations/about/prisma_files/tolt.js" | grep -o 'src="https://cdn.jsdelivr.net[^"]*psl[^"]*"' || echo "No psl src pattern found"

Repository: prisma/web

Length of output: 108


🏁 Script executed:

# Look for the script creation pattern more broadly
# Find section with: createElement("script"), then src=, then onload, then onerror
python3 << 'EOF'
with open("apps/site/public/illustrations/about/prisma_files/tolt.js", "r") as f:
    content = f.read()

# Find the section that creates script element for psl
# Pattern: e=document.createElement("script"), then .src=, .onload=, .onerror=, .appendChild
# Look for "e.src=" followed by psl cdn
import re

# Find where psl is loaded
idx = content.find('psl')
if idx != -1:
    # Get context: 300 chars before and 500 chars after
    start = max(0, idx - 300)
    end = min(len(content), idx + 500)
    print("Context around 'psl':")
    print(content[start:end])
    print("\n---\n")
    
# Also find onload= and onerror= patterns
onload_idx = content.find('.onload=')
if onload_idx != -1:
    start = max(0, onload_idx - 100)
    end = min(len(content), onload_idx + 300)
    print("Context around '.onload=':")
    print(content[start:end])
EOF

Repository: prisma/web

Length of output: 1200


🏁 Script executed:

# Extract and beautify the exact error handler section to confirm the issue
python3 << 'EOF'
with open("apps/site/public/illustrations/about/prisma_files/tolt.js", "r") as f:
    content = f.read()

# Find the exact section with onerror
import re
pattern = r'e\.onload\s*=\s*[^,]+,e\.onerror\s*=\s*[^,}]+(?:,|;)?document\.head\.appendChild'
match = re.search(pattern, content)

if match:
    print("Current error handler code:")
    print(match.group(0))
    print("\n---\n")

# Also show the fallback logic more clearly
fallback_pattern = r'd=\([^)]+\)\.endsWith[^,]+psl[^,]+\|\|'
fb_match = re.search(fallback_pattern, content)
if fb_match:
    print("Fallback pattern found (shows psl used conditionally):")
    # Get broader context
    idx = content.find('d=(l=window.location.hostname)')
    if idx != -1:
        print(content[idx:idx+400])
EOF

Repository: prisma/web

Length of output: 641


🏁 Script executed:

# Verify: does the code ever call t() in error scenario?
# Search for any error handling that calls t()
python3 << 'EOF'
with open("apps/site/public/illustrations/about/prisma_files/tolt.js", "r") as f:
    content = f.read()

# Look for onerror handlers that might call t()
import re
onerror_handlers = re.findall(r'onerror\s*=\s*[^,}]+', content)
print(f"Found {len(onerror_handlers)} onerror handlers:")
for handler in onerror_handlers:
    print(f"  {handler}")

# Specifically check if onerror calls t()
if 'onerror' in content:
    idx = content.find('onerror')
    print(f"\nContext around onerror:")
    print(content[max(0, idx-50):idx+150])
EOF

Repository: prisma/web

Length of output: 366


Fix the psl script load error handler to prevent silent initialization failure.

The onerror handler only logs the failure but never invokes the initialization callback t(). Even though the code contains a fallback for when psl is unavailable—it safely uses window.location.hostname directly—this fallback is unreachable when the psl script fails to load, because the initialization callback that contains this logic never runs. A CDN outage silently breaks queue replay, Stripe element injection, and the toltScriptLoaded event dispatch, leaving attribution inactive with no indication of failure.

Suggested patch
- e.onload=t,e.onerror=()=>console.error("Failed to load the PSL script"),document.head.appendChild(e)
+ e.onload = t;
+ e.onerror = () => {
+   console.error("Failed to load the PSL script");
+   t();
+ };
+ document.head.appendChild(e);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/public/illustrations/about/prisma_files/tolt.js` at line 1, The psl
script onerror handler only logs the error and never calls the initialization
callback t, preventing the fallback path in the self-invoking initializer from
running; update the onerror handler for the created script element (variable e)
so it calls the same init callback t() after logging the error (or invokes the
initializer directly) to ensure the code path that uses window.location.hostname
runs even when psl fails to load; reference the script element variable e, its
onerror handler, and the init callback t in your change (ensure any existing
console.error("Failed to load the PSL script") remains).

Comment on lines +208 to +216
{
icon: "fa-regular fa-cubes-stacked",
title: "Built on open source",
description: (
<p className="text-foreground-neutral text-foreground-neutral-weak text-sm font-normal m-0 leading-6">
Applying <a href="https://www.datadx.io/">Data DX</a> principles to all
our products, we create simple solutions for complex problems, making
building with data more accessible, regardless of team size.
</p>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

The third card heading doesn't match its body copy.

This tile repeats "Built on open source", but the description is about Data DX principles. It reads like a copy/paste miss and makes the hero grid inconsistent.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/about/page.tsx` around lines 208 - 216, The card object
with icon "fa-regular fa-cubes-stacked" has a mismatched title "Built on open
source" versus a description about Data DX; update the title in that card (the
object containing icon/title/description) to reflect the body copy (e.g., "Built
on Data DX" or "Data DX principles") so the heading and description match across
the hero grid.

Comment on lines +333 to +336
export const metadata: Metadata = {
title: SITE_HOME_TITLE,
description: SITE_HOME_DESCRIPTION,
};
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Don't reuse the home page metadata on /about.

SITE_HOME_TITLE and SITE_HOME_DESCRIPTION are defined as the home page copy in apps/site/src/lib/blog-metadata.ts:1-5, so this route will publish the wrong title and description to search engines and link previews.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/about/page.tsx` around lines 333 - 336, The /about page is
reusing SITE_HOME_TITLE and SITE_HOME_DESCRIPTION (from blog-metadata) which are
home-specific; update the exported metadata object in page.tsx to use
about-specific values instead: either create and import new constants (e.g.,
SITE_ABOUT_TITLE, SITE_ABOUT_DESCRIPTION) from a new or existing about-metadata
module, or replace the values with the correct about page strings inline in the
metadata export; ensure the symbol metadata in page.tsx references the new about
constants (not SITE_HOME_TITLE/SITE_HOME_DESCRIPTION) so search engines and
previews show the correct copy.

Comment on lines +494 to +497
<Button variant="orm" size="4xl">
<span>View open positions</span>
<i className="fa-regular fa-arrow-right ml-2" />
</Button>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Make the primary CTA actually navigate somewhere.

View open positions renders a button with no href, onClick, or surrounding link, so the footer CTA is inert right now.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/about/page.tsx` around lines 494 - 497, The footer CTA
using the Button component rendering the text "View open positions" is inert;
make it navigate to the careers page by either wrapping the Button with a Link
(next/link) pointing to the desired route (e.g. "/careers" or external jobs URL)
or by adding an onClick that calls router.push("/careers"); update the element
that contains Button in apps/site/src/app/about/page.tsx (the Button instance
with the <i className="fa-regular fa-arrow-right ml-2" />) to perform the
navigation so the CTA is actionable.

Comment on lines +20 to +27
{images.map((e: any, idx: number) => (
<Image
key={idx}
src={e.imageUrl}
width={400}
height={400}
alt="hello"
className="w-full rounded-lg shadow-[0px_18px_42px_0px_rgba(23,43,77,0.08),0px_4px_26px_0px_rgba(23,43,77,0.05),0px_0px_46px_0px_rgba(23,43,77,0.01)]"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Use the per-image alt text here.

Every tile currently renders alt="hello", so the gallery ignores the imageAlt data and announces the same meaningless label for every image. If these photos are decorative, the alt should be empty instead.

Suggested fix
-            {images.map((e: any, idx: number) => (
+            {images.map((image: any, idx: number) => (
               <Image
                 key={idx}
-                src={e.imageUrl}
+                src={image.imageUrl}
                 width={400}
                 height={400}
-                alt="hello"
+                alt={image.imageAlt ?? ""}
                 className="w-full rounded-lg shadow-[0px_18px_42px_0px_rgba(23,43,77,0.08),0px_4px_26px_0px_rgba(23,43,77,0.05),0px_0px_46px_0px_rgba(23,43,77,0.01)]"
               />
             ))}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
{images.map((e: any, idx: number) => (
<Image
key={idx}
src={e.imageUrl}
width={400}
height={400}
alt="hello"
className="w-full rounded-lg shadow-[0px_18px_42px_0px_rgba(23,43,77,0.08),0px_4px_26px_0px_rgba(23,43,77,0.05),0px_0px_46px_0px_rgba(23,43,77,0.01)]"
{images.map((image: any, idx: number) => (
<Image
key={idx}
src={image.imageUrl}
width={400}
height={400}
alt={image.imageAlt ?? ""}
className="w-full rounded-lg shadow-[0px_18px_42px_0px_rgba(23,43,77,0.08),0px_4px_26px_0px_rgba(23,43,77,0.05),0px_0px_46px_0px_rgba(23,43,77,0.01)]"
/>
))}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/components/careers/masonry.tsx` around lines 20 - 27, The Image
tiles currently hardcode alt="hello" inside the images.map rendering; update the
Image component to use each item's alt text (e.g., replace alt="hello" with
alt={e.imageAlt ?? ''} or alt={e.alt ?? ''} depending on your data shape) so
each image announces its own descriptive text, and fallback to an empty string
when the image is decorative or no alt provided.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (3)
apps/site/src/app/about/page.tsx (3)

203-211: ⚠️ Potential issue | 🟡 Minor

Rename the third hero card.

The heading still says "Built on open source", but the body copy is about Data DX. This reads like leftover copy and makes the card grid inconsistent.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/about/page.tsx` around lines 203 - 211, The third hero
card's title string ("Built on open source") is inconsistent with its
description about Data DX; find the hero card object that has icon "fa-regular
fa-cubes-stacked" and the JSX description referencing Data DX and replace the
title value with a matching heading such as "Built on Data DX" or "Data DX
principles" so the card's title and body copy are consistent.

489-492: ⚠️ Potential issue | 🔴 Critical

Make the primary CTA actually navigate.

This button still renders without an href, link wrapper, or click handler, so the page's main conversion point is dead. Point it at the intended jobs/careers destination.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/about/page.tsx` around lines 489 - 492, The primary CTA
Button rendering "View open positions" is missing navigation — wrap the Button
(the element containing <span>View open positions</span> and the <i> icon) with
a Link to the careers page (e.g. "/careers") or give the Button an onClick that
routes there; if this is a Next.js page, import Link from 'next/link' and
replace the bare Button with <Link href="/careers"><Button
...>...</Button></Link> so the main conversion CTA actually navigates to the
jobs/careers destination.

328-331: ⚠️ Potential issue | 🟠 Major

Use about-specific metadata on this route.

SITE_HOME_TITLE and SITE_HOME_DESCRIPTION still come from apps/site/src/lib/blog-metadata.ts, where they contain home-page product copy. That means /about will publish the wrong title and description to crawlers and link previews.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/about/page.tsx` around lines 328 - 331, The page exports
generic home metadata (export const metadata) using SITE_HOME_TITLE and
SITE_HOME_DESCRIPTION which are home-page copy; replace these with
about-specific metadata by either importing ABOUT_TITLE/ABOUT_DESCRIPTION (or
adding new ABOUT_PAGE_TITLE and ABOUT_PAGE_DESCRIPTION constants) and using
those in the metadata object for the about page (update the metadata symbol in
page.tsx to reference the about-specific identifiers so crawlers and link
previews get the correct title/description).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/site/src/app/about/page.tsx`:
- Around line 80-83: Multiple image entries use non-descriptive alt text
("About", "Masonry 1", "Hero lines"); update each imageAlt and mobileImageAlt
value to either a concise, descriptive string that conveys the image content for
assistive tech (e.g., "Portrait of team working in office" or "Abstract mosaic
background" where meaningful) or set alt="" for purely decorative/background
artwork. Locate all occurrences of the image objects that define
imageUrl/imageAlt/mobileImageUrl/mobileImageAlt (including the blocks containing
"Masonry 1" and "Hero lines") and replace the placeholder strings accordingly,
keeping mobile and desktop alts consistent or tailored to the cropped mobile
view.

---

Duplicate comments:
In `@apps/site/src/app/about/page.tsx`:
- Around line 203-211: The third hero card's title string ("Built on open
source") is inconsistent with its description about Data DX; find the hero card
object that has icon "fa-regular fa-cubes-stacked" and the JSX description
referencing Data DX and replace the title value with a matching heading such as
"Built on Data DX" or "Data DX principles" so the card's title and body copy are
consistent.
- Around line 489-492: The primary CTA Button rendering "View open positions" is
missing navigation — wrap the Button (the element containing <span>View open
positions</span> and the <i> icon) with a Link to the careers page (e.g.
"/careers") or give the Button an onClick that routes there; if this is a
Next.js page, import Link from 'next/link' and replace the bare Button with
<Link href="/careers"><Button ...>...</Button></Link> so the main conversion CTA
actually navigates to the jobs/careers destination.
- Around line 328-331: The page exports generic home metadata (export const
metadata) using SITE_HOME_TITLE and SITE_HOME_DESCRIPTION which are home-page
copy; replace these with about-specific metadata by either importing
ABOUT_TITLE/ABOUT_DESCRIPTION (or adding new ABOUT_PAGE_TITLE and
ABOUT_PAGE_DESCRIPTION constants) and using those in the metadata object for the
about page (update the metadata symbol in page.tsx to reference the
about-specific identifiers so crawlers and link previews get the correct
title/description).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: bc6b5ac7-9c96-4d35-9fef-f8612c91ff3e

📥 Commits

Reviewing files that changed from the base of the PR and between 343649d and 2cc778f.

📒 Files selected for processing (1)
  • apps/site/src/app/about/page.tsx

Comment on lines +80 to +83
imageUrl: "/illustrations/about/about_0",
imageAlt: "About",
mobileImageUrl: "/illustrations/about/about_0",
mobileImageAlt: "About",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Replace the placeholder alt text on these images.

"About", "Masonry 1", and "Hero lines" don't give assistive tech any useful context. Use descriptive alt text for meaningful images, and alt="" for decorative artwork/backgrounds.

Also applies to: 145-148, 157-172, 339-347

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@apps/site/src/app/about/page.tsx` around lines 80 - 83, Multiple image
entries use non-descriptive alt text ("About", "Masonry 1", "Hero lines");
update each imageAlt and mobileImageAlt value to either a concise, descriptive
string that conveys the image content for assistive tech (e.g., "Portrait of
team working in office" or "Abstract mosaic background" where meaningful) or set
alt="" for purely decorative/background artwork. Locate all occurrences of the
image objects that define imageUrl/imageAlt/mobileImageUrl/mobileImageAlt
(including the blocks containing "Masonry 1" and "Hero lines") and replace the
placeholder strings accordingly, keeping mobile and desktop alts consistent or
tailored to the cropped mobile view.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant