Podcast — پادکست و پخش روی داک شیشهای
با زدن پخش روی هر اپیزود، کل فهرست از همان اپیزود در صف پخشکنندهٔ داک مینشیند و پخش روی داک شیشهای پایین صفحه ادامه پیدا میکند. پخشکننده بخشی از خود داک است و عنصر صوتی بیرون از درخت React ساخته میشود؛ پس با رفتن به صفحهٔ دیگر قطع نمیشود. پخشکننده سه نما دارد: کوچک (پیشفرض)، کوچکشده (دیسک یا زبانه روی لبهٔ داک) و بزرگ (برگهٔ زندهٔ داک با صف پخش).
وضعیت: beta · لایه: ۴ (کپی کد) + پخشکنندهٔ داک (لایهٔ ۳، کپی کد) · فراداده: کپی کد · Storybook: کپی کد (کپی کد، کپی کد، کپی کد)
قاعدهٔ اجباری (کپی کد): پخش صدا در هر پروژهٔ TDS فقط با همین پخشکنندهٔ داک انجام میشود. ساختن پخشکنندهٔ محلی — عنصر کپی کد، کپی کد، کپی کد، کتابخانهٔ پخشکننده (react-player/howler/plyr/…) یا کلید کوچککردن اختصاصی — ممنوع است و کپی کد آن را با کد کپی کد رد میکند. سه نما (کوچک، کوچکشده/دیسک، بزرگ)، صف پخش، سرعت، دریافت/اشتراک، Media Session و ادامهٔ پخش با تغییر صفحه از خود پخشکننده میآید و بازسازیشدنی نیست؛ فهرست اپیزودها با این الگو و پخشهای پراکنده با کپی کد. کامپوننت قدیمی کپی کد در کپی کد منسوخ است.
import { Podcast } from '@tokapps/patterns';import { playOnDock, dockPlayer } from '@tokapps/tuk/dock';نمونهٔ زنده
یک اپیزود را پخش کنید، سپس از منوی داک به صفحهٔ دیگری بروید: صدا ادامه دارد. صدای نمونه در مرورگر ساخته میشود (بدون فایل و بدون شبکه).
پادکست توکاپس
تیم طراحی توکاپس
گفتگو دربارهٔ ساختن محصول، طراحی سیستم و تجربهٔ کاربری — هر هفته یک اپیزود کوتاه.
۵ اپیزود · ۳:۲۱
- اپیزود ۶
داک شیشهای: چرا ناوبری پایین؟
از تصمیم حذف نوار بالا تا شش کلید ثابت داک؛ اینکه شست کاربر کجا راحت است.
۰:۴۲
- اپیزود ۵
هویت متغیر، بنیان ثابت
چطور شش تم با یک کامپوننت متفاوت حرکت میکنند بدون اینکه ساختار عوض شود.
۰:۳۸
- اپیزود ۴
رنگ هفترنگ فقط برای حاشیه
گرادیان کجا مجاز است و چرا رنگ هرگز تنها نشانهٔ وضعیت نیست.
۰:۴۵
- اپیزود ۳
صدا همیشه انتخابی است
صدای رابط پیشفرض خاموش است؛ هر رویداد صوتی معادل دیداری دارد.
۰:۳۶
- اپیزود ۲
راستبهچپ از روز اول
متن ترکیبی فارسی و انگلیسی، ارقام و کنترلهای رسانهای که برنمیگردند.
۰:۴۰
قفسهٔ کاورها (کپی کد) — کشیدن افقی با نقطهگیری
پادکست توکاپس
تیم طراحی توکاپس
گفتگو دربارهٔ ساختن محصول، طراحی سیستم و تجربهٔ کاربری — هر هفته یک اپیزود کوتاه.
۵ اپیزود · ۳:۲۱
- اپیزود ۶
داک شیشهای: چرا ناوبری پایین؟
از تصمیم حذف نوار بالا تا شش کلید ثابت داک؛ اینکه شست کاربر کجا راحت است.
۰:۴۲
- اپیزود ۵
هویت متغیر، بنیان ثابت
چطور شش تم با یک کامپوننت متفاوت حرکت میکنند بدون اینکه ساختار عوض شود.
۰:۳۸
- اپیزود ۴
رنگ هفترنگ فقط برای حاشیه
گرادیان کجا مجاز است و چرا رنگ هرگز تنها نشانهٔ وضعیت نیست.
۰:۴۵
- اپیزود ۳
صدا همیشه انتخابی است
صدای رابط پیشفرض خاموش است؛ هر رویداد صوتی معادل دیداری دارد.
۰:۳۶
- اپیزود ۲
راستبهچپ از روز اول
متن ترکیبی فارسی و انگلیسی، ارقام و کنترلهای رسانهای که برنمیگردند.
۰:۴۰
سربرگ بزرگ (کپی کد) — پسزمینه همان کاور است، بسیار تار (بدون گرادیان)
پادکست توکاپس
تیم طراحی توکاپس
گفتگو دربارهٔ ساختن محصول، طراحی سیستم و تجربهٔ کاربری — هر هفته یک اپیزود کوتاه.
۳ اپیزود · ۲:۰۵
- اپیزود ۶
داک شیشهای: چرا ناوبری پایین؟
از تصمیم حذف نوار بالا تا شش کلید ثابت داک؛ اینکه شست کاربر کجا راحت است.
۰:۴۲
- اپیزود ۵
هویت متغیر، بنیان ثابت
چطور شش تم با یک کامپوننت متفاوت حرکت میکنند بدون اینکه ساختار عوض شود.
۰:۳۸
- اپیزود ۴
رنگ هفترنگ فقط برای حاشیه
گرادیان کجا مجاز است و چرا رنگ هرگز تنها نشانهٔ وضعیت نیست.
۰:۴۵
فهرست موسیقی (کپی کد، کپی کد)
صداهای داک
گروه موسیقی توکاپس
قطعههای کوتاه و آرام برای کار؛ با پخش هر قطعه، بقیهٔ آلبوم پشت سرش در صف میآید.
۴ قطعه · ۱:۵۸
فیروزه
آوا۰:۳۰
شیشه
آوا۰:۲۶
مدار
نیما۰:۳۴
قطره
نیما۰:۲۸
کاشیها (کپی کد) — در موبایل دو ستون
پادکست توکاپس
تیم طراحی توکاپس
گفتگو دربارهٔ ساختن محصول، طراحی سیستم و تجربهٔ کاربری — هر هفته یک اپیزود کوتاه.
۴ اپیزود · ۲:۴۱
- اپیزود ۶
داک شیشهای: چرا ناوبری پایین؟
از تصمیم حذف نوار بالا تا شش کلید ثابت داک؛ اینکه شست کاربر کجا راحت است.
۰:۴۲
- اپیزود ۵
هویت متغیر، بنیان ثابت
چطور شش تم با یک کامپوننت متفاوت حرکت میکنند بدون اینکه ساختار عوض شود.
۰:۳۸
- اپیزود ۴
رنگ هفترنگ فقط برای حاشیه
گرادیان کجا مجاز است و چرا رنگ هرگز تنها نشانهٔ وضعیت نیست.
۰:۴۵
- اپیزود ۳
صدا همیشه انتخابی است
صدای رابط پیشفرض خاموش است؛ هر رویداد صوتی معادل دیداری دارد.
۰:۳۶
import { Podcast, type PodcastEpisode } from '@tokapps/patterns';const episodes: PodcastEpisode[] = [ { id: 'ep-6', number: 6, title: 'داک شیشهای: چرا ناوبری پایین؟', date: '۲۰ مهر ۱۴۰۵', duration: 2520, src: '/audio/ep-6.mp3' }, { id: 'ep-5', number: 5, title: 'هویت متغیر، بنیان ثابت', date: '۱۳ مهر ۱۴۰۵', duration: 2280, src: '/audio/ep-5.mp3' }, // نشانی امضاشده: src میتواند تابع ناهمگام باشد و فقط هنگام پخش صدا زده میشود { id: 'ep-4', number: 4, title: 'رنگ هفترنگ فقط برای حاشیه', duration: 2700, src: () => fetch('/api/audio/ep-4').then((r) => r.text()) },];export function PodcastPage() { return ( <Podcast show={{ title: 'پادکست توکاپس', author: 'تیم طراحی توکاپس', category: 'طراحی محصول', artwork: '/covers/podcast.jpg' }} episodes={episodes} /> );}// موسیقی: هنرمند بهجای خلاصه<Podcast kind="music" layout="compact" show={{ title: 'صداهای داک', author: 'آوا' }} episodes={tracks} />کاورها: روی هر ردیف کاور کوچک خودش دکمهٔ پخش است (مثل اپهای پادکست امروزی)؛ اپیزود جاری نوار پیشرفت زنده و «زمان مانده» دارد. کاور خراب یا نبودِ شبکه → کاشی توکنی با آیکون. کاورهای این صفحه از Lorem Picsum (عکسهای Unsplash با مجوز آزاد) هستند.
کارتها در قالبها (شش تم)
هر تم چیدمان پیشنهادی و ماده/حرکت خودش را دارد (کپی کد: شعاع کاور، بلندشدن کارت، تاری پسزمینه، زمان و منحنی) — ساختار الگو ثابت است.
پادکست توکاپس
تیم طراحی توکاپس
گفتگو دربارهٔ ساختن محصول، طراحی سیستم و تجربهٔ کاربری — هر هفته یک اپیزود کوتاه.
۵ اپیزود · ۳:۲۱
- اپیزود ۶
داک شیشهای: چرا ناوبری پایین؟
از تصمیم حذف نوار بالا تا شش کلید ثابت داک؛ اینکه شست کاربر کجا راحت است.
۰:۴۲
- اپیزود ۵
هویت متغیر، بنیان ثابت
چطور شش تم با یک کامپوننت متفاوت حرکت میکنند بدون اینکه ساختار عوض شود.
۰:۳۸
- اپیزود ۴
رنگ هفترنگ فقط برای حاشیه
گرادیان کجا مجاز است و چرا رنگ هرگز تنها نشانهٔ وضعیت نیست.
۰:۴۵
- اپیزود ۳
صدا همیشه انتخابی است
صدای رابط پیشفرض خاموش است؛ هر رویداد صوتی معادل دیداری دارد.
۰:۳۶
- اپیزود ۲
راستبهچپ از روز اول
متن ترکیبی فارسی و انگلیسی، ارقام و کنترلهای رسانهای که برنمیگردند.
۰:۴۰
<div data-theme="tokapps"> <Podcast layout="featured" show={show} episodes={episodes} /></div>پخش از هر جای برنامه
الگو فقط یکی از مصرفکنندههاست. هر دکمه یا صفحهای میتواند یک صف را روی داک بفرستد — بدون Provider، چون داک ریشهٔ برنامه به پخشکنندهٔ سراسری گوش میدهد:
import { playOnDock, dockPlayer, useDockPlayer } from '@tokapps/tuk/dock';// پخش یک صف از اندیس ۲ (هیچ پخش خودکاری نیست؛ فقط با کنش کاربر صدا بزنید)<button onClick={() => playOnDock(tracks, { start: 2, label: 'آلبوم شیشه' })}>پخش</button>// کنترل و وضعیتdockPlayer.toggle(); dockPlayer.next(); dockPlayer.skip(-15); dockPlayer.setView('minimized');const state = useDockPlayer(dockPlayer); // { queue, index, status, position, duration, view, … }پلیگراند — پیکربندی زنده روی داک همین سایت
هر انتخاب همین لحظه روی داک پایین صفحه اعمال میشود و کد قابل کپی از همان پیکربندی ساخته میشود. تم سایت را از تنظیمات سریع داک عوض کنید تا پیشفرض هر تم را ببینید.
بنیان ثابت: نمای کوچک همیشه داخل داک است؛ آیکونها از درون شیشه به دو لبه میروند و برمیگردند؛ «کوچکشده» و «بزرگ» (برگهٔ داک) در همهٔ محصولها یکساناند. تم فعلی: tokapps.
import { playOnDock, addToDockQueue, playNextOnDock, removeFromDockQueue, downloadFromDock, shareFromDock, dockPlayer, useDockPlayer,} from '@tokapps/tuk/dock';// پخش یک فهرست از اندیس ۲ (فقط با کنش کاربر؛ پخش خودکار نیست)playOnDock(tracks, { start: 2, label: 'پادکست توکاپس' });addToDockQueue(track); // به انتهای فهرست پخشplayNextOnDock(track); // بلافاصله بعد از قطعهٔ جاریremoveFromDockQueue(track.id);await downloadFromDock(); // 'downloaded' | 'unavailable' (track.downloadable=false → unavailable)await shareFromDock(); // 'shared' | 'copied' | 'cancelled' | 'unavailable'dockPlayer.toggle(); dockPlayer.next(); dockPlayer.skip(-15); dockPlayer.setRate(1.5);const { queue, index, status, position, duration } = useDockPlayer(dockPlayer);// قطعهconst track = { id: 'ep-12', title: 'اپیزود ۱۲', subtitle: 'تیم توکاپس', src: '/audio/ep-12.mp3', // یا () => fetch('/api/signed').then((r) => r.text()) artwork: '/covers/ep-12.jpg', duration: 2520, kind: 'episode', fileName: 'tokapps-ep-12.mp3', shareUrl: 'https://tokapps.com/podcast/12', downloadable: true,};انواع روی قالبهای نمونه (شش تم)
ساختار، جایگیری داخل داک و نماها در همهٔ تمها یکی است (بنیان)؛ هر تم فقط هویت (کپی کد: ظاهر کوچکشده، اندازه، حرکت، پیشرفت، زمانبندی) و حرکت (کپی کد) را تعیین میکند. دکمهٔ «کوچک کردن» را روی هر نمونه بزنید تا نمای کوچکشدهٔ همان تم را ببینید.
| تم | کوچکشده | اندازه | حرکت (هویت) | پیشرفت | جمعشدن پس از بیتعاملی | کارکرد پیشفرض |
|---|---|---|---|---|---|---|
| tokapps | orb | md | liquid — «قطرهٔ فیروزهای» | line | ۶ ثانیه | — |
| ideation | tab | md | pop — «حباب ایده» | ring | ۸ ثانیه | — |
| funding | orb | lg | slide — «صندوق» | bar | ۱۰ ثانیه | پرش زمانی |
| product-hunt | orb | sm | pop — «پرتاب» | ring | ۵ ثانیه | — |
| stories | tab | lg | fade — «ورق» | bar | ۱۲ ثانیه | پرش ۱۰/۳۰، سرعتهای آرام |
| enterprise | tab | sm | fade — «ساده» | bar | ۷ ثانیه | — |
{/* اعمال یک تم روی بخشی از صفحه (پیشنمایش تودرتو: data-theme و data-mode هر دو) */}<div data-theme="funding" data-mode="light">…</div>قرارداد سهلایه (ARCH.md §2، §7)
| لایه | چه چیزی | چه کسی تعیین میکند |
|---|---|---|
| بنیان ثابت | نمای کوچک داخل خود داک (آیکونها از درون شیشه به دو لبه میلغزند و لبهٔ داک آنها را میبُرد؛ با بازگشت از لبهها برمیگردند)؛ ارتفاع داک ثابت؛ نماهای کوچک ↔ کوچکشده ↔ بزرگ (برگهٔ داک)؛ «بزرگ» اول آیکونها را برمیگرداند بعد برگه را باز میکند؛ اسکرول هرگز نما را عوض نمیکند؛ جای دیسک کوچکشده انتخاب کاربر است | فقط TUK — قابل تنظیم نیست |
| هویت تم | ظاهر کوچکشده، اندازه، حرکت، نمایش پیشرفت، جمعشدن پس از بیتعاملی، پیشنما، ژست | کپی کد + کپی کد |
| توسعهدهنده | توابع پخش/صف/دریافت/اشتراک و کلیدهای کارکردی | کپی کد، کپی کد، توابع زیر |
کلید هویتی در لایهٔ توسعهدهنده رد میشود (کپی کد)، هشدار توسعه میدهد و روی پخشکننده کپی کد میگذارد.
| کلید | لایه | مقادیر | پیشفرض بنیان |
|---|---|---|---|
| کپی کد | تم | کپی کد · کپی کد | کپی کد |
| کپی کد | تم | کپی کد · کپی کد · کپی کد | کپی کد |
| کپی کد | تم | کپی کد · کپی کد · کپی کد · کپی کد | کپی کد |
| کپی کد | تم | کپی کد · کپی کد · کپی کد | کپی کد |
| کپی کد · کپی کد | تم | کپی کد · کپی کد · ۲۰۰۰ تا ۶۰۰۰۰ | کپی کد · کپی کد |
| کپی کد · کپی کد · کپی کد | تم | کپی کد · ۰ تا ۵۰۰۰ | کپی کد · کپی کد · کپی کد |
| کپی کد · کپی کد | توسعهدهنده | ۵ تا ۶۰ | کپی کد · کپی کد |
| کپی کد | توسعهدهنده | آرایهٔ ۰٫۵ تا ۳ | کپی کد |
| کپی کد · کپی کد · کپی کد | توسعهدهنده | کپی کد | کپی کد · کپی کد · کپی کد |
| کپی کد · کپی کد · کپی کد | توسعهدهنده | کپی کد | کپی کد · کپی کد · کپی کد |
ترتیب حل: ترجیح کاربر (کاهش حرکت ← کپی کد) › محلی › محصول › تم › پیشفرض بنیان.
جای دیسک کوچکشده: کاربر آن را میکشد (ماوس یا لمس) یا با Shift + کلیدهای جهت جابهجا میکند؛ Home = جای پیشفرض. جای انتخابی به نسبت نمایشگر در کپی کد (کپی کد) برای همیشه ذخیره میشود و پیشنما خودش بالا/پایین و چپ/راست دیسک باز میشود.
API پخشکننده (کپی کد) — برای توسعهدهنده
| تابع | کار |
|---|---|
| کپی کد | پخش یک فهرست روی داک (فقط با کنش کاربر) |
| کپی کد | افزودن به انتهای فهرست پخش |
| کپی کد | پخش بلافاصله بعد از قطعهٔ جاری |
| کپی کد | حذف از فهرست |
| کپی کد | دریافت فایل (پیشفرض: جاری) ← کپی کد · کپی کد |
| کپی کد | اشتراک با برگهٔ سیستم یا کپی پیوند ← کپی کد · کپی کد · کپی کد · کپی کد |
| کپی کد · کپی کد · کپی کد · کپی کد · کپی کد · کپی کد | کنترل پخش |
| کپی کد · کپی کد · کپی کد · کپی کد | تکرار، تصادفی، نما، بستن |
| کپی کد · کپی کد | کلیدهای کارکردی در یک صفحه |
| کپی کد | وضعیت برای React |
| کپی کد | پخشکنندهٔ مستقل (داک contained، تست) |
کپی کد: کپی کد.
موبایل
-
نمای بزرگ (ضربه روی عنوان/کاور یا کشیدن به بالا): نوار موقعیت درشت برای جلو/عقب بردن با انگشت، دکمههای پرش با عدد ثانیه، سرعت − / + (ضربه روی عدد = سرعت عادی)، دریافت و اشتراکگذاری.
-
نمای باز پس از چند ثانیه بیتعاملی با انیمیشن نرم هویت تم به دیسک/زبانه جمع میشود؛ پخش ادامه دارد.
-
دیسک کوچکشده ساده است: کاور گرد که هنگام پخش میچرخد و سایهٔ رنگی نرم و چرخان دورش (لکههای تار از پالت هفترنگ، نه گرادیان CSS)؛ بیدکمهٔ ریز. پخش/مکث در پیشنما.
-
نمای کوچک همعرض داک است؛ کنترلهای اختیاری (قبلی، پرش جلو) زیر ۶۴۰px کنار میروند تا عنوان جا داشته باشد؛ هر هدف لمس ≥ ۴۴px.
-
کشیدن بالا روی پخشکننده نمای بزرگ (برگهٔ داک) را باز میکند، کشیدن پایین آن را کوچکشده میکند؛ کپی کد فقط روی سطح پخشکننده بسته است، نه کل صفحه.
-
وقتی ورق «به بالا بکشید» داک، یک پنل داک یا هشدار داک باز است، پخشکننده کنار میرود (پخش ادامه دارد) و پس از بستن برمیگردد.
-
روی نمای کوچکشده، فشار طولانی پیشنمای واضح را باز میکند (روی دسکتاپ: نگه داشتن ماوس ۲ ثانیه)؛ ضربه بیرون آن را میبندد.
-
Media Session: عنوان، کاور و کلیدهای پخش/مکث/بعدی/قبلی/پرش روی صفحهٔ قفل و اعلان گوشی.
-
نمای کوچک داخل داک است و فضای اضافه نمیگیرد؛ داک ارتفاعش را نگه میدارد.
دسترسپذیری و RTL
- پخشکننده کپی کد با نام «پخشکننده — در حال پخش/مکثشده»؛ تغییر قطعه با کپی کد مؤدب اعلام میشود.
- نوار موقعیت کپی کد بومی با کپی کد گفتاری؛ کلیدهای جهت ثانیهبهثانیه.
- کنترلهای رسانهای و نوار پیشرفت در RTL برنمیگردند (کپی کد روی همان ردیف)؛ جهت زمان است، نه جهت متن.
- هیچ پخش خودکاری نیست؛ اگر مرورگر پخش را رد کند، پخشکننده «مکثشده» میماند.
- اپیزود جاری با Badge متنی و کپی کد مشخص است، نه فقط رنگ یا میلههای متحرک.
قرارداد ARCH
- بنیان ثابت (TUK): DOM، اسلاتها (کپی کد)، کنترلها، ARIA، کیبورد، ژست و صف. هویت فقط کپی کد/کپی کد، keyframeهای کپی کد، کپی کد/کپی کد/کپی کد و توکنهای کپی کد.
- ممنوع برای تم: تغییر اندازهٔ پایه، فاصلهٔ حرکت (کپی کد)، ترتیب DOM، رنگ خام یا گرادیان.
- تستها: کپی کد (موتور، ترتیب حل، SSR، CSS) و کپی کد.