From 7167ec998f692158c97e03e8bbe6099407aafcc9 Mon Sep 17 00:00:00 2001 From: zmeyer44 Date: Fri, 13 Oct 2023 19:02:59 -0400 Subject: [PATCH] adding content --- app/(app)/_layout/BottomNav.tsx | 49 +++++ app/(app)/_layout/Header.tsx | 29 +++ app/(app)/_layout/Keystone.tsx | 15 ++ app/(app)/_layout/MobileBanner.tsx | 20 ++ app/(app)/_layout/Sidebar.tsx | 100 ++++++++++ app/(app)/_layout/components/MobileMenu.tsx | 56 ++++++ .../_layout/components/Notifications.tsx | 59 ++++++ app/(app)/_layout/components/Search.tsx | 13 ++ app/(app)/_layout/components/UserMenu.tsx | 58 ++++++ app/(app)/_layout/index.tsx | 28 +++ .../app/_sections/HorizontalCarousel.tsx | 55 ++++++ app/(app)/app/page.tsx | 16 ++ app/(app)/layout.tsx | 13 ++ app/(landing)/_layout/Footer.tsx | 111 +++++++++++ app/(landing)/_layout/Header.tsx | 75 +++++++ app/(landing)/_layout/index.tsx | 14 ++ app/(landing)/layout.tsx | 9 + app/(landing)/page.tsx | 186 ++++++++++++++++++ app/globals.css | 23 ++- app/layout.tsx | 12 +- app/page.tsx | 113 ----------- bun.lockb | Bin 191999 -> 192351 bytes components/CreatorCard/index.tsx | 101 ++++++++++ package.json | 1 + tailwind.config.ts | 7 + 25 files changed, 1044 insertions(+), 119 deletions(-) create mode 100644 app/(app)/_layout/BottomNav.tsx create mode 100644 app/(app)/_layout/Header.tsx create mode 100644 app/(app)/_layout/Keystone.tsx create mode 100644 app/(app)/_layout/MobileBanner.tsx create mode 100644 app/(app)/_layout/Sidebar.tsx create mode 100644 app/(app)/_layout/components/MobileMenu.tsx create mode 100644 app/(app)/_layout/components/Notifications.tsx create mode 100644 app/(app)/_layout/components/Search.tsx create mode 100644 app/(app)/_layout/components/UserMenu.tsx create mode 100644 app/(app)/_layout/index.tsx create mode 100644 app/(app)/app/_sections/HorizontalCarousel.tsx create mode 100644 app/(app)/app/page.tsx create mode 100644 app/(app)/layout.tsx create mode 100644 app/(landing)/_layout/Footer.tsx create mode 100644 app/(landing)/_layout/Header.tsx create mode 100644 app/(landing)/_layout/index.tsx create mode 100644 app/(landing)/layout.tsx create mode 100644 app/(landing)/page.tsx delete mode 100644 app/page.tsx create mode 100644 components/CreatorCard/index.tsx diff --git a/app/(app)/_layout/BottomNav.tsx b/app/(app)/_layout/BottomNav.tsx new file mode 100644 index 0000000..7e894af --- /dev/null +++ b/app/(app)/_layout/BottomNav.tsx @@ -0,0 +1,49 @@ +import Link from "next/link"; +import { + RiHome6Fill, + RiCompass3Fill, + RiQuestionAnswerFill, +} from "react-icons/ri"; +import { cn } from "@/lib/utils"; + +export default function BottomNav() { + const navigationItems = [ + { + href: "", + name: "home", + icon: RiHome6Fill, + current: true, + }, + { + href: "", + name: "explore", + icon: RiCompass3Fill, + current: false, + }, + { + href: "", + name: "messages", + icon: RiQuestionAnswerFill, + current: false, + }, + ]; + return ( + + ); +} diff --git a/app/(app)/_layout/Header.tsx b/app/(app)/_layout/Header.tsx new file mode 100644 index 0000000..52d2885 --- /dev/null +++ b/app/(app)/_layout/Header.tsx @@ -0,0 +1,29 @@ +import { RiMenu3Line, RiLeafFill } from "react-icons/ri"; +import { UserMenu } from "./components/UserMenu"; +import { Search } from "./components/Search"; +import { Notifications } from "./components/Notifications"; +import { MobileMenu } from "./components/MobileMenu"; +export default function Header() { + return ( +
+
+
+
+ +
Flockstr
+
+
+
+ +
+
+ + + +
+
+
+
+
+ ); +} diff --git a/app/(app)/_layout/Keystone.tsx b/app/(app)/_layout/Keystone.tsx new file mode 100644 index 0000000..9fa1684 --- /dev/null +++ b/app/(app)/_layout/Keystone.tsx @@ -0,0 +1,15 @@ +import Link from "next/link"; +import { RiLeafFill } from "react-icons/ri"; + +export default function Keystone() { + return ( +
+ + + +
+ ); +} diff --git a/app/(app)/_layout/MobileBanner.tsx b/app/(app)/_layout/MobileBanner.tsx new file mode 100644 index 0000000..b3c1933 --- /dev/null +++ b/app/(app)/_layout/MobileBanner.tsx @@ -0,0 +1,20 @@ +import { RiCloseFill, RiLeafFill } from "react-icons/ri"; +import { Button } from "@/components/ui/button"; +export default function MobileBanner() { + return ( +
+
+ +
+
+ Get our PWA +
+ + +
+ ); +} diff --git a/app/(app)/_layout/Sidebar.tsx b/app/(app)/_layout/Sidebar.tsx new file mode 100644 index 0000000..bb2ae0b --- /dev/null +++ b/app/(app)/_layout/Sidebar.tsx @@ -0,0 +1,100 @@ +import Link from "next/link"; +import { + RiHome6Fill, + RiCompassLine, + RiCompass3Fill, + RiQuestionAnswerLine, + RiAddFill, + RiSettings4Fill, + RiSettings4Line, +} from "react-icons/ri"; +import { HiOutlineLightningBolt } from "react-icons/hi"; +import { cn } from "@/lib/utils"; +import { Button } from "@/components/ui/button"; + +export default function Sidebar() { + const navigation = [ + { + href: "", + name: "home", + label: "Home", + icon: RiHome6Fill, + current: true, + }, + { + href: "", + name: "explore", + label: "Explore", + icon: RiCompassLine, + current: false, + }, + { + href: "", + name: "messages", + label: "Messages", + icon: RiQuestionAnswerLine, + current: false, + }, + { + href: "", + name: "zap", + label: "Zap Flockstr", + icon: HiOutlineLightningBolt, + current: false, + }, + ]; + return ( + + ); +} diff --git a/app/(app)/_layout/components/MobileMenu.tsx b/app/(app)/_layout/components/MobileMenu.tsx new file mode 100644 index 0000000..3663d84 --- /dev/null +++ b/app/(app)/_layout/components/MobileMenu.tsx @@ -0,0 +1,56 @@ +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { RiMenu3Line } from "react-icons/ri"; + +export function MobileMenu() { + return ( + + + + + + +
+

shadcn

+

+ m@example.com +

+
+
+ + + + Profile + ⇧⌘P + + + Billing + ⌘B + + + Settings + ⌘S + + New Team + + + + Log out + ⇧⌘Q + +
+
+ ); +} diff --git a/app/(app)/_layout/components/Notifications.tsx b/app/(app)/_layout/components/Notifications.tsx new file mode 100644 index 0000000..881b068 --- /dev/null +++ b/app/(app)/_layout/components/Notifications.tsx @@ -0,0 +1,59 @@ +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { RiNotification4Line } from "react-icons/ri"; + +export function Notifications() { + return ( + + + + + + +
+

shadcn

+

+ m@example.com +

+
+
+ + + + Profile + ⇧⌘P + + + Billing + ⌘B + + + Settings + ⌘S + + New Team + + + + Log out + ⇧⌘Q + +
+
+ ); +} diff --git a/app/(app)/_layout/components/Search.tsx b/app/(app)/_layout/components/Search.tsx new file mode 100644 index 0000000..87b8c20 --- /dev/null +++ b/app/(app)/_layout/components/Search.tsx @@ -0,0 +1,13 @@ +import { Input } from "@/components/ui/input"; + +export function Search() { + return ( +
+ +
+ ); +} diff --git a/app/(app)/_layout/components/UserMenu.tsx b/app/(app)/_layout/components/UserMenu.tsx new file mode 100644 index 0000000..7a868de --- /dev/null +++ b/app/(app)/_layout/components/UserMenu.tsx @@ -0,0 +1,58 @@ +import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuGroup, + DropdownMenuItem, + DropdownMenuLabel, + DropdownMenuSeparator, + DropdownMenuShortcut, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; + +export function UserMenu() { + return ( + + + + + + +
+

shadcn

+

+ m@example.com +

+
+
+ + + + Profile + ⇧⌘P + + + Billing + ⌘B + + + Settings + ⌘S + + New Team + + + + Log out + ⇧⌘Q + +
+
+ ); +} diff --git a/app/(app)/_layout/index.tsx b/app/(app)/_layout/index.tsx new file mode 100644 index 0000000..febc9b4 --- /dev/null +++ b/app/(app)/_layout/index.tsx @@ -0,0 +1,28 @@ +import BottomNav from "./BottomNav"; +import Header from "./Header"; +import Keystone from "./Keystone"; +import MobileBanner from "./MobileBanner"; +import Sidebar from "./Sidebar"; + +export default function AppLayout({ children }: { children: React.ReactNode }) { + return ( +
+ {/* Keystone */} + + + {/* Header */} +
+ + {/* Sidebar */} + +
+
{children}
+
+ {/* Mobile Banner */} + + + {/* BottomNav */} + +
+ ); +} diff --git a/app/(app)/app/_sections/HorizontalCarousel.tsx b/app/(app)/app/_sections/HorizontalCarousel.tsx new file mode 100644 index 0000000..071fde5 --- /dev/null +++ b/app/(app)/app/_sections/HorizontalCarousel.tsx @@ -0,0 +1,55 @@ +"use client"; +import CreatorCard from "@/components/CreatorCard"; +export default function HorizontalCarousel() { + const cards = [ + { + banner: + "https://spotlight.tailwindui.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fimage-3.454151b1.jpg&w=640&q=75", + picture: + "https://images.unsplash.com/photo-1520813792240-56fc4a3765a7?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=4&w=256&h=256&q=60", + displayName: "Mark Cooper", + about: "My page is a demo about what i enjoy", + }, + { + banner: + "https://spotlight.tailwindui.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fimage-4.5c6d0ed6.jpg&w=640&q=75", + picture: + "https://images.unsplash.com/photo-1566492031773-4f4e44671857?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=4&w=256&h=256&q=60", + displayName: "Jenny Olsen", + about: "More demo stuff to fill the space", + }, + { + banner: + "https://spotlight.tailwindui.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fimage-2.3c6c01cf.jpg&w=640&q=75", + picture: + "https://images.unsplash.com/photo-1570295999919-56ceb5ecca61?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=4&w=256&h=256&q=60", + displayName: "Kristen Watson", + about: "random text that looks fairly nice", + }, + { + banner: + "https://spotlight.tailwindui.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fimage-1.c5d2141c.jpg&w=640&q=75", + picture: + "https://spotlight.tailwindui.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Favatar.51a13c67.jpg&w=128&q=75", + displayName: "Cody Fisher", + about: "So things aren't clearly manual", + }, + { + banner: + "https://spotlight.tailwindui.com/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fimage-5.6c6f2784.jpg&w=640&q=75", + picture: + "https://images.unsplash.com/photo-1532417344469-368f9ae6d187?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=facearea&facepad=4&w=256&h=256&q=60", + displayName: "Ester Howard", + about: "here again is more ", + }, + ]; + return ( +
+ {cards.map((creator) => ( +
+ +
+ ))} +
+ ); +} diff --git a/app/(app)/app/page.tsx b/app/(app)/app/page.tsx new file mode 100644 index 0000000..6102963 --- /dev/null +++ b/app/(app)/app/page.tsx @@ -0,0 +1,16 @@ +import HorizontalCarousel from "./_sections/HorizontalCarousel"; + +export default function Page() { + return ( +
+
+
+

+ Explore Creators +

+
+ +
+
+ ); +} diff --git a/app/(app)/layout.tsx b/app/(app)/layout.tsx new file mode 100644 index 0000000..0cdd3b9 --- /dev/null +++ b/app/(app)/layout.tsx @@ -0,0 +1,13 @@ +import AppLayout from './_layout' + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + {children} + + ); +} diff --git a/app/(landing)/_layout/Footer.tsx b/app/(landing)/_layout/Footer.tsx new file mode 100644 index 0000000..cbf1820 --- /dev/null +++ b/app/(landing)/_layout/Footer.tsx @@ -0,0 +1,111 @@ +import Link from "next/link"; + +export default function Footer() { + const navigation = { + main: [ + { name: "Home", href: "/" }, + { name: "Explore", href: "#" }, + { name: "About", href: "#" }, + { name: "Contact", href: "#" }, + ], + social: [ + { + name: "Facebook", + href: "#", + icon: (props: any) => ( + + + + ), + }, + { + name: "Instagram", + href: "#", + icon: (props: any) => ( + + + + ), + }, + { + name: "Twitter", + href: "#", + icon: (props: any) => ( + + + + ), + }, + { + name: "GitHub", + href: "#", + icon: (props: any) => ( + + + + ), + }, + { + name: "YouTube", + href: "#", + icon: (props: any) => ( + + + + ), + }, + ], + }; + return ( + + ); +} diff --git a/app/(landing)/_layout/Header.tsx b/app/(landing)/_layout/Header.tsx new file mode 100644 index 0000000..a6b1406 --- /dev/null +++ b/app/(landing)/_layout/Header.tsx @@ -0,0 +1,75 @@ +"use client"; +import { useState } from "react"; +import Link from "next/link"; +import { cn } from "@/lib/utils"; +import { RiMenu3Line, RiLeafFill, RiCloseFill } from "react-icons/ri"; + +export default function Header() { + const [menuOpen, setMenuOpen] = useState(false); + const navigation = [ + { name: "home", label: "Home", href: "/" }, + { name: "explore", label: "Explore", href: "/" }, + { name: "about", label: "About", href: "/" }, + { name: "contact", label: "Contact", href: "/" }, + ]; + return ( +
+
+
    + {navigation.slice(0, 2).map((item) => ( +
  • + +
    {item.label}
    + +
  • + ))} + + + + {navigation.slice(2, 4).map((item) => ( +
  • + +
    {item.label}
    + +
  • + ))} +
+
+
+
+ +
+
+ +
+
+ +
+ ); +} diff --git a/app/(landing)/_layout/index.tsx b/app/(landing)/_layout/index.tsx new file mode 100644 index 0000000..a689f85 --- /dev/null +++ b/app/(landing)/_layout/index.tsx @@ -0,0 +1,14 @@ +import Header from "./Header"; +import Footer from "./Footer"; + +export default function AppLayout({ children }: { children: React.ReactNode }) { + return ( +
+
+
+
{children}
+
+
+
+ ); +} diff --git a/app/(landing)/layout.tsx b/app/(landing)/layout.tsx new file mode 100644 index 0000000..8a3eaee --- /dev/null +++ b/app/(landing)/layout.tsx @@ -0,0 +1,9 @@ +import LandingLayout from "./_layout"; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return {children}; +} diff --git a/app/(landing)/page.tsx b/app/(landing)/page.tsx new file mode 100644 index 0000000..ff13dc1 --- /dev/null +++ b/app/(landing)/page.tsx @@ -0,0 +1,186 @@ +import { Button } from "@/components/ui/button"; +import Image from "next/image"; +import Link from "next/link"; + +export default function LandingPage() { + return ( +
+
+
+
+

+ Your Community, Where ever you are. +

+

+ Nostr allows you to truly own your community with a fully + decentralized social graph. Never get locked into a platform + again. +

+
+ +
+
+
+
+
+
+ + About nostr + +
+

+ Nostr is a simple, open protocol for decentralizing how + infomration is stored and retreived on the web. +

+

+ Rather that your user data being siloed by the big tech + companies whose platforms dominate our culture, nostr + distributes data across hundreds of relays that anyone can + spin up. +

+

+ This means that no single entity is ever in control of your + data. In other words: + + No more lock-in, Way more choices. + +

+
+
+ +
+
+
+
+
+ + Why Bitcoin? + +
+

+ Nostr is a simple, open protocol for decentralizing how + infomration is stored and retreived on the web. +

+

+ Rather that your user data being siloed by the big tech + companies whose platforms dominate our culture, nostr + distributes data across hundreds of relays that anyone can + spin up. +

+

+ This means that no single entity is ever in control of your + data. In other words: + + No more lock-in, Way more choices. + +

+
+
+ +
+
+
+
+
+
+

+ Find out if you're the right fit. +

+

+ Nostr allows you to truly own your community with a fully + decentralized social graph. Never get locked into a platform + again. +

+
+ +
+
+
+
+
+
+
+
+
+
+

+ It's about time +
+ Let's take a look. +

+
+ + Explore Now + + +
+
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+ +
+ +
+ +
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/app/globals.css b/app/globals.css index b5c2a0d..5d81997 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,7 +1,6 @@ @tailwind base; @tailwind components; @tailwind utilities; - @layer base { :root { @@ -25,8 +24,12 @@ --input: 20 5.9% 90%; --ring: 24.6 95% 53.1%; --radius: 0.75rem; + --sidebar-open-width: 300px; + --sidebar-closed-width: 80px; + --header-height: 72px; + --bottom-nav-height: 56px; } - + .dark { --background: 20 14.3% 4.1%; --foreground: 60 9.1% 97.8%; @@ -47,10 +50,13 @@ --border: 12 6.5% 15.1%; --input: 12 6.5% 15.1%; --ring: 20.5 90.2% 48.2%; + --sidebar-open-width: 300px; + --sidebar-closed-width: 80px; + --header-height: 72px; + --bottom-nav-height: 56px; } } - @layer base { * { @apply border-border; @@ -58,9 +64,18 @@ body { @apply bg-background text-foreground; } + .layout-grid-small-sidebar { + grid: var(--header-height) 1fr / var(--sidebar-closed-width) 1fr; + } + .layout-grid-large-sidebar { + grid: var(--header-height) 1fr / var(--sidebar-open-width) 1fr; + } + .app-layout { + @apply sm:layout-grid-small-sidebar xl:layout-grid-large-sidebar flex flex-col sm:grid; + } } @layer components { .center { @apply flex items-center justify-center; } -} \ No newline at end of file +} diff --git a/app/layout.tsx b/app/layout.tsx index 1ec0f7d..161c613 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,10 +1,14 @@ import "./globals.css"; import type { Metadata } from "next"; -import { Inter } from "next/font/google"; +import { Inter, Inter_Tight } from "next/font/google"; import { cn } from "@/lib/utils"; import { Providers } from "./_providers"; const inter = Inter({ subsets: ["latin"] }); +const interTight = Inter_Tight({ + subsets: ["latin"], + variable: "--font-inter-tight", +}); const title = "Flockstr"; const description = "Own your flock"; const image = @@ -55,7 +59,11 @@ export default function RootLayout({ return ( {children} diff --git a/app/page.tsx b/app/page.tsx deleted file mode 100644 index 941ad8c..0000000 --- a/app/page.tsx +++ /dev/null @@ -1,113 +0,0 @@ -import Image from 'next/image' - -export default function LandingPage() { - return ( -
-
-

- Get started by editing  - app/page.tsx -

-
- - By{' '} - Vercel Logo - -
-
- -
- Next.js Logo -
- -
- -

- Docs{' '} - - -> - -

-

- Find in-depth information about Next.js features and API. -

-
- - -

- Learn{' '} - - -> - -

-

- Learn about Next.js in an interactive course with quizzes! -

-
- - -

- Templates{' '} - - -> - -

-

- Explore the Next.js 13 playground. -

-
- - -

- Deploy{' '} - - -> - -

-

- Instantly deploy your Next.js site to a shareable URL with Vercel. -

-
-
-
- ) -} diff --git a/bun.lockb b/bun.lockb index da6ec593e2cfdbc425870dc562eaa4b251244e08..ee161050e2a7fb2eb983d34e36be284a2d3f0299 100755 GIT binary patch delta 21411 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 DTQ5ms delta 21477 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 diff --git a/components/CreatorCard/index.tsx b/components/CreatorCard/index.tsx new file mode 100644 index 0000000..281103c --- /dev/null +++ b/components/CreatorCard/index.tsx @@ -0,0 +1,101 @@ +import Image from "next/image"; +import Link from "next/link"; +import { RiArrowRightLine } from "react-icons/ri"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; + +type CreatorCardProps = { + displayName: string; + about: string; + picture: string; + banner: string; +}; + +export default function CreatorCard({ + banner, + displayName, + picture, + about, +}: CreatorCardProps) { + const recentEvents = [ + { + id: "test", + title: "How to start building a following on nostr.", + summary: + "Starting on a new protocol could be intinidating, But there is no reason to fret. I've got it all under control.", + }, + { + id: "asg", + title: "Jumping through relays", + summary: "Getting used to different relays and how to find them", + }, + { + id: "ant", + title: "Nostrasia is coming", + summary: "Time to start preping for Nostraisa.", + }, + ]; + return ( + + background +
+
+ + {displayName} + + {about} + + + user + + + Recent work: + + +
    + {recentEvents.map((item) => ( +
  • + +
    +

    + {item.title} +

    +

    + {item.summary} +

    +
    +
    + +
    + +
  • + ))} +
+
+
+
+
+
+ ); +} diff --git a/package.json b/package.json index 10c79a8..511fe7e 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "eslint": "^8", "eslint-config-next": "13.5.4", "postcss": "^8", + "prettier": "^3.0.3", "prettier-plugin-tailwindcss": "^0.5.6", "tailwindcss": "^3", "typescript": "^5", diff --git a/tailwind.config.ts b/tailwind.config.ts index 5f7d8fc..3d9b16b 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -52,6 +52,13 @@ module.exports = { foreground: "hsl(var(--card-foreground))", }, }, + fontFamily: { + condensed: ["var(--font-inter-tight)"], + }, + width: { + "sidebar-open": "var(--sidebar-open-width)", + "sidebar-closed": "var(--sidebar-closed-width)", + }, borderRadius: { lg: "var(--radius)", md: "calc(var(--radius) - 2px)",