'),_=x('
'),u=x('
'),l.id&&E.attr("id",l.id),E.addClass(l.className),C.attr("lay-filter",M),layui.each(f,function(e,t){var a=x('
');0===e&&a.addClass("layui-this"),a.html(l.text[t]),r.append(a)}),x.extend(c,{full:{className:"screen-full",title:["\u6700\u5927\u5316\u663e\u793a","\u8fd8\u539f\u663e\u793a"],event:function(e){var e=e.elem,t=e.closest("."+A.ELEM_PREVIEW),a="layui-icon-"+this.className,i="layui-icon-screen-restore",l=this.title,o=x("html,body"),n="layui-scrollbar-hide";e.hasClass(a)?(t.addClass(A.ELEM_FULL),e.removeClass(a).addClass(i),e.attr("title",l[1]),o.addClass(n)):(t.removeClass(A.ELEM_FULL),e.removeClass(i).addClass(a),e.attr("title",l[0]),o.removeClass(n))}},window:{className:"release",title:["\u5728\u65b0\u7a97\u53e3\u9884\u89c8"],event:function(e){D.openWin({content:n(l.code)})}}}),l.copy&&("array"===layui.type(l.tools)?-1===l.tools.indexOf("copy")&&l.tools.unshift("copy"):l.tools=["copy"]),u.on("click",">i",function(){var e=x(this),t=e.data("type"),e={elem:e,type:t,options:l,rawCode:l.code,finalCode:D.unescape(n(l.code))};c[t]&&"function"==typeof c[t].event&&c[t].event(e),"function"==typeof l.toolsEvent&&l.toolsEvent(e)}),l.addTools&&l.tools&&(l.tools=[].concat(l.tools,l.addTools)),layui.each(l.tools,function(e,t){var a="object"==typeof t,i=a?t:c[t]||{className:t,title:[t]},l=i.className||i.type,o=i.title||[""],a=a?i.type||l:t;a&&(c[a]||((t={})[a]=i,x.extend(c,t)),u.append(''))}),o.addClass(A.ELEM_ITEM).wrap(E),C.append(r),l.tools&&C.append(u),o.before(C),s&&_.html(''),y=function(e){var t=e.children("iframe")[0];s&&t?t.srcdoc=n(l.code):e.html(l.code),setTimeout(function(){"function"==typeof l.done&&l.done({container:e,options:l,render:function(){N.render(e.find(".layui-form")),S.render(),I.render({elem:["."+A.ELEM_PREVIEW,".layui-tabs"].join(" ")})}})},3)},"preview"===f[0]?(_.addClass(A.ELEM_SHOW),o.before(_),y(_)):o.addClass(A.ELEM_SHOW).after(_),l.previewStyle=[l.style,l.previewStyle].join(""),_.attr("style",l.previewStyle),S.on("tab("+M+")",function(e){var t=x(this),a=x(e.elem).closest("."+A.ELEM_PREVIEW).find("."+A.ELEM_ITEM),e=a.eq(e.index);a.removeClass(A.ELEM_SHOW),e.addClass(A.ELEM_SHOW),"preview"===t.attr("lay-id")&&y(e),L()})),p=x(''),o.addClass((E=["layui-code-view layui-border-box"],l.wordWrap||E.push("layui-code-nowrap"),E.join(" "))),(C=l.theme||l.skin)&&(o.removeClass("layui-code-theme-dark layui-code-theme-light"),o.addClass("layui-code-theme-"+C)),l.highlighter&&o.addClass([l.highlighter,"language-"+l.lang,"layui-code-hl"].join(" ")),f=w(l.encode?D.escape(n(a)):a),h=f.lines,o.html(p.html(f.html)),l.ln&&o.append(''),l.height&&p.css("max-height",l.height),l.codeStyle=[l.style,l.codeStyle].join(""),l.codeStyle&&p.attr("style",function(e,t){return(t||"")+l.codeStyle}),v=[{selector:">.layui-code-wrap>.layui-code-line{}",setValue:function(e,t){e.style["padding-left"]=t+"px"}},{selector:">.layui-code-wrap>.layui-code-line>.layui-code-line-number{}",setValue:function(e,t){e.style.width=t+"px"}},{selector:">.layui-code-ln-side{}",setValue:function(e,t){e.style.width=t+"px"}}],m=lay.style({target:o[0],id:"DF-code-"+d,text:x.map(x.map(v,function(e){return e.selector}),function(e,t){return['.layui-code-view[lay-code-index="'+d+'"]',e].join(" ")}).join("")}),L=function b(){var e,i;return l.ln&&(e=Math.floor(h.length/100),i=p.children("."+A.ELEM_LINE).last().children("."+A.ELEM_LINE_NUM).outerWidth(),o.addClass(A.ELEM_LN_MODE),e)&&A.LINE_RAW_WIDTH')).html(l.title||l.text.code),o.prepend(_)),M=x('
'),l.copy&&!l.preview&&((C=x(['
','',""].join(""))).on("click",function(){c.copy.event()}),M.append(C)),l.langMarker&&M.append('
'+l.lang+""),l.about&&M.append(l.about),o.append(M),l.preview||setTimeout(function(){"function"==typeof l.done&&l.done({})},3),l.elem.length===1+d&&"function"==typeof l.allDone&&l.allDone())),g})}),layui["layui.all"]||layui.addcss("modules/code.css?v=6","skincodecss");
\ No newline at end of file
diff --git a/public/css/login-bg.css b/public/css/login-bg.css
new file mode 100644
index 0000000..997df4a
--- /dev/null
+++ b/public/css/login-bg.css
@@ -0,0 +1,65 @@
+body:has(.auth-container) {
+ background:
+ linear-gradient(90deg, rgba(246, 249, 255, 0.9) 0%, rgba(246, 249, 255, 0.74) 48%, rgba(246, 249, 255, 0.62) 100%),
+ url("../img/auth-login-bg.png") center / cover no-repeat,
+ linear-gradient(135deg, #eef3fb 0%, #f8fbff 42%, #edf4ff 100%);
+ background-attachment: fixed;
+}
+
+body:has(.auth-container)::before {
+ content: "";
+ position: fixed;
+ inset: 0;
+ pointer-events: none;
+ background:
+ radial-gradient(circle at 50% 38%, rgba(255, 255, 255, 0.62) 0%, rgba(255, 255, 255, 0) 36%),
+ linear-gradient(180deg, rgba(255, 255, 255, 0.18), rgba(222, 232, 246, 0.12));
+ opacity: 0.9;
+}
+
+.auth-card {
+ background: rgba(255, 255, 255, 0.94);
+ border: 1px solid rgba(255, 255, 255, 0.72);
+ box-shadow: 0 24px 70px rgba(16, 43, 106, 0.18), 0 8px 24px rgba(0, 0, 0, 0.08);
+ backdrop-filter: blur(14px);
+ -webkit-backdrop-filter: blur(14px);
+}
+
+.auth-header {
+ padding-top: 28px;
+ padding-bottom: 26px;
+}
+
+.auth-logo--image {
+ display: flex;
+ width: 100%;
+ justify-content: center;
+ align-items: center;
+ margin-bottom: 8px;
+ line-height: 1;
+}
+
+.auth-logo--image img {
+ display: block;
+ width: min(230px, 70%);
+ height: auto;
+ margin: 0 auto;
+}
+
+.auth-subtitle {
+ text-align: center;
+}
+
+@media (max-width: 768px) {
+ body:has(.auth-container) {
+ background:
+ linear-gradient(180deg, rgba(246, 249, 255, 0.88) 0%, rgba(246, 249, 255, 0.72) 100%),
+ url("../img/auth-login-bg.png") center / cover no-repeat,
+ linear-gradient(135deg, #eef3fb 0%, #f8fbff 48%, #edf4ff 100%);
+ background-attachment: scroll;
+ }
+
+ .auth-logo--image img {
+ width: min(210px, 72%);
+ }
+}
diff --git a/public/css/mianfei-detail.css b/public/css/mianfei-detail.css
new file mode 100644
index 0000000..a661821
--- /dev/null
+++ b/public/css/mianfei-detail.css
@@ -0,0 +1,197 @@
+/* Comment Section */
+.is-hidden {
+ display: none !important;
+}
+
+.cxz-article-loading {
+ text-align: center;
+ color: var(--text-muted);
+}
+
+.site-footer__record-link {
+ font-size: 12px;
+ color: rgba(255, 255, 255, 0.5);
+}
+
+ .cxz-comment-section {
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-sm);
+ margin-top: 24px;
+ overflow: hidden;
+ border: 1px solid var(--border-light);
+ }
+ .cxz-comment-header {
+ padding: 20px 28px;
+ border-bottom: 1px solid var(--border-light);
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--text-dark);
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ background: linear-gradient(180deg, #f8f9fc, #fff);
+ }
+ .cxz-comment-header i {
+ color: var(--primary);
+ font-size: 20px;
+ }
+
+ /* Comment Input */
+ .cxz-comment-input-box {
+ padding: 20px 28px;
+ border-bottom: 1px solid var(--border-light);
+ background: rgba(16, 43, 106, 0.02);
+ }
+ .cxz-comment-textarea {
+ width: 100%;
+ height: 80px;
+ padding: 12px 16px;
+ border: 2px solid var(--border-light);
+ border-radius: var(--radius-md);
+ font-size: 14px;
+ color: var(--text-dark);
+ background: var(--white);
+ resize: vertical;
+ outline: none;
+ transition: border-color 0.25s;
+ box-sizing: border-box;
+ line-height: 1.6;
+ }
+ .cxz-comment-textarea::placeholder {
+ color: var(--text-muted);
+ }
+ .cxz-comment-textarea:focus {
+ border-color: var(--primary);
+ box-shadow: 0 0 0 3px rgba(16, 43, 106, 0.1);
+ }
+ .cxz-comment-submit-btn {
+ margin-top: 12px;
+ padding: 10px 28px;
+ border: none;
+ border-radius: var(--radius-md);
+ font-size: 14px;
+ font-weight: 700;
+ background: linear-gradient(135deg, var(--primary), #1a3f8f);
+ color: var(--white);
+ cursor: pointer;
+ transition: all 0.3s;
+ letter-spacing: 1px;
+ }
+ .cxz-comment-submit-btn:hover {
+ box-shadow: 0 4px 14px rgba(16, 43, 106, 0.4);
+ transform: translateY(-1px);
+ }
+ .cxz-comment-submit-btn:disabled {
+ opacity: 0.6;
+ cursor: not-allowed;
+ transform: none;
+ }
+
+ /* Comment List */
+ .cxz-comment-list {
+ padding: 0 28px;
+ }
+ .cxz-comment-empty {
+ text-align: center;
+ padding: 40px 20px;
+ color: var(--text-muted);
+ }
+ .cxz-comment-empty i {
+ font-size: 32px;
+ opacity: 0.3;
+ display: block;
+ margin-bottom: 8px;
+ }
+
+ .cxz-comment-item {
+ display: flex;
+ gap: 14px;
+ padding: 18px 0;
+ border-bottom: 1px dashed var(--border-light);
+ animation: fadeInUp 0.3s ease;
+ }
+ .cxz-comment-item:last-child {
+ border-bottom: none;
+ }
+ .cxz-comment-avatar {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ object-fit: cover;
+ flex-shrink: 0;
+ border: 2px solid rgba(253, 185, 51, 0.3);
+ }
+ .cxz-comment-avatar-placeholder {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ flex-shrink: 0;
+ background: linear-gradient(135deg, var(--primary), #1a3f8f);
+ color: var(--white);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 16px;
+ font-weight: 700;
+ }
+ .cxz-comment-body {
+ flex: 1;
+ min-width: 0;
+ }
+ .cxz-comment-name {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--primary);
+ margin-bottom: 4px;
+ }
+ .cxz-comment-text {
+ font-size: 14px;
+ color: var(--text-dark);
+ line-height: 1.6;
+ word-break: break-word;
+ }
+ .cxz-comment-time {
+ font-size: 12px;
+ color: var(--text-muted);
+ margin-top: 6px;
+ }
+
+ /* Responsive */
+ @media (max-width: 768px) {
+ .cxz-comment-header {
+ padding: 16px 20px;
+ font-size: 15px;
+ }
+ .cxz-comment-input-box {
+ padding: 16px 20px;
+ }
+ .cxz-comment-list {
+ padding: 0 20px;
+ }
+ .cxz-comment-textarea {
+ height: 70px;
+ }
+ }
+ @media (max-width: 480px) {
+ .cxz-comment-header {
+ padding: 14px 16px;
+ }
+ .cxz-comment-input-box {
+ padding: 14px 16px;
+ }
+ .cxz-comment-list {
+ padding: 0 16px;
+ }
+ .cxz-comment-item {
+ gap: 10px;
+ }
+ .cxz-comment-avatar,
+ .cxz-comment-avatar-placeholder {
+ width: 34px;
+ height: 34px;
+ font-size: 14px;
+ }
+ }
+
+
diff --git a/public/css/mianfei.css b/public/css/mianfei.css
new file mode 100644
index 0000000..7d00702
--- /dev/null
+++ b/public/css/mianfei.css
@@ -0,0 +1,1808 @@
+/* ============================================================
+ mianfei.css - 免费推荐页 (mianfei.html, mianfeilist.html, mianfeishoucang.html)
+ ============================================================ */
+
+/* === Page Banner === */
+.cxz-page-banner {
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light, #1a3f8f) 100%);
+ color: var(--white, #fff);
+ padding: 40px 0 36px;
+ text-align: center;
+ position: relative;
+ overflow: hidden;
+}
+
+.cxz-page-banner::after {
+ content: "";
+ position: absolute;
+ top: -40%;
+ right: -10%;
+ width: 360px;
+ height: 360px;
+ border-radius: 50%;
+ background: rgba(253, 185, 51, 0.08);
+ pointer-events: none;
+}
+
+.cxz-page-banner::before {
+ content: "";
+ position: absolute;
+ bottom: -30%;
+ left: -5%;
+ width: 280px;
+ height: 280px;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, 0.04);
+ pointer-events: none;
+}
+
+.cxz-banner-title {
+ font-size: 28px;
+ font-weight: 700;
+ margin-bottom: 8px;
+ position: relative;
+ z-index: 1;
+}
+
+.cxz-banner-desc {
+ font-size: 14px;
+ opacity: 0.8;
+ position: relative;
+ z-index: 1;
+}
+
+/* ============================================================
+ Article Detail Card (mianfei.html)
+ ============================================================ */
+.cxz-article-card {
+ background: var(--white, #fff);
+ border-radius: var(--radius-lg, 12px);
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+ overflow: hidden;
+ transition: box-shadow 0.3s ease;
+}
+
+.cxz-article-card:hover {
+ box-shadow: var(--shadow-md, 0 4px 16px rgba(0,0,0,0.08));
+}
+
+.cxz-article-header {
+ padding: 28px 32px 20px;
+ border-bottom: 1px solid var(--border-light, #e5e7eb);
+ position: relative;
+}
+
+.cxz-article-header::after {
+ content: "";
+ position: absolute;
+ bottom: -1px;
+ left: 32px;
+ width: 40px;
+ height: 3px;
+ background: linear-gradient(90deg, var(--primary), var(--gold));
+ border-radius: 2px;
+}
+
+.cxz-article-title {
+ font-size: 24px;
+ font-weight: 700;
+ color: var(--text-dark, #1a1a2e);
+ line-height: 1.5;
+ margin-bottom: 14px;
+}
+
+.cxz-article-meta {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 20px;
+ font-size: 13px;
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-article-meta .author {
+ color: var(--orange, #f15a22);
+ font-weight: 600;
+}
+
+.cxz-article-meta .tag {
+ display: inline-block;
+ padding: 2px 10px;
+ border-radius: 10px;
+ font-size: 11px;
+ font-weight: 600;
+ background: rgba(16, 43, 106, 0.08);
+ color: var(--primary);
+}
+
+.cxz-article-meta .views {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.cxz-article-body {
+ padding: 28px 32px;
+ font-size: 15px;
+ line-height: 1.8;
+ color: var(--text-dark, #1a1a2e);
+ word-wrap: break-word;
+ overflow-wrap: break-word;
+}
+
+.cxz-article-body img {
+ max-width: 100%;
+ height: auto;
+ border-radius: var(--radius-md, 8px);
+ margin: 16px 0;
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+}
+
+.cxz-article-body p {
+ margin-bottom: 14px;
+}
+
+.cxz-article-body p:last-child {
+ margin-bottom: 0;
+}
+
+.cxz-article-body h2,
+.cxz-article-body h3,
+.cxz-article-body h4 {
+ margin-top: 24px;
+ margin-bottom: 12px;
+ font-weight: 700;
+ color: var(--text-dark, #1a1a2e);
+}
+
+.cxz-article-body h2 { font-size: 20px; }
+.cxz-article-body h3 { font-size: 18px; }
+.cxz-article-body h4 { font-size: 16px; }
+
+.cxz-article-body ul,
+.cxz-article-body ol {
+ padding-left: 24px;
+ margin-bottom: 14px;
+}
+
+.cxz-article-body li {
+ margin-bottom: 6px;
+}
+
+.cxz-article-body blockquote {
+ margin: 16px 0;
+ padding: 14px 20px;
+ border-left: 4px solid var(--primary);
+ background: var(--bg-light, #f4f6fb);
+ border-radius: 0 var(--radius-md, 8px) var(--radius-md, 8px) 0;
+ color: var(--text-muted, #6b7280);
+ font-style: italic;
+}
+
+.cxz-article-body table {
+ width: 100%;
+ border-collapse: collapse;
+ margin: 16px 0;
+}
+
+.cxz-article-body th,
+.cxz-article-body td {
+ border: 1px solid var(--border-light, #e5e7eb);
+ padding: 10px 14px;
+ font-size: 14px;
+ text-align: left;
+}
+
+.cxz-article-body th {
+ background: var(--bg-light, #f4f6fb);
+ font-weight: 600;
+ color: var(--text-dark, #1a1a2e);
+}
+
+.cxz-article-body a {
+ color: var(--primary);
+ text-decoration: underline;
+ text-underline-offset: 2px;
+}
+
+.cxz-article-body a:hover {
+ color: var(--orange, #f15a22);
+}
+
+.cxz-article-footer {
+ padding: 16px 32px;
+ border-top: 1px solid var(--border-light, #e5e7eb);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ gap: 12px;
+ background: var(--bg-light, #f4f6fb);
+}
+
+.cxz-article-footer .cxz-article-meta {
+ gap: 16px;
+}
+
+/* Article Actions */
+.cxz-article-actions {
+ padding: 16px 32px;
+ border-top: 1px solid var(--border-light, #e5e7eb);
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ flex-wrap: wrap;
+}
+
+.cxz-action-btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+ padding: 8px 22px;
+ border-radius: 20px;
+ font-size: 13px;
+ font-weight: 500;
+ cursor: pointer;
+ border: 1px solid var(--border-light, #e5e7eb);
+ background: var(--bg-light, #f4f6fb);
+ color: var(--text-dark, #1a1a2e);
+ transition: all 0.3s ease;
+ user-select: none;
+}
+
+.cxz-action-btn:hover {
+ border-color: var(--primary);
+ color: var(--primary);
+ background: rgba(16, 43, 106, 0.04);
+}
+
+.cxz-action-btn:active {
+ transform: scale(0.96);
+}
+
+.cxz-action-btn.liked {
+ background: var(--orange, #f15a22);
+ color: var(--white, #fff);
+ border-color: var(--orange, #f15a22);
+}
+
+.cxz-action-btn.liked:hover {
+ background: var(--red, #e74c3c);
+ border-color: var(--red, #e74c3c);
+ color: var(--white, #fff);
+}
+
+.cxz-action-btn.collected {
+ background: var(--gold, #fdb933);
+ color: var(--primary);
+ border-color: var(--gold, #fdb933);
+}
+
+.cxz-action-btn.collected:hover {
+ background: var(--gold-dark, #f5a623);
+ border-color: var(--gold-dark, #f5a623);
+}
+
+.cxz-action-btn i {
+ font-size: 16px;
+}
+
+.cxz-action-btn .count {
+ font-size: 12px;
+ opacity: 0.8;
+}
+
+/* Article Navigation */
+.cxz-article-nav {
+ margin-top: 24px;
+ display: flex;
+ gap: 16px;
+}
+
+.cxz-nav-item {
+ flex: 1;
+ padding: 18px 24px;
+ background: var(--white, #fff);
+ border-radius: var(--radius-lg, 12px);
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+ text-decoration: none;
+ transition: all 0.3s ease;
+ border: 1px solid var(--border-light, #e5e7eb);
+}
+
+.cxz-nav-item:hover {
+ box-shadow: var(--shadow-md, 0 4px 16px rgba(0,0,0,0.08));
+ border-color: var(--primary);
+ transform: translateY(-1px);
+}
+
+.cxz-nav-label {
+ font-size: 12px;
+ color: var(--text-muted, #6b7280);
+ margin-bottom: 6px;
+ text-transform: uppercase;
+ letter-spacing: 0.5px;
+}
+
+.cxz-nav-title {
+ font-size: 14px;
+ color: var(--text-dark, #1a1a2e);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ transition: color 0.2s;
+}
+
+.cxz-nav-item:hover .cxz-nav-title {
+ color: var(--primary);
+}
+
+/* ============================================================
+ Article List (mianfeilist.html)
+ ============================================================ */
+.cxz-article-list {
+ background: var(--white, #fff);
+ border-radius: var(--radius-lg, 12px);
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+ overflow: hidden;
+}
+
+.cxz-article-item {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 14px 20px;
+ border-bottom: 1px solid var(--border-light, #e5e7eb);
+ transition: background 0.2s ease;
+}
+
+.cxz-article-item:last-child {
+ border-bottom: none;
+}
+
+.cxz-article-item:hover {
+ background: var(--bg-light, #f4f6fb);
+}
+
+.cxz-article-item a {
+ flex: 1;
+ color: var(--text-dark, #1a1a2e);
+ text-decoration: none;
+ font-size: 14px;
+ transition: color 0.2s;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.cxz-article-item a:hover {
+ color: var(--orange, #f15a22);
+}
+
+.cxz-article-date {
+ font-size: 12px;
+ color: var(--text-muted, #6b7280);
+ flex-shrink: 0;
+ margin-left: 16px;
+}
+
+/* List items with structured layout (cxz-list-*) */
+.cxz-list-item {
+ display: flex;
+ align-items: center;
+ padding: 16px 24px;
+ border-bottom: 1px solid var(--border-light, #e5e7eb);
+ transition: all 0.25s ease;
+ gap: 16px;
+}
+
+.cxz-list-item:last-child {
+ border-bottom: none;
+}
+
+.cxz-list-item:hover {
+ background: var(--bg-light, #f4f6fb);
+}
+
+.cxz-list-item + .cxz-list-item {
+ border-top: 1px solid var(--border-light, #e5e7eb);
+}
+
+.cxz-list-title {
+ flex: 1;
+ min-width: 0;
+ font-size: 15px;
+ font-weight: 500;
+ color: var(--text-dark, #1a1a2e);
+ text-decoration: none;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ transition: color 0.2s;
+ cursor: pointer;
+}
+
+.cxz-list-title:hover {
+ color: var(--primary);
+}
+
+.cxz-list-title a {
+ color: inherit;
+ text-decoration: none;
+}
+
+.cxz-list-title a:hover {
+ color: var(--primary);
+}
+
+.cxz-list-meta {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ font-size: 13px;
+ color: var(--text-muted, #6b7280);
+ flex-shrink: 0;
+}
+
+.cxz-list-meta .category {
+ display: inline-block;
+ padding: 2px 10px;
+ border-radius: 10px;
+ font-size: 11px;
+ font-weight: 600;
+ background: rgba(16, 43, 106, 0.08);
+ color: var(--primary);
+}
+
+.cxz-list-meta .author {
+ color: var(--orange, #f15a22);
+ font-weight: 500;
+}
+
+.cxz-list-meta .date {
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-list-action {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ flex-shrink: 0;
+}
+
+.cxz-list-action .cxz-action-btn {
+ padding: 5px 14px;
+ font-size: 12px;
+ border-radius: 14px;
+}
+
+.cxz-list-action .btn-view {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ padding: 5px 16px;
+ border-radius: 14px;
+ font-size: 12px;
+ font-weight: 500;
+ color: var(--primary);
+ background: rgba(16, 43, 106, 0.06);
+ border: 1px solid rgba(16, 43, 106, 0.15);
+ cursor: pointer;
+ transition: all 0.25s;
+ text-decoration: none;
+}
+
+.cxz-list-action .btn-view:hover {
+ background: var(--primary);
+ color: var(--white, #fff);
+ border-color: var(--primary);
+}
+
+.cxz-list-action .btn-collect {
+ display: inline-flex;
+ align-items: center;
+ gap: 4px;
+ padding: 5px 16px;
+ border-radius: 14px;
+ font-size: 12px;
+ font-weight: 500;
+ color: var(--gold, #fdb933);
+ background: rgba(253, 185, 51, 0.08);
+ border: 1px solid rgba(253, 185, 51, 0.25);
+ cursor: pointer;
+ transition: all 0.25s;
+}
+
+.cxz-list-action .btn-collect:hover {
+ background: var(--gold, #fdb933);
+ color: var(--primary);
+ border-color: var(--gold, #fdb933);
+}
+
+.cxz-list-action .btn-collect.collected {
+ background: var(--gold, #fdb933);
+ color: var(--primary);
+ border-color: var(--gold, #fdb933);
+}
+
+/* List item index number */
+.cxz-list-item .list-index {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ font-size: 12px;
+ font-weight: 700;
+ flex-shrink: 0;
+ background: var(--bg-light, #f4f6fb);
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-list-item:nth-child(-n+3) .list-index {
+ background: linear-gradient(135deg, var(--primary), var(--primary-light, #1a3f8f));
+ color: var(--white, #fff);
+ box-shadow: 0 2px 6px rgba(16, 43, 106, 0.3);
+}
+
+/* List item with thumbnail */
+.cxz-list-item.has-thumb {
+ padding: 16px 24px;
+ gap: 20px;
+}
+
+.cxz-list-thumb {
+ width: 80px;
+ height: 56px;
+ border-radius: var(--radius-md, 8px);
+ object-fit: cover;
+ flex-shrink: 0;
+ background: var(--bg-light, #f4f6fb);
+}
+
+.cxz-list-item.has-thumb .cxz-list-content {
+ flex: 1;
+ min-width: 0;
+}
+
+.cxz-list-item.has-thumb .cxz-list-title {
+ display: block;
+ margin-bottom: 6px;
+}
+
+/* ============================================================
+ Collection Grid (mianfeishoucang.html)
+ ============================================================ */
+.cxz-collect-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
+ gap: 20px;
+}
+
+.cxz-collect-card {
+ background: var(--white, #fff);
+ border-radius: var(--radius-lg, 12px);
+ overflow: hidden;
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+ transition: all 0.3s ease;
+ position: relative;
+ border: 1px solid var(--border-light, #e5e7eb);
+}
+
+.cxz-collect-card:hover {
+ transform: translateY(-3px);
+ box-shadow: var(--shadow-md, 0 4px 16px rgba(0,0,0,0.08));
+ border-color: transparent;
+}
+
+.cxz-collect-card.removing {
+ animation: fadeOutCard 0.4s ease forwards;
+}
+
+@keyframes fadeOutCard {
+ 0% { opacity: 1; transform: scale(1); }
+ 100% { opacity: 0; transform: scale(0.9); }
+}
+
+.cxz-collect-card .cxz-card-body {
+ padding: 20px;
+}
+
+.cxz-collect-card .cxz-card-title {
+ font-size: 15px;
+ font-weight: 600;
+ color: var(--primary);
+ line-height: 1.5;
+ margin-bottom: 12px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+
+.cxz-collect-card .cxz-card-title a {
+ color: var(--primary);
+ text-decoration: none;
+ transition: color 0.2s;
+}
+
+.cxz-collect-card .cxz-card-title a:hover {
+ color: var(--orange, #f15a22);
+}
+
+.cxz-collect-card .cxz-card-meta {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ font-size: 12px;
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-collect-card .cxz-card-remove {
+ padding: 4px 14px;
+ border-radius: 14px;
+ font-size: 12px;
+ background: transparent;
+ color: var(--orange, #f15a22);
+ border: 1px solid var(--orange, #f15a22);
+ cursor: pointer;
+ transition: all 0.3s;
+}
+
+.cxz-collect-card .cxz-card-remove:hover {
+ background: var(--orange, #f15a22);
+ color: var(--white, #fff);
+}
+
+/* Collect title & meta (standalone classes matching the spec) */
+.cxz-collect-title {
+ font-size: 15px;
+ font-weight: 600;
+ color: var(--primary);
+ line-height: 1.5;
+ margin-bottom: 10px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 2;
+ -webkit-box-orient: vertical;
+}
+
+.cxz-collect-title a {
+ color: var(--primary);
+ text-decoration: none;
+ transition: color 0.2s;
+}
+
+.cxz-collect-title a:hover {
+ color: var(--orange, #f15a22);
+}
+
+.cxz-collect-meta {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ flex-wrap: wrap;
+ gap: 8px;
+ font-size: 12px;
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-collect-meta .collect-date {
+ display: flex;
+ align-items: center;
+ gap: 4px;
+}
+
+.cxz-collect-meta .btn-remove {
+ padding: 4px 14px;
+ border-radius: 14px;
+ font-size: 12px;
+ background: transparent;
+ color: var(--orange, #f15a22);
+ border: 1px solid var(--orange, #f15a22);
+ cursor: pointer;
+ transition: all 0.3s;
+ line-height: 1.4;
+}
+
+.cxz-collect-meta .btn-remove:hover {
+ background: var(--orange, #f15a22);
+ color: var(--white, #fff);
+}
+
+/* Collect card with image header */
+.cxz-collect-card.has-image .cxz-collect-image {
+ width: 100%;
+ height: 140px;
+ object-fit: cover;
+ display: block;
+}
+
+.cxz-collect-card.has-image .cxz-collect-content {
+ padding: 16px 20px;
+}
+
+/* Collect card color accent bar */
+.cxz-collect-card::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 3px;
+ background: linear-gradient(90deg, var(--primary), var(--gold));
+ opacity: 0;
+ transition: opacity 0.3s;
+}
+
+.cxz-collect-card:hover::before {
+ opacity: 1;
+}
+
+/* ============================================================
+ Filter Bar (shared across list & collection pages)
+ ============================================================ */
+.cxz-filter-bar {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 10px;
+ padding: 16px 20px;
+ background: var(--white, #fff);
+ border-radius: var(--radius-lg, 12px);
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+ margin-bottom: 20px;
+}
+
+.cxz-filter-bar .cxz-filter-label {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--text-dark, #1a1a2e);
+ margin-right: 4px;
+ white-space: nowrap;
+}
+
+.cxz-filter-btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 7px 20px;
+ border-radius: 20px;
+ font-size: 13px;
+ font-weight: 500;
+ color: var(--text-muted, #6b7280);
+ background: var(--bg-light, #f4f6fb);
+ border: 1px solid var(--border-light, #e5e7eb);
+ cursor: pointer;
+ transition: all 0.25s ease;
+ white-space: nowrap;
+ user-select: none;
+ text-decoration: none;
+}
+
+.cxz-filter-btn:hover {
+ color: var(--primary);
+ border-color: var(--primary);
+ background: rgba(16, 43, 106, 0.04);
+}
+
+.cxz-filter-btn.active {
+ color: var(--white, #fff);
+ background: var(--primary);
+ border-color: var(--primary);
+ box-shadow: 0 2px 8px rgba(16, 43, 106, 0.25);
+}
+
+.cxz-filter-btn.active:hover {
+ background: var(--primary-hover, #0d224f);
+ border-color: var(--primary-hover, #0d224f);
+}
+
+/* Filter bar search input */
+.cxz-filter-bar .cxz-filter-search {
+ display: flex;
+ align-items: center;
+ gap: 0;
+ margin-left: auto;
+}
+
+.cxz-filter-bar .cxz-filter-search input {
+ padding: 7px 14px;
+ border: 1px solid var(--border-light, #e5e7eb);
+ border-radius: 20px 0 0 20px;
+ font-size: 13px;
+ outline: none;
+ background: var(--bg-light, #f4f6fb);
+ color: var(--text-dark, #1a1a2e);
+ transition: border-color 0.2s;
+ min-width: 160px;
+}
+
+.cxz-filter-bar .cxz-filter-search input::placeholder {
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-filter-bar .cxz-filter-search input:focus {
+ border-color: var(--primary);
+ background: var(--white, #fff);
+}
+
+.cxz-filter-bar .cxz-filter-search button {
+ padding: 7px 18px;
+ border: 1px solid var(--primary);
+ border-left: none;
+ border-radius: 0 20px 20px 0;
+ font-size: 13px;
+ font-weight: 500;
+ color: var(--white, #fff);
+ background: var(--primary);
+ cursor: pointer;
+ transition: background 0.2s;
+ white-space: nowrap;
+}
+
+.cxz-filter-bar .cxz-filter-search button:hover {
+ background: var(--primary-hover, #0d224f);
+}
+
+/* ============================================================
+ Pagination Enhancement
+ ============================================================ */
+.cxz-pagination {
+ padding: 24px 20px;
+ text-align: center;
+}
+
+.cxz-pagination .layui-laypage {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 4px;
+}
+
+.cxz-pagination .layui-laypage a,
+.cxz-pagination .layui-laypage span {
+ min-width: 36px;
+ height: 36px;
+ line-height: 36px;
+ padding: 0;
+ border-radius: var(--radius-md, 8px);
+ font-size: 13px;
+ border: 1px solid var(--border-light, #e5e7eb);
+ transition: all 0.2s;
+}
+
+.cxz-pagination .layui-laypage a:hover {
+ color: var(--primary);
+ border-color: var(--primary);
+ background: rgba(16, 43, 106, 0.04);
+}
+
+.cxz-pagination .layui-laypage .layui-laypage-curr em {
+ background: var(--primary);
+ border-radius: var(--radius-md, 8px);
+}
+
+.cxz-pagination .layui-laypage .layui-laypage-curr {
+ border-color: var(--primary);
+}
+
+/* ============================================================
+ Locked Content Overlay
+ ============================================================ */
+.cxz-content-lock {
+ position: relative;
+}
+
+.cxz-content-lock::after {
+ content: "";
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ height: 50%;
+ background: linear-gradient(to bottom, transparent, var(--white, #fff) 40%);
+ pointer-events: none;
+ z-index: 1;
+}
+
+.cxz-content-lock .cxz-lock-overlay {
+ position: absolute;
+ inset: 0;
+ background: rgba(255, 255, 255, 0.65);
+ backdrop-filter: blur(4px);
+ -webkit-backdrop-filter: blur(4px);
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ z-index: 2;
+ border-radius: inherit;
+ padding: 40px 20px;
+}
+
+.cxz-lock-icon {
+ width: 64px;
+ height: 64px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, var(--primary), var(--primary-light, #1a3f8f));
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 16px;
+ box-shadow: 0 4px 16px rgba(16, 43, 106, 0.3);
+}
+
+.cxz-lock-icon i {
+ font-size: 28px;
+ color: var(--gold, #fdb933);
+}
+
+.cxz-lock-icon svg {
+ width: 28px;
+ height: 28px;
+ fill: var(--gold, #fdb933);
+}
+
+.cxz-lock-text {
+ font-size: 16px;
+ font-weight: 600;
+ color: var(--text-dark, #1a1a2e);
+ margin-bottom: 8px;
+ text-align: center;
+}
+
+.cxz-lock-text .lock-sub {
+ display: block;
+ font-size: 13px;
+ font-weight: 400;
+ color: var(--text-muted, #6b7280);
+ margin-top: 4px;
+}
+
+.cxz-lock-text + .cxz-lock-btn,
+.cxz-lock-overlay .cxz-lock-btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ gap: 6px;
+ padding: 10px 28px;
+ border-radius: 24px;
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--primary);
+ background: linear-gradient(135deg, var(--gold, #fdb933), var(--gold-dark, #f5a623));
+ border: none;
+ cursor: pointer;
+ transition: all 0.3s;
+ box-shadow: 0 4px 14px rgba(253, 185, 51, 0.35);
+ text-decoration: none;
+ margin-top: 8px;
+}
+
+.cxz-lock-text + .cxz-lock-btn:hover,
+.cxz-lock-overlay .cxz-lock-btn:hover {
+ background: linear-gradient(135deg, #ffc947, var(--gold, #fdb933));
+ box-shadow: 0 6px 20px rgba(253, 185, 51, 0.5);
+ transform: translateY(-1px);
+}
+
+/* Inline lock (within article body) */
+.cxz-inline-lock {
+ position: relative;
+ margin: 20px 0;
+ padding: 24px;
+ background: var(--bg-light, #f4f6fb);
+ border-radius: var(--radius-md, 8px);
+ border: 1px dashed var(--border-light, #e5e7eb);
+ text-align: center;
+}
+
+.cxz-inline-lock .cxz-lock-icon {
+ width: 48px;
+ height: 48px;
+ margin-bottom: 10px;
+}
+
+.cxz-inline-lock .cxz-lock-icon i {
+ font-size: 22px;
+}
+
+.cxz-inline-lock .cxz-lock-text {
+ font-size: 14px;
+ margin-bottom: 10px;
+}
+
+/* ============================================================
+ Empty State
+ ============================================================ */
+.cxz-empty {
+ text-align: center;
+ padding: 60px 20px;
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-empty-icon {
+ font-size: 48px;
+ margin-bottom: 12px;
+ opacity: 0.3;
+}
+
+.cxz-empty-text {
+ font-size: 14px;
+ margin-bottom: 16px;
+}
+
+.cxz-empty-action {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ padding: 8px 24px;
+ border-radius: 20px;
+ font-size: 13px;
+ font-weight: 500;
+ color: var(--primary);
+ background: rgba(16, 43, 106, 0.06);
+ border: 1px solid rgba(16, 43, 106, 0.15);
+ cursor: pointer;
+ transition: all 0.25s;
+ text-decoration: none;
+}
+
+.cxz-empty-action:hover {
+ background: var(--primary);
+ color: var(--white, #fff);
+ border-color: var(--primary);
+}
+
+/* ============================================================
+ Stats Bar (optional top summary)
+ ============================================================ */
+.cxz-stats-bar {
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ padding: 16px 24px;
+ background: var(--white, #fff);
+ border-radius: var(--radius-lg, 12px);
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+ margin-bottom: 20px;
+ flex-wrap: wrap;
+}
+
+.cxz-stat-item {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.cxz-stat-item .stat-icon {
+ width: 40px;
+ height: 40px;
+ border-radius: var(--radius-md, 8px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+}
+
+.cxz-stat-item .stat-icon.blue {
+ background: rgba(16, 43, 106, 0.1);
+ color: var(--primary);
+}
+
+.cxz-stat-item .stat-icon.gold {
+ background: rgba(253, 185, 51, 0.12);
+ color: var(--gold-dark, #f5a623);
+}
+
+.cxz-stat-item .stat-icon.orange {
+ background: rgba(241, 90, 34, 0.1);
+ color: var(--orange, #f15a22);
+}
+
+.cxz-stat-item .stat-icon.green {
+ background: rgba(39, 174, 96, 0.1);
+ color: var(--green, #27ae60);
+}
+
+.cxz-stat-item .stat-info .stat-value {
+ font-size: 20px;
+ font-weight: 700;
+ color: var(--text-dark, #1a1a2e);
+ line-height: 1.2;
+}
+
+.cxz-stat-item .stat-info .stat-label {
+ font-size: 12px;
+ color: var(--text-muted, #6b7280);
+}
+
+/* ============================================================
+ Responsive Styles
+ ============================================================ */
+
+/* Tablet & below */
+@media (max-width: 1024px) {
+ .cxz-article-header {
+ padding: 24px 24px 16px;
+ }
+
+ .cxz-article-body {
+ padding: 24px 24px;
+ }
+
+ .cxz-article-footer {
+ padding: 14px 24px;
+ }
+
+ .cxz-article-actions {
+ padding: 14px 24px;
+ }
+
+ .cxz-article-title {
+ font-size: 22px;
+ }
+
+ .cxz-collect-grid {
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
+ gap: 16px;
+ }
+
+ .cxz-filter-bar {
+ padding: 12px 16px;
+ }
+
+ .cxz-list-item {
+ padding: 14px 16px;
+ }
+}
+
+/* Mobile */
+@media (max-width: 768px) {
+ /* Page Banner */
+ .cxz-page-banner {
+ padding: 28px 16px 24px;
+ }
+
+ .cxz-banner-title {
+ font-size: 22px;
+ }
+
+ .cxz-banner-desc {
+ font-size: 13px;
+ }
+
+ /* Article Card */
+ .cxz-article-card {
+ border-radius: var(--radius-md, 8px);
+ }
+
+ .cxz-article-header {
+ padding: 20px 16px 14px;
+ }
+
+ .cxz-article-header::after {
+ left: 16px;
+ }
+
+ .cxz-article-title {
+ font-size: 19px;
+ margin-bottom: 10px;
+ }
+
+ .cxz-article-meta {
+ gap: 10px;
+ font-size: 12px;
+ }
+
+ .cxz-article-body {
+ padding: 20px 16px;
+ font-size: 14px;
+ line-height: 1.7;
+ }
+
+ .cxz-article-footer {
+ padding: 12px 16px;
+ flex-direction: column;
+ align-items: flex-start;
+ }
+
+ .cxz-article-actions {
+ padding: 12px 16px;
+ gap: 8px;
+ }
+
+ .cxz-action-btn {
+ padding: 7px 16px;
+ font-size: 12px;
+ }
+
+ /* Article Navigation */
+ .cxz-article-nav {
+ flex-direction: column;
+ gap: 10px;
+ }
+
+ .cxz-nav-item {
+ padding: 14px 16px;
+ }
+
+ /* Article List */
+ .cxz-article-list {
+ border-radius: var(--radius-md, 8px);
+ }
+
+ .cxz-article-item {
+ padding: 12px 16px;
+ }
+
+ .cxz-article-item a {
+ font-size: 13px;
+ }
+
+ /* List items */
+ .cxz-list-item {
+ flex-wrap: wrap;
+ padding: 12px 16px;
+ gap: 8px;
+ }
+
+ .cxz-list-title {
+ font-size: 14px;
+ width: 100%;
+ flex: none;
+ }
+
+ .cxz-list-meta {
+ gap: 10px;
+ font-size: 12px;
+ order: 2;
+ }
+
+ .cxz-list-action {
+ order: 3;
+ width: 100%;
+ justify-content: flex-end;
+ padding-top: 4px;
+ }
+
+ .cxz-list-item .list-index {
+ width: 24px;
+ height: 24px;
+ font-size: 11px;
+ }
+
+ /* Collection Grid */
+ .cxz-collect-grid {
+ grid-template-columns: 1fr;
+ gap: 12px;
+ }
+
+ .cxz-collect-card {
+ border-radius: var(--radius-md, 8px);
+ }
+
+ .cxz-collect-card .cxz-card-body {
+ padding: 16px;
+ }
+
+ .cxz-collect-card:hover {
+ transform: none;
+ }
+
+ /* Filter Bar */
+ .cxz-filter-bar {
+ padding: 10px 12px;
+ gap: 8px;
+ border-radius: var(--radius-md, 8px);
+ }
+
+ .cxz-filter-btn {
+ padding: 6px 14px;
+ font-size: 12px;
+ }
+
+ .cxz-filter-bar .cxz-filter-label {
+ font-size: 13px;
+ width: 100%;
+ margin-bottom: 2px;
+ }
+
+ .cxz-filter-bar .cxz-filter-search {
+ margin-left: 0;
+ width: 100%;
+ }
+
+ .cxz-filter-bar .cxz-filter-search input {
+ flex: 1;
+ min-width: 0;
+ }
+
+ /* Pagination */
+ .cxz-pagination {
+ padding: 16px 12px;
+ }
+
+ /* Locked Content */
+ .cxz-lock-icon {
+ width: 52px;
+ height: 52px;
+ }
+
+ .cxz-lock-icon i {
+ font-size: 24px;
+ }
+
+ .cxz-lock-text {
+ font-size: 14px;
+ }
+
+ .cxz-lock-overlay .cxz-lock-btn {
+ padding: 8px 22px;
+ font-size: 13px;
+ }
+
+ /* Empty State */
+ .cxz-empty {
+ padding: 40px 16px;
+ }
+
+ .cxz-empty-icon {
+ font-size: 40px;
+ }
+
+ /* Stats Bar */
+ .cxz-stats-bar {
+ padding: 12px 16px;
+ gap: 16px;
+ }
+
+ .cxz-stat-item .stat-info .stat-value {
+ font-size: 18px;
+ }
+}
+
+/* Small mobile */
+@media (max-width: 480px) {
+ .cxz-article-title {
+ font-size: 17px;
+ }
+
+ .cxz-article-meta {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 4px;
+ }
+
+ .cxz-article-actions {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .cxz-action-btn {
+ justify-content: center;
+ }
+
+ .cxz-filter-bar {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .cxz-filter-btn {
+ text-align: center;
+ }
+
+ .cxz-list-meta {
+ flex-wrap: wrap;
+ gap: 6px;
+ }
+
+ .cxz-stats-bar {
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 12px;
+ }
+}
+
+/* ============================================================
+ Animations
+ ============================================================ */
+@keyframes fadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(12px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.cxz-article-card {
+ animation: fadeInUp 0.4s ease;
+}
+
+.cxz-article-list {
+ animation: fadeInUp 0.4s ease;
+}
+
+.cxz-collect-card {
+ animation: fadeInUp 0.4s ease;
+}
+
+.cxz-collect-card:nth-child(2) { animation-delay: 0.05s; }
+.cxz-collect-card:nth-child(3) { animation-delay: 0.1s; }
+.cxz-collect-card:nth-child(4) { animation-delay: 0.15s; }
+.cxz-collect-card:nth-child(5) { animation-delay: 0.2s; }
+.cxz-collect-card:nth-child(6) { animation-delay: 0.25s; }
+
+/* Filter bar slide in */
+@keyframes slideDown {
+ from {
+ opacity: 0;
+ transform: translateY(-8px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.cxz-filter-bar {
+ animation: slideDown 0.35s ease;
+}
+
+/* Pulse animation for lock icon */
+@keyframes lockPulse {
+ 0%, 100% { box-shadow: 0 4px 16px rgba(16, 43, 106, 0.3); }
+ 50% { box-shadow: 0 4px 24px rgba(16, 43, 106, 0.5); }
+}
+
+.cxz-lock-icon {
+ animation: lockPulse 2.5s ease-in-out infinite;
+}
+
+/* ============================================================
+ Print Styles
+ ============================================================ */
+@media print {
+ .cxz-article-actions,
+ .cxz-article-nav,
+ .cxz-filter-bar,
+ .cxz-pagination,
+ .cxz-content-lock .cxz-lock-overlay,
+ .cxz-collect-meta .btn-remove,
+ .cxz-collect-meta .cxz-card-remove,
+ .cxz-list-action {
+ display: none !important;
+ }
+
+ .cxz-article-card,
+ .cxz-collect-card {
+ box-shadow: none;
+ border: 1px solid #ccc;
+ }
+
+ .cxz-content-lock::after {
+ display: none;
+ }
+}
+
+
+/* Article detail interactions */
+.cxz-article-actions {
+ justify-content: center;
+ gap: 14px;
+ padding: 20px 32px;
+}
+
+.cxz-action-btn {
+ min-width: 118px;
+ height: 44px;
+ padding: 0 22px;
+ border-radius: 999px;
+ border: 1px solid #dbe2ee;
+ background: #f7f9fc;
+ color: #102b6a;
+ font-size: 14px;
+ font-weight: 700;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7);
+}
+
+.cxz-action-btn:hover {
+ border-color: #102b6a;
+ background: #fff;
+ color: #102b6a;
+ box-shadow: 0 8px 20px rgba(16, 43, 106, 0.12);
+}
+
+.cxz-action-btn.liked {
+ border-color: rgba(241, 90, 34, 0.24);
+ background: #fff3ec;
+ color: #f15a22;
+}
+
+.cxz-action-btn.collected {
+ border-color: rgba(253, 185, 51, 0.38);
+ background: #fff8e8;
+ color: #102b6a;
+}
+
+.cxz-action-btn:disabled {
+ cursor: not-allowed;
+ opacity: 0.72;
+ box-shadow: none;
+}
+
+.cxz-article-nav {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+}
+
+.cxz-nav-item {
+ position: relative;
+ overflow: hidden;
+}
+
+.cxz-nav-item::before {
+ content: "";
+ position: absolute;
+ inset: 0 auto 0 0;
+ width: 4px;
+ background: #fdb933;
+ opacity: 0;
+ transition: opacity 0.2s ease;
+}
+
+.cxz-nav-item:hover::before {
+ opacity: 1;
+}
+
+.cxz-nav-item.is-disabled {
+ cursor: default;
+ opacity: 0.54;
+ pointer-events: none;
+}
+
+.cxz-nav-item.is-disabled:hover {
+ border-color: var(--border-light, #e5e7eb);
+ box-shadow: var(--shadow-sm, 0 2px 8px rgba(0,0,0,0.06));
+ transform: none;
+}
+
+.cxz-comment-section {
+ margin-top: 24px;
+ border-radius: 16px;
+ background: #fff;
+ box-shadow: 0 12px 34px rgba(16, 43, 106, 0.08);
+ overflow: hidden;
+}
+
+.cxz-comment-header {
+ padding: 18px 24px;
+ border-bottom: 1px solid #e7edf6;
+ color: #102b6a;
+ font-weight: 800;
+}
+
+.cxz-comment-input-box {
+ padding: 20px 24px;
+ border-bottom: 1px solid #eef2f7;
+ background: #f8fafd;
+}
+
+.cxz-comment-textarea {
+ min-height: 104px;
+ border-radius: 12px;
+ border-color: #dbe2ee;
+ background: #fff;
+}
+
+.cxz-comment-textarea:focus {
+ border-color: #102b6a;
+ box-shadow: 0 0 0 3px rgba(16, 43, 106, 0.1);
+}
+
+.cxz-comment-submit-btn {
+ min-width: 112px;
+ border-radius: 999px;
+ background: linear-gradient(135deg, #102b6a, #1e5790);
+ box-shadow: 0 8px 18px rgba(16, 43, 106, 0.18);
+}
+
+.cxz-comment-submit-btn:hover {
+ background: linear-gradient(135deg, #0d245c, #194d83);
+}
+
+.cxz-comment-list {
+ padding: 4px 24px 8px;
+}
+
+.cxz-comment-item {
+ padding: 18px 0;
+}
+
+.cxz-comment-avatar,
+.cxz-comment-avatar-placeholder {
+ width: 40px;
+ height: 40px;
+}
+
+
+.cxz-article-body {
+ overflow: hidden;
+}
+
+.cxz-content-inner {
+ max-width: 100%;
+ color: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+.cxz-content-inner img,
+.cxz-content-inner video,
+.cxz-content-inner iframe {
+ max-width: 100%;
+}
+
+.cxz-content-empty {
+ margin: 0;
+ padding: 32px 0;
+ text-align: center;
+ color: var(--text-muted, #8a96aa);
+}
+
+
+/* mianfei comment layout fix */
+.cxz-comment-section {
+ border: 1px solid #e7edf6;
+}
+
+.cxz-comment-header {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ background: linear-gradient(180deg, #fbfcff, #fff);
+ font-size: 16px;
+}
+
+.cxz-comment-header i {
+ color: #102b6a;
+ font-size: 18px;
+}
+
+.cxz-comment-input-box {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 12px;
+}
+
+.cxz-comment-textarea {
+ display: block;
+ width: 100%;
+ min-height: 108px;
+ padding: 12px 14px;
+ border: 1px solid #d7dfec;
+ border-radius: 10px;
+ color: #1f2f4d;
+ font-size: 14px;
+ line-height: 1.7;
+ outline: none;
+ resize: vertical;
+ box-sizing: border-box;
+}
+
+.cxz-comment-textarea::placeholder {
+ color: #8a96aa;
+}
+
+.cxz-comment-submit-btn {
+ height: 36px;
+ padding: 0 24px;
+ border: 0;
+ color: #fff;
+ font-size: 14px;
+ font-weight: 700;
+ cursor: pointer;
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
+}
+
+.cxz-comment-submit-btn:disabled {
+ cursor: not-allowed;
+ opacity: 0.68;
+ transform: none;
+ box-shadow: none;
+}
+
+
+/* mianfei comment list polish */
+.cxz-comment-textarea {
+ resize: none;
+}
+
+.cxz-comment-list {
+ padding: 18px 24px 8px;
+}
+
+.cxz-comment-empty {
+ display: flex;
+ min-height: 92px;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ color: #8a96aa;
+ font-size: 14px;
+ text-align: center;
+}
+
+.cxz-comment-empty i {
+ color: #102b6a;
+ font-size: 18px;
+ opacity: 0.7;
+}
+
+.cxz-comment-item {
+ display: grid;
+ grid-template-columns: 44px minmax(0, 1fr);
+ gap: 14px;
+ padding: 18px 0;
+ border-bottom: 1px solid #eef2f7;
+}
+
+.cxz-comment-item:last-child {
+ border-bottom: 0;
+}
+
+.cxz-comment-avatar,
+.cxz-comment-avatar-placeholder {
+ width: 44px;
+ height: 44px;
+ border-radius: 50%;
+ object-fit: cover;
+}
+
+.cxz-comment-avatar-placeholder {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: linear-gradient(135deg, #102b6a, #1e5790);
+ color: #fff;
+ font-weight: 800;
+}
+
+.cxz-comment-body {
+ min-width: 0;
+}
+
+.cxz-comment-name {
+ margin-bottom: 6px;
+ color: #102b6a;
+ font-size: 14px;
+ font-weight: 800;
+}
+
+.cxz-comment-text {
+ color: #1f2f4d;
+ font-size: 14px;
+ line-height: 1.7;
+ word-break: break-word;
+ white-space: pre-wrap;
+}
+
+.cxz-comment-time {
+ margin-top: 8px;
+ color: #8a96aa;
+ font-size: 12px;
+}
+
+.cxz-pagination {
+ padding: 12px 24px 18px;
+ border-top: 1px solid #eef2f7;
+}
diff --git a/public/css/mianfeishoucang.css b/public/css/mianfeishoucang.css
new file mode 100644
index 0000000..26b93d6
--- /dev/null
+++ b/public/css/mianfeishoucang.css
@@ -0,0 +1,435 @@
+/* mianfeishoucang.html page styles */
+/* === Stats Summary Bar === */
+ .sc-stats {
+ display: flex;
+ gap: 16px;
+ margin-bottom: 24px;
+ }
+ .sc-stat-card {
+ flex: 1;
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ padding: 20px 24px;
+ box-shadow: var(--shadow-sm);
+ display: flex;
+ align-items: center;
+ gap: 16px;
+ border: 1px solid var(--border-light);
+ transition: all 0.3s;
+ cursor: pointer;
+ }
+ .sc-stat-card:hover {
+ border-color: transparent;
+ box-shadow: var(--shadow-md);
+ transform: translateY(-2px);
+ }
+ .sc-stat-card.active {
+ border-color: var(--primary);
+ box-shadow: 0 4px 20px rgba(16, 43, 106, 0.15);
+ }
+ .sc-stat-card.active .sc-stat-icon {
+ background: linear-gradient(
+ 135deg,
+ var(--primary),
+ var(--primary-light)
+ );
+ color: var(--white);
+ }
+ .sc-stat-icon {
+ width: 48px;
+ height: 48px;
+ border-radius: 14px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 22px;
+ background: var(--bg-light);
+ color: var(--text-muted);
+ transition: all 0.3s;
+ flex-shrink: 0;
+ }
+ .sc-stat-icon.gold {
+ color: var(--gold-dark);
+ background: rgba(253, 185, 51, 0.12);
+ }
+ .sc-stat-icon.orange {
+ color: var(--orange);
+ background: rgba(241, 90, 34, 0.1);
+ }
+ .sc-stat-icon.blue {
+ color: var(--primary);
+ background: rgba(16, 43, 106, 0.08);
+ }
+ .sc-stat-card.active .sc-stat-icon.gold,
+ .sc-stat-card.active .sc-stat-icon.orange,
+ .sc-stat-card.active .sc-stat-icon.blue {
+ background: linear-gradient(
+ 135deg,
+ var(--primary),
+ var(--primary-light)
+ );
+ color: var(--white);
+ }
+ .sc-stat-info {
+ flex: 1;
+ }
+ .sc-stat-value {
+ font-size: 26px;
+ font-weight: 800;
+ color: var(--text-dark);
+ line-height: 1.2;
+ }
+ .sc-stat-label {
+ font-size: 13px;
+ color: var(--text-muted);
+ margin-top: 2px;
+ }
+
+ /* === Tab Content Panels === */
+ .sc-panel {
+ display: none;
+ }
+ .sc-panel.active {
+ display: block;
+ animation: fadeInUp 0.35s ease;
+ }
+
+ /* === Paid Article Table Enhancements === */
+.sc-paid-table {
+ margin-bottom: 20px;
+ }
+
+.sc-loading {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 220px;
+ margin: 20px 0;
+ border: 1px dashed var(--border-light);
+ border-radius: var(--radius-md);
+ background: rgba(255, 255, 255, 0.72);
+ color: var(--text-muted);
+ font-size: 14px;
+}
+ .sc-paid-row {
+ display: flex;
+ align-items: center;
+ padding: 16px 24px;
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-sm);
+ margin-bottom: 12px;
+ gap: 16px;
+ transition: all 0.3s;
+ border: 1px solid var(--border-light);
+ }
+ .sc-paid-row:hover {
+ border-color: transparent;
+ box-shadow: var(--shadow-md);
+ transform: translateX(4px);
+ }
+ .sc-paid-row.removing {
+ animation: fadeOutRow 0.4s ease forwards;
+ }
+ @keyframes fadeOutRow {
+ 0% {
+ opacity: 1;
+ transform: translateX(0);
+ }
+ 100% {
+ opacity: 0;
+ transform: translateX(40px);
+ }
+ }
+ .sc-expert-cell {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ flex-shrink: 0;
+ text-decoration: none;
+ }
+ .sc-expert-avatar {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ object-fit: cover;
+ border: 2px solid rgba(253, 185, 51, 0.4);
+ }
+ .sc-expert-avatar-fallback {
+ width: 40px;
+ height: 40px;
+ border-radius: 50%;
+ background: linear-gradient(
+ 135deg,
+ var(--primary),
+ var(--primary-light)
+ );
+ color: var(--white);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 16px;
+ font-weight: 700;
+ }
+ .sc-expert-name {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--text-dark);
+ white-space: nowrap;
+ }
+ .sc-paid-period {
+ font-size: 13px;
+ color: var(--text-muted);
+ flex-shrink: 0;
+ white-space: nowrap;
+ }
+ .sc-paid-title {
+ flex: 1;
+ font-size: 14px;
+ color: var(--text-dark);
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ min-width: 0;
+ }
+ .sc-paid-rate {
+ font-size: 14px;
+ font-weight: 700;
+ color: var(--green);
+ flex-shrink: 0;
+ }
+ .sc-paid-price {
+ font-size: 14px;
+ font-weight: 700;
+ color: var(--orange);
+ flex-shrink: 0;
+ white-space: nowrap;
+ }
+ .sc-paid-view {
+ padding: 6px 18px;
+ border-radius: 20px;
+ font-size: 12px;
+ font-weight: 600;
+ color: var(--primary);
+ background: rgba(16, 43, 106, 0.06);
+ border: 1px solid rgba(16, 43, 106, 0.15);
+ cursor: pointer;
+ transition: all 0.25s;
+ text-decoration: none;
+ white-space: nowrap;
+ flex-shrink: 0;
+ }
+ .sc-paid-view:hover {
+ background: var(--primary);
+ color: var(--white);
+ border-color: var(--primary);
+ }
+ .sc-paid-remove {
+ padding: 6px 14px;
+ border-radius: 20px;
+ font-size: 12px;
+ color: var(--orange);
+ background: transparent;
+ border: 1px solid var(--orange);
+ cursor: pointer;
+ transition: all 0.25s;
+ white-space: nowrap;
+ flex-shrink: 0;
+ }
+ .sc-paid-remove:hover {
+ background: var(--orange);
+ color: var(--white);
+ }
+
+ /* === Expert Collection Cards === */
+ .sc-expert-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
+ gap: 20px;
+ }
+ .sc-expert-card {
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-sm);
+ padding: 24px;
+ text-align: center;
+ border: 1px solid var(--border-light);
+ transition: all 0.3s;
+ position: relative;
+ overflow: hidden;
+ }
+ .sc-expert-card::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 4px;
+ background: linear-gradient(90deg, var(--primary), var(--gold));
+ opacity: 0;
+ transition: opacity 0.3s;
+ }
+ .sc-expert-card:hover::before {
+ opacity: 1;
+ }
+ .sc-expert-card:hover {
+ border-color: transparent;
+ box-shadow: var(--shadow-md);
+ transform: translateY(-3px);
+ }
+ .sc-expert-card.removing {
+ animation: fadeOutCard 0.4s ease forwards;
+ }
+ .sc-expert-card-avatar {
+ width: 64px;
+ height: 64px;
+ border-radius: 50%;
+ object-fit: cover;
+ border: 3px solid rgba(253, 185, 51, 0.5);
+ margin: 0 auto 12px;
+ display: block;
+ }
+ .sc-expert-card-avatar-fallback {
+ width: 64px;
+ height: 64px;
+ border-radius: 50%;
+ background: linear-gradient(
+ 135deg,
+ var(--primary),
+ var(--primary-light)
+ );
+ color: var(--white);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 24px;
+ font-weight: 700;
+ margin: 0 auto 12px;
+ }
+ .sc-expert-card-name {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--text-dark);
+ margin-bottom: 12px;
+ }
+ .sc-expert-card-stats {
+ display: flex;
+ justify-content: center;
+ gap: 24px;
+ margin-bottom: 16px;
+ }
+ .sc-expert-card-stat .val {
+ font-size: 18px;
+ font-weight: 800;
+ color: var(--primary);
+ }
+ .sc-expert-card-stat .lbl {
+ font-size: 11px;
+ color: var(--text-muted);
+ margin-top: 2px;
+ }
+ .sc-expert-card-actions {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+ }
+ .sc-expert-card-actions .sc-paid-view {
+ flex: 1;
+ text-align: center;
+ }
+ .sc-expert-card-actions .sc-paid-remove {
+ flex: 1;
+ text-align: center;
+ }
+
+ /* === Responsive === */
+ @media (max-width: 768px) {
+ .sc-stats {
+ flex-direction: column;
+ gap: 10px;
+ }
+ .sc-stat-card {
+ padding: 16px 18px;
+ }
+ .sc-stat-value {
+ font-size: 22px;
+ }
+ .sc-paid-row {
+ flex-wrap: wrap;
+ padding: 14px 16px;
+ gap: 10px;
+ }
+ .sc-paid-title {
+ width: 100%;
+ flex: none;
+ order: 10;
+ }
+ .sc-expert-grid {
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
+ gap: 12px;
+ }
+ .sc-expert-card {
+ padding: 18px;
+ }
+ }
+ @media (max-width: 480px) {
+ .sc-expert-grid {
+ grid-template-columns: 1fr;
+ }
+ .sc-paid-row {
+ flex-direction: column;
+ align-items: flex-start;
+ }
+ }
+
+.cxz-empty[hidden],
+.cxz-pagination[hidden] {
+ display: none !important;
+}
+
+.sc-paid-title a {
+ color: var(--text-dark);
+ text-decoration: none;
+}
+
+.sc-paid-title a:hover {
+ color: var(--primary);
+}
+
+.sc-paid-time {
+ font-size: 13px;
+ color: var(--text-muted);
+ white-space: nowrap;
+ flex-shrink: 0;
+}
+
+.sc-expert-card-type {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 24px;
+ padding: 0 10px;
+ margin-bottom: 14px;
+ border-radius: 999px;
+ background: rgba(253, 185, 51, 0.14);
+ color: var(--gold-dark);
+ font-size: 12px;
+ font-weight: 700;
+}
+
+.cxz-collect-card .cxz-card-meta {
+ gap: 12px;
+}
+
+.sc-hidden {
+ display: none;
+}
+
+.sc-empty-icon-symbol {
+ font-size: 48px;
+}
+
+.site-footer__record {
+ font-size: 12px;
+ color: rgba(255, 255, 255, 0.5);
+}
diff --git a/public/css/pagination.css b/public/css/pagination.css
new file mode 100644
index 0000000..51f2c2e
--- /dev/null
+++ b/public/css/pagination.css
@@ -0,0 +1,568 @@
+/* Unified pagination style for Layui and custom pagers. */
+.cxz-pagination,
+.uc-pagination,
+.je-pagination,
+.txl-pagination,
+#articlePage {
+ display: flex !important;
+ justify-content: center !important;
+ align-items: center !important;
+ flex-wrap: wrap !important;
+ gap: 6px !important;
+ padding: 18px 12px !important;
+ min-height: 64px;
+ text-align: center;
+}
+
+.cxz-pagination:empty,
+.uc-pagination:empty,
+.je-pagination:empty,
+.txl-pagination:empty,
+#articlePage:empty {
+ display: none !important;
+}
+
+.layui-laypage {
+ display: inline-flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ flex-wrap: wrap !important;
+ gap: 6px !important;
+ margin: 0 !important;
+ font-size: 0 !important;
+}
+
+.layui-laypage a,
+.layui-laypage span,
+.txl-pagination .page-btn {
+ display: inline-flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ min-width: 34px !important;
+ width: 34px !important;
+ height: 34px !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ border: 1px solid #dfe5ef !important;
+ border-radius: 7px !important;
+ background: #fff !important;
+ color: #344054 !important;
+ font-size: 13px !important;
+ font-weight: 600 !important;
+ line-height: 34px !important;
+ box-shadow: none;
+ transition:
+ color 0.18s ease,
+ border-color 0.18s ease,
+ background 0.18s ease,
+ box-shadow 0.18s ease,
+ transform 0.18s ease;
+}
+
+.layui-laypage a:hover,
+.txl-pagination .page-btn:hover {
+ border-color: var(--primary, #102b6a) !important;
+ color: var(--primary, #102b6a) !important;
+ background: #f7f9ff !important;
+ box-shadow: 0 4px 10px rgba(16, 43, 106, 0.1);
+}
+
+.layui-laypage .layui-laypage-prev,
+.layui-laypage .layui-laypage-next {
+ min-width: 74px !important;
+ width: auto !important;
+ padding: 0 14px !important;
+}
+
+.layui-laypage .layui-laypage-count,
+.layui-laypage .layui-laypage-limits {
+ width: auto !important;
+ min-width: 0 !important;
+ padding: 0 10px !important;
+ white-space: nowrap !important;
+}
+
+.layui-laypage .layui-laypage-limits select {
+ width: auto !important;
+ min-width: 78px !important;
+ padding: 0 26px 0 10px !important;
+}
+
+.layui-laypage .layui-laypage-curr {
+ position: relative !important;
+ display: inline-flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ min-width: 34px !important;
+ width: 34px !important;
+ height: 34px !important;
+ padding: 0 !important;
+ border: 0 !important;
+ background: transparent !important;
+ box-shadow: none !important;
+ line-height: 34px !important;
+}
+
+.layui-laypage .layui-laypage-curr .layui-laypage-em {
+ position: absolute !important;
+ inset: 0 !important;
+ border-radius: 7px !important;
+ background: var(--primary, #102b6a) !important;
+ box-shadow: 0 6px 14px rgba(16, 43, 106, 0.22);
+}
+
+.layui-laypage .layui-laypage-curr em:last-child {
+ position: relative !important;
+ display: inline-flex !important;
+ align-items: center !important;
+ justify-content: center !important;
+ width: 34px !important;
+ height: 34px !important;
+ padding: 0 !important;
+ margin: 0 !important;
+ color: #fff !important;
+ font-style: normal !important;
+ font-weight: 700 !important;
+ line-height: 34px !important;
+ text-align: center !important;
+}
+
+.layui-laypage .layui-laypage-spr {
+ min-width: 28px !important;
+ padding: 0 2px !important;
+ border-color: transparent !important;
+ background: transparent !important;
+ color: #98a2b3 !important;
+ box-shadow: none !important;
+}
+
+.layui-laypage .layui-disabled,
+.layui-laypage .layui-disabled:hover,
+.txl-pagination .page-btn.disabled,
+.txl-pagination .page-btn.disabled:hover {
+ border-color: #edf0f5 !important;
+ background: #f7f8fb !important;
+ color: #b8c0cc !important;
+ box-shadow: none !important;
+ cursor: not-allowed !important;
+ transform: none !important;
+}
+
+.layui-laypage input,
+.layui-laypage button,
+.layui-laypage select {
+ height: 34px !important;
+ border-radius: 7px !important;
+ border-color: #dfe5ef !important;
+ font-size: 13px !important;
+}
+
+.layui-laypage button {
+ padding: 0 14px !important;
+ background: var(--primary, #102b6a) !important;
+ color: #fff !important;
+ border-color: var(--primary, #102b6a) !important;
+ font-weight: 700 !important;
+}
+
+.txl-pagination .page-btn.active {
+ border-color: var(--primary, #102b6a) !important;
+ background: var(--primary, #102b6a) !important;
+ color: #fff !important;
+ box-shadow: 0 6px 14px rgba(16, 43, 106, 0.22);
+}
+
+.cxz-status-hit {
+ color: #27ae60;
+ font-weight: 700;
+}
+
+.cxz-status-miss {
+ color: #e74c3c;
+ font-weight: 700;
+}
+
+.cxz-status-opened {
+ color: var(--primary, #102b6a);
+ font-weight: 700;
+}
+
+.cxz-status-pending {
+ color: var(--orange, #f15a22);
+ font-weight: 700;
+}
+
+.cxz-recommend-locked {
+ color: var(--text-muted, #6b7280);
+ font-weight: 600;
+}
+
+.cxz-data-table th:nth-child(1),
+.cxz-data-table th:nth-child(2),
+.cxz-data-table th:nth-child(4),
+.cxz-data-table th:nth-child(7),
+.cxz-data-table th:nth-child(9),
+.cxz-data-table td:nth-child(1),
+.cxz-data-table td:nth-child(2),
+.cxz-data-table td:nth-child(4),
+.cxz-data-table td:nth-child(7),
+.cxz-data-table td:nth-child(9) {
+ white-space: nowrap;
+}
+
+.cxz-data-table td:nth-child(1),
+.cxz-data-table td:nth-child(2) {
+ word-break: keep-all;
+}
+
+.cxz-data-table td:nth-child(9) {
+ min-width: 72px;
+}
+
+.cxz-data-table th:nth-child(4),
+.cxz-data-table td:nth-child(4) {
+ min-width: 190px;
+}
+
+.cxz-number-wrap {
+ display: inline-flex;
+ align-items: flex-start;
+ flex-wrap: wrap;
+ gap: 5px;
+ max-width: 360px;
+ padding: 2px 0;
+ overflow: visible;
+ scrollbar-width: thin;
+ scrollbar-color: rgba(16, 43, 106, 0.22) transparent;
+ vertical-align: top;
+}
+
+button.cxz-number-wrap {
+ min-height: 25px;
+ padding: 0;
+ border: 0;
+ background: transparent;
+ font: inherit;
+ text-align: left;
+}
+
+.cxz-number-wrap--overflow {
+ cursor: pointer;
+}
+
+.cxz-number-wrap--fit {
+ cursor: default;
+}
+
+.cxz-number-wrap--overflow:hover .cxz-number-ball {
+ border-color: rgba(16, 43, 106, 0.32);
+ background: #fff8f4;
+}
+
+.cxz-number-wrap--recommend {
+ align-items: center;
+ flex-wrap: nowrap;
+ gap: 8px;
+ max-width: 280px;
+ max-height: none;
+ overflow: visible;
+ white-space: nowrap;
+}
+
+.cxz-number-preview {
+ display: inline-flex;
+ align-items: center;
+ flex: 1 1 auto;
+ flex-wrap: nowrap;
+ min-width: 0;
+ overflow: visible;
+ gap: 5px;
+}
+
+.cxz-number-preview--short {
+ display: none;
+}
+
+.cxz-number-wrap--fit {
+ max-width: 280px;
+}
+
+.cxz-number-wrap--fit .cxz-number-preview {
+ overflow: visible;
+}
+
+.cxz-number-wrap--fit .cxz-number-more {
+ display: none;
+}
+
+.cxz-number-wrap--overflow .cxz-number-preview {
+ max-width: none;
+}
+
+.cxz-number-wrap--overflow .cxz-number-preview--full {
+ display: none;
+}
+
+.cxz-number-wrap--overflow .cxz-number-preview--short {
+ display: inline-flex;
+}
+
+.cxz-number-wrap--recommend .cxz-number-group {
+ flex: 0 0 auto;
+ flex-wrap: nowrap;
+}
+
+.cxz-number-wrap--recommend .cxz-number-group + .cxz-number-group::before,
+.cxz-number-wrap--popup .cxz-number-group + .cxz-number-group::before {
+ content: "";
+ width: 1px;
+ height: 16px;
+ margin: 0 2px;
+ border-radius: 1px;
+ background: #ffd5c6;
+}
+
+.cxz-number-wrap--open {
+ max-width: none;
+ max-height: none;
+ overflow: visible;
+}
+
+.cxz-number-wrap--open-1 {
+ flex-wrap: nowrap;
+ white-space: nowrap;
+}
+
+.cxz-number-wrap--open-1 .cxz-number-group {
+ flex-wrap: nowrap;
+}
+
+.cxz-number-wrap--open-2 {
+ width: 256px;
+ max-width: 256px;
+}
+
+.cxz-number-wrap::-webkit-scrollbar {
+ width: 4px;
+}
+
+.cxz-number-wrap::-webkit-scrollbar-thumb {
+ border-radius: 999px;
+ background: rgba(16, 43, 106, 0.22);
+}
+
+.cxz-number-group {
+ display: inline-flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 5px;
+}
+
+.cxz-data-table td .cxz-number-ball {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 25px;
+ height: 25px;
+ margin: 0 !important;
+ border-radius: 50%;
+ border: 1px solid rgba(241, 90, 34, 0.22);
+ background: #fff4ef;
+ box-shadow: none;
+ color: var(--orange, #f15a22);
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.cxz-data-table td .cxz-number-text {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 42px;
+ height: 25px;
+ padding: 0 10px;
+ border: 1px solid rgba(241, 90, 34, 0.22);
+ border-radius: 999px;
+ background: #fff4ef;
+ color: var(--orange, #f15a22);
+ font-size: 13px;
+ font-weight: 700;
+ line-height: 23px;
+ white-space: nowrap;
+}
+
+.cxz-data-table td .cxz-number-wrap--open .cxz-number-ball {
+ width: 22px;
+ height: 22px;
+ font-size: 11px;
+}
+
+.cxz-number-wrap--open .cxz-number-group {
+ gap: 4px;
+}
+
+.cxz-data-table td .bule-q.cxz-number-ball {
+ border-color: rgba(16, 43, 106, 0.22);
+ background: #eef4ff;
+ color: var(--primary, #102b6a);
+}
+
+.cxz-data-table td .cxz-number-ball--wrong {
+ position: relative;
+ border-color: rgba(231, 76, 60, 0.52);
+ background: #fff;
+ color: #e74c3c;
+}
+
+.cxz-data-table td .cxz-number-ball--wrong::after {
+ content: "";
+ position: absolute;
+ left: 5px;
+ right: 5px;
+ top: 50%;
+ height: 2px;
+ border-radius: 2px;
+ background: currentColor;
+ transform: rotate(-24deg);
+}
+
+.cxz-number-count {
+ display: inline-flex;
+ align-items: center;
+ height: 25px;
+ padding: 0 7px;
+ border-radius: 999px;
+ background: #f3f6fb;
+ color: #667085;
+ font-size: 12px;
+ font-weight: 600;
+ line-height: 25px;
+ white-space: nowrap;
+}
+
+.cxz-number-empty {
+ color: var(--text-muted, #6b7280);
+}
+
+.cxz-number-more {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ flex: 0 0 auto;
+ height: 25px;
+ margin-left: 0;
+ padding: 0 10px;
+ border: 1px solid #dfe5ef;
+ border-radius: 999px;
+ background: #fff;
+ color: var(--primary, #102b6a);
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 23px;
+ cursor: pointer;
+ vertical-align: middle;
+}
+
+.cxz-number-more:hover {
+ border-color: var(--primary, #102b6a);
+ background: #f7f9ff;
+}
+
+.cxz-number-popup {
+ padding: 20px 22px 22px;
+ background: #fff;
+}
+
+.cxz-number-popup-title {
+ margin-bottom: 14px;
+ color: var(--primary, #102b6a);
+ font-size: 16px;
+ font-weight: 800;
+}
+
+.cxz-number-wrap--popup {
+ max-width: none;
+}
+
+@media (max-width: 768px) {
+ .cxz-pagination,
+ .uc-pagination,
+ .je-pagination,
+ .txl-pagination,
+ #articlePage {
+ gap: 5px !important;
+ padding: 14px 8px !important;
+ min-height: 58px;
+ }
+
+ .layui-laypage {
+ gap: 6px !important;
+ }
+
+ .layui-laypage a,
+ .layui-laypage span,
+ .txl-pagination .page-btn {
+ min-width: 30px !important;
+ width: 30px !important;
+ height: 30px !important;
+ padding: 0 !important;
+ font-size: 12px !important;
+ line-height: 30px !important;
+ }
+
+ .layui-laypage .layui-laypage-prev,
+ .layui-laypage .layui-laypage-next {
+ min-width: 66px !important;
+ width: auto !important;
+ padding: 0 10px !important;
+ }
+
+ .layui-laypage .layui-laypage-curr,
+ .layui-laypage .layui-laypage-curr em:last-child {
+ min-width: 30px !important;
+ width: 30px !important;
+ height: 30px !important;
+ line-height: 30px !important;
+ }
+
+ .cxz-number-wrap {
+ max-width: 300px;
+ gap: 4px;
+ }
+
+ .cxz-number-wrap--recommend {
+ max-width: 238px;
+ }
+
+ .cxz-number-wrap--overflow .cxz-number-preview {
+ max-width: none;
+ }
+
+ .cxz-number-wrap--open {
+ max-width: none;
+ }
+
+ .cxz-number-wrap--open-2 {
+ width: 246px;
+ max-width: 246px;
+ }
+
+ .cxz-number-group {
+ gap: 4px;
+ }
+
+ .cxz-data-table td .cxz-number-ball {
+ width: 23px;
+ height: 23px;
+ font-size: 11px;
+ }
+
+ .cxz-data-table td .cxz-number-text {
+ height: 23px;
+ min-width: 38px;
+ padding: 0 8px;
+ font-size: 12px;
+ line-height: 21px;
+ }
+}
diff --git a/public/css/public.css b/public/css/public.css
new file mode 100644
index 0000000..5ea6749
--- /dev/null
+++ b/public/css/public.css
@@ -0,0 +1,984 @@
+/* ============================================================
+ public.css - Shared styles across all pages
+ ============================================================ */
+
+:root {
+ --primary: #102b6a;
+ --primary-light: #1a3f8f;
+ --primary-hover: #0d224f;
+ --navy: #102b6a;
+ --navy-deep: #08183c;
+ --gold: #fdb933;
+ --gold-dark: #f5a623;
+ --orange: #f15a22;
+ --red: #e74c3c;
+ --red-dark: #c0392b;
+ --purple: #7b2d8e;
+ --green: #27ae60;
+ --white: #ffffff;
+ --bg: #eef3fb;
+ --bg-light: #f4f6fb;
+ --bg-body: #f5f6fa;
+ --text: #1f2a44;
+ --text-soft: #60708c;
+ --text-dark: #1a1a2e;
+ --text-default: #333333;
+ --text-muted: #6b7280;
+ --text-light: #999999;
+ --border: rgba(16, 43, 106, 0.1);
+ --border-light: #e5e7eb;
+ --border-lighter: #f0f0f0;
+ --shadow: 0 20px 48px rgba(16, 43, 106, 0.08);
+ --shadow-soft: 0 12px 26px rgba(16, 43, 106, 0.08);
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.06);
+ --shadow-md: 0 4px 16px rgba(0, 0, 0, 0.08);
+ --radius-sm: 4px;
+ --radius-md: 18px;
+ --radius-lg: 28px;
+ --max-width: 1480px;
+ --font-main: "Microsoft YaHei", "PingFang SC", "Noto Sans SC", sans-serif;
+}
+
+/* ----------------------------------------------------------
+ 1. Reset & Base
+ ---------------------------------------------------------- */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+html {
+ scroll-behavior: smooth;
+}
+
+body {
+ font-family: var(--font-main);
+ background:
+ radial-gradient(circle at top left, rgba(253, 185, 51, 0.08), transparent 24%),
+ radial-gradient(circle at top right, rgba(16, 43, 106, 0.09), transparent 20%),
+ linear-gradient(180deg, #f9fbff 0%, #edf2fb 42%, #eef3fb 100%);
+ color: var(--text);
+ line-height: 1.6;
+ min-height: 100vh;
+ -webkit-font-smoothing: antialiased;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+ transition: color 0.2s;
+}
+
+ul {
+ list-style: none;
+}
+
+img {
+ max-width: 100%;
+ display: block;
+}
+
+button,
+input,
+select {
+ font: inherit;
+}
+
+.container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 20px;
+}
+
+/* ----------------------------------------------------------
+ 2. Topbar (unified header)
+ ---------------------------------------------------------- */
+.topbar {
+ position: sticky;
+ top: 0;
+ z-index: 1000;
+ background: linear-gradient(90deg, rgba(8, 24, 60, .98), rgba(16, 43, 106, .98) 45%, rgba(15, 70, 126, .98));
+ box-shadow: 0 14px 40px rgba(8, 24, 60, .28);
+}
+
+.topbar::after {
+ content: "";
+ position: absolute;
+ inset: auto 0 0;
+ height: 2px;
+ background: linear-gradient(90deg, transparent, rgba(253, 185, 51, .95), transparent);
+}
+
+.topbar__inner {
+ width: min(var(--max-width), calc(100% - 48px));
+ margin: 0 auto;
+ min-height: 82px;
+ display: flex;
+ align-items: center;
+ gap: 28px;
+}
+
+.topbar__logo {
+ width: 200px;
+ height: auto;
+}
+
+.topbar__nav {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ overflow: hidden;
+}
+
+.topbar__nav-link {
+ position: relative;
+ padding: 12px 18px;
+ border-radius: 999px;
+ color: rgba(255, 255, 255, .82);
+ font-size: 15px;
+ transition: .24s ease;
+}
+
+.topbar__nav-link:hover,
+.topbar__nav-link.is-active {
+ color: var(--white);
+ background: rgba(255, 255, 255, .08);
+}
+
+.topbar__nav-link.is-active::after {
+ content: "";
+ position: absolute;
+ left: 50%;
+ bottom: 4px;
+ width: 24px;
+ height: 3px;
+ transform: translateX(-50%);
+ border-radius: 999px;
+ background: linear-gradient(90deg, #ffd16a, var(--gold));
+}
+
+.topbar__user,
+.topbar__guest,
+.topbar__logged {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.topbar__profile {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ border-radius: 999px;
+ padding: 4px 8px;
+ transition: .24s ease;
+}
+
+.topbar__profile:hover {
+ background: rgba(255, 255, 255, .08);
+}
+
+.topbar__btn {
+ border: none;
+ border-radius: 999px;
+ padding: 10px 18px;
+ cursor: pointer;
+ transition: .24s ease;
+}
+
+.topbar__btn--ghost {
+ color: var(--white);
+ background: transparent;
+ border: 1px solid rgba(255, 255, 255, .22);
+}
+
+.topbar__btn--primary {
+ color: var(--navy-deep);
+ font-weight: 700;
+ background: linear-gradient(135deg, #ffd26b, var(--gold));
+ box-shadow: 0 10px 22px rgba(253, 185, 51, .24);
+}
+
+.topbar__btn--logout {
+ color: rgba(255, 255, 255, .82);
+ background: rgba(255, 255, 255, .06);
+ border: 1px solid rgba(255, 255, 255, .14);
+}
+
+.topbar__avatar {
+ width: 42px;
+ height: 42px;
+ border-radius: 50%;
+ border: 2px solid rgba(253, 185, 51, .7);
+ object-fit: cover;
+}
+
+.topbar__meta {
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.topbar__uname {
+ display: flex;
+ justify-content: center;
+ color: var(--white);
+ font-weight: 700;
+ font-size: 14px;
+}
+
+.topbar__ubadge {
+ display: inline-flex;
+ width: fit-content;
+ padding: 3px 10px;
+ border-radius: 999px;
+ background: linear-gradient(135deg, #ffd26b, var(--gold));
+ color: var(--navy-deep);
+ font-size: 12px;
+ font-weight: 700;
+}
+
+/* ----------------------------------------------------------
+ 3. Site Footer (unified footer)
+ ---------------------------------------------------------- */
+.site-footer {
+ width: min(var(--max-width), calc(100% - 48px));
+ margin: 0 auto;
+ margin-top: 28px;
+}
+
+.site-footer__inner {
+ padding: 24px 28px;
+ border-radius: 28px;
+ border: 1px solid rgba(16, 43, 106, .08);
+ background: linear-gradient(135deg, rgba(8, 24, 60, .98), rgba(16, 43, 106, .96) 55%, rgba(17, 74, 126, .96));
+}
+
+.site-footer__logo {
+ width: 220px;
+}
+
+.site-footer__inner p {
+ margin: 16px 0 0;
+ color: rgba(255, 255, 255, .8);
+ line-height: 1.8;
+}
+
+.site-footer__meta {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 18px;
+ margin-top: 18px;
+ color: rgba(255, 255, 255, .56);
+ font-size: 12px;
+}
+
+.site-footer__meta a {
+ color: rgba(255, 255, 255, .56);
+}
+
+.site-footer__meta a:hover {
+ color: rgba(255, 255, 255, .86);
+}
+
+/* ----------------------------------------------------------
+ 4. Ball Styles (unified ball system)
+ ---------------------------------------------------------- */
+.ball {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 34px;
+ height: 34px;
+ padding: 0 10px;
+ border-radius: 999px;
+ color: var(--white);
+ font-size: 14px;
+ font-weight: 800;
+}
+
+.ball--compact {
+ width: 28px;
+ height: 28px;
+ font-size: 12px;
+ padding: 0 8px;
+}
+
+.ball--red {
+ background: linear-gradient(180deg, #ff6d76, #f24858);
+}
+
+.ball--blue {
+ background: linear-gradient(180deg, #5b96ff, #306ee2);
+}
+
+.ball--orange {
+ background: linear-gradient(180deg, #ffb35f, #ff8c1a);
+}
+
+.ball--green {
+ background: linear-gradient(180deg, #45d59e, #1ea871);
+}
+
+.ball--purple {
+ background: linear-gradient(180deg, #a07cff, #7c57ef);
+}
+
+.ball--gold {
+ background: linear-gradient(180deg, #ffd35a, #f1a61a);
+}
+
+.ball--teal {
+ background: linear-gradient(180deg, #40d4ce, #119f9a);
+}
+
+.ball--violet {
+ background: linear-gradient(180deg, #c68cff, #8f57ea);
+}
+
+.ball--empty {
+ background: #dbe4f2;
+ color: #7d8ba4;
+}
+
+/* Legacy ball styles (compat) */
+.red-q {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f15a22, #e74c3c);
+ color: #fff;
+ font-size: 13px;
+ font-weight: 700;
+ margin: 1px 2px;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 2px 6px rgba(241, 90, 34, 0.35);
+}
+
+.bule-q {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 28px;
+ height: 28px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #102b6a, #3b6fd4);
+ color: #fff;
+ font-size: 13px;
+ font-weight: 700;
+ margin: 1px 2px;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
+ box-shadow: 0 2px 6px rgba(16, 43, 106, 0.35);
+}
+
+.table-text {
+ font-size: 14px;
+ color: #333;
+}
+
+.table-img {
+ width: 30px;
+ height: 30px;
+ border-radius: 50%;
+ object-fit: cover;
+}
+
+/* ----------------------------------------------------------
+ 5. Main Container
+ ---------------------------------------------------------- */
+.cxz-main {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 20px;
+}
+
+/* ----------------------------------------------------------
+ 6. Breadcrumb
+ ---------------------------------------------------------- */
+.cxz-breadcrumb {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 8px;
+ min-height: 48px;
+ padding: 14px 0 16px;
+ color: #6b7280;
+ font-size: 14px;
+ line-height: 20px;
+}
+
+.cxz-breadcrumb a {
+ color: #5f6f86;
+ transition: color 0.2s;
+}
+
+.cxz-breadcrumb a:hover {
+ color: var(--primary);
+}
+
+.cxz-breadcrumb .sep {
+ margin: 0 1px;
+ color: #b8c1cf;
+}
+
+.cxz-breadcrumb span:not(.sep) {
+ color: #34425a;
+}
+
+/* ----------------------------------------------------------
+ 7. Lottery Tabs
+ ---------------------------------------------------------- */
+.cxz-lottery-tabs {
+ display: flex;
+ gap: 8px;
+ padding: 16px 0;
+ flex-wrap: wrap;
+}
+
+.cxz-lottery-tab {
+ padding: 8px 22px;
+ border-radius: 6px;
+ font-size: 14px;
+ font-weight: 500;
+ color: #6b7280;
+ background: #fff;
+ border: 1px solid #e5e7eb;
+ cursor: pointer;
+ transition: all 0.25s;
+ white-space: nowrap;
+}
+
+.cxz-lottery-tab:hover {
+ color: #102b6a;
+ border-color: #102b6a;
+ background: #f4f6fb;
+}
+
+.cxz-lottery-tab.active {
+ color: #fff;
+ background: #102b6a;
+ border-color: #102b6a;
+ box-shadow: 0 2px 8px rgba(16, 43, 106, 0.25);
+}
+
+/* ----------------------------------------------------------
+ 8. Section Header
+ ---------------------------------------------------------- */
+.cxz-section-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 0;
+ border-bottom: 2px solid #f0f0f0;
+ margin-bottom: 16px;
+}
+
+.cxz-section-title {
+ font-size: 18px;
+ font-weight: 700;
+ color: #1a1a2e;
+ position: relative;
+ padding-left: 14px;
+}
+
+.cxz-section-title::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 50%;
+ transform: translateY(-50%);
+ width: 4px;
+ height: 20px;
+ background: linear-gradient(180deg, #102b6a, #fdb933);
+ border-radius: 2px;
+}
+
+.cxz-section-more {
+ font-size: 14px;
+ color: #6b7280;
+ cursor: pointer;
+ transition: color 0.2s;
+}
+
+.cxz-section-more:hover {
+ color: #102b6a;
+}
+
+/* ----------------------------------------------------------
+ 9. Data Tables
+ ---------------------------------------------------------- */
+.cxz-table-box {
+ background: #fff;
+ border-radius: 10px;
+ box-shadow: 0 2px 12px rgba(0, 0, 0, 0.06);
+ overflow: hidden;
+ margin-bottom: 20px;
+}
+
+.cxz-table-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 20px;
+ border-bottom: 1px solid #e5e7eb;
+}
+
+.cxz-table-title {
+ font-size: 16px;
+ font-weight: 700;
+ color: #1a1a2e;
+}
+
+.cxz-data-table {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.cxz-data-table thead {
+ background: #f4f6fb;
+}
+
+.cxz-data-table th {
+ padding: 12px 16px;
+ font-size: 13px;
+ font-weight: 600;
+ color: #6b7280;
+ text-align: left;
+ white-space: nowrap;
+ border-bottom: 1px solid #e5e7eb;
+}
+
+.cxz-data-table td {
+ padding: 12px 16px;
+ font-size: 14px;
+ color: #333;
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.cxz-data-table tbody tr {
+ transition: background 0.2s;
+}
+
+.cxz-data-table tbody tr:hover {
+ background: #f9fafb;
+}
+
+/* ----------------------------------------------------------
+ 10. Pagination
+ ---------------------------------------------------------- */
+.cxz-pagination {
+ padding: 20px;
+ text-align: center;
+}
+
+/* ----------------------------------------------------------
+ 11. CommonUtil Compat (ads & links)
+ ---------------------------------------------------------- */
+.PublicAdvertising {
+ background: #fff;
+ padding: 20px 0;
+}
+
+.PublicAdvertisingUl {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 20px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ justify-content: center;
+}
+
+.PublicAdvertisingLi {
+ display: inline-block;
+}
+
+.PublicAdvertisingLi a {
+ display: inline-block;
+ padding: 4px 12px;
+ font-size: 13px;
+ color: #6b7280;
+ border-radius: 4px;
+ transition: all 0.2s;
+ background: #f4f6fb;
+}
+
+.PublicAdvertisingLi a:hover {
+ color: #102b6a;
+ background: #eef1f8;
+}
+
+.PublicAdvertisingImg {
+ display: block;
+ max-width: 100%;
+ border-radius: 6px;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+}
+
+.PublicAdvertisingImg:hover {
+ transform: scale(1.02);
+ box-shadow: 0 4px 16px rgba(16, 43, 106, 0.1);
+}
+
+.FooterPublicFriendship {
+ background: #fff;
+ padding: 16px 0;
+ border-top: 1px solid #e5e7eb;
+}
+
+.FooterPublicFriendship .other-box {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 0 20px;
+}
+
+.FooterPublicFriendship .link-box {
+ margin-bottom: 12px;
+}
+
+.FooterPublicFriendship .other-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: #1a1a2e;
+ margin-bottom: 8px;
+ padding-left: 10px;
+ border-left: 3px solid #102b6a;
+}
+
+.FooterPublicFriendship .link-listUl {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.FooterPublicFriendship .link-listLi {
+ display: inline-block;
+}
+
+.FooterPublicFriendship .link-listLi a {
+ display: inline-block;
+ padding: 4px 12px;
+ font-size: 13px;
+ color: #6b7280;
+ border-radius: 4px;
+ transition: all 0.2s;
+ background: #f4f6fb;
+}
+
+.FooterPublicFriendship .link-listLi a:hover {
+ color: #102b6a;
+ background: #eef1f8;
+}
+
+.FooterPublicAdvertising {
+ background: #f4f6fb;
+ padding: 20px 0;
+}
+
+/* ----------------------------------------------------------
+ 12. Gotop Button
+ ---------------------------------------------------------- */
+.gotop {
+ position: fixed;
+ right: 28px;
+ bottom: 28px;
+ width: 52px;
+ height: 52px;
+ border: none;
+ border-radius: 50%;
+ color: var(--navy-deep);
+ background: linear-gradient(135deg, #ffd26b, var(--gold));
+ box-shadow: 0 16px 28px rgba(253, 185, 51, .3);
+ cursor: pointer;
+ opacity: 0;
+ visibility: hidden;
+ transition: .24s ease;
+ z-index: 900;
+}
+
+.gotop.is-visible {
+ opacity: 1;
+ visibility: visible;
+}
+
+/* ----------------------------------------------------------
+ 13. Modal (history query)
+ ---------------------------------------------------------- */
+.modal-mask {
+ position: fixed;
+ inset: 0;
+ display: none;
+ align-items: center;
+ justify-content: center;
+ padding: 30px;
+ background: rgba(4, 15, 36, .58);
+ backdrop-filter: blur(8px);
+ z-index: 1100;
+}
+
+.modal-mask.is-open {
+ display: flex;
+}
+
+.modal-box {
+ width: min(1080px, 100%);
+ max-height: 82vh;
+ overflow: hidden;
+ border-radius: 28px;
+ background: #fdfefe;
+ box-shadow: 0 30px 80px rgba(4, 15, 36, .35);
+}
+
+.modal-box__head {
+ padding: 22px 24px;
+ color: var(--white);
+ background: linear-gradient(90deg, #08183c, #102b6a, #164d86);
+}
+
+.modal-box__head strong {
+ display: block;
+ font-size: 24px;
+}
+
+.modal-box__head p {
+ margin: 6px 0 0;
+ color: rgba(255, 255, 255, .72);
+ font-size: 13px;
+}
+
+.modal-box__head button {
+ width: 42px;
+ height: 42px;
+ border: none;
+ border-radius: 50%;
+ background: rgba(255, 255, 255, .08);
+ color: var(--white);
+ font-size: 28px;
+ cursor: pointer;
+}
+
+.modal-box__filter {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ padding: 18px 24px;
+ background: #f3f7fe;
+}
+
+.modal-box__filter span {
+ color: var(--text-soft);
+}
+
+.modal-box__filter select,
+.modal-input {
+ height: 44px;
+ padding: 0 14px;
+ border-radius: 14px;
+ border: 1px solid rgba(16, 43, 106, .12);
+ background: var(--white);
+}
+
+.modal-box__body {
+ max-height: calc(82vh - 146px);
+ overflow: auto;
+}
+
+.modal-table {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.modal-table th {
+ position: sticky;
+ top: 0;
+ z-index: 2;
+ padding: 14px 16px;
+ background: #eef4fe;
+ color: var(--navy);
+ font-size: 13px;
+ text-align: left;
+}
+
+.modal-table td {
+ padding: 14px 16px;
+ border-top: 1px solid rgba(16, 43, 106, .08);
+ color: var(--text);
+ font-size: 14px;
+}
+
+.modal-table .history-code {
+ color: var(--navy);
+ font-weight: 700;
+ font-family: Consolas, "SFMono-Regular", monospace;
+}
+
+.modal-table .is-empty {
+ text-align: center;
+ color: var(--text-soft);
+ padding: 28px 16px;
+}
+
+/* ----------------------------------------------------------
+ 14. Scrollbar
+ ---------------------------------------------------------- */
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+}
+
+::-webkit-scrollbar-track {
+ background: #f1f1f1;
+ border-radius: 4px;
+}
+
+::-webkit-scrollbar-thumb {
+ background: rgba(16, 43, 106, .2);
+ border-radius: 999px;
+ transition: background 0.2s;
+}
+
+::-webkit-scrollbar-thumb:hover {
+ background: #999;
+}
+
+/* Firefox */
+* {
+ scrollbar-width: thin;
+ scrollbar-color: rgba(16, 43, 106, .2) #f1f1f1;
+}
+
+/* ----------------------------------------------------------
+ 15. Responsive
+ ---------------------------------------------------------- */
+@media (max-width: 1024px) {
+ .topbar__inner {
+ min-height: 68px;
+ gap: 16px;
+ }
+
+ .topbar__nav-link {
+ padding: 10px 14px;
+ font-size: 14px;
+ }
+
+ .cxz-main {
+ padding: 16px;
+ }
+
+ .container {
+ padding: 0 16px;
+ }
+
+ .PublicAdvertisingUl {
+ padding: 0 16px;
+ }
+}
+
+@media (max-width: 768px) {
+ .topbar__inner {
+ flex-wrap: wrap;
+ min-height: auto;
+ padding: 10px 12px;
+ gap: 8px;
+ }
+
+ .topbar__nav {
+ order: 3;
+ width: 100%;
+ overflow-x: auto;
+ justify-content: flex-start;
+ gap: 4px;
+ padding-bottom: 4px;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .topbar__nav-link {
+ padding: 6px 14px;
+ font-size: 13px;
+ }
+
+ .topbar__btn {
+ padding: 8px 14px;
+ font-size: 13px;
+ }
+
+ .cxz-main {
+ padding: 12px;
+ }
+
+ .cxz-section-title {
+ font-size: 16px;
+ }
+
+ .cxz-lottery-tabs {
+ gap: 6px;
+ padding: 12px 0;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ flex-wrap: nowrap;
+ }
+
+ .cxz-lottery-tab {
+ padding: 6px 16px;
+ font-size: 13px;
+ }
+
+ .cxz-data-table th,
+ .cxz-data-table td {
+ padding: 10px 8px;
+ font-size: 13px;
+ }
+
+ .red-q,
+ .bule-q {
+ width: 24px;
+ height: 24px;
+ font-size: 12px;
+ }
+
+ .ball {
+ min-width: 28px;
+ height: 28px;
+ font-size: 12px;
+ padding: 0 8px;
+ }
+
+ .ball--compact {
+ min-width: 24px;
+ height: 24px;
+ font-size: 11px;
+ padding: 0 6px;
+ }
+
+ .PublicAdvertisingUl {
+ padding: 0 12px;
+ gap: 6px;
+ }
+
+ .PublicAdvertisingLi a {
+ padding: 3px 8px;
+ font-size: 12px;
+ }
+
+ .container {
+ padding: 0 12px;
+ }
+
+ .cxz-breadcrumb {
+ font-size: 13px;
+ }
+
+ .cxz-pagination {
+ padding: 16px 12px;
+ }
+
+ .site-footer__inner {
+ padding: 18px 16px;
+ border-radius: 18px;
+ }
+}
diff --git a/public/css/publish.css b/public/css/publish.css
new file mode 100644
index 0000000..bdf7d6e
--- /dev/null
+++ b/public/css/publish.css
@@ -0,0 +1,464 @@
+.page-main,
+.page-wrap {
+ width: min(var(--max-width), calc(100% - 48px));
+ margin: 0 auto;
+}
+
+.publish-card,
+.cxz-form-card {
+ width: 100%;
+ margin: 26px auto 54px;
+ overflow: hidden;
+ border: 1px solid var(--border-light);
+ border-radius: 18px;
+ background: #fff;
+ box-shadow: var(--shadow-md);
+}
+
+.publish-card-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 18px;
+ padding: 28px 34px;
+ border-bottom: 1px solid var(--border-light);
+ background: linear-gradient(120deg, #ffffff 0%, #f6f8fd 70%, #fff9e8 100%);
+}
+
+.publish-card-header-h2,
+.cxz-form-title {
+ position: relative;
+ margin: 0;
+ padding-left: 16px;
+ color: var(--primary);
+ font-size: 22px;
+ font-weight: 900;
+ line-height: 1.4;
+ letter-spacing: 0;
+}
+
+.publish-card-header-h2::before,
+.cxz-form-title::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 5px;
+ width: 4px;
+ height: 24px;
+ border-radius: 4px;
+ background: linear-gradient(180deg, var(--gold), var(--orange));
+}
+
+.publish-card-header p {
+ margin: 8px 0 0;
+ color: var(--text-muted);
+ font-size: 14px;
+}
+
+.publish-card-body,
+.cxz-form-body {
+ padding: 28px 34px 34px;
+}
+
+.publish-tab-bar {
+ display: flex;
+ align-items: stretch;
+ overflow: hidden;
+ margin: 0 0 24px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-sm);
+ background: var(--bg-light);
+}
+
+.publish-tab-item {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex: 1;
+ min-height: 48px;
+ border-right: 1px solid var(--border-light);
+ background: transparent;
+ color: #34425a;
+ font-size: 15px;
+ font-weight: 800;
+ text-align: center;
+ cursor: pointer;
+ transition: color 0.2s ease, background 0.2s ease;
+}
+
+.publish-tab-item:last-child {
+ border-right: 0;
+}
+
+.publish-tab-item.active {
+ background: var(--primary);
+ color: #fff;
+}
+
+.publish-tab-item.layui-disabled,
+.publish-tab-item:disabled {
+ color: #a8b2c2;
+ cursor: not-allowed;
+}
+
+.publish-tip-box {
+ margin-bottom: 24px;
+ padding: 16px 18px;
+ border: 1px solid #ffe2b1;
+ border-radius: var(--radius-sm);
+ background: #fff9ef;
+}
+
+.publish-tip-item {
+ margin: 0 0 8px;
+ color: #674719;
+ font-size: 14px;
+ line-height: 1.75;
+}
+
+.publish-tip-item:last-child {
+ margin-bottom: 0;
+}
+
+.form-row,
+.cxz-form-group {
+ margin-bottom: 22px;
+}
+
+.form-row label,
+.cxz-form-label {
+ display: block;
+ margin-bottom: 10px;
+ color: var(--primary);
+ font-size: 15px;
+ font-weight: 900;
+}
+
+.required {
+ color: var(--orange);
+}
+
+.form-select,
+.cxz-form-select,
+.form-input,
+.cxz-form-input,
+.cxz-form-textarea {
+ width: 100%;
+ min-height: 46px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-sm);
+ background: var(--bg-light);
+ color: var(--text-dark);
+ font-size: 15px;
+ outline: none;
+ transition: border-color 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
+}
+
+.form-select,
+.cxz-form-select,
+.form-input,
+.cxz-form-input {
+ padding: 0 14px;
+}
+
+.cxz-form-textarea {
+ min-height: 160px;
+ padding: 14px;
+ resize: vertical;
+ line-height: 1.7;
+}
+
+.form-select:focus,
+.cxz-form-select:focus,
+.form-input:focus,
+.cxz-form-input:focus,
+.cxz-form-textarea:focus {
+ border-color: var(--primary);
+ background: #fff;
+ box-shadow: 0 0 0 3px rgba(16, 43, 106, 0.1);
+}
+
+.form-select--full {
+ width: 100%;
+}
+
+.form-input-with-count {
+ position: relative;
+}
+
+.form-input-with-count .form-input {
+ padding-right: 82px;
+}
+
+.form-input-count {
+ position: absolute;
+ right: 14px;
+ top: 50%;
+ color: var(--text-muted);
+ font-size: 13px;
+ transform: translateY(-50%);
+}
+
+.submit-row {
+ margin-top: 28px;
+}
+
+.submit-btn,
+.cxz-submit-btn {
+ width: 100%;
+ height: 52px;
+ border: 0;
+ border-radius: var(--radius-sm);
+ background: var(--primary);
+ color: #fff;
+ font-size: 17px;
+ font-weight: 900;
+ cursor: pointer;
+ box-shadow: 0 10px 22px rgba(16, 43, 106, 0.18);
+ transition: background 0.2s ease, transform 0.2s ease;
+}
+
+.submit-btn:hover,
+.cxz-submit-btn:hover {
+ background: var(--primary-light);
+}
+
+.submit-btn:active,
+.cxz-submit-btn:active {
+ transform: translateY(1px);
+}
+
+.submit-btn:disabled,
+.cxz-submit-btn:disabled {
+ background: #a9b4c7;
+ cursor: not-allowed;
+ box-shadow: none;
+}
+
+.cxz-select-row {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 16px;
+}
+
+.cxz-pool-section {
+ margin: 22px 0;
+ padding: 20px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-md);
+ background: #fafcff;
+}
+
+.cxz-pool-title {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 16px;
+ color: var(--primary);
+ font-size: 16px;
+ font-weight: 900;
+}
+
+.cxz-pool-grid,
+.Redball,
+.Blueball,
+.mianfeiThreeTextSelectBox #jieguo {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+}
+
+.cxz-pool-item,
+.cxz-pool-ball,
+.ball,
+.TypeOption,
+#resetBtn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 42px;
+ height: 36px;
+ padding: 0 12px;
+ border: 1px solid var(--border-light);
+ border-radius: 18px;
+ background: #fff;
+ color: var(--text-dark);
+ font-size: 14px;
+ font-weight: 800;
+ cursor: pointer;
+ user-select: none;
+ transition: border-color 0.2s ease, color 0.2s ease, background 0.2s ease;
+}
+
+.cxz-pool-item:hover,
+.cxz-pool-ball:hover,
+.ball:hover,
+.TypeOption:hover,
+#resetBtn:hover {
+ border-color: var(--primary);
+ color: var(--primary);
+}
+
+.cxz-pool-item.selected,
+.cxz-pool-ball.selected,
+.ball.selected,
+.TypeOption.selected,
+.red.selected,
+.BlueSelected {
+ border-color: var(--orange);
+ background: var(--orange);
+ color: #fff;
+}
+
+.blue.selected,
+.Blueball .selected {
+ border-color: #1d67d6;
+ background: #1d67d6;
+ color: #fff;
+}
+
+.cxz-empty {
+ display: flex;
+ min-height: 260px;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 12px;
+ margin: 20px 0;
+ border: 1px dashed var(--border-light);
+ border-radius: var(--radius-md);
+ background: #fbfcff;
+ color: var(--text-muted);
+ text-align: center;
+}
+
+.cxz-empty-icon {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 54px;
+ height: 54px;
+ border-radius: 16px;
+ background: #edf2fb;
+ color: var(--primary);
+ font-size: 24px;
+ font-weight: 900;
+}
+
+.cxz-empty-text {
+ margin: 0;
+ color: var(--text-muted);
+ font-size: 14px;
+}
+
+.cxz-empty-action {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 110px;
+ height: 36px;
+ padding: 0 18px;
+ border-radius: 18px;
+ background: var(--primary);
+ color: #fff;
+ font-size: 14px;
+ font-weight: 800;
+ text-decoration: none;
+}
+
+.cxz-pagination {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ margin-top: 20px;
+}
+
+.cxz-pagination button,
+.cxz-pagination a,
+.cxz-pagination span {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 40px;
+ height: 36px;
+ padding: 0 12px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-sm);
+ background: #fff;
+ color: var(--text-dark);
+ font-size: 14px;
+ font-weight: 800;
+ text-decoration: none;
+}
+
+.cxz-pagination .active,
+.cxz-pagination button.active {
+ border-color: var(--primary);
+ background: var(--primary);
+ color: #fff;
+}
+
+.cxz-pagination .disabled,
+.cxz-pagination button:disabled {
+ background: var(--bg-light);
+ color: #aab4c4;
+ cursor: not-allowed;
+}
+
+.publish-hidden {
+ display: none !important;
+}
+
+.publish-editor-textarea {
+ width: 100%;
+ height: 360px;
+ visibility: hidden;
+}
+
+.publish-footer-link {
+ color: inherit;
+ text-decoration: none;
+}
+
+.publish-footer-link:hover {
+ color: #ffe39a;
+}
+
+@media (max-width: 768px) {
+ .page-main,
+ .page-wrap {
+ width: calc(100% - 24px);
+ }
+
+ .publish-card,
+ .cxz-form-card {
+ margin: 18px auto 32px;
+ border-radius: 16px;
+ }
+
+ .publish-card-header,
+ .publish-card-body,
+ .cxz-form-body {
+ padding: 20px 16px;
+ }
+
+ .publish-card-header {
+ display: block;
+ }
+
+ .publish-tab-bar,
+ .cxz-select-row {
+ display: block;
+ }
+
+ .publish-tab-item {
+ width: 100%;
+ border-right: 0;
+ border-bottom: 1px solid var(--border-light);
+ }
+
+ .publish-tab-item:last-child {
+ border-bottom: 0;
+ }
+}
diff --git a/public/css/static.css b/public/css/static.css
new file mode 100644
index 0000000..2686772
--- /dev/null
+++ b/public/css/static.css
@@ -0,0 +1,383 @@
+/* ============================================================
+ static.css - Static policy pages (yinsixieyi.html, yonghuxieyi.html)
+ Uses CSS variables from public.css
+ ============================================================ */
+
+/* ============================
+ POLICY PAGE - Overall layout
+ ============================ */
+.policy-page {
+ max-width: 900px;
+ margin: 0 auto;
+ padding: 0 16px 60px;
+}
+
+/* ============================
+ POLICY CARD - Main container
+ ============================ */
+.policy-card {
+ max-width: 900px;
+ margin: 0 auto 40px;
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-md);
+ overflow: hidden;
+}
+
+.policy-card-header {
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-light) 60%, var(--purple) 100%);
+ padding: 36px 40px;
+ text-align: center;
+ position: relative;
+}
+
+.policy-card-header::after {
+ content: '';
+ position: absolute;
+ bottom: -12px;
+ left: 50%;
+ transform: translateX(-50%);
+ width: 60px;
+ height: 3px;
+ background: linear-gradient(90deg, var(--gold), var(--orange));
+ border-radius: 2px;
+}
+
+.policy-card-title {
+ font-size: 26px;
+ color: var(--white);
+ font-weight: 700;
+ margin: 0 0 4px;
+}
+
+.policy-card-header p {
+ font-size: 14px;
+ color: rgba(255, 255, 255, 0.7);
+ margin: 0;
+}
+
+#articleTitle {
+ color: rgba(255, 255, 255, 0.8);
+}
+
+/* ============================
+ POLICY CARD BODY
+ ============================ */
+.policy-card-body {
+ padding: 40px;
+}
+
+.policy-card-body h1,
+.policy-card-body h2 {
+ font-size: 20px;
+ font-weight: 700;
+ color: var(--primary);
+ margin: 32px 0 16px;
+ padding-bottom: 8px;
+ border-bottom: 2px solid var(--bg-light);
+}
+
+.policy-card-body h2:first-child,
+.policy-card-body h1:first-child {
+ margin-top: 0;
+}
+
+.policy-card-body h3 {
+ font-size: 17px;
+ font-weight: 700;
+ color: var(--primary-light);
+ margin: 24px 0 12px;
+}
+
+.policy-card-body p {
+ font-size: 15px;
+ color: #555;
+ line-height: 1.9;
+ margin-bottom: 12px;
+}
+
+.policy-card-body ul,
+.policy-card-body ol {
+ padding-left: 24px;
+ margin-bottom: 12px;
+}
+
+.policy-card-body li {
+ font-size: 15px;
+ color: #555;
+ line-height: 2;
+}
+
+/* ============================
+ POLICY SECTION - Structured content
+ ============================ */
+.policy-section {
+ margin-bottom: 28px;
+ padding-bottom: 24px;
+ border-bottom: 1px solid var(--border-light);
+}
+
+.policy-section:last-child {
+ border-bottom: none;
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+
+.policy-section-title {
+ font-size: 18px;
+ font-weight: 700;
+ color: var(--primary);
+ margin: 0 0 14px;
+ padding-left: 12px;
+ border-left: 4px solid var(--gold);
+ line-height: 1.4;
+}
+
+.policy-section-content {
+ font-size: 15px;
+ color: #555;
+ line-height: 1.9;
+}
+
+.policy-section-content p {
+ margin-bottom: 10px;
+}
+
+.policy-section-content p:last-child {
+ margin-bottom: 0;
+}
+
+.policy-section-content ul,
+.policy-section-content ol {
+ padding-left: 24px;
+ margin-bottom: 10px;
+}
+
+.policy-section-content li {
+ font-size: 15px;
+ color: #555;
+ line-height: 2;
+}
+
+.policy-section-content strong,
+.policy-section-content b {
+ color: var(--text-dark);
+ font-weight: 600;
+}
+
+.policy-section-content a {
+ color: var(--primary);
+ text-decoration: underline;
+ transition: color 0.2s;
+}
+
+.policy-section-content a:hover {
+ color: var(--orange);
+}
+
+/* ============================
+ UPDATE DATE
+ ============================ */
+.policy-update-date {
+ font-size: 13px;
+ color: var(--text-muted);
+ text-align: center;
+ margin-top: 24px;
+ padding-top: 16px;
+ border-top: 1px solid var(--border-light);
+}
+
+.policy-update-date .date-label {
+ font-weight: 600;
+ color: var(--text-muted);
+}
+
+.policy-update-date .date-value {
+ color: var(--primary);
+ font-weight: 600;
+}
+
+/* ============================
+ PAGE HEADER / NAV (shared)
+ ============================ */
+.page-header {
+ width: 1400px;
+ margin: 0 auto;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 0;
+}
+
+.page-header .logo-wrap {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+
+.page-header .logo-wrap img {
+ height: 44px;
+}
+
+.page-header .logo-text {
+ font-size: 26px;
+ font-weight: 700;
+ color: var(--primary);
+}
+
+.page-header .logo-text span {
+ color: var(--orange);
+}
+
+.page-header .header-right {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+}
+
+.page-header .header-right a {
+ font-size: 14px;
+ color: var(--primary);
+ font-weight: 500;
+ transition: color 0.2s;
+ text-decoration: none;
+}
+
+.page-header .header-right a:hover {
+ color: var(--orange);
+}
+
+.page-nav {
+ width: 100%;
+ background: var(--primary);
+ display: flex;
+ justify-content: center;
+}
+
+.page-nav-inner {
+ width: 1400px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 50px;
+}
+
+.page-nav-inner a {
+ width: 140px;
+ display: flex;
+ font-size: 16px;
+ justify-content: center;
+ line-height: 50px;
+ text-align: center;
+ color: var(--white);
+ cursor: pointer;
+ transition: background 0.3s;
+ text-decoration: none;
+}
+
+.page-nav-inner a:hover {
+ background: rgba(253, 185, 51, 0.2);
+}
+
+.page-nav-inner a.active {
+ background: rgba(253, 185, 51, 0.3);
+}
+
+.page-main {
+ width: 1400px;
+ margin: 20px auto;
+}
+
+/* ============================
+ FOOTER
+ ============================ */
+.FooterRecord {
+ border-top: 1px solid rgba(0, 0, 0, 0.08);
+ padding: 20px;
+ text-align: center;
+ background: var(--white);
+}
+
+.FooterRecord .fotter-box {
+ max-width: 1200px;
+ margin: 0 auto;
+}
+
+.FooterRecord .fotter-center {
+ font-size: 12px;
+ color: var(--text-muted);
+ line-height: 2;
+}
+
+/* ============================
+ RESPONSIVE STYLES
+ ============================ */
+@media (max-width: 768px) {
+
+ .page-header,
+ .page-nav-inner,
+ .page-main {
+ width: 100%;
+ padding: 0 16px;
+ }
+
+ .policy-card-header {
+ padding: 28px 24px;
+ }
+
+ .policy-card-title {
+ font-size: 20px;
+ }
+
+ .policy-card-body {
+ padding: 24px 20px;
+ }
+
+ .policy-section-title {
+ font-size: 16px;
+ }
+
+ .policy-section-content,
+ .policy-card-body p,
+ .policy-card-body li {
+ font-size: 14px;
+ }
+
+ .policy-page {
+ padding: 0 8px 40px;
+ }
+}
+
+@media (max-width: 480px) {
+ .policy-card-header {
+ padding: 20px 16px;
+ }
+
+ .policy-card-title {
+ font-size: 18px;
+ }
+
+ .policy-card-body {
+ padding: 20px 16px;
+ }
+
+ .policy-section {
+ margin-bottom: 20px;
+ padding-bottom: 16px;
+ }
+
+ .policy-section-title {
+ font-size: 15px;
+ padding-left: 8px;
+ border-left-width: 3px;
+ }
+
+ .page-header .logo-text {
+ font-size: 20px;
+ }
+
+ .page-nav-inner a {
+ font-size: 13px;
+ padding: 0 10px;
+ }
+}
\ No newline at end of file
diff --git a/public/css/tixian.css b/public/css/tixian.css
new file mode 100644
index 0000000..9884ff0
--- /dev/null
+++ b/public/css/tixian.css
@@ -0,0 +1,371 @@
+.tx-balance-grid {
+ display: grid;
+ grid-template-columns: repeat(5, minmax(0, 1fr));
+ gap: 14px;
+ margin-bottom: 22px;
+}
+.tx-balance-card {
+ min-width: 0;
+ background: #fff;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-lg);
+ padding: 18px 16px;
+ box-shadow: var(--shadow-sm);
+ display: flex;
+ align-items: center;
+ gap: 12px;
+}
+.tx-balance-icon {
+ width: 44px;
+ height: 44px;
+ border-radius: 14px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 21px;
+ flex: 0 0 auto;
+}
+.tx-hidden {
+ display: none;
+}
+#loggedInBox:not(.tx-hidden) {
+ display: flex;
+}
+.tx-balance-icon.account {
+ background: rgba(16, 43, 106, 0.08);
+ color: var(--primary);
+}
+.tx-balance-icon.sales {
+ background: rgba(241, 90, 34, 0.1);
+ color: var(--orange);
+}
+.tx-balance-icon.expert {
+ background: rgba(123, 45, 142, 0.1);
+ color: var(--purple);
+}
+.tx-balance-icon.withdrawable {
+ background: rgba(35, 175, 92, 0.1);
+ color: #18a058;
+}
+.tx-balance-icon.frozen {
+ background: rgba(90, 105, 135, 0.1);
+ color: #5a6987;
+}
+.tx-tab-bar {
+ margin-bottom: 20px;
+}
+.tx-label-tight {
+ margin: 0;
+}
+.tx-beian-link {
+ font-size: 12px;
+ color: rgba(255, 255, 255, 0.5);
+}
+.tx-balance-info {
+ min-width: 0;
+}
+.tx-balance-label {
+ color: var(--text-muted);
+ font-size: 13px;
+}
+.tx-balance-value {
+ color: var(--text-dark);
+ font-size: 23px;
+ font-weight: 800;
+ line-height: 1.2;
+ margin-top: 4px;
+ white-space: nowrap;
+}
+.tx-balance-value .unit {
+ color: var(--text-muted);
+ font-size: 13px;
+ font-weight: 500;
+ margin-left: 2px;
+}
+.tx-panel {
+ display: none;
+}
+.tx-panel.active {
+ display: block;
+}
+.tx-choice-grid,
+.tx-method-grid,
+.tx-account-grid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 12px;
+}
+.tx-choice-card,
+.tx-method-card,
+.tx-account-card {
+ border: 2px solid var(--border-light);
+ border-radius: var(--radius-md);
+ background: var(--bg-light);
+ padding: 15px 16px;
+ cursor: pointer;
+ transition: all 0.22s;
+ min-height: 74px;
+}
+.tx-choice-card:hover,
+.tx-method-card:hover,
+.tx-account-card:hover {
+ border-color: var(--primary);
+}
+.tx-choice-card.selected,
+.tx-method-card.selected,
+.tx-account-card.selected {
+ border-color: var(--primary);
+ background: rgba(16, 43, 106, 0.05);
+ box-shadow: 0 0 0 3px rgba(16, 43, 106, 0.1);
+}
+.tx-choice-title,
+.tx-method-title,
+.tx-account-title {
+ color: var(--text-dark);
+ font-size: 15px;
+ font-weight: 800;
+}
+.tx-choice-desc,
+.tx-method-desc,
+.tx-account-desc {
+ color: var(--text-muted);
+ font-size: 12px;
+ margin-top: 6px;
+ line-height: 1.5;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+.tx-account-title em {
+ display: inline-block;
+ margin-left: 8px;
+ padding: 2px 7px;
+ border-radius: 999px;
+ background: rgba(255, 185, 0, 0.16);
+ color: var(--orange);
+ font-size: 12px;
+ font-style: normal;
+ font-weight: 700;
+}
+.tx-available {
+ padding: 16px 18px;
+ border-radius: var(--radius-md);
+ background: rgba(241, 90, 34, 0.06);
+ border: 1px solid rgba(241, 90, 34, 0.18);
+ color: var(--orange);
+ font-size: 18px;
+ font-weight: 800;
+}
+.tx-amount-row {
+ display: flex;
+ gap: 10px;
+}
+.tx-amount-row .cxz-form-input {
+ flex: 1;
+}
+.tx-all-btn,
+.tx-small-btn {
+ border: none;
+ border-radius: var(--radius-md);
+ background: var(--primary);
+ color: #fff;
+ font-size: 14px;
+ font-weight: 800;
+ padding: 0 22px;
+ cursor: pointer;
+ white-space: nowrap;
+}
+.tx-small-btn {
+ height: 40px;
+ padding: 0 18px;
+}
+.tx-account-head {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+ margin-bottom: 10px;
+}
+.tx-link-btn {
+ border: none;
+ background: transparent;
+ color: var(--primary);
+ cursor: pointer;
+ font-size: 13px;
+ font-weight: 800;
+}
+.tx-account-actions {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 12px;
+ margin-top: 8px;
+ font-size: 12px;
+ color: var(--primary);
+}
+.tx-account-actions span {
+ cursor: pointer;
+}
+.tx-empty {
+ grid-column: 1 / -1;
+ color: var(--text-muted);
+ border: 1px dashed var(--border-light);
+ border-radius: var(--radius-md);
+ padding: 18px;
+ text-align: center;
+}
+.tx-add-panel {
+ display: none;
+ margin-top: 14px;
+ padding: 16px;
+ border-radius: var(--radius-md);
+ border: 1px dashed rgba(16, 43, 106, 0.25);
+ background: rgba(16, 43, 106, 0.04);
+}
+.tx-add-panel.show {
+ display: block;
+}
+.tx-add-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 12px;
+}
+.tx-add-grid .full {
+ grid-column: 1 / -1;
+}
+.tx-bind-mode {
+ display: inline-flex;
+ gap: 8px;
+ padding: 4px;
+ border-radius: 999px;
+ background: rgba(16, 43, 106, 0.06);
+ margin-bottom: 12px;
+}
+.tx-bind-mode button {
+ border: none;
+ border-radius: 999px;
+ background: transparent;
+ color: var(--text-muted);
+ padding: 7px 14px;
+ cursor: pointer;
+ font-weight: 800;
+}
+.tx-bind-mode button.active {
+ background: var(--primary);
+ color: #fff;
+}
+.tx-upload-box {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ flex-wrap: wrap;
+ grid-column: 1 / -1;
+}
+.tx-upload-name,
+.tx-note {
+ color: var(--text-muted);
+ font-size: 12px;
+ line-height: 1.7;
+}
+.tx-qrcode-preview {
+ width: 72px;
+ height: 72px;
+ border-radius: 8px;
+ border: 1px solid var(--border-light);
+ object-fit: cover;
+ background: #fff;
+ display: none;
+}
+.tx-qrcode-preview.is-visible {
+ display: block;
+}
+.tx-save-account-btn {
+ margin-top: 12px;
+}
+.tx-modal-mask {
+ position: fixed;
+ inset: 0;
+ z-index: 999;
+ display: none;
+ align-items: center;
+ justify-content: center;
+ padding: 18px;
+ background: rgba(10, 20, 40, 0.48);
+}
+.tx-modal-mask.show {
+ display: flex;
+}
+.tx-modal {
+ width: min(620px, 100%);
+ max-height: calc(100vh - 48px);
+ overflow: auto;
+ background: #fff;
+ border-radius: var(--radius-lg);
+ box-shadow: 0 24px 70px rgba(0, 0, 0, 0.22);
+}
+.tx-modal-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 18px 22px;
+ border-bottom: 1px solid var(--border-light);
+}
+.tx-modal-title {
+ color: var(--text-dark);
+ font-size: 18px;
+ font-weight: 800;
+}
+.tx-modal-close {
+ border: none;
+ background: transparent;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 24px;
+ line-height: 1;
+}
+.tx-modal-body {
+ padding: 20px 22px 22px;
+}
+.tx-modal-actions {
+ display: flex;
+ justify-content: flex-end;
+ gap: 10px;
+ margin-top: 16px;
+}
+.tx-secondary-btn {
+ height: 40px;
+ padding: 0 18px;
+ border-radius: var(--radius-md);
+ border: 1px solid var(--border-light);
+ background: #fff;
+ color: var(--text-dark);
+ cursor: pointer;
+ font-weight: 800;
+}
+.tx-check-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ color: var(--text-dark);
+ font-size: 13px;
+ margin-top: 4px;
+}
+@media (max-width: 1120px) {
+ .tx-balance-grid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+}
+@media (max-width: 768px) {
+ .tx-balance-grid,
+ .tx-choice-grid,
+ .tx-method-grid,
+ .tx-account-grid,
+ .tx-add-grid {
+ grid-template-columns: 1fr;
+ }
+ .tx-amount-row {
+ flex-direction: column;
+ }
+ .tx-all-btn {
+ height: 44px;
+ }
+}
diff --git a/public/css/tixianlist.css b/public/css/tixianlist.css
new file mode 100644
index 0000000..030791a
--- /dev/null
+++ b/public/css/tixianlist.css
@@ -0,0 +1,294 @@
+.tl-hidden {
+ display: none;
+}
+
+#loggedInBox:not(.tl-hidden) {
+ display: flex;
+}
+
+.tl-card {
+ background: #fff;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-sm);
+ padding: 24px 28px 28px;
+ margin-bottom: 42px;
+}
+
+.tl-header {
+ display: flex;
+ align-items: flex-start;
+ justify-content: space-between;
+ gap: 18px;
+ padding-bottom: 18px;
+ border-bottom: 1px solid var(--border-light);
+}
+
+.tl-title {
+ position: relative;
+ color: var(--text-dark);
+ font-size: 20px;
+ font-weight: 800;
+ line-height: 1.3;
+ padding-left: 14px;
+}
+
+.tl-title::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 3px;
+ width: 4px;
+ height: 20px;
+ border-radius: 4px;
+ background: var(--orange);
+}
+
+.tl-desc {
+ margin-top: 8px;
+ color: var(--text-muted);
+ font-size: 13px;
+}
+
+.tl-back-link {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 38px;
+ padding: 0 18px;
+ border-radius: var(--radius-md);
+ background: var(--primary);
+ color: #fff;
+ font-size: 14px;
+ font-weight: 800;
+}
+
+.tl-back-link:hover {
+ color: #fff;
+}
+
+.tl-filter-bar {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 14px 34px;
+ margin-top: 18px;
+ padding: 14px 16px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-md);
+ background: #f8fafd;
+}
+
+.tl-filter-group {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ min-width: 0;
+}
+
+.tl-filter-group > span {
+ color: var(--text-dark);
+ font-size: 14px;
+ font-weight: 800;
+ white-space: nowrap;
+}
+
+.tl-segment {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.tl-segment-btn {
+ height: 34px;
+ padding: 0 14px;
+ border: 1px solid var(--border-light);
+ border-radius: 999px;
+ background: var(--bg-light);
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 13px;
+ font-weight: 800;
+ transition: all 0.2s;
+}
+
+.tl-segment-btn.active,
+.tl-segment-btn:hover {
+ border-color: var(--primary);
+ background: rgba(16, 43, 106, 0.08);
+ color: var(--primary);
+}
+
+.tl-summary {
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 12px;
+ margin-top: 14px;
+}
+
+.tl-summary-item {
+ padding: 13px 16px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-md);
+ background: var(--bg-light);
+}
+
+.tl-summary-item span {
+ display: block;
+ color: var(--text-muted);
+ font-size: 12px;
+}
+
+.tl-summary-item strong {
+ display: block;
+ margin-top: 5px;
+ color: var(--text-dark);
+ font-size: 16px;
+ font-weight: 800;
+}
+
+.tl-table-wrap {
+ margin-top: 16px;
+ overflow-x: auto;
+}
+
+.tl-table {
+ width: 100%;
+ min-width: 980px;
+ border-collapse: collapse;
+ overflow: hidden;
+ border-radius: var(--radius-md);
+}
+
+.tl-table th {
+ background: #f3f6fb;
+ color: var(--primary);
+ font-size: 13px;
+ font-weight: 800;
+ text-align: left;
+ padding: 14px 16px;
+ white-space: nowrap;
+}
+
+.tl-table td {
+ border-bottom: 1px solid var(--border-light);
+ color: var(--text-dark);
+ font-size: 13px;
+ padding: 15px 16px;
+ white-space: nowrap;
+}
+
+.tl-table tr:hover td {
+ background: rgba(16, 43, 106, 0.03);
+}
+
+.tl-table-hidden {
+ display: none;
+}
+
+.tl-amount {
+ color: #e04828;
+ font-weight: 800;
+}
+
+.tl-status {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 58px;
+ height: 26px;
+ padding: 0 10px;
+ border-radius: 999px;
+ font-size: 12px;
+ font-weight: 800;
+}
+
+.tl-status.reviewing {
+ background: rgba(255, 185, 0, 0.15);
+ color: #b77900;
+}
+
+.tl-status.success {
+ background: rgba(35, 175, 92, 0.12);
+ color: #15824a;
+}
+
+.tl-status.failed {
+ background: rgba(224, 72, 40, 0.12);
+ color: #c4381d;
+}
+
+.tl-status.cancelled,
+.tl-status.normal {
+ background: rgba(90, 105, 135, 0.12);
+ color: #5a6987;
+}
+
+.tl-empty {
+ display: none;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ min-height: 220px;
+ border: 1px dashed var(--border-light);
+ border-radius: var(--radius-md);
+ background: #fbfcff;
+ color: var(--text-muted);
+}
+
+.tl-empty.show {
+ display: flex;
+}
+
+.tl-empty-icon {
+ width: 54px;
+ height: 54px;
+ border-radius: 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ background: rgba(16, 43, 106, 0.08);
+ color: var(--primary);
+ font-size: 24px;
+ font-weight: 800;
+}
+
+.tl-empty-title {
+ margin-top: 14px;
+ color: var(--text-dark);
+ font-size: 16px;
+ font-weight: 800;
+}
+
+.tl-empty-desc {
+ margin-top: 6px;
+ font-size: 13px;
+}
+
+.tl-pagination {
+ margin-top: 18px;
+}
+
+.tl-pagination.is-hidden,
+.tl-summary.is-hidden {
+ display: none;
+}
+
+.tl-beian-link {
+ font-size: 12px;
+ color: rgba(255, 255, 255, 0.5);
+}
+
+@media (max-width: 900px) {
+ .tl-card {
+ padding: 20px 16px;
+ }
+
+ .tl-header {
+ flex-direction: column;
+ }
+
+ .tl-summary {
+ grid-template-columns: 1fr;
+ }
+}
diff --git a/public/css/trend.css b/public/css/trend.css
new file mode 100644
index 0000000..f071516
--- /dev/null
+++ b/public/css/trend.css
@@ -0,0 +1,1013 @@
+/* ============================================================
+ trend.css - Trend chart page styles (content only)
+ Covers: ssq, cjdlt, fc3d, pl3, pl5, kl8, qlc, qxc
+ Header/footer styles are in public.css (unified .topbar/.site-footer)
+ ============================================================ */
+
+/* ----------------------------------------------------------
+ 1. Breadcrumb Bar
+ ---------------------------------------------------------- */
+.breadcrumb-bar {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 14px 20px 0;
+ font-size: 13px;
+ color: var(--text-muted);
+ display: flex;
+ align-items: center;
+ gap: 6px;
+ flex-wrap: wrap;
+}
+
+.breadcrumb-bar a {
+ color: var(--primary);
+ transition: color 0.2s;
+ text-decoration: none;
+ display: inline-flex;
+ align-items: center;
+ gap: 3px;
+}
+
+.breadcrumb-bar a:hover {
+ text-decoration: underline;
+}
+
+.breadcrumb-bar span {
+ color: #d1d5db;
+}
+
+/* ----------------------------------------------------------
+ 2. Page Title Bar & Period Selector
+ ---------------------------------------------------------- */
+.page-title-bar {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 10px 20px 14px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 16px;
+ flex-wrap: wrap;
+}
+
+.page-title {
+ font-size: 22px;
+ font-weight: 700;
+ color: var(--primary);
+ position: relative;
+ padding-left: 14px;
+ border-left: 4px solid var(--gold);
+}
+
+.qishu {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.qishu-but {
+ padding: 6px 18px;
+ border-radius: 20px;
+ font-size: 13px;
+ font-weight: 500;
+ color: #555;
+ background: #fff;
+ border: 1px solid var(--border-light);
+ cursor: pointer;
+ transition: all 0.25s;
+ user-select: none;
+ white-space: nowrap;
+ line-height: 1.5;
+}
+
+.qishu-but:hover {
+ color: var(--primary);
+ border-color: var(--primary);
+ background: var(--bg-light);
+}
+
+.qishu-but.active {
+ color: #fff;
+ background: var(--primary);
+ border-color: var(--primary);
+ box-shadow: 0 2px 8px rgba(16, 43, 106, 0.25);
+}
+
+/* ----------------------------------------------------------
+ 3. Table Wrapper & Horizontal Scroll
+ ---------------------------------------------------------- */
+.table-wrapper {
+ max-width: 1200px;
+ margin: 12px auto 40px;
+ padding: 0 20px;
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.table-wrapper::-webkit-scrollbar {
+ height: 8px;
+}
+
+.table-wrapper::-webkit-scrollbar-track {
+ background: #f1f1f1;
+ border-radius: 4px;
+}
+
+.table-wrapper::-webkit-scrollbar-thumb {
+ background: #c1c1c1;
+ border-radius: 4px;
+ transition: background 0.2s;
+}
+
+.table-wrapper::-webkit-scrollbar-thumb:hover {
+ background: #999;
+}
+
+/* ----------------------------------------------------------
+ 4. Trend Table - Base
+ ---------------------------------------------------------- */
+.trend-table {
+ width: max-content;
+ min-width: 100%;
+ border-collapse: collapse;
+ background: #fff;
+ border-radius: var(--radius-md);
+ overflow: hidden;
+ box-shadow: var(--shadow-sm);
+ font-size: 12px;
+ table-layout: auto;
+}
+
+.trend-table thead {
+ position: sticky;
+ top: 0;
+ z-index: 10;
+}
+
+.trend-table thead tr:first-child td {
+ background: var(--primary);
+ color: #fff;
+ font-weight: 600;
+ padding: 10px 6px;
+ text-align: center;
+ border-color: rgba(255, 255, 255, 0.12);
+ white-space: nowrap;
+ font-size: 13px;
+}
+
+.trend-table thead tr:nth-child(2) td {
+ background: #e8edf6;
+ color: var(--primary);
+ font-weight: 600;
+ padding: 8px 4px;
+ text-align: center;
+ border-color: rgba(16, 43, 106, 0.08);
+ white-space: nowrap;
+ font-size: 12px;
+}
+
+.trend-table td {
+ padding: 5px 5px;
+ text-align: center;
+ border: 1px solid var(--border-light);
+ vertical-align: middle;
+ white-space: nowrap;
+ line-height: 1.4;
+}
+
+.trend-table tbody tr {
+ transition: background 0.15s;
+}
+
+.trend-table tbody tr:hover {
+ background: rgba(16, 43, 106, 0.03);
+}
+
+.trend-table tbody tr:nth-child(even) {
+ background: rgba(244, 246, 251, 0.45);
+}
+
+.trend-table tbody tr:nth-child(even):hover {
+ background: rgba(16, 43, 106, 0.05);
+}
+
+/* ----------------------------------------------------------
+ 5. Issue & Code Columns (sticky left)
+ ---------------------------------------------------------- */
+.col-issue {
+ font-weight: 600;
+ color: var(--primary);
+ min-width: 72px;
+ background: #f0f3fa;
+ position: sticky;
+ left: 0;
+ z-index: 5;
+}
+
+.trend-table thead .col-issue {
+ background: var(--primary);
+ color: #fff;
+ z-index: 15;
+}
+
+.col-code {
+ font-weight: 600;
+ color: var(--text-default);
+ min-width: 120px;
+ background: #f0f3fa;
+ position: sticky;
+ left: 72px;
+ z-index: 5;
+}
+
+.trend-table thead .col-code {
+ background: var(--primary);
+ color: #fff;
+ z-index: 15;
+}
+
+.col-issue::after,
+.col-code::after {
+ content: "";
+ position: absolute;
+ top: 0;
+ right: -6px;
+ width: 6px;
+ height: 100%;
+ background: linear-gradient(90deg, rgba(0, 0, 0, 0.06), transparent);
+ pointer-events: none;
+}
+
+.trend-table thead .col-issue::after,
+.trend-table thead .col-code::after {
+ background: none;
+}
+
+/* ----------------------------------------------------------
+ 6. Zone Header Colors
+ ---------------------------------------------------------- */
+.zone-red-header {
+ background: linear-gradient(135deg, #e74c3c, #f15a22) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+ letter-spacing: 1px;
+}
+
+.zone-blue-header {
+ background: linear-gradient(135deg, #102b6a, #3b6fd4) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+ letter-spacing: 1px;
+}
+
+.zone-front-header {
+ background: linear-gradient(135deg, #e74c3c, #f15a22) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+ letter-spacing: 1px;
+}
+
+.zone-back-header {
+ background: linear-gradient(135deg, #102b6a, #3b6fd4) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+ letter-spacing: 1px;
+}
+
+.zone-type {
+ background: var(--purple) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+}
+
+.zone-hundred {
+ background: linear-gradient(135deg, #f15a22, #e67e22) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+}
+
+.zone-ten {
+ background: linear-gradient(135deg, #27ae60, #2ecc71) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+}
+
+.zone-unit {
+ background: linear-gradient(135deg, #102b6a, #3b6fd4) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+}
+
+.zone-p1 { background: #e74c3c !important; color: #fff !important; font-size: 14px !important; }
+.zone-p2 { background: #f39c12 !important; color: #fff !important; font-size: 14px !important; }
+.zone-p3 { background: #27ae60 !important; color: #fff !important; font-size: 14px !important; }
+.zone-p4 { background: #2980b9 !important; color: #fff !important; font-size: 14px !important; }
+.zone-p5 { background: #8e44ad !important; color: #fff !important; font-size: 14px !important; }
+
+.zone-g1 {
+ background: linear-gradient(135deg, #e74c3c, #f15a22) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+ letter-spacing: 1px;
+}
+
+.zone-g2 {
+ background: linear-gradient(135deg, #102b6a, #3b6fd4) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+ letter-spacing: 1px;
+}
+
+.zone-z1 { background: #e74c3c !important; color: #fff !important; font-size: 14px !important; }
+.zone-z2 { background: #27ae60 !important; color: #fff !important; font-size: 14px !important; }
+.zone-z3 { background: #3b6fd4 !important; color: #fff !important; font-size: 14px !important; }
+.zone-sp {
+ background: linear-gradient(135deg, #f5a623, #fdb933) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+}
+
+.zone-0to9 {
+ background: var(--primary-light) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+}
+
+.zone-last {
+ background: linear-gradient(135deg, #f15a22, #e67e22) !important;
+ color: #fff !important;
+ font-size: 14px !important;
+}
+
+/* ----------------------------------------------------------
+ 7. Hit & Miss Ball Styles
+ ---------------------------------------------------------- */
+.hit-red {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f15a22, #e74c3c);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(241, 90, 34, 0.35);
+}
+
+.hit-blue {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #102b6a, #3b6fd4);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(16, 43, 106, 0.35);
+}
+
+.miss-num {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ color: #c5c5c5;
+ font-size: 11px;
+ font-weight: 400;
+}
+
+.hit-hundred {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f15a22, #e74c3c);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(241, 90, 34, 0.35);
+}
+
+.hit-ten {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #27ae60, #2ecc71);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(39, 174, 96, 0.35);
+}
+
+.hit-unit {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #102b6a, #3b6fd4);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(16, 43, 106, 0.35);
+}
+
+.type-baozi {
+ display: inline-block;
+ padding: 2px 6px;
+ border-radius: 4px;
+ background: linear-gradient(135deg, #e74c3c, #c0392b);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ letter-spacing: 0.5px;
+}
+
+.type-zu3 {
+ display: inline-block;
+ padding: 2px 6px;
+ border-radius: 4px;
+ background: linear-gradient(135deg, #f39c12, #e67e22);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ letter-spacing: 0.5px;
+}
+
+.type-zu6 {
+ display: inline-block;
+ padding: 2px 6px;
+ border-radius: 4px;
+ background: linear-gradient(135deg, #3b6fd4, #2980b9);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ letter-spacing: 0.5px;
+}
+
+.type-empty {
+ display: inline-block;
+ padding: 2px 6px;
+ border-radius: 4px;
+ color: #d0d0d0;
+ font-size: 11px;
+ font-weight: 400;
+}
+
+/* ----------------------------------------------------------
+ 8. PL5 Position Hit Balls
+ ---------------------------------------------------------- */
+.hit-pos1 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #e74c3c, #c0392b);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(231, 76, 60, 0.35);
+}
+
+.hit-pos2 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f39c12, #e67e22);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(243, 156, 18, 0.35);
+}
+
+.hit-pos3 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #27ae60, #2ecc71);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(39, 174, 96, 0.35);
+}
+
+.hit-pos4 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #2980b9, #3b6fd4);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(41, 128, 185, 0.35);
+}
+
+.hit-pos5 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #8e44ad, #9b59b6);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(142, 68, 173, 0.35);
+}
+
+/* ----------------------------------------------------------
+ 9. QXC Position Hit Balls
+ ---------------------------------------------------------- */
+.hit-p1 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #e74c3c, #c0392b);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(231, 76, 60, 0.35);
+}
+
+.hit-p2 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f39c12, #e67e22);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(243, 156, 18, 0.35);
+}
+
+.hit-p3 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #27ae60, #2ecc71);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(39, 174, 96, 0.35);
+}
+
+.hit-p4 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #2980b9, #3b6fd4);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(41, 128, 185, 0.35);
+}
+
+.hit-p5 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #8e44ad, #9b59b6);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(142, 68, 173, 0.35);
+}
+
+.hit-p6 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #16a085, #1abc9c);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(22, 160, 133, 0.35);
+}
+
+.hit-p7 {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f15a22, #e67e22);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(241, 90, 34, 0.35);
+}
+
+/* ----------------------------------------------------------
+ 10. KL8 Hit Balls
+ ---------------------------------------------------------- */
+.hit-num {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #e74c3c, #f15a22);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(231, 76, 60, 0.35);
+}
+
+.hit-num.g2 {
+ background: linear-gradient(135deg, #102b6a, #3b6fd4);
+ box-shadow: 0 2px 6px rgba(16, 43, 106, 0.35);
+}
+
+/* ----------------------------------------------------------
+ 11. QLC Hit Balls
+ ---------------------------------------------------------- */
+.hit-main {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #e74c3c, #f15a22);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(231, 76, 60, 0.35);
+}
+
+.hit-special {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f5a623, #fdb933);
+ color: #fff;
+ font-size: 11px;
+ font-weight: 700;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.18);
+ box-shadow: 0 2px 6px rgba(253, 185, 51, 0.4);
+}
+
+/* ----------------------------------------------------------
+ 12. Statistics Rows
+ ---------------------------------------------------------- */
+.stat-row td {
+ font-size: 12px;
+ font-weight: 500;
+ color: var(--text-muted);
+ padding: 5px 5px;
+ border-top: 1px solid var(--border-light);
+ background: #f0f3fa;
+}
+
+.stat-row:first-child td {
+ border-top: 3px solid var(--primary);
+}
+
+.stat-row.alt td {
+ background: #e8edf6;
+}
+
+.stat-label {
+ text-align: left !important;
+ font-weight: 700 !important;
+ color: #fff !important;
+ background: var(--primary) !important;
+ padding-left: 10px !important;
+}
+
+/* ----------------------------------------------------------
+ 13. Responsive - Tablet (max-width: 1024px)
+ ---------------------------------------------------------- */
+@media (max-width: 1024px) {
+ .breadcrumb-bar {
+ padding: 10px 16px 0;
+ font-size: 12px;
+ }
+
+ .page-title-bar {
+ padding: 8px 16px 12px;
+ }
+
+ .page-title {
+ font-size: 19px;
+ }
+
+ .qishu-but {
+ padding: 5px 14px;
+ font-size: 12px;
+ }
+
+ .table-wrapper {
+ padding: 0 12px;
+ margin-bottom: 30px;
+ }
+
+ .trend-table {
+ font-size: 11px;
+ }
+
+ .trend-table thead tr:first-child td {
+ padding: 8px 4px;
+ font-size: 12px;
+ }
+
+ .trend-table thead tr:nth-child(2) td {
+ padding: 6px 3px;
+ font-size: 11px;
+ }
+
+ .trend-table td {
+ padding: 4px 3px;
+ }
+
+ .col-issue {
+ min-width: 62px;
+ }
+
+ .col-code {
+ min-width: 100px;
+ left: 62px;
+ }
+
+ .hit-red,
+ .hit-blue,
+ .hit-hundred,
+ .hit-ten,
+ .hit-unit,
+ .hit-pos1,
+ .hit-pos2,
+ .hit-pos3,
+ .hit-pos4,
+ .hit-pos5,
+ .hit-p1,
+ .hit-p2,
+ .hit-p3,
+ .hit-p4,
+ .hit-p5,
+ .hit-p6,
+ .hit-p7,
+ .hit-num,
+ .hit-main,
+ .hit-special,
+ .miss-num {
+ width: 20px;
+ height: 20px;
+ font-size: 10px;
+ }
+}
+
+/* ----------------------------------------------------------
+ 14. Responsive - Mobile (max-width: 768px)
+ ---------------------------------------------------------- */
+@media (max-width: 768px) {
+ .breadcrumb-bar {
+ padding: 8px 12px 0;
+ font-size: 12px;
+ }
+
+ .page-title-bar {
+ padding: 6px 12px 10px;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 10px;
+ }
+
+ .page-title {
+ font-size: 17px;
+ }
+
+ .qishu-but {
+ padding: 4px 12px;
+ font-size: 12px;
+ }
+
+ .table-wrapper {
+ padding: 0 8px;
+ margin-bottom: 24px;
+ }
+
+ .trend-table {
+ font-size: 10px;
+ }
+
+ .trend-table thead tr:first-child td {
+ padding: 7px 3px;
+ font-size: 11px;
+ }
+
+ .trend-table thead tr:nth-child(2) td {
+ padding: 5px 2px;
+ font-size: 10px;
+ }
+
+ .trend-table td {
+ padding: 3px 2px;
+ }
+
+ .col-issue {
+ min-width: 54px;
+ font-size: 10px;
+ left: 0;
+ }
+
+ .col-code {
+ min-width: 80px;
+ font-size: 10px;
+ left: 54px;
+ }
+
+ .hit-red,
+ .hit-blue,
+ .hit-hundred,
+ .hit-ten,
+ .hit-unit,
+ .hit-pos1,
+ .hit-pos2,
+ .hit-pos3,
+ .hit-pos4,
+ .hit-pos5,
+ .hit-p1,
+ .hit-p2,
+ .hit-p3,
+ .hit-p4,
+ .hit-p5,
+ .hit-p6,
+ .hit-p7,
+ .hit-num,
+ .hit-main,
+ .hit-special,
+ .miss-num {
+ width: 18px;
+ height: 18px;
+ font-size: 9px;
+ }
+
+ .type-baozi,
+ .type-zu3,
+ .type-zu6,
+ .type-empty {
+ font-size: 9px;
+ padding: 1px 4px;
+ }
+
+ .stat-row td {
+ font-size: 10px;
+ padding: 3px 2px;
+ }
+
+ .stat-label {
+ font-size: 10px !important;
+ padding-left: 6px !important;
+ }
+}
+
+/* ----------------------------------------------------------
+ 15. Responsive - Small Mobile (max-width: 480px)
+ ---------------------------------------------------------- */
+@media (max-width: 480px) {
+ .page-title {
+ font-size: 15px;
+ }
+
+ .qishu-but {
+ padding: 3px 10px;
+ font-size: 11px;
+ }
+
+ .trend-table {
+ font-size: 9px;
+ }
+
+ .trend-table thead tr:first-child td {
+ padding: 6px 2px;
+ font-size: 10px;
+ }
+
+ .trend-table thead tr:nth-child(2) td {
+ padding: 4px 1px;
+ font-size: 9px;
+ }
+
+ .trend-table td {
+ padding: 2px 1px;
+ }
+
+ .col-issue {
+ min-width: 46px;
+ left: 0;
+ }
+
+ .col-code {
+ min-width: 68px;
+ left: 46px;
+ }
+
+ .hit-red,
+ .hit-blue,
+ .hit-hundred,
+ .hit-ten,
+ .hit-unit,
+ .hit-pos1,
+ .hit-pos2,
+ .hit-pos3,
+ .hit-pos4,
+ .hit-pos5,
+ .hit-p1,
+ .hit-p2,
+ .hit-p3,
+ .hit-p4,
+ .hit-p5,
+ .hit-p6,
+ .hit-p7,
+ .hit-num,
+ .hit-main,
+ .hit-special,
+ .miss-num {
+ width: 16px;
+ height: 16px;
+ font-size: 8px;
+ }
+
+ .type-baozi,
+ .type-zu3,
+ .type-zu6,
+ .type-empty {
+ font-size: 8px;
+ padding: 1px 3px;
+ }
+
+ .stat-row td {
+ font-size: 9px;
+ padding: 2px 1px;
+ }
+
+ .stat-label {
+ font-size: 9px !important;
+ padding-left: 4px !important;
+ }
+}
\ No newline at end of file
diff --git a/public/css/tuiguang.css b/public/css/tuiguang.css
new file mode 100644
index 0000000..0f8945d
--- /dev/null
+++ b/public/css/tuiguang.css
@@ -0,0 +1,437 @@
+.tg-hidden {
+ display: none !important;
+}
+
+#loggedInBox:not(.tg-hidden) {
+ display: flex;
+}
+
+.tg-hero {
+ display: grid;
+ grid-template-columns: minmax(0, 1.1fr) minmax(360px, 0.9fr);
+ gap: 20px;
+ align-items: stretch;
+ padding: 28px;
+ border-radius: var(--radius-lg);
+ background: linear-gradient(135deg, #102b6a 0%, #194f82 100%);
+ color: #fff;
+ box-shadow: var(--shadow-sm);
+}
+
+.tg-eyebrow {
+ display: inline-flex;
+ align-items: center;
+ height: 28px;
+ padding: 0 12px;
+ border-radius: 999px;
+ background: rgba(255, 185, 0, 0.16);
+ color: #ffd36a;
+ font-size: 13px;
+ font-weight: 800;
+}
+
+.tg-hero h1 {
+ margin: 16px 0 10px;
+ font-size: 26px;
+ font-weight: 900;
+ line-height: 1.35;
+}
+
+.tg-hero p {
+ max-width: 720px;
+ color: rgba(255, 255, 255, 0.82);
+ font-size: 14px;
+ line-height: 1.8;
+}
+
+.tg-hero-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin-top: 18px;
+}
+
+.tg-hero-tags span {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 30px;
+ padding: 0 13px;
+ border: 1px solid rgba(255, 255, 255, 0.24);
+ border-radius: 999px;
+ background: rgba(255, 255, 255, 0.08);
+ color: #fff;
+ font-size: 13px;
+ font-weight: 700;
+}
+
+.tg-share-card {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ min-width: 0;
+ padding: 22px;
+ border-radius: 14px;
+ background: rgba(255, 255, 255, 0.96);
+ color: var(--text-dark);
+}
+
+.tg-share-title,
+.tg-title {
+ position: relative;
+ color: var(--text-dark);
+ font-size: 20px;
+ font-weight: 900;
+ line-height: 1.3;
+ padding-left: 14px;
+}
+
+.tg-share-title::before,
+.tg-title::before {
+ content: "";
+ position: absolute;
+ left: 0;
+ top: 4px;
+ width: 4px;
+ height: 20px;
+ border-radius: 4px;
+ background: var(--orange);
+}
+
+.tg-share-row {
+ display: flex;
+ gap: 10px;
+ margin-top: 18px;
+}
+
+.tg-share-row input {
+ flex: 1;
+ min-width: 0;
+ height: 42px;
+ padding: 0 13px;
+ border: 1px solid var(--border-light);
+ border-radius: 8px;
+ background: #f5f7fb;
+ color: var(--text-dark);
+ font-size: 13px;
+}
+
+.tg-btn {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: 42px;
+ padding: 0 18px;
+ border: 1px solid transparent;
+ border-radius: 9px;
+ cursor: pointer;
+ font-size: 14px;
+ font-weight: 800;
+ white-space: nowrap;
+}
+
+.tg-btn-primary {
+ background: var(--primary);
+ color: #fff;
+ box-shadow: 0 8px 18px rgba(16, 43, 106, 0.18);
+}
+
+.tg-btn-light {
+ border-color: var(--border-light);
+ background: #fff;
+ color: var(--primary);
+}
+
+.tg-invite-code {
+ margin-top: 12px;
+ color: var(--text-muted);
+ font-size: 13px;
+}
+
+.tg-invite-code strong {
+ color: var(--primary);
+ font-weight: 900;
+}
+
+.tg-stats {
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 14px;
+ margin-top: 18px;
+}
+
+.tg-stat {
+ min-width: 0;
+ padding: 18px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-md);
+ background: #fff;
+ box-shadow: var(--shadow-sm);
+}
+
+.tg-stat span,
+.tg-stat em {
+ display: block;
+ color: var(--text-muted);
+ font-size: 12px;
+ font-style: normal;
+}
+
+.tg-stat strong {
+ display: block;
+ margin: 8px 0 7px;
+ color: var(--primary);
+ font-size: 22px;
+ font-weight: 900;
+ line-height: 1.2;
+}
+
+.tg-card,
+.tg-rule-card {
+ margin-top: 18px;
+ padding: 24px 28px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-lg);
+ background: #fff;
+ box-shadow: var(--shadow-sm);
+}
+
+.tg-card-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: 18px;
+ padding-bottom: 18px;
+ border-bottom: 1px solid var(--border-light);
+}
+
+.tg-desc {
+ margin-top: 8px;
+ color: var(--text-muted);
+ font-size: 13px;
+}
+
+.tg-segment {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: flex-end;
+}
+
+.tg-segment button {
+ height: 34px;
+ padding: 0 14px;
+ border: 1px solid var(--border-light);
+ border-radius: 999px;
+ background: #f7f9fc;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 13px;
+ font-weight: 800;
+}
+
+.tg-segment button.active,
+.tg-segment button:hover {
+ border-color: var(--primary);
+ background: rgba(16, 43, 106, 0.08);
+ color: var(--primary);
+}
+
+.tg-table-wrap {
+ margin-top: 16px;
+ overflow-x: auto;
+}
+
+.tg-table {
+ width: 100%;
+ min-width: 860px;
+ border-collapse: collapse;
+}
+
+.tg-table th {
+ padding: 14px 16px;
+ background: #f3f6fb;
+ color: var(--primary);
+ font-size: 13px;
+ font-weight: 900;
+ text-align: left;
+ white-space: nowrap;
+}
+
+.tg-table td {
+ padding: 15px 16px;
+ border-bottom: 1px solid var(--border-light);
+ color: var(--text-dark);
+ font-size: 13px;
+ white-space: nowrap;
+}
+
+.tg-table tr:hover td {
+ background: rgba(16, 43, 106, 0.03);
+}
+
+.tg-positive {
+ color: #e04828 !important;
+ font-weight: 900;
+}
+
+.tg-empty-cell {
+ height: 90px;
+ color: var(--text-muted) !important;
+ text-align: center !important;
+}
+
+.tg-status {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-width: 62px;
+ height: 26px;
+ padding: 0 10px;
+ border-radius: 999px;
+ font-size: 12px;
+ font-weight: 800;
+}
+
+.tg-status.success {
+ background: rgba(35, 175, 92, 0.12);
+ color: #15824a;
+}
+
+.tg-status.pending {
+ background: rgba(255, 185, 0, 0.16);
+ color: #a56d00;
+}
+
+.tg-status.withdrawn {
+ background: rgba(16, 43, 106, 0.1);
+ color: var(--primary);
+}
+
+.tg-status.muted {
+ background: #eef1f6;
+ color: #667085;
+}
+
+.tg-rule-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 12px;
+ margin-top: 16px;
+}
+
+.tg-rule-item {
+ display: flex;
+ gap: 10px;
+ min-width: 0;
+ padding: 14px;
+ border: 1px solid var(--border-light);
+ border-radius: var(--radius-md);
+ background: #f8fafd;
+ color: var(--text-muted);
+ font-size: 13px;
+ line-height: 1.6;
+}
+
+.tg-rule-item b {
+ flex: 0 0 auto;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 26px;
+ height: 26px;
+ border-radius: 50%;
+ background: var(--primary);
+ color: #fff;
+ font-size: 12px;
+}
+
+.tg-modal-mask {
+ position: fixed;
+ inset: 0;
+ z-index: 1000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 20px;
+ background: rgba(8, 20, 48, 0.55);
+}
+
+.tg-modal {
+ position: relative;
+ width: 320px;
+ max-width: 100%;
+ padding: 24px;
+ border-radius: var(--radius-lg);
+ background: #fff;
+ box-shadow: 0 18px 50px rgba(10, 24, 60, 0.24);
+ text-align: center;
+}
+
+.tg-modal h3 {
+ color: var(--text-dark);
+ font-size: 18px;
+ font-weight: 900;
+}
+
+.tg-modal-close {
+ position: absolute;
+ top: 12px;
+ right: 12px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 30px;
+ height: 30px;
+ border: 1px solid var(--border-light);
+ border-radius: 50%;
+ background: #fff;
+ color: var(--text-muted);
+ cursor: pointer;
+ font-size: 18px;
+ line-height: 1;
+}
+
+.tg-qr-box {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 200px;
+ height: 200px;
+ margin: 18px auto 12px;
+ border: 1px solid var(--border-light);
+ border-radius: 12px;
+ background: #fff;
+}
+
+.tg-modal p {
+ margin-bottom: 16px;
+ color: var(--text-muted);
+ font-size: 13px;
+}
+
+@media (max-width: 1100px) {
+ .tg-hero,
+ .tg-stats,
+ .tg-rule-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}
+
+@media (max-width: 720px) {
+ .tg-hero,
+ .tg-stats,
+ .tg-rule-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .tg-card-head,
+ .tg-share-row {
+ flex-direction: column;
+ align-items: stretch;
+ }
+
+ .tg-segment {
+ justify-content: flex-start;
+ }
+}
diff --git a/public/css/usercenter-signin.css b/public/css/usercenter-signin.css
new file mode 100644
index 0000000..03b9910
--- /dev/null
+++ b/public/css/usercenter-signin.css
@@ -0,0 +1,116 @@
+.uc-btn-signin.is-signed,
+.uc-btn-signin:disabled {
+ cursor: not-allowed;
+ pointer-events: none;
+}
+
+#publishArticleBtn {
+ display: none;
+}
+
+.uc-edit-profile-panel {
+ padding: 22px 24px 24px;
+}
+
+.uc-edit-avatar-zone {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ margin-bottom: 18px;
+}
+
+.uc-edit-avatar-button {
+ border: 0;
+ background: transparent;
+ padding: 0;
+ cursor: pointer;
+}
+
+.uc-edit-avatar {
+ width: 86px;
+ height: 86px;
+ border-radius: 50%;
+ border: 3px solid var(--gold);
+ object-fit: cover;
+ box-shadow: 0 8px 24px rgba(253, 185, 51, 0.22);
+ display: block;
+}
+
+.uc-edit-avatar-tip {
+ color: var(--text-muted);
+ font-size: 12px;
+}
+
+.uc-edit-file-input {
+ display: none;
+}
+
+.uc-edit-field {
+ margin-bottom: 14px;
+}
+
+.uc-edit-field label {
+ display: block;
+ margin-bottom: 7px;
+ color: var(--primary);
+ font-size: 13px;
+ font-weight: 800;
+}
+
+.uc-edit-field input {
+ width: 100%;
+ height: 42px;
+ padding: 0 14px;
+ border: 1px solid var(--border-light);
+ border-radius: 21px;
+ background: var(--bg-light);
+ color: var(--text-dark);
+ font-size: 14px;
+ outline: none;
+ box-sizing: border-box;
+ transition: all 0.2s;
+}
+
+.uc-edit-field input:focus {
+ border-color: var(--primary);
+ background: #fff;
+ box-shadow: 0 0 0 3px rgba(16, 43, 106, 0.08);
+}
+
+.uc-edit-actions {
+ display: flex;
+ gap: 10px;
+ margin-top: 18px;
+}
+
+.uc-edit-submit,
+.uc-edit-cancel {
+ flex: 1;
+ height: 42px;
+ border-radius: 21px;
+ font-size: 14px;
+ font-weight: 800;
+ cursor: pointer;
+}
+
+.uc-edit-submit {
+ border: 0;
+ background: var(--primary);
+ color: #fff;
+}
+
+.uc-edit-cancel {
+ border: 1px solid var(--border-light);
+ background: #fff;
+ color: var(--text-dark);
+}
+
+.uc-edit-submit:disabled {
+ cursor: not-allowed;
+ opacity: 0.72;
+}
+
+.uc-edit-popup .layui-layer-content {
+ max-height: calc(100vh - 190px);
+}
diff --git a/public/css/usercenter.css b/public/css/usercenter.css
new file mode 100644
index 0000000..e8912fa
--- /dev/null
+++ b/public/css/usercenter.css
@@ -0,0 +1,963 @@
+/* ============================================================
+ usercenter.css - 用户中心页 (usercenter.html)
+ Comprehensive styles with responsive breakpoints
+ ============================================================ */
+
+/* === Container === */
+.uc-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 24px 20px 40px;
+}
+
+/* ============================================================
+ Profile Card
+ - White background with shadow
+ - Avatar on left, info in middle, actions on right
+ ============================================================ */
+.uc-profile-card {
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ padding: 32px;
+ display: flex;
+ align-items: center;
+ gap: 24px;
+ box-shadow: var(--shadow-md);
+ margin-bottom: 24px;
+ position: relative;
+ overflow: hidden;
+ border: 1px solid var(--border-light);
+}
+
+/* Decorative gradient strip along the top */
+.uc-profile-card::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 4px;
+ background: linear-gradient(90deg, var(--primary), var(--gold), var(--orange), var(--purple));
+}
+
+/* Decorative soft radial glow behind avatar area */
+.uc-profile-card::after {
+ content: '';
+ position: absolute;
+ top: 20px;
+ left: 20px;
+ width: 160px;
+ height: 160px;
+ background: radial-gradient(circle, rgba(16, 43, 106, 0.04) 0%, transparent 70%);
+ border-radius: 50%;
+ pointer-events: none;
+}
+
+/* --- Avatar --- */
+.uc-avatar-wrap {
+ position: relative;
+ z-index: 1;
+ flex-shrink: 0;
+}
+
+.uc-avatar {
+ width: 88px;
+ height: 88px;
+ border-radius: 50%;
+ border: 3px solid var(--gold);
+ object-fit: cover;
+ box-shadow: 0 4px 16px rgba(253, 185, 51, 0.25);
+ cursor: pointer;
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+ display: block;
+}
+
+.uc-avatar:hover {
+ transform: scale(1.06);
+ box-shadow: 0 6px 24px rgba(253, 185, 51, 0.4);
+}
+
+/* --- User Info --- */
+.uc-info {
+ flex: 1;
+ min-width: 0;
+ position: relative;
+ z-index: 1;
+}
+
+.uc-nickname {
+ font-size: 22px;
+ font-weight: 700;
+ color: var(--text-dark);
+ margin-bottom: 6px;
+ line-height: 1.3;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.uc-level {
+ display: inline-block;
+ background: linear-gradient(135deg, var(--gold), var(--orange));
+ color: var(--primary);
+ font-size: 12px;
+ font-weight: 700;
+ padding: 2px 14px;
+ border-radius: 12px;
+ margin-bottom: 8px;
+ letter-spacing: 0.5px;
+}
+
+.uc-phone {
+ font-size: 13px;
+ color: var(--text-muted);
+ line-height: 1.4;
+}
+
+/* --- Action Buttons --- */
+.uc-actions {
+ display: flex;
+ gap: 10px;
+ position: relative;
+ z-index: 1;
+ flex-shrink: 0;
+}
+
+.uc-btn {
+ padding: 9px 22px;
+ border-radius: 20px;
+ font-size: 13px;
+ font-weight: 600;
+ cursor: pointer;
+ border: none;
+ transition: all 0.3s ease;
+ white-space: nowrap;
+ outline: none;
+ line-height: 1.4;
+}
+
+.uc-btn:active {
+ transform: scale(0.97);
+}
+
+.uc-btn-signin {
+ background: linear-gradient(135deg, var(--gold), var(--orange));
+ color: var(--primary);
+}
+
+.uc-btn-signin:hover {
+ box-shadow: 0 4px 18px rgba(253, 185, 51, 0.45);
+ transform: translateY(-2px);
+}
+
+.uc-btn-signin:active {
+ transform: translateY(0) scale(0.97);
+}
+
+.uc-btn-edit {
+ background: var(--bg-light);
+ color: var(--primary);
+ border: 1px solid var(--border-light);
+}
+
+.uc-btn-edit:hover {
+ background: var(--primary);
+ color: var(--white);
+ border-color: var(--primary);
+ box-shadow: 0 4px 14px rgba(16, 43, 106, 0.2);
+ transform: translateY(-2px);
+}
+
+.uc-btn-logout2 {
+ background: transparent;
+ color: var(--text-muted);
+ border: 1px solid var(--border-light);
+}
+
+.uc-btn-logout2:hover {
+ background: var(--red);
+ color: var(--white);
+ border-color: var(--red);
+ box-shadow: 0 4px 14px rgba(231, 76, 60, 0.25);
+ transform: translateY(-2px);
+}
+
+.uc-btn-expert {
+ background: var(--bg-light);
+ color: var(--purple);
+ border: 1px solid rgba(123, 45, 142, 0.25);
+}
+
+.uc-btn-expert:hover {
+ background: linear-gradient(135deg, var(--purple), #9b59b6);
+ color: var(--white);
+ border-color: var(--purple);
+ box-shadow: 0 4px 14px rgba(123, 45, 142, 0.25);
+ transform: translateY(-2px);
+}
+
+.uc-btn-publish {
+ background: var(--bg-light);
+ color: var(--primary);
+ border: 1px solid rgba(16, 43, 106, 0.2);
+}
+
+.uc-btn-publish:hover {
+ background: linear-gradient(135deg, var(--primary), #3b6fd4);
+ color: var(--white);
+ border-color: var(--primary);
+ box-shadow: 0 4px 14px rgba(16, 43, 106, 0.25);
+ transform: translateY(-2px);
+}
+
+.uc-btn-collection {
+ background: var(--bg-light);
+ color: var(--gold);
+ border: 1px solid rgba(253, 185, 51, 0.25);
+}
+
+.uc-btn-collection:hover {
+ background: linear-gradient(135deg, var(--gold), var(--orange));
+ color: var(--white);
+ border-color: var(--gold);
+ box-shadow: 0 4px 14px rgba(253, 185, 51, 0.25);
+ transform: translateY(-2px);
+}
+
+.uc-btn-tuiguang {
+ background: var(--bg-light);
+ color: var(--red);
+ border: 1px solid rgba(231, 76, 60, 0.25);
+}
+
+.uc-btn-tuiguang:hover {
+ background: linear-gradient(135deg, var(--red), #e74c3c);
+ color: var(--white);
+ border-color: var(--red);
+ box-shadow: 0 4px 14px rgba(231, 76, 60, 0.25);
+ transform: translateY(-2px);
+}
+
+/* ============================================================
+ Balance Grid - 4 columns with colored icon badges
+ ============================================================ */
+.uc-balance-grid {
+ display: grid;
+ grid-template-columns: repeat(4, 1fr);
+ gap: 16px;
+ margin-bottom: 24px;
+}
+
+.uc-balance-item {
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ padding: 20px;
+ box-shadow: var(--shadow-sm);
+ transition: all 0.3s ease;
+ border: 1px solid var(--border-light);
+ position: relative;
+ overflow: hidden;
+}
+
+/* Subtle top accent line matching icon color */
+.uc-balance-item::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 3px;
+ background: var(--border-light);
+ transition: background 0.3s;
+}
+
+.uc-balance-item:nth-child(1)::before {
+ background: linear-gradient(90deg, var(--gold), var(--orange));
+}
+
+.uc-balance-item:nth-child(2)::before {
+ background: linear-gradient(90deg, var(--primary), #3b6fd4);
+}
+
+.uc-balance-item:nth-child(3)::before {
+ background: linear-gradient(90deg, var(--orange), var(--red));
+}
+
+.uc-balance-item:nth-child(4)::before {
+ background: linear-gradient(90deg, var(--purple), #9b59b6);
+}
+
+.uc-balance-item:hover {
+ box-shadow: var(--shadow-md);
+ transform: translateY(-3px);
+}
+
+.uc-balance-label {
+ font-size: 13px;
+ color: var(--text-muted);
+ margin-bottom: 10px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ font-weight: 500;
+}
+
+/* --- Balance Icon Badges --- */
+.balance-icon {
+ width: 26px;
+ height: 26px;
+ border-radius: 50%;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 12px;
+ font-weight: 800;
+ color: var(--white);
+ flex-shrink: 0;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.12);
+ letter-spacing: 0;
+ line-height: 1;
+}
+
+.uc-balance-value {
+ font-size: 28px;
+ font-weight: 700;
+ color: var(--primary);
+ line-height: 1.2;
+}
+
+.uc-balance-value span {
+ font-size: 14px;
+ font-weight: 400;
+ color: var(--text-muted);
+ margin-left: 4px;
+}
+
+.uc-balance-links {
+ margin-top: 12px;
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+}
+
+.uc-balance-links a {
+ font-size: 12px;
+ color: var(--primary);
+ text-decoration: none;
+ padding: 3px 12px;
+ border-radius: 12px;
+ background: rgba(16, 43, 106, 0.06);
+ transition: all 0.25s ease;
+ font-weight: 500;
+}
+
+.uc-balance-links a:hover {
+ background: var(--primary);
+ color: var(--white);
+ box-shadow: 0 2px 8px rgba(16, 43, 106, 0.2);
+}
+
+/* ============================================================
+ Section - white card wrapper for tables
+ ============================================================ */
+.uc-section {
+ background: var(--white);
+ border-radius: var(--radius-lg);
+ box-shadow: var(--shadow-sm);
+ margin-bottom: 24px;
+ overflow: hidden;
+ border: 1px solid var(--border-light);
+}
+
+.uc-section-header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 16px 20px;
+ border-bottom: 1px solid var(--border-light);
+ background: linear-gradient(90deg, rgba(16, 43, 106, 0.03) 0%, transparent 100%);
+}
+
+.uc-section-title {
+ font-size: 16px;
+ font-weight: 700;
+ color: var(--primary);
+ padding-left: 12px;
+ border-left: 4px solid var(--gold);
+ line-height: 1.3;
+}
+
+/* ============================================================
+ Filter Bar
+ ============================================================ */
+.uc-filter-bar {
+ display: flex;
+ gap: 12px;
+ align-items: center;
+ flex-wrap: wrap;
+ padding: 14px 20px;
+ border-bottom: 1px solid var(--border-light);
+ background: var(--bg-light);
+}
+
+.uc-filter-bar label {
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--text-dark);
+ margin-right: 2px;
+ white-space: nowrap;
+}
+
+.uc-filter-bar select {
+ padding: 7px 12px;
+ border-radius: var(--radius-md);
+ border: 1px solid var(--border-light);
+ font-size: 13px;
+ color: var(--text-dark);
+ outline: none;
+ background: var(--white);
+ min-width: 110px;
+ transition: border-color 0.25s;
+ cursor: pointer;
+}
+
+.uc-filter-bar select:focus {
+ border-color: var(--primary);
+ box-shadow: 0 0 0 3px rgba(16, 43, 106, 0.08);
+}
+
+.uc-filter-btn {
+ padding: 7px 24px;
+ border-radius: var(--radius-md);
+ font-size: 13px;
+ cursor: pointer;
+ border: none;
+ background: var(--primary);
+ color: var(--white);
+ font-weight: 600;
+ transition: all 0.3s ease;
+ white-space: nowrap;
+}
+
+.uc-filter-btn:hover {
+ box-shadow: 0 3px 12px rgba(16, 43, 106, 0.3);
+ transform: translateY(-1px);
+}
+
+.uc-filter-btn:active {
+ transform: translateY(0) scale(0.98);
+}
+
+/* ============================================================
+ Data Table - clean with alternating rows
+ ============================================================ */
+.uc-table {
+ width: 100%;
+ border-collapse: collapse;
+}
+
+.uc-table thead {
+ background: linear-gradient(135deg, #f0f3fa 0%, #e8ecf5 100%);
+}
+
+.uc-table th {
+ padding: 13px 16px;
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--primary);
+ text-align: left;
+ white-space: nowrap;
+ border-bottom: 2px solid rgba(16, 43, 106, 0.08);
+}
+
+.uc-table td {
+ padding: 13px 16px;
+ font-size: 13px;
+ color: var(--text-dark);
+ border-bottom: 1px solid var(--border-light);
+ vertical-align: middle;
+ line-height: 1.5;
+}
+
+/* Alternating row background */
+.uc-table tbody tr:nth-child(even) td {
+ background: rgba(244, 246, 251, 0.5);
+}
+
+.uc-table tbody tr {
+ transition: background 0.2s;
+}
+
+.uc-table tbody tr:hover td {
+ background: rgba(16, 43, 106, 0.04);
+}
+
+.uc-table a {
+ color: var(--primary);
+ text-decoration: none;
+ transition: color 0.2s;
+}
+
+.uc-table a:hover {
+ color: var(--orange);
+}
+
+/* Empty state row */
+.uc-table td[colspan] {
+ text-align: center;
+ color: var(--text-muted);
+ padding: 30px 16px;
+ font-size: 14px;
+}
+
+/* ============================================================
+ Pagination
+ ============================================================ */
+.uc-pagination {
+ padding: 16px 20px;
+ display: flex;
+ justify-content: center;
+ border-top: 1px solid var(--border-light);
+}
+
+/* Layui page override for consistent look */
+.uc-pagination .layui-laypage {
+ margin: 0;
+}
+
+.uc-pagination .layui-laypage a,
+.uc-pagination .layui-laypage span {
+ border-radius: 6px;
+ margin: 0 2px;
+}
+
+/* ============================================================
+ Edit Profile Popup (layui layer dialog)
+ ============================================================ */
+.uc-edit-popup {
+ border-radius: var(--radius-lg) !important;
+ overflow: hidden;
+}
+
+/* Title bar */
+.uc-edit-popup .layui-layer-title {
+ background: linear-gradient(90deg, var(--primary), var(--primary-light)) !important;
+ color: var(--white) !important;
+ font-weight: 700 !important;
+ font-size: 15px !important;
+ border-bottom: none !important;
+ height: 46px !important;
+ line-height: 46px !important;
+ padding: 0 20px !important;
+}
+
+/* Close button */
+.uc-edit-popup .layui-layer-ico.layui-layer-close1 {
+ top: 12px !important;
+ right: 12px !important;
+ filter: brightness(3);
+}
+
+/* Content area */
+.uc-edit-popup .layui-layer-content {
+ padding: 0;
+}
+
+/* --- Edit Avatar --- */
+.uc-edit-avatar {
+ width: 84px;
+ height: 84px;
+ border-radius: 50%;
+ border: 3px solid var(--gold);
+ object-fit: cover;
+ cursor: pointer;
+ display: block;
+ margin: 0 auto 8px;
+ box-shadow: 0 4px 16px rgba(253, 185, 51, 0.25);
+ transition: transform 0.3s, box-shadow 0.3s;
+}
+
+.uc-edit-avatar:hover {
+ transform: scale(1.06);
+ box-shadow: 0 6px 24px rgba(253, 185, 51, 0.4);
+}
+
+/* --- Edit Form Fields --- */
+.uc-edit-field {
+ margin-bottom: 18px;
+}
+
+.uc-edit-field label {
+ display: block;
+ font-size: 13px;
+ font-weight: 600;
+ color: var(--primary);
+ margin-bottom: 6px;
+}
+
+.uc-edit-field input[type="text"],
+.uc-edit-field input[type="password"] {
+ width: 100%;
+ height: 42px;
+ padding: 0 14px;
+ font-size: 14px;
+ border: 2px solid var(--border-light);
+ border-radius: var(--radius-md);
+ outline: none;
+ transition: all 0.3s ease;
+ background: var(--bg-light);
+ color: var(--text-dark);
+}
+
+.uc-edit-field input:focus {
+ border-color: var(--primary);
+ background: var(--white);
+ box-shadow: 0 0 0 3px rgba(16, 43, 106, 0.08);
+}
+
+.uc-edit-field input::placeholder {
+ color: var(--text-muted);
+ opacity: 0.7;
+}
+
+/* Save button inside popup */
+.uc-edit-popup .uc-filter-btn {
+ width: 100%;
+ height: 44px;
+ font-size: 15px;
+ margin-top: 8px;
+ border-radius: var(--radius-md);
+}
+
+/* ============================================================
+ Responsive - Tablet (max-width: 1024px)
+ ============================================================ */
+@media (max-width: 1024px) {
+ .uc-container {
+ padding: 20px 16px 32px;
+ }
+
+ .uc-profile-card {
+ padding: 24px;
+ gap: 20px;
+ }
+
+ .uc-avatar {
+ width: 76px;
+ height: 76px;
+ }
+
+ .uc-nickname {
+ font-size: 20px;
+ }
+
+ .uc-balance-grid {
+ gap: 12px;
+ }
+
+ .uc-balance-item {
+ padding: 16px;
+ }
+
+ .uc-balance-value {
+ font-size: 24px;
+ }
+
+ .uc-table th,
+ .uc-table td {
+ padding: 11px 12px;
+ font-size: 13px;
+ }
+}
+
+/* ============================================================
+ Responsive - Mobile (max-width: 768px)
+ ============================================================ */
+@media (max-width: 768px) {
+ .uc-container {
+ padding: 16px 12px 28px;
+ }
+
+ /* Profile card stacks vertically */
+ .uc-profile-card {
+ flex-direction: column;
+ text-align: center;
+ padding: 28px 20px 24px;
+ gap: 16px;
+ }
+
+ .uc-profile-card::after {
+ left: 50%;
+ transform: translateX(-50%);
+ top: 10px;
+ width: 120px;
+ height: 120px;
+ }
+
+ .uc-avatar-wrap {
+ display: flex;
+ justify-content: center;
+ }
+
+ .uc-avatar {
+ width: 72px;
+ height: 72px;
+ }
+
+ .uc-nickname {
+ font-size: 18px;
+ text-align: center;
+ }
+
+ .uc-info {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ }
+
+ .uc-phone {
+ text-align: center;
+ }
+
+ .uc-actions {
+ justify-content: center;
+ flex-wrap: wrap;
+ gap: 8px;
+ }
+
+ .uc-btn {
+ padding: 8px 16px;
+ font-size: 12px;
+ }
+
+ /* Balance grid becomes 2 columns */
+ .uc-balance-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 10px;
+ }
+
+ .uc-balance-item {
+ padding: 14px;
+ }
+
+ .uc-balance-value {
+ font-size: 22px;
+ }
+
+ .uc-balance-label {
+ font-size: 12px;
+ gap: 6px;
+ }
+
+ .balance-icon {
+ width: 22px;
+ height: 22px;
+ font-size: 11px;
+ }
+
+ .uc-balance-links {
+ margin-top: 8px;
+ gap: 6px;
+ }
+
+ .uc-balance-links a {
+ font-size: 11px;
+ padding: 2px 8px;
+ }
+
+ /* Section adjustments */
+ .uc-section-header {
+ padding: 12px 14px;
+ }
+
+ .uc-section-title {
+ font-size: 15px;
+ }
+
+ /* Filter bar stacks */
+ .uc-filter-bar {
+ padding: 12px 14px;
+ gap: 8px;
+ }
+
+ .uc-filter-bar select {
+ min-width: 90px;
+ padding: 6px 8px;
+ font-size: 12px;
+ }
+
+ .uc-filter-btn {
+ padding: 6px 16px;
+ font-size: 12px;
+ }
+
+ /* Table adjustments */
+ .uc-table th,
+ .uc-table td {
+ padding: 10px 8px;
+ font-size: 12px;
+ }
+
+ .uc-pagination {
+ padding: 12px 14px;
+ }
+}
+
+/* ============================================================
+ Responsive - Small Mobile (max-width: 480px)
+ ============================================================ */
+@media (max-width: 480px) {
+ .uc-container {
+ padding: 12px 10px 24px;
+ }
+
+ .uc-profile-card {
+ padding: 24px 16px 20px;
+ }
+
+ .uc-avatar {
+ width: 64px;
+ height: 64px;
+ border-width: 2px;
+ }
+
+ .uc-nickname {
+ font-size: 17px;
+ }
+
+ .uc-level {
+ font-size: 11px;
+ padding: 1px 10px;
+ }
+
+ .uc-actions {
+ flex-direction: column;
+ gap: 6px;
+ width: 100%;
+ }
+
+ .uc-btn {
+ width: 100%;
+ text-align: center;
+ justify-content: center;
+ }
+
+ /* Balance grid stays 2 columns but tighter */
+ .uc-balance-grid {
+ grid-template-columns: repeat(2, 1fr);
+ gap: 8px;
+ }
+
+ .uc-balance-item {
+ padding: 12px;
+ }
+
+ .uc-balance-value {
+ font-size: 20px;
+ }
+
+ .uc-balance-value span {
+ font-size: 12px;
+ }
+
+ .balance-icon {
+ width: 20px;
+ height: 20px;
+ font-size: 10px;
+ }
+
+ .uc-balance-links a {
+ font-size: 11px;
+ padding: 2px 6px;
+ }
+
+ /* Table horizontal scroll */
+ .uc-section {
+ overflow-x: auto;
+ -webkit-overflow-scrolling: touch;
+ }
+
+ .uc-table {
+ min-width: 500px;
+ }
+
+ .uc-filter-bar {
+ gap: 6px;
+ }
+
+ .uc-filter-bar select {
+ flex: 1;
+ min-width: 0;
+ }
+
+ /* Edit popup responsive */
+ .uc-edit-popup {
+ width: 92vw !important;
+ max-width: 400px !important;
+ }
+
+ .uc-edit-avatar {
+ width: 72px;
+ height: 72px;
+ }
+}
+
+/* ============================================================
+ Animations & Utilities
+ ============================================================ */
+
+/* Fade-in for balance items on load */
+@keyframes ucFadeInUp {
+ from {
+ opacity: 0;
+ transform: translateY(16px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+.uc-balance-item {
+ animation: ucFadeInUp 0.4s ease both;
+}
+
+.uc-balance-item:nth-child(1) { animation-delay: 0.05s; }
+.uc-balance-item:nth-child(2) { animation-delay: 0.1s; }
+.uc-balance-item:nth-child(3) { animation-delay: 0.15s; }
+.uc-balance-item:nth-child(4) { animation-delay: 0.2s; }
+
+/* Subtle pulse on sign-in button to draw attention */
+@keyframes ucPulse {
+ 0%, 100% {
+ box-shadow: 0 0 0 0 rgba(253, 185, 51, 0.4);
+ }
+ 50% {
+ box-shadow: 0 0 0 8px rgba(253, 185, 51, 0);
+ }
+}
+
+.uc-btn-signin {
+ animation: ucPulse 2.5s infinite;
+}
+
+.uc-btn-signin:hover {
+ animation: none;
+}
+
+/* Respect reduced motion */
+@media (prefers-reduced-motion: reduce) {
+ .uc-balance-item,
+ .uc-btn-signin {
+ animation: none;
+ }
+
+ .uc-avatar,
+ .uc-edit-avatar,
+ .uc-balance-item,
+ .uc-btn,
+ .uc-balance-links a,
+ .uc-filter-btn {
+ transition: none;
+ }
+}
diff --git a/public/img/auth-login-bg.png b/public/img/auth-login-bg.png
new file mode 100644
index 0000000..1a59c36
Binary files /dev/null and b/public/img/auth-login-bg.png differ
diff --git a/public/img/cgcp.png b/public/img/cgcp.png
new file mode 100644
index 0000000..9535154
Binary files /dev/null and b/public/img/cgcp.png differ
diff --git a/public/img/cgtc.png b/public/img/cgtc.png
new file mode 100644
index 0000000..9966f64
Binary files /dev/null and b/public/img/cgtc.png differ
diff --git a/public/img/kfqq.jpg b/public/img/kfqq.jpg
new file mode 100644
index 0000000..bf878e6
Binary files /dev/null and b/public/img/kfqq.jpg differ
diff --git a/public/img/kfwx.jpg b/public/img/kfwx.jpg
new file mode 100644
index 0000000..3ce628e
Binary files /dev/null and b/public/img/kfwx.jpg differ
diff --git a/public/img/lxkf.png b/public/img/lxkf.png
new file mode 100644
index 0000000..af0286d
Binary files /dev/null and b/public/img/lxkf.png differ
diff --git a/public/img/pay-alipay.png b/public/img/pay-alipay.png
new file mode 100644
index 0000000..64d2dd3
Binary files /dev/null and b/public/img/pay-alipay.png differ
diff --git a/public/img/pay-bank.png b/public/img/pay-bank.png
new file mode 100644
index 0000000..8e4da82
Binary files /dev/null and b/public/img/pay-bank.png differ
diff --git a/public/img/pay-expert.png b/public/img/pay-expert.png
new file mode 100644
index 0000000..60c2b42
Binary files /dev/null and b/public/img/pay-expert.png differ
diff --git a/public/img/pay-frozen.png b/public/img/pay-frozen.png
new file mode 100644
index 0000000..604ed3a
Binary files /dev/null and b/public/img/pay-frozen.png differ
diff --git a/public/img/pay-other.png b/public/img/pay-other.png
new file mode 100644
index 0000000..c13ab92
Binary files /dev/null and b/public/img/pay-other.png differ
diff --git a/public/img/pay-sales.png b/public/img/pay-sales.png
new file mode 100644
index 0000000..862b105
Binary files /dev/null and b/public/img/pay-sales.png differ
diff --git a/public/img/pay-wallet.png b/public/img/pay-wallet.png
new file mode 100644
index 0000000..d8eeeec
Binary files /dev/null and b/public/img/pay-wallet.png differ
diff --git a/public/img/pay-wechat.png b/public/img/pay-wechat.png
new file mode 100644
index 0000000..c0a4d6e
Binary files /dev/null and b/public/img/pay-wechat.png differ
diff --git a/public/img/sousuo.png b/public/img/sousuo.png
new file mode 100644
index 0000000..9930a61
Binary files /dev/null and b/public/img/sousuo.png differ
diff --git a/public/img/tool.png b/public/img/tool.png
new file mode 100644
index 0000000..d2b700b
Binary files /dev/null and b/public/img/tool.png differ
diff --git a/public/img/userimg.png b/public/img/userimg.png
new file mode 100644
index 0000000..a9ab7b4
Binary files /dev/null and b/public/img/userimg.png differ
diff --git a/public/img/wendang.png b/public/img/wendang.png
new file mode 100644
index 0000000..1b508c5
Binary files /dev/null and b/public/img/wendang.png differ
diff --git a/public/js/fufei-3dyjs-publish.js b/public/js/fufei-3dyjs-publish.js
new file mode 100644
index 0000000..61fa1e9
--- /dev/null
+++ b/public/js/fufei-3dyjs-publish.js
@@ -0,0 +1,963 @@
+const $ = layui.$;
+ // 全局变量
+ let gmjldata = []; // 转换后的扁平数组
+ let originalData = []; // 原始树形数据
+ let qishuok = {}; // 期号数据
+ let selectedLotteryPath = [];
+ let selectedLotteryIds = [];
+ let currentIssue = ""; // 当前期号
+ let currentPayPublishOptions = null;
+ let currentPayPicker = null;
+ let isSubmittingPayArticle = false;
+ let selections = [];
+ let stepsConfig = [];
+ const REQUIRED_DAILY_FREE_ARTICLES = 2;
+ // 页面加载完成后获取首页信息
+ layui.$(document).ready(function () {
+ CommonUtil.loadPageConfig({ ads: false, links: false });
+ checkPaidPublishPermission().then(function (result) {
+ if (!result.canPaid) {
+ layui.layer.alert(result.reason || "暂无付费文章发布权限。", {
+ title: "暂无权限",
+ });
+ $(".mianfeiThreeSelect").addClass("is-disabled");
+ $("#gmjl").prop("disabled", true);
+ return;
+ }
+
+ loadLotteryData();
+ });
+ });
+
+ // 判断布尔字段,兼容后端可能返回的 1/true/"true"。
+ function isTruthy(value) {
+ return (
+ value === true ||
+ value === 1 ||
+ value === "1" ||
+ String(value).toLowerCase() === "true"
+ );
+ }
+
+ function padDatePart(value) {
+ return String(value).padStart(2, "0");
+ }
+
+ function formatLocalDate(date) {
+ return (
+ date.getFullYear() +
+ "-" +
+ padDatePart(date.getMonth() + 1) +
+ "-" +
+ padDatePart(date.getDate())
+ );
+ }
+
+ function getArticleDateText(value) {
+ if (!value) return "";
+ if (typeof value === "number") {
+ const numericDate = new Date(value);
+ return isNaN(numericDate.getTime())
+ ? ""
+ : formatLocalDate(numericDate);
+ }
+
+ const text = String(value).trim();
+ const match = text.match(/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})/);
+ if (match) {
+ return (
+ match[1] + "-" + padDatePart(match[2]) + "-" + padDatePart(match[3])
+ );
+ }
+
+ const parsedDate = new Date(text.replace(/-/g, "/"));
+ return isNaN(parsedDate.getTime()) ? "" : formatLocalDate(parsedDate);
+ }
+
+ function isPublishedFreeArticle(item) {
+ if (!item) return false;
+
+ const statusText = String(
+ item.statusText ||
+ item.auditStatusText ||
+ item.publishStatusText ||
+ item.stateText ||
+ "",
+ ).toLowerCase();
+ if (/已发布|审核通过|通过|published|approved|pass/.test(statusText)) {
+ return true;
+ }
+
+ const status =
+ item.status != null
+ ? item.status
+ : item.auditStatus != null
+ ? item.auditStatus
+ : item.publishStatus;
+ return status === true || status === 1 || status === "1";
+ }
+
+ function getTodayPublishedFreeCount(rows) {
+ const today = formatLocalDate(new Date());
+ return ApiClient.asArray(rows).filter(function (item) {
+ const articleDate = getArticleDateText(
+ item.createTime ||
+ item.create_time ||
+ item.publishTime ||
+ item.publish_time ||
+ item.auditTime ||
+ item.audit_time ||
+ item.updateTime ||
+ item.update_time ||
+ item.createdAt,
+ );
+ return articleDate === today && isPublishedFreeArticle(item);
+ }).length;
+ }
+
+ function loadTodayPublishedFreeCount() {
+ return ApiClient.get(ApiClient.API.mineFreeArticleList, {
+ pageNum: 1,
+ pageSize: 100,
+ })
+ .then(function (res) {
+ if (!ApiClient.isSuccess(res)) return 0;
+
+ const data = res.data || res;
+ const rows = ApiClient.asArray(
+ data.rows || data.records || data.list || data.data || data,
+ );
+ return getTodayPublishedFreeCount(rows);
+ })
+ .catch(function () {
+ return 0;
+ });
+ }
+
+ // 付费文章发布权限:专家身份 + 当天 2 篇审核通过/已发布的免费文章。
+ function checkPaidPublishPermission() {
+ return ApiClient.get(ApiClient.API.mineSummary)
+ .then(function (res) {
+ if (!ApiClient.isSuccess(res) || !res.data) {
+ return { canPaid: false, reason: "暂时无法获取发布权限。" };
+ }
+
+ const status = String(
+ res.data.expertStatus || res.data.expert_status || "",
+ ).toLowerCase();
+ const hasExpertIdentity =
+ isTruthy(res.data.is_expert) ||
+ isTruthy(res.data.isExpert) ||
+ isTruthy(res.data.expert) ||
+ isTruthy(res.data.is_regular_expert) ||
+ isTruthy(res.data.isRegularExpert) ||
+ isTruthy(res.data.regularExpert) ||
+ isTruthy(res.data.internExpert) ||
+ isTruthy(res.data.isInternExpert) ||
+ /实习|intern|trial|正式|regular|formal/.test(status);
+
+ if (!hasExpertIdentity) {
+ return { canPaid: false, reason: "专家才能发布付费文章。" };
+ }
+
+ return loadTodayPublishedFreeCount().then(function (count) {
+ return {
+ canPaid: count >= REQUIRED_DAILY_FREE_ARTICLES,
+ reason:
+ count >= REQUIRED_DAILY_FREE_ARTICLES
+ ? ""
+ : "今天需先发布2篇审核通过的免费文章后,才能发布付费文章(当前" +
+ count +
+ "篇)。",
+ };
+ });
+ })
+ .catch(function () {
+ return { canPaid: false, reason: "暂时无法获取发布权限。" };
+ });
+ }
+
+ // 加载彩种数据
+ async function loadLotteryData() {
+ try {
+ console.log("开始加载彩种数据...");
+
+ const response = await ApiClient.get(ApiClient.API.homeNav);
+ console.log("API返回的原始数据:", response);
+
+ if (
+ response.code === 0 &&
+ response.data &&
+ Array.isArray(response.data)
+ ) {
+ originalData = await preparePayPublishMenuTree(response.data);
+
+ // 1. 转换树形结构为适合selectY2的扁平数组
+ gmjldata = convertTreeToFlatArray(originalData);
+ console.log("转换后的扁平数组:", gmjldata);
+
+ // 2. 初始化期号数据
+ initIssueData(originalData);
+
+ // 3. 初始化LayUI组件
+ initLayuiComponents();
+ } else {
+ throw new Error(response.msg || "获取数据失败");
+ }
+ } catch (error) {
+ console.error("加载彩种数据失败:", error);
+ layui.layer.msg("加载彩种数据失败: " + error.message, { icon: 2 });
+ }
+ }
+
+ // 转换树形结构为扁平数组
+ function convertTreeToFlatArray(treeData) {
+ const excludeNames = [
+ "首页",
+ "专家推荐",
+ "断组",
+ "杀组合",
+ "断组1",
+ "杀组合1",
+ "断组2",
+ "杀组合2",
+ "组三",
+ "组六",
+ ];
+ let flatArray = [];
+
+ // 递归遍历树形数据
+ function traverse(node, parentId = 0) {
+ const nodeId = getMenuNodeId(node);
+ const nodeName = getMenuNodeName(node);
+ const children = getMenuNodeChildren(node);
+
+ // 检查当前节点名称是否在排除列表中
+ if (!nodeId || !nodeName || excludeNames.includes(nodeName)) {
+ return; // 跳过这个节点及其子节点
+ }
+
+ // 添加当前节点到扁平数组
+ flatArray.push({
+ id: nodeId,
+ pid: parentId,
+ name: nodeName,
+ code: node.code || node.lotteryCode || "",
+ });
+
+ // 如果有子节点,递归处理
+ if (children && Array.isArray(children)) {
+ children.forEach((child) => {
+ traverse(child, nodeId);
+ });
+ }
+ }
+
+ // 遍历整个树
+ if (Array.isArray(treeData)) {
+ treeData.forEach((rootNode) => {
+ traverse(rootNode, 0);
+ });
+ }
+
+ return flatArray;
+ }
+
+ function getMenuNodeId(node) {
+ return node && (node.id || node.menuId || node.value);
+ }
+
+ function getMenuNodeName(node) {
+ return String(
+ (node && (node.name || node.menuName || node.title || node.label)) ||
+ "",
+ ).trim();
+ }
+
+ function getMenuNodeChildren(node) {
+ return ApiClient.asArray(
+ node && (node.children || node.childList || node.list),
+ );
+ }
+
+ function isFixedPublishNav(node) {
+ const name = getMenuNodeName(node);
+ const path = String(
+ (node && (node.path || node.url || node.href)) || "",
+ ).trim();
+
+ return (
+ ["首页", "专家推荐"].includes(name) ||
+ /(^|\/)(index|zhuanjia)\.html/i.test(path)
+ );
+ }
+
+ function normalizeMenuChildren(node, children) {
+ node.children = ApiClient.asArray(children);
+ return node.children;
+ }
+
+ function loadMenuChildrenForNode(node, depth) {
+ if (!node || depth <= 0) {
+ return Promise.resolve(node);
+ }
+
+ const existingChildren = getMenuNodeChildren(node);
+ const menuId = getMenuNodeId(node);
+ const childrenPromise =
+ existingChildren.length || !menuId
+ ? Promise.resolve(existingChildren)
+ : ApiClient.get(ApiClient.API.menuChildren(menuId))
+ .then(function (res) {
+ return ApiClient.asArray(
+ res.data || res.rows || res.records || res.list || res,
+ );
+ })
+ .catch(function () {
+ return [];
+ });
+
+ return childrenPromise.then(function (children) {
+ normalizeMenuChildren(node, children);
+ return Promise.all(
+ node.children.map(function (child) {
+ return loadMenuChildrenForNode(child, depth - 1);
+ }),
+ ).then(function () {
+ return node;
+ });
+ });
+ }
+
+ function preparePayPublishMenuTree(navList) {
+ const lotteryList = ApiClient.asArray(navList).filter(function (item) {
+ return !isFixedPublishNav(item);
+ });
+
+ return Promise.all(
+ lotteryList.map(function (item) {
+ return loadMenuChildrenForNode(item, 2);
+ }),
+ ).then(function () {
+ return lotteryList;
+ });
+ }
+
+ // 初始化期号数据
+ function initIssueData(data) {
+ // 从原始数据中提取期号信息
+ data.forEach((lottery) => {
+ const lotteryId = getMenuNodeId(lottery);
+ if (lottery.lotteryResult && lottery.lotteryResult.expect) {
+ qishuok[lotteryId] = lottery.lotteryResult.expect;
+ } else if (lottery.expect || lottery.issue) {
+ qishuok[lotteryId] = lottery.expect || lottery.issue;
+ }
+ });
+
+ console.log("期号数据:", qishuok);
+ }
+
+ function formatPayMoney(value) {
+ return Number(value || 0).toFixed(2) + "元";
+ }
+
+ function updatePayTitleCount() {
+ const value = $("#payTitle").val() || "";
+ $("#payTitleCount").text(value.length + "/100");
+ }
+
+ $(document).on("input", "#payTitle", updatePayTitleCount);
+
+ function initNumberSelector(config) {
+ stepsConfig = Array.isArray(config) ? config : [];
+ selections = Array(stepsConfig.length).fill(null);
+ updateNumberSelectorUI();
+ }
+
+ function initNumberPool() {
+ const numberPool = document.getElementById("numberPool");
+ if (!numberPool) {
+ return;
+ }
+
+ numberPool.innerHTML = "";
+ if (!stepsConfig.length) {
+ return;
+ }
+
+ stepsConfig.forEach(function (step, stepIndex) {
+ const stepContainer = document.createElement("div");
+ stepContainer.className = "mianfeiThreeTextRedballBox";
+ stepContainer.innerHTML = `
+
+ ${step.name}(选择 ${step.requiredCount} 个)
+
+
+ `;
+
+ numberPool.appendChild(stepContainer);
+ renderStepNumbers(step, stepIndex);
+ });
+ }
+
+ function renderStepNumbers(step, stepIndex) {
+ const stepNumberPool = document.getElementById("step-" + stepIndex);
+ if (!stepNumberPool || !Array.isArray(step.numberRange)) {
+ return;
+ }
+
+ step.numberRange.forEach(function (number) {
+ const text =
+ number !== "" && !isNaN(Number(number)) && Number(number) < 10
+ ? "0" + Number(number)
+ : String(number);
+ const numberElement = document.createElement("div");
+
+ numberElement.className = step.class;
+ numberElement.textContent = text;
+ numberElement.dataset.number = text;
+ numberElement.dataset.step = stepIndex;
+
+ const currentSelection = selections[stepIndex] || { numbers: [] };
+ if (
+ currentSelection.numbers.includes(normalizeSelectedNumber(text))
+ ) {
+ numberElement.classList.add(step.classok);
+ }
+
+ numberElement.addEventListener("click", function () {
+ toggleNumberSelection(numberElement, step.classok);
+ });
+
+ stepNumberPool.appendChild(numberElement);
+ });
+ }
+
+ function normalizeSelectedNumber(value) {
+ const text = String(value);
+ return text !== "" && !isNaN(Number(text)) ? Number(text) : text;
+ }
+
+ function toggleNumberSelection(numberElement, selectedClass) {
+ const stepIndex = Number(numberElement.dataset.step);
+ const number = normalizeSelectedNumber(numberElement.dataset.number);
+ const step = stepsConfig[stepIndex];
+ const currentSelection = selections[stepIndex] || { numbers: [] };
+
+ if (!step) {
+ return;
+ }
+
+ if (numberElement.classList.contains(selectedClass)) {
+ numberElement.classList.remove(selectedClass);
+ currentSelection.numbers = currentSelection.numbers.filter(
+ function (item) {
+ return item !== number;
+ },
+ );
+ } else {
+ if (!step.allowMultiple) {
+ clearStepSelection(stepIndex, selectedClass);
+ currentSelection.numbers = [];
+ }
+
+ if (
+ step.allowMultiple &&
+ currentSelection.numbers.length >= step.requiredCount
+ ) {
+ showNumberMessage(
+ "本步骤最多只能选择 " + step.requiredCount + " 个数字",
+ );
+ return;
+ }
+
+ numberElement.classList.add(selectedClass);
+ currentSelection.numbers.push(number);
+ }
+
+ selections[stepIndex] = currentSelection;
+ showFinalResult();
+ }
+
+ function clearStepSelection(stepIndex, selectedClass) {
+ document
+ .querySelectorAll('[data-step="' + stepIndex + '"]')
+ .forEach(function (element) {
+ element.classList.remove(selectedClass);
+ });
+ }
+
+ function showFinalResult() {
+ xzok(selections);
+ }
+
+ function resetNumberSelector() {
+ const doReset = function () {
+ selections = Array(stepsConfig.length).fill(null);
+ updateNumberSelectorUI();
+ };
+
+ if (layui.layer) {
+ layui.layer.confirm(
+ "确定要重置所有选择吗?",
+ { icon: 3, title: "提示" },
+ function (index) {
+ doReset();
+ layui.layer.close(index);
+ },
+ );
+ return;
+ }
+
+ doReset();
+ }
+
+ function updateNumberSelectorUI() {
+ initNumberPool();
+ showFinalResult();
+ }
+
+ function showNumberMessage(message) {
+ if (layui.layer) {
+ layui.layer.msg(message);
+ return;
+ }
+
+ console.warn(message);
+ }
+
+ $(document).on("click", "#resetBtn", resetNumberSelector);
+
+ function renderPayPublishOptions(data) {
+ currentPayPublishOptions = data || {};
+ currentPayPicker = currentPayPublishOptions.picker || null;
+ const issue = currentPayPublishOptions.issue || $("#qi").val() || "";
+ const code = currentPayPublishOptions.code || "";
+
+ $("#qi").val(issue);
+ $("#qihao").text(issue || "--");
+ $("#expectInput").val(issue || "");
+ $("#expectText").text(issue || "选择方案后自动获取");
+ $("#payCode").val(code);
+ $("#priceInput").val(currentPayPublishOptions.priceCount1 || 0);
+ $("#priceText").text(currentPayPublishOptions.priceCount1 || 0);
+
+ const priceLines = [
+ "价格:" +
+ formatPayMoney(currentPayPublishOptions.priceCount1) +
+ ",服务费:" +
+ formatPayMoney(currentPayPublishOptions.priceCount1Cost),
+ ];
+
+ if (
+ currentPayPublishOptions.pointDeduction != null ||
+ currentPayPublishOptions.pointMaxDeduction != null
+ ) {
+ priceLines.push(
+ "积分抵扣:" +
+ (currentPayPublishOptions.pointDeduction || 0) +
+ ",最多:" +
+ formatPayMoney(currentPayPublishOptions.pointMaxDeduction),
+ );
+ }
+
+ $("#payPriceInfo").html(priceLines.join("
"));
+ applyPayPickerConfig(currentPayPicker);
+ }
+
+ function normalizePayBallValue(value) {
+ const text = String(value);
+ return text !== "" && !isNaN(Number(text)) ? Number(text) : text;
+ }
+
+ function applyPayPickerConfig(picker) {
+ const groups = Array.isArray(picker && picker.groups)
+ ? picker.groups
+ : [];
+ if (!groups.length || typeof initNumberSelector !== "function") {
+ return;
+ }
+
+ const apiStepsConfig = groups.map(function (group) {
+ const min = Number(group.minSelect || 0);
+ const max = Number(group.maxSelect || min || 1);
+ return {
+ name: group.name || group.key || "号码选择",
+ numberRange: ApiClient.asArray(group.balls).map(
+ normalizePayBallValue,
+ ),
+ allowMultiple: max > 1,
+ class: group.color === "blue" ? "Blueball" : "Redball",
+ classok: group.color === "blue" ? "BlueSelected" : "selected",
+ requiredCount: max,
+ minSelect: min,
+ maxSelect: max,
+ joiner: group.joiner,
+ key: group.key,
+ sortSelected: group.sortSelected,
+ };
+ });
+
+ initNumberSelector(apiStepsConfig);
+ }
+
+ function validatePayPickerSelection(currentSelections) {
+ if (!currentPayPicker || !Array.isArray(currentPayPicker.groups)) {
+ return true;
+ }
+
+ for (let index = 0; index < currentPayPicker.groups.length; index++) {
+ const group = currentPayPicker.groups[index];
+ const selected =
+ currentSelections[index] &&
+ Array.isArray(currentSelections[index].numbers)
+ ? currentSelections[index].numbers
+ : [];
+ const min = Number(group.minSelect || 0);
+ const max = Number(group.maxSelect || min);
+
+ if (selected.length < min || selected.length > max) {
+ layer.alert(
+ (group.name || "当前分组") +
+ "需要选择" +
+ (min === max ? min : min + "-" + max) +
+ "个",
+ );
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function buildPayPredictedCode(currentSelections) {
+ if (!currentPayPicker || !Array.isArray(currentPayPicker.groups)) {
+ return $("#vv").val();
+ }
+
+ const groups = currentPayPicker.groups;
+ const defaultJoiner = currentPayPicker.joiner || ",";
+ const groupJoiner = currentPayPicker.groupJoiner || "+";
+ const groupTexts = groups.map(function (group, index) {
+ let values =
+ currentSelections[index] &&
+ Array.isArray(currentSelections[index].numbers)
+ ? currentSelections[index].numbers.slice()
+ : [];
+ if (group.sortSelected) {
+ values.sort(function (a, b) {
+ return Number(a) - Number(b);
+ });
+ }
+ return values.join(group.joiner || defaultJoiner);
+ });
+
+ if (currentPayPicker.mode === "positions") {
+ if (groupJoiner === "-") {
+ return groupTexts.filter(Boolean).join("-");
+ }
+ const lastGroup = groups[groups.length - 1];
+ if (
+ lastGroup &&
+ lastGroup.key === "special" &&
+ groupTexts.length > 1
+ ) {
+ const front = groupTexts
+ .slice(0, -1)
+ .filter(Boolean)
+ .join(defaultJoiner);
+ const last = groupTexts[groupTexts.length - 1];
+ return [front, last].filter(Boolean).join(groupJoiner);
+ }
+ return groupTexts.filter(Boolean).join(defaultJoiner);
+ }
+
+ return groupTexts.filter(Boolean).join(groupJoiner);
+ }
+
+ function loadPayPublishOptions(menuId) {
+ currentPayPublishOptions = null;
+ currentPayPicker = null;
+ $("#payMenuId").val(menuId || "");
+ $("#payCode").val("");
+ $("#qi").val("");
+ $("#qihao").text("正在生成当前期号...");
+ $("#expectInput").val("");
+ $("#expectText").text("正在生成当前期号...");
+ $("#priceInput").val("");
+ $("#priceText").text(0);
+ $("#payPriceInfo").text("正在加载价格说明...");
+
+ if (!menuId) {
+ $("#qihao").text("请选择类型后自动生成");
+ $("#expectText").text("选择方案后自动获取");
+ $("#payPriceInfo").text("请选择方案后加载价格说明");
+ return Promise.resolve(null);
+ }
+
+ return ApiClient.get(ApiClient.API.payArticlePublishOptions(menuId))
+ .then(function (res) {
+ if (!ApiClient.isSuccess(res)) {
+ throw new Error(res.msg || "发布前置信息加载失败");
+ }
+
+ renderPayPublishOptions(res.data || {});
+ return res.data || {};
+ })
+ .catch(function (error) {
+ currentPayPublishOptions = null;
+ currentPayPicker = null;
+ $("#qi").val("");
+ $("#qihao").text("当前期号生成失败");
+ $("#expectInput").val("");
+ $("#expectText").text("选择方案后自动获取");
+ $("#priceInput").val("");
+ $("#priceText").text(0);
+ $("#payPriceInfo").text("发布前置信息加载失败");
+ $(".mianfeiThreeText").hide();
+ $(".mianfeiThreeButBox").hide();
+ layui.layer.msg(error.message || "发布前置信息加载失败", {
+ icon: 2,
+ });
+ throw error;
+ });
+ }
+ //console.log(qishuok);
+ function clearLotterySelection() {
+ selectedLotteryPath = [];
+ selectedLotteryIds = [];
+ currentPayPublishOptions = null;
+ currentPayPicker = null;
+ $("#a1,#a2,#a3,#qi,#vv,#payMenuId,#payCode").val("");
+ $("#payTitle").val("");
+ $("#payTitleCount").text("0/100");
+ $("#expectInput").val("");
+ $("#priceInput").val("");
+ $("#priceText").text(0);
+ $("#expectText").text("选择方案后自动获取");
+ $("#qihao").text("请选择方案");
+ $("#payPriceInfo").text("请选择方案后加载价格说明");
+ $("#gmjl").closest(".selectY-box").removeClass("is-selected");
+ $(".mianfeiThreeText").hide();
+ $(".mianfeiThreeButBox").hide();
+ initNumberSelector([]);
+ }
+
+ function initLayuiComponents() {
+ layui.use(["form", "selectY2", "notice"], function () {
+ var form = layui.form,
+ notice = layui.notice,
+ layer = layui.layer,
+ selectY2 = layui.selectY2,
+ $ = layui.$;
+ const $mianfeiThreeText = $(".mianfeiThreeText");
+ const $mianfeiThreeButBox = $(".mianfeiThreeButBox");
+
+ let xzid = 0;
+ let ob = selectY2({
+ elem: "#gmjl",
+ data: gmjldata,
+ //url为ajax 获取json数据,当url属性有值时,不提取data属性值
+ //url:'https://cityApi.html',
+ placeholder: "请选择方案",
+ disabledTips: "请选择",
+ allowClear: true,
+ clearText: "×",
+ clear: clearLotterySelection,
+ success: function (e) {
+ console.log(e.data);
+ console.log(e.ids);
+ console.log(qishuok[e.ids[0]], "zuijinqishu");
+ //
+ $("#qi").val("");
+ $("#qihao").text("正在生成当前期号...");
+ selectedLotteryPath = e.data || [];
+ selectedLotteryIds = e.ids || [];
+ $("#gmjl").closest(".selectY-box").addClass("is-selected");
+ $("#a1").val(selectedLotteryIds[0] || "");
+ $("#a2").val(selectedLotteryIds[1] || "");
+ $("#a3").val(selectedLotteryIds[selectedLotteryIds.length - 1] || "");
+ xzid = selectedLotteryIds[selectedLotteryIds.length - 1];
+ $("#payMenuId").val(xzid);
+ var ttt = e.data;
+ $mianfeiThreeText.hide();
+ $mianfeiThreeButBox.hide();
+ initNumberSelector([]);
+ loadPayPublishOptions(xzid)
+ .then(function (options) {
+ const groups =
+ options &&
+ options.picker &&
+ Array.isArray(options.picker.groups)
+ ? options.picker.groups
+ : [];
+ if (!groups.length) {
+ currentPayPublishOptions = null;
+ currentPayPicker = null;
+ layui.layer.msg("后端未返回选号配置,请检查发布前置接口", {
+ icon: 2,
+ });
+ return;
+ }
+ $mianfeiThreeText.show();
+ $mianfeiThreeButBox.show();
+ })
+ .catch(function () {});
+ },
+ });
+ });
+ }
+
+ function chk() {
+ if (isSubmittingPayArticle) {
+ return false;
+ }
+
+ const menuId = layui.$("#payMenuId").val();
+ const qi = layui.$("#qi").val();
+ const title = layui.$("#payTitle").val().trim();
+ const code = layui.$("#payCode").val().trim() || "-";
+
+ if (!menuId) {
+ layer.alert("请选择发布方案");
+ return false;
+ }
+ if (!currentPayPublishOptions) {
+ layer.alert("发布前置信息还没有加载完成,请重新选择方案");
+ return false;
+ }
+ if (
+ !currentPayPicker ||
+ !Array.isArray(currentPayPicker.groups) ||
+ !currentPayPicker.groups.length
+ ) {
+ layer.alert("后端未返回选号配置,请重新选择方案");
+ return false;
+ }
+ if (!title) {
+ layer.alert("请输入文章标题");
+ return false;
+ }
+ if (!qi) {
+ layer.alert("当前期号不能为空");
+ return false;
+ }
+ if (!validatePayPickerSelection(selections)) {
+ return false;
+ }
+
+ const vv = buildPayPredictedCode(selections);
+ layui.$("#vv").val(vv);
+
+ if (!vv) {
+ layer.alert("请选择号码");
+ return false;
+ }
+
+ isSubmittingPayArticle = true;
+ layui.$(".mianfeiThreeBut").text("发布中...").prop("disabled", true);
+ checkPaidPublishPermission()
+ .then(function (permission) {
+ if (!permission.canPaid) {
+ throw new Error(permission.reason || "暂无付费文章发布权限。");
+ }
+
+ return ApiClient.post(ApiClient.API.payArticlePublish, {
+ parentId: menuId,
+ code: code,
+ title: title,
+ predictedCode: vv,
+ issue: Number(qi),
+ });
+ })
+ .then(function (res) {
+ if (!ApiClient.isSuccess(res)) {
+ throw new Error(res.msg || "发布失败");
+ }
+ layer.msg("发布成功", { icon: 1, time: 1200 }, function () {
+ window.location.href = "usercenter.html";
+ });
+ })
+ .catch(function (error) {
+ layer.msg(error.message || "发布失败", { icon: 2 });
+ })
+ .finally(function () {
+ isSubmittingPayArticle = false;
+ layui.$(".mianfeiThreeBut").text("发布方案").prop("disabled", false);
+ });
+ return false;
+ }
+
+ function formatSelectedBallText(value) {
+ const text = String(value);
+ return text !== "" && !isNaN(Number(text)) && Number(text) < 10
+ ? "0" + Number(text)
+ : text;
+ }
+
+ function isSelectionComplete(currentSelections) {
+ if (!stepsConfig.length) {
+ return false;
+ }
+
+ return stepsConfig.every(function (step, index) {
+ const selected =
+ currentSelections[index] &&
+ Array.isArray(currentSelections[index].numbers)
+ ? currentSelections[index].numbers
+ : [];
+ const min = Number(step.minSelect || step.requiredCount || 0);
+ const max = Number(step.maxSelect || step.requiredCount || min);
+ return selected.length >= min && selected.length <= max;
+ });
+ }
+
+ function xzok(selections) {
+ const $jieguo = $("#jieguo");
+ const selectedGroups = [];
+
+ selections.forEach(function (selection, index) {
+ const step = stepsConfig[index] || {};
+ const numbers =
+ selection && Array.isArray(selection.numbers)
+ ? selection.numbers
+ : [];
+
+ if (!numbers.length) {
+ return;
+ }
+
+ const selectedClass = step.classok || "selected";
+ const balls = numbers
+ .map(function (number) {
+ return (
+ '
' +
+ CommonUtil.escapeHtml(formatSelectedBallText(number)) +
+ "
"
+ );
+ })
+ .join("");
+
+ selectedGroups.push(
+ '
' + balls + "
",
+ );
+ });
+
+ if (selectedGroups.length) {
+ $jieguo.html(
+ '
' +
+ selectedGroups.join('|') +
+ "
",
+ );
+ } else {
+ $jieguo.text("暂无号码");
+ }
+
+ layui.$("#vv").val(buildPayPredictedCode(selections));
+
+ }
diff --git a/public/js/jquery.js b/public/js/jquery.js
new file mode 100644
index 0000000..3b89a1c
--- /dev/null
+++ b/public/js/jquery.js
@@ -0,0 +1,2 @@
+/*! jQuery v4.0.0 | (c) OpenJS Foundation and other contributors | jquery.com/license */
+!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=t(e,!0):t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";if(!e.document)throw Error("jQuery requires a window with a document");var n=[],r=Object.getPrototypeOf,i=n.slice,o=n.flat?function(e){return n.flat.call(e)}:function(e){return n.concat.apply([],e)},a=n.push,s=n.indexOf,u={},l=u.toString,c=u.hasOwnProperty,f=c.toString,p=f.call(Object),d={};function h(e){return null==e?e+"":"object"==typeof e?u[l.call(e)]||"object":typeof e}function g(e){return null!=e&&e===e.window}function v(e){var t=!!e&&e.length,n=h(e);return!("function"==typeof e||g(e))&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var y=e.document,m={type:!0,src:!0,nonce:!0,noModule:!0};function x(e,t,n){var r,i=(n=n||y).createElement("script");for(r in i.text=e,m)t&&t[r]&&(i[r]=t[r]);n.head.appendChild(i).parentNode&&i.parentNode.removeChild(i)}var b="4.0.0",w=/HTML$/i,T=function(e,t){return new T.fn.init(e,t)};function C(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}T.fn=T.prototype={jquery:b,constructor:T,length:0,toArray:function(){return i.call(this)},get:function(e){return null==e?i.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=T.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return T.each(this,e)},map:function(e){return this.pushStack(T.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(i.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(T.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(T.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n
+~]|"+E+")"+E+"*"),q=RegExp(E+"|>"),O=/[+~]/,L=y.documentElement,H=L.matches||L.msMatchesSelector;function P(){var e=[];function t(n,r){return e.push(n+" ")>T.expr.cacheLength&&delete t[e.shift()],t[n+" "]=r}return t}function R(e){return e&&void 0!==e.getElementsByTagName&&e}var M="\\["+E+"*("+A+")(?:"+E+"*([*^$|!~]?=)"+E+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+A+"))|)"+E+"*\\]",W=":("+A+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",$={ID:RegExp("^#("+A+")"),CLASS:RegExp("^\\.("+A+")"),TAG:RegExp("^("+A+"|[*])"),ATTR:RegExp("^"+M),PSEUDO:RegExp("^"+W),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i")},I=new RegExp(W),F=RegExp("\\\\[\\da-fA-F]{1,6}"+E+"?|\\\\([^\\r\\n\\f])","g"),B=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))};function _(e){return e.replace(F,B)}function U(e){T.error("Syntax error, unrecognized expression: "+e)}var X=RegExp("^"+E+"*,"+E+"*"),z=P();function Y(e,t){var n,r,i,o,a,s,u,l=z[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=T.expr.preFilter;while(a){for(o in(!n||(r=X.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=N.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace(D," ")}),a=a.slice(n.length)),$)(r=T.expr.match[o].exec(a))&&(!u[o]||(r=u[o](r)))&&(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?U(e):z(e,s).slice(0)}function G(e){for(var t=0,n=e.length,r="";t1)},removeAttr:function(e){return this.each(function(){T.removeAttr(this,e)})}}),T.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?T.prop(e,t,n):(1===o&&T.isXMLDoc(e)||(i=T.attrHooks[t.toLowerCase()]),void 0!==n)?null===n||!1===n&&0!==t.toLowerCase().indexOf("aria-")?void T.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=e.getAttribute(t))?void 0:r},attrHooks:{},removeAttr:function(e,t){var n,r=0,i=t&&t.match(Q);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),k&&(T.attrHooks.type={set:function(e,t){if("radio"===t&&C(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}});var J=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g;function K(e,t){return t?"\0"===e?"\uFFFD":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e}T.escapeSelector=function(e){return(e+"").replace(J,K)};var Z=n.sort,ee=n.splice;function et(e,t){if(e===t)return en=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)?e==y||e.ownerDocument==y&&T.contains(y,e)?-1:t==y||t.ownerDocument==y&&T.contains(y,t)?1:0:4&n?-1:1}T.uniqueSort=function(e){var t,n=[],r=0,i=0;if(en=!1,Z.call(e,et),en){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)ee.call(e,n[r],1)}return e},T.fn.uniqueSort=function(){return this.pushStack(T.uniqueSort(i.apply(this)))};var en,er,ei,eo,ea,es,eu=0,el=0,ec=P(),ef=P(),ep=P(),ed=RegExp(E+"+","g"),eh=RegExp("^"+A+"$"),eg=T.extend({needsContext:RegExp("^"+E+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)","i")},$),ev=/^(?:input|select|textarea|button)$/i,ey=/^h\d$/i,em=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ex=function(){eE()},eb=eS(function(e){return!0===e.disabled&&C(e,"fieldset")},{dir:"parentNode",next:"legend"});function ew(e,t,n,r){var i,o,s,u,l,c,f,p=t&&t.ownerDocument,d=t?t.nodeType:9;if(n=n||[],"string"!=typeof e||!e||1!==d&&9!==d&&11!==d)return n;if(!r&&(eE(t),t=t||eo,es)){if(11!==d&&(l=em.exec(e))){if(i=l[1]){if(9===d)return(s=t.getElementById(i))&&a.call(n,s),n;else if(p&&(s=p.getElementById(i))&&T.contains(t,s))return a.call(n,s),n}else if(l[2])return a.apply(n,t.getElementsByTagName(e)),n;else if((i=l[3])&&t.getElementsByClassName)return a.apply(n,t.getElementsByClassName(i)),n}if(!ep[e+" "]&&(!S||!S.test(e))){if(f=e,p=t,1===d&&(q.test(e)||N.test(e))){((p=O.test(e)&&R(t.parentNode)||t)!=t||k)&&((u=t.getAttribute("id"))?u=T.escapeSelector(u):t.setAttribute("id",u=T.expando)),o=(c=Y(e)).length;while(o--)c[o]=(u?"#"+u:":scope")+" "+G(c[o]);f=c.join(",")}try{return a.apply(n,p.querySelectorAll(f)),n}catch(t){ep(e,!0)}finally{u===T.expando&&t.removeAttribute("id")}}}return eq(e.replace(D,"$1"),t,n,r)}function eT(e){return e[T.expando]=!0,e}function eC(e){return function(t){if("form"in t){if(t.parentNode&&!1===t.disabled){if("label"in t)if("label"in t.parentNode)return t.parentNode.disabled===e;else return t.disabled===e;return t.isDisabled===e||!e!==t.isDisabled&&eb(t)===e}return t.disabled===e}return"label"in t&&t.disabled===e}}function ej(e){return eT(function(t){return t*=1,eT(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function eE(e){var t,n=e?e.ownerDocument||e:y;n!=eo&&9===n.nodeType&&(ea=(eo=n).documentElement,es=!T.isXMLDoc(eo),k&&y!=eo&&(t=eo.defaultView)&&t.top!==t&&t.addEventListener("unload",ex))}for(er in ew.matches=function(e,t){return ew(e,null,null,t)},ew.matchesSelector=function(e,t){if(eE(e),es&&!ep[t+" "]&&(!S||!S.test(t)))try{return H.call(e,t)}catch(e){ep(t,!0)}return ew(t,eo,null,[e]).length>0},T.expr={cacheLength:50,createPseudo:eT,match:eg,find:{ID:function(e,t){if(void 0!==t.getElementById&&es){var n=t.getElementById(e);return n?[n]:[]}},TAG:function(e,t){return void 0!==t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},CLASS:function(e,t){if(void 0!==t.getElementsByClassName&&es)return t.getElementsByClassName(e)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=_(e[1]),e[3]=_(e[3]||e[4]||e[5]||""),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||U(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&U(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return $.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&I.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{ID:function(e){var t=_(e);return function(e){return e.getAttribute("id")===t}},TAG:function(e){var t=_(e).toLowerCase();return"*"===e?function(){return!0}:function(e){return C(e,t)}},CLASS:function(e){var t=ec[e+" "];return t||(t=RegExp("(^|"+E+")"+e+"("+E+"|$)"))&&ec(e,function(e){return t.test("string"==typeof e.className&&e.className||void 0!==e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=T.attr(r,e);return null==i?"!="===t:!t||((i+="","="===t)?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i.replace(ed," ")+" ").indexOf(n)>-1:"|="===t&&(i===n||i.slice(0,n.length+1)===n+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!u&&!s,m=!1;if(g){if(o){while(h){f=t;while(f=f[h])if(s?C(f,v):1===f.nodeType)return!1;d=h="only"===e&&!d&&"nextSibling"}return!0}if(d=[a?g.firstChild:g.lastChild],a&&y){m=(p=(l=(c=g[T.expando]||(g[T.expando]={}))[e]||[])[0]===eu&&l[1])&&l[2],f=p&&g.childNodes[p];while(f=++p&&f&&f[h]||(m=p=0)||d.pop())if(1===f.nodeType&&++m&&f===t){c[e]=[eu,p,m];break}}else if(y&&(m=p=(l=(c=t[T.expando]||(t[T.expando]={}))[e]||[])[0]===eu&&l[1]),!1===m){while(f=++p&&f&&f[h]||(m=p=0)||d.pop())if((s?C(f,v):1===f.nodeType)&&++m&&(y&&((c=f[T.expando]||(f[T.expando]={}))[e]=[eu,m]),f===t))break}return(m-=i)===r||m%r==0&&m/r>=0}}},PSEUDO:function(e,t){var n=T.expr.pseudos[e]||T.expr.setFilters[e.toLowerCase()]||U("unsupported pseudo: "+e);return n[T.expando]?n(t):n}},pseudos:{not:eT(function(e){var t=[],n=[],r=eN(e.replace(D,"$1"));return r[T.expando]?eT(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),t[0]=null,!n.pop()}}),has:eT(function(e){return function(t){return ew(e,t).length>0}}),contains:eT(function(e){return e=_(e),function(t){return(t.textContent||T.text(t)).indexOf(e)>-1}}),lang:eT(function(e){return eh.test(e||"")||U("unsupported lang: "+e),e=_(e).toLowerCase(),function(t){var n;do if(n=es?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return(n=n.toLowerCase())===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===ea},focus:function(e){return e===eo.activeElement&&eo.hasFocus()&&!!(e.type||e.href||~e.tabIndex)},enabled:eC(!1),disabled:eC(!0),checked:function(e){return C(e,"input")&&!!e.checked||C(e,"option")&&!!e.selected},selected:function(e){return k&&e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.expr.pseudos.empty(e)},header:function(e){return ey.test(e.nodeName)},input:function(e){return ev.test(e.nodeName)},button:function(e){return C(e,"input")&&"button"===e.type||C(e,"button")},text:function(e){return C(e,"input")&&"text"===e.type},first:ej(function(){return[0]}),last:ej(function(e,t){return[t-1]}),eq:ej(function(e,t,n){return[n<0?n+t:n]}),even:ej(function(e,t){for(var n=0;nt?t:n;--r>=0;)e.push(r);return e}),gt:ej(function(e,t,n){for(var r=n<0?n+t:n;++r1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function eA(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s-1},l,!0),d=[function(e,t,r){var i=!u&&(r||t!=ei)||((n=t).nodeType?f(e,t,r):p(e,t,r));return n=null,i}];c-1&&(e[f]=!(u[f]=d))}}else h=eA(h===u?h.splice(y,h.length):h),o?o(null,u,h,c):a.apply(u,h)})}(c>1&&eD(d),c>1&&G(t.slice(0,c-1).concat({value:" "===t[c-2].type?"*":""})).replace(D,"$1"),r,c0,r=l.length>0,i=function(e,t,i,o,s){var c,f,p,d=0,h="0",g=e&&[],v=[],y=ei,m=e||r&&T.expr.find.TAG("*",s),x=eu+=null==y?1:Math.random()||.1;for(s&&(ei=t==eo||t||s);null!=(c=m[h]);h++){if(r&&c){f=0,t||c.ownerDocument==eo||(eE(c),i=!es);while(p=l[f++])if(p(c,t||eo,i)){a.call(o,c);break}s&&(eu=x)}n&&((c=!p&&c)&&d--,e&&g.push(c))}if(d+=h,n&&h!==d){f=0;while(p=u[f++])p(g,v,t,i);if(e){if(d>0)while(h--)g[h]||v[h]||(v[h]=j.call(o));v=eA(v)}a.apply(o,v),s&&!e&&v.length>0&&d+u.length>1&&T.uniqueSort(o)}return s&&(eu=x,ei=y),g},n?eT(i):i))).selector=e}return c}function eq(e,t,n,r){var i,o,s,u,l,c="function"==typeof e&&e,f=!r&&Y(e=c.selector||e);if(n=n||[],1===f.length){if((o=f[0]=f[0].slice(0)).length>2&&"ID"===(s=o[0]).type&&9===t.nodeType&&es&&T.expr.relative[o[1].type]){if(!(t=(T.expr.find.ID(_(s.matches[0]),t)||[])[0]))return n;c&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=eg.needsContext.test(e)?0:o.length;while(i--){if(s=o[i],T.expr.relative[u=s.type])break;if((l=T.expr.find[u])&&(r=l(_(s.matches[0]),O.test(o[0].type)&&R(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&G(o)))return a.apply(n,r),n;break}}}return(c||eN(e,f))(r,t,!es,n,!t||O.test(e)&&R(t.parentNode)||t),n}function eO(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&T(e).is(n))break;r.push(e)}return r}function eL(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}ek.prototype=T.expr.pseudos,T.expr.setFilters=new ek,eE(),T.find=ew,ew.compile=eN,ew.select=eq,ew.setDocument=eE,ew.tokenize=Y;var eH=T.expr.match.needsContext,eP=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function eR(e){return"<"===e[0]&&">"===e[e.length-1]&&e.length>=3}function eM(e,t,n){return"function"==typeof t?T.grep(e,function(e,r){return!!t.call(e,r,e)!==n}):t.nodeType?T.grep(e,function(e){return e===t!==n}):"string"!=typeof t?T.grep(e,function(e){return s.call(t,e)>-1!==n}):T.filter(t,e,n)}T.filter=function(e,t,n){var r=t[0];return(n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType)?T.find.matchesSelector(r,e)?[r]:[]:T.find.matches(e,T.grep(t,function(e){return 1===e.nodeType}))},T.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(T(e).filter(function(){for(t=0;t1?T.uniqueSort(n):n},filter:function(e){return this.pushStack(eM(this,e||[],!1))},not:function(e){return this.pushStack(eM(this,e||[],!0))},is:function(e){return!!eM(this,"string"==typeof e&&eH.test(e)?T(e):e||[],!1).length}});var eW,e$=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(T.fn.init=function(e,t){var n,r;if(!e)return this;if(e.nodeType)return this[0]=e,this.length=1,this;if("function"==typeof e)return void 0!==eW.ready?eW.ready(e):e(T);if(eR(n=e+""))n=[null,e,null];else{if("string"!=typeof e)return T.makeArray(e,this);n=e$.exec(e)}if(n&&(n[1]||!t))if(!n[1])return(r=y.getElementById(n[2]))&&(this[0]=r,this.length=1),this;else{if(t=t instanceof T?t[0]:t,T.merge(this,T.parseHTML(n[1],t&&t.nodeType?t.ownerDocument||t:y,!0)),eP.test(n[1])&&T.isPlainObject(t))for(n in t)"function"==typeof this[n]?this[n](t[n]):this.attr(n,t[n]);return this}return!t||t.jquery?(t||eW).find(e):this.constructor(t).find(e)}).prototype=T.fn,eW=T(y);var eI=/^(?:parents|prev(?:Until|All))/,eF={children:!0,contents:!0,next:!0,prev:!0};function eB(e,t){while((e=e[t])&&1!==e.nodeType);return e}function e_(e){return e}function eU(e){throw e}function eX(e,t,n,r){var i;try{e&&"function"==typeof(i=e.promise)?i.call(e).done(t).fail(n):e&&"function"==typeof(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n(e)}}T.fn.extend({has:function(e){var t=T(e,this),n=t.length;return this.filter(function(){for(var e=0;e-1:1===n.nodeType&&T.find.matchesSelector(n,e))){o.push(n);break}}return this.pushStack(o.length>1?T.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?s.call(T(e),this[0]):s.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(T.uniqueSort(T.merge(this.get(),T(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),T.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return eO(e,"parentNode")},parentsUntil:function(e,t,n){return eO(e,"parentNode",n)},next:function(e){return eB(e,"nextSibling")},prev:function(e){return eB(e,"previousSibling")},nextAll:function(e){return eO(e,"nextSibling")},prevAll:function(e){return eO(e,"previousSibling")},nextUntil:function(e,t,n){return eO(e,"nextSibling",n)},prevUntil:function(e,t,n){return eO(e,"previousSibling",n)},siblings:function(e){return eL((e.parentNode||{}).firstChild,e)},children:function(e){return eL(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(C(e,"template")&&(e=e.content||e),T.merge([],e.childNodes))}},function(e,t){T.fn[e]=function(n,r){var i=T.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=T.filter(r,i)),this.length>1&&(eF[e]||T.uniqueSort(i),eI.test(e)&&i.reverse()),this.pushStack(i)}}),T.Callbacks=function(e){e="string"==typeof e?(t=e,n={},T.each(t.match(Q)||[],function(e,t){n[t]=!0}),n):T.extend({},e);var t,n,r,i,o,a,s=[],u=[],l=-1,c=function(){for(a=a||e.once,o=r=!0;u.length;l=-1){i=u.shift();while(++l-1)s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?T.inArray(e,s)>-1:s.length>0},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=i="",this},disabled:function(){return!s},lock:function(){return a=u=[],i||r||(s=i=""),this},locked:function(){return!!a},fireWith:function(e,t){return!a&&(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),r||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},T.extend({Deferred:function(t){var n=[["notify","progress",T.Callbacks("memory"),T.Callbacks("memory"),2],["resolve","done",T.Callbacks("once memory"),T.Callbacks("once memory"),0,"resolved"],["reject","fail",T.Callbacks("once memory"),T.Callbacks("once memory"),1,"rejected"]],r="pending",i={state:function(){return r},always:function(){return o.done(arguments).fail(arguments),this},catch:function(e){return i.then(null,e)},pipe:function(){var e=arguments;return T.Deferred(function(t){T.each(n,function(n,r){var i="function"==typeof e[r[4]]&&e[r[4]];o[r[1]](function(){var e=i&&i.apply(this,arguments);e&&"function"==typeof e.promise?e.promise().progress(t.notify).done(t.resolve).fail(t.reject):t[r[0]+"With"](this,i?[e]:arguments)})}),e=null}).promise()},then:function(t,r,i){var o=0;function a(t,n,r,i){return function(){var s=this,u=arguments,l=function(){var e,l;if(!(t=o&&(r!==eU&&(s=void 0,u=[e]),n.rejectWith(s,u))}};t?c():(T.Deferred.getErrorHook&&(c.error=T.Deferred.getErrorHook()),e.setTimeout(c))}}return T.Deferred(function(e){n[0][3].add(a(0,e,"function"==typeof i?i:e_,e.notifyWith)),n[1][3].add(a(0,e,"function"==typeof t?t:e_)),n[2][3].add(a(0,e,"function"==typeof r?r:eU))}).promise()},promise:function(e){return null!=e?T.extend(e,i):i}},o={};return T.each(n,function(e,t){var a=t[2],s=t[5];i[t[1]]=a.add,s&&a.add(function(){r=s},n[3-e][2].disable,n[3-e][3].disable,n[0][2].lock,n[0][3].lock),a.add(t[3].fire),o[t[0]]=function(){return o[t[0]+"With"](this===o?void 0:this,arguments),this},o[t[0]+"With"]=a.fireWith}),i.promise(o),t&&t.call(o,o),o},when:function(e){var t=arguments.length,n=t,r=Array(n),o=i.call(arguments),a=T.Deferred(),s=function(e){return function(n){r[e]=this,o[e]=arguments.length>1?i.call(arguments):n,--t||a.resolveWith(r,o)}};if(t<=1&&(eX(e,a.done(s(n)).resolve,a.reject,!t),"pending"===a.state()||"function"==typeof(o[n]&&o[n].then)))return a.then();while(n--)eX(o[n],s(n),a.reject);return a.promise()}});var ez=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;T.Deferred.exceptionHook=function(t,n){t&&ez.test(t.name)&&e.console.warn("jQuery.Deferred exception",t,n)},T.readyException=function(t){e.setTimeout(function(){throw t})};var eY=T.Deferred();function eG(){y.removeEventListener("DOMContentLoaded",eG),e.removeEventListener("load",eG),T.ready()}T.fn.ready=function(e){return eY.then(e).catch(function(e){T.readyException(e)}),this},T.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--T.readyWait:T.isReady)||(T.isReady=!0,!0!==e&&--T.readyWait>0||eY.resolveWith(y,[T]))}}),T.ready.then=eY.then,"loading"!==y.readyState?e.setTimeout(T.ready):(y.addEventListener("DOMContentLoaded",eG),e.addEventListener("load",eG));var eV=/-([a-z])/g;function eQ(e,t){return t.toUpperCase()}function eJ(e){return e.replace(eV,eQ)}function eK(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType}function eZ(){this.expando=T.expando+eZ.uid++}eZ.uid=1,eZ.prototype={cache:function(e){var t=e[this.expando];return!t&&(t=Object.create(null),eK(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[eJ(t)]=n;else for(r in t)i[eJ(r)]=t[r];return n},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][eJ(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(eJ):(t=eJ(t))in r?[t]:t.match(Q)||[]).length;while(n--)delete r[t[n]]}(void 0===t||T.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!T.isEmptyObject(t)}};var e0=new eZ,e1=new eZ,e2=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,e3=/[A-Z]/g;function e4(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(e3,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{i=n,n="true"===i||"false"!==i&&("null"===i?null:i===+i+""?+i:e2.test(i)?JSON.parse(i):i)}catch(e){}e1.set(e,t,n)}else n=void 0;return n}T.extend({hasData:function(e){return e1.hasData(e)||e0.hasData(e)},data:function(e,t,n){return e1.access(e,t,n)},removeData:function(e,t){e1.remove(e,t)},_data:function(e,t,n){return e0.access(e,t,n)},_removeData:function(e,t){e0.remove(e,t)}}),T.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=e1.get(o),1===o.nodeType&&!e0.get(o,"hasDataAttrs"))){n=a.length;while(n--)a[n]&&0===(r=a[n].name).indexOf("data-")&&e4(o,r=eJ(r.slice(5)),i[r]);e0.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof e?this.each(function(){e1.set(this,e)}):V(this,function(t){var n;if(o&&void 0===t)return void 0!==(n=e1.get(o,e))||void 0!==(n=e4(o,e))?n:void 0;this.each(function(){e1.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){e1.remove(this,e)})}}),T.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=e0.get(e,t),n&&(!r||Array.isArray(n)?r=e0.set(e,t,T.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=T.queue(e,t),r=n.length,i=n.shift(),o=T._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){T.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return e0.get(e,n)||e0.set(e,n,{empty:T.Callbacks("once memory").add(function(){e0.remove(e,[t+"queue",n])})})}}),T.fn.extend({queue:function(e,t){var n=2;return("string"!=typeof e&&(t=e,e="fx",n--),arguments.length\x20\t\r\n\f]*)/i,tc={thead:["table"],col:["colgroup","table"],tr:["tbody","table"],td:["tr","tbody","table"]};function tf(e,t){var r;return(r=void 0!==e.getElementsByTagName?n.slice.call(e.getElementsByTagName(t||"*")):void 0!==e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&C(e,t))?T.merge([e],r):r}tc.tbody=tc.tfoot=tc.colgroup=tc.caption=tc.thead,tc.th=tc.td;var tp=/^$|^module$|\/(?:java|ecma)script/i;function td(e,t){for(var n=0,r=e.length;n-1)s=s.appendChild(t.createElement(u[c]));s.innerHTML=T.htmlPrefilter(a),T.merge(p,s.childNodes),(s=f.firstChild).textContent=""}else p.push(t.createTextNode(a));f.textContent="",d=0;while(a=p[d++]){if(i&&T.inArray(a,i)>-1){o&&o.push(a);continue}if(l=ts(a),s=tf(f.appendChild(a),"script"),l&&td(s),r){c=0;while(a=s[c++])tp.test(a.type||"")&&r.push(a)}}return f}function tv(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ty(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function tm(e,t,n,r){t=o(t);var i,a,s,u,l,c,f=0,p=e.length,d=p-1,h=t[0];if("function"==typeof h)return e.each(function(i){var o=e.eq(i);t[0]=h.call(this,i,o.html()),tm(o,t,n,r)});if(p&&(a=(i=tg(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=a),a||r)){for(u=(s=T.map(tf(i,"script"),tv)).length;f=1)){for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(n=0,o=[],a={};n-1:T.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}}return l=this,u0&&td(a,!u&&tf(e,"script")),s},cleanData:function(e){for(var t,n,r,i=T.event.special,o=0;void 0!==(n=e[o]);o++)if(eK(n)){if(t=n[e0.expando]){if(t.events)for(r in t.events)i[r]?T.event.remove(n,r):T.removeEvent(n,r,t.handle);n[e0.expando]=void 0}n[e1.expando]&&(n[e1.expando]=void 0)}}}),T.fn.extend({detach:function(e){return tD(this,e,!0)},remove:function(e){return tD(this,e)},text:function(e){return V(this,function(e){return void 0===e?T.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=e)})},null,e,arguments.length)},append:function(){return tm(this,arguments,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&tk(this,e).appendChild(e)})},prepend:function(){return tm(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=tk(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return tm(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return tm(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(T.cleanData(tf(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return T.clone(this,e,t)})},html:function(e){return V(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!tE.test(e)&&!tc[(tl.exec(e)||["",""])[1].toLowerCase()]){e=T.htmlPrefilter(e);try{for(;nT.inArray(this,e)&&(T.cleanData(tf(this)),n&&n.replaceChild(t,this))},e)}}),T.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){T.fn[e]=function(e){for(var n,r=[],i=T(e),o=i.length-1,s=0;s<=o;s++)n=s===o?this:this.clone(!0),T(i[s])[t](n),a.apply(r,n);return this.pushStack(r)}});var tA=RegExp("^("+e5+")(?!px)[a-z%]+$","i"),tN=/^--/;function tq(t){var n=t.ownerDocument.defaultView;return n||(n=e),n.getComputedStyle(t)}function tO(e,t,n){var r,i=tN.test(t);return(n=n||tq(e))&&(r=n.getPropertyValue(t)||n[t],i&&r&&(r=r.replace(D,"$1")||void 0),""!==r||ts(e)||(r=T.style(e,t))),void 0!==r?r+"":r}var tL=["Webkit","Moz","ms"],tH=y.createElement("div").style;function tP(e){return e in tH?e:function(e){var t=e[0].toUpperCase()+e.slice(1),n=tL.length;while(n--)if((e=tL[n]+t)in tH)return e}(e)||e}var tR,tM,tW=y.createElement("table");function t$(){if(tW&&tW.style){var t,n=y.createElement("col"),r=y.createElement("tr"),i=y.createElement("td");if(tW.style.cssText="position:absolute;left:-11111px;border-collapse:separate;border-spacing:0",r.style.cssText="box-sizing:content-box;border:1px solid;height:1px",i.style.cssText="height:9px;width:9px;padding:0",n.span=2,L.appendChild(tW).appendChild(n).parentNode.appendChild(r).appendChild(i).parentNode.appendChild(i.cloneNode(!0)),0===tW.offsetWidth)return void L.removeChild(tW);t=e.getComputedStyle(r),tM=k||18===Math.round(parseFloat(e.getComputedStyle(n).width)),tR=Math.round(parseFloat(t.height)+parseFloat(t.borderTopWidth)+parseFloat(t.borderBottomWidth))===r.offsetHeight,L.removeChild(tW),tW=null}}T.extend(d,{reliableTrDimensions:function(){return t$(),tR},reliableColDimensions:function(){return t$(),tM}});var tI={position:"absolute",visibility:"hidden",display:"block"},tF={letterSpacing:"0",fontWeight:"400"};function tB(e,t,n){var r=e9.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function t_(e,t,n,r,i,o){var a=+("width"===t),s=0,u=0,l=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(l+=T.css(e,n+e6[a],!0,i)),r?("content"===n&&(u-=T.css(e,"padding"+e6[a],!0,i)),"margin"!==n&&(u-=T.css(e,"border"+e6[a]+"Width",!0,i))):(u+=T.css(e,"padding"+e6[a],!0,i),"padding"!==n?u+=T.css(e,"border"+e6[a]+"Width",!0,i):s+=T.css(e,"border"+e6[a]+"Width",!0,i));return!r&&o>=0&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u+l}function tU(e,t,n){var r=tq(e),i=(k||n)&&"border-box"===T.css(e,"boxSizing",!1,r),o=i,a=tO(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(tA.test(a)){if(!n)return a;a="auto"}return("auto"===a||k&&i||!d.reliableColDimensions()&&C(e,"col")||!d.reliableTrDimensions()&&C(e,"tr"))&&e.getClientRects().length&&(i="border-box"===T.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+t_(e,t,n||(i?"border":"content"),o,r,a)+"px"}function tX(e,t,n,r,i){return new tX.prototype.init(e,t,n,r,i)}T.extend({cssHooks:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=ti(t),u=tN.test(t),l=e.style;if(u||(t=tP(s)),a=T.cssHooks[t]||T.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];if("string"==(o=typeof n)&&(i=e9.exec(n))&&i[1]&&(n=tn(e,t,i),o="number"),null!=n&&n==n)"number"===o&&(n+=i&&i[3]||(tt(s)?"px":"")),k&&""===n&&0===t.indexOf("background")&&(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n)}},css:function(e,t,n,r){var i,o,a,s=ti(t);return(tN.test(t)||(t=tP(s)),(a=T.cssHooks[t]||T.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=tO(e,t,r)),"normal"===i&&t in tF&&(i=tF[t]),""===n||n)?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),T.each(["height","width"],function(e,t){T.cssHooks[t]={get:function(e,n,r){if(n)return"none"===T.css(e,"display")?function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r}(e,tI,function(){return tU(e,t,r)}):tU(e,t,r)},set:function(e,n,r){var i,o=tq(e),a=r&&"border-box"===T.css(e,"boxSizing",!1,o),s=r?t_(e,t,r,a,o):0;return s&&(i=e9.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=T.css(e,t)),tB(e,n,s)}}}),T.each({margin:"",padding:"",border:"Width"},function(e,t){T.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+e6[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(T.cssHooks[e+t].set=tB)}),T.fn.extend({css:function(e,t){return V(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=tq(e),i=t.length;a1)}}),T.Tween=tX,tX.prototype={constructor:tX,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||T.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(tt(n)?"px":"")},cur:function(){var e=tX.propHooks[this.prop];return e&&e.get?e.get(this):tX.propHooks._default.get(this)},run:function(e){var t,n=tX.propHooks[this.prop];return this.options.duration?this.pos=t=T.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):tX.propHooks._default.set(this),this}},tX.prototype.init.prototype=tX.prototype,tX.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=T.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){T.fx.step[e.prop]?T.fx.step[e.prop](e):1===e.elem.nodeType&&(T.cssHooks[e.prop]||null!=e.elem.style[tP(e.prop)])?T.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},T.easing={linear:function(e){return e},swing:function(e){return .5-Math.cos(e*Math.PI)/2},_default:"swing"},T.fx=tX.prototype.init,T.fx.step={};var tz,tY,tG=/^(?:toggle|show|hide)$/,tV=/queueHooks$/;function tQ(){return e.setTimeout(function(){tz=void 0}),tz=Date.now()}function tJ(e,t){var n,r=0,i={height:e};for(t=+!!t;r<4;r+=2-t)i["margin"+(n=e6[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function tK(e,t,n){for(var r,i=(tZ.tweeners[t]||[]).concat(tZ.tweeners["*"]),o=0,a=i.length;o1)},removeProp:function(e){return this.each(function(){delete this[T.propFix[e]||e]})}}),T.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return(1===o&&T.isXMLDoc(e)||(t=T.propFix[t]||t,i=T.propHooks[t]),void 0!==n)?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=e.getAttribute("tabindex");return t?parseInt(t,10):t0.test(e.nodeName)||t1.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),k&&(T.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),T.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){T.propFix[this.toLowerCase()]=this}),T.fn.extend({addClass:function(e){var t,n,r,i,o,a;return"function"==typeof e?this.each(function(t){T(this).addClass(e.call(this,t,t3(this)))}):(t=t4(e)).length?this.each(function(){if(r=t3(this),n=1===this.nodeType&&" "+t2(r)+" "){for(o=0;on.indexOf(" "+i+" ")&&(n+=i+" ");r!==(a=t2(n))&&this.setAttribute("class",a)}}):this},removeClass:function(e){var t,n,r,i,o,a;return"function"==typeof e?this.each(function(t){T(this).removeClass(e.call(this,t,t3(this)))}):arguments.length?(t=t4(e)).length?this.each(function(){if(r=t3(this),n=1===this.nodeType&&" "+t2(r)+" "){for(o=0;o-1)n=n.replace(" "+i+" "," ")}r!==(a=t2(n))&&this.setAttribute("class",a)}}):this:this.attr("class","")},toggleClass:function(e,t){var n,r,i,o;return"function"==typeof e?this.each(function(n){T(this).toggleClass(e.call(this,n,t3(this),t),t)}):"boolean"==typeof t?t?this.addClass(e):this.removeClass(e):(n=t4(e)).length?this.each(function(){for(i=0,o=T(this);i-1)return!0;return!1}}),T.fn.extend({val:function(e){var t,n,r,i=this[0];if(!arguments.length)return i?(t=T.valHooks[i.type]||T.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:null==(n=i.value)?"":n:void 0;return r="function"==typeof e,this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,T(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=T.map(i,function(e){return null==e?"":e+""})),(t=T.valHooks[this.type]||T.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})}}),T.extend({valHooks:{select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k&&(T.valHooks.option={get:function(e){var t=e.getAttribute("value");return null!=t?t:t2(T.text(e))}}),T.each(["radio","checkbox"],function(){T.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=T.inArray(T(e).val(),t)>-1}}});var t5=/^(?:focusinfocus|focusoutblur)$/,t9=function(e){e.stopPropagation()};T.extend(T.event,{trigger:function(t,n,r,i){var o,a,s,u,l,f,p,d,h=[r||y],v=c.call(t,"type")?t.type:t,m=c.call(t,"namespace")?t.namespace.split("."):[];if((a=d=s=r=r||y,!(3===r.nodeType||8===r.nodeType||t5.test(v+T.event.triggered)))&&(v.indexOf(".")>-1&&(v=(m=v.split(".")).shift(),m.sort()),l=0>v.indexOf(":")&&"on"+v,(t=t[T.expando]?t:new T.Event(v,"object"==typeof t&&t)).isTrigger=i?2:3,t.namespace=m.join("."),t.rnamespace=t.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:T.makeArray(n,[t]),p=T.event.special[v]||{},i||!p.trigger||!1!==p.trigger.apply(r,n))){if(!i&&!p.noBubble&&!g(r)){for(u=p.delegateType||v,!t5.test(u+v)&&(a=a.parentNode);a;a=a.parentNode)h.push(a),s=a;s===(r.ownerDocument||y)&&h.push(s.defaultView||s.parentWindow||e)}o=0;while((a=h[o++])&&!t.isPropagationStopped())d=a,t.type=o>1?u:p.bindType||v,(f=(e0.get(a,"events")||Object.create(null))[t.type]&&e0.get(a,"handle"))&&f.apply(a,n),(f=l&&a[l])&&f.apply&&eK(a)&&(t.result=f.apply(a,n),!1===t.result&&t.preventDefault());return t.type=v,!i&&!t.isDefaultPrevented()&&(!p._default||!1===p._default.apply(h.pop(),n))&&eK(r)&&l&&"function"==typeof r[v]&&!g(r)&&((s=r[l])&&(r[l]=null),T.event.triggered=v,t.isPropagationStopped()&&d.addEventListener(v,t9),r[v](),t.isPropagationStopped()&&d.removeEventListener(v,t9),T.event.triggered=void 0,s&&(r[l]=s)),t.result}},simulate:function(e,t,n){var r=T.extend(new T.Event,n,{type:e,isSimulated:!0});T.event.trigger(r,null,t)}}),T.fn.extend({trigger:function(e,t){return this.each(function(){T.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return T.event.trigger(e,t,n,!0)}});var t6=e.location,t8={guid:Date.now()},t7=/\?/;T.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{n=new e.DOMParser().parseFromString(t,"text/xml")}catch(e){}return r=n&&n.getElementsByTagName("parsererror")[0],(!n||r)&&T.error("Invalid XML: "+(r?T.map(r.childNodes,function(e){return e.textContent}).join("\n"):t)),n};var ne=/\[\]$/,nt=/\r?\n/g,nn=/^(?:submit|button|image|reset|file)$/i,nr=/^(?:input|select|textarea|keygen)/i;T.param=function(e,t){var n,r=[],i=function(e,t){var n="function"==typeof t?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!T.isPlainObject(e))T.each(e,function(){i(this.name,this.value)});else for(n in e)!function e(t,n,r,i){var o;if(Array.isArray(n))T.each(n,function(n,o){r||ne.test(t)?i(t,o):e(t+"["+("object"==typeof o&&null!=o?n:"")+"]",o,r,i)});else if(r||"object"!==h(n))i(t,n);else for(o in n)e(t+"["+o+"]",n[o],r,i)}(n,e[n],t,i);return r.join("&")},T.fn.extend({serialize:function(){return T.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=T.prop(this,"elements");return e?T.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!T(this).is(":disabled")&&nr.test(this.nodeName)&&!nn.test(e)&&(this.checked||!tx.test(e))}).map(function(e,t){var n=T(this).val();return null==n?null:Array.isArray(n)?T.map(n,function(e){return{name:t.name,value:e.replace(nt,"\r\n")}}):{name:t.name,value:n.replace(nt,"\r\n")}}).get()}});var ni=/%20/g,no=/#.*$/,na=/([?&])_=[^&]*/,ns=/^(.*?):[ \t]*([^\r\n]*)$/mg,nu=/^(?:GET|HEAD)$/,nl=/^\/\//,nc={},nf={},np="*/".concat("*"),nd=y.createElement("a");function nh(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(Q)||[];if("function"==typeof n)while(r=o[i++])"+"===r[0]?(e[r=r.slice(1)||"*"]=e[r]||[]).unshift(n):(e[r]=e[r]||[]).push(n)}}function ng(e,t,n,r){var i={},o=e===nf;function a(s){var u;return i[s]=!0,T.each(e[s]||[],function(e,s){var l=s(t,n,r);return"string"!=typeof l||o||i[l]?o?!(u=l):void 0:(t.dataTypes.unshift(l),a(l),!1)}),u}return a(t.dataTypes[0])||!i["*"]&&a("*")}function nv(e,t){var n,r,i=T.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&T.extend(!0,e,r),e}nd.href=t6.href,T.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:t6.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(t6.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":np,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":T.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?nv(nv(e,T.ajaxSettings),t):nv(T.ajaxSettings,e)},ajaxPrefilter:nh(nc),ajaxTransport:nh(nf),ajax:function(t,n){"object"==typeof t&&(n=t,t=void 0),n=n||{};var r,i,o,a,s,u,l,c,f,p,d=T.ajaxSetup({},n),h=d.context||d,g=d.context&&(h.nodeType||h.jquery)?T(h):T.event,v=T.Deferred(),m=T.Callbacks("once memory"),x=d.statusCode||{},b={},w={},C="canceled",j={readyState:0,getResponseHeader:function(e){var t;if(l){if(!a){a={};while(t=ns.exec(o))a[t[1].toLowerCase()+" "]=(a[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=a[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return l?o:null},setRequestHeader:function(e,t){return null==l&&(b[e=w[e.toLowerCase()]=w[e.toLowerCase()]||e]=t),this},overrideMimeType:function(e){return null==l&&(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(l)j.always(e[j.status]);else for(t in e)x[t]=[x[t],e[t]];return this},abort:function(e){var t=e||C;return r&&r.abort(t),E(0,t),this}};if(v.promise(j),d.url=((t||d.url||t6.href)+"").replace(nl,t6.protocol+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=(d.dataType||"*").toLowerCase().match(Q)||[""],null==d.crossDomain){u=y.createElement("a");try{u.href=d.url,u.href=u.href,d.crossDomain=nd.protocol+"//"+nd.host!=u.protocol+"//"+u.host}catch(e){d.crossDomain=!0}}if(ng(nc,d,n,j),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=T.param(d.data,d.traditional)),l)return j;for(f in(c=T.event&&d.global)&&0==T.active++&&T.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!nu.test(d.type),i=d.url.replace(no,""),d.hasContent?d.data&&d.processData&&0===(d.contentType||"").indexOf("application/x-www-form-urlencoded")&&(d.data=d.data.replace(ni,"+")):(p=d.url.slice(i.length),d.data&&(d.processData||"string"==typeof d.data)&&(i+=(t7.test(i)?"&":"?")+d.data,delete d.data),!1===d.cache&&(i=i.replace(na,"$1"),p=(t7.test(i)?"&":"?")+"_="+t8.guid+++p),d.url=i+p),d.ifModified&&(T.lastModified[i]&&j.setRequestHeader("If-Modified-Since",T.lastModified[i]),T.etag[i]&&j.setRequestHeader("If-None-Match",T.etag[i])),(d.data&&d.hasContent&&!1!==d.contentType||n.contentType)&&j.setRequestHeader("Content-Type",d.contentType),j.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+np+"; q=0.01":""):d.accepts["*"]),d.headers)j.setRequestHeader(f,d.headers[f]);if(d.beforeSend&&(!1===d.beforeSend.call(h,j,d)||l))return j.abort();if(C="abort",m.add(d.complete),j.done(d.success),j.fail(d.error),r=ng(nf,d,n,j)){if(j.readyState=1,c&&g.trigger("ajaxSend",[j,d]),l)return j;d.async&&d.timeout>0&&(s=e.setTimeout(function(){j.abort("timeout")},d.timeout));try{l=!1,r.send(b,E)}catch(e){if(l)throw e;E(-1,e)}}else E(-1,"No Transport");function E(t,n,a,u){var f,p,y,b,w,C=n;!l&&(l=!0,s&&e.clearTimeout(s),r=void 0,o=u||"",j.readyState=4*(t>0),f=t>=200&&t<300||304===t,a&&(b=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r){for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(d,j,a)),!f&&T.inArray("script",d.dataTypes)>-1&&0>T.inArray("json",d.dataTypes)&&(d.converters["text script"]=function(){}),b=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift()){if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o])){for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}}return{state:"success",data:t}}(d,b,j,f),f?(d.ifModified&&((w=j.getResponseHeader("Last-Modified"))&&(T.lastModified[i]=w),(w=j.getResponseHeader("etag"))&&(T.etag[i]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=b.state,p=b.data,f=!(y=b.error))):(y=C,(t||!C)&&(C="error",t<0&&(t=0))),j.status=t,j.statusText=(n||C)+"",f?v.resolveWith(h,[p,C,j]):v.rejectWith(h,[j,C,y]),j.statusCode(x),x=void 0,c&&g.trigger(f?"ajaxSuccess":"ajaxError",[j,d,f?p:y]),m.fireWith(h,[j,C]),c&&(g.trigger("ajaxComplete",[j,d]),--T.active||T.event.trigger("ajaxStop")))}return j},getJSON:function(e,t,n){return T.get(e,t,n,"json")},getScript:function(e,t){return T.get(e,void 0,t,"script")}}),T.each(["get","post"],function(e,t){T[t]=function(e,n,r,i){return("function"==typeof n||null===n)&&(i=i||r,r=n,n=void 0),T.ajax(T.extend({url:e,type:t,dataType:i,data:n,success:r},T.isPlainObject(e)&&e))}}),T.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),T._evalUrl=function(e,t,n){return T.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,scriptAttrs:t.crossOrigin?{crossOrigin:t.crossOrigin}:void 0,converters:{"text script":function(){}},dataFilter:function(e){T.globalEval(e,t,n)}})},T.fn.extend({wrapAll:function(e){var t;return this[0]&&("function"==typeof e&&(e=e.call(this[0])),t=T(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return"function"==typeof e?this.each(function(t){T(this).wrapInner(e.call(this,t))}):this.each(function(){var t=T(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t="function"==typeof e;return this.each(function(n){T(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){T(this).replaceWith(this.childNodes)}),this}}),T.expr.pseudos.hidden=function(e){return!T.expr.pseudos.visible(e)},T.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},T.ajaxSettings.xhr=function(){return new e.XMLHttpRequest};var ny={0:200};function nm(e){return e.scriptAttrs||!e.headers&&(e.crossDomain||e.async&&0>T.inArray("json",e.dataTypes))}T.ajaxTransport(function(e){var t;return{send:function(n,r){var i,o=e.xhr();if(o.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(i in e.xhrFields)o[i]=e.xhrFields[i];for(i in e.mimeType&&o.overrideMimeType&&o.overrideMimeType(e.mimeType),e.crossDomain||n["X-Requested-With"]||(n["X-Requested-With"]="XMLHttpRequest"),n)o.setRequestHeader(i,n[i]);t=function(e){return function(){t&&(t=o.onload=o.onerror=o.onabort=o.ontimeout=null,"abort"===e?o.abort():"error"===e?r(o.status,o.statusText):r(ny[o.status]||o.status,o.statusText,"text"===(o.responseType||"text")?{text:o.responseText}:{binary:o.response},o.getAllResponseHeaders()))}},o.onload=t(),o.onabort=o.onerror=o.ontimeout=t("error"),t=t("abort");try{o.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),T.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},converters:{"text script":function(e){return T.globalEval(e),e}}}),T.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),nm(e)&&(e.type="GET")}),T.ajaxTransport("script",function(e){if(nm(e)){var t,n;return{send:function(r,i){t=T("
+