- Added support for conditional rendering of the NekoFollower component in AppShell based on ENABLE_NEKO_FOLLOWER. - Introduced MarkdownImage component in BlogDetailContent for handling images in markdown, supporting both local and external assets. - Improved BlogToc component to use IntersectionObserver for better performance in tracking active headings. - Refactored ContentContent to utilize YoutubeLiteEmbed for embedding YouTube videos, simplifying the video rendering logic. - Created a new YoutubeLiteEmbed component for lazy loading YouTube videos with thumbnail previews. - Updated site-settings to include ENABLE_NEKO_FOLLOWER constant for feature toggling. - Enhanced next.config.ts with image optimization settings for better performance. - Refactored snippets-content to improve code readability and structure. - Cleaned up home-hero and home-videos-section components for better layout and performance.
56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
"use client";
|
|
|
|
import { Icon } from "@iconify/react";
|
|
import Link from "next/link";
|
|
import { usePathname } from "next/navigation";
|
|
import { AnnouncementBar } from "poyraz-ui/organisms";
|
|
import { SiteNavbar } from "@/components/site-navbar";
|
|
import { NekoFollower } from "@/components/neko-follower";
|
|
import { ANNOUNCEMENT_ITEMS, ENABLE_NEKO_FOLLOWER } from "@/data/site-settings";
|
|
|
|
type AppShellProps = {
|
|
children: React.ReactNode;
|
|
};
|
|
|
|
export function AppShell({ children }: AppShellProps) {
|
|
const pathname = usePathname();
|
|
const announcement = ANNOUNCEMENT_ITEMS[0];
|
|
const isStandaloneLinksPage =
|
|
pathname === "/links" || pathname.startsWith("/links/");
|
|
|
|
if (isStandaloneLinksPage) {
|
|
return children;
|
|
}
|
|
|
|
return (
|
|
<>
|
|
{ENABLE_NEKO_FOLLOWER ? <NekoFollower /> : null}
|
|
<div className="mx-auto flex w-full max-w-4xl flex-col px-4 py-4 sm:px-6">
|
|
<SiteNavbar />
|
|
{announcement ? (
|
|
<AnnouncementBar
|
|
variant="branded"
|
|
dismissible={false}
|
|
icon={<Icon icon="mdi:sparkles" width={16} height={16} />}
|
|
action={
|
|
announcement.actionLabel && announcement.actionHref ? (
|
|
<Link
|
|
href={announcement.actionHref}
|
|
target="_blank"
|
|
rel="noreferrer"
|
|
className="text-xs font-bold underline"
|
|
>
|
|
{announcement.actionLabel}
|
|
</Link>
|
|
) : null
|
|
}
|
|
>
|
|
{announcement.text}
|
|
</AnnouncementBar>
|
|
) : null}
|
|
<main className="flex-1 py-4">{children}</main>
|
|
</div>
|
|
</>
|
|
);
|
|
}
|