@m13v/seo-components 0.10.2 → 0.11.1

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/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}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{left:0;right:0}.-left-8{left:-2rem}.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\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.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-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-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.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}.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-11{height:2.75rem}.h-16{height:4rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.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-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-11{width:2.75rem}.w-12{width:3rem}.w-2\.5{width:.625rem}.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-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-4xl{max-width:56rem}.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-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-screen-xl{max-width:1280px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.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}.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-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-y-2{row-gap:.5rem}.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))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.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-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-\[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-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.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-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-\[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-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-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity,1))}.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-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\/90{background-color:hsla(0,0%,100%,.9)}.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-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-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\/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-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\/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-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)}.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}.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-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-8{padding-left:2rem;padding-right:2rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.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-3{padding-top:.75rem}.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-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-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}.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-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,.drop-shadow-sm{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)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.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-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-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-100:hover{--tw-bg-opacity:1;background-color:rgb(244 244 245/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\: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);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.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;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))}@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-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-teal-900\/30:is(.dark *){background-color:rgba(19,78,74,.3)}.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\/90:is(.dark *){background-color:rgba(24,24,27,.9)}.dark\:bg-zinc-950:is(.dark *){--tw-bg-opacity:1;background-color:rgb(9 9 11/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\:fill-zinc-800:is(.dark *){fill:#27272a}.dark\:stroke-zinc-700:is(.dark *){stroke:#3f3f46}.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-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-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-zinc-800:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.dark\:hover\:bg-zinc-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.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\:disabled\:bg-zinc-700:disabled:is(.dark *){--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity,1))}@media (min-width:640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:p-8{padding:2rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:text-4xl{font-size:2.25rem;line-height:2.5rem}.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-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\: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}.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}.-left-8{left:-2rem}.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\.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}.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}.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-11{height:2.75rem}.h-16{height:4rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.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-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-11{width:2.75rem}.w-12{width:3rem}.w-2\.5{width:.625rem}.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-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-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-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-screen-xl{max-width:1280px}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.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-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.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))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.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-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-\[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-400{--tw-border-opacity:1;border-color:rgb(45 212 191/var(--tw-border-opacity,1))}.border-transparent{border-color:transparent}.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-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-\[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-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-300{--tw-bg-opacity:1;background-color:rgb(94 234 212/var(--tw-bg-opacity,1))}.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-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\/90{background-color:hsla(0,0%,100%,.9)}.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-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-50\/50{background-color:hsla(0,0%,98%,.5)}.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-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\/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-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\/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-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)}.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}.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-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-8{padding-left:2rem;padding-right:2rem}.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}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.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-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-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-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,.drop-shadow-sm{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)}.drop-shadow-sm{--tw-drop-shadow:drop-shadow(0 1px 1px rgba(0,0,0,.05))}.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-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-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-100:hover{--tw-bg-opacity:1;background-color:rgb(244 244 245/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);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.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;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\: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-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-teal-900\/30:is(.dark *){background-color:rgba(19,78,74,.3)}.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\/40:is(.dark *){background-color:rgba(24,24,27,.4)}.dark\:bg-zinc-900\/50:is(.dark *){background-color:rgba(24,24,27,.5)}.dark\:bg-zinc-900\/90:is(.dark *){background-color:rgba(24,24,27,.9)}.dark\:bg-zinc-950:is(.dark *){--tw-bg-opacity:1;background-color:rgb(9 9 11/var(--tw-bg-opacity,1))}.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\:fill-zinc-800:is(.dark *){fill:#27272a}.dark\:stroke-zinc-700:is(.dark *){stroke:#3f3f46}.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-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-zinc-800:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity,1))}.dark\:hover\:bg-zinc-900:hover:is(.dark *){--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity,1))}.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))}@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\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.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-4xl{font-size:2.25rem;line-height:2.5rem}.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-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\: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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@m13v/seo-components",
3
- "version": "0.10.2",
3
+ "version": "0.11.1",
4
4
  "scripts": {
5
5
  "build:css": "tailwind -i src/_build.css -o dist/styles.css --minify",
6
6
  "bump:consumers": "bash scripts/bump-consumers.sh",
@@ -68,7 +68,7 @@ export function AnimatedDemo({
68
68
  >
69
69
  {/* Header */}
70
70
  <div className="flex items-center justify-between mb-3">
71
- <span className="text-xs font-mono font-medium text-teal-600 tracking-wider uppercase">
71
+ <span className="text-xs font-mono font-medium text-teal-600 dark:text-teal-400 tracking-wider uppercase">
72
72
  {title}
73
73
  </span>
74
74
  {code && (
@@ -82,7 +82,7 @@ export function AnimatedDemo({
82
82
  </div>
83
83
 
84
84
  {/* Demo screen */}
85
- <div className="rounded-2xl border border-zinc-200 bg-zinc-950 overflow-hidden shadow-lg">
85
+ <div className="rounded-2xl border border-zinc-200 dark:border-zinc-800 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,12 +166,12 @@ export function AnimatedDemo({
166
166
  transition={{ duration: 0.3 }}
167
167
  className="mt-4"
168
168
  >
169
- <div className="rounded-xl border border-zinc-200 bg-zinc-950 overflow-hidden">
169
+ <div className="rounded-xl border border-zinc-200 dark:border-zinc-800 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}
173
173
  </span>
174
- <span className="text-[10px] text-zinc-600 font-mono">
174
+ <span className="text-[10px] text-zinc-600 dark:text-zinc-400 font-mono">
175
175
  How to build this
176
176
  </span>
177
177
  </div>
@@ -44,7 +44,7 @@ export function AnimatedMetric({
44
44
  viewport={{ once: true }}
45
45
  transition={{ duration: 0.4, ease: [0.16, 1, 0.3, 1] }}
46
46
  >
47
- <span className="text-3xl md:text-4xl font-bold text-teal-600 tabular-nums">
47
+ <span className="text-3xl md:text-4xl font-bold text-teal-600 dark:text-teal-400 tabular-nums">
48
48
  {prefix}{display}
49
49
  {suffix && <span className="text-base font-semibold">{suffix}</span>}
50
50
  </span>
@@ -32,7 +32,7 @@ export function ArticleMeta({
32
32
  <div className="w-7 h-7 rounded-full bg-gradient-to-br from-teal-500/40 to-teal-500/10 flex items-center justify-center text-xs font-semibold text-white">
33
33
  {author.charAt(0)}
34
34
  </div>
35
- <span className="text-zinc-900 font-medium">{author}</span>
35
+ <span className="text-zinc-900 dark:text-zinc-100 font-medium">{author}</span>
36
36
  {authorRole && <span className="hidden sm:inline text-zinc-500">, {authorRole}</span>}
37
37
  </div>
38
38
  <span aria-hidden="true">&middot;</span>
@@ -31,7 +31,7 @@ export function BackgroundGrid({
31
31
 
32
32
  return (
33
33
  <div
34
- className={`relative overflow-hidden rounded-2xl border border-zinc-200 my-10 ${className}`}
34
+ className={`relative overflow-hidden rounded-2xl border border-zinc-200 dark:border-zinc-800 my-10 ${className}`}
35
35
  >
36
36
  <div
37
37
  className="absolute inset-0 pointer-events-none"
@@ -27,17 +27,17 @@ export function BeforeAfter({
27
27
  className={`my-10 ${className}`}
28
28
  >
29
29
  {title && (
30
- <h3 className="text-lg font-semibold text-zinc-900 mb-4">{title}</h3>
30
+ <h3 className="text-lg font-semibold text-zinc-900 dark:text-zinc-100 mb-4">{title}</h3>
31
31
  )}
32
32
 
33
33
  {/* Toggle */}
34
- <div className="flex items-center gap-1 mb-4 bg-zinc-100 rounded-lg p-1 w-fit">
34
+ <div className="flex items-center gap-1 mb-4 bg-zinc-100 dark:bg-zinc-900 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-white text-zinc-900 shadow-sm"
40
- : "text-zinc-500 hover:text-zinc-700"
39
+ ? "bg-white dark:bg-zinc-800 text-zinc-900 dark:text-zinc-100 shadow-sm"
40
+ : "text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200"
41
41
  }`}
42
42
  >
43
43
  {before.label}
@@ -47,7 +47,7 @@ export function BeforeAfter({
47
47
  className={`px-4 py-2 text-sm font-medium rounded-md transition-all duration-200 ${
48
48
  showAfter
49
49
  ? "bg-gradient-to-r from-cyan-500 to-teal-500 text-white shadow-sm"
50
- : "text-zinc-500 hover:text-zinc-700"
50
+ : "text-zinc-500 dark:text-zinc-400 hover:text-zinc-700 dark:hover:text-zinc-200"
51
51
  }`}
52
52
  >
53
53
  {after.label}
@@ -55,7 +55,7 @@ export function BeforeAfter({
55
55
  </div>
56
56
 
57
57
  {/* Content panel */}
58
- <div className="relative rounded-xl border border-zinc-200 bg-zinc-50 overflow-hidden min-h-[200px]">
58
+ <div className="relative rounded-xl border border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-zinc-950/50 overflow-hidden min-h-[200px]">
59
59
  <AnimatePresence mode="wait">
60
60
  {!showAfter ? (
61
61
  <motion.div
@@ -66,7 +66,7 @@ export function BeforeAfter({
66
66
  transition={{ duration: 0.25, ease: [0.16, 1, 0.3, 1] }}
67
67
  className="p-6"
68
68
  >
69
- <p className="text-sm text-zinc-600 leading-relaxed whitespace-pre-line">
69
+ <p className="text-sm text-zinc-600 dark:text-zinc-300 leading-relaxed whitespace-pre-line">
70
70
  {before.content}
71
71
  </p>
72
72
  {before.highlights && (
@@ -94,7 +94,7 @@ export function BeforeAfter({
94
94
  transition={{ duration: 0.25, ease: [0.16, 1, 0.3, 1] }}
95
95
  className="p-6"
96
96
  >
97
- <p className="text-sm text-zinc-600 leading-relaxed whitespace-pre-line">
97
+ <p className="text-sm text-zinc-600 dark:text-zinc-300 leading-relaxed whitespace-pre-line">
98
98
  {after.content}
99
99
  </p>
100
100
  {after.highlights && (
@@ -102,7 +102,7 @@ export function BeforeAfter({
102
102
  {after.highlights.map((h, i) => (
103
103
  <li
104
104
  key={i}
105
- className="flex items-center gap-2 text-sm text-teal-600"
105
+ className="flex items-center gap-2 text-sm text-teal-600 dark:text-teal-400"
106
106
  >
107
107
  <svg className="w-4 h-4 flex-shrink-0" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={2.5}>
108
108
  <path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
@@ -21,7 +21,7 @@ export function Breadcrumbs({ items, className = "", align = "start" }: Breadcru
21
21
  const isLast = i === items.length - 1;
22
22
  return (
23
23
  <Fragment key={`${item.label}-${i}`}>
24
- <li className={isLast ? "text-zinc-900 line-clamp-1" : ""}>
24
+ <li className={isLast ? "text-zinc-900 dark:text-zinc-100 line-clamp-1" : ""}>
25
25
  {item.href && !isLast ? (
26
26
  <Link href={item.href} className="hover:text-zinc-900 transition-colors">
27
27
  {item.label}
@@ -29,22 +29,22 @@ export function CodeComparison({
29
29
 
30
30
  return (
31
31
  <motion.div
32
- className="my-8 rounded-2xl border border-zinc-200 bg-white overflow-hidden"
32
+ className="my-8 rounded-2xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 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-zinc-200 bg-white/50">
38
+ <div className="flex items-center justify-between px-5 py-3 border-b border-zinc-200 dark:border-zinc-800 bg-white/50">
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-white p-0.5 border border-zinc-200">
42
+ <div className="flex gap-1 rounded-lg bg-white dark:bg-zinc-900 p-0.5 border border-zinc-200 dark:border-zinc-800">
43
43
  <button
44
44
  onClick={() => setTab("left")}
45
45
  className={`text-[11px] font-medium px-3 py-1 rounded-md transition-colors ${
46
46
  tab === "left"
47
- ? "bg-teal-500/10 text-teal-600"
47
+ ? "bg-teal-500/10 text-teal-600 dark:text-teal-400"
48
48
  : "text-zinc-500 hover:text-zinc-900"
49
49
  }`}
50
50
  >
@@ -74,7 +74,7 @@ export function CodeComparison({
74
74
  exit={{ opacity: 0, x: 8 }}
75
75
  transition={{ duration: 0.2 }}
76
76
  >
77
- <code className="text-zinc-900">{leftCode}</code>
77
+ <code className="text-zinc-900 dark:text-zinc-100">{leftCode}</code>
78
78
  </motion.pre>
79
79
  ) : (
80
80
  <motion.pre
@@ -85,13 +85,13 @@ export function CodeComparison({
85
85
  exit={{ opacity: 0, x: 8 }}
86
86
  transition={{ duration: 0.2 }}
87
87
  >
88
- <code className="text-zinc-900">{rightCode}</code>
88
+ <code className="text-zinc-900 dark:text-zinc-100">{rightCode}</code>
89
89
  </motion.pre>
90
90
  )}
91
91
  </AnimatePresence>
92
92
  </div>
93
93
 
94
- <div className="px-5 py-3 border-t border-zinc-200 bg-white/50 flex items-center gap-3">
94
+ <div className="px-5 py-3 border-t border-zinc-200 dark:border-zinc-800 bg-white/50 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 }}
@@ -423,7 +423,7 @@ function ChatThread({
423
423
  <TypingIndicator />
424
424
  </ThreadPrimitive.If>
425
425
  </ThreadPrimitive.Viewport>
426
- <div className="px-3 py-3 border-t border-zinc-100">
426
+ <div className="px-3 py-3 border-t border-zinc-100 dark:border-zinc-900">
427
427
  <Composer />
428
428
  </div>
429
429
  </ThreadPrimitive.Root>
@@ -0,0 +1,187 @@
1
+ import type { PageEntry } from "../lib/walk-pages";
2
+ import { groupByCategory, categoryLabel } from "../lib/walk-pages";
3
+
4
+ export interface HtmlSitemapProps {
5
+ /** All pages discovered via `walkPages()` on the server. */
6
+ pages: PageEntry[];
7
+ /** Brand name used in the heading (e.g. "fde10x"). */
8
+ brandName: string;
9
+ /** Optional heading override. Defaults to "Sitemap". */
10
+ heading?: string;
11
+ /** Optional intro paragraph below the heading. */
12
+ intro?: string;
13
+ /** Override display labels per category slug. Built-ins: t → "Guides" etc. */
14
+ categoryLabels?: Record<string, string>;
15
+ /** Preferred category display order. Unlisted categories follow alphabetically. */
16
+ categoryOrder?: string[];
17
+ /** Extra static links appended after the walked pages (e.g. external /blog). */
18
+ extraLinks?: Array<{ href: string; title: string; description?: string }>;
19
+ /** Show the home page ("/") at the top of the list. Default: true. */
20
+ showHome?: boolean;
21
+ /** Home link label. Default: "Home". */
22
+ homeLabel?: string;
23
+ }
24
+
25
+ function sortCategoryKeys(
26
+ keys: string[],
27
+ preferred: string[] | undefined,
28
+ ): string[] {
29
+ if (!preferred || preferred.length === 0) return keys.slice().sort();
30
+ const set = new Set(keys);
31
+ const head = preferred.filter((k) => set.has(k));
32
+ const tail = keys.filter((k) => !preferred.includes(k)).sort();
33
+ return [...head, ...tail];
34
+ }
35
+
36
+ /**
37
+ * Human-readable HTML sitemap page. Groups pages by their first URL segment
38
+ * (category) and renders them as a clean grid. Designed as a drop-in body
39
+ * for `src/app/sitemap/page.tsx` alongside the XML sitemap at `/sitemap.xml`.
40
+ *
41
+ * ```tsx
42
+ * // src/app/sitemap/page.tsx
43
+ * import { HtmlSitemap } from "@seo/components";
44
+ * import { walkPages } from "@seo/components/server";
45
+ *
46
+ * export const metadata = { title: "Sitemap — fde10x" };
47
+ *
48
+ * export default function Page() {
49
+ * const pages = walkPages({ includeHome: false });
50
+ * return <HtmlSitemap pages={pages} brandName="fde10x" />;
51
+ * }
52
+ * ```
53
+ */
54
+ export function HtmlSitemap({
55
+ pages,
56
+ brandName,
57
+ heading = "Sitemap",
58
+ intro,
59
+ categoryLabels,
60
+ categoryOrder,
61
+ extraLinks,
62
+ showHome = true,
63
+ homeLabel = "Home",
64
+ }: HtmlSitemapProps) {
65
+ const groups = groupByCategory(pages);
66
+ const orderedKeys = sortCategoryKeys(
67
+ Array.from(groups.keys()),
68
+ categoryOrder,
69
+ );
70
+
71
+ return (
72
+ <main className="mx-auto max-w-5xl px-5 sm:px-6 py-12 sm:py-16">
73
+ <header className="mb-10 sm:mb-12">
74
+ <h1 className="text-3xl sm:text-4xl font-bold tracking-tight text-zinc-900 dark:text-zinc-100">
75
+ {heading}
76
+ </h1>
77
+ <p className="mt-3 text-base text-zinc-600 dark:text-zinc-400">
78
+ {intro ??
79
+ `Every page on ${brandName}, grouped by section. ${pages.length} page${pages.length === 1 ? "" : "s"} total.`}
80
+ </p>
81
+ </header>
82
+
83
+ {showHome && (
84
+ <section className="mb-10">
85
+ <ul className="grid gap-2">
86
+ <li>
87
+ <a
88
+ href="/"
89
+ className="inline-flex items-center gap-2 text-base font-medium text-zinc-900 dark:text-zinc-100 hover:opacity-70 transition-opacity"
90
+ style={{ color: "var(--seo-accent-dark, #0d9488)" }}
91
+ >
92
+ {homeLabel}
93
+ <span
94
+ aria-hidden="true"
95
+ className="inline-block w-1.5 h-1.5 rounded-full"
96
+ style={{ backgroundColor: "var(--seo-accent, #14b8a6)" }}
97
+ />
98
+ </a>
99
+ </li>
100
+ </ul>
101
+ </section>
102
+ )}
103
+
104
+ {orderedKeys.map((key) => {
105
+ const categoryPages = groups.get(key) ?? [];
106
+ if (categoryPages.length === 0) return null;
107
+
108
+ const label =
109
+ categoryLabels?.[key] ?? categoryLabel(key) ?? key;
110
+
111
+ return (
112
+ <section key={key} className="mb-12">
113
+ <h2 className="text-xs font-semibold uppercase tracking-wider text-zinc-500 dark:text-zinc-400 mb-4">
114
+ {label}
115
+ <span className="ml-2 font-normal text-zinc-400 dark:text-zinc-500">
116
+ {categoryPages.length}
117
+ </span>
118
+ </h2>
119
+ <ul className="grid sm:grid-cols-2 gap-x-6 gap-y-3">
120
+ {categoryPages.map((page) => (
121
+ <li key={page.href} className="min-w-0">
122
+ <a
123
+ href={page.href}
124
+ className="group block py-2 border-b border-zinc-100 dark:border-zinc-800 hover:border-zinc-300 dark:hover:border-zinc-700 transition-colors"
125
+ >
126
+ <div className="text-sm font-medium text-zinc-900 dark:text-zinc-100 group-hover:opacity-70 transition-opacity line-clamp-2">
127
+ {page.title}
128
+ </div>
129
+ {page.description && (
130
+ <div className="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400 line-clamp-2">
131
+ {page.description}
132
+ </div>
133
+ )}
134
+ {page.datePublished && (
135
+ <div className="mt-1 text-[11px] text-zinc-400 dark:text-zinc-500 font-mono">
136
+ {page.datePublished}
137
+ </div>
138
+ )}
139
+ </a>
140
+ </li>
141
+ ))}
142
+ </ul>
143
+ </section>
144
+ );
145
+ })}
146
+
147
+ {extraLinks && extraLinks.length > 0 && (
148
+ <section className="mb-12">
149
+ <h2 className="text-xs font-semibold uppercase tracking-wider text-zinc-500 dark:text-zinc-400 mb-4">
150
+ More
151
+ </h2>
152
+ <ul className="grid sm:grid-cols-2 gap-x-6 gap-y-3">
153
+ {extraLinks.map((link) => (
154
+ <li key={link.href} className="min-w-0">
155
+ <a
156
+ href={link.href}
157
+ className="group block py-2 border-b border-zinc-100 dark:border-zinc-800 hover:border-zinc-300 dark:hover:border-zinc-700 transition-colors"
158
+ >
159
+ <div className="text-sm font-medium text-zinc-900 dark:text-zinc-100 group-hover:opacity-70 transition-opacity">
160
+ {link.title}
161
+ </div>
162
+ {link.description && (
163
+ <div className="mt-0.5 text-xs text-zinc-500 dark:text-zinc-400">
164
+ {link.description}
165
+ </div>
166
+ )}
167
+ </a>
168
+ </li>
169
+ ))}
170
+ </ul>
171
+ </section>
172
+ )}
173
+
174
+ <footer className="mt-16 pt-6 border-t border-zinc-100 dark:border-zinc-800">
175
+ <p className="text-xs text-zinc-500 dark:text-zinc-400">
176
+ Machine-readable version:{" "}
177
+ <a
178
+ href="/sitemap.xml"
179
+ className="underline underline-offset-2 hover:opacity-70 transition-opacity"
180
+ >
181
+ /sitemap.xml
182
+ </a>
183
+ </p>
184
+ </footer>
185
+ </main>
186
+ );
187
+ }
@@ -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-zinc-200 bg-zinc-50 ${className}`}
47
+ className={`my-6 rounded-xl border border-zinc-200 dark:border-zinc-800 bg-zinc-50 dark:bg-zinc-900 ${className}`}
48
48
  style={{ height, width }}
49
49
  />
50
50
  );
@@ -111,11 +111,11 @@ function Texts({ texts }: { texts: string[] }) {
111
111
  return (
112
112
  <>
113
113
  <span
114
- className="absolute inset-x-0 top-0 m-auto inline-block w-full text-center text-zinc-900 [will-change:filter,opacity] antialiased"
114
+ className="absolute inset-x-0 top-0 m-auto inline-block w-full text-center text-zinc-900 dark:text-zinc-100 [will-change:filter,opacity] antialiased"
115
115
  ref={text1Ref}
116
116
  />
117
117
  <span
118
- className="absolute inset-x-0 top-0 m-auto inline-block w-full text-center text-zinc-900 [will-change:filter,opacity] antialiased"
118
+ className="absolute inset-x-0 top-0 m-auto inline-block w-full text-center text-zinc-900 dark:text-zinc-100 [will-change:filter,opacity] antialiased"
119
119
  ref={text2Ref}
120
120
  />
121
121
  </>
@@ -68,11 +68,11 @@ export function MotionSequence({
68
68
  return (
69
69
  <div
70
70
  ref={containerRef}
71
- className={`my-10 rounded-2xl border border-zinc-200 bg-white overflow-hidden ${className}`}
71
+ className={`my-10 rounded-2xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 overflow-hidden ${className}`}
72
72
  >
73
73
  {title && (
74
- <div className="border-b border-zinc-100 px-6 py-4 flex items-center justify-between">
75
- <h3 className="text-sm font-semibold text-zinc-900">{title}</h3>
74
+ <div className="border-b border-zinc-100 dark:border-zinc-900 px-6 py-4 flex items-center justify-between">
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">
78
78
  {frames.map((_, i) => (
@@ -116,7 +116,7 @@ export function MotionSequence({
116
116
  initial={{ opacity: 0, y: 8 }}
117
117
  animate={{ opacity: 1, y: 0 }}
118
118
  transition={{ delay: 0.15, duration: 0.4 }}
119
- className="text-xl font-semibold text-zinc-900 text-center mb-2"
119
+ className="text-xl font-semibold text-zinc-900 dark:text-zinc-100 text-center mb-2"
120
120
  >
121
121
  {current.title}
122
122
  </motion.h4>
@@ -60,7 +60,7 @@ export function NumberTicker({
60
60
  return (
61
61
  <motion.span
62
62
  ref={ref}
63
- className={`tabular-nums font-bold text-zinc-900 ${className}`}
63
+ className={`tabular-nums font-bold text-zinc-900 dark:text-zinc-100 ${className}`}
64
64
  >
65
65
  {prefix}0{suffix}
66
66
  </motion.span>
@@ -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-zinc-200"
42
+ className="absolute rounded-full border border-dashed border-zinc-200 dark:border-zinc-800"
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-white border border-zinc-200 shadow-sm text-xs font-medium text-zinc-700"
67
+ className="absolute top-1/2 left-1/2 flex items-center justify-center rounded-xl bg-white dark:bg-zinc-900 border border-zinc-200 dark:border-zinc-800 shadow-sm text-xs font-medium text-zinc-700 dark:text-zinc-300"
68
68
  style={{
69
69
  width: 64,
70
70
  height: 64,
@@ -37,7 +37,7 @@ export function ProofBand({
37
37
  </svg>
38
38
  ))}
39
39
  </div>
40
- <span className="text-zinc-700 font-medium">{rating.toFixed(1)}</span>
40
+ <span className="text-zinc-700 dark:text-zinc-300 font-medium">{rating.toFixed(1)}</span>
41
41
  <span className="text-zinc-400">from {ratingCount}</span>
42
42
  </div>
43
43
 
@@ -56,7 +56,7 @@ export function ProofBand({
56
56
  >
57
57
  <path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
58
58
  </svg>
59
- <span className="text-zinc-600">{h}</span>
59
+ <span className="text-zinc-600 dark:text-zinc-400">{h}</span>
60
60
  </div>
61
61
  ))}
62
62
  </div>
@@ -208,7 +208,7 @@ export function RemotionClip({
208
208
  }: RemotionClipProps) {
209
209
  return (
210
210
  <div
211
- className={`my-10 rounded-2xl overflow-hidden border border-zinc-200 shadow-lg ${className}`}
211
+ className={`my-10 rounded-2xl overflow-hidden border border-zinc-200 dark:border-zinc-800 shadow-lg ${className}`}
212
212
  style={{ aspectRatio: `${width} / ${height}` }}
213
213
  >
214
214
  <Player
@@ -10,9 +10,32 @@ export interface SeoPageCommentsProps {
10
10
  title?: string;
11
11
  placeholder?: string;
12
12
  emptyMessage?: string;
13
+ lockedMessage?: string;
13
14
  className?: string;
14
15
  }
15
16
 
17
+ function unlockKey(site: string, pageSlug: string): string {
18
+ return `seo_comments_unlocked:${site}:${pageSlug}`;
19
+ }
20
+
21
+ function readUnlocked(site: string, pageSlug: string): boolean {
22
+ if (typeof window === "undefined") return false;
23
+ try {
24
+ return window.localStorage.getItem(unlockKey(site, pageSlug)) === "1";
25
+ } catch {
26
+ return false;
27
+ }
28
+ }
29
+
30
+ function writeUnlocked(site: string, pageSlug: string): void {
31
+ if (typeof window === "undefined") return;
32
+ try {
33
+ window.localStorage.setItem(unlockKey(site, pageSlug), "1");
34
+ } catch {
35
+ // no-op
36
+ }
37
+ }
38
+
16
39
  interface Comment {
17
40
  id: number;
18
41
  author_name: string | null;
@@ -41,6 +64,7 @@ export function SeoPageComments({
41
64
  title = "Comments",
42
65
  placeholder = "Share your thoughts. No account needed.",
43
66
  emptyMessage = "Be the first to comment.",
67
+ lockedMessage = "Leave a comment to see what others are saying.",
44
68
  className = "",
45
69
  }: SeoPageCommentsProps) {
46
70
  const [comments, setComments] = useState<Comment[] | null>(null);
@@ -50,11 +74,13 @@ export function SeoPageComments({
50
74
  const [status, setStatus] = useState<"idle" | "loading" | "error">("idle");
51
75
  const [errorMsg, setErrorMsg] = useState("");
52
76
  const [token, setToken] = useState("");
77
+ const [unlocked, setUnlocked] = useState(false);
53
78
 
54
79
  useEffect(() => {
55
80
  setToken(getAuthorToken());
56
81
  setName(getStoredName());
57
- }, []);
82
+ setUnlocked(readUnlocked(site, pageSlug));
83
+ }, [site, pageSlug]);
58
84
 
59
85
  const load = useCallback(async () => {
60
86
  try {
@@ -113,6 +139,8 @@ export function SeoPageComments({
113
139
  setBody("");
114
140
  setReplyTo(null);
115
141
  setStatus("idle");
142
+ writeUnlocked(site, pageSlug);
143
+ setUnlocked(true);
116
144
  await load();
117
145
  } catch {
118
146
  setErrorMsg("Network error");
@@ -166,7 +194,14 @@ export function SeoPageComments({
166
194
  </form>
167
195
 
168
196
  <div className="space-y-6">
169
- {comments == null ? (
197
+ {!unlocked ? (
198
+ <div
199
+ className="rounded-lg border border-dashed border-zinc-200 dark:border-zinc-800 bg-zinc-50/50 dark:bg-zinc-900/40 px-4 py-6 text-center"
200
+ aria-live="polite"
201
+ >
202
+ <p className="text-sm text-zinc-600 dark:text-zinc-400">{lockedMessage}</p>
203
+ </div>
204
+ ) : comments == null ? (
170
205
  <p className="text-sm text-zinc-400">Loading…</p>
171
206
  ) : top.length === 0 ? (
172
207
  <p className="text-sm text-zinc-500 dark:text-zinc-400">{emptyMessage}</p>
@@ -9,6 +9,7 @@ export interface SeoPageReactionsProps {
9
9
  apiOrigin: string;
10
10
  className?: string;
11
11
  label?: string;
12
+ lockedHint?: string;
12
13
  }
13
14
 
14
15
  const REACTIONS = [
@@ -27,6 +28,7 @@ export function SeoPageReactions({
27
28
  apiOrigin,
28
29
  className = "",
29
30
  label = "How did this page land for you?",
31
+ lockedHint = "React to reveal totals",
30
32
  }: SeoPageReactionsProps) {
31
33
  const [counts, setCounts] = useState<Record<ReactionKey, number>>({
32
34
  like: 0,
@@ -86,6 +88,8 @@ export function SeoPageReactions({
86
88
  }
87
89
  }
88
90
 
91
+ const unlocked = mine.size > 0;
92
+
89
93
  return (
90
94
  <div className={`seo-page-reactions mx-auto max-w-2xl my-8 ${className}`}>
91
95
  {label && <p className="text-sm text-zinc-500 mb-2">{label}</p>}
@@ -101,17 +105,29 @@ export function SeoPageReactions({
101
105
  className={`inline-flex items-center gap-1.5 px-3 py-1.5 rounded-full border text-sm transition-colors ${
102
106
  active
103
107
  ? "border-[var(--seo-accent,#14b8a6)] text-[var(--seo-accent,#14b8a6)] bg-[var(--seo-accent-light,rgba(20,184,166,0.08))]"
104
- : "border-zinc-200 text-zinc-700 hover:bg-zinc-50"
108
+ : "border-zinc-200 dark:border-zinc-800 text-zinc-700 dark:text-zinc-300 hover:bg-zinc-50"
105
109
  }`}
106
110
  aria-pressed={active}
107
- aria-label={r.label}
111
+ aria-label={unlocked ? `${r.label}: ${counts[r.key]}` : r.label}
108
112
  >
109
113
  <span className="text-base leading-none">{r.emoji}</span>
110
- <span className="font-medium tabular-nums">{counts[r.key]}</span>
114
+ {unlocked ? (
115
+ <span className="font-medium tabular-nums">{counts[r.key]}</span>
116
+ ) : (
117
+ <span
118
+ className="font-medium tabular-nums select-none text-zinc-300 dark:text-zinc-600"
119
+ aria-hidden="true"
120
+ >
121
+ ••
122
+ </span>
123
+ )}
111
124
  </button>
112
125
  );
113
126
  })}
114
127
  </div>
128
+ {!unlocked && lockedHint && (
129
+ <p className="mt-2 text-xs text-zinc-400 dark:text-zinc-500">{lockedHint}</p>
130
+ )}
115
131
  </div>
116
132
  );
117
133
  }
@@ -17,7 +17,7 @@ interface SequenceDiagramProps {
17
17
 
18
18
  const typeStyles: Record<string, { stroke: string; text: string; dash?: string }> = {
19
19
  request: { stroke: "stroke-emerald-500", text: "text-emerald-500" },
20
- response: { stroke: "stroke-teal-500", text: "text-teal-600", dash: "6 3" },
20
+ response: { stroke: "stroke-teal-500", text: "text-teal-600 dark:text-teal-400", dash: "6 3" },
21
21
  event: { stroke: "stroke-amber-400", text: "text-amber-400" },
22
22
  error: { stroke: "stroke-red-400", text: "text-red-400", dash: "4 4" },
23
23
  };
@@ -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-zinc-200 bg-white p-6 overflow-x-auto"
34
+ className="my-10 rounded-2xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 p-6 overflow-x-auto"
35
35
  initial={{ opacity: 0, y: 16 }}
36
36
  whileInView={{ opacity: 1, y: 0 }}
37
37
  viewport={{ once: true }}
@@ -46,7 +46,7 @@ export function ShineBorder({
46
46
  children,
47
47
  }: ShineBorderProps) {
48
48
  const outerBase =
49
- "relative grid min-h-[60px] w-fit min-w-[300px] place-items-center bg-white p-3 text-zinc-900";
49
+ "relative grid min-h-[60px] w-fit min-w-[300px] place-items-center bg-white dark:bg-zinc-900 p-3 text-zinc-900 dark:text-zinc-100";
50
50
  const outerClass = className
51
51
  ? `${outerBase} ${className}`
52
52
  : outerBase;
@@ -32,7 +32,7 @@ export function StickyBottomCta({
32
32
  animate={{ y: 0 }}
33
33
  exit={{ y: "100%" }}
34
34
  transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
35
- className="fixed bottom-0 left-0 right-0 z-40 border-t border-zinc-200 backdrop-blur-xl py-3 px-6"
35
+ className="fixed bottom-0 left-0 right-0 z-40 border-t border-zinc-200 dark:border-zinc-800 backdrop-blur-xl py-3 px-6"
36
36
  style={{ backgroundColor: "var(--mobile-bg)" }}
37
37
  >
38
38
  <div className="mx-auto max-w-7xl flex items-center justify-between">
@@ -44,7 +44,7 @@ export function TypingAnimation({
44
44
  }, [duration, i, text]);
45
45
 
46
46
  const base =
47
- "font-display text-center text-4xl font-bold leading-[5rem] tracking-[-0.02em] drop-shadow-sm text-zinc-900";
47
+ "font-display text-center text-4xl font-bold leading-[5rem] tracking-[-0.02em] drop-shadow-sm text-zinc-900 dark:text-zinc-100";
48
48
 
49
49
  return (
50
50
  <h1 className={className ? `${base} ${className}` : base}>
@@ -0,0 +1,183 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+
4
+ export type SitemapPriority = {
5
+ path: RegExp | string;
6
+ priority: number;
7
+ changeFrequency?:
8
+ | "always"
9
+ | "hourly"
10
+ | "daily"
11
+ | "weekly"
12
+ | "monthly"
13
+ | "yearly"
14
+ | "never";
15
+ };
16
+
17
+ export type SitemapEntry = {
18
+ url: string;
19
+ lastModified?: Date;
20
+ changeFrequency?: SitemapPriority["changeFrequency"];
21
+ priority?: number;
22
+ };
23
+
24
+ export type GenerateSitemapOptions = {
25
+ /** Absolute base URL, no trailing slash (e.g. `https://fde10x.com`). */
26
+ baseUrl: string;
27
+ /** Absolute path to Next.js `src/app`. Defaults to `process.cwd() + "/src/app"`. */
28
+ appDir?: string;
29
+ /**
30
+ * Priority/changeFrequency tiers applied by regex match on the URL path.
31
+ * First match wins. If no rules match, defaults kick in (home=1.0,
32
+ * everything else=0.7, weekly). Pass `priorities: []` to disable defaults.
33
+ */
34
+ priorities?: SitemapPriority[];
35
+ /**
36
+ * Extra entries appended after the filesystem walk. Use for dynamic routes
37
+ * like /blog/[slug] where the filesystem doesn't know the concrete URLs.
38
+ */
39
+ extraEntries?: SitemapEntry[];
40
+ /** Path segments to skip entirely during the walk (e.g. ["checkout"]). */
41
+ excludePaths?: string[];
42
+ };
43
+
44
+ const DEFAULT_PRIORITIES: SitemapPriority[] = [
45
+ { path: /^\/$/, priority: 1.0, changeFrequency: "weekly" },
46
+ {
47
+ path: /^\/(how-it-works|wins|book|contact|pricing)(\/|$)/,
48
+ priority: 0.9,
49
+ changeFrequency: "weekly",
50
+ },
51
+ {
52
+ path: /^\/(about|faq|blog|podcast|testimonials|case-studies)(\/|$)/,
53
+ priority: 0.8,
54
+ changeFrequency: "weekly",
55
+ },
56
+ {
57
+ path: /^\/(guides|trainings|tools|resources|t)(\/|$)/,
58
+ priority: 0.6,
59
+ changeFrequency: "weekly",
60
+ },
61
+ {
62
+ path: /^\/(privacy|terms|legal|cookies)(\/|$)/,
63
+ priority: 0.3,
64
+ changeFrequency: "yearly",
65
+ },
66
+ ];
67
+
68
+ function matchPriority(
69
+ urlPath: string,
70
+ rules: SitemapPriority[],
71
+ ): { priority: number; changeFrequency: SitemapPriority["changeFrequency"] } {
72
+ for (const rule of rules) {
73
+ const matched =
74
+ typeof rule.path === "string"
75
+ ? urlPath === rule.path
76
+ : rule.path.test(urlPath);
77
+ if (matched) {
78
+ return {
79
+ priority: rule.priority,
80
+ changeFrequency: rule.changeFrequency ?? "weekly",
81
+ };
82
+ }
83
+ }
84
+ return { priority: 0.7, changeFrequency: "weekly" };
85
+ }
86
+
87
+ function walkFilesystemPages(
88
+ appDir: string,
89
+ baseUrl: string,
90
+ excludeSet: Set<string>,
91
+ ): SitemapEntry[] {
92
+ const results: SitemapEntry[] = [];
93
+
94
+ function walk(dir: string, urlSegments: string[]) {
95
+ let entries: fs.Dirent[];
96
+ try {
97
+ entries = fs.readdirSync(dir, { withFileTypes: true });
98
+ } catch {
99
+ return;
100
+ }
101
+
102
+ for (const entry of entries) {
103
+ if (entry.isFile() && entry.name === "page.tsx") {
104
+ const filePath = path.join(dir, entry.name);
105
+ let stat: fs.Stats;
106
+ try {
107
+ stat = fs.statSync(filePath);
108
+ } catch {
109
+ continue;
110
+ }
111
+ const urlPath =
112
+ urlSegments.length === 0 ? "" : "/" + urlSegments.join("/");
113
+ results.push({
114
+ url: `${baseUrl}${urlPath}`,
115
+ lastModified: stat.mtime,
116
+ });
117
+ continue;
118
+ }
119
+
120
+ if (!entry.isDirectory()) continue;
121
+
122
+ const name = entry.name;
123
+ if (name.startsWith("_")) continue;
124
+ if (name === "api") continue;
125
+ if (name.startsWith("[") && name.endsWith("]")) continue;
126
+ if (excludeSet.has(name)) continue;
127
+
128
+ const isRouteGroup = name.startsWith("(") && name.endsWith(")");
129
+ const nextSegments = isRouteGroup
130
+ ? urlSegments
131
+ : [...urlSegments, name];
132
+
133
+ walk(path.join(dir, name), nextSegments);
134
+ }
135
+ }
136
+
137
+ walk(appDir, []);
138
+ return results;
139
+ }
140
+
141
+ /**
142
+ * Generate a Next.js `MetadataRoute.Sitemap` by walking `src/app` for
143
+ * `page.tsx` files and applying priority tiers. Route groups (parentheses),
144
+ * dynamic segments (brackets), underscore-prefixed dirs, and `api/` are
145
+ * excluded automatically.
146
+ *
147
+ * ```ts
148
+ * // src/app/sitemap.ts
149
+ * import { generateSitemap } from "@seo/components/server";
150
+ *
151
+ * export default function sitemap() {
152
+ * return generateSitemap({ baseUrl: "https://fde10x.com" });
153
+ * }
154
+ * ```
155
+ *
156
+ * For dynamic routes (blog, tags), append via `extraEntries`.
157
+ */
158
+ export function generateSitemap(
159
+ opts: GenerateSitemapOptions,
160
+ ): SitemapEntry[] {
161
+ const baseUrl = opts.baseUrl.replace(/\/+$/, "");
162
+ const appDir =
163
+ opts.appDir ?? path.join(process.cwd(), "src/app");
164
+ const rules =
165
+ opts.priorities === undefined ? DEFAULT_PRIORITIES : opts.priorities;
166
+ const excludeSet = new Set(opts.excludePaths ?? []);
167
+
168
+ const filesystemEntries = walkFilesystemPages(appDir, baseUrl, excludeSet);
169
+ const combined = [...filesystemEntries, ...(opts.extraEntries ?? [])];
170
+
171
+ return combined.map((entry) => {
172
+ const pathOnly = entry.url.startsWith(baseUrl)
173
+ ? entry.url.slice(baseUrl.length) || "/"
174
+ : entry.url;
175
+ const match = matchPriority(pathOnly, rules);
176
+ return {
177
+ url: entry.url,
178
+ lastModified: entry.lastModified ?? new Date(),
179
+ changeFrequency: entry.changeFrequency ?? match.changeFrequency,
180
+ priority: entry.priority ?? match.priority,
181
+ };
182
+ });
183
+ }
package/src/server.ts CHANGED
@@ -4,6 +4,13 @@
4
4
  export { walkPages, groupByCategory, categoryLabel } from "./lib/walk-pages";
5
5
  export type { PageEntry, PageSection, WalkPagesOptions } from "./lib/walk-pages";
6
6
 
7
+ export { generateSitemap } from "./lib/generate-sitemap";
8
+ export type {
9
+ SitemapEntry,
10
+ SitemapPriority,
11
+ GenerateSitemapOptions,
12
+ } from "./lib/generate-sitemap";
13
+
7
14
  export { slugify } from "./lib/slugify";
8
15
 
9
16
  export { createGuideChatHandler } from "./lib/guide-chat-route";