patent-editor 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/README.md +74 -0
- package/dist/favicon.svg +4 -0
- package/dist/lib.css +1 -0
- package/dist/lib.d.ts +573 -0
- package/dist/lib.js +5161 -0
- package/dist/lib.js.map +1 -0
- package/package.json +126 -0
package/README.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Patent Rich Text Editor
|
|
2
|
+
|
|
3
|
+
A modular rich text editor designed for patent document authoring, built with React, Tiptap, and TypeScript.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **General Editing**: Paragraphs, headings, lists, code blocks, tables, images.
|
|
8
|
+
- **Technical Writing**:
|
|
9
|
+
- Mermaid diagrams
|
|
10
|
+
- Draw.io diagrams (placeholder)
|
|
11
|
+
- Math formulas (KaTeX)
|
|
12
|
+
- **Patent Authoring**:
|
|
13
|
+
- Claim blocks (auto-numbered)
|
|
14
|
+
- Figure blocks with captions
|
|
15
|
+
- Reference nodes
|
|
16
|
+
|
|
17
|
+
## Project Structure
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
src/
|
|
21
|
+
├── editor/ # Editor Core & Logic
|
|
22
|
+
│ ├── core/ # Core classes (EditorCore, PluginManager)
|
|
23
|
+
│ ├── schema/ # Base nodes & marks
|
|
24
|
+
│ ├── plugins/ # Plugin implementations (Mermaid, Math, Patent, etc.)
|
|
25
|
+
│ ├── commands/ # Custom commands
|
|
26
|
+
│ └── renderer/ # Custom node renderers
|
|
27
|
+
├── components/ # React UI Components
|
|
28
|
+
│ ├── EditorView.tsx # Main editor component
|
|
29
|
+
│ ├── Toolbar.tsx # Main toolbar
|
|
30
|
+
│ └── NodeToolbar.tsx # Contextual toolbar
|
|
31
|
+
├── store/ # State management (Zustand)
|
|
32
|
+
├── types/ # TypeScript definitions
|
|
33
|
+
└── styles/ # Editor styles
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Getting Started
|
|
37
|
+
|
|
38
|
+
1. Install dependencies:
|
|
39
|
+
```bash
|
|
40
|
+
pnpm install
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
2. Run development server:
|
|
44
|
+
```bash
|
|
45
|
+
pnpm dev
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
3. Build for production:
|
|
49
|
+
```bash
|
|
50
|
+
pnpm build
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Usage
|
|
54
|
+
|
|
55
|
+
The `EditorView` component is the main entry point.
|
|
56
|
+
|
|
57
|
+
```tsx
|
|
58
|
+
import { EditorView } from './components/EditorView';
|
|
59
|
+
|
|
60
|
+
function App() {
|
|
61
|
+
const handleChange = (json) => {
|
|
62
|
+
console.log('Document updated:', json);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
return <EditorView onChange={handleChange} />;
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Architecture
|
|
70
|
+
|
|
71
|
+
This project follows a plugin-based architecture where each major feature (Mermaid, Math, Patent) is a separate plugin containing its own Node Schema, View, and Logic.
|
|
72
|
+
|
|
73
|
+
- **State Management**: Zustand is used to expose editor state to the UI.
|
|
74
|
+
- **Styling**: TailwindCSS is used for the UI, and custom CSS for editor content.
|
package/dist/favicon.svg
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<rect width="32" height="32" fill="#0A0B0D"/>
|
|
3
|
+
<path d="M26.6677 23.7149H8.38057V20.6496H5.33301V8.38159H26.6677V23.7149ZM8.38057 20.6496H23.6201V11.4482H8.38057V20.6496ZM16.0011 16.0021L13.8461 18.1705L11.6913 16.0021L13.8461 13.8337L16.0011 16.0021ZM22.0963 16.0008L19.9414 18.1691L17.7865 16.0008L19.9414 13.8324L22.0963 16.0008Z" fill="#32F08C"/>
|
|
4
|
+
</svg>
|
package/dist/lib.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.ProseMirror{outline:none;padding:1rem;min-height:400px;background:#fff;color:#333;line-height:1.6}.ProseMirror p{margin-bottom:1em}.ProseMirror h1{font-size:2em!important;font-weight:700!important;margin-top:1.4em;margin-bottom:.4em;line-height:1.3;color:#0f172a}.ProseMirror h2{font-size:1.5em!important;font-weight:700!important;margin-top:1.3em;margin-bottom:.4em;line-height:1.35;color:#1e293b}.ProseMirror h3{font-size:1.25em!important;font-weight:600!important;margin-top:1.2em;margin-bottom:.35em;line-height:1.4;color:#1e293b}.ProseMirror h4{font-size:1.1em!important;font-weight:600!important;margin-top:1em;margin-bottom:.3em;color:#334155}.ProseMirror h5{font-size:.95em!important;font-weight:600!important;margin-top:1em;margin-bottom:.25em;color:#475569}.ProseMirror h6{font-size:.875em!important;font-weight:600!important;margin-top:1em;margin-bottom:.25em;color:#64748b}.ProseMirror ul:not([data-type=taskList]){list-style-type:disc!important;padding-left:2em!important;margin-top:.25em;margin-bottom:1em}.ProseMirror ul:not([data-type=taskList]) ul:not([data-type=taskList]){list-style-type:circle!important;margin-top:.2em;margin-bottom:.2em}.ProseMirror ul:not([data-type=taskList]) ul:not([data-type=taskList]) ul:not([data-type=taskList]){list-style-type:square!important}.ProseMirror ol{list-style-type:decimal!important;padding-left:2em!important;margin-top:.25em;margin-bottom:1em}.ProseMirror ol ol{list-style-type:lower-alpha!important;margin-top:.2em;margin-bottom:.2em}.ProseMirror ol ol ol{list-style-type:lower-roman!important}.ProseMirror li{margin-bottom:.3em;line-height:1.65;display:list-item!important}.ProseMirror li p{margin-bottom:.2em}.ProseMirror blockquote{border-left:4px solid #cbd5e1;padding-left:1em;color:#64748b;font-style:italic;margin:1em 0 1em .5em}.ProseMirror code{background:#f1f5f9;padding:.2em .4em;border-radius:3px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.875em;color:#e11d48}.ProseMirror pre{background:#1e293b;color:#e2e8f0;padding:1em 1.25em;border-radius:6px;overflow-x:auto;margin:1em 0;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:.875em;line-height:1.7}.ProseMirror pre code{background:none;padding:0;border-radius:0;color:inherit;font-size:inherit}.ProseMirror img{max-width:100%;height:auto}.ProseMirror table{border-collapse:collapse;margin:0;overflow:hidden;table-layout:fixed;width:100%}.ProseMirror td,.ProseMirror th{border:2px solid #ced4da;box-sizing:border-box;min-width:1em;padding:3px 5px;position:relative;vertical-align:top}.ProseMirror th{background-color:#f1f3f5;font-weight:700;text-align:left}.ProseMirror .selectedCell:after{background:#c8c8ff66;content:"";left:0;right:0;top:0;bottom:0;pointer-events:none;position:absolute;z-index:2}.ProseMirror .column-resize-handle{background-color:#adf;bottom:-2px;pointer-events:none;position:absolute;right:-2px;top:0;width:4px}.claim-line{display:block;margin:.1em 0 .6em;line-height:1.8}.claim-label{font-weight:700;color:#111827;-webkit-user-select:none;-moz-user-select:none;user-select:none;margin-right:.15em}.claim-body{display:inline}.ProseMirror-dropcursor{border-left-color:#2563eb}.figure-block{border:1px solid #e2e8f0;border-radius:.5rem;padding:.75rem;margin-bottom:1rem;text-align:center;background:#fafafa}.figure-visual{min-height:80px;margin-bottom:.5rem;position:relative}.figure-img-preview{max-width:100%;max-height:400px;-o-object-fit:contain;object-fit:contain;margin:0 auto;display:block;border-radius:4px}.figure-upload-area{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:120px;border:2px dashed #cbd5e1;border-radius:8px;cursor:pointer;transition:border-color .2s,background .2s;background:#f8fafc}.figure-upload-area:hover{border-color:#93c5fd;background:#eff6ff}.figure-upload-area--dragover{border-color:#3b82f6;background:#dbeafe}.figure-upload-hint{color:#94a3b8;font-size:.85rem;pointer-events:none}.figure-replace-btn{position:absolute;top:8px;right:8px;padding:4px 10px;font-size:.75rem;background:#ffffffe6;border:1px solid #e2e8f0;border-radius:4px;cursor:pointer;color:#475569;display:none}.figure-block:hover .figure-replace-btn{display:block}.figure-mermaid-view{cursor:pointer;min-height:60px;border:2px dashed transparent;border-radius:8px;transition:border-color .15s,background .15s;padding:8px}.figure-mermaid-view:hover{border-color:#93c5fd;background:#f0f9ff}.figure-mermaid-preview{display:flex;justify-content:center;align-items:center}.figure-mermaid-preview svg{max-width:100%}.figure-mermaid-view-hint{text-align:center;margin-top:4px;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.figure-mermaid-view-hint--subtle{font-size:.7rem;color:#cbd5e1}.figure-mermaid-view:hover .figure-mermaid-view-hint--subtle{color:#93c5fd}.figure-mermaid-view-hint--empty{font-size:.85rem;color:#94a3b8;font-style:italic;padding:24px 0}.figure-mermaid-edit{border:1px solid #93c5fd;border-radius:6px;background:#f8fafc;overflow:hidden}.figure-mermaid-editor{width:100%;min-height:120px;max-height:300px;resize:vertical;font-family:Fira Code,Consolas,monospace;font-size:.8rem;padding:10px;border:none;background:#f8fafc;color:#334155;display:block;box-sizing:border-box}.figure-mermaid-editor:focus{outline:none;background:#fff}.figure-mermaid-toolbar{display:flex;align-items:center;gap:6px;padding:6px 10px;background:#f1f5f9;border-top:1px solid #e2e8f0}.figure-mermaid-save-btn{padding:4px 12px;font-size:.75rem;font-weight:500;background:#2563eb;color:#fff;border:none;border-radius:4px;cursor:pointer}.figure-mermaid-save-btn:hover{background:#1d4ed8}.figure-mermaid-cancel-btn{padding:4px 12px;font-size:.75rem;background:#fff;color:#64748b;border:1px solid #e2e8f0;border-radius:4px;cursor:pointer}.figure-mermaid-cancel-btn:hover{background:#f1f5f9}.figure-mermaid-error-inline{font-size:.75rem;color:#ef4444;flex:1}.figure-drawio-view{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:100px;border:2px dashed #e2e8f0;border-radius:8px;background:#f8fafc;cursor:pointer;transition:border-color .15s,background .15s}.figure-drawio-view:hover{border-color:#93c5fd;background:#f0f9ff}.figure-drawio-preview-img{max-width:100%;height:auto}.figure-drawio-view-hint{color:#94a3b8;font-size:.85rem;font-style:italic;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.figure-caption{font-size:.85rem;color:#64748b;font-style:italic;text-align:center}.figure-id-label{font-style:normal;font-weight:500;color:#475569;margin-right:.25em}.figure-caption-content{font-style:italic}.math-inline{display:inline-block;vertical-align:middle;position:relative;cursor:pointer;border-radius:4px;padding:1px 4px;transition:background .15s,box-shadow .15s}.math-inline:hover{background:#eff6ff;box-shadow:0 0 0 1.5px #93c5fd}.math-block{display:block;position:relative;text-align:center;padding:1.25rem 2rem;margin:.75em 0;cursor:pointer;border-radius:8px;background:#f9fafb;border:1px solid #e2e8f0;transition:background .15s,border-color .15s,box-shadow .15s}.math-block:hover{background:#eff6ff;border-color:#93c5fd;box-shadow:0 2px 12px #3b82f614}.math-tooltip{display:none;position:absolute;top:-30px;left:50%;transform:translate(-50%);background:#1e293b;color:#f1f5f9;font-size:.68rem;padding:3px 9px;border-radius:5px;white-space:nowrap;pointer-events:none;z-index:100;font-style:normal;font-weight:500;letter-spacing:.03em;box-shadow:0 2px 8px #0003}.math-tooltip:after{content:"";position:absolute;bottom:-4px;left:50%;transform:translate(-50%);border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #1e293b}.math-inline:hover .math-tooltip,.math-block:hover .math-tooltip{display:block}.math-preview{display:inline-flex;align-items:center;cursor:pointer;line-height:1}.math-block .math-preview{display:flex;justify-content:center;align-items:center;min-height:2rem}.math-live-field{display:inline-block;vertical-align:middle;font-size:1rem;min-width:160px;border:2px solid #3b82f6;border-radius:6px;padding:5px 10px;outline:none;background:#fff;box-shadow:0 0 0 3px #3b82f626}.math-live-field--block{display:block;width:90%;margin:0 auto;font-size:1.15rem;padding:10px 16px;min-height:56px;box-shadow:0 0 0 3px #3b82f626}.mermaid-node{margin:1em 0;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.mermaid-view{display:flex;flex-direction:column;align-items:center;min-height:80px;padding:12px;cursor:pointer;transition:background .15s}.mermaid-view:hover{background:#f8fafc}.mermaid-preview{max-width:100%;overflow:hidden}.mermaid-preview svg{max-width:100%;height:auto}.mermaid-view-hint{color:#94a3b8;font-size:.85rem;font-style:italic;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none;margin-top:6px}.mermaid-view-hint--subtle{font-size:.75rem;opacity:.6}.mermaid-view-hint--empty{padding:24px 0;font-size:.9rem}.mermaid-edit{display:none;border-top:1px solid #e2e8f0}.mermaid-editor-textarea{width:100%;min-height:160px;padding:12px;font-family:Fira Code,Consolas,monospace;font-size:.85rem;border:none;outline:none;resize:vertical;background:#f8fafc}.mermaid-edit-toolbar{display:flex;align-items:center;gap:8px;padding:6px 12px;background:#f1f5f9;border-top:1px solid #e2e8f0}.mermaid-error-msg{font-size:.75rem;color:#ef4444;flex:1}.mermaid-cancel-btn,.mermaid-save-btn{padding:4px 12px;font-size:.8rem;border:1px solid #cbd5e1;border-radius:4px;cursor:pointer;background:#fff;color:#334155;transition:background .15s}.mermaid-cancel-btn:hover{background:#f1f5f9}.mermaid-save-btn{background:#3b82f6;border-color:#3b82f6;color:#fff}.mermaid-save-btn:hover{background:#2563eb}.drawio-node{margin:1em 0;border:1px solid #e2e8f0;border-radius:8px;overflow:hidden}.drawio-view{display:flex;flex-direction:column;align-items:center;min-height:80px;padding:12px;cursor:pointer;transition:background .15s}.drawio-view:hover{background:#f8fafc}.drawio-preview-img{max-width:100%;height:auto}.drawio-view-hint{color:#94a3b8;font-size:.85rem;font-style:italic;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none;margin-top:6px}.drawio-view-hint--subtle{font-size:.75rem;opacity:.6}.drawio-view-hint--empty{padding:24px 0;font-size:.9rem}.drawio-modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:#0009;z-index:10000;display:flex;align-items:center;justify-content:center}.drawio-modal-content{width:95vw;height:90vh;background:#fff;border-radius:12px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 20px 60px #0000004d}.drawio-modal-header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;border-bottom:1px solid #e2e8f0;background:#f8fafc}.drawio-modal-title{font-weight:600;font-size:1rem;color:#1e293b}.drawio-modal-close-btn{width:32px;height:32px;display:flex;align-items:center;justify-content:center;border:none;background:transparent;border-radius:6px;cursor:pointer;font-size:1.1rem;color:#64748b;transition:background .15s,color .15s}.drawio-modal-close-btn:hover{background:#fee2e2;color:#ef4444}.drawio-modal-iframe{flex:1;width:100%;border:none}.pb-heading{text-align:center;font-weight:700;font-size:1.15rem;color:#0f172a;padding:1.5rem 2rem .5rem;-webkit-user-select:none;-moz-user-select:none;user-select:none;letter-spacing:.08em}.pt-title{text-align:center;padding:0 2rem;margin:0;position:relative;scroll-margin-top:1rem}.pt-title-content{font-weight:700;font-size:1.1rem;color:#1e293b;letter-spacing:.05em;line-height:1.6;margin:0;outline:none;text-align:center;min-height:0}.pt-title-content:not(.pt-title-content--has-content){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.ps{margin:0;padding:0;scroll-margin-top:1rem}.ps+.ps{margin-top:0}.ps-heading--sub{text-align:center;font-weight:600;font-size:.95rem;color:#334155;padding:.75rem 2rem .25rem;-webkit-user-select:none;-moz-user-select:none;user-select:none;letter-spacing:.03em}.ps--empty .ps-heading--sub{color:#94a3b8}.ps-body{padding:0 2rem;position:relative}.ps--sub .ps-body{padding:0 2rem 0 3rem}.ps-placeholder{color:#e2a3a3;font-size:.95rem;font-weight:400;cursor:pointer;padding:.4rem 0;-webkit-user-select:none;-moz-user-select:none;user-select:none;transition:color .15s}.ps-placeholder:hover{color:#d97070}.ps-placeholder--active{color:#c97a7a}.ps-content{min-height:1.5em}.ps-content .ProseMirror{padding:0;min-height:auto}.ps-content:not(.ps-content--has-content){position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}.reference-link{color:#2563eb;text-decoration:underline;cursor:pointer;padding:0 2px;background:#eff6ff;border-radius:2px}.reference-link[data-highlight=true]{background:#dbeafe;box-shadow:inset 0 0 0 1px #60a5fa}.reference-link-invalid{color:#dc2626;background:#fee2e2;text-decoration:none}.math-inline{background:#f1f5f9;padding:0 4px;border-radius:4px;cursor:pointer}.math-block{background:#f1f5f9;padding:1rem;border-radius:.5rem;margin:1rem 0;text-align:center;cursor:pointer}.mermaid-node{background:#fff;border:1px solid #e2e8f0;padding:1rem;border-radius:.5rem;margin:1rem 0;display:flex;justify-content:center}.ProseMirror ul[data-type=taskList]{list-style:none;padding-left:0}.ProseMirror ul[data-type=taskList] li{display:flex;align-items:flex-start;gap:.5rem}.ProseMirror ul[data-type=taskList] li>label{flex-shrink:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;margin-top:.25em}.ProseMirror ul[data-type=taskList] li>label input[type=checkbox]{accent-color:#2563eb;width:16px;height:16px;cursor:pointer}.ProseMirror ul[data-type=taskList] li>div{flex:1}.ProseMirror ul[data-type=taskList] li[data-checked=true]>div{text-decoration:line-through;color:#94a3b8}.ProseMirror hr{border:none;border-top:2px solid #e2e8f0;margin:1.5em 0}.slash-menu{background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;padding:4px;max-height:320px;overflow-y:auto;min-width:240px}.slash-menu-empty{padding:8px 12px;color:#94a3b8;font-size:.85rem}.slash-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 10px;border:none;background:transparent;border-radius:6px;cursor:pointer;text-align:left;transition:background .1s}.slash-menu-item:hover,.slash-menu-item--active{background:#f1f5f9}.slash-menu-icon{width:32px;height:32px;display:flex;align-items:center;justify-content:center;background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;font-size:.85rem;flex-shrink:0;color:#475569;font-weight:600}.slash-menu-text{display:flex;flex-direction:column}.slash-menu-title{font-size:.85rem;font-weight:500;color:#1e293b}.slash-menu-desc{font-size:.75rem;color:#94a3b8}.search-highlight{background:#fef08a;border-radius:2px}.search-highlight--current{background:#fb923c;color:#fff;border-radius:2px}.find-replace-bar{display:flex;flex-direction:column;gap:4px;padding:6px 12px;background:#f8fafc;border-bottom:1px solid #e2e8f0}.find-replace-row{display:flex;align-items:center;gap:4px}.find-replace-input-group{display:flex;align-items:center;flex:1;background:#fff;border:1px solid #e2e8f0;border-radius:4px;overflow:hidden}.find-replace-input{flex:1;border:none;outline:none;padding:4px 8px;font-size:.85rem;min-width:0}.find-replace-count{font-size:.75rem;color:#94a3b8;padding:0 6px;white-space:nowrap}.find-replace-btn{display:flex;align-items:center;justify-content:center;padding:4px;background:transparent;border:1px solid transparent;border-radius:4px;cursor:pointer;color:#64748b;transition:background .1s}.find-replace-btn:hover{background:#e2e8f0}.find-replace-btn--active{background:#dbeafe;color:#2563eb;border-color:#93c5fd}.bubble-menu{display:flex;align-items:center;gap:2px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 12px #0000001a;padding:4px}.bubble-menu-divider{width:1px;height:20px;background:#e2e8f0;margin:0 2px}.auto-save-indicator{font-size:.75rem;padding:2px 8px;border-radius:3px;-webkit-user-select:none;-moz-user-select:none;user-select:none}.auto-save-indicator--saving{color:#d97706}.auto-save-indicator--saved{color:#16a34a}.auto-save-indicator--error{color:#dc2626}.outline-panel{width:220px;min-width:220px;border-right:1px solid #e2e8f0;background:#fafbfc;display:flex;flex-direction:column;overflow:hidden}.outline-panel--collapsed{width:36px;min-width:36px;border-right:1px solid #e2e8f0;background:#fafbfc;display:flex;align-items:flex-start;justify-content:center;padding-top:8px}.outline-panel-header{display:flex;align-items:center;gap:6px;padding:8px 10px;font-size:.8rem;font-weight:600;color:#475569;border-bottom:1px solid #e2e8f0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.outline-panel-toggle{display:flex;align-items:center;justify-content:center;padding:2px;background:none;border:none;cursor:pointer;color:#94a3b8;border-radius:4px}.outline-panel-toggle:hover{background:#e2e8f0;color:#475569}.outline-panel-list{flex:1;overflow-y:auto;padding:4px 0}.outline-panel-empty{padding:12px;font-size:.75rem;color:#94a3b8;text-align:center}.outline-panel-item{display:flex;align-items:center;gap:6px;width:100%;padding:4px 10px;border:none;background:transparent;cursor:pointer;text-align:left;font-size:.78rem;color:#475569;transition:background .1s}.outline-panel-item:hover{background:#e2e8f0}.outline-panel-item--h1{padding-left:10px;font-weight:600}.outline-panel-item--h2{padding-left:20px}.outline-panel-item--h3{padding-left:30px;font-size:.75rem}.outline-panel-item--h4{padding-left:40px;font-size:.73rem;color:#94a3b8}.outline-panel-item--book{font-weight:600;color:#0f172a;cursor:default;padding-top:6px}.outline-panel-item--book:hover{background:transparent}.outline-panel-item--indent{padding-left:22px}.outline-item-state{flex-shrink:0;font-size:.7rem}.outline-item-title{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.outline-item-count{flex-shrink:0;font-size:.65rem;color:#cbd5e1}.patch-diff-delete{background:#fee2e2;color:#dc2626;text-decoration:line-through;text-decoration-color:#dc2626;text-decoration-thickness:2px;border-radius:2px;padding:0 1px}.patch-diff-insert-inline{background:#dcfce7;color:#16a34a;text-decoration:underline;text-decoration-color:#22c55e;text-decoration-thickness:2px;border-radius:2px;padding:0 1px;font-style:normal}.patch-diff-insert-block{display:block;white-space:pre-wrap;word-break:break-word;margin:8px 0;padding:8px 10px;border-left:3px solid #22c55e;border-radius:4px;max-height:300px;overflow-y:auto;text-decoration:none;font-size:13px;line-height:1.6}.patch-card-list{display:flex;flex-direction:column;gap:8px;padding:8px 0}.patch-card{background:#fff;border:1px solid #e2e8f0;border-radius:8px;padding:10px 12px;font-size:12px;transition:border-color .15s}.patch-card:hover{border-color:#a5b4fc}.patch-card-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.patch-card-label{font-weight:600;color:#475569;font-size:11px;display:flex;align-items:center;gap:4px}.patch-card-label .patch-op-tag{display:inline-block;padding:1px 6px;border-radius:4px;font-size:10px;font-weight:500}.patch-op-tag--replace{background:#fef3c7;color:#b45309}.patch-op-tag--delete{background:#fee2e2;color:#dc2626}.patch-op-tag--insert{background:#dcfce7;color:#16a34a}.patch-card-actions{display:flex;align-items:center;gap:4px}.patch-card-actions button{display:flex;align-items:center;gap:3px;padding:3px 10px;border-radius:5px;font-size:11px;font-weight:500;border:none;cursor:pointer;transition:background .15s,opacity .15s}.patch-card-actions button:hover{opacity:.85}.patch-card-btn-apply{background:#22c55e;color:#fff}.patch-card-btn-reject{background:#f1f5f9;color:#64748b}.patch-card-btn-reject:hover{background:#fee2e2;color:#dc2626}.patch-card-diff{display:flex;flex-direction:column;gap:4px}.patch-card-diff-old{color:#dc2626;text-decoration:line-through;text-decoration-thickness:1.5px;background:#fef2f2;padding:3px 6px;border-radius:4px;font-size:11px;line-height:1.5;word-break:break-all}.patch-card-diff-new{color:#16a34a;text-decoration:underline;text-decoration-color:#86efac;text-decoration-thickness:1.5px;background:#f0fdf4;padding:3px 6px;border-radius:4px;font-size:11px;line-height:1.5;word-break:break-all}.patch-card-reason{margin-top:4px;font-size:10px;color:#94a3b8;font-style:italic}.patch-card-all-actions{display:flex;align-items:center;justify-content:flex-end;gap:6px;padding:6px 0 2px;border-top:1px solid #f1f5f9;margin-top:4px}.patch-card-all-actions button{display:flex;align-items:center;gap:3px;padding:4px 12px;border-radius:5px;font-size:11px;font-weight:500;border:none;cursor:pointer;transition:background .15s}.patch-card-all-btn-apply{background:#22c55e;color:#fff}.patch-card-all-btn-apply:hover{background:#16a34a}.patch-card-all-btn-reject{background:#f1f5f9;color:#64748b}.patch-card-all-btn-reject:hover{background:#fee2e2;color:#dc2626}.ai-floating-trigger{position:absolute;z-index:50;pointer-events:auto}.ai-floating-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;border:none;border-radius:50%;cursor:pointer;box-shadow:0 2px 8px #6366f14d;transition:transform .1s}.ai-floating-btn:hover{transform:scale(1.1)}.ai-floating-menu{position:absolute;top:100%;left:0;margin-top:4px;background:#fff;border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px #0000001a;padding:4px;min-width:180px;z-index:100}.ai-floating-action{display:flex;align-items:center;gap:8px;width:100%;padding:6px 10px;border:none;background:transparent;border-radius:6px;cursor:pointer;font-size:.8rem;color:#475569;text-align:left;transition:background .1s}.ai-floating-action:hover{background:#f1f5f9}.ai-floating-action:disabled{opacity:.5;cursor:not-allowed}.dp-panel{width:100%;height:100%;border:1px solid #e2e8f0;border-radius:.5rem;background:#fafbfc;display:flex;flex-direction:column;overflow:hidden}.dp-tab-bar{display:flex;align-items:center;background:#fff;border-bottom:1px solid #e2e8f0;padding:0}.dp-tab{display:flex;align-items:center;gap:5px;padding:10px 14px;font-size:.8rem;font-weight:500;color:#94a3b8;background:none;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:color .15s,border-color .15s}.dp-tab:hover{color:#475569}.dp-tab--active{color:#6366f1;border-bottom-color:#6366f1}.dp-close{margin-left:auto;margin-right:8px;background:none;border:none;cursor:pointer;color:#94a3b8;padding:4px;border-radius:4px;display:flex;align-items:center}.dp-close:hover{background:#e2e8f0;color:#475569}.dp-tab-content{flex:1;overflow-y:auto;display:flex;flex-direction:column}.dp-drafting{display:flex;flex-direction:column;flex:1;padding:0}.dp-empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:#94a3b8;padding:32px 20px;text-align:center}.dp-empty-state p{font-size:.82rem;margin:0}.dp-empty-icon{color:#cbd5e1}.dp-section-header{display:flex;align-items:center;gap:6px;padding:10px 14px;background:#fff;border-bottom:1px solid #f1f5f9}.dp-section-name{font-weight:600;font-size:.85rem;color:#1e293b}.dp-section-state{font-size:.68rem;padding:1px 8px;border-radius:10px;font-weight:500;margin-left:auto}.dp-section-state--empty{background:#f1f5f9;color:#94a3b8}.dp-section-state--draft{background:#dbeafe;color:#2563eb}.dp-section-state--done{background:#dcfce7;color:#16a34a}.dp-block{padding:10px 14px;border-bottom:1px solid #f1f5f9}.dp-block-label{font-size:.73rem;font-weight:600;color:#64748b;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px}.dp-context-sources{display:flex;flex-wrap:wrap;gap:4px}.dp-source-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;font-size:.72rem;border-radius:4px;cursor:default}.dp-source-chip input[type=checkbox]{width:12px;height:12px;accent-color:#6366f1}.dp-source-chip--active{background:#eff6ff;color:#3b82f6}.dp-source-chip--dep{background:#dcfce7;color:#16a34a}.dp-missing-deps{margin-top:6px;font-size:.72rem;color:#b45309;background:#fffbeb;padding:4px 8px;border-radius:4px;border:1px solid #fde68a}.dp-missing-tag{display:inline-block;padding:0 6px;margin-left:2px;background:#fef3c7;border-radius:3px}.dp-instruction-input{width:100%;border:1px solid #e2e8f0;border-radius:6px;padding:8px 10px;font-size:.82rem;resize:vertical;min-height:60px;box-sizing:border-box;font-family:inherit}.dp-instruction-input:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 2px #8b5cf61a}.dp-instruction-actions{display:flex;justify-content:flex-end;margin-top:6px}.dp-enhance-btn{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;font-size:.72rem;color:#6366f1;background:#eef2ff;border:1px solid #c7d2fe;border-radius:4px;cursor:pointer;transition:background .15s}.dp-enhance-btn:hover{background:#e0e7ff}.dp-actions{padding:12px 14px;display:flex;gap:8px}.dp-btn{display:inline-flex;align-items:center;gap:5px;padding:7px 16px;font-size:.8rem;font-weight:500;border:none;border-radius:6px;cursor:pointer;transition:opacity .15s,background .15s}.dp-btn:disabled{opacity:.5;cursor:not-allowed}.dp-btn--primary{background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff}.dp-btn--primary:hover:not(:disabled){opacity:.9}.dp-btn--secondary{background:#fff;color:#475569;border:1px solid #e2e8f0}.dp-btn--secondary:hover:not(:disabled){background:#f1f5f9}.dp-btn--success{background:#22c55e;color:#fff}.dp-btn--success:hover:not(:disabled){background:#16a34a}.dp-chat{display:flex;flex-direction:column;flex:1;min-height:0}.dp-chat-refs{display:flex;flex-wrap:wrap;gap:4px;padding:8px 10px;border-bottom:1px solid #f1f5f9;background:#fafbfc}.dp-chat-messages{flex:1;overflow-y:auto;padding:10px}.dp-chat-welcome{display:flex;flex-direction:column;align-items:center;gap:16px;padding:24px 12px}.dp-chat-msg-actions{display:flex;gap:4px;margin-top:4px}.dp-chat-msg-actions button{background:none;border:none;cursor:pointer;color:#94a3b8;padding:2px 4px;border-radius:3px}.dp-chat-msg-actions button:hover{background:#f1f5f9;color:#475569}.dp-chat-sender{padding:8px 10px;border-top:1px solid #e2e8f0;background:#fff}.dp-context-tags{display:flex;flex-wrap:wrap;gap:4px}.validation-panel{border-top:1px solid #e2e8f0;background:#fafbfc;max-height:200px;overflow-y:auto}.validation-panel-header{display:flex;align-items:center;justify-content:space-between;padding:6px 12px;font-size:.8rem;font-weight:600;color:#475569;border-bottom:1px solid #f1f5f9}.validation-run-btn{display:flex;align-items:center;gap:4px;padding:3px 10px;font-size:.75rem;background:#fff;color:#475569;border:1px solid #e2e8f0;border-radius:4px;cursor:pointer}.validation-run-btn:hover{background:#f1f5f9}.validation-summary{padding:4px 12px;font-size:.78rem}.validation-list{padding:0 4px 4px}.validation-item{display:flex;align-items:flex-start;gap:6px;width:100%;padding:4px 8px;border:none;background:transparent;border-radius:4px;cursor:pointer;text-align:left;font-size:.78rem;color:#475569}.validation-item:hover{background:#f1f5f9}.validation-item-msg{flex:1}.word-count-bar{display:flex;gap:12px;padding:4px 12px;font-size:.75rem;color:#94a3b8;background:#f8fafc;border-top:1px solid #e2e8f0;-webkit-user-select:none;-moz-user-select:none;user-select:none}
|