用户反馈工作空间深色下有黑色方块。实测:亮色时代该区域是 #fff,我在 v44 把它改成 #0f172a,于是打开应用时那块区域变成一整块不透明黑。 修法:内嵌区与 iframe 一律透明(露出壁纸/玻璃底),应用自身背景照常显示, 空态也不再出现突兀方块。深/浅两种模式行为一致。
1827 lines
63 KiB
CSS
1827 lines
63 KiB
CSS
/* HomeDash responsive presentation layer.
|
||
Loaded after Dashy's bundled styles; persistent wallpaper rules stay in conf.yml. */
|
||
|
||
html {
|
||
-webkit-text-size-adjust: 100%;
|
||
text-size-adjust: 100%;
|
||
}
|
||
|
||
/* 禁用移动端/Chromium 对可点击元素注入的蓝色点击闪烁。 */
|
||
html[data-theme] *,
|
||
html[data-theme] *::before,
|
||
html[data-theme] *::after {
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
}
|
||
|
||
html[data-theme] body {
|
||
/* border-box 让 padding 计入 min-height:否则 min-height:100vh 与
|
||
padding-bottom 相加,短页面(极简/工作空间)必然多出一屏滚动。 */
|
||
box-sizing: border-box !important;
|
||
min-width: 0;
|
||
overflow-x: hidden;
|
||
/* 列向 flex + 页脚 margin-top:auto,把备案号顶到页面底部而非浮在中间。 */
|
||
display: flex !important;
|
||
flex-direction: column !important;
|
||
min-height: 100vh !important;
|
||
/* 备案号占据真正的页面最底部;悬浮控件在它上方,不再用底部 padding
|
||
把页脚整体抬高。 */
|
||
padding-bottom: 0 !important;
|
||
}
|
||
|
||
html[data-theme] #app {
|
||
width: 100% !important;
|
||
}
|
||
|
||
/* Dashy 的 #dashy 默认 min-height:100vh,短页面叠加页脚后必出滚动;
|
||
交回内容自然撑高,视口高度由 body 兜住。 */
|
||
html[data-theme] #dashy {
|
||
min-height: auto !important;
|
||
}
|
||
|
||
/* Dashy's native filter/settings strip duplicates the portal search and breaks on phones.
|
||
原生设置入口(齿轮/铅笔/调色板)与我们的 /admin/ 重复,统一隐藏。 */
|
||
html[data-theme] .home > .settings-outer,
|
||
html[data-theme] .config-launcher,
|
||
html[data-theme] .options-trigger,
|
||
html[data-theme] .settings-outer,
|
||
html[data-theme] .minimal-home .title-and-search > form {
|
||
display: none !important;
|
||
}
|
||
|
||
html[data-theme] body:has(.modal-overlay) > .navi-search-bar,
|
||
html[data-theme] body:has(.modal-overlay) > .navi-footer-host {
|
||
visibility: hidden !important;
|
||
pointer-events: none !important;
|
||
}
|
||
|
||
/* Keep configuration dialogs above section tabs and cards without changing dialog layout. */
|
||
html[data-theme] .modal-overlay {
|
||
z-index: 10000 !important;
|
||
}
|
||
|
||
html[data-theme] dialog.dashy-modal {
|
||
z-index: 10001 !important;
|
||
}
|
||
|
||
/* Stable icon geometry: raster/SVG and font icons occupy the same visual box. */
|
||
html[data-theme] a.item .item-icon {
|
||
flex: 0 0 56px !important;
|
||
width: 56px !important;
|
||
min-width: 56px !important;
|
||
height: 56px !important;
|
||
min-height: 56px !important;
|
||
display: inline-flex !important;
|
||
align-items: center !important;
|
||
justify-content: center !important;
|
||
overflow: hidden !important;
|
||
transform: none !important;
|
||
}
|
||
|
||
html[data-theme] a.item .item-icon .tile-icon,
|
||
html[data-theme] a.item .item-icon img,
|
||
html[data-theme] a.item .item-icon object {
|
||
box-sizing: border-box !important;
|
||
width: 48px !important;
|
||
min-width: 48px !important;
|
||
max-width: 48px !important;
|
||
height: 48px !important;
|
||
min-height: 48px !important;
|
||
max-height: 48px !important;
|
||
padding: 2px !important;
|
||
object-fit: contain !important;
|
||
object-position: center !important;
|
||
transform: none !important;
|
||
}
|
||
|
||
html[data-theme] a.item .item-icon i,
|
||
html[data-theme] a.item .item-icon svg:not(.tile-icon) {
|
||
width: 32px !important;
|
||
height: 32px !important;
|
||
font-size: 30px !important;
|
||
line-height: 32px !important;
|
||
}
|
||
|
||
html[data-theme] a.item .tile-title {
|
||
min-width: 0 !important;
|
||
overflow: hidden;
|
||
}
|
||
|
||
html[data-theme] a.item .tile-title .text,
|
||
html[data-theme] a.item .description,
|
||
html[data-theme] a.item .item-url {
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
/* ── 渲染开销:把 backdrop-filter 从「重复的卡片层」撤掉 ──
|
||
实测首页 37 个元素带模糊(24 张卡片 + 6 个分组容器 + 顶栏 + 悬浮件)。
|
||
模糊要对背景逐帧重新采样,而卡片又参与逐张淡入/悬停位移,
|
||
两者叠加就是肉眼可见的卡顿。这里保留分组容器的玻璃感与悬浮件,
|
||
卡片只留半透明底 + 边框 + 投影(视觉差异很小,开销差很多)。 */
|
||
html[data-theme] body a.item,
|
||
html[data-theme] body .minimal-section-inner,
|
||
html[data-theme] body div.item-wrapper {
|
||
backdrop-filter: none !important;
|
||
-webkit-backdrop-filter: none !important;
|
||
}
|
||
|
||
/* 搜索栏是最常动的元素(宽/圆角/内边距都在变),它的模糊每帧都要重算 */
|
||
html[data-theme] body .navi-search-bar {
|
||
backdrop-filter: none !important;
|
||
-webkit-backdrop-filter: none !important;
|
||
}
|
||
|
||
/* ── 底部搜索:左下角放大镜悬浮球 ──
|
||
收起态只显示一个放大镜图标;点它展开成输入框;
|
||
展开后输入框内左侧仍是同一个放大镜按钮,点它收起。 */
|
||
html[data-theme] .navi-search-bar {
|
||
box-sizing: border-box !important;
|
||
position: fixed !important;
|
||
left: calc(16px + env(safe-area-inset-left, 0px)) !important;
|
||
bottom: calc(76px + env(safe-area-inset-bottom, 0px)) !important;
|
||
margin: 0 !important;
|
||
display: flex !important;
|
||
align-items: center !important;
|
||
gap: 8px !important;
|
||
z-index: 900 !important;
|
||
color: #475569 !important;
|
||
background: rgba(255, 255, 255, .72) !important;
|
||
border: 1px solid rgba(255, 255, 255, .9) !important;
|
||
box-shadow: 0 14px 38px rgba(15, 23, 42, .16), inset 0 1px 0 rgba(255, 255, 255, .95) !important;
|
||
backdrop-filter: blur(22px) saturate(180%) !important;
|
||
-webkit-backdrop-filter: blur(22px) saturate(180%) !important;
|
||
overflow: hidden !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="collapsed"] {
|
||
width: 56px !important;
|
||
height: 56px !important;
|
||
padding: 0 !important;
|
||
border-radius: 50% !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="open"] {
|
||
/* 必须给右下按钮组留位:按钮组 right:16px、宽 52+10+52=114px,
|
||
其左边缘在 innerW-130;搜索栏 left:16 → 上限 innerW-130-12-16 = 100%-158px。
|
||
否则展开后发送按钮会压在视图切换/管理入口上(窄屏尤其明显)。 */
|
||
width: min(560px, calc(100% - 158px)) !important;
|
||
min-height: 58px !important;
|
||
padding: 7px 8px !important;
|
||
border-radius: 20px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="collapsed"] input,
|
||
html[data-theme] .navi-search-bar[data-state="collapsed"] .navi-search-submit {
|
||
display: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-toggle {
|
||
flex: 0 0 42px !important;
|
||
width: 42px !important;
|
||
height: 42px !important;
|
||
display: grid !important;
|
||
place-items: center !important;
|
||
padding: 0 !important;
|
||
color: #0f172a !important;
|
||
background: transparent !important;
|
||
border: 0 !important;
|
||
border-radius: 50% !important;
|
||
cursor: pointer;
|
||
appearance: none !important;
|
||
-webkit-appearance: none !important;
|
||
-webkit-tap-highlight-color: transparent;
|
||
transition: transform .28s cubic-bezier(.22, 1, .36, 1) !important;
|
||
}
|
||
|
||
/* 点击与聚焦都不变蓝,只保留轻微缩放反馈。 */
|
||
html[data-theme] .navi-search-toggle:hover,
|
||
html[data-theme] .navi-search-toggle:focus,
|
||
html[data-theme] .navi-search-toggle:active {
|
||
color: #0f172a !important;
|
||
background: transparent !important;
|
||
outline: none !important;
|
||
}
|
||
|
||
@media (hover: hover) {
|
||
html[data-theme] .navi-search-toggle:hover {
|
||
transform: scale(1.05);
|
||
}
|
||
}
|
||
|
||
html[data-theme] .navi-search-toggle:active {
|
||
transform: scale(.96);
|
||
}
|
||
|
||
/* ── 右下角按钮组(视图切换 + 管理入口)────
|
||
两者放进同一个 fixed 容器,便于在工作空间作为一组收边,
|
||
避免各自位移后互相重叠。 */
|
||
html[data-theme] .navi-dock {
|
||
transition: opacity .2s ease, transform .2s cubic-bezier(.22, 1, .36, 1),
|
||
visibility 0s linear 0s !important;
|
||
position: fixed !important;
|
||
right: calc(16px + env(safe-area-inset-right, 0px)) !important;
|
||
bottom: calc(76px + env(safe-area-inset-bottom, 0px)) !important;
|
||
display: flex !important;
|
||
align-items: center !important;
|
||
gap: 10px !important;
|
||
z-index: 900 !important;
|
||
}
|
||
|
||
html[data-theme] .navi-dock > .navi-admin-entry {
|
||
position: static !important;
|
||
left: auto !important;
|
||
right: auto !important;
|
||
top: auto !important;
|
||
bottom: auto !important;
|
||
}
|
||
|
||
html[data-theme] .navi-dock > .navi-view-switch {
|
||
position: relative !important;
|
||
left: auto !important;
|
||
right: auto !important;
|
||
top: auto !important;
|
||
bottom: auto !important;
|
||
}
|
||
|
||
/* 右侧管理入口:Dashy 页面本身没有去 /admin/ 的链接 */
|
||
html[data-theme] .navi-admin-entry {
|
||
box-sizing: border-box !important;
|
||
width: 52px !important;
|
||
height: 52px !important;
|
||
display: grid !important;
|
||
place-items: center !important;
|
||
z-index: 900 !important;
|
||
color: #334155 !important;
|
||
background: rgba(255, 255, 255, .72) !important;
|
||
border: 1px solid rgba(255, 255, 255, .9) !important;
|
||
border-radius: 50% !important;
|
||
box-shadow: 0 14px 38px rgba(15, 23, 42, .16), inset 0 1px 0 rgba(255, 255, 255, .95) !important;
|
||
backdrop-filter: blur(22px) saturate(180%) !important;
|
||
-webkit-backdrop-filter: blur(22px) saturate(180%) !important;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
transition: transform .22s cubic-bezier(.22, 1, .36, 1), background .2s ease !important;
|
||
}
|
||
|
||
html[data-theme] .navi-admin-entry:hover,
|
||
html[data-theme] .navi-admin-entry:focus,
|
||
html[data-theme] .navi-admin-entry:active {
|
||
color: #334155 !important;
|
||
background: rgba(255, 255, 255, .94) !important;
|
||
outline: none !important;
|
||
}
|
||
|
||
@media (hover: hover) {
|
||
html[data-theme] .navi-admin-entry:hover {
|
||
transform: translateY(-1px) scale(1.05);
|
||
}
|
||
}
|
||
|
||
html[data-theme] .navi-admin-entry:active {
|
||
transform: scale(.96);
|
||
}
|
||
|
||
html[data-theme] .navi-admin-entry svg {
|
||
width: 22px !important;
|
||
height: 22px !important;
|
||
}
|
||
|
||
html[data-theme] body:has(.modal-overlay) > .navi-dock,
|
||
html[data-theme] body:has(.modal-overlay) .navi-admin-entry {
|
||
visibility: hidden !important;
|
||
pointer-events: none !important;
|
||
}
|
||
|
||
/* ── 视图切换:圆形悬浮按钮,紧贴管理入口左侧 ──
|
||
原生 .switch-view-buttons 是侧栏底部的方形图标,这里一并隐藏。 */
|
||
html[data-theme] nav.side-bar .switch-view-buttons {
|
||
display: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-switch {
|
||
display: block !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-toggle {
|
||
box-sizing: border-box !important;
|
||
width: 52px !important;
|
||
height: 52px !important;
|
||
display: grid !important;
|
||
place-items: center !important;
|
||
padding: 0 !important;
|
||
color: #334155 !important;
|
||
background: rgba(255, 255, 255, .72) !important;
|
||
border: 1px solid rgba(255, 255, 255, .9) !important;
|
||
border-radius: 50% !important;
|
||
box-shadow: 0 14px 38px rgba(15, 23, 42, .16), inset 0 1px 0 rgba(255, 255, 255, .95) !important;
|
||
backdrop-filter: blur(22px) saturate(180%) !important;
|
||
-webkit-backdrop-filter: blur(22px) saturate(180%) !important;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
appearance: none !important;
|
||
-webkit-appearance: none !important;
|
||
outline: none !important;
|
||
cursor: pointer;
|
||
transition: transform .22s cubic-bezier(.22, 1, .36, 1), background .2s ease !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-toggle:hover,
|
||
html[data-theme] .navi-view-toggle:focus,
|
||
html[data-theme] .navi-view-toggle:active {
|
||
color: #334155 !important;
|
||
background: rgba(255, 255, 255, .94) !important;
|
||
}
|
||
|
||
@media (hover: hover) {
|
||
html[data-theme] .navi-view-toggle:hover {
|
||
transform: translateY(-1px) scale(1.05);
|
||
}
|
||
}
|
||
|
||
html[data-theme] .navi-view-toggle:active {
|
||
transform: scale(.96);
|
||
}
|
||
|
||
html[data-theme] .navi-view-toggle svg {
|
||
width: 22px !important;
|
||
height: 22px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-menu {
|
||
position: absolute !important;
|
||
right: 0 !important;
|
||
bottom: 62px !important;
|
||
min-width: 134px !important;
|
||
display: flex !important;
|
||
flex-direction: column !important;
|
||
gap: 2px !important;
|
||
padding: 7px !important;
|
||
background: rgba(255, 255, 255, .92) !important;
|
||
border: 1px solid rgba(255, 255, 255, .95) !important;
|
||
border-radius: 16px !important;
|
||
box-shadow: 0 18px 40px rgba(15, 23, 42, .18), inset 0 1px 0 rgba(255, 255, 255, .95) !important;
|
||
backdrop-filter: blur(20px) saturate(180%) !important;
|
||
-webkit-backdrop-filter: blur(20px) saturate(180%) !important;
|
||
animation: navi-fade-up .22s cubic-bezier(.22, 1, .36, 1) both;
|
||
}
|
||
|
||
html[data-theme] .navi-view-menu[hidden] {
|
||
display: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-option {
|
||
padding: 9px 12px !important;
|
||
color: #334155 !important;
|
||
font-size: 13.5px !important;
|
||
text-decoration: none !important;
|
||
border-radius: 10px !important;
|
||
white-space: nowrap !important;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-option:hover,
|
||
html[data-theme] .navi-view-option:focus,
|
||
html[data-theme] .navi-view-option:active {
|
||
color: #0f172a !important;
|
||
background: rgba(226, 232, 240, .7) !important;
|
||
outline: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-option.is-active {
|
||
color: #0f172a !important;
|
||
background: rgba(186, 230, 253, .55) !important;
|
||
font-weight: 600 !important;
|
||
}
|
||
|
||
html[data-theme] body:has(.modal-overlay) .navi-view-switch {
|
||
visibility: hidden !important;
|
||
pointer-events: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar input {
|
||
min-width: 0 !important;
|
||
height: 42px !important;
|
||
flex: 1 1 auto !important;
|
||
padding: 0 4px !important;
|
||
color: #0f172a !important;
|
||
background: transparent !important;
|
||
border: 0 !important;
|
||
outline: 0 !important;
|
||
box-shadow: none !important;
|
||
font: inherit !important;
|
||
font-size: 16px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar input::placeholder {
|
||
color: #64748b !important;
|
||
opacity: 1;
|
||
}
|
||
|
||
html[data-theme] .navi-search-submit {
|
||
flex: 0 0 44px !important;
|
||
width: 44px !important;
|
||
height: 44px !important;
|
||
display: grid !important;
|
||
place-items: center !important;
|
||
padding: 0 !important;
|
||
color: #fff !important;
|
||
background: linear-gradient(135deg, #0ea5e9, #2563eb) !important;
|
||
border: 0 !important;
|
||
border-radius: 14px !important;
|
||
box-shadow: 0 8px 20px rgba(37, 99, 235, .28) !important;
|
||
cursor: pointer;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
outline: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-toggle svg,
|
||
html[data-theme] .navi-search-submit svg {
|
||
width: 20px;
|
||
height: 20px;
|
||
}
|
||
|
||
/* 放大镜与搜索框同步形变:圆环、手柄退场,向左收起箭头进入。 */
|
||
html[data-theme] .navi-search-toggle svg {
|
||
overflow: visible;
|
||
}
|
||
|
||
html[data-theme] .navi-magnifier-ring,
|
||
html[data-theme] .navi-magnifier-handle,
|
||
html[data-theme] .navi-collapse-arrow {
|
||
transform-box: fill-box;
|
||
transform-origin: center;
|
||
transition: opacity .22s ease, transform .28s cubic-bezier(.22, 1, .36, 1) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-collapse-arrow {
|
||
opacity: 0;
|
||
transform: translateX(5px) scale(.62);
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="open"] .navi-magnifier-ring {
|
||
opacity: 0;
|
||
transform: translateX(-4px) scale(.28);
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="open"] .navi-magnifier-handle {
|
||
opacity: 0;
|
||
transform: translate(-4px, -4px) rotate(-35deg) scale(.45);
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="open"] .navi-collapse-arrow {
|
||
opacity: 1;
|
||
transform: translateX(0) scale(1);
|
||
}
|
||
|
||
/* Minimal view is the phone/tablet layout used by Dashy. */
|
||
html[data-theme] .minimal-home {
|
||
box-sizing: border-box !important;
|
||
width: min(100% - 24px, 920px) !important;
|
||
max-width: 920px !important;
|
||
min-height: auto !important;
|
||
margin: 0 auto !important;
|
||
padding: 28px 0 16px !important;
|
||
background: transparent !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-home .title-and-search {
|
||
padding: 0 8px !important;
|
||
}
|
||
|
||
/* ── 顶部标题:三个视图统一(同字号/字重/字距/居中)──
|
||
此前 /minimal 是 48px 居中,而 / 与 /workspace 是顶栏里 40px 左对齐,
|
||
同一个站点的三个视图两套标题样式,很割裂。 */
|
||
html[data-theme] #dashy > header {
|
||
display: flex !important;
|
||
align-items: center !important;
|
||
justify-content: center !important;
|
||
padding: 10px 12px !important;
|
||
}
|
||
|
||
html[data-theme] #dashy > header .page-titles {
|
||
display: block !important;
|
||
width: auto !important;
|
||
max-width: 100% !important;
|
||
margin: 0 auto !important;
|
||
text-align: center !important;
|
||
}
|
||
|
||
html[data-theme] #dashy > header .page-titles .text {
|
||
display: block !important;
|
||
text-align: center !important;
|
||
}
|
||
|
||
html[data-theme] #dashy > header .page-titles .subtitle {
|
||
display: block !important;
|
||
margin: 6px 0 0 !important;
|
||
color: #64748b !important;
|
||
font-size: 13.5px !important;
|
||
font-weight: 400 !important;
|
||
letter-spacing: 0 !important;
|
||
text-align: center !important;
|
||
}
|
||
|
||
html[data-theme] #dashy > header .page-titles h1,
|
||
html[data-theme] .minimal-home .title-and-search h1 {
|
||
max-width: 100%;
|
||
margin: 0 !important;
|
||
color: #0f172a !important;
|
||
font-size: clamp(1.75rem, 4vw, 2.75rem) !important;
|
||
font-weight: 700 !important;
|
||
line-height: 1.08 !important;
|
||
letter-spacing: -.035em !important;
|
||
text-align: center !important;
|
||
overflow-wrap: anywhere;
|
||
}
|
||
|
||
html[data-theme] .minimal-home > .item-group-container {
|
||
box-sizing: border-box !important;
|
||
width: 100% !important;
|
||
margin: 32px auto 0 !important;
|
||
padding: 0 6px !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-wrap {
|
||
position: relative;
|
||
z-index: 2;
|
||
gap: 6px !important;
|
||
margin-bottom: 8px !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-row {
|
||
gap: 6px !important;
|
||
scroll-snap-type: x proximity;
|
||
}
|
||
|
||
/* 滚动行两端用 mask 渐变淡出:此前卡片在滚动行边缘(紧贴两侧 ‹ › 按钮)
|
||
被硬切,看起来像"被按钮截断"。用 :has() 关联翻页按钮的 disabled 状态,
|
||
已经在尽头的一侧就不淡出,避免"尽头还在渐隐"的错觉。 */
|
||
html[data-theme] .minimal-headings-row {
|
||
-webkit-mask-image: linear-gradient(to right, transparent 0, #000 24px, #000 calc(100% - 24px), transparent 100%);
|
||
mask-image: linear-gradient(to right, transparent 0, #000 24px, #000 calc(100% - 24px), transparent 100%);
|
||
}
|
||
|
||
/* 已到最左:左侧不淡出 */
|
||
html[data-theme] .minimal-headings-wrap:has(> .tab-scroll-btn:first-child[disabled]) .minimal-headings-row {
|
||
-webkit-mask-image: linear-gradient(to right, #000 0, #000 calc(100% - 24px), transparent 100%);
|
||
mask-image: linear-gradient(to right, #000 0, #000 calc(100% - 24px), transparent 100%);
|
||
}
|
||
|
||
/* 已到最右:右侧不淡出 */
|
||
html[data-theme] .minimal-headings-wrap:has(> .tab-scroll-btn:last-child[disabled]) .minimal-headings-row {
|
||
-webkit-mask-image: linear-gradient(to right, transparent 0, #000 24px, #000 100%);
|
||
mask-image: linear-gradient(to right, transparent 0, #000 24px, #000 100%);
|
||
}
|
||
|
||
/* 两端都到尽头:完全不淡出 */
|
||
html[data-theme] .minimal-headings-wrap:has(> .tab-scroll-btn:first-child[disabled]):has(> .tab-scroll-btn:last-child[disabled]) .minimal-headings-row {
|
||
-webkit-mask-image: none;
|
||
mask-image: none;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-row .headings {
|
||
flex-basis: 132px !important;
|
||
min-height: 44px !important;
|
||
padding: 8px 12px !important;
|
||
border-radius: 14px !important;
|
||
scroll-snap-align: start;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-row .headings .section-title {
|
||
font-size: 15px !important;
|
||
line-height: 1.2 !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-wrap .tab-scroll-btn {
|
||
min-width: 34px !important;
|
||
padding: 0 8px !important;
|
||
border-radius: 12px !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-section-inner {
|
||
padding: 8px !important;
|
||
background: rgba(255, 255, 255, .34) !important;
|
||
border: 1px solid rgba(255, 255, 255, .72) !important;
|
||
border-radius: 20px !important;
|
||
box-shadow: 0 16px 38px rgba(15, 23, 42, .10), inset 0 1px 0 rgba(255, 255, 255, .88) !important;
|
||
backdrop-filter: blur(20px) saturate(170%) !important;
|
||
-webkit-backdrop-filter: blur(20px) saturate(170%) !important;
|
||
}
|
||
|
||
/* 空分组(非选中分组 / 无条目)不能被渲染成空玻璃条。
|
||
Dashy 会把其余分组渲染成 16px 的空 .minimal-section-inner,
|
||
一旦给它加了边框和底色就会变成一排“莫名其妙的框”。 */
|
||
html[data-theme] .minimal-section-inner:not(:has(a.item)),
|
||
html[data-theme] .minimal-section-inner:empty {
|
||
display: none !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-widget-wrap:empty {
|
||
display: none !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-section-inner .section-items {
|
||
gap: 10px !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-section-inner a.item {
|
||
box-sizing: border-box !important;
|
||
min-height: 82px !important;
|
||
margin: 0 !important;
|
||
padding: 12px 16px !important;
|
||
}
|
||
|
||
@media (max-width: 599px) {
|
||
html[data-theme] .minimal-home {
|
||
width: min(100% - 16px, 430px) !important;
|
||
padding-top: 22px !important;
|
||
}
|
||
|
||
html[data-theme] #dashy > header .page-titles h1,
|
||
html[data-theme] .minimal-home .title-and-search h1 {
|
||
font-size: clamp(1.6rem, 8vw, 2.2rem) !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-home > .item-group-container {
|
||
margin-top: 26px !important;
|
||
padding: 0 !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-row .headings {
|
||
flex-basis: 116px !important;
|
||
padding: 8px 10px !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-section-inner {
|
||
padding: 7px !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-section-inner a.item {
|
||
min-height: 78px !important;
|
||
padding: 10px 12px !important;
|
||
border-radius: 16px !important;
|
||
}
|
||
|
||
html[data-theme] a.item .item-icon {
|
||
flex-basis: 52px !important;
|
||
width: 52px !important;
|
||
min-width: 52px !important;
|
||
height: 52px !important;
|
||
min-height: 52px !important;
|
||
}
|
||
|
||
html[data-theme] a.item .item-icon .tile-icon,
|
||
html[data-theme] a.item .item-icon img,
|
||
html[data-theme] a.item .item-icon object {
|
||
width: 44px !important;
|
||
min-width: 44px !important;
|
||
max-width: 44px !important;
|
||
height: 44px !important;
|
||
min-height: 44px !important;
|
||
max-height: 44px !important;
|
||
}
|
||
|
||
/* Keep the screen-level warning inside the phone viewport. */
|
||
html[data-theme] .modal-overlay .modal-body {
|
||
min-width: 0 !important;
|
||
max-width: 100vw !important;
|
||
overflow-x: hidden !important;
|
||
}
|
||
|
||
html[data-theme] .modal-overlay .config-tabs {
|
||
overflow-x: auto !important;
|
||
overscroll-behavior-x: contain;
|
||
scrollbar-width: none;
|
||
}
|
||
|
||
html[data-theme] .modal-overlay .config-tabs::-webkit-scrollbar {
|
||
display: none;
|
||
}
|
||
|
||
html[data-theme] .modal-overlay .config-tabs > * {
|
||
flex: 0 0 auto !important;
|
||
}
|
||
|
||
html[data-theme] .modal-overlay .config-buttons,
|
||
html[data-theme] .modal-overlay .config-buttons > * {
|
||
min-width: 0 !important;
|
||
max-width: 100% !important;
|
||
}
|
||
|
||
html[data-theme] .modal-overlay .config-buttons > p,
|
||
html[data-theme] .modal-overlay .config-buttons .warning,
|
||
html[data-theme] .modal-overlay .config-buttons .info {
|
||
white-space: normal !important;
|
||
overflow-wrap: anywhere !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar {
|
||
left: calc(10px + env(safe-area-inset-left, 0px)) !important;
|
||
bottom: calc(76px + env(safe-area-inset-bottom, 0px)) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="collapsed"] {
|
||
width: 52px !important;
|
||
height: 52px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="open"] {
|
||
/* 移动端按钮组 right:10px、宽 48+8+48=104px → 左边缘 innerW-114,
|
||
搜索栏 left:10 → 上限 100%-132px */
|
||
width: calc(100% - 132px) !important;
|
||
min-height: 56px !important;
|
||
border-radius: 18px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-admin-entry {
|
||
width: 48px !important;
|
||
height: 48px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-dock {
|
||
right: calc(10px + env(safe-area-inset-right, 0px)) !important;
|
||
bottom: calc(76px + env(safe-area-inset-bottom, 0px)) !important;
|
||
gap: 8px !important;
|
||
}
|
||
|
||
/* 移动端基准 right:10px,露出 14px → 位移 = 自身宽度 - 4px */
|
||
html[data-theme][data-navi-view="workspace"] .navi-dock {
|
||
transform: translateX(calc(100% - 4px)) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-toggle {
|
||
width: 48px !important;
|
||
height: 48px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-view-toggle svg {
|
||
width: 20px !important;
|
||
height: 20px !important;
|
||
}
|
||
|
||
html[data-theme] body {
|
||
padding-bottom: 0 !important;
|
||
}
|
||
}
|
||
|
||
/* 极窄屏(≤380px):输入框展开时右下按钮组整组让位。
|
||
预留式收窄在 320px 下只剩 68px 可输入,不可用;搜索是聚焦动作,
|
||
此时把两个按钮藏起来(visibility 不受 prefers-reduced-motion 影响,
|
||
比 transform 更可靠),搜索栏即可用满宽度。 */
|
||
@media (max-width: 380px) {
|
||
/* 备案号在这里会换行成两行(实测 390px 高 39px、320px 高 66px),
|
||
而按钮固定在 bottom:76px → 实测两者只剩 1px。把按钮上移并收紧凑页脚,
|
||
保证仍有 ~20px 间隙。 */
|
||
html[data-theme] .navi-search-bar {
|
||
bottom: calc(88px + env(safe-area-inset-bottom, 0px)) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-dock {
|
||
bottom: calc(88px + env(safe-area-inset-bottom, 0px)) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-footer {
|
||
gap: 6px !important;
|
||
padding: 8px 16px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="open"] {
|
||
width: calc(100% - 40px) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-bar[data-state="open"] ~ .navi-dock {
|
||
/* visibility 延迟到淡出结束再切,否则瞬间消失、看不到过渡 */
|
||
visibility: hidden !important;
|
||
pointer-events: none !important;
|
||
opacity: 0 !important;
|
||
transform: translateY(10px) !important;
|
||
transition: opacity .2s ease, transform .2s cubic-bezier(.22, 1, .36, 1),
|
||
visibility 0s linear .2s !important;
|
||
}
|
||
}
|
||
|
||
/* ── 页脚:备案号胶囊 ──
|
||
备案号在 /admin/ 里编辑,这里只负责呈现;同时清掉历史上塞在
|
||
内联样式里的 margin-bottom:80px(那是给旧的流式搜索栏让位的)。 */
|
||
html[data-theme] footer {
|
||
margin: 0 !important;
|
||
padding: 0 0 8px !important;
|
||
background: transparent !important;
|
||
}
|
||
|
||
html[data-theme] footer > div {
|
||
margin-bottom: 0 !important;
|
||
padding: 0 !important;
|
||
}
|
||
|
||
/* 极简/工作空间视图补的备案号页脚:留在文档流里,靠 body 的 flex
|
||
把它顶到页面底部(贴着悬浮搜索栏上方),而不是 fixed 浮在内容中间。 */
|
||
html[data-theme] .navi-footer-host {
|
||
margin-top: auto !important;
|
||
display: flex !important;
|
||
justify-content: center !important;
|
||
padding: 8px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-footer {
|
||
display: flex !important;
|
||
flex-wrap: wrap !important;
|
||
align-items: center !important;
|
||
justify-content: center !important;
|
||
gap: 9px !important;
|
||
width: fit-content !important;
|
||
max-width: min(680px, calc(100% - 24px)) !important;
|
||
margin: 14px auto 0 !important;
|
||
padding: 9px 18px !important;
|
||
color: #64748b !important;
|
||
font-size: 12.5px !important;
|
||
line-height: 1.4 !important;
|
||
background: rgba(255, 255, 255, .55) !important;
|
||
border: 1px solid rgba(255, 255, 255, .78) !important;
|
||
border-radius: 999px !important;
|
||
box-shadow: 0 6px 18px rgba(15, 23, 42, .06), inset 0 1px 0 rgba(255, 255, 255, .92) !important;
|
||
backdrop-filter: blur(14px) saturate(170%) !important;
|
||
-webkit-backdrop-filter: blur(14px) saturate(170%) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-footer a {
|
||
color: #64748b !important;
|
||
text-decoration: none !important;
|
||
border-bottom: 1px dashed rgba(100, 116, 139, .45) !important;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
}
|
||
|
||
html[data-theme] .navi-footer a:hover,
|
||
html[data-theme] .navi-footer a:focus,
|
||
html[data-theme] .navi-footer a:active {
|
||
color: #64748b !important;
|
||
border-bottom-color: rgba(100, 116, 139, .45) !important;
|
||
outline: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-footer-sep {
|
||
color: rgba(100, 116, 139, .45) !important;
|
||
}
|
||
|
||
/* ── 工作空间:悬浮控件与备案号收起到屏幕边缘 ──
|
||
工作空间中间嵌的是别人的应用,这些常驻控件会遮挡内容。
|
||
搜索球收左边缘、右下角按钮组整组收右边缘、备案号收下边缘,
|
||
各留 14px 露出;鼠标移入或点击、聚焦时滑出展开。 */
|
||
html[data-theme][data-navi-view="workspace"] .navi-search-bar,
|
||
html[data-theme][data-navi-view="workspace"] .navi-dock,
|
||
html[data-theme][data-navi-view="workspace"] .navi-footer-host {
|
||
opacity: .55 !important;
|
||
transition: transform .26s cubic-bezier(.22, 1, .36, 1), opacity .26s ease !important;
|
||
animation: none !important;
|
||
}
|
||
|
||
/* 基础 left 为 16px、宽 56px → 位移 58px 后恰好露出 14px */
|
||
html[data-theme][data-navi-view="workspace"] .navi-search-bar {
|
||
transform: translateX(-58px) !important;
|
||
}
|
||
|
||
/* 按钮组整组右移自身宽度减 14px,恰好露出 14px */
|
||
html[data-theme][data-navi-view="workspace"] .navi-dock {
|
||
/* 基准 right:16px,露出 14px → 位移 = 自身宽度 + 16px - 14px */
|
||
transform: translateX(calc(100% + 2px)) !important;
|
||
}
|
||
|
||
html[data-theme][data-navi-view="workspace"] .navi-footer-host {
|
||
position: fixed !important;
|
||
left: 0 !important;
|
||
right: 0 !important;
|
||
bottom: 0 !important;
|
||
z-index: 880 !important;
|
||
padding: 0 !important;
|
||
transform: translateY(calc(100% - 13px)) !important;
|
||
}
|
||
|
||
/* 展开:悬停 / 聚焦 / 按下 / 搜索已展开 */
|
||
html[data-theme][data-navi-view="workspace"] .navi-search-bar:hover,
|
||
html[data-theme][data-navi-view="workspace"] .navi-search-bar:focus-within,
|
||
html[data-theme][data-navi-view="workspace"] .navi-search-bar[data-state="open"],
|
||
html[data-theme][data-navi-view="workspace"] .navi-dock:hover,
|
||
html[data-theme][data-navi-view="workspace"] .navi-dock:focus-within,
|
||
html[data-theme][data-navi-view="workspace"] .navi-footer-host:hover,
|
||
html[data-theme][data-navi-view="workspace"] .navi-footer-host:focus-within,
|
||
/* 触摸/点击展开:第一次交互只滑出,第二次才触发(见 navi.js 的 peek guard) */
|
||
html[data-navi-view="workspace"].navi-peek-open .navi-search-bar,
|
||
html[data-navi-view="workspace"].navi-peek-open .navi-dock,
|
||
html[data-navi-view="workspace"].navi-peek-open .navi-footer-host {
|
||
opacity: 1 !important;
|
||
transform: translateX(0) translateY(0) !important;
|
||
}
|
||
|
||
/* ── 工作空间:点侧栏应用 → 在中间内嵌打开网页 ──
|
||
Dashy 的面板就是 iframe,我们只是让它在文档流里正常显示、并且只在
|
||
「可内嵌」时显示;被拒绝时改为明确提示,而不是一片空白。
|
||
用正常文档流(而不是 fixed 钉在视口中间),否则会把页面切成
|
||
「顶栏 / 大方块 / 底部」三段,看起来上下都被截断。 */
|
||
html[data-theme] .work-space {
|
||
height: auto !important;
|
||
min-height: 0 !important;
|
||
}
|
||
|
||
html[data-theme] .work-space .multi-taking-view,
|
||
html[data-theme] .work-space .workspace-widget-view {
|
||
display: none !important;
|
||
}
|
||
|
||
/* iframe 面板与提示卡共用同一块位置,切换状态时布局不跳动 */
|
||
html[data-theme] .work-space .web-content,
|
||
html[data-theme] .work-space .navi-ws-notice {
|
||
box-sizing: border-box !important;
|
||
position: static !important;
|
||
display: none !important;
|
||
width: auto !important;
|
||
height: min(72vh, 720px) !important;
|
||
min-height: 300px !important;
|
||
margin: 18px 18px 14px 72px !important;
|
||
border: 1px solid rgba(255, 255, 255, .85) !important;
|
||
border-radius: 20px !important;
|
||
box-shadow: 0 18px 44px rgba(15, 23, 42, .14), inset 0 1px 0 rgba(255, 255, 255, .92) !important;
|
||
overflow: hidden !important;
|
||
z-index: 1 !important;
|
||
}
|
||
|
||
html[data-theme] .work-space .web-content {
|
||
padding: 0 !important;
|
||
background: #fff !important;
|
||
}
|
||
|
||
html[data-theme] .work-space[data-navi-ws="frame"] .web-content {
|
||
display: block !important;
|
||
margin-top: 8px !important;
|
||
}
|
||
|
||
/* 面板工具条:常驻退路(刷新 / 在新标签页打开),只在内嵌态出现 */
|
||
html[data-theme] .navi-ws-bar {
|
||
display: none !important;
|
||
}
|
||
|
||
html[data-theme] .work-space[data-navi-ws="frame"] .navi-ws-bar {
|
||
box-sizing: border-box !important;
|
||
position: static !important;
|
||
display: flex !important;
|
||
align-items: center !important;
|
||
gap: 10px !important;
|
||
min-height: 40px !important;
|
||
margin: 18px 18px 0 72px !important;
|
||
padding: 5px 6px 5px 16px !important;
|
||
background: rgba(255, 255, 255, .55) !important;
|
||
border: 1px solid rgba(255, 255, 255, .82) !important;
|
||
border-radius: 999px !important;
|
||
box-shadow: 0 10px 26px rgba(15, 23, 42, .1), inset 0 1px 0 rgba(255, 255, 255, .92) !important;
|
||
backdrop-filter: blur(16px) saturate(180%) !important;
|
||
-webkit-backdrop-filter: blur(16px) saturate(180%) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-bar-host {
|
||
color: #0f172a !important;
|
||
font-size: 13.5px !important;
|
||
font-weight: 600 !important;
|
||
overflow: hidden !important;
|
||
text-overflow: ellipsis !important;
|
||
white-space: nowrap !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-bar-note {
|
||
color: #94a3b8 !important;
|
||
font-size: 12.5px !important;
|
||
overflow: hidden !important;
|
||
text-overflow: ellipsis !important;
|
||
white-space: nowrap !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-bar-spacer {
|
||
flex: 1 1 auto !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-bar-btn {
|
||
flex: 0 0 auto !important;
|
||
padding: 6px 13px !important;
|
||
color: #334155 !important;
|
||
font-family: inherit !important;
|
||
font-size: 12.5px !important;
|
||
background: rgba(255, 255, 255, .72) !important;
|
||
border: 1px solid rgba(255, 255, 255, .9) !important;
|
||
border-radius: 999px !important;
|
||
cursor: pointer;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
outline: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-bar-btn:hover,
|
||
html[data-theme] .navi-ws-bar-btn:focus,
|
||
html[data-theme] .navi-ws-bar-btn:active {
|
||
color: #0f172a !important;
|
||
background: rgba(255, 255, 255, .95) !important;
|
||
}
|
||
|
||
html[data-theme] .work-space .web-content iframe {
|
||
/* 必须是 static:Dashy 默认 absolute,包含块是 #dashy 而不是 .web-content,
|
||
于是 .web-content 的 overflow:hidden 拦不住它,iframe 会按 #dashy 的高度
|
||
撑高整页(实测多出 77px 纵向滚动)。 */
|
||
position: static !important;
|
||
display: block !important;
|
||
width: 100% !important;
|
||
height: 100% !important;
|
||
border: 0 !important;
|
||
background: #fff !important;
|
||
}
|
||
|
||
html[data-theme] .work-space[data-navi-ws="hint"] .navi-ws-notice,
|
||
html[data-theme] .work-space[data-navi-ws="loading"] .navi-ws-notice,
|
||
html[data-theme] .work-space[data-navi-ws="blocked"] .navi-ws-notice {
|
||
display: flex !important;
|
||
flex-direction: column !important;
|
||
align-items: center !important;
|
||
justify-content: center !important;
|
||
gap: 10px !important;
|
||
padding: 24px !important;
|
||
text-align: center !important;
|
||
background: rgba(255, 255, 255, .55) !important;
|
||
backdrop-filter: blur(18px) saturate(180%) !important;
|
||
-webkit-backdrop-filter: blur(18px) saturate(180%) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-notice-title {
|
||
color: #0f172a !important;
|
||
font-size: 16px !important;
|
||
font-weight: 650 !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-notice-text {
|
||
color: #64748b !important;
|
||
font-size: 13.5px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-notice-url {
|
||
max-width: 80% !important;
|
||
color: #94a3b8 !important;
|
||
font-size: 12.5px !important;
|
||
word-break: break-all !important;
|
||
}
|
||
|
||
/* ── 「不支持在工作区显示」弹层 ──
|
||
被拒内嵌时不能只是面板里一行字:用户点了必须有明确反馈。
|
||
z-index 低于 Dashy 自己的配置弹层(10000),避免挡住它。 */
|
||
html[data-theme] .navi-ws-modal {
|
||
position: fixed !important;
|
||
inset: 0 !important;
|
||
z-index: 9990 !important;
|
||
display: flex !important;
|
||
align-items: center !important;
|
||
justify-content: center !important;
|
||
padding: 18px !important;
|
||
background: rgba(15, 23, 42, .28) !important;
|
||
backdrop-filter: blur(4px) !important;
|
||
-webkit-backdrop-filter: blur(4px) !important;
|
||
animation: navi-fade-in .18s ease both;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal.closing {
|
||
opacity: 0 !important;
|
||
transition: opacity .16s ease !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal.closing .navi-ws-modal-card {
|
||
transform: translateY(8px) scale(.98) !important;
|
||
transition: transform .16s ease !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal-card {
|
||
box-sizing: border-box !important;
|
||
width: min(420px, 100%) !important;
|
||
display: flex !important;
|
||
flex-direction: column !important;
|
||
align-items: center !important;
|
||
gap: 8px !important;
|
||
padding: 24px 22px 20px !important;
|
||
text-align: center !important;
|
||
background: rgba(255, 255, 255, .96) !important;
|
||
border: 1px solid rgba(255, 255, 255, .9) !important;
|
||
border-radius: 20px !important;
|
||
box-shadow: 0 26px 60px rgba(15, 23, 42, .28), inset 0 1px 0 rgba(255, 255, 255, .95) !important;
|
||
animation: navi-fade-up .22s cubic-bezier(.22, 1, .36, 1) both;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal-title {
|
||
color: #0f172a !important;
|
||
font-size: 17px !important;
|
||
font-weight: 650 !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal-host {
|
||
color: #0284c7 !important;
|
||
font-size: 13px !important;
|
||
word-break: break-all !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal-text {
|
||
color: #64748b !important;
|
||
font-size: 13.5px !important;
|
||
line-height: 1.5 !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal-actions {
|
||
display: flex !important;
|
||
flex-wrap: wrap !important;
|
||
gap: 10px !important;
|
||
justify-content: center !important;
|
||
margin-top: 10px !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal-ok {
|
||
padding: 9px 18px !important;
|
||
color: #334155 !important;
|
||
font-family: inherit !important;
|
||
font-size: 13.5px !important;
|
||
background: rgba(241, 245, 249, .95) !important;
|
||
border: 1px solid rgba(203, 213, 225, .9) !important;
|
||
border-radius: 999px !important;
|
||
cursor: pointer;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
outline: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-modal-ok:hover,
|
||
html[data-theme] .navi-ws-modal-ok:focus {
|
||
color: #0f172a !important;
|
||
background: rgba(255, 255, 255, .98) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-ws-open {
|
||
margin-top: 6px !important;
|
||
padding: 9px 18px !important;
|
||
color: #fff !important;
|
||
font-family: inherit !important;
|
||
font-size: 13.5px !important;
|
||
background: linear-gradient(135deg, #0ea5e9, #2563eb) !important;
|
||
border: 0 !important;
|
||
border-radius: 999px !important;
|
||
box-shadow: 0 10px 24px rgba(37, 99, 235, .28) !important;
|
||
-webkit-tap-highlight-color: transparent !important;
|
||
outline: none !important;
|
||
cursor: pointer;
|
||
}
|
||
|
||
/* ── 工作空间:侧栏与内容区同样走玻璃圆角 ── */
|
||
html[data-theme] nav.side-bar {
|
||
background: rgba(255, 255, 255, .62) !important;
|
||
border-right: 1px solid rgba(255, 255, 255, .6) !important;
|
||
backdrop-filter: blur(18px) saturate(180%) !important;
|
||
-webkit-backdrop-filter: blur(18px) saturate(180%) !important;
|
||
}
|
||
|
||
html[data-theme] nav.side-bar .side-bar-section {
|
||
padding: 2px !important;
|
||
}
|
||
|
||
html[data-theme] nav.side-bar .side-bar-item {
|
||
border-radius: 12px !important;
|
||
transition: background .2s ease !important;
|
||
}
|
||
|
||
html[data-theme] nav.side-bar .side-bar-item:hover {
|
||
background: rgba(255, 255, 255, .92) !important;
|
||
}
|
||
|
||
/* ── 动效 ──
|
||
只动 transform / opacity,不触发布局;时长 180–380ms,
|
||
缓动统一 cubic-bezier(.22,1,.36,1)(快速起步、平稳收尾)。 */
|
||
@keyframes navi-fade-in {
|
||
from { opacity: 0; }
|
||
to { opacity: 1; }
|
||
}
|
||
|
||
@keyframes navi-fade-up {
|
||
from { opacity: 0; transform: translateY(10px); }
|
||
to { opacity: 1; transform: translateY(0); }
|
||
}
|
||
|
||
@keyframes navi-bar-in {
|
||
from { opacity: 0; transform: translateY(16px); }
|
||
to { opacity: 1; transform: translateY(0); }
|
||
}
|
||
|
||
html[data-theme] html,
|
||
html[data-theme] body {
|
||
scroll-behavior: smooth;
|
||
}
|
||
|
||
/* 视图切换:主内容与选中分组淡入 */
|
||
html[data-theme] #dashy > *,
|
||
html[data-theme] .minimal-section-inner.selected,
|
||
html[data-theme] .work-space {
|
||
animation: navi-fade-in .3s cubic-bezier(.22, 1, .36, 1) both;
|
||
}
|
||
|
||
/* 悬浮搜索栏:从下侧滑入 */
|
||
html[data-theme] .navi-search-bar {
|
||
animation: navi-bar-in .36s cubic-bezier(.22, 1, .36, 1) both;
|
||
transition: box-shadow .24s ease, border-color .24s ease, background .24s ease,
|
||
width .28s cubic-bezier(.22, 1, .36, 1), border-radius .28s ease !important;
|
||
}
|
||
|
||
html[data-theme] .navi-admin-entry {
|
||
animation: navi-fade-in .42s ease both;
|
||
}
|
||
|
||
html[data-theme] .navi-search-submit {
|
||
transition: transform .2s cubic-bezier(.22, 1, .36, 1), box-shadow .2s ease, filter .2s ease !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-submit:hover {
|
||
filter: brightness(1.06);
|
||
transform: translateY(-1px) scale(1.04);
|
||
box-shadow: 0 12px 26px rgba(37, 99, 235, .34) !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-submit:focus,
|
||
html[data-theme] .navi-search-submit:active {
|
||
outline: none !important;
|
||
}
|
||
|
||
html[data-theme] .navi-search-submit:active {
|
||
transform: translateY(0) scale(.96);
|
||
}
|
||
|
||
html[data-theme] .navi-footer-host {
|
||
animation: navi-fade-in .42s ease both;
|
||
}
|
||
|
||
/* 卡片逐个淡入:只作用在内容层,避免和 masonry 布局的位移冲突 */
|
||
html[data-theme] div.collapsible-content .item-wrapper,
|
||
html[data-theme] .minimal-section-inner .item-wrapper {
|
||
animation: navi-fade-up .34s cubic-bezier(.22, 1, .36, 1) both;
|
||
}
|
||
|
||
html[data-theme] .item-wrapper:nth-child(1) { animation-delay: 0ms; }
|
||
html[data-theme] .item-wrapper:nth-child(2) { animation-delay: 30ms; }
|
||
html[data-theme] .item-wrapper:nth-child(3) { animation-delay: 60ms; }
|
||
html[data-theme] .item-wrapper:nth-child(4) { animation-delay: 90ms; }
|
||
html[data-theme] .item-wrapper:nth-child(5) { animation-delay: 120ms; }
|
||
html[data-theme] .item-wrapper:nth-child(6) { animation-delay: 150ms; }
|
||
html[data-theme] .item-wrapper:nth-child(n+7) { animation-delay: 180ms; }
|
||
|
||
/* 分组容器:悬停轻微上浮 */
|
||
html[data-theme] div.collapsable {
|
||
transition: box-shadow .26s ease, border-color .26s ease, transform .26s cubic-bezier(.22, 1, .36, 1) !important;
|
||
}
|
||
|
||
html[data-theme] div.collapsable:hover {
|
||
transform: translateY(-2px);
|
||
border-color: rgba(147, 197, 253, .6) !important;
|
||
box-shadow: 0 18px 40px rgba(15, 23, 42, .12), inset 0 1px 0 rgba(255, 255, 255, .9) !important;
|
||
}
|
||
|
||
html[data-theme] div.collapsable h2,
|
||
html[data-theme] .minimal-headings-row .headings {
|
||
transition: background .22s ease, color .22s ease, transform .22s cubic-bezier(.22, 1, .36, 1), border-color .22s ease !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-row .headings:hover {
|
||
transform: translateY(-1px);
|
||
border-color: rgba(147, 197, 253, .75) !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-row .headings:active {
|
||
transform: scale(.975);
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-wrap .tab-scroll-btn {
|
||
transition: background .2s ease, color .2s ease, transform .2s cubic-bezier(.22, 1, .36, 1) !important;
|
||
}
|
||
|
||
html[data-theme] .minimal-headings-wrap .tab-scroll-btn:hover:not([disabled]) {
|
||
transform: scale(1.06);
|
||
}
|
||
|
||
html[data-theme] a.item:active {
|
||
transform: translateY(-1px) scale(.99) !important;
|
||
}
|
||
|
||
html[data-theme] a.item .item-icon img,
|
||
html[data-theme] a.item .item-icon svg {
|
||
transition: transform .26s cubic-bezier(.22, 1, .36, 1) !important;
|
||
}
|
||
|
||
html[data-theme] nav.side-bar .side-bar-item {
|
||
transition: background .2s ease, transform .2s cubic-bezier(.22, 1, .36, 1) !important;
|
||
}
|
||
|
||
html[data-theme] nav.side-bar .side-bar-item:hover {
|
||
transform: scale(1.06);
|
||
}
|
||
|
||
html[data-theme] .navi-footer a {
|
||
transition: color .2s ease, border-color .2s ease !important;
|
||
}
|
||
|
||
@media (prefers-reduced-motion: reduce) {
|
||
html[data-theme] html,
|
||
html[data-theme] body {
|
||
scroll-behavior: auto !important;
|
||
}
|
||
|
||
html[data-theme] #dashy > *,
|
||
html[data-theme] .minimal-section-inner.selected,
|
||
html[data-theme] .work-space,
|
||
html[data-theme] .navi-search-bar,
|
||
html[data-theme] .navi-admin-entry,
|
||
html[data-theme] .navi-footer-host,
|
||
html[data-theme] div.collapsible-content .item-wrapper,
|
||
html[data-theme] .minimal-section-inner .item-wrapper {
|
||
animation: none !important;
|
||
opacity: 1 !important;
|
||
transform: none !important;
|
||
}
|
||
|
||
html[data-theme] a.item,
|
||
html[data-theme] a.item .tile-icon {
|
||
transition: none !important;
|
||
}
|
||
|
||
html[data-theme] a.item:hover,
|
||
html[data-theme] div.collapsable:hover,
|
||
html[data-theme] nav.side-bar .side-bar-item:hover,
|
||
html[data-theme] .minimal-headings-row .headings:hover {
|
||
transform: none !important;
|
||
}
|
||
}
|
||
|
||
/* ── 深色模式(整套变量覆盖)──
|
||
触发:<html class="navi-dark">(由 navi.js 按系统偏好切换,不改写 data-theme)。
|
||
|
||
为什么必须整变量覆盖、而不是按元素打补丁:
|
||
Dashy 的全部配色都来自主题变量(本站主题 jianf-glass,共 48 个),
|
||
只改页面底色和几个元素会造成"底色黑了、卡片还是亮的、圆角直角混杂"。
|
||
这里把同一批变量整体换成深色值,Dashy 自己的卡片/侧栏/头部/弹层随之一致变深,
|
||
形状(圆角)由元素自身样式决定,不受影响。
|
||
|
||
选择器用 html.navi-dark(0,1,1)高于 Dashy 的 [data-theme=...](0,1,0),
|
||
因此与注入顺序无关,稳定生效。 */
|
||
html.navi-dark {
|
||
color-scheme: dark !important;
|
||
--background-color: #0b1120;
|
||
--background-darker: #070d18;
|
||
--code-editor-background-color: #0f172a;
|
||
--code-editor-color: #e2e8f0;
|
||
--config-code-background-color: #0f172a;
|
||
--config-code-color: #e2e8f0;
|
||
--config-settings-background: rgba(15, 23, 42, 0.92);
|
||
--config-settings-color: #cbd5e1;
|
||
--context-menu-background: rgba(15, 23, 42, 0.96);
|
||
--context-menu-color: #e2e8f0;
|
||
--danger: #f87171;
|
||
--footer-text-color: #94a3b8;
|
||
--footer-text-color-link: #38bdf8;
|
||
--heading-text-color: #f1f5f9;
|
||
--highlight-background-color: #1e40af;
|
||
--highlight-color: #e2e8f0;
|
||
--info: #38bdf8;
|
||
--item-group-background: rgba(17, 25, 40, 0.62);
|
||
--item-group-heading-text-color: #e8eefc;
|
||
--item-group-heading-text-color-hover: #7dd3fc;
|
||
--item-group-outer-background: rgba(17, 25, 40, 0.5);
|
||
--item-text-color: #dbe4f3;
|
||
--nav-link-background-color: rgba(30, 41, 59, 0.55);
|
||
--nav-link-background-color-hover: rgba(30, 41, 59, 0.85);
|
||
--nav-link-border-color: rgba(148, 163, 184, 0.25);
|
||
--nav-link-border-color-hover: #38bdf8;
|
||
--nav-link-text-color: #cbd5e1;
|
||
--nav-link-text-color-hover: #7dd3fc;
|
||
--neutral: #94a3b8;
|
||
--primary: #38bdf8;
|
||
--primary-alt: #0ea5e9;
|
||
--scroll-bar-background-color: #0f172a;
|
||
--scroll-bar-color: #334155;
|
||
--search-container-background: rgba(15, 23, 42, 0.6);
|
||
--search-field-background: rgba(15, 23, 42, 0.8);
|
||
--settings-background: rgba(15, 23, 42, 0.75);
|
||
--settings-text-color: #cbd5e1;
|
||
--side-bar-background: rgba(15, 23, 42, 0.72);
|
||
--side-bar-color: #cbd5e1;
|
||
--status-check-tooltip-background: rgba(15, 23, 42, 0.92);
|
||
--status-check-tooltip-color: #e2e8f0;
|
||
--success: #4ade80;
|
||
--toast-background: rgba(15, 23, 42, 0.92);
|
||
--toast-color: #e2e8f0;
|
||
--warning: #fbbf24;
|
||
--welcome-popup-background: rgba(15, 23, 42, 0.88);
|
||
--welcome-popup-text-color: #e2e8f0;
|
||
}
|
||
/* 页面底色与文字:特异度 (0,2,1) > customCss 的 html[data-theme] body (0,1,1),
|
||
因此不再依赖注入顺序(之前正是这里被打平局,导致"主页大面积没变深")。 */
|
||
/* 只改 background-color,绝不使用 background 简写:
|
||
用户可能配了壁纸,而壁纸是通过 background-image 设在 body 上的
|
||
(见 conf.yml 的 NAVI-WALLPAPER 块)。用简写会把 background-image 清成 none,
|
||
壁纸就消失了 —— 这正是上一版的问题。 */
|
||
html.navi-dark body.navi-dark,
|
||
html.navi-dark body {
|
||
background-color: #0b1120 !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
/* Dashy 的外层容器:确保不残留亮色底 */
|
||
html.navi-dark body #dashy,
|
||
html.navi-dark body .home,
|
||
html.navi-dark body .main-content,
|
||
html.navi-dark body .workspace,
|
||
html.navi-dark body .minimal-home {
|
||
background: transparent !important;
|
||
background-color: transparent !important;
|
||
}
|
||
/* Dashy 原生页脚(它自己渲染的那一个) */
|
||
html.navi-dark body footer,
|
||
html.navi-dark body .footer {
|
||
background: transparent !important;
|
||
color: #94a3b8 !important;
|
||
border-color: rgba(148, 163, 184, 0.2) !important;
|
||
}
|
||
/* 我们注入的全部悬浮件:类名统一以 navi- 开头,这里整体兜住,
|
||
避免再出现"右下角一块灰色方块"(漏掉某个类名就会那样)。 */
|
||
html.navi-dark body [class^="navi-"],
|
||
html.navi-dark body [class*=" navi-"] {
|
||
border-color: rgba(148, 163, 184, 0.22) !important;
|
||
}
|
||
html.navi-dark body [class^="navi-"]:not(.navi-icon):not(.navi-search-icon),
|
||
html.navi-dark body [class*=" navi-"]:not(.navi-icon):not(.navi-search-icon) {
|
||
background-color: rgba(17, 25, 40, 0.8);
|
||
color: #e8eefc;
|
||
}
|
||
html.navi-dark body .navi-dock,
|
||
html.navi-dark body .navi-dock *,
|
||
html.navi-dark body .navi-search-bar,
|
||
html.navi-dark body .navi-footer-host,
|
||
html.navi-dark body .navi-ws-toolbar,
|
||
html.navi-dark body .navi-ws-modal,
|
||
html.navi-dark body .navi-mini-tabs,
|
||
html.navi-dark body .navi-view-switch {
|
||
background-color: rgba(17, 25, 40, 0.82) !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
html.navi-dark body .navi-dock svg,
|
||
html.navi-dark body .navi-dock button,
|
||
html.navi-dark body .navi-footer,
|
||
html.navi-dark body .navi-footer a,
|
||
html.navi-dark body .navi-footer .navi-footer-sep { color: #cbd5e1 !important; }
|
||
html.navi-dark body .navi-footer,
|
||
html.navi-dark body .navi-footer a,
|
||
html.navi-dark body .navi-footer .navi-footer-sep { color: #94a3b8 !important; }
|
||
/* 我们自己的悬浮件(不在 Dashy 变量体系内,单独给深色) */
|
||
html.navi-dark body .navi-search-bar,
|
||
html.navi-dark body .navi-dock,
|
||
html.navi-dark body .navi-footer-host,
|
||
html.navi-dark body .navi-ws-toolbar,
|
||
html.navi-dark body .navi-ws-modal,
|
||
html.navi-dark body .navi-mini-tabs {
|
||
background: rgba(17, 25, 40, 0.8) !important;
|
||
border-color: rgba(148, 163, 184, 0.22) !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
html.navi-dark body .navi-search-bar input,
|
||
html.navi-dark body .navi-search-bar .navi-search-input {
|
||
background: rgba(15, 23, 42, 0.7) !important;
|
||
color: #e8eefc !important;
|
||
border-color: rgba(148, 163, 184, 0.25) !important;
|
||
}
|
||
html.navi-dark body .navi-footer,
|
||
html.navi-dark body .navi-footer a,
|
||
html.navi-dark body .navi-footer .navi-footer-sep { color: #94a3b8 !important; }
|
||
html.navi-dark body .navi-footer a:hover { color: #38bdf8 !important; }
|
||
html.navi-dark body .navi-dock button,
|
||
html.navi-dark body .navi-dock a {
|
||
background: rgba(30, 41, 59, 0.75) !important;
|
||
color: #cbd5e1 !important;
|
||
border-color: rgba(148, 163, 184, 0.22) !important;
|
||
}
|
||
|
||
/* ── 深色视觉收口(真实浏览器截图 + computed style 验证)──
|
||
主题变量不足以覆盖前文带 !important 的亮色规则,因此按真实 Dashy DOM
|
||
补齐标题、分组、卡片和浮动控件。布局容器必须透明,只有圆形按钮本身着色。 */
|
||
html.navi-dark body.navi-dark {
|
||
background-color: #080f1e !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
/* 壁纸压暗改由服务端负责:applyWallpaperBlock 会为深色模式写同一张壁纸 +
|
||
深色遮罩的规则(更具体、与顺序无关)。这里不再叠一层 body::before 遮罩,
|
||
否则壁纸会被"深色渐变 + 遮罩"双重压暗。 */
|
||
|
||
html.navi-dark body #dashy,
|
||
html.navi-dark body .home,
|
||
html.navi-dark body .main-content,
|
||
html.navi-dark body .workspace,
|
||
html.navi-dark body .minimal-home {
|
||
background: transparent !important;
|
||
background-color: transparent !important;
|
||
}
|
||
/* Dashy 原生页脚(它自己渲染的那一个) */
|
||
html.navi-dark body footer,
|
||
html.navi-dark body .footer {
|
||
background: transparent !important;
|
||
color: #94a3b8 !important;
|
||
border-color: rgba(148, 163, 184, 0.2) !important;
|
||
}
|
||
/* 我们注入的全部悬浮件:类名统一以 navi- 开头,这里整体兜住,
|
||
避免再出现"右下角一块灰色方块"(漏掉某个类名就会那样)。 */
|
||
html.navi-dark body [class^="navi-"],
|
||
html.navi-dark body [class*=" navi-"] {
|
||
border-color: rgba(148, 163, 184, 0.22) !important;
|
||
}
|
||
html.navi-dark body [class^="navi-"]:not(.navi-icon):not(.navi-search-icon),
|
||
html.navi-dark body [class*=" navi-"]:not(.navi-icon):not(.navi-search-icon) {
|
||
background-color: rgba(17, 25, 40, 0.8);
|
||
color: #e8eefc;
|
||
}
|
||
html.navi-dark body .navi-dock,
|
||
html.navi-dark body .navi-dock *,
|
||
html.navi-dark body .navi-search-bar,
|
||
html.navi-dark body .navi-footer-host,
|
||
html.navi-dark body .navi-ws-toolbar,
|
||
html.navi-dark body .navi-ws-modal,
|
||
html.navi-dark body .navi-mini-tabs,
|
||
html.navi-dark body .navi-view-switch {
|
||
background-color: rgba(17, 25, 40, 0.82) !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
html.navi-dark body .navi-dock svg,
|
||
html.navi-dark body .navi-dock button,
|
||
html.navi-dark body .navi-footer,
|
||
html.navi-dark body .navi-footer a,
|
||
html.navi-dark body .navi-footer .navi-footer-sep { color: #cbd5e1 !important; }
|
||
html.navi-dark body .navi-footer,
|
||
html.navi-dark body .navi-footer a,
|
||
html.navi-dark body .navi-footer .navi-footer-sep { color: #94a3b8 !important; }
|
||
/* 我们自己的悬浮件(不在 Dashy 变量体系内,单独给深色) */
|
||
html.navi-dark body .navi-search-bar,
|
||
html.navi-dark body .navi-dock,
|
||
html.navi-dark body .navi-footer-host,
|
||
html.navi-dark body .navi-ws-toolbar,
|
||
html.navi-dark body .navi-ws-modal,
|
||
html.navi-dark body .navi-mini-tabs {
|
||
background: rgba(17, 25, 40, 0.8) !important;
|
||
border-color: rgba(148, 163, 184, 0.22) !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
html.navi-dark body .navi-search-bar input,
|
||
html.navi-dark body .navi-search-bar .navi-search-input {
|
||
background: rgba(15, 23, 42, 0.7) !important;
|
||
color: #e8eefc !important;
|
||
border-color: rgba(148, 163, 184, 0.25) !important;
|
||
}
|
||
html.navi-dark body .navi-footer,
|
||
html.navi-dark body .navi-footer a,
|
||
html.navi-dark body .navi-footer .navi-footer-sep { color: #94a3b8 !important; }
|
||
html.navi-dark body .navi-footer a:hover { color: #38bdf8 !important; }
|
||
html.navi-dark body .navi-dock button,
|
||
html.navi-dark body .navi-dock a {
|
||
background: rgba(30, 41, 59, 0.75) !important;
|
||
color: #cbd5e1 !important;
|
||
border-color: rgba(148, 163, 184, 0.22) !important;
|
||
}
|
||
|
||
/* ── 深色视觉收口(真实浏览器截图 + computed style 验证)──
|
||
主题变量不足以覆盖前文带 !important 的亮色规则,因此按真实 Dashy DOM
|
||
补齐标题、分组、卡片和浮动控件。布局容器必须透明,只有圆形按钮本身着色。 */
|
||
html.navi-dark body.navi-dark {
|
||
background-color: #080f1e !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
/* 壁纸压暗:在 body 背景之上、内容之下铺一层深色遮罩(与亮色模式的白色
|
||
遮罩同一思路),这样深色下壁纸仍然可见、只是变暗,而不是被抹掉。
|
||
z-index:-1 + position:fixed 是本站既有的做法(门户页 .bg-decor 同款)。 */
|
||
html.navi-dark body::before {
|
||
content: '' !important;
|
||
position: fixed !important;
|
||
inset: 0 !important;
|
||
z-index: -1 !important;
|
||
pointer-events: none !important;
|
||
background: rgba(6, 12, 24, .70) !important;
|
||
}
|
||
|
||
/* 顶部标题栏 */
|
||
html.navi-dark body #dashy > header {
|
||
background: rgba(15, 23, 42, .82) !important;
|
||
border-bottom-color: rgba(148, 163, 184, .18) !important;
|
||
box-shadow: 0 8px 28px rgba(0, 0, 0, .28) !important;
|
||
}
|
||
html.navi-dark body.navi-dark #dashy > header .page-titles h1,
|
||
html.navi-dark body.navi-dark #dashy > header .page-titles .text,
|
||
html.navi-dark body.navi-dark .minimal-home .title-and-search h1 {
|
||
color: #f1f5f9 !important;
|
||
}
|
||
html.navi-dark body.navi-dark #dashy > header .page-titles .subtitle {
|
||
color: #a9b8cd !important;
|
||
}
|
||
|
||
/* 分组玻璃面板及标题 */
|
||
html.navi-dark body div.collapsable,
|
||
html.navi-dark body .minimal-section-inner {
|
||
background: rgba(25, 36, 55, .80) !important;
|
||
border-color: rgba(148, 163, 184, .20) !important;
|
||
box-shadow: 0 14px 34px rgba(0, 0, 0, .28), inset 0 1px 0 rgba(255, 255, 255, .045) !important;
|
||
}
|
||
html.navi-dark body.navi-dark div.collapsable .section-header,
|
||
html.navi-dark body.navi-dark div.collapsable .section-header h3,
|
||
html.navi-dark body.navi-dark div.collapsable .section-header h3 *,
|
||
html.navi-dark body .minimal-headings-row .headings,
|
||
html.navi-dark body .minimal-headings-row .headings * {
|
||
color: #dce6f5 !important;
|
||
}
|
||
html.navi-dark body div.collapsable .collapse-icon,
|
||
html.navi-dark body div.collapsable .section-icon,
|
||
html.navi-dark body div.collapsable .action-buttons,
|
||
html.navi-dark body div.collapsable .action-buttons * {
|
||
color: #7f91aa !important;
|
||
}
|
||
|
||
/* 导航卡片及全部文字 */
|
||
html.navi-dark body a.item {
|
||
background: rgba(43, 57, 79, .84) !important;
|
||
border-color: rgba(148, 163, 184, .23) !important;
|
||
box-shadow: 0 7px 20px rgba(0, 0, 0, .22), inset 0 1px 0 rgba(255, 255, 255, .045) !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
html.navi-dark body a.item:hover,
|
||
html.navi-dark body a.item:focus-visible {
|
||
background: rgba(55, 72, 98, .90) !important;
|
||
border-color: rgba(96, 165, 250, .48) !important;
|
||
}
|
||
html.navi-dark body.navi-dark a.item .tile-title,
|
||
html.navi-dark body.navi-dark a.item .tile-title .text,
|
||
html.navi-dark body.navi-dark a.item .item-title,
|
||
html.navi-dark body.navi-dark a.item .item-title * {
|
||
color: #f1f5f9 !important;
|
||
}
|
||
html.navi-dark body.navi-dark a.item .description,
|
||
html.navi-dark body.navi-dark a.item .item-url,
|
||
html.navi-dark body.navi-dark a.item .tile-subtitle {
|
||
color: #a9b8cd !important;
|
||
}
|
||
|
||
/* 右侧方块的根因:dock / view-switch 是布局容器,绝不能绘制背景。 */
|
||
html.navi-dark body.navi-dark .navi-dock,
|
||
html.navi-dark body.navi-dark .navi-view-switch,
|
||
html.navi-dark body.navi-dark .navi-footer-host {
|
||
background: transparent !important;
|
||
background-color: transparent !important;
|
||
border: 0 !important;
|
||
box-shadow: none !important;
|
||
}
|
||
html.navi-dark body .navi-admin-entry,
|
||
html.navi-dark body .navi-view-toggle,
|
||
html.navi-dark body .navi-search-bar {
|
||
background: rgba(20, 31, 49, .94) !important;
|
||
border-color: rgba(148, 163, 184, .30) !important;
|
||
color: #dbeafe !important;
|
||
box-shadow: 0 12px 30px rgba(0, 0, 0, .34), inset 0 1px 0 rgba(255, 255, 255, .06) !important;
|
||
}
|
||
html.navi-dark body .navi-admin-entry:hover,
|
||
html.navi-dark body .navi-view-toggle:hover,
|
||
html.navi-dark body .navi-search-bar:hover {
|
||
background: rgba(31, 46, 70, .97) !important;
|
||
}
|
||
html.navi-dark body .navi-admin-entry svg,
|
||
html.navi-dark body .navi-view-toggle svg,
|
||
html.navi-dark body .navi-search-toggle,
|
||
html.navi-dark body .navi-search-toggle svg {
|
||
color: #dbeafe !important;
|
||
stroke: currentColor !important;
|
||
}
|
||
|
||
/* 备案号是一个完整的深色胶囊,子元素不再各自形成色块。 */
|
||
html.navi-dark body .navi-footer {
|
||
background: rgba(20, 31, 49, .90) !important;
|
||
border-color: rgba(148, 163, 184, .24) !important;
|
||
box-shadow: 0 8px 24px rgba(0, 0, 0, .26), inset 0 1px 0 rgba(255, 255, 255, .045) !important;
|
||
color: #9fb0c8 !important;
|
||
}
|
||
html.navi-dark body .navi-footer *,
|
||
html.navi-dark body .navi-footer a,
|
||
html.navi-dark body .navi-footer .navi-footer-sep {
|
||
background: transparent !important;
|
||
color: #9fb0c8 !important;
|
||
}
|
||
html.navi-dark body .navi-footer a:hover { color: #7dd3fc !important; }
|
||
|
||
/* 极简/工作空间的侧栏、工具条和弹窗也使用同一深色层级。 */
|
||
html.navi-dark body nav.side-bar,
|
||
html.navi-dark body .navi-ws-toolbar,
|
||
html.navi-dark body .navi-ws-notice,
|
||
html.navi-dark body .navi-ws-modal,
|
||
html.navi-dark body .minimal-headings-row .headings {
|
||
background: rgba(20, 31, 49, .91) !important;
|
||
border-color: rgba(148, 163, 184, .22) !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
html.navi-dark body .navi-ws-toolbar *,
|
||
html.navi-dark body .navi-ws-notice-title,
|
||
html.navi-dark body .navi-ws-modal-title,
|
||
html.navi-dark body nav.side-bar .side-bar-item {
|
||
color: #dce6f5 !important;
|
||
}
|
||
|
||
/* 备案号药丸:深色实测发现它仍是 rgba(255,255,255,.55) 的亮色块。
|
||
这里用更高特异度 + 末尾顺序确保覆盖,并把内部元素强制透明,
|
||
避免出现"深色底上贴一块白"的观感。 */
|
||
html.navi-dark body.navi-dark .navi-footer,
|
||
html.navi-dark body.navi-dark .navi-footer-host .navi-footer {
|
||
background-color: rgba(20, 31, 49, .92) !important;
|
||
border-color: rgba(148, 163, 184, .26) !important;
|
||
color: #9fb0c8 !important;
|
||
box-shadow: 0 8px 24px rgba(0, 0, 0, .30), inset 0 1px 0 rgba(255, 255, 255, .05) !important;
|
||
}
|
||
html.navi-dark body.navi-dark .navi-footer *,
|
||
html.navi-dark body.navi-dark .navi-footer a,
|
||
html.navi-dark body.navi-dark .navi-footer .navi-footer-sep {
|
||
background-color: transparent !important;
|
||
color: #9fb0c8 !important;
|
||
}
|
||
html.navi-dark body.navi-dark .navi-footer a:hover { color: #7dd3fc !important; }
|
||
|
||
/* ── workspace / minimal 深色补齐(实测数据驱动)──
|
||
实测:nav.side-bar 已是深色,但 .side-bar-item 仍是 rgba(255,255,255,.7)
|
||
的白色药丸;.work-space .web-content 是纯白 —— 深色下最刺眼的两处。 */
|
||
html.navi-dark body nav.side-bar .side-bar-item,
|
||
html.navi-dark body nav.side-bar .side-bar-item .item-icon,
|
||
html.navi-dark body nav.side-bar a,
|
||
html.navi-dark body .switch-view-buttons button {
|
||
background-color: rgba(30, 41, 59, .0) !important;
|
||
color: #cbd5e1 !important;
|
||
border-color: rgba(148, 163, 184, .22) !important;
|
||
}
|
||
html.navi-dark body nav.side-bar .side-bar-item:hover,
|
||
html.navi-dark body nav.side-bar .side-bar-item:focus,
|
||
html.navi-dark body nav.side-bar .side-bar-item.active {
|
||
background-color: rgba(51, 65, 85, .72) !important;
|
||
color: #e8eefc !important;
|
||
}
|
||
html.navi-dark body nav.side-bar .side-bar-item svg,
|
||
html.navi-dark body nav.side-bar .side-bar-item i,
|
||
html.navi-dark body nav.side-bar .side-bar-item .item-icon i {
|
||
color: #cbd5e1 !important;
|
||
fill: currentColor !important;
|
||
}
|
||
/* 内嵌应用的外框与占位:这里绝不能给不透明底色。
|
||
亮色时代它是 #fff(深色下白框),我上一版改成 #0f172a 后又变成一整块黑方块
|
||
(用户反馈的"工作空间黑色方块")。正确做法是透明:露出壁纸/玻璃底,
|
||
应用自己会画背景;空态时也不会出现突兀的方块。 */
|
||
html.navi-dark body .work-space .web-content,
|
||
html.navi-dark body .work-space .web-content iframe {
|
||
background-color: transparent !important;
|
||
background-image: none !important;
|
||
}
|
||
html.navi-dark body .work-space .navi-ws-notice,
|
||
html.navi-dark body .navi-ws-toolbar {
|
||
background-color: rgba(20, 31, 49, .91) !important;
|
||
color: #dce6f5 !important;
|
||
}
|
||
html.navi-dark body .navi-ws-bar-btn {
|
||
background-color: rgba(30, 41, 59, .85) !important;
|
||
color: #cbd5e1 !important;
|
||
border-color: rgba(148, 163, 184, .24) !important;
|
||
}
|
||
html.navi-dark body .navi-ws-bar-host,
|
||
html.navi-dark body .navi-ws-modal-title,
|
||
html.navi-dark body .navi-ws-notice-title {
|
||
color: #e8eefc !important;
|
||
}
|
||
|
||
/* ── 矮视口下备案号不再撑高页面 ──
|
||
实测复现:900x520 时 .navi-footer-host 从 39px 换行涨到 69px,
|
||
而它在文档流里(margin-top:auto),于是页面被顶高 47px → 出现纵向滚动。
|
||
只对"矮窗口"收紧:缩小内边距/字号并禁止换行(矮窗口通常较宽,不会横向溢出)。
|
||
高窗口与移动端不受影响。 */
|
||
@media (max-height: 560px) {
|
||
/* 关键:矮视口下把备案号移出文档流。
|
||
实测:仅压缩内边距后 .navi-footer-host 仍有 37px 高度且在 flow 里,
|
||
页面被顶高 16px(minimal 900x520 scrollH 536 > viewH 520)。
|
||
改成 fixed 后不再撑高页面;搜索栏/按钮组已上移到 bottom:60px,不会相撞。
|
||
(workspace 视图本来就是这样处理的。) */
|
||
html[data-theme] .navi-footer-host {
|
||
position: fixed !important;
|
||
left: 0 !important;
|
||
right: 0 !important;
|
||
bottom: 0 !important;
|
||
margin: 0 !important;
|
||
padding: 2px !important;
|
||
z-index: 880 !important;
|
||
pointer-events: auto !important;
|
||
}
|
||
html[data-theme] .navi-footer {
|
||
margin: 4px auto 0 !important;
|
||
padding: 5px 12px !important;
|
||
font-size: 11.5px !important;
|
||
flex-wrap: nowrap !important;
|
||
white-space: nowrap !important;
|
||
max-width: calc(100% - 12px) !important;
|
||
overflow: hidden !important;
|
||
}
|
||
html[data-theme] .navi-search-bar {
|
||
bottom: calc(60px + env(safe-area-inset-bottom, 0px)) !important;
|
||
}
|
||
html[data-theme] .navi-dock {
|
||
bottom: calc(60px + env(safe-area-inset-bottom, 0px)) !important;
|
||
}
|
||
}
|