meganjjzhang_Promptuary/styles.css
2026-07-07 16:05:12 +08:00

3251 lines
87 KiB
CSS
Raw 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.

/* ============================================================
* Promptuary — visual styles
* 设计参考design/demo-interactive.html
*
* 取色策略:尽量走 Obsidian 的 CSS 变量以同时适配亮/暗主题;
* 仅在设计稿里有独有视觉(紫色 accent、橙色批阅、4 色高亮、
* 引用块底色)时使用固定 RGBA。
* ============================================================ */
/* 字体:设计稿主体 DM Sans引用与代码段 JetBrains Mono。
* Obsidian 自带 var(--font-monospace) 与 var(--font-interface)
* 这里仅在引用框内强制 monoUI 本身跟随 Obsidian 主题。 */
.promptuary-popover,
.promptuary-bottom-toolbar,
.promptuary-sidebar {
font-family: var(--font-interface, "DM Sans", system-ui, sans-serif);
}
/* ============================================================
* 1. 编辑器内的高亮 / 批阅装饰
* ============================================================ */
/* 高亮:低饱和背景 + 同色下划线(从设计稿 .hl-* 复刻) */
.cm-promptuary-highlight {
border-radius: 2px;
padding: 0;
border-bottom: 1px solid transparent;
}
.cm-line .cm-promptuary-highlight-yellow {
background-color: rgba(250, 204, 21, 0.18);
border-bottom-color: rgba(250, 204, 21, 0.40);
}
.cm-line .cm-promptuary-highlight-blue {
background-color: rgba(96, 165, 250, 0.18);
border-bottom-color: rgba(96, 165, 250, 0.40);
}
.cm-line .cm-promptuary-highlight-green {
background-color: rgba(74, 222, 128, 0.18);
border-bottom-color: rgba(74, 222, 128, 0.40);
}
.cm-line .cm-promptuary-highlight-purple {
background-color: rgba(192, 132, 252, 0.18);
border-bottom-color: rgba(192, 132, 252, 0.40);
}
.theme-dark .cm-line .cm-promptuary-highlight-yellow {
background-color: rgba(250, 204, 21, 0.15);
border-bottom-color: rgba(250, 204, 21, 0.30);
}
.theme-dark .cm-line .cm-promptuary-highlight-blue {
background-color: rgba(96, 165, 250, 0.15);
border-bottom-color: rgba(96, 165, 250, 0.30);
}
.theme-dark .cm-line .cm-promptuary-highlight-green {
background-color: rgba(74, 222, 128, 0.15);
border-bottom-color: rgba(74, 222, 128, 0.30);
}
.theme-dark .cm-line .cm-promptuary-highlight-purple {
background-color: rgba(192, 132, 252, 0.15);
border-bottom-color: rgba(192, 132, 252, 0.30);
}
/* 批阅:橙色(设计稿 .hl-review */
.cm-line .cm-promptuary-review {
background-color: rgba(251, 146, 60, 0.18);
border-bottom: 1px solid rgba(251, 146, 60, 0.40);
border-radius: 2px;
}
.theme-dark .cm-line .cm-promptuary-review {
background-color: rgba(251, 146, 60, 0.15);
border-bottom-color: rgba(251, 146, 60, 0.30);
}
.cm-promptuary-strike {
text-decoration-line: line-through;
text-decoration-color: rgba(251, 146, 60, 0.65);
text-decoration-thickness: 1.5px;
}
.cm-promptuary-fuzzy {
outline: 1px dashed var(--text-warning);
outline-offset: -1px;
}
/* auto-healed: subtle blue left border to indicate repaired position */
.cm-promptuary-auto-healed {
border-left: 2px solid rgba(96, 165, 250, 0.45);
margin-left: -2px;
}
/* ============================================================
* 2. 选区浮窗 (Selection Popover, desktop)
* 设计稿 #popover-reading / #popover-reviewing
* 纵向布局:模式胶囊 + 按钮行 + Note 展开区
* ============================================================ */
.promptuary-popover {
position: fixed;
z-index: 999;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
padding: 6px 10px;
display: flex;
flex-direction: column;
gap: 4px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18), 0 2px 4px rgba(0, 0, 0, 0.08);
font-size: 12px;
animation: prm-popover-fade-in 0.15s ease-out;
min-width: 220px;
}
.theme-dark .promptuary-popover {
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.25);
}
@keyframes prm-popover-fade-in {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
/* 阅读浮窗的 4 色圆点(直径 16pxhover 放大active 环) */
.promptuary-popover .prm-color {
width: 16px;
height: 16px;
border-radius: 50%;
cursor: pointer;
border: 2px solid transparent;
flex-shrink: 0;
transition: transform 0.12s ease, box-shadow 0.12s ease;
outline: 2px solid transparent;
outline-offset: 1px;
}
.promptuary-popover .prm-color.yellow {
background: rgba(250, 204, 21, 0.75);
border-color: rgba(250, 204, 21, 0.55);
}
.promptuary-popover .prm-color.blue {
background: rgba(96, 165, 250, 0.75);
border-color: rgba(96, 165, 250, 0.55);
}
.promptuary-popover .prm-color.green {
background: rgba(74, 222, 128, 0.75);
border-color: rgba(74, 222, 128, 0.55);
}
.promptuary-popover .prm-color.purple {
background: rgba(192, 132, 252, 0.75);
border-color: rgba(192, 132, 252, 0.55);
}
.promptuary-popover .prm-color:hover {
transform: scale(1.15);
}
/* 颜色选中态:白色外环 */
.promptuary-popover .prm-color.active.yellow { outline-color: rgba(250, 204, 21, 0.90); }
.promptuary-popover .prm-color.active.blue { outline-color: rgba(96, 165, 250, 0.90); }
.promptuary-popover .prm-color.active.green { outline-color: rgba(74, 222, 128, 0.90); }
.promptuary-popover .prm-color.active.purple { outline-color: rgba(192, 132, 252, 0.90); }
/* 浮窗内的分割线(圆点和按钮之间) */
.promptuary-popover .prm-divider {
width: 1px;
height: 16px;
background: var(--background-modifier-border);
margin: 0 2px;
flex-shrink: 0;
}
/* 浮窗按钮:扁平 chip 风格 */
.promptuary-popover button {
background: transparent;
border: none;
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
color: var(--text-muted);
font-size: 12px;
font-weight: 500;
transition: background 0.12s, color 0.12s;
}
.promptuary-popover button:hover {
background: var(--background-modifier-hover);
color: var(--text-normal);
}
/* 删除线 S 按钮(橙色方块,设计稿 #btn-strikethrough */
.promptuary-popover .prm-strike-btn {
width: 26px;
height: 26px;
border-radius: 6px;
background: rgba(251, 146, 60, 0.15);
border: 1px solid rgba(251, 146, 60, 0.30);
color: rgba(251, 146, 60, 0.95);
font-weight: 700;
font-family: var(--font-monospace);
font-size: 13px;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.promptuary-popover .prm-strike-btn:hover {
background: rgba(251, 146, 60, 0.25);
color: rgba(251, 146, 60, 1);
}
/* 提交按钮(紫色回车按钮,设计稿 #btn-submit-review */
.promptuary-popover .prm-submit-btn {
width: 26px;
height: 26px;
border-radius: 6px;
background: rgba(167, 139, 250, 0.15);
border: 1px solid rgba(167, 139, 250, 0.30);
color: rgba(167, 139, 250, 1);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
padding: 0;
}
.promptuary-popover .prm-submit-btn:hover {
background: rgba(167, 139, 250, 0.25);
}
/* 浮窗内模式切换胶囊(紧凑版) */
.prm-popover-capsule {
display: flex;
background: var(--background-secondary);
border-radius: 4px;
padding: 1px;
gap: 1px;
width: fit-content;
box-sizing: border-box;
align-self: center;
}
.prm-popover-capsule button {
background: transparent;
border: none;
box-shadow: none;
outline: none;
padding: 1px 8px;
border-radius: 3px;
cursor: pointer;
color: var(--text-muted);
font-size: 10px;
font-weight: 500;
font-family: var(--font-monospace);
line-height: 1.4;
transition: background 0.15s, color 0.15s;
}
.prm-popover-capsule button:hover {
color: var(--text-normal);
}
.prm-popover-capsule button.prm-capsule-active,
.prm-popover-capsule button.active {
background: var(--background-primary);
color: var(--text-normal);
font-weight: 600;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.06);
}
.theme-dark .prm-popover-capsule button.active {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.20);
}
/* 浮窗标题行:左侧标题 + 右侧模式胶囊 */
.prm-popover-title-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding-bottom: 4px;
border-bottom: 1px solid var(--background-modifier-border);
margin-bottom: 2px;
}
.prm-popover-title {
font-size: 11px;
font-weight: 600;
color: var(--text-muted);
white-space: nowrap;
font-family: var(--font-monospace);
letter-spacing: 0.02em;
}
/* 浮窗按钮行(颜色圆点 + 按钮横排) */
.prm-popover-actions {
display: flex;
align-items: center;
gap: 6px;
}
/* Delete 按钮(批阅模式,橙色,可 toggle */
.promptuary-popover .prm-delete-btn,
.promptuary-bottom-toolbar .prm-delete-btn {
background: rgba(251, 146, 60, 0.08);
border: 1px solid rgba(251, 146, 60, 0.20);
color: rgba(251, 146, 60, 0.7);
border-radius: 4px;
padding: 4px 10px;
cursor: pointer;
font-size: 11px;
font-weight: 600;
font-family: var(--font-monospace);
transition: background 0.12s, border-color 0.12s, color 0.12s;
}
.promptuary-popover .prm-delete-btn:hover,
.promptuary-bottom-toolbar .prm-delete-btn:hover {
background: rgba(251, 146, 60, 0.16);
border-color: rgba(251, 146, 60, 0.35);
color: rgba(251, 146, 60, 0.9);
}
/* Delete 按钮 toggle 活跃态 */
.promptuary-popover .prm-delete-btn.active,
.promptuary-bottom-toolbar .prm-delete-btn.active {
background: rgba(251, 146, 60, 0.20);
border-color: rgba(251, 146, 60, 0.45);
color: rgba(251, 146, 60, 1);
}
/* ✓ 确认按钮Delete toggle 激活时出现) */
.promptuary-popover .prm-review-confirm-btn,
.promptuary-bottom-toolbar .prm-review-confirm-btn {
background: rgba(251, 146, 60, 0.15);
border: 1px solid rgba(251, 146, 60, 0.35);
color: rgba(251, 146, 60, 1);
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
font-size: 12px;
font-weight: 700;
font-family: var(--font-monospace);
transition: background 0.12s;
}
.promptuary-popover .prm-review-confirm-btn:hover,
.promptuary-bottom-toolbar .prm-review-confirm-btn:hover {
background: rgba(251, 146, 60, 0.28);
}
/* Note 展开区 header 中的"删除"标记 */
.prm-strike-indicator {
font-size: 9px;
font-weight: 600;
font-family: var(--font-monospace);
padding: 1px 5px;
border-radius: 999px;
background: rgba(251, 146, 60, 0.12);
color: rgba(251, 146, 60, 0.85);
border: 1px solid rgba(251, 146, 60, 0.25);
}
/* Note 按钮(批阅模式 + 阅读模式共用) */
.promptuary-popover .prm-note-btn,
.promptuary-bottom-toolbar .prm-note-btn {
background: transparent;
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
border-radius: 4px;
padding: 4px 10px;
cursor: pointer;
font-size: 11px;
font-weight: 500;
font-family: var(--font-monospace);
transition: background 0.12s, color 0.12s;
}
.promptuary-popover .prm-note-btn:hover,
.promptuary-bottom-toolbar .prm-note-btn:hover {
background: var(--background-modifier-hover);
color: var(--text-normal);
}
/* ===== Note 展开区 ===== */
.prm-popover-note-area {
margin-top: 2px;
padding-top: 6px;
border-top: 1px solid var(--background-modifier-border);
display: flex;
flex-direction: column;
gap: 6px;
animation: prm-note-area-expand 0.15s ease-out;
}
@keyframes prm-note-area-expand {
from { opacity: 0; max-height: 0; }
to { opacity: 1; max-height: 120px; }
}
/* Note 展开区 header颜色指示 + 分割线 + 标签 */
.prm-popover-note-header {
display: flex;
align-items: center;
gap: 6px;
}
.prm-note-dot {
width: 12px;
height: 12px;
border-radius: 50%;
flex-shrink: 0;
}
.prm-note-dot.yellow { background: rgba(250, 204, 21, 0.65); border: 1px solid rgba(250, 204, 21, 0.45); }
.prm-note-dot.blue { background: rgba(96, 165, 250, 0.65); border: 1px solid rgba(96, 165, 250, 0.45); }
.prm-note-dot.green { background: rgba(74, 222, 128, 0.65); border: 1px solid rgba(74, 222, 128, 0.45); }
.prm-note-dot.purple { background: rgba(192, 132, 252, 0.65); border: 1px solid rgba(192, 132, 252, 0.45); }
.prm-note-dot.orange { background: rgba(251, 146, 60, 0.65); border: 1px solid rgba(251, 146, 60, 0.45); }
.prm-popover-note-header .prm-divider {
width: 1px;
height: 12px;
background: var(--background-modifier-border);
flex-shrink: 0;
}
.prm-note-label {
font-size: 11px;
font-weight: 500;
font-family: var(--font-monospace);
padding: 1px 6px;
border-radius: 999px;
}
.prm-note-label.yellow { background: rgba(250, 204, 21, 0.10); color: rgba(250, 204, 21, 0.80); }
.prm-note-label.blue { background: rgba(96, 165, 250, 0.10); color: rgba(96, 165, 250, 0.80); }
.prm-note-label.green { background: rgba(74, 222, 128, 0.10); color: rgba(74, 222, 128, 0.80); }
.prm-note-label.purple { background: rgba(192, 132, 252, 0.10); color: rgba(192, 132, 252, 0.80); }
.prm-note-label.orange { background: rgba(251, 146, 60, 0.10); color: rgba(251, 146, 60, 0.80); }
/* Note 展开区 input */
.prm-popover-note-input-wrap {
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
background: var(--background-secondary);
transition: border-color 0.15s;
}
.prm-popover-note-input-wrap:focus-within {
border-color: rgba(167, 139, 250, 0.45);
}
.prm-popover-note-input {
width: 100%;
background: transparent;
border: none;
color: var(--text-normal);
font-size: 12px;
font-family: var(--font-monospace);
padding: 6px 8px;
outline: none;
}
.prm-popover-note-input::placeholder {
color: var(--text-muted);
opacity: 0.6;
}
/* Note 展开区 footer右对齐 Save 按钮) */
.prm-popover-note-footer {
display: flex;
justify-content: flex-end;
}
.prm-popover-note-save {
background: rgba(167, 139, 250, 0.12);
border: 1px solid rgba(167, 139, 250, 0.25);
color: rgba(167, 139, 250, 0.9);
border-radius: 4px;
padding: 3px 12px;
cursor: pointer;
font-size: 11px;
font-weight: 500;
font-family: var(--font-monospace);
transition: background 0.12s, border-color 0.12s;
}
.prm-popover-note-save:hover {
background: rgba(167, 139, 250, 0.22);
border-color: rgba(167, 139, 250, 0.40);
}
/* 输入框(批阅模式 #review-input — 保留旧行式兼容) */
.promptuary-popover input[type="text"] {
flex: 1;
min-width: 200px;
padding: 5px 8px;
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
background: var(--background-secondary);
color: var(--text-normal);
font-size: 12px;
font-family: var(--font-monospace);
outline: none;
transition: border-color 0.15s;
}
.promptuary-popover input[type="text"]:focus {
border-color: rgba(167, 139, 250, 0.55);
}
.promptuary-popover input[type="text"]::placeholder {
color: var(--text-muted);
opacity: 0.7;
}
/* ============================================================
* 3. 移动端底部工具栏
* ============================================================ */
.promptuary-bottom-toolbar {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 1000;
background: var(--background-primary);
border-top: 1px solid var(--background-modifier-border);
padding: 10px 12px;
display: flex;
align-items: center;
gap: 8px;
flex-wrap: wrap;
box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.16);
}
.promptuary-bottom-toolbar .prm-color {
width: 22px;
height: 22px;
border-radius: 50%;
cursor: pointer;
flex-shrink: 0;
}
.promptuary-bottom-toolbar .prm-color.yellow { background: rgba(250, 204, 21, 0.65); }
.promptuary-bottom-toolbar .prm-color.blue { background: rgba(96, 165, 250, 0.65); }
.promptuary-bottom-toolbar .prm-color.green { background: rgba(74, 222, 128, 0.65); }
.promptuary-bottom-toolbar .prm-color.purple { background: rgba(192, 132, 252, 0.65); }
/* ============================================================
* 4. 侧边栏
* ============================================================ */
.promptuary-sidebar {
padding: 0;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
background: var(--background-primary);
}
/* 4.0 Header (fixed top) */
.prm-sidebar-header {
padding: 14px 12px 0;
flex-shrink: 0;
}
.prm-header-row {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 10px;
}
.prm-header-left {
display: flex;
align-items: center;
gap: 6px;
}
.prm-header-icon {
width: 18px;
height: 18px;
border-radius: 4px;
background: rgba(192, 132, 252, 0.15);
color: rgba(192, 132, 252, 0.8);
font-size: 10px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.prm-header-title {
font-size: 12px;
font-weight: 600;
font-family: var(--font-monospace);
color: var(--text-normal);
letter-spacing: 0.01em;
}
.prm-header-settings {
background: transparent;
border: none;
cursor: pointer;
color: var(--text-muted);
font-size: 13px;
padding: 2px 4px;
border-radius: 4px;
transition: color 0.15s, background 0.15s;
}
.prm-header-settings:hover {
color: var(--text-normal);
background: var(--background-modifier-hover);
}
/* 4.1 模式切换胶囊 — now inside header */
.prm-mode-capsule {
display: flex;
background: var(--background-secondary);
border-radius: 8px;
padding: 3px;
gap: 2px;
width: 100%;
box-sizing: border-box;
}
.prm-mode-capsule button {
flex: 1;
background: transparent;
border: none;
box-shadow: none;
padding: 5px 10px;
border-radius: 6px;
cursor: pointer;
color: var(--text-muted);
font-size: 12px;
font-weight: 500;
font-family: var(--font-monospace);
transition: background 0.15s, color 0.15s;
}
.prm-mode-capsule button:hover {
color: var(--text-normal);
}
.prm-mode-capsule button.active {
background: var(--background-primary);
color: var(--text-normal);
font-weight: 600;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.08);
}
.theme-dark .prm-mode-capsule button.active {
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.30);
}
/* 4.1b Scrollable content area */
.prm-sidebar-content {
flex: 1;
overflow-y: auto;
padding: 10px 12px;
display: flex;
flex-direction: column;
gap: 8px;
}
/* 4.1c Bottom action bar (fixed bottom) */
.prm-sidebar-action-bar {
flex-shrink: 0;
border-top: 1px solid var(--background-modifier-border);
background: var(--background-secondary);
padding: 10px 12px;
display: flex;
flex-direction: column;
gap: 8px;
}
.prm-action-row {
display: flex;
gap: 6px;
}
.prm-action-btn {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
gap: 5px;
font-size: 11px;
font-weight: 500;
font-family: var(--font-monospace);
padding: 10px 6px;
min-height: 36px;
border-radius: 6px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-normal);
opacity: 0.85;
cursor: pointer;
transition: all 0.15s;
}
.prm-action-btn:hover {
border-color: var(--text-muted);
opacity: 1;
}
.prm-action-btn:active {
transform: scale(0.98);
}
.prm-action-btn::before {
font-size: 13px;
opacity: 0.7;
}
/* Action row — container query for adaptive button labels */
.prm-action-row {
container-type: inline-size;
}
/* Wide: icon + short label + long label */
.prm-action-short,
.prm-action-long {
transition: opacity 0.15s;
}
/* Medium (≤340px): hide long label, show icon + short label */
@container (max-width: 260px) {
.prm-action-row .prm-action-long { display: none; }
}
/* Narrow (≤260px): hide all labels, icon only */
@container (max-width: 200px) {
.prm-action-row .prm-action-short { display: none; }
.prm-action-row .prm-action-btn { padding: 10px 6px; }
}
/* "…" more button — icon only, fixed small width */
.prm-more-btn {
flex: 0 0 auto;
min-width: 36px;
max-width: 36px;
padding: 10px 6px;
}
.prm-action-btn.secondary {
background: var(--background-primary);
color: var(--text-muted);
}
.prm-action-btn.secondary:hover {
color: var(--text-normal);
}
/* Execute with Agent — purple CTA button */
.prm-action-execute {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
font-size: 12.5px;
font-weight: 600;
font-family: var(--font-monospace);
padding: 12px 14px;
min-height: 40px;
border-radius: 6px;
background: rgba(167, 139, 250, 0.12);
border: 1px solid rgba(167, 139, 250, 0.20);
color: rgba(167, 139, 250, 0.85);
cursor: pointer;
transition: all 0.15s;
}
.prm-action-execute::before {
font-size: 15px;
}
.prm-action-execute:hover {
background: rgba(167, 139, 250, 0.20);
border-color: rgba(167, 139, 250, 0.35);
}
.prm-action-execute:active {
transform: scale(0.98);
}
.prm-action-execute:disabled {
opacity: 0.35;
cursor: default;
}
/* Secondary tool row — smaller, subdued (reserved) */
/* Status hint at bottom */
.prm-action-status {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
color: var(--text-muted);
opacity: 0.5;
font-size: 10px;
font-family: var(--font-monospace);
}
.prm-status-dot {
width: 5px;
height: 5px;
border-radius: 50%;
background: rgba(74, 222, 128, 0.50);
flex-shrink: 0;
}
.prm-status-dot-executing {
background: rgba(167, 139, 250, 0.70);
animation: prm-pulse 1.2s ease-in-out infinite;
}
@keyframes prm-pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
/* Executing state — subtle pulse on CTA button */
.prm-action-execute.prm-executing {
animation: prm-btn-pulse 1.6s ease-in-out infinite;
}
.prm-action-btn.prm-executing {
animation: prm-btn-pulse 1.6s ease-in-out infinite;
}
@keyframes prm-btn-pulse {
0%, 100% { opacity: 0.85; }
50% { opacity: 0.55; }
}
/* 4.2 横幅baseline 漂移提示) */
.prm-banner {
background: rgba(251, 146, 60, 0.10);
color: var(--text-normal);
border: 1px solid rgba(251, 146, 60, 0.30);
border-radius: 8px;
padding: 8px 10px;
font-size: 12px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.prm-banner button {
background: rgba(251, 146, 60, 0.15);
border: 1px solid rgba(251, 146, 60, 0.40);
color: rgba(251, 146, 60, 1);
border-radius: 4px;
padding: 3px 10px;
cursor: pointer;
font-size: 11px;
font-weight: 500;
white-space: nowrap;
}
.prm-banner button:hover {
background: rgba(251, 146, 60, 0.25);
}
.prm-cleanup-prompt {
background: rgba(167, 139, 250, 0.10);
color: var(--text-normal);
border: 1px solid rgba(167, 139, 250, 0.28);
border-radius: 8px;
padding: 9px 10px;
display: flex;
flex-direction: column;
gap: 8px;
}
.prm-cleanup-text {
display: flex;
flex-direction: column;
gap: 2px;
}
.prm-cleanup-title {
font-size: 12px;
font-weight: 600;
}
.prm-cleanup-desc {
color: var(--text-muted);
font-size: 11px;
line-height: 1.4;
}
.prm-cleanup-actions {
display: flex;
gap: 6px;
justify-content: flex-end;
}
.prm-cleanup-actions button {
border-radius: 5px;
padding: 4px 10px;
cursor: pointer;
font-size: 11px;
font-weight: 500;
}
.prm-cleanup-keep {
background: transparent;
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
}
.prm-cleanup-keep:hover {
background: var(--background-modifier-hover);
color: var(--text-normal);
}
.prm-cleanup-confirm {
background: rgba(167, 139, 250, 0.16);
border: 1px solid rgba(167, 139, 250, 0.40);
color: rgba(167, 139, 250, 1);
}
.prm-cleanup-confirm:hover {
background: rgba(167, 139, 250, 0.25);
}
/* 4.3 工具栏样式已移至底部操作栏 (.prm-action-row / .prm-action-btn) */
/* 4.4 卡片(设计稿核心元素) */
.prm-card {
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
padding: 10px 10px 10px 12px;
font-size: 12px;
display: flex;
flex-direction: column;
gap: 6px;
cursor: pointer;
position: relative;
transition: border-color 0.15s, background 0.15s;
}
.prm-card:hover {
background: var(--background-modifier-hover);
}
.theme-dark .prm-card {
background: rgba(255, 255, 255, 0.025);
}
.theme-dark .prm-card:hover {
background: rgba(255, 255, 255, 0.045);
}
/* 卡片左侧 2px 颜色条(设计稿 .w-0.5 self-stretch */
.prm-card::before {
content: "";
position: absolute;
left: 0;
top: 10px;
bottom: 10px;
width: 2px;
border-radius: 999px;
background: var(--text-muted);
opacity: 0.45;
}
.prm-card.color-yellow::before { background: rgba(250, 204, 21, 0.55); }
.prm-card.color-blue::before { background: rgba(96, 165, 250, 0.55); }
.prm-card.color-green::before { background: rgba(74, 222, 128, 0.55); }
.prm-card.color-purple::before { background: rgba(192, 132, 252, 0.55); }
.prm-card.color-orange::before { background: rgba(251, 146, 60, 0.55); }
.prm-card:hover.color-yellow { border-color: rgba(250, 204, 21, 0.30); }
.prm-card:hover.color-blue { border-color: rgba(96, 165, 250, 0.30); }
.prm-card:hover.color-green { border-color: rgba(74, 222, 128, 0.30); }
.prm-card:hover.color-purple { border-color: rgba(192, 132, 252, 0.30); }
.prm-card:hover.color-orange { border-color: rgba(251, 146, 60, 0.30); }
/* fuzzy / auto-healed / drifted 状态 */
.prm-card.fuzzy::before { background: var(--text-warning); }
.prm-card.auto-healed::before { background: rgba(96, 165, 250, 0.55); }
.prm-card.drifted {
opacity: 0.55;
}
.prm-card.drifted::before { background: var(--background-modifier-error); }
/* ---- Review card layout (design ref: icon badge + orange quote + purple text) ---- */
.prm-card-layout {
display: flex;
align-items: flex-start;
gap: 8px;
}
/* Icon badge: small square with S (strikethrough) or ✎ (review) */
.prm-card-badge {
width: 20px;
height: 20px;
border-radius: 5px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
margin-top: 1px;
font-size: 10px;
font-weight: 700;
font-family: var(--font-monospace);
}
.prm-card-badge.strike {
background: rgba(251, 146, 60, 0.12);
border: 1px solid rgba(251, 146, 60, 0.20);
color: rgba(251, 146, 60, 0.80);
text-decoration-line: line-through;
text-decoration-color: rgba(251, 146, 60, 0.50);
}
.prm-card-badge.review {
background: rgba(251, 146, 60, 0.12);
border: 1px solid rgba(251, 146, 60, 0.20);
color: rgba(251, 146, 60, 0.80);
}
.prm-card-body {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 4px;
}
/* Orange quote block (original text with strikethrough) */
.prm-quote-orange {
background: rgba(251, 146, 60, 0.08);
border-left: 2px solid rgba(251, 146, 60, 0.25);
}
.prm-quote-orange.strike {
text-decoration-line: line-through;
text-decoration-color: rgba(251, 146, 60, 0.40);
opacity: 0.55;
}
.theme-dark .prm-quote-orange {
background: rgba(251, 146, 60, 0.06);
}
/* Review text block — aligned with reading note style (no purple bg) */
.prm-text-purple {
background: transparent;
border-left: none;
color: var(--text-normal);
border-radius: 0;
padding: 0 4px;
font-size: 11.5px;
line-height: 1.55;
}
.theme-dark .prm-text-purple {
background: transparent;
color: var(--text-normal);
}
/* Status hint for review cards */
.prm-card-status-hint {
font-size: 10px;
color: var(--text-muted);
opacity: 0.7;
margin-top: 2px;
}
/* 元信息(类型 chip + 漂移标记 + 删除按钮) */
.prm-card-meta {
display: flex;
align-items: center;
gap: 5px;
font-size: 10px;
color: var(--text-muted);
}
/* spacer 把删除按钮推到右边 */
.prm-card-meta-spacer {
flex: 1;
}
/* 内联状态文字 */
.prm-card-status-inline {
font-size: 9px;
opacity: 0.75;
}
/* 删除按钮meta 行右侧hover 才显色) */
.prm-card-del-btn {
background: transparent;
border: none;
cursor: pointer;
color: var(--text-faint);
font-size: 9px;
padding: 1px 4px;
border-radius: 3px;
font-family: var(--font-monospace);
opacity: 0;
transition: opacity 0.15s, color 0.12s, background 0.12s;
flex-shrink: 0;
}
.prm-card:hover .prm-card-del-btn {
opacity: 1;
}
.prm-card-del-btn:hover {
color: var(--text-error);
background: rgba(239, 68, 68, 0.10);
}
.prm-card-meta .prm-tag {
padding: 1px 6px;
border-radius: 999px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
font-family: var(--font-monospace);
font-size: 9px;
text-transform: lowercase;
letter-spacing: 0.02em;
}
/* 类型标签按颜色着色 */
.prm-card-meta .prm-tag.yellow {
background: rgba(250, 204, 21, 0.10);
color: rgba(250, 204, 21, 0.85);
border-color: rgba(250, 204, 21, 0.25);
}
.prm-card-meta .prm-tag.blue {
background: rgba(96, 165, 250, 0.10);
color: rgba(96, 165, 250, 0.85);
border-color: rgba(96, 165, 250, 0.25);
}
.prm-card-meta .prm-tag.green {
background: rgba(74, 222, 128, 0.10);
color: rgba(74, 222, 128, 0.85);
border-color: rgba(74, 222, 128, 0.25);
}
.prm-card-meta .prm-tag.purple {
background: rgba(192, 132, 252, 0.10);
color: rgba(192, 132, 252, 0.85);
border-color: rgba(192, 132, 252, 0.25);
}
.prm-card-meta .prm-tag.orange {
background: rgba(251, 146, 60, 0.10);
color: rgba(251, 146, 60, 0.85);
border-color: rgba(251, 146, 60, 0.25);
}
/* 引用块:原文摘录(设计稿 .bg-quote-bg */
.prm-card-quote {
background: rgba(125, 125, 145, 0.08);
border-radius: 4px;
padding: 5px 8px;
font-family: var(--font-monospace);
font-size: 11px;
line-height: 1.5;
color: var(--text-normal);
opacity: 0.85;
word-break: break-word;
}
.theme-dark .prm-card-quote {
background: rgba(255, 255, 255, 0.04);
}
.prm-card-quote.strike {
text-decoration-line: line-through;
text-decoration-color: rgba(251, 146, 60, 0.55);
opacity: 0.55;
}
/* 笔记 / 批阅文本(带前缀图标) */
.prm-card-text {
padding: 0 4px;
font-size: 11.5px;
line-height: 1.55;
color: var(--text-normal);
display: flex;
gap: 6px;
align-items: flex-start;
}
.prm-card-text::before {
content: "";
width: 14px;
height: 14px;
flex-shrink: 0;
margin-top: 1px;
background-color: var(--text-muted);
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z'/%3E%3C/svg%3E");
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: contain;
}
.prm-card-text.review::before {
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z'/%3E%3C/svg%3E");
}
/* 文件名 / 行号(卡片底部) */
.prm-card-source {
display: flex;
align-items: center;
gap: 4px;
font-size: 10px;
color: var(--text-muted);
opacity: 0.65;
font-family: var(--font-monospace);
}
.prm-card-source::before {
content: "";
width: 12px;
height: 12px;
flex-shrink: 0;
background-color: var(--text-muted);
opacity: 0.65;
-webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z'/%3E%3Cpath d='M14 2v4a2 2 0 0 0 2 2h4'/%3E%3C/svg%3E");
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: contain;
}
/* 空状态 */
.prm-empty {
color: var(--text-muted);
font-size: 12px;
text-align: center;
padding: 32px 12px;
opacity: 0.6;
line-height: 1.6;
white-space: pre-line;
}
/* 空状态占位图 */
.prm-empty-state {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 16px 32px;
gap: 12px;
}
.prm-empty-state-img {
width: 96px;
height: 96px;
opacity: 0.55;
object-fit: contain;
flex-shrink: 0;
}
.prm-empty-state-text {
color: var(--text-muted);
font-size: 12px;
text-align: center;
opacity: 0.6;
line-height: 1.6;
white-space: pre-line;
max-width: 180px;
}
/* ============================================================
* 5. v0.2 — Agent bridge / Diff
* 保留之前的样式,与新视觉对齐配色
* ============================================================ */
.prm-agent-buttons {
display: flex;
align-items: center;
gap: 6px;
flex-wrap: wrap;
margin-top: 4px;
width: 100%;
}
.prm-agent-label {
font-size: 11px;
color: var(--text-muted);
white-space: nowrap;
font-family: var(--font-monospace);
}
.prm-agent-btn {
background: var(--background-secondary);
color: var(--text-normal);
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
padding: 4px 10px;
cursor: pointer;
font-size: 11px;
white-space: nowrap;
transition: all 0.15s;
}
.prm-agent-btn:hover {
background: var(--background-modifier-hover);
border-color: rgba(167, 139, 250, 0.40);
}
.prm-agent-btn.not-installed {
opacity: 0.4;
cursor: not-allowed;
}
.prm-agent-btn.secondary {
background: transparent;
border: 1px dashed var(--background-modifier-border);
}
/* ============================================================
* Command Confirm Modal — matches Confirm Execution.html
* ============================================================ */
.modal.prm-confirm-modal { padding: 0; }
.modal.prm-confirm-modal .modal-close-button { display: none; }
.modal.prm-confirm-modal {
width: 500px;
border-radius: 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
box-shadow: 0 8px 24px rgba(0,0,0,0.08), 0 2px 8px rgba(0,0,0,0.04);
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Header */
.prm-ccm-header {
display: flex; align-items: center; justify-content: space-between;
padding: 14px 18px;
border-bottom: 1px solid var(--background-modifier-border);
flex-shrink: 0;
}
.prm-ccm-header-left { display: flex; align-items: center; gap: 10px; }
.prm-ccm-icon {
width: 24px; height: 24px; border-radius: 7px;
background: rgba(167,139,250,0.12);
border: 1px solid rgba(167,139,250,0.20);
display: flex; align-items: center; justify-content: center;
color: rgba(167,139,250,0.85);
flex-shrink: 0;
}
.prm-ccm-title {
font-size: 13px; font-weight: 600;
color: var(--text-normal); line-height: 1.2;
}
.prm-ccm-subtitle {
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted); margin-top: 2px;
}
.prm-ccm-close {
width: 28px; height: 28px;
border-radius: 6px;
background: transparent; border: none;
color: var(--text-muted); cursor: pointer;
display: flex; align-items: center; justify-content: center;
transition: background 0.12s, color 0.12s;
flex-shrink: 0;
}
.prm-ccm-close:hover { background: var(--background-modifier-hover); color: var(--text-normal); }
/* Agent badge row */
.prm-ccm-agent-row {
display: flex; align-items: center; gap: 8px;
padding: 10px 18px 4px;
}
.prm-ccm-agent-avatar {
width: 20px; height: 20px;
border-radius: 5px;
display: flex; align-items: center; justify-content: center;
border: 1px solid transparent;
flex-shrink: 0;
}
.prm-ccm-agent-char {
font-size: 10px; font-weight: 700;
font-family: var(--font-monospace);
}
.prm-ccm-agent-name {
font-size: 12px; font-weight: 600;
color: var(--text-normal);
}
.prm-ccm-agent-badge {
font-size: 8px; font-family: var(--font-monospace);
padding: 1px 6px; border-radius: 999px;
border: 1px solid transparent;
white-space: nowrap;
}
.prm-ccm-agent-badge.installed {
background: rgba(74,222,128,0.10);
color: rgba(74,222,128,0.85);
border-color: rgba(74,222,128,0.22);
}
.prm-ccm-agent-vendor {
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted);
}
/* Command display */
.prm-ccm-cmd-wrap { padding: 4px 18px 8px; }
.prm-ccm-cmd-box {
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
padding: 10px 12px;
max-height: 220px;
overflow-y: auto;
}
.prm-ccm-cmd-box::-webkit-scrollbar { width: 6px; }
.prm-ccm-cmd-box::-webkit-scrollbar-thumb { background: var(--background-modifier-border); border-radius: 3px; }
.prm-ccm-cmd-header {
display: flex; align-items: center; justify-content: space-between;
padding-bottom: 6px; margin-bottom: 6px;
border-bottom: 1px solid var(--background-modifier-border);
}
.prm-ccm-cmd-label {
font-size: 9px; font-family: var(--font-monospace);
color: var(--text-muted); opacity: 0.6;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.prm-ccm-code {
font-family: var(--font-monospace);
font-size: 12px;
white-space: pre-wrap;
word-break: break-all;
color: var(--text-normal);
line-height: 1.7;
}
/* Warning */
.prm-ccm-warning {
display: flex; align-items: flex-start; gap: 8px;
background: rgba(251,146,60,0.08);
border: 1px solid rgba(251,146,60,0.20);
border-radius: 8px;
padding: 10px 12px;
margin: 4px 18px 0;
}
.prm-ccm-warning-icon {
color: rgba(251,146,60,0.85);
flex-shrink: 0;
margin-top: 1px;
}
.prm-ccm-warning-text {
font-size: 11px;
color: var(--text-normal);
opacity: 0.80;
line-height: 1.5;
margin: 0;
}
/* Instruction file hint */
.prm-ccm-hint {
display: flex; align-items: center; gap: 6px;
padding: 4px 18px 2px;
color: var(--text-muted);
}
.prm-ccm-hint-icon svg { width: 12px; height: 12px; }
.prm-ccm-hint-text {
font-size: 10px;
font-family: var(--font-monospace);
}
/* Footer */
.prm-ccm-footer {
display: flex; align-items: center; justify-content: space-between;
padding: 10px 18px 14px;
border-top: 1px solid var(--background-modifier-border);
margin-top: 10px;
}
.prm-ccm-footer-left { display: flex; align-items: center; gap: 6px; }
.prm-ccm-footer-right { display: flex; align-items: center; gap: 8px; }
/* Shared button base */
.prm-ccm-btn {
display: inline-flex; align-items: center;
font-family: var(--font-monospace); cursor: pointer;
border-radius: 6px; transition: all 0.12s;
}
.prm-ccm-btn-inner {
display: flex; align-items: center; gap: 6px;
}
.prm-ccm-btn-icon svg { width: 12px; height: 12px; }
/* Cancel */
.prm-ccm-btn-cancel {
font-size: 10px; font-weight: 500;
padding: 6px 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
}
.prm-ccm-btn-cancel:hover {
color: rgba(180,40,55,0.90);
border-color: rgba(215,58,73,0.25);
background: rgba(215,58,73,0.06);
}
.theme-dark .prm-ccm-btn-cancel:hover {
color: rgba(248,150,150,0.90);
border-color: rgba(248,113,113,0.25);
background: rgba(248,113,113,0.08);
}
/* Copy Command */
.prm-ccm-btn-copy {
font-size: 10px; font-weight: 500;
padding: 6px 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
}
.prm-ccm-btn-copy:hover {
color: var(--text-normal);
border-color: var(--text-muted);
}
/* Execute (green CTA) */
.prm-ccm-btn-exec {
font-size: 11px; font-weight: 600;
padding: 7px 14px;
background: rgba(52,168,83,0.08);
border: 1px solid rgba(52,168,83,0.30);
color: rgba(30,120,50,0.92);
}
.prm-ccm-btn-exec:hover {
background: rgba(52,168,83,0.16);
border-color: rgba(52,168,83,0.45);
}
.theme-dark .prm-ccm-btn-exec {
background: rgba(74,222,128,0.10);
border-color: rgba(74,222,128,0.28);
color: rgba(110,220,140,0.95);
}
.theme-dark .prm-ccm-btn-exec:hover {
background: rgba(74,222,128,0.20);
}
/* Dark mode overrides for Confirm Modal */
.theme-dark .modal.prm-confirm-modal {
background: var(--background-primary);
border-color: var(--background-modifier-border);
box-shadow: 0 8px 24px rgba(0,0,0,0.25), 0 2px 8px rgba(0,0,0,0.12);
}
.theme-dark .prm-ccm-icon {
background: rgba(167,139,250,0.18);
border-color: rgba(167,139,250,0.30);
color: rgba(192,170,255,0.90);
}
.theme-dark .prm-ccm-cmd-box {
background: var(--background-secondary);
}
.theme-dark .prm-ccm-warning {
background: rgba(251,146,60,0.10);
border-color: rgba(251,146,60,0.25);
}
.theme-dark .prm-ccm-warning-icon {
color: rgba(251,170,100,0.90);
}
.theme-dark .prm-ccm-agent-badge.installed {
background: rgba(74,222,128,0.12);
color: rgba(110,220,140,0.90);
border-color: rgba(74,222,128,0.25);
}
/* ============================================================
* Diff Modal — matches promptuary-modal-diff-preview.html
* Light-mode first (white surface, colored borders)
* ============================================================ */
.modal.prm-diff-modal .modal-close-button { display: none; }
.modal.prm-diff-modal {
max-width: 820px;
width: 92vw;
max-height: 88vh;
height: 80vh;
display: flex;
flex-direction: column;
overflow: hidden;
border-radius: 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
box-shadow: 0 8px 24px rgba(0,0,0,0.08), 0 2px 8px rgba(0,0,0,0.04);
}
/* Header */
.prm-dm-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 18px;
border-bottom: 1px solid var(--background-modifier-border);
flex-shrink: 0;
background: var(--background-primary);
}
.prm-dm-header-left { display: flex; align-items: center; gap: 10px; }
.prm-dm-icon {
width: 24px; height: 24px;
border-radius: 6px;
background: rgba(59,130,246,0.08);
border: 1px solid rgba(59,130,246,0.20);
display: flex; align-items: center; justify-content: center;
color: rgba(59,130,246,0.85);
flex-shrink: 0;
}
.prm-dm-title {
font-size: 13px; font-weight: 600;
color: var(--text-normal); line-height: 1.2;
}
.prm-dm-subtitle {
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted); margin-top: 2px;
}
.prm-dm-header-right { display: flex; align-items: center; gap: 8px; }
.prm-dm-hunk-badge {
font-size: 9px; font-family: var(--font-monospace);
padding: 2px 8px; border-radius: 4px;
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
}
.prm-dm-refresh {
display: inline-flex; align-items: center; gap: 4px;
height: 28px;
padding: 0 8px;
border-radius: 6px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
cursor: pointer;
font-size: 10px;
font-family: var(--font-monospace);
transition: background 0.12s, color 0.12s, border-color 0.12s;
}
.prm-dm-refresh:hover {
background: var(--background-modifier-hover);
color: var(--text-normal);
}
.prm-dm-refresh:disabled {
cursor: default;
opacity: 0.75;
}
.prm-dm-refresh svg {
width: 14px;
height: 14px;
display: block;
flex-shrink: 0;
}
.prm-dm-refresh.is-loading svg {
animation: prm-dm-spin 0.8s linear infinite;
}
@keyframes prm-dm-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.prm-dm-close {
width: 28px; height: 28px;
border-radius: 6px;
background: transparent; border: none;
color: var(--text-muted); cursor: pointer;
display: flex; align-items: center; justify-content: center;
transition: background 0.12s, color 0.12s;
flex-shrink: 0;
}
.prm-dm-close:hover { background: var(--background-modifier-hover); color: var(--text-normal); }
/* Scrollable hunk list */
.prm-dm-content {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 14px;
display: flex;
flex-direction: column;
gap: 14px;
background: var(--background-secondary);
}
.prm-dm-content::-webkit-scrollbar { width: 6px; }
.prm-dm-content::-webkit-scrollbar-thumb { background: var(--background-modifier-border); border-radius: 3px; }
.prm-dm-empty { color: var(--text-muted); font-size: 13px; padding: 24px; text-align: center; }
/* Hunk block */
.prm-dm-hunk {
border: 1px solid var(--background-modifier-border);
border-radius: 8px; overflow: hidden;
background: var(--background-primary);
transition: opacity 0.2s, transform 0.2s;
flex: 0 0 auto;
}
.prm-dm-hunk.prm-dm-hunk-decided {
opacity: 0;
transform: translateY(-4px);
pointer-events: none;
}
.prm-dm-hunk-header {
display: flex; align-items: center; justify-content: space-between;
gap: 12px;
padding: 6px 12px;
background: var(--background-secondary);
border-bottom: 1px solid var(--background-modifier-border);
flex-shrink: 0;
}
.prm-dm-hunk-header-left { display: flex; align-items: center; gap: 8px; }
.prm-dm-hunk-pos {
font-size: 9px; font-family: var(--font-monospace);
padding: 1px 6px; border-radius: 3px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
}
.prm-dm-hunk-actions { display: flex; align-items: center; gap: 6px; }
/* Hunk-level Accept / Reject buttons — design matches html spec */
.prm-dm-hunk-btn {
display: inline-flex; align-items: center; gap: 4px;
font-size: 9px; font-family: var(--font-monospace); font-weight: 600;
padding: 3px 9px; border-radius: 5px; cursor: pointer;
border: 1px solid transparent; transition: all 0.12s;
line-height: 1.4;
}
.prm-dm-hunk-btn svg { display: block; flex-shrink: 0; }
/* Reject left, Accept right — matches design html order */
.prm-dm-hunk-btn.reject {
background: rgba(215,58,73,0.06);
border-color: rgba(215,58,73,0.22);
color: rgba(180,40,55,0.90);
}
.prm-dm-hunk-btn.reject:hover {
background: rgba(215,58,73,0.14);
border-color: rgba(215,58,73,0.40);
}
.prm-dm-hunk-btn.accept {
background: rgba(52,168,83,0.07);
border-color: rgba(52,168,83,0.28);
color: rgba(30,120,50,0.90);
}
.prm-dm-hunk-btn.accept:hover {
background: rgba(52,168,83,0.16);
border-color: rgba(52,168,83,0.45);
}
.theme-dark .prm-dm-hunk-btn.reject {
background: rgba(248,113,113,0.08); border-color: rgba(248,113,113,0.22);
color: rgba(248,150,150,0.90);
}
.theme-dark .prm-dm-hunk-btn.reject:hover {
background: rgba(248,113,113,0.18);
}
.theme-dark .prm-dm-hunk-btn.accept {
background: rgba(74,222,128,0.08); border-color: rgba(74,222,128,0.22);
color: rgba(110,220,140,0.90);
}
.theme-dark .prm-dm-hunk-btn.accept:hover {
background: rgba(74,222,128,0.18);
}
/* Diff lines */
.prm-dm-lines {
font-family: var(--font-monospace);
font-size: 11px; line-height: 1.7;
max-height: min(46vh, 460px);
min-height: 0;
overflow-y: auto;
overscroll-behavior: contain;
}
.prm-dm-lines::-webkit-scrollbar { width: 6px; height: 6px; }
.prm-dm-lines::-webkit-scrollbar-thumb {
background: var(--background-modifier-border);
border-radius: 3px;
}
.prm-dm-line {
display: flex; align-items: baseline;
padding: 0 12px;
min-height: 19px;
}
.prm-dm-line-unchanged {
color: var(--text-normal);
opacity: 0.65;
}
.prm-dm-line-removed {
background: #fff0f0;
border-left: 2px solid #d73a49;
}
.prm-dm-line-removed .prm-dm-text { color: #b31d28; }
.prm-dm-line-removed .prm-dm-linenum { color: #cf9ba3; }
.prm-dm-line-added {
background: #e6ffec;
border-left: 2px solid #34a853;
}
.prm-dm-line-added .prm-dm-text { color: #22863a; }
.prm-dm-line-added .prm-dm-linenum { color: #7bc88a; }
.theme-dark .prm-dm-line-removed {
background: rgba(215,58,73,0.10);
border-left-color: rgba(215,58,73,0.55);
}
.theme-dark .prm-dm-line-removed .prm-dm-text { color: rgba(248,150,150,0.85); }
.theme-dark .prm-dm-line-added {
background: rgba(52,168,83,0.08);
border-left-color: rgba(52,168,83,0.55);
}
.theme-dark .prm-dm-line-added .prm-dm-text { color: rgba(110,220,140,0.90); }
.prm-dm-linenum {
min-width: 28px; text-align: right;
padding-right: 8px; flex-shrink: 0;
color: var(--text-faint); font-size: 10px; user-select: none;
}
.prm-dm-prefix {
min-width: 14px; flex-shrink: 0; user-select: none;
color: var(--text-faint);
}
.prm-dm-text { white-space: pre-wrap; word-break: break-all; flex: 1; }
@media (max-width: 640px) {
.prm-dm-refresh span { display: none; }
.prm-dm-hunk-header {
align-items: flex-start;
flex-direction: column;
}
.prm-dm-hunk-actions {
align-self: flex-end;
}
}
/* Footer */
.prm-dm-footer {
display: flex; align-items: center; justify-content: space-between;
padding: 10px 18px;
border-top: 1px solid var(--background-modifier-border);
background: var(--background-primary);
flex-shrink: 0;
}
.prm-dm-stats { display: flex; align-items: center; gap: 6px; }
.prm-dm-stat-label { font-size: 9px; font-family: var(--font-monospace); color: var(--text-muted); }
.prm-dm-stat-add { font-size: 9px; font-family: var(--font-monospace); color: #34a853; }
.prm-dm-stat-del { font-size: 9px; font-family: var(--font-monospace); color: #d73a49; }
.theme-dark .prm-dm-stat-add { color: rgba(74,222,128,0.80); }
.theme-dark .prm-dm-stat-del { color: rgba(248,113,113,0.80); }
.prm-dm-btns { display: flex; align-items: center; gap: 8px; }
.prm-dm-btn-rollback {
display: inline-flex; align-items: center; gap: 6px;
font-size: 10px; font-family: var(--font-monospace); font-weight: 500;
padding: 6px 12px; border-radius: 6px; cursor: pointer;
background: var(--background-primary);
border: 1px solid rgba(215,58,73,0.25);
color: rgba(180,40,55,0.90);
transition: all 0.12s;
}
.prm-dm-btn-rollback:hover { background: rgba(215,58,73,0.07); }
.prm-dm-btn-rollback svg { display: block; }
.theme-dark .prm-dm-btn-rollback {
border-color: rgba(248,113,113,0.25); color: rgba(248,150,150,0.90);
}
.theme-dark .prm-dm-btn-rollback:hover { background: rgba(248,113,113,0.10); }
.prm-dm-btn-accept {
display: inline-flex; align-items: center; gap: 6px;
font-size: 10px; font-family: var(--font-monospace); font-weight: 600;
padding: 6px 12px; border-radius: 6px; cursor: pointer;
background: rgba(52,168,83,0.08);
border: 1px solid rgba(52,168,83,0.30);
color: rgba(30,120,50,0.92);
transition: all 0.12s;
}
.prm-dm-btn-accept:hover { background: rgba(52,168,83,0.16); }
.prm-dm-btn-accept svg { display: block; }
.theme-dark .prm-dm-btn-accept {
background: rgba(74,222,128,0.10);
border-color: rgba(74,222,128,0.28);
color: rgba(110,220,140,0.95);
}
.theme-dark .prm-dm-btn-accept:hover { background: rgba(74,222,128,0.20); }
/* ============================================================
* Agent Select Modal — matches Select Agent.html design
* ============================================================ */
.modal.prm-agent-select-modal .modal-close-button { display: none; }
.modal.prm-agent-select-modal {
width: 400px;
border-radius: 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
box-shadow: 0 8px 24px rgba(0,0,0,0.08), 0 2px 8px rgba(0,0,0,0.04);
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Header */
.prm-asm-header {
display: flex; align-items: center; justify-content: space-between;
padding: 16px 18px 12px;
border-bottom: 1px solid rgba(var(--background-modifier-border-rgb), 0.6);
}
.prm-asm-header-left { display: flex; align-items: center; gap: 10px; }
.prm-asm-icon {
width: 24px; height: 24px; border-radius: 7px;
background: rgba(167,139,250,0.12);
border: 1px solid rgba(167,139,250,0.20);
display: flex; align-items: center; justify-content: center;
font-size: 13px; color: rgba(167,139,250,0.85);
}
.prm-asm-title {
font-size: 13px; font-weight: 600; color: var(--text-normal); line-height: 1.2;
}
.prm-asm-subtitle {
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted); margin-top: 2px;
}
.prm-asm-close {
width: 28px; height: 28px;
border-radius: 6px;
background: transparent; border: none;
color: var(--text-muted); cursor: pointer;
display: flex; align-items: center; justify-content: center;
transition: background 0.12s, color 0.12s;
flex-shrink: 0;
}
.prm-asm-close:hover { background: var(--background-modifier-hover); color: var(--text-normal); }
/* Agent list */
.prm-asm-list {
padding: 10px 12px;
display: flex; flex-direction: column; gap: 6px;
}
/* Agent row */
.prm-asm-row {
display: flex; align-items: center; gap: 10px;
padding: 12px 14px;
border-radius: 8px;
border: 1px solid var(--background-modifier-border);
background: var(--background-primary);
cursor: pointer;
transition: border-color 0.12s, box-shadow 0.12s;
}
.prm-asm-row:hover { border-color: var(--text-muted); }
.prm-asm-row.active {
border-color: rgba(167,139,250,0.35);
box-shadow: 0 0 0 1px rgba(167,139,250,0.12);
}
.prm-asm-row.disabled {
opacity: 0.55; cursor: not-allowed;
}
.prm-asm-row.disabled:hover { border-color: var(--background-modifier-border); }
/* Avatar */
.prm-asm-avatar {
width: 36px; height: 36px; border-radius: 8px;
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; border: 1px solid transparent;
}
.prm-asm-avatar-char {
font-size: 14px; font-weight: 700; font-family: var(--font-monospace);
letter-spacing: -0.5px;
}
/* Info */
.prm-asm-info { flex: 1; min-width: 0; }
.prm-asm-name-row { display: flex; align-items: center; gap: 7px; }
.prm-asm-name { font-size: 13px; font-weight: 600; color: var(--text-normal); }
.prm-asm-badge {
font-size: 8px; font-family: var(--font-monospace);
padding: 1px 6px; border-radius: 20px; border: 1px solid transparent;
}
.prm-asm-badge.installed {
background: rgba(74,222,128,0.12); color: rgba(74,222,128,0.85);
border-color: rgba(74,222,128,0.22);
}
.prm-asm-badge.missing {
background: rgba(107,114,128,0.10); color: var(--text-muted);
border-color: var(--background-modifier-border);
}
.prm-asm-meta {
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted); margin-top: 2px;
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
/* Radio */
.prm-asm-radio {
width: 16px; height: 16px; border-radius: 50%;
border: 2px solid var(--background-modifier-border);
display: flex; align-items: center; justify-content: center;
flex-shrink: 0; transition: border-color 0.12s;
}
.prm-asm-radio.selected { border-color: rgba(167,139,250,0.60); }
.prm-asm-radio-dot {
width: 8px; height: 8px; border-radius: 50%;
background: rgba(167,139,250,0.85);
}
/* Footer */
.prm-asm-footer {
display: flex; align-items: center; justify-content: space-between;
padding: 10px 18px 14px;
border-top: 1px solid rgba(var(--background-modifier-border-rgb), 0.6);
}
.prm-asm-config-btn {
background: none; border: none; cursor: pointer;
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted); transition: color 0.12s;
display: flex; align-items: center; gap: 4px;
}
.prm-asm-config-btn:hover { color: var(--text-normal); }
.prm-asm-confirm-btn {
font-size: 11px; font-family: var(--font-monospace); font-weight: 600;
padding: 7px 16px; border-radius: 6px; cursor: pointer;
background: rgba(167,139,250,0.12);
border: 1px solid rgba(167,139,250,0.25);
color: rgba(200,185,255,0.92);
transition: all 0.12s;
}
.prm-asm-confirm-btn:hover { background: rgba(167,139,250,0.22); }
/* ============================================================
* Settings Page — visual overhaul
* 分区折叠、Agent 检测卡片、自定义规则卡片、Modal
* ============================================================ */
/* --- Page header --- */
.prm-settings-header {
display: flex;
align-items: center;
gap: 10px;
padding-bottom: 16px;
margin-bottom: 8px;
border-bottom: 1px solid var(--background-modifier-border);
}
.prm-settings-header-left {
display: flex;
align-items: center;
gap: 8px;
}
.prm-settings-page-icon {
width: 36px; height: 36px;
border-radius: 9px;
display: flex; align-items: center; justify-content: center;
overflow: hidden;
}
.prm-settings-page-title {
font-size: 16px; font-weight: 700;
color: var(--text-normal);
font-family: var(--font-monospace);
letter-spacing: -0.01em;
}
/* --- Section wrapper --- */
.prm-settings-section {
margin-bottom: 6px;
border: 1px solid var(--background-modifier-border);
border-radius: 10px;
overflow: hidden;
background: var(--background-secondary);
}
.prm-settings-section-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
cursor: pointer;
transition: background 0.12s;
user-select: none;
}
.prm-settings-section-header:hover {
background: var(--background-modifier-hover);
}
.prm-settings-section-left {
display: flex;
align-items: center;
gap: 10px;
}
.prm-settings-section-icon {
width: 28px; height: 28px;
border-radius: 7px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
display: flex; align-items: center; justify-content: center;
font-size: 15px;
flex-shrink: 0;
}
.prm-settings-section-text {
display: flex;
flex-direction: column;
gap: 1px;
}
.prm-settings-section-title {
font-size: 13px; font-weight: 600;
color: var(--text-normal);
font-family: var(--font-monospace);
}
.prm-settings-section-desc {
font-size: 11px;
color: var(--text-muted);
font-family: var(--font-monospace);
}
.prm-settings-section-chevron {
font-size: 11px;
color: var(--text-muted);
transition: transform 0.2s ease;
flex-shrink: 0;
}
.prm-settings-section-chevron.is-open {
transform: rotate(0deg);
}
.prm-settings-section-chevron:not(.is-open) {
transform: rotate(-90deg);
}
/* Collapsible body */
.prm-settings-section-body {
max-height: 0;
overflow: hidden;
transition: max-height 0.3s ease-out, padding 0.2s ease;
padding: 0 16px;
}
.prm-settings-section-body.is-open {
max-height: 3000px;
padding: 4px 16px 14px;
transition: max-height 0.4s ease-in;
}
/* Remove h2 from Obsidian default (we have our own header) */
.prm-settings-section-body h2 { display: none; }
/* Tighter spacing inside section */
.prm-settings-section-body .setting-item {
padding: 8px 0;
}
/* --- Sub-section header (e.g. "自定义命令规则") --- */
.prm-settings-sub-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 10px;
margin-bottom: 8px;
padding-top: 8px;
border-top: 1px solid var(--background-modifier-border);
}
.prm-settings-sub-title {
font-size: 12px; font-weight: 600;
color: var(--text-normal);
font-family: var(--font-monospace);
}
.prm-settings-sub-btn {
background: rgba(167,139,250,0.10);
border: 1px solid rgba(167,139,250,0.20);
color: rgba(167,139,250,0.85);
border-radius: 5px;
padding: 3px 10px;
cursor: pointer;
font-size: 11px;
font-family: var(--font-monospace);
font-weight: 600;
transition: all 0.12s;
}
.prm-settings-sub-btn:hover {
background: rgba(167,139,250,0.20);
border-color: rgba(167,139,250,0.35);
}
/* --- Agent detection cards --- */
.prm-agent-cards {
display: flex;
flex-direction: column;
gap: 6px;
padding: 4px 0 8px;
}
.prm-agent-card {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
border-radius: 8px;
border: 1px solid var(--background-modifier-border);
background: var(--background-primary);
transition: border-color 0.12s;
}
.prm-agent-card:hover {
border-color: var(--text-muted);
}
.prm-agent-card.not-installed {
opacity: 0.70;
}
.prm-agent-card-avatar {
width: 32px; height: 32px;
border-radius: 8px;
background: rgba(167,139,250,0.10);
border: 1px solid rgba(167,139,250,0.18);
display: flex; align-items: center; justify-content: center;
font-size: 14px; font-weight: 700;
font-family: var(--font-monospace);
color: rgba(167,139,250,0.85);
flex-shrink: 0;
}
.prm-agent-card.not-installed .prm-agent-card-avatar {
background: rgba(107,114,128,0.08);
border-color: rgba(107,114,128,0.15);
color: var(--text-muted);
}
.prm-agent-card-info {
flex: 1; min-width: 0;
display: flex;
flex-direction: column;
gap: 2px;
}
.prm-agent-card-name-row {
display: flex;
align-items: center;
gap: 8px;
}
.prm-agent-card-name {
font-size: 13px; font-weight: 600;
color: var(--text-normal);
}
.prm-agent-card-badge {
font-size: 9px;
font-family: var(--font-monospace);
padding: 1px 7px;
border-radius: 999px;
border: 1px solid transparent;
white-space: nowrap;
}
.prm-agent-card-badge.installed {
background: rgba(74,222,128,0.10);
color: rgba(74,222,128,0.85);
border-color: rgba(74,222,128,0.20);
}
.prm-agent-card-badge.missing {
background: rgba(107,114,128,0.08);
color: var(--text-muted);
border-color: var(--background-modifier-border);
}
.prm-agent-card-vendor {
font-size: 10px;
color: var(--text-muted);
font-family: var(--font-monospace);
}
.prm-agent-card-hint {
font-size: 10px;
color: var(--text-muted);
font-family: var(--font-monospace);
opacity: 0.8;
}
/* --- Custom rule cards --- */
.prm-rule-cards {
display: flex;
flex-direction: column;
gap: 6px;
}
.prm-rule-card {
display: flex;
align-items: center;
gap: 10px;
padding: 10px 12px;
border-radius: 8px;
border: 1px solid var(--background-modifier-border);
background: var(--background-primary);
transition: border-color 0.12s;
}
.prm-rule-card:hover {
border-color: var(--text-muted);
}
.prm-rule-card-info {
flex: 1; min-width: 0;
display: flex;
flex-direction: column;
gap: 3px;
}
.prm-rule-card-label {
font-size: 13px; font-weight: 600;
color: var(--text-normal);
}
.prm-rule-card-meta {
display: flex;
flex-direction: column;
gap: 1px;
font-size: 10px;
color: var(--text-muted);
font-family: var(--font-monospace);
}
.prm-rule-card-template {
opacity: 0.7;
}
.prm-rule-card-del {
background: transparent;
border: 1px solid transparent;
color: var(--text-faint);
border-radius: 4px;
padding: 4px 10px;
cursor: pointer;
font-size: 11px;
font-family: var(--font-monospace);
transition: all 0.12s;
flex-shrink: 0;
}
.prm-rule-card-del:hover {
color: var(--text-error);
background: rgba(239,68,68,0.08);
border-color: rgba(239,68,68,0.15);
}
/* --- Empty state --- */
.prm-settings-empty {
color: var(--text-muted);
font-size: 12px;
font-style: italic;
padding: 10px 0;
opacity: 0.7;
}
/* --- Template variables reference --- */
.prm-settings-var-details {
margin-top: 8px;
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
padding: 0;
background: var(--background-primary);
overflow: hidden;
}
.prm-settings-var-details summary {
padding: 8px 12px;
font-size: 11px;
font-family: var(--font-monospace);
color: var(--text-muted);
cursor: pointer;
transition: background 0.12s;
}
.prm-settings-var-details summary:hover {
background: var(--background-modifier-hover);
}
.prm-settings-var-table {
width: 100%;
border-collapse: collapse;
font-size: 11px;
font-family: var(--font-monospace);
}
.prm-settings-var-table td {
padding: 5px 12px;
border-top: 1px solid var(--background-modifier-border);
}
.prm-settings-var-table td:first-child {
color: rgba(167,139,250,0.85);
white-space: nowrap;
width: 40%;
}
.prm-settings-var-table td:last-child {
color: var(--text-muted);
}
/* --- API Key visibility toggle --- */
.prm-api-key-input {
padding-right: 36px;
}
.prm-api-key-toggle {
position: absolute;
right: 4px;
top: 50%;
transform: translateY(-50%);
background: transparent;
border: none;
cursor: pointer;
font-size: 13px;
padding: 2px 6px;
color: var(--text-muted);
box-shadow: none;
line-height: 1;
}
.prm-api-key-toggle:hover {
color: var(--text-normal);
}
/* ============================================================
* Add Rule Modal
* ============================================================ */
.modal.prm-add-rule-modal .modal-close-button { display: none; }
.modal.prm-add-rule-modal {
width: 460px;
border-radius: 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
box-shadow: 0 8px 24px rgba(0,0,0,0.08), 0 2px 8px rgba(0,0,0,0.04);
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Header */
.prm-arm-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 18px 12px;
border-bottom: 1px solid var(--background-modifier-border);
}
.prm-arm-header-left {
display: flex;
align-items: center;
gap: 10px;
}
.prm-arm-icon {
width: 24px; height: 24px;
border-radius: 7px;
background: rgba(167,139,250,0.12);
border: 1px solid rgba(167,139,250,0.20);
display: flex; align-items: center; justify-content: center;
font-size: 13px;
}
.prm-arm-title {
font-size: 13px; font-weight: 600;
color: var(--text-normal); line-height: 1.2;
}
.prm-arm-subtitle {
font-size: 10px;
font-family: var(--font-monospace);
color: var(--text-muted);
margin-top: 2px;
}
/* Form */
.prm-arm-form {
padding: 12px 18px;
max-height: 55vh;
overflow-y: auto;
}
/* Template variables reference (inside modal) */
.prm-arm-var-ref {
margin-top: 10px;
padding: 10px 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
border-radius: 6px;
}
.prm-arm-var-title {
font-size: 10px;
font-family: var(--font-monospace);
font-weight: 600;
color: var(--text-muted);
margin-bottom: 6px;
text-transform: uppercase;
letter-spacing: 0.04em;
}
.prm-arm-var-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px 12px;
}
.prm-arm-var-item {
display: flex;
align-items: center;
gap: 6px;
font-size: 10px;
font-family: var(--font-monospace);
}
.prm-arm-var-code {
color: rgba(167,139,250,0.85);
white-space: nowrap;
}
.prm-arm-var-desc {
color: var(--text-muted);
}
/* Footer */
.prm-arm-footer {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 8px;
padding: 10px 18px 14px;
border-top: 1px solid var(--background-modifier-border);
}
.prm-arm-btn-cancel {
background: transparent;
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
border-radius: 6px;
padding: 6px 14px;
cursor: pointer;
font-size: 11px;
font-family: var(--font-monospace);
transition: all 0.12s;
}
.prm-arm-btn-cancel:hover {
color: var(--text-normal);
border-color: var(--text-muted);
}
.prm-arm-btn-save {
background: rgba(167,139,250,0.12);
border: 1px solid rgba(167,139,250,0.25);
color: rgba(167,139,250,0.90);
border-radius: 6px;
padding: 6px 16px;
cursor: pointer;
font-size: 11px;
font-family: var(--font-monospace);
font-weight: 600;
transition: all 0.12s;
}
.prm-arm-btn-save:hover {
background: rgba(167,139,250,0.22);
border-color: rgba(167,139,250,0.40);
}
/* --- Legacy (kept for backwards compat with runtime styles) --- */
.prm-empty-hint {
color: var(--text-muted);
font-size: 12px;
font-style: italic;
}
/* ============================================================
* 6. 浅色模式覆盖 — 对齐 design/light-mode.html
* 作用域body:not(.theme-dark) 下的插件容器
* 要点:暖米色调 / 实心紫 CTA / 白底+阴影卡片 / 深紫 accent
* ============================================================ */
body:not(.theme-dark) {
/* 暖米色体系(设计稿 @theme tokens 复刻) */
--prm-surface: #fefefe;
--prm-surface-hover: #f5f3f0;
--prm-bg-base: #faf9f7;
--prm-border: #e5e2de;
--prm-border-subtle: #ece9e5;
--prm-text-primary: #1c1917;
--prm-text-secondary: #44403c;
--prm-text-muted: #78716c;
--prm-quote-bg: #f5f3f0;
/* 深紫 accent —— 设计稿 #6d5acd不是浅薰衣草 rgba(167,139,250) */
--prm-accent: #6d5acd;
--prm-accent-hover: #5b49bd;
--prm-accent-soft: rgba(109, 90, 205, 0.08);
}
/* ---- 6.1 容器:底色改成暖米基底,去除冷白默认 ---- */
body:not(.theme-dark) .promptuary-sidebar {
background: var(--prm-bg-base);
}
body:not(.theme-dark) .prm-sidebar-action-bar {
background: rgba(254, 254, 254, 0.6);
backdrop-filter: blur(6px);
-webkit-backdrop-filter: blur(6px);
border-top-color: var(--prm-border-subtle);
}
/* ---- 6.2 Headericon 用 accent-soft标题用 primary 文字色 ---- */
body:not(.theme-dark) .prm-header-icon {
background: var(--prm-accent-soft);
color: var(--prm-accent);
}
body:not(.theme-dark) .prm-header-title {
color: var(--prm-text-primary);
}
/* ---- 6.3 Mode capsule底用 border-subtle 暖米调 ---- */
body:not(.theme-dark) .prm-mode-capsule,
body:not(.theme-dark) .prm-popover-capsule {
background: rgba(236, 233, 229, 0.8);
}
body:not(.theme-dark) .prm-mode-capsule button.active,
body:not(.theme-dark) .prm-popover-capsule button.active {
background: var(--prm-surface);
color: var(--prm-text-primary);
box-shadow: 0 1px 2px rgba(28, 25, 23, 0.06);
}
/* ---- 6.4 卡片:白底 + 双层阴影(核心改动)---- */
body:not(.theme-dark) .prm-card {
background: var(--prm-surface);
/* 阴影同时充当极细描边,去掉原 1px 实边框的"嵌进底色"感 */
border-color: transparent;
box-shadow:
0 1px 2px rgba(28, 25, 23, 0.04),
0 0 0 1px rgba(28, 25, 23, 0.03);
transition: box-shadow 0.15s, background 0.15s;
}
body:not(.theme-dark) .prm-card:hover {
background: var(--prm-surface);
box-shadow:
0 2px 8px rgba(28, 25, 23, 0.06),
0 0 0 1px rgba(28, 25, 23, 0.05);
}
/* 引用块:暖米色而非紫灰 */
body:not(.theme-dark) .prm-card-quote {
background: var(--prm-quote-bg);
color: var(--prm-text-secondary);
opacity: 1;
}
/* ---- 6.5 CTA 主按钮:实心紫 + 白字(核心改动)---- */
body:not(.theme-dark) .prm-action-execute {
background: var(--prm-accent);
border-color: var(--prm-accent);
color: #ffffff;
box-shadow: 0 1px 2px rgba(109, 90, 205, 0.15);
}
body:not(.theme-dark) .prm-action-execute:hover {
background: var(--prm-accent-hover);
border-color: var(--prm-accent-hover);
color: #ffffff;
}
/* 次按钮Export / Copy Prompt白底 + 暖米边框 */
body:not(.theme-dark) .prm-action-btn {
background: var(--prm-surface);
border-color: var(--prm-border);
color: var(--prm-text-muted);
}
body:not(.theme-dark) .prm-action-btn:hover {
background: var(--prm-surface-hover);
color: var(--prm-text-primary);
border-color: var(--prm-border);
}
/* ---- 6.6 Note inputfocus 用深紫 ---- */
body:not(.theme-dark) .prm-popover-note-input-wrap:focus-within {
border-color: var(--prm-accent);
}
body:not(.theme-dark) .promptuary-popover input[type="text"]:focus {
border-color: var(--prm-accent);
}
/* Note Save 按钮:用深紫 accent淡底 */
body:not(.theme-dark) .prm-popover-note-save {
background: var(--prm-accent-soft);
border-color: rgba(109, 90, 205, 0.20);
color: var(--prm-accent);
}
body:not(.theme-dark) .prm-popover-note-save:hover {
background: rgba(109, 90, 205, 0.16);
border-color: rgba(109, 90, 205, 0.35);
}
/* 浮窗提交按钮:深紫描边 */
body:not(.theme-dark) .promptuary-popover .prm-submit-btn {
background: var(--prm-accent-soft);
border-color: rgba(109, 90, 205, 0.20);
color: var(--prm-accent);
}
body:not(.theme-dark) .promptuary-popover .prm-submit-btn:hover {
background: rgba(109, 90, 205, 0.16);
}
/* Agent 按钮 hover 边框:深紫 */
body:not(.theme-dark) .prm-sidebar .prm-agent-btn:hover {
border-color: rgba(109, 90, 205, 0.40);
}
/* Diff 复选框 accent */
body:not(.theme-dark) .prm-diff-toggle input[type="checkbox"] {
accent-color: var(--prm-accent);
}
/* ---- 6.7 Settings page: warm tones ---- */
body:not(.theme-dark) .prm-settings-section {
background: var(--prm-bg-base);
border-color: var(--prm-border);
}
body:not(.theme-dark) .prm-settings-section-header:hover {
background: var(--prm-surface-hover);
}
body:not(.theme-dark) .prm-settings-section-icon {
background: var(--prm-surface);
border-color: var(--prm-border);
}
body:not(.theme-dark) .prm-settings-section-title {
color: var(--prm-text-primary);
}
body:not(.theme-dark) .prm-settings-section-desc {
color: var(--prm-text-muted);
}
body:not(.theme-dark) .prm-settings-page-icon {
/* Logo SVG has its own background, no need for extra styling */
}
body:not(.theme-dark) .prm-agent-card {
background: var(--prm-surface);
border-color: var(--prm-border);
}
body:not(.theme-dark) .prm-agent-card:hover {
border-color: var(--prm-border);
box-shadow: 0 1px 4px rgba(28,25,23,0.05);
}
body:not(.theme-dark) .prm-agent-card-avatar {
background: var(--prm-accent-soft);
border-color: rgba(109, 90, 205, 0.18);
color: var(--prm-accent);
}
body:not(.theme-dark) .prm-agent-card.not-installed .prm-agent-card-avatar {
background: rgba(107,114,128,0.06);
border-color: var(--prm-border);
color: var(--prm-text-muted);
}
body:not(.theme-dark) .prm-rule-card {
background: var(--prm-surface);
border-color: var(--prm-border);
}
body:not(.theme-dark) .prm-rule-card:hover {
border-color: var(--prm-border);
box-shadow: 0 1px 4px rgba(28,25,23,0.05);
}
body:not(.theme-dark) .prm-rule-card-del:hover {
background: rgba(239,68,68,0.06);
}
body:not(.theme-dark) .prm-settings-sub-btn {
background: var(--prm-accent-soft);
border-color: rgba(109, 90, 205, 0.20);
color: var(--prm-accent);
}
body:not(.theme-dark) .prm-settings-sub-btn:hover {
background: rgba(109, 90, 205, 0.16);
border-color: rgba(109, 90, 205, 0.35);
}
body:not(.theme-dark) .prm-settings-var-details {
background: var(--prm-surface);
border-color: var(--prm-border);
}
body:not(.theme-dark) .prm-arm-btn-save {
background: var(--prm-accent-soft);
border-color: rgba(109, 90, 205, 0.20);
color: var(--prm-accent);
}
body:not(.theme-dark) .prm-arm-btn-save:hover {
background: rgba(109, 90, 205, 0.16);
border-color: rgba(109, 90, 205, 0.35);
}
/* ============================================================
* 7. Icon sizing — setIcon SVG适配
* Obsidian setIcon() 会插入 <svg>,需控制尺寸
* ============================================================ */
/* Header icon (logo) */
.prm-logo-img {
width: 100%;
height: 100%;
object-fit: contain;
display: block;
}
/* Settings button (⚙) */
.prm-header-settings svg {
width: 14px;
height: 14px;
}
/* Action bar buttons with icons */
.prm-action-btn svg {
width: 14px;
height: 14px;
}
.prm-action-execute svg {
width: 14px;
height: 14px;
}
/* Inline status badges (⚠/🔧) */
.prm-card-status-inline svg {
width: 11px;
height: 11px;
vertical-align: -1px;
}
/* Confirm warning icon */
.prm-confirm-warning svg {
width: 14px;
height: 14px;
vertical-align: -2px;
}
/* ============================================================
* API Confirm Modal — matches API Confirm.html
* ============================================================ */
.modal.prm-api-confirm-modal .modal-close-button { display: none; }
.modal.prm-api-confirm-modal {
width: 500px;
border-radius: 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
box-shadow: 0 8px 24px rgba(0,0,0,0.08), 0 2px 8px rgba(0,0,0,0.04);
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Header */
.prm-apm-header {
display: flex; align-items: center; justify-content: space-between;
padding: 14px 18px;
border-bottom: 1px solid var(--background-modifier-border);
flex-shrink: 0;
}
.prm-apm-header-left { display: flex; align-items: center; gap: 10px; }
.prm-apm-icon {
width: 24px; height: 24px; border-radius: 7px;
background: rgba(96,165,250,0.12);
border: 1px solid rgba(96,165,250,0.20);
display: flex; align-items: center; justify-content: center;
color: rgba(96,165,250,0.85);
flex-shrink: 0;
}
.prm-apm-title {
font-size: 13px; font-weight: 600;
color: var(--text-normal); line-height: 1.2;
}
.prm-apm-subtitle {
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted); margin-top: 2px;
}
/* Provider badge row */
.prm-apm-provider-row {
display: flex; align-items: center; gap: 8px;
padding: 10px 18px 4px;
}
.prm-apm-provider-avatar {
width: 20px; height: 20px;
border-radius: 5px;
display: flex; align-items: center; justify-content: center;
border: 1px solid transparent;
flex-shrink: 0;
}
.prm-apm-provider-char {
font-size: 10px; font-weight: 700;
font-family: var(--font-monospace);
}
.prm-apm-provider-name {
font-size: 12px; font-weight: 600;
color: var(--text-normal);
}
.prm-apm-provider-badge {
font-size: 8px; font-family: var(--font-monospace);
padding: 1px 6px; border-radius: 999px;
border: 1px solid transparent;
white-space: nowrap;
}
/* Info table */
.prm-apm-info-wrap { padding: 4px 18px 8px; }
.prm-apm-info-box {
background: var(--background-secondary);
border: 1px solid var(--background-modifier-border);
border-radius: 8px;
overflow: hidden;
}
.prm-apm-info-row {
display: flex; align-items: center;
padding: 7px 12px;
border-bottom: 1px solid var(--background-modifier-border);
}
.prm-apm-info-row:last-child { border-bottom: none; }
.prm-apm-info-label {
font-size: 9px; font-family: var(--font-monospace);
color: var(--text-muted); opacity: 0.6;
text-transform: uppercase; letter-spacing: 0.06em;
width: 80px; flex-shrink: 0;
}
.prm-apm-info-value {
font-size: 12px; font-family: var(--font-monospace);
color: var(--text-normal);
}
.prm-apm-info-warn {
color: rgba(251,146,60,0.90);
font-weight: 600;
}
/* Warning */
.prm-apm-warning {
display: flex; align-items: flex-start; gap: 8px;
background: rgba(251,146,60,0.08);
border: 1px solid rgba(251,146,60,0.20);
border-radius: 8px;
padding: 10px 12px;
margin: 4px 18px 0;
}
.prm-apm-warning-icon {
color: rgba(251,146,60,0.85);
flex-shrink: 0;
margin-top: 1px;
}
.prm-apm-warning-text {
font-size: 11px;
color: var(--text-normal);
opacity: 0.80;
line-height: 1.5;
margin: 0;
}
/* Footer */
.prm-apm-footer {
display: flex; align-items: center; justify-content: space-between;
padding: 10px 18px 14px;
border-top: 1px solid var(--background-modifier-border);
margin-top: 10px;
}
/* API confirm buttons */
.prm-apm-btn {
display: inline-flex; align-items: center;
font-family: var(--font-monospace); cursor: pointer;
border-radius: 6px; transition: all 0.12s;
}
.prm-apm-btn-inner {
display: flex; align-items: center; gap: 6px;
}
.prm-apm-btn-icon svg, .prm-apm-btn-icon .svg-icon {
width: 12px; height: 12px;
}
/* Cancel */
.prm-apm-btn-cancel {
font-size: 10px; font-weight: 500;
padding: 6px 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
}
.prm-apm-btn-cancel:hover {
color: rgba(180,40,55,0.90);
border-color: rgba(215,58,73,0.25);
background: rgba(215,58,73,0.06);
}
.theme-dark .prm-apm-btn-cancel:hover {
color: rgba(248,150,150,0.90);
border-color: rgba(248,113,113,0.25);
background: rgba(248,113,113,0.08);
}
/* Execute (green CTA) */
.prm-apm-btn-exec {
font-size: 11px; font-weight: 600;
padding: 7px 14px;
background: rgba(52,168,83,0.08);
border: 1px solid rgba(52,168,83,0.30);
color: rgba(30,120,50,0.92);
}
.prm-apm-btn-exec:hover {
background: rgba(52,168,83,0.16);
border-color: rgba(52,168,83,0.45);
}
.theme-dark .prm-apm-btn-exec {
background: rgba(74,222,128,0.10);
border-color: rgba(74,222,128,0.28);
color: rgba(110,220,140,0.95);
}
.theme-dark .prm-apm-btn-exec:hover {
background: rgba(74,222,128,0.20);
}
/* Dark mode overrides for API Confirm Modal */
.theme-dark .modal.prm-api-confirm-modal {
background: var(--background-primary);
box-shadow: 0 8px 24px rgba(0,0,0,0.25), 0 2px 8px rgba(0,0,0,0.12);
}
.theme-dark .prm-apm-icon {
background: rgba(96,165,250,0.18);
border-color: rgba(96,165,250,0.30);
color: rgba(150,190,255,0.90);
}
.theme-dark .prm-apm-info-box {
background: var(--background-secondary);
}
.theme-dark .prm-apm-warning {
background: rgba(251,146,60,0.10);
border-color: rgba(251,146,60,0.25);
}
.theme-dark .prm-apm-warning-icon {
color: rgba(251,170,100,0.90);
}
/* API Confirm icon sizing */
.prm-apm-icon svg, .prm-apm-icon .svg-icon {
width: 14px; height: 14px;
}
.prm-apm-warning-icon svg, .prm-apm-warning-icon .svg-icon {
width: 14px; height: 14px;
}
/* ============================================================
* API Progress Modal — matches API Confirm.html (progress variant)
* ============================================================ */
.modal.prm-api-progress-modal .modal-close-button { display: none; }
.modal.prm-api-progress-modal {
width: 400px;
border-radius: 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
box-shadow: 0 8px 24px rgba(0,0,0,0.08), 0 2px 8px rgba(0,0,0,0.04);
overflow: hidden;
display: flex;
flex-direction: column;
}
/* Header */
.prm-ppm-header {
display: flex; align-items: center; justify-content: space-between;
padding: 14px 18px;
border-bottom: 1px solid var(--background-modifier-border);
flex-shrink: 0;
}
.prm-ppm-header-left { display: flex; align-items: center; gap: 10px; }
.prm-ppm-icon {
width: 24px; height: 24px; border-radius: 7px;
background: rgba(96,165,250,0.12);
border: 1px solid rgba(96,165,250,0.20);
display: flex; align-items: center; justify-content: center;
color: rgba(96,165,250,0.85);
flex-shrink: 0;
}
.prm-ppm-title {
font-size: 13px; font-weight: 600;
color: var(--text-normal); line-height: 1.2;
}
.prm-ppm-subtitle {
font-size: 10px; font-family: var(--font-monospace);
color: var(--text-muted); margin-top: 2px;
}
/* Content area */
.prm-ppm-content {
padding: 12px 18px;
flex: 1;
}
/* Spinner state */
.prm-ppm-spinner {
width: 32px; height: 32px;
border: 2px solid rgba(96,165,250,0.20);
border-top-color: rgba(96,165,250,0.85);
border-radius: 50%;
animation: prm-spin 0.8s linear infinite;
margin: 16px auto 12px;
}
@keyframes prm-spin {
to { transform: rotate(360deg); }
}
.prm-ppm-calling-text {
text-align: center;
font-size: 12px;
color: var(--text-muted);
margin: 0;
}
/* Error state */
.prm-ppm-error {
display: flex; align-items: flex-start; gap: 8px;
background: rgba(215,58,73,0.06);
border: 1px solid rgba(215,58,73,0.20);
border-radius: 8px;
padding: 10px 12px;
}
.prm-ppm-error-icon {
color: rgba(215,58,73,0.80);
flex-shrink: 0;
margin-top: 1px;
}
.prm-ppm-error-icon svg, .prm-ppm-error-icon .svg-icon {
width: 14px; height: 14px;
}
.prm-ppm-error-text {
font-size: 11px;
color: var(--text-normal);
opacity: 0.85;
line-height: 1.5;
margin: 0;
}
/* Success state */
.prm-ppm-success {
display: flex; align-items: flex-start; gap: 8px;
background: rgba(52,168,83,0.06);
border: 1px solid rgba(52,168,83,0.20);
border-radius: 8px;
padding: 10px 12px;
}
.prm-ppm-success-icon {
color: rgba(52,168,83,0.85);
flex-shrink: 0;
margin-top: 1px;
}
.prm-ppm-success-icon svg, .prm-ppm-success-icon .svg-icon {
width: 14px; height: 14px;
}
.prm-ppm-success-text {
font-size: 11px;
color: var(--text-normal);
opacity: 0.85;
line-height: 1.5;
margin: 0;
}
/* Footer */
.prm-ppm-footer {
display: flex; align-items: center; justify-content: flex-end;
padding: 10px 18px 14px;
border-top: 1px solid var(--background-modifier-border);
margin-top: auto;
}
.prm-ppm-footer-right { display: flex; align-items: center; gap: 8px; }
/* Progress modal buttons */
.prm-ppm-btn {
display: inline-flex; align-items: center;
font-family: var(--font-monospace); cursor: pointer;
border-radius: 6px; transition: all 0.12s;
}
.prm-ppm-btn-inner {
display: flex; align-items: center; gap: 6px;
}
.prm-ppm-btn-icon svg, .prm-ppm-btn-icon .svg-icon {
width: 12px; height: 12px;
}
/* Close button */
.prm-ppm-btn-close {
font-size: 10px; font-weight: 500;
padding: 6px 12px;
background: var(--background-primary);
border: 1px solid var(--background-modifier-border);
color: var(--text-muted);
}
/* Diff button (green CTA) */
.prm-ppm-btn-diff {
font-size: 11px; font-weight: 600;
padding: 7px 14px;
background: rgba(52,168,83,0.08);
border: 1px solid rgba(52,168,83,0.30);
color: rgba(30,120,50,0.92);
}
.prm-ppm-btn-diff:hover {
background: rgba(52,168,83,0.16);
border-color: rgba(52,168,83,0.45);
}
.theme-dark .prm-ppm-btn-diff {
background: rgba(74,222,128,0.10);
border-color: rgba(74,222,128,0.28);
color: rgba(110,220,140,0.95);
}
.theme-dark .prm-ppm-btn-diff:hover {
background: rgba(74,222,128,0.20);
}
/* Dark mode for progress modal */
.theme-dark .modal.prm-api-progress-modal {
background: var(--background-primary);
box-shadow: 0 8px 24px rgba(0,0,0,0.25), 0 2px 8px rgba(0,0,0,0.12);
}
.theme-dark .prm-ppm-icon {
background: rgba(96,165,250,0.18);
border-color: rgba(96,165,250,0.30);
color: rgba(150,190,255,0.90);
}
.theme-dark .prm-ppm-error {
background: rgba(248,113,113,0.08);
border-color: rgba(248,113,113,0.22);
}
.theme-dark .prm-ppm-error-icon {
color: rgba(248,113,113,0.85);
}
.theme-dark .prm-ppm-success {
background: rgba(74,222,128,0.08);
border-color: rgba(74,222,128,0.22);
}
.theme-dark .prm-ppm-success-icon {
color: rgba(110,220,140,0.90);
}
/* Progress modal icon sizing */
.prm-ppm-icon svg, .prm-ppm-icon .svg-icon {
width: 14px; height: 14px;
}
/* Diff modal icons */
.prm-dm-icon svg, .prm-dm-icon .svg-icon {
width: 14px;
height: 14px;
}
.prm-dm-btn-icon svg, .prm-dm-btn-icon .svg-icon {
width: 12px;
height: 12px;
}
.prm-dm-hunk-btn-icon svg, .prm-dm-hunk-btn-icon .svg-icon {
width: 10px;
height: 10px;
}
/* Agent select modal icons */
.prm-asm-icon svg, .prm-asm-icon .svg-icon {
width: 14px;
height: 14px;
}
/* Add Rule Modal icons */
.prm-arm-icon svg, .prm-arm-icon .svg-icon {
width: 14px;
height: 14px;
}
/* Confirm Modal icons — override .svg-icon default sizing */
.prm-ccm-icon svg, .prm-ccm-icon .svg-icon {
width: 14px;
height: 14px;
}
.prm-ccm-warning-icon svg, .prm-ccm-warning-icon .svg-icon {
width: 14px;
height: 14px;
}
.prm-ccm-hint-icon svg, .prm-ccm-hint-icon .svg-icon {
width: 12px;
height: 12px;
}
.prm-ccm-btn-icon svg, .prm-ccm-btn-icon .svg-icon {
width: 12px;
height: 12px;
}
/* Modal close buttons — hard reset Obsidian's default button chrome */
button.prm-ccm-close,
button.prm-dm-close,
button.prm-asm-close {
appearance: none;
-webkit-appearance: none;
box-shadow: none;
border: 0;
outline: none;
padding: 0;
margin: 0;
min-width: 28px;
width: 28px;
min-height: 28px;
height: 28px;
border-radius: 6px;
background: transparent;
color: var(--text-muted);
display: inline-flex;
align-items: center;
justify-content: center;
cursor: pointer;
line-height: 0;
font-size: 0;
}
button.prm-ccm-close:hover,
button.prm-dm-close:hover,
button.prm-asm-close:hover {
background: var(--background-modifier-hover);
color: var(--text-normal);
}
button.prm-ccm-close:focus-visible,
button.prm-dm-close:focus-visible,
button.prm-asm-close:focus-visible {
box-shadow: 0 0 0 2px rgba(167,139,250,0.35);
}
button.prm-ccm-close svg,
button.prm-dm-close svg,
button.prm-asm-close svg,
button.prm-ccm-close .svg-icon,
button.prm-dm-close .svg-icon,
button.prm-asm-close .svg-icon {
display: block;
width: 14px;
height: 14px;
flex-shrink: 0;
}
/* Settings page icon */
.prm-settings-page-icon .prm-logo-img {
width: 100%;
height: 100%;
object-fit: contain;
display: block;
}
/* Settings section icons */
.prm-settings-section-icon svg {
width: 18px;
height: 18px;
}
/* Settings section chevron */
.prm-settings-section-chevron svg {
width: 12px;
height: 12px;
}
/* API key toggle icon */
.prm-api-key-toggle svg {
width: 14px;
height: 14px;
}
/* ============================================================
* Utility classes (replacing inline styles per Obsidian lint rules)
* ============================================================ */
.promptuary-popover.prm-hidden,
.promptuary-bottom-toolbar.prm-hidden,
.prm-hidden { display: none; }
.prm-input-full-width { width: 100%; }
.prm-input-min-height { min-height: 120px; }
.prm-clip-textarea { position: fixed; left: -9999px; }
.prm-relative { position: relative; }
/* Dynamic color classes — set --prm-color-bg / --prm-color-border / --prm-color-text
* via el.style.setProperty(), then add these classes. */
.prm-dynamic-bg { background: var(--prm-color-bg); }
.prm-dynamic-border-color { border-color: var(--prm-color-border); }
.prm-dynamic-text-color { color: var(--prm-color-text); }
/* Dynamic position classes — set --prm-pos-top / --prm-pos-left
* via el.style.setProperty(), then add these classes. */
.prm-dynamic-position { top: var(--prm-pos-top); left: var(--prm-pos-left); }