@tokapps/tuk · Layer 3 · Navigation
امضای چیدمان همه سایتهای توکاپس: یک نوار شیشهای فیکس که کمی بالاتر از لبه پایین نمایشگر و بالاتر از همه سطحهای صفحه شناور است — مثل نوار وظیفه ویندوز. ناوبری اصلی، لانچر، جستجو و ناحیه سیستم همه اینجا هستند.
همه محورهای داک را ترکیب کنید. تم و حالت روز/شب از تنظیمات سریع خود داک سایت (پایین صفحه) گرفته میشود.
رنگ هرگز تنها نشانه نیست: صفحه فعلی نوار پهن + پسزمینه دارد، «باز» نقطه دارد، توجه حاشیه + چشمک دارد، شمارنده عدد دارد و برای صفحهخوان اعلام میشود.
دسکتاپ: نوار سهناحیهای با برچسب در hover. تبلت: شناور و فشرده. موبایل: تمامعرض منهای حاشیه، برچسب زیر آیکون همیشه دیده میشود، هر کلید ۴۴px (حداقل هدف لمسی)، و با احترام به safe-area.
پنج کلید در همهٔ تمها در یک موقعیتاند: منو و جستجو سمت آغاز، صدا · پروفایل · ساعت سمت پایان. تم فقط نمایش هر کلید را تعیین میکند (با dock.slots)، نه جای آن را.
هر تم با کپی کد تعیین میکند کدام کلید دیده شود. اینجا همان را امتحان کنید:
کلیدهای ثابت هرگز زیر پوشه نمیروند و موقعیتشان هیچوقت عوض نمیشود.
اگر آیتمها در عرض ردیف جا نشوند، آیتمهای گروهپذیر از انتها زیر یک پوشه میروند (مثل پوشهٔ لانچر). کلیک روی پوشه، پنلی بالای داک باز میکند که همان آیتمها را قابل کلیک نشان میدهد. کلیدهای ثابت و آیتمهای غیرگروهپذیر هرگز زیر پوشه نمیروند. در موبایل همین قاعده است؛ کلیدهای ثابت برچسب ندارند تا در ردیف جا شوند.
روی لمس، فشردن بیش از ~۴۵۰ms نام آیکون را بالای آن نشان میدهد؛ با رها کردن ناپدید میشود و کلیک بعد از آن فعال نمیشود. روی پوشه، نام آیتمهای داخلش دیده میشود. ماوس همان tooltip با hover را دارد.
// لمس طولانی (≈۴۵۰ms، فقط لمس) نام آیتم را نشان میدهد و کلیک را فعال نمیکند.// هیچ prop اضافهای لازم نیست؛ هر DockItem و پوشه این رفتار را دارد.<DockItem name="section:components" icon={<Icon name="docs.components" size="auto" />} label="کامپوننتها" href="/components" />در هر لحظه فقط یک سطح از داک باز است: پنل (منو، تنظیمات، ساعت، پروفایل)، پوشه، ورق کشیدنی یا برگهٔ داک. باز شدن هر کدام، بقیه را میبندد؛ مثلاً باز کردن پوشه، ورق منوی کامل را میبندد.
// هر پنل، پوشه، ورق کشیدنی یا برگهٔ داک که باز شود، سطح قبلی را میبندد.// خودتان کاری نکنید: DockPanel این را هماهنگ میکند.<DockPanel open={a} onClose={() => setA(false)} label="پنل الف" position="contained">…</DockPanel><DockPanel open={b} onClose={() => setB(false)} label="پنل ب" position="contained">…</DockPanel>وقتی به بالای صفحه رسیدیم، «برو پایین» با یک انیمیشن نرم سمت راست داک وارد میشود؛ وقتی به پایین رسیدیم، «برو بالا».
شیشه = پسزمینه نیمهشفاف + blur + اشباع + خط مویی + درخشش لبه بالا + سایه شناور. هرجا شفافیت به خوانایی آسیب بزند، به سطح مات برمیگردد.
داک کد خودش را برای هیچ محصولی عوض نمیکند؛ فقط توکن تم عوض میشود.
در موبایل ردیف فقط کلیدهای ثابت و پوشه است. دستگیره بالای داک را به بالا بکشید (یا بزنید) تا منوی کامل بخشها و تنظیمات سریع باز شود. بار اول یک انیمیشن انگشت آموزش میدهد.
وضعیت ورق: بسته
هر تم در فرادادهاش (packages/theme-<id>/src/meta.ts → dock) مشخص میکند کدام کلیدهای ثابت دیده شوند و کدام آیتمها اجازه دارند زیر پوشه بروند. TUK هیچکدام را خودسرانه تعیین نمیکند.
ساعت داک از فراداده همان تم میآید: تقویم (شمسی یا میلادی) و نمایش (عددی یا عقربهای). در صفحهٔ تنظیمات داک، کاربر هر دو را بازنویسی میکند. ساعت عقربهای در موبایل یک کلید ۴۴px است و صفحهاش وسط آن.
هر تم فقط از راه فراداده و توکنهایش داک را تغییر میدهد؛ ساختار و رفتار ثابتاند.
| تم | کلیدهای ثابت پنهان | آیتمهای گروهپذیر | ساعت داک |
|---|---|---|---|
| هسته توکاپس tokapps | هیچ (همه نمایش) | section:*, quick | شمسی · عددی |
| ایدهپردازی ideation | هیچ (همه نمایش) | section:*, quick | شمسی · عقربهای |
| سرمایهگذاری جمعی funding | هیچ (همه نمایش) | section:* | میلادی · عددی |
| کشف محصول product-hunt | هیچ (همه نمایش) | section:*, quick | میلادی · عقربهای |
| روایتها stories | هیچ (همه نمایش) | section:* | شمسی · عددی |
| سازمانی enterprise | هیچ (همه نمایش) | section:*, quick | میلادی · عددی |
// packages/theme-funding/src/meta.tsexport const meta: ProductThemeMeta = { id: 'funding', // … dockClock: { calendar: 'gregorian', face: 'analog' }, dock: { // کلیدهای ثابت: موقعیت ثابت است؛ فقط نمایششان را تم تعیین میکند slots: { menu: true, search: true, mode: true, sound: false, profile: true, clock: true }, // فقط این آیتمها (با name) زیر پوشه میروند؛ 'section:*' پیشوندی است groupable: ['section:*'], },};/* packages/theme-funding/src/theme.css — فقط توکنهای مجاز داک */[data-theme="funding"] { --tds-dock-radius: var(--tds-radius-xl); /* شکل */ --tds-dock-blur: 14px; /* شیشه */ --tds-dock-transition: 220ms; /* حرکت (زمان و منحنی) */}کلید منو پنل شیشهای بلندی را باز میکند؛ نقشه سایت با همان چیدمان. جستجو از بالای نقشه فعال میشود (بخش «جستجوی پیشوندی منو»).
سنجاقشده
اختیاری؛ برای صفحههای خواندنی طولانی. هرگز وقتی فوکوس کیبورد داخل داک است پنهان نمیشود.
داخل قاب به پایین اسکرول کنید: داک پنهان میشود؛ با اسکرول به بالا، نزدیک شدن نشانگر به لبه پایین یا فوکوس کیبورد برمیگردد.
نوع تازهای از Toast: آیکونها از دو طرف بیرون میروند و محو میشوند، رنگ کل داک با گرادیان نرم و زنده (رنگ وضعیت تا دو پله عمیقتر) میآید. داک از قاعده «بدون گرادیان» مستثناست. معادل متنی با aria-live اعلام میشود و رنگ تنها نشانه نیست (آیکون + برچسب).
همه در packages/tokens/src/component/dock.css. کامپوننت جز اینها هیچ مقداری مصرف نمیکند.
| گروه | توکن | نقش | مقدار فعلی |
|---|---|---|---|
| هندسه | کپی کد | فاصله داک از لبه پایین نمایشگر | کپی کد |
| هندسه | کپی کد | حاشیه کناری در صفحههای باریک | کپی کد |
| هندسه | کپی کد | بیشینه پهنای داک | کپی کد |
| هندسه | کپی کد | فاصله درونی داک | کپی کد |
| هندسه | کپی کد | فاصله بین آیتمها | کپی کد |
| هندسه | کپی کد | شعاع گوشه داک | کپی کد |
| هندسه | کپی کد | اندازه هدف لمسی هر آیتم | کپی کد |
| هندسه | کپی کد | اندازه آیکون | کپی کد |
| هندسه | کپی کد | شعاع آیتم | کپی کد |
| هندسه | کپی کد | ارتفاع کل (مشتق) | کپی کد |
| ماده | کپی کد | پسزمینه شیشهای نیمهشفاف | کپی کد |
| ماده | کپی کد | پسزمینه وقتی backdrop-filter پشتیبانی نشود | کپی کد |
| ماده | کپی کد | تهرنگ اکسنت روی شیشه | کپی کد |
| ماده | کپی کد | شدت تاری پشت شیشه | کپی کد |
| ماده | کپی کد | اشباع پشت شیشه | کپی کد |
| ماده | کپی کد | خط مویی دور شیشه | کپی کد |
| ماده | کپی کد | درخشش لبه بالایی | کپی کد |
| ماده | کپی کد | سایه شناور (elevation-float) | کپی کد |
| ماده | کپی کد | لایه: بالای صفحه، زیر دیالوگ | کپی کد |
| وضعیت | کپی کد | رنگ آیکون عادی | کپی کد |
| وضعیت | کپی کد | رنگ آیکون صفحه فعلی | کپی کد |
| وضعیت | کپی کد | پسزمینه hover | کپی کد |
| وضعیت | کپی کد | پسزمینه فشار | کپی کد |
| وضعیت | کپی کد | پسزمینه صفحه فعلی | کپی کد |
| وضعیت | کپی کد | رنگ نشانگر فعال | کپی کد |
| وضعیت | کپی کد | پهنای نشانگر «باز است» | کپی کد |
| وضعیت | کپی کد | پهنای نشانگر «همین صفحه» | کپی کد |
| وضعیت | کپی کد | پسزمینه شمارنده | کپی کد |
| وضعیت | کپی کد | رنگ درخواست توجه | کپی کد |
| رفتار | کپی کد | جابجایی عمودی روی hover | کپی کد |
| رفتار | کپی کد | مقیاس هنگام فشار | کپی کد |
| رفتار | کپی کد | زمان و منحنی گذار | کپی کد |
| رفتار | کپی کد | زمان پنهان/ظاهر شدن خودکار | کپی کد |
| هشدار | کپی کد | ماندگاری هشدار زماندار پیش از بازگشت نرم | کپی کد |
| هشدار | کپی کد | فاصلهٔ هشدار شناور (خارج از داک) از لبههای صفحه | کپی کد |
| هشدار | کپی کد | فاصلهٔ گوشههای بالای هشدار شناور از لبهٔ بالا، زیر TopBar | کپی کد |
| هشدار | کپی کد | فاصلهٔ هشدارهای پشتهشدهٔ روی صفحه | کپی کد |
| هشدار | کپی کد | حداقل عرض پنجرهٔ هشدار شناور روی صفحه | کپی کد |
| هشدار | کپی کد | فاصلهٔ هشدار شناور پایین از لبهٔ پایین، بالای داک | کپی کد |
| هشدار | کپی کد | زمان رنگگرفتن داک و خروج آیکونها | کپی کد |
| هشدار | کپی کد | زمان بازگشت رنگ داک به حالت عادی | کپی کد |
| هشدار | کپی کد | موج پلهای آیکونها از مرکز تا لبه | کپی کد |
| هشدار | کپی کد | مکث پیش از بازگشت آیکونها | کپی کد |
| هشدار | کپی کد | کوچکشدن و محو نوشته در وسط | کپی کد |
| هشدار | کپی کد | دوره حرکت زنده گرادیان | کپی کد |
| هشدار | کپی کد | سهم رنگ متن در سر دوم گرادیان | کپی کد |
| هشدار | کپی کد | اندازه نوشته هشدار | کپی کد |
| ژست | کپی کد | بیشینه آیکون در ردیف موبایل (بقیه در ورق) | کپی کد |
| ژست | کپی کد | پهنای دستگیره بالای داک | کپی کد |
| ژست | کپی کد | رنگ دستگیره | کپی کد |
| ژست | کپی کد | بیشینه ارتفاع ورق باز | کپی کد |
| ژست | کپی کد | زمان باز/بسته شدن ورق پس از رها کردن | کپی کد |
| ژست | کپی کد | پرده پشت ورق باز | کپی کد |
| ژست | کپی کد | px — زیر این، ضربه است نه کشیدن | کپی کد |
| ژست | کپی کد | کسری از ارتفاع ورق برای تصمیم باز/بسته | کپی کد |
| ژست | کپی کد | px/ms — سوایپ سریع بدون توجه به فاصله | کپی کد |
| آموزش | کپی کد | طول یک چرخه انیمیشن انگشت | کپی کد |
| آموزش | کپی کد | تعداد تکرار پیش از ثابت شدن | کپی کد |
| آموزش | کپی کد | مسافت حرکت انگشت به بالا | کپی کد |
| آموزش | کپی کد | باز شدن همزمان ورق در انیمیشن | کپی کد |
| آموزش | کپی کد | اندازه دایره انگشت | کپی کد |
| آموزش | کپی کد | رنگ رد حرکت انگشت | کپی کد |
| آموزش | کپی کد | پسزمینه حباب متن آموزش | کپی کد |
| اسکرول | کپی کد | اندازه دکمه اسکرول کنار داک (همقد داک) | کپی کد |
| اسکرول | کپی کد | اندازه دکمه بالای داک (موبایل) | کپی کد |
| اسکرول | کپی کد | فاصله دکمه از داک | کپی کد |
| اسکرول | کپی کد | px — نزدیکی به لبه که «رسیدیم» حساب شود | کپی کد |
| اسکرول | کپی کد | زمان ورود فنری | کپی کد |
| اسکرول | کپی کد | منحنی ورود (فنر با جهش) | کپی کد |
| اسکرول | کپی کد | نقطه شروع ورود — از درون داک | کپی کد |
| اسکرول | کپی کد | زمان چرخش ۱۸۰° پیکان | کپی کد |
| اسکرول | کپی کد | دامنه تکان پیکان پس از ورود | کپی کد |
| اسکرول | کپی کد | رنگ حلقه تپنده هنگام ورود | کپی کد |
| مشتق | کپی کد | فضای خالی پایین هر صفحه تا محتوا زیر داک نرود | کپی کد |
import { Dock, DockItem, DockSeparator, DockClock, type DockSlots } from '@tokapps/tuk/dock';
/* سیاست تم: از packages/theme-<id>/src/meta.ts → dock */
const { slots, groupable } = themeDock(theme);
<Dock
slots={{ // موقعیت ثابت؛ تم فقط نمایش را تعیین میکند
menu: slots.menu ? <DockItem icon={<Icon name="launcher" size="auto" />} label="منو" onClick={openMenu} /> : undefined,
search: slots.search ? <DockItem icon={<Icon name="search" size="auto" />} label="جستجو" onClick={openSearch} /> : undefined,
mode: slots.mode ? <DockItem icon={modeIcon} label="حالت شب" onClick={toggleMode} /> : undefined,
sound: slots.sound ? <DockItem icon={soundIcon} label="صدا" aria-pressed={sound} onClick={toggleSound} /> : undefined,
profile: slots.profile ? <DockProfileItem /> : undefined,
clock: slots.clock ? <DockClock calendar="jalali" face="digital" compact /> : undefined,
}}
groupable={groupable} // فقط این نامها زیر پوشه میروند (section:* پیشوندی است)
tray={<DockSeparator />}
>
<DockItem name="section:components" href="/components" icon={<Icon name="docs.components" size="auto" />} label="کامپوننتها" />
{/* حالت روز/شب هم کلید ثابت است: slots.mode */}
</Dock>
/* هشدار روی داک (سراسری، مثل startBusy) */
import { dockAlert } from '@tokapps/tuk/dock';
const a = dockAlert({ tone: 'success', text: 'ذخیره شد' }); // چند ثانیه، بازگشت نرم
const p = dockAlert({ tone: 'danger', text: 'اتصال قطع شد', mode: 'persistent' });
p.update({ tone: 'success', text: 'وصل شد' }); p.dismiss();
/* هر صفحه: فضای زیر داک را خالی نگه دار */
<main data-dock-reserve>…</main>