inplan 0.1.2 → 0.1.3
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/app/main/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { app, BrowserWindow, ipcMain, dialog, shell } from "electron";
|
|
1
|
+
import { app, nativeImage, BrowserWindow, ipcMain, dialog, shell } from "electron";
|
|
2
2
|
import { execFile } from "node:child_process";
|
|
3
3
|
import { mkdirSync as mkdirSync$1, readdirSync, unlinkSync, readFileSync as readFileSync$1, existsSync as existsSync$1, writeFileSync as writeFileSync$1 } from "node:fs";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
@@ -12,6 +12,7 @@ import __cjs_mod__ from "node:module";
|
|
|
12
12
|
const __filename = import.meta.filename;
|
|
13
13
|
const __dirname = import.meta.dirname;
|
|
14
14
|
const require2 = __cjs_mod__.createRequire(import.meta.url);
|
|
15
|
+
const APP_ICON_DATA_URL = "data:image/png;base64,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AQIECBAgQCClhg2aqrkXbgDcduzgnjq3z6tvPggQIECAAAECBAgQIECAwOgFWgD4vIu190JDL9wAOHe+OrZQBA4mQIAAAQIECBAgQIAAAQLlCLSSSRO198INgLSUjraSnUEJECBAgAABAgQIECBAgEB2Ai0F3EDtvVADYM/ROz7Hm/+1tLiGJUCAAAECBAgQIDwYUgIAABAASURBVECAAIH8BNqKON4MMGrwBcZfqAGQJpPXLzC3QwkQIECAAAECBAgQIECAQFECrSazYA0+dwPgWUeOXFdVSQOg1dU1OAECBAgQIECAAAECBAhkJNBqqFGDRy0+7yRzNwCu2v3A59eTXlPffBAgQIAAAQIECBAgQIAAAQKpdYJrLtbic000dwPgfKqiATDXpA4iQIAAAQIECBAgQIAAAQLFCXSQ0CK1+FwNgFtf/+rlKqVXdJCbKQgQIECAAAECBAgQIECAQBYCXQQZtXjU5PPMNVcD4Pyuq+6cZzLHECBAgAABAgQIECBAgACBQgU6S2vemnyuBkCaTDQAOltaExEgQIAAAQIECBAgQIDA8AU6jHBy/sg8s83cAFg+9prn1hO9uL75IECAAAECBAgQIECAAAECBEKg01t14GJtPtOsMzcA0vmlz51pBjsTIECAAAECBAgQIECAAIHCBTpPb47afPYGQJVe23liJiRAgAABAgQIECBAgAABAsMV6D6yOWrzmRoAF19i8MLuMzMjAQIECBAgQIAAAQIECBAYqkAvcb3wYo0+9eQzNQCq89XhqUe2IwECBAgQIECAAAECBAgQGINATznOWqPP1ACYVEuHesrLtAQIECBAgAABAgQIECBAYJACfQU1a40+dQPg1te/ejmlyUv6Ssy8BAgQIECAAAECBAgQIEBggAI9hjR5yYVafboQpm4AnK92vWa6Ie1FgAABAgQIECBAgAABAgTGItBvnrPU6lM3AFI1eXW/aZmdAAECBAgQIECAAAECBAgMTKDvcGao1adqADzryJHrUqo0AJI/BAgQIECAAAECBAgQIEDgcYH+v6pefaFm3zmSqRoAu65+6FX1UFV980GAAAECBAgQIECAAAECBAhcEBjC39XFmn3HWKZqAFRLk1fuOJIdCBAgQIAAAQIECBAgQIDAqASGkey0NftUDYDJJL1iGGmJggABAgQIECBAgAABAgQIDERgIGFM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";
|
|
15
16
|
var CONTROL_LOG_VERSION = 1;
|
|
16
17
|
var LogEventType = {
|
|
17
18
|
EditorPid: "editor_pid",
|
|
@@ -453,6 +454,8 @@ function createI18nController(deps) {
|
|
|
453
454
|
return { getSnapshot: () => snap, bootstrap, setLocale };
|
|
454
455
|
}
|
|
455
456
|
const __dirname$1 = dirname$1(fileURLToPath(import.meta.url));
|
|
457
|
+
app.setName("inplan");
|
|
458
|
+
app.setAboutPanelOptions({ applicationName: "inplan" });
|
|
456
459
|
process.on("uncaughtException", (err) => {
|
|
457
460
|
process.stderr.write(`[inplan] uncaught exception: ${err instanceof Error ? err.stack ?? err.message : String(err)}
|
|
458
461
|
`);
|
|
@@ -609,11 +612,14 @@ function navigateTo(file) {
|
|
|
609
612
|
win.webContents.send("doc:navigated", session.load());
|
|
610
613
|
return true;
|
|
611
614
|
}
|
|
615
|
+
const appIcon = nativeImage.createFromDataURL(APP_ICON_DATA_URL);
|
|
612
616
|
function createWindow() {
|
|
613
617
|
win = new BrowserWindow({
|
|
614
618
|
width: 1200,
|
|
615
619
|
height: 800,
|
|
616
620
|
title: "inplan",
|
|
621
|
+
icon: appIcon,
|
|
622
|
+
// window/taskbar icon on Windows + Linux (macOS uses the dock icon below)
|
|
617
623
|
webPreferences: {
|
|
618
624
|
preload: join$1(__dirname$1, "../preload/index.mjs"),
|
|
619
625
|
sandbox: false
|
|
@@ -750,6 +756,7 @@ function registerIpc() {
|
|
|
750
756
|
ipcMain.handle("i18n:set-locale", (_e, code) => i18n.setLocale(code));
|
|
751
757
|
}
|
|
752
758
|
void app.whenReady().then(() => {
|
|
759
|
+
if (process.platform === "darwin" && !appIcon.isEmpty()) app.dock?.setIcon(appIcon);
|
|
753
760
|
const target = resolveTargetFile();
|
|
754
761
|
if (target) {
|
|
755
762
|
session = new Session(target);
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
--accent-soft: #e9f0ec; /* pine tint */
|
|
17
17
|
--danger: #a3331f;
|
|
18
18
|
--amber: #9a5f23;
|
|
19
|
+
/* Comment highlight + click-flash (override in a theme). The flash animations below
|
|
20
|
+
fade --anchor-flash → --anchor (anchored) and --doc-flash → transparent (doc-level). */
|
|
21
|
+
--anchor: #f6eccb; /* anchored-comment highlight */
|
|
22
|
+
--anchor-flash: #ecd29a; /* darker yellow shown for ~1s when an anchored comment is clicked */
|
|
23
|
+
--doc-flash: rgba(246, 236, 203, 0.6); /* full-document wash when a doc-level comment is clicked */
|
|
19
24
|
--shadow-sm: 0 1px 2px rgba(28, 26, 23, 0.05);
|
|
20
25
|
--shadow: 0 1px 2px rgba(28, 26, 23, 0.04), 0 8px 22px -14px rgba(28, 26, 23, 0.30);
|
|
21
26
|
--serif: "Fraunces", Georgia, "Times New Roman", serif;
|
|
@@ -106,6 +111,10 @@ body {
|
|
|
106
111
|
.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
112
|
.ap-topbar > button.ap-iconbtn--primary:hover:not(:disabled) { background: var(--accent-press); border-color: var(--accent-press); color: #fbfaf6; }
|
|
108
113
|
.ap-topbar > button.ap-iconbtn--primary svg { width: 15px; height: 15px; }
|
|
114
|
+
/* Rail "show resolved & orphaned" toggle: eye-on-a-closed-box icon; tinted when active. */
|
|
115
|
+
.ap-reveal { width: 26px; height: 26px; }
|
|
116
|
+
.ap-reveal svg { width: 16px; height: 16px; }
|
|
117
|
+
.ap-reveal.on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
|
|
109
118
|
.ap-update-err { color: var(--danger); }
|
|
110
119
|
|
|
111
120
|
/* banner */
|
|
@@ -117,7 +126,14 @@ body {
|
|
|
117
126
|
.ap-preview { flex: 1; min-width: 0; overflow: auto; padding: 28px 36px; border-right: 1px solid var(--line); background: var(--bg); }
|
|
118
127
|
.ap-rendered { max-width: 760px; }
|
|
119
128
|
.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:
|
|
129
|
+
.ap-rendered .ap-anchor { background: var(--anchor); border-bottom: 2px solid var(--amber); color: inherit; text-decoration: none; cursor: pointer; border-radius: 2px; }
|
|
130
|
+
/* Click-to-focus flash: anchored comment pulses darker yellow then fades to normal (1s). */
|
|
131
|
+
@keyframes ap-flash-anchor { from { background-color: var(--anchor-flash); } to { background-color: var(--anchor); } }
|
|
132
|
+
.ap-rendered .ap-anchor.ap-flash-anchor { animation: ap-flash-anchor 1s ease-out; }
|
|
133
|
+
/* Doc-level comment click: the whole rendered document washes the comment tint, then fades out (1s). */
|
|
134
|
+
@keyframes ap-flash-doc { from { background-color: var(--doc-flash); } to { background-color: transparent; } }
|
|
135
|
+
.ap-rendered.ap-flash-doc { animation: ap-flash-doc 1s ease-out; }
|
|
136
|
+
@media (prefers-reduced-motion: reduce) { .ap-flash-anchor, .ap-flash-doc { animation: none; } }
|
|
121
137
|
.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
138
|
/* draggable vertical splitter between panes */
|
|
123
139
|
.ap-vsplit { flex: 0 0 6px; cursor: col-resize; background: var(--line); }
|
|
@@ -220,6 +236,13 @@ input[type="checkbox"]:focus-visible, input[type="radio"]:focus-visible { outlin
|
|
|
220
236
|
|
|
221
237
|
/* find matches highlighted in the preview (CSS Custom Highlight API) */
|
|
222
238
|
::highlight(ap-find) { background: #f3dba0; color: inherit; }
|
|
239
|
+
/* The span being commented on — kept visible while the composer steals focus (item 4). */
|
|
240
|
+
::highlight(ap-comment-target) { background: #bcd5cc; color: inherit; }
|
|
241
|
+
/* Preview right-click context menu. */
|
|
242
|
+
.ap-ctxmenu { position: fixed; z-index: 40; display: flex; flex-direction: column; min-width: 168px; padding: 4px; background: var(--bg); border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow); }
|
|
243
|
+
.ap-ctxmenu-item { font: inherit; text-align: left; background: none; border: 0; border-radius: 6px; padding: 6px 10px; cursor: pointer; color: var(--fg); }
|
|
244
|
+
.ap-ctxmenu-item:hover:not(:disabled) { background: var(--accent-soft); color: var(--accent); }
|
|
245
|
+
.ap-ctxmenu-item:disabled { opacity: 0.4; cursor: default; }
|
|
223
246
|
/* find matches highlighted inside the source editor (Editor find scope) */
|
|
224
247
|
.cm-ap-find { background: #f3dba0; }
|
|
225
248
|
|
|
@@ -234,6 +257,8 @@ input[type="checkbox"]:focus-visible, input[type="radio"]:focus-visible { outlin
|
|
|
234
257
|
/* inline diff in the PREVIEW pane (rendered markdown, per-hunk accept/reject) */
|
|
235
258
|
.ap-diffview { max-width: 760px; }
|
|
236
259
|
.ap-ctx { opacity: 0.72; }
|
|
260
|
+
/* Review "next" top-aligns the focused hunk (block:"start"); keep a little gap from the pane top. */
|
|
261
|
+
.ap-ihunk, .ap-hunk { scroll-margin-top: 12px; }
|
|
237
262
|
.ap-ihunk { border: 1px solid var(--line); border-radius: 9px; margin: 12px 0; overflow: hidden; }
|
|
238
263
|
.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
264
|
.ap-ihunk-bar button { font: inherit; border: 1px solid var(--line-strong); background: var(--bg); border-radius: 6px; padding: 2px 10px; cursor: pointer; }
|
|
@@ -669,7 +669,7 @@ function ta(a, b, c, d) {
|
|
|
669
669
|
var e = z.hasOwnProperty(b) ? z[b] : null;
|
|
670
670
|
if (null !== e ? 0 !== e.type : d || !(2 < b.length) || "o" !== b[0] && "O" !== b[0] || "n" !== b[1] && "N" !== b[1]) qa(b, c, e, d) && (c = null), d || null === e ? oa(b) && (null === c ? a.removeAttribute(b) : a.setAttribute(b, "" + c)) : e.mustUseProperty ? a[e.propertyName] = null === c ? 3 === e.type ? false : "" : c : (b = e.attributeName, d = e.attributeNamespace, null === c ? a.removeAttribute(b) : (e = e.type, c = 3 === e || 4 === e && true === c ? "" : "" + c, d ? a.setAttributeNS(d, b, c) : a.setAttribute(b, c)));
|
|
671
671
|
}
|
|
672
|
-
var ua = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, va = Symbol.for("react.element"), wa = Symbol.for("react.portal"), ya = Symbol.for("react.fragment"), za = Symbol.for("react.strict_mode"), Aa = Symbol.for("react.profiler"), Ba = Symbol.for("react.provider"), Ca = Symbol.for("react.context"), Da = Symbol.for("react.forward_ref"), Ea = Symbol.for("react.suspense"), Fa = Symbol.for("react.suspense_list"), Ga = Symbol.for("react.memo"), Ha = Symbol.for("react.lazy");
|
|
672
|
+
var ua$1 = aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, va = Symbol.for("react.element"), wa = Symbol.for("react.portal"), ya = Symbol.for("react.fragment"), za = Symbol.for("react.strict_mode"), Aa = Symbol.for("react.profiler"), Ba = Symbol.for("react.provider"), Ca = Symbol.for("react.context"), Da = Symbol.for("react.forward_ref"), Ea = Symbol.for("react.suspense"), Fa = Symbol.for("react.suspense_list"), Ga = Symbol.for("react.memo"), Ha = Symbol.for("react.lazy");
|
|
673
673
|
var Ia = Symbol.for("react.offscreen");
|
|
674
674
|
var Ja = Symbol.iterator;
|
|
675
675
|
function Ka(a) {
|
|
@@ -1641,7 +1641,7 @@ function bd(a) {
|
|
|
1641
1641
|
for (c = 0; c < Qc.length; c++) d = Qc[c], d.blockedOn === a && (d.blockedOn = null);
|
|
1642
1642
|
for (; 0 < Qc.length && (c = Qc[0], null === c.blockedOn); ) Vc(c), null === c.blockedOn && Qc.shift();
|
|
1643
1643
|
}
|
|
1644
|
-
var cd = ua.ReactCurrentBatchConfig, dd = true;
|
|
1644
|
+
var cd = ua$1.ReactCurrentBatchConfig, dd = true;
|
|
1645
1645
|
function ed(a, b, c, d) {
|
|
1646
1646
|
var e = C$1, f2 = cd.transition;
|
|
1647
1647
|
cd.transition = null;
|
|
@@ -2802,7 +2802,7 @@ function Ig() {
|
|
|
2802
2802
|
function Jg(a) {
|
|
2803
2803
|
null === zg ? zg = [a] : zg.push(a);
|
|
2804
2804
|
}
|
|
2805
|
-
var Kg = ua.ReactCurrentBatchConfig;
|
|
2805
|
+
var Kg = ua$1.ReactCurrentBatchConfig;
|
|
2806
2806
|
function Lg(a, b, c) {
|
|
2807
2807
|
a = c.ref;
|
|
2808
2808
|
if (null !== a && "function" !== typeof a && "object" !== typeof a) {
|
|
@@ -3337,7 +3337,7 @@ function Eh() {
|
|
|
3337
3337
|
for (var a = 0; a < Dh.length; a++) Dh[a]._workInProgressVersionPrimary = null;
|
|
3338
3338
|
Dh.length = 0;
|
|
3339
3339
|
}
|
|
3340
|
-
var Fh = ua.ReactCurrentDispatcher, Gh = ua.ReactCurrentBatchConfig, Hh = 0, M = null, N = null, O = null, Ih = false, Jh = false, Kh = 0, Lh = 0;
|
|
3340
|
+
var Fh = ua$1.ReactCurrentDispatcher, Gh = ua$1.ReactCurrentBatchConfig, Hh = 0, M = null, N = null, O = null, Ih = false, Jh = false, Kh = 0, Lh = 0;
|
|
3341
3341
|
function P$1() {
|
|
3342
3342
|
throw Error(p(321));
|
|
3343
3343
|
}
|
|
@@ -3939,7 +3939,7 @@ function Vi(a, b, c, d, e) {
|
|
|
3939
3939
|
a.lanes = e;
|
|
3940
3940
|
return a;
|
|
3941
3941
|
}
|
|
3942
|
-
var Wi = ua.ReactCurrentOwner, dh = false;
|
|
3942
|
+
var Wi = ua$1.ReactCurrentOwner, dh = false;
|
|
3943
3943
|
function Xi(a, b, c, d) {
|
|
3944
3944
|
b.child = null === a ? Vg(b, null, c, d) : Ug(b, a.child, c, d);
|
|
3945
3945
|
}
|
|
@@ -5555,7 +5555,7 @@ function jk(a) {
|
|
|
5555
5555
|
V = b.return;
|
|
5556
5556
|
}
|
|
5557
5557
|
}
|
|
5558
|
-
var lk = Math.ceil, mk = ua.ReactCurrentDispatcher, nk = ua.ReactCurrentOwner, ok = ua.ReactCurrentBatchConfig, K = 0, Q = null, Y = null, Z$1 = 0, fj = 0, ej = Uf(0), T = 0, pk = null, rh = 0, qk = 0, rk = 0, sk = null, tk = null, fk = 0, Gj = Infinity, uk = null, Oi = false, Pi = null, Ri = null, vk = false, wk = null, xk = 0, yk = 0, zk = null, Ak = -1, Bk = 0;
|
|
5558
|
+
var lk = Math.ceil, mk = ua$1.ReactCurrentDispatcher, nk = ua$1.ReactCurrentOwner, ok = ua$1.ReactCurrentBatchConfig, K = 0, Q = null, Y = null, Z$1 = 0, fj = 0, ej = Uf(0), T = 0, pk = null, rh = 0, qk = 0, rk = 0, sk = null, tk = null, fk = 0, Gj = Infinity, uk = null, Oi = false, Pi = null, Ri = null, vk = false, wk = null, xk = 0, yk = 0, zk = null, Ak = -1, Bk = 0;
|
|
5559
5559
|
function R() {
|
|
5560
5560
|
return 0 !== (K & 6) ? B() : -1 !== Ak ? Ak : Ak = B();
|
|
5561
5561
|
}
|
|
@@ -6866,7 +6866,7 @@ yb = function(a, b, c) {
|
|
|
6866
6866
|
Gb = Qk;
|
|
6867
6867
|
Hb = Rk;
|
|
6868
6868
|
var sl = { usingClientEntryPoint: false, Events: [Cb, ue, Db, Eb, Fb, Qk] }, tl = { findFiberByHostInstance: Wc, bundleType: 0, version: "18.3.1", rendererPackageName: "react-dom" };
|
|
6869
|
-
var ul = { bundleType: tl.bundleType, version: tl.version, rendererPackageName: tl.rendererPackageName, rendererConfig: tl.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, overrideProps: null, overridePropsDeletePath: null, overridePropsRenamePath: null, setErrorHandler: null, setSuspenseHandler: null, scheduleUpdate: null, currentDispatcherRef: ua.ReactCurrentDispatcher, findHostInstanceByFiber: function(a) {
|
|
6869
|
+
var ul = { bundleType: tl.bundleType, version: tl.version, rendererPackageName: tl.rendererPackageName, rendererConfig: tl.rendererConfig, overrideHookState: null, overrideHookStateDeletePath: null, overrideHookStateRenamePath: null, overrideProps: null, overridePropsDeletePath: null, overridePropsRenamePath: null, setErrorHandler: null, setSuspenseHandler: null, scheduleUpdate: null, currentDispatcherRef: ua$1.ReactCurrentDispatcher, findHostInstanceByFiber: function(a) {
|
|
6870
6870
|
a = Zb(a);
|
|
6871
6871
|
return null === a ? null : a.stateNode;
|
|
6872
6872
|
}, findFiberByHostInstance: tl.findFiberByHostInstance || jl, findHostInstancesForRefresh: null, scheduleRefresh: null, scheduleRoot: null, setRefreshHandler: null, getCurrentFiber: null, reconcilerVersion: "18.3.1-next-f1338f8080-20240426" };
|
|
@@ -50211,7 +50211,7 @@ function buildNormalized(source) {
|
|
|
50211
50211
|
let prevSpace = false;
|
|
50212
50212
|
for (let i = 0; i < source.length; i++) {
|
|
50213
50213
|
const ch2 = source[i];
|
|
50214
|
-
if (ch2 === "*" || ch2 === "_" || ch2 === "`") {
|
|
50214
|
+
if (ch2 === "*" || ch2 === "_" || ch2 === "`" || ch2 === "~") {
|
|
50215
50215
|
prevSpace = false;
|
|
50216
50216
|
continue;
|
|
50217
50217
|
}
|
|
@@ -50228,7 +50228,7 @@ function buildNormalized(source) {
|
|
|
50228
50228
|
}
|
|
50229
50229
|
return { text: text2, map: map2 };
|
|
50230
50230
|
}
|
|
50231
|
-
var normalizeNeedle = (s) => s.replace(/[*_
|
|
50231
|
+
var normalizeNeedle = (s) => s.replace(/[*_`~]/g, "").replace(/\s+/g, " ").trim();
|
|
50232
50232
|
function findSpanRange(body, selected) {
|
|
50233
50233
|
const direct = findPlainOccurrence(body, selected);
|
|
50234
50234
|
if (direct >= 0) return { start: direct, end: direct + selected.length };
|
|
@@ -50239,12 +50239,91 @@ function findSpanRange(body, selected) {
|
|
|
50239
50239
|
if (idx < 0) return null;
|
|
50240
50240
|
return { start: map2[idx], end: map2[idx + needle.length - 1] + 1 };
|
|
50241
50241
|
}
|
|
50242
|
+
var PAIRED = ["~~", "**", "__", "*", "_"];
|
|
50243
|
+
function scanOpenMarkers(body, pos) {
|
|
50244
|
+
const stack = [];
|
|
50245
|
+
let i = 0;
|
|
50246
|
+
while (i < pos) {
|
|
50247
|
+
const ch2 = body[i];
|
|
50248
|
+
if (ch2 === "\\") {
|
|
50249
|
+
i += 2;
|
|
50250
|
+
continue;
|
|
50251
|
+
}
|
|
50252
|
+
if (ch2 === "`") {
|
|
50253
|
+
let n2 = 0;
|
|
50254
|
+
while (body[i + n2] === "`") n2++;
|
|
50255
|
+
const close = body.indexOf("`".repeat(n2), i + n2);
|
|
50256
|
+
if (close !== -1) {
|
|
50257
|
+
const codeEnd = close + n2;
|
|
50258
|
+
if (pos <= codeEnd) return stack;
|
|
50259
|
+
i = codeEnd;
|
|
50260
|
+
continue;
|
|
50261
|
+
}
|
|
50262
|
+
i += n2;
|
|
50263
|
+
continue;
|
|
50264
|
+
}
|
|
50265
|
+
if (ch2 === "*" || ch2 === "_" || ch2 === "~") {
|
|
50266
|
+
let n2 = 0;
|
|
50267
|
+
while (body[i + n2] === ch2) n2++;
|
|
50268
|
+
if (ch2 === "~" && n2 < 2) {
|
|
50269
|
+
i += n2;
|
|
50270
|
+
continue;
|
|
50271
|
+
}
|
|
50272
|
+
const t2 = ch2 === "~" ? "~~" : ch2.repeat(n2);
|
|
50273
|
+
if (stack[stack.length - 1] === t2) stack.pop();
|
|
50274
|
+
else stack.push(t2);
|
|
50275
|
+
i += n2;
|
|
50276
|
+
continue;
|
|
50277
|
+
}
|
|
50278
|
+
i++;
|
|
50279
|
+
}
|
|
50280
|
+
return stack;
|
|
50281
|
+
}
|
|
50282
|
+
var closeOf = (st) => [...st].reverse().join("");
|
|
50283
|
+
var openOf = (st) => st.join("");
|
|
50284
|
+
function wrapSpanWithComment(body, start, end, id2) {
|
|
50285
|
+
for (; ; ) {
|
|
50286
|
+
const m2 = scanOpenMarkers(body, start).at(-1);
|
|
50287
|
+
if (m2 && body.slice(start - m2.length, start) === m2) start -= m2.length;
|
|
50288
|
+
else break;
|
|
50289
|
+
}
|
|
50290
|
+
for (; ; ) {
|
|
50291
|
+
const m2 = scanOpenMarkers(body, end).at(-1);
|
|
50292
|
+
if (m2 && body.slice(end, end + m2.length) === m2) end += m2.length;
|
|
50293
|
+
else break;
|
|
50294
|
+
}
|
|
50295
|
+
const openStart = scanOpenMarkers(body, start);
|
|
50296
|
+
const openEnd = scanOpenMarkers(body, end);
|
|
50297
|
+
let c = 0;
|
|
50298
|
+
while (c < openStart.length && c < openEnd.length && openStart[c] === openEnd[c]) c++;
|
|
50299
|
+
const startCross = openStart.slice(c);
|
|
50300
|
+
const endCross = openEnd.slice(c);
|
|
50301
|
+
return body.slice(0, start) + closeOf(startCross) + "[" + openOf(startCross) + body.slice(start, end) + closeOf(endCross) + `](#${id2})` + openOf(endCross) + body.slice(end);
|
|
50302
|
+
}
|
|
50303
|
+
function mergeSeam(s, at) {
|
|
50304
|
+
for (const m2 of [...PAIRED].sort((a, b) => b.length - a.length)) {
|
|
50305
|
+
if (s.slice(at - m2.length, at) === m2 && s.slice(at, at + m2.length) === m2) {
|
|
50306
|
+
return s.slice(0, at - m2.length) + s.slice(at + m2.length);
|
|
50307
|
+
}
|
|
50308
|
+
}
|
|
50309
|
+
return s;
|
|
50310
|
+
}
|
|
50311
|
+
var ANCHOR_RE = /\[[^\]]*\]\(#cmt-[0-9a-z]+\)/gi;
|
|
50312
|
+
function spanCommentBlocker(body, selected) {
|
|
50313
|
+
if (!selected.trim()) return null;
|
|
50314
|
+
const range = findSpanRange(body, selected);
|
|
50315
|
+
if (!range) return "not-found";
|
|
50316
|
+
for (const m2 of body.matchAll(ANCHOR_RE)) {
|
|
50317
|
+
const aStart = m2.index;
|
|
50318
|
+
if (range.start < aStart + m2[0].length && aStart < range.end) return "overlap";
|
|
50319
|
+
}
|
|
50320
|
+
return null;
|
|
50321
|
+
}
|
|
50242
50322
|
function addSpanComment(doc2, selectedText, fields) {
|
|
50243
50323
|
const range = findSpanRange(doc2.body, selectedText);
|
|
50244
50324
|
if (!range) return null;
|
|
50245
50325
|
const id2 = genId(takenIds(doc2));
|
|
50246
|
-
const
|
|
50247
|
-
const body = `${doc2.body.slice(0, range.start)}[${sourceSpan}](#${id2})${doc2.body.slice(range.end)}`;
|
|
50326
|
+
const body = wrapSpanWithComment(doc2.body, range.start, range.end, id2);
|
|
50248
50327
|
const comment2 = { id: id2, author: fields.author, date: nowIso(), resolved: false, text: fields.text, ...fields.question ? { question: fields.question } : {} };
|
|
50249
50328
|
return { doc: { body, comments: [...doc2.comments, comment2] }, id: id2 };
|
|
50250
50329
|
}
|
|
@@ -50270,8 +50349,16 @@ function editCommentText(doc2, id2, text2) {
|
|
|
50270
50349
|
return { ...doc2, comments: doc2.comments.map((c) => c.id === id2 ? { ...c, text: text2 } : c) };
|
|
50271
50350
|
}
|
|
50272
50351
|
function deleteComment(doc2, id2) {
|
|
50273
|
-
const link2 = new RegExp(`\\[([^\\]]*)\\]\\(#${id2}\\)
|
|
50274
|
-
const
|
|
50352
|
+
const link2 = new RegExp(`\\[([^\\]]*)\\]\\(#${id2}\\)`);
|
|
50353
|
+
const m2 = link2.exec(doc2.body);
|
|
50354
|
+
let body = doc2.body;
|
|
50355
|
+
if (m2) {
|
|
50356
|
+
const label = m2[1] ?? "";
|
|
50357
|
+
let merged = doc2.body.slice(0, m2.index) + label + doc2.body.slice(m2.index + m2[0].length);
|
|
50358
|
+
merged = mergeSeam(merged, m2.index + label.length);
|
|
50359
|
+
merged = mergeSeam(merged, m2.index);
|
|
50360
|
+
body = merged;
|
|
50361
|
+
}
|
|
50275
50362
|
const removed = /* @__PURE__ */ new Set([id2]);
|
|
50276
50363
|
let changed = true;
|
|
50277
50364
|
while (changed) {
|
|
@@ -50308,20 +50395,32 @@ function buildThreads(comments) {
|
|
|
50308
50395
|
}
|
|
50309
50396
|
var md = new MarkdownIt({ html: false, linkify: true });
|
|
50310
50397
|
var defaultLinkOpen = md.renderer.rules.link_open ?? ((tokens, idx, opts, _env, self) => self.renderToken(tokens, idx, opts));
|
|
50398
|
+
var defaultLinkClose = md.renderer.rules.link_close ?? ((tokens, idx, opts, _env, self) => self.renderToken(tokens, idx, opts));
|
|
50311
50399
|
md.renderer.rules.link_open = (tokens, idx, opts, env, self) => {
|
|
50312
50400
|
const href = tokens[idx].attrGet("href") ?? "";
|
|
50313
50401
|
const m2 = /^#(cmt-[0-9a-z]+)$/i.exec(href);
|
|
50402
|
+
const e = env;
|
|
50403
|
+
let show = true;
|
|
50314
50404
|
if (m2) {
|
|
50315
50405
|
const id2 = m2[1].toLowerCase();
|
|
50316
|
-
|
|
50317
|
-
|
|
50318
|
-
if (
|
|
50406
|
+
const pred = e?.showAnchor;
|
|
50407
|
+
show = !pred || pred(id2);
|
|
50408
|
+
if (show) {
|
|
50409
|
+
tokens[idx].attrSet("data-cmt", id2);
|
|
50319
50410
|
tokens[idx].attrSet("class", "ap-anchor");
|
|
50320
50411
|
}
|
|
50321
50412
|
}
|
|
50413
|
+
(e._cmtShow ??= []).push(show);
|
|
50414
|
+
if (!show) return "";
|
|
50322
50415
|
return defaultLinkOpen(tokens, idx, opts, env, self);
|
|
50323
50416
|
};
|
|
50324
|
-
|
|
50417
|
+
md.renderer.rules.link_close = (tokens, idx, opts, env, self) => {
|
|
50418
|
+
const stack = env._cmtShow;
|
|
50419
|
+
const show = stack && stack.length ? stack.pop() : true;
|
|
50420
|
+
if (!show) return "";
|
|
50421
|
+
return defaultLinkClose(tokens, idx, opts, env, self);
|
|
50422
|
+
};
|
|
50423
|
+
var BLOCK_RULES = ["paragraph_open", "heading_open", "blockquote_open", "bullet_list_open", "ordered_list_open", "list_item_open", "table_open", "tr_open", "hr"];
|
|
50325
50424
|
for (const name2 of BLOCK_RULES) {
|
|
50326
50425
|
const orig = md.renderer.rules[name2];
|
|
50327
50426
|
md.renderer.rules[name2] = (tokens, idx, options, env, self) => {
|
|
@@ -50338,8 +50437,8 @@ for (const name2 of ["fence", "code_block"]) {
|
|
|
50338
50437
|
return tok.map ? html2.replace(/^<pre/, `<pre data-line="${tok.map[0]}"`) : html2;
|
|
50339
50438
|
};
|
|
50340
50439
|
}
|
|
50341
|
-
function renderMarkdown(body,
|
|
50342
|
-
return md.render(body, {
|
|
50440
|
+
function renderMarkdown(body, showAnchor) {
|
|
50441
|
+
return md.render(body, { showAnchor });
|
|
50343
50442
|
}
|
|
50344
50443
|
function isInternalDocLink(href) {
|
|
50345
50444
|
if (!href || /^[a-z][a-z0-9+.-]*:/i.test(href) || href.startsWith("//") || href.startsWith("#")) return false;
|
|
@@ -50373,6 +50472,11 @@ var EN = {
|
|
|
50373
50472
|
"topbar.addDocComment": "Add Doc Comment",
|
|
50374
50473
|
"topbar.addCommentTitle": "Add a comment on the selection",
|
|
50375
50474
|
"topbar.addDocCommentTitle": "Add a document-level comment",
|
|
50475
|
+
"topbar.cantOverlap": "Comments can't overlap",
|
|
50476
|
+
"topbar.cantWhitespace": "Comments can't be added to white space",
|
|
50477
|
+
"topbar.cantSpanBlocks": "Comments can't span multiple blocks",
|
|
50478
|
+
"topbar.cantSpanTable": "Comments can't span table cells",
|
|
50479
|
+
"topbar.cantRendered": "Comments can't be anchored to this text",
|
|
50376
50480
|
"topbar.save": "Save",
|
|
50377
50481
|
"topbar.saveUnsaved": "Save — unsaved changes",
|
|
50378
50482
|
"topbar.finishTurn": "Finish turn",
|
|
@@ -50411,7 +50515,7 @@ var EN = {
|
|
|
50411
50515
|
"msg.autosaving": "auto-saving…",
|
|
50412
50516
|
"msg.autosaved": "autosaved (backup)",
|
|
50413
50517
|
"msg.turnFinished": "turn finished — waiting for agent",
|
|
50414
|
-
"msg.cantAnchor": "
|
|
50518
|
+
"msg.cantAnchor": "Comments can't be anchored to this selection",
|
|
50415
50519
|
// status bar
|
|
50416
50520
|
"status.ready": "ready",
|
|
50417
50521
|
"status.thinking": "Agent is thinking",
|
|
@@ -50424,7 +50528,7 @@ var EN = {
|
|
|
50424
50528
|
"composer.on": "on “{target}”",
|
|
50425
50529
|
"composer.docLevel": "document-level comment",
|
|
50426
50530
|
"composer.dragToMove": "drag to move",
|
|
50427
|
-
"composer.placeholder": "Add a comment… (
|
|
50531
|
+
"composer.placeholder": "Add a comment… ({mod}+Enter to submit)",
|
|
50428
50532
|
"composer.comment": "Comment",
|
|
50429
50533
|
"composer.cancel": "cancel",
|
|
50430
50534
|
// agent connection indicator
|
|
@@ -50446,7 +50550,14 @@ var EN = {
|
|
|
50446
50550
|
"agent.connection": "Agent connection",
|
|
50447
50551
|
// comment rail
|
|
50448
50552
|
"rail.comments": "Comments",
|
|
50449
|
-
"rail.showResolved": "resolved & orphaned",
|
|
50553
|
+
"rail.showResolved": "Show resolved ({resolved}) & orphaned ({orphaned}) comments",
|
|
50554
|
+
"rail.showResolvedOnly": "Show resolved ({resolved}) comments",
|
|
50555
|
+
"rail.showOrphanedOnly": "Show orphaned ({orphaned}) comments",
|
|
50556
|
+
// preview right-click context menu
|
|
50557
|
+
"menu.findText": "Find Text",
|
|
50558
|
+
"menu.copy": "Copy",
|
|
50559
|
+
"menu.selectLine": "Select Line",
|
|
50560
|
+
"menu.selectAll": "Select All",
|
|
50450
50561
|
"rail.resolveThread": "Resolve thread",
|
|
50451
50562
|
"rail.reopenThread": "Reopen thread",
|
|
50452
50563
|
"rail.reply": "Reply",
|
|
@@ -50539,6 +50650,8 @@ function useT() {
|
|
|
50539
50650
|
function useI18n() {
|
|
50540
50651
|
return useI18nState();
|
|
50541
50652
|
}
|
|
50653
|
+
var ua = typeof navigator !== "undefined" && (navigator.userAgent || navigator.platform) || "";
|
|
50654
|
+
var MOD_KEY = /mac/i.test(ua) ? "⌘" : "Ctrl";
|
|
50542
50655
|
function ComposerPopover({
|
|
50543
50656
|
target,
|
|
50544
50657
|
pos,
|
|
@@ -50593,7 +50706,7 @@ function ComposerPopover({
|
|
|
50593
50706
|
{
|
|
50594
50707
|
ref: ta2,
|
|
50595
50708
|
className: "ap-grow",
|
|
50596
|
-
placeholder: t2("composer.placeholder"),
|
|
50709
|
+
placeholder: t2("composer.placeholder", { mod: MOD_KEY }),
|
|
50597
50710
|
value: text2,
|
|
50598
50711
|
disabled,
|
|
50599
50712
|
onChange: (e) => {
|
|
@@ -50614,6 +50727,43 @@ function ComposerPopover({
|
|
|
50614
50727
|
] })
|
|
50615
50728
|
] });
|
|
50616
50729
|
}
|
|
50730
|
+
function ContextMenu({
|
|
50731
|
+
pos,
|
|
50732
|
+
items,
|
|
50733
|
+
onClose
|
|
50734
|
+
}) {
|
|
50735
|
+
const ref = reactExports.useRef(null);
|
|
50736
|
+
reactExports.useEffect(() => {
|
|
50737
|
+
const onDown = (e) => {
|
|
50738
|
+
if (ref.current && !ref.current.contains(e.target)) onClose();
|
|
50739
|
+
};
|
|
50740
|
+
const onKey = (e) => {
|
|
50741
|
+
if (e.key === "Escape") onClose();
|
|
50742
|
+
};
|
|
50743
|
+
document.addEventListener("mousedown", onDown);
|
|
50744
|
+
document.addEventListener("keydown", onKey);
|
|
50745
|
+
return () => {
|
|
50746
|
+
document.removeEventListener("mousedown", onDown);
|
|
50747
|
+
document.removeEventListener("keydown", onKey);
|
|
50748
|
+
};
|
|
50749
|
+
}, [onClose]);
|
|
50750
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx("div", { ref, className: "ap-ctxmenu", role: "menu", style: { left: pos.x, top: pos.y }, onMouseDown: (e) => e.preventDefault(), children: items.map((it, i) => /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
50751
|
+
"button",
|
|
50752
|
+
{
|
|
50753
|
+
type: "button",
|
|
50754
|
+
role: "menuitem",
|
|
50755
|
+
className: "ap-ctxmenu-item",
|
|
50756
|
+
disabled: it.disabled,
|
|
50757
|
+
...it.title ? { title: it.title } : {},
|
|
50758
|
+
onClick: () => {
|
|
50759
|
+
onClose();
|
|
50760
|
+
it.onSelect();
|
|
50761
|
+
},
|
|
50762
|
+
children: it.label
|
|
50763
|
+
},
|
|
50764
|
+
`${it.label}-${i}`
|
|
50765
|
+
)) });
|
|
50766
|
+
}
|
|
50617
50767
|
function QuestionChips({ question: question2, disabled, onAnswer }) {
|
|
50618
50768
|
const t2 = useT();
|
|
50619
50769
|
const [selected, setSelected] = reactExports.useState([]);
|
|
@@ -50991,6 +51141,12 @@ var IconFinishTurn = () => /* @__PURE__ */ jsxRuntimeExports.jsxs(Glyph, { child
|
|
|
50991
51141
|
/* @__PURE__ */ jsxRuntimeExports.jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })
|
|
50992
51142
|
] });
|
|
50993
51143
|
var IconComplete = () => /* @__PURE__ */ jsxRuntimeExports.jsx(Glyph, { children: /* @__PURE__ */ jsxRuntimeExports.jsx("polyline", { points: "20 6 9 17 4 12" }) });
|
|
51144
|
+
var IconRevealArchive = () => /* @__PURE__ */ jsxRuntimeExports.jsxs(Glyph, { children: [
|
|
51145
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("path", { d: "M4 7c2.6-3.2 13.4-3.2 16 0c-2.6 3.2-13.4 3.2-16 0Z" }),
|
|
51146
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("circle", { cx: "12", cy: "7", r: "1.6" }),
|
|
51147
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("rect", { x: "5", y: "13", width: "14", height: "7", rx: "1" }),
|
|
51148
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("line", { x1: "5", y1: "16", x2: "19", y2: "16" })
|
|
51149
|
+
] });
|
|
50994
51150
|
function lineSegments(a, b) {
|
|
50995
51151
|
const A2 = a.split("\n");
|
|
50996
51152
|
const B2 = b.split("\n");
|
|
@@ -51103,7 +51259,41 @@ function anchorLine(body, id2) {
|
|
|
51103
51259
|
if (idx < 0) return null;
|
|
51104
51260
|
return body.slice(0, idx).split("\n").length - 1;
|
|
51105
51261
|
}
|
|
51106
|
-
|
|
51262
|
+
function flashEl(el2, cls) {
|
|
51263
|
+
if (!el2) return;
|
|
51264
|
+
el2.classList.remove(cls);
|
|
51265
|
+
void el2.offsetWidth;
|
|
51266
|
+
el2.classList.add(cls);
|
|
51267
|
+
}
|
|
51268
|
+
function selectionOverlapsComment(range, root2) {
|
|
51269
|
+
if (!range || !root2 || typeof range.intersectsNode !== "function") return false;
|
|
51270
|
+
for (const a of root2.querySelectorAll("[data-cmt]")) {
|
|
51271
|
+
try {
|
|
51272
|
+
if (range.intersectsNode(a)) return true;
|
|
51273
|
+
} catch {
|
|
51274
|
+
}
|
|
51275
|
+
}
|
|
51276
|
+
return false;
|
|
51277
|
+
}
|
|
51278
|
+
function anchorFailureReason(range) {
|
|
51279
|
+
const elOf = (n2) => n2 ? n2.nodeType === 1 ? n2 : n2.parentElement : null;
|
|
51280
|
+
const s = elOf(range?.startContainer);
|
|
51281
|
+
const e = elOf(range?.endContainer);
|
|
51282
|
+
if (s?.closest("table") || e?.closest("table")) return "table";
|
|
51283
|
+
const sb2 = s?.closest("[data-line]");
|
|
51284
|
+
const eb2 = e?.closest("[data-line]");
|
|
51285
|
+
if (sb2 && eb2 && sb2 !== eb2) return "blocks";
|
|
51286
|
+
return "rendered";
|
|
51287
|
+
}
|
|
51288
|
+
function commentBlockReason(raw, body, range, root2) {
|
|
51289
|
+
if (!raw) return null;
|
|
51290
|
+
if (!raw.trim()) return "whitespace";
|
|
51291
|
+
if (selectionOverlapsComment(range, root2)) return "overlap";
|
|
51292
|
+
const b = spanCommentBlocker(body, raw.trim());
|
|
51293
|
+
if (b === "overlap") return "overlap";
|
|
51294
|
+
if (b === "not-found") return anchorFailureReason(range);
|
|
51295
|
+
return null;
|
|
51296
|
+
}
|
|
51107
51297
|
function App() {
|
|
51108
51298
|
const t2 = useT();
|
|
51109
51299
|
const [loaded, setLoaded] = reactExports.useState(false);
|
|
@@ -51128,6 +51318,8 @@ function App() {
|
|
|
51128
51318
|
const [showResolvedOrphaned, setShowResolvedOrphaned] = reactExports.useState(false);
|
|
51129
51319
|
const [selectionText, setSelectionText] = reactExports.useState("");
|
|
51130
51320
|
const [composer, setComposer] = reactExports.useState(null);
|
|
51321
|
+
const [ctxMenu, setCtxMenu] = reactExports.useState(null);
|
|
51322
|
+
const [findSeed, setFindSeed] = reactExports.useState("");
|
|
51131
51323
|
const [focused, setFocused] = reactExports.useState(null);
|
|
51132
51324
|
const [activePreviewLine, setActivePreviewLine] = reactExports.useState(null);
|
|
51133
51325
|
const [proposal, setProposal] = reactExports.useState(null);
|
|
@@ -51137,6 +51329,11 @@ function App() {
|
|
|
51137
51329
|
const docRef = reactExports.useRef(doc2);
|
|
51138
51330
|
docRef.current = doc2;
|
|
51139
51331
|
const previewRef = reactExports.useRef(null);
|
|
51332
|
+
const ctxBlockRef = reactExports.useRef(null);
|
|
51333
|
+
const ctxSelTextRef = reactExports.useRef("");
|
|
51334
|
+
const tryAddCommentRef = reactExports.useRef(() => {
|
|
51335
|
+
});
|
|
51336
|
+
const commentRangeRef = reactExports.useRef(null);
|
|
51140
51337
|
const docPathRef = reactExports.useRef("");
|
|
51141
51338
|
const railRef = reactExports.useRef(null);
|
|
51142
51339
|
const editorRef = reactExports.useRef(null);
|
|
@@ -51213,7 +51410,7 @@ function App() {
|
|
|
51213
51410
|
});
|
|
51214
51411
|
window.api.onNavState?.((s) => setNavState(s));
|
|
51215
51412
|
window.api.onUpdateAvailable?.((info) => setUpdate(info));
|
|
51216
|
-
const onSel = () => setSelectionText(
|
|
51413
|
+
const onSel = () => setSelectionText(window.getSelection()?.toString() ?? "");
|
|
51217
51414
|
document.addEventListener("selectionchange", onSel);
|
|
51218
51415
|
return () => document.removeEventListener("selectionchange", onSel);
|
|
51219
51416
|
}, []);
|
|
@@ -51258,7 +51455,14 @@ function App() {
|
|
|
51258
51455
|
} else if ((e.metaKey || e.ctrlKey) && !e.altKey && (e.key === "f" || e.key === "F")) {
|
|
51259
51456
|
e.preventDefault();
|
|
51260
51457
|
setFindOpen(true);
|
|
51261
|
-
requestAnimationFrame(() =>
|
|
51458
|
+
requestAnimationFrame(() => {
|
|
51459
|
+
const el2 = document.getElementById("ap-find-input");
|
|
51460
|
+
el2?.focus();
|
|
51461
|
+
el2?.select();
|
|
51462
|
+
});
|
|
51463
|
+
} else if ((e.metaKey || e.ctrlKey) && !e.altKey && e.key === "/") {
|
|
51464
|
+
e.preventDefault();
|
|
51465
|
+
tryAddCommentRef.current();
|
|
51262
51466
|
} else if (e.key === "Escape") {
|
|
51263
51467
|
if (composer) setComposer(null);
|
|
51264
51468
|
else if (findOpen) setFindOpen(false);
|
|
@@ -51380,6 +51584,11 @@ function App() {
|
|
|
51380
51584
|
const addComment = reactExports.useCallback(
|
|
51381
51585
|
(text2, target, question2) => {
|
|
51382
51586
|
if (target) {
|
|
51587
|
+
const blocker = spanCommentBlocker(docRef.current.body, target);
|
|
51588
|
+
if (blocker) {
|
|
51589
|
+
setStatus(blocker === "overlap" ? t2("topbar.cantOverlap") : t2("msg.cantAnchor"));
|
|
51590
|
+
return;
|
|
51591
|
+
}
|
|
51383
51592
|
const res = addSpanComment(docRef.current, target, { text: text2, author: USER_AUTHOR, question: question2 });
|
|
51384
51593
|
if (!res) {
|
|
51385
51594
|
setStatus(t2("msg.cantAnchor"));
|
|
@@ -51400,26 +51609,69 @@ function App() {
|
|
|
51400
51609
|
const sel = window.getSelection();
|
|
51401
51610
|
const txt = sel?.toString().trim() ?? "";
|
|
51402
51611
|
if (txt && sel && sel.rangeCount > 0) {
|
|
51403
|
-
const
|
|
51612
|
+
const range = sel.getRangeAt(0);
|
|
51613
|
+
commentRangeRef.current = range.cloneRange();
|
|
51614
|
+
const r2 = range.getBoundingClientRect();
|
|
51404
51615
|
setComposer({ target: txt, pos: { x: Math.max(8, Math.min(r2.left, window.innerWidth - 360)), y: Math.max(48, Math.min(r2.bottom + 6, window.innerHeight - 220)) } });
|
|
51405
51616
|
} else {
|
|
51617
|
+
commentRangeRef.current = null;
|
|
51406
51618
|
previewRef.current?.scrollTo({ top: 0 });
|
|
51407
51619
|
setComposer({ target: null, pos: { x: 24, y: 56 } });
|
|
51408
51620
|
}
|
|
51409
51621
|
}, []);
|
|
51622
|
+
const openComposerFromCapture = reactExports.useCallback(() => {
|
|
51623
|
+
const target = ctxSelTextRef.current;
|
|
51624
|
+
if (target && commentRangeRef.current) {
|
|
51625
|
+
const r2 = commentRangeRef.current.getBoundingClientRect();
|
|
51626
|
+
setComposer({ target, pos: { x: Math.max(8, Math.min(r2.left, window.innerWidth - 360)), y: Math.max(48, Math.min(r2.bottom + 6, window.innerHeight - 220)) } });
|
|
51627
|
+
} else {
|
|
51628
|
+
commentRangeRef.current = null;
|
|
51629
|
+
previewRef.current?.scrollTo({ top: 0 });
|
|
51630
|
+
setComposer({ target: null, pos: { x: 24, y: 56 } });
|
|
51631
|
+
}
|
|
51632
|
+
}, []);
|
|
51633
|
+
const selectNodeContents = reactExports.useCallback((node) => {
|
|
51634
|
+
if (!node) return;
|
|
51635
|
+
const sel = window.getSelection();
|
|
51636
|
+
if (!sel) return;
|
|
51637
|
+
const r2 = document.createRange();
|
|
51638
|
+
r2.selectNodeContents(node);
|
|
51639
|
+
sel.removeAllRanges();
|
|
51640
|
+
sel.addRange(r2);
|
|
51641
|
+
}, []);
|
|
51642
|
+
reactExports.useEffect(() => {
|
|
51643
|
+
const cssApi = CSS;
|
|
51644
|
+
const HighlightCtor = window.Highlight;
|
|
51645
|
+
if (!cssApi.highlights || !HighlightCtor) return;
|
|
51646
|
+
cssApi.highlights.delete("ap-comment-target");
|
|
51647
|
+
if (composer && commentRangeRef.current) {
|
|
51648
|
+
try {
|
|
51649
|
+
cssApi.highlights.set("ap-comment-target", new HighlightCtor(commentRangeRef.current));
|
|
51650
|
+
} catch {
|
|
51651
|
+
}
|
|
51652
|
+
}
|
|
51653
|
+
return () => void cssApi.highlights?.delete("ap-comment-target");
|
|
51654
|
+
}, [composer]);
|
|
51655
|
+
reactExports.useEffect(() => {
|
|
51656
|
+
if (!findOpen) setFindSeed("");
|
|
51657
|
+
}, [findOpen]);
|
|
51410
51658
|
const syncToLine = reactExports.useCallback((line) => {
|
|
51411
51659
|
skipPreviewScroll.current = true;
|
|
51412
51660
|
setActivePreviewLine(line);
|
|
51413
51661
|
editorRef.current?.scrollToLine(line);
|
|
51414
51662
|
}, []);
|
|
51415
51663
|
const focusComment = reactExports.useCallback(
|
|
51416
|
-
(id2, fromPreview = false) => {
|
|
51664
|
+
(id2, fromPreview = false, fromRail = false) => {
|
|
51417
51665
|
setFocused(id2);
|
|
51418
51666
|
const line = anchorLine(docRef.current.body, id2);
|
|
51419
51667
|
if (line != null) editorRef.current?.scrollToLine(line);
|
|
51420
|
-
if (!fromPreview) previewRef.current?.querySelector(`[data-cmt="${id2}"]`)?.scrollIntoView({ block: "center" });
|
|
51421
51668
|
const c = docRef.current.comments.find((x2) => x2.id === id2);
|
|
51422
51669
|
const rootId = c?.parentId ?? id2;
|
|
51670
|
+
const isDoc = docRef.current.comments.find((x2) => x2.id === rootId)?.anchor === "doc";
|
|
51671
|
+
if (!fromPreview && !isDoc) previewRef.current?.querySelector(`[data-cmt="${rootId}"]`)?.scrollIntoView({ block: "center" });
|
|
51672
|
+
if (isDoc) flashEl(previewRef.current?.querySelector(".ap-rendered"), "ap-flash-doc");
|
|
51673
|
+
else flashEl(previewRef.current?.querySelector(`[data-cmt="${rootId}"]`), "ap-flash-anchor");
|
|
51674
|
+
if (fromRail) return;
|
|
51423
51675
|
const card = railRef.current?.querySelector(`[data-cmt-card="${rootId}"]`);
|
|
51424
51676
|
if (card) {
|
|
51425
51677
|
const parts = card.querySelectorAll(".ap-comment, .ap-reply");
|
|
@@ -51494,8 +51746,8 @@ function App() {
|
|
|
51494
51746
|
setReviewCursor(n2);
|
|
51495
51747
|
if (panes === 2 && rightTab !== "source") setRightTab("source");
|
|
51496
51748
|
requestAnimationFrame(() => {
|
|
51497
|
-
previewRef.current?.querySelector(`[data-hunk="${n2}"]`)?.scrollIntoView({ block: "
|
|
51498
|
-
document.querySelector(`.ap-diffsource [data-hunk="${n2}"]`)?.scrollIntoView({ block: "
|
|
51749
|
+
previewRef.current?.querySelector(`[data-hunk="${n2}"]`)?.scrollIntoView({ block: "start", behavior: "smooth" });
|
|
51750
|
+
document.querySelector(`.ap-diffsource [data-hunk="${n2}"]`)?.scrollIntoView({ block: "start", behavior: "smooth" });
|
|
51499
51751
|
});
|
|
51500
51752
|
}, [changeCount, reviewCursor, panes, rightTab]);
|
|
51501
51753
|
const threads = reactExports.useMemo(() => buildThreads(doc2.comments), [doc2.comments]);
|
|
@@ -51508,6 +51760,45 @@ function App() {
|
|
|
51508
51760
|
return threads.map(annotate).sort((a, b) => a.group - b.group || a.pos - b.pos);
|
|
51509
51761
|
}, [threads, doc2.body]);
|
|
51510
51762
|
const visible = ordered.filter((o) => showResolvedOrphaned || !o.thread.root.resolved && !o.orphaned);
|
|
51763
|
+
const resolvedCount = ordered.filter((o) => o.thread.root.resolved).length;
|
|
51764
|
+
const orphanedCount = ordered.filter((o) => o.orphaned).length;
|
|
51765
|
+
const revealTip = resolvedCount > 0 && orphanedCount > 0 ? t2("rail.showResolved", { resolved: resolvedCount, orphaned: orphanedCount }) : resolvedCount > 0 ? t2("rail.showResolvedOnly", { resolved: resolvedCount }) : t2("rail.showOrphanedOnly", { orphaned: orphanedCount });
|
|
51766
|
+
const selBlocker = reactExports.useMemo(() => {
|
|
51767
|
+
const sel = window.getSelection();
|
|
51768
|
+
const range = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
|
|
51769
|
+
return commentBlockReason(selectionText, doc2.body, range, previewRef.current);
|
|
51770
|
+
}, [doc2.body, selectionText]);
|
|
51771
|
+
const blockerTip = reactExports.useCallback(
|
|
51772
|
+
(r2) => {
|
|
51773
|
+
switch (r2) {
|
|
51774
|
+
case "whitespace":
|
|
51775
|
+
return t2("topbar.cantWhitespace");
|
|
51776
|
+
case "overlap":
|
|
51777
|
+
return t2("topbar.cantOverlap");
|
|
51778
|
+
case "blocks":
|
|
51779
|
+
return t2("topbar.cantSpanBlocks");
|
|
51780
|
+
case "table":
|
|
51781
|
+
return t2("topbar.cantSpanTable");
|
|
51782
|
+
case "rendered":
|
|
51783
|
+
return t2("topbar.cantRendered");
|
|
51784
|
+
default:
|
|
51785
|
+
return null;
|
|
51786
|
+
}
|
|
51787
|
+
},
|
|
51788
|
+
[t2]
|
|
51789
|
+
);
|
|
51790
|
+
const tryAddComment = reactExports.useCallback(() => {
|
|
51791
|
+
const sel = window.getSelection();
|
|
51792
|
+
const raw = sel?.toString() ?? "";
|
|
51793
|
+
const range = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
|
|
51794
|
+
const reason = commentBlockReason(raw, docRef.current.body, range, previewRef.current);
|
|
51795
|
+
if (reason) {
|
|
51796
|
+
setStatus(blockerTip(reason) ?? "");
|
|
51797
|
+
return;
|
|
51798
|
+
}
|
|
51799
|
+
openComposer();
|
|
51800
|
+
}, [blockerTip, openComposer]);
|
|
51801
|
+
tryAddCommentRef.current = tryAddComment;
|
|
51511
51802
|
const resolvedIds = reactExports.useMemo(() => new Set(doc2.comments.filter((c) => c.resolved).map((c) => c.id)), [doc2.comments]);
|
|
51512
51803
|
const previewHtml = reactExports.useMemo(
|
|
51513
51804
|
() => renderMarkdown(doc2.body, (id2) => showResolvedOrphaned || !resolvedIds.has(id2)),
|
|
@@ -51554,6 +51845,7 @@ function App() {
|
|
|
51554
51845
|
panes,
|
|
51555
51846
|
zoom,
|
|
51556
51847
|
hasSelection: selectionText.length > 0,
|
|
51848
|
+
commentBlockTip: blockerTip(selBlocker),
|
|
51557
51849
|
onMode: onModeChange,
|
|
51558
51850
|
onAutoResolve,
|
|
51559
51851
|
onPanes: setPanes,
|
|
@@ -51572,6 +51864,7 @@ function App() {
|
|
|
51572
51864
|
FindReplaceBar,
|
|
51573
51865
|
{
|
|
51574
51866
|
doc: doc2,
|
|
51867
|
+
seed: findSeed,
|
|
51575
51868
|
onApply: apply,
|
|
51576
51869
|
onClose: () => setFindOpen(false),
|
|
51577
51870
|
onNavigate: navigateMatch,
|
|
@@ -51677,6 +51970,28 @@ function App() {
|
|
|
51677
51970
|
onClose: () => setComposer(null)
|
|
51678
51971
|
}
|
|
51679
51972
|
),
|
|
51973
|
+
ctxMenu && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
51974
|
+
ContextMenu,
|
|
51975
|
+
{
|
|
51976
|
+
pos: { x: ctxMenu.x, y: ctxMenu.y },
|
|
51977
|
+
onClose: () => setCtxMenu(null),
|
|
51978
|
+
items: [
|
|
51979
|
+
{
|
|
51980
|
+
label: t2("topbar.addComment"),
|
|
51981
|
+
disabled: editingLocked || ctxMenu.block !== null,
|
|
51982
|
+
...ctxMenu.block ? { title: blockerTip(ctxMenu.block) ?? "" } : {},
|
|
51983
|
+
onSelect: openComposerFromCapture
|
|
51984
|
+
},
|
|
51985
|
+
{ label: t2("menu.findText"), disabled: !ctxMenu.hasSel, onSelect: () => {
|
|
51986
|
+
setFindSeed(ctxSelTextRef.current);
|
|
51987
|
+
setFindOpen(true);
|
|
51988
|
+
} },
|
|
51989
|
+
{ label: t2("menu.copy"), disabled: !ctxMenu.hasSel, onSelect: () => void navigator.clipboard?.writeText?.(ctxSelTextRef.current) },
|
|
51990
|
+
{ label: t2("menu.selectLine"), disabled: !ctxBlockRef.current, onSelect: () => selectNodeContents(ctxBlockRef.current) },
|
|
51991
|
+
{ label: t2("menu.selectAll"), onSelect: () => selectNodeContents(previewRef.current) }
|
|
51992
|
+
]
|
|
51993
|
+
}
|
|
51994
|
+
),
|
|
51680
51995
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ap-main", style: { zoom }, children: [
|
|
51681
51996
|
/* @__PURE__ */ jsxRuntimeExports.jsx("section", { className: "ap-preview", ref: previewRef, children: proposal && reviewOpen ? /* @__PURE__ */ jsxRuntimeExports.jsx(DiffPreview, { segs: reviewSegs, accepted, focused: reviewCursor, onToggle: toggleHunk }) : /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
51682
51997
|
"div",
|
|
@@ -51684,12 +51999,16 @@ function App() {
|
|
|
51684
51999
|
className: "ap-rendered",
|
|
51685
52000
|
dangerouslySetInnerHTML: { __html: previewHtml },
|
|
51686
52001
|
onContextMenu: (e) => {
|
|
51687
|
-
|
|
51688
|
-
|
|
51689
|
-
|
|
51690
|
-
|
|
51691
|
-
|
|
51692
|
-
|
|
52002
|
+
e.preventDefault();
|
|
52003
|
+
ctxBlockRef.current = e.target.closest("[data-line]");
|
|
52004
|
+
const sel = window.getSelection();
|
|
52005
|
+
const raw = sel?.toString() ?? "";
|
|
52006
|
+
const trimmed = raw.trim();
|
|
52007
|
+
const range = sel && sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
|
|
52008
|
+
ctxSelTextRef.current = trimmed;
|
|
52009
|
+
commentRangeRef.current = trimmed && range ? range.cloneRange() : null;
|
|
52010
|
+
const block2 = commentBlockReason(raw, docRef.current.body, range, previewRef.current);
|
|
52011
|
+
setCtxMenu({ x: Math.max(8, Math.min(e.clientX, window.innerWidth - 200)), y: Math.max(8, Math.min(e.clientY, window.innerHeight - 220)), hasSel: trimmed.length > 0, block: block2 });
|
|
51693
52012
|
},
|
|
51694
52013
|
onClick: (e) => {
|
|
51695
52014
|
const target = e.target;
|
|
@@ -51743,11 +52062,18 @@ function App() {
|
|
|
51743
52062
|
panes === 2 && /* @__PURE__ */ jsxRuntimeExports.jsx(PaneTabs, { tab: rightTab, onTab: setRightTab }),
|
|
51744
52063
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ap-rail-head", children: [
|
|
51745
52064
|
/* @__PURE__ */ jsxRuntimeExports.jsx("strong", { children: t2("rail.comments") }),
|
|
51746
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
51747
|
-
|
|
51748
|
-
|
|
51749
|
-
|
|
51750
|
-
|
|
52065
|
+
(resolvedCount > 0 || orphanedCount > 0) && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
52066
|
+
"button",
|
|
52067
|
+
{
|
|
52068
|
+
type: "button",
|
|
52069
|
+
className: `ap-iconbtn ap-reveal${showResolvedOrphaned ? " on" : ""}`,
|
|
52070
|
+
"aria-pressed": showResolvedOrphaned,
|
|
52071
|
+
title: revealTip,
|
|
52072
|
+
"aria-label": revealTip,
|
|
52073
|
+
onClick: () => setShowResolvedOrphaned((v2) => !v2),
|
|
52074
|
+
children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconRevealArchive, {})
|
|
52075
|
+
}
|
|
52076
|
+
)
|
|
51751
52077
|
] }),
|
|
51752
52078
|
visible.map((o, i) => /* @__PURE__ */ jsxRuntimeExports.jsxs(reactExports.Fragment, { children: [
|
|
51753
52079
|
(i === 0 || visible[i - 1].group !== o.group) && /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ap-section-title", children: o.group === 0 ? "Document" : "Anchored" }),
|
|
@@ -51760,7 +52086,7 @@ function App() {
|
|
|
51760
52086
|
focused: focused === o.thread.root.id,
|
|
51761
52087
|
synced: syncedCommentId === o.thread.root.id,
|
|
51762
52088
|
disabled: editingLocked,
|
|
51763
|
-
onFocus: () => focusComment(o.thread.root.id),
|
|
52089
|
+
onFocus: () => focusComment(o.thread.root.id, false, true),
|
|
51764
52090
|
onReply: (text2) => apply(addReply(docRef.current, o.thread.root.id, text2, USER_AUTHOR).doc, { type: "comment_created", payload: { parentId: o.thread.root.id } }),
|
|
51765
52091
|
onAnswer: (selected, text2) => apply(addAnswer(docRef.current, o.thread.root.id, selected, text2, USER_AUTHOR).doc, { type: "comment_answered", payload: { parentId: o.thread.root.id, selected } }),
|
|
51766
52092
|
onResolve: (r2) => apply(setResolved(docRef.current, o.thread.root.id, r2), { type: "comment_resolved", payload: { id: o.thread.root.id, resolved: r2 } }),
|
|
@@ -51903,14 +52229,14 @@ function TopBar(props) {
|
|
|
51903
52229
|
] }),
|
|
51904
52230
|
/* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "ap-spacer" }),
|
|
51905
52231
|
/* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "ap-iconrow", role: "group", "aria-label": "document tools", children: [
|
|
51906
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "ap-iconbtn", onClick: props.onToggleFind, title: `${t2("topbar.find")} (
|
|
52232
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "ap-iconbtn", onClick: props.onToggleFind, title: `${t2("topbar.find")} (${MOD_KEY}+F)`, "aria-label": t2("topbar.find"), children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconFind, {}) }),
|
|
51907
52233
|
/* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
51908
52234
|
"button",
|
|
51909
52235
|
{
|
|
51910
52236
|
className: "ap-iconbtn",
|
|
51911
52237
|
onClick: props.onAddComment,
|
|
51912
|
-
disabled: props.locked,
|
|
51913
|
-
title: props.hasSelection ? t2("topbar.addCommentTitle") : t2("topbar.addDocCommentTitle"),
|
|
52238
|
+
disabled: props.locked || props.hasSelection && props.commentBlockTip !== null,
|
|
52239
|
+
title: props.hasSelection && props.commentBlockTip ? props.commentBlockTip : props.hasSelection ? t2("topbar.addCommentTitle") : t2("topbar.addDocCommentTitle"),
|
|
51914
52240
|
"aria-label": props.hasSelection ? t2("topbar.addComment") : t2("topbar.addDocComment"),
|
|
51915
52241
|
children: /* @__PURE__ */ jsxRuntimeExports.jsx(IconComment, {})
|
|
51916
52242
|
}
|
|
@@ -51954,13 +52280,14 @@ function TopBar(props) {
|
|
|
51954
52280
|
var escapeRegExp = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
51955
52281
|
function FindReplaceBar({
|
|
51956
52282
|
doc: doc2,
|
|
52283
|
+
seed,
|
|
51957
52284
|
onApply,
|
|
51958
52285
|
onClose,
|
|
51959
52286
|
onNavigate,
|
|
51960
52287
|
onQuery
|
|
51961
52288
|
}) {
|
|
51962
52289
|
const t2 = useT();
|
|
51963
|
-
const [find2, setFind2] = reactExports.useState("");
|
|
52290
|
+
const [find2, setFind2] = reactExports.useState(seed ?? "");
|
|
51964
52291
|
const [replace2, setReplace] = reactExports.useState("");
|
|
51965
52292
|
const [replaceMode, setReplaceMode] = reactExports.useState(false);
|
|
51966
52293
|
const [inPreview, setInPreview] = reactExports.useState(true);
|
package/app/renderer/index.html
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline'" />
|
|
6
6
|
<title>inplan</title>
|
|
7
|
-
<script type="module" crossorigin src="./assets/index-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="./assets/index-
|
|
7
|
+
<script type="module" crossorigin src="./assets/index-CPcGk8Qm.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="./assets/index-C6viz_CE.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/bin/cli.js
CHANGED