inplan 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/LICENSE +661 -0
- package/app/main/index.js +769 -0
- package/app/preload/index.mjs +92 -0
- package/app/renderer/assets/index-BqLfQmz0.js +52343 -0
- package/app/renderer/assets/index-C67b7qA1.css +272 -0
- package/app/renderer/index.html +13 -0
- package/bin/cli.js +1409 -0
- package/package.json +29 -0
- package/skill/SKILL.md +149 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/* SPDX-License-Identifier: AGPL-3.0-or-later */
|
|
2
|
+
/* Editor visual language: "editorial planning paper" — warm paper + ink, one pine
|
|
3
|
+
accent, an amber for warnings. Fonts gracefully fall back to system fonts on the
|
|
4
|
+
desktop app; the web edition additionally loads Fraunces / Hanken Grotesk /
|
|
5
|
+
JetBrains Mono, so it renders with the full type system. */
|
|
6
|
+
:root {
|
|
7
|
+
--paper: #f1ebdc; /* recessed surface (the comment rail) */
|
|
8
|
+
--bg: #fdfbf6; /* primary surface (panes, cards, inputs) */
|
|
9
|
+
--fg: #1c1a17; /* ink */
|
|
10
|
+
--muted: #6f6857; /* ink-soft */
|
|
11
|
+
--faint: #a8a08c; /* ink-faint */
|
|
12
|
+
--line: #e6dfce;
|
|
13
|
+
--line-strong: #d8cfb8;
|
|
14
|
+
--accent: #1f5c4d; /* pine */
|
|
15
|
+
--accent-press: #184a3e;
|
|
16
|
+
--accent-soft: #e9f0ec; /* pine tint */
|
|
17
|
+
--danger: #a3331f;
|
|
18
|
+
--amber: #9a5f23;
|
|
19
|
+
--shadow-sm: 0 1px 2px rgba(28, 26, 23, 0.05);
|
|
20
|
+
--shadow: 0 1px 2px rgba(28, 26, 23, 0.04), 0 8px 22px -14px rgba(28, 26, 23, 0.30);
|
|
21
|
+
--serif: "Fraunces", Georgia, "Times New Roman", serif;
|
|
22
|
+
--sans: "Hanken Grotesk", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
23
|
+
--mono: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
|
|
24
|
+
}
|
|
25
|
+
* { box-sizing: border-box; }
|
|
26
|
+
html, body, #root { height: 100%; margin: 0; }
|
|
27
|
+
body {
|
|
28
|
+
font: 14px/1.55 var(--sans);
|
|
29
|
+
color: var(--fg);
|
|
30
|
+
background: var(--bg);
|
|
31
|
+
-webkit-font-smoothing: antialiased;
|
|
32
|
+
text-rendering: optimizeLegibility;
|
|
33
|
+
}
|
|
34
|
+
.ap-app { display: flex; flex-direction: column; height: 100%; }
|
|
35
|
+
.ap-loading { padding: 2rem; color: var(--muted); }
|
|
36
|
+
|
|
37
|
+
/* top bar */
|
|
38
|
+
.ap-topbar { display: flex; align-items: center; gap: 8px; padding: 7px 12px; border-bottom: 1px solid var(--line); background: var(--bg); }
|
|
39
|
+
.ap-seg { display: inline-flex; border: 1px solid var(--line-strong); border-radius: 7px; overflow: hidden; }
|
|
40
|
+
.ap-seg button { border: 0; background: var(--bg); padding: 4px 10px; cursor: pointer; border-right: 1px solid var(--line); color: var(--fg); }
|
|
41
|
+
.ap-seg button:last-child { border-right: 0; }
|
|
42
|
+
.ap-seg button:hover:not(.active) { background: var(--accent-soft); }
|
|
43
|
+
.ap-seg button.active { background: var(--accent); color: #fbfaf6; }
|
|
44
|
+
.ap-spacer { flex: 1; }
|
|
45
|
+
|
|
46
|
+
/* settings menu */
|
|
47
|
+
.ap-settings { position: relative; }
|
|
48
|
+
.ap-settings > button { border: 1px solid var(--line-strong); background: var(--bg); border-radius: 7px; padding: 4px 8px; cursor: pointer; color: var(--fg); }
|
|
49
|
+
.ap-settings-menu { position: absolute; top: 36px; left: 0; z-index: 40; width: 300px; background: var(--bg); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); padding: 12px; }
|
|
50
|
+
.ap-settings-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 0; font-size: 13px; }
|
|
51
|
+
.ap-settings-hint { font-size: 11px; color: var(--muted); padding-top: 2px; }
|
|
52
|
+
|
|
53
|
+
/* profile menu (shared between the desktop app + the web edition) */
|
|
54
|
+
.ap-profile { position: relative; margin-left: 4px; }
|
|
55
|
+
.ap-avatar { position: relative; width: 30px; height: 30px; border-radius: 50%; border: 1px solid var(--line-strong); background: var(--accent-soft); color: var(--accent); font-size: 12px; font-weight: 600; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; padding: 0; }
|
|
56
|
+
.ap-avatar-initials { line-height: 1; }
|
|
57
|
+
.ap-profile-menu { position: absolute; top: 38px; right: 0; z-index: 40; width: 240px; background: var(--bg); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); padding: 8px; }
|
|
58
|
+
.ap-profile-id { padding: 4px 6px 6px; }
|
|
59
|
+
.ap-profile-name { font-size: 13px; font-weight: 600; }
|
|
60
|
+
.ap-profile-email { font-size: 11px; color: var(--muted); font-family: var(--mono); }
|
|
61
|
+
.ap-profile-actions { display: flex; flex-direction: column; gap: 4px; }
|
|
62
|
+
.ap-profile-action { text-align: left; border: 1px solid var(--line-strong); background: var(--bg); border-radius: 7px; padding: 6px 8px; font: inherit; font-size: 13px; cursor: pointer; }
|
|
63
|
+
.ap-profile-action:hover:not(:disabled) { background: var(--accent-soft); }
|
|
64
|
+
.ap-profile-action:disabled { opacity: 0.5; cursor: default; }
|
|
65
|
+
.ap-profile-action.ap-danger { color: var(--danger); }
|
|
66
|
+
.ap-profile-lang { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 8px 6px 2px; margin-top: 6px; border-top: 1px solid var(--line); font-size: 13px; color: var(--muted); }
|
|
67
|
+
.ap-profile-lang-select { font: inherit; font-size: 13px; padding: 4px 8px; border: 1px solid var(--line-strong); border-radius: 6px; background: var(--bg); color: var(--fg); cursor: pointer; }
|
|
68
|
+
|
|
69
|
+
/* menu-bar agent connection indicator */
|
|
70
|
+
.ap-agent { position: relative; }
|
|
71
|
+
.ap-agent-btn { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--line-strong); background: var(--bg); border-radius: 7px; padding: 3px 8px; font: inherit; font-size: 12px; cursor: pointer; color: var(--muted); }
|
|
72
|
+
.ap-agent-btn:hover { background: var(--accent-soft); }
|
|
73
|
+
.ap-agent-label { line-height: 1; }
|
|
74
|
+
.ap-agent-dot { width: 10px; height: 10px; border-radius: 50%; flex: 0 0 auto; }
|
|
75
|
+
.ap-agent-local { background: #2bb673; } /* agent on your machine */
|
|
76
|
+
.ap-agent-off { background: var(--danger); } /* no agent connected */
|
|
77
|
+
.ap-agent-pie { width: 13px; height: 13px; border-radius: 50%; flex: 0 0 auto; }
|
|
78
|
+
.ap-agent-menu { position: absolute; top: 34px; left: 0; z-index: 40; width: 220px; background: var(--bg); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); padding: 8px; }
|
|
79
|
+
.ap-agent-detail { font-size: 12px; padding: 2px 6px 6px; border-bottom: 1px solid var(--line); margin-bottom: 6px; }
|
|
80
|
+
.ap-agent-quota { font-size: 11px; color: var(--muted); margin-top: 2px; }
|
|
81
|
+
.ap-agent-policy { display: flex; flex-direction: column; gap: 2px; }
|
|
82
|
+
.ap-agent-policy-opt { display: flex; align-items: center; gap: 7px; text-align: left; border: 0; background: none; padding: 5px 6px; font: inherit; font-size: 12px; cursor: pointer; border-radius: 6px; color: var(--muted); }
|
|
83
|
+
.ap-agent-policy-opt:hover { background: var(--accent-soft); }
|
|
84
|
+
.ap-policy-dot { width: 9px; height: 9px; border-radius: 50%; border: 1px solid var(--line-strong); flex: 0 0 auto; }
|
|
85
|
+
.ap-agent-policy-opt.active { color: inherit; font-weight: 600; }
|
|
86
|
+
.ap-agent-policy-opt.active .ap-policy-dot { background: var(--accent); border-color: var(--accent); }
|
|
87
|
+
|
|
88
|
+
.ap-topbar button, .ap-tabs button { font: inherit; }
|
|
89
|
+
.ap-topbar > button { border: 1px solid var(--line-strong); background: var(--bg); border-radius: 7px; padding: 4px 12px; cursor: pointer; color: var(--fg); }
|
|
90
|
+
.ap-primary { background: var(--accent) !important; color: #fbfaf6; border-color: var(--accent) !important; }
|
|
91
|
+
|
|
92
|
+
/* iconified top-bar controls: uniform 30px height; SVGs inherit button color so
|
|
93
|
+
they tint on hover/active. Secondary actions are icon-only (label via title +
|
|
94
|
+
aria-label); the primary keeps a short label. */
|
|
95
|
+
.ap-topbar svg { width: 16px; height: 16px; display: block; }
|
|
96
|
+
.ap-topbar .ap-seg button, .ap-settings > button { height: 30px; display: inline-flex; align-items: center; justify-content: center; }
|
|
97
|
+
.ap-zoom-val { min-width: 46px; font-variant-numeric: tabular-nums; font-size: 12px; color: var(--muted); }
|
|
98
|
+
.ap-iconrow { display: inline-flex; align-items: center; gap: 6px; }
|
|
99
|
+
.ap-iconbtn { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; padding: 0; border: 1px solid var(--line-strong); background: var(--bg); border-radius: 7px; color: var(--fg); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; }
|
|
100
|
+
.ap-iconbtn:hover:not(:disabled) { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
|
|
101
|
+
.ap-iconbtn:disabled { opacity: 0.4; cursor: default; }
|
|
102
|
+
.ap-iconbtn .ap-dirty { position: absolute; top: 2px; right: 2px; width: 7px; height: 7px; border-radius: 50%; background: var(--accent); border: 1.5px solid var(--bg); }
|
|
103
|
+
.ap-iconbtn--primary { width: auto; gap: 6px; font-weight: 500; }
|
|
104
|
+
/* Scoped to beat the more-specific `.ap-topbar > button` rule above (the primary is a
|
|
105
|
+
direct child of the bar), so the accent fill + light text always win. */
|
|
106
|
+
.ap-topbar > button.ap-iconbtn--primary { height: 30px; padding: 0 14px; background: var(--accent); border: 1px solid var(--accent); color: #fbfaf6; border-radius: 7px; }
|
|
107
|
+
.ap-topbar > button.ap-iconbtn--primary:hover:not(:disabled) { background: var(--accent-press); border-color: var(--accent-press); color: #fbfaf6; }
|
|
108
|
+
.ap-topbar > button.ap-iconbtn--primary svg { width: 15px; height: 15px; }
|
|
109
|
+
.ap-update-err { color: var(--danger); }
|
|
110
|
+
|
|
111
|
+
/* banner */
|
|
112
|
+
.ap-banner { background: var(--accent-soft); border-bottom: 1px solid var(--line); padding: 9px 14px; display: flex; gap: 10px; align-items: center; }
|
|
113
|
+
.ap-banner-reload { background: #f6ecdd; }
|
|
114
|
+
|
|
115
|
+
/* main layout */
|
|
116
|
+
.ap-main { flex: 1; display: flex; min-height: 0; }
|
|
117
|
+
.ap-preview { flex: 1; min-width: 0; overflow: auto; padding: 28px 36px; border-right: 1px solid var(--line); background: var(--bg); }
|
|
118
|
+
.ap-rendered { max-width: 760px; }
|
|
119
|
+
.ap-rendered h1, .ap-rendered h2, .ap-rendered h3 { font-family: var(--serif); font-weight: 500; letter-spacing: -0.01em; line-height: 1.15; }
|
|
120
|
+
.ap-rendered .ap-anchor { background: #f6eccb; border-bottom: 2px solid var(--amber); color: inherit; text-decoration: none; cursor: pointer; border-radius: 2px; }
|
|
121
|
+
.ap-pane { width: 380px; flex: 0 0 auto; display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--line); overflow: hidden; }
|
|
122
|
+
/* draggable vertical splitter between panes */
|
|
123
|
+
.ap-vsplit { flex: 0 0 6px; cursor: col-resize; background: var(--line); }
|
|
124
|
+
.ap-vsplit:hover, .ap-vsplit:active { background: var(--accent); }
|
|
125
|
+
.ap-pane:last-child { border-right: 0; }
|
|
126
|
+
.ap-source { flex: 1; overflow: auto; }
|
|
127
|
+
|
|
128
|
+
.ap-tabs { display: flex; border-bottom: 1px solid var(--line); background: var(--bg); }
|
|
129
|
+
.ap-tabs button { flex: 1; border: 0; background: transparent; padding: 8px; cursor: pointer; color: var(--muted); }
|
|
130
|
+
.ap-tabs button:hover { color: var(--fg); }
|
|
131
|
+
.ap-tabs button.active { border-bottom: 2px solid var(--accent); font-weight: 600; color: var(--fg); }
|
|
132
|
+
|
|
133
|
+
/* rail — a soft recessed paper surface so the comment cards read as light, floating
|
|
134
|
+
cards rather than rows. */
|
|
135
|
+
.ap-rail { overflow: auto; background: var(--paper); }
|
|
136
|
+
.ap-rail-head { display: flex; justify-content: space-between; align-items: center; padding: 9px 12px; border-bottom: 1px solid var(--line); background: var(--bg); position: sticky; top: 0; z-index: 1; font-size: 12px; }
|
|
137
|
+
.ap-composer { padding: 12px; border-bottom: 1px solid var(--line); background: var(--bg); }
|
|
138
|
+
.ap-composer textarea { width: 100%; min-height: 48px; resize: vertical; }
|
|
139
|
+
.ap-quote { font-size: 12px; color: var(--accent); margin-bottom: 4px; }
|
|
140
|
+
.ap-muted { color: var(--muted); }
|
|
141
|
+
.ap-row { display: flex; gap: 6px; align-items: center; margin-top: 6px; }
|
|
142
|
+
|
|
143
|
+
textarea, input[type="text"], input[type="email"], input[type="number"], select {
|
|
144
|
+
font: inherit; color: var(--fg); background: var(--bg);
|
|
145
|
+
border: 1px solid var(--line-strong); border-radius: 7px; padding: 7px 9px;
|
|
146
|
+
}
|
|
147
|
+
textarea:focus, input[type="text"]:focus, input[type="email"]:focus, input[type="number"]:focus, select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(31, 92, 77, 0.22); }
|
|
148
|
+
/* keep a clearly-visible native focus ring on checkboxes/radios + anything else */
|
|
149
|
+
input[type="checkbox"]:focus-visible, input[type="radio"]:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
150
|
+
|
|
151
|
+
.ap-thread { padding: 12px; cursor: pointer; margin: 0 10px 8px; background: var(--bg); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow-sm); transition: box-shadow 0.14s ease, transform 0.14s ease; }
|
|
152
|
+
.ap-thread:hover { box-shadow: var(--shadow); }
|
|
153
|
+
/* rail section titles (Document / Anchored) with 10px between sections */
|
|
154
|
+
.ap-section-title { font-family: var(--mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--muted); font-weight: 500; padding: 4px 12px; margin-top: 10px; }
|
|
155
|
+
.ap-section-title:first-child { margin-top: 8px; }
|
|
156
|
+
/* `focused` uses background + border and `synced` uses box-shadow, so a thread that is
|
|
157
|
+
both keeps both signals (they don't fight over the same property). */
|
|
158
|
+
.ap-thread.focused { border-color: var(--accent); background: var(--accent-soft); }
|
|
159
|
+
.ap-thread.synced { box-shadow: inset 3px 0 0 var(--accent), var(--shadow-sm); }
|
|
160
|
+
.ap-diff-del .w, .ap-diff-add .w { border-radius: 2px; padding: 0 1px; }
|
|
161
|
+
.ap-diff-del .w { background: #f3c9c2; }
|
|
162
|
+
.ap-diff-add .w { background: #bfe3cb; }
|
|
163
|
+
.ap-thread.resolved { opacity: 0.55; }
|
|
164
|
+
.ap-thread-quote { font-size: 12px; color: var(--accent); }
|
|
165
|
+
.ap-meta { font-size: 11px; color: var(--muted); margin: 2px 0; }
|
|
166
|
+
.ap-text { white-space: pre-wrap; }
|
|
167
|
+
.ap-reply { margin: 6px 0 0 10px; padding-left: 10px; border-left: 2px solid var(--line); }
|
|
168
|
+
.ap-selected { font-weight: 600; }
|
|
169
|
+
.ap-other { width: 100%; }
|
|
170
|
+
.ap-reply-box { margin-top: 8px; }
|
|
171
|
+
.ap-edit { margin: 4px 0; }
|
|
172
|
+
.ap-comment + .ap-reply, .ap-reply + .ap-reply { margin-top: 8px; }
|
|
173
|
+
.ap-thread-actions { gap: 12px; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--line); }
|
|
174
|
+
|
|
175
|
+
/* per-comment overflow (⋯) menu — Modify / Delete, folded to save space */
|
|
176
|
+
.ap-comment, .ap-reply { position: relative; }
|
|
177
|
+
.ap-cmenu { position: absolute; top: 2px; right: 2px; }
|
|
178
|
+
.ap-cmenu-btn { border: 0; background: none; cursor: pointer; color: var(--faint); padding: 0 6px; font-size: 15px; line-height: 1; border-radius: 5px; }
|
|
179
|
+
.ap-cmenu-btn:hover { background: var(--line); color: var(--fg); }
|
|
180
|
+
.ap-cmenu-pop { position: absolute; right: 0; top: 20px; z-index: 25; display: flex; flex-direction: column; min-width: 96px; background: var(--bg); border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow); overflow: hidden; }
|
|
181
|
+
.ap-cmenu-pop button { border: 0; background: none; text-align: left; padding: 7px 12px; cursor: pointer; font: inherit; }
|
|
182
|
+
.ap-cmenu-pop button:hover { background: var(--accent-soft); }
|
|
183
|
+
.ap-link { background: none; border: 0; color: var(--accent); cursor: pointer; padding: 0; font: inherit; }
|
|
184
|
+
.ap-link:hover { text-decoration: underline; text-underline-offset: 2px; }
|
|
185
|
+
.ap-danger { color: var(--danger); }
|
|
186
|
+
|
|
187
|
+
/* question chips */
|
|
188
|
+
.ap-question { display: flex; flex-direction: column; gap: 5px; margin: 8px 0; }
|
|
189
|
+
.ap-chip { border: 1px solid var(--line-strong); border-radius: 7px; padding: 5px 9px; cursor: pointer; background: var(--bg); }
|
|
190
|
+
.ap-chip:hover { border-color: var(--faint); }
|
|
191
|
+
.ap-chip.on { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); font-weight: 500; }
|
|
192
|
+
|
|
193
|
+
/* pane-selector icons (vertically-long rectangles) */
|
|
194
|
+
.ap-pane-ic { display: inline-flex; gap: 2px; vertical-align: middle; }
|
|
195
|
+
.ap-pane-ic i { width: 4px; height: 13px; border: 1px solid currentColor; border-radius: 1px; display: block; }
|
|
196
|
+
.ap-seg button .ap-pane-ic { color: inherit; }
|
|
197
|
+
|
|
198
|
+
/* floating contextual composer (position set inline; draggable by its header) */
|
|
199
|
+
.ap-composer-float {
|
|
200
|
+
position: fixed; z-index: 30; width: 340px;
|
|
201
|
+
background: var(--bg); border: 1px solid var(--line); border-radius: 10px;
|
|
202
|
+
box-shadow: var(--shadow); padding: 12px;
|
|
203
|
+
}
|
|
204
|
+
.ap-composer-head { display: flex; align-items: center; justify-content: space-between; cursor: move; user-select: none; margin-bottom: 6px; }
|
|
205
|
+
.ap-composer-head .ap-quote { margin-bottom: 0; }
|
|
206
|
+
.ap-drag { color: var(--faint); cursor: move; }
|
|
207
|
+
.ap-grow { width: 100%; min-height: 44px; max-height: 176px; resize: none; overflow-y: auto; }
|
|
208
|
+
|
|
209
|
+
/* rail splitter + empty + orphaned */
|
|
210
|
+
.ap-splitter { font-family: var(--mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.12em; color: var(--muted); padding: 8px 12px 2px; border-top: 1px solid var(--line-strong); margin-top: 4px; }
|
|
211
|
+
.ap-empty { padding: 18px 12px; color: var(--muted); font-size: 13px; }
|
|
212
|
+
.ap-thread.orphaned { background: #fbeeea; border-color: #ecc9bf; }
|
|
213
|
+
.ap-thread.orphaned .ap-thread-quote { color: var(--danger); }
|
|
214
|
+
|
|
215
|
+
/* find & replace bar */
|
|
216
|
+
.ap-find { display: flex; align-items: center; gap: 8px; padding: 7px 12px; border-bottom: 1px solid var(--line); background: var(--accent-soft); flex-wrap: wrap; }
|
|
217
|
+
.ap-find input[type="text"], .ap-find > input { border: 1px solid var(--line-strong); border-radius: 6px; padding: 4px 7px; }
|
|
218
|
+
.ap-find-scope { display: inline-flex; gap: 10px; font-size: 12px; }
|
|
219
|
+
.ap-find-mode { font-size: 12px; font-weight: 600; border-right: 1px solid var(--line-strong); padding-right: 8px; }
|
|
220
|
+
|
|
221
|
+
/* find matches highlighted in the preview (CSS Custom Highlight API) */
|
|
222
|
+
::highlight(ap-find) { background: #f3dba0; color: inherit; }
|
|
223
|
+
/* find matches highlighted inside the source editor (Editor find scope) */
|
|
224
|
+
.cm-ap-find { background: #f3dba0; }
|
|
225
|
+
|
|
226
|
+
/* cross-pane current-line highlight */
|
|
227
|
+
.ap-active-line, .cm-line.ap-active-line { background: var(--accent-soft); }
|
|
228
|
+
.ap-rendered [data-line] { scroll-margin-top: 12px; }
|
|
229
|
+
|
|
230
|
+
/* inline review: slim sticky bar (replaces the floating popup) */
|
|
231
|
+
.ap-review-bar { display: flex; align-items: center; gap: 8px; padding: 7px 14px; border-bottom: 1px solid var(--line); background: var(--accent-soft); font-size: 13px; }
|
|
232
|
+
.ap-review-bar button { font: inherit; border: 1px solid var(--line-strong); background: var(--bg); border-radius: 7px; padding: 4px 11px; cursor: pointer; }
|
|
233
|
+
|
|
234
|
+
/* inline diff in the PREVIEW pane (rendered markdown, per-hunk accept/reject) */
|
|
235
|
+
.ap-diffview { max-width: 760px; }
|
|
236
|
+
.ap-ctx { opacity: 0.72; }
|
|
237
|
+
.ap-ihunk { border: 1px solid var(--line); border-radius: 9px; margin: 12px 0; overflow: hidden; }
|
|
238
|
+
.ap-ihunk-bar { display: flex; align-items: center; gap: 6px; padding: 4px 10px; background: #f3eee1; border-bottom: 1px solid var(--line); font-size: 12px; color: var(--muted); }
|
|
239
|
+
.ap-ihunk-bar button { font: inherit; border: 1px solid var(--line-strong); background: var(--bg); border-radius: 6px; padding: 2px 10px; cursor: pointer; }
|
|
240
|
+
.ap-ihunk-bar button.on { background: var(--accent); color: #fbfaf6; border-color: var(--accent); }
|
|
241
|
+
.ap-ihunk-del { background: #fbeae6; padding: 3px 12px; }
|
|
242
|
+
.ap-ihunk-del :where(p, h1, h2, h3, h4, li, blockquote) { text-decoration: line-through; }
|
|
243
|
+
.ap-ihunk-add { background: #e9f3ec; padding: 3px 12px; }
|
|
244
|
+
.ap-ihunk.rejected .ap-ihunk-add { opacity: 0.4; }
|
|
245
|
+
.ap-ihunk.accepted .ap-ihunk-del { opacity: 0.5; }
|
|
246
|
+
.ap-ihunk.focused { outline: 2px solid var(--accent); outline-offset: 1px; }
|
|
247
|
+
.ap-hunk.focused { background: var(--accent-soft); }
|
|
248
|
+
|
|
249
|
+
/* inline diff in the SOURCE pane (monospaced unified diff) */
|
|
250
|
+
.ap-diffsource { padding: 10px 12px; font-family: var(--mono); font-size: 12px; overflow: auto; }
|
|
251
|
+
|
|
252
|
+
/* review-mode diff panel */
|
|
253
|
+
.ap-review { position: absolute; left: 50%; transform: translateX(-50%); top: 48px; z-index: 25; width: min(820px, 92vw); max-height: 70vh; display: flex; flex-direction: column; background: var(--bg); border: 1px solid var(--line); border-radius: 10px; box-shadow: 0 18px 50px -18px rgba(28, 26, 23, 0.4); }
|
|
254
|
+
.ap-review-head { display: flex; align-items: center; gap: 8px; padding: 9px 14px; border-bottom: 1px solid var(--line); }
|
|
255
|
+
.ap-review-body { overflow: auto; padding: 9px 14px; font-family: var(--mono); font-size: 12px; }
|
|
256
|
+
.ap-hunk { border-left: 3px solid var(--line); margin: 8px 0; padding-left: 8px; }
|
|
257
|
+
.ap-hunk.accepted { border-left-color: #2e9e5b; }
|
|
258
|
+
.ap-hunk.rejected { border-left-color: var(--danger); opacity: 0.7; }
|
|
259
|
+
.ap-hunk-toggle { display: block; font-family: var(--sans); font-size: 12px; margin-bottom: 4px; }
|
|
260
|
+
.ap-diff-same { color: var(--muted); margin: 0; white-space: pre-wrap; }
|
|
261
|
+
.ap-diff-del { background: #fbeae6; color: #8a1c10; margin: 0; white-space: pre-wrap; }
|
|
262
|
+
.ap-diff-add { background: #e9f3ec; color: #18643a; margin: 0; white-space: pre-wrap; }
|
|
263
|
+
|
|
264
|
+
/* status bar */
|
|
265
|
+
.ap-statusbar { display: flex; align-items: center; gap: 8px; padding: 5px 14px; border-top: 1px solid var(--line); font-size: 12px; color: var(--muted); background: var(--bg); }
|
|
266
|
+
/* "Agent is thinking …" indicator: fixed-width dots so the animation never
|
|
267
|
+
shifts neighbouring content, and a take-back button revealed only on hover. */
|
|
268
|
+
.ap-thinking { display: inline-flex; align-items: baseline; gap: 8px; cursor: default; }
|
|
269
|
+
.ap-dots { display: inline-block; width: 2.5em; text-align: left; }
|
|
270
|
+
.ap-takeback { display: none; font-size: 12px; padding: 1px 8px; border: 1px solid #d9a441; background: #f6ecdd; color: #7a4b00; border-radius: 5px; cursor: pointer; }
|
|
271
|
+
.ap-thinking:hover .ap-takeback { display: inline-block; }
|
|
272
|
+
.ap-takeback:hover { background: #efdcb8; }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'" />
|
|
6
|
+
<title>inplan</title>
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-BqLfQmz0.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-C67b7qA1.css">
|
|
9
|
+
</head>
|
|
10
|
+
<body>
|
|
11
|
+
<div id="root"></div>
|
|
12
|
+
</body>
|
|
13
|
+
</html>
|