Files
edgeever/apps/web/src/styles/globals.css
T
tianma-if 71e2395e28 fix(editor): search and replace in the active editor mode
Search raw Markdown in source mode with literal character matching, batched undoable replacement, and matching highlights. Preserve query whitespace and keep replacement focus stable. Route source editor search shortcuts through the workspace controller.

Validation: 141 editor tests and 2 Chrome end-to-end cases passed; web and mobile typechecks and the web build passed.

Refs #574
2026-10-15 11:43:34 +08:00

2938 lines
80 KiB
CSS

@import "tailwindcss";
@import "tw-animate-css";
@import "highlight.js/styles/github.css";
@import "./editor-themes/index.css";
@import "./publish-layout.css";
@import "./note-prose.css";
@import "./code-highlight-dark.css";
@source "../../node_modules/streamdown/dist";
@custom-variant dark (&:where(.dark, .dark *));
@theme inline {
--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Inter, ui-sans-serif, system-ui, sans-serif;
--font-mono: "JetBrains Mono", "Fira Code", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
--shadow-panel: 0 1px 2px rgb(var(--slate-900-rgb) / 0.05), 0 16px 40px rgb(var(--slate-900-rgb) / 0.07);
/* Tailwind 4 shifted shadow-sm and blur-sm up one step. Keep the weights this UI shipped with. */
--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
--blur-sm: 4px;
--radius-lg: var(--radius);
--radius-md: calc(var(--radius) - 2px);
--radius-sm: calc(var(--radius) - 4px);
--radius-mobile-sheet: 10px;
--spacing-mobile-bottom-nav: 52px;
--spacing-mobile-control: 36px;
--spacing-mobile-fab: 52px;
--spacing-mobile-touch: 44px;
--color-background: hsl(var(--background));
--color-foreground: hsl(var(--foreground));
--color-card: hsl(var(--card));
--color-card-foreground: hsl(var(--card-foreground));
--color-popover: hsl(var(--popover));
--color-popover-foreground: hsl(var(--popover-foreground));
--color-primary: hsl(var(--primary));
--color-primary-foreground: hsl(var(--primary-foreground));
--color-secondary: hsl(var(--secondary));
--color-secondary-foreground: hsl(var(--secondary-foreground));
--color-muted: hsl(var(--muted));
--color-muted-foreground: hsl(var(--muted-foreground));
--color-accent: hsl(var(--accent));
--color-accent-foreground: hsl(var(--accent-foreground));
--color-destructive: hsl(var(--destructive));
--color-destructive-foreground: hsl(var(--destructive-foreground));
--color-border: hsl(var(--border));
--color-input: hsl(var(--input));
--color-ring: hsl(var(--ring));
--color-slate-50: rgb(var(--slate-50-rgb) / 1);
--color-slate-100: rgb(var(--slate-100-rgb) / 1);
--color-slate-200: rgb(var(--slate-200-rgb) / 1);
--color-slate-300: rgb(var(--slate-300-rgb) / 1);
--color-slate-400: rgb(var(--slate-400-rgb) / 1);
--color-slate-500: rgb(var(--slate-500-rgb) / 1);
--color-slate-600: rgb(var(--slate-600-rgb) / 1);
--color-slate-700: rgb(var(--slate-700-rgb) / 1);
--color-slate-800: rgb(var(--slate-800-rgb) / 1);
--color-slate-900: rgb(var(--slate-900-rgb) / 1);
--color-slate-950: rgb(var(--slate-950-rgb) / 1);
--color-workspace-canvas: var(--workspace-canvas);
--color-workspace-sidebar: var(--workspace-sidebar);
--color-workspace-memo-list: var(--workspace-memo-list);
--color-workspace-editor: var(--workspace-editor);
--color-workspace-selection: var(--workspace-selection);
--color-workspace-hover: var(--workspace-hover);
--color-emerald-50: rgb(var(--brand-green-50-rgb) / 1);
--color-emerald-100: rgb(var(--brand-green-100-rgb) / 1);
--color-emerald-200: rgb(var(--brand-green-200-rgb) / 1);
--color-emerald-300: rgb(var(--brand-green-300-rgb) / 1);
--color-emerald-400: rgb(var(--brand-green-400-rgb) / 1);
--color-emerald-500: rgb(var(--brand-green-500-rgb) / 1);
--color-emerald-600: rgb(var(--brand-green-600-rgb) / 1);
--color-emerald-700: rgb(var(--brand-green-700-rgb) / 1);
--color-emerald-800: rgb(var(--brand-green-800-rgb) / 1);
--color-emerald-900: rgb(var(--brand-green-900-rgb) / 1);
--color-emerald-950: rgb(var(--brand-green-950-rgb) / 1);
--color-amber-50: rgb(var(--amber-50-rgb) / 1);
--color-amber-100: rgb(var(--amber-100-rgb) / 1);
--color-amber-200: rgb(var(--amber-200-rgb) / 1);
--color-amber-300: rgb(var(--amber-300-rgb) / 1);
--color-amber-400: rgb(var(--amber-400-rgb) / 1);
--color-amber-500: rgb(var(--amber-500-rgb) / 1);
--color-amber-600: rgb(var(--amber-600-rgb) / 1);
--color-amber-700: rgb(var(--amber-700-rgb) / 1);
--color-amber-800: rgb(var(--amber-800-rgb) / 1);
--color-amber-900: rgb(var(--amber-900-rgb) / 1);
--color-amber-950: rgb(var(--amber-950-rgb) / 1);
--color-rose-50: rgb(var(--rose-50-rgb) / 1);
--color-rose-100: rgb(var(--rose-100-rgb) / 1);
--color-rose-200: rgb(var(--rose-200-rgb) / 1);
--color-rose-400: rgb(var(--rose-400-rgb) / 1);
--color-rose-500: rgb(var(--rose-500-rgb) / 1);
--color-rose-600: rgb(var(--rose-600-rgb) / 1);
--color-rose-700: rgb(var(--rose-700-rgb) / 1);
--color-rose-800: rgb(var(--rose-800-rgb) / 1);
--color-rose-950: rgb(var(--rose-950-rgb) / 1);
--color-red-50: rgb(var(--rose-50-rgb) / 1);
--color-red-100: rgb(var(--rose-100-rgb) / 1);
--color-red-600: rgb(var(--rose-600-rgb) / 1);
--color-red-700: rgb(var(--rose-700-rgb) / 1);
--color-blue-600: rgb(var(--blue-600-rgb) / 1);
--animate-accordion-down: accordion-down 0.2s ease-out;
--animate-accordion-up: accordion-up 0.2s ease-out;
}
@keyframes accordion-down {
from { height: 0; }
to { height: var(--radix-accordion-content-height); }
}
@keyframes accordion-up {
from { height: var(--radix-accordion-content-height); }
to { height: 0; }
}
@layer base {
*, ::after, ::before, ::backdrop, ::file-selector-button {
border-color: var(--color-slate-200, currentColor);
}
}
/* v4 outline-none removes the outline entirely, and a same-named @utility is
* emitted before the built-in rule. This unlayered block wins and keeps the
* previous transparent outline, including the focus variants used in the app. */
.outline-none,
.focus\:outline-none:focus,
.focus-visible\:outline-none:focus-visible {
outline: 2px solid transparent;
outline-offset: 2px;
}
/* v4 hover variants only apply on devices that can hover. These controls are
* otherwise unreachable on touch. */
@media (hover: none) {
.edgeever-reveal-on-touch {
display: flex;
opacity: 1;
pointer-events: auto;
}
}
.edgeever-infographic-selected-text {
outline: 2px solid #3384f5;
outline-offset: 2px;
}
.edgeever-infographic-preview > svg {
display: block;
width: min(100%, 760px);
height: auto;
max-height: min(800px, calc(100dvh - 180px));
margin-inline: auto;
}
.edgeever-infographic-chat-response :is(p, ul, ol, blockquote, pre) {
margin-block: 0.35em;
}
.edgeever-infographic-chat-response :is(ul, ol) {
padding-inline-start: 1.25rem;
}
.edgeever-infographic-chat-response ul {
list-style: disc;
}
.edgeever-infographic-chat-response ol {
list-style: decimal;
}
.edgeever-infographic-chat-response pre {
overflow-x: auto;
}
.ai-sidebar-message [data-streamdown="table-wrapper"] {
margin-block: 0.65rem;
gap: 0.125rem;
padding: 0;
border: 0;
border-radius: 0;
background-color: transparent;
}
.ai-sidebar-message [data-streamdown="table-wrapper"] > div:has(> [data-streamdown="table"]) {
border-color: hsl(var(--border) / 0.65);
background-color: hsl(var(--card));
}
.ai-sidebar-message [data-streamdown="table-header"] {
background-color: hsl(var(--muted) / 0.55);
}
.ai-sidebar-message [data-streamdown="table-body"] {
background-color: hsl(var(--card));
}
.ai-sidebar-message [data-streamdown="table"] > *,
.ai-sidebar-message [data-streamdown="table-body"] > * {
border-color: hsl(var(--border) / 0.65);
}
.ai-sidebar-message [data-streamdown="table-wrapper"] > div:first-child:not(:last-child) {
min-height: 1.5rem;
}
.ai-sidebar-message [data-streamdown="table-wrapper"] > div:first-child:not(:last-child) button {
opacity: 0.75;
}
.ai-sidebar-message [data-streamdown="table-wrapper"] > div:first-child:not(:last-child) button:is(:hover, :focus-visible) {
opacity: 1;
}
.ai-sidebar-message [data-streamdown="table-wrapper"] button:focus-visible {
outline: 2px solid hsl(var(--ring));
outline-offset: 2px;
border-radius: 0.25rem;
}
.ai-sidebar-message [data-streamdown="table"] :is(th, td) {
padding: 0.3rem 0.5rem;
font-size: 0.75rem;
line-height: 1.45;
white-space: normal;
}
@keyframes edgeever-token-created {
0% {
opacity: 0;
transform: translateY(-0.625rem);
background-color: rgb(209 250 229 / 90%);
box-shadow: inset 0 0 0 1px rgb(52 211 153 / 55%);
}
24% {
opacity: 1;
transform: translateY(0);
background-color: rgb(209 250 229 / 75%);
box-shadow: inset 0 0 0 1px rgb(52 211 153 / 45%);
}
68% {
background-color: rgb(236 253 245 / 72%);
box-shadow: inset 0 0 0 1px rgb(110 231 183 / 30%);
}
100% {
opacity: 1;
transform: translateY(0);
background-color: transparent;
box-shadow: inset 0 0 0 1px transparent;
}
}
.edgeever-token-created {
animation: edgeever-token-created 2.2s ease-out;
}
.ProseMirror .tiptap-mathematics-render {
font-size: var(--editor-code-font-size, 0.875em);
}
.ProseMirror .tiptap-mathematics-render[data-type="block-math"] {
max-width: 100%;
margin: 1rem 0;
overflow-x: auto;
overflow-y: hidden;
padding: 0.25rem 0;
text-align: center;
}
.ProseMirror .tiptap-mathematics-render--editable {
cursor: pointer;
border-radius: 0.2rem;
}
.ProseMirror .tiptap-mathematics-render--editable:hover {
background: rgb(var(--slate-900-rgb) / 0.06);
}
.ProseMirror .inline-math-error,
.ProseMirror .block-math-error {
color: #be123c;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
:root.dark .ProseMirror .inline-math-error,
:root.dark .ProseMirror .block-math-error {
color: #fda4af;
}
@layer base {
:root {
--background: 0 0% 96%;
--foreground: 0 0% 13%;
--brand-green: #16a06e;
--brand-green-hover: #12845b;
--brand-green-muted: #def1e9;
--brand-green-soft: #f0f8f4;
--brand-green-border: #b8dfd0;
--brand-green-text: #11694a;
--brand-green-rgb: 22 160 110;
--brand-green-hover-rgb: 18 132 91;
--brand-green-50-rgb: 240 248 244;
--brand-green-100-rgb: 222 241 233;
--brand-green-200-rgb: 184 223 208;
--brand-green-300-rgb: 125 196 170;
--brand-green-400-rgb: 62 174 134;
--brand-green-500-rgb: 22 160 110;
--brand-green-600-rgb: 18 132 91;
--brand-green-700-rgb: 17 105 74;
--brand-green-800-rgb: 17 83 60;
--brand-green-900-rgb: 15 68 50;
--brand-green-950-rgb: 7 37 28;
--workspace-canvas: #eef1f4;
--workspace-sidebar: #e7ebef;
--workspace-memo-list: #f4f6f8;
--workspace-editor: #f8fafb;
--workspace-divider: #e1e5ea;
--workspace-memo-divider: #e6eaee;
--workspace-selection: #dde3e9;
--workspace-hover: color-mix(in srgb, var(--workspace-sidebar) 40%, white);
--tooltip-bg: #ffffff;
--tooltip-fg: #6b726e;
--tooltip-border: #e1e5ea;
--tooltip-shadow: 0 1px 2px rgb(16 24 20 / 0.04), 0 8px 20px rgb(16 24 20 / 0.08);
--scrollbar-thumb: rgb(115 115 115 / 0.28);
--scrollbar-thumb-hover: rgb(115 115 115 / 0.42);
--search-match: rgb(254 240 138 / 0.8);
--search-match-active: rgb(251 191 36 / 0.9);
--switch-thumb: #ffffff;
--switch-track-on: #525252;
--switch-thumb-on: #ffffff;
--checkbox-on: #525252;
--checkbox-mark: #ffffff;
--slate-50-rgb: 250 250 250;
--slate-100-rgb: 245 245 245;
--slate-200-rgb: 229 229 229;
--slate-300-rgb: 212 212 212;
--slate-400-rgb: 166 166 166;
--slate-500-rgb: 115 115 115;
--slate-600-rgb: 82 82 82;
--slate-700-rgb: 64 64 64;
--slate-800-rgb: 38 38 38;
--slate-900-rgb: 24 24 24;
--slate-950-rgb: 10 10 10;
--amber-50-rgb: 255 251 235;
--amber-100-rgb: 254 243 199;
--amber-200-rgb: 253 230 138;
--amber-300-rgb: 252 211 77;
--amber-400-rgb: 251 191 36;
--amber-500-rgb: 245 158 11;
--amber-600-rgb: 217 119 6;
--amber-700-rgb: 180 83 9;
--amber-800-rgb: 146 64 14;
--amber-900-rgb: 120 53 15;
--amber-950-rgb: 69 26 3;
--rose-50-rgb: 255 241 242;
--rose-100-rgb: 255 228 230;
--rose-200-rgb: 254 205 211;
--rose-400-rgb: 251 113 133;
--rose-500-rgb: 244 63 94;
--rose-600-rgb: 225 29 72;
--rose-700-rgb: 190 18 60;
--rose-800-rgb: 159 18 57;
--rose-950-rgb: 76 5 25;
--blue-600-rgb: 37 99 235;
--dark-surface-rgb: 255 255 255;
--editor-body-font-size: 1rem;
--edgeever-system-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans SC", Inter, ui-sans-serif, system-ui, sans-serif;
--editor-body-line-height: 1.65;
--editor-paragraph-spacing: 0.35rem;
--memo-content-divider-color: #1a1d21;
--memo-content-divider-spacing: 1.5rem;
--editor-outline-width: 300px;
--editor-content-max-width: 880px;
--card: 0 0% 100%;
--card-foreground: 0 0% 13%;
--popover: 0 0% 100%;
--popover-foreground: 0 0% 13%;
--primary: 0 0% 9%;
--primary-foreground: 0 0% 100%;
--secondary: 0 0% 96%;
--secondary-foreground: 0 0% 15%;
--muted: 0 0% 95%;
--muted-foreground: 0 0% 40%;
--accent: 210 16% 89%;
--accent-foreground: 0 0% 7%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
--border: 0 0% 88%;
--input: 0 0% 88%;
--ring: 0 0% 15%;
--radius: 0.5rem;
}
}
:root {
color-scheme: light;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
:root.dark {
color-scheme: dark;
--background: 0 0% 7%;
--foreground: 0 0% 87%;
--card: 0 0% 12%;
--card-foreground: 0 0% 87%;
--popover: 0 0% 13%;
--popover-foreground: 0 0% 87%;
--primary: 0 0% 92%;
--primary-foreground: 0 0% 7%;
--secondary: 0 0% 18%;
--secondary-foreground: 0 0% 90%;
--muted: 0 0% 18%;
--muted-foreground: 0 0% 63%;
--accent: 0 0% 18%;
--accent-foreground: 0 0% 93%;
--destructive: 0 72% 51%;
--destructive-foreground: 0 0% 96%;
--border: 0 0% 23%;
--input: 0 0% 23%;
--ring: 0 0% 75%;
--workspace-canvas: #121315;
--workspace-sidebar: #17181a;
--workspace-memo-list: #1d1e20;
--workspace-editor: #222325;
--workspace-divider: #323437;
--workspace-memo-divider: #383a3d;
--workspace-selection: #333638;
--workspace-hover: color-mix(in srgb, var(--workspace-sidebar) 90%, white);
--memo-content-divider-color: #62666b;
--tooltip-bg: #303234;
--tooltip-fg: #dedede;
--tooltip-border: #45474a;
--tooltip-shadow: 0 1px 2px rgb(0 0 0 / 0.28), 0 8px 20px rgb(0 0 0 / 0.32);
--scrollbar-thumb: rgb(145 145 145 / 0.38);
--scrollbar-thumb-hover: rgb(145 145 145 / 0.55);
--search-match: rgb(22 160 110 / 0.32);
--search-match-active: rgb(36 185 134 / 0.48);
--switch-thumb: #f0f0f0;
--switch-track-on: #e8e8e8;
--switch-thumb-on: #121315;
--checkbox-on: #e8e8e8;
--checkbox-mark: #121315;
--slate-50-rgb: 17 17 17;
--slate-100-rgb: 25 25 25;
--slate-200-rgb: 43 43 43;
--slate-300-rgb: 116 116 116;
--slate-400-rgb: 140 140 140;
--slate-500-rgb: 161 161 161;
--slate-600-rgb: 188 188 188;
--slate-700-rgb: 208 208 208;
--slate-800-rgb: 226 226 226;
--slate-900-rgb: 238 238 238;
--slate-950-rgb: 244 244 244;
--amber-50-rgb: 69 26 3;
--amber-100-rgb: 80 30 5;
--amber-200-rgb: 146 64 14;
--amber-300-rgb: 180 83 9;
--amber-600-rgb: 253 230 138;
--amber-700-rgb: 253 230 138;
--amber-800-rgb: 252 211 77;
--amber-900-rgb: 254 243 199;
--amber-950-rgb: 255 251 235;
--rose-50-rgb: 76 5 25;
--rose-100-rgb: 88 8 30;
--rose-200-rgb: 136 19 55;
--rose-500-rgb: 253 164 175;
--rose-600-rgb: 253 164 175;
--rose-700-rgb: 254 205 211;
--rose-800-rgb: 254 205 211;
--rose-950-rgb: 255 241 242;
--blue-600-rgb: 147 197 253;
--dark-surface-rgb: 34 35 37;
--brand-green: #16a06e;
--brand-green-hover: #24b986;
--brand-green-muted: #183a31;
--brand-green-soft: #122a24;
--brand-green-border: #286451;
--brand-green-text: #68d6b0;
--brand-green-rgb: 22 160 110;
--brand-green-hover-rgb: 36 185 134;
--brand-green-50-rgb: 18 42 36;
--brand-green-100-rgb: 24 58 49;
--brand-green-200-rgb: 40 100 81;
--brand-green-300-rgb: 58 181 139;
--brand-green-400-rgb: 104 214 176;
--brand-green-500-rgb: 22 160 110;
--brand-green-600-rgb: 36 185 134;
--brand-green-700-rgb: 104 214 176;
--brand-green-800-rgb: 159 229 204;
--brand-green-900-rgb: 202 242 225;
--brand-green-950-rgb: 232 249 241;
}
html,
body,
#root {
height: 100%;
overflow: hidden;
}
/* Public share pages are standalone and must scroll the document. */
html:has(.edgeever-public-share),
html:has(.edgeever-public-share) body,
html:has(.edgeever-public-share) #root,
html:has([data-site-theme]),
html:has([data-site-theme]) body,
html:has([data-site-theme]) #root {
height: auto;
min-height: 100%;
overflow: auto;
}
html.edgeever-mobile-native-editing,
html.edgeever-mobile-native-editing body,
html.edgeever-mobile-native-editing #root {
min-height: 100%;
overflow: auto;
}
body {
margin: 0;
background: var(--workspace-canvas);
color: hsl(var(--foreground));
overscroll-behavior-x: none;
overscroll-behavior-y: auto;
}
::selection {
background-color: rgb(var(--brand-green-rgb) / 0.18);
color: inherit;
}
:root.dark ::selection {
background-color: rgb(var(--brand-green-rgb) / 0.28);
color: inherit;
}
/* Installed theme packages only target this documented token layer. Keeping
* the selectors here lets themes survive component refactors without gaining
* arbitrary DOM or JavaScript access. */
html[data-edgeever-extension-theme] {
--radius: var(--edgeever-theme-radius, 0.5rem);
font-family: var(--edgeever-theme-font-body, inherit);
font-size: var(--edgeever-theme-font-size, 100%);
}
html[data-edgeever-extension-theme] body {
background: var(--edgeever-theme-background, #f8fafc);
color: var(--edgeever-theme-text, #0f172a);
line-height: var(--edgeever-theme-line-height, normal);
}
html[data-edgeever-extension-theme] .bg-white,
html[data-edgeever-extension-theme] .bg-card,
html[data-edgeever-extension-theme] .bg-slate-50,
html[data-edgeever-extension-theme] .bg-slate-50\/50 {
background-color: var(--edgeever-theme-surface, #fff);
}
html[data-edgeever-extension-theme] .bg-slate-100,
html[data-edgeever-extension-theme] .bg-slate-100\/80,
html[data-edgeever-extension-theme] .bg-slate-200\/50 {
background-color: var(--edgeever-theme-surface-muted, #f1f5f9);
}
html[data-edgeever-extension-theme] .text-slate-700,
html[data-edgeever-extension-theme] .text-slate-800,
html[data-edgeever-extension-theme] .text-slate-900,
html[data-edgeever-extension-theme] .text-slate-950 {
color: var(--edgeever-theme-text, #0f172a);
}
html[data-edgeever-extension-theme] .text-slate-400,
html[data-edgeever-extension-theme] .text-slate-500,
html[data-edgeever-extension-theme] .text-slate-600 {
color: var(--edgeever-theme-text-muted, #64748b);
}
html[data-edgeever-extension-theme] .border-slate-100,
html[data-edgeever-extension-theme] .border-slate-200,
html[data-edgeever-extension-theme] .border-slate-300,
html[data-edgeever-extension-theme] .divide-slate-100 > :not(:last-child),
html[data-edgeever-extension-theme] .divide-slate-200 > :not(:last-child) {
border-color: var(--edgeever-theme-border, #e2e8f0);
}
html[data-edgeever-extension-theme] .bg-emerald-500,
html[data-edgeever-extension-theme] .bg-emerald-600,
html[data-edgeever-extension-theme] .bg-emerald-700 {
background-color: var(--edgeever-theme-accent, #16a06e);
color: var(--edgeever-theme-accent-foreground, #fff);
}
html[data-edgeever-extension-theme] .text-emerald-600,
html[data-edgeever-extension-theme] .text-emerald-700,
html[data-edgeever-extension-theme] .text-emerald-800 {
color: var(--edgeever-theme-accent, #16a06e);
}
html[data-edgeever-extension-theme] code,
html[data-edgeever-extension-theme] pre,
html[data-edgeever-extension-theme] kbd {
font-family: var(--edgeever-theme-font-mono, ui-monospace, monospace);
}
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 180ms;
animation-timing-function: cubic-bezier(0.22, 1, 0.36, 1);
}
/* Keep the three-pane desktop workspace usable on compact laptop screens.
* The notebook and memo columns may shrink, while the editor always keeps
* the remaining width instead of being clipped by fixed tracks.
*/
.edgeever-workspace-grid--focus {
grid-template-columns: minmax(0, 1fr);
}
.edgeever-workspace-grid {
--notebook-sidebar-width: var(--notebook-sidebar-expanded-width, clamp(180px, 17vw, 260px));
}
.edgeever-workspace-grid--sidebar-collapsed {
--notebook-sidebar-width: 3.5rem;
}
.edgeever-workspace-shell {
background: var(--workspace-canvas);
}
.edgeever-workspace-sidebar {
border-color: var(--workspace-divider);
background: var(--workspace-sidebar);
}
.edgeever-create-memo-split {
container-type: inline-size;
}
.edgeever-create-memo-split__more-label {
display: inline;
}
@container (max-width: 11.749rem) {
.edgeever-create-memo-split__more-label {
display: none;
}
}
.edgeever-workspace-memo-list {
border-color: var(--workspace-divider);
background: var(--workspace-memo-list);
}
.edgeever-workspace-editor {
background: var(--workspace-editor);
}
.edgeever-editor-metadata-icon {
display: none;
}
@media (min-width: 640px) {
[data-metadata-density] .edgeever-editor-notebook-select,
[data-metadata-density] .edgeever-editor-tag-picker,
[data-metadata-density] .edgeever-editor-tag-trigger {
flex: 0 0 auto;
width: max-content;
max-width: none;
}
/* Priority: title, then notebook, then tags. Tags compact first. */
[data-metadata-density="tags"], [data-metadata-density="compact"] {
.edgeever-editor-tag-picker {
/* Keep the Smart Tag action beside the compact tag selector. */
width: max-content;
min-width: 4rem;
flex: 0 0 auto;
}
.edgeever-editor-tag-trigger {
width: 2rem;
min-width: 2rem;
justify-content: center;
gap: 0;
padding-inline: 0;
}
.edgeever-editor-tag-picker .edgeever-editor-metadata-icon {
display: block;
}
.edgeever-editor-tag-content,
.edgeever-editor-tag-chevron {
display: none;
}
}
/* On very narrow headers, compact the notebook only after the tags. */
[data-metadata-density="compact"] {
.edgeever-editor-notebook-select {
width: 2rem;
min-width: 2rem;
flex: 0 0 2rem;
}
.edgeever-editor-notebook-trigger {
width: 2rem;
min-width: 2rem;
justify-content: center;
gap: 0;
padding-inline: 0;
}
.edgeever-editor-notebook-select .edgeever-editor-metadata-icon {
display: block;
}
.edgeever-editor-notebook-label,
.edgeever-editor-notebook-trigger > svg:last-child {
display: none;
}
}
}
.edgeever-workspace-sidebar-footer {
background: var(--workspace-sidebar);
}
.edgeever-workspace-selection {
background: var(--workspace-selection);
}
.edgeever-memo-divider {
border-bottom-color: var(--workspace-memo-divider) !important;
}
:root.dark .edgeever-workspace-memo-list .edgeever-memo-divider {
border-bottom-color: var(--workspace-memo-divider) !important;
}
html[data-edgeever-extension-theme] .edgeever-workspace-shell {
background: var(--edgeever-theme-background, var(--workspace-canvas));
}
html[data-edgeever-extension-theme] .edgeever-workspace-sidebar,
html[data-edgeever-extension-theme] .edgeever-workspace-memo-list {
border-color: var(--edgeever-theme-border, var(--workspace-divider));
}
html[data-edgeever-extension-theme] .edgeever-workspace-sidebar {
background: var(--edgeever-theme-surface-muted, var(--workspace-sidebar));
}
html[data-edgeever-extension-theme] .edgeever-workspace-memo-list,
html[data-edgeever-extension-theme] .edgeever-workspace-editor {
background: var(--edgeever-theme-surface, var(--workspace-editor));
}
html[data-edgeever-extension-theme] .edgeever-workspace-selection {
background: var(--edgeever-theme-surface-muted, var(--workspace-selection));
}
html[data-edgeever-extension-theme] .edgeever-memo-divider {
border-bottom-color: var(--edgeever-theme-border, var(--workspace-memo-divider)) !important;
}
@media (min-width: 1024px) {
.edgeever-workspace-grid--editor {
grid-template-columns:
var(--notebook-sidebar-width)
var(--memo-list-width)
minmax(0, 1fr);
}
.edgeever-workspace-grid--single-right {
grid-template-columns: var(--notebook-sidebar-width) minmax(0, 1fr);
}
.edgeever-workspace-selection-desktop {
background: var(--workspace-selection);
}
html[data-edgeever-extension-theme] .edgeever-workspace-selection-desktop {
background: var(--edgeever-theme-surface-muted, var(--workspace-selection));
}
}
:root.dark body {
background: var(--workspace-canvas);
color: hsl(var(--foreground));
}
:root.dark .edgeever-workspace-shell {
background: var(--workspace-canvas);
}
:root.dark .edgeever-workspace-sidebar {
background: var(--workspace-sidebar);
}
:root.dark .edgeever-workspace-memo-list {
background: var(--workspace-memo-list);
}
:root.dark .edgeever-workspace-editor {
background: var(--workspace-editor);
}
:root.dark .edgeever-workspace-sidebar,
:root.dark .edgeever-workspace-memo-list {
border-color: var(--workspace-divider);
}
:root.dark .edgeever-workspace-sidebar-footer {
background: var(--workspace-sidebar);
}
:root.dark .edgeever-workspace-selection,
:root.dark .edgeever-workspace-selection-desktop {
background: var(--workspace-selection) !important;
}
/* X6 ships blue/orange interaction chrome. Keep the engine behavior while
* making selection and keyboard focus belong to EdgeEver's visual system. */
.edgeever-diagram-canvas:focus-visible {
box-shadow: inset 0 0 0 2px rgb(var(--brand-green-rgb) / 0.5);
}
.edgeever-diagram-canvas[data-diagram-kind="architecture"][data-relations-focused="true"] .x6-edge:not(.edgeever-relation-focused) {
opacity: 0.12;
}
.edgeever-diagram-canvas[data-diagram-kind="architecture"][data-relations-focused="true"] .x6-node:not(.edgeever-relation-focused):not(.edgeever-relation-boundary) {
opacity: 0.4;
}
.edgeever-diagram-canvas[data-diagram-kind="architecture"][data-relations-focused="true"] .x6-edge.edgeever-relation-focused {
filter: drop-shadow(0 0 3px rgb(22 160 110 / 0.22));
}
.edgeever-diagram-canvas[data-diagram-kind="architecture"][data-label-mode="focus"] .x6-edge-labels {
opacity: 0;
pointer-events: none;
}
.edgeever-diagram-canvas[data-diagram-kind="architecture"][data-label-mode="focus"][data-relations-focused="true"] .x6-edge.edgeever-relation-focused .x6-edge-labels {
opacity: 1;
pointer-events: auto;
}
/* X6 owns the scroll extent so oversized diagrams remain reachable in both
* directions while the editor chrome stays fixed around the viewport. */
.edgeever-diagram-scroller {
position: absolute !important;
inset: 0;
width: auto !important;
height: auto !important;
overscroll-behavior: contain;
scrollbar-gutter: stable;
background-color: var(--edgeever-diagram-canvas, transparent);
}
/* The scroller sizes its paper once. When the editor column later grows
* (assistant sidebar closing, pane resize), keep the dotted surface covering
* the viewport instead of leaving the card color exposed on the right. */
.edgeever-diagram-scroller > .x6-graph-scroller-content {
min-width: 100%;
min-height: 100%;
}
.edgeever-diagram-scroller .edgeever-diagram-canvas {
cursor: default;
}
.edgeever-diagram-canvas[data-space-pan="active"]:not([data-architecture-placement="active"]) {
cursor: grab;
}
.edgeever-diagram-canvas[data-shift-select="active"]:not([data-architecture-placement="active"]) {
cursor: crosshair;
}
.edgeever-diagram-scroller[data-panning="true"] .edgeever-diagram-canvas,
.edgeever-diagram-canvas[data-space-pan="active"][data-panning="true"] {
cursor: grabbing !important;
}
.edgeever-diagram-canvas .x6-widget-selection-rubberband {
border-color: var(--brand-green) !important;
background-color: var(--brand-green-muted) !important;
}
.edgeever-diagram-canvas .x6-widget-selection-box,
.edgeever-diagram-canvas .x6-widget-selection-inner {
border-color: var(--brand-green) !important;
box-shadow: 0 2px 8px rgb(var(--brand-green-rgb) / 0.18) !important;
}
.edgeever-diagram-canvas[data-diagram-theme="ink"] .x6-widget-selection-box,
.edgeever-diagram-canvas[data-diagram-theme="ink"] .x6-widget-selection-inner {
border-color: #68d6b0 !important;
box-shadow: 0 2px 10px rgb(104 214 176 / 0.22) !important;
}
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-widget-selection-box-node,
.edgeever-diagram-canvas[data-diagram-kind="architecture"] .x6-widget-selection-box-node {
pointer-events: none !important;
}
/* Flowchart node modern card elevation */
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node rect[selector="body"],
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node polygon[selector="body"],
.edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node rect[selector="body"],
.edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node polygon[selector="body"] {
filter: drop-shadow(0 1px 2px rgb(15 23 42 / 0.06)) drop-shadow(0 2px 5px rgb(15 23 42 / 0.04));
transition: filter 160ms ease, stroke 160ms ease;
}
:root.dark .edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node rect[selector="body"],
:root.dark .edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node polygon[selector="body"],
:root.dark .edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node rect[selector="body"],
:root.dark .edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node polygon[selector="body"] {
filter: drop-shadow(0 1px 3px rgb(0 0 0 / 0.45)) drop-shadow(0 2px 6px rgb(0 0 0 / 0.3));
}
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node:hover rect[selector="body"],
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node:hover polygon[selector="body"],
.edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node:hover rect[selector="body"],
.edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node:hover polygon[selector="body"] {
filter: drop-shadow(0 2px 5px rgb(15 23 42 / 0.1)) drop-shadow(0 4px 10px rgb(15 23 42 / 0.06));
}
:root.dark .edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node:hover rect[selector="body"],
:root.dark .edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node:hover polygon[selector="body"],
:root.dark .edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node:hover rect[selector="body"],
:root.dark .edgeever-x6-diagram[data-diagram-kind="flowchart"] .x6-node:hover polygon[selector="body"] {
filter: drop-shadow(0 2px 6px rgb(0 0 0 / 0.6)) drop-shadow(0 4px 12px rgb(0 0 0 / 0.4));
}
.edgeever-diagram-canvas .x6-port-body {
opacity: 0;
transition: opacity 120ms ease, filter 120ms ease;
}
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-port-body,
.edgeever-diagram-canvas[data-diagram-kind="architecture"] .x6-port-body {
cursor: crosshair;
pointer-events: none;
}
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .edgeever-flow-port-hit-area,
.edgeever-diagram-canvas[data-diagram-kind="architecture"] .edgeever-flow-port-hit-area {
fill: transparent;
stroke: transparent;
pointer-events: all;
}
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .edgeever-flow-port-dot,
.edgeever-diagram-canvas[data-diagram-kind="architecture"] .edgeever-flow-port-dot {
pointer-events: none;
transform-box: fill-box;
transform-origin: center;
transition: filter 120ms ease, transform 120ms ease;
}
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-node.edgeever-flow-node-active .edgeever-flow-port-dot,
.edgeever-diagram-canvas[data-diagram-kind="architecture"] .x6-node.edgeever-flow-node-active .edgeever-flow-port-dot {
fill: var(--brand-green) !important;
stroke: var(--workspace-editor) !important;
stroke-width: 2px !important;
filter: drop-shadow(0 1px 3px rgb(var(--brand-green-rgb) / 0.3));
}
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-port-body:hover .edgeever-flow-port-dot,
.edgeever-diagram-canvas[data-diagram-kind="flowchart"] .x6-available-magnet + .edgeever-flow-port-dot,
.edgeever-diagram-canvas[data-diagram-kind="architecture"] .x6-port-body:hover .edgeever-flow-port-dot,
.edgeever-diagram-canvas[data-diagram-kind="architecture"] .x6-available-magnet + .edgeever-flow-port-dot {
filter: drop-shadow(0 1px 3px rgb(var(--brand-green-rgb) / 0.28));
transform: scale(1.12);
}
/* Curated reading themes should feel like part of the note canvas in dark
* mode. Custom themes keep their explicit background as an intentional user
* choice, while bundled themes contribute typography and semantic colors. */
:root.dark .edgeever-editor[data-editor-theme]:not([data-editor-theme="default"]):not([data-editor-theme="custom"]) {
--editor-theme-bg: var(--workspace-editor);
}
:root.dark .ProseMirror,
:root.dark .ProseMirror h1,
:root.dark .ProseMirror h2,
:root.dark .ProseMirror h3,
:root.dark .ProseMirror h4,
:root.dark .ProseMirror h5,
:root.dark .ProseMirror h6 {
color: hsl(var(--foreground));
}
@layer base {
button,
input,
textarea {
font: inherit;
}
}
.ProseMirror {
width: 100%;
max-width: 100%;
margin: 0;
color: #27272a;
font-size: var(--editor-body-font-size);
letter-spacing: -0.005em;
line-height: var(--editor-body-line-height);
min-height: 100%;
outline: none;
padding: 8px 0 56px;
tab-size: 4;
white-space: pre-wrap;
word-break: break-word;
overflow-wrap: break-word;
font-feature-settings: "chws" 1;
}
.ProseMirror [data-type="details"] {
display: flex;
align-items: flex-start;
gap: 0.1em;
margin: 0.15em 0;
padding: 0;
border: 0;
background: transparent;
}
.ProseMirror [data-type="details"] > button {
display: inline-flex;
flex: 0 0 auto;
align-items: center;
justify-content: center;
box-sizing: border-box;
width: 1.6em;
height: 1.6em;
margin: 0;
padding: 0;
border: 0;
border-radius: 4px;
background: transparent;
color: #16a06e;
font: inherit;
line-height: 0;
cursor: pointer;
}
.ProseMirror [data-type="details"] > button:hover {
background: color-mix(in srgb, currentColor 8%, transparent);
}
.ProseMirror [data-type="details"] > button:focus-visible {
outline: 2px solid color-mix(in srgb, #16a06e 55%, transparent);
outline-offset: 1px;
}
.ProseMirror [data-type="details"] > button::before {
content: "";
width: 0.32em;
height: 0.32em;
margin: 0;
border-right: 1.5px solid currentColor;
border-bottom: 1.5px solid currentColor;
transform: rotate(-45deg);
}
.ProseMirror [data-type="details"].is-open > button::before {
transform: rotate(45deg);
}
.ProseMirror [data-type="details"] > div {
flex: 1;
min-width: 0;
}
.ProseMirror summary {
display: block;
margin: 0;
padding: 0;
font-size: inherit;
font-weight: 500;
line-height: inherit;
list-style: none;
cursor: text;
}
.ProseMirror summary::-webkit-details-marker {
display: none;
}
.ProseMirror [data-type="details"]:not(.is-open) [data-type="detailsContent"] {
display: none !important;
}
.ProseMirror [data-type="details"].is-open [data-type="detailsContent"] {
margin-top: 0.15em;
}
.edgeever-public-share .ProseMirror {
min-height: 0;
padding: 8px 20px 40px;
color: #0f172a;
}
.edgeever-phone-stage {
width: 380px;
min-height: 740px;
flex-shrink: 0;
flex-direction: column;
align-items: center;
justify-content: flex-start;
margin: 12px 12px 12px 0;
padding-top: 16px;
padding-bottom: 24px;
border-radius: 24px;
background: color-mix(in srgb, var(--workspace-surface, #eef3f0) 76%, white);
}
.edgeever-phone-device {
position: relative;
width: 331px;
height: 686px;
border-radius: 48px;
background: #1c1c1e;
box-shadow:
inset 0 0 0 1px #3a3a3c,
0 0 0 1.5px #111,
0 18px 40px rgba(15, 23, 42, 0.16);
}
.edgeever-phone-device__silent,
.edgeever-phone-device__vol-up,
.edgeever-phone-device__vol-down,
.edgeever-phone-device__power {
position: absolute;
background: linear-gradient(180deg, #d4d4d8, #71717a);
box-shadow:
inset 0 1px 0 rgba(255, 255, 255, 0.35),
0 0 0 0.5px rgba(0, 0, 0, 0.35);
}
.edgeever-phone-device__silent {
left: -3px;
top: 88px;
width: 3px;
height: 18px;
border-radius: 1px 0 0 1px;
}
.edgeever-phone-device__vol-up,
.edgeever-phone-device__vol-down {
left: -3px;
width: 3px;
height: 28px;
border-radius: 1px 0 0 1px;
}
.edgeever-phone-device__vol-up { top: 120px; }
.edgeever-phone-device__vol-down { top: 156px; }
.edgeever-phone-device__power {
right: -3px;
top: 140px;
width: 3px;
height: 56px;
border-radius: 0 1px 1px 0;
}
.edgeever-phone-device__screen {
position: absolute;
inset: 10px 8px 10px;
overflow: hidden;
border-radius: 40px;
background: #fff;
container-type: size;
}
:root.dark .edgeever-phone-device__screen {
background: #111;
}
.edgeever-phone-device__top {
position: absolute;
top: 0;
right: 0;
left: 0;
z-index: 3;
height: 44px;
pointer-events: none;
background: #fff;
border-radius: 40px 40px 0 0;
}
:root.dark .edgeever-phone-device__top {
background: #111;
}
.edgeever-phone-device__island {
position: absolute;
top: 9px;
left: 50%;
z-index: 4;
display: flex;
width: 96px;
height: 28px;
align-items: center;
justify-content: flex-end;
padding-right: 8px;
transform: translateX(-50%);
border-radius: 20px;
background: #0a0a0a;
}
.edgeever-phone-device__lens {
width: 11px;
height: 11px;
border-radius: 50%;
background: radial-gradient(circle at 35% 32%, #4a6080, #152033 55%, #050505 100%);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.14);
}
.edgeever-phone-device__home {
position: absolute;
bottom: 7px;
left: 50%;
z-index: 4;
width: 108px;
height: 4px;
transform: translateX(-50%);
border-radius: 99px;
background: rgba(15, 15, 16, 0.88);
}
.edgeever-phone-preview {
box-sizing: border-box;
width: 390px;
height: calc(100cqh * 390px / 100cqw);
overflow-y: auto;
overscroll-behavior: contain;
padding: 48px 16px 26px;
background: var(--publish-bg, #fff);
zoom: calc(100cqw / 390px);
-webkit-overflow-scrolling: touch;
}
.edgeever-phone-article {
min-height: 0;
padding: 0 0 20px;
}
.edgeever-phone-shell-title {
margin: 0 0 12px;
font-size: 17px;
font-weight: 650;
line-height: 1.35;
color: var(--publish-text-strong, #111);
}
.edgeever-phone-preview .edgeever-phone-mermaid {
margin: 12px 0;
overflow: hidden;
}
.edgeever-phone-preview .edgeever-phone-mermaid svg {
display: block;
width: 100%;
height: auto;
max-width: 100%;
}
.edgeever-phone-preview .edgeever-theme-block__toolbar,
.edgeever-phone-preview .edgeever-theme-block__delete {
display: none;
}
.edgeever-public-share .ProseMirror [data-edgeever-theme-block] {
margin: 1.25rem 0;
border: 1px solid #dbeee5;
border-radius: 6px;
background: #fbfefc;
padding: 0.8rem 1rem;
}
.edgeever-public-share .ProseMirror [data-theme-block-kind="chapter"] {
border-left: 4px solid var(--brand-green);
background: var(--brand-green-soft);
}
:root.dark .edgeever-public-share .ProseMirror {
color: hsl(var(--foreground));
}
:root.dark .edgeever-public-share .ProseMirror [data-edgeever-theme-block] {
border-color: var(--workspace-divider);
background: var(--workspace-sidebar);
}
:root.dark .edgeever-public-share .ProseMirror [data-theme-block-kind="chapter"] {
border-left-color: var(--brand-green);
background: var(--brand-green-soft);
}
@media (min-width: 640px) {
.edgeever-public-share .ProseMirror {
padding-inline: 36px;
}
}
[data-site-theme="default"] .edgeever-public-share .ProseMirror {
padding-inline: 20px;
}
@media (min-width: 640px) {
[data-site-theme="default"] .edgeever-public-share .ProseMirror {
padding-inline: 40px;
}
}
.ProseMirror .edgeever-search-match,
.edgeever-markdown-source-editor .edgeever-search-match {
border-radius: 0.2rem;
background-color: var(--search-match);
box-shadow: 0 0 0 1px rgb(var(--brand-green-rgb) / 0.22);
}
.ProseMirror .edgeever-search-match-active,
.edgeever-markdown-source-editor .edgeever-search-match-active {
background-color: var(--search-match-active);
box-shadow: 0 0 0 2px rgb(var(--brand-green-rgb) / 0.4);
}
@media (max-width: 1023px) {
.ProseMirror {
max-width: none;
margin: 0;
padding: 8px 0 max(4rem, env(safe-area-inset-bottom));
}
}
.ProseMirror h1 {
font-size: 1.5em;
font-weight: 650;
line-height: 1.28;
letter-spacing: -0.02em;
margin: 0 0 0.85rem;
color: #1a1d21;
}
.ProseMirror h2 {
font-size: 1.25em;
font-weight: 600;
line-height: 1.32;
letter-spacing: -0.015em;
margin: 1.4rem 0 0.6rem;
color: #27272a;
}
.ProseMirror h3 {
font-size: 1.125em;
font-weight: 600;
line-height: 1.38;
letter-spacing: -0.01em;
margin: 1.15rem 0 0.5rem;
color: #27272a;
}
.ProseMirror h4 {
font-size: 1.0625em;
font-weight: 600;
line-height: 1.4;
letter-spacing: -0.006em;
margin: 1.05rem 0 0.45rem;
color: #1e293b;
}
.ProseMirror h5 {
font-size: 1em;
font-weight: 600;
line-height: 1.42;
margin: 0.95rem 0 0.4rem;
color: #334155;
}
.ProseMirror h6 {
font-size: 0.9375em;
font-weight: 600;
line-height: 1.45;
margin: 0.85rem 0 0.35rem;
color: #334155;
}
.ProseMirror p {
line-height: var(--editor-body-line-height);
margin: 0 0 var(--editor-paragraph-spacing);
padding: 0;
}
/* The root deliberately disables synthetic font faces for the application UI,
* but rich-text emphasis must remain visible when a platform fallback font has
* no matching bold or italic face. Allow both forms here so nested bold-italic
* marks work regardless of their DOM order. */
.ProseMirror strong,
.ProseMirror b {
font-synthesis: weight style;
font-weight: 800;
}
.ProseMirror em,
.ProseMirror i {
font-synthesis: weight style;
font-style: italic;
}
/* External hyperlinks (default theme).
* Tailwind preflight resets <a> to inherit color/decoration, so without this
* rule links are indistinguishable from body text. Note/attachment chips below
* use more specific selectors and keep their chip appearance. */
.ProseMirror a {
color: rgb(var(--slate-700-rgb));
font-weight: 500;
text-decoration: underline;
text-decoration-color: color-mix(in srgb, rgb(var(--slate-700-rgb)) 45%, transparent);
text-underline-offset: 2px;
cursor: pointer;
transition: color 150ms ease, text-decoration-color 150ms ease;
}
.ProseMirror a:hover {
color: rgb(var(--slate-950-rgb));
text-decoration-color: rgb(var(--slate-950-rgb));
}
.ProseMirror a:focus-visible {
outline: 2px solid var(--brand-green);
outline-offset: 2px;
border-radius: 2px;
}
.ProseMirror a.edgeever-empty-external-link,
.markdown-content a.edgeever-empty-external-link {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 1.5em;
min-height: 1.5em;
padding: 0 0.25em;
border: 1px solid rgb(var(--slate-200-rgb));
border-radius: 0.35em;
background: rgb(var(--slate-100-rgb));
color: rgb(var(--slate-700-rgb));
font-size: 0.9em;
font-weight: 700;
line-height: 1;
text-decoration: none;
vertical-align: baseline;
}
.ProseMirror a.edgeever-empty-external-link:hover,
.markdown-content a.edgeever-empty-external-link:hover {
border-color: rgb(var(--slate-300-rgb));
background: rgb(var(--slate-200-rgb));
color: rgb(var(--slate-950-rgb));
text-decoration: none;
}
.ProseMirror a.edgeever-empty-external-link:focus-visible,
.markdown-content a.edgeever-empty-external-link:focus-visible {
outline: 2px solid var(--brand-green);
outline-offset: 2px;
}
.ProseMirror a.edgeever-note-link,
.ProseMirror a[href^="#memo="] {
display: inline-flex;
align-items: center;
gap: 0.2rem;
max-width: min(100%, 32rem);
padding: 0.03rem 0.32rem 0.05rem;
border: 1px solid rgb(var(--slate-200-rgb));
border-radius: 0.35rem;
background: rgb(var(--slate-100-rgb));
color: rgb(var(--slate-700-rgb));
font-size: 0.9em;
font-weight: 500;
text-decoration: underline;
text-decoration-color: color-mix(in srgb, rgb(var(--slate-500-rgb)) 55%, transparent);
text-underline-offset: 2px;
vertical-align: baseline;
cursor: pointer;
transition: border-color 150ms ease, background-color 150ms ease, box-shadow 150ms ease, color 150ms ease;
}
.ProseMirror a.edgeever-note-link::before,
.ProseMirror a[href^="#memo="]::before {
content: "↗";
flex: 0 0 auto;
font-size: 0.85em;
font-weight: 800;
line-height: 1;
}
.ProseMirror a.edgeever-note-link:hover,
.ProseMirror a[href^="#memo="]:hover {
color: rgb(var(--slate-950-rgb));
border-color: rgb(var(--slate-300-rgb));
background: rgb(var(--slate-200-rgb));
text-decoration-color: rgb(var(--slate-950-rgb));
box-shadow: none;
}
.ProseMirror a.edgeever-attachment-link,
.ProseMirror a[href*="/api/v1/resources/"] {
display: inline-flex;
align-items: center;
gap: 0.3rem;
max-width: min(100%, 30rem);
padding: 0.3rem 0.55rem;
border: 1px solid rgb(var(--slate-300-rgb) / 0.9);
border-radius: 0.45rem;
background: rgb(var(--slate-50-rgb));
color: rgb(var(--slate-800-rgb));
font-size: 0.75rem;
font-weight: 600;
line-height: 1.2;
text-decoration: none;
box-shadow: 0 1px 2px rgb(var(--slate-900-rgb) / 0.04);
transition: border-color 160ms ease, background 160ms ease, box-shadow 160ms ease;
}
.edgeever-pdf-attachment-node,
.edgeever-file-attachment-node {
display: block;
margin: 0.75rem 0 1rem;
}
.pdf-viewer-action {
display: inline-flex;
width: 2rem;
height: 2rem;
flex: 0 0 auto;
align-items: center;
justify-content: center;
border-radius: 0.45rem;
color: rgb(var(--slate-500-rgb));
transition: color 150ms ease, background 150ms ease;
}
.pdf-viewer-action:hover:not(:disabled),
.pdf-viewer-action.is-active {
background: var(--brand-green-soft);
color: var(--brand-green-text);
}
.pdf-viewer-action:disabled {
cursor: not-allowed;
opacity: 0.35;
}
.pdf-viewer-action svg {
width: 1rem;
height: 1rem;
}
.ProseMirror li:has(> p > a[href*="/api/v1/resources/"]) {
margin-bottom: 0.25rem;
}
.ProseMirror a.edgeever-attachment-link::before,
.ProseMirror a[href*="/api/v1/resources/"]::before {
content: "📎";
flex: 0 0 auto;
font-size: 0.8rem;
}
.ProseMirror a.edgeever-attachment-link:hover,
.ProseMirror a[href*="/api/v1/resources/"]:hover {
border-color: rgb(var(--brand-green-rgb) / 0.5);
background: var(--brand-green-soft);
box-shadow: 0 3px 10px rgb(var(--brand-green-rgb) / 0.08);
}
:root.dark .ProseMirror a.edgeever-attachment-link,
:root.dark .ProseMirror a[href*="/api/v1/resources/"] {
border-color: rgb(var(--slate-300-rgb) / 0.8);
background: rgb(var(--slate-100-rgb));
color: rgb(var(--slate-800-rgb));
}
.ProseMirror .edgeever-pdf-viewer a.edgeever-attachment-link,
.ProseMirror .edgeever-pdf-viewer a[href*="/api/v1/resources/"],
.ProseMirror .edgeever-file-viewer a[href*="/api/v1/resources/"] {
max-width: none;
padding: 0;
border: 0;
background: transparent;
box-shadow: none;
font-size: inherit;
}
.ProseMirror .edgeever-pdf-viewer a.edgeever-attachment-link::before,
.ProseMirror .edgeever-pdf-viewer a[href*="/api/v1/resources/"]::before,
.ProseMirror .edgeever-file-viewer a[href*="/api/v1/resources/"]::before {
content: none;
}
.ProseMirror .edgeever-pdf-viewer a.pdf-viewer-action:hover,
.ProseMirror .edgeever-file-viewer a.pdf-viewer-action:hover,
.ProseMirror .edgeever-file-viewer button.pdf-viewer-action:hover {
background: var(--brand-green-soft);
color: var(--brand-green-text);
}
.ProseMirror ul,
.ProseMirror ol {
padding-left: 1.5rem;
margin: 0 0 1rem;
}
.ProseMirror ul {
list-style-type: disc;
}
.ProseMirror ol {
list-style-type: decimal;
}
.ProseMirror li {
margin: 0.25rem 0;
}
.ProseMirror ul[data-type="taskList"] {
list-style: none;
padding-left: 0;
}
/* TipTap's task-item NodeView exposes data-checked, but not data-type, in the live editor DOM. */
.ProseMirror ul[data-type="taskList"] li[data-checked] {
display: flex;
align-items: flex-start;
gap: 0.55rem;
}
.ProseMirror ul[data-type="taskList"] li[data-checked] > label {
display: inline-flex;
flex: 0 0 auto;
align-items: center;
margin-top: 0.2rem;
user-select: none;
}
.ProseMirror ul[data-type="taskList"] li[data-checked] > label input {
width: 1rem;
height: 1rem;
margin: 0;
border-radius: 3px;
accent-color: #1a1d21;
cursor: pointer;
}
:root.dark .ProseMirror ul[data-type="taskList"] li[data-checked] > label input {
accent-color: #e7ebe8;
}
.ProseMirror ul[data-type="taskList"] li[data-checked] > div {
min-width: 0;
flex: 1 1 auto;
}
.ProseMirror ul[data-type="taskList"] li[data-checked] > div > p {
margin-bottom: 0;
}
.ProseMirror ul[data-type="taskList"] li[data-checked="true"] > div > p {
color: rgb(var(--slate-500-rgb));
text-decoration: line-through;
text-decoration-color: rgb(var(--slate-400-rgb));
transition: color 150ms ease, text-decoration 150ms ease;
}
.ProseMirror ul[data-type="taskList"] ul[data-type="taskList"] {
margin: 0.25rem 0 0;
padding-left: 1.5rem;
}
.ProseMirror .ee-inline-field-source {
font-size: 0;
color: transparent;
}
.ProseMirror .ee-inline-field {
display: inline-flex;
align-items: center;
margin: 0 0.15rem;
padding: 0 0.45rem;
border: 1px solid rgb(var(--slate-200-rgb, 226 232 240));
border-radius: 999px;
background: rgb(var(--slate-100-rgb, 241 245 249));
color: rgb(var(--slate-500-rgb, 100 116 139));
font-size: 0.75rem;
font-weight: 600;
line-height: 1.55;
vertical-align: 0.12em;
cursor: text;
}
:root.dark .ProseMirror .ee-inline-field {
border-color: rgb(51 65 85);
background: rgb(30 41 59);
color: rgb(148 163 184);
}
.ProseMirror blockquote {
margin: 0 0 1rem;
border: 0;
border-radius: 8px;
padding: 0.75rem 1rem;
color: #3d4450;
background: #f3f5f7;
}
.ProseMirror code {
border: 0;
border-radius: 4px;
background: #e9edf1;
box-shadow: inset 0 0 0 1px rgb(61 68 80 / 0.08);
padding: 0.08em 0.28em;
font-size: var(--editor-code-font-size, 0.875em);
font-weight: 450;
color: #3d4450;
font-family: "JetBrains Mono", "Fira Code", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
}
.ProseMirror pre {
margin: 0 0 1rem;
overflow-x: auto;
border: 1px solid rgb(var(--slate-300-rgb) / 0.6);
border-radius: 8px;
background: rgb(var(--slate-50-rgb) / 0.75);
padding: 0.9rem 1rem;
color: #0f172a;
box-shadow: 0 1px 2px rgb(var(--slate-900-rgb) / 0.03);
}
.ProseMirror pre code {
border: 0;
background: transparent;
box-shadow: none;
padding: 0;
color: inherit;
font-weight: 550;
}
.ProseMirror .edgeever-code-block,
.ProseMirror .edgeever-mermaid-code-block {
position: relative;
margin: 0 0 1rem;
}
.ProseMirror .edgeever-code-copy-button {
position: absolute;
top: 0.45rem;
right: 0.45rem;
z-index: 1;
border: 1px solid rgb(var(--slate-300-rgb) / 0.7);
border-radius: 6px;
padding: 0.22rem 0.5rem;
background: rgb(255 255 255 / 0.88);
backdrop-filter: blur(6px);
color: #475569;
font: inherit;
font-size: 0.72rem;
font-weight: 500;
line-height: 1.4;
cursor: pointer;
transition: border-color 150ms ease, color 150ms ease, background-color 150ms ease, box-shadow 150ms ease;
}
.ProseMirror .edgeever-code-copy-button:hover,
.ProseMirror .edgeever-code-copy-button:focus-visible {
border-color: #1a1d21;
color: #1a1d21;
background: rgb(255 255 255 / 0.96);
box-shadow: 0 1px 4px rgb(26 29 33 / 0.08);
outline: none;
}
.ProseMirror .edgeever-code-source {
overflow-x: auto;
border: 1px solid rgb(var(--slate-300-rgb) / 0.6);
border-radius: 8px;
background: rgb(var(--slate-50-rgb) / 0.75);
padding: 0.9rem 1rem;
color: #0f172a;
font-family: "JetBrains Mono", "Fira Code", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 0.875em;
white-space: pre;
padding-right: 5.5rem;
box-shadow: 0 1px 2px rgb(var(--slate-900-rgb) / 0.03);
}
.ProseMirror .edgeever-mermaid-code-block {
overflow: visible;
background: transparent;
}
.ProseMirror .edgeever-mermaid-toolbar {
position: absolute;
top: 0.5rem;
right: 0.5rem;
z-index: 2;
display: flex;
gap: 0.25rem;
padding: 0.25rem;
border: 1px solid #e3ece7;
border-radius: 7px;
background: rgb(255 255 255 / 0.94);
box-shadow: 0 1px 3px rgb(15 23 42 / 0.08);
backdrop-filter: blur(6px);
}
.ProseMirror .edgeever-mermaid-tool-button {
display: inline-flex;
width: 2rem;
height: 2rem;
flex: 0 0 2rem;
align-items: center;
justify-content: center;
border: 0;
border-radius: 5px;
background: transparent;
color: #475569;
cursor: pointer;
}
.ProseMirror .edgeever-mermaid-tool-button svg {
width: 1rem;
height: 1rem;
stroke-width: 2;
}
.ProseMirror .edgeever-mermaid-tool-button:hover,
.ProseMirror .edgeever-mermaid-tool-button:focus-visible,
.ProseMirror .edgeever-mermaid-tool-button[aria-pressed="true"] {
background: #eaf5ee;
color: #0f766e;
outline: none;
}
.ProseMirror .edgeever-mermaid-tool-button:focus-visible {
box-shadow: 0 0 0 2px var(--workspace-editor), 0 0 0 4px var(--brand-green);
}
.ProseMirror .edgeever-mermaid-tool-button[data-state="copied"] {
color: #15803d;
}
.ProseMirror .edgeever-mermaid-tool-button[data-state="error"] {
color: #be123c;
}
.ProseMirror .edgeever-mermaid-preview {
display: flex;
max-height: min(70vh, 44rem);
min-height: 6rem;
align-items: flex-start;
justify-content: flex-start;
overflow: auto;
overscroll-behavior-x: contain;
overscroll-behavior-y: auto;
padding: 1rem;
border: 1px solid #e3ece7;
border-radius: 8px;
background: var(--workspace-editor);
scrollbar-color: var(--scrollbar-thumb) transparent;
}
.ProseMirror .edgeever-mermaid-message,
.ProseMirror .edgeever-mermaid-error {
margin: 0;
font-size: 0.82rem;
color: #64748b;
}
.ProseMirror .edgeever-mermaid-error {
color: #be123c;
}
.ProseMirror .edgeever-mermaid-svg {
display: flex;
width: max-content;
min-width: 100%;
flex: none;
align-self: flex-start;
justify-content: center;
}
.ProseMirror .edgeever-mermaid-svg svg {
display: block;
width: var(--mermaid-display-width, auto);
max-width: none;
height: var(--mermaid-display-height, auto);
max-height: none;
flex: none;
}
.ProseMirror .edgeever-mermaid-svg text {
font-family: var(--editor-body-font-family, var(--edgeever-system-font-family));
font-synthesis: weight;
}
.ProseMirror .edgeever-mermaid-svg text[font-weight="500"] {
font-weight: 550;
}
.ProseMirror .edgeever-mermaid-source {
display: none;
margin-top: 0.5rem;
}
.ProseMirror .edgeever-mermaid-code-block.is-source-visible .edgeever-mermaid-source {
display: block;
}
/* lowlight emits Highlight.js token classes inside a div-based Tiptap node view. */
.ProseMirror .edgeever-code-block {
color: #24292e;
}
:root.dark .ProseMirror .edgeever-code-block {
color: hsl(var(--foreground));
}
.ProseMirror hr {
margin: var(--memo-content-divider-spacing) 0;
border: 0;
border-top: 1px solid var(--memo-content-divider-color);
}
/* Semantic merge boundaries — stronger than decorative theme hairlines. */
.ProseMirror hr.edgeever-merge-divider,
.ProseMirror hr[data-edgeever-merge-divider] {
margin: var(--memo-content-divider-spacing) 0;
height: 0;
border: 0;
border-top: 2px solid var(--memo-content-divider-color);
background: transparent;
}
.ProseMirror img {
display: block;
max-width: 100%;
max-height: min(68vh, 720px);
height: auto;
object-fit: contain;
margin: 1rem 0;
border: 1px solid var(--brand-green-border);
border-radius: 8px;
}
.ProseMirror img.ProseMirror-selectednode {
outline: 2px solid var(--brand-green);
outline-offset: 3px;
}
.ProseMirror .edgeever-image-upload-placeholder {
position: relative;
display: block;
width: 100%;
max-width: 48rem;
height: clamp(12rem, 42vw, 28rem);
overflow: hidden;
margin: 1rem 0;
border: 1px solid var(--brand-green-border);
border-radius: 8px;
background:
linear-gradient(110deg, transparent 24%, rgb(255 255 255 / 0.72) 42%, transparent 60%) -18rem 0 / 18rem 100% no-repeat,
rgb(var(--slate-100-rgb) / 0.82);
animation: edgeever-image-placeholder-shimmer 1.35s ease-in-out infinite;
line-height: normal;
}
.ProseMirror .edgeever-image-upload-placeholder__preview {
width: 100%;
height: 100%;
max-height: none;
margin: 0;
border: 0;
border-radius: 0;
opacity: 0;
object-fit: contain;
transition: opacity 160ms ease;
}
.ProseMirror .edgeever-image-upload-placeholder.is-preview-ready {
background: rgb(var(--slate-100-rgb) / 0.82);
animation: none;
}
.ProseMirror .edgeever-image-upload-placeholder.is-preview-ready .edgeever-image-upload-placeholder__preview {
opacity: 1;
}
.ProseMirror .edgeever-image-upload-placeholder__status {
position: absolute;
left: 50%;
bottom: 0.75rem;
display: inline-flex;
align-items: center;
gap: 0.45rem;
transform: translateX(-50%);
border: 1px solid rgb(var(--slate-300-rgb) / 0.8);
border-radius: 999px;
background: rgb(255 255 255 / 0.92);
padding: 0.4rem 0.75rem;
color: #475569;
box-shadow: 0 4px 16px rgb(15 23 42 / 0.12);
font-size: 0.75rem;
font-weight: 600;
line-height: 1;
white-space: nowrap;
}
.ProseMirror .edgeever-image-upload-placeholder__spinner {
width: 0.85rem;
height: 0.85rem;
border: 2px solid rgb(var(--brand-green-rgb) / 0.2);
border-top-color: var(--brand-green);
border-radius: 999px;
animation: edgeever-image-placeholder-spin 700ms linear infinite;
}
.ProseMirror .edgeever-file-upload-placeholder {
display: flex;
align-items: center;
gap: 0.75rem;
width: min(100%, 48rem);
min-height: 3.5rem;
margin: 0.5rem 0;
padding: 0.75rem 1rem;
border: 1px solid var(--brand-green-border);
border-radius: 0.75rem;
background: rgb(var(--slate-100-rgb) / 0.55);
box-shadow: 0 1px 3px rgb(15 23 42 / 0.08);
line-height: normal;
}
.ProseMirror .edgeever-file-upload-placeholder__icon {
display: flex;
flex: none;
width: 1.4rem;
height: 1.4rem;
color: var(--brand-green);
}
.ProseMirror .edgeever-file-upload-placeholder__icon svg {
width: 100%;
height: 100%;
}
.ProseMirror .edgeever-file-upload-placeholder__filename {
min-width: 0;
overflow: hidden;
color: rgb(var(--slate-800-rgb));
font-size: 0.875rem;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
}
.ProseMirror .edgeever-file-upload-placeholder__status {
display: inline-flex;
flex: none;
align-items: center;
gap: 0.4rem;
margin-left: auto;
color: rgb(var(--slate-500-rgb));
font-size: 0.75rem;
font-weight: 600;
white-space: nowrap;
}
@keyframes edgeever-image-placeholder-shimmer {
to { background-position: calc(100% + 18rem) 0, 0 0; }
}
@keyframes edgeever-image-placeholder-spin {
to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
.ProseMirror .edgeever-image-upload-placeholder,
.ProseMirror .edgeever-image-upload-placeholder__spinner {
animation: none;
}
}
.ProseMirror .edgeever-image-node {
position: relative;
display: block;
max-width: 100%;
min-width: 9rem;
margin: 1rem 0;
line-height: 0;
}
.ProseMirror .edgeever-image-node img {
width: 100%;
margin: 0;
}
.ProseMirror .edgeever-image-node.is-selected img {
outline: 2px solid var(--brand-green);
outline-offset: 3px;
}
.ProseMirror .edgeever-image-controls {
position: absolute;
right: 0.5rem;
top: 0.5rem;
z-index: 2;
display: flex;
align-items: center;
gap: 0.35rem;
border: 1px solid rgba(var(--brand-green-200-rgb), 0.95);
border-radius: 8px;
background: rgba(255, 255, 255, 0.94);
padding: 0.3rem;
box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16);
line-height: 1;
}
.ProseMirror .edgeever-image-preview-control {
position: absolute;
right: 0.5rem;
top: 0.5rem;
z-index: 2;
border: 1px solid rgba(var(--brand-green-200-rgb), 0.95);
border-radius: 8px;
background: rgba(255, 255, 255, 0.94);
padding: 0.3rem;
box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16);
line-height: 1;
opacity: 0;
pointer-events: none;
transition: opacity 160ms ease;
}
.ProseMirror .edgeever-image-node:hover .edgeever-image-preview-control,
.ProseMirror .edgeever-image-node.is-selected .edgeever-image-preview-control,
.ProseMirror .edgeever-image-preview-control:focus-within {
opacity: 1;
pointer-events: auto;
}
.ProseMirror [data-edgeever-image-gallery] {
position: relative;
margin: 1rem 0;
}
.ProseMirror [data-edgeever-image-gallery]:not(.edgeever-image-gallery),
.ProseMirror .edgeever-image-gallery__content > div {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(11rem, 100%), 1fr));
align-items: stretch;
gap: 0.65rem;
}
.ProseMirror [data-edgeever-image-gallery][data-image-count="4"]:not(.edgeever-image-gallery),
.ProseMirror [data-edgeever-image-gallery][data-image-count="4"] .edgeever-image-gallery__content > div,
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="2"]:not(.edgeever-image-gallery),
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="2"] .edgeever-image-gallery__content > div {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="3"]:not(.edgeever-image-gallery),
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="3"] .edgeever-image-gallery__content > div {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="1"]:not(.edgeever-image-gallery),
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="1"] .edgeever-image-gallery__content > div {
grid-template-columns: minmax(0, 1fr);
}
.ProseMirror [data-edgeever-image-gallery] > img,
.ProseMirror .edgeever-image-gallery__content > img,
.ProseMirror .edgeever-image-gallery__content > .edgeever-image-node,
.ProseMirror .edgeever-image-gallery__content > div > div {
width: 100% !important;
min-width: 0;
height: 100%;
min-height: 8rem;
max-height: none;
margin: 0;
overflow: hidden;
border-radius: 8px;
background: transparent;
}
.ProseMirror .edgeever-image-gallery__content > div > div > .edgeever-image-node {
width: 100% !important;
min-width: 0;
height: 100%;
max-height: none;
margin: 0 !important;
overflow: hidden;
border-radius: 8px;
background: transparent;
}
.ProseMirror [data-edgeever-image-gallery] > img,
.ProseMirror .edgeever-image-gallery__content > img,
.ProseMirror .edgeever-image-gallery__content > .edgeever-image-node > img,
.ProseMirror .edgeever-image-gallery__content > div > div > .edgeever-image-node > img {
display: block;
width: 100% !important;
height: 100%;
min-height: 8rem;
max-height: 18rem;
margin: 0;
object-fit: cover;
}
.ProseMirror .edgeever-image-gallery__toolbar {
position: relative;
display: flex;
flex-wrap: wrap;
width: fit-content;
max-width: 100%;
margin-bottom: 0.5rem;
align-items: center;
gap: 0.25rem;
border: 1px solid rgba(var(--brand-green-200-rgb), 0.95);
border-radius: 8px;
background: rgba(255, 255, 255, 0.96);
padding: 0.3rem;
box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16);
}
.ProseMirror .edgeever-image-gallery__button {
min-width: 2rem;
height: 2rem;
border-radius: 6px;
padding: 0 0.5rem;
color: #475569;
font-size: 0.75rem;
font-weight: 650;
line-height: 1;
}
.ProseMirror .edgeever-image-gallery__button:hover,
.ProseMirror .edgeever-image-gallery__button:focus-visible,
.ProseMirror .edgeever-image-gallery__button.is-active {
background: var(--brand-green-muted);
color: var(--brand-green-text);
}
.ProseMirror .edgeever-image-gallery__button:focus-visible {
outline: 2px solid var(--brand-green);
outline-offset: 1px;
}
@media (max-width: 520px) {
.ProseMirror [data-edgeever-image-gallery]:not(.edgeever-image-gallery),
.ProseMirror .edgeever-image-gallery__content > div,
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="3"]:not(.edgeever-image-gallery),
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="3"] .edgeever-image-gallery__content > div {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="1"]:not(.edgeever-image-gallery),
.ProseMirror [data-edgeever-image-gallery][data-image-gallery-layout="1"] .edgeever-image-gallery__content > div {
grid-template-columns: minmax(0, 1fr);
}
}
.ProseMirror .edgeever-image-preview-button {
display: inline-flex;
width: 2rem;
height: 2rem;
align-items: center;
justify-content: center;
border-radius: 6px;
color: #475569;
}
.ProseMirror .edgeever-image-preview-button:hover,
.ProseMirror .edgeever-image-preview-button:focus-visible {
background: var(--brand-green-muted);
color: var(--brand-green-text);
}
.ProseMirror .edgeever-image-preview-button:focus-visible {
outline: 2px solid var(--brand-green);
outline-offset: 2px;
}
.ProseMirror .edgeever-image-preview-button svg {
width: 1rem;
height: 1rem;
}
@media (hover: none) {
.ProseMirror .edgeever-image-preview-control {
opacity: 1;
pointer-events: auto;
}
}
.ProseMirror .edgeever-image-presets {
display: flex;
align-items: center;
gap: 0.2rem;
}
.ProseMirror .edgeever-image-preset {
display: inline-flex;
min-width: 3rem;
min-height: 2rem;
align-items: center;
justify-content: center;
border-radius: 6px;
color: #475569;
font-size: 0.75rem;
font-weight: 700;
}
.ProseMirror .edgeever-image-preset:hover,
.ProseMirror .edgeever-image-preset.is-active {
background: var(--brand-green-muted);
color: var(--brand-green-text);
}
.ProseMirror .edgeever-image-resize-handle {
width: 1.75rem;
height: 1.75rem;
border-radius: 6px;
background:
linear-gradient(135deg, transparent 46%, var(--brand-green) 48%, var(--brand-green) 54%, transparent 56%),
linear-gradient(135deg, transparent 62%, rgba(var(--brand-green-600-rgb), 0.8) 64%, rgba(var(--brand-green-600-rgb), 0.8) 70%, transparent 72%);
cursor: ew-resize;
}
.ProseMirror .edgeever-image-resize-handle:hover {
background-color: var(--brand-green-muted);
}
.ProseMirror.edgeever-note-rich-editor p.is-empty::before {
color: #a8b5c4;
content: attr(data-placeholder);
float: left;
font-size: inherit;
font-weight: inherit;
height: 0;
line-height: inherit;
pointer-events: none;
}
:root.dark .ProseMirror.edgeever-note-rich-editor p.is-empty::before {
color: #64748b;
}
/* Custom premium scrollbar style */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: transparent;
}
::-webkit-scrollbar-thumb {
background: var(--scrollbar-thumb);
border-radius: 9999px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--scrollbar-thumb-hover);
}
* {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb) transparent;
}
/* Standard Markdown Content Rendering Styles */
.markdown-content {
font-family: var(--ui-font-family, Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif);
color: #1e293b;
line-height: 1.7;
word-break: break-word;
overflow-wrap: break-word;
font-feature-settings: "chws" 1;
}
.companion-markdown.markdown-content > :first-child {
margin-top: 0;
}
.companion-markdown.markdown-content > :last-child {
margin-bottom: 0;
}
.companion-markdown.markdown-content h1,
.companion-markdown.markdown-content h2,
.companion-markdown.markdown-content h3,
.companion-markdown.markdown-content h4,
.companion-markdown.markdown-content h5,
.companion-markdown.markdown-content h6 {
font-size: 0.8125rem;
font-weight: 600;
line-height: 1.4;
margin-top: 0.7rem;
margin-bottom: 0.2rem;
padding: 0;
border: none;
}
.companion-markdown.markdown-content h1:first-child,
.companion-markdown.markdown-content h2:first-child,
.companion-markdown.markdown-content h3:first-child,
.companion-markdown.markdown-content h4:first-child,
.companion-markdown.markdown-content h5:first-child,
.companion-markdown.markdown-content h6:first-child {
margin-top: 0;
}
.companion-markdown.markdown-content p {
margin: 0.4rem 0;
}
.companion-markdown.markdown-content ul,
.companion-markdown.markdown-content ol {
margin: 0.25rem 0 0.45rem;
padding-left: 1.15rem;
}
.companion-markdown.markdown-content li {
margin: 0.12rem 0;
}
.companion-markdown.markdown-content hr {
margin: 0.75rem 0;
}
.markdown-content h1 {
font-size: 1.5rem;
font-weight: 700;
color: #020617;
margin-top: 1.75rem;
margin-bottom: 1rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid #e2e8f0;
}
.markdown-content h2, .markdown-content h3 {
font-size: 1.125rem;
font-weight: 700;
color: #020617;
margin-top: 1.75rem;
margin-bottom: 0.75rem;
}
.markdown-content h2 {
font-size: 1.2rem;
border-left: 4px solid var(--brand-green);
padding-left: 0.75rem;
}
.markdown-content p {
margin: 0.85rem 0;
font-size: 0.875rem;
}
.markdown-content hr {
margin: 2rem 0;
border: 0;
border-top: 1px solid #e2e8f0;
}
.markdown-content blockquote {
border-left: 4px solid var(--brand-green);
padding: 0.5rem 0 0.5rem 1rem;
background-color: var(--brand-green-soft);
color: var(--brand-green-text);
font-weight: 500;
border-radius: 0 4px 4px 0;
margin: 1.25rem auto;
}
.markdown-content ul {
list-style-type: disc;
margin: 0.75rem 0;
padding-left: 1.5rem;
}
.markdown-content ol {
list-style-type: decimal;
margin: 0.75rem 0;
padding-left: 1.5rem;
}
.markdown-content li {
margin: 0.35rem 0;
font-size: 0.875rem;
}
.markdown-content pre {
background-color: #f7fbf8;
color: #1e293b;
border: 1px solid #d9eadf;
padding: 1rem;
border-radius: 6px;
overflow-x: auto;
font-family: monospace;
font-size: 0.8rem;
line-height: 1.5;
margin: 1rem 0;
}
.markdown-content code {
font-family: "JetBrains Mono", "Fira Code", monospace;
background-color: #e9edf1;
box-shadow: inset 0 0 0 1px rgb(61 68 80 / 0.08);
color: #3d4450;
border: 0;
padding: 0.08em 0.28em;
border-radius: 4px;
font-size: 0.8rem;
font-weight: 450;
}
.markdown-content pre code {
background-color: transparent;
box-shadow: none;
border: 0;
color: inherit;
padding: 0;
border-radius: 0;
font-weight: normal;
font-size: inherit;
}
.markdown-content a {
color: var(--brand-green-text);
text-decoration: underline;
font-weight: 500;
}
.markdown-content a:hover {
color: var(--brand-green);
}
.ProseMirror .tableWrapper,
.markdown-content .tableWrapper {
--mobile-table-column-width: clamp(4.5rem, 24cqi, 12rem);
container-type: inline-size;
display: block;
width: 100%;
max-width: 100%;
min-width: 0;
overflow-x: auto;
overflow-y: hidden;
-webkit-overflow-scrolling: touch;
margin-top: 1.25rem;
margin-right: auto;
margin-bottom: 1.25rem;
margin-left: 0;
border: 1px solid rgb(var(--slate-300-rgb) / 0.7);
border-radius: 6px;
background: #fff;
overscroll-behavior-inline: contain;
scrollbar-color: var(--scrollbar-thumb) transparent;
box-shadow: 0 1px 3px rgb(var(--slate-900-rgb) / 0.03);
}
.ProseMirror table,
.markdown-content table {
width: 100%;
max-width: none;
min-width: 100%;
border-collapse: separate;
border-spacing: 0;
table-layout: fixed;
}
/* Container query responsive column distributions for 1-4 columns */
.ProseMirror table:has(> colgroup > col:first-child:last-child),
.markdown-content table:has(> colgroup > col:first-child:last-child) {
--mobile-table-column-width: 100cqi;
}
.ProseMirror table:has(> colgroup > col:first-child:nth-last-child(2)),
.markdown-content table:has(> colgroup > col:first-child:nth-last-child(2)) {
--mobile-table-column-width: 50cqi;
}
.ProseMirror table:has(> colgroup > col:first-child:nth-last-child(3)),
.markdown-content table:has(> colgroup > col:first-child:nth-last-child(3)) {
--mobile-table-column-width: calc(100cqi / 3);
}
.ProseMirror table:has(> colgroup > col:first-child:nth-last-child(4)),
.markdown-content table:has(> colgroup > col:first-child:nth-last-child(4)) {
--mobile-table-column-width: 25cqi;
}
/* For tables with 5+ columns on narrow viewports, expand width and scroll inside tableWrapper */
.ProseMirror table:has(> colgroup > col:first-child:nth-last-child(n+5)),
.markdown-content table:has(> colgroup > col:first-child:nth-last-child(n+5)) {
width: max-content;
--mobile-table-column-width: clamp(4.5rem, 24cqi, 12rem);
}
/* For tables without colgroup (plain markdown or pasted html), allow natural distribution */
.ProseMirror table:not(:has(colgroup)),
.markdown-content table:not(:has(colgroup)) {
table-layout: auto;
width: 100%;
min-width: 100%;
}
.ProseMirror table col,
.markdown-content table col {
width: var(--mobile-table-column-width) !important;
min-width: var(--mobile-table-column-width) !important;
}
.ProseMirror th,
.ProseMirror td,
.markdown-content th,
.markdown-content td {
position: relative;
width: var(--mobile-table-column-width, auto);
min-width: var(--mobile-table-column-width, 3.5rem);
max-width: var(--mobile-table-column-width, none);
border: 0;
border-right: 1px solid rgb(var(--slate-200-rgb) / 0.8);
border-bottom: 1px solid rgb(var(--slate-200-rgb) / 0.8);
padding: 0.48rem 0.8rem;
text-align: left;
vertical-align: top;
white-space: normal;
overflow-wrap: anywhere;
word-break: break-word;
letter-spacing: normal;
line-height: 1.45;
transition: background-color 120ms ease;
}
.ProseMirror th,
.markdown-content th {
background: rgb(var(--slate-100-rgb) / 0.75);
color: #0f172a;
font-size: 0.84rem;
font-weight: 600;
letter-spacing: -0.01em;
}
.ProseMirror th:last-child,
.ProseMirror td:last-child,
.markdown-content th:last-child,
.markdown-content td:last-child {
border-right: 0;
}
.ProseMirror tr:last-child td,
.markdown-content tr:last-child td {
border-bottom: 0;
}
.ProseMirror tbody tr:nth-child(even) td,
.markdown-content tbody tr:nth-child(even) td {
background: rgb(var(--slate-50-rgb) / 0.5);
}
.ProseMirror tbody tr:hover td,
.markdown-content tbody tr:hover td {
background: rgb(var(--slate-100-rgb) / 0.6);
}
@media (min-width: 768px) {
.ProseMirror table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))),
.markdown-content table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))) {
width: 100%;
table-layout: auto;
}
.ProseMirror table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))) col,
.markdown-content table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))) col {
width: auto !important;
min-width: 0 !important;
}
.ProseMirror table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))) th,
.ProseMirror table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))) td,
.markdown-content table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))) th,
.markdown-content table:not(:has(> colgroup > col:first-child:nth-last-child(n+5))) td {
width: auto;
min-width: 0;
max-width: none;
}
}
.ProseMirror th p,
.ProseMirror td p,
.markdown-content th p,
.markdown-content td p,
.edgeever-editor[data-editor-theme]:not([data-editor-theme="default"]) .ProseMirror :is(th, td) p,
.edgeever-editor[data-paper-theme]:not([data-editor-theme="default"]) .ProseMirror :is(th, td) p {
margin: 0;
letter-spacing: inherit;
line-height: inherit;
}
.ProseMirror .selectedCell::after {
position: absolute;
inset: 0;
content: "";
pointer-events: none;
background: rgb(16 185 129 / 0.14);
}
:root.dark .ProseMirror th,
:root.dark .markdown-content th {
background: rgb(255 255 255 / 0.035);
color: hsl(var(--foreground));
}
:root.dark .ProseMirror .tableWrapper,
:root.dark .markdown-content .tableWrapper {
border-color: rgb(var(--slate-200-rgb) / 0.9);
background: var(--workspace-editor);
box-shadow: 0 1px 3px rgb(0 0 0 / 0.2);
}
:root.dark .ProseMirror th,
:root.dark .ProseMirror td,
:root.dark .markdown-content th,
:root.dark .markdown-content td {
border-color: rgb(var(--slate-200-rgb) / 0.7);
}
:root.dark .ProseMirror tbody tr:nth-child(even) td,
:root.dark .markdown-content tbody tr:nth-child(even) td {
background: rgb(255 255 255 / 0.02);
}
:root.dark .ProseMirror tbody tr:hover td,
:root.dark .markdown-content tbody tr:hover td {
background: rgb(255 255 255 / 0.055);
}
:root.dark .edgeever-paper,
:root.dark .edgeever-pdf-viewer canvas {
background-color: #fff !important;
}
:root.dark * {
--tw-ring-offset-color: var(--workspace-canvas);
}
:root.dark .ProseMirror blockquote {
color: hsl(var(--foreground));
background: rgb(255 255 255 / 0.05);
}
:root.dark .ProseMirror code,
:root.dark .markdown-content code {
background: rgb(255 255 255 / 0.09);
box-shadow: inset 0 0 0 1px rgb(255 255 255 / 0.08);
color: hsl(var(--foreground));
}
:root.dark .ProseMirror pre code,
:root.dark .markdown-content pre code {
background: transparent;
box-shadow: none;
}
:root.dark .ProseMirror pre,
:root.dark .markdown-content pre {
border-color: rgb(var(--slate-200-rgb) / 0.8);
background: rgb(var(--slate-100-rgb) / 0.8);
color: hsl(var(--foreground));
}
:root.dark .ProseMirror .edgeever-code-copy-button {
border-color: rgb(var(--slate-200-rgb) / 0.9);
background: rgb(var(--slate-100-rgb) / 0.9);
color: rgb(var(--slate-500-rgb));
}
:root.dark .ProseMirror .edgeever-code-copy-button:hover,
:root.dark .ProseMirror .edgeever-code-copy-button:focus-visible {
border-color: var(--brand-green);
color: var(--brand-green-text);
background: rgb(var(--slate-200-rgb));
}
:root.dark .ProseMirror .edgeever-mermaid-code-block {
background: transparent;
}
:root.dark .ProseMirror .edgeever-mermaid-toolbar {
border-color: var(--workspace-divider);
background: rgb(var(--dark-surface-rgb) / 0.94);
box-shadow: 0 1px 3px rgb(0 0 0 / 0.28);
}
:root.dark .ProseMirror .edgeever-mermaid-tool-button {
color: hsl(var(--foreground));
}
:root.dark .ProseMirror .edgeever-mermaid-tool-button:hover,
:root.dark .ProseMirror .edgeever-mermaid-tool-button:focus-visible,
:root.dark .ProseMirror .edgeever-mermaid-tool-button[aria-pressed="true"] {
background: var(--brand-green-soft);
color: var(--brand-green-text);
}
:root.dark .ProseMirror .edgeever-mermaid-tool-button:focus-visible {
box-shadow: 0 0 0 2px var(--workspace-editor), 0 0 0 4px var(--brand-green);
}
:root.dark .ProseMirror .edgeever-code-source {
border-color: rgb(var(--slate-200-rgb) / 0.8);
background: rgb(var(--slate-100-rgb) / 0.8);
color: hsl(var(--foreground));
}
:root.dark .ProseMirror .edgeever-mermaid-preview {
border-color: var(--workspace-divider);
background: var(--workspace-editor);
}
:root.dark .markdown-content {
color: hsl(var(--foreground));
}
:root.dark .markdown-content h1,
:root.dark .markdown-content h2,
:root.dark .markdown-content h3 {
color: hsl(var(--foreground));
}
:root.dark .markdown-content h1,
:root.dark .markdown-content hr {
border-color: var(--workspace-divider);
}
:root.dark .markdown-content pre {
background-color: rgb(var(--slate-100-rgb) / 0.8);
border-color: rgb(var(--slate-200-rgb) / 0.8);
color: hsl(var(--foreground));
}
.edgeever-mermaid-viewer .yarl__toolbar {
top: max(0.5rem, env(safe-area-inset-top));
right: max(0.5rem, env(safe-area-inset-right));
gap: 0.25rem;
padding: 0.25rem;
border: 1px solid rgb(255 255 255 / 0.18);
border-radius: 8px;
background: rgb(26 31 28 / 0.92);
box-shadow: 0 4px 16px rgb(0 0 0 / 0.24);
backdrop-filter: blur(8px);
}
.edgeever-mermaid-viewer .yarl__button,
.edgeever-mermaid-viewer-reset {
display: inline-flex;
width: 2.75rem;
height: 2.75rem;
padding: 0;
align-items: center;
justify-content: center;
border: 0;
border-radius: 6px;
background: transparent;
color: #f8fafc;
filter: none;
cursor: pointer;
}
.edgeever-mermaid-viewer .yarl__button:hover,
.edgeever-mermaid-viewer .yarl__button:focus-visible,
.edgeever-mermaid-viewer-reset:hover,
.edgeever-mermaid-viewer-reset:focus-visible {
background: rgb(255 255 255 / 0.14);
outline: none;
}
.edgeever-mermaid-viewer .yarl__button:focus-visible,
.edgeever-mermaid-viewer-reset:focus-visible {
box-shadow: inset 0 0 0 2px #5eead4;
}
.edgeever-mermaid-viewer-reset:disabled {
opacity: 0.38;
cursor: default;
}
.edgeever-mermaid-viewer-reset svg {
width: 1.5rem;
height: 1.5rem;
}
.edgeever-mermaid-viewer .yarl__slide_image {
user-select: none;
}
.edgeever-mermaid-viewer .yarl__slide_wrapper_interactive {
cursor: grab;
}
.edgeever-mermaid-viewer .yarl__slide_wrapper_interactive:active {
cursor: grabbing;
}
@media (pointer: coarse) {
.ProseMirror .edgeever-mermaid-tool-button {
width: 2.75rem;
height: 2.75rem;
flex-basis: 2.75rem;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
scroll-behavior: auto !important;
transition-duration: 0.01ms !important;
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
}
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 0.01ms !important;
}
}