-
+
+
+
+
+ {/* Outside the scroll container: always visible at the bottom
+ edge of the window (M10 follow-up 3). */}
-
+
diff --git a/apps/web/src/pages/PluginManager.tsx b/apps/web/src/pages/PluginManager.tsx
index 8c68db5..ce1772b 100644
--- a/apps/web/src/pages/PluginManager.tsx
+++ b/apps/web/src/pages/PluginManager.tsx
@@ -1,3 +1,4 @@
+import { Trash2 } from 'lucide-react';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useRef, useState } from 'react';
import { Link } from 'react-router-dom';
@@ -122,12 +123,15 @@ export function PluginManager(): React.JSX.Element {
diff --git a/apps/web/src/styles/base.css b/apps/web/src/styles/base.css
index 8544c1b..2041659 100644
--- a/apps/web/src/styles/base.css
+++ b/apps/web/src/styles/base.css
@@ -248,8 +248,16 @@ button {
max-width: 36rem;
}
+.main-column {
+ flex: 1;
+ min-width: 0;
+ display: flex;
+ flex-direction: column;
+}
+
.main {
flex: 1;
+ min-height: 0;
min-width: 0;
overflow-y: auto;
padding: var(--space-6) var(--space-8);
@@ -497,9 +505,10 @@ button {
display: flex;
align-items: center;
gap: var(--space-2);
- margin-top: var(--space-8);
- padding-top: var(--space-3);
+ flex-shrink: 0;
+ padding: var(--space-2) var(--space-8);
border-top: 1px solid var(--color-border);
+ background: var(--color-bg);
color: var(--color-text-muted);
font-size: 0.85rem;
}
@@ -832,6 +841,11 @@ button {
padding: var(--space-2) var(--space-3);
border-bottom: 1px solid var(--color-border);
background: var(--color-bg-subtle);
+ /* Long articles: the toolbar pins to the top of the scrolling content
+ area instead of scrolling away. */
+ position: sticky;
+ top: 0;
+ z-index: 20;
}
.editor-toolbar__group {
@@ -931,6 +945,20 @@ button {
border: none;
}
+/* Read mode integrates plugin output like normal content: no frame, no
+ name bar — same principle as the frameless reading shell (M10). */
+.editor-shell--reading .plugin-block {
+ border: none;
+ border-radius: 0;
+ background: transparent;
+ /* No selection outline either — reading is not editing. */
+ outline: none;
+}
+
+.editor-shell--reading .plugin-block__bar {
+ display: none;
+}
+
.plugin-block__fallback {
padding: var(--space-2) var(--space-3);
}
diff --git a/eslint.config.mjs b/eslint.config.mjs
index c7ea911..7e1782e 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -9,6 +9,8 @@ export default tseslint.config(
{
ignores: [
'**/dist/**',
+ // Vendored third-party apps bundled into plugins (drawio) — never linted.
+ 'packages/plugins/*/vendor/**',
'**/node_modules/**',
'**/coverage/**',
'**/.pnpm-store/**',