برنامههای داک (Dock Apps)
داک شیشهای حالا بسطپذیر است: هر محصولی میتواند بدون دستزدن به کد پکیجها یک برنامهٔ تعاملی روی داک بسازد. داک خودش ساختار آیتم، نشان (badge)، برگهٔ پایینی/باتنشیت، Escape و کلیکبیرون، چرخهٔ عمر و ذخیرهسازی پایدار را تأمین میکند؛ برنامه فقط محتوا و رفتارش را میآورد.
قانون (AGENTS §۷): هر برنامه همیشه در برگهٔ پایینی داک (DockSheet) باز میشود. برنامه پنل شناور ندارد؛ باتنشیت همان داک شیشهای است که زنده تغییر شکل میدهد.
وضعیت: beta · لایه: ۳ (کپی کد) · الگوی آمادهٔ لایهٔ ۴: کپی کد (کپی کد)
نمونهٔ زنده
همین دو برنامه روی داک مستندات هم ثبت شدهاند: نشان علاقهمندیها و کارها را روی داک پایین ببینید. اینجا فرم و فهرست را داخل صفحه هم میبینید:
علاقهمندیها
هنوز چیزی ذخیره نکردهاید
هر صفحهای را که دوست دارید اینجا نگه دارید.
روی همین مرورگر و بهصورت محلی ذخیره میشود.
کارها
فهرست خالی است
اولین کار را اضافه کنید.
روی همین مرورگر و بهصورت محلی ذخیره میشود.
نمای کلی API
| تابع/هوک | کار |
|---|---|
| کپی کد | نوعدهی و هویت شیء برنامه |
| کپی کد / کپی کد | ثبت و برداشتن برنامه (وضعیت سراسری) |
| کپی کد | ثبت برنامه در عمر کامپوننت |
| کپی کد / کپی کد | فهرست مرتب برنامهها |
| کپی کد | آرایهٔ آیتمهای آماده — در children داک بپاشید |
| کپی کد | آیتم برنامههایی که در کلید ثابت داک مینشینند |
| کپی کد | چرخهٔ عمر + باز کردن برگهٔ پایینی برنامهٔ باز |
| کپی کد | وضعیت پایدار برنامه روی کپی کد |
| کپی کد | توابع داک: کپی کد |
| کپی کد / کپی کد | نشان و وضعیت باز برنامه |
کمترین نمونه
'use client';import { Icon } from '@tokapps/icons';import { Dock, DockAppHost, defineDockApp, useDockAppItems, useDockAppState, useRegisterDockApp } from '@tokapps/tuk/dock';function MyApp({ ctx }: { ctx: import('@tokapps/tuk/dock').DockAppContext }) { const [count, setCount] = useDockAppState('counter', 0); return ( <button type="button" onClick={() => setCount(count + 1)}> شمارنده: {count} </button> );}const counterApp = defineDockApp({ id: 'counter', label: 'شمارنده', icon: <Icon name="add" size="auto" />, onMount: (ctx) => ctx.setBadge(0), render: (ctx) => <MyApp ctx={ctx} />,});export function DockWithApps() { useRegisterDockApp(counterApp); const appItems = useDockAppItems(); return ( <> <Dock> {[...items, ...appItems]} </Dock> <DockAppHost /> </> );}نکته: آدمهای آماده (کپی کد) را با کپی کد در آرایهٔ children بپاشید تا هر آیتم یک فرزند مستقل بماند و گروهبندی/پوشهٔ داک درست کار کند. کپی کد را فقط وقتی بهعنوان یک فرزند بگذارید که گروهبندی مهم نیست.
فیلدهای کپی کد
| فیلد | کار |
|---|---|
| کپی کد | شناسهٔ یکتا و کلید ذخیرهسازی پایدار |
| کپی کد · کپی کد | برچسب و آیکون آیتم داک |
| کپی کد | محتوای برنامه؛ کپی کد توابع داک را میدهد |
| کپی کد | کپی کد (پیشفرض) یا کپی کد |
| کپی کد | نشستن در یک کلید ثابت داک (مثلاً کپی کد) |
| کپی کد · کپی کد | ترتیب ردیف و نام سیاست گروهبندی تم |
| کپی کد | نشان اولیه؛ با کپی کد پویا میشود |
| کپی کد · کپی کد · کپی کد | چرخهٔ عمر؛ کپی کد میتواند تابع پاکسازی برگرداند |
کپی کد برنامه:
interface DockAppContext { id: string; open(): void; close(): void; toggle(): void; setBadge(badge?: string | number): void; sheet(options: DockSheetOptions): DockSheetHandle; alert(options: DockAlertOptions): DockAlertHandle;}وضعیت پایدار
کپی کد وضعیت برنامه را زیر فضای نام کپی کد نگه میدارد؛ در SSR پیشفرض میرندر میشود و در کلاینت بازیابی میشود. JSON خراب یا نبود کپی کد به پیشفرض امن برمیگردد.
const [items, setItems, reset] = useDockAppState<readonly string[]>('my-app', []);الگوی آماده: علاقهمندیها و کارها
پکیج کپی کد دو برنامهٔ آمادهٔ لایهٔ ۴ میدهد که دقیقاً روی همین API ساخته شدهاند. بنیان بصریشان از خود TDS است (کپی کد/کپی کد/کپی کد/کپی کد/کپی کد و کپی کد)؛ این الگو فقط چیدمان را میچیند و هیچ کنترل خامی نمیسازد (قانون کپی کد §۶.۵):
import { createBookmarksApp, createTodosApp } from '@tokapps/patterns';import { DockAppHost, useDockAppItems, useRegisterDockApp } from '@tokapps/tuk/dock';useRegisterDockApp(createBookmarksApp({ current: () => ({ href: location.pathname, label: 'صفحهٔ فعلی' }),}));useRegisterDockApp(createTodosApp());- کپی کد — افزودن صفحهٔ فعلی، فهرست، حذف و پاککردن همه؛ نشان = تعداد ذخیرهها. کپی کد میتواند تابع باشد تا با هر ناوبری، بدون ثبت دوبارهٔ برنامه، بهروز بماند.
- کپی کد — افزودن کار، انجامشده/نشده، حذف؛ نشان = کارهای باقیمانده.
افزودن آیکون یا اکشن به داک
علاوه بر «برنامه» (که همیشه در برگهٔ پایینی باز میشود)، داک یک نقطهٔ توسعهٔ سبک برای آیکون/کنش سریع دارد: هر اکشن فقط یک آیتم داک است که با کلیک کاری میکند (بدون سطح، بدون چرخهٔ عمر برنامه).
| تابع/هوک | کار |
|---|---|
| کپی کد | ثبت یک اکشن ثابت در عمر کامپوننت |
| کپی کد | ثبت همزمان یک فهرست پویا (مثل صفحات سنجاقشده) |
| کپی کد | فهرست مرتب اکشنها |
| کپی کد | آرایهٔ آیتمهای آماده — در children داک بپاشید |
| کپی کد / کپی کد | ثبت/برداشت سراسری بدون هوک |
فیلدهای کپی کد: کپی کد، کپی کد، کپی کد، کپی کد، کپی کد (کپی کد | کپی کد | کپی کد)، کپی کد، کپی کد، کپی کد و کپی کد.
'use client';import { Icon } from '@tokapps/icons';import { useDockActionItems, useDockActionList, useRegisterDockAction } from '@tokapps/tuk/dock';function Dock() { // اکشن ساده: سنجاق کردن صفحهٔ فعلی useRegisterDockAction({ id: 'pin-page', label: 'سنجاق کردن این صفحه به داک', icon: <Icon name="star" size="auto" />, onSelect: () => pin(location.pathname), }); // فهرست پویا (مثلاً از «صفحات مورد علاقه»): const pinned = useBookmarks().filter((b) => b.pinned).map((b) => ({ id: `pin:${b.href}`, label: b.label, icon: <Icon name="star" size="auto" />, onSelect: () => location.assign(b.href), })); useDockActionList(pinned); return <Dock>{[...items, ...useDockActionItems()]}</Dock>;}نمونهٔ آماده: در الگوی علاقهمندیها، هر قلم یک دکمهٔ «سنجاق به داک» دارد؛ کپی کد از کپی کد همان فهرست را بهصورت کپی کد برمیگرداند و با کپی کد روی داک مینشیند (در همین سایت زنده است).
قواعد
- برنامه هرگز کپی کد بنیان داک را بازنویسی نمیکند و رنگ/گرادیان خام نمینویسد.
- هر برنامه همیشه در برگهٔ پایینی داک (کپی کد) باز میشود؛ پنل شناور برای برنامه ممنوع است.
- برگهٔ برنامه Escape، دکمهٔ بستن، کشیدن به پایین و کلیکبیرون (اگر کپی کد باشد) دارد.
- کاهش حرکت و کنتراست بالا از خود داک میآید؛ برنامه فقط از توکنهای معنایی استفاده میکند.
- حداکثر یک سطح برنامه همزمان باز است (همان «سطح فعال داک»).