Skip to content

Commit

Permalink
Update settings pages/navs and add animations
Browse files Browse the repository at this point in the history
  • Loading branch information
TWilson023 committed Oct 8, 2024
1 parent 833749e commit 8d28d78
Show file tree
Hide file tree
Showing 16 changed files with 316 additions and 330 deletions.
2 changes: 1 addition & 1 deletion apps/web/app/app.dub.co/(dashboard)/[slug]/page-client.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ function WorkspaceLinks() {
<AddEditTagModal />
<div className="flex w-full items-center pt-3">
<MaxWidthWrapper className="flex flex-col gap-y-3">
<div className="flex flex-wrap items-center justify-between gap-2 md:flex-nowrap">
<div className="flex flex-wrap items-center justify-between gap-2 lg:flex-nowrap">
<div className="flex w-full grow gap-2 md:w-auto">
<div className="grow basis-0 md:grow-0">
<LinkDisplay />
Expand Down
121 changes: 0 additions & 121 deletions apps/web/app/app.dub.co/(dashboard)/[slug]/settings/layout-client.tsx

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import { ReactNode } from "react";
import WorkspaceSettingsLayoutClient from "./layout-client";
import SettingsLayout from "../../../../../ui/layout/settings-layout";

export default function WorkspaceSettingsLayout({
children,
}: {
children: ReactNode;
}) {
return (
<WorkspaceSettingsLayoutClient>{children}</WorkspaceSettingsLayoutClient>
);
return <SettingsLayout>{children}</SettingsLayout>;
}
30 changes: 1 addition & 29 deletions apps/web/app/app.dub.co/(dashboard)/account/settings/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,38 +1,10 @@
import SettingsLayout from "@/ui/layout/settings-layout";
import { Gear2, Key, ShieldCheck } from "@dub/ui";
import { ReactNode } from "react";

export default function PersonalSettingsLayout({
children,
}: {
children: ReactNode;
}) {
const tabs = [
{
group: "",
tabs: [
{
name: "General",
icon: Gear2,
segment: null,
},
{
name: "Security",
icon: ShieldCheck,
segment: "security",
},
{
name: "API Keys",
icon: Key,
segment: "tokens",
},
],
},
];

return (
<SettingsLayout tabs={tabs} tabContainerClassName="top-[105px]">
{children}
</SettingsLayout>
);
return <SettingsLayout>{children}</SettingsLayout>;
}
2 changes: 1 addition & 1 deletion apps/web/app/app.dub.co/(dashboard)/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const metadata = constructMetadata();
export default async function Layout({ children }: { children: ReactNode }) {
return (
<Providers>
<div className="min-h-screen w-full bg-gray-50/80">
<div className="min-h-screen w-full bg-white">
<MainNav toolContent={<HelpButtonRSC />}>{children}</MainNav>
</div>
{/* <UserSurveyPopup /> */}
Expand Down
10 changes: 5 additions & 5 deletions apps/web/ui/layout/main-nav.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ export function MainNav({
useKeyboardShortcut("n", () => setIsOpen((o) => !o));

return (
<div className="min-h-screen sm:grid sm:grid-cols-[240px_minmax(0,1fr)]">
<div className="min-h-screen md:grid md:grid-cols-[240px_minmax(0,1fr)]">
{/* Side nav backdrop */}
<div
className={cn(
"scrollbar-hide fixed left-0 top-0 z-50 h-screen w-full overflow-y-auto transition-[background-color,backdrop-filter] sm:sticky sm:z-auto sm:bg-transparent",
"scrollbar-hide fixed left-0 top-0 z-50 h-screen w-full overflow-y-auto transition-[background-color,backdrop-filter] md:sticky md:z-auto md:bg-transparent",
isOpen
? "bg-black/20 backdrop-blur-sm"
: "bg-transparent max-sm:pointer-events-none",
: "bg-transparent max-md:pointer-events-none",
)}
onClick={(e) => {
if (e.target === e.currentTarget) {
Expand All @@ -68,7 +68,7 @@ export function MainNav({
{/* Side nav */}
<nav
className={cn(
"relative h-full w-[240px] max-w-full bg-neutral-100 transition-transform sm:translate-x-0",
"relative h-full w-[240px] max-w-full bg-neutral-100 transition-transform md:translate-x-0",
!isOpen && "-translate-x-full",
)}
>
Expand All @@ -84,7 +84,7 @@ export function MainNav({
</nav>
</div>
<div className="bg-neutral-100">
<div className="relative min-h-full bg-neutral-100 pt-px sm:rounded-tl-[16px] sm:bg-white">
<div className="relative min-h-full bg-neutral-100 pt-px md:rounded-tl-[16px] md:bg-white">
<SideNavContext.Provider value={{ isOpen, setIsOpen }}>
{children}
</SideNavContext.Provider>
Expand Down
10 changes: 5 additions & 5 deletions apps/web/ui/layout/page-content/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,22 @@ export function PageContent({
children,
}: PropsWithChildren<{ title: ReactNode }>) {
return (
<div className="bg-neutral-100 sm:bg-white">
<MaxWidthWrapper className="mt-3 sm:mt-6 sm:py-3">
<div className="bg-neutral-100 md:bg-white">
<MaxWidthWrapper className="mt-3 md:mt-6 md:py-3">
<div className="flex items-center justify-between gap-4">
<div className="flex items-center gap-4">
<NavButton />
<h1 className="text-xl font-semibold leading-7 text-neutral-900 sm:text-2xl">
<h1 className="text-xl font-semibold leading-7 text-neutral-900 md:text-2xl">
{title}
</h1>
</div>
<div className="flex items-center gap-4 sm:hidden">
<div className="flex items-center gap-4 md:hidden">
<HelpButtonRSC />
<UserDropdown />
</div>
</div>
</MaxWidthWrapper>
<div className="bg-white pt-2.5 max-sm:mt-3 max-sm:rounded-t-[16px]">
<div className="bg-white pt-2.5 max-md:mt-3 max-md:rounded-t-[16px]">
{children}
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/ui/layout/page-content/nav-button.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export function NavButton() {
variant="outline"
onClick={() => setIsOpen((o) => !o)}
icon={<LayoutSidebar className="size-4" />}
className="h-auto w-fit p-1 sm:hidden"
className="h-auto w-fit p-1 md:hidden"
/>
);
}
74 changes: 11 additions & 63 deletions apps/web/ui/layout/settings-layout.tsx
Original file line number Diff line number Diff line change
@@ -1,67 +1,15 @@
import { Icon, MaxWidthWrapper } from "@dub/ui";
import { cn } from "@dub/utils";
import { ReactNode } from "react";
import NavLink from "./settings-nav-link";
import { SettingsNavMobile } from "./settings-nav-mobile";
import { MaxWidthWrapper } from "@dub/ui";
import { PropsWithChildren } from "react";
import { PageContent } from "./page-content";

interface Tab {
name: string;
icon: Icon;
segment: string | null;
}

export interface SettingsLayoutProps {
tabs: {
group: string;
tabs: Tab[];
}[];
tabContainerClassName?: string;
children: ReactNode;
}

export default function SettingsLayout({
tabs,
tabContainerClassName,
children,
}: SettingsLayoutProps) {
export default function SettingsLayout({ children }: PropsWithChildren) {
return (
<div className="relative min-h-[calc(100vh-16px)] bg-white">
<MaxWidthWrapper className="grid items-start gap-8 py-10 lg:grid-cols-5">
<div className="lg:hidden">
<SettingsNavMobile tabs={tabs}>
<Tabs tabs={tabs} />
</SettingsNavMobile>
</div>
<div
className={cn(
"hidden flex-wrap gap-4 lg:sticky lg:flex lg:grid",
tabContainerClassName,
)}
>
<Tabs tabs={tabs} />
</div>
<div className="grid gap-5 lg:col-span-4">{children}</div>
</MaxWidthWrapper>
</div>
);
}

function Tabs({ tabs }: Pick<SettingsLayoutProps, "tabs">) {
return (
<>
{tabs.map(({ group, tabs }) => (
<div key={group} className="flex flex-col gap-y-0.5">
{group && (
<span className="pb-1.5 text-sm text-gray-500">{group}</span>
)}

{tabs.map(({ name, icon, segment }) => (
<NavLink key={name} segment={segment} icon={icon}>
{name}
</NavLink>
))}
</div>
))}
</>
<PageContent title="">
<div className="relative min-h-[calc(100vh-16px)]">
<MaxWidthWrapper className="pb-10 pt-3">
<div className="grid gap-5">{children}</div>
</MaxWidthWrapper>
</div>
</PageContent>
);
}
52 changes: 0 additions & 52 deletions apps/web/ui/layout/settings-nav-link.tsx

This file was deleted.

Loading

0 comments on commit 8d28d78

Please sign in to comment.