Conversation
WalkthroughAdds 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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes 🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
|
The latest updates on your projects. Learn more about Argos notifications ↗︎
|
There was a problem hiding this comment.
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
⛔ Files ignored due to path filters (71)
apps/site/public/icons/companies/about/altimeter.svgis excluded by!**/*.svgapps/site/public/icons/companies/about/amplify.svgis excluded by!**/*.svgapps/site/public/icons/companies/about/fathom.svgis excluded by!**/*.svgapps/site/public/icons/companies/about/ivp.svgis excluded by!**/*.svgapps/site/public/icons/companies/about/kleiner-perkins.svgis excluded by!**/*.svgapps/site/public/icons/companies/about/system-one.svgis excluded by!**/*.svgapps/site/public/illustrations/about/about_0.svgis excluded by!**/*.svgapps/site/public/illustrations/about/about_0_light.svgis excluded by!**/*.svgapps/site/public/illustrations/about/about_1.svgis excluded by!**/*.svgapps/site/public/illustrations/about/about_1_light.svgis excluded by!**/*.svgapps/site/public/illustrations/about/hero_bg.svgis excluded by!**/*.svgapps/site/public/illustrations/about/hero_bg_light.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/01d73ffd0742aee4bb8f5094755bbf4c8a6f83d5-225x225.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/0296c63e6cb358789ee2e8e8bbe373b5be0d2b21-200x200.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/07c17958b386a607bfce5428de6ee46ec751a91a-3792x2845.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/0db0ed93bc58ad5cf6985a3e781a32b6d948c43e-519x680.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/0e8b284f045c3aa0c3f389678402137028920c68-461x263.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/10bfd6ecaa49258e970f665796456121df77f3fe-2048x1365.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/1b3698c250765f09e18bbf2b799e683c4cd54947-178x29.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/1c34bce335f90fe52fb95c1df232caa3bb637588-200x200.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/2e019733d341be788cc69ef340d8a3140f5383e4-227x222.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/354e0720283c6c4d95a40a351f4d56756d28dceb-400x400.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/394d186f400227fff5e71467b6161836f20fd06a-188x188.pngis excluded by!**/*.pngapps/site/public/illustrations/about/prisma_files/42c637eaaed5341ca3d58401a6df89d4b7f78cd8-2758x4142.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/4bd99e8b741a8134cb0684ff92e091398d6d6a6c-300x300.pngis excluded by!**/*.pngapps/site/public/illustrations/about/prisma_files/6614514c52c46a2c0dca3387761dfbf110ea6e8f-53x40.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/6ddac71dbf7aef73e7ac36a4c1e2991af1d51568-245x24.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/6f2151ed08d45abd2e313f97d2961b01cfcfab0b-461x263.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/7a8b63cf5b1857d758c2cedf8abae7bf46a4fb5d-2196x1464.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/815e3639bf5015b8fb73c8e04ba013ae2e308d26-400x400.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/9435edc784d96be94591febcbeba2ddcef634f0d-3024x4032.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/9dde2ecce5c1a7eb6d26bcd67a9977a3bf6add84-240x239.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/a287aa7afa807276e1c1b2f4f066bc39d4812750-170x29.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/a7d8e10d8a79776b14ef16aa697ee5aed11eada3-1000x667.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/a92221e0f1209b27e3e08e0c7585a602498170e3-126x126.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/a97e3b4e19dbcd0ffe56405050ced0a2cab2b1e1-400x400.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/aa05e441e8ce81c2b660fbce6ce333e06482d97b-6000x4000.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/ab64fadb9a1e6b2dc4d7a85aee7da95a54358d70-300x300.pngis excluded by!**/*.pngapps/site/public/illustrations/about/prisma_files/ab8da63ccc0309c00b55e2b87a5c834f5e39b68b-227x222.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/bd84f47217c32edff355162d73d991f0d533eac2-502x683.pngis excluded by!**/*.pngapps/site/public/illustrations/about/prisma_files/cb32ce5bc133b0f22f8e8416a6e897ea84c7715b-139x31.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/close.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/d030a86003f4ccda292bdcb7ff5dfbb4e03066a3-200x200.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/dd6ee90c01850a6e35416bf7a3c087c6725c5461-200x113.pngis excluded by!**/*.pngapps/site/public/illustrations/about/prisma_files/fd62c80d50a331ecf48d34e10ef78e3b938a6a34-6118x4079.jpgis excluded by!**/*.jpgapps/site/public/illustrations/about/prisma_files/fd6f119163e2aaeac4bbcab5e947e5849555281a-124x35.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/gdpr.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/hipaa.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/insight.min.jsis excluded by!**/*.min.jsapps/site/public/illustrations/about/prisma_files/iso27.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/logo-white.svgis excluded by!**/*.svgapps/site/public/illustrations/about/prisma_files/psl.min.jsis excluded by!**/*.min.jsapps/site/public/illustrations/about/prisma_files/soc2.svgis excluded by!**/*.svgapps/site/public/illustrations/careers/hero_lines.svgis excluded by!**/*.svgapps/site/public/illustrations/careers/hero_lines_light.svgis excluded by!**/*.svgapps/site/public/illustrations/careers/hero_lines_mobile_light.svgis excluded by!**/*.svgapps/site/public/photos/people/adam-gross.jpgis excluded by!**/*.jpgapps/site/public/photos/people/adam-wiggins.jpgis excluded by!**/*.jpgapps/site/public/photos/people/andy-chung.pngis excluded by!**/*.pngapps/site/public/photos/people/augusto-marietti.jpegis excluded by!**/*.jpegapps/site/public/photos/people/christian-bach.pngis excluded by!**/*.pngapps/site/public/photos/people/guillermo-rauch.jpegis excluded by!**/*.jpegapps/site/public/photos/people/james.pngis excluded by!**/*.pngapps/site/public/photos/people/jeremy-yap.pngis excluded by!**/*.pngapps/site/public/photos/people/nick-schrock.jpgis excluded by!**/*.jpgapps/site/public/photos/people/nicolas-dessaigne.jpgis excluded by!**/*.jpgapps/site/public/photos/people/philip-moehring.pngis excluded by!**/*.pngapps/site/public/photos/people/robin-vasan.jpgis excluded by!**/*.jpgapps/site/public/photos/people/spencer-kimball.jpegis excluded by!**/*.jpegpnpm-lock.yamlis excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (52)
apps/site/package.jsonapps/site/public/illustrations/about/prisma.htmlapps/site/public/illustrations/about/prisma_files/2815-807c31d5443cd91b.jsapps/site/public/illustrations/about/prisma_files/2a6fb28cfeead51d.cssapps/site/public/illustrations/about/prisma_files/3f3d7f98fd449ef4.cssapps/site/public/illustrations/about/prisma_files/468d1dc45841be39.cssapps/site/public/illustrations/about/prisma_files/7615-27c1a37f2e576ab0.jsapps/site/public/illustrations/about/prisma_files/7ccc8ba673eb4091.cssapps/site/public/illustrations/about/prisma_files/__enzuzo-cookiebar.jsapps/site/public/illustrations/about/prisma_files/adsctapps/site/public/illustrations/about/prisma_files/adsct(1)apps/site/public/illustrations/about/prisma_files/banner.jsapps/site/public/illustrations/about/prisma_files/be30ea5f-09b6c7eb0dcd4b70.jsapps/site/public/illustrations/about/prisma_files/beddc1125f0bc184.cssapps/site/public/illustrations/about/prisma_files/c876cebdff8dd769.cssapps/site/public/illustrations/about/prisma_files/c8d2c7ba52084189.cssapps/site/public/illustrations/about/prisma_files/config.jsapps/site/public/illustrations/about/prisma_files/d22b7bbe7e7112a8.cssapps/site/public/illustrations/about/prisma_files/ea94d1a48123726c.cssapps/site/public/illustrations/about/prisma_files/f.txtapps/site/public/illustrations/about/prisma_files/fb89d5bb5dbb824e.cssapps/site/public/illustrations/about/prisma_files/feedback.jsapps/site/public/illustrations/about/prisma_files/gtm.jsapps/site/public/illustrations/about/prisma_files/jsapps/site/public/illustrations/about/prisma_files/layout-cf24a85dfe968efb.jsapps/site/public/illustrations/about/prisma_files/main-app-4bd62aea08e7cb65.jsapps/site/public/illustrations/about/prisma_files/polyfills-42372ed130431b0a.jsapps/site/public/illustrations/about/prisma_files/posthog-recorder.jsapps/site/public/illustrations/about/prisma_files/script.jsapps/site/public/illustrations/about/prisma_files/surveys.jsapps/site/public/illustrations/about/prisma_files/tolt.jsapps/site/public/illustrations/about/prisma_files/uwt.jsapps/site/public/illustrations/about/prisma_files/webpack-6e25fd0d2f931c77.jsapps/site/public/photos/careers/masonry_1.webpapps/site/public/photos/careers/masonry_10.webpapps/site/public/photos/careers/masonry_11.webpapps/site/public/photos/careers/masonry_12.webpapps/site/public/photos/careers/masonry_13.webpapps/site/public/photos/careers/masonry_14.webpapps/site/public/photos/careers/masonry_2.webpapps/site/public/photos/careers/masonry_3.webpapps/site/public/photos/careers/masonry_4.webpapps/site/public/photos/careers/masonry_5.webpapps/site/public/photos/careers/masonry_6.webpapps/site/public/photos/careers/masonry_7.webpapps/site/public/photos/careers/masonry_8.webpapps/site/public/photos/careers/masonry_9.webpapps/site/public/photos/people/sam-lambert.webpapps/site/public/photos/people/tom-preston-warner.webpapps/site/src/app/about/page.tsxapps/site/src/components/careers/masonry.tsxapps/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 | |||
There was a problem hiding this comment.
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 | |||
There was a problem hiding this comment.
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:
- fix at source before bundling, or
- 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.
🧩 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.cssRepository: 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 | |||
There was a problem hiding this comment.
🧩 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 -20Repository: 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 -20Repository: 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/nullRepository: 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:
-
Unused: Since nothing references
layout-cf24a85dfe968efb, this bundle isn't executed anywhere. It's purely taking up space. -
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.
-
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 | |||
There was a problem hiding this comment.
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.
| (()=>{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.
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.
🧩 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
fiRepository: 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")
EOFRepository: 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])
EOFRepository: 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])
EOFRepository: 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])
EOFRepository: 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).
| { | ||
| 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> |
There was a problem hiding this comment.
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.
| export const metadata: Metadata = { | ||
| title: SITE_HOME_TITLE, | ||
| description: SITE_HOME_DESCRIPTION, | ||
| }; |
There was a problem hiding this comment.
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.
| <Button variant="orm" size="4xl"> | ||
| <span>View open positions</span> | ||
| <i className="fa-regular fa-arrow-right ml-2" /> | ||
| </Button> |
There was a problem hiding this comment.
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.
| {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)]" |
There was a problem hiding this comment.
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.
| {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.
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (3)
apps/site/src/app/about/page.tsx (3)
203-211:⚠️ Potential issue | 🟡 MinorRename 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 | 🔴 CriticalMake 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 | 🟠 MajorUse about-specific metadata on this route.
SITE_HOME_TITLEandSITE_HOME_DESCRIPTIONstill come fromapps/site/src/lib/blog-metadata.ts, where they contain home-page product copy. That means/aboutwill 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
📒 Files selected for processing (1)
apps/site/src/app/about/page.tsx
| imageUrl: "/illustrations/about/about_0", | ||
| imageAlt: "About", | ||
| mobileImageUrl: "/illustrations/about/about_0", | ||
| mobileImageAlt: "About", |
There was a problem hiding this comment.
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.
Summary by CodeRabbit
New Features
Chores