@deskwork/studio 0.13.0 → 0.14.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.
Files changed (95) hide show
  1. package/dist/pages/content-detail.d.ts.map +1 -1
  2. package/dist/pages/content-detail.js +5 -4
  3. package/dist/pages/content-detail.js.map +1 -1
  4. package/dist/pages/content-detail.ts +5 -4
  5. package/dist/pages/content.d.ts.map +1 -1
  6. package/dist/pages/content.js +4 -6
  7. package/dist/pages/content.js.map +1 -1
  8. package/dist/pages/content.ts +4 -6
  9. package/dist/pages/dashboard/affordances.d.ts +6 -1
  10. package/dist/pages/dashboard/affordances.d.ts.map +1 -1
  11. package/dist/pages/dashboard/affordances.js +17 -2
  12. package/dist/pages/dashboard/affordances.js.map +1 -1
  13. package/dist/pages/dashboard/affordances.ts +18 -2
  14. package/dist/pages/dashboard/header.js +2 -2
  15. package/dist/pages/dashboard/header.ts +2 -2
  16. package/dist/pages/dashboard/section.d.ts +2 -2
  17. package/dist/pages/dashboard/section.d.ts.map +1 -1
  18. package/dist/pages/dashboard/section.js +5 -5
  19. package/dist/pages/dashboard/section.js.map +1 -1
  20. package/dist/pages/dashboard/section.ts +9 -5
  21. package/dist/pages/dashboard.d.ts.map +1 -1
  22. package/dist/pages/dashboard.js +3 -2
  23. package/dist/pages/dashboard.js.map +1 -1
  24. package/dist/pages/dashboard.ts +3 -2
  25. package/dist/pages/entry-review/data.d.ts +54 -0
  26. package/dist/pages/entry-review/data.d.ts.map +1 -0
  27. package/dist/pages/entry-review/data.js +116 -0
  28. package/dist/pages/entry-review/data.js.map +1 -0
  29. package/dist/pages/entry-review/decision-strip.d.ts +37 -0
  30. package/dist/pages/entry-review/decision-strip.d.ts.map +1 -0
  31. package/dist/pages/entry-review/decision-strip.js +137 -0
  32. package/dist/pages/entry-review/decision-strip.js.map +1 -0
  33. package/dist/pages/entry-review/edit-panes.d.ts +12 -0
  34. package/dist/pages/entry-review/edit-panes.d.ts.map +1 -0
  35. package/dist/pages/entry-review/edit-panes.js +28 -0
  36. package/dist/pages/entry-review/edit-panes.js.map +1 -0
  37. package/dist/pages/entry-review/edit-toolbar.d.ts +20 -0
  38. package/dist/pages/entry-review/edit-toolbar.d.ts.map +1 -0
  39. package/dist/pages/entry-review/edit-toolbar.js +46 -0
  40. package/dist/pages/entry-review/edit-toolbar.js.map +1 -0
  41. package/dist/pages/entry-review/index.d.ts +50 -0
  42. package/dist/pages/entry-review/index.d.ts.map +1 -0
  43. package/dist/pages/entry-review/index.js +219 -0
  44. package/dist/pages/entry-review/index.js.map +1 -0
  45. package/dist/pages/entry-review/marginalia.d.ts +28 -0
  46. package/dist/pages/entry-review/marginalia.d.ts.map +1 -0
  47. package/dist/pages/entry-review/marginalia.js +67 -0
  48. package/dist/pages/entry-review/marginalia.js.map +1 -0
  49. package/dist/pages/entry-review/not-found.d.ts +9 -0
  50. package/dist/pages/entry-review/not-found.d.ts.map +1 -0
  51. package/dist/pages/entry-review/not-found.js +34 -0
  52. package/dist/pages/entry-review/not-found.js.map +1 -0
  53. package/dist/pages/entry-review/outline-drawer.d.ts +12 -0
  54. package/dist/pages/entry-review/outline-drawer.d.ts.map +1 -0
  55. package/dist/pages/entry-review/outline-drawer.js +28 -0
  56. package/dist/pages/entry-review/outline-drawer.js.map +1 -0
  57. package/dist/pages/entry-review/shortcuts.d.ts +14 -0
  58. package/dist/pages/entry-review/shortcuts.d.ts.map +1 -0
  59. package/dist/pages/entry-review/shortcuts.js +36 -0
  60. package/dist/pages/entry-review/shortcuts.js.map +1 -0
  61. package/dist/pages/entry-review/version-strip.d.ts +33 -0
  62. package/dist/pages/entry-review/version-strip.d.ts.map +1 -0
  63. package/dist/pages/entry-review/version-strip.js +81 -0
  64. package/dist/pages/entry-review/version-strip.js.map +1 -0
  65. package/dist/pages/entry-review.d.ts +6 -21
  66. package/dist/pages/entry-review.d.ts.map +1 -1
  67. package/dist/pages/entry-review.js +6 -144
  68. package/dist/pages/entry-review.js.map +1 -1
  69. package/dist/pages/entry-review.ts +11 -181
  70. package/dist/pages/index.d.ts.map +1 -1
  71. package/dist/pages/index.js +6 -10
  72. package/dist/pages/index.js.map +1 -1
  73. package/dist/pages/index.ts +6 -10
  74. package/dist/pages/scrapbook.d.ts.map +1 -1
  75. package/dist/pages/scrapbook.js +208 -11
  76. package/dist/pages/scrapbook.js.map +1 -1
  77. package/dist/pages/scrapbook.ts +209 -10
  78. package/dist/pages/shortform-review.d.ts +32 -0
  79. package/dist/pages/shortform-review.d.ts.map +1 -0
  80. package/dist/pages/shortform-review.js +270 -0
  81. package/dist/pages/shortform-review.js.map +1 -0
  82. package/dist/pages/shortform-review.ts +342 -0
  83. package/dist/routes/api.d.ts +8 -0
  84. package/dist/routes/api.d.ts.map +1 -1
  85. package/dist/routes/api.js +115 -0
  86. package/dist/routes/api.js.map +1 -1
  87. package/dist/routes/entry-annotation-body.d.ts +26 -0
  88. package/dist/routes/entry-annotation-body.d.ts.map +1 -0
  89. package/dist/routes/entry-annotation-body.js +152 -0
  90. package/dist/routes/entry-annotation-body.js.map +1 -0
  91. package/dist/server.d.ts +1 -1
  92. package/dist/server.d.ts.map +1 -1
  93. package/dist/server.js +56 -193
  94. package/dist/server.js.map +1 -1
  95. package/package.json +2 -2
@@ -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 PNG dimensions from the IHDR chunk. Returns null for non-PNG or
114
- * truncated files. JPEG/WebP/GIF support deferred most deskwork
115
- * scrapbook images are screenshots / icons (PNG) and the meta is purely
116
- * informational, so the empty-string fallback is acceptable for other
117
- * formats.
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 < 24)
126
+ if (buf.length < 12)
121
127
  return null;
122
- if (buf[0] !== 0x89 || buf[1] !== 0x50 || buf[2] !== 0x4e || buf[3] !== 0x47)
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
- return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };
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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"}
@@ -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 PNG dimensions from the IHDR chunk. Returns null for non-PNG or
122
- * truncated files. JPEG/WebP/GIF support deferred most deskwork
123
- * scrapbook images are screenshots / icons (PNG) and the meta is purely
124
- * informational, so the empty-string fallback is acceptable for other
125
- * formats.
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 < 24) return null;
129
- if (buf[0] !== 0x89 || buf[1] !== 0x50 || buf[2] !== 0x4e || buf[3] !== 0x47) return null;
130
- return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };
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>