/* Blog 归档（blog-archive-grid.php）+ 详情（blog-single-post.php）两个数据型
   widget 共用这一份 CSS，get_style_depends() 都指向 pages/blog-shared。

   🚩 2026-09-04：原来还有一个 blog-archive-header token 型 widget（快照名
   pages/blog-archive-header），渲染一个参考站没有的 "News & Insights" h1
   标题，已删除——见下面归档页那段注释。

   命名规范：这个文件里两类选择器并存——真实 Astra class（ast-*/entry-*/
   blog-tag-nav 等，来自参考站冻结）照抄不加前缀；本站自己发明、参考站没有
   对应元素的极少数辅助 class 才加 .jiesheng-blog- 前缀（目前只有下面
   .jiesheng-blog-single-wrap/-layout 两个，是详情页两栏布局的外层容器，
   参考站原生是主题级 PHP 模板结构，我们没有对应的原生外层 id/class 可用）。

   🚨 --display 坑（SPEC §1 硬约束）：给带 e-con/e-con-full/e-con-boxed class
   的元素写 display:flex/grid，必须同步写 --display 自定义属性。
   详见 home-shared.css 顶部注释和 capability-archive-header.css 里的先例。
*/

/* --display 补丁：blog-single-post.php 外层 `e-con-full e-flex e-con e-parent`
   包装层需要这条才能让 Elementor 真实的 `.e-con{display:var(--display)}`
   规则解析出 flex（--display 没设置时该规则等于没写）。归档页
   （blog-archive-grid.php）现在不再自己包一层 e-con/e-flex（真实参考站容器
   是 .ast-container，不是 Elementor 生成的），这条只服务详情页。 */
.e-flex {
	--display: flex;
	display: flex;
	flex-wrap: wrap;
}

/* ── 归档页（blog-archive-grid.php）──────────────────────────────────────
   2026-09-04 返工：第一版是自己发明的 class（jiesheng-blog-archive-*），跟
   项目其余页面"复制参考站真实 HTML/CSS"的方法不一致（用户反馈"和参考站样式
   不太一样，好像少了分类"查出来的），改成 jcrapid.com 归档页真实结构
   （Astra 主题原生博客归档模板，不是 Elementor 生成的）：
   `#primary.ast-blog-layout-4-grid.ast-grid-3` > `.blog-tag-nav` +
   `#main.site-main` > `.ast-row`（Bootstrap 风格三栏网格）> 逐篇
   `article.ast-article-post` > `.ast-pagination`。

   下面这段"自动抽取"来自 tools/extract-matching-css.py，源文件：
   - 参考站 blog/index.html 页面内联 <style>（BerqWP 关键 CSS，跟详情页
     那段一样不在任何独立 .css 文件里，另存临时文件抽取）
   - 主题 main.min.css（Astra 核心，含 Bootstrap 风格 .ast-container/
     .ast-row/.ast-grid-common-col/.ast-width-md-4 那套真实网格机制）
   - astra-child/style.css（`.blog-tag-nav .tag-button` 这几条真实规则只在
     子主题这份文件里，核心主题没有——tag-nav 是这个站自己加的定制，不是
     Astra 默认功能）
   - astra-addon CSS（用不上，抽取时一并传入，没有额外命中）

   🚩 `.ast-container` 这批规则在 header.css 里也抽取过一份（Astra 头部内部
   也用同一个 class）——两份来自同一个真实源、数值一致，不是冲突，是这个
   项目里"共享 Astra 基础规则在多个 snapshot CSS 里各自出现一份"的既有模式
   （capability-archive-header.css 末尾注释也提过这点）。*/
.blog-tag-nav .tag-button {
	display: inline-block;
	margin: 0 8px 10px;
	padding: 8px 16px;
	background: #f6f4f3;
	color: #333;
	border-radius: 30px;
	text-decoration: none;
	transition: 0.2s;
}
.blog-tag-nav .tag-button:hover {
	background: #E7823A;
	color: #fff;
}
.ast-container,.ast-container-fluid{margin-left:auto;margin-right:auto;padding-left:20px;padding-right:20px}
.ast-container{max-width:100%}
/* 🐛 2026-09-05 修复：这条 max-width:1440px 原来写的是裸 `.ast-container`，
   没有 `.site-content` 祖先限定——页头（header.html）内部也用了同一个真实
   Astra class `.ast-container` 包裹 logo/导航，这条规则会同时命中页头，
   把本该铺满视口的导航条限制到 1440px、两边留白（用户反馈"/blog/ 页头不是
   左右占满，其他页面正常"，头部的 .ast-container 不在 .site-content 里，
   补上这个祖先限定后就只命中博客内容区，跟下面 display:flex 那条的限定
   方式一致）。 */
@media (min-width:922px) { .site-content .ast-container{max-width:1440px} }
/* 2026-09-04 probe.py --map 复查发现漏了这条：没有 .site-content 祖先时
   .ast-container 停在 display:block，子元素宽度计算跟参考站真实的
   display:flex（flex 子元素宽度算法跟 block 不完全一样）差了 18px，改用
   flex 之后量出来就对上了。 */
.site-content .ast-container{display:flex}
.site-content .ast-container{flex-direction:column}
.ast-row{margin-left:-20px;margin-right:-20px}
.ast-grid-common-col{position:relative;min-height:1px;padding-left:20px;padding-right:20px}
.ast-full-width{width:100%}
@media (min-width:768px) { .ast-width-md-4{width:33.3333333333%} }
.ast-blog-layout-4-grid .ast-row{display:flex;flex-wrap:wrap;flex-flow:row wrap;align-items:stretch}
.ast-blog-layout-4-grid .ast-article-post{border:0}
.ast-blog-layout-4-grid .ast-article-inner{box-shadow:0px 6px 15px -2px rgba(16,24,40,0.05)}
.ast-blog-layout-4-grid .ast-article-inner .wp-post-image{width:100%}
@media (max-width:921px) { .ast-blog-layout-4-grid .ast-article-post{width:100%} }
.ast-article-post{margin-bottom:2.5em}
.ast-article-post:last-child{margin-bottom:0;border-bottom:0}
.ast-separate-container .ast-article-post{background-color:#fff;padding:1.5em}
.ast-separate-container .ast-blog-layout-4-grid .ast-article-post{display:flex}
.ast-article-inner{width:100%;overflow-wrap:break-word}
.blog-layout-4 .post-content,.blog-layout-4 .post-thumb{padding-left:0;padding-right:0}
.ast-blog-featured-section{margin-bottom:1.5em}
.entry-header+.ast-blog-featured-section{margin-top:.5em}
.blog .entry-title,.blog .entry-title a,.archive .entry-title,.archive .entry-title a{font-family:'Manrope',sans-serif;font-weight:700;line-height:1.23em}
.archive .entry-title,.blog .entry-title{line-height:1.3}
.entry-title{margin-bottom:.2em;font-size:20px;font-size:1.3333333333333rem}
.entry-title,.entry-title a{font-weight:var(--ast-blog-title-font-weight,normal)}
.entry-title a{color:var(--ast-global-color-2)}
.ast-excerpt-container{font-size:16px;font-size:1.0666666666667rem}
.ast-excerpt-container>p:last-child{margin-bottom:0}
.post-content>.read-more{margin-top:1.5em}
.read-more{margin-bottom:0}
.read-more a{display:inline-block}
.read-more .ast-right-arrow{font-size:1em}
/* 2026-09-04 用户反馈 "Read More » 按钮没颜色" 查出来的：这里没有专门的
   .read-more a{color:...} 规则，真实来源是全站通用的 `a{color:var(--ast-
   global-color-0)}`（参考站 blog/index.html 内联关键 CSS 里就是这一条裸
   标签选择器），第一版手工从 197 条自动抽取结果里挑规则时漏抄了这条。
   之前没有专门给 .read-more a 写规则是对的（真实参考站也没有），漏的是这条
   全局兜底——本站主题 style.css 自己的兜底是 `a{color:inherit}`，没有这条
   真实规则时链接看起来就是"跟着周围文字颜色走"，没有品牌色。 */
a{color:var(--ast-global-color-0)}
.ast-read-more-container a{font-size:16px;font-size:1.0666666666667rem}
.hentry{margin:0 0 1.5em}
.screen-reader-text{border:0;clip:rect(1px,1px,1px,1px);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal!important}

/* 三栏网格：真实机制是 .ast-row 负 margin -1em 抵消 .ast-grid-common-col 的
   padding，.ast-width-md-4 只定宽度百分比（33.33%），不是 flex-basis——保留
   这条真实规则，不用现代 CSS grid 重写。 */
@media (min-width:922px) {
	.ast-separate-container .ast-grid-3 > .site-main > .ast-row{margin-left:-1em;margin-right:-1em;display:flex;flex-flow:row wrap;align-items:stretch}
	.ast-separate-container .ast-grid-3 .ast-article-post{display:flex;padding:0}
	.ast-separate-container .ast-grid-3 .ast-article-post.ast-separate-posts{border-bottom:0}
}
@media (max-width:921px) {
	.ast-separate-container .ast-grid-3 .ast-article-post{width:100%}
	.ast-separate-container .ast-grid-md-1 .ast-article-post{width:100%}
}
@media (max-width:544px) {
	.ast-separate-container .ast-grid-sm-1 .ast-article-post{width:100%}
}

/* ── 分页 ──────────────────────────────────────────────────────────── */
/* 2026-09-04 probe.py --map 复查发现漏抠了这条（197 条自动抽取规则手工挑选进
   文件时漏了这一条）：display/padding-top/text-align 三个属性差异全部来自它。 */
.ast-pagination {display: inline-block;width: 100%;padding-top: 2em;text-align: center;}
.ast-pagination .nav-links{display:inline-block;width:100%}
.ast-pagination .page-numbers,.ast-pagination .page-navigation{font-size:16px;font-size:1.0666666666667rem}
.ast-pagination .page-numbers{display:inline-block;width:2.33333em;height:2.33333em;font-size:16px;font-size:1.06666rem;line-height:calc(2.33333em - 3px);font-weight:500;text-align:center}
.ast-pagination a,.nav-links a{color:var(--ast-global-color-0)}
.ast-pagination a:hover,.ast-pagination a:focus,.ast-pagination > span:hover:not(.dots),.ast-pagination > span.current{color:var(--ast-global-color-1)}
.post-page-numbers.current .page-link,.ast-pagination .page-numbers.current{color:#000;border-color:var(--ast-global-color-0);background-color:var(--ast-global-color-0)}
.ast-pagination .prev.page-numbers,.ast-pagination .next.page-numbers{padding:0 1.5em;height:2.33333em;line-height:calc(2.33333em - 3px)}
.ast-pagination-default .ast-pagination .next.page-numbers{padding-right:0}
.ast-pagination-default .ast-pagination .prev.page-numbers{padding-left:0}
.ast-pagination .prev.page-numbers{float:left}
.ast-pagination .next.page-numbers{float:right}
/* 2026-09-04 用户反馈 "NEXT 的右箭头换行到下面去了" 查出来的：.next 同时
   命中上面 `.ast-pagination .page-numbers{width:2.33333em}`（那条本来是给
   "1"/"2"/"3" 这种单个数字按钮定的固定宽度），"Next →" 文字比 2.33333em
   （约 37px）宽，装不下就把箭头挤到下一行。真实规则里有这条专门覆盖
   prev/next 为 width:auto，用 .prev/.next 裸类选择器（不带 .page-numbers），
   同选择器数量的规则源码顺序在 .page-numbers 那条之后，赢过去。第一版从
   197 条自动抽取结果里手工挑规则时漏抄了这条。 */
.ast-pagination .prev,.ast-pagination .prev:visited,.ast-pagination .prev:focus,.ast-pagination .next,.ast-pagination .next:visited,.ast-pagination .next:focus{display:inline-block;width:auto}
@media (max-width:420px) {
	.ast-pagination .prev.page-numbers,.ast-pagination .next.page-numbers{width:100%;text-align:center;margin:0}
}

/* ── 详情页（blog-single-post.php）──────────────────────────────────────
   2026-09-04 返工：第一版是自己发明的 class（jiesheng-post-*），跟项目其余
   页面"复制参考站真实 HTML/CSS"的方法不一致，返工改成 jcrapid.com 详情页
   真实结构（Astra 主题原生单篇文章模板，不是 Elementor 生成的）。真实 class：
   `.ast-article-single` > `.entry-header`（`.entry-title`/`.entry-meta`/
   `.post-thumb-img-content`）+ `.entry-content` + `.post-navigation`。
   下面这段"自动抽取"来自参考站详情页里两份内联 <style>（不是外部 .css 文件——
   这个页面大部分排版规则是 BerqWP 性能插件内联进页面 <head> 的"关键 CSS"，
   不在任何独立 .css 源文件里，tools/extract-matching-css.py 照样能处理，
   只是 --sources 传的是从页面里摘出来的内联块另存的临时文件，不是磁盘上
   本来就有的 .css）+ 主题自带的 main.min.css。

   真实规则大量要求祖先带 `.ast-separate-container`/`.single` class 才生效
   （Astra"独立卡片"布局：文章是白底+内边距的卡片，不是贴底色摊平），我们
   不是 Astra 主题、原生没有这两个 class——补的方式不是把选择器里的祖先
   要求删掉重写（那样等于自己编规则，不是冻结），是给 <body> 补上这两个
   class 让真实规则按原样生效，见 inc/theme-header-footer.php
   jiesheng_blog_single_body_class()。

   🚩 2026-09-04 补：第一版详情页没做 `#secondary` 侧边栏（当时理由是"没有
   侧边栏内容可放"），用户直接问"参考站右侧还有东西呢，我们为什么没有"才
   发现这个理由站不住——真去查了参考站真实侧边栏，3 个 widget（Search/
   Recent Posts/Categories）全部是 WordPress/Astra 原生就有的动态数据源
   （搜索框、最新文章列表、分类列表），不需要另外的内容决策，补起来成本
   很低，这次补上了。两栏比例 70%/30% 是从参考站内联 CSS 里实测出来的
   真实值（`@media (min-width:922px){#primary{width:70%}#secondary{width:30%}}`），
   不是凭感觉定的。

   🚩 2026-09-04 补：用户问"整体宽度还是比参考站窄，难点在哪"，之前一直把
   这条归为"70/30 网格近似值，跟真实 Astra 网格算法对不上"的系统性差异，
   偷懒没有细查——实测发现这个归因是错的，真正原因是两个可以精确修的
   具体数字：① 用 tools/probe/probe.py 直接量参考站详情页 `.ast-container`
   真实 computed width 是 1400px（不是猜的 1200px），padding 左右各 20px，
   内容区实际 1360px；② 参考站两栏用的是 `display:flex`，**没有** gap，
   "两栏间隙"整个是 `#secondary` 自己的 `padding-left:30px` 吃掉自己
   30% 份额里的一部分做出来的，`#primary` 完全没有右内边距/右边框。
   我们用 CSS Grid 的 `gap:48px` 是自己发明的机制——网格布局下 gap 会先从
   可用宽度里扣掉再按 70/30 分，等于两栏比真实的还要再各窄一截，两个错误
   叠加。改法：外层宽度对齐 1400/20px（内容区 1360px 完全对上），去掉
   grid 的 gap（间隙已经由下面 `#secondary{padding-left:30px}` 那条真实
   规则提供，不用再加一份）。 */

.jiesheng-blog-single-wrap {
	max-width: 1400px;
	padding: 56px 20px 72px;
	box-sizing: border-box;
}

.jiesheng-blog-single-layout {
	display: grid;
	grid-template-columns: 1fr;
}

@media (min-width: 922px) {
	.jiesheng-blog-single-layout {
		grid-template-columns: 70% 30%;
	}
}

/* === 自动抽取：参考站 guides/aluminum-cnc-machining/ +
   blog/cnc-machining-pricing-calculated/ 两篇详情页真实内联 <style>
   （BerqWP 关键 CSS）+ 主题 main.min.css，按类名精确匹配抽取，
   minified 原文，未重新排版，来源同 tools/extract-matching-css.py 的约定 === */
.entry-content h1,h1{color:#808285;font-size:2em;line-height:1.2}
.entry-content h2,h2{color:#808285;font-size:1.7em;line-height:1.3}
.entry-content h3,h3{color:#808285;font-size:1.5em;line-height:1.4}
.entry-content h4,h4{color:#808285;line-height:1.5;font-size:1.3em}
.entry-content h5,h5{color:#808285;line-height:1.6;font-size:1.2em}
.entry-content h6,h6{color:#808285;line-height:1.7;font-size:1.1em}
.entry-content[data-ast-blocks-layout]>embed,.entry-content[data-ast-blocks-layout]>iframe,.entry-content[data-ast-blocks-layout]>object,embed,iframe,object{max-width:100%}
.entry-content h1,.entry-content h2,.entry-content h3,.entry-content h4,.entry-content h5,.entry-content h6{margin-bottom:20px}
.ast-single-post .entry-title,.ast-single-post .entry-title a{line-height:1.2}
.entry-title,.entry-title a{font-weight:var(--ast-blog-title-font-weight,normal)}
.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single:not(.ast-related-post){background-color:#fff}
.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single{border-bottom:1px solid var(--ast-border-color);margin:0;padding:5.34em 6.67em}
.ast-separate-container .ast-article-single{border-bottom:0}
@media (max-width:1200px) {
.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single{margin:0;padding:3.34em 2.4em}
}
.site-main .comment-navigation,.site-main .post-navigation,.site-main .posts-navigation{margin:0 0 1.5em;overflow:hidden}
.comment-navigation .nav-previous,.post-navigation .nav-previous,.posts-navigation .nav-previous{position:relative;text-align:left}
.comment-navigation .nav-next,.post-navigation .nav-next,.posts-navigation .nav-next{grid-column-start:2;text-align:right}
.post-navigation a{background:0 0;font-size:1.06666rem;font-size:1rem;padding:0 var(--ast-post-nav-space,1.5em);height:2.33333em;line-height:calc(2.33333em - 3px)}
.entry-content>:last-child,.entry-summary>:last-child,.page-content>:last-child{margin-bottom:0}
.page .entry-header{margin-bottom:1.5em}
.search .entry-header{margin-bottom:1em}
.ast-single-post .entry-header.ast-header-without-markup,.ast-single-post .entry-header.ast-no-title.ast-no-thumbnail{margin-bottom:0}
.entry-header{margin-bottom:1.2em;word-wrap:break-word}
.entry-header+.ast-blog-featured-section{margin-top:.5em}
.blog-layout-6 .entry-header+.ast-blog-featured-section{margin-top:0}
.entry-content{word-wrap:break-word}
.entry-content .wp-audio-shortcode,.entry-content .wp-embedded-audio,.entry-content .wp-embedded-video,.entry-content .wp-video,.entry-content p{margin-bottom:1.6em}
.entry-content .wp-embedded-audio,.entry-content .wp-embedded-video{display:inline-block}
.entry-content::after{display:table;clear:both;content:''}
.read-more .ast-right-arrow{font-size:1em}
.ast-no-thumb .entry-header+.ast-blog-featured-section{margin-top:0}
.archive .entry-title,.blog .entry-title,.search .entry-title{line-height:1.3}
.archive .format-aside .entry-title,.archive .format-status .entry-title,.blog .format-aside .entry-title,.blog .format-status .entry-title{display:none}
.entry-title{margin-bottom:.2em}
.blog-layout-1 .post-thumb{padding-left:0;padding-right:0;position:relative}
.blog .posted-on{z-index:1}
.single .entry-header{margin-bottom:2em}
.single .post-navigation{margin:0;padding:2em 0 0;border-top:1px solid var(--ast-single-post-border,var(--ast-border-color))}
@media (max-width:768px) {
.single .post-navigation{padding-top:1.5em}
}
.single .post-navigation a{margin:2px;display:inline-block;color:#000}
.single .post-navigation a p{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}
@media (min-width:421px) {
.single .post-navigation .nav-links{-js-display:flex;display:flex;width:100%}
.single .post-navigation .nav-links:not(:has(.nav-previous)){justify-content:flex-end}
.single .post-navigation .nav-links .nav-previous+.nav-next{width:50%}
.single .post-navigation .nav-next,.single .post-navigation .nav-previous{width:50%}
}
@media (max-width:420px) {
.single .post-navigation .ast-left-arrow,.single .post-navigation .ast-right-arrow{display:none}
.single .post-navigation .nav-links:not(:has(.nav-previous)){justify-content:flex-end}
.single .post-navigation .nav-next,.single .post-navigation .nav-previous{width:50%}
.single .post-navigation .nav-next a,.single .post-navigation .nav-previous a{max-width:95%;width:100%}
.single .post-navigation .nav-previous{margin-bottom:1em}
}
.single .entry-header .post-thumb{margin-bottom:2em}
.single .entry-header .post-thumb img{margin-top:0;margin-bottom:0}
.page .has-post-thumbnail .post-thumb img{margin-bottom:1.5em}
.ast-separate-container .post-navigation{border-top:0;padding-left:var(--ast-post-nav-space,3.33333em);padding-right:var(--ast-post-nav-space,3.33333em)}
@media (max-width:420px) {
.ast-separate-container .post-navigation{padding-left:0;padding-right:0}
}
@media (max-width:768px) {
.ast-separate-container .entry-header{margin-bottom:1em}
}
.blog-layout-1 .posted-on{left:0}
.blog-layout-1 .post-content,.blog-layout-1 .post-thumb{padding-left:0;padding-right:0}
h1,h2,.entry-content h2,h3,.entry-content h3{font-family:'Manrope',sans-serif;font-weight:700}
h2,.entry-content h2{font-size:44px;font-weight:700;font-family:'Manrope',sans-serif;line-height:1.1em}
h3,.entry-content h3{font-size:28px;font-weight:700;font-family:'Manrope',sans-serif;line-height:1.4em}
body,h1,h2,.entry-content h2,h3,.entry-content h3{color:var(--ast-global-color-3)}
.single .nav-links .nav-previous,.single .nav-links .nav-next{color:var(--ast-global-color-0)}
.entry-meta,.entry-meta *{line-height:1.45;color:var(--ast-global-color-0)}
.entry-meta a:not(.ast-button):hover,.entry-meta a:not(.ast-button):hover *,.entry-meta a:not(.ast-button):focus,.entry-meta a:not(.ast-button):focus *,.post-navigation a:hover{color:var(--ast-global-color-1)}
.single .post-navigation a{color:var(--ast-global-color-0);line-height:1em;height:inherit}
@media (max-width:420px) {
.single .nav-links .nav-previous,.single .nav-links .nav-next{width:100%;text-align:center}
}
.ast-separate-container .ast-article-single{padding:3em}
.entry-title{margin-bottom:0.5em}
@media (max-width:921px) {
h2,.entry-content h2{font-size:32px}
h3,.entry-content h3{font-size:27px}
}
@media (max-width:544px) {
h2,.entry-content h2{font-size:28px}
h3,.entry-content h3{font-size:24px}
}
.entry-content ul,.entry-content ol{padding:revert;margin:revert}
header.entry-header .entry-title{font-weight:700;font-size:50px}
header.entry-header>*:not(:last-child){margin-bottom:10px}
@media (max-width:921px) {
header.entry-header .entry-title{font-size:44px}
}
@media (max-width:544px) {
header.entry-header .entry-title{font-size:32px}
}
h1,h2,.entry-content h2,h3,.entry-content h3{color:var(--ast-global-color-2)}
.ast-separate-container .ast-article-single:not(.ast-related-post){background-color:var(--ast-global-color-6);background-image:none}
@media (max-width:921px) {
.ast-separate-container .ast-article-single:not(.ast-related-post){background-color:var(--ast-global-color-4);background-image:none}
}
@media (max-width:544px) {
.ast-separate-container .ast-article-single:not(.ast-related-post){background-color:var(--ast-global-color-4);background-image:none}
}
.single .post-navigation a{padding:8px 14px;font-size:14px;color:var(--ast-global-color-3);border:1px solid var(--ast-single-post-border,var(--ast-border-color));border-radius:4px}
.ast-separate-container.single .post-navigation a{background-color:var(--ast-global-color-primary,--ast-global-color-5)}
.ast-separate-container .ast-article-single{padding-right:15%;padding-left:15%}
@media (max-width:921px) {
.ast-separate-container .ast-article-single{padding-top:1.5em;padding-bottom:1.5em;padding-right:2.14em;padding-left:2.14em}
}
@media (max-width:544px) {
.ast-separate-container .ast-article-single{padding-top:1.5em;padding-bottom:1.5em;padding-right:1em;padding-left:1em}
}
h1.entry-title{display:var(--page-title-display)}
.entry-content blockquote.elementor-blockquote:not(.alignright):not(.alignleft){margin-right:0;margin-left:0}
h1,.entry-content h1,h2,.entry-content h2,h3,.entry-content h3,h4,.entry-content h4,h5,.entry-content h5,h6,.entry-content h6,.site-title,.site-title a{font-family:'Manrope',sans-serif;font-weight:700}
h1,.entry-content h1{font-size:72px;font-weight:700;font-family:'Manrope',sans-serif;line-height:1.1em}
h4,.entry-content h4{font-size:22px;line-height:1.4em;font-weight:700;font-family:'Manrope',sans-serif}
h5,.entry-content h5{font-size:18px;line-height:1.4em;font-weight:700;font-family:'Manrope',sans-serif}
h6,.entry-content h6{font-size:15px;line-height:1.4em;font-weight:700;font-family:'Manrope',sans-serif;text-transform:uppercase;letter-spacing:2px}
body,h1,.entry-title a,.entry-content h1,h2,.entry-content h2,h3,.entry-content h3,h4,.entry-content h4,h5,.entry-content h5,h6,.entry-content h6{color:var(--ast-global-color-3)}
.entry-content[data-ast-blocks-layout]>figure{margin-bottom:1em}
.ast-separate-container .ast-article-post,.ast-separate-container .ast-article-single,.ast-separate-container .comment-respond{padding:3em}
.ast-separate-container .ast-article-single .ast-article-single{padding:0}
@media (max-width:921px) {
h1,.entry-content h1{font-size:48px}
h4,.entry-content h4{font-size:22px}
h5,.entry-content h5{font-size:18px}
h6,.entry-content h6{font-size:15px}
}
@media (max-width:544px) {
h1,.entry-content h1{font-size:38px}
h4,.entry-content h4{font-size:20px}
h5,.entry-content h5{font-size:18px}
h6,.entry-content h6{font-size:15px}
}
.entry-title a{color:var(--ast-global-color-2)}
/* === 自动抽取结束 === */

/* ── 正文表格 ──────────────────────────────────────────────────────────
   2026-09-04 补：用户指出"参考站有些是表格样式的东西"，第一版抽取正文时
   table/tr/td 没在允许标签白名单里，表格结构被拍平成纯文字段落，表格
   本身的样式自然也没跟着做。真实参考站表格 CSS 散落在好几条选择器里
   （核心是 border-collapse:separate + 1px 边框 + .7em/1em 内边距这套组合，
   跟 WooCommerce 订单表/日历小工具的 td/th 规则混在一起，那些跟我们的
   博客正文无关），这里手写一份等效样式，不是照抄某一条选择器的原文。 */
.entry-content table {
	border-collapse: collapse;
	width: 100%;
	margin: 0 0 1.6em;
}
.entry-content th,
.entry-content td {
	border: 1px solid var(--border);
	padding: 0.7em 1em;
	text-align: left;
}
.entry-content th {
	font-weight: 600;
	background: var(--surface-alt);
}

/* ── 详情页右侧栏（Search/Recent Posts/Categories）──────────────────────
   2026-09-04 补：跟表格是同一次用户反馈补的——第一版详情页没做侧边栏，
   下面这段"自动抽取"来自参考站真实侧边栏 3 个小工具的样式（Gutenberg
   区块小工具：Search/Latest Posts/Categories 区块，跟 WooCommerce 相关的
   按钮规则选择器虽然长，但那批规则本来就同时管着"所有按钮/输入框"的通用
   样式，我们的搜索框按钮也在命中范围内，不是抽错了，保留。

   🚩 2026-09-04 第二次修：用户反馈"右侧样式还是不太一样"，用 probe.py --map
   对 #secondary 下 10 个采样点逐属性核对，找到的都是"规则确实抽了，但被
   同优先级/更高优先级的另一条真实规则盖掉了"这一类坑，不是重新发明——
   每条都有对应真实来源，见各条注释。 */
/* 参考站真实 `#secondary{margin:4em 0 2.5em}` +
   `.ast-right-sidebar #secondary{padding-left:30px;padding-right:0}`——
   这两条各自散落在好几条互相覆盖的规则里（同一个属性被改了三四次，
   最终生效的是源码顺序最后那条），没有去追整条覆盖链，直接按 probe.py
   实测出来的最终计算值写死在这一条规则里。 */
#secondary {
	margin: 60px 0 37.5px;
	padding-left: 30px;
	padding-right: 0;
}

.widget { margin: 0 0 2.8em 0; }
.widget:last-child { margin-bottom: 0; }
.widget ul { margin: 0; list-style-type: none; }
.widget-title,
.widget .wp-block-heading { font-size: 21px; color: var(--ast-global-color-2); margin-bottom: 0.7em; }
.ast-separate-container.ast-two-container #secondary .widget {
	background-color: var(--ast-global-color-6);
	padding: 2em;
	margin-bottom: 2em;
}

/* 真实规则是 `#secondary h2{font-size:1.7rem}`（ID+标签选择器，特异度
   1-0-1，比上面 `.widget .wp-block-heading{font-size:21px}` 0-2-0 更高），
   但 1.7rem 在参考站等于 25.5px 是因为参考站真实把 `html` 根字号设成了
   93.75%（=15px，跟 body 字号一致）——我们的 `html` 字号是浏览器默认 16px，
   同样写 1.7rem 会算成 27.2px，不是 25.5px。这里没有跟着把 `html` 根字号
   也改成 93.75%：header.css/about-shared.css/industry-archive-header.css/
   material-archive-header.css 这几个已经上线验收过的模块也用了 rem 单位，
   贸然改全局根字号会连带改变那些页面的实际渲染尺寸，等于用侧边栏这一个
   反馈去动了别的已验收范围，风险跟收益不对等。直接写死实测出来的 px 值，
   只影响这一个选择器。 */
#secondary h2 { font-size: 25.5px; }

/* Gutenberg 区块编辑器全局间距规则（`.wp-block-group.is-layout-flow` 是我们
   Recent Posts/Categories 两个 widget 外层真实带的 class）：块内第一个子元素
   顶部外边距清零，其余子元素顶部外边距 24px——这条本来就是 WordPress 核心
   区块库自带的全局样式，不是 Astra 专属，第一版抽取时当成"跟 wp-block-cover/
   media-text 一样的无关噪音"删掉了，实际上标题的 margin-top 就是靠它清零的，
   删掉之后标题多出一截浏览器默认 h2 外边距（0.83em），实测跟这条对上。 */
:root :where(.is-layout-flow) > :first-child { margin-block-start: 0; }
:root :where(.is-layout-flow) > * { margin-block-start: 24px; margin-block-end: 0; }

/* 侧边栏里的纯文本链接（Recent Posts 标题、Categories 项）参考站真实颜色是
   品牌橙（全站默认链接色 `a{color:var(--ast-global-color-0)}`，比我们主题
   `style.css` 里 `a{color:inherit}` 的兜底值更靠后生效）——这里只在侧边栏
   范围内改，不动全站默认链接色（怕影响别的已经调好的页面，这条只处理
   这次反馈到的范围）。 */
#secondary a { color: var(--ast-global-color-0); }
#secondary a:hover { color: var(--ast-global-color-1); }

/* 真实规则选择器是 `.wp-block-latest-posts>li>*`（作用在 li 的直接子元素
   <a> 上，不是 li 本身），之前写成了 `>li`，li 上加 margin 因为 li 是
   list-item 显示、上下 margin 不会体现在视觉间距里，实测链接本身间距是 0，
   跟参考站差 12px。 */
.wp-block-latest-posts > li > *:first-child { margin-top: 0; }
.wp-block-latest-posts > li > * { margin-top: 12px; margin-bottom: 12px; }
/* Categories 列表项间距实测也是 12px，来源是 WordPress 核心区块库
   （wp-block-library）给 `.wp-block-categories-list li` 的默认间距，
   不在 Astra 主题自己的样式表/这次抓的两份内联关键 CSS 里，抽取工具找
   不到这条真实规则的原文，直接按实测值写。 */
.wp-block-categories-list li { margin-bottom: 12px; }
.wp-block-categories-list li:last-child { margin-bottom: 0; }

.wp-block-search__inside-wrapper {
	display: flex;
	flex-wrap: nowrap;
	max-width: 100%;
}
/* padding/颜色是真实规则 `.wp-block-search__inside-wrapper .wp-block-search__input
   {padding:0 10px;color:var(--ast-global-color-3);border-color:var(--ast-border-color)}`
   （两个类选择器）——之前写的 `.wp-block-search__input{padding:8px}`
   （一个类选择器）特异度更低，源码顺序也更靠前，两头都输，从没生效过。 */
.wp-block-search__input {
	flex-grow: 1;
	min-width: 3rem;
	padding: 0 10px;
	color: var(--ast-global-color-3);
	border: 1px solid var(--ast-border-color);
	border-radius: 2px;
}
.wp-block-search__button,
.wp-block-search .wp-block-search__button {
	margin-left: 10px;
	border: 2px solid var(--ast-global-color-0);
	background-color: var(--ast-global-color-0);
	color: var(--ast-global-color-4);
	font-family: 'Manrope', sans-serif;
	font-weight: 600;
	line-height: 1em;
	border-radius: 50px;
	padding: 16px 36px;
}
/* 真实规则 `#secondary .wp-block-search__button{padding:.7em 1em}`（ID+类，
   特异度 1-1-0）专门覆盖侧边栏场景的按钮尺寸，比上面这条全局按钮规则
   （0-2-0）更高——参考站侧边栏搜索按钮实测比首页/详情页正文里的大 CTA
   按钮小一圈（15px 字号、10.5px/15px 内边距），不是同一个尺寸，之前当成
   同一套按钮直接复用了首页 CTA 的大尺寸，量出来才发现这里单独覆盖过。 */
#secondary .wp-block-search__button {
	font-size: 15px;
	padding: 0.7em 1em;
}
.wp-block-search__button:hover {
	background-color: var(--ast-global-color-1);
	border-color: var(--ast-global-color-1);
}

/* ── Elementor 通用规则（自动抽取段，来自 capability-archive-header.css 末尾已有内容）──
   blog-shared.css 复用同一批 Elementor 容器 CSS，不重复粘贴——这些规则由
   capability-archive-header.css 已经注册，同一页面只需要加载一个 handle 即可。
   如果某页面只有 blog widget、没有 capability widget，需要把 Elementor 容器规则
   补进来；这里先留空，等实际遇到样式缺失时再从 capability-archive-header.css
   末尾复制过来（避免两份文件同时加载时重复规则）。

   🚩 但下面这条居中覆盖跟"要不要重复粘贴那批规则"无关——真正生效的是
   Elementor 插件自己的 assets/css/frontend.min.css（不是我们任何一份快照
   CSS 的复制品），只要页面上有 Elementor container 就一定加载，不看
   blog-shared.css 有没有复制那批规则。
*/

/* ── Blog 详情页容器没有居中（跟首页 home-shared.css 同一个坑，第六次遇到）──
   `.jiesheng-blog-single-wrap`（详情页外层）自己带真实 Elementor `e-con`
   class，自己写的 `margin:0 auto` 会被 Elementor 真实 `.e-con{margin-inline-
   start:var(--margin-left);margin-inline-end:var(--margin-right)}`
   （`--margin-left`/`--margin-right` 默认链到具体值 0px）用同优先级、源码
   更靠后的规则吃成 0——2026-09-04 修 wire-post-single-template.php 的
   content_width:full 之前，外层父容器意外地比 1200px 窄（Elementor 默认
   boxed 兜底值 1140px），让这个坑没有暴露出来（子元素撑不满父容器时，
   margin:auto 和 margin:0 看起来一样）；父容器改成真正的 100% 全宽之后，
   这条坑就会显形。

   归档页（blog-archive-grid.php 的 `.ast-container`）2026-09-04 返工后不再
   带 `e-con` class（真实参考站容器本来就不是 Elementor 生成的），选择器
   压根不命中，天生绕开，不用加进这条规则。 */
.jiesheng-blog-single-wrap {
	margin-left: auto;
	margin-right: auto;
}
