/* HyperFrames Design System — Mintlify Theme Overrides */ @import url("https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&display=swap"); @font-face { font-family: "TT Norms Pro"; src: url("https://www-static-assets.heygen.com/fonts/tt-norms/TT_Norms_Pro_Normal.woff2") format("woff2"); font-weight: 400; font-style: normal; font-display: swap; } @font-face { font-family: "TT Norms Pro"; src: url("https://www-static-assets.heygen.com/fonts/tt-norms/TT_Norms_Pro_Medium.woff2") format("woff2"); font-weight: 500; font-style: normal; font-display: swap; } @font-face { font-family: "TT Norms Pro"; src: url("https://www-static-assets.heygen.com/fonts/tt-norms/TT_Norms_Pro_DemiBold.woff2") format("woff2"); font-weight: 600; font-style: normal; font-display: swap; } @font-face { font-family: "TT Norms Pro"; src: url("https://www-static-assets.heygen.com/fonts/tt-norms/TT_Norms_Pro_Bold.woff2") format("woff2"); font-weight: 700; font-style: normal; font-display: swap; } /* ── Light mode (default) ── */ /* * NOTE: All custom variables are namespaced with `--hf-` to avoid * colliding with Mintlify's Tailwind color system, which owns names * like `--background-light` / `--background-dark` and uses them via * `rgb(var(--background-light)/)`. Overriding those with hex * values breaks the rgb() call and makes surfaces transparent (e.g. * the "Copy page" dropdown panel in light mode). */ :root { --hf-background: #f6f5f1; --hf-background-light: #ffffff; --hf-surface2: #eeedea; --hf-border-color: #e0dfdb; --hf-border-color-light: #d0cfcb; --hf-text: #1a1a1a; --hf-text-secondary: #6b6b6b; --hf-text-tertiary: #999999; --hf-heading: #0a0a0a; --hf-code-bg: #ffffff; --hf-ui-border: #eeeeee; --hf-sidebar-rail: #eeeeee; --hf-sidebar-text: #707070; --hf-floating-input-shadow: 0 8px 28px rgba(10, 10, 10, 0.08), 0 1px 4px rgba(10, 10, 10, 0.08); --mintlify-slot-header-height: 3rem; --hf-brand: #16785b; --hf-brand-soft: rgba(22, 120, 91, 0.1); --hf-video-accent: #3ce6ac; --hf-accent-green: #1a7a0a; --hf-accent-green-light: rgba(26, 122, 10, 0.07); --hf-accent-green-border: rgba(26, 122, 10, 0.25); --hf-accent-blue: #2563eb; --hf-accent-blue-light: rgba(37, 99, 235, 0.06); --hf-accent-blue-border: rgba(37, 99, 235, 0.2); --hf-accent-purple: #7c3aed; --hf-accent-purple-light: rgba(124, 58, 237, 0.06); --hf-accent-purple-border: rgba(124, 58, 237, 0.2); --hf-selection-bg: rgba(128, 128, 128, 0.2); } /* ── Dark mode ── */ .dark, [data-theme="dark"] { --hf-background: #0a0a0a; --hf-background-light: #141414; --hf-surface2: #1a1a1a; --hf-border-color: #2a2a2a; --hf-border-color-light: #3a3a3a; --hf-text: #e5e5e5; --hf-text-secondary: #a0a0a0; --hf-text-tertiary: #666666; --hf-heading: #f5f5f5; --hf-code-bg: #141414; --hf-ui-border: #2a2a2a; --hf-sidebar-rail: #2a2a2a; --hf-sidebar-text: #a0a0a0; --hf-floating-input-shadow: 0 8px 28px rgba(0, 0, 0, 0.4), 0 1px 4px rgba(0, 0, 0, 0.4); --hf-brand: #3ce6ac; --hf-brand-soft: rgba(60, 230, 172, 0.12); --hf-accent-green: #22c55e; --hf-accent-green-light: rgba(34, 197, 94, 0.1); --hf-accent-green-border: rgba(34, 197, 94, 0.3); --hf-accent-blue: #3b82f6; --hf-accent-blue-light: rgba(59, 130, 246, 0.1); --hf-accent-blue-border: rgba(59, 130, 246, 0.3); --hf-accent-purple: #a78bfa; --hf-accent-purple-light: rgba(167, 139, 250, 0.1); --hf-accent-purple-border: rgba(167, 139, 250, 0.3); --hf-selection-bg: rgba(255, 255, 255, 0.15); } /* ── Typography ── */ body { font-family: "TT Norms Pro", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } h1, h2, h3, h4, h5, h6 { font-family: "TT Norms Pro", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; } h1, h2 { letter-spacing: -0.02em; } h3 { letter-spacing: -0.01em; } /* ── Workflow routing ── */ .hf-workflow-routes { margin: 1.5rem 0; border-top: 1px solid var(--hf-border-color); } .hf-workflow-route { display: grid; grid-template-columns: 11rem minmax(0, 1fr); gap: 1rem; align-items: center; padding: 1rem 0; border-bottom: 1px solid var(--hf-border-color); color: inherit; text-decoration: none; } .hf-workflow-route:hover .hf-workflow-route-title { color: var(--hf-accent-green); } .hf-workflow-route video { display: block; width: 100%; aspect-ratio: 16 / 9; margin: 0; border-radius: 0.5rem; background: #000; object-fit: cover; pointer-events: none; } /* A route with no preview clip: same box, no black rectangle. */ .hf-workflow-route-noclip { display: block; width: 100%; aspect-ratio: 16 / 9; margin: 0; border-radius: 0.5rem; background: color-mix(in srgb, currentColor 8%, transparent); } .hf-workflow-route-title { display: block; color: var(--hf-heading); font-weight: 650; line-height: 1.35; transition: color 120ms ease; } .hf-workflow-route-copy { display: block; margin-top: 0.3rem; color: var(--hf-text-secondary); font-size: 0.9rem; line-height: 1.5; } @media (max-width: 639px) { .hf-workflow-route { grid-template-columns: 7rem minmax(0, 1fr); gap: 0.8rem; } } /* Code font — IBM Plex Mono (loaded via Google Fonts above). * * Deliberately scoped to real code elements. The previous rule also matched * [class*="code"] / [class*="Code"], which caught any element whose class * merely contained that substring — including every Accordion, whose wrapper * carries the Tailwind utility `dark:bg-codeblock`. That set the whole * accordion (and, by inheritance, its title and prose) in monospace, so plain * sentences rendered like terminal output. Syntax tokens inside `pre` inherit * from `pre`, so they do not need a selector of their own. */ code, pre, pre code, kbd, samp { font-family: "IBM Plex Mono", "SF Mono", "Fira Code", monospace; } /* ── Selection ── */ ::selection { background: var(--hf-selection-bg); } /* ── Links ── */ #content-area :where(p, li, td, blockquote) a:not([class]) { border-bottom: 1px solid color-mix(in srgb, var(--hf-brand) 72%, transparent); color: inherit; text-decoration: none; } #content-area :where(p, li, td, blockquote) a:not([class]):hover { border-bottom-color: var(--hf-brand); color: var(--hf-brand); } /* ── Documentation navigation ── */ /* * Keep Aspen's full-width header, but place its desktop controls on one row: * logo → section tabs → search → actions. Mobile keeps Mintlify's layout. */ @media (min-width: 1024px) { #navbar { height: 3rem; } #navbar > div:has(.nav-tabs) { display: grid; grid-template-columns: max-content max-content minmax(10.25rem, 1fr) max-content; column-gap: 1rem; align-items: center; height: 3rem; } #navbar > div:has(.nav-tabs) > .relative, #navbar > div:has(.nav-tabs) > .relative > div:first-child, #navbar > div:has(.nav-tabs) > .relative > div:first-child > div:first-child { display: contents; } #navbar > div:has(.nav-tabs) > .relative > div:first-child > div:first-child > div:first-child { grid-column: 1; grid-row: 1; } #navbar div:has(> .nav-tabs) { grid-column: 2; grid-row: 1; height: 3rem; padding: 0; } #navbar .nav-tabs { align-items: center; gap: 0.25rem; height: 3rem; } /* Use the same quiet pill treatment as Mintlify's own documentation. */ #navbar .nav-tabs-item { height: 2.25rem !important; padding: 0 0.8rem; border-radius: 999px; color: var(--hf-text); transition: background-color 140ms ease, color 140ms ease; } #navbar .nav-tabs-item:hover { background: color-mix(in srgb, var(--hf-heading) 6%, transparent); color: var(--hf-heading); } #navbar .nav-tabs-item.text-primary { background: color-mix(in srgb, var(--hf-heading) 9%, transparent); color: var(--hf-heading) !important; } #navbar .nav-tabs-item > .absolute.bottom-0 { display: none; } #navbar div:has(> #search-bar-entry) { grid-column: 3; grid-row: 1; min-width: 0; } #navbar .topbar-right-container { grid-column: 4; grid-row: 1; } #sidebar-content { top: 3rem !important; height: calc(100vh - 3rem) !important; } /* Keep the repository compact, but retain its useful live star count. */ #navbar a[title="heygen-com/hyperframes"] { width: 7.5rem; min-width: 7.5rem; height: 2.25rem; padding: 0 0.75rem; justify-content: center; } #navbar a[title="heygen-com/hyperframes"] > span.truncate { display: none; } #navbar a[title="heygen-com/hyperframes"] > span:not(.truncate) { display: flex !important; color: var(--hf-heading); font-variant-numeric: tabular-nums; } /* * Mintlify removes the live count for roughly one animation frame during * client-side navigation. Keep a truthful placeholder in its place so the * control does not collapse while the live count reloads. */ #navbar a[title="heygen-com/hyperframes"]:not(:has(> span:not(.truncate)))::after { color: var(--hf-heading); content: "★"; font-variant-numeric: tabular-nums; } } /* The native gutter was almost 15px wide. Keep the rail quiet and compact. */ #navigation-items { scrollbar-color: color-mix(in srgb, var(--hf-text) 30%, transparent) transparent; scrollbar-gutter: auto !important; scrollbar-width: thin; } #navigation-items::-webkit-scrollbar { width: 5px; } #navigation-items::-webkit-scrollbar-track { background: transparent; } #navigation-items::-webkit-scrollbar-thumb { border-radius: 999px; background: color-mix(in srgb, var(--hf-text) 30%, transparent); } #navigation-items::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--hf-text) 46%, transparent); } /* Preserve a useful search field on smaller desktop widths. */ @media (min-width: 1024px) and (max-width: 1199px) { #navbar #assistant-entry { display: none; } } /* Use main's quieter structural border color across Aspen surfaces. */ #body-content [class*="border-gray-200"], #body-content [class*="border-gray-100"] { border-color: var(--hf-ui-border) !important; } /* Keep the floating agent input noticeable against the page background. */ #body-content .chat-assistant-floating-input > div > div { border-color: var(--hf-border-color-light) !important; background-color: var(--hf-background-light) !important; box-shadow: var(--hf-floating-input-shadow); } /* * Match the navigation rhythm and active-page rail used on the main docs. * Each link owns one rail segment, so the current page can highlight only * its segment. These rules are visual only; groups remain non-collapsible. */ #navigation-items .sidebar-group-header { color: var(--hf-text); font-size: 0.875rem; font-weight: 500; line-height: 1.25rem; } #navigation-items .sidebar-group { padding-left: 0; } #navigation-items .sidebar-group::before { content: none; } #navigation-items .sidebar-group > li { margin-bottom: 0; } #navigation-items .sidebar-group > li + li { margin-top: 0 !important; } #navigation-items .sidebar-group > li > a { width: calc(100% - 1rem); margin-left: 1rem; padding: 0.375rem 0.75rem 0.375rem 1rem; border-left: 1px solid var(--hf-sidebar-rail); border-radius: 0; background: transparent !important; color: var(--hf-sidebar-text); } #navigation-items .sidebar-group > li > a:hover { background: transparent !important; color: var(--hf-heading); } #navigation-items .sidebar-group > li[data-active="true"] > a, #navigation-items .sidebar-group > li[data-active-nav-item="true"] > a, #navigation-items .sidebar-group > li > a[aria-current="page"] { border-left-color: currentColor; color: var(--hf-heading); } /* Aspen inserts horizontal separators; main uses the same space without a rule. */ #navigation-items div:has(> .sidebar-group) + div { height: 2rem; padding: 0; } #navigation-items div:has(> .sidebar-group) + div > * { display: none; } /* * Aspen assumes a 96px header and fades scrolled navigation before it reaches * that boundary. Our header is 48px; align the sticky sidebar to it and let * links clip exactly at the header instead of disappearing early. */ #navigation-items, #navigation-items [data-id] { -webkit-mask-image: none !important; mask-image: none !important; } /* Catalog texture examples */ .hf-texture-preview-panel { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; margin: 24px 0 40px; } .hf-texture-preview-card { min-width: 0; border: 1px solid rgba(127, 127, 127, 0.22); border-radius: 8px; padding: 16px; background: #101010; } .hf-texture-preview-label { margin-bottom: 12px; color: rgba(255, 255, 255, 0.6); font-size: 12px; line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .hf-texture-preview-shadow { filter: drop-shadow(1px 2px 1px rgba(0, 0, 0, 0.48)); } .hf-texture-preview-word { color: #fff; font-family: Impact, "Arial Black", sans-serif; font-size: 42px; line-height: 0.9; letter-spacing: 0; text-align: center; text-transform: uppercase; white-space: nowrap; -webkit-mask-image: var(--mask-url); mask-image: var(--mask-url); -webkit-mask-size: cover; mask-size: cover; -webkit-mask-position: center; mask-position: center; -webkit-mask-mode: luminance; mask-mode: luminance; } .hf-texture-animate-demo { border: 1px solid rgba(127, 127, 127, 0.22); border-radius: 8px; padding: 22px; margin: 20px 0 24px; background: linear-gradient(90deg, rgba(255, 255, 255, 0.54) 1px, transparent 1px), #f1f1f1; background-size: 44px 100%; } .hf-texture-animate-meta { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 18px; } .hf-texture-animate-label { min-width: 0; color: rgba(24, 24, 24, 0.62); font-size: 13px; line-height: 1.2; } .hf-texture-animate-class { max-width: 62%; padding: 2px 6px; border: 1px solid rgba(24, 24, 24, 0.12); border-radius: 6px; background: rgba(255, 255, 255, 0.5); color: rgba(24, 24, 24, 0.78); font-size: 11px; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .hf-texture-animate-shadow { filter: drop-shadow(1px 2px 1px rgba(0, 0, 0, 0.48)); } .hf-texture-animate-word { color: #181818; font-family: Impact, "Arial Black", sans-serif; font-size: 92px; line-height: 0.9; letter-spacing: 0; text-align: center; text-transform: uppercase; white-space: nowrap; -webkit-mask-image: var(--mask-url); mask-image: var(--mask-url); -webkit-mask-size: 180% 180%; mask-size: 180% 180%; -webkit-mask-position: 0% 50%; mask-position: 0% 50%; -webkit-mask-mode: luminance; mask-mode: luminance; animation: hf-texture-mask-pan 2.1s ease-in-out infinite alternate; } @keyframes hf-texture-mask-pan { from { -webkit-mask-position: 0% 50%; mask-position: 0% 50%; } to { -webkit-mask-position: 100% 50%; mask-position: 100% 50%; } } .hf-texture-example-groups { display: grid; gap: 32px; margin: 20px 0 40px; } .hf-texture-example-groups > div, .hf-texture-example-card { min-width: 0; } .hf-texture-example-title { margin: 0 0 10px; font-size: 14px; font-weight: 600; } .hf-texture-example-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 320px), 1fr)); gap: 16px; } .hf-texture-example-card { border: 1px solid rgba(127, 127, 127, 0.22); border-radius: 8px; padding: 20px; background: #f1f1f1; } .hf-texture-example-meta { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 14px; } .hf-texture-example-label { min-width: 0; color: rgba(24, 24, 24, 0.62); font-size: 13px; line-height: 1.2; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .hf-texture-example-class { max-width: 62%; padding: 2px 6px; border: 1px solid rgba(24, 24, 24, 0.12); border-radius: 6px; background: rgba(255, 255, 255, 0.5); color: rgba(24, 24, 24, 0.78); font-size: 11px; line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .hf-texture-example-shadow { filter: drop-shadow(1px 2px 1px rgba(0, 0, 0, 0.48)); } .hf-texture-example-word { color: #181818; font-family: Impact, "Arial Black", sans-serif; font-size: 54px; line-height: 0.9; letter-spacing: 0; text-align: center; text-transform: uppercase; white-space: nowrap; -webkit-mask-image: var(--mask-url); mask-image: var(--mask-url); -webkit-mask-size: cover; mask-size: cover; -webkit-mask-position: center; mask-position: center; -webkit-mask-mode: luminance; mask-mode: luminance; } .hf-texture-example-usage { display: flex; align-items: flex-start; gap: 6px; min-width: 0; margin-top: 14px; padding-top: 12px; border-top: 1px solid rgba(24, 24, 24, 0.1); color: rgba(24, 24, 24, 0.56); font-size: 12px; line-height: 1.3; } .hf-texture-example-usage code { min-width: 0; color: rgba(24, 24, 24, 0.82); font-size: 11px; line-height: 1.3; white-space: normal; overflow-wrap: anywhere; } /* Portrait proof clips should read as examples inside the page, not become the * page. Landscape films keep the full content width; only explicitly marked * portrait media gets this compact, centered treatment. */ .hf-portrait-video { display: block; width: auto; max-width: min(100%, 18rem); max-height: min(32rem, 68vh); margin: 0.75rem auto 0; border-radius: 0.5rem; background: #111; } /* Full narrated films use a quiet custom control layer over the native video * engine. Preview loops remain plain muted videos. */ .hf-docs-video-block { width: 100%; } .hf-docs-video-block[data-portrait="true"] { width: min(100%, 18rem); margin: 0.75rem auto 0; } .hf-docs-video-block[data-portrait="true"] .hf-docs-video { aspect-ratio: 9 / 16; max-height: min(32rem, 68vh); } /* * Mintlify loads custom React snippets after the page shell. Reserve the * film's real shape so the unloaded component never flashes as a thin Frame * rail, then let the hydrated player and chapter guide size themselves. */ .hf-docs-video-frame { width: 100%; aspect-ratio: 16 / 9; overflow: hidden; border-radius: 0.75rem; background: #070707; } .hf-docs-video-frame:has(.hf-docs-video-block) { aspect-ratio: auto; overflow: visible; border-radius: 0; background: transparent; } .hf-docs-video { position: relative; aspect-ratio: 16 / 9; overflow: hidden; border-radius: 0.75rem; background: #070707; color: #fff; isolation: isolate; outline: none; }@media (max-width: 720px) {} @media (max-width: 520px) {} .hf-docs-video:focus-visible { box-shadow: 0 0 0 3px color-mix(in srgb, var(--hf-video-accent) 78%, transparent); } .hf-docs-video video { display: block; width: 100%; height: 100%; margin: 0 !important; background: #070707; object-fit: contain; cursor: pointer; } .hf-docs-video-hero-play { position: absolute; top: 50%; left: 50%; display: flex; align-items: center; justify-content: center; width: 3.35rem; height: 3.35rem; padding: 0; border: 1px solid rgba(255, 255, 255, 0.18); border-radius: 50%; background: rgba(8, 8, 8, 0.56); color: #fff; font: inherit; cursor: pointer; transform: translate(-50%, -50%); backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px); box-shadow: 0 10px 28px rgba(0, 0, 0, 0.3); z-index: 3; } .hf-docs-video-hero-play:hover { border-color: var(--hf-video-accent); background: rgba(8, 8, 8, 0.78); } .hf-docs-video-hero-play:focus-visible, .hf-docs-video-control:focus-visible, .hf-docs-video-rate:focus-visible, .hf-docs-video-progress:focus-visible { outline: 2px solid var(--hf-video-accent); outline-offset: 2px; } .hf-docs-video-hero-icon { display: grid; width: 2rem; height: 2rem; flex: 0 0 auto; place-items: center; border-radius: 0; background: transparent; color: #fff; } .hf-docs-video-hero-icon svg { width: 1.25rem; height: 1.25rem; margin-left: 0.1rem; fill: currentColor; } .hf-docs-video-controls { position: absolute; right: 0; bottom: 0; left: 0; display: grid; gap: 0.45rem; padding: 3.75rem 1rem 0.78rem; background: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.84)); opacity: 1; transform: translateY(0); visibility: visible; transition: opacity 160ms ease, transform 160ms ease, visibility 0s linear; z-index: 2; } .hf-docs-video-controls[data-visible="false"] { pointer-events: none; opacity: 0; transform: translateY(0.4rem); visibility: hidden; transition: opacity 160ms ease, transform 160ms ease, visibility 0s linear 160ms; } .hf-docs-video-progress { width: 100%; height: 1rem; margin: 0; border: 0; background: transparent; cursor: pointer; appearance: none; -webkit-appearance: none; } /* Timecode bubble that tracks the pointer along the progress bar. It is a label, not a thumbnail: rendering a second