تغییر صفحه (Transaction)
هر تغییر صفحه در یک محصول Tokapps، شامل لینک داخلی، جستجو، و بازگشت یا پیشروی مرورگر، باید با کپی کد انجام شود. این قانون در ARCH.md بخش ۱۸ تعریف شده است.
قواعد
- تابع یکتا: کپی کد از کپی کد در همهٔ جای محصول قابل فراخوانی است: کامپوننت، hook، کد غیر React، میانبر کیبورد و داک.
- قالب میسازد: هر پروژه کپی کد خودش را در کپی کد با استفاده از قالب میسازد و در کپی کد ثبت میکند. قرارداد در TDS است؛ پروژه آن را بازتعریف نمیکند.
- فقط هنگام تغییر صفحه: روی سرور کاری نمیکند، با همان صفحه انیمیشن ندارد، و با کاهش حرکت یا نبود قالب فوراً ناوبری میکند.
- تا mount کامل صبر میکند: ورود صفحهٔ جدید فقط بعد از اعلان کپی کد شروع میشود و transaction بعد از آن تمام میشود.
- داک ثابت است: انیمیشن فقط روی کپی کد (محتوای کپی کد) اجرا میشود. داک شیشهای، TopBar و پخشکنندهٔ کوچکشدهٔ داک بیرون این عنصرند و نمیپرند.
۱. ساخت transaction در قالب
فایل کپی کد را بسازید. هر قالب فقط مرحلهها و توکنهای خودش را میدهد؛ زمان و منحنی باید نام توکن باشند تا کاهش حرکت خودکار اعمال شود.
import { keyframeTransaction, type TransactionConfig } from '@tokapps/tuk/transaction';/** هویت نمونه: محو شدن به بالا و ورود از پایین */export const transactionConfig: TransactionConfig = keyframeTransaction({ out: { duration: '--tds-dur-quick', easing: '--tds-ease-soft', keyframes: () => [{ opacity: 1, transform: 'translateY(0)' }, { opacity: 0, transform: 'translateY(-6px)' }], }, in: { duration: '--tds-dur-deliberate', easing: '--tds-ease-out', keyframes: () => [{ opacity: 0, transform: 'translateY(10px)' }, { opacity: 1, transform: 'translateY(0)' }], },});کپی کد یک تابع کپی کد است؛ برای لغزش افقی از کپی کد استفاده کنید تا جهت در راستبهچپ برعکس شود. فقط کپی کد، کپی کد و کپی کد مجازند (ARCH §۶.۱).
۲. ثبت در قالب
// theme/index.tsimport { registerTransaction } from '@tokapps/tuk/transaction';import { transactionConfig } from './transaction';export { transactionConfig } from './transaction';registerTransaction(transactionConfig);۳. اتصال ناوبری اپ
ناوبری اپ (مثلاً کپی کد در Next) را یک بار در ریشهٔ اپ وصل کنید. این اتصال باید در کلاینت باشد.
'use client';import { useEffect, type ReactNode } from 'react';import { usePathname, useRouter } from 'next/navigation';import { bindTransactionNavigator, notifyPageMounted } from '@tokapps/tuk/transaction';export function TransactionBridge({ children }: { children: ReactNode }) { const router = useRouter(); const pathname = usePathname(); useEffect(() => bindTransactionNavigator((to) => router.push(to)), [router]); // صفحه بعد از commit؛ ورود منتظر این اعلان است useEffect(() => { const frame = requestAnimationFrame(() => notifyPageMounted(pathname)); return () => cancelAnimationFrame(frame); }, [pathname]); return <>{children}</>;}ناحیهٔ محتوا باید ویژگی کپی کد داشته باشد تا انیمیشن روی آن اجرا شود:
<main id="main" data-tds-transition>{children}</main>۴. تغییر صفحه از هر جا
import { transaction } from '@tokapps/tuk/transaction';// لینک داخلی یا دکمهvoid transaction('/components/dock', 'link');// نتیجهٔ جستجو یا کدvoid transaction('/dashboard', 'programmatic');کپی کد یکی از کپی کد، کپی کد، کپی کد یا کپی کد است و در کپی کد به runner میرسد. تابع یک کپی کد برمیگرداند که بعد از mount و پایان ورود resolve میشود.
۵. رفتار هنگام خطا و لغو
| وضعیت | رفتار |
|---|---|
| ناوبری پیاپی | انتقال قبلی لغو و ناوبری آن فوراً انجام میشود؛ دو صفحه همزمان ساخته نمیشوند |
| کاهش حرکت | بدون انیمیشن، فقط ناوبری |
| قالب ثبت نشده | ناوبری فوری و یک هشدار توسعهای |
| صفحه بعد از سقف زمانی (کپی کد، پیشفرض ۳۰۰۰ms) mount نشود | ناوبری اجباری، کاربر گیر نمیکند |
| خطای runner | ناوبری انجام میشود و promise رد نمیشود |
۶. تست
تستهای کپی کد این موارد را پوشش میدهند: navigate دقیقاً یک بار، لغو با ناوبری پیاپی، کاهش حرکت، سقف زمانی، ورود بعد از mount، و عدم باقیماندن کپی کد روی محتوا.
محدودیتهای فعلی
- دکمههای بازگشت و پیشروی مرورگر هنوز به کپی کد وصل نشدهاند.
- گیت کپی کد در کپی کد ناوبری مستقیم (کپی کد، کپی کد) را هشدار میدهد، نه خطا.