diff --git a/docusaurus.config.ts b/docusaurus.config.ts index da14145d8..7f69a986c 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -3,25 +3,90 @@ import type * as Preset from "@docusaurus/preset-classic" import prismTheme from "./src/theme/CodeBlock/theme" import type {Config} from "@docusaurus/types" import {getNavDropdownItemHtml} from "./src/utils" +import fs from "fs" +import path from "path" const title = "Tailcall" const organization = "tailcallhq" const project = "tailcallhq.github.io" +const homeCriticalCss = ` +*,::before,::after{box-sizing:border-box} +:root{--ifm-navbar-height:4.5rem} +html{font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;color:#121315;background:#fff} +body{margin:0;font-size:16px;line-height:1.5;background:#fff} +a{color:inherit;text-decoration:none} +img,svg{display:block;max-width:100%} +.skipToContent_fXgn{position:absolute;left:-999px} +.navbar{display:flex;align-items:center;min-height:4.5rem;width:100%;background:#fff;border-bottom:1px solid #e7e7e7;z-index:20} +.navbar__inner{display:flex;align-items:center;justify-content:space-between;width:100%;padding:0 1.25rem} +.navbar__items{display:flex;align-items:center;gap:1rem} +.navbar__items--right{margin-left:auto} +.navbar__brand{display:flex;align-items:center} +.navbar__logo{width:7.5rem;height:2.5rem;display:flex;align-items:center} +.navbar__logo img{height:2.25rem;width:auto} +.themedComponent--dark_xIcU{display:none} +.navbar__item,.navbarSearchContainer_Bca1,.dropdown__menu{display:none} +.navbar__toggle{display:inline-flex;align-items:center;justify-content:center;width:2.75rem;height:2.75rem;padding:0;border:0;background:transparent;color:#121315} +.main-wrapper{width:100%} +.grid{display:grid}.justify-center{justify-content:center}.flex{display:flex}.flex-col{flex-direction:column}.justify-between{justify-content:space-between}.items-center{align-items:center}.relative{position:relative}.absolute{position:absolute}.inset-0{inset:0} +.hidden{display:none}.w-full{width:100%}.h-full{height:100%}.z-20{position:relative;z-index:1}.mx-auto{margin-left:auto;margin-right:auto}.mb-0{margin-bottom:0}.mt-SPACE_06{margin-top:24px}.space-x-SPACE_04>:not([hidden])~:not([hidden]){margin-left:16px} +.max-w-xs{max-width:20rem}.max-w-md{max-width:28rem}.max-w-7xl{max-width:80rem} +.px-8{padding-left:2rem;padding-right:2rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.px-SPACE_02{padding-left:8px;padding-right:8px}.px-SPACE_06{padding-left:24px;padding-right:24px}.py-SPACE_03{padding-top:12px;padding-bottom:12px}.\\!pb-0{padding-bottom:0!important} +.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem} +.border{border-width:1px}.border-2{border-width:2px}.border-solid{border-style:solid}.border-tailCall-border-dark-100{border-color:#121315} +.bg-white{background:#fff}.bg-transparent{background:transparent}.bg-tailCall-yellow{background:#fdea2e}.bg-tailCall-dark-500{background:#121315} +.text-tailCall-dark-500{color:#121315}.text-tailCall-light-100{color:#fff} +.text-title-large{font-size:32px;line-height:41.6px;font-weight:700;letter-spacing:-1px}.text-content-small{font-size:16px;line-height:24px}.font-normal{font-weight:400}.font-bold{font-weight:700} +.hero-banner-title{margin:0;color:#121315}.hero-banner-sub-title{margin-top:1.5rem;color:#545556} +.group{overflow:hidden}.cursor-pointer{cursor:pointer} +.h-12{height:3rem}.gap-x-SPACE_03{column-gap:12px}.justify-center{justify-content:center}.items-center{align-items:center} +main.grid{width:100%}section.w-full{width:100%} +@media (max-width:639px){.sm\\:hidden{display:flex}.sm\\:flex{display:none}.hero-banner-title{max-width:22rem}.group{min-width:0}.group span{white-space:nowrap;font-size:14px}.navbar__inner{padding:0 1rem}.navbar__logo{width:6.8rem}} +@media (min-width:640px){:root{--ifm-navbar-height:6.5rem}.navbar{min-height:6.5rem}.navbar__inner{padding:0 2rem}.navbar__toggle{display:none}.navbar__item{display:inline-flex}.sm\\:hidden{display:none}.sm\\:flex{display:flex}.sm\\:items-center{align-items:center}.sm\\:text-center{text-align:center}.sm\\:max-w-2xl{max-width:42rem}.sm\\:max-w-5xl{max-width:64rem}.sm\\:m-auto{margin:auto}.sm\\:mt-SPACE_04{margin-top:16px}.sm\\:mt-SPACE_10{margin-top:40px}.sm\\:space-x-SPACE_06>:not([hidden])~:not([hidden]){margin-left:24px}.sm\\:rounded-2xl{border-radius:1rem}.sm\\:rounded-xl{border-radius:.75rem}.sm\\:h-16{height:4rem}.sm\\:text-display-small{font-size:56px;line-height:67.2px;font-weight:700;letter-spacing:-2px}.sm\\:text-content-medium{font-size:20px;line-height:32px}.sm\\:text-title-small{font-size:20px;line-height:26px;font-weight:700}.sm\\:px-SPACE_08{padding-left:32px;padding-right:32px}.sm\\:py-SPACE_04{padding-top:16px;padding-bottom:16px}.object-contain{object-fit:contain}.mt-8{margin-top:2rem}} +@media (min-width:768px){.md\\:px-24{padding-left:6rem;padding-right:6rem}.md\\:justify-center{justify-content:center}} +@media (min-width:1024px){.lg\\:py-20{padding-top:5rem;padding-bottom:5rem}.lg\\:px-36{padding-left:9rem;padding-right:9rem}.lg\\:text-display-large{font-size:96px;line-height:105.6px;font-weight:700;letter-spacing:-3px}.lg\\:text-content-large{font-size:24px;line-height:36px}.lg\\:px-SPACE_10{padding-left:40px;padding-right:40px}.lg\\:py-SPACE_05{padding-top:20px;padding-bottom:20px}.lg\\:block{display:block}.navbarSearchContainer_Bca1{display:flex}} +` + +const deferHomeAssetsScript = (styleHref: string, scriptSrcs: string[]) => ` +` + export default { title, trailingSlash: true, tagline: "GraphQL platform engineered for scale", headTags: [ - { - tagName: "script", - attributes: { - id: "chatbotscript", - "data-accountid": "CZPG9aVdtk59Tjz4SMTu8w==", - "data-websiteid": "75VGI0NlBqessD4BQn2pFg==", - src: "https://app.robofy.ai/bot/js/common.js?v=" + new Date().getTime(), - }, - }, { tagName: "script", attributes: { @@ -226,5 +291,29 @@ export default { }, } }, + async function homePagePerformancePlugin() { + return { + name: "home-page-performance", + async postBuild({outDir}) { + const indexPath = path.join(outDir, "index.html") + if (!fs.existsSync(indexPath)) return + + let html = fs.readFileSync(indexPath, "utf8") + const styleMatch = html.match(//) + const scriptSrcs = Array.from(html.matchAll(/