Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions app/components/filters/Filters.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { DisclosureGroup } from "react-aria-components";
import * as Stars from "./Stars";

export function Filters() {
import type { ClassProps } from "~/lib/props";

export function Filters(
{ className = "sticky top-0 mx-20 hidden h-screen pt-10 lg:block" }: ClassProps = {},
) {
return (
<DisclosureGroup className="sticky top-0 mx-20 hidden h-screen pt-10 lg:block">
<DisclosureGroup className={className}>
{/* TODO: Search */}
{/* TODO: Tags */}
<Stars.Filter />
Expand Down
26 changes: 26 additions & 0 deletions app/components/filters/MobileFilters.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Button, Disclosure, DisclosurePanel } from "react-aria-components";
import { Bars3Icon, XMarkIcon } from "@heroicons/react/24/solid";
import { Filters } from "./Filters";

export function MobileFilters() {
return (
<Disclosure className="relative lg:hidden">
{({ open }) => (
<>
<Button
aria-label={open ? "Hide filters" : "Show filters"}
className="rounded-md p-1 text-black focus-visible:outline-0 dark:text-white"
slot="trigger"
>
{open
? <XMarkIcon className="h-8 w-8" />
: <Bars3Icon className="h-8 w-8" />}
</Button>
<DisclosurePanel className="absolute left-0 right-0 top-full z-10 border-b-2 border-black bg-[#f9ecdf] p-6 shadow-hard-lg dark:border-white/50 dark:bg-[#17191e]">
<Filters className="pt-0" />
</DisclosurePanel>
</>
)}
</Disclosure>
);
}
12 changes: 9 additions & 3 deletions app/routes/_index/route.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { AnimatePresence, motion } from "motion/react";
import { isRouteErrorResponse, useNavigate } from "react-router";
import { Recommendation } from "~/components/Recommendation";
import { Filters } from "~/components/filters/Filters";
import { MobileFilters } from "~/components/filters/MobileFilters";
import { getCollection } from "~/lib/content";
import { stores } from "~/lib/stores.client";
import { filterRecs, Stars } from "./utilities";
Expand Down Expand Up @@ -68,11 +69,16 @@ export async function clientLoader({ request, serverLoader }: Route.ClientLoader

export default function Component({ loaderData }: Route.ComponentProps) {
return (
<div className="noise-container p-6">
<div className="noise-container">
<div className="noise" />
<div className="noise-underlay" />
<h1 className="font-serif-display text-5xl font-bold sm:text-6xl">Recommendations</h1>
<div className="block sm:grid-cols-[3fr_2fr] lg:grid">
<header className="sticky top-0 z-20 flex items-center justify-between bg-[#f9ecdf] p-6 dark:bg-[#17191e]">
<h1 className="font-serif-display text-5xl font-bold sm:text-6xl">
Recommendations
</h1>
<MobileFilters />
</header>
<div className="block p-6 sm:grid-cols-[3fr_2fr] lg:grid">
<div className="flex flex-col items-start gap-7 py-10">
<AnimatePresence>
{loaderData.filteredRecs.map((rec) => (
Expand Down