import type { ReactNode } from "react";
import Link from "next/link";
import { cn } from "@/utils/ui";
import { ReactMarkdownWrapper } from "@/components/ui/react-markdown-wrapper";
import {
getSectionTitle,
groupAndOrderChanges,
isSectionCollapsible,
type Change,
type Release,
} from "../utils";
import { ArrowRightIcon } from "@hugeicons/core-free-icons";
import { HugeiconsIcon } from "@hugeicons/react";
export function ReleaseArticle({
variant,
isLatest,
children,
}: {
variant: "list" | "detail";
isLatest?: boolean;
children: ReactNode;
}) {
if (variant === "list") {
return (
{children}
);
}
return {children};
}
export function ReleaseMeta({ release }: { release: Release }) {
return (
{release.version} — {release.date}
);
}
const titleSizes: Record<"h1" | "h2", string> = {
h1: "text-4xl",
h2: "text-2xl",
};
export function ReleaseTitle({
as: As,
href,
children,
}: {
as: "h1" | "h2";
href?: string;
children: ReactNode;
}) {
return (
{href ? (
{children}
) : (
children
)}
);
}
export function ReleaseDescription({ children }: { children: ReactNode }) {
return (
{children}
);
}
export function ReleaseChanges({ release }: { release: Release }) {
const { grouped, orderedTypes } = groupAndOrderChanges({
changes: release.changes,
});
return (
{orderedTypes.map((type) => (
))}
);
}
function ReleaseChangeSection({
type,
changes,
}: {
type: string;
changes: Change[];
}) {
const title = getSectionTitle({ type });
if (isSectionCollapsible({ type })) {
return (
{title}:
);
}
return (
{title}:
);
}
function ReleaseChangeList({
changes,
className,
}: {
changes: Change[];
className?: string;
}) {
return (
{changes.map((change) => (
-
{change.text}
))}
);
}