- ArticleEditor: ویرایشگر TipTap v3 راستبهچسب با نوار ابزار فارسی — بولد/ایتالیک/زیرخط/خطخورده، تیتر H2/H3، لیست نقطهای/شمارهای، نقلقول، لینک (مسدودسازی javascript: با isAllowedUri)، واگرد/ازنو - درج تصویر داخل متن: دکمه آپلود، چسباندن یا کشیدن فایل — ذخیره در MinIO از طریق /api/admin/upload و درج URL نسبی /media/... - ذخیره خودکار: debounce ۸۰۰ms + flush هنگام بستن کشو - کشوی مقاله عریضتر (max-w-3xl)؛ فیلد body مقالات بهجای لیست متنی، ویرایشگر WYSIWYG رندر میکند - رندر صفحه مقاله: تبدیل سند به HTML با @tiptap/static-renderer (فقط تگهای شناختهشده — بدون ریسک XSS) + استایلهای .article-body (تیتر با خط مسی، لیست، نقلقول، تصویر) + پشتیبانی از ردیفهای قدیمی - وابستگیهای جدید: @tiptap/react، @tiptap/pm، @tiptap/starter-kit، @tiptap/extension-image، @tiptap/extension-link، @tiptap/static-renderer
38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
// انواع مشترک دادهها — همه محتوای متنی سایت از بکاند (GET /api/site) بارگذاری میشود.
|
|
|
|
export type Service = {
|
|
id: number;
|
|
title: string;
|
|
desc: string;
|
|
icon: 'draft' | 'tower' | 'mall' | 'villa' | 'renew' | 'manage' | 'invest' | 'landscape';
|
|
};
|
|
|
|
export type ProjectStatus = 'done' | 'progress';
|
|
|
|
export type Project = {
|
|
id: number;
|
|
slug: string;
|
|
title: string;
|
|
location: string;
|
|
year: string;
|
|
status: ProjectStatus;
|
|
image: string;
|
|
gallery: string[];
|
|
area: string;
|
|
floors: string;
|
|
units: string;
|
|
client: string;
|
|
summary: string;
|
|
body: string[];
|
|
};
|
|
|
|
/** سند TipTap (ProseMirror) — بدنه ساختاریافته مقاله */
|
|
export type ArticleBodyDoc = { type: 'doc'; content: unknown[] };
|
|
|
|
export type Article = {
|
|
id: number;
|
|
slug: string; title: string; date: string; category: string; image: string; read: string; excerpt: string;
|
|
/** سند TipTap — ردیفهای قدیمی ممکن است هنوز لیست پاراگراف باشند */
|
|
body: ArticleBodyDoc | string[];
|
|
};
|