/**
 * B2 夜间模式 —— 完整样式。
 *
 * 核心的反色规则同时也内联在 <head> 里（class-b2dm-frontend.php 的 critical_css()），
 * 那份负责「首次绘制前就生效、不闪白」。这里再写一遍是为了：
 *   ① 万一关键样式被缓存插件挪走/合并，仍有兜底；
 *   ② 关键样式里不方便放的东西（滚动条、切换面板、打印）放这儿。
 *
 * 滤镜的**具体取值**只写在 critical_css() 里（PHP 的 filter_value()），
 * 通过 CSS 变量 --b2dm-filter / --b2dm-filter-plain 传下来，这里只引用。
 * 之所以不在这里硬编码：只要两处差一个字节，媒体还原的二次反色就抵不干净，
 * 照片会变成底片。变量化之后不可能写歪。
 *
 * ── 反色模型 ──────────────────────────────────────────────
 *   html.b2dm-dark            反色（整页）
 *   ├─ img / video / iframe / 再反一次 → 抵消 → 显示原色（照片不被反成底片）
 *   ├─ .b2dm-media（JS 自动标记的背景图容器）同上
 *   └─ .b2dm-keep（Logo、单色图标、二维码）不抵消 → 跟着反色 → 暗底上看得见
 *
 * ── 为什么这样能保证「没有看不清的字」 ──────────────────────
 * 注意：**不能**用「亮度 L 映射成 1−L」来论证。invert 作用在 sRGB 通道值上
 * （c → 255−c），而相对亮度是通道值的非线性函数，所以 L(255−c) ≠ 1−L(c)。
 * 举例：灰 142 的 L=0.2706，但灰 113（=255−142）的 L=0.1652，并不等于 0.7294。
 *
 * 真实原因是 sRGB 传递函数在暗部更陡：同样的通道差，在暗端换来的亮度差更大。
 * 于是「深色字 + 浅色底」反色成「浅色字 + 深色底」后，对比度普遍上升。
 * 实测：#8e8e8e 配白底 3.28 → 反色后配黑底 4.30；#bcbcbc 配白底 1.90 → 配黑底 2.12。
 * 全站逐节点核对过（dm-audit.mjs），夜间新增低对比度文本为 0。
 */

/* ═══════════ ① 核心反色（与关键样式一致，作兜底） ═══════════ */

html.b2dm-dark {
	/* 取值来自 critical_css()；括号里是「关键样式也丢了」时的最后兜底 */
	filter: var(--b2dm-filter, invert(1) hue-rotate(180deg));
	color-scheme: light; /* 刻意保持 light：原生控件先渲染成亮色，再被反色成暗色 */
}

html.b2dm-dark.b2dm-plain {
	filter: var(--b2dm-filter-plain, invert(1));
}

/* 媒体还原：照片 / 视频 / 嵌入内容 / 带背景图的容器 */
html.b2dm-dark img,
html.b2dm-dark video,
html.b2dm-dark iframe,
html.b2dm-dark canvas,
html.b2dm-dark embed,
html.b2dm-dark object,
html.b2dm-dark .b2dm-media {
	filter: invert(1) hue-rotate(180deg);
}

html.b2dm-dark.b2dm-plain img,
html.b2dm-dark.b2dm-plain video,
html.b2dm-dark.b2dm-plain iframe,
html.b2dm-dark.b2dm-plain canvas,
html.b2dm-dark.b2dm-plain embed,
html.b2dm-dark.b2dm-plain object,
html.b2dm-dark.b2dm-plain .b2dm-media {
	filter: invert(1);
}

/*
 * 容器已经抵消过一次，里面的媒体就不用再抵消。
 *
 * 少了这条会「抵消成双倍」：html 反一次 → .b2dm-media 容器抵消一次 →
 * 容器里的 <video>/<img> 又抵消一次 = 三次反色 = 净反色，图片反而变负片。
 * 首页的 div.video（封面容器 + 内部 <video>）就是这种情况。
 */
html.b2dm-dark .b2dm-media img,
html.b2dm-dark .b2dm-media video,
html.b2dm-dark .b2dm-media iframe,
html.b2dm-dark .b2dm-media canvas,
html.b2dm-dark .b2dm-media embed,
html.b2dm-dark .b2dm-media object,
html.b2dm-dark .b2dm-media .b2dm-media {
	filter: none !important;
}

html.b2dm-dark.b2dm-plain .b2dm-media img,
html.b2dm-dark.b2dm-plain .b2dm-media video,
html.b2dm-dark.b2dm-plain .b2dm-media iframe,
html.b2dm-dark.b2dm-plain .b2dm-media canvas,
html.b2dm-dark.b2dm-plain .b2dm-media embed,
html.b2dm-dark.b2dm-plain .b2dm-media object,
html.b2dm-dark.b2dm-plain .b2dm-media .b2dm-media {
	filter: none !important;
}

/* 保持反色：Logo、单色图标、二维码等 —— 抵消规则不适用于它们 */
html.b2dm-dark .b2dm-keep,
html.b2dm-dark .b2dm-keep img,
html.b2dm-dark .b2dm-keep video,
html.b2dm-dark .b2dm-keep .b2dm-media {
	filter: none !important;
}

/* ═══════════ ② 切换动画 ═══════════ */

html.b2dm-anim {
	transition: filter .18s linear;
}

/* 页面里的颜色过渡只在「切换的一瞬间」加，避免长期挂着 transition 影响性能 */
html.b2dm-switching,
html.b2dm-switching body,
html.b2dm-switching .site-header-in,
html.b2dm-switching .post-list-item {
	transition: background-color .18s linear, border-color .18s linear, color .18s linear;
}

@media (prefers-reduced-motion: reduce) {
	html.b2dm-anim,
	html.b2dm-switching,
	html.b2dm-switching body {
		transition: none !important;
	}
}

/* ═══════════ ③ 滚动条：刻意「不」美化 ═══════════ */

/*
 * 这里什么都不写，是量过之后的决定，不是漏了。
 *
 * 想给夜间配一个深色滚动条，试过三种写法，全都会改变滚动条宽度，
 * 于是每次切换模式整页横向跳一下（居中容器左边界 97.5 → 92.5）：
 *
 *   ① `::-webkit-scrollbar { width: 10px }`            → 滚动条 10px（日间 5px）
 *   ② 只留 `::-webkit-scrollbar-thumb` 配色、不写宽度   → 滚动条 15px
 *   ③ 标准属性 `scrollbar-color: #4a4a4a #1a1a1a`       → 滚动条 15px
 *
 * 根因：只要出现任何滚动条样式，Chrome 就从「系统覆盖式细滚动条（5px）」
 * 切换到「经典滚动条（15px）」渲染路径。设了 `scrollbar-color` 也一样，
 * 因为它必须用非覆盖式滚动条才显示得出颜色。
 * 顺带一提：`color-scheme: dark` 管不到覆盖式滚动条，它照样是浅灰的。
 *
 * 所以结论是：深色滚动条（好看）与「切换时页面不动」（正确）不可兼得。
 * 选了后者 —— 页面横跳是 bug，滚动条颜色只是观感。
 *
 * 如果站长宁可要深色滚动条，可以自己加：
 *     html.b2dm-dark { scrollbar-color: #4a4a4a #1a1a1a; }
 * 代价就是上面说的 5px 位移。写在这里是为了下次别再走回头路。
 */

/* 选中文字 */
html.b2dm-dark ::selection {
	background: #3a3a3a;
	color: #f0f0f0;
}

/* 图片占位（懒加载时是浅灰块 / data: URI 模糊小图）
 *
 * 这里**不再**用 CSS 抢 filter。早先写的是：
 *     html.b2dm-dark img[src*="data:image"], ... { filter: none; background: #2a2a2a; }
 * 它的优先级 (0,2,1) 压过了媒体的抵消规则 (0,1,1)，于是那些图明明标着
 * .b2dm-media 却按 keep 走 —— 模型自相矛盾，排查时极难看出。
 * 现在统一交给 JS：占位图在 classifyImg() 里直接判成 keep，
 * 真实地址到齐后触发 load 重新判成 media。CSS 这边不需要特例。
 */

/* ═══════════ ④ 切换按钮 ═══════════ */

/*
 * 按钮整个「再反一次」，抵消 html 的反色 —— 这样面板永远是正常配色，
 * 不会出现「按钮自己也被反成奇怪颜色」的问题。
 */
html.b2dm-dark .b2dm-ui {
	filter: invert(1) hue-rotate(180deg);
}

html.b2dm-dark.b2dm-plain .b2dm-ui {
	filter: invert(1);
}

.b2dm-ui {
	position: fixed;
	z-index: 2147483000; /* 压在 B2 自己的浮动层（客服、返回顶部）之上 */
	font-size: 14px;
	line-height: 1.5;
	color: #1d2327;
	-webkit-tap-highlight-color: transparent;
	transition: opacity .18s ease, visibility .18s;
}

.b2dm-ui.b2dm-pos-bottom-right { right: var(--b2dm-x, 24px); bottom: var(--b2dm-y, 24px); }
.b2dm-ui.b2dm-pos-bottom-left  { left: var(--b2dm-x, 24px);  bottom: var(--b2dm-y, 24px); }
.b2dm-ui.b2dm-pos-top-right    { right: var(--b2dm-x, 24px); top: var(--b2dm-y, 24px); }
.b2dm-ui.b2dm-pos-top-left     { left: var(--b2dm-x, 24px);  top: var(--b2dm-y, 24px); }

.b2dm-ui *, .b2dm-ui *::before, .b2dm-ui *::after {
	box-sizing: border-box;
}

/* ── 弹窗打开时收起按钮 ── */

/*
 * B2 的每一个弹窗都是同一个结构：
 *     <div class="modal xxx-box [show-modal]">   position:fixed; inset:0; z-index:9999999
 * 这个 div **自己就是遮罩** —— 半透明黑底 + backdrop-filter 模糊，
 * 靠加/去掉 show-modal 来开关（见 b2/Assets/fontend/style.css 的 .modal / .show-modal）。
 *
 * 而按钮的 z-index 是 2147483000，比 9999999 高。于是弹窗一开，按钮就浮在遮罩上面，
 * 正压着弹窗的正文。公告弹窗（.gong-box）还是**进页面就自动弹**的，所以一打开首页
 * 就能看见按钮叠在公告上。
 *
 * 这里用 :has() 把「页面里有弹窗开着」直接变成样式条件：
 *   · Vue 加上 show-modal 的**同一帧**按钮就没了 —— 不会先露一下再消失；
 *   · 不用等 MutationObserver 的回调，零运行时开销；
 *   · 弹窗是 Vue 动态插进来的也无所谓，浏览器自己会重算。
 *
 * ⚠️ 前面那个 b2dm-hidemodal 不能省。
 * 踩过：:has() 这条一开始是裸写的，结果站长在后台把「弹窗打开时收起按钮」取消勾选后，
 * JS 老老实实把 b2dm-modal-open 摘掉了，可 :has() 照样命中 —— 开关形同虚设。
 * 所以把「这个功能开没开」也做成一个类，让 :has() 一起受它管。
 *
 * :has() 需要 Chrome/Edge 105+、Safari 15.4+、Firefox 121+（2022~2023 年的版本）。
 * 更老的浏览器这条不生效，所以 JS 会同时给 <html> 挂 b2dm-modal-open，
 * 由下面那半条选择器兜住 —— 两头都不会漏。
 */
html.b2dm-hidemodal:has(.modal.show-modal) .b2dm-ui,
html.b2dm-modal-open .b2dm-ui {
	opacity: 0 !important;
	visibility: hidden !important;
	pointer-events: none !important; /* 连点都点不到，避免「看不见但能误触」 */
}

/* ── 圆形按钮 ── */

.b2dm-fab {
	display: flex;
	align-items: center;
	justify-content: center;
	width: var(--b2dm-size, 44px);
	height: var(--b2dm-size, 44px);
	padding: 0;
	border: 1px solid rgba(0, 0, 0, .08);
	border-radius: 50%;
	background: #fff;
	box-shadow: 0 2px 10px rgba(0, 0, 0, .14);
	color: #1d2327;
	cursor: pointer;
	opacity: var(--b2dm-op, 1);
	transition: opacity .2s, transform .2s, box-shadow .2s;
}

.b2dm-fab:hover,
.b2dm-fab:focus-visible {
	opacity: 1;
	transform: translateY(-2px);
	box-shadow: 0 5px 16px rgba(0, 0, 0, .2);
	outline: none;
}

.b2dm-fab:active {
	transform: translateY(0);
}

/* 空闲一段时间后自动变淡，别老挡着内容（鼠标移上去恢复） */
.b2dm-ui.b2dm-idle .b2dm-fab {
	opacity: calc(var(--b2dm-op, 1) * .55);
}

.b2dm-ui.b2dm-idle:hover .b2dm-fab,
.b2dm-ui.b2dm-idle:focus-within .b2dm-fab {
	opacity: var(--b2dm-op, 1);
}

.b2dm-fab svg {
	width: 22px;
	height: 22px;
	display: block;
	/* 图标跟着按钮一起「再反一次」，所以这里不需要额外处理 */
}

/* 按钮上只有两个图标：日间显示太阳、夜间显示月亮，靠 data-dark 切换 */
.b2dm-fab .b2dm-ico {
	display: none;
}

/*
 * ⚠️ 按钮图标只看 data-dark，**不看 data-mode**。
 *
 * 踩过两轮：
 *   1) 最早写的是「data-dark 和 data-mode 两组规则并列」——
 *      但这两个属性是同时挂在元素上的，所以切到「跟随设备」时，
 *      「太阳」（data-dark=0）和「设备」两条规则一起命中，
 *      44px 的圆里并排挤着两个 22px 图标；「跟随日出日落」同理。
 *   2) 想过改成「模式图标优先」（auto 就只显示设备图标）—— 不采用。
 *      按钮的职责是**表达当前是日还是夜、点一下换过去**，
 *      而 auto / sun 是「怎么决定」的策略，策略不该盖掉状态。
 *      现在四种模式在按钮上都只显示太阳或月亮，语义统一；
 *      当前用的哪种策略，点开面板就能看到（模式按钮高亮 + 「当前：夜间/日间」）。
 */
.b2dm-ui[data-dark="0"] .b2dm-ico-sun,
.b2dm-ui[data-dark="1"] .b2dm-ico-moon {
	display: block;
}

/* ── 手机端：按钮贴进顶部 header（跟放大镜做邻居） ── */

/*
 * 什么时候会进这一档：JS 在顶部 header 里**量得到**一个放大镜按钮时，
 * 给容器加上 `b2dm-dock`，同时把锚定边换成 top-right（见 b2dm.js 的 dockToHeader）。
 * 电脑端量不到（B2 电脑端顶栏放的是一整个搜索输入框，不是图标），所以自动不进这档。
 *
 * 长相要跟旁边那排图标一样：**裸图标**。所以这里把「白底圆按钮」那层皮整段撤掉 ——
 * 描边、白底、投影、悬停上浮、闲置变淡，全部关掉。
 * 悬停只留一个很淡的圆底（跟常见的图标按钮一致）。
 */
.b2dm-ui.b2dm-dock .b2dm-fab {
	border-color: transparent;
	background: transparent;
	box-shadow: none;
	color: inherit;
}

.b2dm-ui.b2dm-dock .b2dm-fab:hover,
.b2dm-ui.b2dm-dock .b2dm-fab:focus-visible {
	transform: none;
	background: rgba( 128, 128, 128, .18 );
	box-shadow: none;
}

.b2dm-ui.b2dm-dock .b2dm-fab:active {
	transform: none;
}

/* header 里的图标不会自己变淡，按钮也别变 —— 不然像是坏了 */
.b2dm-ui.b2dm-dock.b2dm-idle .b2dm-fab {
	opacity: var(--b2dm-op, 1);
}

.b2dm-ui.b2dm-dock .b2dm-fab svg {
	width: 24px;
	height: 24px;
}

/*
 * 反色次数（这套插件最容易踩的地方，见本文件顶部的说明）：
 *   html(1) + .b2dm-ui(1) = 2 次 → 界面整体「回到原色」，面板要的就是这个；
 *   但贴进 header 的按钮得跟旁边图标一样**只反一次**（黑→白）。
 * 所以给它再补一次，凑成 3 次 —— 3 次 invert 等于 1 次，
 * 3 次 hue-rotate(180deg) 等于 540° 也就是 180°。
 * 补完的结果：日间是黑图标、夜间是白图标，跟放大镜、头像完全一致。
 *
 * 不补会怎样：夜间模式下旁边图标都白了，只有我们这个还是黑的 —— 看不见。
 */
html.b2dm-dark .b2dm-ui.b2dm-dock .b2dm-fab {
	filter: invert(1) hue-rotate(180deg);
}

html.b2dm-dark.b2dm-plain .b2dm-ui.b2dm-dock .b2dm-fab {
	filter: invert(1);
}

/* ── 面板 ── */

.b2dm-panel {
	position: absolute;
	width: 264px;
	max-width: calc(100vw - 32px);
	padding: 12px;
	border: 1px solid rgba(0, 0, 0, .08);
	border-radius: 14px;
	background: #fff;
	box-shadow: 0 10px 34px rgba(0, 0, 0, .18);
	opacity: 0;
	visibility: hidden;
	transform: translateY(8px) scale(.97);
	transform-origin: bottom right;
	transition: opacity .16s ease, transform .16s ease, visibility .16s;
}

.b2dm-ui.b2dm-open .b2dm-panel {
	opacity: 1;
	visibility: visible;
	transform: translateY(0) scale(1);
}

.b2dm-pos-bottom-right .b2dm-panel,
.b2dm-pos-bottom-left .b2dm-panel {
	bottom: calc(100% + 10px);
}

.b2dm-pos-top-right .b2dm-panel,
.b2dm-pos-top-left .b2dm-panel {
	top: calc(100% + 10px);
}

.b2dm-pos-bottom-right .b2dm-panel,
.b2dm-pos-top-right .b2dm-panel {
	right: 0;
	transform-origin: bottom right;
}

.b2dm-pos-top-right .b2dm-panel {
	transform-origin: top right;
}

.b2dm-pos-bottom-left .b2dm-panel,
.b2dm-pos-top-left .b2dm-panel {
	left: 0;
	transform-origin: bottom left;
}

.b2dm-pos-top-left .b2dm-panel {
	transform-origin: top left;
}

.b2dm-title {
	display: flex;
	align-items: center;
	justify-content: space-between;
	margin: 0 0 10px;
	font-size: 13px;
	font-weight: 600;
	color: #50575e;
	letter-spacing: .02em;
}

.b2dm-state {
	font-weight: 400;
	color: #8c8f94;
}

/* ── 模式按钮组 ── */

.b2dm-modes {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 6px;
	margin-bottom: 10px;
}

.b2dm-mode {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 9px 10px;
	border: 1px solid #e0e0e0;
	border-radius: 9px;
	background: #fafafa;
	color: #3c434a;
	font-size: 13px;
	text-align: left;
	cursor: pointer;
	transition: background .15s, border-color .15s, color .15s;
}

.b2dm-mode:hover {
	background: #f0f0f1;
	border-color: #c3c4c7;
}

.b2dm-mode[aria-pressed="true"] {
	background: #2271b1;
	border-color: #2271b1;
	color: #fff;
}

.b2dm-mode svg {
	width: 15px;
	height: 15px;
	flex: 0 0 15px;
}

/* ── 日出日落信息 ── */

.b2dm-sun {
	margin-top: 10px;
	padding: 10px;
	border-radius: 9px;
	background: #f6f7f7;
	font-size: 12px;
	color: #50575e;
	display: none;
}

.b2dm-ui[data-mode="sun"] .b2dm-sun {
	display: block;
}

.b2dm-sun-row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 8px;
}

.b2dm-sun-row + .b2dm-sun-row {
	margin-top: 6px;
}

.b2dm-sun-row b {
	font-weight: 600;
	color: #1d2327;
	font-variant-numeric: tabular-nums;
}

.b2dm-sun-note {
	margin-top: 8px;
	padding-top: 8px;
	border-top: 1px dashed #dcdcde;
	color: #8c8f94;
	font-size: 11px;
	line-height: 1.5;
}

/* ── 位置选择 ── */

.b2dm-place {
	display: none;
	margin-top: 8px;
	padding-top: 8px;
	border-top: 1px dashed #dcdcde;
}

.b2dm-ui[data-mode="sun"][data-can-place="1"] .b2dm-place {
	display: block;
}

.b2dm-place select {
	width: 100%;
	padding: 6px 8px;
	border: 1px solid #dcdcde;
	border-radius: 7px;
	background: #fff;
	color: #1d2327;
	font-size: 12px;
	font-family: inherit;
}

.b2dm-geo {
	margin-top: 6px;
	width: 100%;
	padding: 6px 8px;
	border: 1px solid #dcdcde;
	border-radius: 7px;
	background: #fff;
	color: #2271b1;
	font-size: 12px;
	cursor: pointer;
	font-family: inherit;
}

.b2dm-geo:hover {
	border-color: #2271b1;
}

.b2dm-hint {
	margin-top: 6px;
	font-size: 11px;
	color: #8c8f94;
	min-height: 15px;
}

/* ── 移动端微调 ── */

@media (max-width: 782px) {
	/*
	 * ⚠️ 这里必须走 var(--b2dm-size)。
	 * 原来写的是死值 40px —— 而媒体查询在文件里排在后面，
	 * 优先级又一样，于是它把上面 `width: var(--b2dm-size, 44px)` 整条盖掉了：
	 * JS 辛苦算出来的尺寸（对齐右侧工具条用的 41px、贴 header 用的 30px）
	 * 在手机上全都不生效。踩过。
	 */
	.b2dm-fab {
		width: var(--b2dm-size, 40px);
		height: var(--b2dm-size, 40px);
	}

	.b2dm-fab svg {
		width: 20px;
		height: 20px;
	}

	.b2dm-panel {
		width: 244px;
	}
}

/* 打印时一定要亮色 —— 否则打出来整页是黑的 */
@media print {
	html.b2dm-dark,
	html.b2dm-dark img,
	html.b2dm-dark video,
	html.b2dm-dark iframe,
	html.b2dm-dark canvas,
	html.b2dm-dark embed,
	html.b2dm-dark object,
	html.b2dm-dark .b2dm-media {
		filter: none !important;
	}

	.b2dm-ui {
		display: none !important;
	}
}
