assets/creator-studio/build is generated by `npm run build`, so committing it
put a rebuilt bundle in every diff. It now follows the same deploy-only rule
as assets/admin/build.
- Root .gitignore ignores build/* and node_modules/, keeping a .gitkeep so
the directory still exists in a clean checkout.
- Drops the three tracked artifacts from the index.
- The contract test no longer requires the artifacts to exist; it checks the
set is all-or-nothing, so a clean checkout and a locally built tree both
pass. This mirrors admin-build-graph-contract.
- README documents that build/ is produced on the target machine.
887 widget-system tests pass.
The cover row carried its own hidden file input and upload call, so authors
had two different image flows in one page.
- 添加封面 now opens window.JioSubmitMedia with type=image, the same dialog
the toolbar's 图片 button uses (mine / upload / external link).
- The picked image is stored as the full-size URL plus its attachment id,
matching FrontSubmitFeatured's image branch, which re-checks ownership
and sets the post thumbnail.
- Removes the now-unused uploadCover path, apiUpload/nonce imports, and the
.jio-creator__cover-input rule.
Contract added; 887 widget-system tests pass.
Classification belongs next to everything else the author decides before
publishing, and the drawer should only configure paid resources.
- PublishSettings now renders categories, tags and custom taxonomy
dimensions first, then cover, paid content and scheduling. Chips use a
stacked row layout so long category lists wrap naturally.
- PublishDrawer keeps only PayPanel: taxonomy, save/publish buttons and the
now-unused props are gone, leaving a single 完成 button.
- New PublishDialog takes over the publish action from the bottom bar, and
with it the captcha mount point, so the gate still renders somewhere the
author can see it.
- Promotes .jio-creator-primary / .jio-creator-ghost out of the dialog-only
rules (drawer and pay panel buttons had no styling), and drops the dead
.jio-creator-field / .jio-creator-cover blocks.
Contracts updated; 886 widget-system tests pass.
The card below the writing surface only offered cover and scheduling, so
paid content could only be reached through the bottom bar's 发布 button.
- The card gains a 付费内容 row (rendered only with canPay): a toggle bound
to draft.pay.enabled, a status line that reflects whether resources were
added, and a 配置价格与付费资源 link.
- Turning the toggle on opens the publish drawer and scrolls it to the pay
section, so pricing is the next thing the author sees. Entering from the
bottom bar keeps the drawer at the top.
The drawer only had a pay toggle and one bare price field, so several
options from the front-submit pay card could not be set at all.
- New PayPanel mirrors the front-submit card: cash / points segment
(points only when the site has credits enabled), price or points with
the currency suffix, and VIP prices. VIP fields render only when the
site asks for manual VIP pricing and the level is enabled, and now
submit vip1_points / vip2_points as well.
- New ResourceDialog restores "添加资源": download URL with an attachment
picker, resource note (extraction code), copy name / value, custom
button label and button style swatches. Pasting a net-disk share link
splits the URL and the extraction code.
- pay.ts sends every download display field and tags net-disk links.
- CreatorRest exposes vipManual / vip*Enabled / vip names / pointsEnabled
/ downloadClasses / currencySymbol, and the readback carries
extractCode / copyKey / copyVal / class / attachmentId.
- Fixes an existing data loss: snapshot_from_payload dropped copy_key,
copy_val, class and attachment_id, so approving a revision erased them.
Files split to stay within budget: publish-drawer 332 lines, pay-panel
343, resource-dialog 254. 886 widget-system tests pass.
Toolbar
- New ToolMenu renders menus through a portal on body, so they are no longer
clipped by the horizontally scrolling toolbar and no longer fall back to a
native <select>. Triggers reuse .jio-creator__tool-btn geometry, fixing the
heading button's mismatched height/size/position.
- Heading / list / align / quote / hidden-content are all dropdowns.
- Lists: unordered + ordered via InsertOrderedList/InsertUnorderedList.
The TOC button is removed (it also used the wrong icon).
- Adds left / center / right alignment.
- Adds hidden content: comment / login / VIP / paid, wired to the existing
[reply], [jio_hide mode="login"], [vip] and [payshow] shortcodes.
Editor content
- Quote blocks now match the live article: full .quote_q structure, four
colour variables, and an SVG-mask quote mark that does not depend on the
Font Awesome font being present inside the iframe.
- Block math is centred on a transparent background instead of a full-width
grey bar.
- Code blocks are plain <pre><code>, identical to the article page; language
and theme selection is gone and EnlighterJS handles highlighting globally.
The classic submit editor's code modal follows the same shape.
- Hidden content reuses the .tinymce-hide structure and shows a readable label
while keeping the shortcode text in the DOM for saving.
Block deletion
- Two-step delete, WPS style: the first click only selects and highlights the
block, the second click removes it. Clicking elsewhere or Esc cancels.
Contracts updated and extended; 884 widget-system tests pass.