From b77926388f5434ce1046c709746e8cf7092b29f5 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 26 Aug 2026 22:23:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BA=86=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=B0=8F=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/css/build/single.css | 4 + assets/css/build/single.min.css | 2 +- assets/css/frontend/pay-box.css | 12 + .../frontend/single-post/author-actions.css | 4 + inc/helpers/aksrt-pay.php | 389 ++++++++++++------ .../widget-system/pay-card-contract.test.cjs | 16 + .../post-visual-contract.test.cjs | 1 + 7 files changed, 299 insertions(+), 129 deletions(-) diff --git a/assets/css/build/single.css b/assets/css/build/single.css index 41b59627..5dd6e376 100644 --- a/assets/css/build/single.css +++ b/assets/css/build/single.css @@ -1186,6 +1186,10 @@ html.dark .post-drop-meta__item:hover { gap: 4px; } +.article-header:has(.post-drop-meta.is-open) { + z-index: 30; +} + .post-drop-meta__item { width: 100%; display: inline-flex; diff --git a/assets/css/build/single.min.css b/assets/css/build/single.min.css index 1c868598..7fe09678 100644 --- a/assets/css/build/single.min.css +++ b/assets/css/build/single.min.css @@ -1 +1 @@ -.relative{position:relative}.flex{display:flex}.flex.ac,.ac{align-items:center}.flex.jc,.jc{justify-content:center}.flex.jsb,.jsb{justify-content:space-between}.flex.at,.at{align-items:flex-start}.flex.ae,.ae{align-items:flex-end}.flex0{flex:0 0 auto}.flex1{flex:1 1 auto;min-width:0}.flex.column{flex-direction:column}.flex.wrap{flex-wrap:wrap}.flex.flex-row,.flex-row{flex-direction:row}.flex.jse,.jse{justify-content:space-evenly}.flex.jsa,.jsa{justify-content:space-around}.flex>.flex1,.flex .flex1{flex:1;overflow:hidden;min-width:0}.relative-h{position:relative;height:100%}.padding-10{padding:10px}.font-bold{font-weight:700}.mt6{margin-top:6px}.gutters-5{margin:-5px}.gutters-5>*{padding:5px}@media(max-width:767px){.flex.flex-row.flex-col-sm-2{flex-wrap:wrap}.flex.flex-row.flex-col-sm-2>*{flex-basis:50%}}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}.abs-right{position:absolute;right:0;top:0}.abs-center{position:absolute;left:0;width:100%;top:50%;right:.7em;transform:translateY(-50%);z-index:1}.abs-center.left-top,.abs-center.right-top{transform:unset;top:0}.abs-center.right-top{left:auto;width:auto;text-align:right}.abs-center.left-top{text-align:left}.abs-center.conter-bottom,.abs-center.conter-conter{text-align:center}.abs-center.right-top,.abs-center.right-bottom,.abs-center.right-conter{text-align:right}.abs-center.conter-bottom,.abs-center.right-bottom,.abs-center.left-bottom{top:auto;transform:unset;bottom:0}.abs-center.left-bottom{left:0;right:auto;text-align:left}.abs-center.right-bottom,.abs-center.right-conter{left:auto;right:0;text-align:right}.graphic,.page-cover{text-shadow:0 0 5px rgba(0,0,0,.2);--main-color: #fff;color:#fff;position:relative;overflow:hidden;box-shadow:0 0 10px var(--main-shadow, rgba(116, 116, 116, .08));padding:0 0 70%;border-radius:var(--main-radius, var(--radius, 8px))}.graphic>.fit-cover,.graphic>img.fit-cover{position:absolute;width:100%;height:100%;object-fit:cover;inset:0}.fit-cover{object-fit:cover;max-width:100%}.title-h-left{position:relative;padding-bottom:8px}.title-h-left:before{transition:.4s;transform-origin:left;position:absolute;content:"";width:40px;height:3px;background:var(--theme-color, var(--focus-color, #f04494));left:0;bottom:3px;border-radius:5px;box-shadow:1px 1px 3px -1px var(--theme-color, var(--focus-color, #f04494))}.line-form-line,.line-form-line:before{position:absolute;bottom:0;left:0;height:1px;width:100%;transition:.8s;background:var(--main-border-color, rgba(50, 50, 50, .06))}.line-form-line:before{content:"";width:0;background:var(--focus-color, #f04494)}.avatar-img{position:relative;display:inline-block;flex-shrink:0;--this-size: 38px;width:var(--this-size);height:var(--this-size)}.avatar-img .avatar,.avatar-img img{width:100%;height:100%;border-radius:50%;object-fit:cover}.avatar-lg{--this-size: 80px}.avatar-md{--this-size: 55px}.avatar-mini{--this-size: 20px}.shrink0{flex-shrink:0}.opacity8{opacity:.8}.muted-color{color:var(--muted-color, var(--color-ink-3))}.muted-2-color{color:var(--muted-2-color, var(--color-ink-4))}.muted-3-color{color:var(--muted-3-color, #b1b1b1)}.muted-4-color{color:var(--muted-4-color, #d2d2d2)}.text-center{text-align:center}.em09{font-size:.9em}.em12{font-size:1.2em}.px12-sm{font-size:12px}.ml3{margin-left:3px}.ml6{margin-left:6px}.ml10{margin-left:10px}.mr3{margin-right:3px}.mr6{margin-right:6px}.mt10{margin-top:10px}.mt20{margin-top:20px}.mb10{margin-bottom:10px}.mb20{margin-bottom:20px}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.text-ellipsis-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}.main-bg{background-color:var(--main-bg-color, var(--surface-1))}.separator{position:relative;letter-spacing:.08em}.icon-circle+.icon-circle:before{content:"·";display:inline-block;margin:0 .45em;opacity:.55}.article-avatar name,.article-avatar .name,.user-name{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:100%}.pull-right{float:right}.pull-left{float:left}body.single main.container .content-layout{display:block;min-width:0}body.single main.container .content-layout>*{min-width:0;max-width:100%}body.single main.container .content-layout>.breadcrumb,body.single main.container .content-layout>ul.breadcrumb,body.single main.container .content-layout>.breadcrumb-nav,body.single main.container .content-layout>.breadcrumbs-wrap{position:relative;z-index:1;margin-top:0;margin-bottom:12px;padding-top:2px}body.single .sidebar .aksrt-panel,body.single .sidebar .widget{margin-bottom:15px}body.single main.container{box-sizing:border-box}.article,article.article.box-body,.article.main-bg.box-body{padding:0 30px;overflow:hidden}@media(max-width:767px){.article,article.article.box-body,.article.main-bg.box-body{padding:0 15px}.article-header .article-title{font-size:18px}}.entry-header,.article-header{margin-bottom:10px;padding-bottom:0;border-bottom:none;background:transparent;box-shadow:none;border-radius:0}.entry-title,.article-title{font-size:22px;font-weight:700;margin:0;line-height:1.4;letter-spacing:0;color:var(--key-color, var(--color-ink))}.article-title>a:hover{color:inherit}.article-header .article-title{font-size:22px;font-weight:700;color:var(--key-color, var(--color-ink));margin-top:15px}.article-header .article-avatar{margin-top:15px}.entry-meta{display:flex;flex-wrap:wrap;gap:10px 16px;font-size:.875rem;color:var(--color-ink-4)}.entry-meta a{color:var(--color-ink-3)}.entry-meta a:hover{color:var(--color-primary)}.entry-thumb{margin:0 0 28px;border-radius:var(--radius-btn);overflow:hidden}.entry-content,.wp-posts-content{font-size:16px;line-height:2;color:var(--main-color, var(--color-ink));overflow-wrap:break-word;word-wrap:break-word;min-height:90px}.wp-posts-content>h1:not([class]),.wp-posts-content>h2:not([class]),.wp-posts-content>h3:not([class]),.wp-posts-content>h4:not([class]),.wp-posts-content>h1.wp-block-heading,.wp-posts-content>h2.wp-block-heading,.wp-posts-content>h3.wp-block-heading,.wp-posts-content>h4.wp-block-heading{position:relative;padding-bottom:8px}.wp-posts-content>h1:not([class]):before,.wp-posts-content>h2:not([class]):before,.wp-posts-content>h3:not([class]):before,.wp-posts-content>h4:not([class]):before,.wp-posts-content>h1.wp-block-heading:before,.wp-posts-content>h2.wp-block-heading:before,.wp-posts-content>h3.wp-block-heading:before,.wp-posts-content>h4.wp-block-heading:before{content:"";position:absolute;left:0;bottom:0;width:40px;height:3px;background:var(--theme-color, var(--focus-color, #f04494));border-radius:5px}.wp-posts-content>h3:not([class]):before,.wp-posts-content>h4:not([class]):before,.wp-posts-content>h3.wp-block-heading:before,.wp-posts-content>h4.wp-block-heading:before{width:28px;height:2px}:is(.entry-content,.wp-posts-content)>*:first-child{margin-top:0}:is(.entry-content,.wp-posts-content) p{margin:0 0 1.5em}:is(.entry-content,.wp-posts-content) h2{font-size:20px;font-weight:700;margin:28px 0 14px}:is(.entry-content,.wp-posts-content) h3{font-size:18px;font-weight:700;margin:24px 0 12px}:is(.entry-content,.wp-posts-content) h4{font-size:16px;font-weight:700;margin:22px 0 10px}:is(.entry-content,.wp-posts-content) blockquote{margin:0 0 24px;padding:18px 20px;border-left:4px solid var(--color-primary);background:var(--surface-4, rgba(0, 0, 0, .03));border-radius:0 var(--radius-lg) var(--radius-lg) 0;color:var(--color-ink-3)}:is(.entry-content,.wp-posts-content) img{margin:0 auto;display:block;max-width:100%;height:auto;border-radius:min(8px,var(--main-radius, 8px))}:is(.entry-content,.wp-posts-content) figure{max-width:100%;margin:1.5em auto}:is(.entry-content,.wp-posts-content) figcaption{margin-top:8px;color:var(--muted-color, #777);font-size:13px;line-height:1.6;text-align:center}:is(.entry-content,.wp-posts-content) .aksrt-lightbox-target{cursor:zoom-in}.lightbox-overlay{position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;flex-direction:column;gap:12px;padding:24px;background:#000000d9}.lightbox-overlay.is-open{display:flex}.lightbox-img{max-width:90vw;max-height:85vh;width:auto;height:auto;border-radius:4px;object-fit:contain}.lightbox-caption{max-width:min(96vw,1200px);color:#fff;font-size:14px;line-height:1.5;text-align:center;opacity:.92}.lightbox-close{position:absolute;top:14px;right:14px;width:40px;height:40px;border:none;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:#ffffff1f;color:#fff;cursor:pointer;transition:background-color .2s ease}.lightbox-close:hover{background:#ffffff38}.lightbox-close i{pointer-events:none}:is(.entry-content,.wp-posts-content) iframe,:is(.entry-content,.wp-posts-content) .wp-block-embed iframe,:is(.entry-content,.wp-posts-content) video{max-width:100%;height:auto}:is(.entry-content,.wp-posts-content) .wp-block-embed{position:relative;width:100%;max-width:100%;overflow:hidden;margin:1.5em 0}:is(.entry-content,.wp-posts-content) code{font-family:var(--font-mono);font-size:.9em;color:#ff3c98;background:#fd999933;padding:2px 6px;border-radius:4px}:is(.entry-content,.wp-posts-content) ul,:is(.entry-content,.wp-posts-content) ol{padding-left:1.5em;margin:0 0 1.5em}:is(.entry-content,.wp-posts-content) ul li::marker{color:var(--color-primary)}.entry-footer{margin-top:40px;padding-top:24px;border-top:1px solid var(--color-line)}.post-tags{display:flex;flex-wrap:wrap;gap:8px}.post-tags a{padding:4px 10px;border-radius:50px;background:var(--muted-bg-color, #eee);border:1px solid var(--main-border-color, rgba(50, 50, 50, .06));font-size:13px;color:var(--muted-color, #777)}.post-tags a:hover{border-color:var(--color-primary);color:var(--color-primary)}.related-posts{margin-top:48px;padding:20px 0 0;border-top:1px solid var(--color-line-soft)}.related-posts__title{font-size:15px;font-weight:700;margin:0 0 10px;color:var(--key-color, #333)}.related-posts__title:before{content:"";display:inline-block;width:40px;height:3px;background:var(--theme-color, #f04494);border-radius:5px;vertical-align:middle;margin-right:8px}.related-posts__grid{display:flex;flex-direction:column;gap:0}.related-card{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--main-border-color, rgba(50, 50, 50, .06));transition:.15s}.related-card:last-child{border-bottom:none}.related-card a{display:flex;align-items:center;gap:12px;color:var(--key-color, #333);text-decoration:none;width:100%}.related-card:hover a{color:var(--focus-color, #f04494)}.related-card__thumb{width:96px;min-width:96px;height:64px;border-radius:var(--main-radius, 8px);overflow:hidden;flex-shrink:0}.related-card__thumb img{width:100%;height:100%;object-fit:cover;transition:transform .3s}.related-card:hover .related-card__thumb img{transform:scale(1.05)}.related-card h4{font-size:14px;font-weight:600;margin:0;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.article-author-bar{display:flex;align-items:center;gap:10px;margin-bottom:16px}.article-author-bar__avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;flex-shrink:0}.article-author-bar__info{flex:1;min-width:0}.article-author-bar__name{font-weight:600;font-size:14px;color:var(--color-ink)}.article-author-bar__name:hover{color:var(--color-primary)}.article-author-bar__meta{display:flex;flex-wrap:wrap;gap:10px;font-size:12px;color:var(--color-ink-4, var(--color-ink-4));margin-top:2px}.article-author-bar__meta span{display:inline-flex;align-items:center;gap:3px}.article-author-bar__line{height:1px;background:var(--color-line);margin-bottom:20px}.article-footer{margin-top:32px;padding-top:20px;border-top:1px solid var(--color-line)}.article-copyright{font-size:13px;color:var(--color-ink-4, var(--color-ink-4));margin-bottom:16px}.article-end-separator{text-align:center;margin:16px 0;position:relative}.article-end-separator:before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background:var(--color-line)}.article-end-separator span{position:relative;display:inline-block;padding:0 14px;background:var(--surface-page);font-size:11px;font-weight:600;color:var(--color-ink-4, var(--color-ink-4));letter-spacing:2px}.article-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}.post-actions-wrap{position:relative;text-align:center;margin-bottom:16px}.post-actions-card,.post-actions{position:relative;text-align:center;margin-bottom:16px;padding-bottom:15px;display:block}.post-actions-wrap>.post-actions{margin-bottom:0}.post-actions-card__hint{font-size:13px;color:var(--color-ink-4, var(--color-ink-4));margin-bottom:12px}.post-actions-card__buttons{display:flex;justify-content:center;gap:10px;margin-bottom:12px}.article .action,.post-actions .action{width:80px;padding:10px 0;display:inline-block;opacity:.7;vertical-align:top;min-width:0;height:auto;border-radius:0;border:0;background:transparent;color:var(--muted-color, #777);cursor:pointer;font-size:14px;transition:opacity .15s ease,color .15s ease;gap:0;text-align:center}.article .action:hover,.post-actions .action:hover,.article .action.is-active,.post-actions .action.is-active{color:inherit;opacity:1;background:transparent;border-color:transparent}.article .action i,.post-actions .action i{font-size:20px;display:block;margin:0 auto 4px;line-height:1}.post-actions .action .action-btn__count,.post-actions .action .action-btn__label,.action-btn__count,.action-btn__label{display:block;font-size:12px;line-height:1.2;font-weight:500}.action-btn{display:inline-flex;align-items:center;gap:6px;padding:.38em 1.1em;border-radius:50px;border:1px solid transparent;background:var(--surface-4, rgba(136, 136, 136, .1));color:var(--color-ink-3);cursor:pointer;font-size:14px;transition:all .15s ease}.action-btn:hover{background:var(--color-primary-soft);color:var(--color-primary)}.action-btn.is-active{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-primary-soft, rgba(240, 68, 148, .08))}.action-btn i{font-size:1.2em}.share-dropdown{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translate(-50%);z-index:100;display:none!important}.share-dropdown[aria-hidden=false]{display:block!important;animation:shareDropdownIn .2s ease-out forwards}@keyframes shareDropdownIn{0%{opacity:0;transform:translate(-50%) translateY(8px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.share-dropdown__grid{display:flex;align-items:center;gap:8px;padding:12px 16px;background:var(--surface-page);border:1px solid var(--color-line);border-radius:var(--radius-lg, 8px);box-shadow:var(--shadow-md, 0 4px 16px rgba(0,0,0,.1))}.share-item{display:inline-flex;flex-direction:column;align-items:center;gap:4px;padding:8px 12px;border:none;border-radius:var(--radius-btn, 6px);background:transparent;color:var(--color-ink-2, var(--color-ink-3));cursor:pointer;font-size:11px;transition:background .15s,color .15s,transform .15s;white-space:nowrap}.share-item:hover{transform:none}.share-item i{font-size:18px}.share-item[data-platform=qq]:hover{background:#e8f4fd;color:#12b7f5}.share-item[data-platform=weibo]:hover{background:#fceae9;color:#ff6a00}.share-item[data-platform=twitter]:hover{background:#f0f0f0;color:#000}.share-item[data-platform=wechat]:hover{background:#e6f7ec;color:#07c160}.share-item[data-platform=copy]:hover{background:#f0f2f5;color:#555}.share-item[data-platform=poster]:hover{background:#fff4e8;color:#f59e0b}#share-qrcode-box{position:absolute;bottom:calc(100% + 10px);left:50%;transform:translate(-50%);padding:14px;background:var(--surface-page);border:1px solid var(--color-line);border-radius:var(--radius-lg, 8px);box-shadow:var(--shadow-md, 0 4px 16px rgba(0,0,0,.12));text-align:center;z-index:101;pointer-events:none;opacity:0;transition:opacity .2s ease,transform .2s ease}#share-qrcode-box.is-visible{pointer-events:auto;opacity:1}#share-qrcode-image{width:140px;height:140px;display:block}.theme-dark .share-dropdown__grid,html.dark .share-dropdown__grid{background:var(--surface-1);border-color:var(--color-line);box-shadow:0 4px 16px #00000059}.theme-dark #share-qrcode-box,html.dark #share-qrcode-box{background:var(--surface-1);border-color:var(--color-line)}.theme-dark .share-item,html.dark .share-item{color:var(--color-ink-2, #aaa)}.theme-dark .share-item[data-platform=qq]:hover{background:#12b7f51f;color:#12b7f5}.theme-dark .share-item[data-platform=weibo]:hover{background:#ff6a001f;color:#ff6a00}.theme-dark .share-item[data-platform=twitter]:hover{background:#ffffff14;color:#fff}.theme-dark .share-item[data-platform=wechat]:hover{background:#07c1601f;color:#07c160}.theme-dark .share-item[data-platform=copy]:hover{background:#ffffff0f;color:#ccc}.theme-dark .share-item[data-platform=poster]:hover{background:#f59e0b1f;color:#f59e0b}@media(max-width:767px){.share-dropdown{position:fixed;inset:auto 0 0;transform:none;width:100%;max-width:none;z-index:1200;padding:0 0 calc(12px + env(safe-area-inset-bottom,0px));background:transparent}.share-dropdown[aria-hidden=false]{animation:shareSheetIn .22s ease-out forwards}@keyframes shareSheetIn{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}.share-dropdown__grid{justify-content:space-around;flex-wrap:wrap;gap:6px;margin:0 10px;padding:14px 12px 16px;border-radius:14px 14px 10px 10px;box-shadow:0 -6px 28px #00000029}.share-item{min-width:64px;flex:1 1 28%;max-width:33%}#share-qrcode-box{position:static;margin:10px auto 0;transform:none}body.aksrt-share-sheet-open{overflow:hidden}body.aksrt-share-sheet-open:before{content:"";position:fixed;inset:0;background:#00000059;z-index:1190}}.theme-dark .post-drop-meta__menu,html.dark .post-drop-meta__menu{background:var(--surface-1, #323335);border-color:var(--color-line);box-shadow:0 8px 24px #00000059}.theme-dark .post-drop-meta__item,html.dark .post-drop-meta__item{color:var(--color-ink-2, #ccc)}.theme-dark .post-drop-meta__item:hover,html.dark .post-drop-meta__item:hover{background:#ffffff0f;color:#fff}.author-box{margin-bottom:16px;padding:18px;background:var(--surface-1, #fff);border:none;border-radius:var(--radius-2xl, 16px);box-shadow:var(--shadow-sm)}.single-metabox{display:flex;align-items:center;justify-content:flex-end;gap:8px}.post-drop-meta{position:relative}.post-drop-meta__menu{position:absolute;top:calc(100% + 8px);right:0;min-width:150px;padding:8px;border-radius:var(--radius, 8px);border:1px solid var(--color-line);background:var(--surface-page, #fff);box-shadow:var(--shadow-md, 0 8px 24px rgba(0, 0, 0, .12));display:none;z-index:20}.post-drop-meta.is-open .post-drop-meta__menu{display:grid;gap:4px}.post-drop-meta__item{width:100%;display:inline-flex;align-items:center;gap:8px;padding:8px 10px;border:0;border-radius:6px;background:transparent;color:var(--color-ink-2, var(--color-ink));text-decoration:none;font-size:13px;text-align:left;cursor:pointer}.post-drop-meta__item:hover{background:var(--color-line, rgba(50, 50, 50, .06));color:var(--color-primary)}.post-drop-meta__item i{width:16px;text-align:center}.author-box__header{display:flex;align-items:flex-start;gap:14px}.author-box__avatar{width:56px;height:56px;border-radius:50%;object-fit:cover;flex-shrink:0;border:3px solid var(--color-primary-soft, rgba(240, 68, 148, .2))}.author-box__info{flex:1;min-width:0}.author-box__name{font-size:1rem;font-weight:700;color:var(--color-ink);display:block;margin-bottom:4px}.author-box__name:hover{color:var(--color-primary)}.author-box__bio{font-size:13px;color:var(--color-ink-3, var(--color-ink-4));line-height:1.5;margin:0 0 6px}.author-box__stats{font-size:12px;color:var(--color-ink-4, var(--color-ink-4))}.author-box__stats strong{color:var(--color-ink);margin-right:2px}.author-box__posts{margin-top:14px;padding-top:12px;border-top:1px solid var(--color-line)}.author-box__posts-title{font-size:12px;font-weight:600;color:var(--color-ink-3, var(--color-ink-4));margin:0 0 8px}.author-box__posts ul{list-style:none;margin:0;padding:0}.author-box__posts li{padding:3px 0}.author-box__posts a{font-size:13px;color:var(--color-ink);display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}.author-box__posts a:hover{color:var(--color-primary)}.author-box__posts a:before{content:"•";color:var(--color-primary)}.article-avatar .user-info{width:100%}.article-avatar .avatar-img{--this-size: 42px}.article-avatar .avatar-img img,.article-avatar .avatar{width:100%;height:100%;border-radius:50%;object-fit:cover}.article-avatar .display-name{font-weight:600;color:var(--key-color, #333)}.article-header .article-avatar .single-meta-row{margin-top:20px;position:relative;min-height:28px;display:flex;align-items:center;justify-content:flex-end}.article-header .article-avatar .single-meta-row>.line-form-line{bottom:50%}.article-header .article-avatar .single-meta-row>.single-metabox{position:relative;inset:auto;transform:none;z-index:1}.single-metabox{right:0;font-size:15px;--meta-color: var(--muted-color, #777)}.single-metabox .post-metas{background:var(--body-bg-color, #f5f5f5);right:0;padding:2px 6px;border-radius:100px;color:var(--meta-color);display:inline-flex;flex-wrap:wrap;align-items:center;gap:0}.single-metabox .post-metas item,.single-metabox .post-metas .item{margin:0 6px;font-size:13px;display:inline-flex;align-items:center;gap:4px}.single-metabox .post-drop-meta{position:relative;display:inline-block;--this-size: 1.73em;--this-color: var(--meta-color);--this-bg: var(--body-bg-color, #f5f5f5)}.article-avatar .line-form-line{display:block}.article-tags br{flex-basis:100%;width:100%;content:"";display:block;height:0}.article-tags .but.c-blue{color:#2196f3}.article-tags .but.c-yellow{color:#f0ad4e}.article-tags .but.c-green{color:#5cb85c}.article-tags .but.c-purple{color:#9c27b0}.article-tags .but.c-red{color:#f44336}.user-card.author{margin-bottom:16px;overflow:hidden}.user-card.author .user-avatar{display:flex;justify-content:center}.user-card.author .user-avatar .avatar,.user-card.author .user-avatar img{width:80px;height:80px;border-radius:50%;object-fit:cover}.user-card.author .user-name{display:flex;flex-wrap:nowrap;align-items:center;justify-content:center;gap:4px}.user-card.author .user-name .display-name{font-weight:700;color:var(--key-color, inherit)}.user-card.author .user-desc,.user-card.author .user-btns{text-align:center}.user-card.author .user-card-posts ul{list-style:none;margin:0;padding:0}.user-card.author .user-card-posts li{padding:6px 0;border-bottom:1px dashed var(--color-line, rgba(0,0,0,.06))}.user-card.author .user-card-posts li:last-child{border-bottom:0} +.relative{position:relative}.flex{display:flex}.flex.ac,.ac{align-items:center}.flex.jc,.jc{justify-content:center}.flex.jsb,.jsb{justify-content:space-between}.flex.at,.at{align-items:flex-start}.flex.ae,.ae{align-items:flex-end}.flex0{flex:0 0 auto}.flex1{flex:1 1 auto;min-width:0}.flex.column{flex-direction:column}.flex.wrap{flex-wrap:wrap}.flex.flex-row,.flex-row{flex-direction:row}.flex.jse,.jse{justify-content:space-evenly}.flex.jsa,.jsa{justify-content:space-around}.flex>.flex1,.flex .flex1{flex:1;overflow:hidden;min-width:0}.relative-h{position:relative;height:100%}.padding-10{padding:10px}.font-bold{font-weight:700}.mt6{margin-top:6px}.gutters-5{margin:-5px}.gutters-5>*{padding:5px}@media(max-width:767px){.flex.flex-row.flex-col-sm-2{flex-wrap:wrap}.flex.flex-row.flex-col-sm-2>*{flex-basis:50%}}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}.abs-right{position:absolute;right:0;top:0}.abs-center{position:absolute;left:0;width:100%;top:50%;right:.7em;transform:translateY(-50%);z-index:1}.abs-center.left-top,.abs-center.right-top{transform:unset;top:0}.abs-center.right-top{left:auto;width:auto;text-align:right}.abs-center.left-top{text-align:left}.abs-center.conter-bottom,.abs-center.conter-conter{text-align:center}.abs-center.right-top,.abs-center.right-bottom,.abs-center.right-conter{text-align:right}.abs-center.conter-bottom,.abs-center.right-bottom,.abs-center.left-bottom{top:auto;transform:unset;bottom:0}.abs-center.left-bottom{left:0;right:auto;text-align:left}.abs-center.right-bottom,.abs-center.right-conter{left:auto;right:0;text-align:right}.graphic,.page-cover{text-shadow:0 0 5px rgba(0,0,0,.2);--main-color: #fff;color:#fff;position:relative;overflow:hidden;box-shadow:0 0 10px var(--main-shadow, rgba(116, 116, 116, .08));padding:0 0 70%;border-radius:var(--main-radius, var(--radius, 8px))}.graphic>.fit-cover,.graphic>img.fit-cover{position:absolute;width:100%;height:100%;object-fit:cover;inset:0}.fit-cover{object-fit:cover;max-width:100%}.title-h-left{position:relative;padding-bottom:8px}.title-h-left:before{transition:.4s;transform-origin:left;position:absolute;content:"";width:40px;height:3px;background:var(--theme-color, var(--focus-color, #f04494));left:0;bottom:3px;border-radius:5px;box-shadow:1px 1px 3px -1px var(--theme-color, var(--focus-color, #f04494))}.line-form-line,.line-form-line:before{position:absolute;bottom:0;left:0;height:1px;width:100%;transition:.8s;background:var(--main-border-color, rgba(50, 50, 50, .06))}.line-form-line:before{content:"";width:0;background:var(--focus-color, #f04494)}.avatar-img{position:relative;display:inline-block;flex-shrink:0;--this-size: 38px;width:var(--this-size);height:var(--this-size)}.avatar-img .avatar,.avatar-img img{width:100%;height:100%;border-radius:50%;object-fit:cover}.avatar-lg{--this-size: 80px}.avatar-md{--this-size: 55px}.avatar-mini{--this-size: 20px}.shrink0{flex-shrink:0}.opacity8{opacity:.8}.muted-color{color:var(--muted-color, var(--color-ink-3))}.muted-2-color{color:var(--muted-2-color, var(--color-ink-4))}.muted-3-color{color:var(--muted-3-color, #b1b1b1)}.muted-4-color{color:var(--muted-4-color, #d2d2d2)}.text-center{text-align:center}.em09{font-size:.9em}.em12{font-size:1.2em}.px12-sm{font-size:12px}.ml3{margin-left:3px}.ml6{margin-left:6px}.ml10{margin-left:10px}.mr3{margin-right:3px}.mr6{margin-right:6px}.mt10{margin-top:10px}.mt20{margin-top:20px}.mb10{margin-bottom:10px}.mb20{margin-bottom:20px}.text-ellipsis{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.text-ellipsis-2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}.main-bg{background-color:var(--main-bg-color, var(--surface-1))}.separator{position:relative;letter-spacing:.08em}.icon-circle+.icon-circle:before{content:"·";display:inline-block;margin:0 .45em;opacity:.55}.article-avatar name,.article-avatar .name,.user-name{display:inline-flex;align-items:center;gap:4px;min-width:0;max-width:100%}.pull-right{float:right}.pull-left{float:left}body.single main.container .content-layout{display:block;min-width:0}body.single main.container .content-layout>*{min-width:0;max-width:100%}body.single main.container .content-layout>.breadcrumb,body.single main.container .content-layout>ul.breadcrumb,body.single main.container .content-layout>.breadcrumb-nav,body.single main.container .content-layout>.breadcrumbs-wrap{position:relative;z-index:1;margin-top:0;margin-bottom:12px;padding-top:2px}body.single .sidebar .aksrt-panel,body.single .sidebar .widget{margin-bottom:15px}body.single main.container{box-sizing:border-box}.article,article.article.box-body,.article.main-bg.box-body{padding:0 30px;overflow:hidden}@media(max-width:767px){.article,article.article.box-body,.article.main-bg.box-body{padding:0 15px}.article-header .article-title{font-size:18px}}.entry-header,.article-header{margin-bottom:10px;padding-bottom:0;border-bottom:none;background:transparent;box-shadow:none;border-radius:0}.entry-title,.article-title{font-size:22px;font-weight:700;margin:0;line-height:1.4;letter-spacing:0;color:var(--key-color, var(--color-ink))}.article-title>a:hover{color:inherit}.article-header .article-title{font-size:22px;font-weight:700;color:var(--key-color, var(--color-ink));margin-top:15px}.article-header .article-avatar{margin-top:15px}.entry-meta{display:flex;flex-wrap:wrap;gap:10px 16px;font-size:.875rem;color:var(--color-ink-4)}.entry-meta a{color:var(--color-ink-3)}.entry-meta a:hover{color:var(--color-primary)}.entry-thumb{margin:0 0 28px;border-radius:var(--radius-btn);overflow:hidden}.entry-content,.wp-posts-content{font-size:16px;line-height:2;color:var(--main-color, var(--color-ink));overflow-wrap:break-word;word-wrap:break-word;min-height:90px}.wp-posts-content>h1:not([class]),.wp-posts-content>h2:not([class]),.wp-posts-content>h3:not([class]),.wp-posts-content>h4:not([class]),.wp-posts-content>h1.wp-block-heading,.wp-posts-content>h2.wp-block-heading,.wp-posts-content>h3.wp-block-heading,.wp-posts-content>h4.wp-block-heading{position:relative;padding-bottom:8px}.wp-posts-content>h1:not([class]):before,.wp-posts-content>h2:not([class]):before,.wp-posts-content>h3:not([class]):before,.wp-posts-content>h4:not([class]):before,.wp-posts-content>h1.wp-block-heading:before,.wp-posts-content>h2.wp-block-heading:before,.wp-posts-content>h3.wp-block-heading:before,.wp-posts-content>h4.wp-block-heading:before{content:"";position:absolute;left:0;bottom:0;width:40px;height:3px;background:var(--theme-color, var(--focus-color, #f04494));border-radius:5px}.wp-posts-content>h3:not([class]):before,.wp-posts-content>h4:not([class]):before,.wp-posts-content>h3.wp-block-heading:before,.wp-posts-content>h4.wp-block-heading:before{width:28px;height:2px}:is(.entry-content,.wp-posts-content)>*:first-child{margin-top:0}:is(.entry-content,.wp-posts-content) p{margin:0 0 1.5em}:is(.entry-content,.wp-posts-content) h2{font-size:20px;font-weight:700;margin:28px 0 14px}:is(.entry-content,.wp-posts-content) h3{font-size:18px;font-weight:700;margin:24px 0 12px}:is(.entry-content,.wp-posts-content) h4{font-size:16px;font-weight:700;margin:22px 0 10px}:is(.entry-content,.wp-posts-content) blockquote{margin:0 0 24px;padding:18px 20px;border-left:4px solid var(--color-primary);background:var(--surface-4, rgba(0, 0, 0, .03));border-radius:0 var(--radius-lg) var(--radius-lg) 0;color:var(--color-ink-3)}:is(.entry-content,.wp-posts-content) img{margin:0 auto;display:block;max-width:100%;height:auto;border-radius:min(8px,var(--main-radius, 8px))}:is(.entry-content,.wp-posts-content) figure{max-width:100%;margin:1.5em auto}:is(.entry-content,.wp-posts-content) figcaption{margin-top:8px;color:var(--muted-color, #777);font-size:13px;line-height:1.6;text-align:center}:is(.entry-content,.wp-posts-content) .aksrt-lightbox-target{cursor:zoom-in}.lightbox-overlay{position:fixed;inset:0;z-index:9999;display:none;align-items:center;justify-content:center;flex-direction:column;gap:12px;padding:24px;background:#000000d9}.lightbox-overlay.is-open{display:flex}.lightbox-img{max-width:90vw;max-height:85vh;width:auto;height:auto;border-radius:4px;object-fit:contain}.lightbox-caption{max-width:min(96vw,1200px);color:#fff;font-size:14px;line-height:1.5;text-align:center;opacity:.92}.lightbox-close{position:absolute;top:14px;right:14px;width:40px;height:40px;border:none;border-radius:999px;display:inline-flex;align-items:center;justify-content:center;background:#ffffff1f;color:#fff;cursor:pointer;transition:background-color .2s ease}.lightbox-close:hover{background:#ffffff38}.lightbox-close i{pointer-events:none}:is(.entry-content,.wp-posts-content) iframe,:is(.entry-content,.wp-posts-content) .wp-block-embed iframe,:is(.entry-content,.wp-posts-content) video{max-width:100%;height:auto}:is(.entry-content,.wp-posts-content) .wp-block-embed{position:relative;width:100%;max-width:100%;overflow:hidden;margin:1.5em 0}:is(.entry-content,.wp-posts-content) code{font-family:var(--font-mono);font-size:.9em;color:#ff3c98;background:#fd999933;padding:2px 6px;border-radius:4px}:is(.entry-content,.wp-posts-content) ul,:is(.entry-content,.wp-posts-content) ol{padding-left:1.5em;margin:0 0 1.5em}:is(.entry-content,.wp-posts-content) ul li::marker{color:var(--color-primary)}.entry-footer{margin-top:40px;padding-top:24px;border-top:1px solid var(--color-line)}.post-tags{display:flex;flex-wrap:wrap;gap:8px}.post-tags a{padding:4px 10px;border-radius:50px;background:var(--muted-bg-color, #eee);border:1px solid var(--main-border-color, rgba(50, 50, 50, .06));font-size:13px;color:var(--muted-color, #777)}.post-tags a:hover{border-color:var(--color-primary);color:var(--color-primary)}.related-posts{margin-top:48px;padding:20px 0 0;border-top:1px solid var(--color-line-soft)}.related-posts__title{font-size:15px;font-weight:700;margin:0 0 10px;color:var(--key-color, #333)}.related-posts__title:before{content:"";display:inline-block;width:40px;height:3px;background:var(--theme-color, #f04494);border-radius:5px;vertical-align:middle;margin-right:8px}.related-posts__grid{display:flex;flex-direction:column;gap:0}.related-card{display:flex;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--main-border-color, rgba(50, 50, 50, .06));transition:.15s}.related-card:last-child{border-bottom:none}.related-card a{display:flex;align-items:center;gap:12px;color:var(--key-color, #333);text-decoration:none;width:100%}.related-card:hover a{color:var(--focus-color, #f04494)}.related-card__thumb{width:96px;min-width:96px;height:64px;border-radius:var(--main-radius, 8px);overflow:hidden;flex-shrink:0}.related-card__thumb img{width:100%;height:100%;object-fit:cover;transition:transform .3s}.related-card:hover .related-card__thumb img{transform:scale(1.05)}.related-card h4{font-size:14px;font-weight:600;margin:0;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.article-author-bar{display:flex;align-items:center;gap:10px;margin-bottom:16px}.article-author-bar__avatar{width:40px;height:40px;border-radius:50%;object-fit:cover;flex-shrink:0}.article-author-bar__info{flex:1;min-width:0}.article-author-bar__name{font-weight:600;font-size:14px;color:var(--color-ink)}.article-author-bar__name:hover{color:var(--color-primary)}.article-author-bar__meta{display:flex;flex-wrap:wrap;gap:10px;font-size:12px;color:var(--color-ink-4, var(--color-ink-4));margin-top:2px}.article-author-bar__meta span{display:inline-flex;align-items:center;gap:3px}.article-author-bar__line{height:1px;background:var(--color-line);margin-bottom:20px}.article-footer{margin-top:32px;padding-top:20px;border-top:1px solid var(--color-line)}.article-copyright{font-size:13px;color:var(--color-ink-4, var(--color-ink-4));margin-bottom:16px}.article-end-separator{text-align:center;margin:16px 0;position:relative}.article-end-separator:before{content:"";position:absolute;top:50%;left:0;right:0;height:1px;background:var(--color-line)}.article-end-separator span{position:relative;display:inline-block;padding:0 14px;background:var(--surface-page);font-size:11px;font-weight:600;color:var(--color-ink-4, var(--color-ink-4));letter-spacing:2px}.article-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}.post-actions-wrap{position:relative;text-align:center;margin-bottom:16px}.post-actions-card,.post-actions{position:relative;text-align:center;margin-bottom:16px;padding-bottom:15px;display:block}.post-actions-wrap>.post-actions{margin-bottom:0}.post-actions-card__hint{font-size:13px;color:var(--color-ink-4, var(--color-ink-4));margin-bottom:12px}.post-actions-card__buttons{display:flex;justify-content:center;gap:10px;margin-bottom:12px}.article .action,.post-actions .action{width:80px;padding:10px 0;display:inline-block;opacity:.7;vertical-align:top;min-width:0;height:auto;border-radius:0;border:0;background:transparent;color:var(--muted-color, #777);cursor:pointer;font-size:14px;transition:opacity .15s ease,color .15s ease;gap:0;text-align:center}.article .action:hover,.post-actions .action:hover,.article .action.is-active,.post-actions .action.is-active{color:inherit;opacity:1;background:transparent;border-color:transparent}.article .action i,.post-actions .action i{font-size:20px;display:block;margin:0 auto 4px;line-height:1}.post-actions .action .action-btn__count,.post-actions .action .action-btn__label,.action-btn__count,.action-btn__label{display:block;font-size:12px;line-height:1.2;font-weight:500}.action-btn{display:inline-flex;align-items:center;gap:6px;padding:.38em 1.1em;border-radius:50px;border:1px solid transparent;background:var(--surface-4, rgba(136, 136, 136, .1));color:var(--color-ink-3);cursor:pointer;font-size:14px;transition:all .15s ease}.action-btn:hover{background:var(--color-primary-soft);color:var(--color-primary)}.action-btn.is-active{border-color:var(--color-primary);color:var(--color-primary);background:var(--color-primary-soft, rgba(240, 68, 148, .08))}.action-btn i{font-size:1.2em}.share-dropdown{position:absolute;left:50%;bottom:calc(100% + 8px);transform:translate(-50%);z-index:100;display:none!important}.share-dropdown[aria-hidden=false]{display:block!important;animation:shareDropdownIn .2s ease-out forwards}@keyframes shareDropdownIn{0%{opacity:0;transform:translate(-50%) translateY(8px)}to{opacity:1;transform:translate(-50%) translateY(0)}}.share-dropdown__grid{display:flex;align-items:center;gap:8px;padding:12px 16px;background:var(--surface-page);border:1px solid var(--color-line);border-radius:var(--radius-lg, 8px);box-shadow:var(--shadow-md, 0 4px 16px rgba(0,0,0,.1))}.share-item{display:inline-flex;flex-direction:column;align-items:center;gap:4px;padding:8px 12px;border:none;border-radius:var(--radius-btn, 6px);background:transparent;color:var(--color-ink-2, var(--color-ink-3));cursor:pointer;font-size:11px;transition:background .15s,color .15s,transform .15s;white-space:nowrap}.share-item:hover{transform:none}.share-item i{font-size:18px}.share-item[data-platform=qq]:hover{background:#e8f4fd;color:#12b7f5}.share-item[data-platform=weibo]:hover{background:#fceae9;color:#ff6a00}.share-item[data-platform=twitter]:hover{background:#f0f0f0;color:#000}.share-item[data-platform=wechat]:hover{background:#e6f7ec;color:#07c160}.share-item[data-platform=copy]:hover{background:#f0f2f5;color:#555}.share-item[data-platform=poster]:hover{background:#fff4e8;color:#f59e0b}#share-qrcode-box{position:absolute;bottom:calc(100% + 10px);left:50%;transform:translate(-50%);padding:14px;background:var(--surface-page);border:1px solid var(--color-line);border-radius:var(--radius-lg, 8px);box-shadow:var(--shadow-md, 0 4px 16px rgba(0,0,0,.12));text-align:center;z-index:101;pointer-events:none;opacity:0;transition:opacity .2s ease,transform .2s ease}#share-qrcode-box.is-visible{pointer-events:auto;opacity:1}#share-qrcode-image{width:140px;height:140px;display:block}.theme-dark .share-dropdown__grid,html.dark .share-dropdown__grid{background:var(--surface-1);border-color:var(--color-line);box-shadow:0 4px 16px #00000059}.theme-dark #share-qrcode-box,html.dark #share-qrcode-box{background:var(--surface-1);border-color:var(--color-line)}.theme-dark .share-item,html.dark .share-item{color:var(--color-ink-2, #aaa)}.theme-dark .share-item[data-platform=qq]:hover{background:#12b7f51f;color:#12b7f5}.theme-dark .share-item[data-platform=weibo]:hover{background:#ff6a001f;color:#ff6a00}.theme-dark .share-item[data-platform=twitter]:hover{background:#ffffff14;color:#fff}.theme-dark .share-item[data-platform=wechat]:hover{background:#07c1601f;color:#07c160}.theme-dark .share-item[data-platform=copy]:hover{background:#ffffff0f;color:#ccc}.theme-dark .share-item[data-platform=poster]:hover{background:#f59e0b1f;color:#f59e0b}@media(max-width:767px){.share-dropdown{position:fixed;inset:auto 0 0;transform:none;width:100%;max-width:none;z-index:1200;padding:0 0 calc(12px + env(safe-area-inset-bottom,0px));background:transparent}.share-dropdown[aria-hidden=false]{animation:shareSheetIn .22s ease-out forwards}@keyframes shareSheetIn{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}.share-dropdown__grid{justify-content:space-around;flex-wrap:wrap;gap:6px;margin:0 10px;padding:14px 12px 16px;border-radius:14px 14px 10px 10px;box-shadow:0 -6px 28px #00000029}.share-item{min-width:64px;flex:1 1 28%;max-width:33%}#share-qrcode-box{position:static;margin:10px auto 0;transform:none}body.aksrt-share-sheet-open{overflow:hidden}body.aksrt-share-sheet-open:before{content:"";position:fixed;inset:0;background:#00000059;z-index:1190}}.theme-dark .post-drop-meta__menu,html.dark .post-drop-meta__menu{background:var(--surface-1, #323335);border-color:var(--color-line);box-shadow:0 8px 24px #00000059}.theme-dark .post-drop-meta__item,html.dark .post-drop-meta__item{color:var(--color-ink-2, #ccc)}.theme-dark .post-drop-meta__item:hover,html.dark .post-drop-meta__item:hover{background:#ffffff0f;color:#fff}.author-box{margin-bottom:16px;padding:18px;background:var(--surface-1, #fff);border:none;border-radius:var(--radius-2xl, 16px);box-shadow:var(--shadow-sm)}.single-metabox{display:flex;align-items:center;justify-content:flex-end;gap:8px}.post-drop-meta{position:relative}.post-drop-meta__menu{position:absolute;top:calc(100% + 8px);right:0;min-width:150px;padding:8px;border-radius:var(--radius, 8px);border:1px solid var(--color-line);background:var(--surface-page, #fff);box-shadow:var(--shadow-md, 0 8px 24px rgba(0, 0, 0, .12));display:none;z-index:20}.post-drop-meta.is-open .post-drop-meta__menu{display:grid;gap:4px}.article-header:has(.post-drop-meta.is-open){z-index:30}.post-drop-meta__item{width:100%;display:inline-flex;align-items:center;gap:8px;padding:8px 10px;border:0;border-radius:6px;background:transparent;color:var(--color-ink-2, var(--color-ink));text-decoration:none;font-size:13px;text-align:left;cursor:pointer}.post-drop-meta__item:hover{background:var(--color-line, rgba(50, 50, 50, .06));color:var(--color-primary)}.post-drop-meta__item i{width:16px;text-align:center}.author-box__header{display:flex;align-items:flex-start;gap:14px}.author-box__avatar{width:56px;height:56px;border-radius:50%;object-fit:cover;flex-shrink:0;border:3px solid var(--color-primary-soft, rgba(240, 68, 148, .2))}.author-box__info{flex:1;min-width:0}.author-box__name{font-size:1rem;font-weight:700;color:var(--color-ink);display:block;margin-bottom:4px}.author-box__name:hover{color:var(--color-primary)}.author-box__bio{font-size:13px;color:var(--color-ink-3, var(--color-ink-4));line-height:1.5;margin:0 0 6px}.author-box__stats{font-size:12px;color:var(--color-ink-4, var(--color-ink-4))}.author-box__stats strong{color:var(--color-ink);margin-right:2px}.author-box__posts{margin-top:14px;padding-top:12px;border-top:1px solid var(--color-line)}.author-box__posts-title{font-size:12px;font-weight:600;color:var(--color-ink-3, var(--color-ink-4));margin:0 0 8px}.author-box__posts ul{list-style:none;margin:0;padding:0}.author-box__posts li{padding:3px 0}.author-box__posts a{font-size:13px;color:var(--color-ink);display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}.author-box__posts a:hover{color:var(--color-primary)}.author-box__posts a:before{content:"•";color:var(--color-primary)}.article-avatar .user-info{width:100%}.article-avatar .avatar-img{--this-size: 42px}.article-avatar .avatar-img img,.article-avatar .avatar{width:100%;height:100%;border-radius:50%;object-fit:cover}.article-avatar .display-name{font-weight:600;color:var(--key-color, #333)}.article-header .article-avatar .single-meta-row{margin-top:20px;position:relative;min-height:28px;display:flex;align-items:center;justify-content:flex-end}.article-header .article-avatar .single-meta-row>.line-form-line{bottom:50%}.article-header .article-avatar .single-meta-row>.single-metabox{position:relative;inset:auto;transform:none;z-index:1}.single-metabox{right:0;font-size:15px;--meta-color: var(--muted-color, #777)}.single-metabox .post-metas{background:var(--body-bg-color, #f5f5f5);right:0;padding:2px 6px;border-radius:100px;color:var(--meta-color);display:inline-flex;flex-wrap:wrap;align-items:center;gap:0}.single-metabox .post-metas item,.single-metabox .post-metas .item{margin:0 6px;font-size:13px;display:inline-flex;align-items:center;gap:4px}.single-metabox .post-drop-meta{position:relative;display:inline-block;--this-size: 1.73em;--this-color: var(--meta-color);--this-bg: var(--body-bg-color, #f5f5f5)}.article-avatar .line-form-line{display:block}.article-tags br{flex-basis:100%;width:100%;content:"";display:block;height:0}.article-tags .but.c-blue{color:#2196f3}.article-tags .but.c-yellow{color:#f0ad4e}.article-tags .but.c-green{color:#5cb85c}.article-tags .but.c-purple{color:#9c27b0}.article-tags .but.c-red{color:#f44336}.user-card.author{margin-bottom:16px;overflow:hidden}.user-card.author .user-avatar{display:flex;justify-content:center}.user-card.author .user-avatar .avatar,.user-card.author .user-avatar img{width:80px;height:80px;border-radius:50%;object-fit:cover}.user-card.author .user-name{display:flex;flex-wrap:nowrap;align-items:center;justify-content:center;gap:4px}.user-card.author .user-name .display-name{font-weight:700;color:var(--key-color, inherit)}.user-card.author .user-desc,.user-card.author .user-btns{text-align:center}.user-card.author .user-card-posts ul{list-style:none;margin:0;padding:0}.user-card.author .user-card-posts li{padding:6px 0;border-bottom:1px dashed var(--color-line, rgba(0,0,0,.06))}.user-card.author .user-card-posts li:last-child{border-bottom:0} diff --git a/assets/css/frontend/pay-box.css b/assets/css/frontend/pay-box.css index 6159ed25..73439613 100644 --- a/assets/css/frontend/pay-box.css +++ b/assets/css/frontend/pay-box.css @@ -50,3 +50,15 @@ .pay-box .muted-2-color + .muted-2-color { margin-left: 10px; } + +.pay-box .pay-vip-level-icon { + display: inline-block; + width: 1.4em; + height: 1.4em; + object-fit: contain; + vertical-align: -0.28em; +} + +.pay-box .pay-vip-exclusive { + padding: 5px 20px; +} diff --git a/assets/css/frontend/single-post/author-actions.css b/assets/css/frontend/single-post/author-actions.css index d3dff9f8..3a3bd8d6 100644 --- a/assets/css/frontend/single-post/author-actions.css +++ b/assets/css/frontend/single-post/author-actions.css @@ -446,6 +446,10 @@ html.dark .post-drop-meta__item:hover { gap: 4px; } +.article-header:has(.post-drop-meta.is-open) { + z-index: 30; +} + .post-drop-meta__item { width: 100%; display: inline-flex; diff --git a/inc/helpers/aksrt-pay.php b/inc/helpers/aksrt-pay.php index 8d38664a..02d77dd1 100644 --- a/inc/helpers/aksrt-pay.php +++ b/inc/helpers/aksrt-pay.php @@ -482,111 +482,116 @@ if (!function_exists('aksrt_guest_has_paid_access')) { } /** - * Resolve the amount a given user should pay for a post (legacy VIP tier min). - * - * VIP tier prices only apply when configured as a positive discount (< base). - * Full free for VIP uses vip_free_download / exempt roles (handled separately). + * Resolve the amount a given user should pay for a post. * * @param int|WP_Post|null $post * @param int $user_id * @return array{amount:int|string,base:int|string,vip_amount:int|string|null,modo:string,currency:string,is_free:bool,pay_limit:int,vip_level:int,original:int|string,vip1:int|string,vip2:int|string} */ if (!function_exists('aksrt_get_user_pay_price')) { - function aksrt_get_user_pay_price($post = null, int $user_id = 0): array { - $meta = function_exists('aksrt_get_pay_meta') ? aksrt_get_pay_meta($post) : \AKSRT\Core\DomainModel::default_pay_meta(); - $pay_modo = (($meta['pay_modo'] ?? '0') === 'points') ? 'points' : '0'; - $pay_limit = (int) ($meta['pay_limit'] ?? 0); - if (!in_array($pay_limit, [0, 1, 2], true)) { - $pay_limit = 0; - } + function aksrt_get_user_pay_price($post = null, int $user_id = 0): array { + $meta = function_exists('aksrt_get_pay_meta') ? aksrt_get_pay_meta($post) : \AKSRT\Core\DomainModel::default_pay_meta(); + $pay_modo = (($meta['pay_modo'] ?? '0') === 'points') ? 'points' : '0'; + $pay_limit = (int) ($meta['pay_limit'] ?? 0); + if (!in_array($pay_limit, [0, 1, 2], true)) { + $pay_limit = 0; + } - $uid = $user_id > 0 ? $user_id : (function_exists('get_current_user_id') ? (int) get_current_user_id() : 0); - $vip_level = 0; - if ($uid > 0 && function_exists('aksrt_get_user_vip_level')) { - $vip_level = (int) aksrt_get_user_vip_level($uid); - } - if ($uid > 0 && function_exists('aksrt_is_vip_exempt') && aksrt_is_vip_exempt($uid)) { - $vip_level = max($vip_level, 2); - } + $uid = $user_id > 0 ? $user_id : (function_exists('get_current_user_id') ? (int) get_current_user_id() : 0); + $vip_level = 0; + if ($uid > 0 && function_exists('aksrt_get_user_vip_level')) { + $vip_level = (int) aksrt_get_user_vip_level($uid); + } + if ($uid > 0 && function_exists('aksrt_is_vip_exempt') && aksrt_is_vip_exempt($uid)) { + $vip_level = max($vip_level, 2); + } - $currency = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_currency_name() : __('积分', 'aksrt'); - $cash_symbol = '¥'; - if (class_exists('\AKSRT\Settings\Settings')) { - $paid = \AKSRT\Settings\Settings::get_paid_content_settings(); - $cash_symbol = (string) ($paid['display']['currency_symbol'] ?? '¥'); - } + $currency = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_currency_name() : __('积分', 'aksrt'); + $cash_symbol = '¥'; + $vip_settings = []; + if (class_exists('\AKSRT\Settings\Settings')) { + $paid = \AKSRT\Settings\Settings::get_paid_content_settings(); + $cash_symbol = (string) ($paid['display']['currency_symbol'] ?? '¥'); + $vip_settings = \AKSRT\Settings\Settings::get_payment_vip_settings(); + } + $vip_levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : []; - if ($pay_modo === 'points') { - $base_minor = max(0, (int) ($meta['points_price'] ?? 0)); - $vip1_minor = max(0, (int) ($meta['vip1_points'] ?? 0)); - $vip2_minor = max(0, (int) ($meta['vip2_points'] ?? 0)); - $currency_label = $currency; - } else { - $parse_cash = static function ($value): int { - if (!is_string($value)) { - return 0; - } - try { - return \AKSRT\Ledger\AssetAmount::balance_minor($value); - } catch (\InvalidArgumentException $e) { - return 0; - } - }; - $base_minor = $parse_cash($meta['price'] ?? '0'); - $vip1_minor = $parse_cash($meta['vip1_price'] ?? '0'); - $vip2_minor = $parse_cash($meta['vip2_price'] ?? '0'); - $currency_label = $cash_symbol; - } + if ($pay_modo === 'points') { + $base_minor = max(0, (int) ($meta['points_price'] ?? 0)); + $vip1_minor = max(0, (int) ($meta['vip1_points'] ?? 0)); + $vip2_minor = max(0, (int) ($meta['vip2_points'] ?? 0)); + $currency_label = $currency; + } else { + $parse_cash = static function ($value): int { + if (!is_string($value)) { + return 0; + } + try { + return \AKSRT\Ledger\AssetAmount::balance_minor($value); + } catch (\InvalidArgumentException $e) { + return 0; + } + }; + $base_minor = $parse_cash($meta['price'] ?? '0'); + $vip1_minor = $parse_cash($meta['vip1_price'] ?? '0'); + $vip2_minor = $parse_cash($meta['vip2_price'] ?? '0'); + $currency_label = $cash_symbol; + } - // Positive VIP tier prices only (0 defaults mean "not configured"). - $vip_minor = null; - if ($vip_level >= 2 && $vip2_minor > 0) { - $vip_minor = $vip2_minor; - } elseif ($vip_level >= 1 && $vip1_minor > 0) { - $vip_minor = $vip1_minor; - } + $vip_prices = [ + 1 => $vip1_minor, + 2 => $vip2_minor, + ]; + $vip_minor = null; + for ($level = min(2, $vip_level); $level >= 1; $level--) { + if (empty($vip_levels[$level]['enabled'])) { + continue; + } + $level_price = $vip_prices[$level]; + if ($level_price < $base_minor) { + $vip_minor = $level_price; + } + break; + } - $amount_minor = $base_minor; - if ($vip_minor !== null && ($base_minor <= 0 || $vip_minor < $base_minor)) { - $amount_minor = $vip_minor; - } + $amount_minor = $vip_minor ?? $base_minor; - // Role/VIP free-download exemption (global setting). - if ($amount_minor > 0 && $uid > 0 && function_exists('aksrt_is_download_credit_exempt_user') && aksrt_is_download_credit_exempt_user($uid)) { - $amount_minor = 0; - } + // Role/VIP free-download exemption (global setting). + if ($amount_minor > 0 && $uid > 0 && function_exists('aksrt_is_download_credit_exempt_user') && aksrt_is_download_credit_exempt_user($uid)) { + $amount_minor = 0; + } - if ($pay_modo === 'points') { - $original = max(0, (int) ($meta['original_price'] ?? 0)); - $amount = $amount_minor; - $base = $base_minor; - $vip1 = $vip1_minor; - $vip2 = $vip2_minor; - $vip_amount = $vip_minor; - } else { - $original_minor = $parse_cash($meta['original_price'] ?? '0'); - $amount = \AKSRT\Ledger\AssetAmount::decimal_from_minor($amount_minor); - $base = \AKSRT\Ledger\AssetAmount::decimal_from_minor($base_minor); - $vip1 = \AKSRT\Ledger\AssetAmount::decimal_from_minor($vip1_minor); - $vip2 = \AKSRT\Ledger\AssetAmount::decimal_from_minor($vip2_minor); - $vip_amount = $vip_minor === null ? null : \AKSRT\Ledger\AssetAmount::decimal_from_minor($vip_minor); - $original = \AKSRT\Ledger\AssetAmount::decimal_from_minor($original_minor); - } + if ($pay_modo === 'points') { + $original = max(0, (int) ($meta['original_price'] ?? 0)); + $amount = $amount_minor; + $base = $base_minor; + $vip1 = $vip1_minor; + $vip2 = $vip2_minor; + $vip_amount = $vip_minor; + } else { + $original_minor = $parse_cash($meta['original_price'] ?? '0'); + $amount = \AKSRT\Ledger\AssetAmount::decimal_from_minor($amount_minor); + $base = \AKSRT\Ledger\AssetAmount::decimal_from_minor($base_minor); + $vip1 = \AKSRT\Ledger\AssetAmount::decimal_from_minor($vip1_minor); + $vip2 = \AKSRT\Ledger\AssetAmount::decimal_from_minor($vip2_minor); + $vip_amount = $vip_minor === null ? null : \AKSRT\Ledger\AssetAmount::decimal_from_minor($vip_minor); + $original = \AKSRT\Ledger\AssetAmount::decimal_from_minor($original_minor); + } - return [ - 'amount' => $amount, - 'base' => $base, - 'vip_amount' => $vip_amount, - 'modo' => $pay_modo, - 'currency' => $currency_label, - 'is_free' => $amount_minor <= 0, - 'pay_limit' => $pay_limit, - 'vip_level' => $vip_level, - 'original' => $original, - 'vip1' => $vip1, - 'vip2' => $vip2, - ]; - } + return [ + 'amount' => $amount, + 'base' => $base, + 'vip_amount' => $vip_amount, + 'modo' => $pay_modo, + 'currency' => $currency_label, + 'is_free' => $amount_minor <= 0, + 'pay_limit' => $pay_limit, + 'vip_level' => $vip_level, + 'original' => $original, + 'vip1' => $vip1, + 'vip2' => $vip2, + ]; + } } /** @@ -1160,6 +1165,142 @@ if (!function_exists('aksrt_get_pay_attributes_html')) { } } +/** + * Render the configured icon for a paid-content VIP tier. + */ +if (!function_exists('aksrt_get_pay_vip_icon_html')) { + function aksrt_get_pay_vip_icon_html(array $level_settings, string $class = 'mr3 em14'): string { + $icon_url = esc_url((string) ($level_settings['img_icon'] ?? '')); + if ($icon_url === '') { + return ''; + } + + return ''; + } +} + +/** + * Render the reference-theme base-price block for a paid article. + */ +if (!function_exists('aksrt_get_show_pay_price_html')) { + function aksrt_get_show_pay_price_html(array $meta, array $priced, string $class = 'c-red'): string { + $modo = (($priced['modo'] ?? '0') === 'points') ? 'points' : '0'; + $base = $priced['base'] ?? ($modo === 'points' ? 0 : '0.00'); + $pay_limit = (int) ($priced['pay_limit'] ?? ($meta['pay_limit'] ?? 0)); + $cash_symbol = '¥'; + $points_name = __('积分', 'aksrt'); + $vip_settings = []; + + if (class_exists('\AKSRT\Settings\Settings')) { + $paid_settings = \AKSRT\Settings\Settings::get_paid_content_settings(); + $cash_symbol = (string) ($paid_settings['display']['currency_symbol'] ?? '¥'); + $points_name = \AKSRT\Settings\Settings::get_currency_name(); + $vip_settings = \AKSRT\Settings\Settings::get_payment_vip_settings(); + } + + $vip_levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : []; + if ($pay_limit > 0 && !empty($vip_settings['enabled'])) { + $level_settings = is_array($vip_levels[$pay_limit] ?? null) ? $vip_levels[$pay_limit] : []; + $level_name = (string) ($level_settings['name'] ?? sprintf(__('VIP%d', 'aksrt'), $pay_limit)); + $title = $pay_limit === 2 + ? sprintf(__('仅%s可购买', 'aksrt'), $level_name) + : sprintf(__('%s及以上会员可购买', 'aksrt'), $level_name); + $icon = aksrt_get_pay_vip_icon_html($level_settings); + + return '
' . $icon . esc_html__('会员专属资源', 'aksrt') . '
'; + } + + if ($modo === 'points') { + return '
' . esc_html(aksrt_format_price($base)) . '' . esc_html($points_name) . '
'; + } + + $mark = '' . esc_html($cash_symbol) . ''; + $base_minor = aksrt_asset_price_minor($base, '0'); + $original = $meta['original_price'] ?? '0.00'; + $original_minor = aksrt_asset_price_minor($original, '0'); + $original_html = ''; + if ($original_minor > $base_minor) { + $original_html = '' . $mark . esc_html(aksrt_format_price($original)) . ''; + } + + $promotion_tag = trim((string) ($meta['promotion_tag'] ?? '')); + if ($promotion_tag !== '' && $original_minor > 0) { + $original_html = '
' . wp_kses_post($promotion_tag) . '
' . $original_html . '
'; + } + + $price = '
' . $mark . esc_html(aksrt_format_price($base)) . '' . $original_html . '
'; + + return '
' . $price . '
'; + } +} + +/** + * Render all enabled VIP prices for a paid article. + */ +if (!function_exists('aksrt_get_posts_vip_price')) { + function aksrt_get_posts_vip_price(array $meta): string { + if (!class_exists('\AKSRT\Settings\Settings')) { + return ''; + } + + $vip_settings = \AKSRT\Settings\Settings::get_payment_vip_settings(); + if (empty($vip_settings['enabled'])) { + return ''; + } + + $levels = is_array($vip_settings['levels'] ?? null) ? $vip_settings['levels'] : []; + $modo = (($meta['pay_modo'] ?? '0') === 'points') ? 'points' : '0'; + $base = $modo === 'points' ? (int) ($meta['points_price'] ?? 0) : (string) ($meta['price'] ?? '0.00'); + $base_minor = aksrt_asset_price_minor($base, $modo); + if ($base_minor <= 0) { + return ''; + } + + $mark = $modo === 'points' + ? '' + : '' . esc_html((string) (\AKSRT\Settings\Settings::get_paid_content_settings()['display']['currency_symbol'] ?? '¥')) . ''; + $user_id = get_current_user_id(); + $user_vip_level = $user_id > 0 && function_exists('aksrt_get_user_vip_level') + ? (int) aksrt_get_user_vip_level($user_id) + : 0; + $items = []; + + foreach ([1, 2] as $level) { + $level_settings = is_array($levels[$level] ?? null) ? $levels[$level] : []; + if (empty($level_settings['enabled'])) { + continue; + } + + $key = $modo === 'points' ? 'vip' . $level . '_points' : 'vip' . $level . '_price'; + $value = $meta[$key] ?? ($modo === 'points' ? 0 : '0.00'); + $vip_minor = aksrt_asset_price_minor($value, $modo); + if ($vip_minor >= $base_minor) { + continue; + } + + $level_name = (string) ($level_settings['name'] ?? sprintf(__('VIP%d', 'aksrt'), $level)); + $price = $vip_minor === 0 + ? esc_html__('免费', 'aksrt') + : $mark . esc_html(aksrt_format_price($value)); + $icon = aksrt_get_pay_vip_icon_html($level_settings); + $action_class = $user_id <= 0 ? ' signin-loader' : ($user_vip_level < $level ? ' pay-vip' : ''); + $title = sprintf(__('开通%s', 'aksrt'), $level_name); + $title_attr = $action_class !== '' + ? ' data-toggle="tooltip" title="' . esc_attr($title) . '"' + : ''; + + $items[] = '' . $icon . esc_html($level_name) . '' . $price . ''; + } + + $html = implode('', $items); + if (count($items) > 1) { + $html = '' . $html . ''; + } + + return $html; + } +} + // ============================================================ // 付费墙 HTML // ============================================================ @@ -1176,11 +1317,10 @@ if (!function_exists('aksrt_get_paywall_html')) { $modo = (string) ($priced['modo'] ?? '0'); $amount = $priced['amount'] ?? 0; $amount_minor = aksrt_asset_price_minor($amount, $modo); - $price_label = aksrt_get_pay_price_label($post); - $price_text = (string) ($price_label['text'] ?? __('免费', 'aksrt')); - $pay_limit = (int) ($priced['pay_limit'] ?? ($meta['pay_limit'] ?? 0)); - $vip_level = (int) ($priced['vip_level'] ?? 0); - $member_blocked = $pay_limit > 0 && $vip_level < $pay_limit; + $pay_limit = (int) ($priced['pay_limit'] ?? ($meta['pay_limit'] ?? 0)); + $vip_level = (int) ($priced['vip_level'] ?? 0); + $pay_vip_settings = class_exists('\AKSRT\Settings\Settings') ? \AKSRT\Settings\Settings::get_payment_vip_settings() : []; + $member_blocked = $pay_limit > 0 && !empty($pay_vip_settings['enabled']) && $vip_level < $pay_limit; $type_labels = [ AKSRT_PAY_TYPE_READING => __('付费阅读', 'aksrt'), AKSRT_PAY_TYPE_DOWNLOAD => __('付费下载', 'aksrt'), @@ -1207,38 +1347,31 @@ if (!function_exists('aksrt_get_paywall_html')) { $tag = $is_widget ? '' . esc_html($type_label) . '' : '
' . esc_html($type_label) . '
'; - $block_class = $is_widget ? ' btn-block' : ''; - $button = ''; - if (!is_user_logged_in()) { - if ($pay_limit <= 0 && $amount_minor > 0 && $modo === '0' && aksrt_allow_guest_content_pay($post)) { - $button = ''; - } else { - $button = ' ' . esc_html__('登录购买', 'aksrt') . ''; - } - } elseif ($member_blocked) { - $vip_url = aksrt_get_user_center_tab_url('vip'); - $button = ' ' . esc_html__('开通会员后可查看', 'aksrt') . ''; - } elseif ($amount_minor > 0) { - $button = ''; - } else { - $button = ''; - } - $price_color = ($price_label['free'] ?? false) ? 'c-green' : ($modo === 'points' ? 'c-yellow' : 'c-red'); - $price = '
' . esc_html($price_text) . '
'; - $vip_items = []; - $base_minor = aksrt_asset_price_minor($priced['base'] ?? $amount, $modo); - foreach ([1, 2] as $level) { - $key = $modo === 'points' ? 'vip' . $level . '_points' : 'vip' . $level . '_price'; - $value = $meta[$key] ?? 0; - $vip_minor = aksrt_asset_price_minor($value, $modo); - if ($vip_minor > 0 && ($base_minor <= 0 || $vip_minor < $base_minor)) { - $vip_items[] = '' . esc_html(sprintf(__('VIP%d', 'aksrt'), $level)) . '' . esc_html(aksrt_format_price($value)) . ''; - } - } - $vip = implode('', $vip_items); - if (count($vip_items) > 1) { - $vip = '' . $vip . ''; - } + $block_class = $is_widget ? ' btn-block' : ''; + $button = ''; + if ($member_blocked) { + $level_settings = is_array($pay_vip_settings['levels'][$pay_limit] ?? null) ? $pay_vip_settings['levels'][$pay_limit] : []; + $level_name = (string) ($level_settings['name'] ?? sprintf(__('VIP%d', 'aksrt'), $pay_limit)); + $vip_action = $vip_level > 0 + ? sprintf(__('升级%s', 'aksrt'), $level_name) + : __('开通会员', 'aksrt'); + $action_class = is_user_logged_in() ? 'pay-vip' : 'signin-loader'; + $icon = aksrt_get_pay_vip_icon_html($level_settings); + $button = '
' . esc_html(sprintf(__('您暂无购买权限,请先%s', 'aksrt'), $vip_action)) . '
'; + $button .= '' . $icon . esc_html($vip_action) . ''; + } elseif (!is_user_logged_in()) { + if ($amount_minor > 0 && $modo === '0' && aksrt_allow_guest_content_pay($post)) { + $button = ''; + } else { + $button = '' . esc_html__('登录购买', 'aksrt') . ''; + } + } elseif ($amount_minor > 0) { + $button = ''; + } else { + $button = ''; + } + $price = aksrt_get_show_pay_price_html($meta, $priced); + $vip = aksrt_get_posts_vip_price($meta); $attrs = aksrt_get_pay_attributes_html($post, 'pay-attr'); $count = $sales > 0 ? '' . esc_html(sprintf(__('已售 %s', 'aksrt'), $sales)) . '' : ''; $service = aksrt_get_pay_service_html('muted-2-color'); diff --git a/tests/widget-system/pay-card-contract.test.cjs b/tests/widget-system/pay-card-contract.test.cjs index e1a49c0f..7767da5d 100644 --- a/tests/widget-system/pay-card-contract.test.cjs +++ b/tests/widget-system/pay-card-contract.test.cjs @@ -22,6 +22,20 @@ test('paid article and sidebar widget use the Zibll purchase-card DOM', () => { assert.match(pay, /pay-tag abs-center/); assert.match(pay, /price-box/); assert.match(pay, /vip-price-buts but-average inline/); + assert.match(pay, /function aksrt_get_show_pay_price_html/); + assert.match(pay, /function aksrt_get_posts_vip_price/); + assert.match(pay, /get_payment_vip_settings/); + assert.match(pay, /\['img_icon'\]/); + assert.match(pay, /signin-loader/); + assert.match(pay, /pay-vip/); + assert.match(pay, /vip-level/); + assert.match(pay, /免费/); + assert.match(pay, /original-price/); + assert.match(pay, /promotion_tag/); + assert.doesNotMatch(pay, /\$vip_minor > 0/); + assert.doesNotMatch(pay, /\$vip_items/); + assert.doesNotMatch(pay, /wp_login_url\(get_permalink\(\$post\)\)/); + assert.doesNotMatch(pay, /aksrt_get_user_center_tab_url\('vip'\)/); assert.match(pay, /cashier-link/); assert.match(pay, /function aksrt_get_paid_box_html/); assert.match(pay, /pay-box zib-widget paid-box order-type-/); @@ -51,6 +65,8 @@ test('the purchase card owns one direct stylesheet and no retired paywall path', assert.match(assets, /assets\/css\/frontend\/pay-box\.css|\'pay-box\'/); assert.match(shortcodes, /return aksrt_get_paywall_html\(\$post, \['message' => \$message\]\);/); assert.match(css, /\.zib-widget\.pay-box/); + assert.match(css, /\.pay-box \.pay-vip-level-icon/); + assert.match(css, /\.pay-box \.pay-vip-exclusive/); assert.doesNotMatch(css, /@media/); assert.match(publicCss, /\.pay-box\.pay-widget \.vip-price/); assert.match(publicCss, /\.pay-flexbox\s*\{\s*flex-wrap:\s*wrap;/); diff --git a/tests/widget-system/post-visual-contract.test.cjs b/tests/widget-system/post-visual-contract.test.cjs index 38969627..be153935 100644 --- a/tests/widget-system/post-visual-contract.test.cjs +++ b/tests/widget-system/post-visual-contract.test.cjs @@ -521,6 +521,7 @@ test('single post more menu has one accessible runtime and an in-flow author anc assert.doesNotMatch(singleRender, /cover-meta|str_replace\('single-metabox'/); assert.match(styles, /\.single-meta-row > \.single-metabox\s*\{[^}]*position:\s*relative;[^}]*transform:\s*none;/s); assert.match(styles, /\.post-drop-meta__menu\s*\{[^}]*position:\s*absolute;[^}]*right:\s*0;/s); + assert.match(styles, /\.article-header:has\(\.post-drop-meta\.is-open\)\s*\{[^}]*z-index:\s*30;/s); }); test('single post has no word-count or estimated-reading-time chain', () => {