@m13v/seo-components 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/src/components/AnimatedBeam.tsx +1 -1
- package/src/components/AnimatedChecklist.tsx +2 -2
- package/src/components/AnimatedDemo.tsx +2 -2
- package/src/components/BackgroundGrid.tsx +1 -1
- package/src/components/BeforeAfter.tsx +3 -3
- package/src/components/BentoGrid.tsx +1 -1
- package/src/components/BookCallCTA.tsx +24 -6
- package/src/components/ClaudeMeterCta.tsx +1 -1
- package/src/components/CodeComparison.tsx +4 -4
- package/src/components/ComparisonTable.tsx +3 -3
- package/src/components/FaqSection.tsx +1 -1
- package/src/components/FlowDiagram.tsx +2 -2
- package/src/components/GetStartedCTA.tsx +1 -1
- package/src/components/GlowCard.tsx +1 -1
- package/src/components/HorizontalStepper.tsx +2 -2
- package/src/components/HtmlSitemap.tsx +3 -3
- package/src/components/InlineCta.tsx +14 -2
- package/src/components/InlineTestimonial.tsx +1 -1
- package/src/components/IntegrationsGrid.tsx +1 -1
- package/src/components/LottiePlayer.tsx +1 -1
- package/src/components/MetricsRow.tsx +1 -1
- package/src/components/MotionSequence.tsx +2 -2
- package/src/components/OrbitingCircles.tsx +2 -2
- package/src/components/ProofBanner.tsx +1 -1
- package/src/components/RelatedPostsGrid.tsx +1 -1
- package/src/components/RemotionClip.tsx +1 -1
- package/src/components/SeoPageComments.tsx +4 -4
- package/src/components/SeoPageReactions.tsx +1 -1
- package/src/components/SequenceDiagram.tsx +1 -1
- package/src/components/ShineBorder.tsx +1 -1
- package/src/components/StepTimeline.tsx +1 -1
- package/src/components/StickyBottomCta.tsx +14 -3
- package/src/components/Team.tsx +2 -2
- package/src/index.ts +1 -0
- package/src/lib/generate-robots.ts +90 -0
- package/src/lib/track.ts +48 -0
- package/src/server.ts +7 -0
package/README.md
CHANGED
|
@@ -110,6 +110,8 @@ import { walkPages, createGuideChatHandler, logAiUsage } from "@seo/components/s
|
|
|
110
110
|
| Export | What it does |
|
|
111
111
|
|--------|-------------|
|
|
112
112
|
| `walkPages()` | Discovers all pages in `src/app/`, extracts titles, descriptions, H2 sections |
|
|
113
|
+
| `generateSitemap()` | Returns a `MetadataRoute.Sitemap` by walking `src/app` with priority tiers |
|
|
114
|
+
| `generateRobots()` | Returns a `MetadataRoute.Robots` with default + AI-crawler allowlist + sitemap URL |
|
|
113
115
|
| `createGuideChatHandler()` | Gemini streaming chat route handler |
|
|
114
116
|
| `discoverGuides()` | Legacy guide discovery (delegates to `walkPages`) |
|
|
115
117
|
| `getGuideContext()` | Builds page context for AI chat |
|
|
@@ -117,6 +119,48 @@ import { walkPages, createGuideChatHandler, logAiUsage } from "@seo/components/s
|
|
|
117
119
|
| `getSupabaseAdmin()` | Supabase admin client |
|
|
118
120
|
| `slugify()` | URL-safe slug utility |
|
|
119
121
|
|
|
122
|
+
### Sitemap + robots (canonical setup)
|
|
123
|
+
|
|
124
|
+
Every site should ship a **dynamic** sitemap and a robots.txt that references it. The library provides both as one-liners so you never hand-roll either again.
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
// src/app/sitemap.ts
|
|
128
|
+
import type { MetadataRoute } from "next";
|
|
129
|
+
import { generateSitemap } from "@seo/components/server";
|
|
130
|
+
|
|
131
|
+
export default function sitemap(): MetadataRoute.Sitemap {
|
|
132
|
+
return generateSitemap({ baseUrl: "https://yourdomain.com" });
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
// src/app/robots.ts
|
|
138
|
+
import type { MetadataRoute } from "next";
|
|
139
|
+
import { generateRobots } from "@seo/components/server";
|
|
140
|
+
|
|
141
|
+
export default function robots(): MetadataRoute.Robots {
|
|
142
|
+
return generateRobots({ baseUrl: "https://yourdomain.com" });
|
|
143
|
+
}
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
`generateSitemap()` walks `src/app/` for `page.tsx` files (skipping route groups, dynamic segments, `api/`, underscore-prefixed dirs) and applies priority tiers. For dynamic routes like `/blog/[slug]`, pass `extraEntries`:
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
return generateSitemap({
|
|
150
|
+
baseUrl: "https://yourdomain.com",
|
|
151
|
+
extraEntries: posts.map((p) => ({ url: `https://yourdomain.com/blog/${p.slug}` })),
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
`generateRobots()` emits the default `User-agent: *` rule, a 13-bot AI allowlist (GPTBot, ChatGPT-User, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, CCBot, Google-Extended, Bytespider, cohere-ai, Applebot, Applebot-Extended), and a sitemap URL derived from `baseUrl`. Override `aiAllowlist`, `disallow`, `extraRules`, or `sitemap` as needed.
|
|
156
|
+
|
|
157
|
+
Verify live after deploy:
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
curl -s -o /dev/null -w "%{http_code}\n" https://yourdomain.com/sitemap.xml # 200
|
|
161
|
+
curl -s https://yourdomain.com/robots.txt | grep sitemap.xml # non-empty
|
|
162
|
+
```
|
|
163
|
+
|
|
120
164
|
## JSON-LD Helpers
|
|
121
165
|
|
|
122
166
|
```tsx
|
package/dist/styles.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }
|
|
2
|
-
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.-bottom-24{bottom:-6rem}.-left-16{left:-4rem}.-left-8{left:-2rem}.-right-16{right:-4rem}.-top-24{top:-6rem}.bottom-0{bottom:0}.bottom-2{bottom:.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-4{left:1rem}.right-0{right:0}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.m-1{margin:.25rem}.m-auto{margin:auto}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-12{margin-top:3rem;margin-bottom:3rem}.my-16{margin-top:4rem;margin-bottom:4rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-ml-px{margin-left:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-14{margin-bottom:3.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-auto{margin-top:auto}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[14px\]{height:14px}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.min-h-0{min-height:0}.min-h-\[120px\]{min-height:120px}.min-h-\[180px\]{min-height:180px}.min-h-\[200px\]{min-height:200px}.min-h-\[280px\]{min-height:280px}.min-h-\[60px\]{min-height:60px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[7px\]{width:7px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[300px\]{min-width:300px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.max-w-\[180px\]{max-width:180px}.max-w-\[85\%\]{max-width:85%}.max-w-\[90\%\]{max-width:90%}.max-w-\[9rem\]{max-width:9rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-screen-xl{max-width:1280px}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-left{transform-origin:left}.origin-top{transform-origin:top}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.translate-x-0{--tw-translate-x:0px}.transform,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[shimmer_2\.2s_infinite\]{animation:shimmer 2.2s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.divide-zinc-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(228 228 231/var(--tw-divide-opacity,1))}.self-start{align-self:flex-start}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[color-mix\(in_srgb\2c currentColor_10\%\2c transparent\)\]{border-color:color-mix(in srgb,currentColor 10%,transparent)}.border-\[color-mix\(in_srgb\2c currentColor_14\%\2c transparent\)\]{border-color:color-mix(in srgb,currentColor 14%,transparent)}.border-\[var\(--seo-accent\2c \#14b8a6\)\]{border-color:var(--seo-accent,#14b8a6)}.border-emerald-500\/30{border-color:rgba(16,185,129,.3)}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity,1))}.border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity,1))}.border-teal-200\/70{border-color:rgba(153,246,228,.7)}.border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.border-zinc-100{--tw-border-opacity:1;border-color:rgb(244 244 245/var(--tw-border-opacity,1))}.border-zinc-200{--tw-border-opacity:1;border-color:rgb(228 228 231/var(--tw-border-opacity,1))}.border-zinc-300{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity,1))}.bg-\[\#0d1117\]{--tw-bg-opacity:1;background-color:rgb(13 17 23/var(--tw-bg-opacity,1))}.bg-\[color-mix\(in_srgb\2c currentColor_3\%\2c transparent\)\]{background-color:color-mix(in srgb,currentColor 3%,transparent)}.bg-\[color-mix\(in_srgb\2c currentColor_4\%\2c transparent\)\]{background-color:color-mix(in srgb,currentColor 4%,transparent)}.bg-\[color-mix\(in_srgb\2c currentColor_8\%\2c transparent\)\]{background-color:color-mix(in srgb,currentColor 8%,transparent)}.bg-\[var\(--seo-accent-light\2c rgba\(20\2c 184\2c 166\2c 0\.08\)\)\]{background-color:var(--seo-accent-light,rgba(20,184,166,.08))}.bg-amber-400\/60{background-color:rgba(251,191,36,.6)}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-cyan-400\/40{background-color:rgba(34,211,238,.4)}.bg-emerald-400\/60{background-color:rgba(52,211,153,.6)}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-500\/10{background-color:rgba(16,185,129,.1)}.bg-emerald-500\/20{background-color:rgba(16,185,129,.2)}.bg-green-400\/80{background-color:rgba(74,222,128,.8)}.bg-red-400\/60{background-color:hsla(0,91%,71%,.6)}.bg-red-400\/80{background-color:hsla(0,91%,71%,.8)}.bg-teal-100\/70{background-color:rgba(204,251,241,.7)}.bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity,1))}.bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity,1))}.bg-teal-400\/40{background-color:rgba(45,212,191,.4)}.bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity,1))}.bg-teal-50\/30{background-color:rgba(240,253,250,.3)}.bg-teal-50\/40{background-color:rgba(240,253,250,.4)}.bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity,1))}.bg-teal-500\/10{background-color:rgba(20,184,166,.1)}.bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.bg-white\/50{background-color:hsla(0,0%,100%,.5)}.bg-white\/70{background-color:hsla(0,0%,100%,.7)}.bg-yellow-400\/80{background-color:rgba(250,204,21,.8)}.bg-zinc-100{--tw-bg-opacity:1;background-color:rgb(244 244 245/var(--tw-bg-opacity,1))}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity,1))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity,1))}.bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity,1))}.bg-zinc-50{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity,1))}.bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.bg-zinc-900\/50{background-color:rgba(24,24,27,.5)}.bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity,1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-cyan-500{--tw-gradient-from:#06b6d4 var(--tw-gradient-from-position);--tw-gradient-to:rgba(6,182,212,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-400{--tw-gradient-from:#2dd4bf var(--tw-gradient-from-position);--tw-gradient-to:rgba(45,212,191,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-400\/20{--tw-gradient-from:rgba(45,212,191,.2) var(--tw-gradient-from-position);--tw-gradient-to:rgba(45,212,191,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-400\/30{--tw-gradient-from:rgba(45,212,191,.3) var(--tw-gradient-from-position);--tw-gradient-to:rgba(45,212,191,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-50{--tw-gradient-from:#f0fdfa var(--tw-gradient-from-position);--tw-gradient-to:rgba(240,253,250,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-500{--tw-gradient-from:#14b8a6 var(--tw-gradient-from-position);--tw-gradient-to:rgba(20,184,166,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-500\/40{--tw-gradient-from:rgba(20,184,166,.4) var(--tw-gradient-from-position);--tw-gradient-to:rgba(20,184,166,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-transparent{--tw-gradient-from:transparent var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-zinc-100{--tw-gradient-from:#f4f4f5 var(--tw-gradient-from-position);--tw-gradient-to:hsla(240,5%,96%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-zinc-50{--tw-gradient-from:#fafafa var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,98%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-cyan-400\/15{--tw-gradient-to:rgba(34,211,238,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgba(34,211,238,.15) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-teal-300{--tw-gradient-to:rgba(94,234,212,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#5eead4 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-teal-600\/80{--tw-gradient-to:rgba(13,148,136,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgba(13,148,136,.8) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-white{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-white\/40{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),hsla(0,0%,100%,.4) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-50\%{--tw-gradient-via-position:50%}.to-cyan-50{--tw-gradient-to:#ecfeff var(--tw-gradient-to-position)}.to-cyan-500\/30{--tw-gradient-to:rgba(6,182,212,.3) var(--tw-gradient-to-position)}.to-cyan-600{--tw-gradient-to:#0891b2 var(--tw-gradient-to-position)}.to-teal-500{--tw-gradient-to:#14b8a6 var(--tw-gradient-to-position)}.to-teal-500\/10{--tw-gradient-to:rgba(20,184,166,.1) var(--tw-gradient-to-position)}.to-teal-600{--tw-gradient-to:#0d9488 var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.to-zinc-100{--tw-gradient-to:#f4f4f5 var(--tw-gradient-to-position)}.to-zinc-200{--tw-gradient-to:#e4e4e7 var(--tw-gradient-to-position)}.to-zinc-50{--tw-gradient-to:#fafafa var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-no-repeat{background-repeat:no-repeat}.fill-white{fill:#fff}.fill-zinc-900{fill:#18181b}.stroke-amber-400{stroke:#fbbf24}.stroke-emerald-500{stroke:#10b981}.stroke-red-400{stroke:#f87171}.stroke-teal-500{stroke:#14b8a6}.stroke-zinc-200{stroke:#e4e4e7}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[40pt\]{font-size:40pt}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[5rem\]{line-height:5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#8b949e\]{--tw-text-opacity:1;color:rgb(139 148 158/var(--tw-text-opacity,1))}.text-\[var\(--seo-accent\2c \#14b8a6\)\]{color:var(--seo-accent,#14b8a6)}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity,1))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity,1))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity,1))}.text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity,1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-zinc-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity,1))}.placeholder-zinc-400::placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity,1))}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-teal-500\/30{--tw-shadow-color:rgba(20,184,166,.3);--tw-shadow:var(--tw-shadow-colored)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.blur{--tw-blur:blur(8px)}.blur,.blur-3xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-3xl{--tw-blur:blur(64px)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.drop-shadow-sm,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur-sm,.backdrop-blur-xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[-moz-osx-font-smoothing\:grayscale\]{-moz-osx-font-smoothing:grayscale}.\[-webkit-font-smoothing\:antialiased\]{-webkit-font-smoothing:antialiased}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:300ms\]{animation-delay:.3s}.\[background-position\:0_0\]{background-position:0 0}.\[background-size\:var\(--shimmer-width\)_100\%\]{background-size:var(--shimmer-width) 100%}.\[font-smooth\:antialiased\]{font-smooth:antialiased}.\[text-rendering\:optimizeLegibility\]{text-rendering:optimizeLegibility}.\[transition\:background-position_1s_cubic-bezier\(\.6\2c \.6\2c 0\2c 1\)_infinite\]{transition:background-position infinite 1s cubic-bezier(.6,.6,0,1)}.\[will-change\:filter\2c opacity\]{will-change:filter,opacity}:root{--seo-accent:#14b8a6;--seo-accent-light:#2dd4bf;--seo-accent-dark:#0d9488;--seo-accent-rgb:20,184,166;--seo-accent-gradient-from:#06b6d4;--seo-accent-gradient-to:#14b8a6}.placeholder\:text-zinc-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.placeholder\:text-zinc-400::placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-\[0\]:before{content:var(--tw-content);inset:0}.before\:aspect-square:before{content:var(--tw-content);aspect-ratio:1/1}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-full:before{content:var(--tw-content);width:100%}.before\:rounded-\[--border-radius\]:before{content:var(--tw-content);border-radius:var(--border-radius)}.before\:p-\[--border-width\]:before{content:var(--tw-content);padding:var(--border-width)}.before\:will-change-\[background-position\]:before{content:var(--tw-content);will-change:background-position}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.before\:\!\[-webkit-mask-composite\:xor\]:before{content:var(--tw-content);-webkit-mask-composite:xor!important}.before\:\[background-image\:var\(--background-radial-gradient\)\]:before{content:var(--tw-content);background-image:var(--background-radial-gradient)}.before\:\[background-size\:300\%_300\%\]:before{content:var(--tw-content);background-size:300% 300%}.before\:\!\[mask-composite\:exclude\]:before{content:var(--tw-content);-webkit-mask-composite:xor!important;mask-composite:exclude!important}.before\:\[mask\:var\(--mask-linear-gradient\)\]:before{content:var(--tw-content);-webkit-mask:var(--mask-linear-gradient);mask:var(--mask-linear-gradient)}.focus-within\:border-teal-300:focus-within{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity,1))}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-teal-500\/20:focus-within{--tw-ring-color:rgba(20,184,166,.2)}.hover\:scale-\[1\.02\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-\[color-mix\(in_srgb\2c currentColor_25\%\2c transparent\)\]:hover{border-color:color-mix(in srgb,currentColor 25%,transparent)}.hover\:border-teal-300:hover{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity,1))}.hover\:border-zinc-300:hover{--tw-border-opacity:1;border-color:rgb(212 212 216/var(--tw-border-opacity,1))}.hover\:bg-\[color-mix\(in_srgb\2c currentColor_4\%\2c transparent\)\]:hover{background-color:color-mix(in srgb,currentColor 4%,transparent)}.hover\:bg-\[color-mix\(in_srgb\2c currentColor_8\%\2c transparent\)\]:hover{background-color:color-mix(in srgb,currentColor 8%,transparent)}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity,1))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity,1))}.hover\:bg-teal-700:hover{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity,1))}.hover\:bg-zinc-50:hover{--tw-bg-opacity:1;background-color:rgb(250 250 250/var(--tw-bg-opacity,1))}.hover\:text-teal-700:hover{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity,1))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.hover\:text-zinc-800:hover{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.hover\:opacity-70:hover{opacity:.7}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.hover\:shadow-md:hover,.hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.hover\:shadow-teal-500\/40:hover{--tw-shadow-color:rgba(20,184,166,.4);--tw-shadow:var(--tw-shadow-colored)}.focus\:border-\[var\(--seo-accent\2c \#14b8a6\)\]:focus{border-color:var(--seo-accent,#14b8a6)}.focus\:border-teal-500:focus{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity,1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-teal-500\/40:focus{--tw-ring-color:rgba(20,184,166,.4)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-zinc-300:disabled{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity,1))}.disabled\:opacity-60:disabled{opacity:.6}.group[open] .group-open\:rotate-45{--tw-rotate:45deg}.group:hover .group-hover\:translate-x-0\.5,.group[open] .group-open\:rotate-45{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x:0.125rem}.group:hover .group-hover\:gap-2{gap:.5rem}.group:hover .group-hover\:text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.group:hover .group-hover\:opacity-70{opacity:.7}@media (prefers-reduced-motion:no-preference){.motion-safe\:before\:animate-\[shine-pulse_var\(--shine-pulse-duration\)_infinite_linear\]:before{content:var(--tw-content);animation:shine-pulse var(--shine-pulse-duration) infinite linear}}.dark\:divide-zinc-800:is(.dark *)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(39 39 42/var(--tw-divide-opacity,1))}.dark\:border-teal-700\/50:is(.dark *){border-color:rgba(15,118,110,.5)}.dark\:border-teal-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity,1))}.dark\:border-teal-800\/60:is(.dark *){border-color:rgba(17,94,89,.6)}.dark\:border-teal-900:is(.dark *){--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity,1))}.dark\:border-zinc-700:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1))}.dark\:border-zinc-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity,1))}.dark\:border-zinc-900:is(.dark *){--tw-border-opacity:1;border-color:rgb(24 24 27/var(--tw-border-opacity,1))}.dark\:bg-cyan-500\/20:is(.dark *){background-color:rgba(6,182,212,.2)}.dark\:bg-teal-500\/20:is(.dark *){background-color:rgba(20,184,166,.2)}.dark\:bg-teal-900\/30:is(.dark *){background-color:rgba(19,78,74,.3)}.dark\:bg-teal-900\/50:is(.dark *){background-color:rgba(19,78,74,.5)}.dark\:bg-teal-950:is(.dark *){--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity,1))}.dark\:bg-teal-950\/60:is(.dark *){background-color:rgba(4,47,46,.6)}.dark\:bg-zinc-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))}.dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.dark\:bg-zinc-900:is(.dark *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.dark\:bg-zinc-900\/50:is(.dark *){background-color:rgba(24,24,27,.5)}.dark\:bg-zinc-900\/60:is(.dark *){background-color:rgba(24,24,27,.6)}.dark\:bg-zinc-950\/50:is(.dark *){background-color:rgba(9,9,11,.5)}.dark\:from-teal-900\/20:is(.dark *){--tw-gradient-from:rgba(19,78,74,.2) var(--tw-gradient-from-position);--tw-gradient-to:rgba(19,78,74,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:from-teal-950\/70:is(.dark *){--tw-gradient-from:rgba(4,47,46,.7) var(--tw-gradient-from-position);--tw-gradient-to:rgba(4,47,46,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:from-teal-950\/80:is(.dark *){--tw-gradient-from:rgba(4,47,46,.8) var(--tw-gradient-from-position);--tw-gradient-to:rgba(4,47,46,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:via-zinc-950:is(.dark *){--tw-gradient-to:rgba(9,9,11,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#09090b var(--tw-gradient-via-position),var(--tw-gradient-to)}.dark\:to-cyan-950\/60:is(.dark *){--tw-gradient-to:rgba(8,51,68,.6) var(--tw-gradient-to-position)}.dark\:to-zinc-900:is(.dark *){--tw-gradient-to:#18181b var(--tw-gradient-to-position)}.dark\:to-zinc-950:is(.dark *){--tw-gradient-to:#09090b var(--tw-gradient-to-position)}.dark\:fill-zinc-800:is(.dark *){fill:#27272a}.dark\:stroke-zinc-700:is(.dark *){stroke:#3f3f46}.dark\:text-teal-200:is(.dark *){--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity,1))}.dark\:text-teal-300:is(.dark *){--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity,1))}.dark\:text-teal-400:is(.dark *){--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:text-zinc-100:is(.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.dark\:text-zinc-200:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.dark\:text-zinc-300:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.dark\:text-zinc-400:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.dark\:text-zinc-500:is(.dark *){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.dark\:text-zinc-600:is(.dark *){--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.dark\:focus-within\:border-teal-700:focus-within:is(.dark *){--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity,1))}.dark\:hover\:border-teal-700:hover:is(.dark *){--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity,1))}.dark\:hover\:border-zinc-700:hover:is(.dark *){--tw-border-opacity:1;border-color:rgb(63 63 70/var(--tw-border-opacity,1))}.dark\:hover\:bg-teal-950\/60:hover:is(.dark *){background-color:rgba(4,47,46,.6)}.dark\:hover\:text-teal-300:hover:is(.dark *){--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity,1))}.dark\:hover\:text-zinc-100:hover:is(.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.dark\:hover\:text-zinc-200:hover:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.dark\:disabled\:bg-zinc-700:disabled:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.group:hover .dark\:group-hover\:text-teal-400:is(.dark *){--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:mb-12{margin-bottom:3rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:p-10{padding:2.5rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:block{display:block}.md\:h-24{height:6rem}.md\:min-w-\[340px\]{min-width:340px}.md\:flex-initial{flex:0 1 auto}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:p-12{padding:3rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}}@media (min-width:1024px){.lg\:sticky{position:sticky}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-12{width:3rem}.lg\:translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:text-right{text-align:right}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:text-\[6rem\]{font-size:6rem}}@media (min-width:1280px){.xl\:flex{display:flex}}@media (min-width:1536px){.\32xl\:w-96{width:24rem}}
|
|
2
|
+
/*! tailwindcss v3.4.19 | MIT License | https://tailwindcss.com*/*,:after,:before{box-sizing:border-box;border:0 solid #e5e7eb}:after,:before{--tw-content:""}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.-bottom-24{bottom:-6rem}.-left-16{left:-4rem}.-left-8{left:-2rem}.-right-16{right:-4rem}.-top-24{top:-6rem}.bottom-0{bottom:0}.bottom-2{bottom:.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-4{left:1rem}.right-0{right:0}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-\[1\]{z-index:1}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.m-1{margin:.25rem}.m-auto{margin:auto}.mx-auto{margin-left:auto;margin-right:auto}.my-10{margin-top:2.5rem;margin-bottom:2.5rem}.my-12{margin-top:3rem;margin-bottom:3rem}.my-16{margin-top:4rem;margin-bottom:4rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-ml-px{margin-left:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-14{margin-bottom:3.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-0\.5{margin-left:.125rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-6{margin-left:1.5rem}.ml-auto{margin-left:auto}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-16{margin-top:4rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-auto{margin-top:auto}.line-clamp-1{-webkit-line-clamp:1}.line-clamp-1,.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical}.line-clamp-2{-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[14px\]{height:14px}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.min-h-0{min-height:0}.min-h-\[120px\]{min-height:120px}.min-h-\[180px\]{min-height:180px}.min-h-\[200px\]{min-height:200px}.min-h-\[280px\]{min-height:280px}.min-h-\[60px\]{min-height:60px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-4{width:1rem}.w-5{width:1.25rem}.w-5\/6{width:83.333333%}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-\[7px\]{width:7px}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-px{width:1px}.min-w-0{min-width:0}.min-w-\[300px\]{min-width:300px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.max-w-\[180px\]{max-width:180px}.max-w-\[85\%\]{max-width:85%}.max-w-\[90\%\]{max-width:90%}.max-w-\[9rem\]{max-width:9rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-screen-xl{max-width:1280px}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.origin-left{transform-origin:left}.origin-top{transform-origin:top}.-translate-x-full{--tw-translate-x:-100%}.-translate-x-full,.-translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y:-50%}.translate-x-0{--tw-translate-x:0px}.transform,.translate-x-0{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-\[shimmer_2\.2s_infinite\]{animation:shimmer 2.2s infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-2{row-gap:.5rem}.gap-y-3{row-gap:.75rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem*var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.375rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem*var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem*var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.625rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem*var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem*var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem*var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem*var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem*var(--tw-space-y-reverse))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-right-width:calc(1px*var(--tw-divide-x-reverse));border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)))}.divide-\[color-mix\(in_srgb\2c currentColor_14\%\2c transparent\)\]>:not([hidden])~:not([hidden]){border-color:color-mix(in srgb,currentColor 14%,transparent)}.self-start{align-self:flex-start}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[color-mix\(in_srgb\2c currentColor_10\%\2c transparent\)\]{border-color:color-mix(in srgb,currentColor 10%,transparent)}.border-\[color-mix\(in_srgb\2c currentColor_14\%\2c transparent\)\]{border-color:color-mix(in srgb,currentColor 14%,transparent)}.border-\[color-mix\(in_srgb\2c currentColor_16\%\2c transparent\)\]{border-color:color-mix(in srgb,currentColor 16%,transparent)}.border-\[color-mix\(in_srgb\2c currentColor_20\%\2c transparent\)\]{border-color:color-mix(in srgb,currentColor 20%,transparent)}.border-\[var\(--seo-accent\2c \#14b8a6\)\]{border-color:var(--seo-accent,#14b8a6)}.border-emerald-500\/30{border-color:rgba(16,185,129,.3)}.border-teal-100{--tw-border-opacity:1;border-color:rgb(204 251 241/var(--tw-border-opacity,1))}.border-teal-200{--tw-border-opacity:1;border-color:rgb(153 246 228/var(--tw-border-opacity,1))}.border-teal-200\/70{border-color:rgba(153,246,228,.7)}.border-teal-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.border-zinc-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity,1))}.bg-\[\#0d1117\]{--tw-bg-opacity:1;background-color:rgb(13 17 23/var(--tw-bg-opacity,1))}.bg-\[color-mix\(in_srgb\2c currentColor_3\%\2c transparent\)\]{background-color:color-mix(in srgb,currentColor 3%,transparent)}.bg-\[color-mix\(in_srgb\2c currentColor_4\%\2c transparent\)\]{background-color:color-mix(in srgb,currentColor 4%,transparent)}.bg-\[color-mix\(in_srgb\2c currentColor_6\%\2c transparent\)\]{background-color:color-mix(in srgb,currentColor 6%,transparent)}.bg-\[color-mix\(in_srgb\2c currentColor_8\%\2c transparent\)\]{background-color:color-mix(in srgb,currentColor 8%,transparent)}.bg-\[var\(--seo-accent-light\2c rgba\(20\2c 184\2c 166\2c 0\.08\)\)\]{background-color:var(--seo-accent-light,rgba(20,184,166,.08))}.bg-amber-400\/60{background-color:rgba(251,191,36,.6)}.bg-black\/30{background-color:rgba(0,0,0,.3)}.bg-cyan-400\/40{background-color:rgba(34,211,238,.4)}.bg-emerald-400\/60{background-color:rgba(52,211,153,.6)}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.bg-emerald-500\/10{background-color:rgba(16,185,129,.1)}.bg-emerald-500\/20{background-color:rgba(16,185,129,.2)}.bg-green-400\/80{background-color:rgba(74,222,128,.8)}.bg-red-400\/60{background-color:hsla(0,91%,71%,.6)}.bg-red-400\/80{background-color:hsla(0,91%,71%,.8)}.bg-teal-100\/70{background-color:rgba(204,251,241,.7)}.bg-teal-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity,1))}.bg-teal-400{--tw-bg-opacity:1;background-color:rgb(45 212 191/var(--tw-bg-opacity,1))}.bg-teal-400\/40{background-color:rgba(45,212,191,.4)}.bg-teal-50{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity,1))}.bg-teal-50\/30{background-color:rgba(240,253,250,.3)}.bg-teal-50\/40{background-color:rgba(240,253,250,.4)}.bg-teal-500{--tw-bg-opacity:1;background-color:rgb(20 184 166/var(--tw-bg-opacity,1))}.bg-teal-500\/10{background-color:rgba(20,184,166,.1)}.bg-teal-600{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity,1))}.bg-transparent{background-color:transparent}.bg-yellow-400\/80{background-color:rgba(250,204,21,.8)}.bg-zinc-200{--tw-bg-opacity:1;background-color:rgb(228 228 231/var(--tw-bg-opacity,1))}.bg-zinc-300{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity,1))}.bg-zinc-400{--tw-bg-opacity:1;background-color:rgb(161 161 170/var(--tw-bg-opacity,1))}.bg-zinc-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.bg-zinc-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.bg-zinc-900\/50{background-color:rgba(24,24,27,.5)}.bg-zinc-950{--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity,1))}.bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-cyan-500{--tw-gradient-from:#06b6d4 var(--tw-gradient-from-position);--tw-gradient-to:rgba(6,182,212,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-400{--tw-gradient-from:#2dd4bf var(--tw-gradient-from-position);--tw-gradient-to:rgba(45,212,191,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-400\/20{--tw-gradient-from:rgba(45,212,191,.2) var(--tw-gradient-from-position);--tw-gradient-to:rgba(45,212,191,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-400\/30{--tw-gradient-from:rgba(45,212,191,.3) var(--tw-gradient-from-position);--tw-gradient-to:rgba(45,212,191,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-50{--tw-gradient-from:#f0fdfa var(--tw-gradient-from-position);--tw-gradient-to:rgba(240,253,250,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-500{--tw-gradient-from:#14b8a6 var(--tw-gradient-from-position);--tw-gradient-to:rgba(20,184,166,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-teal-500\/40{--tw-gradient-from:rgba(20,184,166,.4) var(--tw-gradient-from-position);--tw-gradient-to:rgba(20,184,166,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-transparent{--tw-gradient-from:transparent var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-zinc-100{--tw-gradient-from:#f4f4f5 var(--tw-gradient-from-position);--tw-gradient-to:hsla(240,5%,96%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-zinc-50{--tw-gradient-from:#fafafa var(--tw-gradient-from-position);--tw-gradient-to:hsla(0,0%,98%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.via-cyan-400\/15{--tw-gradient-to:rgba(34,211,238,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgba(34,211,238,.15) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-teal-300{--tw-gradient-to:rgba(94,234,212,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#5eead4 var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-teal-600\/80{--tw-gradient-to:rgba(13,148,136,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),rgba(13,148,136,.8) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-white{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#fff var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-white\/40{--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),hsla(0,0%,100%,.4) var(--tw-gradient-via-position),var(--tw-gradient-to)}.via-50\%{--tw-gradient-via-position:50%}.to-cyan-50{--tw-gradient-to:#ecfeff var(--tw-gradient-to-position)}.to-cyan-500\/30{--tw-gradient-to:rgba(6,182,212,.3) var(--tw-gradient-to-position)}.to-cyan-600{--tw-gradient-to:#0891b2 var(--tw-gradient-to-position)}.to-teal-500{--tw-gradient-to:#14b8a6 var(--tw-gradient-to-position)}.to-teal-500\/10{--tw-gradient-to:rgba(20,184,166,.1) var(--tw-gradient-to-position)}.to-teal-600{--tw-gradient-to:#0d9488 var(--tw-gradient-to-position)}.to-transparent{--tw-gradient-to:transparent var(--tw-gradient-to-position)}.to-white{--tw-gradient-to:#fff var(--tw-gradient-to-position)}.to-zinc-100{--tw-gradient-to:#f4f4f5 var(--tw-gradient-to-position)}.to-zinc-200{--tw-gradient-to:#e4e4e7 var(--tw-gradient-to-position)}.to-zinc-50{--tw-gradient-to:#fafafa var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.bg-no-repeat{background-repeat:no-repeat}.fill-white{fill:#fff}.fill-zinc-900{fill:#18181b}.stroke-amber-400{stroke:#fbbf24}.stroke-emerald-500{stroke:#10b981}.stroke-red-400{stroke:#f87171}.stroke-teal-500{stroke:#14b8a6}.stroke-zinc-200{stroke:#e4e4e7}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-7{padding-left:1.75rem;padding-right:1.75rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.align-middle{vertical-align:middle}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[40pt\]{font-size:40pt}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-\[5rem\]{line-height:5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[-0\.02em\]{letter-spacing:-.02em}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[\#8b949e\]{--tw-text-opacity:1;color:rgb(139 148 158/var(--tw-text-opacity,1))}.text-\[var\(--seo-accent\2c \#14b8a6\)\]{color:var(--seo-accent,#14b8a6)}.text-amber-400{--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity,1))}.text-emerald-400{--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity,1))}.text-emerald-500{--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.text-red-400{--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity,1))}.text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity,1))}.text-teal-300{--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity,1))}.text-teal-500{--tw-text-opacity:1;color:rgb(20 184 166/var(--tw-text-opacity,1))}.text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.text-teal-700{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity,1))}.text-teal-800{--tw-text-opacity:1;color:rgb(17 94 89/var(--tw-text-opacity,1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.text-zinc-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.text-zinc-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.text-zinc-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.text-zinc-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.text-zinc-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.text-zinc-600{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.text-zinc-700{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.text-zinc-800{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}.text-zinc-900{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.underline{text-decoration-line:underline}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-zinc-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity,1))}.placeholder-zinc-400::placeholder{--tw-placeholder-opacity:1;color:rgb(161 161 170/var(--tw-placeholder-opacity,1))}.opacity-50{opacity:.5}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.shadow-lg,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05);--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-teal-500\/30{--tw-shadow-color:rgba(20,184,166,.3);--tw-shadow:var(--tw-shadow-colored)}.ring{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.blur{--tw-blur:blur(8px)}.blur,.blur-3xl{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.blur-3xl{--tw-blur:blur(64px)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.drop-shadow-sm,.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur:blur(4px)}.backdrop-blur-sm,.backdrop-blur-xl{-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[-moz-osx-font-smoothing\:grayscale\]{-moz-osx-font-smoothing:grayscale}.\[-webkit-font-smoothing\:antialiased\]{-webkit-font-smoothing:antialiased}.\[animation-delay\:150ms\]{animation-delay:.15s}.\[animation-delay\:300ms\]{animation-delay:.3s}.\[background-position\:0_0\]{background-position:0 0}.\[background-size\:var\(--shimmer-width\)_100\%\]{background-size:var(--shimmer-width) 100%}.\[font-smooth\:antialiased\]{font-smooth:antialiased}.\[text-rendering\:optimizeLegibility\]{text-rendering:optimizeLegibility}.\[transition\:background-position_1s_cubic-bezier\(\.6\2c \.6\2c 0\2c 1\)_infinite\]{transition:background-position infinite 1s cubic-bezier(.6,.6,0,1)}.\[will-change\:filter\2c opacity\]{will-change:filter,opacity}:root{--seo-accent:#14b8a6;--seo-accent-light:#2dd4bf;--seo-accent-dark:#0d9488;--seo-accent-rgb:20,184,166;--seo-accent-gradient-from:#06b6d4;--seo-accent-gradient-to:#14b8a6}.placeholder\:text-zinc-400::-moz-placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.placeholder\:text-zinc-400::placeholder{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-\[0\]:before{content:var(--tw-content);inset:0}.before\:aspect-square:before{content:var(--tw-content);aspect-ratio:1/1}.before\:h-full:before{content:var(--tw-content);height:100%}.before\:w-full:before{content:var(--tw-content);width:100%}.before\:rounded-\[--border-radius\]:before{content:var(--tw-content);border-radius:var(--border-radius)}.before\:p-\[--border-width\]:before{content:var(--tw-content);padding:var(--border-width)}.before\:will-change-\[background-position\]:before{content:var(--tw-content);will-change:background-position}.before\:content-\[\'\'\]:before{--tw-content:"";content:var(--tw-content)}.before\:\!\[-webkit-mask-composite\:xor\]:before{content:var(--tw-content);-webkit-mask-composite:xor!important}.before\:\[background-image\:var\(--background-radial-gradient\)\]:before{content:var(--tw-content);background-image:var(--background-radial-gradient)}.before\:\[background-size\:300\%_300\%\]:before{content:var(--tw-content);background-size:300% 300%}.before\:\!\[mask-composite\:exclude\]:before{content:var(--tw-content);-webkit-mask-composite:xor!important;mask-composite:exclude!important}.before\:\[mask\:var\(--mask-linear-gradient\)\]:before{content:var(--tw-content);-webkit-mask:var(--mask-linear-gradient);mask:var(--mask-linear-gradient)}.focus-within\:border-teal-300:focus-within{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity,1))}.focus-within\:ring-2:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-teal-500\/20:focus-within{--tw-ring-color:rgba(20,184,166,.2)}.hover\:scale-\[1\.02\]:hover{--tw-scale-x:1.02;--tw-scale-y:1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-\[color-mix\(in_srgb\2c currentColor_18\%\2c transparent\)\]:hover{border-color:color-mix(in srgb,currentColor 18%,transparent)}.hover\:border-\[color-mix\(in_srgb\2c currentColor_25\%\2c transparent\)\]:hover{border-color:color-mix(in srgb,currentColor 25%,transparent)}.hover\:border-teal-300:hover{--tw-border-opacity:1;border-color:rgb(94 234 212/var(--tw-border-opacity,1))}.hover\:bg-\[color-mix\(in_srgb\2c currentColor_4\%\2c transparent\)\]:hover{background-color:color-mix(in srgb,currentColor 4%,transparent)}.hover\:bg-\[color-mix\(in_srgb\2c currentColor_8\%\2c transparent\)\]:hover{background-color:color-mix(in srgb,currentColor 8%,transparent)}.hover\:bg-teal-50:hover{--tw-bg-opacity:1;background-color:rgb(240 253 250/var(--tw-bg-opacity,1))}.hover\:bg-teal-600:hover{--tw-bg-opacity:1;background-color:rgb(13 148 136/var(--tw-bg-opacity,1))}.hover\:bg-teal-700:hover{--tw-bg-opacity:1;background-color:rgb(15 118 110/var(--tw-bg-opacity,1))}.hover\:text-teal-700:hover{--tw-text-opacity:1;color:rgb(15 118 110/var(--tw-text-opacity,1))}.hover\:text-zinc-600:hover{--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.hover\:text-zinc-700:hover{--tw-text-opacity:1;color:rgb(63 63 70/var(--tw-text-opacity,1))}.hover\:text-zinc-800:hover{--tw-text-opacity:1;color:rgb(39 39 42/var(--tw-text-opacity,1))}.hover\:text-zinc-900:hover{--tw-text-opacity:1;color:rgb(24 24 27/var(--tw-text-opacity,1))}.hover\:opacity-70:hover{opacity:.7}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.hover\:shadow-md:hover,.hover\:shadow-xl:hover{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 8px 10px -6px rgba(0,0,0,.1);--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.hover\:shadow-teal-500\/40:hover{--tw-shadow-color:rgba(20,184,166,.4);--tw-shadow:var(--tw-shadow-colored)}.focus\:border-\[var\(--seo-accent\2c \#14b8a6\)\]:focus{border-color:var(--seo-accent,#14b8a6)}.focus\:border-teal-500:focus{--tw-border-opacity:1;border-color:rgb(20 184 166/var(--tw-border-opacity,1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-teal-500\/40:focus{--tw-ring-color:rgba(20,184,166,.4)}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-zinc-300:disabled{--tw-bg-opacity:1;background-color:rgb(212 212 216/var(--tw-bg-opacity,1))}.disabled\:opacity-60:disabled{opacity:.6}.group[open] .group-open\:rotate-45{--tw-rotate:45deg}.group:hover .group-hover\:translate-x-0\.5,.group[open] .group-open\:rotate-45{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x:0.125rem}.group:hover .group-hover\:gap-2{gap:.5rem}.group:hover .group-hover\:text-teal-600{--tw-text-opacity:1;color:rgb(13 148 136/var(--tw-text-opacity,1))}.group:hover .group-hover\:opacity-70{opacity:.7}@media (prefers-reduced-motion:no-preference){.motion-safe\:before\:animate-\[shine-pulse_var\(--shine-pulse-duration\)_infinite_linear\]:before{content:var(--tw-content);animation:shine-pulse var(--shine-pulse-duration) infinite linear}}.dark\:border-teal-700\/50:is(.dark *){border-color:rgba(15,118,110,.5)}.dark\:border-teal-800:is(.dark *){--tw-border-opacity:1;border-color:rgb(17 94 89/var(--tw-border-opacity,1))}.dark\:border-teal-800\/60:is(.dark *){border-color:rgba(17,94,89,.6)}.dark\:border-teal-900:is(.dark *){--tw-border-opacity:1;border-color:rgb(19 78 74/var(--tw-border-opacity,1))}.dark\:bg-cyan-500\/20:is(.dark *){background-color:rgba(6,182,212,.2)}.dark\:bg-teal-500\/20:is(.dark *){background-color:rgba(20,184,166,.2)}.dark\:bg-teal-900\/30:is(.dark *){background-color:rgba(19,78,74,.3)}.dark\:bg-teal-900\/50:is(.dark *){background-color:rgba(19,78,74,.5)}.dark\:bg-teal-950:is(.dark *){--tw-bg-opacity:1;background-color:rgb(4 47 46/var(--tw-bg-opacity,1))}.dark\:bg-teal-950\/60:is(.dark *){background-color:rgba(4,47,46,.6)}.dark\:bg-zinc-600:is(.dark *){--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity,1))}.dark\:bg-zinc-800:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.dark\:from-teal-900\/20:is(.dark *){--tw-gradient-from:rgba(19,78,74,.2) var(--tw-gradient-from-position);--tw-gradient-to:rgba(19,78,74,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:from-teal-950\/70:is(.dark *){--tw-gradient-from:rgba(4,47,46,.7) var(--tw-gradient-from-position);--tw-gradient-to:rgba(4,47,46,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:from-teal-950\/80:is(.dark *){--tw-gradient-from:rgba(4,47,46,.8) var(--tw-gradient-from-position);--tw-gradient-to:rgba(4,47,46,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:via-zinc-950:is(.dark *){--tw-gradient-to:rgba(9,9,11,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),#09090b var(--tw-gradient-via-position),var(--tw-gradient-to)}.dark\:to-cyan-950\/60:is(.dark *){--tw-gradient-to:rgba(8,51,68,.6) var(--tw-gradient-to-position)}.dark\:to-zinc-900:is(.dark *){--tw-gradient-to:#18181b var(--tw-gradient-to-position)}.dark\:to-zinc-950:is(.dark *){--tw-gradient-to:#09090b var(--tw-gradient-to-position)}.dark\:fill-zinc-800:is(.dark *){fill:#27272a}.dark\:stroke-zinc-700:is(.dark *){stroke:#3f3f46}.dark\:text-teal-200:is(.dark *){--tw-text-opacity:1;color:rgb(153 246 228/var(--tw-text-opacity,1))}.dark\:text-teal-300:is(.dark *){--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity,1))}.dark\:text-teal-400:is(.dark *){--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity,1))}.dark\:text-white:is(.dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:text-zinc-100:is(.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.dark\:text-zinc-200:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.dark\:text-zinc-300:is(.dark *){--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity,1))}.dark\:text-zinc-400:is(.dark *){--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity,1))}.dark\:text-zinc-500:is(.dark *){--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.dark\:text-zinc-600:is(.dark *){--tw-text-opacity:1;color:rgb(82 82 91/var(--tw-text-opacity,1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::-moz-placeholder{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.dark\:placeholder\:text-zinc-500:is(.dark *)::placeholder{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity,1))}.dark\:focus-within\:border-teal-700:focus-within:is(.dark *){--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity,1))}.dark\:hover\:border-teal-700:hover:is(.dark *){--tw-border-opacity:1;border-color:rgb(15 118 110/var(--tw-border-opacity,1))}.dark\:hover\:bg-teal-950\/60:hover:is(.dark *){background-color:rgba(4,47,46,.6)}.dark\:hover\:text-teal-300:hover:is(.dark *){--tw-text-opacity:1;color:rgb(94 234 212/var(--tw-text-opacity,1))}.dark\:hover\:text-zinc-100:hover:is(.dark *){--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity,1))}.dark\:hover\:text-zinc-200:hover:is(.dark *){--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity,1))}.dark\:disabled\:bg-zinc-700:disabled:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}.group:hover .dark\:group-hover\:text-teal-400:is(.dark *){--tw-text-opacity:1;color:rgb(45 212 191/var(--tw-text-opacity,1))}@media (min-width:640px){.sm\:mb-12{margin-bottom:3rem}.sm\:block{display:block}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:p-10{padding:2.5rem}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:py-16{padding-top:4rem;padding-bottom:4rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.sm\:text-lg{font-size:1.125rem;line-height:1.75rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:block{display:block}.md\:h-24{height:6rem}.md\:min-w-\[340px\]{min-width:340px}.md\:flex-initial{flex:0 1 auto}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:p-12{padding:3rem}.md\:text-4xl{font-size:2.25rem;line-height:2.5rem}}@media (min-width:1024px){.lg\:sticky{position:sticky}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-12{width:3rem}.lg\:translate-x-0{--tw-translate-x:0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-end{align-items:flex-end}.lg\:items-center{align-items:center}.lg\:justify-between{justify-content:space-between}.lg\:text-right{text-align:right}.lg\:text-4xl{font-size:2.25rem;line-height:2.5rem}.lg\:text-\[6rem\]{font-size:6rem}}@media (min-width:1280px){.xl\:flex{display:flex}}@media (min-width:1536px){.\32xl\:w-96{width:24rem}}
|
package/package.json
CHANGED
|
@@ -51,7 +51,7 @@ export function AnimatedBeam({
|
|
|
51
51
|
|
|
52
52
|
return (
|
|
53
53
|
<div
|
|
54
|
-
className={`my-10 rounded-2xl border border-
|
|
54
|
+
className={`my-10 rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] p-6 ${className}`}
|
|
55
55
|
>
|
|
56
56
|
{title && (
|
|
57
57
|
<h3 className="text-sm font-semibold text-zinc-900 dark:text-zinc-100 mb-4">{title}</h3>
|
|
@@ -15,7 +15,7 @@ interface AnimatedChecklistProps {
|
|
|
15
15
|
export function AnimatedChecklist({ title, items }: AnimatedChecklistProps) {
|
|
16
16
|
return (
|
|
17
17
|
<motion.div
|
|
18
|
-
className="my-8 rounded-2xl border border-
|
|
18
|
+
className="my-8 rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] p-6"
|
|
19
19
|
initial={{ opacity: 0, y: 12 }}
|
|
20
20
|
whileInView={{ opacity: 1, y: 0 }}
|
|
21
21
|
viewport={{ once: true }}
|
|
@@ -42,7 +42,7 @@ export function AnimatedChecklist({ title, items }: AnimatedChecklistProps) {
|
|
|
42
42
|
className={`mt-0.5 flex items-center justify-center w-5 h-5 rounded-md border shrink-0 ${
|
|
43
43
|
item.checked !== false
|
|
44
44
|
? "border-emerald-500/30 bg-emerald-500/10 text-emerald-500"
|
|
45
|
-
: "border-
|
|
45
|
+
: "border-[color-mix(in_srgb,currentColor_16%,transparent)] bg-[color-mix(in_srgb,currentColor_6%,transparent)] text-zinc-500 dark:text-zinc-400"
|
|
46
46
|
}`}
|
|
47
47
|
initial={{ scale: 0 }}
|
|
48
48
|
whileInView={{ scale: 1 }}
|
|
@@ -82,7 +82,7 @@ export function AnimatedDemo({
|
|
|
82
82
|
</div>
|
|
83
83
|
|
|
84
84
|
{/* Demo screen */}
|
|
85
|
-
<div className="rounded-2xl border border-
|
|
85
|
+
<div className="rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-zinc-950 overflow-hidden shadow-lg">
|
|
86
86
|
{/* Title bar */}
|
|
87
87
|
<div className="flex items-center gap-1.5 px-4 py-2.5 bg-zinc-900 border-b border-zinc-800">
|
|
88
88
|
<div className="w-2.5 h-2.5 rounded-full bg-red-400/80" />
|
|
@@ -166,7 +166,7 @@ export function AnimatedDemo({
|
|
|
166
166
|
transition={{ duration: 0.3 }}
|
|
167
167
|
className="mt-4"
|
|
168
168
|
>
|
|
169
|
-
<div className="rounded-xl border border-
|
|
169
|
+
<div className="rounded-xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-zinc-950 overflow-hidden">
|
|
170
170
|
<div className="flex items-center justify-between px-4 py-2 bg-zinc-900 border-b border-zinc-800">
|
|
171
171
|
<span className="text-[11px] text-zinc-500 font-mono">
|
|
172
172
|
{codeLanguage}
|
|
@@ -31,7 +31,7 @@ export function BackgroundGrid({
|
|
|
31
31
|
|
|
32
32
|
return (
|
|
33
33
|
<div
|
|
34
|
-
className={`relative overflow-hidden rounded-2xl border border-
|
|
34
|
+
className={`relative overflow-hidden rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] my-10 ${className}`}
|
|
35
35
|
>
|
|
36
36
|
<div
|
|
37
37
|
className="absolute inset-0 pointer-events-none"
|
|
@@ -31,12 +31,12 @@ export function BeforeAfter({
|
|
|
31
31
|
)}
|
|
32
32
|
|
|
33
33
|
{/* Toggle */}
|
|
34
|
-
<div className="flex items-center gap-1 mb-4 bg-
|
|
34
|
+
<div className="flex items-center gap-1 mb-4 bg-[color-mix(in_srgb,currentColor_6%,transparent)] rounded-lg p-1 w-fit">
|
|
35
35
|
<button
|
|
36
36
|
onClick={() => setShowAfter(false)}
|
|
37
37
|
className={`px-4 py-2 text-sm font-medium rounded-md transition-all duration-200 ${
|
|
38
38
|
!showAfter
|
|
39
|
-
? "bg-
|
|
39
|
+
? "bg-[color-mix(in_srgb,currentColor_6%,transparent)] text-zinc-900 dark:text-zinc-100 shadow-sm"
|
|
40
40
|
: "text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200"
|
|
41
41
|
}`}
|
|
42
42
|
>
|
|
@@ -55,7 +55,7 @@ export function BeforeAfter({
|
|
|
55
55
|
</div>
|
|
56
56
|
|
|
57
57
|
{/* Content panel */}
|
|
58
|
-
<div className="relative rounded-xl border border-
|
|
58
|
+
<div className="relative rounded-xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)] overflow-hidden min-h-[200px]">
|
|
59
59
|
<AnimatePresence mode="wait">
|
|
60
60
|
{!showAfter ? (
|
|
61
61
|
<motion.div
|
|
@@ -43,7 +43,7 @@ export function BentoGrid({ cards, className = "" }: BentoGridProps) {
|
|
|
43
43
|
className={`${SIZE_CLASSES[card.size || "1x1"]} rounded-2xl border ${
|
|
44
44
|
card.accent
|
|
45
45
|
? "border-teal-200 dark:border-teal-800 bg-gradient-to-br from-teal-50 dark:from-teal-900/20 to-cyan-50"
|
|
46
|
-
: "border-
|
|
46
|
+
: "border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)]"
|
|
47
47
|
} p-6 flex flex-col justify-between group hover:border-teal-300 hover:shadow-md transition-all duration-300`}
|
|
48
48
|
>
|
|
49
49
|
<div>
|
|
@@ -2,7 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
import { useEffect, useState } from "react";
|
|
4
4
|
import { motion, AnimatePresence } from "framer-motion";
|
|
5
|
-
import { trackScheduleClick } from "../lib/track";
|
|
5
|
+
import { trackScheduleClick, withBookingAttribution } from "../lib/track";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Render the bare destination for SSR, then swap in the UTM-attributed URL
|
|
9
|
+
* after hydration so Cmd+Click / middle-click preserves the attribution.
|
|
10
|
+
* PostHog's `schedule_click` event still receives the bare destination so
|
|
11
|
+
* aggregation isn't fragmented per page.
|
|
12
|
+
*/
|
|
13
|
+
function useBookingHref(destination: string): string {
|
|
14
|
+
const [href, setHref] = useState(destination);
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
setHref(withBookingAttribution(destination));
|
|
17
|
+
}, [destination]);
|
|
18
|
+
return href;
|
|
19
|
+
}
|
|
6
20
|
|
|
7
21
|
export type BookCallAppearance = "inline" | "sticky" | "hero" | "footer";
|
|
8
22
|
|
|
@@ -111,6 +125,7 @@ function InlineBookCall({
|
|
|
111
125
|
section: string;
|
|
112
126
|
site?: string;
|
|
113
127
|
}) {
|
|
128
|
+
const href = useBookingHref(destination);
|
|
114
129
|
return (
|
|
115
130
|
<motion.div
|
|
116
131
|
className="my-12 mx-auto max-w-2xl p-6 rounded-2xl border border-teal-100 dark:border-teal-800/60 bg-teal-50/40 dark:bg-teal-950/60"
|
|
@@ -126,7 +141,7 @@ function InlineBookCall({
|
|
|
126
141
|
{description}
|
|
127
142
|
</p>
|
|
128
143
|
<a
|
|
129
|
-
href={
|
|
144
|
+
href={href}
|
|
130
145
|
target="_blank"
|
|
131
146
|
rel="noopener noreferrer"
|
|
132
147
|
className="inline-flex items-center gap-2 text-sm font-medium px-4 py-2 rounded-lg bg-teal-500 text-accent-contrast hover:bg-accent-dim transition-colors"
|
|
@@ -151,9 +166,10 @@ function HeroBookCall({
|
|
|
151
166
|
section: string;
|
|
152
167
|
site?: string;
|
|
153
168
|
}) {
|
|
169
|
+
const href = useBookingHref(destination);
|
|
154
170
|
return (
|
|
155
171
|
<a
|
|
156
|
-
href={
|
|
172
|
+
href={href}
|
|
157
173
|
target="_blank"
|
|
158
174
|
rel="noopener noreferrer"
|
|
159
175
|
className="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg border border-teal-200 dark:border-teal-800/60 text-sm font-medium text-teal-700 dark:text-teal-200 hover:bg-teal-50 dark:hover:bg-teal-950/60 transition-colors"
|
|
@@ -181,6 +197,7 @@ function FooterBookCall({
|
|
|
181
197
|
section: string;
|
|
182
198
|
site?: string;
|
|
183
199
|
}) {
|
|
200
|
+
const href = useBookingHref(destination);
|
|
184
201
|
return (
|
|
185
202
|
<motion.div
|
|
186
203
|
className="my-16 mx-auto max-w-3xl p-8 rounded-2xl border border-teal-200 dark:border-teal-800/60 bg-gradient-to-br from-teal-50 to-white dark:from-teal-950/70 dark:to-zinc-950 text-center"
|
|
@@ -196,7 +213,7 @@ function FooterBookCall({
|
|
|
196
213
|
{description}
|
|
197
214
|
</p>
|
|
198
215
|
<a
|
|
199
|
-
href={
|
|
216
|
+
href={href}
|
|
200
217
|
target="_blank"
|
|
201
218
|
rel="noopener noreferrer"
|
|
202
219
|
className="inline-flex items-center gap-2 px-5 py-2.5 rounded-lg bg-teal-500 text-accent-contrast hover:bg-accent-dim transition-colors text-sm font-medium"
|
|
@@ -226,6 +243,7 @@ function StickyBookCall({
|
|
|
226
243
|
scrollThreshold: number;
|
|
227
244
|
}) {
|
|
228
245
|
const [visible, setVisible] = useState(false);
|
|
246
|
+
const href = useBookingHref(destination);
|
|
229
247
|
|
|
230
248
|
useEffect(() => {
|
|
231
249
|
const handler = () => setVisible(window.scrollY > scrollThreshold);
|
|
@@ -241,7 +259,7 @@ function StickyBookCall({
|
|
|
241
259
|
animate={{ y: 0 }}
|
|
242
260
|
exit={{ y: "100%" }}
|
|
243
261
|
transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
|
|
244
|
-
className="fixed bottom-0 left-0 right-0 z-40 border-t border-
|
|
262
|
+
className="fixed bottom-0 left-0 right-0 z-40 border-t border-[color-mix(in_srgb,currentColor_14%,transparent)] backdrop-blur-xl py-3 px-6"
|
|
245
263
|
style={{ backgroundColor: "var(--mobile-bg)" }}
|
|
246
264
|
>
|
|
247
265
|
<div className="mx-auto max-w-7xl flex items-center justify-between">
|
|
@@ -249,7 +267,7 @@ function StickyBookCall({
|
|
|
249
267
|
{description}
|
|
250
268
|
</p>
|
|
251
269
|
<a
|
|
252
|
-
href={
|
|
270
|
+
href={href}
|
|
253
271
|
target="_blank"
|
|
254
272
|
rel="noopener noreferrer"
|
|
255
273
|
className="text-sm font-medium px-4 py-2 rounded-lg bg-teal-500 text-accent-contrast hover:bg-accent-dim transition-colors"
|
|
@@ -87,7 +87,7 @@ export function ClaudeMeterCta({
|
|
|
87
87
|
{FEATURES.map((f) => (
|
|
88
88
|
<li
|
|
89
89
|
key={f}
|
|
90
|
-
className="text-xs font-medium px-3 py-1.5 rounded-full bg-
|
|
90
|
+
className="text-xs font-medium px-3 py-1.5 rounded-full bg-[color-mix(in_srgb,currentColor_4%,transparent)] border border-teal-200/70 dark:border-teal-800/60 text-zinc-700 dark:text-zinc-200"
|
|
91
91
|
>
|
|
92
92
|
{f}
|
|
93
93
|
</li>
|
|
@@ -29,17 +29,17 @@ export function CodeComparison({
|
|
|
29
29
|
|
|
30
30
|
return (
|
|
31
31
|
<motion.div
|
|
32
|
-
className="my-8 rounded-2xl border border-
|
|
32
|
+
className="my-8 rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] overflow-hidden"
|
|
33
33
|
initial={{ opacity: 0, y: 12 }}
|
|
34
34
|
whileInView={{ opacity: 1, y: 0 }}
|
|
35
35
|
viewport={{ once: true }}
|
|
36
36
|
transition={{ duration: 0.4, ease: [0.16, 1, 0.3, 1] }}
|
|
37
37
|
>
|
|
38
|
-
<div className="flex items-center justify-between px-5 py-3 border-b border-
|
|
38
|
+
<div className="flex items-center justify-between px-5 py-3 border-b border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)]">
|
|
39
39
|
{title && (
|
|
40
40
|
<p className="text-xs font-mono uppercase tracking-widest text-emerald-500">{title}</p>
|
|
41
41
|
)}
|
|
42
|
-
<div className="flex gap-1 rounded-lg bg-
|
|
42
|
+
<div className="flex gap-1 rounded-lg bg-[color-mix(in_srgb,currentColor_4%,transparent)] p-0.5 border border-[color-mix(in_srgb,currentColor_14%,transparent)]">
|
|
43
43
|
<button
|
|
44
44
|
onClick={() => setTab("left")}
|
|
45
45
|
className={`text-[11px] font-medium px-3 py-1 rounded-md transition-colors ${
|
|
@@ -91,7 +91,7 @@ export function CodeComparison({
|
|
|
91
91
|
</AnimatePresence>
|
|
92
92
|
</div>
|
|
93
93
|
|
|
94
|
-
<div className="px-5 py-3 border-t border-
|
|
94
|
+
<div className="px-5 py-3 border-t border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)] flex items-center gap-3">
|
|
95
95
|
<motion.div
|
|
96
96
|
className="h-1.5 rounded-full bg-emerald-500/20 flex-1 overflow-hidden"
|
|
97
97
|
initial={{ opacity: 0 }}
|
|
@@ -35,10 +35,10 @@ export function ComparisonTable({
|
|
|
35
35
|
{intro}
|
|
36
36
|
</p>
|
|
37
37
|
)}
|
|
38
|
-
<div className="rounded-2xl bg-
|
|
38
|
+
<div className="rounded-2xl bg-[color-mix(in_srgb,currentColor_3%,transparent)] border border-[color-mix(in_srgb,currentColor_14%,transparent)] overflow-hidden">
|
|
39
39
|
<table className="w-full text-left">
|
|
40
40
|
<thead>
|
|
41
|
-
<tr className="border-b border-
|
|
41
|
+
<tr className="border-b border-[color-mix(in_srgb,currentColor_14%,transparent)]">
|
|
42
42
|
<th className="px-5 py-4 text-zinc-500 dark:text-zinc-400 text-sm font-medium">Feature</th>
|
|
43
43
|
<th className="px-5 py-4 text-zinc-500 dark:text-zinc-400 text-sm font-medium">{competitorName}</th>
|
|
44
44
|
<th className="px-5 py-4 text-teal-600 dark:text-teal-400 text-sm font-medium">{productName}</th>
|
|
@@ -48,7 +48,7 @@ export function ComparisonTable({
|
|
|
48
48
|
{rows.map((row, i) => (
|
|
49
49
|
<tr
|
|
50
50
|
key={i}
|
|
51
|
-
className={i < rows.length - 1 ? "border-b border-
|
|
51
|
+
className={i < rows.length - 1 ? "border-b border-[color-mix(in_srgb,currentColor_14%,transparent)]" : ""}
|
|
52
52
|
>
|
|
53
53
|
<td className="px-5 py-3 text-zinc-900 dark:text-zinc-100 text-sm font-medium">{row.feature}</td>
|
|
54
54
|
<td className="px-5 py-3 text-zinc-500 dark:text-zinc-400 text-sm">{row.competitor}</td>
|
|
@@ -18,7 +18,7 @@ export function FaqSection({
|
|
|
18
18
|
{items.map((faq) => (
|
|
19
19
|
<details
|
|
20
20
|
key={faq.q}
|
|
21
|
-
className="group p-5 rounded-xl bg-
|
|
21
|
+
className="group p-5 rounded-xl bg-[color-mix(in_srgb,currentColor_3%,transparent)] border border-[color-mix(in_srgb,currentColor_14%,transparent)]"
|
|
22
22
|
>
|
|
23
23
|
<summary className="text-zinc-900 dark:text-zinc-100 font-semibold cursor-pointer list-none flex items-center justify-between gap-4">
|
|
24
24
|
<span>{faq.q}</span>
|
|
@@ -28,7 +28,7 @@ const icons: Record<string, string> = {
|
|
|
28
28
|
|
|
29
29
|
export function FlowDiagram({ title, steps }: FlowDiagramProps) {
|
|
30
30
|
return (
|
|
31
|
-
<div className="my-10 rounded-2xl border border-
|
|
31
|
+
<div className="my-10 rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] p-6 overflow-x-auto">
|
|
32
32
|
<p className="text-xs font-mono uppercase tracking-widest text-emerald-500 mb-5">
|
|
33
33
|
{title}
|
|
34
34
|
</p>
|
|
@@ -47,7 +47,7 @@ export function FlowDiagram({ title, steps }: FlowDiagramProps) {
|
|
|
47
47
|
}}
|
|
48
48
|
>
|
|
49
49
|
<div className="flex flex-col items-center flex-1 min-w-0 max-w-[180px]">
|
|
50
|
-
<div className="w-11 h-11 rounded-xl bg-
|
|
50
|
+
<div className="w-11 h-11 rounded-xl bg-[color-mix(in_srgb,currentColor_4%,transparent)] border border-[color-mix(in_srgb,currentColor_14%,transparent)] flex items-center justify-center text-lg mb-2">
|
|
51
51
|
{step.icon ? icons[step.icon] || "\u2022" : `${i + 1}`}
|
|
52
52
|
</div>
|
|
53
53
|
<p className="text-xs font-medium text-zinc-900 dark:text-zinc-100 text-center leading-tight">
|
|
@@ -244,7 +244,7 @@ function StickyGetStarted({
|
|
|
244
244
|
animate={{ y: 0 }}
|
|
245
245
|
exit={{ y: "100%" }}
|
|
246
246
|
transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
|
|
247
|
-
className="fixed bottom-0 left-0 right-0 z-40 border-t border-
|
|
247
|
+
className="fixed bottom-0 left-0 right-0 z-40 border-t border-[color-mix(in_srgb,currentColor_14%,transparent)] backdrop-blur-xl py-3 px-6"
|
|
248
248
|
style={{ backgroundColor: "var(--mobile-bg)" }}
|
|
249
249
|
>
|
|
250
250
|
<div className="mx-auto max-w-7xl flex items-center justify-between">
|
|
@@ -38,7 +38,7 @@ export function GlowCard({
|
|
|
38
38
|
onMouseMove={handleMouseMove}
|
|
39
39
|
onMouseEnter={() => setIsHovered(true)}
|
|
40
40
|
onMouseLeave={() => setIsHovered(false)}
|
|
41
|
-
className={`relative rounded-2xl border border-
|
|
41
|
+
className={`relative rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] overflow-hidden transition-shadow duration-300 ${
|
|
42
42
|
isHovered ? "shadow-lg border-teal-200 dark:border-teal-800" : ""
|
|
43
43
|
} ${className}`}
|
|
44
44
|
>
|
|
@@ -55,8 +55,8 @@ export function HorizontalStepper({
|
|
|
55
55
|
done
|
|
56
56
|
? "border-teal-400 bg-teal-400 text-white"
|
|
57
57
|
: active
|
|
58
|
-
? "border-teal-400 bg-
|
|
59
|
-
: "border-
|
|
58
|
+
? "border-teal-400 bg-[color-mix(in_srgb,currentColor_4%,transparent)] text-teal-600 dark:text-teal-400"
|
|
59
|
+
: "border-[color-mix(in_srgb,currentColor_20%,transparent)] bg-[color-mix(in_srgb,currentColor_6%,transparent)] text-zinc-500 dark:text-zinc-500"
|
|
60
60
|
}`}
|
|
61
61
|
>
|
|
62
62
|
{done ? (
|
|
@@ -121,7 +121,7 @@ export function HtmlSitemap({
|
|
|
121
121
|
<li key={page.href} className="min-w-0">
|
|
122
122
|
<a
|
|
123
123
|
href={page.href}
|
|
124
|
-
className="group block py-2 border-b border-
|
|
124
|
+
className="group block py-2 border-b border-[color-mix(in_srgb,currentColor_10%,transparent)] hover:border-[color-mix(in_srgb,currentColor_18%,transparent)] transition-colors"
|
|
125
125
|
>
|
|
126
126
|
<div className="text-sm font-medium text-zinc-900 dark:text-zinc-100 group-hover:opacity-70 transition-opacity line-clamp-2">
|
|
127
127
|
{page.title}
|
|
@@ -154,7 +154,7 @@ export function HtmlSitemap({
|
|
|
154
154
|
<li key={link.href} className="min-w-0">
|
|
155
155
|
<a
|
|
156
156
|
href={link.href}
|
|
157
|
-
className="group block py-2 border-b border-
|
|
157
|
+
className="group block py-2 border-b border-[color-mix(in_srgb,currentColor_10%,transparent)] hover:border-[color-mix(in_srgb,currentColor_18%,transparent)] transition-colors"
|
|
158
158
|
>
|
|
159
159
|
<div className="text-sm font-medium text-zinc-900 dark:text-zinc-100 group-hover:opacity-70 transition-opacity">
|
|
160
160
|
{link.title}
|
|
@@ -171,7 +171,7 @@ export function HtmlSitemap({
|
|
|
171
171
|
</section>
|
|
172
172
|
)}
|
|
173
173
|
|
|
174
|
-
<footer className="mt-16 pt-6 border-t border-
|
|
174
|
+
<footer className="mt-16 pt-6 border-t border-[color-mix(in_srgb,currentColor_10%,transparent)]">
|
|
175
175
|
<p className="text-xs text-zinc-500 dark:text-zinc-400">
|
|
176
176
|
Machine-readable version:{" "}
|
|
177
177
|
<a
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
3
4
|
import { motion } from "framer-motion";
|
|
4
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
trackGetStartedClick,
|
|
7
|
+
trackScheduleClick,
|
|
8
|
+
withBookingAttribution,
|
|
9
|
+
} from "../lib/track";
|
|
5
10
|
|
|
6
11
|
interface InlineCtaProps {
|
|
7
12
|
heading: string;
|
|
@@ -30,6 +35,13 @@ export function InlineCta({
|
|
|
30
35
|
site,
|
|
31
36
|
section,
|
|
32
37
|
}: InlineCtaProps) {
|
|
38
|
+
// For schedule CTAs, rewrite the href after hydration so the Cal.com webhook
|
|
39
|
+
// sees `metadata[utm_*]` params and can attribute the booking to this page.
|
|
40
|
+
// PostHog events still carry the bare `href` so aggregation stays clean.
|
|
41
|
+
const [renderHref, setRenderHref] = useState(href);
|
|
42
|
+
useEffect(() => {
|
|
43
|
+
setRenderHref(trackAs === "schedule" ? withBookingAttribution(href) : href);
|
|
44
|
+
}, [href, trackAs]);
|
|
33
45
|
return (
|
|
34
46
|
<motion.div
|
|
35
47
|
className="my-12 mx-auto max-w-2xl p-6 rounded-2xl border border-teal-100 dark:border-teal-800/60 bg-teal-50/30 dark:bg-teal-950/60"
|
|
@@ -45,7 +57,7 @@ export function InlineCta({
|
|
|
45
57
|
{body}
|
|
46
58
|
</p>
|
|
47
59
|
<a
|
|
48
|
-
href={
|
|
60
|
+
href={renderHref}
|
|
49
61
|
className="inline-flex items-center gap-2 text-sm font-medium text-teal-600 dark:text-teal-300 hover:text-accent-dim transition-colors"
|
|
50
62
|
onClick={() => {
|
|
51
63
|
if (trackAs === "get_started") {
|
|
@@ -33,7 +33,7 @@ export function InlineTestimonial({
|
|
|
33
33
|
}: InlineTestimonialProps) {
|
|
34
34
|
return (
|
|
35
35
|
<figure
|
|
36
|
-
className={`p-6 sm:p-8 rounded-2xl bg-
|
|
36
|
+
className={`p-6 sm:p-8 rounded-2xl bg-[color-mix(in_srgb,currentColor_3%,transparent)] border border-[color-mix(in_srgb,currentColor_14%,transparent)] ${className}`}
|
|
37
37
|
>
|
|
38
38
|
<Stars count={stars} />
|
|
39
39
|
<blockquote className="mt-4 text-lg sm:text-xl leading-relaxed text-zinc-800 dark:text-zinc-200">
|
|
@@ -70,7 +70,7 @@ export function IntegrationsGrid({
|
|
|
70
70
|
>
|
|
71
71
|
<Wrapper
|
|
72
72
|
{...wrapperProps}
|
|
73
|
-
className="group flex items-center gap-3 rounded-xl border border-
|
|
73
|
+
className="group flex items-center gap-3 rounded-xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)] p-4 transition-all hover:border-teal-300 hover:shadow-md"
|
|
74
74
|
>
|
|
75
75
|
{it.logoUrl ? (
|
|
76
76
|
<img
|
|
@@ -44,7 +44,7 @@ export function LottiePlayer({
|
|
|
44
44
|
if (!data) {
|
|
45
45
|
return (
|
|
46
46
|
<div
|
|
47
|
-
className={`my-6 rounded-xl border border-
|
|
47
|
+
className={`my-6 rounded-xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] ${className}`}
|
|
48
48
|
style={{ height, width }}
|
|
49
49
|
/>
|
|
50
50
|
);
|
|
@@ -18,7 +18,7 @@ interface MetricsRowProps {
|
|
|
18
18
|
export function MetricsRow({ metrics }: MetricsRowProps) {
|
|
19
19
|
return (
|
|
20
20
|
<motion.div
|
|
21
|
-
className="my-10 rounded-2xl border border-
|
|
21
|
+
className="my-10 rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] grid grid-cols-2 md:grid-cols-4 divide-x divide-[color-mix(in_srgb,currentColor_14%,transparent)]"
|
|
22
22
|
initial={{ opacity: 0, y: 12 }}
|
|
23
23
|
whileInView={{ opacity: 1, y: 0 }}
|
|
24
24
|
viewport={{ once: true }}
|
|
@@ -68,10 +68,10 @@ export function MotionSequence({
|
|
|
68
68
|
return (
|
|
69
69
|
<div
|
|
70
70
|
ref={containerRef}
|
|
71
|
-
className={`my-10 rounded-2xl border border-
|
|
71
|
+
className={`my-10 rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] overflow-hidden ${className}`}
|
|
72
72
|
>
|
|
73
73
|
{title && (
|
|
74
|
-
<div className="border-b border-
|
|
74
|
+
<div className="border-b border-[color-mix(in_srgb,currentColor_10%,transparent)] px-6 py-4 flex items-center justify-between">
|
|
75
75
|
<h3 className="text-sm font-semibold text-zinc-900 dark:text-zinc-100">{title}</h3>
|
|
76
76
|
<div className="flex items-center gap-2">
|
|
77
77
|
<div className="flex gap-1">
|
|
@@ -39,7 +39,7 @@ export function OrbitingCircles({
|
|
|
39
39
|
>
|
|
40
40
|
{/* Orbit ring */}
|
|
41
41
|
<div
|
|
42
|
-
className="absolute rounded-full border border-dashed border-
|
|
42
|
+
className="absolute rounded-full border border-dashed border-[color-mix(in_srgb,currentColor_14%,transparent)]"
|
|
43
43
|
style={{ width: radius * 2, height: radius * 2 }}
|
|
44
44
|
/>
|
|
45
45
|
|
|
@@ -64,7 +64,7 @@ export function OrbitingCircles({
|
|
|
64
64
|
return (
|
|
65
65
|
<motion.div
|
|
66
66
|
key={i}
|
|
67
|
-
className="absolute top-1/2 left-1/2 flex items-center justify-center rounded-xl bg-
|
|
67
|
+
className="absolute top-1/2 left-1/2 flex items-center justify-center rounded-xl bg-[color-mix(in_srgb,currentColor_4%,transparent)] border border-[color-mix(in_srgb,currentColor_14%,transparent)] shadow-sm text-xs font-medium text-zinc-700 dark:text-zinc-300"
|
|
68
68
|
style={{
|
|
69
69
|
width: 64,
|
|
70
70
|
height: 64,
|
|
@@ -11,7 +11,7 @@ interface ProofBannerProps {
|
|
|
11
11
|
export function ProofBanner({ quote, source, metric }: ProofBannerProps) {
|
|
12
12
|
return (
|
|
13
13
|
<motion.div
|
|
14
|
-
className="my-8 p-4 rounded-xl border border-
|
|
14
|
+
className="my-8 p-4 rounded-xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] flex items-start gap-4"
|
|
15
15
|
initial={{ opacity: 0, x: -16 }}
|
|
16
16
|
whileInView={{ opacity: 1, x: 0 }}
|
|
17
17
|
viewport={{ once: true }}
|
|
@@ -56,7 +56,7 @@ export function RelatedPostsGrid({
|
|
|
56
56
|
whileInView={{ opacity: 1, y: 0 }}
|
|
57
57
|
viewport={{ once: true, margin: "-40px" }}
|
|
58
58
|
transition={{ duration: 0.45, ease: [0.16, 1, 0.3, 1], delay: i * 0.06 }}
|
|
59
|
-
className="group flex flex-col overflow-hidden rounded-2xl border border-
|
|
59
|
+
className="group flex flex-col overflow-hidden rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)] transition-all hover:border-teal-300 hover:shadow-md"
|
|
60
60
|
>
|
|
61
61
|
<div className="h-28 bg-gradient-to-br from-teal-400/20 via-cyan-400/15 to-zinc-50 dark:to-zinc-900" />
|
|
62
62
|
<div className="flex flex-1 flex-col gap-2 p-5">
|
|
@@ -240,7 +240,7 @@ export function RemotionClip({
|
|
|
240
240
|
}: RemotionClipProps) {
|
|
241
241
|
return (
|
|
242
242
|
<div
|
|
243
|
-
className={`my-10 rounded-2xl overflow-hidden border border-
|
|
243
|
+
className={`my-10 rounded-2xl overflow-hidden border border-[color-mix(in_srgb,currentColor_14%,transparent)] shadow-lg ${className}`}
|
|
244
244
|
style={{ aspectRatio: `${width} / ${height}` }}
|
|
245
245
|
>
|
|
246
246
|
<Player
|
|
@@ -164,7 +164,7 @@ export function SeoPageComments({
|
|
|
164
164
|
</span>
|
|
165
165
|
</h2>
|
|
166
166
|
{!unlocked && (
|
|
167
|
-
<span className="inline-flex items-center rounded-full border border-
|
|
167
|
+
<span className="inline-flex items-center rounded-full border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)]/60 px-2.5 py-0.5 text-xs font-medium text-zinc-600 dark:text-zinc-400">
|
|
168
168
|
{lockedMessage}
|
|
169
169
|
</span>
|
|
170
170
|
)}
|
|
@@ -186,7 +186,7 @@ export function SeoPageComments({
|
|
|
186
186
|
placeholder={placeholder}
|
|
187
187
|
rows={3}
|
|
188
188
|
maxLength={4000}
|
|
189
|
-
className="w-full px-3 py-2 rounded-lg border border-
|
|
189
|
+
className="w-full px-3 py-2 rounded-lg border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] text-sm text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 focus:outline-none focus:ring-2 focus:border-[var(--seo-accent,#14b8a6)]"
|
|
190
190
|
style={{ outlineColor: "var(--seo-accent, #14b8a6)" }}
|
|
191
191
|
disabled={status === "loading"}
|
|
192
192
|
/>
|
|
@@ -196,7 +196,7 @@ export function SeoPageComments({
|
|
|
196
196
|
value={name}
|
|
197
197
|
onChange={(e) => setName(e.target.value.slice(0, 80))}
|
|
198
198
|
placeholder="Name (optional)"
|
|
199
|
-
className="flex-1 min-w-0 px-3 py-2 rounded-lg border border-
|
|
199
|
+
className="flex-1 min-w-0 px-3 py-2 rounded-lg border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] text-sm text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 focus:outline-none focus:ring-2"
|
|
200
200
|
disabled={status === "loading"}
|
|
201
201
|
/>
|
|
202
202
|
<button
|
|
@@ -222,7 +222,7 @@ export function SeoPageComments({
|
|
|
222
222
|
<div key={c.id}>
|
|
223
223
|
<CommentRow c={c} onReply={() => setReplyTo(c.id)} />
|
|
224
224
|
{(children[c.id] ?? []).length > 0 && (
|
|
225
|
-
<div className="mt-3 ml-6 pl-4 border-l border-
|
|
225
|
+
<div className="mt-3 ml-6 pl-4 border-l border-[color-mix(in_srgb,currentColor_14%,transparent)] space-y-4">
|
|
226
226
|
{children[c.id].map((r) => (
|
|
227
227
|
<CommentRow key={r.id} c={r} />
|
|
228
228
|
))}
|
|
@@ -105,7 +105,7 @@ export function SeoPageReactions({
|
|
|
105
105
|
className={`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full border text-sm transition-colors ${
|
|
106
106
|
active
|
|
107
107
|
? "border-[var(--seo-accent,#14b8a6)] text-[var(--seo-accent,#14b8a6)] bg-[var(--seo-accent-light,rgba(20,184,166,0.08))]"
|
|
108
|
-
: "border-
|
|
108
|
+
: "border-[color-mix(in_srgb,currentColor_14%,transparent)] text-zinc-700 dark:text-zinc-300 hover:bg-[color-mix(in_srgb,currentColor_4%,transparent)]"
|
|
109
109
|
}`}
|
|
110
110
|
aria-pressed={active}
|
|
111
111
|
aria-label={unlocked ? `${r.label}: ${counts[r.key]}` : r.label}
|
|
@@ -31,7 +31,7 @@ export function SequenceDiagram({ title, actors, messages }: SequenceDiagramProp
|
|
|
31
31
|
|
|
32
32
|
return (
|
|
33
33
|
<motion.div
|
|
34
|
-
className="my-10 rounded-2xl border border-
|
|
34
|
+
className="my-10 rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_4%,transparent)] p-6 overflow-x-auto"
|
|
35
35
|
initial={{ opacity: 0, y: 16 }}
|
|
36
36
|
whileInView={{ opacity: 1, y: 0 }}
|
|
37
37
|
viewport={{ once: true }}
|
|
@@ -48,7 +48,7 @@ export function ShineBorder({
|
|
|
48
48
|
}: ShineBorderProps) {
|
|
49
49
|
const resolvedColor = color ?? "var(--seo-accent, #14b8a6)";
|
|
50
50
|
const outerBase =
|
|
51
|
-
"relative grid min-h-[60px] w-fit min-w-[300px] place-items-center bg-
|
|
51
|
+
"relative grid min-h-[60px] w-fit min-w-[300px] place-items-center bg-[color-mix(in_srgb,currentColor_4%,transparent)] p-3 text-zinc-900 dark:text-zinc-100";
|
|
52
52
|
const outerClass = className
|
|
53
53
|
? `${outerBase} ${className}`
|
|
54
54
|
: outerBase;
|
|
@@ -94,7 +94,7 @@ export function StepTimeline({
|
|
|
94
94
|
{step.description}
|
|
95
95
|
</p>
|
|
96
96
|
{step.detail && (
|
|
97
|
-
<div className="mt-3 rounded-lg border border-
|
|
97
|
+
<div className="mt-3 rounded-lg border border-[color-mix(in_srgb,currentColor_10%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)] p-3 text-sm">
|
|
98
98
|
{step.detail}
|
|
99
99
|
</div>
|
|
100
100
|
)}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
import { useState, useEffect } from "react";
|
|
4
4
|
import { motion, AnimatePresence } from "framer-motion";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
trackGetStartedClick,
|
|
7
|
+
trackScheduleClick,
|
|
8
|
+
withBookingAttribution,
|
|
9
|
+
} from "../lib/track";
|
|
6
10
|
|
|
7
11
|
interface StickyBottomCtaProps {
|
|
8
12
|
description: string;
|
|
@@ -33,6 +37,13 @@ export function StickyBottomCta({
|
|
|
33
37
|
}: StickyBottomCtaProps) {
|
|
34
38
|
const [visible, setVisible] = useState(false);
|
|
35
39
|
|
|
40
|
+
// Rewrite schedule CTAs' href after hydration so the Cal.com webhook sees
|
|
41
|
+
// `metadata[utm_*]` params and attributes the booking to this page.
|
|
42
|
+
const [renderHref, setRenderHref] = useState(href);
|
|
43
|
+
useEffect(() => {
|
|
44
|
+
setRenderHref(trackAs === "schedule" ? withBookingAttribution(href) : href);
|
|
45
|
+
}, [href, trackAs]);
|
|
46
|
+
|
|
36
47
|
useEffect(() => {
|
|
37
48
|
const handler = () => setVisible(window.scrollY > scrollThreshold);
|
|
38
49
|
window.addEventListener("scroll", handler);
|
|
@@ -67,7 +78,7 @@ export function StickyBottomCta({
|
|
|
67
78
|
animate={{ y: 0 }}
|
|
68
79
|
exit={{ y: "100%" }}
|
|
69
80
|
transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
|
|
70
|
-
className="fixed bottom-0 left-0 right-0 z-40 border-t border-
|
|
81
|
+
className="fixed bottom-0 left-0 right-0 z-40 border-t border-[color-mix(in_srgb,currentColor_14%,transparent)] backdrop-blur-xl py-3 px-6"
|
|
71
82
|
style={{ backgroundColor: "var(--mobile-bg)" }}
|
|
72
83
|
>
|
|
73
84
|
<div className="mx-auto max-w-7xl flex items-center justify-between">
|
|
@@ -75,7 +86,7 @@ export function StickyBottomCta({
|
|
|
75
86
|
{description}
|
|
76
87
|
</p>
|
|
77
88
|
<a
|
|
78
|
-
href={
|
|
89
|
+
href={renderHref}
|
|
79
90
|
className="text-sm font-medium px-4 py-2 rounded-lg bg-teal-500 text-accent-contrast hover:bg-accent-dim transition-colors"
|
|
80
91
|
onClick={onClick}
|
|
81
92
|
>
|
package/src/components/Team.tsx
CHANGED
|
@@ -66,13 +66,13 @@ export function Team({ title, subtitle, members, className = "" }: TeamProps) {
|
|
|
66
66
|
>
|
|
67
67
|
<Wrapper
|
|
68
68
|
{...wrapperProps}
|
|
69
|
-
className="group flex flex-col items-center rounded-2xl border border-
|
|
69
|
+
className="group flex flex-col items-center rounded-2xl border border-[color-mix(in_srgb,currentColor_14%,transparent)] bg-[color-mix(in_srgb,currentColor_3%,transparent)] p-5 text-center transition-all hover:border-teal-300 hover:shadow-md"
|
|
70
70
|
>
|
|
71
71
|
{m.avatarUrl ? (
|
|
72
72
|
<img
|
|
73
73
|
src={m.avatarUrl}
|
|
74
74
|
alt={m.name}
|
|
75
|
-
className="h-16 w-16 rounded-full border-2 border-
|
|
75
|
+
className="h-16 w-16 rounded-full border-2 border-[color-mix(in_srgb,currentColor_14%,transparent)] object-cover"
|
|
76
76
|
/>
|
|
77
77
|
) : (
|
|
78
78
|
<div className="flex h-16 w-16 items-center justify-center rounded-full bg-gradient-to-br from-teal-400/30 to-cyan-500/30 text-base font-semibold text-teal-700 dark:text-teal-300">
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
export type RobotsRule = {
|
|
2
|
+
userAgent: string | string[];
|
|
3
|
+
allow?: string | string[];
|
|
4
|
+
disallow?: string | string[];
|
|
5
|
+
crawlDelay?: number;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type GenerateRobotsOptions = {
|
|
9
|
+
/** Absolute base URL, no trailing slash (e.g. `https://fde10x.com`). Used to build the sitemap URL. */
|
|
10
|
+
baseUrl: string;
|
|
11
|
+
/**
|
|
12
|
+
* Paths disallowed for the default `*` rule. Defaults to `["/api/"]`.
|
|
13
|
+
* Pass an empty array to allow everything.
|
|
14
|
+
*/
|
|
15
|
+
disallow?: string[];
|
|
16
|
+
/**
|
|
17
|
+
* Explicit AI crawler allowlist. Each user agent gets its own rule with
|
|
18
|
+
* `allow: "/"` so operators (Google, Perplexity, etc.) can distinguish
|
|
19
|
+
* this site as AI-opted-in. Defaults to the canonical 13-bot allowlist
|
|
20
|
+
* used across every m13v property. Pass `[]` to disable.
|
|
21
|
+
*/
|
|
22
|
+
aiAllowlist?: string[];
|
|
23
|
+
/** Extra rules appended after the default + AI allowlist. */
|
|
24
|
+
extraRules?: RobotsRule[];
|
|
25
|
+
/**
|
|
26
|
+
* Override the sitemap URL. Defaults to `${baseUrl}/sitemap.xml`. Pass an
|
|
27
|
+
* array when you ship multiple sitemaps.
|
|
28
|
+
*/
|
|
29
|
+
sitemap?: string | string[];
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type GeneratedRobots = {
|
|
33
|
+
rules: RobotsRule[];
|
|
34
|
+
sitemap: string | string[];
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const DEFAULT_AI_ALLOWLIST = [
|
|
38
|
+
"GPTBot",
|
|
39
|
+
"ChatGPT-User",
|
|
40
|
+
"ClaudeBot",
|
|
41
|
+
"Claude-Web",
|
|
42
|
+
"anthropic-ai",
|
|
43
|
+
"PerplexityBot",
|
|
44
|
+
"CCBot",
|
|
45
|
+
"Google-Extended",
|
|
46
|
+
"Bytespider",
|
|
47
|
+
"cohere-ai",
|
|
48
|
+
"Applebot",
|
|
49
|
+
"Applebot-Extended",
|
|
50
|
+
];
|
|
51
|
+
|
|
52
|
+
const DEFAULT_DISALLOW = ["/api/"];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Generate a Next.js `MetadataRoute.Robots` value with a default rule, an
|
|
56
|
+
* AI-crawler allowlist, and a sitemap reference derived from `baseUrl`.
|
|
57
|
+
*
|
|
58
|
+
* ```ts
|
|
59
|
+
* // src/app/robots.ts
|
|
60
|
+
* import { generateRobots } from "@seo/components/server";
|
|
61
|
+
*
|
|
62
|
+
* export default function robots() {
|
|
63
|
+
* return generateRobots({ baseUrl: "https://fde10x.com" });
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* Pair with `generateSitemap()` in `src/app/sitemap.ts` — the two together
|
|
68
|
+
* are the canonical SEO-infrastructure setup for a client site.
|
|
69
|
+
*/
|
|
70
|
+
export function generateRobots(opts: GenerateRobotsOptions): GeneratedRobots {
|
|
71
|
+
const baseUrl = opts.baseUrl.replace(/\/+$/, "");
|
|
72
|
+
const disallow = opts.disallow ?? DEFAULT_DISALLOW;
|
|
73
|
+
const aiAllowlist = opts.aiAllowlist ?? DEFAULT_AI_ALLOWLIST;
|
|
74
|
+
|
|
75
|
+
const defaultRule: RobotsRule = {
|
|
76
|
+
userAgent: "*",
|
|
77
|
+
allow: "/",
|
|
78
|
+
...(disallow.length > 0 ? { disallow } : {}),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const aiRules: RobotsRule[] = aiAllowlist.map((userAgent) => ({
|
|
82
|
+
userAgent,
|
|
83
|
+
allow: "/",
|
|
84
|
+
}));
|
|
85
|
+
|
|
86
|
+
const rules = [defaultRule, ...aiRules, ...(opts.extraRules ?? [])];
|
|
87
|
+
const sitemap = opts.sitemap ?? `${baseUrl}/sitemap.xml`;
|
|
88
|
+
|
|
89
|
+
return { rules, sitemap };
|
|
90
|
+
}
|
package/src/lib/track.ts
CHANGED
|
@@ -8,6 +8,54 @@
|
|
|
8
8
|
|
|
9
9
|
import { captureFromWindow } from "./analytics-context";
|
|
10
10
|
|
|
11
|
+
/**
|
|
12
|
+
* Rewrite a booking URL (Cal.com, Calendly, etc.) so the booking webhook can
|
|
13
|
+
* attribute the booking back to the specific landing page it came from.
|
|
14
|
+
*
|
|
15
|
+
* Cal.com's hosted booking page captures plain `utm_source/utm_medium/utm_campaign`
|
|
16
|
+
* URL query params and stores them on the booking's metadata, which Cal.com
|
|
17
|
+
* then forwards in the webhook payload as `booking.metadata.utm_*`. We also
|
|
18
|
+
* emit Cal.com's bracketed `metadata[key]=value` form as a belt-and-braces
|
|
19
|
+
* fallback (some Cal.com surfaces accept that syntax instead). Our webhook
|
|
20
|
+
* handler (social-autoposter-website/api/webhooks/cal/route.ts) writes
|
|
21
|
+
* `booking.metadata.utm_*` into `cal_bookings.utm_source / utm_medium /
|
|
22
|
+
* utm_campaign`, so every booking carries the originating site + page path.
|
|
23
|
+
*
|
|
24
|
+
* Attribution scheme:
|
|
25
|
+
* utm_source = current hostname (e.g. "fazm.com")
|
|
26
|
+
* utm_medium = "schedule_click"
|
|
27
|
+
* utm_campaign = current pathname (e.g. "/t/how-to-quit-weed")
|
|
28
|
+
*
|
|
29
|
+
* SSR-safe: returns the URL unchanged on the server (no `window`) or when the
|
|
30
|
+
* input cannot be parsed as a URL. Never overwrites a pre-existing query key
|
|
31
|
+
* so manual overrides on specific CTAs still win.
|
|
32
|
+
*
|
|
33
|
+
* Applied automatically by `BookCallCTA`, and by `InlineCta` /
|
|
34
|
+
* `StickyBottomCta` when `trackAs === "schedule"`. Consumers that build a
|
|
35
|
+
* custom Book-a-Call CTA MUST route their href through this helper or
|
|
36
|
+
* page-level booking attribution breaks.
|
|
37
|
+
*/
|
|
38
|
+
export function withBookingAttribution(destination: string): string {
|
|
39
|
+
if (typeof window === "undefined") return destination;
|
|
40
|
+
try {
|
|
41
|
+
const url = new URL(destination, window.location.href);
|
|
42
|
+
const source = window.location.hostname;
|
|
43
|
+
const campaign = window.location.pathname || "/";
|
|
44
|
+
const setIfAbsent = (key: string, value: string) => {
|
|
45
|
+
if (!url.searchParams.has(key)) url.searchParams.set(key, value);
|
|
46
|
+
};
|
|
47
|
+
setIfAbsent("utm_source", source);
|
|
48
|
+
setIfAbsent("utm_medium", "schedule_click");
|
|
49
|
+
setIfAbsent("utm_campaign", campaign);
|
|
50
|
+
setIfAbsent("metadata[utm_source]", source);
|
|
51
|
+
setIfAbsent("metadata[utm_medium]", "schedule_click");
|
|
52
|
+
setIfAbsent("metadata[utm_campaign]", campaign);
|
|
53
|
+
return url.toString();
|
|
54
|
+
} catch {
|
|
55
|
+
return destination;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
11
59
|
export interface ScheduleClickProps {
|
|
12
60
|
/** Absolute URL the click sends the user to (e.g. https://cal.com/team/mediar/demo). */
|
|
13
61
|
destination: string;
|
package/src/server.ts
CHANGED
|
@@ -11,6 +11,13 @@ export type {
|
|
|
11
11
|
GenerateSitemapOptions,
|
|
12
12
|
} from "./lib/generate-sitemap";
|
|
13
13
|
|
|
14
|
+
export { generateRobots } from "./lib/generate-robots";
|
|
15
|
+
export type {
|
|
16
|
+
RobotsRule,
|
|
17
|
+
GenerateRobotsOptions,
|
|
18
|
+
GeneratedRobots,
|
|
19
|
+
} from "./lib/generate-robots";
|
|
20
|
+
|
|
14
21
|
export { slugify } from "./lib/slugify";
|
|
15
22
|
|
|
16
23
|
export { createGuideChatHandler } from "./lib/guide-chat-route";
|