هدرِ فروشگاه
پیشنمایش تمامصفحهبخشِ هدرِ فروشگاه: نوارِ اعلانِ بستنی، برند، جستوجوی پهن، حساب و سبد با شمار، و ردیفِ دستهها با اسکرولِ افقی در موبایل.
۱. نصب کامپوننتها
این بلاک از ۶ آیتم دیگ استفاده میکند: badgebuttoncontrol-sizeiconspersiansearch-field
پکیجمنیجر پیشفرض Node.jsنصب سریع با لینک سخت و دیسک مشترکYarn نسخهٔ ۲ به بالا (Berry)رانتایم و پکیجمنیجر Bun
npx digdesign@latest add https://docs.digdesign.ir/r/badge.json https://docs.digdesign.ir/r/button.json https://docs.digdesign.ir/r/control-size.json https://docs.digdesign.ir/r/icons.json https://docs.digdesign.ir/r/persian.json https://docs.digdesign.ir/r/search-field.jsonpnpm dlx digdesign@latest add https://docs.digdesign.ir/r/badge.json https://docs.digdesign.ir/r/button.json https://docs.digdesign.ir/r/control-size.json https://docs.digdesign.ir/r/icons.json https://docs.digdesign.ir/r/persian.json https://docs.digdesign.ir/r/search-field.jsonyarn dlx digdesign@latest add https://docs.digdesign.ir/r/badge.json https://docs.digdesign.ir/r/button.json https://docs.digdesign.ir/r/control-size.json https://docs.digdesign.ir/r/icons.json https://docs.digdesign.ir/r/persian.json https://docs.digdesign.ir/r/search-field.jsonbunx --bun digdesign@latest add https://docs.digdesign.ir/r/badge.json https://docs.digdesign.ir/r/button.json https://docs.digdesign.ir/r/control-size.json https://docs.digdesign.ir/r/icons.json https://docs.digdesign.ir/r/persian.json https://docs.digdesign.ir/r/search-field.json۲. کد صفحه
کد را در app/<route>/page.tsx بگذارید و متنها، داده و هندلرها را با محصول خودتان عوض کنید.
navbar-announcement.tsx
"use client"
import * as React from "react"
import { MenuIcon, ShoppingCartIcon, UserIcon, XIcon } from "@/components/icons"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { ControlSizeProvider } from "@/components/ui/control-size"
import { SearchField } from "@/components/ui/search-field"
import { toFaDigits } from "@/lib/persian"
const CATEGORIES = ["گلدان و سفال", "نوشتافزار", "میزِ کار", "دکورِ خانه", "تخفیفها"]
/**
* هدرِ فروشگاه: نوارِ اعلانِ بالا (بستنی)، ردیفِ برند و جستوجوی پهن با حساب و سبد،
* و ردیفِ دستهها زیرش؛ در موبایل جستوجو به ردیفِ خودش میرود و دستهها افقی اسکرول میشوند.
*/
export default function NavbarAnnouncementBlock() {
const [notice, setNotice] = React.useState(true)
return (
<ControlSizeProvider size="xl" asChild>
<header className="border-b border-border bg-background">
{notice && (
<div className="relative flex items-center justify-center gap-3 bg-inverse px-10 py-2.5 text-center text-sm text-[var(--dig-white)]">
<span>ارسالِ رایگان برای خریدِ بالای ۳ میلیون تومان</span>
<Button variant="ghost" size="icon" aria-label="بستنِ اعلان" onClick={() => setNotice(false)} className="absolute end-2 text-[var(--dig-white)] hover:bg-inverse-raised">
<XIcon />
</Button>
</div>
)}
<div className="mx-auto flex w-full max-w-6xl flex-wrap items-center gap-4 px-4 py-4 sm:px-6">
<Button variant="ghost" size="icon" aria-label="باز کردنِ منو" className="md:hidden">
<MenuIcon />
</Button>
<a href="#" className="flex items-center gap-2 text-lg font-black">
<span aria-hidden className="size-3 rounded-sm bg-[var(--dig-orange-500)]" />
خانهٔ سفال
</a>
<SearchField aria-label="جستوجو در فروشگاه" placeholder="جستوجوی کالا، دسته یا برند" className="order-last w-full md:order-none md:mx-6 md:w-auto md:flex-1" />
<div className="ms-auto flex items-center gap-1 md:ms-0">
<Button variant="ghost" className="hidden sm:inline-flex">
<UserIcon />
ورود
</Button>
<Button variant="outline" aria-label={`سبد خرید، ${toFaDigits(3)} کالا`}>
<ShoppingCartIcon />
<Badge color="primary">{toFaDigits(3)}</Badge>
</Button>
</div>
</div>
<nav aria-label="دستهها" className="mx-auto w-full max-w-6xl overflow-x-auto px-4 sm:px-6">
<ul className="flex gap-6 pb-3 text-sm whitespace-nowrap">
{CATEGORIES.map((category, index) => (
<li key={category}>
<a href="#" className={index === CATEGORIES.length - 1 ? "font-semibold text-destructive" : "text-muted-foreground hover:text-foreground"}>
{category}
</a>
</li>
))}
</ul>
</nav>
</header>
</ControlSizeProvider>
)
}