Initial commit: Interactives site

Astro-based site with 40+ interactive math games, puzzles, and explorations.
Includes admin dashboard, todo system, blog, theme/subcategory navigation,
and embed pages for iframe embedding.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Neeldhara Misra 2026-04-17 03:09:40 +05:30
commit c5926b4213
265 changed files with 51899 additions and 0 deletions

View file

@ -0,0 +1,96 @@
'use client';
import * as React from 'react';
import { cn } from '@/lib/utils';
type HatchSectionHeaderProps = {
title: React.ReactNode;
description?: React.ReactNode;
showLogo?: boolean;
logoSrc?: string;
logoAlt?: string;
logoWidth?: number;
logoHeight?: number;
logoClassName?: string;
className?: string;
innerClassName?: string;
titleClassName?: string;
descriptionClassName?: string;
aside?: React.ReactNode;
};
export function HatchSectionHeader({
title,
description,
showLogo = false,
logoSrc = '/images/layout/logo.svg',
logoAlt = 'Hatch',
logoWidth = 28,
logoHeight = 28,
logoClassName,
className,
innerClassName,
titleClassName,
descriptionClassName,
aside,
}: HatchSectionHeaderProps) {
return (
<div className={cn('w-full', className)}>
{showLogo ? (
<div className="mb-4">
<img
src={logoSrc}
alt={logoAlt}
width={logoWidth}
height={logoHeight}
className={cn(
'brightness-[0.72] contrast-[1.08] dark:brightness-[0.88]',
logoClassName,
)}
/>
</div>
) : null}
<div
className={cn('flex items-start justify-between gap-8', innerClassName)}
>
<h2
className={cn(
'font-display text-foreground text-2xl sm:text-[28px]',
titleClassName,
)}
>
{title}
</h2>
{aside ? (
<div className="hidden sm:block">{aside}</div>
) : description ? (
<p
className={cn(
'text-muted-foreground hidden min-w-0 flex-1 text-base sm:block sm:text-end',
descriptionClassName,
)}
>
{description}
</p>
) : null}
</div>
{description ? (
<p
className={cn(
'text-muted-foreground mt-3 text-base sm:hidden',
descriptionClassName,
)}
>
{description}
</p>
) : null}
</div>
);
}