koneck 2.69.0 → 2.70.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/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +1 -1
- package/dist/engine.js.map +1 -1
- package/dist/types.d.ts +9 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/web/api.d.ts.map +1 -1
- package/dist/web/api.js +23 -1
- package/dist/web/api.js.map +1 -1
- package/dist/web/events.d.ts +8 -0
- package/dist/web/events.d.ts.map +1 -1
- package/dist/web/events.js.map +1 -1
- package/dist/web/sessions.d.ts.map +1 -1
- package/dist/web/sessions.js +3 -2
- package/dist/web/sessions.js.map +1 -1
- package/dist/web/ui-client.d.ts.map +1 -1
- package/dist/web/ui-client.js +163 -15
- package/dist/web/ui-client.js.map +1 -1
- package/dist/web/ui-css.d.ts.map +1 -1
- package/dist/web/ui-css.js +16 -1
- package/dist/web/ui-css.js.map +1 -1
- package/package.json +1 -1
package/dist/web/ui-client.js
CHANGED
|
@@ -2489,10 +2489,13 @@ function drawMention() {
|
|
|
2489
2489
|
* everything that distinguishes it is at the end.
|
|
2490
2490
|
*/
|
|
2491
2491
|
const p = el('div', 'mp');
|
|
2492
|
+
// One isolated LTR run, for the same reason the watch header needs one: the box is RTL so the
|
|
2493
|
+
// front is what gets truncated, and an RTL box reorders the slashes at either edge.
|
|
2494
|
+
const run = el('span', 'pathltr');
|
|
2492
2495
|
const cut = item.path.lastIndexOf('/');
|
|
2493
|
-
if (cut > -1)
|
|
2494
|
-
|
|
2495
|
-
p.appendChild(
|
|
2496
|
+
if (cut > -1) run.appendChild(document.createTextNode(item.path.slice(0, cut + 1)));
|
|
2497
|
+
run.appendChild(el('b', null, cut > -1 ? item.path.slice(cut + 1) : item.path));
|
|
2498
|
+
p.appendChild(run);
|
|
2496
2499
|
row.appendChild(p);
|
|
2497
2500
|
|
|
2498
2501
|
if (item.because && item.because.length) {
|
|
@@ -4117,7 +4120,16 @@ function stopWatchClock() {
|
|
|
4117
4120
|
/** The header: the verb, the target, and how long this step has been going. */
|
|
4118
4121
|
function watchHead(verb, target) {
|
|
4119
4122
|
$('wtool').textContent = verb;
|
|
4120
|
-
|
|
4123
|
+
/*
|
|
4124
|
+
* The path in an isolated LTR run.
|
|
4125
|
+
*
|
|
4126
|
+
* Set as text directly, the box's own direction:rtl — which is what truncates the front rather
|
|
4127
|
+
* than the end — moved the leading slash to the far side, so /home/kona/…/page.tsx was shown as
|
|
4128
|
+
* home/kona/…/page.tsx/. The slash was never in the data.
|
|
4129
|
+
*/
|
|
4130
|
+
const held = $('wpath');
|
|
4131
|
+
held.textContent = '';
|
|
4132
|
+
held.appendChild(el('span', 'pathltr', target));
|
|
4121
4133
|
follow.startedAt = Date.now();
|
|
4122
4134
|
if (!follow.timer) {
|
|
4123
4135
|
follow.timer = setInterval(() => {
|
|
@@ -4337,29 +4349,165 @@ function prettyArgs(args) {
|
|
|
4337
4349
|
}
|
|
4338
4350
|
|
|
4339
4351
|
/*
|
|
4340
|
-
* The write in progress,
|
|
4352
|
+
* The write in progress, coloured as it arrives.
|
|
4353
|
+
*
|
|
4354
|
+
* This used to be deliberately plain, on the reasoning that colouring needs a round trip per
|
|
4355
|
+
* repaint and four of those a second to colour text about to change again was a cost with no
|
|
4356
|
+
* reader. Two thirds of that was wrong. There is a reader — the panel exists to be read while the
|
|
4357
|
+
* work happens, and uncoloured code is the one thing there that looks unfinished. And the cost was
|
|
4358
|
+
* never measured: tokenising a 610-line tsx file is 7.7ms, and the expensive part was never the
|
|
4359
|
+
* highlighting at all, it was rebuilding every row on every repaint.
|
|
4360
|
+
*
|
|
4361
|
+
* So it paints incrementally, which a streaming write allows because it is append-only:
|
|
4341
4362
|
*
|
|
4342
|
-
*
|
|
4343
|
-
*
|
|
4344
|
-
*
|
|
4345
|
-
*
|
|
4363
|
+
* - the new lines are appended plain, immediately, so the text never waits for colour;
|
|
4364
|
+
* - the server is asked to colour only the lines that arrived, debounced;
|
|
4365
|
+
* - the returned colours are painted into the rows already on screen.
|
|
4366
|
+
*
|
|
4367
|
+
* When the content is not an extension of what was there — a replace, or the model starting over —
|
|
4368
|
+
* the prefix check fails and it repaints from scratch, because guessing wrong about that shows
|
|
4369
|
+
* somebody the wrong file.
|
|
4346
4370
|
*/
|
|
4347
4371
|
function drawWriteInProgress(path, content) {
|
|
4348
4372
|
const host = $('wbody');
|
|
4349
4373
|
let head = host.querySelector('.wwrite');
|
|
4350
|
-
|
|
4374
|
+
const fresh = !head || write.path !== path || !content.startsWith(write.text);
|
|
4375
|
+
if (fresh) {
|
|
4351
4376
|
host.innerHTML = '';
|
|
4352
4377
|
head = el('div', 'wwrite');
|
|
4353
4378
|
host.appendChild(head);
|
|
4354
|
-
|
|
4379
|
+
const body = el('div', 'wwbody');
|
|
4380
|
+
/*
|
|
4381
|
+
* An empty frame, built here rather than by drawCode.
|
|
4382
|
+
*
|
|
4383
|
+
* drawCode('') is not empty: an empty string splits into one line, so it produced a placeholder
|
|
4384
|
+
* row and every index after it was off by one. That was worse than a cosmetic slip — painting
|
|
4385
|
+
* replaces a row's text with the token text, so row N was being given line N+1's content and
|
|
4386
|
+
* the panel showed text that was never written on that line. Found by comparing each rendered
|
|
4387
|
+
* row against its gutter number: the first mismatch was at index 1.
|
|
4388
|
+
*/
|
|
4389
|
+
const frame = el('div', 'rows');
|
|
4390
|
+
frame.appendChild(el('div', 'gut'));
|
|
4391
|
+
frame.appendChild(el('div', 'src'));
|
|
4392
|
+
body.appendChild(frame);
|
|
4393
|
+
host.appendChild(body);
|
|
4394
|
+
write.path = path;
|
|
4395
|
+
write.text = '';
|
|
4396
|
+
write.done = 0;
|
|
4397
|
+
write.asked = 0;
|
|
4398
|
+
// Anything still in flight for the previous file belongs to a generation that no longer exists.
|
|
4399
|
+
write.gen++;
|
|
4400
|
+
if (write.timer) { clearTimeout(write.timer); write.timer = null; }
|
|
4355
4401
|
}
|
|
4402
|
+
|
|
4356
4403
|
const lines = content.split('\n');
|
|
4357
4404
|
head.textContent = 'writing ' + path + ' — ' + lines.length
|
|
4358
4405
|
+ (lines.length === 1 ? ' line so far' : ' lines so far');
|
|
4359
|
-
|
|
4360
|
-
|
|
4361
|
-
|
|
4362
|
-
|
|
4406
|
+
|
|
4407
|
+
/*
|
|
4408
|
+
* The last line is left off until something follows it.
|
|
4409
|
+
*
|
|
4410
|
+
* A streaming write's final line is half-typed by definition, so painting it and then repainting
|
|
4411
|
+
* it on the next frame makes the bottom row flicker for the whole write. Holding it back one
|
|
4412
|
+
* frame costs nothing — the next chunk is milliseconds away — and the bottom of the panel stops
|
|
4413
|
+
* jittering.
|
|
4414
|
+
*/
|
|
4415
|
+
const ready = lines.length - 1;
|
|
4416
|
+
const rows = host.querySelector('.rows');
|
|
4417
|
+
const gut = rows.querySelector('.gut');
|
|
4418
|
+
const src = rows.querySelector('.src');
|
|
4419
|
+
|
|
4420
|
+
const wasAtEnd = host.scrollHeight - host.scrollTop - host.clientHeight < 60;
|
|
4421
|
+
for (let i = write.done; i < ready; i++) {
|
|
4422
|
+
gut.appendChild(el('div', null, String(i + 1)));
|
|
4423
|
+
const row = el('div');
|
|
4424
|
+
row.textContent = lines[i] === '' ? '' : lines[i];
|
|
4425
|
+
src.appendChild(row);
|
|
4426
|
+
}
|
|
4427
|
+
if (ready > write.done) write.done = ready;
|
|
4428
|
+
write.text = content;
|
|
4429
|
+
// Follows the tail, unless somebody has scrolled up to look at something.
|
|
4430
|
+
if (wasAtEnd) host.scrollTop = host.scrollHeight;
|
|
4431
|
+
|
|
4432
|
+
askColour(path, content);
|
|
4433
|
+
}
|
|
4434
|
+
|
|
4435
|
+
/**
|
|
4436
|
+
* The state of the write being watched, so the next chunk knows what is already on screen.
|
|
4437
|
+
*
|
|
4438
|
+
* "done" is how many rows exist; "asked" is how many have been coloured or are being coloured, so a
|
|
4439
|
+
* slow answer cannot cause the same lines to be requested twice.
|
|
4440
|
+
*/
|
|
4441
|
+
const write = { path: null, text: '', done: 0, asked: 0, timer: null, gen: 0 };
|
|
4442
|
+
|
|
4443
|
+
/*
|
|
4444
|
+
* Asks for the colours of the lines that have arrived since the last time.
|
|
4445
|
+
*
|
|
4446
|
+
* Debounced, because chunks arrive faster than anybody reads and a request per chunk would be a
|
|
4447
|
+
* request per keystroke of the model's. Coalescing means one request covers everything that landed
|
|
4448
|
+
* while the previous one was in flight, which is exactly the behaviour wanted: the colour lags the
|
|
4449
|
+
* text by one round trip and never by more.
|
|
4450
|
+
*/
|
|
4451
|
+
function askColour(path, content) {
|
|
4452
|
+
if (write.timer) return;
|
|
4453
|
+
write.timer = setTimeout(() => {
|
|
4454
|
+
write.timer = null;
|
|
4455
|
+
if (write.path !== path || write.asked >= write.done) return;
|
|
4456
|
+
const from = write.asked;
|
|
4457
|
+
const upto = write.done;
|
|
4458
|
+
/*
|
|
4459
|
+
* Kept against the generation, not against a request counter.
|
|
4460
|
+
*
|
|
4461
|
+
* The first version dropped any answer that was not the newest request, on the reasoning that a
|
|
4462
|
+
* stale answer must not paint. That is true of a *different file* and false of these: two
|
|
4463
|
+
* requests in flight cover different rows, so discarding the older one left the rows it covered
|
|
4464
|
+
* plain for ever while the newer ones coloured around them. Visible in a screenshot as line 28
|
|
4465
|
+
* coloured, 29 plain, 30 onward coloured — which is what sent me looking.
|
|
4466
|
+
*
|
|
4467
|
+
* The generation changes only when the panel resets to another file or the content stops being
|
|
4468
|
+
* an extension of itself, which is the only case where an in-flight answer is genuinely about
|
|
4469
|
+
* something else.
|
|
4470
|
+
*/
|
|
4471
|
+
const gen = write.gen;
|
|
4472
|
+
write.asked = upto;
|
|
4473
|
+
api('/api/highlight', { method: 'POST',
|
|
4474
|
+
body: JSON.stringify({ path: path, text: write.text, from: from }) })
|
|
4475
|
+
.then((out) => {
|
|
4476
|
+
if (gen !== write.gen || write.path !== path || !out.tokens) return;
|
|
4477
|
+
paintRows(from, upto, out.tokens);
|
|
4478
|
+
})
|
|
4479
|
+
.catch(() => {
|
|
4480
|
+
// Colour is a bonus and the code is the point, so a failure leaves the plain rows alone —
|
|
4481
|
+
// but the lines are released so a later attempt can still colour them.
|
|
4482
|
+
if (gen === write.gen && write.asked === upto) write.asked = from;
|
|
4483
|
+
});
|
|
4484
|
+
}, 70);
|
|
4485
|
+
}
|
|
4486
|
+
|
|
4487
|
+
/**
|
|
4488
|
+
* Replaces the plain text of rows from..upto with their coloured spans.
|
|
4489
|
+
*
|
|
4490
|
+
* Each row is checked against the text the colours are for before it is touched. That guard is not
|
|
4491
|
+
* defensive habit: painting replaces a row's content with the token text, so an index that is off by
|
|
4492
|
+
* one does not merely mis-colour a line, it shows text that was never written on it. One off-by-one
|
|
4493
|
+
* had already done exactly that. With the check, the worst a future one can do is leave a line
|
|
4494
|
+
* uncoloured, which is a thing somebody can notice and nobody can be misled by.
|
|
4495
|
+
*/
|
|
4496
|
+
function paintRows(from, upto, tokens) {
|
|
4497
|
+
const src = $('wbody').querySelector('.src');
|
|
4498
|
+
if (!src) return;
|
|
4499
|
+
for (let i = from; i < upto; i++) {
|
|
4500
|
+
const row = src.children[i];
|
|
4501
|
+
const forLine = tokens[i - from];
|
|
4502
|
+
if (!row || !forLine || !forLine.length) continue;
|
|
4503
|
+
const held = row.textContent;
|
|
4504
|
+
let joined = '';
|
|
4505
|
+
for (const t of forLine) joined += (t && t.text) || '';
|
|
4506
|
+
// The zero-width space stands in for an empty line, so an empty row matches empty tokens.
|
|
4507
|
+
if (joined !== held && !(held === '' && joined === '')) continue;
|
|
4508
|
+
row.textContent = '';
|
|
4509
|
+
if (!paintTokens(row, forLine, null)) row.textContent = held;
|
|
4510
|
+
}
|
|
4363
4511
|
}
|
|
4364
4512
|
|
|
4365
4513
|
/** Paints the content a write is carrying, coloured for the file it is going into. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-client.js","sourceRoot":"","sources":["../../src/web/ui-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"ui-client.js","sourceRoot":"","sources":["../../src/web/ui-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,YAAY;IAC1B,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4hKlB,CAAC;AACF,CAAC"}
|
package/dist/web/ui-css.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-css.d.ts","sourceRoot":"","sources":["../../src/web/ui-css.ts"],"names":[],"mappings":"AA8CA,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"ui-css.d.ts","sourceRoot":"","sources":["../../src/web/ui-css.ts"],"names":[],"mappings":"AA8CA,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkoC3C"}
|
package/dist/web/ui-css.js
CHANGED
|
@@ -427,7 +427,7 @@ footer{flex:0 0 auto;border-top:1px solid var(--line);background:var(--panel);pa
|
|
|
427
427
|
.mrow:hover{background:var(--panel-2)}
|
|
428
428
|
.mrow.on{background:var(--panel-2);border-left-color:var(--cyan)}
|
|
429
429
|
/* The name carries the weight; the directory it sits in is context, not the answer. */
|
|
430
|
-
.mrow .mp{font-family:var(--mono);font-size:12.5px;color:var(--muted);
|
|
430
|
+
.mrow .mp{font-family:var(--mono);font-size:12.5px;color:var(--muted);flex:1;min-width:0;
|
|
431
431
|
overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}
|
|
432
432
|
.mrow .mp b{color:var(--ink);font-weight:600}
|
|
433
433
|
.mrow .mwhy{display:flex;gap:5px;flex:0 0 auto}
|
|
@@ -688,6 +688,21 @@ dialog:has(.dlg.wide){max-width:560px}
|
|
|
688
688
|
border-bottom:1px solid var(--line);font-size:11.5px;flex:0 0 auto}
|
|
689
689
|
.whead .wt{color:var(--cyan);font-size:10px;letter-spacing:.09em;text-transform:uppercase;
|
|
690
690
|
flex:0 0 auto}
|
|
691
|
+
/*
|
|
692
|
+
* A path truncated at the front, without bidi rearranging it.
|
|
693
|
+
*
|
|
694
|
+
* direction:rtl is what puts the ellipsis at the start, which is the only useful place for a path —
|
|
695
|
+
* everything that identifies it is at the end. But a slash is a bidi-neutral character, so in an
|
|
696
|
+
* RTL paragraph the leading one is reordered to the far side and /home/kona/…/page.tsx renders as
|
|
697
|
+
* home/kona/…/page.tsx/ — which is what somebody reported seeing, and it was not a stray character
|
|
698
|
+
* in the data.
|
|
699
|
+
*
|
|
700
|
+
* The fix is an isolated LTR run inside the RTL box: the truncation stays at the front and the text
|
|
701
|
+
* inside is laid out as the plain string it is. Checked in Chromium against the alternatives —
|
|
702
|
+
* unicode-bidi:plaintext fixes the order but moves the ellipsis to the end, which throws away the
|
|
703
|
+
* filename.
|
|
704
|
+
*/
|
|
705
|
+
.pathltr{direction:ltr;unicode-bidi:isolate}
|
|
691
706
|
.whead .wp{font-family:var(--mono);font-size:12px;flex:1;min-width:0;overflow:hidden;
|
|
692
707
|
text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}
|
|
693
708
|
.whead .wms{flex:0 0 auto;font-size:10.5px;color:var(--dim);font-variant-numeric:tabular-nums;
|
package/dist/web/ui-css.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-css.js","sourceRoot":"","sources":["../../src/web/ui-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH;;;;;;;;;;;;GAYG;AACH,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;CAkBZ,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO;;;;;;;;;;;;;;;;;gBAiBO,OAAO;;;oCAGa,IAAI;;2BAEb,IAAI
|
|
1
|
+
{"version":3,"file":"ui-css.js","sourceRoot":"","sources":["../../src/web/ui-css.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH;;;;;;;;;;;;GAYG;AACH,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;CAkBZ,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,OAAO;;;;;;;;;;;;;;;;;gBAiBO,OAAO;;;oCAGa,IAAI;;2BAEb,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0mC9B,CAAC;AACF,CAAC"}
|