dsh-obsidian-memo 0.16.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.en.md +270 -0
- package/README.md +272 -0
- package/cordis.patch.yml +10 -0
- package/docs/ARCHITECTURE.md +88 -0
- package/docs/AUDIT-0.16.md +74 -0
- package/docs/CHANGELOG.md +120 -0
- package/docs/CONTRACT.md +544 -0
- package/docs/GUIDE.md +177 -0
- package/docs/KNOWN_ISSUES.md +113 -0
- package/icon.svg +7 -0
- package/lib/ai.js +161 -0
- package/lib/capture.js +175 -0
- package/lib/client.js +6994 -0
- package/lib/config-picker.js +29 -0
- package/lib/filename.js +33 -0
- package/lib/files.js +88 -0
- package/lib/host/ai-jobs.js +118 -0
- package/lib/host/configuration.js +151 -0
- package/lib/host/dispatch.js +32 -0
- package/lib/host/environment.js +24 -0
- package/lib/host/folders.js +77 -0
- package/lib/host/images.js +116 -0
- package/lib/host/mutations.js +123 -0
- package/lib/host/note-content.js +44 -0
- package/lib/host/notes.js +148 -0
- package/lib/host/rpc.js +82 -0
- package/lib/host/scanning.js +67 -0
- package/lib/host/session.js +67 -0
- package/lib/host/state.js +68 -0
- package/lib/host/vault.js +38 -0
- package/lib/host/writes.js +21 -0
- package/lib/index.js +88 -0
- package/lib/notes.js +454 -0
- package/lib/obsidian.js +93 -0
- package/lib/scan.js +269 -0
- package/lib/settings.js +228 -0
- package/lib/shared.js +309 -0
- package/lib/trash.js +205 -0
- package/locale/en.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +76 -0
- package/scripts/benchmark.mjs +58 -0
- package/scripts/build-client.mjs +39 -0
- package/src/client/ai/use-comments.js +75 -0
- package/src/client/ai/use-job-notifications.js +53 -0
- package/src/client/ai/use-project-dialog.js +58 -0
- package/src/client/capture/composer.js +266 -0
- package/src/client/capture/images.js +64 -0
- package/src/client/capture/keyboard.js +34 -0
- package/src/client/components/dialogs.js +67 -0
- package/src/client/components/feedback.js +50 -0
- package/src/client/components/icons.js +160 -0
- package/src/client/components/use-toasts.js +58 -0
- package/src/client/constants.js +127 -0
- package/src/client/data/state.js +116 -0
- package/src/client/data/use-notes-data.js +137 -0
- package/src/client/data/visibility.js +14 -0
- package/src/client/drag/drop-actions.js +47 -0
- package/src/client/drag/motion.js +84 -0
- package/src/client/drag/overlay.js +33 -0
- package/src/client/drag/use-card-drag.js +149 -0
- package/src/client/i18n/en.js +219 -0
- package/src/client/i18n/index.js +11 -0
- package/src/client/i18n/zh.js +219 -0
- package/src/client/images/cache.js +55 -0
- package/src/client/images/components.js +121 -0
- package/src/client/images/queue.js +106 -0
- package/src/client/index.js +40 -0
- package/src/client/panel/header.js +146 -0
- package/src/client/panel/use-shortcuts.js +79 -0
- package/src/client/panel.js +424 -0
- package/src/client/preferences.js +198 -0
- package/src/client/react.js +8 -0
- package/src/client/reader/blocks.js +51 -0
- package/src/client/reader/note-drawer.js +270 -0
- package/src/client/reader/use-dock-offset.js +23 -0
- package/src/client/reader/use-drawer-layout.js +96 -0
- package/src/client/reader/use-note-editor.js +230 -0
- package/src/client/reader/use-pinned-note.js +41 -0
- package/src/client/runtime.js +30 -0
- package/src/client/settings/ai-budget-row.js +65 -0
- package/src/client/settings/ai-budget.js +42 -0
- package/src/client/settings/callouts.js +21 -0
- package/src/client/settings/config-file.js +74 -0
- package/src/client/settings/image-processing.js +31 -0
- package/src/client/settings/official-page.js +32 -0
- package/src/client/settings/paths.js +131 -0
- package/src/client/settings/settings-drawer.js +244 -0
- package/src/client/settings/style-select.js +58 -0
- package/src/client/settings/trash.js +30 -0
- package/src/client/settings/use-settings-draft.js +207 -0
- package/src/client/styles/base.js +63 -0
- package/src/client/styles/capture.js +94 -0
- package/src/client/styles/index.js +26 -0
- package/src/client/styles/overrides.js +116 -0
- package/src/client/styles/reader.js +66 -0
- package/src/client/styles/settings.js +118 -0
- package/src/client/styles/tokens.js +29 -0
- package/src/client/styles/wall.js +83 -0
- package/src/client/testing.js +139 -0
- package/src/client/utils.js +66 -0
- package/src/client/wall/model.js +158 -0
- package/src/client/wall/note-card.js +201 -0
- package/src/client/wall/use-note-actions.js +107 -0
- package/src/client/wall/use-subfolders.js +42 -0
- package/src/client/wall/use-wall-content.js +135 -0
- package/src/client/wall/use-wall-filters.js +92 -0
- package/src/client/wall/use-wall-paging.js +55 -0
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/** 设置草稿及其异步会话;实时数据刷新不覆盖未保存内容。 */
|
|
2
|
+
import { readImageCompression } from '../capture/images.js';
|
|
3
|
+
import { React } from '../react.js';
|
|
4
|
+
import { readAiBudget } from './ai-budget.js';
|
|
5
|
+
import { vaultRelative } from './paths.js';
|
|
6
|
+
import { cloneJson, isAbortError, isAbsolutePath } from '../utils.js';
|
|
7
|
+
|
|
8
|
+
function useSettingsDraft(options) {
|
|
9
|
+
const { t, tRef, viewRef, updateView, request, refreshNow, aliveRef, panelRef,
|
|
10
|
+
pushToast, pushErrorToast, onOpen } = options;
|
|
11
|
+
const [settingsOpen, setSettingsOpen] = React.useState(false);
|
|
12
|
+
const [settingsDraft, setSettingsDraft] = React.useState(null);
|
|
13
|
+
const [picking, setPicking] = React.useState(null);
|
|
14
|
+
const [savingSettings, setSavingSettings] = React.useState(false);
|
|
15
|
+
const [settingsTab, setSettingsTab] = React.useState('folders');
|
|
16
|
+
const baseSettingsRef = React.useRef(null);
|
|
17
|
+
const settingsSessionRef = React.useRef(0);
|
|
18
|
+
const draftRef = React.useRef(settingsDraft);
|
|
19
|
+
draftRef.current = settingsDraft;
|
|
20
|
+
const session = settingsSessionRef.current;
|
|
21
|
+
|
|
22
|
+
function scrollSettingsToBudget() {
|
|
23
|
+
setTimeout(() => {
|
|
24
|
+
const panel = panelRef.current;
|
|
25
|
+
const row = panel && typeof panel.querySelector === 'function' ? panel.querySelector('[data-sn-ai-budget]') : null;
|
|
26
|
+
if (row && typeof row.scrollIntoView === 'function') row.scrollIntoView({ block: 'center' });
|
|
27
|
+
}, 60);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function openSettings(focus) {
|
|
31
|
+
// 已经打开:不要重建 draft(会丢掉未保存的编辑);只按需滚到 AI 预算。
|
|
32
|
+
if (settingsOpen) {
|
|
33
|
+
if (focus === 'ai') { setSettingsTab('ai'); scrollSettingsToBudget(); }
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const settings = viewRef.current.settings;
|
|
37
|
+
if (!settings) {
|
|
38
|
+
pushToast({ text: t('settings.notReady'), kind: 'error' });
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const draft = cloneJson(settings);
|
|
42
|
+
settingsSessionRef.current += 1;
|
|
43
|
+
baseSettingsRef.current = cloneJson(settings);
|
|
44
|
+
setSettingsTab(focus === 'ai' ? 'ai' : 'folders');
|
|
45
|
+
// 旧 Host 没有 includeSubfolders 时补上当前语义(缺省 = true),保存时整份回传不丢字段。
|
|
46
|
+
if (draft && typeof draft === 'object' && draft.includeSubfolders === undefined) {
|
|
47
|
+
draft.includeSubfolders = settings.includeSubfolders !== false;
|
|
48
|
+
}
|
|
49
|
+
// 旧 Host / 旧 settings.json 没有 AI 预算字段时补齐(默认高),保证控件可编辑、保存不丢。
|
|
50
|
+
if (draft && typeof draft === 'object') {
|
|
51
|
+
const emojis = Array.isArray(draft.emojis) ? draft.emojis : [];
|
|
52
|
+
draft.emojis = emojis.map((emoji) => Object.assign({}, emoji, { ai: readAiBudget(emoji && emoji.ai) }));
|
|
53
|
+
draft.projectAi = readAiBudget(draft.projectAi);
|
|
54
|
+
draft.imageCompression = readImageCompression(draft.imageCompression);
|
|
55
|
+
}
|
|
56
|
+
setSettingsDraft(draft);
|
|
57
|
+
setSettingsOpen(true);
|
|
58
|
+
onOpen();
|
|
59
|
+
// 预算提示进来时,滚到第一个「AI 预算」控件,省得用户自己找(focus === 'ai')。
|
|
60
|
+
if (focus === 'ai') scrollSettingsToBudget();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function closeSettings() {
|
|
64
|
+
if (savingSettings) return;
|
|
65
|
+
settingsSessionRef.current += 1;
|
|
66
|
+
setSettingsOpen(false);
|
|
67
|
+
setSettingsDraft(null);
|
|
68
|
+
setPicking(null);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function patchDraft(patch) {
|
|
72
|
+
setSettingsDraft((current) => {
|
|
73
|
+
if (!current) return current;
|
|
74
|
+
const next = Object.assign({}, current, patch);
|
|
75
|
+
const root = next.vaultPath || '';
|
|
76
|
+
if (patch.vaultPath !== undefined && patch.vaultPath !== current.vaultPath) {
|
|
77
|
+
['notesDir', 'projectDir', 'attachmentDir'].forEach((key) => { next[key] = vaultRelative(current.vaultPath, current[key]); });
|
|
78
|
+
next.archiveTargets = (current.archiveTargets || []).map((item) => ({ ...item, path: vaultRelative(current.vaultPath, item.path) }));
|
|
79
|
+
next.folderHistory = [];
|
|
80
|
+
}
|
|
81
|
+
next.folderHistory = [...new Set([next.notesDir, next.projectDir, next.attachmentDir,
|
|
82
|
+
...(next.archiveTargets || []).map((item) => item.path), ...(next.folderHistory || [])]
|
|
83
|
+
.filter(Boolean).map((path) => vaultRelative(root, path)).filter((path) => !isAbsolutePath(path)))].slice(0, 40);
|
|
84
|
+
return next;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function patchEmoji(index, patch) {
|
|
89
|
+
setSettingsDraft((current) => {
|
|
90
|
+
if (!current || !Array.isArray(current.emojis)) return current;
|
|
91
|
+
const emojisNext = current.emojis.map((emoji, position) => (
|
|
92
|
+
position === index ? Object.assign({}, emoji, patch) : emoji
|
|
93
|
+
));
|
|
94
|
+
return Object.assign({}, current, { emojis: emojisNext });
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function removeEmoji(index) {
|
|
99
|
+
setSettingsDraft((current) => {
|
|
100
|
+
if (!current || !Array.isArray(current.emojis)) return current;
|
|
101
|
+
return Object.assign({}, current, {
|
|
102
|
+
emojis: current.emojis.filter((emoji, position) => position !== index),
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function addEmoji() {
|
|
108
|
+
setSettingsDraft((current) => {
|
|
109
|
+
if (!current) return current;
|
|
110
|
+
const emojisNext = Array.isArray(current.emojis) ? current.emojis.slice() : [];
|
|
111
|
+
if (emojisNext.length >= 12) return current;
|
|
112
|
+
emojisNext.push({
|
|
113
|
+
id: 'emoji-' + Date.now().toString(36),
|
|
114
|
+
emoji: '🔍',
|
|
115
|
+
label: '',
|
|
116
|
+
prompt: '',
|
|
117
|
+
callout: 'quote',
|
|
118
|
+
ai: readAiBudget(null),
|
|
119
|
+
});
|
|
120
|
+
return Object.assign({}, current, { emojis: emojisNext });
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function removeArchiveTarget(index) {
|
|
125
|
+
setSettingsDraft((current) => {
|
|
126
|
+
if (!current || !Array.isArray(current.archiveTargets)) return current;
|
|
127
|
+
return Object.assign({}, current, {
|
|
128
|
+
archiveTargets: current.archiveTargets.filter((target, position) => position !== index),
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** 系统选择器(pickDirectory):macOS 原生对话框,可直接选 iCloud。 */
|
|
134
|
+
function systemPick(field) {
|
|
135
|
+
if (!settingsDraft || picking !== null) return;
|
|
136
|
+
const ticket = settingsSessionRef.current;
|
|
137
|
+
const vaultPath = settingsDraft.vaultPath;
|
|
138
|
+
const isCurrent = () => aliveRef.current && ticket === settingsSessionRef.current && draftRef.current?.vaultPath === vaultPath;
|
|
139
|
+
setPicking(field);
|
|
140
|
+
return request('pickDirectory', field === 'vaultPath' ? {} : { vaultPath })
|
|
141
|
+
.then((value) => {
|
|
142
|
+
if (!isCurrent()) return null;
|
|
143
|
+
if (value && typeof value.path === 'string' && value.path !== '') {
|
|
144
|
+
patchDraft({ [field]: value.path });
|
|
145
|
+
return value.path;
|
|
146
|
+
}
|
|
147
|
+
return null;
|
|
148
|
+
})
|
|
149
|
+
.catch((error) => {
|
|
150
|
+
if (isCurrent() && !isAbortError(error)) pushErrorToast(error);
|
|
151
|
+
return null;
|
|
152
|
+
})
|
|
153
|
+
.finally(() => {
|
|
154
|
+
if (aliveRef.current && ticket === settingsSessionRef.current) setPicking(null);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function saveSettingsDraft() {
|
|
159
|
+
const draftValue = settingsDraft;
|
|
160
|
+
if (!draftValue || savingSettings) return;
|
|
161
|
+
if (!Array.isArray(draftValue.emojis) || draftValue.emojis.length === 0) {
|
|
162
|
+
pushToast({ text: t('settings.needEmoji'), kind: 'error' });
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
setSavingSettings(true);
|
|
166
|
+
request('saveSettings', { settings: draftValue, expected: baseSettingsRef.current?.configFile?.revision })
|
|
167
|
+
.then((value) => {
|
|
168
|
+
if (!aliveRef.current) return;
|
|
169
|
+
const normalized = value && value.settings ? value.settings : draftValue;
|
|
170
|
+
const configured = Boolean(normalized.vaultPath && normalized.notesDir);
|
|
171
|
+
updateView(Object.assign({}, viewRef.current, { settings: normalized, configured: configured }));
|
|
172
|
+
setSettingsOpen(false);
|
|
173
|
+
setSettingsDraft(null);
|
|
174
|
+
pushToast({ text: tRef.current('toast.settingsSaved'), kind: 'success' });
|
|
175
|
+
if (!configured) {
|
|
176
|
+
pushToast({ text: tRef.current('toast.settingsUnconfigured'), kind: 'info', timeout: 7000 });
|
|
177
|
+
}
|
|
178
|
+
return refreshNow(true);
|
|
179
|
+
})
|
|
180
|
+
.catch((error) => {
|
|
181
|
+
if (aliveRef.current && !isAbortError(error)) pushErrorToast(error);
|
|
182
|
+
})
|
|
183
|
+
.then(() => {
|
|
184
|
+
if (aliveRef.current) setSavingSettings(false);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function acceptConfigSettings(next, action) {
|
|
189
|
+
if (!aliveRef.current || session !== settingsSessionRef.current) return;
|
|
190
|
+
const replace = ['load', 'reload', 'relocate'].includes(action);
|
|
191
|
+
if (replace) {
|
|
192
|
+
settingsSessionRef.current += 1;
|
|
193
|
+
baseSettingsRef.current = cloneJson(next);
|
|
194
|
+
setPicking(null);
|
|
195
|
+
}
|
|
196
|
+
updateView(Object.assign({}, viewRef.current, { settings: next, configured: Boolean(next.vaultPath && next.notesDir) }));
|
|
197
|
+
if (replace) setSettingsDraft(cloneJson(next));
|
|
198
|
+
else setSettingsDraft((current) => current ? Object.assign({}, current, { configFile: next.configFile }) : current);
|
|
199
|
+
refreshNow(true);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return { settingsOpen, settingsDraft, picking, savingSettings, settingsTab, acceptConfigSettings, openSettings, closeSettings,
|
|
203
|
+
patchDraft, patchEmoji, removeEmoji, addEmoji, removeArchiveTarget, systemPick,
|
|
204
|
+
saveSettingsDraft };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export { useSettingsDraft };
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/** 界面样式片段:base;组合顺序由 styles/index.js 固定。 */
|
|
2
|
+
import { SERIF, SANS, INK_TITLE, INK_BODY, INK_COMMENT, INK_MUTED } from './tokens.js';
|
|
3
|
+
|
|
4
|
+
const baseStyles = `
|
|
5
|
+
.SN_panel{--sn-serif:${SERIF};--sn-sans:${SANS};--sn-ink-title:${INK_TITLE};--sn-ink-body:${INK_BODY};--sn-ink-comment:${INK_COMMENT};--sn-ink-muted:${INK_MUTED};--sn-accent:#8B5CF6;position:relative;box-sizing:border-box;display:flex;flex-direction:column;height:100%;min-height:0;overflow:hidden;background:var(--dsw-alias-bg-base,var(--dsw-alias-bg-layer-1,#fff));color:var(--dsw-alias-label-primary,#1f1f1f);font-family:var(--sn-sans);font-size:13px;line-height:1.5}
|
|
6
|
+
.SN_panel *,.SN_panel *::before,.SN_panel *::after,.SN_dragLayer *{box-sizing:border-box}
|
|
7
|
+
.SN_panel button{font-family:inherit}
|
|
8
|
+
.SN_panel button:focus-visible,.SN_panel [tabindex]:focus-visible{outline:2px solid var(--dsw-focus-ring-color,var(--dsw-alias-brand-primary));outline-offset:2px}
|
|
9
|
+
.SN_panel input:focus-visible,.SN_panel textarea:focus-visible,.SN_panel select:focus-visible{outline:none}
|
|
10
|
+
|
|
11
|
+
/* 0.13.9 桌面版窗口拖拽:整个顶栏空白/标题区可拖动 DSH 窗口(Electron app-region),
|
|
12
|
+
右侧操作区(按钮/菜单)显式恢复 no-drag,保证点击、弹菜单不被拖拽吃掉。
|
|
13
|
+
Web GUI 里这些属性会被浏览器忽略,不影响点击。 */
|
|
14
|
+
.SN_head{flex:none;display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:56px;padding:14px 20px 12px 22px;border-bottom:.5px solid var(--dsw-alias-border-l1);-webkit-app-region:drag;app-region:drag}
|
|
15
|
+
.SN_headActions,.SN_headActions *{-webkit-app-region:no-drag;app-region:no-drag}
|
|
16
|
+
[data-platform='darwin'] .SN_head{padding-top:calc(var(--dsh-frame-top-clearance,0px) + 10px)}
|
|
17
|
+
.SN_headMain{min-width:0;flex:1;display:flex;flex-direction:column;gap:2px}
|
|
18
|
+
.SN_titleRow{display:flex;align-items:baseline;gap:10px;min-width:0;overflow:hidden}
|
|
19
|
+
.SN_title{font-family:var(--sn-serif);font-size:18px;font-weight:600;letter-spacing:.02em;line-height:1.35;margin:0;color:var(--dsw-alias-label-primary);white-space:nowrap}
|
|
20
|
+
.SN_count{font-size:11.5px;line-height:1.4;color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums;white-space:nowrap}
|
|
21
|
+
/* 0.13 修正轮:byline 只在顶栏大标题之后(baseline 对齐、不换行、约 11px / opacity .45)。 */
|
|
22
|
+
.SN_headByline{font-family:var(--sn-sans);font-size:11px;font-weight:400;line-height:1.2;letter-spacing:.01em;color:var(--dsw-alias-label-primary);opacity:.45;white-space:nowrap;user-select:none}
|
|
23
|
+
.SN_headPath{font-size:11px;line-height:1.4;color:var(--dsw-alias-label-tertiary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
|
|
24
|
+
.SN_headActions{flex:none;display:flex;align-items:center;gap:2px}
|
|
25
|
+
.SN_iconBtn{width:30px;height:30px;border:0;border-radius:8px;background:transparent;color:var(--dsw-alias-label-secondary);display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;transition:background .12s ease,color .12s ease}
|
|
26
|
+
.SN_iconBtn:hover:not(:disabled){background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05));color:var(--dsw-alias-label-primary)}
|
|
27
|
+
.SN_iconBtn:disabled{opacity:.5;cursor:default}
|
|
28
|
+
.SN_spin{animation:SN_spin 1s linear infinite}
|
|
29
|
+
|
|
30
|
+
.SN_sortWrap{position:relative;display:inline-flex}
|
|
31
|
+
.SN_sortMenu{position:absolute;top:calc(100% + 6px);right:0;z-index:45;width:214px;max-height:min(70vh,420px);overflow-y:auto;display:flex;flex-direction:column;gap:2px;padding:6px;border-radius:10px;background:var(--dsw-alias-bg-layer-2,#fff);border:.5px solid var(--dsw-alias-border-l1);box-shadow:0 10px 30px rgba(0,0,0,.18);animation:SN_toastIn .14s ease;scrollbar-width:thin}
|
|
32
|
+
.SN_sortItem{display:flex;align-items:center;gap:8px;width:100%;border:0;border-radius:7px;background:transparent;padding:7px 8px;cursor:pointer;font:inherit;font-size:12px;line-height:1.45;color:var(--dsw-alias-label-primary);text-align:left;white-space:nowrap}
|
|
33
|
+
.SN_sortItem:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05))}
|
|
34
|
+
.SN_sortItem[data-active='true']{color:var(--dsw-alias-label-primary);font-weight:500}
|
|
35
|
+
.SN_sortCheck{flex:none;width:14px;font-size:11px;color:var(--dsw-alias-brand-primary)}
|
|
36
|
+
/* 0.13.9 日期档位菜单:四档单选(今天/3天/本周/本月)+ 一条「日期截止按真实时间」勾选项。 */
|
|
37
|
+
.SN_menuDivider{flex:none;height:1px;margin:4px 2px;background:var(--dsw-alias-border-l2,rgba(0,0,0,.1))}
|
|
38
|
+
.SN_dateItem{display:flex;align-items:flex-start;gap:8px;width:100%;border:0;border-radius:7px;background:transparent;padding:7px 8px;cursor:pointer;font:inherit;text-align:left;color:var(--dsw-alias-label-primary)}
|
|
39
|
+
.SN_dateItem:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05))}
|
|
40
|
+
.SN_dateItemMain{display:flex;flex-direction:column;gap:1px;min-width:0}
|
|
41
|
+
.SN_dateItemLabel{font-size:12px;font-weight:500;line-height:1.45;white-space:nowrap}
|
|
42
|
+
.SN_dateItemHint{font-size:10.5px;line-height:1.45;color:var(--dsw-alias-label-tertiary);white-space:normal}
|
|
43
|
+
/* 0.14:日期开关与相邻图标等宽,悬停打开范围菜单。 */
|
|
44
|
+
.SN_dateGroup{display:inline-flex;align-items:center}
|
|
45
|
+
.SN_dateGroup::after{content:'';position:absolute;top:100%;height:8px;left:0;right:0}
|
|
46
|
+
.SN_checkBox{flex:none;width:14px;height:14px;margin-top:1px;border:.5px solid var(--dsw-alias-border-l3,rgba(0,0,0,.2));border-radius:4px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;line-height:1;color:#fff;background:transparent}
|
|
47
|
+
.SN_checkBox[data-checked='true']{border-color:var(--dsw-alias-brand-primary);background:var(--dsw-alias-brand-primary);color:var(--dsw-alias-label-primary-foreground,#fff)}
|
|
48
|
+
|
|
49
|
+
.SN_banner{flex:none;display:flex;align-items:center;gap:12px;padding:8px 22px;font-size:12px;line-height:1.5;background:var(--dsw-alias-state-warn-tertiary,rgba(180,71,47,.06));border-bottom:.5px solid var(--dsw-alias-border-l1)}
|
|
50
|
+
.SN_bannerText{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dsw-alias-state-error-primary)}
|
|
51
|
+
.SN_textBtn{flex:none;border:0;background:transparent;color:var(--dsw-alias-brand-primary);font:inherit;font-size:12px;font-weight:500;cursor:pointer;padding:2px 4px;border-radius:6px;white-space:nowrap}
|
|
52
|
+
.SN_textBtn:hover{background:var(--dsw-alias-interactive-bg-hover,rgba(0,0,0,.05))}
|
|
53
|
+
|
|
54
|
+
.SN_body{position:relative;flex:1;min-height:0;display:flex;flex-direction:column}
|
|
55
|
+
.SN_wallWrap{position:relative;flex:1;min-height:0;display:flex;flex-direction:column;container-type:inline-size;container-name:sn-wall}
|
|
56
|
+
.SN_wall{flex:1;min-height:0;overflow-y:auto;display:grid;grid-template-columns:repeat(auto-fill,minmax(248px,1fr));gap:14px;padding:18px 22px 28px;align-content:start;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.18)) transparent}
|
|
57
|
+
.SN_wall::-webkit-scrollbar{width:8px;height:8px}
|
|
58
|
+
.SN_wall::-webkit-scrollbar-thumb{background:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.16));border-radius:4px}
|
|
59
|
+
.SN_wall::-webkit-scrollbar-track{background:transparent}
|
|
60
|
+
.SN_wall .SN_skelCard{height:208px;border-radius:11px;background:var(--dsw-alias-bg-layer-2,#f2f0ec);animation:SN_shimmer 1.6s ease-in-out infinite}
|
|
61
|
+
`;
|
|
62
|
+
|
|
63
|
+
export { baseStyles };
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/** 界面样式片段:capture;组合顺序由 styles/index.js 固定。 */
|
|
2
|
+
import { INK_BODY, INK_COMMENT, INK_MUTED, INK_TITLE, SANS, SERIF } from './tokens.js';
|
|
3
|
+
|
|
4
|
+
const captureStyles = `
|
|
5
|
+
/* 浮岛不占墙的滚动空间;底部留白跟随正文展开后的实际高度。 */
|
|
6
|
+
.SN_wallWrap[data-capture='true'] .SN_wall{padding-bottom:calc(var(--sn-capture-height,92px) + 36px)}
|
|
7
|
+
.SN_wallWrap[data-capture='true'] .SN_center{padding-bottom:calc(var(--sn-capture-height,92px) + 40px)}
|
|
8
|
+
.SN_captureDock{position:absolute;z-index:27;left:0;right:var(--sn-dock-right,0px);bottom:0;padding:22px clamp(12px,3vw,36px) 24px;pointer-events:none;--sn-capture-surface:rgba(255,255,255,.57);--sn-capture-line:rgba(90,80,75,.12)}
|
|
9
|
+
.SN_captureDock::before{content:'';position:absolute;inset:-48px 0 0;background:linear-gradient(to top,#fff 0%,rgba(255,255,255,.94) 26%,rgba(255,255,255,.72) 52%,rgba(255,255,255,0) 100%);pointer-events:none}
|
|
10
|
+
.SN_captureDock[data-card-dragging='true']::before{inset:-190px 0 0;background:linear-gradient(to top,#fff 0%,rgba(255,255,255,.97) 28%,rgba(255,255,255,.78) 66%,rgba(255,255,255,0) 100%)}
|
|
11
|
+
.SN_capture{position:relative;display:flex;align-items:center;gap:12px;max-width:860px;margin:0 auto;padding:10px 12px 10px 14px;border:1px solid rgba(255,255,255,.85);border-radius:34px;background:var(--sn-capture-surface);box-shadow:0 6px 28px rgba(55,42,30,.07),0 1px 3px rgba(55,42,30,.04),inset 0 0 0 .5px rgba(80,70,60,.07);backdrop-filter:blur(24px) saturate(140%);-webkit-backdrop-filter:blur(24px) saturate(140%);pointer-events:auto;transition:border-color .2s,box-shadow .2s}
|
|
12
|
+
.SN_capture:focus-within,.SN_capture[data-dragging='true']{border-color:rgba(139,92,246,.35);box-shadow:0 8px 32px rgba(55,42,30,.08),0 0 0 1px rgba(139,92,246,.28),0 0 0 4px rgba(139,92,246,.04)}
|
|
13
|
+
.SN_capture[data-body='true']{border-radius:26px;align-items:flex-start}
|
|
14
|
+
.SN_captureAttach{display:flex;align-items:center;gap:8px;flex:none;min-width:0;max-width:44%;position:relative}
|
|
15
|
+
.SN_captureAdd,.SN_captureSend{flex:none;width:38px;height:38px;display:inline-flex;align-items:center;justify-content:center;padding:0;border:0;border-radius:50%;cursor:pointer;transition:background .15s,color .15s,opacity .15s}
|
|
16
|
+
.SN_captureAdd{background:rgba(100,90,80,.045);color:var(--dsw-alias-label-secondary,#8a8177)}
|
|
17
|
+
.SN_captureAdd:hover:not(:disabled){background:rgba(139,92,246,.09);color:var(--sn-accent)}
|
|
18
|
+
.SN_captureSend{background:var(--sn-accent);color:white}
|
|
19
|
+
.SN_captureSend:disabled{background:rgba(100,90,80,.08);color:var(--dsw-alias-label-tertiary,#b8b1a9);cursor:default}
|
|
20
|
+
.SN_captureAdd:disabled{opacity:.4;cursor:default}
|
|
21
|
+
.SN_captureFields{flex:1;min-width:0;padding:7px 0}
|
|
22
|
+
.SN_captureTitleRow{display:flex;align-items:center;flex-wrap:wrap;gap:5px 10px;min-width:0}
|
|
23
|
+
.SN_captureTitle{display:block;flex:1 1 auto;min-width:min(160px,100%);max-width:100%;width:var(--sn-title-width,160px);height:24px;resize:none;overflow:hidden;overflow-wrap:anywhere;padding:0;border:0;background:transparent;font:inherit;font-size:15px;line-height:24px;letter-spacing:.015em;color:var(--dsw-alias-label-primary,#2b2620);box-shadow:none}
|
|
24
|
+
.SN_captureTitle::placeholder{color:var(--dsw-alias-label-tertiary,#a39b92);opacity:.8}
|
|
25
|
+
.SN_captureTitleMeasure{position:absolute;visibility:hidden;pointer-events:none;white-space:pre;font-size:15px;line-height:24px;letter-spacing:.015em}
|
|
26
|
+
.SN_capture[data-body='true'] .SN_captureTitle{width:100%;flex:1}
|
|
27
|
+
.SN_captureHint{display:inline-flex;align-items:center;justify-content:flex-end;gap:5px;flex:none;margin-left:auto;text-align:right;font-size:10px;color:var(--dsw-alias-label-tertiary,#a39b92);opacity:.6;white-space:nowrap;user-select:none}
|
|
28
|
+
.SN_captureHint kbd{font:inherit;font-size:9px;border:.5px solid currentColor;border-radius:4px;padding:0 4px;line-height:16px}
|
|
29
|
+
.SN_captureBody{display:block;resize:none;width:100%;height:68px;max-height:160px;overflow-y:auto;margin:10px 0 0;padding:10px 0 0;border:0;border-top:1px solid var(--sn-capture-line);background:transparent;box-shadow:none;font:inherit;font-size:12.5px;line-height:1.75;color:var(--dsw-alias-label-secondary,#8a8177);color:color-mix(in srgb,var(--dsw-alias-label-primary,#2b2620) 62%,transparent);scrollbar-width:thin}
|
|
30
|
+
.SN_captureBody::placeholder{color:inherit;opacity:.55}
|
|
31
|
+
.SN_captureSubmitHint{display:block;margin-top:7px;text-align:right;font-size:10px;line-height:16px;color:var(--dsw-alias-label-tertiary,#a39b92);opacity:.6;user-select:none}
|
|
32
|
+
.SN_captureStack{display:flex;align-items:center;min-width:0;padding:3px;overflow-x:auto;scrollbar-width:none}
|
|
33
|
+
.SN_captureStack::-webkit-scrollbar{display:none}
|
|
34
|
+
.SN_captureThumb{position:relative;flex:none;width:40px;height:40px;margin-left:-27px;border-radius:10px;border:2px solid rgba(255,255,255,.94);background:#eee;transition:margin .22s ease,transform .22s ease;isolation:isolate}
|
|
35
|
+
.SN_captureThumb:first-child{margin-left:0}
|
|
36
|
+
.SN_captureAttach[data-expanded='true'] .SN_captureThumb{margin-left:6px}
|
|
37
|
+
.SN_captureAttach[data-expanded='true'] .SN_captureThumb:first-child{margin-left:0}
|
|
38
|
+
.SN_captureThumb img{display:block;width:100%;height:100%;object-fit:cover;border-radius:8px}
|
|
39
|
+
.SN_captureThumb:focus-visible{outline:2px solid var(--sn-accent);outline-offset:1px}
|
|
40
|
+
.SN_captureRemove{position:absolute;z-index:1;top:-4px;right:-4px;width:17px;height:17px;border:1px solid var(--sn-capture-line);border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0;background:var(--dsw-alias-bg-layer-2,#fff);color:var(--dsw-alias-label-secondary,#777);opacity:0;cursor:pointer}
|
|
41
|
+
.SN_captureAttach[data-expanded='true'] .SN_captureRemove,.SN_captureRemove:focus-visible{opacity:1}
|
|
42
|
+
.SN_capturePreview{position:absolute;bottom:calc(100% + 18px);left:0;max-width:min(260px,65vw);width:max-content;max-height:220px;padding:6px;border:1px solid var(--sn-capture-line);border-radius:16px;background:var(--dsw-alias-bg-layer-2,#fff);box-shadow:0 10px 34px rgba(35,25,15,.15);pointer-events:none;animation:SN_toastIn .14s ease}
|
|
43
|
+
.SN_capturePreview img{display:block;max-width:min(246px,60vw);max-height:204px;width:auto;height:auto;object-fit:contain;border-radius:10px}
|
|
44
|
+
.SN_imageSettingToggle{display:flex;align-items:center;gap:8px;font-size:12.5px;cursor:pointer}
|
|
45
|
+
.SN_imageSettingToggle input{accent-color:var(--sn-accent)}
|
|
46
|
+
.SN_imageSettingNumbers{display:grid;grid-template-columns:1fr 1fr;gap:14px}
|
|
47
|
+
.SN_captureStatus{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
|
|
48
|
+
.SN_captureDock[data-card-dragging='true'] .SN_capture{visibility:hidden;pointer-events:none}
|
|
49
|
+
.SN_captureDock[data-card-dragging='true'] .SN_capture *{pointer-events:none}
|
|
50
|
+
.SN_captureDock::after{content:'';position:absolute;inset:-64px 0 0;opacity:0;background:linear-gradient(to top,color-mix(in srgb,var(--sn-drop-color,#e45b64) 28%,transparent),transparent);pointer-events:none;transition:opacity .22s ease}
|
|
51
|
+
.SN_captureDock[data-drop='archive']{--sn-drop-color:#37856b}
|
|
52
|
+
.SN_captureDock[data-drop='project']{--sn-drop-color:#5477bb}
|
|
53
|
+
.SN_captureDock[data-drop='delete']{--sn-drop-color:#c94f55}
|
|
54
|
+
.SN_captureDock[data-drop='archive']::after,.SN_captureDock[data-drop='project']::after,.SN_captureDock[data-drop='delete']::after{opacity:1}
|
|
55
|
+
.SN_dropActions{position:absolute;z-index:2;left:clamp(12px,3vw,36px);right:clamp(12px,3vw,36px);bottom:24px;max-width:860px;margin:0 auto;pointer-events:auto}
|
|
56
|
+
.SN_dropHint{text-align:center;margin:0 0 10px;font-size:11px;line-height:1.5;color:var(--dsw-alias-label-secondary,#6f6861);font-weight:500;text-shadow:0 1px 4px rgba(255,255,255,.95)}
|
|
57
|
+
.SN_dropRow{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border:1px solid var(--sn-capture-line);border-radius:22px;background:var(--sn-capture-surface);backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);overflow:visible;box-shadow:0 6px 28px rgba(55,42,30,.07)}
|
|
58
|
+
.SN_dropItem{position:relative;min-width:0;min-height:70px;padding:12px 8px;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:8px;color:var(--dsw-alias-label-secondary,#7e756c);transition:background .2s,color .2s;user-select:none}
|
|
59
|
+
.SN_dropItem+.SN_dropItem::before{content:'';position:absolute;left:0;top:22%;bottom:22%;width:1px;background:var(--sn-capture-line)}
|
|
60
|
+
.SN_dropItem[aria-disabled='true']{opacity:.45}
|
|
61
|
+
.SN_dropItem[data-active='true'][data-action='archive']{color:#286c55;background:rgba(55,133,107,.14)}
|
|
62
|
+
.SN_dropItem[data-active='true'][data-action='project']{color:#4565a3;background:rgba(84,119,187,.14)}
|
|
63
|
+
.SN_dropItem[data-active='true'][data-action='delete']{color:#b93d45;background:rgba(201,79,85,.14)}
|
|
64
|
+
.SN_dropLabel{display:flex;flex-direction:column;gap:3px;font-size:13px;line-height:1.3}
|
|
65
|
+
.SN_dropTargets{position:absolute;left:50%;transform:translateX(-50%);bottom:calc(100% + 8px);z-index:3;box-sizing:border-box;width:min(280px,100%);max-height:180px;padding:6px;display:flex;flex-direction:column;gap:4px;overflow:auto;border:1px solid var(--sn-capture-line);border-radius:12px;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:0 7px 22px rgba(35,45,38,.14);pointer-events:auto}
|
|
66
|
+
.SN_dropItem[data-action='archive']::after{content:'';position:absolute;left:0;right:0;bottom:100%;height:9px}
|
|
67
|
+
.SN_dropTarget{flex:none;width:100%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left;border:0;border-radius:7px;padding:9px 10px;background:transparent;color:#286c55;font:inherit;font-size:12px;cursor:pointer}
|
|
68
|
+
.SN_dropTarget:hover,.SN_dropTarget:focus-visible{background:rgba(55,133,107,.12);outline:none}
|
|
69
|
+
.SN_dropTarget[data-active='true']{background:#37856b;color:#fff;border-color:#37856b}
|
|
70
|
+
.SN_dropItem[data-parked='true']>svg,.SN_dropItem[data-parked='true']>.SN_dropLabel{visibility:hidden}
|
|
71
|
+
.SN_dragLayer{--sn-serif:${SERIF};--sn-sans:${SANS};--sn-ink-title:${INK_TITLE};--sn-ink-body:${INK_BODY};--sn-ink-comment:${INK_COMMENT};--sn-ink-muted:${INK_MUTED};--sn-accent:#8B5CF6;position:fixed;left:0;top:0;z-index:10000;transform-origin:top left;will-change:transform;contain:layout style;font-family:var(--sn-sans);font-size:13px;line-height:1.5;pointer-events:none}
|
|
72
|
+
.SN_dragLayer::before{content:'';position:absolute;inset:0;border-radius:4px;box-shadow:0 8px 18px rgba(30,25,20,.22),0 2px 5px rgba(30,25,20,.12)}
|
|
73
|
+
.SN_dragLayer *{pointer-events:none!important}
|
|
74
|
+
.SN_dragPreview{position:absolute;left:0;top:0;z-index:1;transform-origin:top left;pointer-events:none}
|
|
75
|
+
.SN_dragPreview .SN_card{height:100%;cursor:default;transform:none;transition:none}
|
|
76
|
+
.SN_dragFollow{position:absolute;left:50%;transform:translateX(-50%);bottom:calc(100% + 8px);z-index:2;box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;gap:7px;width:max-content;max-width:var(--sn-drag-hint-width,270px);padding:8px 12px;border-radius:7px;background:#514c47;color:#fff;box-shadow:0 4px 18px rgba(0,0,0,.2);font-size:12px;font-weight:600;line-height:1.3;pointer-events:none;white-space:nowrap}
|
|
77
|
+
.SN_dragFollow span{min-width:0;overflow:hidden;text-overflow:ellipsis}
|
|
78
|
+
.SN_dragFollow svg{display:block;flex:none}
|
|
79
|
+
.SN_dragFollow[data-action='archive']{background:#286c55}
|
|
80
|
+
.SN_dragFollow[data-action='project']{background:#4565a3}
|
|
81
|
+
.SN_dragFollow[data-action='delete']{background:#b93d45}
|
|
82
|
+
.SN_dragLayer[data-settling='true'] .SN_dragFollow,.SN_dragLayer[data-parked='true'] .SN_dragFollow{visibility:hidden}
|
|
83
|
+
.SN_backTop{position:absolute;z-index:2;top:-22px;left:50%;transform:translateX(-50%);width:32px;height:32px;border:1px solid var(--sn-capture-line);border-radius:50%;background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#7e756c);box-shadow:0 3px 14px rgba(55,42,30,.08);display:grid;place-items:center;pointer-events:auto;cursor:pointer}
|
|
84
|
+
.SN_backTop:hover{color:var(--sn-accent);border-color:var(--sn-accent)}
|
|
85
|
+
body[data-ds-dark-theme] .SN_captureDock{--sn-capture-surface:rgba(43,40,47,.54);--sn-capture-line:rgba(255,255,255,.12)}
|
|
86
|
+
body[data-ds-dark-theme] .SN_captureDock::before{background:linear-gradient(to top,var(--dsw-alias-bg-base,#18181b) 0%,color-mix(in srgb,var(--dsw-alias-bg-base,#18181b) 94%,transparent) 26%,color-mix(in srgb,var(--dsw-alias-bg-base,#18181b) 72%,transparent) 52%,transparent 100%)}
|
|
87
|
+
body[data-ds-dark-theme] .SN_capture{border-color:rgba(255,255,255,.12);box-shadow:0 8px 32px rgba(0,0,0,.18),inset 0 1px 0 rgba(255,255,255,.045)}
|
|
88
|
+
body[data-ds-dark-theme] .SN_capture:focus-within,body[data-ds-dark-theme] .SN_capture[data-dragging='true']{border-color:rgba(167,139,250,.45);box-shadow:0 8px 32px rgba(0,0,0,.18),0 0 0 1px rgba(167,139,250,.35),0 0 0 4px rgba(167,139,250,.05)}
|
|
89
|
+
body[data-ds-dark-theme] .SN_captureAdd,body[data-ds-dark-theme] .SN_captureSend:disabled{background:rgba(255,255,255,.07)}
|
|
90
|
+
body[data-ds-dark-theme] .SN_captureThumb{border-color:#3c3941;background:#35323b}
|
|
91
|
+
@container sn-wall (max-width:560px){.SN_captureHint{flex-basis:100%;margin-top:1px}.SN_capture{gap:8px;padding-left:10px}.SN_captureTitle{font-size:14px}.SN_captureAttach{max-width:40%}}
|
|
92
|
+
`;
|
|
93
|
+
|
|
94
|
+
export { captureStyles };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** 按原有层叠顺序组合样式,并返回卸载清理函数。 */
|
|
2
|
+
import { baseStyles } from './base.js';
|
|
3
|
+
import { captureStyles } from './capture.js';
|
|
4
|
+
import { overridesStyles } from './overrides.js';
|
|
5
|
+
import { readerStyles } from './reader.js';
|
|
6
|
+
import { settingsStyles } from './settings.js';
|
|
7
|
+
import { wallStyles } from './wall.js';
|
|
8
|
+
|
|
9
|
+
const CSS = [baseStyles, captureStyles, wallStyles, readerStyles, settingsStyles, overridesStyles].join('\n');
|
|
10
|
+
|
|
11
|
+
function injectStyles() {
|
|
12
|
+
if (typeof document === 'undefined' || !document.head) return undefined;
|
|
13
|
+
// HMR 重挂时清掉上一位实例留下的样式,避免重复 tag 叠加。
|
|
14
|
+
const stale = document.querySelector('style[data-plugin="sticky-notes"]');
|
|
15
|
+
if (stale && stale.parentNode) stale.parentNode.removeChild(stale);
|
|
16
|
+
const tag = document.createElement('style');
|
|
17
|
+
tag.dataset.plugin = 'sticky-notes';
|
|
18
|
+
tag.dataset.pluginCss = 'dsh-obsidian-memo/client.css';
|
|
19
|
+
tag.textContent = CSS;
|
|
20
|
+
document.head.appendChild(tag);
|
|
21
|
+
return () => {
|
|
22
|
+
if (tag.parentNode) tag.parentNode.removeChild(tag);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export { injectStyles };
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/** 界面样式片段:overrides;组合顺序由 styles/index.js 固定。 */
|
|
2
|
+
import { INK_BODY_DARK, INK_COMMENT_DARK, INK_MUTED_DARK, INK_TITLE_DARK } from './tokens.js';
|
|
3
|
+
|
|
4
|
+
const overridesStyles = `
|
|
5
|
+
/* ── 0.13 卡片:缩略图贴底 / 同色渐变蒙版 / AI emoji 平铺操作区 ── */
|
|
6
|
+
.SN_cardTitle{flex:none}
|
|
7
|
+
/* ── 有图卡片:标题 3 行、摘要 1 行(line-height 1.5)、评论 18px、64px 缩略图贴底左侧(下方再留 6px),208px 预算 ≈ 206.9 ── */
|
|
8
|
+
.SN_card[data-images='true'] .SN_cardClip{padding:10px 15px;gap:2px}
|
|
9
|
+
.SN_cardExcerpt[data-compact='true']{-webkit-line-clamp:1;line-height:1.5}
|
|
10
|
+
.SN_card[data-images='true'] .SN_cardComments{max-height:18px;margin-top:0}
|
|
11
|
+
.SN_card[data-images='true'] .SN_cCommentMore{display:none}
|
|
12
|
+
.SN_cardImages{flex:none;display:flex;align-items:center;gap:6px;min-height:64px;overflow:hidden;margin-top:auto;margin-bottom:6px;align-self:flex-start;transition:opacity .12s ease}
|
|
13
|
+
/* 0.13.4:卡片操作菜单出现(= 悬停/聚焦卡片)且这张卡有图时,统一隐藏图片预览;
|
|
14
|
+
不再区分鼠标是否停在 emoji 行上,也移除了旧的同色渐变蒙版。 */
|
|
15
|
+
.SN_card[data-menu='true'] .SN_cardImages{opacity:0;pointer-events:none}
|
|
16
|
+
.SN_thumb{position:relative;flex:none;width:64px;height:64px;border-radius:7px;overflow:hidden;background:rgba(255,255,255,.42)}
|
|
17
|
+
.SN_thumbImg{width:100%;height:100%;object-fit:cover;display:block}
|
|
18
|
+
.SN_thumbFallback{position:absolute;inset:0;background:linear-gradient(135deg,rgba(255,255,255,.5),rgba(120,100,70,.08));animation:SN_shimmer 1.8s ease-in-out infinite}
|
|
19
|
+
.SN_thumbFallback[data-failed='true']{animation:none;opacity:.6}
|
|
20
|
+
.SN_moreImages{flex:none;font-size:10.5px;line-height:1.4;letter-spacing:.02em;color:var(--sn-ink-muted);background:rgba(255,255,255,.55);border-radius:999px;padding:1px 6px;white-space:nowrap}
|
|
21
|
+
/* AI emoji 平铺:每枚 27×27 方形按钮只画 emoji 字形;hover / 键盘 focus 时在按钮上方浮出 label 小标签。 */
|
|
22
|
+
.SN_aiRow{display:flex;flex-wrap:wrap;align-items:center;gap:4px}
|
|
23
|
+
.SN_aiBtn{position:relative;width:27px;height:27px;flex:none;border:.5px solid rgba(80,62,36,.16);border-radius:9px;background:rgba(255,255,255,.72);color:var(--sn-ink-title);font:inherit;font-size:14px;line-height:1;display:inline-flex;align-items:center;justify-content:center;padding:0;cursor:pointer;transition:background .12s ease,transform .12s ease}
|
|
24
|
+
.SN_aiBtn:hover:not(:disabled){background:#fff;transform:translateY(-1px)}
|
|
25
|
+
.SN_aiBtn:disabled{opacity:.55;cursor:default}
|
|
26
|
+
.SN_aiEmoji{font-size:14px;line-height:1;pointer-events:none}
|
|
27
|
+
.SN_aiLabel{position:absolute;left:50%;bottom:calc(100% + 5px);transform:translateX(-50%);z-index:34;padding:2px 7px;border-radius:6px;background:rgba(43,38,32,.92);color:#fff;font-size:10.5px;font-weight:400;line-height:1.4;letter-spacing:.01em;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s ease}
|
|
28
|
+
.SN_aiBtn:hover .SN_aiLabel,.SN_aiBtn:focus-visible .SN_aiLabel{opacity:1}
|
|
29
|
+
.SN_aiEmpty{font-size:10.5px;line-height:1.4;color:var(--sn-ink-muted)}
|
|
30
|
+
.SN_actionDivider{height:1px;margin:1px 2px;background:linear-gradient(to right,rgba(90,72,45,.18),rgba(90,72,45,0))}
|
|
31
|
+
|
|
32
|
+
/* ── 0.13 抽屉:锁定按钮 / 底部固定评论区 ── */
|
|
33
|
+
.SN_noteDrawerHeadActions{flex:none;display:flex;align-items:center;gap:2px}
|
|
34
|
+
.SN_noteDrawerComments{flex:none;display:flex;flex-direction:column;min-height:96px;max-height:42%;border-top:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1,#fff)}
|
|
35
|
+
.SN_noteDrawerCommentsHead{flex:none;display:flex;align-items:baseline;justify-content:space-between;gap:10px;padding:10px 18px 6px}
|
|
36
|
+
.SN_noteDrawerCommentsBody{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:10px;padding:2px 18px 14px;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.18)) transparent}
|
|
37
|
+
.SN_noteDrawerCommentsBody::-webkit-scrollbar{width:8px}
|
|
38
|
+
.SN_noteDrawerCommentsBody::-webkit-scrollbar-thumb{background:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.16));border-radius:4px}
|
|
39
|
+
.SN_commentEmpty{padding:0 18px 14px;margin:0}
|
|
40
|
+
|
|
41
|
+
/* ── 0.13 面板锁:锁定 = SN_body 内联双栏,抽屉普通 flex 子项 ── */
|
|
42
|
+
.SN_body[data-pinned='true']{flex-direction:row}
|
|
43
|
+
.SN_body[data-pinned='true'] .SN_wallWrap{flex:1;min-width:0}
|
|
44
|
+
.SN_noteDrawer[data-pinned='true']{position:relative;flex:0 0 auto;height:100%;box-shadow:none;animation:none;border-left:.5px solid var(--dsw-alias-border-l1)}
|
|
45
|
+
/* 极窄窗口拖卡片时仍给操作栏留出空间,结束拖拽后恢复原面板宽度。 */
|
|
46
|
+
|
|
47
|
+
/* ── 0.13 统一 icon 选中样式(§7.8):浅紫半透明底 + 紫色图标(--sn-accent) ── */
|
|
48
|
+
.SN_iconBtn[data-active='true']{color:var(--sn-accent);background:rgba(139,92,246,.10);background:color-mix(in srgb,var(--sn-accent) 10%,transparent)}
|
|
49
|
+
.SN_iconBtn[data-active='true']:hover:not(:disabled){color:var(--sn-accent);background:rgba(139,92,246,.14);background:color-mix(in srgb,var(--sn-accent) 14%,transparent)}
|
|
50
|
+
|
|
51
|
+
/* ── 0.13 抽屉操作条(§7.3.2):header 下方一行;左=AI emoji,右=同排线图标 ── */
|
|
52
|
+
.SN_drawerActions{flex:none;display:flex;align-items:flex-start;justify-content:space-between;gap:10px;row-gap:6px;flex-wrap:wrap;min-width:0;padding:8px 18px;border-bottom:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-1,#fff)}
|
|
53
|
+
.SN_drawerActionLeft{display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-width:0;flex:1}
|
|
54
|
+
.SN_drawerActionRight{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex:none;position:relative;margin-left:auto}
|
|
55
|
+
.SN_drawerActionTop{display:flex;align-items:center;gap:4px;flex-wrap:nowrap}
|
|
56
|
+
.SN_drawerActionBtn{position:relative;display:inline-flex;align-items:center;justify-content:center;flex:none;width:27px;height:27px;padding:0;border:.5px solid var(--dsw-alias-border-l3,rgba(80,62,36,.16));border-radius:8px;background:var(--dsw-alias-bg-layer-2,#f9f7f3);color:var(--dsw-alias-label-secondary,#817970);cursor:pointer;transition:background .12s ease,color .12s ease}
|
|
57
|
+
.SN_drawerActionBtn svg{display:block;pointer-events:none}
|
|
58
|
+
.SN_drawerActionBtn:hover:not(:disabled){background:color-mix(in srgb,var(--dsw-alias-label-primary,#2b2620) 8%,var(--dsw-alias-bg-layer-2,#f9f7f3));color:var(--dsw-alias-label-primary,#2b2620)}
|
|
59
|
+
.SN_drawerActionBtn:disabled{opacity:.45;cursor:default}
|
|
60
|
+
.SN_drawerActionBtn:hover:not(:disabled) .SN_aiLabel,.SN_drawerActionBtn:focus-visible .SN_aiLabel{opacity:1}
|
|
61
|
+
.SN_drawerActionBtn:last-of-type .SN_aiLabel{left:auto;right:0;transform:none}
|
|
62
|
+
.SN_drawerDeleteBtn{color:#b77979;border-color:color-mix(in srgb,#b77979 28%,transparent);background:color-mix(in srgb,#b77979 5%,transparent)}
|
|
63
|
+
.SN_drawerDeleteBtn:hover:not(:disabled){color:#b76363;background:color-mix(in srgb,#b77979 12%,transparent)}
|
|
64
|
+
body[data-ds-dark-theme] .SN_drawerDeleteBtn{color:#d09b9b}
|
|
65
|
+
body[data-ds-dark-theme] .SN_drawerDeleteBtn:hover:not(:disabled){color:#e3b3b3}
|
|
66
|
+
.SN_drawerMenu{position:absolute;top:calc(100% + 6px);right:0;z-index:46;width:214px;max-height:220px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;padding:6px;border-radius:10px;background:var(--dsw-alias-bg-layer-2,#fff);border:.5px solid var(--dsw-alias-border-l1);box-shadow:0 10px 30px rgba(0,0,0,.18);animation:SN_toastIn .14s ease;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.18)) transparent}
|
|
67
|
+
|
|
68
|
+
@keyframes SN_fadeIn{from{opacity:0}to{opacity:1}}
|
|
69
|
+
@keyframes SN_toastIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
|
|
70
|
+
@keyframes SN_slideIn{from{opacity:.4;transform:translateX(28px)}to{opacity:1;transform:none}}
|
|
71
|
+
@keyframes SN_pulse{0%,100%{opacity:.35;transform:scale(.86)}50%{opacity:1;transform:scale(1.1)}}
|
|
72
|
+
@keyframes SN_spin{to{transform:rotate(360deg)}}
|
|
73
|
+
@keyframes SN_shimmer{0%{opacity:.5}50%{opacity:.9}100%{opacity:.5}}
|
|
74
|
+
|
|
75
|
+
/* ── 深色主题(body[data-ds-dark-theme]):深色纸 + 提亮墨色 + 半透明白底小块 ── */
|
|
76
|
+
body[data-ds-dark-theme] .SN_panel,body[data-ds-dark-theme] .SN_dragLayer{--sn-ink-title:${INK_TITLE_DARK};--sn-ink-body:${INK_BODY_DARK};--sn-ink-comment:${INK_COMMENT_DARK};--sn-ink-muted:${INK_MUTED_DARK};--sn-accent:#A78BFA}
|
|
77
|
+
body[data-ds-dark-theme] .SN_cardClip{background:var(--sn-card-bg-dark,var(--sn-card-bg))}
|
|
78
|
+
body[data-ds-dark-theme] .SN_card{box-shadow:0 1px 2px rgba(0,0,0,.45),0 0 0 .5px rgba(0,0,0,.55)}
|
|
79
|
+
body[data-ds-dark-theme] .SN_card:hover{box-shadow:0 6px 18px rgba(0,0,0,.5),0 0 0 .5px rgba(0,0,0,.6)}
|
|
80
|
+
body[data-ds-dark-theme] .SN_card:focus-visible{box-shadow:0 0 0 2px var(--dsw-focus-ring-color,var(--dsw-alias-brand-primary)),0 8px 22px rgba(0,0,0,.55)}
|
|
81
|
+
body[data-ds-dark-theme] .SN_card[data-dragging='true']{box-shadow:none}
|
|
82
|
+
body[data-ds-dark-theme] .SN_card,body[data-ds-dark-theme] .SN_noteDrawer{--sn-note-bg:var(--sn-card-bg-dark,var(--sn-card-bg));--sn-tag-ink:var(--sn-card-bg);--sn-ink-title:${INK_TITLE_DARK}}
|
|
83
|
+
body[data-ds-dark-theme] .SN_captureDock[data-card-dragging='true']::before{background:linear-gradient(to top,var(--dsw-alias-bg-base,#18181b) 0%,color-mix(in srgb,var(--dsw-alias-bg-base,#18181b) 97%,transparent) 32%,color-mix(in srgb,var(--dsw-alias-bg-base,#18181b) 82%,transparent) 68%,transparent 100%)}
|
|
84
|
+
body[data-ds-dark-theme] .SN_dropItem[data-active='true']{color:var(--dsw-alias-label-primary,#eee)}
|
|
85
|
+
body[data-ds-dark-theme] .SN_dropTarget{background:#292d2b;color:#92d5b8}
|
|
86
|
+
body[data-ds-dark-theme] .SN_dropTarget[data-active='true']{background:#37856b;color:#fff}
|
|
87
|
+
body[data-ds-dark-theme] .SN_mini{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.15)}
|
|
88
|
+
body[data-ds-dark-theme] .SN_mini:hover:not(:disabled){background:rgba(255,255,255,.16)}
|
|
89
|
+
body[data-ds-dark-theme] .SN_obsidianBtn:hover:not(:disabled){background:rgba(167,139,250,.20)}
|
|
90
|
+
body[data-ds-dark-theme] .SN_cardActions{background:linear-gradient(to top,var(--sn-card-bg-dark) 34%,rgba(0,0,0,0))}
|
|
91
|
+
body[data-ds-dark-theme] .SN_cardActions[data-visible='true']{background:linear-gradient(to top,var(--sn-card-bg-dark) 58%,rgba(0,0,0,0))}
|
|
92
|
+
body[data-ds-dark-theme] .SN_toast,body[data-ds-dark-theme] .SN_sortMenu{box-shadow:0 10px 30px rgba(0,0,0,.5)}
|
|
93
|
+
body[data-ds-dark-theme] .SN_noteDrawer{box-shadow:-10px 0 34px rgba(0,0,0,.55)}
|
|
94
|
+
body[data-ds-dark-theme] .SN_drawer{box-shadow:-12px 0 44px rgba(0,0,0,.5)}
|
|
95
|
+
body[data-ds-dark-theme] .SN_dialog{box-shadow:0 18px 60px rgba(0,0,0,.6)}
|
|
96
|
+
|
|
97
|
+
/* ── 0.13 深色覆盖:同色蒙版用 darkColor,卡内小图/小块改半透明白 ── */
|
|
98
|
+
body[data-ds-dark-theme] .SN_thumb{background:rgba(255,255,255,.06)}
|
|
99
|
+
body[data-ds-dark-theme] .SN_thumbFallback{background:linear-gradient(135deg,rgba(255,255,255,.10),rgba(255,255,255,.03))}
|
|
100
|
+
body[data-ds-dark-theme] .SN_moreImages{background:rgba(255,255,255,.10)}
|
|
101
|
+
body[data-ds-dark-theme] .SN_aiBtn{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.15)}
|
|
102
|
+
body[data-ds-dark-theme] .SN_aiBtn:hover:not(:disabled){background:rgba(255,255,255,.16)}
|
|
103
|
+
body[data-ds-dark-theme] .SN_aiLabel{background:rgba(250,247,240,.96);color:#2b2620}
|
|
104
|
+
body[data-ds-dark-theme] .SN_actionDivider{background:linear-gradient(to right,rgba(255,255,255,.16),rgba(255,255,255,0))}
|
|
105
|
+
body[data-ds-dark-theme] .SN_noteDrawerComments{background:var(--dsw-alias-bg-layer-2,#f2f0ec)}
|
|
106
|
+
/* 暗色下统一 icon 选中:背景 14%、图标 #A78BFA */
|
|
107
|
+
body[data-ds-dark-theme] .SN_iconBtn[data-active='true']{color:var(--sn-accent);background:rgba(167,139,250,.14);background:color-mix(in srgb,var(--sn-accent) 14%,transparent)}
|
|
108
|
+
body[data-ds-dark-theme] .SN_iconBtn[data-active='true']:hover:not(:disabled){color:var(--sn-accent);background:rgba(167,139,250,.20);background:color-mix(in srgb,var(--sn-accent) 20%,transparent)}
|
|
109
|
+
body[data-ds-dark-theme] .SN_drawerMenu{box-shadow:0 10px 30px rgba(0,0,0,.5)}
|
|
110
|
+
|
|
111
|
+
@media (prefers-reduced-motion:reduce){
|
|
112
|
+
.SN_panel *,.SN_panel *::before,.SN_panel *::after{animation-duration:.001ms!important;transition-duration:.001ms!important}
|
|
113
|
+
}
|
|
114
|
+
`;
|
|
115
|
+
|
|
116
|
+
export { overridesStyles };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** 界面样式片段:reader;组合顺序由 styles/index.js 固定。 */
|
|
2
|
+
import { DEFAULT_NOTE_COLOR } from './tokens.js';
|
|
3
|
+
|
|
4
|
+
const readerStyles = `
|
|
5
|
+
/* ── 右侧便签抽屉(查看 / 编辑) ── */
|
|
6
|
+
.SN_noteDrawerLayer{position:absolute;inset:0;z-index:30;pointer-events:none;display:flex;justify-content:flex-end}
|
|
7
|
+
.SN_noteDrawer{--sn-note-bg:var(--sn-card-bg,${DEFAULT_NOTE_COLOR});--sn-tag-ink:var(--sn-card-bg-dark,#2C2721);pointer-events:auto;position:relative;width:34%;min-width:min(340px,100%);max-width:min(620px,100%);height:100%;display:flex;flex-direction:column;min-height:0;background:var(--dsw-alias-bg-layer-1,#fff);border-left:.5px solid var(--dsw-alias-border-l1);box-shadow:-10px 0 30px rgba(0,0,0,.12);animation:SN_slideIn .18s ease}
|
|
8
|
+
.SN_noteDrawerHandle{position:absolute;left:0;top:0;bottom:0;width:8px;cursor:col-resize;z-index:3;touch-action:none}
|
|
9
|
+
.SN_noteDrawerHandle::after{content:'';position:absolute;left:3px;top:0;bottom:0;width:2px;background:transparent;transition:background .12s ease}
|
|
10
|
+
.SN_noteDrawerHandle:hover::after,.SN_noteDrawerHandle[data-resizing='true']::after{background:var(--dsw-alias-brand-primary)}
|
|
11
|
+
.SN_panel[data-resizing='true'],.SN_panel[data-resizing='true'] *{user-select:none!important;cursor:col-resize!important}
|
|
12
|
+
.SN_noteDrawerHead{flex:none;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:18px 18px 12px;border-bottom:.5px solid var(--dsw-alias-border-l1)}
|
|
13
|
+
.SN_noteDrawerHeadMain{min-width:0;flex:1;display:flex;flex-direction:column;gap:5px}
|
|
14
|
+
.SN_noteDrawerTitle{margin:0;font-family:var(--sn-serif);font-size:18px;font-weight:600;line-height:1.35;color:var(--dsw-alias-label-primary);word-break:break-word}
|
|
15
|
+
/* 编辑态标题:多行 textarea,完整换行显示(不横向滚动);高度随内容自适应(JS 兜底 + field-sizing)。 */
|
|
16
|
+
.SN_titleEditor{display:block;width:100%;min-width:0;min-height:24px;max-height:132px;border:0;border-bottom:1px solid var(--dsw-alias-border-l2);padding:2px 0;margin:0;background:transparent;color:var(--dsw-alias-label-primary);font:inherit;font-family:var(--sn-serif);font-size:18px;font-weight:600;line-height:1.35;outline:none;resize:none;overflow:hidden;white-space:pre-wrap;word-break:break-word;field-sizing:content}
|
|
17
|
+
.SN_noteDrawerMeta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:11px;line-height:1.4;color:var(--dsw-alias-label-tertiary)}
|
|
18
|
+
.SN_noteDrawerTag{flex:none;max-width:100%}
|
|
19
|
+
.SN_noteDrawerBody{flex:1;min-height:0;overflow-y:auto;padding:18px 18px 40px;scrollbar-width:thin;scrollbar-color:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.18)) transparent}
|
|
20
|
+
.SN_noteDrawerBody::-webkit-scrollbar{width:8px}
|
|
21
|
+
.SN_noteDrawerBody::-webkit-scrollbar-thumb{background:var(--dsw-alias-scrollbar-bg-l2,rgba(0,0,0,.16));border-radius:4px}
|
|
22
|
+
.SN_noteViewHint{margin:8px 0;font-size:12.5px;line-height:1.5;color:var(--dsw-alias-label-tertiary)}
|
|
23
|
+
.SN_noteViewError{display:flex;align-items:center;gap:12px;margin-bottom:14px;font-size:12.5px;color:var(--dsw-alias-state-error-primary)}
|
|
24
|
+
.SN_noteViewEmpty{margin:0 0 14px;font-size:13px;color:var(--dsw-alias-label-tertiary)}
|
|
25
|
+
.SN_noteViewSection{margin:0 0 2px;font-family:var(--sn-serif);font-size:14px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary)}
|
|
26
|
+
.SN_noteEdit{flex:1;min-height:0;display:flex;flex-direction:column}
|
|
27
|
+
.SN_noteEditor{flex:1;min-height:0;width:100%;padding:16px 18px;border:0;resize:none;outline:none;background:var(--dsw-alias-bg-base,#fff);color:var(--dsw-alias-label-primary);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;line-height:1.7;tab-size:2}
|
|
28
|
+
.SN_noteEditor:disabled{opacity:.7;cursor:wait}
|
|
29
|
+
.SN_noteEditBar{flex:none;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 18px;border-top:.5px solid var(--dsw-alias-border-l1);background:var(--dsw-alias-bg-layer-2,#f2f0ec)}
|
|
30
|
+
.SN_noteEditHint{font-size:11px;line-height:1.4;color:var(--dsw-alias-label-tertiary)}
|
|
31
|
+
.SN_noteEditActions{display:flex;align-items:center;gap:8px;flex:none}
|
|
32
|
+
.SN_blockP{margin:0 0 14px;font-size:13.5px;line-height:1.85;color:var(--dsw-alias-label-primary);color:color-mix(in srgb,var(--dsw-alias-label-primary) 80%,transparent);white-space:pre-wrap;word-break:break-word}
|
|
33
|
+
.SN_blockP:last-child{margin-bottom:0}
|
|
34
|
+
.SN_blockH{margin:22px 0 10px;font-family:var(--sn-serif);font-size:17px;font-weight:600;line-height:1.4;color:var(--dsw-alias-label-primary);word-break:break-word}
|
|
35
|
+
.SN_blockH:first-child{margin-top:0}
|
|
36
|
+
.SN_blockLi{position:relative;margin:0 0 8px;padding-left:16px;font-size:13.5px;line-height:1.8;color:var(--dsw-alias-label-primary);color:color-mix(in srgb,var(--dsw-alias-label-primary) 80%,transparent);word-break:break-word}
|
|
37
|
+
.SN_blockLi::before{content:'';position:absolute;left:4px;top:.74em;width:4px;height:4px;border-radius:50%;background:var(--dsw-alias-label-tertiary)}
|
|
38
|
+
.SN_blockOrdered{display:flex;align-items:baseline;gap:8px;padding-left:0}
|
|
39
|
+
.SN_blockOrdered::before{display:none}
|
|
40
|
+
.SN_listNumber{flex:none;min-width:18px;text-align:right;font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-secondary)}
|
|
41
|
+
.SN_listText{flex:1;min-width:0}
|
|
42
|
+
.SN_blockTask{display:flex;align-items:flex-start;gap:8px;padding-left:0}
|
|
43
|
+
.SN_blockTask::before{display:none}
|
|
44
|
+
.SN_taskCheck{flex:none;width:14px;height:14px;margin-top:.4em;border:.5px solid var(--dsw-alias-border-l4,var(--dsw-alias-border-l3));border-radius:4px;display:inline-flex;align-items:center;justify-content:center;font-size:10px;line-height:1;color:var(--dsw-alias-label-primary-foreground,#fff);background:transparent}
|
|
45
|
+
.SN_taskCheck[data-checked='true']{background:var(--dsw-alias-brand-primary,#2f6feb);border-color:var(--dsw-alias-brand-primary,#2f6feb);color:var(--dsw-alias-label-primary-foreground,#fff)}
|
|
46
|
+
.SN_taskText{min-width:0;flex:1;word-break:break-word}
|
|
47
|
+
.SN_blockQuote{margin:0 0 14px;padding:2px 0 2px 14px;border-left:2px solid var(--dsw-alias-border-l3);font-size:13px;line-height:1.8;color:var(--dsw-alias-label-primary);color:color-mix(in srgb,var(--dsw-alias-label-primary) 80%,transparent);white-space:pre-wrap;word-break:break-word}
|
|
48
|
+
.SN_blockCode{margin:0 0 14px;padding:10px 12px;border-radius:8px;background:var(--dsw-alias-bg-layer-2,#f2f0ec);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.65;color:var(--dsw-alias-label-primary);white-space:pre-wrap;overflow:auto}
|
|
49
|
+
.SN_blockHr{margin:20px 0;border:0;border-top:1px solid var(--dsw-alias-border-l2)}
|
|
50
|
+
.SN_noteImage{display:block;max-width:100%;max-height:480px;object-fit:contain;margin:8px auto 16px;border-radius:6px}
|
|
51
|
+
.SN_imageLoading,.SN_imageMissing{padding:12px;border:1px dashed var(--dsw-alias-border-l2);color:var(--dsw-alias-label-tertiary);text-align:center;font-size:12px}
|
|
52
|
+
.SN_taskCheck{padding:0;cursor:pointer}
|
|
53
|
+
.SN_taskCheck:disabled{cursor:wait;opacity:.5}
|
|
54
|
+
.SN_noteEditBar .SN_primaryBtn{background:var(--dsw-alias-brand-primary,#2f6feb);color:var(--dsw-alias-label-primary-foreground,#fff)}
|
|
55
|
+
.SN_projects{margin-top:20px;display:flex;align-items:baseline;gap:10px;padding:10px 12px;border-radius:8px;background:var(--dsw-alias-bg-layer-2,#f2f0ec);font-size:12px;line-height:1.6}
|
|
56
|
+
.SN_projectsLabel{flex:none;color:var(--dsw-alias-label-tertiary)}
|
|
57
|
+
.SN_projectsValue{min-width:0;color:var(--dsw-alias-label-primary);word-break:break-all}
|
|
58
|
+
.SN_commentCard{border:.5px solid var(--dsw-alias-border-l2);border-radius:10px;background:var(--dsw-alias-bg-layer-1,#faf9f7);padding:12px 14px}
|
|
59
|
+
.SN_commentCardHead{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:12px;line-height:1.5;color:var(--dsw-alias-label-secondary)}
|
|
60
|
+
.SN_commentCardLabel{font-weight:500;color:var(--dsw-alias-label-primary)}
|
|
61
|
+
.SN_commentCardTime{font-size:11px;color:var(--dsw-alias-label-tertiary)}
|
|
62
|
+
.SN_commentCardBody{margin-top:7px;font-size:13px;line-height:1.78;color:var(--dsw-alias-label-primary);white-space:pre-wrap;word-break:break-word}
|
|
63
|
+
|
|
64
|
+
`;
|
|
65
|
+
|
|
66
|
+
export { readerStyles };
|