diff --git a/assets/creator-studio/build/index.asset.php b/assets/creator-studio/build/index.asset.php index ddffeebd..39a4b52c 100644 --- a/assets/creator-studio/build/index.asset.php +++ b/assets/creator-studio/build/index.asset.php @@ -1 +1 @@ - array('react', 'wp-element', 'wp-i18n'), 'version' => 'c9b50dfd71946ad961a9'); + array('react', 'wp-element', 'wp-i18n'), 'version' => '736777902cbeff44d3e4'); diff --git a/assets/creator-studio/build/index.css b/assets/creator-studio/build/index.css index 7622a826..8d09963c 100644 --- a/assets/creator-studio/build/index.css +++ b/assets/creator-studio/build/index.css @@ -1 +1 @@ -.jio-page-submit{background:#f6f6f6}body.jio-page-submit.has-static-nav,body.jio-page-submit.nav-fixed{padding-top:0!important}.jio-page-submit .float-btn,.jio-page-submit .footer,.jio-page-submit .footer-tabbar,.jio-page-submit .header,.jio-page-submit .jio-float-buttons{display:none!important}.jio-page-submit #main-content.container{max-width:none;padding:0}#jio-creator-studio.is-ready{display:block}.jio-creator{--jc-ink:#2b2b2b;--jc-ink-soft:#7d8683;--jc-paper:#f6f6f6;--jc-line:#e6e9e8;--jc-accent:#267665;--jc-accent-strong:#1d5f52;--jc-warn:#b4573f;--jc-top:112px;--jc-status:52px;-webkit-font-smoothing:antialiased;background:var(--jc-paper);color:var(--jc-ink);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans SC,PingFang SC,Microsoft YaHei,sans-serif;min-height:100vh;min-height:100dvh;padding-bottom:var(--jc-status);padding-top:var(--jc-top)}.jio-creator *,.jio-creator :after,.jio-creator :before{box-sizing:border-box}.jio-creator button{color:inherit;font:inherit}.jio-creator__top{background:rgba(250,251,250,.98);box-shadow:0 2px 8px rgba(27,46,39,.035);left:0;position:fixed;right:0;top:0;z-index:300}.jio-creator__masthead{align-items:center;display:flex;gap:16px;height:56px;justify-content:space-between;padding:0 clamp(14px,2.4vw,30px)}.jio-creator__masthead-left{align-items:center;display:flex;gap:10px;min-width:0}.jio-creator__back{align-items:center;border-radius:7px;color:var(--jc-ink-soft);display:inline-flex;flex:0 0 auto;height:30px;justify-content:center;text-decoration:none;width:30px}.jio-creator__back:focus-visible,.jio-creator__back:hover{background:#edf3f0;color:var(--jc-accent);outline:0}.jio-creator__brand{align-items:center;color:inherit;display:inline-flex;min-width:0;text-decoration:none}.jio-creator__brand:focus-visible{outline:2px solid rgba(38,118,101,.35);outline-offset:4px}.jio-creator__brand-logo{display:block;height:30px;max-width:168px;-o-object-fit:contain;object-fit:contain;width:auto}.jio-creator__brand-text{color:var(--jc-accent-strong);font-family:Songti SC,"Noto Serif SC","Source Han Serif SC",serif;font-size:17px;font-weight:700;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__me{align-items:center;border-radius:50%;display:inline-flex;flex:0 0 auto;justify-content:center}.jio-creator__me:focus-visible{outline:2px solid rgba(38,118,101,.5);outline-offset:2px}.jio-creator__me-avatar{background:#eef1f0;border:1px solid rgba(24,39,34,.08);border-radius:50%;display:block;height:32px;-o-object-fit:cover;object-fit:cover;overflow:hidden;width:32px}.jio-creator__me-avatar.is-placeholder{align-items:center;color:#9aa2a0;display:inline-flex;font-size:13px;justify-content:center}.jio-creator__bar{align-items:center;border-bottom:1px solid var(--jc-line);border-top:1px solid var(--jc-line);display:flex;height:56px;justify-content:center;justify-content:safe center;padding:0 clamp(14px,2.4vw,30px)}.jio-creator__toolbar-tools{align-items:center;display:flex;gap:7px;max-width:100%;min-width:0;overflow-x:auto;scrollbar-width:none}.jio-creator__toolbar-tools::-webkit-scrollbar{display:none}.jio-creator__toolbar-group{align-items:center;display:inline-flex;flex:0 0 auto;gap:2px}.jio-creator__toolbar-divider{background:var(--jc-line);flex:0 0 auto;height:22px;width:1px}.jio-creator__tool-btn{align-items:center;background:transparent;border:0;border-radius:6px;color:#5f6664;cursor:pointer;display:inline-flex;flex:0 0 auto;flex-direction:column;font-size:11px;gap:2px;height:46px;justify-content:center;line-height:1.2;min-width:40px;padding:5px 6px;width:auto}.jio-creator__tool-btn i{font-size:14px;line-height:1}.jio-creator__tool-btn:focus-visible:not(:disabled),.jio-creator__tool-btn:hover:not(:disabled){background:#f0f2f1;color:var(--jc-accent-strong);outline:0}.jio-creator__tool-btn.is-active:not(:disabled),.jio-creator__tool-btn.is-open:not(:disabled){background:#e9f1ee;color:var(--jc-accent-strong)}.jio-creator__tool-btn:disabled{color:#c7d0cc;cursor:default}.jio-creator__tool-label{max-width:52px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__tool-caret{bottom:4px;color:#b0b9b6;font-size:8px;line-height:1;position:absolute;right:3px}.jio-creator__tool-menu{display:inline-flex;flex:0 0 auto;position:relative}.jio-creator__tool-menu .jio-creator__tool-btn{position:relative}.jio-creator__menu{animation:jio-menu-in .12s ease-out;background:#fff;border:1px solid rgba(24,39,34,.06);border-radius:12px;box-shadow:0 14px 40px rgba(20,32,28,.16),0 2px 6px rgba(20,32,28,.06);display:flex;flex-direction:column;gap:2px;padding:6px;position:fixed;z-index:620}.jio-creator__menu.is-top{animation-name:jio-menu-in-up}@keyframes jio-menu-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes jio-menu-in-up{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.jio-creator__menu-item{align-items:center;background:transparent;border:0;border-radius:7px;color:#4f5957;cursor:pointer;display:flex;font:inherit;font-size:13px;gap:10px;line-height:1.4;padding:8px 10px;text-align:left;width:100%}.jio-creator__menu-item:focus-visible,.jio-creator__menu-item:hover{background:#f2f5f3;color:var(--jc-accent-strong);outline:0}.jio-creator__menu-item.is-active{background:#eef4f1;color:var(--jc-accent-strong)}.jio-creator__menu-icon{color:#8b9491;flex:0 0 16px;font-size:13px;line-height:1;text-align:center;width:16px}.jio-creator__menu-item.is-active .jio-creator__menu-icon,.jio-creator__menu-item:hover .jio-creator__menu-icon{color:currentColor}.jio-creator__menu-swatch{border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.08);flex:0 0 12px;height:12px;margin:0 2px;width:12px}.jio-creator__menu-text{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0}.jio-creator__menu-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__menu-hint{color:#9aa2a0;font-size:11px;line-height:1.3}.jio-creator__menu-check{color:var(--jc-accent);flex:0 0 auto;font-size:10px;opacity:0}.jio-creator__menu-item.is-active .jio-creator__menu-check{opacity:1}@media(prefers-reduced-motion:reduce){.jio-creator__menu{animation:none}}.jio-creator__save{align-items:center;color:var(--jc-ink-soft);display:inline-flex;flex:0 0 auto;font-size:12px;gap:6px;white-space:nowrap}.jio-creator__save>i{color:var(--jc-line);font-size:7px}.jio-creator__save time{font-variant-numeric:tabular-nums;opacity:.7}.jio-creator__save.is-saved>i{color:var(--jc-accent)}.jio-creator__save.is-conflict,.jio-creator__save.is-conflict>i,.jio-creator__save.is-error,.jio-creator__save.is-error>i{color:var(--jc-warn)}.jio-creator__notice{align-items:center;background:#f1f5f2;border-bottom:1px solid var(--jc-line);color:var(--jc-ink-soft);display:flex;font-size:13px;gap:12px;margin:0 auto;max-width:820px;padding:10px 16px}.jio-creator__notice>span{flex:1}.jio-creator__notice button{background:transparent;border:0;color:var(--jc-accent);cursor:pointer}.jio-creator__notice.is-error{background:#fdf2ee;color:var(--jc-warn)}.jio-creator__hint{color:var(--jc-ink-soft);font-size:13px;margin:18px auto 0;max-width:820px;padding:0 clamp(16px,4vw,40px)}.jio-creator__canvas{background:#fff;border-radius:4px;box-shadow:0 1px 2px rgba(24,39,34,.04),0 8px 28px rgba(24,39,34,.05);margin:40px auto 0;padding:clamp(30px,4vw,50px) clamp(28px,5vw,56px) clamp(36px,5vw,56px);width:min(900px,100% - clamp(24px,6vw,72px))}.jio-creator__title{display:block;margin-bottom:0}.jio-creator__title textarea{background:transparent;border:0;border-bottom:1px solid #eef0ef;color:#2b2b2b;font-family:inherit;font-size:clamp(26px,3vw,32px);font-weight:700;letter-spacing:.01em;line-height:1.35;min-height:46px;padding:0 0 16px;resize:none;width:100%}.jio-creator__title textarea:focus{border-bottom-color:#dfe3e1;outline:0}.jio-creator__title textarea::-moz-placeholder{color:#c3c7c5;font-weight:700}.jio-creator__title textarea::placeholder{color:#c3c7c5;font-weight:700}.jio-creator__editor{margin:22px 0 0;min-height:52vh;position:relative}.jio-creator__editor .mce-top-part,.jio-creator__editor .quicktags-toolbar,.jio-creator__editor .tox .tox-editor-header,.jio-creator__editor .tox .tox-statusbar,.jio-creator__editor .wp-editor-tabs,.jio-creator__editor .wp-media-buttons{display:none!important}.jio-creator__editor .wp-editor-container,.jio-creator__editor .wp-editor-wrap{background:transparent;border:0;box-shadow:none}.jio-creator__editor .mce-tinymce,.jio-creator__editor .tox-tinymce{background:transparent;border:0!important;box-shadow:none!important}.jio-creator__editor .mce-container-body,.jio-creator__editor .mce-edit-area,.jio-creator__editor .tox .tox-edit-area{background:transparent;border:0!important}.jio-creator__editor .mce-edit-area iframe,.jio-creator__editor .tox .tox-edit-area__iframe{min-height:52vh;overflow:hidden}.jio-creator__editor textarea{background:transparent;border:0;color:#2b2b2b;font:inherit;font-size:16px;line-height:1.8;min-height:52vh;padding:0;resize:vertical;width:100%}.jio-creator__editor textarea::-moz-placeholder{color:#b9bfbc}.jio-creator__editor textarea::placeholder{color:#b9bfbc}.jio-creator__settings{background:#fff;border-radius:4px;box-shadow:0 1px 2px rgba(24,39,34,.04),0 8px 28px rgba(24,39,34,.05);margin:20px auto clamp(48px,10vh,140px);padding:clamp(20px,3vw,28px) clamp(24px,4vw,40px);width:min(900px,100% - clamp(24px,6vw,72px))}.jio-creator__settings-title{color:#2b2b2b;font-size:15px;font-weight:600;margin:0 0 4px}.jio-creator__setting-row{align-items:center;border-bottom:1px solid #f2f4f3;display:flex;gap:20px;justify-content:space-between;padding:16px 0}.jio-creator__setting-row:last-of-type{border-bottom:0}.jio-creator__setting-copy{min-width:0}.jio-creator__setting-label{color:#2b2b2b;display:block;font-size:14px;font-weight:500}.jio-creator__setting-help{color:#9aa2a0;font-size:12px;line-height:1.6;margin:4px 0 0}.jio-creator__cover-control{align-items:center;display:flex;flex:0 0 auto;gap:8px;position:relative}.jio-creator__cover-input{height:1px;opacity:0;overflow:hidden;pointer-events:none;position:absolute;width:1px}.jio-creator__cover-add{align-items:center;background:transparent;border:1px dashed #d8dedb;border-radius:6px;color:#7c8683;cursor:pointer;display:inline-flex;font-size:13px;gap:7px;min-height:34px;padding:0 14px}.jio-creator__cover-add:focus-visible:not(:disabled),.jio-creator__cover-add:hover:not(:disabled){border-color:var(--jc-accent);color:var(--jc-accent-strong);outline:0}.jio-creator__cover-add:disabled{cursor:default;opacity:.6}.jio-creator__cover-preview{background:#eef1f0;border:0;border-radius:6px;cursor:pointer;display:block;height:63px;overflow:hidden;padding:0;width:112px}.jio-creator__cover-preview img{display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.jio-creator__cover-preview:focus-visible{outline:2px solid var(--jc-accent);outline-offset:2px}.jio-creator__cover-clear{align-items:center;background:transparent;border:0;border-radius:50%;color:#98a19e;cursor:pointer;display:inline-flex;height:26px;justify-content:center;width:26px}.jio-creator__cover-clear:focus-visible,.jio-creator__cover-clear:hover{background:#f3f5f4;color:var(--jc-warn);outline:0}.jio-creator__schedule{align-items:center;display:flex;flex-wrap:wrap;gap:12px;padding:4px 0 18px}.jio-creator__schedule label{align-items:center;color:#6f7875;display:inline-flex;font-size:13px;gap:10px}.jio-creator__schedule input[type=datetime-local]{background:#fff;border:1px solid #e3e7e5;border-radius:6px;color:#2b2b2b;font:inherit;font-size:13px;height:36px;padding:0 10px}.jio-creator__schedule .jio-creator-muted{flex:1 1 100%}.jio-creator-drawer{display:flex;inset:0;justify-content:flex-end;position:fixed;z-index:500}.jio-creator-drawer__backdrop{background:rgba(23,34,31,.32);border:0;cursor:default;inset:0;position:absolute}.jio-creator-drawer__panel{background:#fff;box-shadow:-20px 0 60px rgba(20,32,28,.16);display:flex;flex-direction:column;height:100%;position:relative;width:min(460px,100%)}.jio-creator-drawer__head{align-items:center;border-bottom:1px solid #e6e9e8;display:flex;justify-content:space-between;padding:20px 24px}.jio-creator-drawer__head h2{font-size:17px;font-weight:600;margin:0}.jio-creator-drawer__close{background:transparent;border:0;color:#7d8683;cursor:pointer}.jio-creator-drawer__body{flex:1;overflow-y:auto;padding:20px 24px 32px}.jio-creator-drawer__note{background:#f2f7f4;border-left:3px solid #267665;color:#7d8683;font-size:13px;line-height:1.6;margin:0 0 20px;padding:12px 14px}.jio-creator-drawer__foot{background:#fff;border-top:1px solid #e6e9e8;display:flex;flex-direction:column;gap:12px;padding:16px 24px calc(16px + env(safe-area-inset-bottom))}.jio-creator-drawer__foot .jio-creator-primary{flex:1}.jio-creator-drawer__actions{align-items:center;display:flex;gap:12px}.jio-creator-drawer__captcha{min-height:40px}.jio-creator-field{margin-bottom:26px}.jio-creator-field>h3{color:#2b2b2b;font-size:13px;font-weight:600;margin:0 0 10px}.jio-creator-muted{color:#7d8683;font-size:12px;line-height:1.6;margin:0}.jio-creator-error{color:#b4573f;font-size:12px;margin:8px 0 0}.jio-creator-chips{display:flex;flex-wrap:wrap;gap:8px}.jio-creator-chip{align-items:center;border:1px solid #e6e9e8;border-radius:999px;color:#7d8683;cursor:pointer;display:inline-flex;font-size:13px;gap:6px;padding:5px 12px}.jio-creator-chip input{clip:rect(0,0,0,0);height:1px;overflow:hidden;position:absolute;width:1px}.jio-creator-chip.is-active{background:#eef5f2;border-color:#267665;color:#1d5f52}.jio-creator-chip button{background:transparent;border:0;color:inherit;cursor:pointer}.jio-creator-inline{display:flex;gap:8px;margin-top:10px}.jio-creator-inline input:not([type]),.jio-creator-inline input[type=text]{border:1px solid #e6e9e8;border-radius:8px;flex:1;height:36px;min-width:0;padding:0 12px}.jio-creator-inline label{align-items:center;display:inline-flex;font-size:13px;gap:6px}.jio-creator-switch{align-items:flex-start;display:flex;gap:16px;justify-content:space-between}.jio-creator-switch h3{font-size:13px;margin:0 0 4px}.jio-creator-toggle{flex:0 0 auto;position:relative}.jio-creator-toggle input{height:1px;opacity:0;position:absolute;width:1px}.jio-creator-toggle span{background:#d6dfda;border-radius:999px;display:block;height:24px;transition:background .18s ease;width:42px}.jio-creator-toggle span:after{background:#fff;border-radius:50%;content:"";display:block;height:18px;margin:3px;transition:transform .18s ease;width:18px}.jio-creator-toggle input:checked+span{background:#267665}.jio-creator-toggle input:checked+span:after{transform:translateX(18px)}.jio-creator-toggle input:focus-visible+span{outline:2px solid #267665;outline-offset:2px}.jio-creator-pay{background:#fcfdfc;border:1px solid #e6e9e8;border-radius:10px;margin-top:16px;padding:16px}.jio-creator-input{align-items:center;display:flex;font-size:13px;gap:12px;justify-content:space-between;margin-top:12px}.jio-creator-input input{border:1px solid #e6e9e8;border-radius:8px;height:36px;padding:0 12px;text-align:right;width:140px}.jio-creator-cover{border-radius:10px;overflow:hidden;position:relative}.jio-creator-cover img{aspect-ratio:2/1;display:block;-o-object-fit:cover;object-fit:cover;width:100%}.jio-creator-cover button{background:rgba(0,0,0,.55);border:0;border-radius:50%;color:#fff;cursor:pointer;height:30px;position:absolute;right:8px;top:8px;width:30px}.jio-creator-cover-empty{align-items:center;background:#fafcfb;border:1px dashed #e6e9e8;border-radius:10px;color:#7d8683;cursor:pointer;display:flex;flex-direction:column;font-size:13px;gap:8px;justify-content:center;min-height:120px}.jio-creator-cover-empty input{height:1px;opacity:0;position:absolute;width:1px}.jio-creator-attachments{border-top:1px solid #e6e9e8;margin-top:18px;padding-top:16px}.jio-creator-attachments__head{align-items:center;display:flex;gap:12px;justify-content:space-between}.jio-creator-attachments__head h4{font-size:13px;margin:0}.jio-creator-upload{align-items:center;border:1px solid #e6e9e8;border-radius:8px;color:#1d5f52;cursor:pointer;display:inline-flex;font-size:12px;min-height:32px;padding:0 12px}.jio-creator-upload input{height:1px;opacity:0;position:absolute;width:1px}.jio-creator-files{list-style:none;margin:12px 0 0;padding:0}.jio-creator-files li{align-items:center;border-bottom:1px solid #f0f4f1;display:flex;font-size:13px;gap:10px;padding:8px 0}.jio-creator-files button{background:transparent;border:0;color:#7d8683;cursor:pointer;margin-left:auto}.jio-creator-files__name{align-items:center;display:inline-flex;gap:8px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator-files__name i{color:#267665}.jio-creator-reuse{font-size:13px;margin-top:14px}.jio-creator-reuse summary{color:#7d8683;cursor:pointer}.jio-creator-reuse ul{list-style:none;margin:10px 0 0;padding:0}.jio-creator-reuse li{align-items:center;display:flex;gap:10px;padding:6px 0}.jio-creator-reuse button{background:#fff;border:1px solid #e6e9e8;border-radius:6px;cursor:pointer;margin-left:auto}.jio-creator-link{background:transparent;border:0;color:var(--jc-ink-soft,#7d8683);cursor:pointer;font-size:13px;text-decoration:underline}.jio-creator-dialog{align-items:center;display:flex;inset:0;justify-content:center;padding:20px;position:fixed;z-index:560}.jio-creator-dialog__backdrop{background:rgba(23,34,31,.34);border:0;cursor:default;inset:0;position:absolute}.jio-creator-dialog__panel{background:#fff;border-radius:14px;box-shadow:0 24px 70px rgba(20,32,28,.22);display:flex;flex-direction:column;max-height:min(82vh,640px);overflow:hidden;position:relative;width:min(460px,100%)}.jio-creator-dialog__head{align-items:center;border-bottom:1px solid #eef1f0;display:flex;justify-content:space-between;padding:18px 20px 12px}.jio-creator-dialog__head h2{font-size:16px;font-weight:600;margin:0}.jio-creator-dialog__close{align-items:center;background:transparent;border:0;border-radius:50%;color:#7d8683;cursor:pointer;display:inline-flex;height:30px;justify-content:center;width:30px}.jio-creator-dialog__close:focus-visible,.jio-creator-dialog__close:hover{background:#f2f5f3;outline:0}.jio-creator-dialog__body{display:flex;flex:1;flex-direction:column;gap:14px;overflow-y:auto;padding:18px 20px 20px}.jio-creator-dialog__row{display:flex;gap:14px}.jio-creator-dialog__row label{flex:1}.jio-creator-dialog__field,.jio-creator-dialog__row label{display:flex;flex-direction:column;gap:6px}.jio-creator-dialog__field>span,.jio-creator-dialog__row label>span{color:#6f7875;font-size:12px}.jio-creator-dialog__field input,.jio-creator-dialog__field select,.jio-creator-dialog__row input{background:#fff;border:1px solid #e3e7e5;border-radius:8px;color:#2b2b2b;font:inherit;font-size:14px;height:38px;padding:0 10px}.jio-creator-dialog__field textarea{background:#fff;border:1px solid #e3e7e5;border-radius:8px;color:#2b2b2b;font:inherit;font-size:14px;line-height:1.7;padding:10px;resize:vertical;width:100%}.jio-creator-dialog__field textarea:focus{outline:2px solid rgba(38,118,101,.25);outline-offset:-1px}.jio-creator-dialog__check{align-items:center;color:#4f5957;cursor:pointer;display:inline-flex;font-size:13px;gap:8px}.jio-creator-dialog__check input{accent-color:var(--jc-accent);cursor:pointer;height:15px;width:15px}.jio-creator-dialog__foot{background:#fff;border-top:1px solid #eef1f0;display:flex;gap:10px;justify-content:flex-end;padding:14px 20px calc(14px + env(safe-area-inset-bottom))}.jio-creator-dialog__ghost,.jio-creator-dialog__primary{align-items:center;border-radius:8px;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;min-height:36px;padding:0 16px}.jio-creator-dialog__ghost{background:#fff;border:1px solid #e3e7e5;color:#5f6664}.jio-creator-dialog__ghost:focus-visible,.jio-creator-dialog__ghost:hover{border-color:#b7cdc3;outline:0}.jio-creator-dialog__primary{background:var(--jc-accent);border:1px solid transparent;color:#fff}.jio-creator-dialog__primary:focus-visible:not(:disabled),.jio-creator-dialog__primary:hover:not(:disabled){background:var(--jc-accent-strong);outline:0}.jio-creator-dialog__primary:disabled{cursor:not-allowed;opacity:.5}.jio-creator__status{align-items:center;background:hsla(0,0%,100%,.97);border-top:1px solid #e6e9e8;bottom:0;box-shadow:0 -2px 10px rgba(24,39,34,.04);color:#7d8683;display:flex;font-size:12px;gap:16px;height:var(--jc-status);left:0;padding:0 clamp(14px,2.4vw,28px) env(safe-area-inset-bottom);position:fixed;right:0;z-index:310}.jio-creator__status-actions,.jio-creator__status-left,.jio-creator__status-meta{align-items:center;display:flex;gap:10px;min-width:0}.jio-creator__status-count{color:#4f5957;font-variant-numeric:tabular-nums}.jio-creator__status-mode{color:#a3aca9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__status-meta{color:#93a09b}.jio-creator__status-meta .jio-creator__save{font-size:12px}.jio-creator__status-dot{color:#c9d1ce}.jio-creator__status-actions{gap:8px;margin-left:auto}.jio-creator__status-ghost,.jio-creator__status-primary{align-items:center;border-radius:7px;cursor:pointer;display:inline-flex;font-size:13px;justify-content:center;min-height:32px;padding:0 14px;white-space:nowrap}.jio-creator__status-ghost{background:#fff;border:1px solid #e3e7e5;color:#5f6664}.jio-creator__status-ghost:focus-visible:not(:disabled),.jio-creator__status-ghost:hover:not(:disabled){border-color:#b7cdc3;color:var(--jc-accent-strong);outline:0}.jio-creator__status-ghost:disabled{cursor:default;opacity:.55}.jio-creator__status-primary{background:var(--jc-accent);border:1px solid transparent;color:#fff}.jio-creator__status-primary:focus-visible:not(:disabled),.jio-creator__status-primary:hover:not(:disabled){background:var(--jc-accent-strong);outline:0}.jio-creator__status-primary:disabled{cursor:default;opacity:.55}@media(max-width:767px){.jio-creator__status{gap:8px;height:56px;padding:0 10px env(safe-area-inset-bottom)}.jio-creator__status-meta,.jio-creator__status-mode{display:none}.jio-creator__status-ghost{padding:0 10px}.jio-creator__status-primary{padding:0 12px}.jio-creator{--jc-top:102px}.jio-creator__masthead{height:50px;padding:0 10px}.jio-creator__brand-logo{height:26px;max-width:128px}.jio-creator__brand-text{font-size:15px}.jio-creator__me-avatar{height:28px;width:28px}.jio-creator__bar{height:52px;padding:0 8px}.jio-creator__toolbar-tools{gap:4px}.jio-creator__toolbar-group{gap:0}.jio-creator__tool-btn{min-width:36px;padding:4px}.jio-creator__tool-btn i{font-size:13px}.jio-creator__tool-label{font-size:10px;max-width:42px}.jio-creator__canvas{margin:14px auto 0;padding:22px 18px 28px;width:calc(100% - 20px)}.jio-creator__settings{margin:12px auto calc(24px + env(safe-area-inset-bottom));padding:18px;width:calc(100% - 20px)}.jio-creator__setting-row{gap:12px}.jio-creator__title textarea{font-size:24px}.jio-creator__editor .mce-edit-area iframe,.jio-creator__editor .tox .tox-edit-area__iframe{min-height:48vh}.jio-creator-drawer{display:block}.jio-creator-drawer__backdrop{display:none}.jio-creator-drawer__panel{border-radius:0;box-shadow:none;height:100dvh;width:100%}.jio-creator-drawer__foot{background:#fff;bottom:0;position:sticky}}@media(prefers-reduced-motion:reduce){.jio-creator *{animation:none!important;transition:none!important}} +.jio-page-submit{background:#f6f6f6}body.jio-page-submit.has-static-nav,body.jio-page-submit.nav-fixed{padding-top:0!important}.jio-page-submit .float-btn,.jio-page-submit .footer,.jio-page-submit .footer-tabbar,.jio-page-submit .header,.jio-page-submit .jio-float-buttons{display:none!important}.jio-page-submit #main-content.container{max-width:none;padding:0}#jio-creator-studio.is-ready{display:block}.jio-creator{--jc-ink:#2b2b2b;--jc-ink-soft:#7d8683;--jc-paper:#f6f6f6;--jc-line:#e6e9e8;--jc-accent:#267665;--jc-accent-strong:#1d5f52;--jc-warn:#b4573f;--jc-top:112px;--jc-status:52px;-webkit-font-smoothing:antialiased;background:var(--jc-paper);color:var(--jc-ink);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans SC,PingFang SC,Microsoft YaHei,sans-serif;min-height:100vh;min-height:100dvh;padding-bottom:var(--jc-status);padding-top:var(--jc-top)}.jio-creator *,.jio-creator :after,.jio-creator :before{box-sizing:border-box}.jio-creator button{color:inherit;font:inherit}.jio-creator__top{background:rgba(250,251,250,.98);box-shadow:0 2px 8px rgba(27,46,39,.035);left:0;position:fixed;right:0;top:0;z-index:300}.jio-creator__masthead{align-items:center;display:flex;gap:16px;height:56px;justify-content:space-between;padding:0 clamp(14px,2.4vw,30px)}.jio-creator__masthead-left{align-items:center;display:flex;gap:10px;min-width:0}.jio-creator__back{align-items:center;border-radius:7px;color:var(--jc-ink-soft);display:inline-flex;flex:0 0 auto;height:30px;justify-content:center;text-decoration:none;width:30px}.jio-creator__back:focus-visible,.jio-creator__back:hover{background:#edf3f0;color:var(--jc-accent);outline:0}.jio-creator__brand{align-items:center;color:inherit;display:inline-flex;min-width:0;text-decoration:none}.jio-creator__brand:focus-visible{outline:2px solid rgba(38,118,101,.35);outline-offset:4px}.jio-creator__brand-logo{display:block;height:30px;max-width:168px;-o-object-fit:contain;object-fit:contain;width:auto}.jio-creator__brand-text{color:var(--jc-accent-strong);font-family:Songti SC,"Noto Serif SC","Source Han Serif SC",serif;font-size:17px;font-weight:700;letter-spacing:-.01em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__me{align-items:center;border-radius:50%;display:inline-flex;flex:0 0 auto;justify-content:center}.jio-creator__me:focus-visible{outline:2px solid rgba(38,118,101,.5);outline-offset:2px}.jio-creator__me-avatar{background:#eef1f0;border:1px solid rgba(24,39,34,.08);border-radius:50%;display:block;height:32px;-o-object-fit:cover;object-fit:cover;overflow:hidden;width:32px}.jio-creator__me-avatar.is-placeholder{align-items:center;color:#9aa2a0;display:inline-flex;font-size:13px;justify-content:center}.jio-creator__bar{align-items:center;border-bottom:1px solid var(--jc-line);border-top:1px solid var(--jc-line);display:flex;height:56px;justify-content:center;justify-content:safe center;padding:0 clamp(14px,2.4vw,30px)}.jio-creator__toolbar-tools{align-items:center;display:flex;gap:7px;max-width:100%;min-width:0;overflow-x:auto;scrollbar-width:none}.jio-creator__toolbar-tools::-webkit-scrollbar{display:none}.jio-creator__toolbar-group{align-items:center;display:inline-flex;flex:0 0 auto;gap:2px}.jio-creator__toolbar-divider{background:var(--jc-line);flex:0 0 auto;height:22px;width:1px}.jio-creator__tool-btn{align-items:center;background:transparent;border:0;border-radius:6px;color:#5f6664;cursor:pointer;display:inline-flex;flex:0 0 auto;flex-direction:column;font-size:11px;gap:2px;height:46px;justify-content:center;line-height:1.2;min-width:40px;padding:5px 6px;width:auto}.jio-creator__tool-btn i{font-size:14px;line-height:1}.jio-creator__tool-btn:focus-visible:not(:disabled),.jio-creator__tool-btn:hover:not(:disabled){background:#f0f2f1;color:var(--jc-accent-strong);outline:0}.jio-creator__tool-btn.is-active:not(:disabled),.jio-creator__tool-btn.is-open:not(:disabled){background:#e9f1ee;color:var(--jc-accent-strong)}.jio-creator__tool-btn:disabled{color:#c7d0cc;cursor:default}.jio-creator__tool-label{max-width:52px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__tool-caret{bottom:4px;color:#b0b9b6;font-size:8px;line-height:1;position:absolute;right:3px}.jio-creator__tool-menu{display:inline-flex;flex:0 0 auto;position:relative}.jio-creator__tool-menu .jio-creator__tool-btn{position:relative}.jio-creator__menu{animation:jio-menu-in .12s ease-out;background:#fff;border:1px solid rgba(24,39,34,.06);border-radius:12px;box-shadow:0 14px 40px rgba(20,32,28,.16),0 2px 6px rgba(20,32,28,.06);display:flex;flex-direction:column;gap:2px;padding:6px;position:fixed;z-index:620}.jio-creator__menu.is-top{animation-name:jio-menu-in-up}@keyframes jio-menu-in{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}@keyframes jio-menu-in-up{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.jio-creator__menu-item{align-items:center;background:transparent;border:0;border-radius:7px;color:#4f5957;cursor:pointer;display:flex;font:inherit;font-size:13px;gap:10px;line-height:1.4;padding:8px 10px;text-align:left;width:100%}.jio-creator__menu-item:focus-visible,.jio-creator__menu-item:hover{background:#f2f5f3;color:var(--jc-accent-strong);outline:0}.jio-creator__menu-item.is-active{background:#eef4f1;color:var(--jc-accent-strong)}.jio-creator__menu-icon{color:#8b9491;flex:0 0 16px;font-size:13px;line-height:1;text-align:center;width:16px}.jio-creator__menu-item.is-active .jio-creator__menu-icon,.jio-creator__menu-item:hover .jio-creator__menu-icon{color:currentColor}.jio-creator__menu-swatch{border-radius:50%;box-shadow:inset 0 0 0 1px rgba(0,0,0,.08);flex:0 0 12px;height:12px;margin:0 2px;width:12px}.jio-creator__menu-text{display:flex;flex:1;flex-direction:column;gap:1px;min-width:0}.jio-creator__menu-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__menu-hint{color:#9aa2a0;font-size:11px;line-height:1.3}.jio-creator__menu-check{color:var(--jc-accent);flex:0 0 auto;font-size:10px;opacity:0}.jio-creator__menu-item.is-active .jio-creator__menu-check{opacity:1}@media(prefers-reduced-motion:reduce){.jio-creator__menu{animation:none}}.jio-creator__save{align-items:center;color:var(--jc-ink-soft);display:inline-flex;flex:0 0 auto;font-size:12px;gap:6px;white-space:nowrap}.jio-creator__save>i{color:var(--jc-line);font-size:7px}.jio-creator__save time{font-variant-numeric:tabular-nums;opacity:.7}.jio-creator__save.is-saved>i{color:var(--jc-accent)}.jio-creator__save.is-conflict,.jio-creator__save.is-conflict>i,.jio-creator__save.is-error,.jio-creator__save.is-error>i{color:var(--jc-warn)}.jio-creator__notice{align-items:center;background:#f1f5f2;border-bottom:1px solid var(--jc-line);color:var(--jc-ink-soft);display:flex;font-size:13px;gap:12px;margin:0 auto;max-width:820px;padding:10px 16px}.jio-creator__notice>span{flex:1}.jio-creator__notice button{background:transparent;border:0;color:var(--jc-accent);cursor:pointer}.jio-creator__notice.is-error{background:#fdf2ee;color:var(--jc-warn)}.jio-creator__hint{color:var(--jc-ink-soft);font-size:13px;margin:18px auto 0;max-width:820px;padding:0 clamp(16px,4vw,40px)}.jio-creator__canvas{background:#fff;border-radius:4px;box-shadow:0 1px 2px rgba(24,39,34,.04),0 8px 28px rgba(24,39,34,.05);margin:40px auto 0;padding:clamp(30px,4vw,50px) clamp(28px,5vw,56px) clamp(36px,5vw,56px);width:min(900px,100% - clamp(24px,6vw,72px))}.jio-creator__title{display:block;margin-bottom:0}.jio-creator__title textarea{background:transparent;border:0;border-bottom:1px solid #eef0ef;color:#2b2b2b;font-family:inherit;font-size:clamp(26px,3vw,32px);font-weight:700;letter-spacing:.01em;line-height:1.35;min-height:46px;padding:0 0 16px;resize:none;width:100%}.jio-creator__title textarea:focus{border-bottom-color:#dfe3e1;outline:0}.jio-creator__title textarea::-moz-placeholder{color:#c3c7c5;font-weight:700}.jio-creator__title textarea::placeholder{color:#c3c7c5;font-weight:700}.jio-creator__editor{margin:22px 0 0;min-height:52vh;position:relative}.jio-creator__editor .mce-top-part,.jio-creator__editor .quicktags-toolbar,.jio-creator__editor .tox .tox-editor-header,.jio-creator__editor .tox .tox-statusbar,.jio-creator__editor .wp-editor-tabs,.jio-creator__editor .wp-media-buttons{display:none!important}.jio-creator__editor .wp-editor-container,.jio-creator__editor .wp-editor-wrap{background:transparent;border:0;box-shadow:none}.jio-creator__editor .mce-tinymce,.jio-creator__editor .tox-tinymce{background:transparent;border:0!important;box-shadow:none!important}.jio-creator__editor .mce-container-body,.jio-creator__editor .mce-edit-area,.jio-creator__editor .tox .tox-edit-area{background:transparent;border:0!important}.jio-creator__editor .mce-edit-area iframe,.jio-creator__editor .tox .tox-edit-area__iframe{min-height:52vh;overflow:hidden}.jio-creator__editor textarea{background:transparent;border:0;color:#2b2b2b;font:inherit;font-size:16px;line-height:1.8;min-height:52vh;padding:0;resize:vertical;width:100%}.jio-creator__editor textarea::-moz-placeholder{color:#b9bfbc}.jio-creator__editor textarea::placeholder{color:#b9bfbc}.jio-creator__settings{background:#fff;border-radius:4px;box-shadow:0 1px 2px rgba(24,39,34,.04),0 8px 28px rgba(24,39,34,.05);margin:20px auto clamp(48px,10vh,140px);padding:clamp(20px,3vw,28px) clamp(24px,4vw,40px);width:min(900px,100% - clamp(24px,6vw,72px))}.jio-creator__settings-title{color:#2b2b2b;font-size:15px;font-weight:600;margin:0 0 4px}.jio-creator__setting-row{align-items:center;border-bottom:1px solid #f2f4f3;display:flex;gap:20px;justify-content:space-between;padding:16px 0}.jio-creator__setting-row:last-of-type{border-bottom:0}.jio-creator__setting-copy{min-width:0}.jio-creator__setting-label{color:#2b2b2b;display:block;font-size:14px;font-weight:500}.jio-creator__setting-help{color:#9aa2a0;font-size:12px;line-height:1.6;margin:4px 0 0}.jio-creator__cover-control{align-items:center;display:flex;flex:0 0 auto;gap:8px;position:relative}.jio-creator__cover-input{height:1px;opacity:0;overflow:hidden;pointer-events:none;position:absolute;width:1px}.jio-creator__cover-add{align-items:center;background:transparent;border:1px dashed #d8dedb;border-radius:6px;color:#7c8683;cursor:pointer;display:inline-flex;font-size:13px;gap:7px;min-height:34px;padding:0 14px}.jio-creator__cover-add:focus-visible:not(:disabled),.jio-creator__cover-add:hover:not(:disabled){border-color:var(--jc-accent);color:var(--jc-accent-strong);outline:0}.jio-creator__cover-add:disabled{cursor:default;opacity:.6}.jio-creator__cover-preview{background:#eef1f0;border:0;border-radius:6px;cursor:pointer;display:block;height:63px;overflow:hidden;padding:0;width:112px}.jio-creator__cover-preview img{display:block;height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.jio-creator__cover-preview:focus-visible{outline:2px solid var(--jc-accent);outline-offset:2px}.jio-creator__cover-clear{align-items:center;background:transparent;border:0;border-radius:50%;color:#98a19e;cursor:pointer;display:inline-flex;height:26px;justify-content:center;width:26px}.jio-creator__cover-clear:focus-visible,.jio-creator__cover-clear:hover{background:#f3f5f4;color:var(--jc-warn);outline:0}.jio-creator__schedule{align-items:center;display:flex;flex-wrap:wrap;gap:12px;padding:4px 0 18px}.jio-creator__schedule label{align-items:center;color:#6f7875;display:inline-flex;font-size:13px;gap:10px}.jio-creator__schedule input[type=datetime-local]{background:#fff;border:1px solid #e3e7e5;border-radius:6px;color:#2b2b2b;font:inherit;font-size:13px;height:36px;padding:0 10px}.jio-creator__schedule .jio-creator-muted{flex:1 1 100%}.jio-creator-drawer{display:flex;inset:0;justify-content:flex-end;position:fixed;z-index:500}.jio-creator-drawer__backdrop{background:rgba(23,34,31,.32);border:0;cursor:default;inset:0;position:absolute}.jio-creator-drawer__panel{background:#fff;box-shadow:-20px 0 60px rgba(20,32,28,.16);display:flex;flex-direction:column;height:100%;position:relative;width:min(460px,100%)}.jio-creator-drawer__head{align-items:center;border-bottom:1px solid #e6e9e8;display:flex;justify-content:space-between;padding:20px 24px}.jio-creator-drawer__head h2{font-size:17px;font-weight:600;margin:0}.jio-creator-drawer__close{background:transparent;border:0;color:#7d8683;cursor:pointer}.jio-creator-drawer__body{flex:1;overflow-y:auto;padding:20px 24px 32px}.jio-creator-drawer__note{background:#f2f7f4;border-left:3px solid #267665;color:#7d8683;font-size:13px;line-height:1.6;margin:0 0 20px;padding:12px 14px}.jio-creator-drawer__foot{background:#fff;border-top:1px solid #e6e9e8;display:flex;flex-direction:column;gap:12px;padding:16px 24px calc(16px + env(safe-area-inset-bottom))}.jio-creator-drawer__foot .jio-creator-primary{flex:1}.jio-creator-drawer__actions{align-items:center;display:flex;gap:12px}.jio-creator-drawer__captcha{min-height:40px}.jio-creator-field{margin-bottom:26px}.jio-creator-field>h3{color:#2b2b2b;font-size:13px;font-weight:600;margin:0 0 10px}.jio-creator-muted{color:#7d8683;font-size:12px;line-height:1.6;margin:0}.jio-creator-error{color:#b4573f;font-size:12px;margin:8px 0 0}.jio-creator-chips{display:flex;flex-wrap:wrap;gap:8px}.jio-creator-chip{align-items:center;border:1px solid #e6e9e8;border-radius:999px;color:#7d8683;cursor:pointer;display:inline-flex;font-size:13px;gap:6px;padding:5px 12px}.jio-creator-chip input{clip:rect(0,0,0,0);height:1px;overflow:hidden;position:absolute;width:1px}.jio-creator-chip.is-active{background:#eef5f2;border-color:#267665;color:#1d5f52}.jio-creator-chip button{background:transparent;border:0;color:inherit;cursor:pointer}.jio-creator-inline{display:flex;gap:8px;margin-top:10px}.jio-creator-inline input:not([type]),.jio-creator-inline input[type=text]{border:1px solid #e6e9e8;border-radius:8px;flex:1;height:36px;min-width:0;padding:0 12px}.jio-creator-inline label{align-items:center;display:inline-flex;font-size:13px;gap:6px}.jio-creator-switch{align-items:flex-start;display:flex;gap:16px;justify-content:space-between}.jio-creator-switch h3{font-size:13px;margin:0 0 4px}.jio-creator-toggle{flex:0 0 auto;position:relative}.jio-creator-toggle input{height:1px;opacity:0;position:absolute;width:1px}.jio-creator-toggle span{background:#d6dfda;border-radius:999px;display:block;height:24px;transition:background .18s ease;width:42px}.jio-creator-toggle span:after{background:#fff;border-radius:50%;content:"";display:block;height:18px;margin:3px;transition:transform .18s ease;width:18px}.jio-creator-toggle input:checked+span{background:#267665}.jio-creator-toggle input:checked+span:after{transform:translateX(18px)}.jio-creator-toggle input:focus-visible+span{outline:2px solid #267665;outline-offset:2px}.jio-creator-pay{background:#fcfdfc;border:1px solid #e6e9e8;border-radius:10px;margin-top:16px;padding:16px}.jio-creator-input{align-items:center;display:flex;font-size:13px;gap:12px;justify-content:space-between;margin-top:12px}.jio-creator-input input{border:1px solid #e6e9e8;border-radius:8px;height:36px;padding:0 12px;text-align:right;width:140px}.jio-creator-price{align-items:center;color:#7d8683;display:inline-flex;gap:4px}.jio-creator-price em{font-size:12px;font-style:normal}.jio-creator-price input{width:118px}.jio-creator-segment{background:#eef1f0;border-radius:9px;display:inline-flex;gap:4px;margin-bottom:4px;padding:3px}.jio-creator-segment button{background:transparent;border:0;border-radius:7px;color:#7d8683;cursor:pointer;font-size:13px;min-height:30px;padding:0 14px}.jio-creator-segment button:hover{color:#1d5f52}.jio-creator-segment button.is-active{background:#fff;box-shadow:0 1px 3px rgba(24,39,34,.1);color:#1d5f52}.jio-creator-vip-prices{border-top:1px dashed #e6e9e8;margin-top:4px;padding-top:6px}.jio-creator-cover{border-radius:10px;overflow:hidden;position:relative}.jio-creator-cover img{aspect-ratio:2/1;display:block;-o-object-fit:cover;object-fit:cover;width:100%}.jio-creator-cover button{background:rgba(0,0,0,.55);border:0;border-radius:50%;color:#fff;cursor:pointer;height:30px;position:absolute;right:8px;top:8px;width:30px}.jio-creator-cover-empty{align-items:center;background:#fafcfb;border:1px dashed #e6e9e8;border-radius:10px;color:#7d8683;cursor:pointer;display:flex;flex-direction:column;font-size:13px;gap:8px;justify-content:center;min-height:120px}.jio-creator-cover-empty input{height:1px;opacity:0;position:absolute;width:1px}.jio-creator-attachments{border-top:1px solid #e6e9e8;margin-top:18px;padding-top:16px}.jio-creator-attachments__head{align-items:flex-start;display:flex;gap:12px;justify-content:space-between}.jio-creator-attachments__head h4{font-size:13px;margin:0 0 2px}.jio-creator-attachments__head .jio-creator-muted{margin:0}.jio-creator-attachments__actions{align-items:center;display:inline-flex;flex:0 0 auto;gap:8px}.jio-creator-upload{align-items:center;border:1px solid #e6e9e8;border-radius:8px;color:#1d5f52;cursor:pointer;display:inline-flex;font-size:12px;min-height:32px;padding:0 12px}.jio-creator-upload input{height:1px;opacity:0;position:absolute;width:1px}.jio-creator-files{list-style:none;margin:12px 0 0;padding:0}.jio-creator-files li{align-items:center;border-bottom:1px solid #f0f4f1;display:flex;font-size:13px;gap:10px;padding:8px 0}.jio-creator-files button{background:transparent;border:0;color:#7d8683;cursor:pointer}.jio-creator-files__name{align-items:center;background:transparent;border:0;color:#1d5f52;cursor:pointer;display:inline-flex;flex:1;font:inherit;gap:8px;min-width:0;overflow:hidden;padding:0;text-align:left;text-overflow:ellipsis;white-space:nowrap}.jio-creator-files__name:hover{text-decoration:underline}.jio-creator-files__name i{color:#267665;flex:0 0 auto}.jio-creator-files__remove{color:#9aa2a0!important;flex:0 0 auto;margin-left:auto}.jio-creator-files__remove:focus-visible,.jio-creator-files__remove:hover{color:#b4573f!important}.jio-creator-reuse{font-size:13px;margin-top:14px}.jio-creator-reuse summary{color:#7d8683;cursor:pointer}.jio-creator-reuse ul{list-style:none;margin:10px 0 0;padding:0}.jio-creator-reuse li{align-items:center;display:flex;gap:10px;padding:6px 0}.jio-creator-reuse button{background:#fff;border:1px solid #e6e9e8;border-radius:6px;cursor:pointer;margin-left:auto}.jio-creator-link{background:transparent;border:0;color:var(--jc-ink-soft,#7d8683);cursor:pointer;font-size:13px;text-decoration:underline}.jio-creator-dialog{align-items:center;display:flex;inset:0;justify-content:center;padding:20px;position:fixed;z-index:560}.jio-creator-dialog__backdrop{background:rgba(23,34,31,.34);border:0;cursor:default;inset:0;position:absolute}.jio-creator-dialog__panel{background:#fff;border-radius:14px;box-shadow:0 24px 70px rgba(20,32,28,.22);display:flex;flex-direction:column;max-height:min(82vh,640px);overflow:hidden;position:relative;width:min(460px,100%)}.jio-creator-dialog__panel--wide{width:min(560px,100%)}.jio-creator-dialog__head{align-items:center;border-bottom:1px solid #eef1f0;display:flex;justify-content:space-between;padding:18px 20px 12px}.jio-creator-dialog__head h2{font-size:16px;font-weight:600;margin:0}.jio-creator-dialog__close{align-items:center;background:transparent;border:0;border-radius:50%;color:#7d8683;cursor:pointer;display:inline-flex;height:30px;justify-content:center;width:30px}.jio-creator-dialog__close:focus-visible,.jio-creator-dialog__close:hover{background:#f2f5f3;outline:0}.jio-creator-dialog__body{display:flex;flex:1;flex-direction:column;gap:14px;overflow-y:auto;padding:18px 20px 20px}.jio-creator-dialog__row{display:flex;gap:14px}.jio-creator-dialog__row label{flex:1}.jio-creator-dialog__field,.jio-creator-dialog__row label{display:flex;flex-direction:column;gap:6px}.jio-creator-dialog__field>span,.jio-creator-dialog__row label>span{color:#6f7875;font-size:12px}.jio-creator-dialog__field input,.jio-creator-dialog__field select,.jio-creator-dialog__row input{background:#fff;border:1px solid #e3e7e5;border-radius:8px;color:#2b2b2b;font:inherit;font-size:14px;height:38px;padding:0 10px}.jio-creator-dialog__field textarea{background:#fff;border:1px solid #e3e7e5;border-radius:8px;color:#2b2b2b;font:inherit;font-size:14px;line-height:1.7;padding:10px;resize:vertical;width:100%}.jio-creator-dialog__field textarea:focus{outline:2px solid rgba(38,118,101,.25);outline-offset:-1px}.jio-creator-dialog__check{align-items:center;color:#4f5957;cursor:pointer;display:inline-flex;font-size:13px;gap:8px}.jio-creator-dialog__check input{accent-color:var(--jc-accent);cursor:pointer;height:15px;width:15px}.jio-creator-dialog__hint{color:#9aa2a0;font-size:12px;line-height:1.5}.jio-creator-dialog__url{display:flex;gap:8px}.jio-creator-dialog__url input{flex:1;min-width:0}.jio-creator-dialog__url .jio-creator-dialog__ghost{flex:0 0 auto;gap:6px;height:38px;white-space:nowrap}.jio-creator-swatches{display:flex;flex-wrap:wrap;gap:6px}.jio-creator-swatch{background:#e3e7e5;border:2px solid #fff;border-radius:6px;box-shadow:0 0 0 1px #e3e7e5;cursor:pointer;height:22px;padding:0;width:30px}.jio-creator-swatch.b-theme{background:var(--jc-accent)}.jio-creator-swatch.c-red{background:var(--jio-rose,#f43f5e)}.jio-creator-swatch.c-yellow{background:var(--jio-yellow,#eab308)}.jio-creator-swatch.c-cyan{background:var(--jio-cyan,#06b6d4)}.jio-creator-swatch.c-blue{background:var(--jio-blue,#3b82f6)}.jio-creator-swatch.c-green{background:var(--jio-green,#10b981)}.jio-creator-swatch.c-purple{background:var(--jio-purple,#8b5cf6)}.jio-creator-swatch.b-red{background:var(--jio-red,#ef4444)}.jio-creator-swatch.b-yellow{background:var(--jio-yellow,#eab308)}.jio-creator-swatch.b-cyan{background:var(--jio-cyan,#06b6d4)}.jio-creator-swatch.b-blue{background:var(--jio-blue,#3b82f6)}.jio-creator-swatch.b-green{background:var(--jio-green,#10b981)}.jio-creator-swatch.b-purple{background:var(--jio-purple,#8b5cf6)}.jio-creator-swatch.jb-red{background:linear-gradient(135deg,#fd7a64 10%,#fb2d2d)}.jio-creator-swatch.jb-pink{background:linear-gradient(135deg,var(--jio-grad-sunset-1,#f093fb) 10%,var(--jio-grad-sunset-2,#f5576c) 100%)}.jio-creator-swatch.jb-yellow{background:linear-gradient(135deg,var(--jio-grad-fire-2,#f9d423) 10%,var(--jio-orange,#f97316) 100%)}.jio-creator-swatch.jb-cyan{background:linear-gradient(135deg,var(--jio-grad-ocean-1,#4facfe) 10%,var(--jio-grad-ocean-2,#00f2fe) 100%)}.jio-creator-swatch.jb-blue{background:linear-gradient(135deg,#3dcabd 10%,#254bdd)}.jio-creator-swatch.jb-green{background:linear-gradient(135deg,var(--jio-grad-forest-1,#43e97b) 10%,var(--jio-grad-forest-2,#38f9d7) 100%)}.jio-creator-swatch.jb-purple{background:linear-gradient(135deg,var(--jio-grad-night-1,#a18cd1) 10%,var(--jio-grad-night-2,#fbc2eb) 100%)}.jio-creator-swatch.jb-vip1{background:linear-gradient(135deg,var(--jio-vip-gold-1,#f6d365) 10%,var(--jio-vip-gold-2,#fda085) 100%)}.jio-creator-swatch.jb-vip2{background:linear-gradient(135deg,#f6d365 10%,#f43f5e)}.jio-creator-swatch.is-active{box-shadow:0 0 0 2px var(--jc-accent)}.jio-creator-swatch:focus-visible{box-shadow:0 0 0 2px var(--jc-accent);outline:0}.jio-creator-dialog__foot{background:#fff;border-top:1px solid #eef1f0;display:flex;gap:10px;justify-content:flex-end;padding:14px 20px calc(14px + env(safe-area-inset-bottom))}.jio-creator-dialog__ghost,.jio-creator-dialog__primary{align-items:center;border-radius:8px;cursor:pointer;display:inline-flex;font-size:14px;justify-content:center;min-height:36px;padding:0 16px}.jio-creator-dialog__ghost{background:#fff;border:1px solid #e3e7e5;color:#5f6664}.jio-creator-dialog__ghost:focus-visible,.jio-creator-dialog__ghost:hover{border-color:#b7cdc3;outline:0}.jio-creator-dialog__primary{background:var(--jc-accent);border:1px solid transparent;color:#fff}.jio-creator-dialog__primary:focus-visible:not(:disabled),.jio-creator-dialog__primary:hover:not(:disabled){background:var(--jc-accent-strong);outline:0}.jio-creator-dialog__primary:disabled{cursor:not-allowed;opacity:.5}.jio-creator__status{align-items:center;background:hsla(0,0%,100%,.97);border-top:1px solid #e6e9e8;bottom:0;box-shadow:0 -2px 10px rgba(24,39,34,.04);color:#7d8683;display:flex;font-size:12px;gap:16px;height:var(--jc-status);left:0;padding:0 clamp(14px,2.4vw,28px) env(safe-area-inset-bottom);position:fixed;right:0;z-index:310}.jio-creator__status-actions,.jio-creator__status-left,.jio-creator__status-meta{align-items:center;display:flex;gap:10px;min-width:0}.jio-creator__status-count{color:#4f5957;font-variant-numeric:tabular-nums}.jio-creator__status-mode{color:#a3aca9;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.jio-creator__status-meta{color:#93a09b}.jio-creator__status-meta .jio-creator__save{font-size:12px}.jio-creator__status-dot{color:#c9d1ce}.jio-creator__status-actions{gap:8px;margin-left:auto}.jio-creator__status-ghost,.jio-creator__status-primary{align-items:center;border-radius:7px;cursor:pointer;display:inline-flex;font-size:13px;justify-content:center;min-height:32px;padding:0 14px;white-space:nowrap}.jio-creator__status-ghost{background:#fff;border:1px solid #e3e7e5;color:#5f6664}.jio-creator__status-ghost:focus-visible:not(:disabled),.jio-creator__status-ghost:hover:not(:disabled){border-color:#b7cdc3;color:var(--jc-accent-strong);outline:0}.jio-creator__status-ghost:disabled{cursor:default;opacity:.55}.jio-creator__status-primary{background:var(--jc-accent);border:1px solid transparent;color:#fff}.jio-creator__status-primary:focus-visible:not(:disabled),.jio-creator__status-primary:hover:not(:disabled){background:var(--jc-accent-strong);outline:0}.jio-creator__status-primary:disabled{cursor:default;opacity:.55}@media(max-width:767px){.jio-creator__status{gap:8px;height:56px;padding:0 10px env(safe-area-inset-bottom)}.jio-creator__status-meta,.jio-creator__status-mode{display:none}.jio-creator__status-ghost{padding:0 10px}.jio-creator__status-primary{padding:0 12px}.jio-creator{--jc-top:102px}.jio-creator__masthead{height:50px;padding:0 10px}.jio-creator__brand-logo{height:26px;max-width:128px}.jio-creator__brand-text{font-size:15px}.jio-creator__me-avatar{height:28px;width:28px}.jio-creator__bar{height:52px;padding:0 8px}.jio-creator__toolbar-tools{gap:4px}.jio-creator__toolbar-group{gap:0}.jio-creator__tool-btn{min-width:36px;padding:4px}.jio-creator__tool-btn i{font-size:13px}.jio-creator__tool-label{font-size:10px;max-width:42px}.jio-creator__canvas{margin:14px auto 0;padding:22px 18px 28px;width:calc(100% - 20px)}.jio-creator__settings{margin:12px auto calc(24px + env(safe-area-inset-bottom));padding:18px;width:calc(100% - 20px)}.jio-creator__setting-row{gap:12px}.jio-creator__title textarea{font-size:24px}.jio-creator__editor .mce-edit-area iframe,.jio-creator__editor .tox .tox-edit-area__iframe{min-height:48vh}.jio-creator-drawer{display:block}.jio-creator-drawer__backdrop{display:none}.jio-creator-drawer__panel{border-radius:0;box-shadow:none;height:100dvh;width:100%}.jio-creator-drawer__foot{background:#fff;bottom:0;position:sticky}}@media(prefers-reduced-motion:reduce){.jio-creator *{animation:none!important;transition:none!important}} diff --git a/assets/creator-studio/build/index.js b/assets/creator-studio/build/index.js index 57936bd0..361c790f 100644 --- a/assets/creator-studio/build/index.js +++ b/assets/creator-studio/build/index.js @@ -1,8 +1,9 @@ -(()=>{"use strict";const e=window.React,t=window.wp.element,a=window.wp.i18n;function n(e,t){const a=e&&(e.message||e.error)||(401===t?"登录状态已失效,请刷新页面重新登录。":"请求失败,请稍后重试。"),n=new Error(String(a));return n.status=t,n.code=e&&e.code?String(e.code):"",n.data=e,n}async function o(e){try{return await e.json()}catch(e){return null}}async function r(e,t,a){const r=await fetch(e,{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json","X-WP-Nonce":a},body:JSON.stringify(t)}),i=await o(r);if(!r.ok)throw n(i,r.status);return i}async function i(e,t,a,r={}){const i=new FormData;i.append("file",t),Object.entries(r).forEach(([e,t])=>i.append(e,t));const l=await fetch(e,{method:"POST",credentials:"same-origin",headers:{"X-WP-Nonce":a},body:i}),c=await o(l);if(!l.ok)throw n(c,l.status);return c}const l=window.jioCreatorStudio||{},c=l.nonce||"";function s(n){const{draft:o,setDraft:r,capabilities:s,limits:d,taxonomy:u,isPublishedEdit:m,onClose:p,onSaveDraft:f,onSubmit:_,privateStorage:b,privateUploads:h,saving:g,captcha:y}=n,[j,v]=(0,t.useState)(""),[E,k]=(0,t.useState)(""),[w,N]=(0,t.useState)(!1),C=(0,t.useRef)(null),S=(0,t.useRef)(null);(0,t.useEffect)(()=>{const e=S.current,t=document.getElementById("jio-creator-captcha");if(!e||!t)return;const a=t.parentElement;return e.appendChild(t),t.removeAttribute("hidden"),()=>{a&&(a.appendChild(t),t.setAttribute("hidden",""))}},[]);const x=(0,t.useMemo)(()=>(o.title||"").trim().length,[o.title])>=Number(d.titleMin||1),M=()=>{const e=j.trim();if(!e)return;const t=e.split(/[,,\n]+/u).map(e=>e.trim()).filter(Boolean);r({tags:Array.from(new Set([...o.tags,...t]))}),v("")};return(0,e.createElement)("div",{className:"jio-creator-drawer",role:"dialog","aria-modal":"true","aria-labelledby":"jio-creator-publish-title"},(0,e.createElement)("button",{type:"button",className:"jio-creator-drawer__backdrop","aria-label":(0,a.__)("关闭","jio"),onClick:p}),(0,e.createElement)("div",{className:"jio-creator-drawer__panel"},(0,e.createElement)("header",{className:"jio-creator-drawer__head"},(0,e.createElement)("h2",{id:"jio-creator-publish-title"},m?(0,a.__)("提交改稿","jio"):(0,a.__)("发布文章","jio")),(0,e.createElement)("button",{type:"button",className:"jio-creator-drawer__close",onClick:p,"aria-label":(0,a.__)("关闭","jio")},(0,e.createElement)("i",{className:"fa fas fa-times","aria-hidden":"true"}))),(0,e.createElement)("div",{className:"jio-creator-drawer__body"},m&&(0,e.createElement)("p",{className:"jio-creator-drawer__note"},(0,a.__)("审核通过前,读者看到的仍然是当前线上版本。","jio")),(0,e.createElement)("section",{className:"jio-creator-field"},(0,e.createElement)("h3",null,(0,a.__)("分类","jio")),(0,e.createElement)("div",{className:"jio-creator-chips"},0===u.categories.length&&(0,e.createElement)("span",{className:"jio-creator-muted"},(0,a.__)("暂无可选分类","jio")),u.categories.map(t=>(0,e.createElement)("label",{key:t.id,className:"jio-creator-chip"+(o.categories.includes(t.id)?" is-active":"")},(0,e.createElement)("input",{type:"checkbox",checked:o.categories.includes(t.id),onChange:()=>(e=>{const t=o.categories.includes(e);r({categories:t?o.categories.filter(t=>t!==e):[...o.categories,e]})})(t.id)}),(0,e.createElement)("span",null,t.name))))),u.tags&&(0,e.createElement)("section",{className:"jio-creator-field"},(0,e.createElement)("h3",null,(0,a.__)("标签","jio")),(0,e.createElement)("div",{className:"jio-creator-chips"},o.tags.map(t=>(0,e.createElement)("span",{key:t,className:"jio-creator-chip is-active"},(0,e.createElement)("span",null,t),(0,e.createElement)("button",{type:"button",onClick:()=>r({tags:o.tags.filter(e=>e!==t)}),"aria-label":(0,a.sprintf)((0,a.__)("移除标签 %s","jio"),t)},(0,e.createElement)("i",{className:"fa fas fa-times","aria-hidden":"true"}))))),(0,e.createElement)("div",{className:"jio-creator-inline"},(0,e.createElement)("input",{type:"text",value:j,placeholder:(0,a.__)("输入标签,逗号分隔","jio"),onChange:e=>v(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),M())}}),(0,e.createElement)("button",{type:"button",onClick:M},(0,a.__)("添加","jio")))),u.customDefs.map(t=>(0,e.createElement)("section",{className:"jio-creator-field",key:t.key},(0,e.createElement)("h3",null,t.name),(0,e.createElement)("div",{className:"jio-creator-chips"},t.values.map(a=>{const n=o.custom[t.key]||[],i=n.includes(a.key);return(0,e.createElement)("label",{key:a.key,className:"jio-creator-chip"+(i?" is-active":"")},(0,e.createElement)("input",{type:"checkbox",checked:i,onChange:()=>r({custom:{...o.custom,[t.key]:i?n.filter(e=>e!==a.key):[...n,a.key]}})}),(0,e.createElement)("span",null,a.name))})))),s.canPay&&(0,e.createElement)("section",{className:"jio-creator-field"},(0,e.createElement)("div",{className:"jio-creator-switch"},(0,e.createElement)("div",null,(0,e.createElement)("h3",null,(0,a.__)("付费内容","jio")),(0,e.createElement)("p",{className:"jio-creator-muted"},(0,a.__)("开启后,未购买读者只能看到免费部分。","jio"))),(0,e.createElement)("label",{className:"jio-creator-toggle"},(0,e.createElement)("input",{type:"checkbox",checked:o.pay.enabled,onChange:e=>r({pay:{...o.pay,enabled:e.target.checked}})}),(0,e.createElement)("span",{"aria-hidden":"true"}))),o.pay.enabled&&(0,e.createElement)("div",{className:"jio-creator-pay"},(0,e.createElement)("div",{className:"jio-creator-inline"},(0,e.createElement)("label",null,(0,e.createElement)("input",{type:"radio",checked:"cash"===o.pay.modo,onChange:()=>r({pay:{...o.pay,modo:"cash"}})}),(0,e.createElement)("span",null,(0,a.__)("现金","jio"))),(0,e.createElement)("label",null,(0,e.createElement)("input",{type:"radio",checked:"points"===o.pay.modo,onChange:()=>r({pay:{...o.pay,modo:"points"}})}),(0,e.createElement)("span",null,(0,a.__)("积分","jio")))),"cash"===o.pay.modo?(0,e.createElement)("label",{className:"jio-creator-input"},(0,e.createElement)("span",null,(0,a.__)("价格","jio")),(0,e.createElement)("input",{type:"number",min:Number(d.priceMin||0),step:"0.01",value:o.pay.price,onChange:e=>r({pay:{...o.pay,price:e.target.value}})})):(0,e.createElement)("label",{className:"jio-creator-input"},(0,e.createElement)("span",null,(0,a.__)("积分价格","jio")),(0,e.createElement)("input",{type:"number",min:0,step:"1",value:o.pay.points,onChange:e=>r({pay:{...o.pay,points:Number(e.target.value)||0}})})),s.canPayDownload&&(0,e.createElement)("div",{className:"jio-creator-attachments"},(0,e.createElement)("div",{className:"jio-creator-attachments__head"},(0,e.createElement)("h4",null,(0,a.__)("资料附件","jio")),b?(0,e.createElement)("label",{className:"jio-creator-upload"},(0,e.createElement)("input",{ref:C,type:"file",onChange:()=>{(async()=>{const e=C.current?.files?.[0];if(e){k(""),N(!0);try{const t=await i(l.creator.privateUrl,e,c,{post_id:String(o.postId||0)}),a={type:"protected",assetKey:String(t.asset_key||""),fileName:String(t.name||e.name),sizeBytes:Number(t.size||e.size),sizeLabel:String(t.size_label||""),label:""};r({pay:{...o.pay,enabled:!0,downloads:[...o.pay.downloads,a]}}),C.current&&(C.current.value="")}catch(e){k(String(e?.message||(0,a.__)("资料上传失败","jio")))}finally{N(!1)}}})()},disabled:w}),(0,e.createElement)("span",null,w?(0,a.__)("上传中…","jio"):(0,a.__)("添加 PDF / ZIP","jio"))):(0,e.createElement)("p",{className:"jio-creator-muted"},(0,a.__)("私有附件存储尚未配置,暂时不能上传付费资料。","jio"))),E&&(0,e.createElement)("p",{className:"jio-creator-error"},E),o.pay.downloads.length>0&&(0,e.createElement)("ul",{className:"jio-creator-files"},o.pay.downloads.map((t,n)=>(0,e.createElement)("li",{key:`${t.assetKey||t.url}-${n}`},(0,e.createElement)("span",{className:"jio-creator-files__name"},t.assetKey?(0,e.createElement)(e.Fragment,null,(0,e.createElement)("i",{className:"fa fas fa-lock","aria-hidden":"true"}),t.fileName||t.label||(0,a.__)("受保护资料","jio")):(0,e.createElement)(e.Fragment,null,(0,e.createElement)("i",{className:"fa fas fa-link","aria-hidden":"true"}),t.label||t.url)),t.sizeLabel&&(0,e.createElement)("span",{className:"jio-creator-muted"},t.sizeLabel),(0,e.createElement)("button",{type:"button",onClick:()=>(e=>{r({pay:{...o.pay,downloads:o.pay.downloads.filter((t,a)=>a!==e)}})})(n),"aria-label":(0,a.__)("移除","jio")},(0,e.createElement)("i",{className:"fa fas fa-times","aria-hidden":"true"}))))),h.length>0&&(0,e.createElement)("details",{className:"jio-creator-reuse"},(0,e.createElement)("summary",null,(0,a.__)("从已上传资料中选择","jio")),(0,e.createElement)("ul",null,h.filter(e=>!o.pay.downloads.some(t=>t.assetKey===e.assetKey)).map(t=>(0,e.createElement)("li",{key:t.assetKey},(0,e.createElement)("span",null,t.fileName),(0,e.createElement)("span",{className:"jio-creator-muted"},t.sizeLabel),(0,e.createElement)("button",{type:"button",onClick:()=>r({pay:{...o.pay,enabled:!0,downloads:[...o.pay.downloads,{...t,type:"protected"}]}})},(0,a.__)("使用","jio"))))))))),!s.canPay&&s.canSaveDraft&&(0,e.createElement)("p",{className:"jio-creator-muted"},(0,a.__)("当前账号不能设置付费内容。","jio"))),(0,e.createElement)("footer",{className:"jio-creator-drawer__foot"},y&&(0,e.createElement)("div",{className:"jio-creator-drawer__captcha",ref:S}),(0,e.createElement)("div",{className:"jio-creator-drawer__actions"},(0,e.createElement)("button",{type:"button",className:"jio-creator-ghost",onClick:f,disabled:g},(0,a.__)("保存草稿","jio")),(0,e.createElement)("button",{type:"button",className:"jio-creator-primary",onClick:()=>_(!1),disabled:g||!x},m?(0,a.__)("提交审核","jio"):s.canPublishNow?(0,a.__)("发布","jio"):(0,a.__)("提交审核","jio")),s.canPublishNow&&(0,e.createElement)("button",{type:"button",className:"jio-creator-link",onClick:()=>_(!0),disabled:g||!x},(0,a.__)("立即发布","jio"))))))}function d({label:a,icon:n,items:o,ready:r,title:i,active:l=!1,width:c=216,onRememberSelection:s}){const[d,u]=(0,t.useState)(!1),m=(0,t.useRef)(null),p=(0,t.useRef)(null),[f,_]=(0,t.useState)({left:0,top:0,placement:"bottom"});(0,t.useLayoutEffect)(()=>{if(!d)return;const e=()=>{const e=m.current;if(!e)return;const t=e.getBoundingClientRect(),a=p.current?.offsetHeight||240,n=t.bottom+8+a>window.innerHeight&&t.top>a?"top":"bottom",o=Math.min(Math.max(8,t.left+t.width/2-c/2),Math.max(8,window.innerWidth-c-8)),r="bottom"===n?t.bottom+8:t.top-a-8;_({left:o,top:r,placement:n})};return e(),window.addEventListener("resize",e),()=>window.removeEventListener("resize",e)},[d,c]),(0,t.useEffect)(()=>{if(!d)return;const e=e=>{const t=e.target;m.current?.contains(t)||p.current?.contains(t)||u(!1)},t=e=>{"Escape"===e.key&&(u(!1),m.current?.focus())},a=()=>u(!1);return document.addEventListener("pointerdown",e),document.addEventListener("keydown",t),window.addEventListener("scroll",a,!0),()=>{document.removeEventListener("pointerdown",e),document.removeEventListener("keydown",t),window.removeEventListener("scroll",a,!0)}},[d]);const b=d?(0,t.createPortal)((0,e.createElement)("div",{ref:p,className:`jio-creator__menu is-${f.placement}`,style:{left:`${f.left}px`,top:`${f.top}px`,width:`${c}px`},role:"menu","aria-label":i||a},o.map(t=>(0,e.createElement)("button",{key:t.key,type:"button",role:"menuitemradio","aria-checked":t.active?"true":"false",className:"jio-creator__menu-item"+(t.active?" is-active":""),onMouseDown:e=>e.preventDefault(),onClick:()=>{u(!1),t.onSelect()}},t.swatch?(0,e.createElement)("span",{className:"jio-creator__menu-swatch",style:{background:t.swatch},"aria-hidden":"true"}):(0,e.createElement)("i",{className:`${t.icon||"fa fas fa-check"} jio-creator__menu-icon`,"aria-hidden":"true"}),(0,e.createElement)("span",{className:"jio-creator__menu-text"},(0,e.createElement)("span",{className:"jio-creator__menu-label"},t.label),t.hint&&(0,e.createElement)("span",{className:"jio-creator__menu-hint"},t.hint)),(0,e.createElement)("i",{className:"fa fas fa-check jio-creator__menu-check","aria-hidden":"true"})))),document.body):null;return(0,e.createElement)("div",{className:"jio-creator__tool-menu"},(0,e.createElement)("button",{ref:m,type:"button",className:`jio-creator__tool-btn${l?" is-active":""}${d?" is-open":""}`,disabled:!r,onClick:()=>{s?.(),u(e=>!e)},title:i||a,"aria-label":i||a,"aria-haspopup":"menu","aria-expanded":d?"true":"false"},(0,e.createElement)("i",{className:n,"aria-hidden":"true"}),(0,e.createElement)("span",{className:"jio-creator__tool-label"},a),(0,e.createElement)("i",{className:"fa fas fa-caret-down jio-creator__tool-caret","aria-hidden":"true"})),b)}function u({label:t,icon:a,ready:n,onClick:o,title:r,active:i=!1}){return(0,e.createElement)("button",{type:"button",className:"jio-creator__tool-btn"+(i?" is-active":""),disabled:!n,onClick:o,title:r||t,"aria-label":r||t,"aria-pressed":i||void 0},(0,e.createElement)("i",{className:a,"aria-hidden":"true"}),(0,e.createElement)("span",{className:"jio-creator__tool-label"},t))}const m=[{key:"",label:(0,a.__)("灰色引用","jio"),swatch:"#555555"},{key:"qe_wzk_c-red",label:(0,a.__)("红色引用","jio"),swatch:"#dc3f3f"},{key:"qe_wzk_lan",label:(0,a.__)("蓝色引用","jio"),swatch:"#0092ff"},{key:"qe_wzk_lv",label:(0,a.__)("绿色引用","jio"),swatch:"#23790e"}],p=[{key:"reply",label:(0,a.__)("评论后可查看","jio"),icon:"fa fas fa-comment-dots"},{key:"login",label:(0,a.__)("登录后可查看","jio"),icon:"fa fas fa-sign-in-alt"},{key:"vip",label:(0,a.__)("会员可查看","jio"),icon:"fa fas fa-crown"},{key:"payshow",label:(0,a.__)("付费后可查看","jio"),icon:"fa fas fa-coins"}];function f({ready:t,canUndo:n,canRedo:o,formatValue:r,onFormatChange:i,alignValue:l,blockValue:c,capabilities:s,onCommand:f,onRememberSelection:_,onOpenLink:b,onOpenMedia:h,onInsertBlock:g,onInsertQuote:y,onInsertHidden:j}){const v=[{key:"p",label:(0,a.__)("正文","jio"),icon:"fa fas fa-paragraph"},{key:"h2",label:(0,a.__)("标题 2","jio"),icon:"fa fas fa-heading"},{key:"h3",label:(0,a.__)("标题 3","jio"),icon:"fa fas fa-heading"},{key:"h4",label:(0,a.__)("标题 4","jio"),icon:"fa fas fa-heading"}].map(e=>({...e,active:r===e.key,onSelect:()=>{i(e.key),f("format",e.key)}})),E=[{key:"ul",label:(0,a.__)("无序列表","jio"),icon:"fa fas fa-list-ul"},{key:"ol",label:(0,a.__)("有序列表","jio"),icon:"fa fas fa-list-ol"}].map(e=>({...e,active:c===e.key,onSelect:()=>g(e.key)})),k=[{key:"left",label:(0,a.__)("居左对齐","jio"),icon:"fa fas fa-align-left"},{key:"center",label:(0,a.__)("居中对齐","jio"),icon:"fa fas fa-align-center"},{key:"right",label:(0,a.__)("居右对齐","jio"),icon:"fa fas fa-align-right"}].map(e=>({...e,active:l===e.key,onSelect:()=>f("align",e.key)})),w=m.map(e=>({key:e.key||"default",label:e.label,swatch:e.swatch,active:c===(e.key||"quote"),onSelect:()=>y(e.key)})),N=p.map(e=>({key:e.key,label:e.label,icon:e.icon,onSelect:()=>j(e.key)})),C="center"===l?"fa fas fa-align-center":"right"===l?"fa fas fa-align-right":"fa fas fa-align-left",S="ol"===c?"fa fas fa-list-ol":"fa fas fa-list-ul";return(0,e.createElement)("div",{className:"jio-creator__toolbar-tools",role:"toolbar","aria-label":(0,a.__)("正文编辑工具","jio"),onMouseDown:e=>{_(),e.target.closest("button")&&e.preventDefault()}},(0,e.createElement)("div",{className:"jio-creator__toolbar-group",role:"group","aria-label":(0,a.__)("撤销和重做","jio")},(0,e.createElement)(u,{label:(0,a.__)("撤销","jio"),icon:"fa fas fa-undo",ready:n,onClick:()=>f("undo")}),(0,e.createElement)(u,{label:(0,a.__)("重做","jio"),icon:"fa fas fa-redo",ready:o,onClick:()=>f("redo")})),(0,e.createElement)("span",{className:"jio-creator__toolbar-divider","aria-hidden":"true"}),(0,e.createElement)("div",{className:"jio-creator__toolbar-group",role:"group","aria-label":(0,a.__)("段落样式","jio")},(0,e.createElement)(d,{label:(0,a.__)("标题","jio"),icon:"fa fas fa-heading",items:v,ready:t,width:168,onRememberSelection:_})),(0,e.createElement)("span",{className:"jio-creator__toolbar-divider","aria-hidden":"true"}),(0,e.createElement)("div",{className:"jio-creator__toolbar-group",role:"group","aria-label":(0,a.__)("文字格式","jio")},(0,e.createElement)(u,{label:(0,a.__)("加粗","jio"),icon:"fa fas fa-bold",ready:t,onClick:()=>f("Bold")}),(0,e.createElement)(u,{label:(0,a.__)("斜体","jio"),icon:"fa fas fa-italic",ready:t,onClick:()=>f("Italic")}),(0,e.createElement)(u,{label:(0,a.__)("下划线","jio"),icon:"fa fas fa-underline",ready:t,onClick:()=>f("Underline")})),(0,e.createElement)("span",{className:"jio-creator__toolbar-divider","aria-hidden":"true"}),(0,e.createElement)("div",{className:"jio-creator__toolbar-group",role:"group","aria-label":(0,a.__)("段落块","jio")},(0,e.createElement)(d,{label:(0,a.__)("列表","jio"),icon:S,items:E,ready:t,width:168,onRememberSelection:_,active:"ul"===c||"ol"===c}),(0,e.createElement)(d,{label:(0,a.__)("对齐","jio"),icon:C,items:k,ready:t,width:168,onRememberSelection:_,active:"left"!==l,title:(0,a.__)("对齐方式","jio")}),(0,e.createElement)(d,{label:(0,a.__)("引用","jio"),icon:"fa fas fa-quote-left",items:w,ready:t,width:168,onRememberSelection:_,active:"quote"===c||m.some(e=>e.key===c)}),s.canHide&&(0,e.createElement)(d,{label:(0,a.__)("隐藏","jio"),icon:"fa fas fa-eye-slash",items:N,ready:t,width:190,onRememberSelection:_,title:(0,a.__)("隐藏内容","jio")}),(0,e.createElement)(u,{label:(0,a.__)("分割线","jio"),icon:"fa fas fa-minus",ready:t,onClick:()=>g("divider")}),(0,e.createElement)(u,{label:(0,a.__)("代码块","jio"),icon:"fa fas fa-code",ready:t,onClick:()=>g("code")}),(0,e.createElement)(u,{label:(0,a.__)("注释","jio"),icon:"fa fas fa-comment-dots",ready:t,onClick:()=>g("footnote")}),(0,e.createElement)(u,{label:(0,a.__)("公式","jio"),icon:"fa fas fa-square-root-alt",ready:t,onClick:()=>g("math")}),(0,e.createElement)(u,{label:(0,a.__)("表格","jio"),icon:"fa fas fa-table",ready:t,onClick:()=>g("table")})),(0,e.createElement)("span",{className:"jio-creator__toolbar-divider","aria-hidden":"true"}),(0,e.createElement)("div",{className:"jio-creator__toolbar-group",role:"group","aria-label":(0,a.__)("媒体和链接","jio")},s.canUploadImage&&(0,e.createElement)(u,{label:(0,a.__)("图片","jio"),icon:"fa far fa-image",ready:t,onClick:()=>h("image")}),(s.canUploadVideo||s.canEmbed)&&(0,e.createElement)(u,{label:(0,a.__)("视频","jio"),icon:"fa fas fa-video",ready:t,onClick:()=>h("video")}),(0,e.createElement)(u,{label:(0,a.__)("链接","jio"),icon:"fa fas fa-link",ready:t,onClick:b}),s.canUploadFile&&(0,e.createElement)(u,{label:(0,a.__)("附件","jio"),icon:"fa fas fa-paperclip",ready:t,onClick:()=>h("file")})))}const _=window.jioCreatorStudio||{},b=_.nonce||"",h=e=>String(e).padStart(2,"0");function g(e){return`${e.getFullYear()}-${h(e.getMonth()+1)}-${h(e.getDate())}T${h(e.getHours())}:${h(e.getMinutes())}`}function y({featured:n,canEditCover:o,canSchedule:r,scheduleEnabled:l,scheduleAt:c,onFeaturedChange:s,onScheduleChange:d}){const u=(0,t.useRef)(null),[m,p]=(0,t.useState)(!1),[f,h]=(0,t.useState)(""),y=(0,t.useMemo)(()=>g(new Date(Date.now()+3e5)),[]),j="string"==typeof n?.data?.url?n.data.url:"";return(0,e.createElement)("section",{className:"jio-creator__settings","aria-label":(0,a.__)("发布设置","jio")},(0,e.createElement)("h2",{className:"jio-creator__settings-title"},(0,a.__)("发布设置","jio")),o&&(0,e.createElement)("div",{className:"jio-creator__setting-row"},(0,e.createElement)("div",{className:"jio-creator__setting-copy"},(0,e.createElement)("span",{className:"jio-creator__setting-label"},(0,a.__)("添加封面","jio")),(0,e.createElement)("p",{className:"jio-creator__setting-help"},(0,a.__)("用于列表卡片、分享卡片;不设置时自动使用正文首图。","jio"))),(0,e.createElement)("div",{className:"jio-creator__cover-control"},j?(0,e.createElement)(e.Fragment,null,(0,e.createElement)("button",{type:"button",className:"jio-creator__cover-preview",onClick:()=>u.current?.click(),"aria-label":(0,a.__)("更换封面","jio")},(0,e.createElement)("img",{src:j,alt:""})),(0,e.createElement)("button",{type:"button",className:"jio-creator__cover-clear",onClick:()=>s({type:"",data:{}}),"aria-label":(0,a.__)("移除封面","jio")},(0,e.createElement)("i",{className:"fa fas fa-times","aria-hidden":"true"}))):(0,e.createElement)("button",{type:"button",className:"jio-creator__cover-add",onClick:()=>u.current?.click(),disabled:m},(0,e.createElement)("i",{className:"fa fas fa-plus","aria-hidden":"true"}),(0,e.createElement)("span",null,m?(0,a.__)("上传中…","jio"):(0,a.__)("添加封面","jio"))),(0,e.createElement)("input",{ref:u,type:"file",accept:"image/*",className:"jio-creator__cover-input",onChange:()=>{(async()=>{const e=u.current?.files?.[0],t=_.media?.uploadUrl?.image;if(e&&t){h(""),p(!0);try{const n=await i(t,e,b),o=Number(n.attachment_id||n.id||0),r=String(n.url||"");if(!o||!r)throw new Error((0,a.__)("上传后无法读取图片。","jio"));s({type:"image",mediaId:o,data:{id:o,url:r}})}catch(e){h(String(e?.message||(0,a.__)("上传失败","jio")))}finally{p(!1),u.current&&(u.current.value="")}}})()}}))),f&&(0,e.createElement)("p",{className:"jio-creator-error"},f),(0,e.createElement)("div",{className:"jio-creator__setting-row"},(0,e.createElement)("div",{className:"jio-creator__setting-copy"},(0,e.createElement)("span",{className:"jio-creator__setting-label"},(0,a.__)("定时发布","jio")),(0,e.createElement)("p",{className:"jio-creator__setting-help"},r?(0,a.__)("开启后到点自动发布,发布前不会出现在文章列表。","jio"):(0,a.__)("当前账号提交后需要审核,审核通过后才会发布。","jio"))),(0,e.createElement)("label",{className:"jio-creator-toggle"},(0,e.createElement)("input",{type:"checkbox",checked:l,disabled:!r,onChange:e=>d(e.target.checked,c||g(new Date(Date.now()+36e5)))}),(0,e.createElement)("span",{"aria-hidden":"true"}))),r&&l&&(0,e.createElement)("div",{className:"jio-creator__schedule"},(0,e.createElement)("label",null,(0,e.createElement)("span",null,(0,a.__)("发布时间","jio")),(0,e.createElement)("input",{type:"datetime-local",value:c,min:y,onChange:e=>d(!0,e.target.value)})),(0,e.createElement)("p",{className:"jio-creator-muted"},(0,a.sprintf)(/* translators: %s: site timezone */ /* translators: %s: site timezone */ -(0,a.__)("按站点时区(%s)发布,至少需要晚于当前时间 1 分钟。","jio"),String(_.timezone||"UTC")))))}function j({centerUrl:t,site:n,viewer:o}){const r=String(n.name||""),i=String(o.avatar||""),l=t||"/";return(0,e.createElement)("header",{className:"jio-creator__masthead"},(0,e.createElement)("div",{className:"jio-creator__masthead-left"},(0,e.createElement)("a",{className:"jio-creator__back",href:t||"/","aria-label":(0,a.__)("返回作者中心","jio")},(0,e.createElement)("i",{className:"fa fas fa-angle-left","aria-hidden":"true"})),(0,e.createElement)("a",{className:"jio-creator__brand",href:String(n.home||"/"),"aria-label":r||(0,a.__)("返回首页","jio")},n.logo?(0,e.createElement)("img",{className:"jio-creator__brand-logo",src:String(n.logo),alt:r}):(0,e.createElement)("span",{className:"jio-creator__brand-text"},r))),(0,e.createElement)("a",{className:"jio-creator__me",href:l,"aria-label":(0,a.__)("返回作者中心","jio")},i?(0,e.createElement)("img",{className:"jio-creator__me-avatar",src:i,alt:"",width:32,height:32}):(0,e.createElement)("span",{className:"jio-creator__me-avatar is-placeholder","aria-hidden":"true"},(0,e.createElement)("i",{className:"fa fas fa-user"}))))}function v(e){const t=(e.downloads||[]).map(e=>{const t="string"==typeof e.assetKey?e.assetKey:"";if(t)return{type:"protected",asset_key:t,label:"string"==typeof e.label?e.label:""};const a="string"==typeof e.url?e.url.trim():"";return a?{type:"direct",url:a,label:"string"==typeof e.label?e.label:"",extract_code:"string"==typeof e.extractCode?e.extractCode:""}:null}).filter(Boolean);return{enabled:!!e.enabled,fields:{pay_type:e.enabled?t.length>0?"download":"reading":"no",pay_modo:"points"===e.modo?"points":"0",price:"points"===e.modo?"0.00":String(e.price||"0.00"),points_price:"points"===e.modo?Math.max(0,Number(e.points)||0):0,vip1_price:"points"===e.modo?"0.00":String(e.vip1Price||"0.00"),vip2_price:"points"===e.modo?"0.00":String(e.vip2Price||"0.00"),pay_limit:Number(e.payLimit)||0,downloads:t}}}const E=e=>e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">");function k(e){if(!e||-1===e.indexOf("data-jio-"))return e;const t=document.createElement("div");return t.innerHTML=e,t.querySelectorAll("[data-jio-math-source]").forEach(e=>{const t=e.getAttribute("data-jio-math-source")||"",a="0"!==e.getAttribute("data-jio-math-display"),n=`[jio_math display="${a?"1":"0"}"]${t}[/jio_math]`,o=e.closest("p");a&&o&&o.textContent?.trim()===e.textContent?.trim()?o.textContent=n:e.replaceWith(document.createTextNode(n))}),t.querySelectorAll("[data-jio-footnote]").forEach(e=>{const t=e.getAttribute("data-jio-footnote")||"";e.replaceWith(document.createTextNode(`[jio_footnote]${t}[/jio_footnote]`))}),t.innerHTML}function w(e){return e&&-1!==e.indexOf("[jio_")?e.replace(/\[jio_math display="([01])"\]([\s\S]*?)\[\/jio_math\]/g,(e,t,a)=>"0"===t?`${N(a)}`:`
${N(a)}
`).replace(/\[jio_footnote\]([\s\S]*?)\[\/jio_footnote\]/g,(e,t)=>`${t}`):e}const N=e=>e.replace(/&/g,"&").replace(//g,">").replace(/\^\{([^{}]*)\}|\^(\S)/gu,"$1$2").replace(/_\{([^{}]*)\}|_(\S)/gu,"$1$2"),C={ready:(0,a.__)("尚未保存","jio"),saving:(0,a.__)("保存中…","jio"),saved:(0,a.__)("已保存","jio"),error:(0,a.__)("保存失败","jio"),conflict:(0,a.__)("内容已在别处更新","jio"),submitting:(0,a.__)("提交中…","jio"),submitted:(0,a.__)("已提交","jio")};function S({value:t}){return(0,e.createElement)("span",{className:`jio-creator__save is-${t.state}`,role:"status","aria-live":"polite"},(0,e.createElement)("i",{className:"fa fas fa-circle","aria-hidden":"true"}),(0,e.createElement)("span",null,C[t.state]||C.ready),"saved"===t.state&&t.at?(0,e.createElement)("time",null,t.at):null)}const x=36e5,M=24*x,$=30*M,L=365*M,q={ready:(0,a.__)("草稿","jio"),saving:(0,a.__)("保存中","jio"),saved:(0,a.__)("草稿","jio"),error:(0,a.__)("保存失败","jio"),conflict:(0,a.__)("冲突","jio"),submitting:(0,a.__)("提交中","jio"),submitted:(0,a.__)("已提交","jio")};function R({charCount:t,saveState:n,isPublishedEdit:o,saving:r,onSaveDraft:i,onPreview:l,onPublish:c}){const s=n.at?function(e,t=Date.now()){const n=Date.parse(e);if(!Number.isFinite(n))return"";const o=Math.max(0,t-n);return o<6e4?(0,a.__)("刚刚","jio"):o${t}
`};const z={reply:{open:"[reply]",close:"[/reply]",label:(0,a.__)("评论后可查看","jio")},login:{open:'[jio_hide mode="login"]',close:"[/jio_hide]",label:(0,a.__)("登录后可查看","jio")},vip:{open:"[vip]",close:"[/vip]",label:(0,a.__)("会员可查看","jio")},payshow:{open:"[payshow]",close:"[/payshow]",label:(0,a.__)("付费后可查看","jio")}},U=(e,t,a)=>Math.min(a,Math.max(t,Number.isFinite(e)?Math.round(e):t)),A={table:(0,a.__)("插入表格","jio"),math:(0,a.__)("插入公式","jio"),footnote:(0,a.__)("插入注释","jio")};function B({kind:n,onSubmit:o,onClose:r}){const[i,l]=(0,t.useState)(3),[c,s]=(0,t.useState)(3),[d,u]=(0,t.useState)(!0),[m,p]=(0,t.useState)(!1),[f,_]=(0,t.useState)("a^2 + b^2 = c^2"),[b,h]=(0,t.useState)(!0),[g,y]=(0,t.useState)(""),j=(0,t.useRef)(null),v=(0,t.useRef)(null),E=(0,t.useRef)(null),k=(0,t.useRef)(null);(0,t.useEffect)(()=>{(v.current||E.current||k.current)?.focus();const e=e=>{"Escape"===e.key&&(e.preventDefault(),r())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r]);const w=(0,t.useMemo)(()=>"footnote"===n?""!==g.trim():"math"!==n||""!==f.trim(),[n,g,f]);return(0,e.createElement)("div",{className:"jio-creator-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"jio-creator-dialog-title"},(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__backdrop","aria-label":(0,a.__)("关闭","jio"),onClick:r}),(0,e.createElement)("div",{className:"jio-creator-dialog__panel",ref:j},(0,e.createElement)("header",{className:"jio-creator-dialog__head"},(0,e.createElement)("h2",{id:"jio-creator-dialog-title"},A[n]),(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__close",onClick:r,"aria-label":(0,a.__)("关闭","jio")},(0,e.createElement)("i",{className:"fa fas fa-times","aria-hidden":"true"}))),(0,e.createElement)("div",{className:"jio-creator-dialog__body"},"table"===n&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"jio-creator-dialog__row"},(0,e.createElement)("label",null,(0,e.createElement)("span",null,(0,a.__)("行数","jio")),(0,e.createElement)("input",{ref:v,type:"number",min:1,max:20,value:i,onChange:e=>l(Number(e.target.value))})),(0,e.createElement)("label",null,(0,e.createElement)("span",null,(0,a.__)("列数","jio")),(0,e.createElement)("input",{type:"number",min:1,max:10,value:c,onChange:e=>s(Number(e.target.value))}))),(0,e.createElement)("label",{className:"jio-creator-dialog__check"},(0,e.createElement)("input",{type:"checkbox",checked:d,onChange:e=>u(e.target.checked)}),(0,e.createElement)("span",null,(0,a.__)("首行为表头","jio"))),(0,e.createElement)("label",{className:"jio-creator-dialog__check"},(0,e.createElement)("input",{type:"checkbox",checked:m,onChange:e=>p(e.target.checked)}),(0,e.createElement)("span",null,(0,a.__)("隔行变色","jio")))),"math"===n&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("label",{className:"jio-creator-dialog__field"},(0,e.createElement)("span",null,(0,a.__)("公式","jio")),(0,e.createElement)("textarea",{ref:E,rows:3,value:f,onChange:e=>_(e.target.value),placeholder:"a^2 + b^2 = c^2"})),(0,e.createElement)("p",{className:"jio-creator-muted"},(0,a.__)("支持上标 ^ 与下标 _,例如 x^2 与 a_n;暂不支持完整 LaTeX。","jio")),(0,e.createElement)("label",{className:"jio-creator-dialog__check"},(0,e.createElement)("input",{type:"checkbox",checked:b,onChange:e=>h(e.target.checked)}),(0,e.createElement)("span",null,(0,a.__)("独占一行显示","jio")))),"footnote"===n&&(0,e.createElement)("label",{className:"jio-creator-dialog__field"},(0,e.createElement)("span",null,(0,a.__)("注释内容","jio")),(0,e.createElement)("textarea",{ref:k,rows:4,value:g,onChange:e=>y(e.target.value),placeholder:(0,a.__)("填写要补充说明的内容","jio")}))),(0,e.createElement)("footer",{className:"jio-creator-dialog__foot"},(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__ghost",onClick:r},(0,a.__)("取消","jio")),(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__primary",onClick:()=>{w&&o("table"!==n?"math"!==n?{kind:n,note:g.trim()}:{kind:n,formula:f.trim(),display:b}:{kind:n,rows:U(i,1,20),cols:U(c,1,10),header:d,striped:m})},disabled:!w},(0,a.__)("插入","jio")))))}const T="table,pre,hr,.quote_q,.tinymce-hide,.jio-math--block";function F(e){if(!e||e.removed)return;const t=e.getDoc(),a=e.getContentAreaContainer()?.querySelector("iframe");if(!t||!a)return;const n=Math.max(320,t.documentElement.scrollHeight,t.body?t.body.scrollHeight:0);a.style.height=`${n}px`,a.style.overflow="hidden"}const V="jio-creator__block-selected",H=window.jioCreatorStudio||{},O=H.nonce||"",K=`jio-studio-${H.sourceId||0}`,J="jio-creator-content";function W(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function X(e){const t=String(e||"").trim();if(!t)return"";try{const e=new URL(t,window.location.href);return"http:"===e.protocol||"https:"===e.protocol?e.href:""}catch(e){return""}}function Y(e){const t=document.createElement("div");return t.innerHTML=e,(t.textContent||"").replace(/\s+/g,"")}function Q(){const[n,o]=(0,t.useState)(()=>function(e){const t=e.pay||{},a=e.categories&&e.categories.selected||[],n=e.tags&&e.tags.items||[];return{postId:Number(e.sourceId||0),versionId:Number(e.versionId||0),rev:Number(e.versionRev||0),title:String(e.title||""),content:String(e.content||""),schedule:{enabled:!1,at:""},categories:a.map(Number),tags:n.slice(),custom:e.custom||{},featured:e.featured||{type:"",data:{}},pay:{enabled:!!t.enabled,modo:"points"===t.payModo?"points":"cash",price:String(t.price||"0.00"),points:Number(t.points||0),vip1Price:String(t.vip1Price||"0.00"),vip2Price:String(t.vip2Price||"0.00"),payLimit:Number(t.payLimit||0),downloads:Array.isArray(t.downloads)?t.downloads:[]}}}(H)),i=(0,t.useRef)(n);i.current=n;const l=(0,t.useRef)(null),c=(0,t.useRef)(null),d=(0,t.useRef)(null),u=(0,t.useRef)(!1),m=(0,t.useRef)(()=>{}),[p,_]=(0,t.useState)(!1),[b,h]=(0,t.useState)({canUndo:!1,canRedo:!1}),[g,E]=(0,t.useState)("p"),[N,C]=(0,t.useState)("left"),[S,x]=(0,t.useState)("p"),[M,$]=(0,t.useState)(()=>({state:H.sourceId||H.versionId||H.content?"saved":"ready",at:""})),[L,q]=(0,t.useState)(!1),[D,U]=(0,t.useState)(null),[A,Q]=(0,t.useState)(null),[G,Z]=(0,t.useState)(null),ee=(0,t.useRef)(!1),te=(0,t.useRef)(0),ae=H.capabilities||{},ne={titleMin:Number(H.limits?.titleMin||1),titleMax:Number(H.limits?.titleMax||30),titlePlaceholder:String(H.limits?.titlePlaceholder||(0,a.__)("请输入标题","jio")),priceMin:Number(H.pay?.priceMin||0),priceMax:Number(H.pay?.priceMax||0),pointsMin:Number(H.pay?.pointsMin||0),pointsMax:Number(H.pay?.pointsMax||0)},oe=!!H.isPublished,re=(0,t.useMemo)(()=>Array.from(Y(n.content)).length,[n.content]),ie=(0,t.useCallback)(e=>{ee.current=!0,te.current+=1;const t={...i.current,...e};i.current=t,o(t)},[]),le=(0,t.useCallback)(e=>{if(e===i.current.content)return;ee.current=!0,te.current+=1;const t={...i.current,content:e};i.current=t,o(t)},[]),ce=(0,t.useCallback)(e=>{const t=e?.undoManager;t&&h({canUndo:"function"==typeof t.hasUndo&&t.hasUndo(),canRedo:"function"==typeof t.hasRedo&&t.hasRedo()})},[]),se=(0,t.useCallback)(e=>{const t=e?.selection?.getNode(),a=t?e.dom.getParent(t,"p,h1,h2,h3,h4,h5,h6")||t:null,n=a?.nodeName?.toLowerCase()||"p";E(["h1","h2","h3","h4"].includes(n)?n:"p")},[]),de=(0,t.useCallback)(e=>{const t=e?.selection?.getNode();if(!t)return;const a=e.getBody(),n=String(e.formatter?.match?.(["alignleft","aligncenter","alignright"])||"");C("aligncenter"===n?"center":"alignright"===n?"right":"left");const o=e.dom.getParent(t,".quote_q",a);if(o){const e=Array.from(o.classList).find(e=>0===e.indexOf("qe_wzk_"));return void x(e||"quote")}e.dom.getParent(t,"ul",a)?x("ul"):e.dom.getParent(t,"ol",a)?x("ol"):x("p")},[]),ue=(0,t.useCallback)((e={})=>{const t=i.current;return{post_id:t.postId,version_id:t.versionId,rev:t.rev,title:t.title,content:t.content,categories:t.categories,tags:t.tags,custom:t.custom,featured:t.featured,schedule:{enabled:!!t.schedule.enabled,at:t.schedule.enabled?t.schedule.at:""},pay:v(t.pay),...e}},[]),me=(0,t.useCallback)(async(e=!1)=>{const t=l.current;t&&!t.removed&&le(k(t.getContent()));const a=i.current;if(!ee.current&&(a.postId>0||a.versionId>0))return!0;const n=te.current;if(""===a.title.trim()&&""===Y(a.content).trim()&&!/<(?:img|table|pre|hr|iframe|video)/i.test(a.content))return!0;$({state:"saving",at:""});try{const t=await r(H.creator.saveUrl,ue({autosave:e}),O),a={...i.current,postId:Number(t.post_id||i.current.postId||0),versionId:Number(t.version_id||i.current.versionId||0),rev:Number(t.rev||t.versionRev||i.current.rev||0)};window.jioSubmitData&&(window.jioSubmitData.postId=a.postId);const l=te.current===n;return ee.current=!l,i.current=a,o(a),$({state:l?"saved":"saving",at:l?(new Date).toLocaleTimeString():""}),l}catch(e){return $({state:409===e?.status?"conflict":"error",at:""}),!1}},[ue]);m.current=()=>{me(!1)};const pe=(0,t.useCallback)(async e=>{if(await me(!1)){$({state:"submitting",at:""});try{let t="";const n=window.JioCaptcha;if(H.captcha?.enabled&&n&&"function"==typeof n.run){const e=await n.run("front_submit");if(null===e)return $({state:"ready",at:""}),void Q({tone:"error",text:(0,a.__)("请先完成人机验证","jio")});t=String(e?.jio_captcha_proof||"")}const o=await r(H.creator.submitUrl,ue({post_id:i.current.postId,version_id:i.current.versionId,rev:i.current.rev,publish_now:e,captcha_proof:t}),O);ee.current=!1,$({state:"submitted",at:""}),Q({tone:"ok",text:String(o.message||(0,a.__)("已提交","jio"))}),q(!1);const l=o.url||o.goto||H.urls?.center;l&&window.setTimeout(()=>{window.location.href=l},900)}catch(e){$({state:"error",at:""}),Q({tone:"error",text:String(e?.message||(0,a.__)("提交失败","jio"))})}}else Q({tone:"error",text:(0,a.__)("内容保存失败,请重试后再提交","jio")})},[ue,me]),fe=(0,t.useCallback)(async()=>{if(await me(!1))try{const e=await r(H.creator.previewUrl,{post_id:i.current.postId,version_id:i.current.versionId},O);e.url&&window.open(String(e.url),"_blank","noopener")}catch(e){Q({tone:"error",text:String(e?.message||(0,a.__)("预览失败","jio"))})}},[me]),{markLocalSaved:_e,clear:be}=function({key:e,snapshot:a,onFound:n}){const o=(0,t.useRef)(a);o.current=a;const r=(0,t.useRef)(!1);return(0,t.useEffect)(()=>{if(!r.current){r.current=!0;try{const t=window.localStorage.getItem(e);if(!t)return;const o=JSON.parse(t),r="string"==typeof o.at?Date.parse(o.at):NaN;if(!Number.isFinite(r)||Date.now()-r>6048e5)return void window.localStorage.removeItem(e);"string"==typeof o.content&&o.content!==a.content&&n(String(o.at))}catch(t){window.localStorage.removeItem(e)}}},[e,n,a.content]),{markLocalSaved:(0,t.useCallback)(()=>{try{window.localStorage.setItem(e,JSON.stringify(o.current))}catch(e){}},[e]),clear:(0,t.useCallback)(()=>{try{window.localStorage.removeItem(e)}catch(e){}},[e])}}({key:K,snapshot:{title:n.title,content:n.content,at:(new Date).toISOString()},onFound:e=>Z({savedAt:e})}),he=function({enabled:e,onSave:a,onLocal:n,remoteDelay:o=4e3,localDelay:r=1500}){const i=(0,t.useRef)(null),l=(0,t.useRef)(null),c=(0,t.useRef)(!1),s=(0,t.useRef)(a),d=(0,t.useRef)(n);s.current=a,d.current=n;const u=(0,t.useCallback)(()=>{i.current&&(window.clearTimeout(i.current),i.current=null),l.current&&(window.clearTimeout(l.current),l.current=null)},[]),m=(0,t.useCallback)(async()=>{if(!c.current){c.current=!0;try{await s.current()}finally{c.current=!1}}},[]),p=(0,t.useCallback)(()=>{u(),d.current(),e&&(l.current=window.setTimeout(()=>d.current(),r),i.current=window.setTimeout(()=>{m()},o))},[u,e,m,r,o]);return(0,t.useEffect)(()=>{if(!e)return;const t=()=>{"hidden"===document.visibilityState&&m()},a=()=>{m()};return document.addEventListener("visibilitychange",t),window.addEventListener("blur",a),()=>{document.removeEventListener("visibilitychange",t),window.removeEventListener("blur",a),u()}},[u,e,m]),(0,t.useMemo)(()=>({schedule:p,flush:m,cancel:u}),[u,m,p])}({enabled:!!ae.isLoggedIn,onSave:async()=>{const e=await me(!0);return e&&be(),e},onLocal:_e}).schedule;(0,t.useEffect)(()=>{ee.current&&he()},[n,he]),(0,t.useEffect)(()=>{const e=e=>{ee.current&&(e.preventDefault(),e.returnValue="")};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[]),(0,t.useEffect)(()=>{const e=e=>{(e.metaKey||e.ctrlKey)&&"s"===e.key.toLowerCase()&&(e.preventDefault(),me(!1))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[me]),(0,t.useEffect)(()=>{const e=window.wp?.editor;if(!e||"function"!=typeof e.initialize)return void Q({tone:"error",text:(0,a.__)("TinyMCE 加载失败,请刷新页面后重试。","jio")});const t={quicktags:!1,tinymce:{menubar:!1,statusbar:!1,resize:!1,toolbar1:"",toolbar2:"",toolbar3:"",plugins:"paste,link,lists,wordpress,wplink",wpautop:!0,body_class:"jio-creator__tinymce",content_css:H.creator?.contentCss||"",content_style:'\nbody {\n\tposition: relative;\n\tmargin: 0;\n\tcolor: #2b2b2b;\n\tfont-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;\n\tfont-size: 16px;\n\tline-height: 1.8;\n\tletter-spacing: 0.01em;\n}\np { margin: 0 0 1.1em; }\nh1, h2, h3, h4, h5, h6 { margin: 1.5em 0 0.65em; line-height: 1.4; }\nimg, iframe { max-width: 100%; }\nimg { height: auto; }\n\n/*\n * 块级删除控件。它由 editor-runtime 插进 iframe 的 body,样式必须写在这里:\n * 父页面样式表管不到 iframe 内部,缺这条规则时按钮会退化成正文顶部的常显小方块。\n * 正文是流式布局且 iframe 高度随内容增长,所以按整篇正文定位,而不是相对某个块。\n */\n#jio-block-actions {\n\tposition: absolute;\n\tz-index: 5;\n\ttop: 6px;\n\tleft: 6px;\n\topacity: 0;\n\tpointer-events: none;\n\ttransition: opacity 0.15s ease;\n}\n#jio-block-actions.is-visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n#jio-block-actions .jio-creator__block-action {\n\tdisplay: inline-flex;\n\theight: 26px;\n\talign-items: center;\n\tgap: 5px;\n\tpadding: 0 9px;\n\tborder: 1px solid #e3e7e5;\n\tborder-radius: 6px;\n\tbackground: #fff;\n\tcolor: #7d8683;\n\tfont: inherit;\n\tfont-size: 12px;\n\tline-height: 1;\n\twhite-space: nowrap;\n\tbox-shadow: 0 2px 8px rgba(24, 39, 34, 0.08);\n\tcursor: pointer;\n}\n#jio-block-actions .jio-creator__block-action-icon {\n\tfont-size: 11px;\n\tline-height: 1;\n}\n#jio-block-actions .jio-creator__block-action:hover {\n\tborder-color: #cdd6d2;\n\tcolor: #4f5957;\n}\n#jio-block-actions.is-selected .jio-creator__block-action {\n\tborder-color: #e0a99b;\n\tbackground: #fdf2ee;\n\tcolor: #b4573f;\n}\n#jio-block-actions.is-selected .jio-creator__block-action:hover {\n\tborder-color: #cf8574;\n\tbackground: #fbe7e1;\n}\n\n/* 第一次点击选中的块:虚线高亮,明确「还没删」。 */\n.jio-creator__block-selected {\n\toutline: 2px dashed rgba(180, 87, 63, 0.55);\n\toutline-offset: 3px;\n\tborder-radius: 4px;\n}\n\n/*\n * 代码块:与前台文章页保持一致,只用 pre > code。\n * 前台由 EnlighterJS 高亮,编辑器里给出同一份底色与等宽排版。\n */\npre {\n\tmargin: 0 0 1.1em;\n\tpadding: 14px 18px;\n\toverflow-x: auto;\n\tborder-radius: 8px;\n\tbackground: #f2f4f5;\n\tcolor: #2b2b2b;\n\tfont-family: Consolas, Monaco, "Courier New", monospace;\n\tfont-size: 13px;\n\tline-height: 1.6;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\npre code {\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tline-height: inherit;\n\tpadding: 0;\n\twhite-space: inherit;\n}\n\n/* 引用:与前台主题的 .quote_q 视觉一致。 */\n.quote_q {\n\tposition: relative;\n\tmargin: 10px 0 20px;\n\tpadding: 1.2em;\n\tborder-radius: 6px;\n\t--quote-color: #555;\n\tcolor: var(--quote-color);\n}\n.quote_q::before {\n\tposition: absolute;\n\tinset: 0;\n\tborder-radius: 6px;\n\tbackground: var(--quote-color);\n\tcontent: \'\';\n\topacity: 0.04;\n}\n.quote_q.quote-mce::after {\n\tposition: absolute;\n\ttop: 20px;\n\tleft: 20px;\n\twidth: 1em;\n\theight: 1em;\n\tcolor: var(--quote-color);\n\tcontent: \'\';\n\tfont-size: 1.2em;\n\tline-height: 1;\n\topacity: 0.6;\n\t/* 引号用图标字体绘制时依赖 FA;这里用内联 SVG 数据,编辑器与前台都不缺图标。 */\n\tbackground: var(--quote-color);\n\t-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 512 512\'%3E%3Cpath d=\'M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\'/%3E%3C/svg%3E") center / contain no-repeat;\n\tmask: url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 512 512\'%3E%3Cpath d=\'M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\'/%3E%3C/svg%3E") center / contain no-repeat;\n}\n.quote_q > div {\n\tposition: relative;\n\tmin-height: 24px;\n\tpadding-left: 2em;\n\topacity: 0.7;\n}\n.quote_q > div > :first-child { margin-top: 0; }\n.quote_q > div > :last-child { margin-bottom: 0; }\n.quote_q [contenteditable="true"] {\n\toutline: 0;\n\tborder-radius: 0;\n\tbox-shadow: none;\n}\n.quote_q.qe_wzk_c-red { --quote-color: #dc3f3f; }\n.quote_q.qe_wzk_lan { --quote-color: #0092ff; }\n.quote_q.qe_wzk_lv { --quote-color: #23790e; }\n\n/* 表格。 */\n.jio-content-table {\n\twidth: 100%;\n\tmargin: 0 0 1.1em;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n.jio-content-table th,\n.jio-content-table td {\n\tpadding: 10px 12px;\n\tborder: 1px solid #e6e9e8;\n\tline-height: 1.6;\n}\n.jio-content-table thead th {\n\tbackground: #f6f8f7;\n\tfont-weight: 600;\n\ttext-align: left;\n}\n.jio-content-table.is-striped tbody tr:nth-child(odd) td { background: #f7f9f8; }\n\n/* 公式:独占一行时居中显示,不铺满整行底色。 */\n.jio-math {\n\tfont-family: "Cambria Math", "Latin Modern Math", "Times New Roman", serif;\n\tfont-size: 1.05em;\n\twhite-space: pre-wrap;\n}\n.jio-math--block {\n\tdisplay: block;\n\tmax-width: 100%;\n\tmargin: 0 auto;\n\tpadding: 2px 0;\n\toverflow-x: auto;\n\ttext-align: center;\n\tbackground: transparent;\n\tborder: 0;\n}\n.jio-math sup, .jio-math sub { font-size: 0.72em; }\n\n/* 隐藏内容:短代码放进 .hide-before / .hide-after,编辑器只显示可读标签。 */\n.tinymce-hide {\n\tposition: relative;\n\tmargin: 18px 0;\n\tpadding: 38px 14px 14px;\n\tborder: 1px dashed rgba(240, 68, 148, 0.35);\n\tborder-radius: 6px;\n\tbackground: rgba(240, 68, 148, 0.04);\n}\n.tinymce-hide > .hide-before,\n.tinymce-hide > .hide-after {\n\tmargin: 0;\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 0;\n\tline-height: 1.5;\n\tcolor: #f04494;\n}\n.tinymce-hide > .hide-before {\n\tposition: absolute;\n\ttop: 10px;\n\tleft: 14px;\n}\n.tinymce-hide > .hide-before::before {\n\tcontent: attr(data-jio-hide-label);\n\tfont-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tletter-spacing: 0.02em;\n}\n.tinymce-hide > .hide-after {\n\tdisplay: none;\n}\n.tinymce-hide > [contenteditable="true"] {\n\tmin-height: 38px;\n\tpadding: 10px;\n\tborder-radius: 4px;\n\tbackground: rgba(255, 255, 255, 0.75);\n\toutline: 0;\n}\n.tinymce-hide > [contenteditable="true"] > :first-child { margin-top: 0; }\n.tinymce-hide > [contenteditable="true"] > :last-child { margin-bottom: 0; }\n\n/* 注释:编辑器里显示上标标记,发布后由服务端渲染编号与注释列表。 */\n.jio-footnote-ref {\n\tdisplay: inline-block;\n\tmax-width: 100%;\n\tpadding: 0 6px;\n\tborder-radius: 4px;\n\tbackground: #eef5f2;\n\tcolor: #267665;\n\tfont-size: 0.78em;\n\tline-height: 1.6;\n\tvertical-align: super;\n\tcursor: default;\n}\n.jio-footnote-ref::before {\n\tcontent: \'注 \';\n\topacity: 0.6;\n}\n\n/* 附件链接。 */\n.jio-file-link {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 6px 12px;\n\tborder: 1px solid #e6e9e8;\n\tborder-radius: 6px;\n\tbackground: #f7f8f8;\n\ttext-decoration: none;\n}\n',height:520,placeholder:String(H.limits?.contentPlaceholder||""),setup:e=>{l.current=e,e.on("init",()=>{u.current=!0,_(!0),null!==d.current?(e.setContent(w(d.current)),d.current=null):e.setContent(w(e.getContent())),F(e),function(e){const t=e.getDoc();if(!t||t.getElementById("jio-block-actions"))return;const a=t.createElement("div");a.id="jio-block-actions",a.className="jio-creator__block-actions",a.setAttribute("data-mce-bogus","all"),a.innerHTML='',t.body.appendChild(a);const n=a.querySelector("[data-jio-block-delete]"),o=a.querySelector(".jio-creator__block-action-text");let r=null,i=null;const l=e=>"selected"===e?"再次点击删除此块":"选中此块",c=e=>{a.classList.toggle("is-selected","selected"===e),o&&(o.textContent=l(e));const t=l(e);n?.setAttribute("title",t),n?.setAttribute("aria-label",t)},s=e=>{const n=e.getBoundingClientRect(),o=Math.max(n.left+8,n.right-96);a.style.top=`${n.top+t.documentElement.scrollTop+6}px`,a.style.left=`${o+t.documentElement.scrollLeft}px`},d=e=>{e&&e!==t.body&&("P"!==e.tagName||""!==(e.textContent||"").trim()||e.querySelector("img,iframe,table,pre"))?(r=e,s(e),a.classList.add("is-visible")):a.classList.remove("is-visible")},u=()=>{i&&i.classList.remove(V),i=null,c("idle"),r?d(r):a.classList.remove("is-visible")};t.addEventListener("mouseover",e=>{const a=e.target?.closest?.("table,pre,hr,.quote_q,.tinymce-hide,p");a&&a!==t.body&&(i||d(a))}),t.addEventListener("mouseleave",()=>{r=null,i?s(i):a.classList.remove("is-visible")}),a.addEventListener("mousedown",e=>e.preventDefault()),a.addEventListener("click",t=>{const n=t.target?.closest("[data-jio-block-delete]"),o=i||r;if(!n||!o)return;if(t.preventDefault(),i!==o)return i&&i.classList.remove(V),i=o,o.classList.add(V),c("selected"),s(o),void a.classList.add("is-visible");const l=o,d=l.parentElement;l.classList.remove(V),i=null,r=null,a.classList.remove("is-visible","is-selected"),c("idle"),e.undoManager.transact(()=>{e.dom.remove(l)}),0===e.getBody().children.length&&e.setContent(""),d&&0===d.children.length&&e.setContent("");const u=e.getBody().firstChild;u&&e.selection.setCursorLocation(u,0),e.nodeChanged(),e.undoManager.add(),F(e)}),t.addEventListener("mousedown",e=>{a.contains(e.target)||i&&u()}),t.addEventListener("keydown",e=>{"Escape"===e.key&&i&&u()}),e.on("Undo Redo SetContent",()=>{i&&!t.body.contains(i)&&(i=null,c("idle"),a.classList.remove("is-visible","is-selected"))})}(e),ce(e),se(e),de(e)}),e.on("NodeChange",()=>{se(e),de(e)}),e.on("input change Undo Redo AddUndo",()=>{le(k(e.getContent())),ce(e),F(e)}),e.on("keydown",t=>{if((t.metaKey||t.ctrlKey)&&83===t.keyCode)return t.preventDefault(),void m.current();!function(e,t){const a=Number(t.keyCode);if(8!==a&&46!==a)return;const n=e.selection;if(!n||!n.isCollapsed())return;const o=e.getBody(),r=n.getNode(),i=(l=r)&&1===l.nodeType&&""===(l.textContent||"").trim()&&!e.dom.getParent(l,T,o)?r:null;var l;const c=i?8===a?i.previousElementSibling:i.nextElementSibling:null;if((e=>!!e&&1===e.nodeType&&!!e.matches?.(T))(c))return t.preventDefault(),e.dom.remove(c),e.nodeChanged(),void e.undoManager.add();const s=e.dom.getParent(r,T,o);if(!s)return;const d=t=>{const a=e.dom.createRng();a.selectNodeContents(s),a.collapse(t);const o=n.getRng();return o&&"function"==typeof o.compareBoundaryPoints&&0===o.compareBoundaryPoints(t?1:3,a)};if(!(8===a&&d(!0)||46===a&&d(!1)))return;t.preventDefault();const u=s.parentElement;e.dom.remove(s),u&&0===u.children.length&&(e.setContent(""),e.selection.setCursorLocation(e.getBody().firstChild,0)),e.nodeChanged(),e.undoManager.add()}(e,t)})}}};return e.initialize(J,t),()=>{e.remove?.(J),u.current=!1,l.current=null}},[le,de,se]);const ge=(0,t.useCallback)(()=>{try{const e=window.localStorage.getItem(K);if(e){const t=JSON.parse(e),a={};"string"==typeof t.title&&(a.title=t.title),"string"==typeof t.content&&(a.content=t.content),ie(a),"string"==typeof t.content&&(u.current?l.current?.setContent(t.content):d.current=t.content)}}catch(e){}Z(null)},[ie]),ye=(0,t.useCallback)(()=>{const e=l.current;e&&!e.removed&&(c.current=e.selection.getBookmark(2,!0))},[]),je=(0,t.useCallback)(()=>{const e=l.current;if(!e||e.removed)return null;if(e.focus(),c.current){try{e.selection.moveToBookmark(c.current)}catch(e){}c.current=null}return e},[]),ve=(0,t.useCallback)((e,t)=>{const a=je();if(a){if("undo"===e)a.undoManager.undo();else if("redo"===e)a.undoManager.redo();else if("format"===e){const e=t||"p";a.execCommand("FormatBlock",!1,e),se(a)}else"align"===e?(a.execCommand("center"===t?"JustifyCenter":"right"===t?"JustifyRight":"JustifyLeft"),de(a)):a.execCommand(e);a.nodeChanged()}},[je,de,se]),Ee=(0,t.useCallback)(()=>{const e=je();if(!e)return;const t=window.wpLink;if(t&&"function"==typeof t.open)return void t.open(e.id);const n=window.prompt((0,a.__)("输入链接地址","jio"),"https://"),o=n?X(n):"";o&&e.execCommand("mceInsertLink",!1,{href:o})},[je]),ke=(0,t.useCallback)(e=>{const t=je();t&&e&&(t.insertContent(e),t.undoManager.add(),t.nodeChanged(),le(k(t.getContent())),ce(t),F(t))},[je]),we=(0,t.useCallback)(e=>{if(ye(),"table"!==e&&"math"!==e&&"footnote"!==e)if("code"!==e){if("ul"===e||"ol"===e){const t=je();return void(t&&(t.execCommand("ol"===e?"InsertOrderedList":"InsertUnorderedList"),t.undoManager.add(),t.nodeChanged(),le(k(t.getContent())),de(t)))}"divider"===e&&ke("");else U(e)},[je,ke,ye,de]),Ne=(0,t.useCallback)(e=>{const t=je();if(!t)return;if(""===String(t.selection.getContent({format:"html"})||"").trim()){const e=t.selection.getNode();e&&"P"===e.nodeName&&e.parentNode===t.getBody()&&t.selection.select(e)}const a=String(t.selection.getContent({format:"html"})||"").trim();t.undoManager.transact(()=>{t.insertContent(e(a))}),t.nodeChanged(),le(k(t.getContent())),ce(t),F(t),de(t)},[je,de]),Ce=(0,t.useCallback)(e=>{const t=je();if(!t)return;const a=t.dom.getParent(t.selection.getNode(),".quote_q");if(a){const n=["quote_q","quote-mce"];return e&&n.push(e),a.className=n.join(" "),t.nodeChanged(),de(t),void le(k(t.getContent()))}Ne(t=>function(e,t){const a=["quote_q","quote-mce"];return t&&a.push(t),`${a}
`:`${a}`}(e)):ke(function(e){const t=e.trim()||(0,a.__)("注释内容","jio");return`${I(t)}`}(e.note))},[ke]),Me=(0,t.useCallback)(e=>{const t=l.current,n=window.JioSubmitMedia;t&&n&&"function"==typeof n.open?(ye(),n.open({type:e,multiple:"image"===e&&void 0,onSelect:t=>{const a=Array.isArray(t)?t:[t],n=je();if(!n)return;const o=a.map(t=>{const a=X(t?.large_url||t?.url);if(!a)return"";const n=Number(t.attachment_id||t.id||0),o=n>0?` data-edit-file-id="${n}"`:"";if("image"===e){const e=X(t?.url||a),n=e?` data-full-url="${W(e)}"`:"";return`${M(a)}
`).replace(/\[jio_footnote\]([\s\S]*?)\[\/jio_footnote\]/g,(e,t)=>`${t}`):e}const M=e=>e.replace(/&/g,"&").replace(//g,">").replace(/\^\{([^{}]*)\}|\^(\S)/gu,"$1$2").replace(/_\{([^{}]*)\}|_(\S)/gu,"$1$2"),$={ready:(0,a.__)("尚未保存","jio"),saving:(0,a.__)("保存中…","jio"),saved:(0,a.__)("已保存","jio"),error:(0,a.__)("保存失败","jio"),conflict:(0,a.__)("内容已在别处更新","jio"),submitting:(0,a.__)("提交中…","jio"),submitted:(0,a.__)("已提交","jio")};function L({value:t}){return(0,e.createElement)("span",{className:`jio-creator__save is-${t.state}`,role:"status","aria-live":"polite"},(0,e.createElement)("i",{className:"fa fas fa-circle","aria-hidden":"true"}),(0,e.createElement)("span",null,$[t.state]||$.ready),"saved"===t.state&&t.at?(0,e.createElement)("time",null,t.at):null)}const q=36e5,P=24*q,I=30*P,R=365*P,D={ready:(0,a.__)("草稿","jio"),saving:(0,a.__)("保存中","jio"),saved:(0,a.__)("草稿","jio"),error:(0,a.__)("保存失败","jio"),conflict:(0,a.__)("冲突","jio"),submitting:(0,a.__)("提交中","jio"),submitted:(0,a.__)("已提交","jio")};function z({charCount:t,saveState:n,isPublishedEdit:o,saving:r,onSaveDraft:i,onPreview:l,onPublish:c}){const s=n.at?function(e,t=Date.now()){const n=Date.parse(e);if(!Number.isFinite(n))return"";const o=Math.max(0,t-n);return o<6e4?(0,a.__)("刚刚","jio"):oe.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""),U=/<(?:p|div|h[1-6]|ul|ol|li|blockquote|pre|table|figure|section)\b/i,V=e=>{const t=e.trim();return""===t?"":U.test(t)?t:`${t}
`};const B={reply:{open:"[reply]",close:"[/reply]",label:(0,a.__)("评论后可查看","jio")},login:{open:'[jio_hide mode="login"]',close:"[/jio_hide]",label:(0,a.__)("登录后可查看","jio")},vip:{open:"[vip]",close:"[/vip]",label:(0,a.__)("会员可查看","jio")},payshow:{open:"[payshow]",close:"[/payshow]",label:(0,a.__)("付费后可查看","jio")}},K=(e,t,a)=>Math.min(a,Math.max(t,Number.isFinite(e)?Math.round(e):t)),T={table:(0,a.__)("插入表格","jio"),math:(0,a.__)("插入公式","jio"),footnote:(0,a.__)("插入注释","jio")};function F({kind:n,onSubmit:o,onClose:r}){const[i,l]=(0,t.useState)(3),[c,s]=(0,t.useState)(3),[d,u]=(0,t.useState)(!0),[m,p]=(0,t.useState)(!1),[_,f]=(0,t.useState)("a^2 + b^2 = c^2"),[b,h]=(0,t.useState)(!0),[g,j]=(0,t.useState)(""),y=(0,t.useRef)(null),v=(0,t.useRef)(null),E=(0,t.useRef)(null),k=(0,t.useRef)(null);(0,t.useEffect)(()=>{(v.current||E.current||k.current)?.focus();const e=e=>{"Escape"===e.key&&(e.preventDefault(),r())};return document.addEventListener("keydown",e),()=>document.removeEventListener("keydown",e)},[r]);const w=(0,t.useMemo)(()=>"footnote"===n?""!==g.trim():"math"!==n||""!==_.trim(),[n,g,_]);return(0,e.createElement)("div",{className:"jio-creator-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"jio-creator-dialog-title"},(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__backdrop","aria-label":(0,a.__)("关闭","jio"),onClick:r}),(0,e.createElement)("div",{className:"jio-creator-dialog__panel",ref:y},(0,e.createElement)("header",{className:"jio-creator-dialog__head"},(0,e.createElement)("h2",{id:"jio-creator-dialog-title"},T[n]),(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__close",onClick:r,"aria-label":(0,a.__)("关闭","jio")},(0,e.createElement)("i",{className:"fa fas fa-times","aria-hidden":"true"}))),(0,e.createElement)("div",{className:"jio-creator-dialog__body"},"table"===n&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("div",{className:"jio-creator-dialog__row"},(0,e.createElement)("label",null,(0,e.createElement)("span",null,(0,a.__)("行数","jio")),(0,e.createElement)("input",{ref:v,type:"number",min:1,max:20,value:i,onChange:e=>l(Number(e.target.value))})),(0,e.createElement)("label",null,(0,e.createElement)("span",null,(0,a.__)("列数","jio")),(0,e.createElement)("input",{type:"number",min:1,max:10,value:c,onChange:e=>s(Number(e.target.value))}))),(0,e.createElement)("label",{className:"jio-creator-dialog__check"},(0,e.createElement)("input",{type:"checkbox",checked:d,onChange:e=>u(e.target.checked)}),(0,e.createElement)("span",null,(0,a.__)("首行为表头","jio"))),(0,e.createElement)("label",{className:"jio-creator-dialog__check"},(0,e.createElement)("input",{type:"checkbox",checked:m,onChange:e=>p(e.target.checked)}),(0,e.createElement)("span",null,(0,a.__)("隔行变色","jio")))),"math"===n&&(0,e.createElement)(e.Fragment,null,(0,e.createElement)("label",{className:"jio-creator-dialog__field"},(0,e.createElement)("span",null,(0,a.__)("公式","jio")),(0,e.createElement)("textarea",{ref:E,rows:3,value:_,onChange:e=>f(e.target.value),placeholder:"a^2 + b^2 = c^2"})),(0,e.createElement)("p",{className:"jio-creator-muted"},(0,a.__)("支持上标 ^ 与下标 _,例如 x^2 与 a_n;暂不支持完整 LaTeX。","jio")),(0,e.createElement)("label",{className:"jio-creator-dialog__check"},(0,e.createElement)("input",{type:"checkbox",checked:b,onChange:e=>h(e.target.checked)}),(0,e.createElement)("span",null,(0,a.__)("独占一行显示","jio")))),"footnote"===n&&(0,e.createElement)("label",{className:"jio-creator-dialog__field"},(0,e.createElement)("span",null,(0,a.__)("注释内容","jio")),(0,e.createElement)("textarea",{ref:k,rows:4,value:g,onChange:e=>j(e.target.value),placeholder:(0,a.__)("填写要补充说明的内容","jio")}))),(0,e.createElement)("footer",{className:"jio-creator-dialog__foot"},(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__ghost",onClick:r},(0,a.__)("取消","jio")),(0,e.createElement)("button",{type:"button",className:"jio-creator-dialog__primary",onClick:()=>{w&&o("table"!==n?"math"!==n?{kind:n,note:g.trim()}:{kind:n,formula:_.trim(),display:b}:{kind:n,rows:K(i,1,20),cols:K(c,1,10),header:d,striped:m})},disabled:!w},(0,a.__)("插入","jio")))))}const H="table,pre,hr,.quote_q,.tinymce-hide,.jio-math--block";function O(e){if(!e||e.removed)return;const t=e.getDoc(),a=e.getContentAreaContainer()?.querySelector("iframe");if(!t||!a)return;const n=Math.max(320,t.documentElement.scrollHeight,t.body?t.body.scrollHeight:0);a.style.height=`${n}px`,a.style.overflow="hidden"}const J="jio-creator__block-selected",W=window.jioCreatorStudio||{},X=W.nonce||"",Y=`jio-studio-${W.sourceId||0}`,Q="jio-creator-content";function G(e){return e.replace(/&/g,"&").replace(/"/g,""").replace(//g,">")}function Z(e){const t=String(e||"").trim();if(!t)return"";try{const e=new URL(t,window.location.href);return"http:"===e.protocol||"https:"===e.protocol?e.href:""}catch(e){return""}}function ee(e){const t=document.createElement("div");return t.innerHTML=e,(t.textContent||"").replace(/\s+/g,"")}function te(){const[n,o]=(0,t.useState)(()=>function(e){const t=e.pay||{},a=e.categories&&e.categories.selected||[],n=e.tags&&e.tags.items||[];return{postId:Number(e.sourceId||0),versionId:Number(e.versionId||0),rev:Number(e.versionRev||0),title:String(e.title||""),content:String(e.content||""),schedule:{enabled:!1,at:""},categories:a.map(Number),tags:n.slice(),custom:e.custom||{},featured:e.featured||{type:"",data:{}},pay:{enabled:!!t.enabled,modo:"points"===t.payModo?"points":"cash",price:String(t.price||"0.00"),points:Number(t.points||0),vip1Price:String(t.vip1Price||"0.00"),vip2Price:String(t.vip2Price||"0.00"),vip1Points:Number(t.vip1Points||0),vip2Points:Number(t.vip2Points||0),payLimit:Number(t.payLimit||0),downloads:Array.isArray(t.downloads)?t.downloads:[]}}}(W)),i=(0,t.useRef)(n);i.current=n;const l=(0,t.useRef)(null),c=(0,t.useRef)(null),s=(0,t.useRef)(null),d=(0,t.useRef)(!1),u=(0,t.useRef)(()=>{}),[m,_]=(0,t.useState)(!1),[f,b]=(0,t.useState)({canUndo:!1,canRedo:!1}),[h,j]=(0,t.useState)("p"),[y,v]=(0,t.useState)("left"),[E,C]=(0,t.useState)("p"),[M,$]=(0,t.useState)(()=>({state:W.sourceId||W.versionId||W.content?"saved":"ready",at:""})),[L,q]=(0,t.useState)(!1),[P,I]=(0,t.useState)(null),[R,D]=(0,t.useState)(null),[U,K]=(0,t.useState)(null),T=(0,t.useRef)(!1),te=(0,t.useRef)(0),ae=W.capabilities||{},ne={titleMin:Number(W.limits?.titleMin||1),titleMax:Number(W.limits?.titleMax||30),titlePlaceholder:String(W.limits?.titlePlaceholder||(0,a.__)("请输入标题","jio")),priceMin:Number(W.pay?.priceMin||0),priceMax:Number(W.pay?.priceMax||0),pointsMin:Number(W.pay?.pointsMin||0),pointsMax:Number(W.pay?.pointsMax||0)},oe=!!W.isPublished,re=(0,t.useMemo)(()=>Array.from(ee(n.content)).length,[n.content]),ie=(0,t.useCallback)(e=>{T.current=!0,te.current+=1;const t={...i.current,...e};i.current=t,o(t)},[]),le=(0,t.useCallback)(e=>{if(e===i.current.content)return;T.current=!0,te.current+=1;const t={...i.current,content:e};i.current=t,o(t)},[]),ce=(0,t.useCallback)(e=>{const t=e?.undoManager;t&&b({canUndo:"function"==typeof t.hasUndo&&t.hasUndo(),canRedo:"function"==typeof t.hasRedo&&t.hasRedo()})},[]),se=(0,t.useCallback)(e=>{const t=e?.selection?.getNode(),a=t?e.dom.getParent(t,"p,h1,h2,h3,h4,h5,h6")||t:null,n=a?.nodeName?.toLowerCase()||"p";j(["h1","h2","h3","h4"].includes(n)?n:"p")},[]),de=(0,t.useCallback)(e=>{const t=e?.selection?.getNode();if(!t)return;const a=e.getBody(),n=String(e.formatter?.match?.(["alignleft","aligncenter","alignright"])||"");v("aligncenter"===n?"center":"alignright"===n?"right":"left");const o=e.dom.getParent(t,".quote_q",a);if(o){const e=Array.from(o.classList).find(e=>0===e.indexOf("qe_wzk_"));return void C(e||"quote")}e.dom.getParent(t,"ul",a)?C("ul"):e.dom.getParent(t,"ol",a)?C("ol"):C("p")},[]),ue=(0,t.useCallback)((e={})=>{const t=i.current;return{post_id:t.postId,version_id:t.versionId,rev:t.rev,title:t.title,content:t.content,categories:t.categories,tags:t.tags,custom:t.custom,featured:t.featured,schedule:{enabled:!!t.schedule.enabled,at:t.schedule.enabled?t.schedule.at:""},pay:N(t.pay),...e}},[]),me=(0,t.useCallback)(async(e=!1)=>{const t=l.current;t&&!t.removed&&le(S(t.getContent()));const a=i.current;if(!T.current&&(a.postId>0||a.versionId>0))return!0;const n=te.current;if(""===a.title.trim()&&""===ee(a.content).trim()&&!/<(?:img|table|pre|hr|iframe|video)/i.test(a.content))return!0;$({state:"saving",at:""});try{const t=await r(W.creator.saveUrl,ue({autosave:e}),X),a={...i.current,postId:Number(t.post_id||i.current.postId||0),versionId:Number(t.version_id||i.current.versionId||0),rev:Number(t.rev||t.versionRev||i.current.rev||0)};window.jioSubmitData&&(window.jioSubmitData.postId=a.postId);const l=te.current===n;return T.current=!l,i.current=a,o(a),$({state:l?"saved":"saving",at:l?(new Date).toLocaleTimeString():""}),l}catch(e){return $({state:409===e?.status?"conflict":"error",at:""}),!1}},[ue]);u.current=()=>{me(!1)};const pe=(0,t.useCallback)(async e=>{if(await me(!1)){$({state:"submitting",at:""});try{let t="";const n=window.JioCaptcha;if(W.captcha?.enabled&&n&&"function"==typeof n.run){const e=await n.run("front_submit");if(null===e)return $({state:"ready",at:""}),void D({tone:"error",text:(0,a.__)("请先完成人机验证","jio")});t=String(e?.jio_captcha_proof||"")}const o=await r(W.creator.submitUrl,ue({post_id:i.current.postId,version_id:i.current.versionId,rev:i.current.rev,publish_now:e,captcha_proof:t}),X);T.current=!1,$({state:"submitted",at:""}),D({tone:"ok",text:String(o.message||(0,a.__)("已提交","jio"))}),q(!1);const l=o.url||o.goto||W.urls?.center;l&&window.setTimeout(()=>{window.location.href=l},900)}catch(e){$({state:"error",at:""}),D({tone:"error",text:String(e?.message||(0,a.__)("提交失败","jio"))})}}else D({tone:"error",text:(0,a.__)("内容保存失败,请重试后再提交","jio")})},[ue,me]),_e=(0,t.useCallback)(async()=>{if(await me(!1))try{const e=await r(W.creator.previewUrl,{post_id:i.current.postId,version_id:i.current.versionId},X);e.url&&window.open(String(e.url),"_blank","noopener")}catch(e){D({tone:"error",text:String(e?.message||(0,a.__)("预览失败","jio"))})}},[me]),{markLocalSaved:fe,clear:be}=function({key:e,snapshot:a,onFound:n}){const o=(0,t.useRef)(a);o.current=a;const r=(0,t.useRef)(!1);return(0,t.useEffect)(()=>{if(!r.current){r.current=!0;try{const t=window.localStorage.getItem(e);if(!t)return;const o=JSON.parse(t),r="string"==typeof o.at?Date.parse(o.at):NaN;if(!Number.isFinite(r)||Date.now()-r>6048e5)return void window.localStorage.removeItem(e);"string"==typeof o.content&&o.content!==a.content&&n(String(o.at))}catch(t){window.localStorage.removeItem(e)}}},[e,n,a.content]),{markLocalSaved:(0,t.useCallback)(()=>{try{window.localStorage.setItem(e,JSON.stringify(o.current))}catch(e){}},[e]),clear:(0,t.useCallback)(()=>{try{window.localStorage.removeItem(e)}catch(e){}},[e])}}({key:Y,snapshot:{title:n.title,content:n.content,at:(new Date).toISOString()},onFound:e=>K({savedAt:e})}),he=function({enabled:e,onSave:a,onLocal:n,remoteDelay:o=4e3,localDelay:r=1500}){const i=(0,t.useRef)(null),l=(0,t.useRef)(null),c=(0,t.useRef)(!1),s=(0,t.useRef)(a),d=(0,t.useRef)(n);s.current=a,d.current=n;const u=(0,t.useCallback)(()=>{i.current&&(window.clearTimeout(i.current),i.current=null),l.current&&(window.clearTimeout(l.current),l.current=null)},[]),m=(0,t.useCallback)(async()=>{if(!c.current){c.current=!0;try{await s.current()}finally{c.current=!1}}},[]),p=(0,t.useCallback)(()=>{u(),d.current(),e&&(l.current=window.setTimeout(()=>d.current(),r),i.current=window.setTimeout(()=>{m()},o))},[u,e,m,r,o]);return(0,t.useEffect)(()=>{if(!e)return;const t=()=>{"hidden"===document.visibilityState&&m()},a=()=>{m()};return document.addEventListener("visibilitychange",t),window.addEventListener("blur",a),()=>{document.removeEventListener("visibilitychange",t),window.removeEventListener("blur",a),u()}},[u,e,m]),(0,t.useMemo)(()=>({schedule:p,flush:m,cancel:u}),[u,m,p])}({enabled:!!ae.isLoggedIn,onSave:async()=>{const e=await me(!0);return e&&be(),e},onLocal:fe}).schedule;(0,t.useEffect)(()=>{T.current&&he()},[n,he]),(0,t.useEffect)(()=>{const e=e=>{T.current&&(e.preventDefault(),e.returnValue="")};return window.addEventListener("beforeunload",e),()=>window.removeEventListener("beforeunload",e)},[]),(0,t.useEffect)(()=>{const e=e=>{(e.metaKey||e.ctrlKey)&&"s"===e.key.toLowerCase()&&(e.preventDefault(),me(!1))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[me]),(0,t.useEffect)(()=>{const e=window.wp?.editor;if(!e||"function"!=typeof e.initialize)return void D({tone:"error",text:(0,a.__)("TinyMCE 加载失败,请刷新页面后重试。","jio")});const t={quicktags:!1,tinymce:{menubar:!1,statusbar:!1,resize:!1,toolbar1:"",toolbar2:"",toolbar3:"",plugins:"paste,link,lists,wordpress,wplink",wpautop:!0,body_class:"jio-creator__tinymce",content_css:W.creator?.contentCss||"",content_style:'\nbody {\n\tposition: relative;\n\tmargin: 0;\n\tcolor: #2b2b2b;\n\tfont-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;\n\tfont-size: 16px;\n\tline-height: 1.8;\n\tletter-spacing: 0.01em;\n}\np { margin: 0 0 1.1em; }\nh1, h2, h3, h4, h5, h6 { margin: 1.5em 0 0.65em; line-height: 1.4; }\nimg, iframe { max-width: 100%; }\nimg { height: auto; }\n\n/*\n * 块级删除控件。它由 editor-runtime 插进 iframe 的 body,样式必须写在这里:\n * 父页面样式表管不到 iframe 内部,缺这条规则时按钮会退化成正文顶部的常显小方块。\n * 正文是流式布局且 iframe 高度随内容增长,所以按整篇正文定位,而不是相对某个块。\n */\n#jio-block-actions {\n\tposition: absolute;\n\tz-index: 5;\n\ttop: 6px;\n\tleft: 6px;\n\topacity: 0;\n\tpointer-events: none;\n\ttransition: opacity 0.15s ease;\n}\n#jio-block-actions.is-visible {\n\topacity: 1;\n\tpointer-events: auto;\n}\n#jio-block-actions .jio-creator__block-action {\n\tdisplay: inline-flex;\n\theight: 26px;\n\talign-items: center;\n\tgap: 5px;\n\tpadding: 0 9px;\n\tborder: 1px solid #e3e7e5;\n\tborder-radius: 6px;\n\tbackground: #fff;\n\tcolor: #7d8683;\n\tfont: inherit;\n\tfont-size: 12px;\n\tline-height: 1;\n\twhite-space: nowrap;\n\tbox-shadow: 0 2px 8px rgba(24, 39, 34, 0.08);\n\tcursor: pointer;\n}\n#jio-block-actions .jio-creator__block-action-icon {\n\tfont-size: 11px;\n\tline-height: 1;\n}\n#jio-block-actions .jio-creator__block-action:hover {\n\tborder-color: #cdd6d2;\n\tcolor: #4f5957;\n}\n#jio-block-actions.is-selected .jio-creator__block-action {\n\tborder-color: #e0a99b;\n\tbackground: #fdf2ee;\n\tcolor: #b4573f;\n}\n#jio-block-actions.is-selected .jio-creator__block-action:hover {\n\tborder-color: #cf8574;\n\tbackground: #fbe7e1;\n}\n\n/* 第一次点击选中的块:虚线高亮,明确「还没删」。 */\n.jio-creator__block-selected {\n\toutline: 2px dashed rgba(180, 87, 63, 0.55);\n\toutline-offset: 3px;\n\tborder-radius: 4px;\n}\n\n/*\n * 代码块:与前台文章页保持一致,只用 pre > code。\n * 前台由 EnlighterJS 高亮,编辑器里给出同一份底色与等宽排版。\n */\npre {\n\tmargin: 0 0 1.1em;\n\tpadding: 14px 18px;\n\toverflow-x: auto;\n\tborder-radius: 8px;\n\tbackground: #f2f4f5;\n\tcolor: #2b2b2b;\n\tfont-family: Consolas, Monaco, "Courier New", monospace;\n\tfont-size: 13px;\n\tline-height: 1.6;\n\twhite-space: pre-wrap;\n\tword-wrap: break-word;\n}\npre code {\n\tborder: 0;\n\tbackground: transparent;\n\tcolor: inherit;\n\tfont-family: inherit;\n\tfont-size: inherit;\n\tline-height: inherit;\n\tpadding: 0;\n\twhite-space: inherit;\n}\n\n/* 引用:与前台主题的 .quote_q 视觉一致。 */\n.quote_q {\n\tposition: relative;\n\tmargin: 10px 0 20px;\n\tpadding: 1.2em;\n\tborder-radius: 6px;\n\t--quote-color: #555;\n\tcolor: var(--quote-color);\n}\n.quote_q::before {\n\tposition: absolute;\n\tinset: 0;\n\tborder-radius: 6px;\n\tbackground: var(--quote-color);\n\tcontent: \'\';\n\topacity: 0.04;\n}\n.quote_q.quote-mce::after {\n\tposition: absolute;\n\ttop: 20px;\n\tleft: 20px;\n\twidth: 1em;\n\theight: 1em;\n\tcolor: var(--quote-color);\n\tcontent: \'\';\n\tfont-size: 1.2em;\n\tline-height: 1;\n\topacity: 0.6;\n\t/* 引号用图标字体绘制时依赖 FA;这里用内联 SVG 数据,编辑器与前台都不缺图标。 */\n\tbackground: var(--quote-color);\n\t-webkit-mask: url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 512 512\'%3E%3Cpath d=\'M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\'/%3E%3C/svg%3E") center / contain no-repeat;\n\tmask: url("data:image/svg+xml,%3Csvg xmlns=\'http://www.w3.org/2000/svg\' viewBox=\'0 0 512 512\'%3E%3Cpath d=\'M464 256h-80v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8c-88.4 0-160 71.6-160 160v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48zm-288 0H96v-64c0-35.3 28.7-64 64-64h8c13.3 0 24-10.7 24-24V56c0-13.3-10.7-24-24-24h-8C71.6 32 0 103.6 0 192v240c0 26.5 21.5 48 48 48h128c26.5 0 48-21.5 48-48V304c0-26.5-21.5-48-48-48z\'/%3E%3C/svg%3E") center / contain no-repeat;\n}\n.quote_q > div {\n\tposition: relative;\n\tmin-height: 24px;\n\tpadding-left: 2em;\n\topacity: 0.7;\n}\n.quote_q > div > :first-child { margin-top: 0; }\n.quote_q > div > :last-child { margin-bottom: 0; }\n.quote_q [contenteditable="true"] {\n\toutline: 0;\n\tborder-radius: 0;\n\tbox-shadow: none;\n}\n.quote_q.qe_wzk_c-red { --quote-color: #dc3f3f; }\n.quote_q.qe_wzk_lan { --quote-color: #0092ff; }\n.quote_q.qe_wzk_lv { --quote-color: #23790e; }\n\n/* 表格。 */\n.jio-content-table {\n\twidth: 100%;\n\tmargin: 0 0 1.1em;\n\tborder-collapse: collapse;\n\tfont-size: 14px;\n}\n.jio-content-table th,\n.jio-content-table td {\n\tpadding: 10px 12px;\n\tborder: 1px solid #e6e9e8;\n\tline-height: 1.6;\n}\n.jio-content-table thead th {\n\tbackground: #f6f8f7;\n\tfont-weight: 600;\n\ttext-align: left;\n}\n.jio-content-table.is-striped tbody tr:nth-child(odd) td { background: #f7f9f8; }\n\n/* 公式:独占一行时居中显示,不铺满整行底色。 */\n.jio-math {\n\tfont-family: "Cambria Math", "Latin Modern Math", "Times New Roman", serif;\n\tfont-size: 1.05em;\n\twhite-space: pre-wrap;\n}\n.jio-math--block {\n\tdisplay: block;\n\tmax-width: 100%;\n\tmargin: 0 auto;\n\tpadding: 2px 0;\n\toverflow-x: auto;\n\ttext-align: center;\n\tbackground: transparent;\n\tborder: 0;\n}\n.jio-math sup, .jio-math sub { font-size: 0.72em; }\n\n/* 隐藏内容:短代码放进 .hide-before / .hide-after,编辑器只显示可读标签。 */\n.tinymce-hide {\n\tposition: relative;\n\tmargin: 18px 0;\n\tpadding: 38px 14px 14px;\n\tborder: 1px dashed rgba(240, 68, 148, 0.35);\n\tborder-radius: 6px;\n\tbackground: rgba(240, 68, 148, 0.04);\n}\n.tinymce-hide > .hide-before,\n.tinymce-hide > .hide-after {\n\tmargin: 0;\n\tfont-family: Consolas, Monaco, monospace;\n\tfont-size: 0;\n\tline-height: 1.5;\n\tcolor: #f04494;\n}\n.tinymce-hide > .hide-before {\n\tposition: absolute;\n\ttop: 10px;\n\tleft: 14px;\n}\n.tinymce-hide > .hide-before::before {\n\tcontent: attr(data-jio-hide-label);\n\tfont-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", "PingFang SC", "Microsoft YaHei", sans-serif;\n\tfont-size: 12px;\n\tfont-weight: 600;\n\tletter-spacing: 0.02em;\n}\n.tinymce-hide > .hide-after {\n\tdisplay: none;\n}\n.tinymce-hide > [contenteditable="true"] {\n\tmin-height: 38px;\n\tpadding: 10px;\n\tborder-radius: 4px;\n\tbackground: rgba(255, 255, 255, 0.75);\n\toutline: 0;\n}\n.tinymce-hide > [contenteditable="true"] > :first-child { margin-top: 0; }\n.tinymce-hide > [contenteditable="true"] > :last-child { margin-bottom: 0; }\n\n/* 注释:编辑器里显示上标标记,发布后由服务端渲染编号与注释列表。 */\n.jio-footnote-ref {\n\tdisplay: inline-block;\n\tmax-width: 100%;\n\tpadding: 0 6px;\n\tborder-radius: 4px;\n\tbackground: #eef5f2;\n\tcolor: #267665;\n\tfont-size: 0.78em;\n\tline-height: 1.6;\n\tvertical-align: super;\n\tcursor: default;\n}\n.jio-footnote-ref::before {\n\tcontent: \'注 \';\n\topacity: 0.6;\n}\n\n/* 附件链接。 */\n.jio-file-link {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: 6px;\n\tpadding: 6px 12px;\n\tborder: 1px solid #e6e9e8;\n\tborder-radius: 6px;\n\tbackground: #f7f8f8;\n\ttext-decoration: none;\n}\n',height:520,placeholder:String(W.limits?.contentPlaceholder||""),setup:e=>{l.current=e,e.on("init",()=>{d.current=!0,_(!0),null!==s.current?(e.setContent(x(s.current)),s.current=null):e.setContent(x(e.getContent())),O(e),function(e){const t=e.getDoc();if(!t||t.getElementById("jio-block-actions"))return;const a=t.createElement("div");a.id="jio-block-actions",a.className="jio-creator__block-actions",a.setAttribute("data-mce-bogus","all"),a.innerHTML='',t.body.appendChild(a);const n=a.querySelector("[data-jio-block-delete]"),o=a.querySelector(".jio-creator__block-action-text");let r=null,i=null;const l=e=>"selected"===e?"再次点击删除此块":"选中此块",c=e=>{a.classList.toggle("is-selected","selected"===e),o&&(o.textContent=l(e));const t=l(e);n?.setAttribute("title",t),n?.setAttribute("aria-label",t)},s=e=>{const n=e.getBoundingClientRect(),o=Math.max(n.left+8,n.right-96);a.style.top=`${n.top+t.documentElement.scrollTop+6}px`,a.style.left=`${o+t.documentElement.scrollLeft}px`},d=e=>{e&&e!==t.body&&("P"!==e.tagName||""!==(e.textContent||"").trim()||e.querySelector("img,iframe,table,pre"))?(r=e,s(e),a.classList.add("is-visible")):a.classList.remove("is-visible")},u=()=>{i&&i.classList.remove(J),i=null,c("idle"),r?d(r):a.classList.remove("is-visible")};t.addEventListener("mouseover",e=>{const a=e.target?.closest?.("table,pre,hr,.quote_q,.tinymce-hide,p");a&&a!==t.body&&(i||d(a))}),t.addEventListener("mouseleave",()=>{r=null,i?s(i):a.classList.remove("is-visible")}),a.addEventListener("mousedown",e=>e.preventDefault()),a.addEventListener("click",t=>{const n=t.target?.closest("[data-jio-block-delete]"),o=i||r;if(!n||!o)return;if(t.preventDefault(),i!==o)return i&&i.classList.remove(J),i=o,o.classList.add(J),c("selected"),s(o),void a.classList.add("is-visible");const l=o,d=l.parentElement;l.classList.remove(J),i=null,r=null,a.classList.remove("is-visible","is-selected"),c("idle"),e.undoManager.transact(()=>{e.dom.remove(l)}),0===e.getBody().children.length&&e.setContent(""),d&&0===d.children.length&&e.setContent("");const u=e.getBody().firstChild;u&&e.selection.setCursorLocation(u,0),e.nodeChanged(),e.undoManager.add(),O(e)}),t.addEventListener("mousedown",e=>{a.contains(e.target)||i&&u()}),t.addEventListener("keydown",e=>{"Escape"===e.key&&i&&u()}),e.on("Undo Redo SetContent",()=>{i&&!t.body.contains(i)&&(i=null,c("idle"),a.classList.remove("is-visible","is-selected"))})}(e),ce(e),se(e),de(e)}),e.on("NodeChange",()=>{se(e),de(e)}),e.on("input change Undo Redo AddUndo",()=>{le(S(e.getContent())),ce(e),O(e)}),e.on("keydown",t=>{if((t.metaKey||t.ctrlKey)&&83===t.keyCode)return t.preventDefault(),void u.current();!function(e,t){const a=Number(t.keyCode);if(8!==a&&46!==a)return;const n=e.selection;if(!n||!n.isCollapsed())return;const o=e.getBody(),r=n.getNode(),i=(l=r)&&1===l.nodeType&&""===(l.textContent||"").trim()&&!e.dom.getParent(l,H,o)?r:null;var l;const c=i?8===a?i.previousElementSibling:i.nextElementSibling:null;if((e=>!!e&&1===e.nodeType&&!!e.matches?.(H))(c))return t.preventDefault(),e.dom.remove(c),e.nodeChanged(),void e.undoManager.add();const s=e.dom.getParent(r,H,o);if(!s)return;const d=t=>{const a=e.dom.createRng();a.selectNodeContents(s),a.collapse(t);const o=n.getRng();return o&&"function"==typeof o.compareBoundaryPoints&&0===o.compareBoundaryPoints(t?1:3,a)};if(!(8===a&&d(!0)||46===a&&d(!1)))return;t.preventDefault();const u=s.parentElement;e.dom.remove(s),u&&0===u.children.length&&(e.setContent(""),e.selection.setCursorLocation(e.getBody().firstChild,0)),e.nodeChanged(),e.undoManager.add()}(e,t)})}}};return e.initialize(Q,t),()=>{e.remove?.(Q),d.current=!1,l.current=null}},[le,de,se]);const ge=(0,t.useCallback)(()=>{try{const e=window.localStorage.getItem(Y);if(e){const t=JSON.parse(e),a={};"string"==typeof t.title&&(a.title=t.title),"string"==typeof t.content&&(a.content=t.content),ie(a),"string"==typeof t.content&&(d.current?l.current?.setContent(t.content):s.current=t.content)}}catch(e){}K(null)},[ie]),je=(0,t.useCallback)(()=>{const e=l.current;e&&!e.removed&&(c.current=e.selection.getBookmark(2,!0))},[]),ye=(0,t.useCallback)(()=>{const e=l.current;if(!e||e.removed)return null;if(e.focus(),c.current){try{e.selection.moveToBookmark(c.current)}catch(e){}c.current=null}return e},[]),ve=(0,t.useCallback)((e,t)=>{const a=ye();if(a){if("undo"===e)a.undoManager.undo();else if("redo"===e)a.undoManager.redo();else if("format"===e){const e=t||"p";a.execCommand("FormatBlock",!1,e),se(a)}else"align"===e?(a.execCommand("center"===t?"JustifyCenter":"right"===t?"JustifyRight":"JustifyLeft"),de(a)):a.execCommand(e);a.nodeChanged()}},[ye,de,se]),Ee=(0,t.useCallback)(()=>{const e=ye();if(!e)return;const t=window.wpLink;if(t&&"function"==typeof t.open)return void t.open(e.id);const n=window.prompt((0,a.__)("输入链接地址","jio"),"https://"),o=n?Z(n):"";o&&e.execCommand("mceInsertLink",!1,{href:o})},[ye]),ke=(0,t.useCallback)(e=>{const t=ye();t&&e&&(t.insertContent(e),t.undoManager.add(),t.nodeChanged(),le(S(t.getContent())),ce(t),O(t))},[ye]),we=(0,t.useCallback)(e=>{if(je(),"table"!==e&&"math"!==e&&"footnote"!==e)if("code"!==e){if("ul"===e||"ol"===e){const t=ye();return void(t&&(t.execCommand("ol"===e?"InsertOrderedList":"InsertUnorderedList"),t.undoManager.add(),t.nodeChanged(),le(S(t.getContent())),de(t)))}"divider"===e&&ke("
")}else ke("");else I(e)},[ye,ke,je,de]),Ne=(0,t.useCallback)(e=>{const t=ye();if(!t)return;if(""===String(t.selection.getContent({format:"html"})||"").trim()){const e=t.selection.getNode();e&&"P"===e.nodeName&&e.parentNode===t.getBody()&&t.selection.select(e)}const a=String(t.selection.getContent({format:"html"})||"").trim();t.undoManager.transact(()=>{t.insertContent(e(a))}),t.nodeChanged(),le(S(t.getContent())),ce(t),O(t),de(t)},[ye,de]),Ce=(0,t.useCallback)(e=>{const t=ye();if(!t)return;const a=t.dom.getParent(t.selection.getNode(),".quote_q");if(a){const n=["quote_q","quote-mce"];return e&&n.push(e),a.className=n.join(" "),t.nodeChanged(),de(t),void le(S(t.getContent()))}Ne(t=>function(e,t){const a=["quote_q","quote-mce"];return t&&a.push(t),``}(t,e))},[ye,de,Ne]),Se=(0,t.useCallback)(e=>{const t=ye();if(!t)return;const a=t.dom.getParent(t.selection.getNode(),".tinymce-hide");if(a)return function(e,t){const a=B[t];e.setAttribute("data-jio-hide-type",t);const n=e.querySelector(":scope > .hide-before"),o=e.querySelector(":scope > .hide-after");n&&(n.textContent=a.open,n.setAttribute("data-jio-hide-label",a.label)),o&&(o.textContent=a.close)}(a,e),t.nodeChanged(),void le(S(t.getContent()));Ne(t=>function(e,t){const a=B[e];return`${V(e)}`}(e,t))},[ye,Ne]),xe=(0,t.useCallback)(e=>{I(null),"table"===e.kind?ke(function({rows:e,cols:t,header:n,striped:o}){const r=Math.max(1,Math.min(20,e)),i=Math.max(1,Math.min(10,t)),l=e=>Array.from({length:i},(t,n)=>`<${e}>${"th"===e?A(`${(0,a.__)("列","jio")} ${n+1}`):""}${e}>`).join("");let c="";n&&(c+=`${V(t)}${l("th")} `);const s=Math.max(1,n?r-1:r);c+=`${Array.from({length:s},()=>`${l("td")} `).join("")}`;const d=["jio-content-table"];return o&&d.push("is-striped"),`${c}
`}(e)):"math"===e.kind?ke(function({formula:e,display:t}){const a=(n=e.trim(),A(n).replace(/\^\{([^{}]*)\}|\^(\S)/gu,"$1$2").replace(/_\{([^{}]*)\}|_(\S)/gu,"$1$2"));var n;const o=`data-jio-math-source="${A(e.trim())}" data-jio-math-display="${t?"1":"0"}"`;return t?`${a}
`:`${a}`}(e)):ke(function(e){const t=e.trim()||(0,a.__)("注释内容","jio");return`${A(t)}`}(e.note))},[ke]),Me=(0,t.useCallback)(e=>{const t=l.current,n=window.JioSubmitMedia;t&&n&&"function"==typeof n.open?(je(),n.open({type:e,multiple:"image"===e&&void 0,onSelect:t=>{const a=Array.isArray(t)?t:[t],n=ye();if(!n)return;const o=a.map(t=>{const a=Z(t?.large_url||t?.url);if(!a)return"";const n=Number(t.attachment_id||t.id||0),o=n>0?` data-edit-file-id="${n}"`:"";if("image"===e){const e=Z(t?.url||a),n=e?` data-full-url="${G(e)}"`:"";return``}if("file"===e){const e=String(t.filename||t.name||a.split("/").pop()||"");return``}return``}).join("");o&&(n.insertContent(o),n.nodeChanged(),le(n.getContent()),ce(n))},onEmbed:e=>{const t=ye();t&&(t.insertContent(`${e}`),t.nodeChanged(),le(t.getContent()),ce(t))}})):D({tone:"error",text:(0,a.__)("媒体工具尚未加载,请刷新页面后重试。","jio")})},[ye,je]);return(0,e.createElement)("div",{className:"jio-creator","data-status":W.status||"","data-editor-ready":m?"true":"false"},(0,e.createElement)("div",{className:"jio-creator__top"},(0,e.createElement)(w,{centerUrl:String(W.urls?.center||""),site:W.site||{},viewer:W.viewer||{}}),(0,e.createElement)("header",{className:"jio-creator__bar"},(0,e.createElement)(g,{ready:m,formatValue:h,onFormatChange:j,alignValue:y,blockValue:E,canUndo:f.canUndo,canRedo:f.canRedo,capabilities:ae,onCommand:ve,onRememberSelection:je,onOpenLink:Ee,onOpenMedia:Me,onInsertBlock:we,onInsertQuote:Ce,onInsertHidden:Se}))),U&&(0,e.createElement)("div",{className:"jio-creator__notice",role:"status"},(0,e.createElement)("span",null,(0,a.__)("发现本地未同步的草稿。","jio")),(0,e.createElement)("button",{type:"button",onClick:ge},(0,a.__)("恢复","jio")),(0,e.createElement)("button",{type:"button",onClick:()=>K(null)},(0,a.__)("忽略","jio"))),R&&(0,e.createElement)("div",{className:`jio-creator__notice is-${R.tone}`,role:"status"},(0,e.createElement)("span",null,R.text),(0,e.createElement)("button",{type:"button",onClick:()=>D(null),"aria-label":(0,a.__)("关闭","jio")},(0,e.createElement)("i",{className:"fa fas fa-times","aria-hidden":"true"}))),oe&&(0,e.createElement)("p",{className:"jio-creator__hint"},(0,a.__)("这篇改稿不会立即覆盖线上文章;审核通过后才会替换。","jio")),(0,e.createElement)("main",{className:"jio-creator__canvas"},(0,e.createElement)("label",{className:"jio-creator__title"},(0,e.createElement)("span",{className:"screen-reader-text"},(0,a.__)("文章标题","jio")),(0,e.createElement)("textarea",{value:n.title,onChange:e=>ie({title:e.target.value}),rows:1,placeholder:(0,a.sprintf)(/* translators: %d: max title length */ /* translators: %d: max title length */ +(0,a.__)("请输入标题(最多 %d 个字)","jio"),Number(ne.titleMax)||100),spellCheck:!1,maxLength:Number(ne.titleMax)||100})),(0,e.createElement)("div",{className:"jio-creator__editor","data-editor-ready":m?"true":"false"},(0,e.createElement)("textarea",{id:Q,defaultValue:n.content,onChange:e=>le(e.target.value),"aria-label":(0,a.__)("文章正文","jio")}))),(0,e.createElement)(k,{featured:n.featured,canEditCover:!!ae.canUploadImage,canSchedule:!!ae.canSchedule,scheduleEnabled:!!n.schedule.enabled,scheduleAt:n.schedule.at,onFeaturedChange:e=>ie({featured:e}),onScheduleChange:(e,t)=>ie({schedule:{enabled:e,at:t}})}),P&&(0,e.createElement)(F,{kind:P,onSubmit:xe,onClose:()=>I(null)}),(0,e.createElement)(z,{charCount:re,saveState:M,isPublishedEdit:oe,saving:!m||"saving"===M.state||"submitting"===M.state,onSaveDraft:()=>{me(!1)},onPreview:()=>{_e()},onPublish:()=>q(!0)}),L&&(0,e.createElement)(p,{draft:n,setDraft:ie,capabilities:ae,limits:ne,taxonomy:{categories:W.categories&&W.categories.items||[],tags:!!W.tags?.enabled,customDefs:W.customDefs||[]},isPublishedEdit:oe,onClose:()=>q(!1),onSaveDraft:()=>{me(!1)},onSubmit:e=>{pe(e)},privateStorage:!!W.privateStorage,privateUploads:W.privateUploads||[],captcha:!!W.captcha?.enabled,saving:"saving"===M.state||"submitting"===M.state}))}function ae(){const a=document.getElementById("jio-creator-studio");a&&(a.classList.add("is-ready"),(0,t.createRoot)(a).render((0,e.createElement)(te,null)))}"loading"===document.readyState?document.addEventListener("DOMContentLoaded",ae):ae()})(); \ No newline at end of file diff --git a/assets/creator-studio/src/components/resource-dialog.tsx b/assets/creator-studio/src/components/resource-dialog.tsx new file mode 100644 index 00000000..3cef602c --- /dev/null +++ b/assets/creator-studio/src/components/resource-dialog.tsx @@ -0,0 +1,254 @@ +/** + * 付费资源编辑器。 + * + * 与前台投稿页的「添加资源」弹窗保持同一组字段:下载地址、资源备注(提取码)、 + * 复制名称 / 内容、自定义按钮文案、按钮样式,以及从媒体库挑一个普通附件。 + * 粘贴网盘分享链接时自动拆分地址与提取码,和原实现一致。 + * + * @package Jio + */ + +import { useEffect, useRef, useState } from '@wordpress/element'; +import { __, sprintf } from '@wordpress/i18n'; + +import type { DownloadRow } from '../draft'; + +type Props = { + /** 编辑已有资源时传入;为空表示新增。 */ + row: DownloadRow | null; + buttonClasses: string[]; + /** 打开媒体库选普通附件(可上传),返回 URL 与附件 ID。 */ + onPickAttachment: (apply: (url: string, attachmentId: number) => void) => void; + onSubmit: (row: DownloadRow) => void; + onClose: () => void; +}; + +type Fields = { + url: string; + attachmentId: number; + extractCode: string; + copyKey: string; + copyVal: string; + label: string; + class: string; +}; + +const EMPTY: Fields = { + url: '', + attachmentId: 0, + extractCode: '', + copyKey: '', + copyVal: '', + label: '', + class: '', +}; + +function safeHttpUrl(value: string): string { + const raw = value.trim(); + if (!raw) { + return ''; + } + try { + const url = new URL(raw, window.location.href); + return url.protocol === 'http:' || url.protocol === 'https:' ? url.href : ''; + } catch (error) { + return ''; + } +} + +export function ResourceDialog({ row, buttonClasses, onPickAttachment, onSubmit, onClose }: Props) { + const [fields, setFields] = useState
(() => + row + ? { + url: String(row.url || ''), + attachmentId: Number(row.attachmentId || 0), + extractCode: String(row.extractCode || ''), + copyKey: String(row.copyKey || ''), + copyVal: String(row.copyVal || ''), + label: String(row.label || ''), + class: String(row.class || ''), + } + : { ...EMPTY } + ); + const [error, setError] = useState(''); + const urlRef = useRef (null); + + useEffect(() => { + urlRef.current?.focus(); + const onKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + event.preventDefault(); + onClose(); + } + }; + document.addEventListener('keydown', onKeyDown); + return () => document.removeEventListener('keydown', onKeyDown); + }, [onClose]); + + const patch = (next: Partial ) => setFields((current) => ({ ...current, ...next })); + + /** 粘贴分享文本:拆出地址与「提取码:xxxx」。 */ + const onPaste = (event: React.ClipboardEvent ) => { + const text = event.clipboardData?.getData('text') || ''; + if (!text) { + return; + } + const urlMatch = text.match(/https?:\/\/\S+/i); + const codeMatch = text.match(/(?:提取码|密码)\s*[::]\s*([A-Za-z0-9]{4,8})/); + if (!urlMatch && !codeMatch) { + return; + } + event.preventDefault(); + const next: Partial = { attachmentId: 0 }; + if (urlMatch) { + next.url = urlMatch[0].replace(/[)\],。]+$/u, ''); + } + if (codeMatch) { + next.extractCode = sprintf( + /* translators: %s: extraction code */ + __('提取码:%s', 'jio'), + codeMatch[1] + ); + next.copyKey = __('提取码', 'jio'); + next.copyVal = codeMatch[1]; + } + patch(next); + }; + + const submit = () => { + const url = safeHttpUrl(fields.url); + if (!url) { + setError(__('请填写有效的下载地址', 'jio')); + return; + } + setError(''); + const isNetDisk = /pan\.baidu\.com|aliyundrive\.com|alipan\.com|pan\.quark\.cn|cloud\.189\.cn|115\.com|lanzou|weiyun|123pan/i.test( + url + ); + onSubmit({ + ...(row || {}), + type: isNetDisk ? 'net_disk' : 'direct', + url, + attachmentId: Math.max(0, Number(fields.attachmentId) || 0), + extractCode: fields.extractCode.trim(), + copyKey: fields.copyKey.trim(), + copyVal: fields.copyVal.trim(), + label: fields.label.trim(), + class: fields.class, + }); + }; + + return ( + + ++ ); +} diff --git a/assets/creator-studio/src/draft.ts b/assets/creator-studio/src/draft.ts index 859ef4bd..68106068 100644 --- a/assets/creator-studio/src/draft.ts +++ b/assets/creator-studio/src/draft.ts @@ -8,6 +8,22 @@ export type Featured = { type: string; data: Record+++ + +{row ? __('编辑资源', 'jio') : __('添加资源', 'jio')}
+ ++ + + + ++ + ++ + ++ + {__('填写后读者可点击按钮复制这段内容。', 'jio')} + + + + ++ {__('按钮样式', 'jio')} ++ + {error &&+ {buttonClasses.map((value) => ( ++{error}
} +; mediaId?: number }; +/** 付费资源行:与前台投稿的资源编辑器字段一一对应。 */ +export type DownloadRow = { + type: 'protected' | 'direct' | 'net_disk'; + assetKey?: string; + url?: string; + label?: string; + fileName?: string; + sizeBytes?: number; + sizeLabel?: string; + extractCode?: string; + copyKey?: string; + copyVal?: string; + class?: string; + attachmentId?: number; +}; + export type PayState = { enabled: boolean; modo: 'cash' | 'points'; @@ -15,8 +31,10 @@ export type PayState = { points: number; vip1Price: string; vip2Price: string; + vip1Points: number; + vip2Points: number; payLimit: number; - downloads: Array >; + downloads: DownloadRow[]; }; export type Limits = { @@ -67,6 +85,8 @@ export function initialDraft(bootstrap: Record ): Draft { points: Number(pay.points || 0), vip1Price: String(pay.vip1Price || '0.00'), vip2Price: String(pay.vip2Price || '0.00'), + vip1Points: Number(pay.vip1Points || 0), + vip2Points: Number(pay.vip2Points || 0), payLimit: Number(pay.payLimit || 0), downloads: Array.isArray(pay.downloads) ? pay.downloads : [], }, diff --git a/assets/creator-studio/src/panels/pay-panel.tsx b/assets/creator-studio/src/panels/pay-panel.tsx new file mode 100644 index 00000000..9bb50644 --- /dev/null +++ b/assets/creator-studio/src/panels/pay-panel.tsx @@ -0,0 +1,343 @@ +/** + * 发布抽屉里的付费配置。 + * + * 与前台投稿页的「付费内容」卡片对齐:现金 / 积分切换、普通价、会员价 + * (手动填写或按折扣自动计算)、以及付费下载资源列表。服务端仍是价格的 + * 唯一裁决者(最低 / 最高价、会员价不得高于普通价),这里只负责收集输入。 + * + * @package Jio + */ + +import { useRef, useState } from '@wordpress/element'; +import { __, sprintf } from '@wordpress/i18n'; + +import type { DownloadRow, PayState } from '../draft'; +import { ResourceDialog } from '../components/resource-dialog'; + +export type PayBootstrap = { + freeAllowed?: boolean; + vipManual?: boolean; + vip1Enabled?: boolean; + vip2Enabled?: boolean; + vip1Name?: string; + vip2Name?: string; + pointsEnabled?: boolean; + downloadClasses?: string[]; + currencySymbol?: string; + priceMin?: number; + priceMax?: number; + pointsMin?: number; + pointsMax?: number; +}; + +type Props = { + pay: PayState; + onChange: (pay: PayState) => void; + canDownload: boolean; + privateStorage: boolean; + privateUploads: Array >; + bootstrap: PayBootstrap; + onUploadPrivate: (file: File) => Promise ; + uploading: boolean; + uploadError: string; + onPickAttachment: (apply: (url: string, attachmentId: number) => void) => void; +}; + +const toNumber = (value: string, fallback = 0): number => { + const parsed = Number(value); + return Number.isFinite(parsed) ? parsed : fallback; +}; + +export function PayPanel({ + pay, + onChange, + canDownload, + privateStorage, + privateUploads, + bootstrap, + onUploadPrivate, + uploading, + uploadError, + onPickAttachment, +}: Props) { + const [editing, setEditing] = useState<{ row: DownloadRow | null; index: number } | null>(null); + const fileInput = useRef (null); + + const patch = (next: Partial ) => onChange({ ...pay, ...next }); + const points = pay.modo === 'points'; + const symbol = String(bootstrap.currencySymbol || '¥'); + const buttonClasses = bootstrap.downloadClasses && bootstrap.downloadClasses.length > 0 + ? bootstrap.downloadClasses + : ['', 'c-blue', 'b-blue', 'jb-blue']; + + const uploads = pay.downloads; + + const addUploaded = async (file: File | undefined) => { + if (!file) { + return; + } + const row = await onUploadPrivate(file); + if (row) { + patch({ enabled: true, downloads: [...uploads, row] }); + } + if (fileInput.current) { + fileInput.current.value = ''; + } + }; + + const applyResource = (row: DownloadRow) => { + const index = editing?.index ?? -1; + const next = index >= 0 + ? uploads.map((item, position) => (position === index ? row : item)) + : [...uploads, row]; + setEditing(null); + patch({ enabled: true, downloads: next }); + }; + + const priceLabel = (name: string) => + points + ? sprintf(/* translators: %s: VIP level name */ __('%s 积分', 'jio'), name) + : sprintf(/* translators: %s: VIP level name */ __('%s 价格', 'jio'), name); + + const renderPriceInput = ( + label: string, + value: string, + onInput: (next: string) => void, + options: { min?: number; step: string; suffix?: string; prefix?: string; placeholder?: string } + ) => ( + + ); + + return ( + <> + ++ + {pay.enabled && ( +++ +{__('付费内容', 'jio')}
++ {__('开启后,未购买读者只能看到免费部分;添加下载资源后同时出售下载权限。', 'jio')} +
++ {bootstrap.pointsEnabled && ( ++ )} + + {editing && ( ++ + ++ )} + + {points + ? renderPriceInput(__('设置积分', 'jio'), String(pay.points), (next) => patch({ points: toNumber(next) }), { + min: Number(bootstrap.pointsMin || 0), + step: '1', + suffix: __('积分', 'jio'), + placeholder: '0', + }) + : renderPriceInput(__('设置价格', 'jio'), pay.price, (next) => patch({ price: next }), { + min: Number(bootstrap.priceMin || 0), + step: '0.01', + prefix: symbol, + placeholder: '0.00', + })} + + {/* 会员价:只有后台开启「手动填写会员价」且存在会员等级时才需要作者填。 */} + {bootstrap.vipManual && (bootstrap.vip1Enabled || bootstrap.vip2Enabled) && ( ++ {bootstrap.vip1Enabled && + (points + ? renderPriceInput( + priceLabel(String(bootstrap.vip1Name || 'VIP1')), + String(pay.vip1Points), + (next) => patch({ vip1Points: toNumber(next) }), + { step: '1', suffix: __('积分', 'jio'), placeholder: '0' } + ) + : renderPriceInput( + priceLabel(String(bootstrap.vip1Name || 'VIP1')), + pay.vip1Price, + (next) => patch({ vip1Price: next }), + { step: '0.01', prefix: symbol, placeholder: '0.00' } + ))} + {bootstrap.vip2Enabled && + (points + ? renderPriceInput( + priceLabel(String(bootstrap.vip2Name || 'VIP2')), + String(pay.vip2Points), + (next) => patch({ vip2Points: toNumber(next) }), + { step: '1', suffix: __('积分', 'jio'), placeholder: '0' } + ) + : renderPriceInput( + priceLabel(String(bootstrap.vip2Name || 'VIP2')), + pay.vip2Price, + (next) => patch({ vip2Price: next }), + { step: '0.01', prefix: symbol, placeholder: '0.00' } + ))} ++ )} + + {canDownload && ( ++ {__('会员价不能高于普通价,填 0 表示会员免费。', 'jio')} +
+++ )} + +++ + {!privateStorage && ( +++{__('付费下载', 'jio')}
++ {__('添加网盘链接或受保护附件,读者付费后才能下载。', 'jio')} +
++ + {privateStorage && ( + + )} +++ {__('私有附件存储尚未配置,只能添加外部下载地址。', 'jio')} +
+ )} + {uploadError &&{uploadError}
} + + {uploads.length > 0 && ( ++ {uploads.map((row, index) => ( +
+ )} + + {privateUploads.length > 0 && ( +- + + {row.sizeLabel && {row.sizeLabel}} + +
+ ))} +++ )} +{__('从已上传资料中选择', 'jio')}
++ {privateUploads + .filter((item) => !uploads.some((row) => row.assetKey === item.assetKey)) + .map((item) => ( +
+- + {item.fileName} + {item.sizeLabel} + +
+ ))} ++ {__('请确保正文里已用「隐藏内容」标注了付费可见的片段。', 'jio')} +
+setEditing(null)} + /> + )} + > + ); +} diff --git a/assets/creator-studio/src/panels/publish-drawer.tsx b/assets/creator-studio/src/panels/publish-drawer.tsx index 0578fec4..a937a737 100644 --- a/assets/creator-studio/src/panels/publish-drawer.tsx +++ b/assets/creator-studio/src/panels/publish-drawer.tsx @@ -12,26 +12,8 @@ import { useEffect, useMemo, useRef, useState } from '@wordpress/element'; import { __, sprintf } from '@wordpress/i18n'; import { apiUpload } from '../services/api'; - -type PayState = { - enabled: boolean; - modo: 'cash' | 'points'; - price: string; - points: number; - vip1Price: string; - vip2Price: string; - payLimit: number; - downloads: Array >; -}; - -type Draft = { - postId: number; - title: string; - categories: number[]; - tags: string[]; - custom: Record ; - pay: PayState; -}; +import type { DownloadRow, Draft } from '../draft'; +import { PayPanel, type PayBootstrap } from './pay-panel'; type Capabilities = Record ; @@ -87,9 +69,24 @@ export function PublishDrawer(props: Props) { const [tagInput, setTagInput] = useState(''); const [uploadError, setUploadError] = useState(''); const [uploading, setUploading] = useState(false); - const fileInput = useRef (null); const captchaSlot = useRef (null); + const payBootstrap: PayBootstrap = { + freeAllowed: !!bootstrap.pay?.freeAllowed, + vipManual: !!bootstrap.pay?.vipManual, + vip1Enabled: !!bootstrap.pay?.vip1Enabled, + vip2Enabled: !!bootstrap.pay?.vip2Enabled, + vip1Name: String(bootstrap.pay?.vip1Name || ''), + vip2Name: String(bootstrap.pay?.vip2Name || ''), + pointsEnabled: !!bootstrap.pay?.pointsEnabled, + downloadClasses: Array.isArray(bootstrap.pay?.downloadClasses) ? bootstrap.pay.downloadClasses : [], + currencySymbol: String(bootstrap.pay?.currencySymbol || ''), + priceMin: Number(bootstrap.pay?.priceMin || 0), + priceMax: Number(bootstrap.pay?.priceMax || 0), + pointsMin: Number(bootstrap.pay?.pointsMin || 0), + pointsMax: Number(bootstrap.pay?.pointsMax || 0), + }; + // 人机验证由 PHP 渲染(脚本在页面加载时按 uid 注册实例),这里只把挂载点 // 移进抽屉,保证验证控件在用户提交时可见、可交互。 useEffect(() => { @@ -132,18 +129,15 @@ export function PublishDrawer(props: Props) { setTagInput(''); }; - const uploadAttachment = async () => { - const file = fileInput.current?.files?.[0]; - if (!file) { - return; - } + /** 上传一个受保护附件到私有存储,只保留 asset_key。 */ + const uploadPrivate = async (file: File): Promise => { setUploadError(''); setUploading(true); try { const response = await apiUpload(bootstrap.creator.privateUrl, file, nonce, { post_id: String(draft.postId || 0), }); - const next = { + return { type: 'protected', assetKey: String(response.asset_key || ''), fileName: String(response.name || file.name), @@ -151,22 +145,35 @@ export function PublishDrawer(props: Props) { sizeLabel: String(response.size_label || ''), label: '', }; - setDraft({ - pay: { ...draft.pay, enabled: true, downloads: [...draft.pay.downloads, next] }, - }); - if (fileInput.current) { - fileInput.current.value = ''; - } } catch (error: any) { setUploadError(String(error?.message || __('资料上传失败', 'jio'))); + return null; } finally { setUploading(false); } }; - const removeDownload = (index: number) => { - setDraft({ - pay: { ...draft.pay, downloads: draft.pay.downloads.filter((_, i) => i !== index) }, + /** + * 从媒体库挑一个普通附件,把 URL 与附件 ID 回填到资源弹窗。 + * 复用前台投稿的媒体选择器,避免再造一套上传 UI。 + */ + const pickAttachment = (apply: (url: string, attachmentId: number) => void) => { + const media = (window as any).JioSubmitMedia; + if (!media || typeof media.open !== 'function') { + setUploadError(__('媒体选择器尚未加载,请刷新页面后重试。', 'jio')); + return; + } + media.open({ + type: 'file', + multiple: false, + allowExternal: false, + onSelect: (selected: any) => { + const item = Array.isArray(selected) ? selected[0] : selected; + if (!item) { + return; + } + apply(String(item.url || ''), Number(item.attachment_id || item.id || 0)); + }, }); }; @@ -276,150 +283,18 @@ export function PublishDrawer(props: Props) { {capabilities.canPay && ( - )} diff --git a/assets/creator-studio/src/styles/_block-tools.scss b/assets/creator-studio/src/styles/_block-tools.scss index 1b8a3fc4..1b1aedce 100644 --- a/assets/creator-studio/src/styles/_block-tools.scss +++ b/assets/creator-studio/src/styles/_block-tools.scss @@ -35,6 +35,11 @@ box-shadow: 0 24px 70px rgba(20, 32, 28, 0.22); } +/* 资源编辑器字段多,给一版更宽的面板。 */ +.jio-creator-dialog__panel--wide { + width: min(560px, 100%); +} + .jio-creator-dialog__head { display: flex; align-items: center; @@ -148,6 +153,86 @@ } } +/* ---------- 付费资源编辑器 ---------- */ + +.jio-creator-dialog__hint { + color: #9aa2a0; + font-size: 12px; + line-height: 1.5; +} + +.jio-creator-dialog__url { + display: flex; + gap: 8px; + + input { + flex: 1; + min-width: 0; + } + + .jio-creator-dialog__ghost { + flex: 0 0 auto; + height: 38px; + gap: 6px; + white-space: nowrap; + } +} + +/* 按钮样式色块:用前台公开调色板(--jio-*)渲染,与发布后的下载按钮同一套色。 */ +.jio-creator-swatches { + display: flex; + flex-wrap: wrap; + gap: 6px; +} + +.jio-creator-swatch { + width: 30px; + height: 22px; + padding: 0; + border: 2px solid #fff; + border-radius: 6px; + background: #e3e7e5; + box-shadow: 0 0 0 1px #e3e7e5; + cursor: pointer; + + &.b-theme { + background: var(--jc-accent); + } + + &.c-red { background: var(--jio-rose, #f43f5e); } + &.c-yellow { background: var(--jio-yellow, #eab308); } + &.c-cyan { background: var(--jio-cyan, #06b6d4); } + &.c-blue { background: var(--jio-blue, #3b82f6); } + &.c-green { background: var(--jio-green, #10b981); } + &.c-purple { background: var(--jio-purple, #8b5cf6); } + + &.b-red { background: var(--jio-red, #ef4444); } + &.b-yellow { background: var(--jio-yellow, #eab308); } + &.b-cyan { background: var(--jio-cyan, #06b6d4); } + &.b-blue { background: var(--jio-blue, #3b82f6); } + &.b-green { background: var(--jio-green, #10b981); } + &.b-purple { background: var(--jio-purple, #8b5cf6); } + + &.jb-red { background: linear-gradient(135deg, #fd7a64 10%, #fb2d2d 100%); } + &.jb-pink { background: linear-gradient(135deg, var(--jio-grad-sunset-1, #f093fb) 10%, var(--jio-grad-sunset-2, #f5576c) 100%); } + &.jb-yellow { background: linear-gradient(135deg, var(--jio-grad-fire-2, #f9d423) 10%, var(--jio-orange, #f97316) 100%); } + &.jb-cyan { background: linear-gradient(135deg, var(--jio-grad-ocean-1, #4facfe) 10%, var(--jio-grad-ocean-2, #00f2fe) 100%); } + &.jb-blue { background: linear-gradient(135deg, #3dcabd 10%, #254bdd 100%); } + &.jb-green { background: linear-gradient(135deg, var(--jio-grad-forest-1, #43e97b) 10%, var(--jio-grad-forest-2, #38f9d7) 100%); } + &.jb-purple { background: linear-gradient(135deg, var(--jio-grad-night-1, #a18cd1) 10%, var(--jio-grad-night-2, #fbc2eb) 100%); } + &.jb-vip1 { background: linear-gradient(135deg, var(--jio-vip-gold-1, #f6d365) 10%, var(--jio-vip-gold-2, #fda085) 100%); } + &.jb-vip2 { background: linear-gradient(135deg, #f6d365 10%, #f43f5e 100%); } + + &.is-active { + box-shadow: 0 0 0 2px var(--jc-accent); + } + + &:focus-visible { + outline: 0; + box-shadow: 0 0 0 2px var(--jc-accent); + } +} + .jio-creator-dialog__foot { display: flex; justify-content: flex-end; diff --git a/assets/creator-studio/src/styles/_publish-drawer.scss b/assets/creator-studio/src/styles/_publish-drawer.scss index 601a47bc..1460df27 100644 --- a/assets/creator-studio/src/styles/_publish-drawer.scss +++ b/assets/creator-studio/src/styles/_publish-drawer.scss @@ -261,6 +261,60 @@ } } +/* 价格输入:带货币 / 积分后缀,输入区仍保持右对齐的数字。 */ +.jio-creator-price { + display: inline-flex; + align-items: center; + gap: 4px; + color: $ink-soft; + + em { + font-size: 12px; + font-style: normal; + } + + input { + width: 118px; + } +} + +/* 现金 / 积分切换:分段控件,比原生 radio 更贴近前台投稿卡片。 */ +.jio-creator-segment { + display: inline-flex; + gap: 4px; + margin-bottom: 4px; + padding: 3px; + border-radius: 9px; + background: #eef1f0; + + button { + min-height: 30px; + padding: 0 14px; + border: 0; + border-radius: 7px; + background: transparent; + color: $ink-soft; + cursor: pointer; + font-size: 13px; + + &:hover { + color: $accent-strong; + } + + &.is-active { + background: #fff; + color: $accent-strong; + box-shadow: 0 1px 3px rgba(24, 39, 34, 0.1); + } + } +} + +.jio-creator-vip-prices { + margin-top: 4px; + padding-top: 6px; + border-top: 1px dashed $line; +} + .jio-creator-cover { position: relative; overflow: hidden; @@ -317,14 +371,25 @@ .jio-creator-attachments__head { display: flex; - align-items: center; + align-items: flex-start; justify-content: space-between; gap: 12px; h4 { - margin: 0; + margin: 0 0 2px; font-size: 13px; } + + .jio-creator-muted { + margin: 0; + } +} + +.jio-creator-attachments__actions { + display: inline-flex; + flex: 0 0 auto; + align-items: center; + gap: 8px; } .jio-creator-upload { @@ -361,7 +426,6 @@ } button { - margin-left: auto; border: 0; background: transparent; color: $ink-soft; @@ -369,20 +433,45 @@ } } +/* 资源名本身可点开编辑器,删除按钮单独占右侧。 */ .jio-creator-files__name { display: inline-flex; min-width: 0; + flex: 1; align-items: center; gap: 8px; overflow: hidden; + padding: 0; + border: 0; + background: transparent; + color: $accent-strong; + cursor: pointer; + font: inherit; + text-align: left; text-overflow: ellipsis; white-space: nowrap; + &:hover { + text-decoration: underline; + } + i { + flex: 0 0 auto; color: $accent; } } +.jio-creator-files__remove { + flex: 0 0 auto; + margin-left: auto; + color: #9aa2a0 !important; + + &:hover, + &:focus-visible { + color: $warn !important; + } +} + .jio-creator-reuse { margin-top: 14px; font-size: 13px; diff --git a/assets/creator-studio/src/utils/pay.ts b/assets/creator-studio/src/utils/pay.ts index f9dfd7d9..42fe3882 100644 --- a/assets/creator-studio/src/utils/pay.ts +++ b/assets/creator-studio/src/utils/pay.ts @@ -2,31 +2,24 @@ * 付费配置 → 请求体。 * * 受保护附件只提交 asset_key,不提交任何文件路径或公开 URL;服务端会再次 - * 校验附件归属并重新清洗。 + * 校验附件归属并重新清洗。字段名与前台投稿表单(jio_pay[...])保持一致, + * 这样两条投稿路径写入的是同一份 pay meta。 * * @package Jio */ -type PayState = { - enabled: boolean; - modo: 'cash' | 'points'; - price: string; - points: number; - vip1Price: string; - vip2Price: string; - payLimit: number; - downloads: Array-- - {draft.pay.enabled && ( --- -{__('付费内容', 'jio')}
-{__('开启后,未购买读者只能看到免费部分。', 'jio')}
--- )} +- - -- - {draft.pay.modo === 'cash' ? ( - - ) : ( - - )} - - {capabilities.canPayDownload && ( --- )} --- - {uploadError &&{__('资料附件', 'jio')}
- {privateStorage ? ( - - ) : ( -- {__('私有附件存储尚未配置,暂时不能上传付费资料。', 'jio')} -
- )} -{uploadError}
} - - {draft.pay.downloads.length > 0 && ( -- {draft.pay.downloads.map((row, index) => ( -
- )} - - {privateUploads.length > 0 && ( -- - - {row.assetKey ? ( - <> - - {row.fileName || row.label || __('受保护资料', 'jio')} - > - ) : ( - <> - - {row.label || row.url} - > - )} - - {row.sizeLabel && {row.sizeLabel}} - -
- ))} --- )} -{__('从已上传资料中选择', 'jio')}
-- {privateUploads - .filter((item) => !draft.pay.downloads.some((row) => row.assetKey === item.assetKey)) - .map((item) => ( -
-- - {item.fileName} - {item.sizeLabel} - -
- ))} -setDraft({ pay })} + canDownload={!!capabilities.canPayDownload} + privateStorage={privateStorage} + privateUploads={privateUploads} + bootstrap={payBootstrap} + onUploadPrivate={uploadPrivate} + uploading={uploading} + uploadError={uploadError} + onPickAttachment={pickAttachment} + /> >; -}; +import type { DownloadRow, PayState } from '../draft'; export function normalizePayForRequest(pay: PayState) { const downloads = (pay.downloads || []) - .map((row) => { + .map((row: DownloadRow) => { + const label = typeof row.label === 'string' ? row.label : ''; const assetKey = typeof row.assetKey === 'string' ? row.assetKey : ''; if (assetKey) { return { type: 'protected', asset_key: assetKey, - label: typeof row.label === 'string' ? row.label : '', + label, }; } const url = typeof row.url === 'string' ? row.url.trim() : ''; @@ -34,23 +27,31 @@ export function normalizePayForRequest(pay: PayState) { return null; } return { - type: 'direct', + type: row.type === 'net_disk' ? 'net_disk' : 'direct', url, - label: typeof row.label === 'string' ? row.label : '', + label, extract_code: typeof row.extractCode === 'string' ? row.extractCode : '', + copy_key: typeof row.copyKey === 'string' ? row.copyKey : '', + copy_val: typeof row.copyVal === 'string' ? row.copyVal : '', + class: typeof row.class === 'string' ? row.class : '', + attachment_id: Math.max(0, Number(row.attachmentId) || 0), }; }) .filter(Boolean); + const points = pay.modo === 'points'; + return { enabled: !!pay.enabled, fields: { pay_type: pay.enabled ? (downloads.length > 0 ? 'download' : 'reading') : 'no', - pay_modo: pay.modo === 'points' ? 'points' : '0', - price: pay.modo === 'points' ? '0.00' : String(pay.price || '0.00'), - points_price: pay.modo === 'points' ? Math.max(0, Number(pay.points) || 0) : 0, - vip1_price: pay.modo === 'points' ? '0.00' : String(pay.vip1Price || '0.00'), - vip2_price: pay.modo === 'points' ? '0.00' : String(pay.vip2Price || '0.00'), + pay_modo: points ? 'points' : '0', + price: points ? '0.00' : String(pay.price || '0.00'), + points_price: points ? Math.max(0, Number(pay.points) || 0) : 0, + vip1_price: points ? '0.00' : String(pay.vip1Price || '0.00'), + vip2_price: points ? '0.00' : String(pay.vip2Price || '0.00'), + vip1_points: points ? Math.max(0, Number(pay.vip1Points) || 0) : 0, + vip2_points: points ? Math.max(0, Number(pay.vip2Points) || 0) : 0, pay_limit: Number(pay.payLimit) || 0, downloads, }, diff --git a/src/Core/CreatorRest.php b/src/Core/CreatorRest.php index 08a20612..496deb59 100644 --- a/src/Core/CreatorRest.php +++ b/src/Core/CreatorRest.php @@ -482,29 +482,36 @@ final class CreatorRest { if (!is_array($row)) { continue; } + // 资源行里的展示字段与前台投稿的资源编辑器一一对应,缺一个就会在 + // 审核应用后丢掉提取码 / 复制内容 / 按钮样式。 + $display = [ + 'label' => (string) ($row['label'] ?? ''), + 'extract_code' => (string) ($row['extract_code'] ?? ''), + 'copy_key' => (string) ($row['copy_key'] ?? ''), + 'copy_val' => (string) ($row['copy_val'] ?? ''), + 'class' => (string) ($row['class'] ?? ''), + 'attachment_id' => max(0, (int) ($row['attachment_id'] ?? 0)), + ]; $key = PrivateAssets::sanitize_asset_key((string) ($row['asset_key'] ?? '')); if ($key !== '') { $asset = PrivateAssets::get($key); if ($asset === null || $asset['owner_id'] !== get_current_user_id()) { continue; } - $downloads[] = [ + $downloads[] = array_merge($display, [ 'type' => 'protected', 'asset_key' => $key, 'file_name' => $asset['file_name'], 'size_bytes' => $asset['size_bytes'], - 'label' => (string) ($row['label'] ?? ''), - ]; + ]); continue; } $url = esc_url_raw((string) ($row['url'] ?? '')); if ($url !== '') { - $downloads[] = [ - 'type' => 'direct', - 'url' => $url, - 'label' => (string) ($row['label'] ?? ''), - 'extract_code' => (string) ($row['extract_code'] ?? ''), - ]; + $downloads[] = array_merge($display, [ + 'type' => (string) ($row['type'] ?? 'direct') === 'net_disk' ? 'net_disk' : 'direct', + 'url' => $url, + ]); } } @@ -653,9 +660,17 @@ final class CreatorRest { 'label' => (string) ($row['label'] ?? ''), 'fileName' => (string) ($row['file_name'] ?? ''), 'sizeBytes' => (int) ($row['size_bytes'] ?? 0), + // 前台投稿的资源编辑器字段,缺一个就会在再次编辑时丢配置。 + 'extractCode' => (string) ($row['extract_code'] ?? ''), + 'copyKey' => (string) ($row['copy_key'] ?? ''), + 'copyVal' => (string) ($row['copy_val'] ?? ''), + 'class' => (string) ($row['class'] ?? ''), + 'attachmentId' => (int) ($row['attachment_id'] ?? 0), ]; } + $vip = $this->vip_labels(); + return [ 'enabled' => (bool) $enabled, 'canPay' => $front->user_can_cap('new_post_pay', $user), @@ -665,9 +680,21 @@ final class CreatorRest { 'points' => (int) ($pay['points_price'] ?? 0), 'vip1Price' => (string) ($pay['vip1_price'] ?? '0.00'), 'vip2Price' => (string) ($pay['vip2_price'] ?? '0.00'), + 'vip1Points' => (int) ($pay['vip1_points'] ?? 0), + 'vip2Points' => (int) ($pay['vip2_points'] ?? 0), 'payLimit' => (int) ($pay['pay_limit'] ?? 0), 'downloads' => $downloads, 'freeAllowed' => !empty($settings['pay_free_s']), + // 会员价:手动填写或按折扣自动计算,决定前端是否渲染会员价输入框。 + 'vipManual' => !empty($settings['pay_vip_price_s']), + 'vip1Enabled' => !empty($settings['pay_vip_1_enabled']), + 'vip2Enabled' => !empty($settings['pay_vip_2_enabled']), + 'vip1Name' => $vip[1], + 'vip2Name' => $vip[2], + // 积分支付只有站点开启积分体系时才可选。 + 'pointsEnabled' => class_exists('\Jio\Settings\Settings') && \Jio\Settings\Settings::credits_enabled(), + 'downloadClasses' => DomainModel::DOWNLOAD_BUTTON_CLASSES, + 'currencySymbol' => $this->currency_symbol(), 'priceMin' => (int) ($settings['pay_price_min'] ?? 0), 'priceMax' => (int) ($settings['pay_price_max'] ?? 0), 'pointsMin' => (int) ($settings['pay_points_min'] ?? 0), @@ -676,6 +703,36 @@ final class CreatorRest { ]; } + /** + * 会员等级名称:与前台付费卡片保持同一来源。 + * + * @return array{1:string,2:string} + */ + private function vip_labels(): array { + $names = [1 => __('VIP1', 'jio'), 2 => __('VIP2', 'jio')]; + if (!class_exists('\Jio\Settings\PaymentRuntime')) { + return $names; + } + $vip = \Jio\Settings\PaymentRuntime::get_payment_vip_settings(); + foreach ([1, 2] as $level) { + $name = trim((string) ($vip['levels'][$level]['name'] ?? '')); + if ($name !== '') { + $names[$level] = $name; + } + } + return $names; + } + + /** 站点货币符号,用于价格输入框的前缀。 */ + private function currency_symbol(): string { + if (!class_exists('\Jio\Settings\PaymentRuntime')) { + return '¥'; + } + $paid = \Jio\Settings\PaymentRuntime::get_paid_content_settings(); + $symbol = trim((string) ($paid['display']['currency_symbol'] ?? '')); + return $symbol !== '' ? $symbol : '¥'; + } + /** * @return array */ diff --git a/tests/widget-system/creator-studio-contract.test.cjs b/tests/widget-system/creator-studio-contract.test.cjs index cf835ffb..d27c2a6b 100644 --- a/tests/widget-system/creator-studio-contract.test.cjs +++ b/tests/widget-system/creator-studio-contract.test.cjs @@ -144,7 +144,8 @@ test('studio app uses TinyMCE while preserving autosave, recovery, and publishin assert.match(api, /'X-WP-Nonce'/); assert.match(drawer, /canPay/); assert.match(drawer, /canPayDownload/); - assert.match(drawer, /私有附件存储尚未配置/); + assert.match(drawer, / { + const payPanel = read('assets/creator-studio/src/panels/pay-panel.tsx'); + const resource = read('assets/creator-studio/src/components/resource-dialog.tsx'); + const payUtil = read('assets/creator-studio/src/utils/pay.ts'); + const draft = read('assets/creator-studio/src/draft.ts'); + const rest = read('src/Core/CreatorRest.php'); + + // 现金 / 积分两种计价方式,且积分只在站点开启积分体系时出现。 + assert.match(payPanel, /现金支付/); + assert.match(payPanel, /积分支付/); + assert.match(payPanel, /bootstrap\.pointsEnabled/); + assert.match(rest, /'pointsEnabled'\s*=>/); + + // 会员价:手动填写模式与自动折扣模式由服务端决定。 + assert.match(payPanel, /bootstrap\.vipManual/); + assert.match(payPanel, /bootstrap\.vip1Enabled/); + assert.match(payPanel, /bootstrap\.vip2Enabled/); + assert.match(payPanel, /vip1Points/); + assert.match(payPanel, /vip2Points/); + assert.match(rest, /'vipManual'\s*=>/); + assert.match(rest, /'vip1Name'\s*=>/); + assert.match(draft, /vip1Points: Number\(pay\.vip1Points/); + + // 请求体带齐服务端会校验的会员价字段。 + assert.match(payUtil, /vip1_points:/); + assert.match(payUtil, /vip2_points:/); + assert.match(payUtil, /vip1_price:/); + assert.match(payUtil, /vip2_price:/); + + // 资源编辑器:与前台投稿一致的七个字段。 + for (const field of ['extract_code', 'copy_key', 'copy_val', 'class', 'attachment_id']) { + assert.ok(payUtil.includes(field), `missing download field in request: ${field}`); + } + for (const label of ['下载地址', '资源备注', '复制名称', '复制内容', '自定义按钮文案', '按钮样式']) { + assert.ok(resource.includes(label), `missing resource field: ${label}`); + } + assert.match(resource, /上传附件/); + assert.match(resource, /提取码/); + assert.match(resource, /onPaste/); + assert.match(payPanel, /添加资源/); + assert.match(payPanel, / \s*DomainModel::DOWNLOAD_BUTTON_CLASSES/); + assert.match(payPanel, /bootstrap\.downloadClasses/); + + // 受保护附件仍然只提交 asset_key。 + assert.match(payUtil, /asset_key: assetKey/); + assert.doesNotMatch(payUtil, /wp-content|file_path/); +}); + +// 审核 / 发布路径要把资源的展示字段一并带进快照,否则会丢提取码与按钮样式。 +test('creator snapshot keeps every download display field', () => { + const rest = read('src/Core/CreatorRest.php'); + const snapshot = rest.slice( + rest.indexOf('private function snapshot_from_payload'), + rest.indexOf('private function claim_private_assets') + ); + + assert.match(snapshot, /'extract_code'\s*=>/); + assert.match(snapshot, /'copy_key'\s*=>/); + assert.match(snapshot, /'copy_val'\s*=>/); + assert.match(snapshot, /'class'\s*=>/); + assert.match(snapshot, /'attachment_id'\s*=>/); + assert.match(snapshot, /'net_disk'/); + // bootstrap 回读时字段名要与前端模型一致。 + assert.match(rest, /'extractCode'\s*=>/); + assert.match(rest, /'copyKey'\s*=>/); + assert.match(rest, /'copyVal'\s*=>/); +});