feat(creator-studio): centered paper layout and scheduled publishing

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
kate522andClaude Opus 5 committed 2026-11-06 21:33:40 +08:00
1 parent 384d2b7aa0
commit 7bdf7cf018
20 files changed
+549 -308

No files matched your search

+34 -31
View File
@@ -8,13 +8,13 @@
*/
import { createRoot, useCallback, useEffect, useMemo, useRef, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { __, sprintf } from '@wordpress/i18n';
import { apiPost } from './services/api';
import { PublishDrawer } from './panels/publish-drawer';
import { CoverStrip } from './components/cover-strip';
import { AuthorRow } from './components/author-row';
import { EditorToolbar } from './components/editor-toolbar';
import { PublishSettings } from './components/publish-settings';
import { AuthorRow } from './components/author-row';
import { SaveState, type SaveStateValue } from './components/save-state';
import { useAutosave } from './hooks/use-autosave';
import { useLocalRecovery } from './hooks/use-local-recovery';
@@ -48,13 +48,15 @@ type Limits = {
pointsMax?: number;
};
type Schedule = { enabled: boolean; at: string };
type Draft = {
postId: number;
versionId: number;
rev: number;
title: string;
excerpt: string;
content: string;
schedule: Schedule;
categories: number[];
tags: string[];
custom: Record<string, string[]>;
@@ -71,8 +73,8 @@ function initialDraft(): Draft {
versionId: Number(bootstrap.versionId || 0),
rev: Number(bootstrap.versionRev || 0),
title: String(bootstrap.title || ''),
excerpt: String(bootstrap.excerpt || ''),
content: String(bootstrap.content || ''),
schedule: { enabled: false, at: '' },
categories: selected.map(Number),
tags: tags.slice(),
custom: bootstrap.custom || {},
@@ -191,12 +193,15 @@ function Studio(): JSX.Element {
version_id: current.versionId,
rev: current.rev,
title: current.title,
excerpt: current.excerpt,
content: current.content,
categories: current.categories,
tags: current.tags,
custom: current.custom,
featured: current.featured,
schedule: {
enabled: !!current.schedule.enabled,
at: current.schedule.enabled ? current.schedule.at : '',
},
pay: normalizePayForRequest(current.pay),
...extra,
};
@@ -613,12 +618,7 @@ function Studio(): JSX.Element {
)}
<main className="jio-creator__canvas">
<CoverStrip
featured={draft.featured}
canEdit={!!capabilities.canUploadImage}
onOpen={() => setDrawerOpen(true)}
onClear={() => patchDraft({ featured: { type: '', data: {} } })}
/>
<AuthorRow author={bootstrap.author || {}} />
<label className="jio-creator__title">
<span className="screen-reader-text">{__('文章标题', 'jio')}</span>
@@ -626,33 +626,36 @@ function Studio(): JSX.Element {
value={draft.title}
onChange={(event) => patchDraft({ title: event.target.value })}
rows={1}
placeholder={limits.titlePlaceholder || __('请输入标题', 'jio')}
maxLength={(Number(limits.titleMax) || 30) * 4}
placeholder={sprintf(
/* translators: %d: max title length */
__('请输入标题(最多 %d 个字)', 'jio'),
Number(limits.titleMax) || 100
)}
spellCheck={false}
maxLength={Number(limits.titleMax) || 100}
/>
</label>
<label className="jio-creator__excerpt">
<span>{__('摘要(可选)', 'jio')}</span>
<textarea
value={draft.excerpt}
onChange={(event) => patchDraft({ excerpt: event.target.value })}
rows={2}
placeholder={__('一句话概括这篇文章', 'jio')}
/>
</label>
<AuthorRow author={bootstrap.author || {}} />
<div className="jio-creator__editor" data-editor-ready={editorReady ? 'true' : 'false'}>
<textarea id={EDITOR_ID} defaultValue={draft.content} onChange={(event) => updateContent(event.target.value)} aria-label={__('文章正文', 'jio')} />
</div>
<footer className="jio-creator__footer">
<span>{__('字数', 'jio')}:{charCount}</span>
<span>{__('约', 'jio')} {Math.max(1, Math.round(charCount / 400))} {__('分钟阅读', 'jio')}</span>
</footer>
</main>
<PublishSettings
featured={draft.featured}
canEditCover={!!capabilities.canUploadImage}
canSchedule={!!capabilities.canSchedule}
scheduleEnabled={!!draft.schedule.enabled}
scheduleAt={draft.schedule.at}
onFeaturedChange={(featured) => patchDraft({ featured })}
onScheduleChange={(enabled, at) => patchDraft({ schedule: { enabled, at } })}
/>
<footer className="jio-creator__footer">
<span>{__('字数', 'jio')}:{charCount}</span>
<span>{__('约', 'jio')} {Math.max(1, Math.round(charCount / 400))} {__('分钟阅读', 'jio')}</span>
</footer>
{drawerOpen && (
<PublishDrawer
draft={draft}