@deskwork/studio 0.13.0 → 0.14.1
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/pages/content-detail.d.ts.map +1 -1
- package/dist/pages/content-detail.js +5 -4
- package/dist/pages/content-detail.js.map +1 -1
- package/dist/pages/content-detail.ts +5 -4
- package/dist/pages/content.d.ts.map +1 -1
- package/dist/pages/content.js +4 -6
- package/dist/pages/content.js.map +1 -1
- package/dist/pages/content.ts +4 -6
- package/dist/pages/dashboard/affordances.d.ts +6 -1
- package/dist/pages/dashboard/affordances.d.ts.map +1 -1
- package/dist/pages/dashboard/affordances.js +17 -2
- package/dist/pages/dashboard/affordances.js.map +1 -1
- package/dist/pages/dashboard/affordances.ts +18 -2
- package/dist/pages/dashboard/header.js +2 -2
- package/dist/pages/dashboard/header.ts +2 -2
- package/dist/pages/dashboard/section.d.ts +2 -2
- package/dist/pages/dashboard/section.d.ts.map +1 -1
- package/dist/pages/dashboard/section.js +5 -5
- package/dist/pages/dashboard/section.js.map +1 -1
- package/dist/pages/dashboard/section.ts +9 -5
- package/dist/pages/dashboard.d.ts.map +1 -1
- package/dist/pages/dashboard.js +3 -2
- package/dist/pages/dashboard.js.map +1 -1
- package/dist/pages/dashboard.ts +3 -2
- package/dist/pages/entry-review/data.d.ts +54 -0
- package/dist/pages/entry-review/data.d.ts.map +1 -0
- package/dist/pages/entry-review/data.js +116 -0
- package/dist/pages/entry-review/data.js.map +1 -0
- package/dist/pages/entry-review/decision-strip.d.ts +37 -0
- package/dist/pages/entry-review/decision-strip.d.ts.map +1 -0
- package/dist/pages/entry-review/decision-strip.js +137 -0
- package/dist/pages/entry-review/decision-strip.js.map +1 -0
- package/dist/pages/entry-review/edit-panes.d.ts +12 -0
- package/dist/pages/entry-review/edit-panes.d.ts.map +1 -0
- package/dist/pages/entry-review/edit-panes.js +28 -0
- package/dist/pages/entry-review/edit-panes.js.map +1 -0
- package/dist/pages/entry-review/edit-toolbar.d.ts +20 -0
- package/dist/pages/entry-review/edit-toolbar.d.ts.map +1 -0
- package/dist/pages/entry-review/edit-toolbar.js +46 -0
- package/dist/pages/entry-review/edit-toolbar.js.map +1 -0
- package/dist/pages/entry-review/index.d.ts +50 -0
- package/dist/pages/entry-review/index.d.ts.map +1 -0
- package/dist/pages/entry-review/index.js +219 -0
- package/dist/pages/entry-review/index.js.map +1 -0
- package/dist/pages/entry-review/marginalia.d.ts +28 -0
- package/dist/pages/entry-review/marginalia.d.ts.map +1 -0
- package/dist/pages/entry-review/marginalia.js +67 -0
- package/dist/pages/entry-review/marginalia.js.map +1 -0
- package/dist/pages/entry-review/not-found.d.ts +9 -0
- package/dist/pages/entry-review/not-found.d.ts.map +1 -0
- package/dist/pages/entry-review/not-found.js +34 -0
- package/dist/pages/entry-review/not-found.js.map +1 -0
- package/dist/pages/entry-review/outline-drawer.d.ts +12 -0
- package/dist/pages/entry-review/outline-drawer.d.ts.map +1 -0
- package/dist/pages/entry-review/outline-drawer.js +28 -0
- package/dist/pages/entry-review/outline-drawer.js.map +1 -0
- package/dist/pages/entry-review/shortcuts.d.ts +14 -0
- package/dist/pages/entry-review/shortcuts.d.ts.map +1 -0
- package/dist/pages/entry-review/shortcuts.js +36 -0
- package/dist/pages/entry-review/shortcuts.js.map +1 -0
- package/dist/pages/entry-review/version-strip.d.ts +33 -0
- package/dist/pages/entry-review/version-strip.d.ts.map +1 -0
- package/dist/pages/entry-review/version-strip.js +81 -0
- package/dist/pages/entry-review/version-strip.js.map +1 -0
- package/dist/pages/entry-review.d.ts +6 -21
- package/dist/pages/entry-review.d.ts.map +1 -1
- package/dist/pages/entry-review.js +6 -144
- package/dist/pages/entry-review.js.map +1 -1
- package/dist/pages/entry-review.ts +11 -181
- package/dist/pages/index.d.ts.map +1 -1
- package/dist/pages/index.js +6 -10
- package/dist/pages/index.js.map +1 -1
- package/dist/pages/index.ts +6 -10
- package/dist/pages/scrapbook.d.ts.map +1 -1
- package/dist/pages/scrapbook.js +208 -11
- package/dist/pages/scrapbook.js.map +1 -1
- package/dist/pages/scrapbook.ts +209 -10
- package/dist/pages/shortform-review.d.ts +32 -0
- package/dist/pages/shortform-review.d.ts.map +1 -0
- package/dist/pages/shortform-review.js +270 -0
- package/dist/pages/shortform-review.js.map +1 -0
- package/dist/pages/shortform-review.ts +342 -0
- package/dist/routes/api.d.ts +8 -0
- package/dist/routes/api.d.ts.map +1 -1
- package/dist/routes/api.js +115 -0
- package/dist/routes/api.js.map +1 -1
- package/dist/routes/entry-annotation-body.d.ts +26 -0
- package/dist/routes/entry-annotation-body.d.ts.map +1 -0
- package/dist/routes/entry-annotation-body.js +152 -0
- package/dist/routes/entry-annotation-body.js.map +1 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +56 -193
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
- package/dist/pages/review.d.ts +0 -68
- package/dist/pages/review.d.ts.map +0 -1
- package/dist/pages/review.js +0 -561
- package/dist/pages/review.js.map +0 -1
- package/dist/pages/review.ts +0 -710
package/dist/pages/scrapbook.js
CHANGED
|
@@ -9,7 +9,10 @@
|
|
|
9
9
|
* Mockup: docs/superpowers/frontend-design/2026-05-02-review-redesign/scrapbook-redesign.html
|
|
10
10
|
* Spec: docs/superpowers/specs/2026-05-02-scrapbook-redesign-impl-spec.md
|
|
11
11
|
*/
|
|
12
|
-
import { readFileSync } from 'node:fs';
|
|
12
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
13
|
+
import { readCalendar } from '@deskwork/core/calendar';
|
|
14
|
+
import { findEntry } from '@deskwork/core/calendar-mutations';
|
|
15
|
+
import { resolveCalendarPath } from '@deskwork/core/paths';
|
|
13
16
|
import { formatRelativeTime, formatSize, listScrapbook, scrapbookFilePath, } from '@deskwork/core/scrapbook';
|
|
14
17
|
import { html, unsafe } from "./html.js";
|
|
15
18
|
import { layout } from "./layout.js";
|
|
@@ -110,18 +113,132 @@ function countJsonKeys(buf) {
|
|
|
110
113
|
}
|
|
111
114
|
}
|
|
112
115
|
/**
|
|
113
|
-
* Read
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
117
|
-
*
|
|
116
|
+
* Read width × height from a buffer. Recognizes PNG, JPEG, WebP, and
|
|
117
|
+
* GIF; returns null for unrecognized signatures or truncated/malformed
|
|
118
|
+
* buffers. Used by the scrapbook card meta to render `{W} × {H}` next
|
|
119
|
+
* to the image kind chip.
|
|
120
|
+
*
|
|
121
|
+
* Each format is parsed from its file-header structure (no external
|
|
122
|
+
* dependency); each branch returns null on any unexpected byte rather
|
|
123
|
+
* than throwing, so a corrupt image still renders with empty meta.
|
|
118
124
|
*/
|
|
119
125
|
function readImageDimensions(buf) {
|
|
120
|
-
if (buf.length <
|
|
126
|
+
if (buf.length < 12)
|
|
121
127
|
return null;
|
|
122
|
-
|
|
128
|
+
// PNG: 89 50 4E 47 0D 0A 1A 0A then IHDR (chunk-length 4, "IHDR" 4,
|
|
129
|
+
// width 4, height 4 — width@16, height@20).
|
|
130
|
+
if (buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47) {
|
|
131
|
+
if (buf.length < 24)
|
|
132
|
+
return null;
|
|
133
|
+
return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };
|
|
134
|
+
}
|
|
135
|
+
// GIF: "GIF87a" or "GIF89a" + logical screen descriptor (width LE @6,
|
|
136
|
+
// height LE @8).
|
|
137
|
+
if (buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46 &&
|
|
138
|
+
buf[3] === 0x38 && (buf[4] === 0x37 || buf[4] === 0x39) && buf[5] === 0x61) {
|
|
139
|
+
if (buf.length < 10)
|
|
140
|
+
return null;
|
|
141
|
+
return { width: buf.readUInt16LE(6), height: buf.readUInt16LE(8) };
|
|
142
|
+
}
|
|
143
|
+
// JPEG: starts FF D8. Width/height live in a Start-Of-Frame marker
|
|
144
|
+
// (FF C0–CF, excluding DHT C4 / JPG C8 / DAC CC). Walk markers
|
|
145
|
+
// skipping their payloads until the SOF is found.
|
|
146
|
+
if (buf[0] === 0xff && buf[1] === 0xd8) {
|
|
147
|
+
return readJpegDimensions(buf);
|
|
148
|
+
}
|
|
149
|
+
// WebP: "RIFF" {size} "WEBP" then a chunk (VP8 / VP8L / VP8X).
|
|
150
|
+
if (buf[0] === 0x52 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x46 &&
|
|
151
|
+
buf[8] === 0x57 && buf[9] === 0x45 && buf[10] === 0x42 && buf[11] === 0x50) {
|
|
152
|
+
return readWebpDimensions(buf);
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
function readJpegDimensions(buf) {
|
|
157
|
+
// Marker walk: skip FF D8 (SOI), then each marker is FF Xn followed
|
|
158
|
+
// by a 2-byte big-endian segment length (which includes its own 2
|
|
159
|
+
// bytes). The SOF segment's payload is: 1 byte precision, 2 bytes
|
|
160
|
+
// height, 2 bytes width (the rest is component info).
|
|
161
|
+
let i = 2;
|
|
162
|
+
while (i + 4 <= buf.length) {
|
|
163
|
+
if (buf[i] !== 0xff)
|
|
164
|
+
return null;
|
|
165
|
+
let marker = buf[i + 1] ?? 0;
|
|
166
|
+
// Skip fill bytes (0xff padding before the actual marker byte).
|
|
167
|
+
while (marker === 0xff && i + 2 < buf.length) {
|
|
168
|
+
i++;
|
|
169
|
+
marker = buf[i + 1] ?? 0;
|
|
170
|
+
}
|
|
171
|
+
i += 2;
|
|
172
|
+
// Standalone markers (no length): RST0–7 (D0–D7) and SOI/EOI/TEM.
|
|
173
|
+
if (marker === 0xd9 || marker === 0xd8 || marker === 0x01)
|
|
174
|
+
return null;
|
|
175
|
+
if (marker >= 0xd0 && marker <= 0xd7)
|
|
176
|
+
continue;
|
|
177
|
+
if (i + 2 > buf.length)
|
|
178
|
+
return null;
|
|
179
|
+
const segLen = buf.readUInt16BE(i);
|
|
180
|
+
// SOF markers carry the dimensions. Exclusions per JPEG spec:
|
|
181
|
+
// C4 (DHT — Huffman tables), C8 (JPG reserved), CC (DAC — arithmetic
|
|
182
|
+
// coding conditioning).
|
|
183
|
+
const isSof = marker >= 0xc0 && marker <= 0xcf &&
|
|
184
|
+
marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;
|
|
185
|
+
if (isSof) {
|
|
186
|
+
if (i + 7 > buf.length)
|
|
187
|
+
return null;
|
|
188
|
+
return {
|
|
189
|
+
width: buf.readUInt16BE(i + 5),
|
|
190
|
+
height: buf.readUInt16BE(i + 3),
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
i += segLen;
|
|
194
|
+
}
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
function readWebpDimensions(buf) {
|
|
198
|
+
// Three sub-formats (per RFC 6386 / VP8L spec / WebP container spec):
|
|
199
|
+
// - "VP8 " (lossy): header @20-22: signature 9D 01 2A, then
|
|
200
|
+
// 14-bit width LE @23, 14-bit height LE @25
|
|
201
|
+
// (each masked to 14 bits — top 2 bits are
|
|
202
|
+
// horizontal/vertical scale).
|
|
203
|
+
// - "VP8L" (lossless): header @20: signature 0x2F, then 32 bits
|
|
204
|
+
// packed: width-1 (14 bits) + height-1 (14
|
|
205
|
+
// bits) + alpha-flag + version (4 bits).
|
|
206
|
+
// - "VP8X" (extended): flags @20, reserved @21-23, width-1 (24
|
|
207
|
+
// bits LE) @24, height-1 (24 bits LE) @27.
|
|
208
|
+
// Need at least the RIFF header + chunk fourcc; per-variant length
|
|
209
|
+
// checks below cover the variant-specific payload sizes.
|
|
210
|
+
if (buf.length < 16)
|
|
123
211
|
return null;
|
|
124
|
-
|
|
212
|
+
const fourcc = buf.subarray(12, 16).toString('ascii');
|
|
213
|
+
if (fourcc === 'VP8 ') {
|
|
214
|
+
if (buf.length < 30)
|
|
215
|
+
return null;
|
|
216
|
+
if (buf[23] !== 0x9d || buf[24] !== 0x01 || buf[25] !== 0x2a)
|
|
217
|
+
return null;
|
|
218
|
+
const w = buf.readUInt16LE(26) & 0x3fff;
|
|
219
|
+
const h = buf.readUInt16LE(28) & 0x3fff;
|
|
220
|
+
return { width: w, height: h };
|
|
221
|
+
}
|
|
222
|
+
if (fourcc === 'VP8L') {
|
|
223
|
+
if (buf.length < 25)
|
|
224
|
+
return null;
|
|
225
|
+
if (buf[20] !== 0x2f)
|
|
226
|
+
return null;
|
|
227
|
+
// Read 4 bytes LE at offset 21, then unpack.
|
|
228
|
+
const packed = buf.readUInt32LE(21);
|
|
229
|
+
const widthMinus1 = packed & 0x3fff;
|
|
230
|
+
const heightMinus1 = (packed >>> 14) & 0x3fff;
|
|
231
|
+
return { width: widthMinus1 + 1, height: heightMinus1 + 1 };
|
|
232
|
+
}
|
|
233
|
+
if (fourcc === 'VP8X') {
|
|
234
|
+
if (buf.length < 30)
|
|
235
|
+
return null;
|
|
236
|
+
// 24-bit little-endian: low byte + (mid << 8) + (high << 16).
|
|
237
|
+
const w = ((buf[24] ?? 0) | ((buf[25] ?? 0) << 8) | ((buf[26] ?? 0) << 16)) + 1;
|
|
238
|
+
const h = ((buf[27] ?? 0) | ((buf[28] ?? 0) << 8) | ((buf[29] ?? 0) << 16)) + 1;
|
|
239
|
+
return { width: w, height: h };
|
|
240
|
+
}
|
|
241
|
+
return null;
|
|
125
242
|
}
|
|
126
243
|
/**
|
|
127
244
|
* Compute the per-kind extra meta string shown after the kind chip + size:
|
|
@@ -247,14 +364,24 @@ function renderBreadcrumb(site, path) {
|
|
|
247
364
|
<b>${last}</b>
|
|
248
365
|
</nav>`);
|
|
249
366
|
}
|
|
250
|
-
function renderAside(site, path, items, totalSize, lastModified, secretCount) {
|
|
367
|
+
function renderAside(site, path, items, totalSize, lastModified, secretCount, reviewLink) {
|
|
251
368
|
const lastModifiedLabel = lastModified ? formatRelativeTime(lastModified) : '—';
|
|
252
369
|
const publicCount = items.length;
|
|
253
370
|
const sizeLabel = formatSize(totalSize);
|
|
254
371
|
const folderLabel = path.split('/').filter(Boolean).pop() ?? path;
|
|
255
372
|
const fullPath = `${site}/${path}/scrapbook/`;
|
|
373
|
+
// #168 Phase 34 ship-pass — when this scrapbook belongs to a tracked
|
|
374
|
+
// calendar entry, expose a "← back to review" link so the operator
|
|
375
|
+
// who arrived from the entry-review surface (or via the dashboard's
|
|
376
|
+
// scrapbook chip) has an obvious path back. Pre-fix the only nav
|
|
377
|
+
// affordance was the breadcrumb's site link, which lands on the
|
|
378
|
+
// content tree, not the entry-review.
|
|
379
|
+
const backLink = reviewLink !== null
|
|
380
|
+
? unsafe(html `<p class="scrap-aside-back"><a href="${reviewLink}">← back to review</a></p><hr />`)
|
|
381
|
+
: unsafe('');
|
|
256
382
|
return unsafe(html `
|
|
257
383
|
<aside class="scrap-aside">
|
|
384
|
+
${backLink}
|
|
258
385
|
<p class="scrap-aside-kicker"><em>§</em> The folder</p>
|
|
259
386
|
<h1 class="scrap-aside-title">${folderLabel}</h1>
|
|
260
387
|
<p class="scrap-aside-meta">${site}</p>
|
|
@@ -304,10 +431,18 @@ function renderCard(ctx, site, path, item, index, opts = {}) {
|
|
|
304
431
|
const id = secret ? `secret-item-${index + 1}` : `item-${index + 1}`;
|
|
305
432
|
const markSecretLabel = secret ? 'mark public' : 'mark secret';
|
|
306
433
|
const dataSecretAttr = secret ? ' data-secret="true"' : '';
|
|
434
|
+
// #164 Phase 34b — small ⚿ glyph next to .scrap-name on secret
|
|
435
|
+
// cards. Provides visual continuity for the secret marker once a
|
|
436
|
+
// card is expanded (where it grows outside the grouped section's
|
|
437
|
+
// visual scope).
|
|
438
|
+
const secretGlyph = secret
|
|
439
|
+
? unsafe(html `<span class="scrap-name-secret-mark" aria-label="secret" title="secret — never published">⚿</span>`)
|
|
440
|
+
: unsafe('');
|
|
307
441
|
return unsafe(html `
|
|
308
442
|
<li class="scrap-card" data-kind="${item.kind}" data-state="closed" id="${id}"${unsafe(dataSecretAttr)}>
|
|
309
443
|
<div class="scrap-card-head">
|
|
310
444
|
<span class="scrap-seq">N° ${seq}</span>
|
|
445
|
+
${secretGlyph}
|
|
311
446
|
<span class="scrap-name" data-action="open">${item.name}</span>
|
|
312
447
|
${unsafe(time)}
|
|
313
448
|
</div>
|
|
@@ -327,6 +462,39 @@ function renderCard(ctx, site, path, item, index, opts = {}) {
|
|
|
327
462
|
</div>
|
|
328
463
|
</li>`);
|
|
329
464
|
}
|
|
465
|
+
/**
|
|
466
|
+
* Inline new-note composer (Phase 34b — #166).
|
|
467
|
+
*
|
|
468
|
+
* Mirrors the pre-F1 inline composer (`44094ee^:scrapbook.ts:274-294`),
|
|
469
|
+
* adapted to the F1 `.scrap-*` design vocabulary. Hidden by default;
|
|
470
|
+
* the aside's `+ new note` button reveals it via the client wire-up.
|
|
471
|
+
*
|
|
472
|
+
* Per `.claude/rules/affordance-placement.md`: component-attached to
|
|
473
|
+
* the page (not a generic toolbar), placed where the resulting note
|
|
474
|
+
* will appear in sorted position. Direct manipulation: in-page form,
|
|
475
|
+
* filename + body + secret toggle visible inline, Cmd/Ctrl+S saves,
|
|
476
|
+
* Esc cancels. Replaces the F1 `window.prompt()` regression (#166).
|
|
477
|
+
*/
|
|
478
|
+
function renderComposer() {
|
|
479
|
+
return unsafe(html `
|
|
480
|
+
<form class="scrap-composer" data-scrap-composer hidden>
|
|
481
|
+
<header class="scrap-composer-head">
|
|
482
|
+
<span class="scrap-composer-glyph" aria-hidden="true">✎</span>
|
|
483
|
+
<span class="scrap-composer-kicker">NEW NOTE</span>
|
|
484
|
+
<input type="text" class="scrap-composer-filename" data-composer-filename
|
|
485
|
+
placeholder="note-name.md" aria-label="new note filename" />
|
|
486
|
+
<label class="scrap-composer-secret" title="save under scrapbook/secret/ — never published">
|
|
487
|
+
<input type="checkbox" data-composer-secret />
|
|
488
|
+
<span>secret</span>
|
|
489
|
+
</label>
|
|
490
|
+
<button class="scrap-tool" type="button" data-action="composer-cancel">cancel</button>
|
|
491
|
+
<button class="scrap-tool scrap-tool--primary" type="submit" data-action="composer-save">save →</button>
|
|
492
|
+
</header>
|
|
493
|
+
<textarea class="scrap-composer-body" data-composer-body
|
|
494
|
+
placeholder="Write the note in markdown. Cmd/Ctrl+S saves, Esc cancels."
|
|
495
|
+
aria-label="new note body" rows="8"></textarea>
|
|
496
|
+
</form>`);
|
|
497
|
+
}
|
|
330
498
|
function renderDropZone() {
|
|
331
499
|
return unsafe(html `
|
|
332
500
|
<div class="scrap-drop" role="button" tabindex="0" data-action="upload"
|
|
@@ -350,6 +518,33 @@ function renderSecretSection(ctx, site, path, secretItems) {
|
|
|
350
518
|
</ol>
|
|
351
519
|
</section>`);
|
|
352
520
|
}
|
|
521
|
+
/**
|
|
522
|
+
* #168 Phase 34 ship-pass — when the scrapbook path matches a tracked
|
|
523
|
+
* calendar entry with a stamped UUID, return the entry-keyed review
|
|
524
|
+
* URL so the aside can render a "← back to review" link. Returns null
|
|
525
|
+
* when no entry matches (organizational subdirs, ad-hoc paths, or
|
|
526
|
+
* pre-doctor entries lacking an id) — the link is then omitted.
|
|
527
|
+
*
|
|
528
|
+
* Failures (calendar absent, parse error) fall through to null so a
|
|
529
|
+
* transient calendar issue never blocks the scrapbook render.
|
|
530
|
+
*/
|
|
531
|
+
function lookupEntryReviewLink(ctx, site, path) {
|
|
532
|
+
if (!(site in ctx.config.sites))
|
|
533
|
+
return null;
|
|
534
|
+
try {
|
|
535
|
+
const calendarPath = resolveCalendarPath(ctx.projectRoot, ctx.config, site);
|
|
536
|
+
if (!existsSync(calendarPath))
|
|
537
|
+
return null;
|
|
538
|
+
const cal = readCalendar(calendarPath);
|
|
539
|
+
const entry = findEntry(cal, path);
|
|
540
|
+
if (!entry || !entry.id)
|
|
541
|
+
return null;
|
|
542
|
+
return `/dev/editorial-review/entry/${entry.id}`;
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
return null;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
353
548
|
export function renderScrapbookPage(ctx, site, path) {
|
|
354
549
|
// Validate site against the project's configured site list. Without
|
|
355
550
|
// this check, an unknown site key reaches the path resolver and
|
|
@@ -376,16 +571,18 @@ export function renderScrapbookPage(ctx, site, path) {
|
|
|
376
571
|
const folderLabel = path.split('/').filter(Boolean).pop() ?? path;
|
|
377
572
|
const cards = items.map((item, i) => renderCard(ctx, site, path, item, i));
|
|
378
573
|
const cardsHtml = cards.map((c) => c.__raw).join('');
|
|
574
|
+
const reviewLink = lookupEntryReviewLink(ctx, site, path);
|
|
379
575
|
const body = html `
|
|
380
576
|
${renderEditorialFolio('content', `scrapbook · ${site}/${path}`)}
|
|
381
577
|
<main class="scrap-page" data-site="${site}" data-path="${path}">
|
|
382
|
-
${renderAside(site, path, items, totalSize, lastModified, secretItems.length)}
|
|
578
|
+
${renderAside(site, path, items, totalSize, lastModified, secretItems.length, reviewLink)}
|
|
383
579
|
<section class="scrap-main">
|
|
384
580
|
<header class="scrap-main-header">
|
|
385
581
|
${renderBreadcrumb(site, path)}
|
|
386
582
|
${renderSearch()}
|
|
387
583
|
</header>
|
|
388
584
|
${renderFilterChips(counts)}
|
|
585
|
+
${renderComposer()}
|
|
389
586
|
<ol class="scrap-cards" id="cards" data-scrap-cards>
|
|
390
587
|
${unsafe(cardsHtml)}
|
|
391
588
|
</ol>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrapbook.js","sourceRoot":"","sources":["../../src/pages/scrapbook.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scrapbook.js","sourceRoot":"","sources":["../../src/pages/scrapbook.ts"],"names":[],"mappings":"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"}
|
package/dist/pages/scrapbook.ts
CHANGED
|
@@ -10,7 +10,10 @@
|
|
|
10
10
|
* Spec: docs/superpowers/specs/2026-05-02-scrapbook-redesign-impl-spec.md
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import { readFileSync } from 'node:fs';
|
|
13
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
14
|
+
import { readCalendar } from '@deskwork/core/calendar';
|
|
15
|
+
import { findEntry } from '@deskwork/core/calendar-mutations';
|
|
16
|
+
import { resolveCalendarPath } from '@deskwork/core/paths';
|
|
14
17
|
import {
|
|
15
18
|
formatRelativeTime,
|
|
16
19
|
formatSize,
|
|
@@ -118,16 +121,129 @@ function countJsonKeys(buf: Buffer): number | null {
|
|
|
118
121
|
interface ImageDimensions { readonly width: number; readonly height: number; }
|
|
119
122
|
|
|
120
123
|
/**
|
|
121
|
-
* Read
|
|
122
|
-
*
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
124
|
+
* Read width × height from a buffer. Recognizes PNG, JPEG, WebP, and
|
|
125
|
+
* GIF; returns null for unrecognized signatures or truncated/malformed
|
|
126
|
+
* buffers. Used by the scrapbook card meta to render `{W} × {H}` next
|
|
127
|
+
* to the image kind chip.
|
|
128
|
+
*
|
|
129
|
+
* Each format is parsed from its file-header structure (no external
|
|
130
|
+
* dependency); each branch returns null on any unexpected byte rather
|
|
131
|
+
* than throwing, so a corrupt image still renders with empty meta.
|
|
126
132
|
*/
|
|
127
133
|
function readImageDimensions(buf: Buffer): ImageDimensions | null {
|
|
128
|
-
if (buf.length <
|
|
129
|
-
|
|
130
|
-
|
|
134
|
+
if (buf.length < 12) return null;
|
|
135
|
+
// PNG: 89 50 4E 47 0D 0A 1A 0A then IHDR (chunk-length 4, "IHDR" 4,
|
|
136
|
+
// width 4, height 4 — width@16, height@20).
|
|
137
|
+
if (
|
|
138
|
+
buf[0] === 0x89 && buf[1] === 0x50 && buf[2] === 0x4e && buf[3] === 0x47
|
|
139
|
+
) {
|
|
140
|
+
if (buf.length < 24) return null;
|
|
141
|
+
return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };
|
|
142
|
+
}
|
|
143
|
+
// GIF: "GIF87a" or "GIF89a" + logical screen descriptor (width LE @6,
|
|
144
|
+
// height LE @8).
|
|
145
|
+
if (
|
|
146
|
+
buf[0] === 0x47 && buf[1] === 0x49 && buf[2] === 0x46 &&
|
|
147
|
+
buf[3] === 0x38 && (buf[4] === 0x37 || buf[4] === 0x39) && buf[5] === 0x61
|
|
148
|
+
) {
|
|
149
|
+
if (buf.length < 10) return null;
|
|
150
|
+
return { width: buf.readUInt16LE(6), height: buf.readUInt16LE(8) };
|
|
151
|
+
}
|
|
152
|
+
// JPEG: starts FF D8. Width/height live in a Start-Of-Frame marker
|
|
153
|
+
// (FF C0–CF, excluding DHT C4 / JPG C8 / DAC CC). Walk markers
|
|
154
|
+
// skipping their payloads until the SOF is found.
|
|
155
|
+
if (buf[0] === 0xff && buf[1] === 0xd8) {
|
|
156
|
+
return readJpegDimensions(buf);
|
|
157
|
+
}
|
|
158
|
+
// WebP: "RIFF" {size} "WEBP" then a chunk (VP8 / VP8L / VP8X).
|
|
159
|
+
if (
|
|
160
|
+
buf[0] === 0x52 && buf[1] === 0x49 && buf[2] === 0x46 && buf[3] === 0x46 &&
|
|
161
|
+
buf[8] === 0x57 && buf[9] === 0x45 && buf[10] === 0x42 && buf[11] === 0x50
|
|
162
|
+
) {
|
|
163
|
+
return readWebpDimensions(buf);
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function readJpegDimensions(buf: Buffer): ImageDimensions | null {
|
|
169
|
+
// Marker walk: skip FF D8 (SOI), then each marker is FF Xn followed
|
|
170
|
+
// by a 2-byte big-endian segment length (which includes its own 2
|
|
171
|
+
// bytes). The SOF segment's payload is: 1 byte precision, 2 bytes
|
|
172
|
+
// height, 2 bytes width (the rest is component info).
|
|
173
|
+
let i = 2;
|
|
174
|
+
while (i + 4 <= buf.length) {
|
|
175
|
+
if (buf[i] !== 0xff) return null;
|
|
176
|
+
let marker = buf[i + 1] ?? 0;
|
|
177
|
+
// Skip fill bytes (0xff padding before the actual marker byte).
|
|
178
|
+
while (marker === 0xff && i + 2 < buf.length) {
|
|
179
|
+
i++;
|
|
180
|
+
marker = buf[i + 1] ?? 0;
|
|
181
|
+
}
|
|
182
|
+
i += 2;
|
|
183
|
+
// Standalone markers (no length): RST0–7 (D0–D7) and SOI/EOI/TEM.
|
|
184
|
+
if (marker === 0xd9 || marker === 0xd8 || marker === 0x01) return null;
|
|
185
|
+
if (marker >= 0xd0 && marker <= 0xd7) continue;
|
|
186
|
+
if (i + 2 > buf.length) return null;
|
|
187
|
+
const segLen = buf.readUInt16BE(i);
|
|
188
|
+
// SOF markers carry the dimensions. Exclusions per JPEG spec:
|
|
189
|
+
// C4 (DHT — Huffman tables), C8 (JPG reserved), CC (DAC — arithmetic
|
|
190
|
+
// coding conditioning).
|
|
191
|
+
const isSof =
|
|
192
|
+
marker >= 0xc0 && marker <= 0xcf &&
|
|
193
|
+
marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc;
|
|
194
|
+
if (isSof) {
|
|
195
|
+
if (i + 7 > buf.length) return null;
|
|
196
|
+
return {
|
|
197
|
+
width: buf.readUInt16BE(i + 5),
|
|
198
|
+
height: buf.readUInt16BE(i + 3),
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
i += segLen;
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function readWebpDimensions(buf: Buffer): ImageDimensions | null {
|
|
207
|
+
// Three sub-formats (per RFC 6386 / VP8L spec / WebP container spec):
|
|
208
|
+
// - "VP8 " (lossy): header @20-22: signature 9D 01 2A, then
|
|
209
|
+
// 14-bit width LE @23, 14-bit height LE @25
|
|
210
|
+
// (each masked to 14 bits — top 2 bits are
|
|
211
|
+
// horizontal/vertical scale).
|
|
212
|
+
// - "VP8L" (lossless): header @20: signature 0x2F, then 32 bits
|
|
213
|
+
// packed: width-1 (14 bits) + height-1 (14
|
|
214
|
+
// bits) + alpha-flag + version (4 bits).
|
|
215
|
+
// - "VP8X" (extended): flags @20, reserved @21-23, width-1 (24
|
|
216
|
+
// bits LE) @24, height-1 (24 bits LE) @27.
|
|
217
|
+
// Need at least the RIFF header + chunk fourcc; per-variant length
|
|
218
|
+
// checks below cover the variant-specific payload sizes.
|
|
219
|
+
if (buf.length < 16) return null;
|
|
220
|
+
const fourcc = buf.subarray(12, 16).toString('ascii');
|
|
221
|
+
if (fourcc === 'VP8 ') {
|
|
222
|
+
if (buf.length < 30) return null;
|
|
223
|
+
if (buf[23] !== 0x9d || buf[24] !== 0x01 || buf[25] !== 0x2a) return null;
|
|
224
|
+
const w = buf.readUInt16LE(26) & 0x3fff;
|
|
225
|
+
const h = buf.readUInt16LE(28) & 0x3fff;
|
|
226
|
+
return { width: w, height: h };
|
|
227
|
+
}
|
|
228
|
+
if (fourcc === 'VP8L') {
|
|
229
|
+
if (buf.length < 25) return null;
|
|
230
|
+
if (buf[20] !== 0x2f) return null;
|
|
231
|
+
// Read 4 bytes LE at offset 21, then unpack.
|
|
232
|
+
const packed = buf.readUInt32LE(21);
|
|
233
|
+
const widthMinus1 = packed & 0x3fff;
|
|
234
|
+
const heightMinus1 = (packed >>> 14) & 0x3fff;
|
|
235
|
+
return { width: widthMinus1 + 1, height: heightMinus1 + 1 };
|
|
236
|
+
}
|
|
237
|
+
if (fourcc === 'VP8X') {
|
|
238
|
+
if (buf.length < 30) return null;
|
|
239
|
+
// 24-bit little-endian: low byte + (mid << 8) + (high << 16).
|
|
240
|
+
const w =
|
|
241
|
+
((buf[24] ?? 0) | ((buf[25] ?? 0) << 8) | ((buf[26] ?? 0) << 16)) + 1;
|
|
242
|
+
const h =
|
|
243
|
+
((buf[27] ?? 0) | ((buf[28] ?? 0) << 8) | ((buf[29] ?? 0) << 16)) + 1;
|
|
244
|
+
return { width: w, height: h };
|
|
245
|
+
}
|
|
246
|
+
return null;
|
|
131
247
|
}
|
|
132
248
|
|
|
133
249
|
/**
|
|
@@ -289,14 +405,25 @@ function renderAside(
|
|
|
289
405
|
totalSize: number,
|
|
290
406
|
lastModified: string | null,
|
|
291
407
|
secretCount: number,
|
|
408
|
+
reviewLink: string | null,
|
|
292
409
|
): RawHtml {
|
|
293
410
|
const lastModifiedLabel = lastModified ? formatRelativeTime(lastModified) : '—';
|
|
294
411
|
const publicCount = items.length;
|
|
295
412
|
const sizeLabel = formatSize(totalSize);
|
|
296
413
|
const folderLabel = path.split('/').filter(Boolean).pop() ?? path;
|
|
297
414
|
const fullPath = `${site}/${path}/scrapbook/`;
|
|
415
|
+
// #168 Phase 34 ship-pass — when this scrapbook belongs to a tracked
|
|
416
|
+
// calendar entry, expose a "← back to review" link so the operator
|
|
417
|
+
// who arrived from the entry-review surface (or via the dashboard's
|
|
418
|
+
// scrapbook chip) has an obvious path back. Pre-fix the only nav
|
|
419
|
+
// affordance was the breadcrumb's site link, which lands on the
|
|
420
|
+
// content tree, not the entry-review.
|
|
421
|
+
const backLink: RawHtml = reviewLink !== null
|
|
422
|
+
? unsafe(html`<p class="scrap-aside-back"><a href="${reviewLink}">← back to review</a></p><hr />`)
|
|
423
|
+
: unsafe('');
|
|
298
424
|
return unsafe(html`
|
|
299
425
|
<aside class="scrap-aside">
|
|
426
|
+
${backLink}
|
|
300
427
|
<p class="scrap-aside-kicker"><em>§</em> The folder</p>
|
|
301
428
|
<h1 class="scrap-aside-title">${folderLabel}</h1>
|
|
302
429
|
<p class="scrap-aside-meta">${site}</p>
|
|
@@ -354,10 +481,18 @@ function renderCard(
|
|
|
354
481
|
const id = secret ? `secret-item-${index + 1}` : `item-${index + 1}`;
|
|
355
482
|
const markSecretLabel = secret ? 'mark public' : 'mark secret';
|
|
356
483
|
const dataSecretAttr = secret ? ' data-secret="true"' : '';
|
|
484
|
+
// #164 Phase 34b — small ⚿ glyph next to .scrap-name on secret
|
|
485
|
+
// cards. Provides visual continuity for the secret marker once a
|
|
486
|
+
// card is expanded (where it grows outside the grouped section's
|
|
487
|
+
// visual scope).
|
|
488
|
+
const secretGlyph: RawHtml = secret
|
|
489
|
+
? unsafe(html`<span class="scrap-name-secret-mark" aria-label="secret" title="secret — never published">⚿</span>`)
|
|
490
|
+
: unsafe('');
|
|
357
491
|
return unsafe(html`
|
|
358
492
|
<li class="scrap-card" data-kind="${item.kind}" data-state="closed" id="${id}"${unsafe(dataSecretAttr)}>
|
|
359
493
|
<div class="scrap-card-head">
|
|
360
494
|
<span class="scrap-seq">N° ${seq}</span>
|
|
495
|
+
${secretGlyph}
|
|
361
496
|
<span class="scrap-name" data-action="open">${item.name}</span>
|
|
362
497
|
${unsafe(time)}
|
|
363
498
|
</div>
|
|
@@ -378,6 +513,40 @@ function renderCard(
|
|
|
378
513
|
</li>`);
|
|
379
514
|
}
|
|
380
515
|
|
|
516
|
+
/**
|
|
517
|
+
* Inline new-note composer (Phase 34b — #166).
|
|
518
|
+
*
|
|
519
|
+
* Mirrors the pre-F1 inline composer (`44094ee^:scrapbook.ts:274-294`),
|
|
520
|
+
* adapted to the F1 `.scrap-*` design vocabulary. Hidden by default;
|
|
521
|
+
* the aside's `+ new note` button reveals it via the client wire-up.
|
|
522
|
+
*
|
|
523
|
+
* Per `.claude/rules/affordance-placement.md`: component-attached to
|
|
524
|
+
* the page (not a generic toolbar), placed where the resulting note
|
|
525
|
+
* will appear in sorted position. Direct manipulation: in-page form,
|
|
526
|
+
* filename + body + secret toggle visible inline, Cmd/Ctrl+S saves,
|
|
527
|
+
* Esc cancels. Replaces the F1 `window.prompt()` regression (#166).
|
|
528
|
+
*/
|
|
529
|
+
function renderComposer(): RawHtml {
|
|
530
|
+
return unsafe(html`
|
|
531
|
+
<form class="scrap-composer" data-scrap-composer hidden>
|
|
532
|
+
<header class="scrap-composer-head">
|
|
533
|
+
<span class="scrap-composer-glyph" aria-hidden="true">✎</span>
|
|
534
|
+
<span class="scrap-composer-kicker">NEW NOTE</span>
|
|
535
|
+
<input type="text" class="scrap-composer-filename" data-composer-filename
|
|
536
|
+
placeholder="note-name.md" aria-label="new note filename" />
|
|
537
|
+
<label class="scrap-composer-secret" title="save under scrapbook/secret/ — never published">
|
|
538
|
+
<input type="checkbox" data-composer-secret />
|
|
539
|
+
<span>secret</span>
|
|
540
|
+
</label>
|
|
541
|
+
<button class="scrap-tool" type="button" data-action="composer-cancel">cancel</button>
|
|
542
|
+
<button class="scrap-tool scrap-tool--primary" type="submit" data-action="composer-save">save →</button>
|
|
543
|
+
</header>
|
|
544
|
+
<textarea class="scrap-composer-body" data-composer-body
|
|
545
|
+
placeholder="Write the note in markdown. Cmd/Ctrl+S saves, Esc cancels."
|
|
546
|
+
aria-label="new note body" rows="8"></textarea>
|
|
547
|
+
</form>`);
|
|
548
|
+
}
|
|
549
|
+
|
|
381
550
|
function renderDropZone(): RawHtml {
|
|
382
551
|
return unsafe(html`
|
|
383
552
|
<div class="scrap-drop" role="button" tabindex="0" data-action="upload"
|
|
@@ -407,6 +576,34 @@ function renderSecretSection(
|
|
|
407
576
|
</section>`);
|
|
408
577
|
}
|
|
409
578
|
|
|
579
|
+
/**
|
|
580
|
+
* #168 Phase 34 ship-pass — when the scrapbook path matches a tracked
|
|
581
|
+
* calendar entry with a stamped UUID, return the entry-keyed review
|
|
582
|
+
* URL so the aside can render a "← back to review" link. Returns null
|
|
583
|
+
* when no entry matches (organizational subdirs, ad-hoc paths, or
|
|
584
|
+
* pre-doctor entries lacking an id) — the link is then omitted.
|
|
585
|
+
*
|
|
586
|
+
* Failures (calendar absent, parse error) fall through to null so a
|
|
587
|
+
* transient calendar issue never blocks the scrapbook render.
|
|
588
|
+
*/
|
|
589
|
+
function lookupEntryReviewLink(
|
|
590
|
+
ctx: StudioContext,
|
|
591
|
+
site: string,
|
|
592
|
+
path: string,
|
|
593
|
+
): string | null {
|
|
594
|
+
if (!(site in ctx.config.sites)) return null;
|
|
595
|
+
try {
|
|
596
|
+
const calendarPath = resolveCalendarPath(ctx.projectRoot, ctx.config, site);
|
|
597
|
+
if (!existsSync(calendarPath)) return null;
|
|
598
|
+
const cal = readCalendar(calendarPath);
|
|
599
|
+
const entry = findEntry(cal, path);
|
|
600
|
+
if (!entry || !entry.id) return null;
|
|
601
|
+
return `/dev/editorial-review/entry/${entry.id}`;
|
|
602
|
+
} catch {
|
|
603
|
+
return null;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
410
607
|
export function renderScrapbookPage(
|
|
411
608
|
ctx: StudioContext,
|
|
412
609
|
site: string,
|
|
@@ -435,16 +632,18 @@ export function renderScrapbookPage(
|
|
|
435
632
|
const folderLabel = path.split('/').filter(Boolean).pop() ?? path;
|
|
436
633
|
const cards = items.map((item, i) => renderCard(ctx, site, path, item, i));
|
|
437
634
|
const cardsHtml = cards.map((c) => c.__raw).join('');
|
|
635
|
+
const reviewLink = lookupEntryReviewLink(ctx, site, path);
|
|
438
636
|
const body = html`
|
|
439
637
|
${renderEditorialFolio('content', `scrapbook · ${site}/${path}`)}
|
|
440
638
|
<main class="scrap-page" data-site="${site}" data-path="${path}">
|
|
441
|
-
${renderAside(site, path, items, totalSize, lastModified, secretItems.length)}
|
|
639
|
+
${renderAside(site, path, items, totalSize, lastModified, secretItems.length, reviewLink)}
|
|
442
640
|
<section class="scrap-main">
|
|
443
641
|
<header class="scrap-main-header">
|
|
444
642
|
${renderBreadcrumb(site, path)}
|
|
445
643
|
${renderSearch()}
|
|
446
644
|
</header>
|
|
447
645
|
${renderFilterChips(counts)}
|
|
646
|
+
${renderComposer()}
|
|
448
647
|
<ol class="scrap-cards" id="cards" data-scrap-cards>
|
|
449
648
|
${unsafe(cardsHtml)}
|
|
450
649
|
</ol>
|