Files
pure-note/web/src/index.css
T
wangairnan 92d89717c5 refactor(web): 残留自制控件统一替换为 antd 组件
- 状态点自制徽标改用 Badge,回收站剩余天数紧急态改用红色 Tag
- 危险按钮改用 danger 属性并补充语言,text+danger 不套实心红样式
- 后台搜索框改 antd Input 前缀形态,删除手写容器与聚焦环样式
- 加载态统一 Spin/Skeleton(Table 用 loading),空态统一 Empty
- Segmented 选项计数改用 Badge count,弱化为 muted 灰
- 首页分页说明改 Pagination showTotal,笔记错误态改 Empty 承接布局
- 代码块复制按钮改 antd Button 并增加「已复制」反馈,修复悬浮不显示
- 博客/后台图标按钮与溢出菜单触发器统一为 antd Button type=text
2026-09-09 15:37:36 +08:00

1987 lines
45 KiB
CSS
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@import "tailwindcss";
@plugin "@tailwindcss/typography";
/* 暗色主题:根元素 class 切换(§8.2) */
@custom-variant dark (&:where(.dark, .dark *));
/* ── Tailwind 主题映射:工具类直接消费设计 token ───────────── */
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-destructive-foreground: var(--destructive-foreground);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
}
@theme {
--font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
"Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
--font-serif: "DM Serif Display", ui-serif, Georgia, "Songti SC", "STSong",
"Noto Serif SC", "SimSun", serif;
--font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
"Cascadia Mono", monospace;
}
/* ============================================================
设计 token —— 极简黑白灰体系(源自设计稿 theme-vars)
brand = 冷灰 ramp;背景/文字/图标为纯灰 ramp。
============================================================ */
:root {
/* brand — 近黑主色 */
--brand-50: #fafafa;
--brand-100: #f4f4f5;
--brand-200: #e4e4e7;
--brand-300: #d4d4d8;
--brand-400: #a1a1aa;
--brand-500: #71717a;
--brand-600: #52525b;
--brand-700: #3f3f46;
--brand-800: #27272a;
--brand-900: #18181b;
/* 语义角色(浅色) */
--background: #ffffff;
--card: #ffffff;
--popover: #ffffff;
--muted: var(--brand-100);
--foreground: var(--brand-900);
--card-foreground: var(--brand-900);
--popover-foreground: var(--brand-900);
--primary: var(--brand-900);
--primary-foreground: var(--brand-50);
--secondary: var(--brand-100);
--secondary-foreground: var(--brand-900);
--muted-foreground: var(--brand-500);
--accent: var(--brand-100);
--accent-foreground: var(--brand-900);
--destructive: #dc2626;
--destructive-foreground: #ffffff;
--destructive-subtle: #fef2f2;
--destructive-border: #fecaca;
--destructive-text: #b91c1c;
--input: var(--brand-200);
--ring: var(--brand-900);
--border: var(--brand-200);
--border-strong: var(--brand-300);
--success: #16a34a;
--success-subtle: #f0fdf4;
--success-border: #bbf7d0;
--success-text: #15803d;
--sidebar: var(--brand-50);
--sidebar-foreground: var(--brand-900);
--sidebar-primary: var(--brand-900);
--sidebar-primary-foreground: var(--brand-50);
--sidebar-accent: var(--brand-100);
--sidebar-accent-foreground: var(--brand-900);
--sidebar-border: var(--brand-200);
/* 字体 */
--font-serif-display: var(--font-serif);
--tracking-tight: -0.012em;
/* 圆角 / 阴影 / 间距基数 */
--radius: 0.75rem;
--radius-sm: 0.375rem;
--radius-md: 0.75rem;
--radius-lg: 1rem;
--shadow-xs: 0 1px 1px 0 rgba(0, 0, 0, 0.04);
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05), 0 1px 1px 0 rgba(0, 0, 0, 0.03);
--space-4: 0.25rem;
}
.dark {
--background: var(--brand-900);
--card: var(--brand-800);
--popover: var(--brand-800);
--muted: var(--brand-800);
--foreground: var(--brand-50);
--card-foreground: var(--brand-50);
--popover-foreground: var(--brand-50);
--primary: var(--brand-50);
--primary-foreground: var(--brand-900);
--secondary: var(--brand-800);
--secondary-foreground: var(--brand-50);
--muted-foreground: var(--brand-400);
--accent: var(--brand-700);
--accent-foreground: var(--brand-50);
--destructive: #ef4444;
--destructive-foreground: var(--brand-50);
--destructive-subtle: #2a1416;
--destructive-border: #7f1d1d;
--destructive-text: #fca5a5;
--input: var(--brand-700);
--ring: var(--brand-300);
--border: var(--brand-700);
--border-strong: var(--brand-600);
--success: #22c55e;
--success-subtle: #0f2417;
--success-border: #166534;
--success-text: #4ade80;
--sidebar: var(--brand-800);
--sidebar-foreground: var(--brand-50);
--sidebar-primary: var(--brand-50);
--sidebar-primary-foreground: var(--brand-900);
--sidebar-accent: var(--brand-700);
--sidebar-accent-foreground: var(--brand-50);
--sidebar-border: var(--brand-700);
}
/* ── 基础 ─────────────────────────────────────────────── */
html {
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
body {
margin: 0;
background: var(--background);
color: var(--foreground);
font-family: var(--font-sans);
font-size: 14px;
line-height: 1.6;
}
/* 表单元素复位必须放在 @layer base:裸规则的无 layer 样式会压过
utilities 层,导致组件(Button/Input/Tabs…)的字号/颜色
工具类全部失效(曾致激活 Tab 黑底黑字) */
@layer base {
button,
input,
textarea,
select {
font: inherit;
color: inherit;
}
::placeholder {
color: var(--muted-foreground);
}
}
/* antd v6 会在应用根内给所有 <a> 注入 :where()(特异度 0) 的
color/background 无 layer 重置(--ant-color-link),压过 utilities
层的链接配色工具类;这里以更高特异度拿回链接默认形态
(继承文本色、无下划线)。各组件类可按更高特异度覆盖。 */
a {
color: inherit;
text-decoration: none;
}
a:focus-visible,
button:focus-visible {
outline: 2px solid var(--ring);
outline-offset: 2px;
}
.pn-loading {
min-height: 100vh;
display: grid;
place-items: center;
color: var(--muted-foreground);
font-size: 14px;
}
/* ============================================================
antd 桥接 —— 组件样式由 antd(ConfigProvider 主题)承接,
这里只放两类规则:a) 语义色桥接(antd 组件内链接/占位符沿用
应用 token);b) 旧设计稿中必须保留的少量组件级样式覆盖。
注意:antd cssinjs 为无 layer 样式,同特异度时会压过 Tailwind
utilities 与本文件,需要覆盖时务必提高选择器特异度。
============================================================ */
/* antd 组件内的路由链接(Tag 内标签链接等)继承组件前景色 */
.ant-tag a,
.pn-tag-link {
color: inherit;
text-decoration: none;
}
/* 表单占位符沿用应用的 muted 前景(antd 默认偏浅) */
input.ant-input::placeholder,
textarea.ant-input::placeholder {
color: var(--muted-foreground);
}
/* Dropdown 内路由项:激活态与旧 .pn-moremenu-item.active 一致 */
.pn-dd-link {
display: inline-flex;
align-items: center;
gap: 8px;
color: inherit;
text-decoration: none;
}
li.ant-dropdown-menu-item.pn-dd-item-active {
background: var(--muted);
}
li.ant-dropdown-menu-item.pn-dd-item-active span {
font-weight: 600;
color: var(--foreground);
}
li.ant-dropdown-menu-item.pn-dd-item-active svg {
color: var(--foreground);
}
/* 标签云(antd CheckableTagGroup 单选):计数用等宽字体,选中态反白。
antd 会把 label 包进单个块级 span,行内排版由内层选择器承接 */
.pn-cloud-tag > span {
display: inline-flex;
align-items: center;
gap: 6px;
}
.pn-cloud-tag svg {
width: 14px;
height: 14px;
}
.pn-cloud-count {
font-family: var(--font-mono);
font-size: 12px;
color: var(--muted-foreground);
}
.ant-tag-checkable-checked .pn-cloud-count {
color: rgba(255, 255, 255, 0.85);
}
/* 表单字段标签(antd 无独立 Label 组件,保留原生 label + 应用排版) */
.pn-field-label {
font-size: 14px;
font-weight: 500;
color: var(--foreground);
}
.pn-ae-pfield .pn-field-label {
font-size: 12px;
}
.pn-input-icon {
color: var(--muted-foreground);
}
/* 设置卡片标题/描述(旧 CardTitle/CardDescription 排版) */
.pn-as-card-title {
margin: 0;
font-size: 15px;
font-weight: 600;
color: var(--foreground);
}
.pn-as-card-desc {
margin: 0;
font-size: 13px;
line-height: 1.6;
color: var(--muted-foreground);
}
/* 编辑器侧栏标题(旧 CardTitle + mb-3) */
.pn-ae-side-title {
margin: 0 0 12px;
font-size: 14px;
line-height: 1.6;
font-weight: 600;
color: var(--foreground);
}
/* 登录页(antd 版):锁图标 / 错误条 / 返回博客间距 */
.pn-login-lock {
color: var(--muted-foreground);
}
.pn-login-alert {
margin-top: 14px;
}
button.pn-login-back {
margin-top: 4px;
color: var(--muted-foreground);
font-weight: 500;
}
button.pn-login-back:hover {
color: var(--foreground);
}
/* 笔记详情:私有预览条(antd Alert info + 行内图标对齐) */
.pn-note-preview-alert {
margin-top: 32px;
}
.pn-note-preview-alert .ant-alert-message {
display: inline-flex;
align-items: center;
gap: 8px;
}
.pn-note-preview-alert svg {
width: 15px;
height: 15px;
flex: none;
}
/* 确认弹层正文(antd Modal 内容排版沿用旧契约) */
.pn-modal-desc {
margin: 8px 0 0;
font-size: 13px;
line-height: 1.7;
color: var(--muted-foreground);
overflow-wrap: anywhere;
}
.pn-modal-error {
margin: 8px 0 0;
font-size: 12px;
color: var(--destructive-text);
}
/* 指标卡:antd Card body 为块级,恢复旧卡片三行纵向堆叠 */
.pn-al-metric .ant-card-body {
display: flex;
flex-direction: column;
gap: 2px;
}
/* 移动端通知:贴近旧 toast 的底部通栏位(antd wrapper 为行内样式,需 !important) */
@media (max-width: 767px) {
.ant-notification {
left: 16px !important;
right: 16px !important;
bottom: 80px !important;
}
.pn-al-metric .ant-card-body {
padding: 12px;
}
.pn-as-card .ant-card-body {
padding: 20px;
}
}
/* 加载/空态(Spin/Skeleton/Empty)已由 antd 承接 */
/* ============================================================
博客端共享 shell —— 居中单栏 720px(设计稿博客系列)
============================================================ */
.pn-site-page {
min-height: 100vh;
display: flex;
flex-direction: column;
}
.pn-site-header {
position: sticky;
top: 0;
z-index: 20;
background: var(--background);
background: color-mix(in srgb, var(--background) 86%, transparent);
-webkit-backdrop-filter: blur(12px);
backdrop-filter: blur(12px);
border-bottom: 1px solid var(--border);
}
.pn-site-header-inner {
max-width: 720px;
margin: 0 auto;
padding: 0 24px;
height: 60px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
box-sizing: border-box;
}
.pn-site-wordmark {
display: inline-flex;
align-items: center;
gap: 10px;
font-family: var(--font-serif);
font-size: 21px;
line-height: 1;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
text-decoration: none;
transition: color 0.15s ease;
}
.pn-site-wordmark:hover {
color: var(--muted-foreground);
}
/* 站点 Logo(站点设置自定义,留空不渲染) */
.pn-site-logo {
flex: none;
width: 26px;
height: 26px;
object-fit: cover;
border-radius: var(--radius-sm);
}
.pn-site-nav {
display: flex;
align-items: center;
gap: 4px;
}
.pn-site-navlink {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 7px 12px;
border: 0;
border-radius: var(--radius-sm);
background: transparent;
font-size: 14px;
font-weight: 500;
color: var(--muted-foreground);
text-decoration: none;
cursor: pointer;
transition: background-color 0.15s ease, color 0.15s ease;
}
.pn-site-navlink:hover {
background: var(--muted);
color: var(--foreground);
}
.pn-site-navlink[aria-current="page"],
.pn-site-navlink.active {
color: var(--foreground);
font-weight: 600;
}
.pn-site-navlink svg {
width: 14px;
height: 14px;
}
/* 同类的 antd Button 形态(主题切换按钮/溢出菜单触发器):
antd cssinjs 无 layer,需更高特异度对齐导航 pill 规格 */
button.ant-btn.pn-site-navlink {
height: auto;
padding: 7px 12px;
border: 0;
border-radius: var(--radius-sm);
background: transparent;
font-size: 14px;
font-weight: 500;
color: var(--muted-foreground);
}
button.ant-btn.pn-site-navlink:hover {
background: var(--muted);
color: var(--foreground);
}
/* 博客端溢出菜单触发按钮:<640px 显示(基础规则须在 640px MQ 之前,
否则同特异性下源码顺序靠后者覆盖 MQ 内的 display:inline-flex) */
button.ant-btn.pn-site-menu-btn {
display: none;
}
.pn-site-main {
flex: 1;
width: 100%;
max-width: 720px;
margin: 0 auto;
padding: 0 24px;
box-sizing: border-box;
}
.pn-site-footer {
margin-top: 72px;
border-top: 1px solid var(--border);
}
.pn-site-footer-inner {
max-width: 720px;
margin: 0 auto;
padding: 24px 24px 32px;
box-sizing: border-box;
text-align: center;
font-size: 12.5px;
color: var(--muted-foreground);
}
.pn-site-footer-inner a {
color: var(--muted-foreground);
text-decoration: none;
}
.pn-site-footer-inner a:hover {
color: var(--foreground);
}
.pn-site-footer-line {
margin: 0;
}
.pn-site-beian {
display: inline-flex;
align-items: center;
gap: 6px;
margin-top: 8px;
}
.pn-site-beian img {
width: 14px;
height: 14px;
flex: none;
opacity: 0.85;
}
.pn-site-beian:hover img {
opacity: 1;
}
@media (max-width: 640px) {
.pn-site-header-inner {
height: 56px;
padding: 0 20px;
}
.pn-site-main {
padding: 0 20px;
}
.pn-site-navlink.hide-sm {
display: none;
}
button.ant-btn.pn-site-menu-btn {
display: inline-flex;
}
}
/* ============================================================
首页(博客首页.html)
============================================================ */
.pn-home-content {
padding-top: 56px;
padding-bottom: 24px;
}
.pn-home-post {
display: flex;
align-items: flex-start;
gap: 18px;
padding: 30px 0;
border-bottom: 1px solid var(--border);
}
.pn-home-post:last-child {
border-bottom: 0;
}
/* 封面缩略图(正文第一张图,无图不渲染) */
.pn-home-cover {
flex: none;
width: 104px;
height: 104px;
border-radius: var(--radius-md);
overflow: hidden;
border: 1px solid var(--border);
background: var(--muted);
}
.pn-home-cover img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
.pn-home-post-main {
flex: 1;
min-width: 0;
}
.pn-home-date {
display: block;
margin-bottom: 10px;
font-family: var(--font-mono);
font-size: 12.5px;
letter-spacing: 0.04em;
color: var(--muted-foreground);
}
.pn-home-pin {
display: inline-flex;
align-items: center;
gap: 4px;
margin-right: 10px;
padding: 0 8px;
border: 1px solid var(--border-strong, var(--border));
border-radius: 999px;
font-family: var(--font-sans);
font-size: 11px;
font-weight: 500;
line-height: 1.8;
color: var(--foreground);
vertical-align: 1px;
}
.pn-home-pin svg {
color: var(--muted-foreground);
}
.pn-home-post-title {
margin: 0;
font-family: var(--font-serif);
font-weight: 400;
font-size: 22px;
line-height: 1.35;
letter-spacing: var(--tracking-tight);
}
.pn-home-post-title a {
display: flex;
align-items: center;
gap: 10px;
color: var(--foreground);
text-decoration: none;
}
.pn-home-arrow {
width: 17px;
height: 17px;
flex: none;
margin-left: auto;
color: var(--muted-foreground);
opacity: 0;
transition: opacity 0.15s ease, color 0.15s ease;
}
.pn-home-post:hover .pn-home-arrow {
opacity: 1;
color: var(--foreground);
}
.pn-home-summary {
margin: 10px 0 0;
font-size: 14px;
line-height: 1.75;
color: var(--muted-foreground);
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
.pn-home-tags {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 14px;
}
.pn-home-list-empty {
padding: 64px 0;
text-align: center;
color: var(--muted-foreground);
font-size: 14px;
}
/* 首页分页(对应设计稿 table-foot + pager)。
总数说明由 Pagination showTotal 承接:total 文本居左、页码居右 */
.pn-home-pager {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 12px;
margin-top: 40px;
padding-top: 20px;
border-top: 1px solid var(--border);
}
.pn-home-pager ul.ant-pagination {
flex: 1;
justify-content: space-between;
}
.pn-home-pager .ant-pagination-total-text {
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.02em;
color: var(--muted-foreground);
white-space: nowrap;
}
@media (max-width: 640px) {
.pn-home-content {
padding-top: 40px;
}
.pn-home-post {
padding: 26px 0;
gap: 12px;
}
.pn-home-cover {
width: 72px;
height: 72px;
border-radius: var(--radius-sm);
}
.pn-home-post-title {
font-size: 20px;
}
}
/* ============================================================
笔记详情(笔记详情.html)
============================================================ */
.pn-note-article {
padding-top: 40px;
padding-bottom: 8px;
}
button.pn-note-back {
margin-left: -10px;
gap: 6px;
font-size: 13px;
font-weight: 500;
line-height: 1;
color: var(--muted-foreground);
}
button.pn-note-back:hover {
color: var(--foreground);
}
.pn-note-back svg {
width: 14px;
height: 14px;
}
.pn-note-title {
margin: 18px 0 0;
font-family: var(--font-serif);
font-weight: 400;
font-size: 36px;
line-height: 1.25;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-note-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px 12px;
margin-top: 18px;
font-size: 13px;
color: var(--muted-foreground);
}
.pn-note-meta-date {
font-family: var(--font-mono);
font-size: 12.5px;
}
.pn-note-meta-sep {
color: var(--border-strong);
}
.pn-note-meta-read {
display: inline-flex;
align-items: center;
gap: 6px;
}
.pn-note-meta-read svg {
width: 14px;
height: 14px;
}
/* 上一篇 / 下一篇 */
.pn-note-postnav {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-top: 56px;
padding-top: 32px;
border-top: 1px solid var(--border);
}
.pn-note-nav-card {
text-decoration: none;
transition: background-color 0.15s ease, border-color 0.15s ease;
}
.pn-note-nav-card .ant-card-body {
display: flex;
flex-direction: column;
gap: 8px;
padding: 18px 20px;
}
.pn-note-nav-card:hover {
background: var(--muted);
border-color: var(--border-strong);
}
.pn-note-nav-label {
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--font-mono);
font-size: 12px;
letter-spacing: 0.04em;
color: var(--muted-foreground);
}
.pn-note-nav-label svg {
width: 14px;
height: 14px;
}
.pn-note-nav-title {
font-family: var(--font-serif);
font-size: 17px;
line-height: 1.45;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-note-nav-next {
text-align: right;
}
.pn-note-nav-next .pn-note-nav-label {
justify-content: flex-end;
}
@media (max-width: 640px) {
.pn-note-article {
padding-top: 32px;
}
.pn-note-title {
font-size: 28px;
}
.pn-note-body {
margin-top: 32px !important;
}
.pn-note-postnav {
grid-template-columns: 1fr;
gap: 12px;
}
.pn-note-nav-next {
text-align: left;
}
.pn-note-nav-next .pn-note-nav-label {
justify-content: flex-start;
}
}
/* ============================================================
正文排版(MarkdownViewer)—— .pn-note-body
============================================================ */
.pn-note-body {
margin-top: 40px;
font-size: 15px;
line-height: 1.8;
color: var(--foreground);
}
.pn-note-body > :first-child {
margin-top: 0;
}
.pn-note-body p {
margin: 0 0 24px;
}
.pn-note-body h1,
.pn-note-body h2,
.pn-note-body h3,
.pn-note-body h4 {
margin: 40px 0 16px;
font-family: var(--font-serif);
font-weight: 400;
line-height: 1.35;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-note-body h1 {
font-size: 26px;
}
.pn-note-body h2 {
font-size: 24px;
}
.pn-note-body h3 {
font-size: 19px;
}
.pn-note-body h4 {
font-size: 16px;
}
.pn-note-body blockquote {
margin: 32px 0;
padding: 2px 0 2px 20px;
border-left: 2px solid var(--border-strong);
color: var(--muted-foreground);
}
.pn-note-body blockquote p {
margin: 0 0 8px;
}
.pn-note-body blockquote p:last-child {
margin-bottom: 0;
}
.pn-note-body code {
font-family: var(--font-mono);
font-size: 13px;
background: var(--muted);
border-radius: var(--radius-sm);
padding: 2px 6px;
}
.pn-note-body pre {
position: relative;
margin: 24px 0 32px;
padding: 16px 18px;
background: var(--muted);
border: 1px solid var(--border);
border-radius: var(--radius-md);
overflow-x: auto;
box-sizing: border-box;
}
.pn-note-body pre code {
display: block;
background: transparent;
padding: 0;
font-size: 13px;
line-height: 1.7;
color: var(--foreground);
white-space: pre;
}
.pn-note-body ul,
.pn-note-body ol {
margin: 0 0 24px;
padding-left: 22px;
}
.pn-note-body li {
margin-bottom: 10px;
}
.pn-note-body li::marker {
color: var(--muted-foreground);
}
.pn-note-body li > ul,
.pn-note-body li > ol {
margin: 10px 0 0;
}
.pn-note-body img {
max-width: 100%;
border-radius: var(--radius-md);
border: 1px solid var(--border);
}
.pn-note-body hr {
margin: 36px 0;
border: 0;
border-top: 1px solid var(--border);
}
.pn-note-body table {
width: 100%;
margin: 24px 0;
border-collapse: collapse;
font-size: 13.5px;
}
.pn-note-body th,
.pn-note-body td {
padding: 8px 12px;
border: 1px solid var(--border);
text-align: left;
}
.pn-note-body th {
background: var(--muted);
font-weight: 600;
}
.pn-note-body a {
color: var(--foreground);
text-decoration: underline;
text-underline-offset: 3px;
text-decoration-color: var(--border-strong);
}
.pn-note-body a:hover {
text-decoration-color: var(--foreground);
}
.pn-note-body del {
color: var(--muted-foreground);
}
.pn-note-body input[type="checkbox"] {
margin-right: 6px;
accent-color: var(--primary);
}
/* highlight.js:单色系高亮(粗细 + 灰阶区分) */
.pn-note-body .hljs-keyword,
.pn-note-body .hljs-tag,
.pn-note-body .hljs-name {
font-weight: 600;
}
.pn-note-body .hljs-string,
.pn-note-body .hljs-attr,
.pn-note-body .hljs-attribute,
.pn-note-body .hljs-symbol,
.pn-note-body .hljs-bullet {
color: var(--muted-foreground);
}
.pn-note-body .hljs-comment,
.pn-note-body .hljs-quote {
color: var(--muted-foreground);
font-style: italic;
}
/* 代码块复制按钮(antd Button size=small;悬浮于所属包装 div 时显示) */
.pn-note-body div:has(> .pn-copy-btn) {
position: relative;
}
.pn-note-body .pn-copy-btn {
position: absolute;
right: 8px;
top: 8px;
z-index: 1;
opacity: 0;
transition: opacity 0.15s ease;
}
.pn-note-body div:has(> .pn-copy-btn):hover .pn-copy-btn,
.pn-note-body .pn-copy-btn:focus-visible,
.pn-note-body .pn-copy-btn.is-copied {
opacity: 1;
}
/* ============================================================
标签归档(标签归档.html)
============================================================ */
.pn-tag-content {
padding-top: 48px;
padding-bottom: 64px;
}
.pn-tag-pagehead h1 {
margin: 0;
font-family: var(--font-serif);
font-weight: 400;
font-size: 40px;
line-height: 1.2;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-tag-pagehead p {
margin: 10px 0 0;
font-size: 15px;
line-height: 1.7;
color: var(--muted-foreground);
}
.pn-tag-cloud {
margin-top: 32px;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.pn-tag-empty {
margin-top: 32px;
}
.pn-tag-groups {
margin-top: 48px;
display: flex;
flex-direction: column;
gap: 40px;
}
.pn-tag-group-title {
display: flex;
align-items: center;
gap: 8px;
margin: 0 0 8px;
font-family: var(--font-serif);
font-weight: 400;
font-size: 22px;
line-height: 1.3;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-tag-group-title svg {
width: 16px;
height: 16px;
flex: none;
color: var(--muted-foreground);
}
.pn-tag-row {
display: flex;
align-items: center;
gap: 16px;
padding: 14px 4px;
border-bottom: 1px solid var(--border);
color: var(--foreground);
text-decoration: none;
transition: background-color 0.15s ease;
}
.pn-tag-rows .pn-tag-row:first-child {
border-top: 1px solid var(--border);
}
.pn-tag-date {
flex: none;
width: 88px;
font-family: var(--font-mono);
font-size: 12px;
color: var(--muted-foreground);
}
.pn-tag-title {
flex: 1;
min-width: 0;
font-size: 15px;
line-height: 1.6;
transition: color 0.15s ease;
}
.pn-tag-row:hover .pn-tag-title {
text-decoration: underline;
text-underline-offset: 4px;
}
.pn-tag-arrow {
flex: none;
opacity: 0;
transition: opacity 0.15s ease;
}
.pn-tag-arrow svg {
width: 16px;
height: 16px;
display: block;
}
.pn-tag-row:hover .pn-tag-arrow,
.pn-tag-row:focus-visible .pn-tag-arrow {
opacity: 1;
}
@media (max-width: 640px) {
.pn-tag-content {
padding-top: 32px;
padding-bottom: 48px;
}
.pn-tag-pagehead h1 {
font-size: 32px;
}
.pn-tag-cloud {
margin-top: 24px;
}
.pn-tag-groups {
margin-top: 40px;
gap: 32px;
}
.pn-tag-date {
width: 78px;
font-size: 11px;
}
}
/* ============================================================
404(404 页面.html)
============================================================ */
.pn-404-page {
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
text-align: center;
padding: 32px 24px;
background: var(--background);
}
.pn-404-code {
margin: 0;
font-family: var(--font-mono);
font-size: 64px;
font-weight: 700;
line-height: 1;
letter-spacing: var(--tracking-tight);
color: var(--border);
}
.pn-404-title {
margin: 24px 0 0;
font-family: var(--font-serif);
font-size: 28px;
font-weight: 400;
line-height: 1.3;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-404-desc {
margin: 12px 0 0;
font-size: 15px;
line-height: 1.7;
color: var(--muted-foreground);
}
.pn-404-actions {
margin-top: 32px;
display: flex;
align-items: center;
justify-content: center;
}
@media (max-width: 480px) {
.pn-404-code {
font-size: 56px;
}
.pn-404-title {
font-size: 24px;
}
}
/* ============================================================
管理员登录(管理员登录.html)
============================================================ */
.pn-login-wrap {
min-height: 100vh;
box-sizing: border-box;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 24px;
padding: 32px 16px;
background: var(--background);
}
.pn-login-brand {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
text-align: center;
}
.pn-login-eyebrow {
font-family: var(--font-mono);
font-size: 11px;
line-height: 1;
letter-spacing: 0.28em;
text-transform: uppercase;
color: var(--muted-foreground);
}
.pn-login-wordmark {
font-family: var(--font-serif);
font-size: 28px;
line-height: 1;
font-weight: 400;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-login-title {
margin: 0 0 6px;
font-size: 16px;
line-height: 1.4;
font-weight: 600;
color: var(--foreground);
}
/* 登录卡片(antd Card):内边距由本类承接(body padding 已置 0) */
.pn-login-card {
box-sizing: border-box;
width: 100%;
max-width: 380px;
padding: 28px 24px;
}
@media (max-width: 480px) {
.pn-login-wordmark {
font-size: 26px;
}
.pn-login-card {
padding: 24px 20px;
}
}
/* ============================================================
管理后台共享 shell —— sidebar + topbar + 移动端 tabbar
(统一自 笔记管理/笔记编辑器/回收站/站点设置 四稿)
============================================================ */
.pn-admin-shell {
display: grid;
grid-template-columns: 208px minmax(0, 1fr);
min-height: 100vh;
background: var(--background);
color: var(--foreground);
}
.pn-admin-sidebar {
width: auto;
min-height: 0;
height: 100vh;
position: sticky;
top: 0;
align-self: start;
overflow-y: auto;
display: flex;
flex-direction: column;
gap: 16px;
padding: 20px 14px;
background: var(--sidebar);
color: var(--sidebar-foreground);
border: 0;
border-right: 1px solid var(--sidebar-border);
border-radius: 0;
box-shadow: none;
box-sizing: border-box;
}
.pn-admin-brand {
display: flex;
align-items: center;
gap: 10px;
padding: 2px 10px 0;
font-weight: 400;
color: var(--sidebar-foreground);
text-decoration: none;
}
.pn-admin-brand-mark {
flex: none;
width: 28px;
height: 28px;
display: grid;
place-items: center;
border-radius: var(--radius-sm);
background: var(--sidebar-primary);
color: var(--sidebar-primary-foreground);
font-family: var(--font-serif);
font-size: 15px;
line-height: 1;
}
.pn-admin-brand-copy {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.pn-admin-eyebrow {
font-family: var(--font-mono);
font-size: 10px;
line-height: 1;
letter-spacing: 0.14em;
text-transform: uppercase;
color: var(--muted-foreground);
}
.pn-admin-brand-copy strong {
font-size: 14px;
font-weight: 600;
line-height: 1.3;
letter-spacing: var(--tracking-tight);
color: var(--sidebar-foreground);
}
/* 侧栏导航(antd Menu inline):融入 sidebar 底色,沿用窄侧栏密度 */
.pn-admin-menu {
flex: 1;
min-height: 0;
background: transparent;
border-inline-end: 0 !important;
}
.pn-admin-menu .ant-menu-item-group-title {
padding: 8px 10px 4px;
font-size: 10.5px;
line-height: 1;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--muted-foreground);
}
.pn-admin-menu .ant-menu-item {
margin-inline: 6px;
width: auto;
min-height: 34px;
line-height: 34px;
border-radius: var(--radius-sm);
font-size: 13px;
font-weight: 500;
color: var(--sidebar-foreground);
}
.pn-admin-menu .ant-menu-item svg {
width: 15px;
height: 15px;
}
/* 选中项沿用侧栏 token 的黑底反白(colorPrimary 近黑/近白,antd 默认的
primary 淡色底在明暗模式下都与侧栏底色拉不开) */
.pn-admin-menu li.ant-menu-item-selected {
background: var(--sidebar-primary);
color: var(--sidebar-primary-foreground);
}
.pn-admin-menu li.ant-menu-item-selected svg {
color: var(--sidebar-primary-foreground);
}
.pn-admin-menu li.ant-menu-item:hover:not(.ant-menu-item-selected) {
background: var(--sidebar-accent);
color: var(--sidebar-accent-foreground);
}
.pn-admin-foot {
display: flex;
flex-direction: column;
gap: 6px;
margin-top: auto;
padding-top: 12px;
border-top: 1px solid var(--sidebar-border);
}
.pn-admin-user {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px 2px;
}
.pn-admin-user-actions {
display: inline-flex;
align-items: center;
gap: 4px;
margin-left: auto;
}
/* 侧栏/topbar 图标按钮(antd Button type=text):28px 方形、muted 前景,
hover 沿用 sidebar accent;antd cssinjs 无 layer,需提权 */
button.ant-btn.pn-admin-iconbtn,
a.ant-btn.pn-admin-iconbtn {
width: 28px;
height: 28px;
padding: 0;
border-radius: var(--radius-sm);
color: var(--muted-foreground);
}
button.ant-btn.pn-admin-iconbtn:hover:not(:disabled),
a.ant-btn.pn-admin-iconbtn:hover {
background: var(--sidebar-accent);
color: var(--sidebar-accent-foreground);
}
/* 悬浮提示由 antd Tooltip 承接;侧栏隐藏时的移动端兜底按钮(<768px 显示) */
button.ant-btn.pn-admin-mobile-act {
display: none;
}
/* 溢出菜单挂载点(面板由 antd Dropdown 渲染,wrapper 仅保留占位语义) */
.pn-moremenu {
position: relative;
}
.pn-admin-avatar {
width: 28px;
height: 28px;
flex: none;
border-radius: 999px;
background: var(--sidebar-primary);
color: var(--sidebar-primary-foreground);
display: grid;
place-items: center;
font-size: 11px;
font-weight: 600;
}
.pn-admin-avatar svg {
width: 14px;
height: 14px;
}
.pn-admin-user-meta {
min-width: 0;
display: flex;
flex-direction: column;
line-height: 1.35;
}
.pn-admin-user-name {
font-size: 13px;
font-weight: 600;
color: var(--sidebar-foreground);
}
/* 主区 / topbar */
.pn-admin-main {
min-width: 0;
display: flex;
flex-direction: column;
}
.pn-admin-topbar {
position: sticky;
top: 0;
z-index: 20;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 24px;
/* 各页 actions 高度不一(有的页无按钮):固定高度,切换页面不抖动 */
min-height: 62px;
box-sizing: border-box;
background: var(--background);
border-bottom: 1px solid var(--border);
}
.pn-admin-topbar h1 {
margin: 0;
font-size: 17px;
font-weight: 600;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-admin-actions {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
.pn-admin-content {
padding: 24px;
display: flex;
flex-direction: column;
gap: 20px;
min-width: 0;
}
/* 页面级加载占位(antd Spin 居中) */
.pn-admin-loading {
display: grid;
place-items: center;
min-height: 320px;
}
/* 搜索框(topbar 内,antd Input + 前缀图标;<768px 隐藏) */
.pn-admin-actions .pn-al-search {
width: 248px;
}
/* 移动端 tabbar(<768px) */
.pn-admin-tabbar {
display: none;
}
/* 响应式 */
@media (max-width: 1023px) {
.pn-admin-shell {
grid-template-columns: 184px minmax(0, 1fr);
}
.pn-admin-content {
padding: 20px;
}
}
@media (max-width: 767px) {
.pn-admin-shell {
grid-template-columns: minmax(0, 1fr);
}
.pn-admin-sidebar {
display: none;
}
.pn-admin-topbar {
padding: 12px 16px;
min-height: 58px;
}
.pn-admin-topbar h1 {
font-size: 16px;
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.pn-admin-actions {
gap: 6px;
}
/* antd 按钮移动端收紧水平内边距(沿用设计稿紧凑规格) */
.pn-admin-actions .ant-btn {
padding-left: 10px;
padding-right: 10px;
}
button.ant-btn.pn-admin-mobile-act {
display: inline-flex;
}
button.ant-btn.pn-admin-desktop-act {
display: none;
}
.pn-admin-actions .pn-al-search {
display: none;
}
.pn-admin-content {
padding: 16px 16px 92px;
gap: 16px;
}
.pn-admin-tabbar {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 40;
height: 62px;
padding-bottom: env(safe-area-inset-bottom, 0px);
background: var(--card);
border-top: 1px solid var(--border);
}
.pn-admin-tabbar a {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 3px;
margin: 6px;
border-radius: var(--radius-sm);
font-size: 11px;
font-weight: 500;
color: var(--muted-foreground);
text-decoration: none;
transition: background-color 0.15s ease, color 0.15s ease;
}
.pn-admin-tabbar a svg {
width: 18px;
height: 18px;
color: currentColor;
}
.pn-admin-tabbar a.is-active {
background: var(--sidebar-accent);
color: var(--foreground);
font-weight: 600;
}
}
/* ============================================================
笔记管理(笔记管理.html)
============================================================ */
.pn-al-metrics {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px;
}
.pn-al-table-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 12px 16px;
border-bottom: 1px solid var(--border);
}
/* Segmented 选项内计数徽标(antd Badge count,弱化为 muted 灰) */
.pn-al-tab-badge {
margin-left: 6px;
}
.pn-al-tab-badge .ant-badge-count {
background: var(--muted-foreground);
color: var(--background);
font-family: var(--font-mono);
}
.pn-al-table-note {
font-size: 12px;
color: var(--muted-foreground);
white-space: nowrap;
}
.pn-al-note-title {
display: flex;
align-items: center;
gap: 6px;
font-size: 13.5px;
font-weight: 600;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
.pn-al-note-title svg {
width: 12px;
height: 12px;
flex: none;
color: var(--muted-foreground);
}
.pn-al-is-draft .pn-al-note-title {
color: var(--muted-foreground);
font-weight: 500;
}
.pn-al-note-slug {
display: block;
margin-top: 1px;
font-family: var(--font-mono);
font-size: 11px;
color: var(--muted-foreground);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 260px;
}
.pn-al-tags {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.pn-al-date {
font-family: var(--font-mono);
font-size: 12.5px;
color: var(--foreground);
white-space: nowrap;
}
.pn-al-actions-cell {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 4px;
}
.pn-al-col-actions {
width: 1%;
white-space: nowrap;
text-align: right;
}
.pn-al-table-foot {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 16px;
border-top: 1px solid var(--border);
}
.pn-al-foot-note {
font-size: 12px;
color: var(--muted-foreground);
white-space: nowrap;
}
@media (max-width: 767px) {
.pn-al-metrics {
gap: 8px;
}
.pn-al-table-note {
display: none;
}
.pn-al-table-foot {
flex-wrap: wrap;
gap: 8px;
}
}
/* ============================================================
笔记编辑器(笔记编辑器.html)
============================================================ */
.pn-ae-grid {
display: grid;
grid-template-columns: minmax(0, 1fr) 280px;
gap: 24px;
align-items: start;
}
/* 编辑卡与发布卡的 Card 基础样式由 ui/card 承接(gap-0/p-6 等) */
/* 提权至 (0,1,1)+:压过 antd .ant-input 的同名字段(cssinjs 无 layer 且后注入)。
variant=filled:底色/圆角/内边距交给 antd,这里只覆盖字体排版 */
input.pn-ae-title-input {
width: 100%;
margin: 0 0 14px;
font-family: var(--font-serif);
font-size: 30px;
line-height: 1.3;
letter-spacing: var(--tracking-tight);
color: var(--foreground);
}
input.pn-ae-title-input::placeholder {
color: var(--muted-foreground);
}
.pn-ae-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 10px 16px;
margin: 0 0 14px;
}
.pn-ae-slug {
display: inline-flex;
align-items: center;
gap: 6px;
font-family: var(--font-mono);
font-size: 12px;
color: var(--muted-foreground);
min-width: 0;
overflow: hidden;
}
.pn-ae-slug svg {
width: 12px;
height: 12px;
flex: none;
}
.pn-ae-slug span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.pn-ae-tags {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-left: auto;
}
/* 标签选择器(mode=tags:既可勾选既有标签,也可输入新建) */
.pn-ae-tags-select {
min-width: 220px;
max-width: 100%;
}
.pn-ae-toolbar {
display: flex;
align-items: center;
gap: 4px;
margin: 0 0 18px;
padding: 8px 0;
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
button.pn-ae-tool {
width: 32px;
height: 32px;
padding: 0;
border-radius: var(--radius-sm);
color: var(--muted-foreground);
}
button.pn-ae-tool:hover:not(:disabled) {
background: var(--accent);
color: var(--foreground);
}
button.pn-ae-tool svg {
width: 15px;
height: 15px;
}
.pn-ae-tool-hint {
margin-left: auto;
font-family: var(--font-mono);
font-size: 11px;
color: var(--muted-foreground);
white-space: nowrap;
}
.pn-ae-body-wrap {
min-height: 420px;
border-radius: var(--radius-sm);
}
.pn-ae-preview {
margin-top: 20px;
padding: 4px 2px 0;
border-top: 1px solid var(--border);
}
.pn-ae-preview .pn-note-body {
margin-top: 20px;
}
.pn-ae-upload-alert {
margin-top: 10px;
}
/* 发布设置侧卡 */
.pn-ae-side {
position: sticky;
top: 86px;
min-width: 0;
display: flex;
flex-direction: column;
gap: 16px;
}
.pn-ae-prow {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 7px 0;
font-size: 13px;
}
.pn-ae-plabel {
color: var(--muted-foreground);
white-space: nowrap;
}
/* 发布日期选择器(size=small) */
.pn-ae-datepicker {
flex: none;
width: 168px;
}
.pn-ae-datepicker .ant-input {
font-family: var(--font-mono);
font-size: 12px;
}
.pn-ae-pfield {
display: flex;
flex-direction: column;
gap: 6px;
padding: 10px 0 2px;
}
.pn-ae-phint {
font-size: 11px;
line-height: 1.5;
color: var(--muted-foreground);
}
.pn-ae-error {
margin: 10px 0 0;
font-size: 12px;
color: var(--destructive-text);
}
.ant-divider.pn-ae-divider {
margin: 14px 0;
}
@media (max-width: 900px) {
.pn-ae-grid {
grid-template-columns: minmax(0, 1fr);
}
.pn-ae-side {
position: static;
}
}
@media (max-width: 767px) {
.pn-ae-title-input {
font-size: 26px;
}
.pn-ae-tags {
margin-left: 0;
}
}
/* ============================================================
回收站(回收站.html)
============================================================ */
.pn-at-title-cell {
min-width: 220px;
}
.pn-at-note-title {
color: var(--muted-foreground);
font-weight: 500;
text-decoration: line-through;
text-decoration-color: var(--border);
}
.pn-at-note-slug {
display: block;
margin-top: 2px;
font-family: var(--font-mono);
font-size: 11px;
color: var(--muted-foreground);
}
.pn-at-mono {
font-family: var(--font-mono);
font-size: 12px;
color: var(--muted-foreground);
white-space: nowrap;
}
.pn-at-days {
font-family: var(--font-mono);
font-size: 12px;
color: var(--foreground);
white-space: nowrap;
}
.pn-at-actions {
display: flex;
align-items: center;
gap: 4px;
white-space: nowrap;
}
/* ============================================================
站点设置(站点设置.html)
============================================================ */
.pn-as-content {
max-width: 1100px;
}
/* 宽屏两卡左右分布,窄屏回落上下堆叠(.pn-admin-content 的 flex 在此处被覆盖为 grid) */
@media (min-width: 1100px) {
.pn-as-content {
display: grid;
grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
align-items: start;
}
}
.pn-as-logo-row {
display: flex;
align-items: center;
flex-wrap: wrap;
gap: 10px;
}
.pn-as-logo-preview {
width: 44px;
height: 44px;
object-fit: cover;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: var(--card);
}
.pn-as-logo-empty {
display: inline-grid;
place-items: center;
width: 44px;
height: 44px;
border-radius: var(--radius-sm);
border: 1px dashed var(--border-strong);
font-size: 11px;
color: var(--muted-foreground);
}
.pn-as-card-head {
display: flex;
flex-direction: column;
gap: 4px;
}
.pn-as-fields {
display: flex;
flex-direction: column;
gap: 18px;
}
.pn-as-field {
display: flex;
flex-direction: column;
gap: 6px;
}
.pn-as-label {
font-size: 13px;
font-weight: 500;
color: var(--muted-foreground);
}
.pn-as-hint {
margin: 0;
font-size: 12px;
color: var(--muted-foreground);
line-height: 1.6;
}
.pn-as-msg {
margin: 0;
font-size: 12.5px;
line-height: 1.6;
}
.pn-as-msg.ok {
color: var(--success-text);
}
.pn-as-msg.err {
color: var(--destructive-text);
}
.pn-as-card-foot {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 12px;
margin-top: 20px;
padding-top: 16px;
border-top: 1px solid var(--border);
}
/* 操作反馈(notification)与确认弹层(Modal)已由 antd 承接,
主题与移动端定位见「antd 桥接」段。 */
/* ============================================================
CodeMirror(编辑器,token 化)
============================================================ */
.cm-editor {
height: 100%;
background: var(--background);
font-size: 14.5px;
}
.cm-editor.cm-focused {
outline: none !important;
}
.cm-gutters {
border-right: 1px solid var(--border);
background: var(--muted);
color: var(--muted-foreground);
}
.cm-activeLine,
.cm-activeLineGutter {
background: color-mix(in srgb, var(--muted) 55%, transparent) !important;
}
.pn-cm-drag {
outline: 2px dashed var(--ring);
outline-offset: -2px;
}
.pn-cm-drag-overlay {
position: absolute;
inset: 0;
z-index: 5;
display: grid;
place-items: center;
background: color-mix(in srgb, var(--primary) 6%, transparent);
font-size: 13px;
font-weight: 500;
color: var(--foreground);
pointer-events: none;
}
/* ── 动效偏好 ─────────────────────────────────────────── */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
}
}