fix(blog): لینک کپشن رندر عمومی را می‌کراند (اسپرد اسپک) + نوار ابزار با جابه‌جایی کرسر آپدیت شود + صفحهٔ ادیتور انگلیسی LTR

This commit is contained in:
aramesh-site deploy
2026-10-07 07:20:43 +00:00
parent 27a9a82a37
commit bd310e8d18
3 changed files with 19 additions and 9 deletions
+10 -1
View File
@@ -342,6 +342,15 @@ export function ArticleWritePage() {
// در زبان انگلیسی، فیلدهای متنی به ستون‌های _en می‌روند؛ اسلاگ/تصویر/وضعیت مشترک‌اند
const suf = <N extends string>(name: N) => `${name}${editLang === 'en' ? '_en' : ''}` as keyof Draft
// مقدار فعال فیلد دوزبانه — برای value ورودی‌ها و چک‌لیست سئو
// جهت ویرایشگر محتوایی با زبان ویرایش همگام می‌شود — صفحهٔ انگلیسی LTR بماند
useEffect(() => {
const el = document.querySelector('.article-body[data-wysiwyg="true"]')
if (el) {
el.setAttribute('dir', editLang === 'en' ? 'ltr' : 'rtl')
el.setAttribute('lang', editLang)
}
}, [editLang, createdId])
const activeVal = (name: 'title' | 'slug' | 'author' | 'seo_keyphrase' | 'meta_description' | 'excerpt'): string =>
String((editLang === 'en' ? draft[`${name}_en` as keyof Draft] : draft[name]) ?? '')
@@ -351,7 +360,7 @@ export function ArticleWritePage() {
.join(' - ')
return (
<div dir="rtl" className="min-h-screen bg-ink font-pinar text-ivory">
<div dir={editLang === 'en' ? 'ltr' : 'rtl'} className="min-h-screen bg-ink font-pinar text-ivory">
{/* نوار بالا */}
<header className="sticky top-0 z-40 border-b border-ivory/10 bg-ink/95 backdrop-blur-md">
<div className="mx-auto flex max-w-4xl items-center justify-between gap-4 px-6 py-3">
@@ -199,10 +199,13 @@ export function ArticleEditor({ doc, onChange, contentKey }: ArticleEditorProps)
extensions: ARTICLE_EXTENSIONS,
content: doc && Object.keys(doc).length ? doc : undefined,
immediatelyRender: false,
// نوار ابزار فقط با رندر دوباره روی هر تراکنش زنده می‌ماند (پیش‌فرض v3 خاموش است)
shouldRerenderOnTransaction: true,
editorProps: {
attributes: {
dir: 'rtl',
lang: 'fa',
'data-base-dir': 'rtl',
class: 'article-body min-h-[300px] px-4 py-4 focus:outline-none',
'data-wysiwyg': 'true',
},
@@ -59,19 +59,17 @@ export const ArticleImage = Image.extend({
// کپشن خالی → عنصر figcaption اصلاً رندر نمی‌شود (فقط تصویر می‌ماند)
const captionHref = (HTMLAttributes.caption_href as string | undefined)?.trim() ?? ''
const figcaption: Array<string | Record<string, unknown>> = captionHref
? [
'a',
{ href: captionHref, target: '_blank', rel: 'noopener noreferrer nofollow' },
caption,
]
: [caption]
// توجه: آرایهٔ درونی به‌صورت تو در تو پاس می‌شود — اسپرد آن اسپک را تخت می‌کند
// و رندرر استاتیک با «Unsupported DomOutputSpec» می‌میرد.
const captionSpec = captionHref
? ['a', { href: captionHref, target: '_blank', rel: 'noopener noreferrer nofollow' }, caption]
: caption
return caption
? [
'figure',
{ class: 'article-figure' },
image,
['figcaption', { class: 'article-figure__caption' }, ...figcaption],
['figcaption', { class: 'article-figure__caption' }, captionSpec],
]
: ['figure', { class: 'article-figure' }, image]
},