import { NavLink, Outlet } from "@remix-run/react"; import { type LoaderFunctionArgs } from "@remix-run/server-runtime"; import { Fragment } from "react"; import { redirect, typedjson, useTypedLoaderData } from "remix-typedjson"; import { AppContainer } from "~/components/layout/AppLayout"; import { requireUser } from "~/services/session.server"; import { cn } from "~/utils/cn"; const stories: Story[] = [ { name: "Animated panel", slug: "animated-panel", }, { name: "Avatar", slug: "avatar", }, { name: "Badges", slug: "badges", }, { name: "Buttons", slug: "buttons", }, { name: "Callouts", slug: "callout", }, { name: "Charts", slug: "charts", }, { name: "Checkboxes", slug: "checkboxes", }, { name: "Clipboard field", slug: "clipboard-field", }, { name: "Code block", slug: "code-block", }, { name: "Detail cell", slug: "detail-cell", }, { name: "Dialog", slug: "dialog", }, { name: "Environment label", slug: "environment-label", }, { name: "Free plan usage", slug: "free-plan-usage", }, { name: "Icons", slug: "icons", }, { name: "Info panel", slug: "info-panel", }, { name: "Inline code", slug: "inline-code", }, { name: "Loading bar divider", slug: "loading-bar-divider", }, { name: "Page header", slug: "page-header", }, { name: "Pricing callout", slug: "pricing-callout", }, { name: "Radio group", slug: "radio-group", }, { name: "Resizable", slug: "resizable", }, { name: "Run & Span timeline", slug: "run-and-span-timeline", }, { name: "Segemented control", slug: "segmented-control", }, { name: "Shortcuts", slug: "shortcuts", }, { name: "Spinners", slug: "spinner", }, { name: "Streamdown", slug: "streamdown", }, { name: "Switch", slug: "switch", }, { name: "Tables", slug: "table", }, { name: "Tabs", slug: "tabs", }, { name: "Timeline", slug: "timeline", }, { name: "Toast", slug: "toast", }, { name: "Tooltip", slug: "tooltip", }, { name: "Tree view", slug: "tree-view", }, { name: "TSQL Editor", slug: "tsql-editor", }, { name: "Typography", slug: "typography", }, { name: "Unordered list", slug: "unordered-list", }, { name: "Usage", slug: "usage", }, // Dashboard agent section { sectionTitle: "Dashboard agent", name: "Agent UI", slug: "agent-ui", }, // Forms section { sectionTitle: "Forms", name: "Date fields", slug: "date-fields", }, { name: "Input fields", slug: "input-fields", }, { name: "Search fields", slug: "search-fields", }, { name: "Simple form", slug: "simple-form", }, { name: "Stepper", slug: "stepper", }, { name: "Textarea", slug: "textarea", }, // Menus section { sectionTitle: "Menus", name: "Filter", slug: "filter", }, { name: "Popover", slug: "popover", }, { name: "Select", slug: "select", }, ]; export const loader = async ({ request, params }: LoaderFunctionArgs) => { const user = await requireUser(request); if (!user.admin) { throw redirect("/"); } return typedjson({ stories, }); }; export default function App() { const { stories } = useTypedLoaderData(); return (
); } type Story = { name: string; slug: string; sectionTitle?: string; }; function SideMenu({ stories }: { stories: Story[] }) { return (
{stories.map((story) => { return ( {story.sectionTitle && (
{story.sectionTitle}
)} {({ isActive, isPending }) => (
{story.name}
)}
); })}
); }