feat: ship v0.3.0 with P2.1 editor polish and P3 AI collaboration

Add chapter reorder, search replace, inspiration capture, and AI chat with context editing, settings, offline handling, and naming checks. Fix dev black screen by keeping process.env reads in the main process only.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 16:33:56 +08:00
parent 0b5aa146bd
commit 8ce35a1e8e
59 changed files with 3808 additions and 100 deletions
+390
View File
@@ -354,6 +354,10 @@
color: var(--text-primary);
}
.chapter-item.drag-over {
box-shadow: inset 0 2px 0 var(--accent);
}
.ch-badge {
margin-left: auto;
font-size: 10px;
@@ -500,6 +504,314 @@
flex-direction: column;
}
.panel-content.active {
display: flex;
flex-direction: column;
}
.panel-content.ai-panel-wrap {
padding: 0;
overflow: hidden;
}
.ai-panel {
display: flex;
flex-direction: column;
height: 100%;
min-height: 0;
}
.ai-panel-empty {
padding: 12px;
font-size: 12px;
color: var(--text-muted);
}
.ai-session-bar {
display: flex;
align-items: center;
gap: 6px;
padding: 8px 10px;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.ai-session-bar select {
flex: 1;
font-size: 11px;
padding: 4px 8px;
background: var(--bg-tertiary);
color: var(--text-primary);
border: 1px solid var(--border);
border-radius: 4px;
}
.ai-mode-tabs {
display: flex;
gap: 2px;
padding: 6px 8px;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.ai-mode-tab {
flex: 1;
padding: 5px 4px;
font-size: 10px;
text-align: center;
border-radius: 4px;
cursor: pointer;
color: var(--text-muted);
background: transparent;
border: none;
}
.ai-mode-tab.active {
background: var(--accent);
color: #fff;
font-weight: 600;
}
.context-preview {
padding: 6px 10px;
font-size: 10px;
color: var(--text-muted);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
text-align: left;
background: transparent;
border-left: none;
border-right: none;
border-top: none;
cursor: pointer;
width: 100%;
}
.context-preview:hover {
color: var(--accent-light);
}
.context-editor-modal {
max-width: 520px;
width: 90vw;
}
.context-editor-tabs {
display: flex;
gap: 4px;
margin-bottom: 10px;
}
.context-editor-tab {
flex: 1;
font-size: 11px;
padding: 6px 4px;
border: 1px solid var(--border);
background: var(--bg-tertiary);
color: var(--text-secondary);
border-radius: 4px;
cursor: pointer;
}
.context-editor-tab.active {
background: var(--accent);
color: #fff;
border-color: var(--accent);
}
.context-editor-list {
max-height: 280px;
overflow-y: auto;
margin-bottom: 12px;
}
.context-editor-item {
display: flex;
align-items: center;
gap: 8px;
padding: 6px 4px;
font-size: 12px;
cursor: pointer;
}
.offline-banner {
display: none;
padding: 6px 12px;
background: var(--orange, #f59e0b);
color: #000;
font-size: 11px;
text-align: center;
font-weight: 600;
flex-shrink: 0;
}
.offline-banner.show {
display: block;
}
.chat-messages {
flex: 1;
overflow-y: auto;
padding: 12px;
display: flex;
flex-direction: column;
gap: 10px;
min-height: 0;
}
.chat-msg {
padding: 10px 12px;
border-radius: var(--radius-sm);
font-size: 12px;
line-height: 1.6;
max-width: 92%;
white-space: pre-wrap;
word-break: break-word;
}
.chat-msg.user {
align-self: flex-end;
background: var(--accent-dark, var(--accent));
color: #fff;
}
.chat-msg.ai {
align-self: flex-start;
background: var(--bg-tertiary);
color: var(--text-primary);
border: 1px solid var(--border);
}
.quick-cmds {
display: flex;
flex-wrap: wrap;
gap: 4px;
padding: 6px 8px;
border-top: 1px solid var(--border);
flex-shrink: 0;
}
.quick-cmd {
font-size: 10px;
padding: 3px 8px;
border-radius: 4px;
background: var(--bg-tertiary);
border: 1px solid var(--border);
color: var(--text-secondary);
cursor: pointer;
}
.quick-cmd:hover:not(:disabled) {
background: var(--bg-hover);
color: var(--text-primary);
}
.quick-cmd:disabled {
opacity: 0.45;
cursor: not-allowed;
}
.chat-msg {
position: relative;
}
.chat-insert-btn {
margin-top: 6px;
font-size: 10px;
padding: 2px 8px;
border-radius: 4px;
border: 1px solid var(--border);
background: var(--bg-surface);
color: var(--text-secondary);
cursor: pointer;
}
.chat-insert-btn:hover {
color: var(--text-primary);
border-color: var(--accent);
}
.knowledge-toolbar {
padding: 10px;
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.knowledge-panel {
display: flex;
flex-direction: column;
height: 100%;
}
.naming-modal-body {
max-height: 360px;
overflow-y: auto;
padding: 8px 12px;
}
.naming-row {
padding: 10px;
margin-bottom: 8px;
border-radius: var(--radius-sm);
background: var(--bg-tertiary);
border: 1px solid var(--border);
}
.naming-terms {
font-size: 13px;
margin-bottom: 4px;
}
.naming-meta {
font-size: 11px;
color: var(--text-secondary);
margin-bottom: 8px;
}
.naming-actions {
display: flex;
gap: 6px;
}
.naming-empty {
font-size: 12px;
color: var(--text-secondary);
padding: 12px 4px;
}
.chat-input-area {
display: flex;
gap: 6px;
padding: 8px;
border-top: 1px solid var(--border);
flex-shrink: 0;
}
.chat-input-area input {
flex: 1;
padding: 8px 10px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: var(--bg-tertiary);
color: var(--text-primary);
font-size: 12px;
}
.chat-input-area button {
padding: 8px 14px;
border-radius: var(--radius-sm);
border: none;
background: var(--accent);
color: #fff;
font-size: 12px;
cursor: pointer;
}
.chat-input-area button:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.placeholder-box {
color: var(--text-muted);
font-size: 12px;
@@ -556,6 +868,21 @@
font-size: 13px;
}
.ai-license-notice {
margin: 4px 0 12px;
padding: 10px 14px;
font-size: 12px;
line-height: 1.6;
color: var(--text-secondary);
background: color-mix(in srgb, var(--accent) 8%, var(--bg-tertiary));
border-radius: var(--radius-sm);
border-left: 3px solid var(--accent);
}
.ai-license-notice a {
color: var(--accent);
}
.shortcut-key {
min-width: 140px;
padding: 6px 12px;
@@ -734,6 +1061,44 @@
font-weight: 600;
}
.ref-header-actions {
display: flex;
gap: 4px;
align-items: center;
}
.ref-pin-btn.active {
color: var(--accent-light);
}
.inspiration-modal {
max-width: 480px;
}
.inspiration-capture {
display: flex;
flex-direction: column;
gap: 8px;
}
.inspiration-textarea {
width: 100%;
min-height: 120px;
padding: 10px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
background: var(--bg-tertiary);
color: var(--text-primary);
font-size: 13px;
line-height: 1.6;
resize: vertical;
}
.form-label {
font-size: 11px;
color: var(--text-secondary);
}
.ref-tabs {
display: flex;
gap: 4px;
@@ -862,6 +1227,31 @@
background: var(--bg-hover);
}
.search-replace-panel {
margin-top: 8px;
font-size: 12px;
}
.search-replace-panel summary {
cursor: pointer;
color: var(--text-secondary);
margin-bottom: 8px;
}
.search-replace-actions {
display: flex;
gap: 8px;
margin-top: 8px;
}
.search-replace-previews {
margin-top: 8px;
max-height: 160px;
overflow-y: auto;
border: 1px solid var(--border);
border-radius: 4px;
}
.sr-type {
font-size: 10px;
color: var(--accent-light);