@rightkit/document-workspace 0.0.0-stage → 0.1.0
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/CHANGELOG.md +5 -0
- package/LICENSE-APACHE +201 -0
- package/LICENSE-MIT +21 -0
- package/README.md +51 -2
- package/dist/app/App.d.ts +1 -0
- package/dist/app/App.js +6 -0
- package/dist/app/AppDialogs.d.ts +52 -0
- package/dist/app/AppDialogs.js +23 -0
- package/dist/app/AppDialogsHost.d.ts +31 -0
- package/dist/app/AppDialogsHost.js +30 -0
- package/dist/app/AppLifecycle.d.ts +19 -0
- package/dist/app/AppLifecycle.js +87 -0
- package/dist/app/AppProvider.d.ts +317 -0
- package/dist/app/AppProvider.js +217 -0
- package/dist/app/AppRoot.d.ts +8 -0
- package/dist/app/AppRoot.js +159 -0
- package/dist/app/AppShell.d.ts +2 -0
- package/dist/app/AppShell.js +81 -0
- package/dist/app/CommandPalette.d.ts +13 -0
- package/dist/app/CommandPalette.js +47 -0
- package/dist/app/DocActionBar.d.ts +36 -0
- package/dist/app/DocActionBar.js +300 -0
- package/dist/app/DocumentContextMenu.d.ts +29 -0
- package/dist/app/DocumentContextMenu.js +122 -0
- package/dist/app/DocumentPane.d.ts +52 -0
- package/dist/app/DocumentPane.js +30 -0
- package/dist/app/DocumentRouterTable.d.ts +58 -0
- package/dist/app/DocumentRouterTable.js +143 -0
- package/dist/app/ErrorBoundary.d.ts +12 -0
- package/dist/app/ErrorBoundary.js +16 -0
- package/dist/app/FindBar.d.ts +12 -0
- package/dist/app/FindBar.js +199 -0
- package/dist/app/LiveTitle.d.ts +14 -0
- package/dist/app/LiveTitle.js +14 -0
- package/dist/app/OpeningProgress.d.ts +13 -0
- package/dist/app/OpeningProgress.js +21 -0
- package/dist/app/PrintPreviewWindow.d.ts +2 -0
- package/dist/app/PrintPreviewWindow.js +57 -0
- package/dist/app/ShortcutHelp.d.ts +3 -0
- package/dist/app/ShortcutHelp.js +99 -0
- package/dist/app/Sidebar.d.ts +36 -0
- package/dist/app/Sidebar.js +121 -0
- package/dist/app/ToastViewport.d.ts +1 -0
- package/dist/app/ToastViewport.js +31 -0
- package/dist/app/Toolbar.d.ts +26 -0
- package/dist/app/Toolbar.js +63 -0
- package/dist/app/activeFormatSavers.d.ts +7 -0
- package/dist/app/activeFormatSavers.js +4 -0
- package/dist/app/clipboardPaths.d.ts +1 -0
- package/dist/app/clipboardPaths.js +31 -0
- package/dist/app/documentDrafts.d.ts +17 -0
- package/dist/app/documentDrafts.js +104 -0
- package/dist/app/draftResolution.d.ts +5 -0
- package/dist/app/draftResolution.js +25 -0
- package/dist/app/markdownPaletteActions.d.ts +8 -0
- package/dist/app/markdownPaletteActions.js +107 -0
- package/dist/app/resourceCensusDev.d.ts +41 -0
- package/dist/app/resourceCensusDev.js +518 -0
- package/dist/app/setupRecovery.d.ts +34 -0
- package/dist/app/setupRecovery.js +70 -0
- package/dist/app/shell/DocStatsPill.d.ts +18 -0
- package/dist/app/shell/DocStatsPill.js +32 -0
- package/dist/app/shell/DocumentTools.d.ts +9 -0
- package/dist/app/shell/DocumentTools.js +73 -0
- package/dist/app/shell/InfoInspector.d.ts +9 -0
- package/dist/app/shell/InfoInspector.js +67 -0
- package/dist/app/shell/StartPage.d.ts +9 -0
- package/dist/app/shell/StartPage.js +49 -0
- package/dist/app/shell/readEdit.d.ts +6 -0
- package/dist/app/shell/readEdit.js +6 -0
- package/dist/app/sidebar/SidebarDocumentMenu.d.ts +20 -0
- package/dist/app/sidebar/SidebarDocumentMenu.js +56 -0
- package/dist/app/sidebar/SidebarExpandedPanel.d.ts +9 -0
- package/dist/app/sidebar/SidebarExpandedPanel.js +78 -0
- package/dist/app/sidebar/SidebarIcons.d.ts +3 -0
- package/dist/app/sidebar/SidebarIcons.js +18 -0
- package/dist/app/sidebar/SidebarMenus.d.ts +19 -0
- package/dist/app/sidebar/SidebarMenus.js +64 -0
- package/dist/app/sidebar/SidebarPathUtils.d.ts +10 -0
- package/dist/app/sidebar/SidebarPathUtils.js +55 -0
- package/dist/app/sidebar/SidebarPrimitives.d.ts +12 -0
- package/dist/app/sidebar/SidebarPrimitives.js +45 -0
- package/dist/app/sidebar/SidebarRail.d.ts +5 -0
- package/dist/app/sidebar/SidebarRail.js +37 -0
- package/dist/app/sidebar/explorer/ExplorerRowMenu.d.ts +21 -0
- package/dist/app/sidebar/explorer/ExplorerRowMenu.js +37 -0
- package/dist/app/sidebar/explorer/ExplorerSections.d.ts +16 -0
- package/dist/app/sidebar/explorer/ExplorerSections.js +259 -0
- package/dist/app/sidebar/explorer/ExplorerTree.d.ts +46 -0
- package/dist/app/sidebar/explorer/ExplorerTree.js +387 -0
- package/dist/app/sidebar/explorer/explorerState.d.ts +37 -0
- package/dist/app/sidebar/explorer/explorerState.js +135 -0
- package/dist/app/tabMountPolicy.d.ts +45 -0
- package/dist/app/tabMountPolicy.js +104 -0
- package/dist/app/tabWarmOrder.d.ts +7 -0
- package/dist/app/tabWarmOrder.js +48 -0
- package/dist/app/tabs/TabFuseCurves.d.ts +3 -0
- package/dist/app/tabs/TabFuseCurves.js +15 -0
- package/dist/app/tabs/TabOverview.d.ts +24 -0
- package/dist/app/tabs/TabOverview.js +121 -0
- package/dist/app/tabs/TabStrip.d.ts +42 -0
- package/dist/app/tabs/TabStrip.js +380 -0
- package/dist/app/tabs/tabIds.d.ts +5 -0
- package/dist/app/tabs/tabIds.js +7 -0
- package/dist/app/tabs/useTabDirty.d.ts +3 -0
- package/dist/app/tabs/useTabDirty.js +11 -0
- package/dist/app/useAppChromeState.d.ts +21 -0
- package/dist/app/useAppChromeState.js +48 -0
- package/dist/app/useAppCommands.d.ts +66 -0
- package/dist/app/useAppCommands.js +71 -0
- package/dist/app/useAppDocumentCore.d.ts +210 -0
- package/dist/app/useAppDocumentCore.js +40 -0
- package/dist/app/useAppEffects.d.ts +18 -0
- package/dist/app/useAppEffects.js +52 -0
- package/dist/app/useAppPaneSearch.d.ts +37 -0
- package/dist/app/useAppPaneSearch.js +74 -0
- package/dist/app/useAppShellSetup.d.ts +40 -0
- package/dist/app/useAppShellSetup.js +52 -0
- package/dist/app/useAppSlots.d.ts +28 -0
- package/dist/app/useAppSlots.js +40 -0
- package/dist/app/useAppTabChrome.d.ts +51 -0
- package/dist/app/useAppTabChrome.js +66 -0
- package/dist/app/useAutoSave.d.ts +34 -0
- package/dist/app/useAutoSave.js +116 -0
- package/dist/app/useCloseAll.d.ts +52 -0
- package/dist/app/useCloseAll.js +295 -0
- package/dist/app/useClosedTabEviction.d.ts +10 -0
- package/dist/app/useClosedTabEviction.js +38 -0
- package/dist/app/useCommandPalette.d.ts +44 -0
- package/dist/app/useCommandPalette.js +254 -0
- package/dist/app/useCrossDocSearch.d.ts +7 -0
- package/dist/app/useCrossDocSearch.js +94 -0
- package/dist/app/useDistractionFree.d.ts +21 -0
- package/dist/app/useDistractionFree.js +73 -0
- package/dist/app/useDocumentCreation.d.ts +18 -0
- package/dist/app/useDocumentCreation.js +63 -0
- package/dist/app/useDocumentDirty.d.ts +31 -0
- package/dist/app/useDocumentDirty.js +46 -0
- package/dist/app/useDocumentLoader.d.ts +55 -0
- package/dist/app/useDocumentLoader.js +267 -0
- package/dist/app/useDocumentOutputActions.d.ts +6 -0
- package/dist/app/useDocumentOutputActions.js +45 -0
- package/dist/app/useDocumentRuntimeEffects.d.ts +36 -0
- package/dist/app/useDocumentRuntimeEffects.js +458 -0
- package/dist/app/useDocumentSaver.d.ts +58 -0
- package/dist/app/useDocumentSaver.js +511 -0
- package/dist/app/useDocumentTabs.d.ts +41 -0
- package/dist/app/useDocumentTabs.js +207 -0
- package/dist/app/useDocumentWatcher.d.ts +83 -0
- package/dist/app/useDocumentWatcher.js +393 -0
- package/dist/app/useDocumentZoom.d.ts +24 -0
- package/dist/app/useDocumentZoom.js +104 -0
- package/dist/app/useDocuments.d.ts +169 -0
- package/dist/app/useDocuments.js +455 -0
- package/dist/app/useDraftConfirmGate.d.ts +27 -0
- package/dist/app/useDraftConfirmGate.js +47 -0
- package/dist/app/useFileDragOverlay.d.ts +12 -0
- package/dist/app/useFileDragOverlay.js +49 -0
- package/dist/app/useFormatApis.d.ts +13 -0
- package/dist/app/useFormatApis.js +62 -0
- package/dist/app/useFormatDirtyState.d.ts +29 -0
- package/dist/app/useFormatDirtyState.js +81 -0
- package/dist/app/useGlobalShortcuts.d.ts +47 -0
- package/dist/app/useGlobalShortcuts.js +359 -0
- package/dist/app/useHtmlSession.d.ts +68 -0
- package/dist/app/useHtmlSession.js +463 -0
- package/dist/app/useHtmlSessionProps.d.ts +33 -0
- package/dist/app/useHtmlSessionProps.js +57 -0
- package/dist/app/useLibrary.d.ts +21 -0
- package/dist/app/useLibrary.js +81 -0
- package/dist/app/useOpenFromClipboard.d.ts +7 -0
- package/dist/app/useOpenFromClipboard.js +44 -0
- package/dist/app/usePaneLiveness.d.ts +29 -0
- package/dist/app/usePaneLiveness.js +199 -0
- package/dist/app/usePendingSavePaths.d.ts +19 -0
- package/dist/app/usePendingSavePaths.js +67 -0
- package/dist/app/useReadyShow.d.ts +12 -0
- package/dist/app/useReadyShow.js +142 -0
- package/dist/app/useSearchController.d.ts +22 -0
- package/dist/app/useSearchController.js +114 -0
- package/dist/app/useSetupRecovery.d.ts +41 -0
- package/dist/app/useSetupRecovery.js +153 -0
- package/dist/app/useTabChrome.d.ts +40 -0
- package/dist/app/useTabChrome.js +115 -0
- package/dist/app/useViewState.d.ts +27 -0
- package/dist/app/useViewState.js +160 -0
- package/dist/appName.d.ts +2 -0
- package/dist/appName.js +8 -0
- package/dist/documents/DocumentRouter.d.ts +102 -0
- package/dist/documents/DocumentRouter.js +153 -0
- package/dist/documents/FileTypeIcon.d.ts +6 -0
- package/dist/documents/FileTypeIcon.js +93 -0
- package/dist/documents/ImageDocument.d.ts +14 -0
- package/dist/documents/ImageDocument.js +61 -0
- package/dist/documents/capabilities.d.ts +17 -0
- package/dist/documents/capabilities.js +18 -0
- package/dist/documents/html/HtmlDocument.d.ts +15 -0
- package/dist/documents/html/HtmlDocument.js +584 -0
- package/dist/documents/html/HtmlDocumentLayout.d.ts +87 -0
- package/dist/documents/html/HtmlDocumentLayout.js +25 -0
- package/dist/documents/html/HtmlDocumentProps.d.ts +60 -0
- package/dist/documents/html/HtmlDocumentProps.js +1 -0
- package/dist/documents/html/HtmlDocumentSource.d.ts +34 -0
- package/dist/documents/html/HtmlDocumentSource.js +28 -0
- package/dist/documents/markdown/MarkdownSplitPane.d.ts +115 -0
- package/dist/documents/markdown/MarkdownSplitPane.js +352 -0
- package/dist/documents/mdx/MdxSplitPane.d.ts +32 -0
- package/dist/documents/mdx/MdxSplitPane.js +60 -0
- package/dist/documents/txt/LinkDialog.d.ts +8 -0
- package/dist/documents/txt/LinkDialog.js +34 -0
- package/dist/documents/txt/MarkdownSourceToolbar.d.ts +8 -0
- package/dist/documents/txt/MarkdownSourceToolbar.js +25 -0
- package/dist/documents/txt/SourceEditorToolbar.d.ts +12 -0
- package/dist/documents/txt/SourceEditorToolbar.js +4 -0
- package/dist/documents/txt/TxtEditor.d.ts +39 -0
- package/dist/documents/txt/TxtEditor.js +186 -0
- package/dist/documents/txt/sourceEditorTypes.d.ts +49 -0
- package/dist/documents/txt/sourceEditorTypes.js +1 -0
- package/dist/documents/txt/sourceExtensions.d.ts +38 -0
- package/dist/documents/txt/sourceExtensions.js +444 -0
- package/dist/documents/txt/sourceFormatting.d.ts +18 -0
- package/dist/documents/txt/sourceFormatting.js +183 -0
- package/dist/documents/txt/sourceTheme.d.ts +5 -0
- package/dist/documents/txt/sourceTheme.js +220 -0
- package/dist/documents/txt/useCodeMirrorSourceEditor.d.ts +69 -0
- package/dist/documents/txt/useCodeMirrorSourceEditor.js +546 -0
- package/dist/documents/txt/useSourceSearch.d.ts +39 -0
- package/dist/documents/txt/useSourceSearch.js +122 -0
- package/dist/documents/txt/useTextEditorCommands.d.ts +26 -0
- package/dist/documents/txt/useTextEditorCommands.js +151 -0
- package/dist/documents/web/LivePreviewPane.d.ts +11 -0
- package/dist/documents/web/LivePreviewPane.js +58 -0
- package/dist/env.d.ts +66 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.js +123 -0
- package/dist/settings/AppearanceMenu.d.ts +9 -0
- package/dist/settings/AppearanceMenu.js +54 -0
- package/dist/settings/SettingsPanel.d.ts +7 -0
- package/dist/settings/SettingsPanel.js +104 -0
- package/dist/settings/publishedSections.d.ts +22 -0
- package/dist/settings/publishedSections.js +79 -0
- package/dist/settings/sections/AboutSection.d.ts +1 -0
- package/dist/settings/sections/AboutSection.js +13 -0
- package/dist/settings/sections/DiagnosticsSection.d.ts +1 -0
- package/dist/settings/sections/DiagnosticsSection.js +42 -0
- package/dist/settings/sections/PrivacySection.d.ts +3 -0
- package/dist/settings/sections/PrivacySection.js +51 -0
- package/dist/settings/sections/UpdateLicenseBlock.d.ts +10 -0
- package/dist/settings/sections/UpdateLicenseBlock.js +158 -0
- package/dist/state/explorer.d.ts +32 -0
- package/dist/state/explorer.js +111 -0
- package/dist/state/legal.d.ts +51 -0
- package/dist/state/legal.js +130 -0
- package/dist/state/library.d.ts +33 -0
- package/dist/state/library.js +110 -0
- package/dist/state/updateLicense.d.ts +31 -0
- package/dist/state/updateLicense.js +340 -0
- package/dist/styles/explorer.css +219 -0
- package/dist/styles/index.css +1477 -0
- package/dist/styles/tabs.css +467 -0
- package/dist/styles.css +6 -0
- package/package.json +88 -3
|
@@ -0,0 +1,1477 @@
|
|
|
1
|
+
/* RightKit app-shell overlays (context menu, dialogs, palette, toasts) bring only their structural
|
|
2
|
+
rules, in a cascade layer below Tailwind's utilities, so the host app own classes decide the look.
|
|
3
|
+
The order line must precede the first import of any of these layers. */
|
|
4
|
+
@layer theme, base, rk, components, utilities;
|
|
5
|
+
@import "tailwindcss" source(none);
|
|
6
|
+
@import "@rightkit/react-shell/shell.structure.css" layer(rk);
|
|
7
|
+
|
|
8
|
+
@source "../";
|
|
9
|
+
|
|
10
|
+
@theme inline {
|
|
11
|
+
--color-ink: var(--ink);
|
|
12
|
+
--color-panel: var(--panel);
|
|
13
|
+
--color-panel-2: var(--panel-2);
|
|
14
|
+
--color-paper: var(--paper);
|
|
15
|
+
--color-muted: var(--muted);
|
|
16
|
+
--color-muted-2: var(--muted-2);
|
|
17
|
+
--color-line: var(--line);
|
|
18
|
+
--color-copper: var(--copper);
|
|
19
|
+
--color-copper-hi: var(--copper-hi);
|
|
20
|
+
--color-accent2: var(--accent-2);
|
|
21
|
+
--color-danger: var(--danger);
|
|
22
|
+
--color-danger-hi: var(--danger-hi);
|
|
23
|
+
--color-vr-disabled: var(--vr-disabled-fg);
|
|
24
|
+
--text-chrome-xs: var(--vr-text-xs);
|
|
25
|
+
--text-chrome-sm: var(--vr-text-sm);
|
|
26
|
+
--text-chrome-md: var(--vr-text-md);
|
|
27
|
+
/* Chrome is set in Inter (Adrian's decision 2026-08-09): Switzer/Geist both carry more display
|
|
28
|
+
character than dense 16px UI wants, and mono-everywhere was what made the chrome read as a
|
|
29
|
+
terminal. Mono is now an ACCENT only — paths, shortcuts, badges, encodings, code. Switzer stays
|
|
30
|
+
bundled and user-selectable for document text; the Tanker wordmark is unchanged. */
|
|
31
|
+
--font-sans: "Inter", -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI Variable Text", "Segoe UI", system-ui, sans-serif;
|
|
32
|
+
--font-serif: "Sentient", Georgia, serif;
|
|
33
|
+
--font-mono: "Spline Sans Mono", ui-monospace, monospace;
|
|
34
|
+
--font-wordmark: "Tanker", system-ui, sans-serif;
|
|
35
|
+
--app-font: "Inter", -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI Variable Text", "Segoe UI", system-ui, sans-serif;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* Bundled fonts — served from /public/fonts, no CDN, fully offline. */
|
|
39
|
+
@font-face {
|
|
40
|
+
font-family: "Inter";
|
|
41
|
+
src: url("/fonts/Inter-Variable.woff2") format("woff2");
|
|
42
|
+
font-weight: 100 900; font-style: normal; font-display: swap;
|
|
43
|
+
}
|
|
44
|
+
@font-face {
|
|
45
|
+
font-family: "Source Serif 4";
|
|
46
|
+
src: url("/fonts/SourceSerif4-Variable.woff2") format("woff2");
|
|
47
|
+
font-weight: 200 900; font-style: normal; font-display: swap;
|
|
48
|
+
}
|
|
49
|
+
@font-face {
|
|
50
|
+
font-family: "Source Serif 4";
|
|
51
|
+
src: url("/fonts/SourceSerif4-Italic-Variable.woff2") format("woff2");
|
|
52
|
+
font-weight: 200 900; font-style: italic; font-display: swap;
|
|
53
|
+
}
|
|
54
|
+
@font-face {
|
|
55
|
+
font-family: "Newsreader";
|
|
56
|
+
src: url("/fonts/Newsreader-Variable.woff2") format("woff2");
|
|
57
|
+
font-weight: 200 800; font-style: normal; font-display: swap;
|
|
58
|
+
}
|
|
59
|
+
@font-face {
|
|
60
|
+
font-family: "Newsreader";
|
|
61
|
+
src: url("/fonts/Newsreader-Italic-Variable.woff2") format("woff2");
|
|
62
|
+
font-weight: 200 800; font-style: italic; font-display: swap;
|
|
63
|
+
}
|
|
64
|
+
@font-face {
|
|
65
|
+
font-family: "Geist";
|
|
66
|
+
src: url("/fonts/Geist-Variable.woff2") format("woff2");
|
|
67
|
+
font-weight: 100 900; font-style: normal; font-display: swap;
|
|
68
|
+
}
|
|
69
|
+
@font-face {
|
|
70
|
+
font-family: "JetBrains Mono";
|
|
71
|
+
src: url("/fonts/JetBrainsMono-Variable.woff2") format("woff2");
|
|
72
|
+
font-weight: 100 800; font-style: normal; font-display: swap;
|
|
73
|
+
}
|
|
74
|
+
@font-face {
|
|
75
|
+
font-family: "Sentient";
|
|
76
|
+
src: url("/fonts/Sentient-Variable.woff2") format("woff2");
|
|
77
|
+
font-weight: 200 900; font-style: normal; font-display: swap;
|
|
78
|
+
}
|
|
79
|
+
@font-face {
|
|
80
|
+
font-family: "Switzer";
|
|
81
|
+
src: url("/fonts/Switzer-Variable.woff2") format("woff2");
|
|
82
|
+
font-weight: 100 900; font-style: normal; font-display: swap;
|
|
83
|
+
}
|
|
84
|
+
@font-face {
|
|
85
|
+
font-family: "Spline Sans Mono";
|
|
86
|
+
src: url("/fonts/SplineSansMono-Variable.woff2") format("woff2");
|
|
87
|
+
font-weight: 200 800; font-style: normal; font-display: swap;
|
|
88
|
+
}
|
|
89
|
+
/* Suite-wide wordmark face (Adrian's decision 2026-07-16): the "the host app" wordmark is set in Tanker. */
|
|
90
|
+
@font-face {
|
|
91
|
+
font-family: "Tanker";
|
|
92
|
+
src: url("/fonts/Tanker-400.woff2") format("woff2");
|
|
93
|
+
font-weight: 400; font-style: normal; font-display: swap;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Fallback tokens (the host app Paper — locked spec). The theme engine overrides these on <html> at runtime. */
|
|
97
|
+
:root {
|
|
98
|
+
/* Chrome type scale; nothing below 11px. Named --vr-text-* so Tailwind's own --text-* scale is untouched. */
|
|
99
|
+
--vr-text-xs: 11px;
|
|
100
|
+
--vr-text-sm: 12px;
|
|
101
|
+
--vr-text-md: 13px;
|
|
102
|
+
--vr-text-base: 14px;
|
|
103
|
+
--vr-text-lg: 16px;
|
|
104
|
+
/* Disabled-control foreground: solid muted ink (>=3:1 on panels), never opacity. */
|
|
105
|
+
--vr-disabled-fg: var(--muted);
|
|
106
|
+
--vr-shadow-tooltip: 0 4px 12px rgb(33 28 24 / 0.14);
|
|
107
|
+
--surface: var(--ink);
|
|
108
|
+
--foreground: var(--paper);
|
|
109
|
+
--ink: #fffdf8;
|
|
110
|
+
--ink-rgb: 255 253 248;
|
|
111
|
+
--reader-surface: #fffdf8;
|
|
112
|
+
--reader-surface-rgb: 255 253 248;
|
|
113
|
+
--reader-text: #211c18;
|
|
114
|
+
--reader-text-rgb: 33 28 24;
|
|
115
|
+
--reader-line: #e2dad1;
|
|
116
|
+
--panel: #ffffff;
|
|
117
|
+
--panel-rgb: 255 255 255;
|
|
118
|
+
--panel-2: #f3eee6;
|
|
119
|
+
--panel-2-rgb: 243 238 230;
|
|
120
|
+
--paper: #211c18;
|
|
121
|
+
--paper-rgb: 33 28 24;
|
|
122
|
+
--muted: #6e665f;
|
|
123
|
+
--muted-rgb: 110 102 95;
|
|
124
|
+
--muted-2: #5a544d;
|
|
125
|
+
--muted-2-rgb: 90 84 77;
|
|
126
|
+
--line: #e2dad1;
|
|
127
|
+
--copper: #0c6aa5;
|
|
128
|
+
--copper-rgb: 12 106 165;
|
|
129
|
+
--copper-hi: #095785;
|
|
130
|
+
--copper-hi-rgb: 9 87 133;
|
|
131
|
+
--accent-2: #0c6aa5;
|
|
132
|
+
--accent-2-rgb: 12 106 165;
|
|
133
|
+
--danger: #b3402a;
|
|
134
|
+
--danger-rgb: 179 64 42;
|
|
135
|
+
--danger-hi: #d4503a;
|
|
136
|
+
--danger-hi-rgb: 212 80 58;
|
|
137
|
+
--chrome: #eae4d9;
|
|
138
|
+
--chrome-rgb: 234 228 217;
|
|
139
|
+
--chrome-2: #e0d8cb;
|
|
140
|
+
--chrome-2-rgb: 224 216 203;
|
|
141
|
+
--chrome-paper: #211c18;
|
|
142
|
+
--chrome-paper-rgb: 33 28 24;
|
|
143
|
+
--chrome-muted: #5e574f;
|
|
144
|
+
--chrome-muted-rgb: 94 87 79;
|
|
145
|
+
--chrome-muted-2: #655d56;
|
|
146
|
+
--chrome-muted-2-rgb: 101 93 86;
|
|
147
|
+
--chrome-line: #cbc1b2;
|
|
148
|
+
--chrome-hover: #d8cfc0;
|
|
149
|
+
--chrome-hover-rgb: 216 207 192;
|
|
150
|
+
|
|
151
|
+
--font-sans: "Inter", -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI Variable Text", "Segoe UI", system-ui, sans-serif;
|
|
152
|
+
--font-serif: "Sentient", Georgia, serif;
|
|
153
|
+
--font-mono: "Spline Sans Mono", ui-monospace, monospace;
|
|
154
|
+
--app-font: "Inter", -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI Variable Text", "Segoe UI", system-ui, sans-serif;
|
|
155
|
+
|
|
156
|
+
--doc-font: "Sentient", Georgia, serif;
|
|
157
|
+
--doc-size: 16px;
|
|
158
|
+
--doc-leading: 1.7;
|
|
159
|
+
--doc-fg: color-mix(in srgb, var(--paper) 90%, transparent);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/* Glass + window-material knobs keyed to the theme MODE (data-theme on <html>, set by
|
|
163
|
+
applySettings) — never per-theme-id. Light themes take a bright inset top highlight and a
|
|
164
|
+
lighter chrome wash; dark themes take a faint highlight and a heavier wash so chrome text
|
|
165
|
+
stays readable over whatever shows through the native window material. */
|
|
166
|
+
:root {
|
|
167
|
+
--vr-glass-hi: rgb(255 255 255 / 0.6);
|
|
168
|
+
}
|
|
169
|
+
[data-theme="dark"] {
|
|
170
|
+
--vr-shadow-tooltip: 0 10px 24px rgb(0 0 0 / 0.28);
|
|
171
|
+
--vr-glass-hi: rgb(255 255 255 / 0.08);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
html, body, #root { height: 100%; margin: 0; overflow: hidden; }
|
|
175
|
+
|
|
176
|
+
body {
|
|
177
|
+
background: var(--ink);
|
|
178
|
+
color: var(--paper);
|
|
179
|
+
font-family: var(--app-font);
|
|
180
|
+
-webkit-font-smoothing: antialiased;
|
|
181
|
+
-moz-osx-font-smoothing: grayscale;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.font-sans {
|
|
185
|
+
font-family: var(--app-font);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
:where(button, [role="button"], a[href], summary, select, label[for], input[type="button"], input[type="submit"], input[type="reset"], input[type="color"], input[type="checkbox"], input[type="radio"]) {
|
|
189
|
+
cursor: pointer;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
:where(button:disabled, [aria-disabled="true"], input:disabled, select:disabled, textarea:disabled) {
|
|
193
|
+
cursor: not-allowed;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
:where(button, [role="button"], a[href], input, select, textarea):focus-visible {
|
|
197
|
+
outline: none;
|
|
198
|
+
box-shadow: 0 0 0 2px var(--copper);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/* App chrome is a distinct frame around the document surface. This keeps the sidebar,
|
|
202
|
+
titlebar, document action bar, and status bar visually unified without forcing document text to
|
|
203
|
+
use chrome colors. */
|
|
204
|
+
/* Register the shell's colour tokens so they can INTERPOLATE on a theme flip. Transitioning the
|
|
205
|
+
variables (not each element's background) means the whole chrome cross-fades from one .vr-chrome
|
|
206
|
+
rule below — descendants never carry their own theme transition, so .vr-press keeps its 140ms
|
|
207
|
+
press feel untouched. Only the shell animates: the reader/document surface (--reader-surface,
|
|
208
|
+
used behind PDF/canvas/iframe) is not registered here and snaps instantly, by design. Under
|
|
209
|
+
prefers-reduced-motion the global reset (see bottom of file) neutralises the transition. */
|
|
210
|
+
@property --panel {
|
|
211
|
+
syntax: "<color>";
|
|
212
|
+
inherits: true;
|
|
213
|
+
initial-value: #ffffff;
|
|
214
|
+
}
|
|
215
|
+
@property --panel-2 {
|
|
216
|
+
syntax: "<color>";
|
|
217
|
+
inherits: true;
|
|
218
|
+
initial-value: #f3eee6;
|
|
219
|
+
}
|
|
220
|
+
@property --ink {
|
|
221
|
+
syntax: "<color>";
|
|
222
|
+
inherits: true;
|
|
223
|
+
initial-value: #fffdf8;
|
|
224
|
+
}
|
|
225
|
+
@property --paper {
|
|
226
|
+
syntax: "<color>";
|
|
227
|
+
inherits: true;
|
|
228
|
+
initial-value: #211c18;
|
|
229
|
+
}
|
|
230
|
+
@property --muted {
|
|
231
|
+
syntax: "<color>";
|
|
232
|
+
inherits: true;
|
|
233
|
+
initial-value: #6e665f;
|
|
234
|
+
}
|
|
235
|
+
@property --line {
|
|
236
|
+
syntax: "<color>";
|
|
237
|
+
inherits: true;
|
|
238
|
+
initial-value: #e2dad1;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.vr-chrome {
|
|
242
|
+
--ink: var(--chrome-hover);
|
|
243
|
+
--ink-rgb: var(--chrome-hover-rgb);
|
|
244
|
+
--panel: var(--chrome);
|
|
245
|
+
--panel-rgb: var(--chrome-rgb);
|
|
246
|
+
--panel-2: var(--chrome-2);
|
|
247
|
+
--panel-2-rgb: var(--chrome-2-rgb);
|
|
248
|
+
--paper: var(--chrome-paper);
|
|
249
|
+
--paper-rgb: var(--chrome-paper-rgb);
|
|
250
|
+
--muted: var(--chrome-muted);
|
|
251
|
+
--muted-rgb: var(--chrome-muted-rgb);
|
|
252
|
+
--muted-2: var(--chrome-muted-2);
|
|
253
|
+
--muted-2-rgb: var(--chrome-muted-2-rgb);
|
|
254
|
+
--line: var(--chrome-line);
|
|
255
|
+
/* ~200ms shell-only theme cross-fade (Sol brief). Neutralised under reduced-motion. */
|
|
256
|
+
transition:
|
|
257
|
+
--panel 200ms ease,
|
|
258
|
+
--panel-2 200ms ease,
|
|
259
|
+
--ink 200ms ease,
|
|
260
|
+
--paper 200ms ease,
|
|
261
|
+
--muted 200ms ease,
|
|
262
|
+
--line 200ms ease;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/* Sidebar also animates its width. Keep that transition composed with shell colour interpolation;
|
|
266
|
+
a Tailwind transition utility would replace, rather than extend, `.vr-chrome`'s transition. */
|
|
267
|
+
.vr-chrome.vr-sidebar-shell {
|
|
268
|
+
transition:
|
|
269
|
+
width 200ms ease-out,
|
|
270
|
+
--panel 200ms ease,
|
|
271
|
+
--panel-2 200ms ease,
|
|
272
|
+
--ink 200ms ease,
|
|
273
|
+
--paper 200ms ease,
|
|
274
|
+
--muted 200ms ease,
|
|
275
|
+
--line 200ms ease;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
/* Text selection uses the semantic accent token (never a hardcoded blue), tinted so it reads on
|
|
279
|
+
both the reading surface and the theme's chrome. */
|
|
280
|
+
::selection {
|
|
281
|
+
background: color-mix(in srgb, var(--copper) 26%, transparent);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* One-time entrance for the empty-state hero: a gentle eased rise-in, staggered per section via an
|
|
285
|
+
inline --rise-delay. `both` holds the start frame during the delay (no pre-flash). Plays once on
|
|
286
|
+
mount only — no perpetual motion. Neutralised under reduced-motion by the global reset. */
|
|
287
|
+
@keyframes vr-rise-in {
|
|
288
|
+
from {
|
|
289
|
+
opacity: 0;
|
|
290
|
+
transform: translateY(8px);
|
|
291
|
+
}
|
|
292
|
+
to {
|
|
293
|
+
opacity: 1;
|
|
294
|
+
transform: none;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
.vr-rise {
|
|
298
|
+
animation: vr-rise-in 420ms cubic-bezier(0.2, 0.8, 0.2, 1) both;
|
|
299
|
+
animation-delay: var(--rise-delay, 0ms);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/* Chrome colour does not track document mode — accent text tokens tuned for the document surface
|
|
303
|
+
may not read on chrome. Inside app chrome the accent decorates borders/backgrounds; the readable
|
|
304
|
+
foreground stays on the chrome paper token. */
|
|
305
|
+
.vr-chrome :where(.text-copper, .text-copper-hi),
|
|
306
|
+
.vr-chrome :where(.hover\:text-copper:hover, .hover\:text-copper-hi:hover),
|
|
307
|
+
.vr-chrome :where(.focus-visible\:text-copper:focus-visible, .focus-visible\:text-copper-hi:focus-visible) {
|
|
308
|
+
color: var(--paper);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/* Quiet scrollbars — track-less, thumb is a border tone, accent on hover. */
|
|
312
|
+
* {
|
|
313
|
+
scrollbar-width: thin;
|
|
314
|
+
scrollbar-color: var(--line) transparent;
|
|
315
|
+
}
|
|
316
|
+
*::-webkit-scrollbar { width: 10px; height: 10px; }
|
|
317
|
+
*::-webkit-scrollbar-track { background: transparent; }
|
|
318
|
+
*::-webkit-scrollbar-thumb {
|
|
319
|
+
background: var(--line);
|
|
320
|
+
border-radius: 8px;
|
|
321
|
+
border: 2px solid transparent;
|
|
322
|
+
background-clip: content-box;
|
|
323
|
+
}
|
|
324
|
+
*::-webkit-scrollbar-thumb:hover {
|
|
325
|
+
background: var(--copper);
|
|
326
|
+
background-clip: content-box;
|
|
327
|
+
}
|
|
328
|
+
*::-webkit-scrollbar-corner { background: transparent; }
|
|
329
|
+
|
|
330
|
+
.vr-collapsed-tab-close {
|
|
331
|
+
position: absolute;
|
|
332
|
+
transform-origin: left center;
|
|
333
|
+
transform: translateY(-50%) scale(1);
|
|
334
|
+
transition:
|
|
335
|
+
opacity 150ms ease,
|
|
336
|
+
transform 170ms cubic-bezier(0.2, 0.8, 0.2, 1),
|
|
337
|
+
background-color 120ms ease,
|
|
338
|
+
box-shadow 120ms ease;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.vr-collapsed-tab-close-glyph {
|
|
342
|
+
display: inline-block;
|
|
343
|
+
transform: rotate(0deg);
|
|
344
|
+
transition: transform 170ms cubic-bezier(0.2, 0.8, 0.2, 1);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.vr-collapsed-tab-close:hover,
|
|
348
|
+
.vr-collapsed-tab-close:focus-visible {
|
|
349
|
+
opacity: 1;
|
|
350
|
+
transform: translateY(-50%) scale(1.05);
|
|
351
|
+
box-shadow: 0 6px 16px rgb(0 0 0 / 0.28);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
.vr-collapsed-tab-close:hover .vr-collapsed-tab-close-glyph,
|
|
355
|
+
.vr-collapsed-tab-close:focus-visible .vr-collapsed-tab-close-glyph {
|
|
356
|
+
transform: rotate(8deg);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* Paint the outside of the content curve above the toolbar. SVG antialiases its edge without
|
|
360
|
+
exposing the reader layer behind a dark toolbar or relying on WKWebView CSS-mask clipping. */
|
|
361
|
+
[data-vr-content-corner] {
|
|
362
|
+
position: absolute;
|
|
363
|
+
top: 0;
|
|
364
|
+
left: 0;
|
|
365
|
+
width: 24px;
|
|
366
|
+
height: 24px;
|
|
367
|
+
z-index: 35;
|
|
368
|
+
fill: var(--chrome);
|
|
369
|
+
pointer-events: none;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
@media print {
|
|
373
|
+
[data-vr-content-plane]::before {
|
|
374
|
+
display: none;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.vr-icon-tooltip {
|
|
379
|
+
position: relative;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.vr-icon-tooltip::after {
|
|
383
|
+
content: attr(data-vr-tooltip);
|
|
384
|
+
pointer-events: none;
|
|
385
|
+
position: absolute;
|
|
386
|
+
z-index: 90;
|
|
387
|
+
max-width: 280px;
|
|
388
|
+
width: max-content;
|
|
389
|
+
white-space: normal;
|
|
390
|
+
overflow-wrap: anywhere;
|
|
391
|
+
border: 1px solid var(--line);
|
|
392
|
+
border-radius: 6px;
|
|
393
|
+
background: var(--panel-2);
|
|
394
|
+
color: var(--paper);
|
|
395
|
+
padding: 5px 7px;
|
|
396
|
+
font-family: var(--app-font);
|
|
397
|
+
font-size: var(--vr-text-xs);
|
|
398
|
+
font-weight: 500;
|
|
399
|
+
line-height: 1.3;
|
|
400
|
+
opacity: 0;
|
|
401
|
+
box-shadow: var(--vr-shadow-tooltip);
|
|
402
|
+
/* Dismiss instantly; appear after a short delay to prevent cursor-passing flashes */
|
|
403
|
+
transition: opacity 120ms ease, transform 120ms ease;
|
|
404
|
+
transition-delay: 0ms;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
.vr-icon-tooltip[data-vr-tooltip-side="right"]::after {
|
|
408
|
+
left: calc(100% + 8px);
|
|
409
|
+
top: 50%;
|
|
410
|
+
transform: translate(-2px, -50%);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
.vr-icon-tooltip[data-vr-tooltip-side="bottom"]::after {
|
|
414
|
+
left: 50%;
|
|
415
|
+
top: calc(100% + 8px);
|
|
416
|
+
transform: translate(-50%, -2px);
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.vr-icon-tooltip[data-vr-tooltip-side="top"]::after {
|
|
420
|
+
bottom: calc(100% + 8px);
|
|
421
|
+
left: 50%;
|
|
422
|
+
transform: translate(-50%, 2px);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
.vr-icon-tooltip:hover::after,
|
|
426
|
+
.vr-icon-tooltip:focus-visible::after {
|
|
427
|
+
opacity: 1;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.vr-icon-tooltip[data-vr-tooltip-side="right"]:hover::after,
|
|
431
|
+
.vr-icon-tooltip[data-vr-tooltip-side="right"]:focus-visible::after {
|
|
432
|
+
transform: translate(0, -50%);
|
|
433
|
+
transition-delay: 350ms;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
.vr-icon-tooltip[data-vr-tooltip-side="bottom"]:hover::after,
|
|
437
|
+
.vr-icon-tooltip[data-vr-tooltip-side="bottom"]:focus-visible::after {
|
|
438
|
+
transform: translate(-50%, 0);
|
|
439
|
+
transition-delay: 350ms;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
.vr-icon-tooltip[data-vr-tooltip-side="top"]:hover::after,
|
|
443
|
+
.vr-icon-tooltip[data-vr-tooltip-side="top"]:focus-visible::after {
|
|
444
|
+
transform: translate(-50%, 0);
|
|
445
|
+
transition-delay: 350ms;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
/* When any sibling tooltip is already visible, subsequent ones open instantly */
|
|
449
|
+
.vr-tooltips-instant .vr-icon-tooltip:hover::after,
|
|
450
|
+
.vr-tooltips-instant .vr-icon-tooltip:focus-visible::after {
|
|
451
|
+
transition-delay: 0ms;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
@media (prefers-reduced-motion: reduce) {
|
|
455
|
+
.vr-collapsed-tab-close,
|
|
456
|
+
.vr-icon-tooltip::after {
|
|
457
|
+
transition: none;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/* Reading column — driven by Settings (font / size / line-height / contrast). */
|
|
462
|
+
.reading {
|
|
463
|
+
font-family: var(--doc-font);
|
|
464
|
+
font-size: var(--doc-size);
|
|
465
|
+
line-height: var(--doc-leading);
|
|
466
|
+
color: var(--doc-fg);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
.reading :where(.font-serif) {
|
|
470
|
+
font-family: var(--doc-font);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/* Markdown Hybrid editor — ProseMirror owns editable prose, raw blocks stay source-only.
|
|
474
|
+
Full available width by default; an optional reading column uses Settings.readingWidthPx
|
|
475
|
+
via --doc-measure, selectable in Aa. The document fills the scroller and insets its text
|
|
476
|
+
with padding, so wide tables and code fences can break out of the measure a little — up to the
|
|
477
|
+
edge margin, never past it, so the hidden-x scroller can't clip them. --vr-doc-pad/--vr-breakout
|
|
478
|
+
are registered <length>s, calculated from the scroll container's inline size so descendants
|
|
479
|
+
inherit resolved lengths instead of re-evaluating percentages against their own width. */
|
|
480
|
+
@property --vr-doc-pad {
|
|
481
|
+
syntax: "<length>";
|
|
482
|
+
inherits: true;
|
|
483
|
+
initial-value: 1.5rem;
|
|
484
|
+
}
|
|
485
|
+
@property --vr-breakout {
|
|
486
|
+
syntax: "<length>";
|
|
487
|
+
inherits: true;
|
|
488
|
+
initial-value: 0px;
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
.vr-markdown-document-geometry,
|
|
492
|
+
.vr-reading-measure {
|
|
493
|
+
--vr-edge-pad: clamp(1.5rem, 4.8cqi, 4rem);
|
|
494
|
+
--vr-doc-pad: max(var(--vr-edge-pad), calc((100cqi - var(--doc-measure, 100cqi)) / 2));
|
|
495
|
+
--vr-breakout: min(2.5rem, calc(var(--vr-doc-pad) - var(--vr-edge-pad)));
|
|
496
|
+
box-sizing: border-box;
|
|
497
|
+
width: 100%;
|
|
498
|
+
max-width: none;
|
|
499
|
+
margin-inline: 0;
|
|
500
|
+
padding-inline: var(--vr-doc-pad);
|
|
501
|
+
}
|
|
502
|
+
.vr-reading-container {
|
|
503
|
+
container-type: inline-size;
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
/* Breakout blocks: the live editor's native table wrapper and code fence are top-level PM
|
|
507
|
+
children; the rendered preview marks its table/code wrappers vr-md-table/vr-md-code. */
|
|
508
|
+
.vr-pm-markdown-doc.vr-markdown-document-geometry > .vr-pm-table-scroll,
|
|
509
|
+
.vr-pm-markdown-doc.vr-markdown-document-geometry > .vr-pm-code-fence,
|
|
510
|
+
.vr-reading-measure .vr-md-table,
|
|
511
|
+
.vr-reading-measure .vr-md-code {
|
|
512
|
+
width: calc(100% + 2 * var(--vr-breakout));
|
|
513
|
+
max-width: none;
|
|
514
|
+
margin-inline: calc(-1 * var(--vr-breakout));
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.vr-pm-markdown-doc {
|
|
518
|
+
box-sizing: border-box;
|
|
519
|
+
margin: 0 auto;
|
|
520
|
+
color: var(--doc-fg);
|
|
521
|
+
font-family: var(--doc-font);
|
|
522
|
+
font-size: var(--doc-size);
|
|
523
|
+
line-height: var(--doc-leading);
|
|
524
|
+
outline: none;
|
|
525
|
+
white-space: pre-wrap;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
#root .vr-pm-markdown-doc > .vr-pm-protected-block {
|
|
529
|
+
max-width: 100%;
|
|
530
|
+
min-width: 0;
|
|
531
|
+
overflow-x: auto;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/* The vendored DOCX editor ships an UNSCOPED global `[contenteditable=true]{caret-color:#000}`
|
|
535
|
+
(vendor/docx-editor/.../dist/styles.css) that leaks onto every editable surface in the app,
|
|
536
|
+
turning the Markdown ProseMirror caret black — invisible on dark themes. Restore a theme-accent
|
|
537
|
+
caret on our own editable surface; the `[contenteditable="true"]` qualifier outspecifies the
|
|
538
|
+
leaked global (0,2,0 > 0,1,0) so it wins regardless of stylesheet order. CodeMirror (txt/source)
|
|
539
|
+
draws its own `.cm-cursor`, and the DOCX page keeps its own document-paper caret. */
|
|
540
|
+
.vr-pm-markdown-doc[contenteditable="true"] {
|
|
541
|
+
caret-color: var(--copper);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/* Toolbar owns its height in normal flow; remove only the first block's authoring margin so the
|
|
545
|
+
toolbar-to-document gap is half the previous inset without changing spacing inside the document. */
|
|
546
|
+
.vr-pm-markdown-doc > :first-child {
|
|
547
|
+
margin-top: 0;
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/* Contract 14: supported tables edit natively in place. The old duplicate grid
|
|
551
|
+
overlay and its occlusion rules are intentionally gone — markdownReadingMeasure
|
|
552
|
+
.test.ts pins their absence. The protected-table fallback keeps its own controls. */
|
|
553
|
+
|
|
554
|
+
.vr-markdown-table-editor-controls {
|
|
555
|
+
display: flex;
|
|
556
|
+
flex-wrap: wrap;
|
|
557
|
+
gap: 0.5rem;
|
|
558
|
+
margin-top: 0.75rem;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
.vr-pm-markdown-doc h1,
|
|
562
|
+
.vr-pm-markdown-doc h2,
|
|
563
|
+
.vr-pm-markdown-doc h3,
|
|
564
|
+
.vr-pm-markdown-doc h4,
|
|
565
|
+
.vr-pm-markdown-doc h5,
|
|
566
|
+
.vr-pm-markdown-doc h6 {
|
|
567
|
+
margin: 1.25rem 0 0.5rem;
|
|
568
|
+
color: var(--doc-fg);
|
|
569
|
+
font-family: var(--doc-font);
|
|
570
|
+
font-weight: 600;
|
|
571
|
+
letter-spacing: 0;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
.vr-pm-markdown-doc h1 { font-size: 1.5em; line-height: 1.2; }
|
|
575
|
+
.vr-pm-markdown-doc h2 { font-size: 1.25em; line-height: 1.2; }
|
|
576
|
+
.vr-pm-markdown-doc h3 { font-size: 1.125em; line-height: 1.3; }
|
|
577
|
+
.vr-pm-markdown-doc h4 { font-size: 1em; line-height: 1.3; }
|
|
578
|
+
.vr-pm-markdown-doc h5,
|
|
579
|
+
.vr-pm-markdown-doc h6 { font-size: 0.95em; line-height: 1.3; }
|
|
580
|
+
|
|
581
|
+
.vr-pm-markdown-doc p {
|
|
582
|
+
margin: 0.75rem 0;
|
|
583
|
+
line-height: 1.625;
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
.vr-pm-markdown-doc strong {
|
|
587
|
+
font-weight: 760;
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
.vr-pm-markdown-doc em {
|
|
591
|
+
font-style: italic;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
.vr-pm-markdown-doc :not(pre) > code {
|
|
595
|
+
border: 1px solid color-mix(in srgb, var(--reader-line) 82%, transparent);
|
|
596
|
+
border-radius: 5px;
|
|
597
|
+
background: color-mix(in srgb, var(--reader-line) 34%, transparent);
|
|
598
|
+
padding: 0.06em 0.28em;
|
|
599
|
+
font-family: var(--font-mono);
|
|
600
|
+
font-size: 0.82em;
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
.vr-pm-markdown-doc a {
|
|
604
|
+
color: var(--copper-hi);
|
|
605
|
+
text-decoration: underline;
|
|
606
|
+
text-decoration-thickness: 0.08em;
|
|
607
|
+
text-underline-offset: 0.18em;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
.vr-pm-markdown-doc blockquote {
|
|
611
|
+
margin: 1rem 0;
|
|
612
|
+
border: 1px solid var(--reader-line);
|
|
613
|
+
border-radius: 6px;
|
|
614
|
+
padding: 0.75rem 1rem;
|
|
615
|
+
color: var(--muted);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
.vr-pm-markdown-doc ul,
|
|
619
|
+
.vr-pm-markdown-doc ol {
|
|
620
|
+
margin: 0.75rem 0;
|
|
621
|
+
padding-left: 1.5rem;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
.vr-pm-markdown-doc ul {
|
|
625
|
+
list-style: disc;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
.vr-pm-markdown-doc ol {
|
|
629
|
+
list-style: decimal;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
.vr-pm-markdown-doc li {
|
|
633
|
+
margin: 0.25rem 0;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
.vr-pm-markdown-doc li > p {
|
|
637
|
+
margin: 0;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
.vr-pm-protected-block {
|
|
641
|
+
cursor: default;
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
.vr-pm-markdown-doc [data-vr-raw-block] {
|
|
645
|
+
margin: 1em 0;
|
|
646
|
+
overflow: auto;
|
|
647
|
+
border: 1px solid var(--reader-line);
|
|
648
|
+
border-radius: 8px;
|
|
649
|
+
background: color-mix(in srgb, var(--reader-line) 32%, transparent);
|
|
650
|
+
color: color-mix(in srgb, var(--paper) 84%, transparent);
|
|
651
|
+
padding: 12px 14px;
|
|
652
|
+
font-family: var(--font-mono);
|
|
653
|
+
font-size: 0.82em;
|
|
654
|
+
line-height: 1.55;
|
|
655
|
+
white-space: pre-wrap;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/* Shiki dual-theme: spans carry --shiki-light/--shiki-dark vars; switch on the app theme. */
|
|
659
|
+
.shiki-host .shiki {
|
|
660
|
+
margin: 0;
|
|
661
|
+
padding: 12px 14px;
|
|
662
|
+
font-size: 13px;
|
|
663
|
+
line-height: 1.6;
|
|
664
|
+
background-color: var(--shiki-light-bg);
|
|
665
|
+
}
|
|
666
|
+
.shiki-host .shiki span {
|
|
667
|
+
color: var(--shiki-light);
|
|
668
|
+
}
|
|
669
|
+
[data-theme="dark"] .shiki-host .shiki {
|
|
670
|
+
background-color: var(--shiki-dark-bg);
|
|
671
|
+
}
|
|
672
|
+
[data-theme="dark"] .shiki-host .shiki span {
|
|
673
|
+
color: var(--shiki-dark);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
/* Toast — slide up from bottom on enter, slide down on exit. Uses CSS transition +
|
|
677
|
+
@starting-style so new toasts animate in without JS and exit via a class swap. */
|
|
678
|
+
.vr-toast-row {
|
|
679
|
+
transition: transform 280ms cubic-bezier(0.32, 0.72, 0, 1), opacity 250ms ease;
|
|
680
|
+
@starting-style {
|
|
681
|
+
opacity: 0;
|
|
682
|
+
transform: translateY(12px);
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
.vr-toast-exit {
|
|
687
|
+
animation: vr-toast-exit 150ms cubic-bezier(0.55, 0, 1, 0.45) forwards;
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
@keyframes vr-toast-exit {
|
|
691
|
+
to {
|
|
692
|
+
opacity: 0;
|
|
693
|
+
transform: translateY(8px) scale(0.96);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
/* Sidebar pane — fade in after collapse/expand remount so the swap feels deliberate */
|
|
698
|
+
[data-vr-sidebar] {
|
|
699
|
+
@starting-style {
|
|
700
|
+
opacity: 0;
|
|
701
|
+
}
|
|
702
|
+
transition: opacity 120ms ease;
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
/* Filter input — slide down from above when it appears (>4 tabs) */
|
|
706
|
+
[data-vr-filter-input] {
|
|
707
|
+
transition: opacity 120ms ease, transform 120ms cubic-bezier(0.23, 1, 0.32, 1);
|
|
708
|
+
@starting-style {
|
|
709
|
+
opacity: 0;
|
|
710
|
+
transform: translateY(-4px);
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
/* Invalid-input shake (e.g. an out-of-range PDF page number). Respects reduced-motion. */
|
|
715
|
+
@keyframes vr-shake {
|
|
716
|
+
0%, 100% { transform: translateX(0); }
|
|
717
|
+
20% { transform: translateX(-4px); }
|
|
718
|
+
40% { transform: translateX(4px); }
|
|
719
|
+
60% { transform: translateX(-3px); }
|
|
720
|
+
80% { transform: translateX(3px); }
|
|
721
|
+
}
|
|
722
|
+
.vr-shake { animation: vr-shake 0.34s ease-in-out; }
|
|
723
|
+
@media (prefers-reduced-motion: reduce) {
|
|
724
|
+
.vr-shake { animation: none; }
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
/* Skip-to-content — off-screen until focused, then a copper pill at the top-left. */
|
|
728
|
+
.vr-skip-link {
|
|
729
|
+
position: fixed;
|
|
730
|
+
top: 8px;
|
|
731
|
+
left: -9999px;
|
|
732
|
+
z-index: 200;
|
|
733
|
+
border-radius: 8px;
|
|
734
|
+
border: 1px solid var(--copper);
|
|
735
|
+
background: var(--panel);
|
|
736
|
+
color: var(--copper-hi);
|
|
737
|
+
padding: 8px 14px;
|
|
738
|
+
font-family: var(--font-sans);
|
|
739
|
+
font-size: var(--vr-text-sm);
|
|
740
|
+
}
|
|
741
|
+
/* Only for keyboard users (Tab), and placed below the macOS traffic lights so it never covers
|
|
742
|
+
them when the window gains focus at launch. */
|
|
743
|
+
html[data-vr-keyboard] .vr-skip-link:focus-visible {
|
|
744
|
+
left: 8px;
|
|
745
|
+
top: 44px;
|
|
746
|
+
outline: 2px solid color-mix(in srgb, var(--copper) 40%, transparent);
|
|
747
|
+
outline-offset: 2px;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
/* Body-level print host (documentPrinting.ts): every printable format mounts document-only content
|
|
751
|
+
* here and calls the native print command instead of printing app chrome or editor scrollers.
|
|
752
|
+
* Hidden on screen always; shown ONLY
|
|
753
|
+
* while [data-vr-print-active] is set for the duration of that print call. */
|
|
754
|
+
[data-vr-print-host] { display: none; }
|
|
755
|
+
@media print {
|
|
756
|
+
body[data-vr-print-active] #root { display: none !important; }
|
|
757
|
+
body[data-vr-print-active] [data-vr-print-host] {
|
|
758
|
+
display: block !important;
|
|
759
|
+
width: auto !important;
|
|
760
|
+
height: auto !important;
|
|
761
|
+
min-height: 0 !important;
|
|
762
|
+
overflow: visible !important;
|
|
763
|
+
background: #fff;
|
|
764
|
+
color: #111;
|
|
765
|
+
color-scheme: light;
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
/* Print — drop the app chrome, output only the document. */
|
|
770
|
+
@media print {
|
|
771
|
+
@page { margin: 0; }
|
|
772
|
+
.no-print { display: none !important; }
|
|
773
|
+
[role="menu"],
|
|
774
|
+
[role="dialog"],
|
|
775
|
+
[role="alertdialog"] {
|
|
776
|
+
display: none !important;
|
|
777
|
+
}
|
|
778
|
+
html, body, #root { height: auto !important; overflow: visible !important; background: #fff; }
|
|
779
|
+
body { color: #111 !important; margin: 0 !important; }
|
|
780
|
+
[data-vr-content-plane] {
|
|
781
|
+
position: static !important;
|
|
782
|
+
display: block !important;
|
|
783
|
+
height: auto !important;
|
|
784
|
+
min-height: 0 !important;
|
|
785
|
+
overflow: visible !important;
|
|
786
|
+
box-sizing: border-box !important;
|
|
787
|
+
border-radius: 0 !important;
|
|
788
|
+
box-shadow: none !important;
|
|
789
|
+
background: #fff !important;
|
|
790
|
+
}
|
|
791
|
+
[data-vr-content-plane] > [aria-hidden="true"] {
|
|
792
|
+
display: none !important;
|
|
793
|
+
}
|
|
794
|
+
[data-vr-content-plane] > [aria-hidden="false"],
|
|
795
|
+
[data-vr-content-plane] > [data-document-scroll] {
|
|
796
|
+
position: static !important;
|
|
797
|
+
inset: auto !important;
|
|
798
|
+
height: auto !important;
|
|
799
|
+
min-height: 0 !important;
|
|
800
|
+
overflow: visible !important;
|
|
801
|
+
visibility: visible !important;
|
|
802
|
+
pointer-events: auto !important;
|
|
803
|
+
background: #fff !important;
|
|
804
|
+
padding: 0.7in 0.8in !important;
|
|
805
|
+
box-sizing: border-box !important;
|
|
806
|
+
}
|
|
807
|
+
[data-document-scroll],
|
|
808
|
+
[data-document-scroll] > * {
|
|
809
|
+
height: auto !important;
|
|
810
|
+
overflow: visible !important;
|
|
811
|
+
}
|
|
812
|
+
.reading { color: #111 !important; }
|
|
813
|
+
/* Image editor uses a centered, transformed canvas for pan/zoom. Print needs image flow. */
|
|
814
|
+
[data-rk-image-stage] {
|
|
815
|
+
display: block !important;
|
|
816
|
+
height: auto !important;
|
|
817
|
+
min-height: 0 !important;
|
|
818
|
+
overflow: visible !important;
|
|
819
|
+
}
|
|
820
|
+
[data-rk-image-stage] > div:first-of-type {
|
|
821
|
+
position: static !important;
|
|
822
|
+
transform: none !important;
|
|
823
|
+
display: block !important;
|
|
824
|
+
}
|
|
825
|
+
[data-rk-image-stage] > div:first-of-type > div,
|
|
826
|
+
[data-rk-image-stage] > div:first-of-type > div > div {
|
|
827
|
+
width: auto !important;
|
|
828
|
+
height: auto !important;
|
|
829
|
+
transform: none !important;
|
|
830
|
+
overflow: visible !important;
|
|
831
|
+
}
|
|
832
|
+
[data-rk-image-printable] {
|
|
833
|
+
display: block !important;
|
|
834
|
+
width: auto !important;
|
|
835
|
+
height: auto !important;
|
|
836
|
+
max-width: 100% !important;
|
|
837
|
+
max-height: none !important;
|
|
838
|
+
}
|
|
839
|
+
[data-rk-image-stage] > div:not(:first-of-type) {
|
|
840
|
+
display: none !important;
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
/* Source-editor density — font-size, leading, and content padding for the CodeMirror surfaces.
|
|
845
|
+
These live here (not in the per-instance EditorView.theme) because CodeMirror's generated theme
|
|
846
|
+
classes proved unreliable for these props (a class could be applied while its StyleModule was
|
|
847
|
+
unmounted, silently dropping the source font-size to the inherited 16px — the "font shift" on
|
|
848
|
+
opening source). The `[data-vr-density] .cm-editor .cm-scroller` selector outweighs CodeMirror's
|
|
849
|
+
`.<theme> .cm-scroller`, so these always win regardless of injection timing. */
|
|
850
|
+
[data-vr-density="source"] .cm-editor .cm-scroller {
|
|
851
|
+
font-size: var(--source-size);
|
|
852
|
+
line-height: 1.46;
|
|
853
|
+
}
|
|
854
|
+
[data-vr-density="source"] .cm-editor .cm-content {
|
|
855
|
+
padding: 10px 14px 72px 14px;
|
|
856
|
+
}
|
|
857
|
+
[data-vr-density="reading"] .cm-editor .cm-scroller {
|
|
858
|
+
font-size: var(--doc-size);
|
|
859
|
+
line-height: var(--doc-leading);
|
|
860
|
+
}
|
|
861
|
+
[data-vr-density="reading"] .cm-editor .cm-content {
|
|
862
|
+
/* No toolbar above the text surface — inset the top so line 1 clears the window titlebar. */
|
|
863
|
+
padding: 32px 20px 72px;
|
|
864
|
+
}
|
|
865
|
+
[data-vr-density="plain"] .cm-editor .cm-scroller {
|
|
866
|
+
font-size: 13px;
|
|
867
|
+
line-height: 1.58;
|
|
868
|
+
}
|
|
869
|
+
[data-vr-density="plain"] .cm-editor .cm-content {
|
|
870
|
+
/* Plain text has no toolbar above it, so the first line would butt against the window titlebar;
|
|
871
|
+
a generous top inset gives it breathing room. */
|
|
872
|
+
padding: 32px 20px 72px;
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
/* DOCX find decorations (ProseMirror inline decorations on the paged editor surface). */
|
|
876
|
+
.vr-docx-search-match {
|
|
877
|
+
background-color: color-mix(in srgb, var(--copper) 40%, transparent);
|
|
878
|
+
border-radius: 2px;
|
|
879
|
+
}
|
|
880
|
+
.vr-docx-search-active {
|
|
881
|
+
background-color: var(--copper);
|
|
882
|
+
color: var(--paper);
|
|
883
|
+
border-radius: 2px;
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/* Search has no persistent toolbar chrome. Shortcuts open one overlay below each format's top
|
|
887
|
+
chrome without reserving document height. */
|
|
888
|
+
.vr-document-toolbar-search-layout {
|
|
889
|
+
position: relative;
|
|
890
|
+
display: block;
|
|
891
|
+
}
|
|
892
|
+
|
|
893
|
+
.vr-document-toolbar-main {
|
|
894
|
+
min-width: 0;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/* The focusable image stage shows the copper focus ring (inset so the stage edge does not clip it). */
|
|
898
|
+
[data-vr-image-host] .rk-iv-stage:focus-visible {
|
|
899
|
+
outline: none;
|
|
900
|
+
box-shadow: inset 0 0 0 2px var(--copper);
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
/* @rightkit/media-ui image viewer — the host app look. Tokens map the viewer onto the host app
|
|
904
|
+
palette; the rules restore the former Tailwind geometry (TBtn, vr-capsule-scroll, panels). The
|
|
905
|
+
capsule is portalled into the document bar, so its rules key off .vr-image-capsule. */
|
|
906
|
+
[data-vr-image-host],
|
|
907
|
+
.vr-image-capsule {
|
|
908
|
+
--rk-iv-accent: var(--copper);
|
|
909
|
+
--rk-iv-bg: var(--ink);
|
|
910
|
+
--rk-iv-panel: var(--panel);
|
|
911
|
+
--rk-iv-line: var(--line);
|
|
912
|
+
--rk-iv-fg: var(--paper);
|
|
913
|
+
--rk-iv-fg-dim: var(--muted);
|
|
914
|
+
}
|
|
915
|
+
[data-vr-image-host] > .rk-iv {
|
|
916
|
+
flex: 1;
|
|
917
|
+
height: auto;
|
|
918
|
+
background: none;
|
|
919
|
+
font-size: inherit;
|
|
920
|
+
color: inherit;
|
|
921
|
+
}
|
|
922
|
+
[data-vr-image-host] .rk-iv-panels {
|
|
923
|
+
font-size: inherit;
|
|
924
|
+
color: inherit;
|
|
925
|
+
}
|
|
926
|
+
.vr-image-capsule .rk-iv-bar {
|
|
927
|
+
display: contents;
|
|
928
|
+
font-size: inherit;
|
|
929
|
+
color: inherit;
|
|
930
|
+
}
|
|
931
|
+
.vr-image-capsule .rk-iv-capsule {
|
|
932
|
+
display: flex;
|
|
933
|
+
flex-shrink: 1;
|
|
934
|
+
align-items: center;
|
|
935
|
+
gap: 0.25rem;
|
|
936
|
+
height: auto;
|
|
937
|
+
min-width: 0;
|
|
938
|
+
width: auto;
|
|
939
|
+
max-width: none;
|
|
940
|
+
margin: 0;
|
|
941
|
+
padding: 0.25rem;
|
|
942
|
+
border-width: 0;
|
|
943
|
+
border-style: solid;
|
|
944
|
+
border-color: currentColor;
|
|
945
|
+
border-radius: inherit;
|
|
946
|
+
background: none;
|
|
947
|
+
box-shadow: none;
|
|
948
|
+
overflow-x: auto;
|
|
949
|
+
scrollbar-width: none;
|
|
950
|
+
}
|
|
951
|
+
.vr-image-capsule .rk-iv-capsule::-webkit-scrollbar {
|
|
952
|
+
display: none;
|
|
953
|
+
}
|
|
954
|
+
[data-vr-doc-bar] .vr-image-capsule .rk-iv-capsule {
|
|
955
|
+
overflow-x: visible;
|
|
956
|
+
flex-wrap: wrap;
|
|
957
|
+
}
|
|
958
|
+
:is([data-vr-image-host], .vr-image-capsule) .rk-iv-btn {
|
|
959
|
+
display: grid;
|
|
960
|
+
flex-shrink: 0;
|
|
961
|
+
place-items: center;
|
|
962
|
+
width: 28px;
|
|
963
|
+
height: 28px;
|
|
964
|
+
padding: 0;
|
|
965
|
+
border: 1px solid transparent;
|
|
966
|
+
border-radius: 0.375rem;
|
|
967
|
+
background: none;
|
|
968
|
+
color: var(--muted);
|
|
969
|
+
font-size: var(--vr-text-sm);
|
|
970
|
+
line-height: 1;
|
|
971
|
+
text-align: center;
|
|
972
|
+
cursor: pointer;
|
|
973
|
+
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
|
|
974
|
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
975
|
+
transition-duration: 150ms;
|
|
976
|
+
}
|
|
977
|
+
:is([data-vr-image-host], .vr-image-capsule) .rk-iv-btn-round {
|
|
978
|
+
height: 34px;
|
|
979
|
+
width: 34px;
|
|
980
|
+
border-radius: 9999px;
|
|
981
|
+
}
|
|
982
|
+
:is([data-vr-image-host], .vr-image-capsule) .rk-iv-btn:hover {
|
|
983
|
+
border-color: var(--line);
|
|
984
|
+
background: none;
|
|
985
|
+
color: var(--paper);
|
|
986
|
+
}
|
|
987
|
+
:is([data-vr-image-host], .vr-image-capsule) .rk-iv-btn[data-active] {
|
|
988
|
+
border-color: var(--copper);
|
|
989
|
+
background: color-mix(in oklab, var(--copper) 15%, transparent);
|
|
990
|
+
color: var(--copper-hi);
|
|
991
|
+
}
|
|
992
|
+
/* Panels sit inside .vr-chrome, where accent text reads as the chrome paper token. */
|
|
993
|
+
[data-vr-image-host] .rk-iv-btn[data-active] {
|
|
994
|
+
color: var(--paper);
|
|
995
|
+
}
|
|
996
|
+
:is([data-vr-image-host], .vr-image-capsule) .rk-iv-btn:disabled {
|
|
997
|
+
cursor: not-allowed;
|
|
998
|
+
opacity: 0.35;
|
|
999
|
+
border-color: transparent;
|
|
1000
|
+
color: var(--muted);
|
|
1001
|
+
}
|
|
1002
|
+
:is([data-vr-image-host], .vr-image-capsule) .rk-iv-btn:focus-visible {
|
|
1003
|
+
outline: none;
|
|
1004
|
+
box-shadow: 0 0 0 2px var(--copper);
|
|
1005
|
+
}
|
|
1006
|
+
:is([data-vr-image-host], .vr-image-capsule) .rk-iv-sep {
|
|
1007
|
+
flex-shrink: 0;
|
|
1008
|
+
width: 1px;
|
|
1009
|
+
height: 1.25rem;
|
|
1010
|
+
margin: 0 0.25rem;
|
|
1011
|
+
background: var(--line);
|
|
1012
|
+
}
|
|
1013
|
+
.vr-image-capsule .rk-iv-zoom {
|
|
1014
|
+
flex-shrink: 0;
|
|
1015
|
+
width: 4.75rem;
|
|
1016
|
+
height: 1.75rem;
|
|
1017
|
+
padding: 0 0.25rem;
|
|
1018
|
+
border: 1px solid var(--line);
|
|
1019
|
+
border-radius: 0.375rem;
|
|
1020
|
+
background: var(--ink);
|
|
1021
|
+
color: var(--muted-2);
|
|
1022
|
+
font-family: var(--font-mono);
|
|
1023
|
+
font-size: 0.75rem;
|
|
1024
|
+
line-height: 1rem;
|
|
1025
|
+
}
|
|
1026
|
+
.vr-image-capsule .rk-iv-zoom:focus {
|
|
1027
|
+
border-color: var(--line);
|
|
1028
|
+
}
|
|
1029
|
+
.vr-image-capsule .rk-iv-zoom:disabled {
|
|
1030
|
+
cursor: not-allowed;
|
|
1031
|
+
opacity: 0.35;
|
|
1032
|
+
}
|
|
1033
|
+
[data-vr-image-host] .rk-iv-panel {
|
|
1034
|
+
gap: 0.5rem;
|
|
1035
|
+
padding: 0.5rem 0.75rem;
|
|
1036
|
+
border-top: 1px solid var(--line);
|
|
1037
|
+
background: var(--panel);
|
|
1038
|
+
}
|
|
1039
|
+
[data-vr-image-host] .rk-iv-panel-wrap {
|
|
1040
|
+
column-gap: 1rem;
|
|
1041
|
+
row-gap: 0.5rem;
|
|
1042
|
+
}
|
|
1043
|
+
[data-vr-image-host] .rk-iv-panel-wrap:has(.rk-iv-text) {
|
|
1044
|
+
column-gap: 0.5rem;
|
|
1045
|
+
}
|
|
1046
|
+
[data-vr-image-host] .rk-iv-dim {
|
|
1047
|
+
color: var(--muted-2);
|
|
1048
|
+
}
|
|
1049
|
+
[data-vr-image-host] .rk-iv-input {
|
|
1050
|
+
height: 1.75rem;
|
|
1051
|
+
padding: 0 0.5rem;
|
|
1052
|
+
border: 1px solid var(--line);
|
|
1053
|
+
border-radius: 0;
|
|
1054
|
+
background: var(--ink);
|
|
1055
|
+
color: var(--paper);
|
|
1056
|
+
font-size: inherit;
|
|
1057
|
+
outline: none;
|
|
1058
|
+
}
|
|
1059
|
+
[data-vr-image-host] .rk-iv-input:focus {
|
|
1060
|
+
border-color: var(--copper);
|
|
1061
|
+
}
|
|
1062
|
+
[data-vr-image-host] .rk-iv-input:disabled {
|
|
1063
|
+
opacity: 0.4;
|
|
1064
|
+
}
|
|
1065
|
+
[data-vr-image-host] .rk-iv-color {
|
|
1066
|
+
display: flex;
|
|
1067
|
+
height: 1.75rem;
|
|
1068
|
+
align-items: center;
|
|
1069
|
+
gap: 0.5rem;
|
|
1070
|
+
padding: 0 0.5rem;
|
|
1071
|
+
border: 1px solid var(--line);
|
|
1072
|
+
border-radius: 0;
|
|
1073
|
+
background: var(--ink);
|
|
1074
|
+
color: var(--muted);
|
|
1075
|
+
}
|
|
1076
|
+
[data-vr-image-host] .rk-iv-color:hover {
|
|
1077
|
+
border-color: rgb(var(--copper-rgb) / 0.6);
|
|
1078
|
+
color: var(--paper);
|
|
1079
|
+
}
|
|
1080
|
+
[data-vr-image-host] .rk-iv-color > .rk-iv-dim {
|
|
1081
|
+
color: inherit;
|
|
1082
|
+
font-size: var(--vr-text-xs);
|
|
1083
|
+
line-height: 1;
|
|
1084
|
+
}
|
|
1085
|
+
[data-vr-image-host] .rk-iv-swatch {
|
|
1086
|
+
border: 1px solid var(--line);
|
|
1087
|
+
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.24);
|
|
1088
|
+
}
|
|
1089
|
+
[data-vr-image-host] .rk-iv-range {
|
|
1090
|
+
accent-color: var(--copper);
|
|
1091
|
+
}
|
|
1092
|
+
[data-vr-image-host] .rk-iv-swatch input[type="color"] {
|
|
1093
|
+
border-width: 0;
|
|
1094
|
+
border-style: solid;
|
|
1095
|
+
}
|
|
1096
|
+
[data-vr-image-host] .rk-iv-badge {
|
|
1097
|
+
border-radius: 0.25rem;
|
|
1098
|
+
background: color-mix(in oklab, var(--panel) 90%, transparent);
|
|
1099
|
+
font-family: var(--font-mono);
|
|
1100
|
+
font-size: var(--vr-text-xs);
|
|
1101
|
+
line-height: 1.5;
|
|
1102
|
+
color: var(--muted);
|
|
1103
|
+
box-shadow:
|
|
1104
|
+
0 10px 15px -3px rgb(0 0 0 / 0.1),
|
|
1105
|
+
0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
1106
|
+
}
|
|
1107
|
+
[data-vr-image-host] .rk-iv-sibling {
|
|
1108
|
+
border: 1px solid var(--line);
|
|
1109
|
+
background: color-mix(in oklab, var(--panel) 80%, transparent);
|
|
1110
|
+
color: var(--muted);
|
|
1111
|
+
box-shadow:
|
|
1112
|
+
0 10px 15px -3px rgb(0 0 0 / 0.1),
|
|
1113
|
+
0 4px 6px -4px rgb(0 0 0 / 0.1);
|
|
1114
|
+
-webkit-backdrop-filter: blur(8px);
|
|
1115
|
+
backdrop-filter: blur(8px);
|
|
1116
|
+
transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter;
|
|
1117
|
+
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
|
1118
|
+
transition-duration: 150ms;
|
|
1119
|
+
}
|
|
1120
|
+
[data-vr-image-host] .rk-iv-sibling:hover {
|
|
1121
|
+
background: var(--panel);
|
|
1122
|
+
color: var(--copper-hi);
|
|
1123
|
+
}
|
|
1124
|
+
[data-vr-image-host] .rk-iv-sibling:disabled {
|
|
1125
|
+
cursor: default;
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
/* Image cropper — keep the focused crop tool visually inside the host app shell. */
|
|
1129
|
+
.rk-iv-crop .ReactCrop__crop-selection {
|
|
1130
|
+
border-color: var(--copper-hi);
|
|
1131
|
+
box-shadow: 0 0 0 9999em rgba(0, 0, 0, 0.52);
|
|
1132
|
+
}
|
|
1133
|
+
.rk-iv-crop .ReactCrop__drag-handle::after {
|
|
1134
|
+
width: 10px;
|
|
1135
|
+
height: 10px;
|
|
1136
|
+
background: var(--panel);
|
|
1137
|
+
border: 1px solid var(--copper-hi);
|
|
1138
|
+
}
|
|
1139
|
+
.rk-iv-crop .ReactCrop__rule-of-thirds-vt::before,
|
|
1140
|
+
.rk-iv-crop .ReactCrop__rule-of-thirds-vt::after,
|
|
1141
|
+
.rk-iv-crop .ReactCrop__rule-of-thirds-hz::before,
|
|
1142
|
+
.rk-iv-crop .ReactCrop__rule-of-thirds-hz::after {
|
|
1143
|
+
background-color: color-mix(in srgb, var(--paper) 46%, transparent);
|
|
1144
|
+
}
|
|
1145
|
+
|
|
1146
|
+
.vr-pop {
|
|
1147
|
+
animation: vr-pop-in 140ms cubic-bezier(0.23, 1, 0.32, 1);
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
/* Origin variants — popovers scale from their trigger; modals from center */
|
|
1151
|
+
.vr-pop-menu-tr { transform-origin: top right; }
|
|
1152
|
+
.vr-pop-modal { transform-origin: center; }
|
|
1153
|
+
|
|
1154
|
+
@keyframes vr-pop-in {
|
|
1155
|
+
from {
|
|
1156
|
+
opacity: 0;
|
|
1157
|
+
transform: translateY(4px) scale(0.98);
|
|
1158
|
+
}
|
|
1159
|
+
to {
|
|
1160
|
+
opacity: 1;
|
|
1161
|
+
transform: translateY(0) scale(1);
|
|
1162
|
+
}
|
|
1163
|
+
}
|
|
1164
|
+
|
|
1165
|
+
/* Exit animation — asymmetric: exit faster than enter */
|
|
1166
|
+
.vr-pop-exit {
|
|
1167
|
+
animation: vr-pop-out 80ms cubic-bezier(0.55, 0, 1, 0.45) forwards;
|
|
1168
|
+
}
|
|
1169
|
+
|
|
1170
|
+
@keyframes vr-pop-out {
|
|
1171
|
+
to {
|
|
1172
|
+
opacity: 0;
|
|
1173
|
+
transform: scale(0.97) translateY(2px);
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
|
|
1177
|
+
.vr-press {
|
|
1178
|
+
transition-property: color, background-color, border-color, box-shadow, transform;
|
|
1179
|
+
transition-duration: 140ms;
|
|
1180
|
+
transition-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
|
|
1181
|
+
}
|
|
1182
|
+
|
|
1183
|
+
.vr-press:active:not(:disabled) {
|
|
1184
|
+
transform: scale(0.96);
|
|
1185
|
+
}
|
|
1186
|
+
|
|
1187
|
+
/* Mermaid diagrams keep their natural measured SVG box; the wrapper owns horizontal scrolling. */
|
|
1188
|
+
.vr-mermaid svg {
|
|
1189
|
+
display: block;
|
|
1190
|
+
margin-inline: auto;
|
|
1191
|
+
max-width: none !important;
|
|
1192
|
+
height: auto;
|
|
1193
|
+
overflow: visible;
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
.vr-source-focus .cm-line:not(.cm-activeLine) {
|
|
1197
|
+
opacity: 0.62;
|
|
1198
|
+
}
|
|
1199
|
+
|
|
1200
|
+
.vr-source-focus .cm-activeLine {
|
|
1201
|
+
opacity: 1;
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
.vr-focus {
|
|
1205
|
+
outline: none;
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
.vr-focus:focus-visible {
|
|
1209
|
+
box-shadow: 0 0 0 2px var(--copper);
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
/* Floating capsule — the shared frosted-glass idiom for every floating control: toolbar pill
|
|
1213
|
+
groups, the Read/Edit control, floating format/markup/image bars, find capsules, the bottom
|
|
1214
|
+
stats pill and toasts; each consumer sets its own height. Panel token at 72% — inside
|
|
1215
|
+
.vr-chrome --panel remaps to the chrome token, so title-bar capsules pick up the chrome tint
|
|
1216
|
+
for free — with a 0.5px hairline, a blur(20px) saturate(1.6) backdrop, an inset top highlight
|
|
1217
|
+
keyed to the theme mode, and the existing soft shadow. No gradients. */
|
|
1218
|
+
.vr-capsule {
|
|
1219
|
+
display: flex;
|
|
1220
|
+
align-items: center;
|
|
1221
|
+
border: 0.5px solid var(--line);
|
|
1222
|
+
border-radius: 999px;
|
|
1223
|
+
background: var(--panel-2);
|
|
1224
|
+
box-shadow:
|
|
1225
|
+
inset 0 1px 0 var(--vr-glass-hi),
|
|
1226
|
+
0 1px 2px rgb(0 0 0 / 0.10),
|
|
1227
|
+
0 6px 18px rgb(0 0 0 / 0.16);
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
/* Real glass only where there is content behind it: capsules that genuinely float over the
|
|
1231
|
+
document (Find, the selection bubble, the word-count pill, toasts). The page shows through,
|
|
1232
|
+
blurred and tinted by the theme; title-bar pills and the docked format bar stay solid because
|
|
1233
|
+
nothing scrolls behind them. Opacity stays high enough that muted labels keep readable contrast
|
|
1234
|
+
over arbitrary page content — the 15% see-through plus the blur keeps the glass read without
|
|
1235
|
+
letting a bright/dark page eat the text. */
|
|
1236
|
+
[data-vr-find-placement] .vr-capsule,
|
|
1237
|
+
.vr-capsule[data-vr-find-placement],
|
|
1238
|
+
.vr-capsule.vr-over-content {
|
|
1239
|
+
background: rgb(var(--panel-rgb) / 0.72);
|
|
1240
|
+
-webkit-backdrop-filter: blur(8px) saturate(1.8);
|
|
1241
|
+
backdrop-filter: blur(8px) saturate(1.8);
|
|
1242
|
+
border-color: rgb(var(--paper-rgb) / 0.22);
|
|
1243
|
+
}
|
|
1244
|
+
|
|
1245
|
+
/* Find has one capsule border & one focused field border; inputs inherit that field focus. */
|
|
1246
|
+
[data-vr-find-placement] .vr-capsule {
|
|
1247
|
+
box-shadow:
|
|
1248
|
+
0 1px 2px rgb(0 0 0 / 0.10),
|
|
1249
|
+
0 6px 18px rgb(0 0 0 / 0.16);
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
#vr-sidebar-document-search input:focus-visible,
|
|
1253
|
+
[data-vr-find-placement] input:focus-visible {
|
|
1254
|
+
box-shadow: none;
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1257
|
+
/* Floating-panel glass — the same recipe on the elevated panel-2 token (chrome-2 inside
|
|
1258
|
+
.vr-chrome) for the command palette, the Aa + Appearance popovers, menu panels and the Info
|
|
1259
|
+
inspector. --vr-glass-rgb picks the tint channel; --vr-glass-solid is the surface the
|
|
1260
|
+
reduced-transparency fallback restores. */
|
|
1261
|
+
.vr-glass-panel {
|
|
1262
|
+
--vr-glass-rgb: var(--panel-2-rgb);
|
|
1263
|
+
--vr-glass-solid: var(--panel-2);
|
|
1264
|
+
border: 0.5px solid var(--line);
|
|
1265
|
+
background: rgb(var(--vr-glass-rgb) / 0.82);
|
|
1266
|
+
-webkit-backdrop-filter: blur(16px) saturate(1.8);
|
|
1267
|
+
backdrop-filter: blur(16px) saturate(1.8);
|
|
1268
|
+
box-shadow:
|
|
1269
|
+
inset 0 1px 0 var(--vr-glass-hi),
|
|
1270
|
+
0 12px 32px rgb(0 0 0 / 0.16),
|
|
1271
|
+
0 24px 64px rgb(0 0 0 / 0.22);
|
|
1272
|
+
}
|
|
1273
|
+
|
|
1274
|
+
/* The Info inspector docks against the window edge rather than floating: keep its single left
|
|
1275
|
+
hairline, skip the floating shadow, and tint it with panel (not panel-2). */
|
|
1276
|
+
#vr-info-inspector.vr-glass-panel {
|
|
1277
|
+
--vr-glass-rgb: var(--panel-rgb);
|
|
1278
|
+
--vr-glass-solid: var(--panel);
|
|
1279
|
+
border-width: 0 0 0 0.5px;
|
|
1280
|
+
box-shadow: inset 0 1px 0 var(--vr-glass-hi);
|
|
1281
|
+
}
|
|
1282
|
+
|
|
1283
|
+
/* Find owns the document plane's width rather than the docked toolbar's centre column. */
|
|
1284
|
+
[data-vr-toolbar-find] {
|
|
1285
|
+
right: auto;
|
|
1286
|
+
left: 50%;
|
|
1287
|
+
width: min(600px, calc(100% - 1.5rem));
|
|
1288
|
+
transform: translateX(-50%);
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
/* Docked format bar — every document format shows its full toolbar (view + edit controls merged)
|
|
1292
|
+
as one .vr-capsule row centred in a solid strip at the top of the document pane. The strip is in
|
|
1293
|
+
normal flow (each format mounts it as a shrink-0 row above its scroll container), painted with
|
|
1294
|
+
the reader surface with no divider line: the scroll area starts below the strip, so scrolled
|
|
1295
|
+
content simply ends at its invisible edge and never passes behind the bar. The find wrapper (data-vr-toolbar-find, absolute
|
|
1296
|
+
top-full) hangs 8px under the strip and overlays the content only while open — the :has rule
|
|
1297
|
+
above keeps it centred. A strip with no capsule (Markdown Read: find only) collapses to zero
|
|
1298
|
+
height so find floats at the top of the content as before. */
|
|
1299
|
+
[data-vr-floating-bar] {
|
|
1300
|
+
position: relative;
|
|
1301
|
+
z-index: 40;
|
|
1302
|
+
display: flex;
|
|
1303
|
+
flex-direction: column;
|
|
1304
|
+
align-items: center;
|
|
1305
|
+
gap: 0.5rem;
|
|
1306
|
+
padding-block: 6px;
|
|
1307
|
+
background: var(--reader-surface);
|
|
1308
|
+
}
|
|
1309
|
+
[data-vr-floating-bar]:not(:has(> .vr-capsule)) {
|
|
1310
|
+
padding-block: 0;
|
|
1311
|
+
}
|
|
1312
|
+
/* Docked capsule: solid (no glass — nothing sits behind it), same pill, hairline and tint as the
|
|
1313
|
+
former floating capsule; the lift shadow is trimmed so it never smudges across the hairline. A
|
|
1314
|
+
capsule whose controls overflow the pane scrolls horizontally — never clips, never wraps. */
|
|
1315
|
+
[data-vr-floating-bar] .vr-capsule {
|
|
1316
|
+
max-width: calc(100% - 1.5rem);
|
|
1317
|
+
overflow: hidden;
|
|
1318
|
+
}
|
|
1319
|
+
[data-vr-floating-bar] > .vr-capsule {
|
|
1320
|
+
background: var(--panel);
|
|
1321
|
+
border-color: rgb(var(--paper-rgb) / 0.22);
|
|
1322
|
+
box-shadow:
|
|
1323
|
+
inset 0 1px 0 var(--vr-glass-hi),
|
|
1324
|
+
0 1px 2px rgb(0 0 0 / 0.10);
|
|
1325
|
+
}
|
|
1326
|
+
/* Inside App's single docked document bar the format row is just its capsule: the bar itself
|
|
1327
|
+
supplies the padding and surface. */
|
|
1328
|
+
[data-vr-doc-bar] [data-vr-floating-bar] {
|
|
1329
|
+
padding-block: 0;
|
|
1330
|
+
background: transparent;
|
|
1331
|
+
width: 100%;
|
|
1332
|
+
min-width: 0;
|
|
1333
|
+
}
|
|
1334
|
+
/* The centre capsule fits its grid column (never overlapping the side capsules) and scrolls its
|
|
1335
|
+
controls inside when the window is narrow. */
|
|
1336
|
+
[data-vr-doc-bar] [data-vr-floating-bar] > .vr-capsule {
|
|
1337
|
+
max-width: 100%;
|
|
1338
|
+
}
|
|
1339
|
+
|
|
1340
|
+
/* Polish pass — one quiet toolbar row: inside the docked bar every capsule loses its own chrome
|
|
1341
|
+
and paints the reader surface (opaque so the bar never lets scrolled content show through).
|
|
1342
|
+
The row's toolbars wrap to extra lines at narrow widths instead of hiding behind a scroll —
|
|
1343
|
+
every tool stays visible (the old three-pill layout hid overflow). */
|
|
1344
|
+
[data-vr-doc-bar] .vr-capsule {
|
|
1345
|
+
height: auto;
|
|
1346
|
+
padding: 0;
|
|
1347
|
+
border: 0;
|
|
1348
|
+
border-radius: 0;
|
|
1349
|
+
background: var(--reader-surface);
|
|
1350
|
+
box-shadow: none;
|
|
1351
|
+
}
|
|
1352
|
+
[data-vr-doc-bar] [data-vr-floating-bar] > .vr-capsule {
|
|
1353
|
+
width: 100%;
|
|
1354
|
+
}
|
|
1355
|
+
[data-vr-doc-bar] [role="toolbar"] {
|
|
1356
|
+
flex-wrap: wrap;
|
|
1357
|
+
row-gap: 0.125rem;
|
|
1358
|
+
overflow-x: visible;
|
|
1359
|
+
}
|
|
1360
|
+
[data-vr-doc-bar] .vr-capsule-scroll {
|
|
1361
|
+
overflow-x: visible;
|
|
1362
|
+
flex-wrap: wrap;
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
/* Bottom status row — document path, live statistics, save state and the autosave switch docked
|
|
1366
|
+
to the bottom edge of the page, outside the scrolling content. */
|
|
1367
|
+
[data-vr-doc-status-bar] {
|
|
1368
|
+
display: flex;
|
|
1369
|
+
align-items: center;
|
|
1370
|
+
gap: 0.875rem;
|
|
1371
|
+
min-height: 30px;
|
|
1372
|
+
padding: 0 0.875rem;
|
|
1373
|
+
border-top: 1px solid color-mix(in srgb, var(--reader-line) 62%, transparent);
|
|
1374
|
+
background: var(--reader-surface);
|
|
1375
|
+
font-size: var(--vr-text-sm);
|
|
1376
|
+
color: var(--muted-2);
|
|
1377
|
+
user-select: none;
|
|
1378
|
+
}
|
|
1379
|
+
[data-vr-doc-status-bar] .vr-doc-path {
|
|
1380
|
+
min-width: 0;
|
|
1381
|
+
overflow: hidden;
|
|
1382
|
+
text-overflow: ellipsis;
|
|
1383
|
+
white-space: nowrap;
|
|
1384
|
+
font-family: var(--font-mono);
|
|
1385
|
+
font-size: var(--vr-text-xs);
|
|
1386
|
+
}
|
|
1387
|
+
/* Narrow windows: the status row drops the word count first; save state stays visible. */
|
|
1388
|
+
@media (max-width: 1100px) {
|
|
1389
|
+
[data-vr-doc-status] [data-vr-stats] {
|
|
1390
|
+
display: none;
|
|
1391
|
+
}
|
|
1392
|
+
}
|
|
1393
|
+
@media (max-width: 800px) {
|
|
1394
|
+
[data-vr-doc-bar] {
|
|
1395
|
+
flex-wrap: wrap;
|
|
1396
|
+
}
|
|
1397
|
+
[data-vr-doc-bar] > div:first-child {
|
|
1398
|
+
flex-basis: 100%;
|
|
1399
|
+
}
|
|
1400
|
+
[data-vr-doc-bar] > div:last-child {
|
|
1401
|
+
margin-left: auto;
|
|
1402
|
+
}
|
|
1403
|
+
[data-vr-doc-bar] .vr-capsule {
|
|
1404
|
+
flex-wrap: wrap;
|
|
1405
|
+
}
|
|
1406
|
+
}
|
|
1407
|
+
/* Inner row of a floating-bar capsule: fills the pill, scrolls its controls horizontally. */
|
|
1408
|
+
.vr-capsule-scroll {
|
|
1409
|
+
min-width: 0;
|
|
1410
|
+
border-radius: inherit;
|
|
1411
|
+
overflow-x: auto;
|
|
1412
|
+
scrollbar-width: none;
|
|
1413
|
+
}
|
|
1414
|
+
.vr-capsule-scroll::-webkit-scrollbar {
|
|
1415
|
+
display: none;
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
/* Reduced transparency: every glass surface collapses back to the solid colour it replaced,
|
|
1419
|
+
and under material the chrome goes fully opaque while the painted SVG corner returns — a
|
|
1420
|
+
rounded plane would otherwise open a see-through notch in a frame the user asked to be
|
|
1421
|
+
opaque. */
|
|
1422
|
+
@media (prefers-reduced-transparency: reduce) {
|
|
1423
|
+
.vr-capsule,
|
|
1424
|
+
[data-vr-find-placement] .vr-capsule,
|
|
1425
|
+
.vr-capsule[data-vr-find-placement],
|
|
1426
|
+
.vr-capsule.vr-over-content {
|
|
1427
|
+
-webkit-backdrop-filter: none;
|
|
1428
|
+
backdrop-filter: none;
|
|
1429
|
+
background: var(--panel-2);
|
|
1430
|
+
}
|
|
1431
|
+
.vr-glass-panel {
|
|
1432
|
+
-webkit-backdrop-filter: none;
|
|
1433
|
+
backdrop-filter: none;
|
|
1434
|
+
background: var(--vr-glass-solid);
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
/* Read-mode Markdown — the editor is non-editable, so hide its inline edit affordances (block
|
|
1439
|
+
action clusters, the code-fence language chip, the image "Edit" trigger). */
|
|
1440
|
+
[data-vr-md-readonly] .vr-protected-block-actions,
|
|
1441
|
+
[data-vr-md-readonly] .vr-pm-code-fence__header,
|
|
1442
|
+
[data-vr-md-readonly] .vr-image-edit-trigger {
|
|
1443
|
+
display: none;
|
|
1444
|
+
}
|
|
1445
|
+
|
|
1446
|
+
@media (prefers-reduced-motion: reduce) {
|
|
1447
|
+
*,
|
|
1448
|
+
*::before,
|
|
1449
|
+
*::after {
|
|
1450
|
+
animation-duration: 0.01ms !important;
|
|
1451
|
+
animation-iteration-count: 1 !important;
|
|
1452
|
+
scroll-behavior: auto !important;
|
|
1453
|
+
transition-duration: 0.01ms !important;
|
|
1454
|
+
}
|
|
1455
|
+
}
|
|
1456
|
+
|
|
1457
|
+
/* Shape consistency: anything interactive inside a round capsule is itself fully round, so its
|
|
1458
|
+
hover, active and focus states never read as a square inside a pill. */
|
|
1459
|
+
.vr-capsule :is(button, [role="button"], [role="switch"], [role="tab"], input, select) {
|
|
1460
|
+
border-radius: 999px;
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
/* Command palette rows: the shell's label and hint spans take no slot class, so the host app styles them here. */
|
|
1464
|
+
[role="dialog"][aria-label="Command palette"] .rk-palette__label {
|
|
1465
|
+
font-size: 14px;
|
|
1466
|
+
white-space: nowrap;
|
|
1467
|
+
text-overflow: ellipsis;
|
|
1468
|
+
}
|
|
1469
|
+
[role="dialog"][aria-label="Command palette"] .rk-palette__hint {
|
|
1470
|
+
margin-left: 0.75rem;
|
|
1471
|
+
font-family: var(--font-mono, ui-monospace, monospace);
|
|
1472
|
+
font-size: var(--vr-text-xs);
|
|
1473
|
+
color: var(--muted-2);
|
|
1474
|
+
}
|
|
1475
|
+
[role="dialog"][aria-label="Command palette"] .rk-palette__opt.is-active .rk-palette__hint {
|
|
1476
|
+
color: var(--muted);
|
|
1477
|
+
}
|