/* PrismJS 1.29.0
https://prismjs.com/download.html#themes=prism-tomorrow&languages=markup+css+clike+javascript+aspnet+bash+c+csharp+cpp+dart+git+go+java+kotlin+latex+markup-templating+mongodb+nginx+php+python+ruby+rust+sql+swift+typescript&plugins=line-numbers */
code[class*=language-],pre[class*=language-]{color:#ccc;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}
pre[class*=language-].line-numbers{position:relative;padding-left:3.8em;counter-reset:linenumber}pre[class*=language-].line-numbers>code{position:relative;white-space:inherit}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:-3.8em;width:3em;letter-spacing:-1px;border-right:1px solid #999;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.8em;text-align:right}

/* ============================================================================
 * Prism toolbar 官方样式（prismjs 1.29.0，未改动）
 * 对应 plugin/tiny/prism/prism-toolbar.min.js
 * 默认 .toolbar{opacity:0} + :hover{opacity:1}，下面第 ③ 段会改成常显
 * ========================================================================== */
div.code-toolbar{position:relative}div.code-toolbar>.toolbar{position:absolute;z-index:10;top:.3em;right:.2em;transition:opacity .3s ease-in-out;opacity:0}div.code-toolbar:hover>.toolbar{opacity:1}div.code-toolbar:focus-within>.toolbar{opacity:1}div.code-toolbar>.toolbar>.toolbar-item{display:inline-block}div.code-toolbar>.toolbar>.toolbar-item>a{cursor:pointer}div.code-toolbar>.toolbar>.toolbar-item>button{background:0 0;border:0;color:inherit;font:inherit;line-height:normal;overflow:visible;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}div.code-toolbar>.toolbar>.toolbar-item>a,div.code-toolbar>.toolbar>.toolbar-item>button,div.code-toolbar>.toolbar>.toolbar-item>span{color:#bbb;font-size:.8em;padding:0 .5em;background:#f5f2f0;background:rgba(224,224,224,.2);box-shadow:0 2px 0 0 rgba(0,0,0,.2);border-radius:.5em}div.code-toolbar>.toolbar>.toolbar-item>a:focus,div.code-toolbar>.toolbar>.toolbar-item>a:hover,div.code-toolbar>.toolbar>.toolbar-item>button:focus,div.code-toolbar>.toolbar>.toolbar-item>button:hover,div.code-toolbar>.toolbar>.toolbar-item>span:focus,div.code-toolbar>.toolbar>.toolbar-item>span:hover{color:inherit;text-decoration:none}

/* ============================================================================
 * tiny（TinyMCE 6.7.3 + Prism 1.29.0）代码块显示增强
 * ----------------------------------------------------------------------------
 * ① 桌面端（≥768px）：保持不折行 + 横向滚动（代码整齐、可左右拖动）
 * ② 手机端（<768px）：自动换行，不出现横向滚动条（不用左右拖才能看全）
 * ③ 复制按钮常显：Prism 默认靠 :hover 才显示 .toolbar，触屏没有 hover 状态，
 *    手机上永远看不到按钮 —— 所以改成始终显示。
 * ④ 行号：桌面沿用 Prism 原生 line-numbers；手机端折行会让原生行号错位，
 *    改用「按逻辑行分块 + CSS 计数器」的自研行号（JS 见 hook/thread_js.htm）。
 *
 * 加在本文件最后：本文件自身的顺序在 Prism 主题规则之后，同权重可覆盖；
 * 需要压过内联/更早规则的地方再加 !important。
 * ========================================================================== */

/* ---------- ① 桌面：不折行 + 横向滚动 ---------- */
pre[class*=language-],
pre[class*=language-] code[class*=language-],
pre[class*=language-].line-numbers > code,
.message pre[class*=language-],
.message pre[class*=language-] code[class*=language-] {
	white-space: pre;			/* 不折行 */
	word-wrap: normal;
	word-break: normal;
	overflow-wrap: normal;
	tab-size: 4;
	-moz-tab-size: 4;
}
pre[class*=language-] {
	max-width: 100%;
	overflow-x: auto;			/* 代码过长时横向滚动 */
	-webkit-overflow-scrolling: touch;	/* iOS 惯性滚动更顺滑 */
}
/* 横向滚动条做细一点，提示"这里可以左右滑" */
pre[class*=language-]::-webkit-scrollbar { height: 8px; }
pre[class*=language-]::-webkit-scrollbar-track { background: rgba(255,255,255,.06); }
pre[class*=language-]::-webkit-scrollbar-thumb { background: rgba(255,255,255,.22); border-radius: 4px; }

/* ---------- ② 手机：自动换行，取消横向滚动 ---------- */
@media (max-width: 767.98px) {
	pre[class*=language-],
	pre[class*=language-] code[class*=language-],
	pre[class*=language-].line-numbers > code,
	.message pre[class*=language-],
	.message pre[class*=language-] code[class*=language-] {
		white-space: pre-wrap !important;	/* 覆盖 Prism 原始的 white-space:pre */
		word-break: break-word;
		overflow-wrap: anywhere;		/* 超长无空格串（长 URL / base64）也能断行 */
	}
	pre[class*=language-] { overflow-x: hidden; }
	/* 行号不再隐藏了：手机端的行号由第 ④ 段的 .xn-code-line 提供（折行也不会错位）。
	   这里只压掉 Prism 原生行号，防止万一残留时两套行号叠在一起。 */
	pre[class*=language-].line-numbers { padding-left: 1em; }
	pre[class*=language-].line-numbers .line-numbers-rows { display: none !important; }
}

/* ---------- ③ 复制按钮常显 ---------- */
div.code-toolbar > .toolbar {
	opacity: 1 !important;
	transition: none;
}
/* 按钮常显后会压住代码首行的右侧，给 pre 预留出工具栏高度。
   注意同时保留 line-numbers 的 padding-left:3.8em（只改 padding-top） */
div.code-toolbar > pre[class*=language-] {
	padding-top: 2.4em;
}
div.code-toolbar > pre[class*=language-].line-numbers {
	padding-left: 3.8em;
}
/* 按钮外观：tomorrow 是深色底，用半透明亮色按钮 */
div.code-toolbar > .toolbar > .toolbar-item > button,
div.code-toolbar > .toolbar > .toolbar-item > a,
div.code-toolbar > .toolbar > .toolbar-item > span {
	display: inline-block;
	background: rgba(255,255,255,.16) !important;
	color: #e8e8e8 !important;
	border: 1px solid rgba(255,255,255,.14) !important;
	border-radius: 4px !important;
	box-shadow: none !important;
	padding: 3px 10px !important;
	font-size: 12px !important;
	line-height: 1.6 !important;
	cursor: pointer;
	-webkit-user-select: none;
	user-select: none;
	-webkit-tap-highlight-color: transparent;
}
div.code-toolbar > .toolbar > .toolbar-item > button:hover,
div.code-toolbar > .toolbar > .toolbar-item > a:hover,
div.code-toolbar > .toolbar > .toolbar-item > span:hover {
	background: rgba(255,255,255,.3) !important;
	color: #fff !important;
	text-decoration: none !important;
}
/* 复制成功/失败时轻微变色，给用户反馈 */
div.code-toolbar > .toolbar > .toolbar-item > button[data-copy-state=copy-success] {
	background: rgba(72,187,120,.35) !important;
	color: #fff !important;
}
div.code-toolbar > .toolbar > .toolbar-item > button[data-copy-state=copy-error] {
	background: rgba(245,101,101,.35) !important;
	color: #fff !important;
}
@media (max-width: 767.98px) {
	div.code-toolbar > .toolbar { top: .25em; right: .25em; }
	div.code-toolbar > .toolbar > .toolbar-item > button,
	div.code-toolbar > .toolbar > .toolbar-item > a,
	div.code-toolbar > .toolbar > .toolbar-item > span {
		padding: 2px 8px !important;
		font-size: 11px !important;
	}
}

/* ---------- 帖子正文里代码块的圆角（视觉收口） ---------- */
.message pre[class*=language-] { border-radius: 2px; }

/* ============================================================================
 * ④ 手机端行号：按逻辑行分块 + CSS 计数器
 * ----------------------------------------------------------------------------
 * 为什么不用 Prism 自带的 line-numbers：
 *   它把行号做成「绝对定位 + 固定 top =（行号-1）×行高」，一行一个固定高度。
 *   手机端代码要自动换行，一个逻辑行会占 2~3 个视觉行，行号就会越错越远。
 *   （上一轮的做法是手机端干脆隐藏行号，这次改成真正的行号。）
 *
 * 做法（JS 见 plugin/tiny/hook/thread_js.htm 的 tinyPrismLineSplit）：
 *   高亮完成后把 <code> 切成一个个 .xn-code-line 块，每个块就是一个逻辑行，
 *   行号用 CSS 计数器 ::before 生成 —— 每块自带一个行号，
 *   块内怎么折行都不会影响其它行的行号。折行后的续行对齐到行号栏右侧（悬挂缩进）。
 *
 * 本段**不写媒体查询**：手机竖屏切成行块后，横屏 / 旋转到宽屏时仍是这套结构，
 * 样式必须一直有效；桌面端不会走到这套结构（继续用 Prism 原生行号）。
 * ========================================================================== */

/* 兜底：万一某个块残留了 Prism 原生行号容器，别和我们自己的行号叠加 */
code.xn-lines .line-numbers-rows { display: none !important; }

code.xn-lines {
	display: block;			/* 让下面的 .xn-code-line 成为真正的块级行 */
	position: relative;		/* ::after 分隔线的定位基准 */
	counter-reset: xn-line;		/* 行号计数器 */
}
code.xn-lines > .xn-code-line {
	display: block;
	position: relative;
	padding-left: 2.85em;		/* 行号栏宽度；折行后的续行也缩进到这里（悬挂缩进） */
	min-height: 1.5em;		/* Prism 行高固定 1.5，空行也要占一行高度 */
}
code.xn-lines > .xn-code-line::before {
	counter-increment: xn-line;
	content: counter(xn-line);
	position: absolute;
	top: 0;				/* 行号贴在逻辑行的第一行（折行时不会跟着往下跑） */
	left: 0;
	width: 2.25em;			/* 2.85em - 2.25em = 0.6em 与正文的间距 */
	text-align: right;
	color: #8a8a8a;			/* 比正文 #ccc 浅一点，不抢眼 */
	-webkit-user-select: none;
	user-select: none;
	pointer-events: none;
}
/* 行号栏右侧的分隔线（对应 Prism 原生的 border-right:1px solid #999，这里做细一点） */
code.xn-lines::after {
	content: '';
	position: absolute;
	top: 0;
	bottom: 0;
	left: 2.55em;
	width: 1px;
	background: rgba(255,255,255,.16);
	pointer-events: none;
}
/* pre 左内边距收一点给行号栏让位（正文左边界与 Prism 原生 3.8em 基本齐平）。
   注意：这条只作用于「没有 line-numbers 类」的块，桌面原生行号的 3.8em
   由 Prism 自己的 .line-numbers 规则给出（权重更高）不受影响 */
pre[class*=language-] { padding-left: .75em; }
