hirael
blockprismsource: ok · hit
Prism
Dark, liquid-glass landing page for an AI web design agency: a fixed glass pill nav, a full-screen video hero whose headline blurs in word by word over a partners row, a video-backed how-it-works statement, alternating feature rows with looping media, a four-card benefits grid, a stats band over a desaturated video, three testimonials and a video call to action that carries the footer. Self-contained pure-black palette, Barlow + Instrument Serif type, CSS entrances only.
npx shadcn add "https://hirael.com/r/prism.json"free
Where it goes
herotestimonialfooterstatsfeature-grid
Visual style
glass-blur3ddark-futuristic
Interaction
animated-counter
Tags auto-generated by rules on 9/24/2026 — empty means no evidence, not lack of support.
Dependencies
Bundle weight · lighticonslucide-react
Registry dependencies
button
Files13 · source cached 10/8/2026, 1:43:57 PM
registry/hirael/bases/radix/templates/prism/prism.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { cn } from '@/lib/utils';
import { Benefits } from './benefits';
import { Cta } from './cta';
import { Features } from './features';
import { barlow, instrumentSerif } from './fonts';
import { Hero } from './hero';
import { Navbar } from './navbar';
import { Process } from './process';
import { Stats } from './stats';
import { PrismStyles } from './styles';
import { Testimonials } from './testimonials';
const Prism = () => {
return (
<div
className={cn(
'prism',
barlow.variable,
instrumentSerif.variable,
'relative min-h-svh bg-background text-foreground antialiased',
'[font-family:var(--font-prism-sans),ui-sans-serif,sans-serif]',
)}
>
<PrismStyles />
<Navbar />
<Hero />
<Process />
<Features />
<Benefits />
<Stats />
<Testimonials />
<Cta />
</div>
);
};
export default Prism;
registry/hirael/bases/radix/templates/prism/navbar.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
'use client';
import * as React from 'react';
import { ArrowUpRight, Menu, X } from 'lucide-react';
import { Button } from '@/registry/hirael/bases/radix/ui/button';
import { Wordmark } from './primitives';
const NAV_LINKS = [
{ label: 'Home', href: '#home' },
{ label: 'Services', href: '#services' },
{ label: 'Work', href: '#work' },
{ label: 'Process', href: '#process' },
{ label: 'Pricing', href: '#pricing' },
] as const;
export const Navbar = () => {
const [isOpen, setIsOpen] = React.useState(false);
return (
<header data-slot="navbar" className="fixed inset-x-0 top-4 z-50 px-6 lg:px-16">
<nav className="flex items-center justify-between gap-4 md:grid md:grid-cols-[1fr_auto_1fr]">
<a href="#home" aria-label="Prism home" className="justify-self-start">
<Wordmark />
</a>
<div className="liquid-glass flex items-center gap-1 rounded-full p-1.5 md:ps-2">
<div className="hidden items-center md:flex">
{NAV_LINKS.map((link) => (
<a
key={link.label}
href={link.href}
className="px-3 py-2 text-sm font-medium text-foreground/90 transition-colors hover:text-foreground"
>
{link.label}
</a>
))}
</div>
<Button
type="button"
variant="ghost"
size="icon-sm"
aria-label={isOpen ? 'Close menu' : 'Open menu'}
aria-expanded={isOpen}
onClick={() => setIsOpen((value) => !value)}
className="md:hidden"
>
{isOpen ? <X className="size-4" /> : <Menu className="size-4" />}
</Button>
<Button type="button" size="sm">
Get Started
<ArrowUpRight className="size-4 rtl:-scale-x-100" />
</Button>
</div>
</nav>
{isOpen ? (
<div className="liquid-glass mt-3 flex flex-col rounded-3xl p-2 md:hidden">
{NAV_LINKS.map((link) => (
<a
key={link.label}
href={link.href}
onClick={() => setIsOpen(false)}
className="rounded-full px-4 py-2.5 text-sm font-medium text-foreground/90 transition-colors hover:bg-foreground/10 hover:text-foreground"
>
{link.label}
</a>
))}
</div>
) : null}
</header>
);
};
registry/hirael/bases/radix/templates/prism/hero.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { ArrowUpRight, Play } from 'lucide-react';
import { Button } from '@/registry/hirael/bases/radix/ui/button';
import { GlassButton, GlassPill, RiseText, VideoBackdrop } from './primitives';
const HERO_VIDEO = 'https://hirael.com/media/templates/prism/hero.mp4';
const PARTNERS = ['Luminary', 'Arcline', 'Helix', 'Vela', 'Northwind'] as const;
interface HeroProps {
videoSrc?: string;
posterSrc?: string;
}
export const Hero = ({ videoSrc = HERO_VIDEO, posterSrc }: HeroProps) => {
return (
<section id="home" data-slot="hero" className="relative flex min-h-svh flex-col overflow-hidden">
<VideoBackdrop src={videoSrc} posterSrc={posterSrc} />
<div aria-hidden className="absolute inset-0 z-0 bg-background/5" />
<div className="relative z-10 flex flex-1 flex-col items-center px-6 pt-36 text-center md:pt-44">
<p className="rise liquid-glass flex items-center gap-2 rounded-full p-1 pe-3 text-sm text-foreground/90">
<span className="rounded-full bg-primary px-3 py-1 text-xs font-semibold text-primary-foreground">New</span>
Introducing AI-powered web design.
</p>
<h1 className="mt-6 max-w-3xl [font-family:var(--font-prism-serif)] text-6xl leading-[0.85] tracking-[-2px] text-foreground italic md:text-7xl lg:text-[5.5rem] lg:tracking-[-4px]">
<RiseText text="The Website Your Brand Deserves" />
</h1>
<p className="rise-still mt-6 max-w-2xl text-sm leading-relaxed font-light text-foreground [animation-delay:0.8s] md:text-base">
Stunning design. Blazing performance. Built by AI, refined by experts. This is web design, wildly reimagined.
</p>
<div className="rise mt-8 flex flex-wrap items-center justify-center gap-6 [animation-delay:1.1s]">
<GlassButton>
Get Started
<ArrowUpRight className="size-5 rtl:-scale-x-100" />
</GlassButton>
<Button type="button" variant="ghost">
Watch the Film
<Play className="size-4 fill-current" />
</Button>
</div>
<div data-slot="partners" className="rise mt-auto flex flex-col items-center gap-6 pt-16 pb-8">
<GlassPill>Trusted by the teams behind</GlassPill>
<ul className="flex flex-wrap items-center justify-center gap-x-12 gap-y-4">
{PARTNERS.map((partner) => (
<li
key={partner}
className="[font-family:var(--font-prism-serif)] text-2xl tracking-tight text-foreground italic md:text-3xl"
>
{partner}
</li>
))}
</ul>
</div>
</div>
</section>
);
};
registry/hirael/bases/radix/templates/prism/process.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { ArrowUpRight } from 'lucide-react';
import { GlassButton, GlassPill, Heading, VideoBackdrop } from './primitives';
const PROCESS_VIDEO = 'https://hirael.com/media/templates/prism/process.mp4';
export const Process = () => {
return (
<section
id="process"
data-slot="process"
className="relative flex min-h-[700px] items-center overflow-hidden px-6 py-32 md:px-16 lg:px-24"
>
<VideoBackdrop src={PROCESS_VIDEO} fadeTop />
<div className="rise relative z-10 mx-auto flex min-h-[500px] w-full max-w-3xl flex-col items-center justify-center text-center">
<GlassPill className="mb-4">How It Works</GlassPill>
<Heading>You dream it. We ship it.</Heading>
<p className="mt-6 max-w-xl text-sm leading-relaxed font-light text-foreground/60 md:text-base">
Share your vision. Our AI handles the rest: wireframes, design, code, launch. All in days, not quarters.
</p>
<GlassButton className="mt-8">
Get Started
<ArrowUpRight className="size-5 rtl:-scale-x-100" />
</GlassButton>
</div>
</section>
);
};
registry/hirael/bases/radix/templates/prism/features.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { cn } from '@/lib/utils';
import { GlassButton, SectionIntro, VideoBackdrop } from './primitives';
const FEATURES = [
{
title: 'Designed to convert. Built to perform.',
description:
'Every pixel is intentional. Our AI studies what works across thousands of top sites, then builds yours to outperform them all.',
action: 'Learn more',
videoSrc: 'https://hirael.com/media/templates/prism/stats.mp4',
reverse: false,
},
{
title: 'It gets smarter. Automatically.',
description:
'Your site evolves on its own. AI monitors every click, scroll, and conversion, then optimizes in real time. No manual updates. Ever.',
action: 'See how it works',
videoSrc: 'https://hirael.com/media/templates/prism/cta.mp4',
reverse: true,
},
] as const;
export const Features = () => {
return (
<section id="services" data-slot="features" className="px-6 py-24 md:px-16 lg:px-24">
<div className="mx-auto max-w-6xl">
<SectionIntro kicker="Capabilities" title="Pro features. Zero complexity." />
<div className="mt-16 flex flex-col gap-16 md:mt-20 md:gap-24">
{FEATURES.map((feature) => (
<article
key={feature.title}
className={cn(
'rise flex flex-col items-center gap-10 lg:flex-row lg:gap-16',
feature.reverse && '[animation-delay:150ms] lg:flex-row-reverse',
)}
>
<div className="flex-1">
<h3 className="[font-family:var(--font-prism-serif)] text-3xl leading-[0.95] tracking-tight text-foreground italic md:text-4xl">
{feature.title}
</h3>
<p className="mt-5 max-w-md text-sm leading-relaxed font-light text-foreground/60">
{feature.description}
</p>
<GlassButton className="mt-8">{feature.action}</GlassButton>
</div>
<div className="liquid-glass relative aspect-[4/3] w-full flex-1 overflow-hidden rounded-2xl">
<VideoBackdrop src={feature.videoSrc} fadeBottom={false} />
</div>
</article>
))}
</div>
</div>
</section>
);
};
registry/hirael/bases/radix/templates/prism/benefits.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { ChartColumn, Palette, Shield, Zap } from 'lucide-react';
import { cn } from '@/lib/utils';
import { SectionIntro } from './primitives';
const BENEFITS = [
{
Icon: Zap,
title: 'Days, Not Months',
description: 'Concept to launch at a pace that redefines fast.',
delay: '',
},
{
Icon: Palette,
title: 'Obsessively Crafted',
description: 'Every detail considered. Every element refined.',
delay: '[animation-delay:100ms]',
},
{
Icon: ChartColumn,
title: 'Built to Convert',
description: 'Layouts informed by data. Decisions backed by performance.',
delay: '[animation-delay:200ms]',
},
{
Icon: Shield,
title: 'Secure by Default',
description: 'Enterprise-grade protection comes standard.',
delay: '[animation-delay:300ms]',
},
] as const;
export const Benefits = () => {
return (
<section id="work" data-slot="benefits" className="px-6 py-24 md:px-16 lg:px-24">
<div className="mx-auto max-w-6xl">
<SectionIntro kicker="Why Us" title="The difference is everything." />
<div className="mt-16 grid grid-cols-1 gap-6 md:grid-cols-2 lg:grid-cols-4">
{BENEFITS.map(({ Icon, title, description, delay }) => (
<article key={title} className={cn('rise liquid-glass rounded-2xl p-6', delay)}>
<span className="liquid-glass-strong flex size-10 items-center justify-center rounded-full text-foreground">
<Icon className="size-4" aria-hidden />
</span>
<h3 className="mt-6 [font-family:var(--font-prism-serif)] text-lg text-foreground italic">{title}</h3>
<p className="mt-2 text-sm leading-relaxed font-light text-foreground/60">{description}</p>
</article>
))}
</div>
</div>
</section>
);
};
registry/hirael/bases/radix/templates/prism/stats.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { VideoBackdrop } from './primitives';
const STATS_VIDEO = 'https://hirael.com/media/templates/prism/stats.mp4';
const STATS = [
{ value: '200+', label: 'Sites launched' },
{ value: '98%', label: 'Client satisfaction' },
{ value: '3.2x', label: 'More conversions' },
{ value: '5 days', label: 'Average delivery' },
] as const;
export const Stats = () => {
return (
<section data-slot="stats" className="relative overflow-hidden px-6 py-32 md:px-16 lg:px-24">
<VideoBackdrop src={STATS_VIDEO} fadeTop className="saturate-0" />
<dl className="rise liquid-glass relative z-10 mx-auto grid max-w-6xl grid-cols-2 gap-8 rounded-3xl p-12 text-center md:p-16 lg:grid-cols-4">
{STATS.map((stat) => (
<div key={stat.label} className="flex flex-col gap-2">
<dt className="order-2 text-sm font-light text-foreground/60">{stat.label}</dt>
<dd className="[font-family:var(--font-prism-serif)] text-4xl tracking-tight text-foreground italic tabular-nums md:text-5xl lg:text-6xl">
{stat.value}
</dd>
</div>
))}
</dl>
</section>
);
};
registry/hirael/bases/radix/templates/prism/testimonials.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { cn } from '@/lib/utils';
import { SectionIntro } from './primitives';
const TESTIMONIALS = [
{
quote:
'A complete rebuild in five days. The new site beats the old one on every metric we track, and the brief we wrote was a single paragraph.',
name: 'Sarah Chen',
role: 'CEO, Luminary',
delay: '',
},
{
quote:
'Conversions up 4x in the first month. The site keeps testing and tuning itself, so the numbers kept climbing long after launch.',
name: 'Marcus Webb',
role: 'Head of Growth, Arcline',
delay: '[animation-delay:100ms]',
},
{
quote:
"They didn't just design our site. They understood the brand well enough to make the calls we would have made ourselves, only faster.",
name: 'Elena Voss',
role: 'Brand Director, Helix',
delay: '[animation-delay:200ms]',
},
] as const;
export const Testimonials = () => {
return (
<section id="pricing" data-slot="testimonials" className="px-6 py-24 md:px-16 lg:px-24">
<div className="mx-auto max-w-6xl">
<SectionIntro kicker="What They Say" title="Don't take our word for it." />
<div className="mt-16 grid grid-cols-1 gap-6 md:grid-cols-3">
{TESTIMONIALS.map((testimonial) => (
<figure
key={testimonial.name}
className={cn('rise liquid-glass flex flex-col rounded-2xl p-8', testimonial.delay)}
>
<blockquote className="flex-1 text-sm leading-relaxed font-light text-foreground/80 italic">
“{testimonial.quote}”
</blockquote>
<figcaption className="mt-8">
<p className="text-sm font-medium text-foreground">{testimonial.name}</p>
<p className="mt-1 text-xs font-light text-foreground/50">{testimonial.role}</p>
</figcaption>
</figure>
))}
</div>
</div>
</section>
);
};
registry/hirael/bases/radix/templates/prism/cta.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { Button } from '@/registry/hirael/bases/radix/ui/button';
import { Footer } from './footer';
import { GlassButton, Heading, VideoBackdrop } from './primitives';
const CTA_VIDEO = 'https://hirael.com/media/templates/prism/cta.mp4';
export const Cta = () => {
return (
<section data-slot="cta" className="relative overflow-hidden px-6 pt-32 pb-8 md:px-16 lg:px-24">
<VideoBackdrop src={CTA_VIDEO} fadeTop />
<div className="relative z-10 mx-auto max-w-6xl">
<div className="rise flex flex-col items-center text-center">
<Heading className="max-w-3xl md:text-6xl lg:text-7xl">Your next website starts here.</Heading>
<p className="mt-6 max-w-md text-sm leading-relaxed font-light text-foreground/60 md:text-base">
Book a free strategy call. See what AI-powered design can do.
</p>
<div className="mt-8 flex flex-wrap items-center justify-center gap-4">
<GlassButton>Book a Call</GlassButton>
<Button type="button">View Pricing</Button>
</div>
</div>
<Footer />
</div>
</section>
);
};
registry/hirael/bases/radix/templates/prism/footer.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
const FOOTER_LINKS = ['Privacy', 'Terms', 'Contact'] as const;
export const Footer = () => {
return (
<footer
data-slot="footer"
className="mt-32 flex flex-col items-center justify-between gap-4 border-t border-foreground/10 pt-8 text-xs text-foreground/40 sm:flex-row"
>
<p>© 2026 Prism. All rights reserved.</p>
<nav className="flex items-center gap-6">
{FOOTER_LINKS.map((link) => (
<a key={link} href="#" className="transition-colors hover:text-foreground">
{link}
</a>
))}
</nav>
</footer>
);
};
registry/hirael/bases/radix/templates/prism/primitives.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
'use client';
import * as React from 'react';
import { cn } from '@/lib/utils';
interface WordmarkProps {
className?: string;
}
export const Wordmark = ({ className }: WordmarkProps) => {
return <span className={cn('text-lg font-medium tracking-tight text-foreground', className)}>Prism</span>;
};
interface GlassPillProps {
children: React.ReactNode;
className?: string;
}
export const GlassPill = ({ children, className }: GlassPillProps) => {
return (
<span
className={cn(
'liquid-glass inline-block rounded-full px-3.5 py-1 text-xs font-medium text-foreground',
className,
)}
>
{children}
</span>
);
};
type GlassButtonProps = React.ComponentProps<'button'>;
export const GlassButton = ({ className, ...props }: GlassButtonProps) => {
return (
<button
type="button"
data-slot="glass-button"
className={cn(
'liquid-glass-strong inline-flex shrink-0 items-center justify-center gap-2 rounded-full px-5 py-2.5 text-sm font-medium whitespace-nowrap text-foreground transition-all outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0',
className,
)}
{...props}
/>
);
};
interface HeadingProps {
children: React.ReactNode;
className?: string;
}
export const Heading = ({ children, className }: HeadingProps) => {
return (
<h2
className={cn(
'[font-family:var(--font-prism-serif)] text-4xl leading-[0.9] tracking-tight text-foreground italic md:text-5xl lg:text-6xl',
className,
)}
>
{children}
</h2>
);
};
interface SectionIntroProps {
kicker: string;
title: string;
}
export const SectionIntro = ({ kicker, title }: SectionIntroProps) => {
return (
<div className="rise flex flex-col items-center text-center">
<GlassPill className="mb-4">{kicker}</GlassPill>
<Heading>{title}</Heading>
</div>
);
};
const WORD_DELAY_MS = 100;
interface RiseTextProps {
text: string;
}
export const RiseText = ({ text }: RiseTextProps) => {
return (
<span dir="auto" className="inline-flex flex-wrap justify-center gap-x-[0.25em]">
{text.split(' ').map((word, index) => (
<span key={`${word}-${index}`} className="word-rise" style={{ animationDelay: `${index * WORD_DELAY_MS}ms` }}>
{word}
</span>
))}
</span>
);
};
interface VideoBackdropProps {
src: string;
posterSrc?: string;
fadeTop?: boolean;
fadeBottom?: boolean;
className?: string;
}
export const VideoBackdrop = ({
src,
posterSrc,
fadeTop = false,
fadeBottom = true,
className,
}: VideoBackdropProps) => {
const [hasFailed, setHasFailed] = React.useState(false);
return (
<>
{hasFailed ? (
<div
aria-hidden
className="absolute inset-0 z-0 bg-gradient-to-b from-muted via-background to-background bg-cover bg-center"
style={posterSrc ? { backgroundImage: `url(${posterSrc})` } : undefined}
/>
) : (
<video
className={cn('absolute inset-0 z-0 h-full w-full object-cover', className)}
src={src}
poster={posterSrc}
autoPlay
loop
muted
playsInline
aria-hidden
tabIndex={-1}
onError={() => setHasFailed(true)}
/>
)}
{fadeTop ? (
<div
aria-hidden
className="pointer-events-none absolute inset-x-0 top-0 z-[1] h-[200px] bg-gradient-to-b from-background to-transparent"
/>
) : null}
{fadeBottom ? (
<div
aria-hidden
className="pointer-events-none absolute inset-x-0 bottom-0 z-[1] h-[200px] bg-gradient-to-t from-background to-transparent"
/>
) : null}
</>
);
};
registry/hirael/bases/radix/templates/prism/styles.tsx
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
const PRISM_CSS = `
.prism {
--background: hsl(0 0% 0%);
--foreground: hsl(0 0% 100%);
--card: hsl(0 0% 5%);
--card-foreground: hsl(0 0% 100%);
--popover: hsl(0 0% 5%);
--popover-foreground: hsl(0 0% 100%);
--primary: hsl(0 0% 100%);
--primary-foreground: hsl(0 0% 0%);
--secondary: hsl(0 0% 10%);
--secondary-foreground: hsl(0 0% 100%);
--muted: hsl(0 0% 10%);
--muted-foreground: hsl(0 0% 60%);
--accent: hsl(0 0% 100% / 0.06);
--accent-foreground: hsl(0 0% 100%);
--border: hsl(0 0% 100% / 0.2);
--input: hsl(0 0% 100% / 0.2);
--ring: hsl(0 0% 100%);
--radius: 0.75rem;
}
.prism ::selection {
background: rgba(255, 255, 255, 0.25);
color: #000;
}
.prism .liquid-glass,
.prism .liquid-glass-strong {
background: rgba(255, 255, 255, 0.01);
background-blend-mode: luminosity;
backdrop-filter: blur(4px);
-webkit-backdrop-filter: blur(4px);
border: none;
box-shadow: inset 0 1px 1px rgba(255, 255, 255, 0.1);
position: relative;
overflow: hidden;
}
.prism .liquid-glass-strong {
backdrop-filter: blur(50px);
-webkit-backdrop-filter: blur(50px);
box-shadow:
4px 4px 4px rgba(0, 0, 0, 0.05),
inset 0 1px 1px rgba(255, 255, 255, 0.15);
}
.prism .liquid-glass::before,
.prism .liquid-glass-strong::before {
content: '';
position: absolute;
inset: 0;
border-radius: inherit;
padding: 1.4px;
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.45) 0%,
rgba(255, 255, 255, 0.15) 20%,
rgba(255, 255, 255, 0) 40%,
rgba(255, 255, 255, 0) 60%,
rgba(255, 255, 255, 0.15) 80%,
rgba(255, 255, 255, 0.45) 100%
);
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
}
.prism .liquid-glass-strong::before {
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.5) 0%,
rgba(255, 255, 255, 0.2) 20%,
rgba(255, 255, 255, 0) 40%,
rgba(255, 255, 255, 0) 60%,
rgba(255, 255, 255, 0.2) 80%,
rgba(255, 255, 255, 0.5) 100%
);
}
.prism .rise {
animation-name: prism-rise;
animation-duration: 0.6s;
animation-timing-function: ease-out;
animation-fill-mode: both;
}
/* Headline words and the lead only move: text that starts at opacity 0 or blurred holds back Largest Contentful Paint. */
.prism .rise-still {
animation-name: prism-rise-still;
animation-duration: 0.6s;
animation-timing-function: ease-out;
animation-fill-mode: both;
}
.prism .word-rise {
display: inline-block;
animation-name: prism-word-rise;
animation-duration: 0.7s;
animation-timing-function: ease-out;
animation-fill-mode: both;
}
@keyframes prism-rise {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes prism-rise-still {
from {
transform: translateY(20px);
}
to {
transform: translateY(0);
}
}
@keyframes prism-word-rise {
0% {
transform: translateY(50px);
}
50% {
transform: translateY(-5px);
}
100% {
transform: translateY(0);
}
}
@media (prefers-reduced-motion: reduce) {
.prism .rise,
.prism .rise-still,
.prism .word-rise {
animation: none;
}
}
`;
export const PrismStyles = () => {
return <style dangerouslySetInnerHTML={{ __html: PRISM_CSS }} />;
};
registry/hirael/bases/radix/templates/prism/fonts.ts
// Prism from Hirael <https://hirael.com/templates/prism>
// MIT · Mohammad Shehadeh · https://github.com/MohammadShehadeh/hirael
import { Barlow, Instrument_Serif } from 'next/font/google';
export const barlow = Barlow({
variable: '--font-prism-sans',
subsets: ['latin'],
weight: ['300', '400', '500', '600'],
display: 'swap',
});
export const instrumentSerif = Instrument_Serif({
variable: '--font-prism-serif',
subsets: ['latin'],
weight: '400',
style: ['normal', 'italic'],
display: 'swap',
});