@deskwork/studio 0.12.1 → 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 (131) hide show
  1. package/dist/components/scrapbook-item.d.ts +9 -1
  2. package/dist/components/scrapbook-item.d.ts.map +1 -1
  3. package/dist/components/scrapbook-item.js +11 -2
  4. package/dist/components/scrapbook-item.js.map +1 -1
  5. package/dist/data/glossary.json +62 -0
  6. package/dist/lib/glossary-helper.d.ts +16 -0
  7. package/dist/lib/glossary-helper.d.ts.map +1 -0
  8. package/dist/lib/glossary-helper.js +26 -0
  9. package/dist/lib/glossary-helper.js.map +1 -0
  10. package/dist/pages/chrome.d.ts +24 -13
  11. package/dist/pages/chrome.d.ts.map +1 -1
  12. package/dist/pages/chrome.js +25 -24
  13. package/dist/pages/chrome.js.map +1 -1
  14. package/dist/pages/chrome.ts +38 -27
  15. package/dist/pages/content-detail.d.ts.map +1 -1
  16. package/dist/pages/content-detail.js +6 -5
  17. package/dist/pages/content-detail.js.map +1 -1
  18. package/dist/pages/content-detail.ts +6 -5
  19. package/dist/pages/content.d.ts.map +1 -1
  20. package/dist/pages/content.js +4 -6
  21. package/dist/pages/content.js.map +1 -1
  22. package/dist/pages/content.ts +4 -6
  23. package/dist/pages/dashboard/affordances.d.ts +6 -1
  24. package/dist/pages/dashboard/affordances.d.ts.map +1 -1
  25. package/dist/pages/dashboard/affordances.js +17 -2
  26. package/dist/pages/dashboard/affordances.js.map +1 -1
  27. package/dist/pages/dashboard/affordances.ts +18 -2
  28. package/dist/pages/dashboard/header.js +2 -2
  29. package/dist/pages/dashboard/header.ts +2 -2
  30. package/dist/pages/dashboard/section.d.ts +2 -2
  31. package/dist/pages/dashboard/section.d.ts.map +1 -1
  32. package/dist/pages/dashboard/section.js +5 -5
  33. package/dist/pages/dashboard/section.js.map +1 -1
  34. package/dist/pages/dashboard/section.ts +9 -5
  35. package/dist/pages/dashboard.d.ts.map +1 -1
  36. package/dist/pages/dashboard.js +3 -2
  37. package/dist/pages/dashboard.js.map +1 -1
  38. package/dist/pages/dashboard.ts +3 -2
  39. package/dist/pages/entry-review/data.d.ts +54 -0
  40. package/dist/pages/entry-review/data.d.ts.map +1 -0
  41. package/dist/pages/entry-review/data.js +116 -0
  42. package/dist/pages/entry-review/data.js.map +1 -0
  43. package/dist/pages/entry-review/decision-strip.d.ts +37 -0
  44. package/dist/pages/entry-review/decision-strip.d.ts.map +1 -0
  45. package/dist/pages/entry-review/decision-strip.js +137 -0
  46. package/dist/pages/entry-review/decision-strip.js.map +1 -0
  47. package/dist/pages/entry-review/edit-panes.d.ts +12 -0
  48. package/dist/pages/entry-review/edit-panes.d.ts.map +1 -0
  49. package/dist/pages/entry-review/edit-panes.js +28 -0
  50. package/dist/pages/entry-review/edit-panes.js.map +1 -0
  51. package/dist/pages/entry-review/edit-toolbar.d.ts +20 -0
  52. package/dist/pages/entry-review/edit-toolbar.d.ts.map +1 -0
  53. package/dist/pages/entry-review/edit-toolbar.js +46 -0
  54. package/dist/pages/entry-review/edit-toolbar.js.map +1 -0
  55. package/dist/pages/entry-review/index.d.ts +50 -0
  56. package/dist/pages/entry-review/index.d.ts.map +1 -0
  57. package/dist/pages/entry-review/index.js +219 -0
  58. package/dist/pages/entry-review/index.js.map +1 -0
  59. package/dist/pages/entry-review/marginalia.d.ts +28 -0
  60. package/dist/pages/entry-review/marginalia.d.ts.map +1 -0
  61. package/dist/pages/entry-review/marginalia.js +67 -0
  62. package/dist/pages/entry-review/marginalia.js.map +1 -0
  63. package/dist/pages/entry-review/not-found.d.ts +9 -0
  64. package/dist/pages/entry-review/not-found.d.ts.map +1 -0
  65. package/dist/pages/entry-review/not-found.js +34 -0
  66. package/dist/pages/entry-review/not-found.js.map +1 -0
  67. package/dist/pages/entry-review/outline-drawer.d.ts +12 -0
  68. package/dist/pages/entry-review/outline-drawer.d.ts.map +1 -0
  69. package/dist/pages/entry-review/outline-drawer.js +28 -0
  70. package/dist/pages/entry-review/outline-drawer.js.map +1 -0
  71. package/dist/pages/entry-review/shortcuts.d.ts +14 -0
  72. package/dist/pages/entry-review/shortcuts.d.ts.map +1 -0
  73. package/dist/pages/entry-review/shortcuts.js +36 -0
  74. package/dist/pages/entry-review/shortcuts.js.map +1 -0
  75. package/dist/pages/entry-review/version-strip.d.ts +33 -0
  76. package/dist/pages/entry-review/version-strip.d.ts.map +1 -0
  77. package/dist/pages/entry-review/version-strip.js +81 -0
  78. package/dist/pages/entry-review/version-strip.js.map +1 -0
  79. package/dist/pages/entry-review.d.ts +6 -21
  80. package/dist/pages/entry-review.d.ts.map +1 -1
  81. package/dist/pages/entry-review.js +6 -144
  82. package/dist/pages/entry-review.js.map +1 -1
  83. package/dist/pages/entry-review.ts +11 -181
  84. package/dist/pages/html.d.ts +2 -0
  85. package/dist/pages/html.d.ts.map +1 -1
  86. package/dist/pages/html.js +2 -0
  87. package/dist/pages/html.js.map +1 -1
  88. package/dist/pages/html.ts +4 -0
  89. package/dist/pages/index.d.ts.map +1 -1
  90. package/dist/pages/index.js +6 -10
  91. package/dist/pages/index.js.map +1 -1
  92. package/dist/pages/index.ts +6 -10
  93. package/dist/pages/layout.d.ts.map +1 -1
  94. package/dist/pages/layout.js +6 -0
  95. package/dist/pages/layout.js.map +1 -1
  96. package/dist/pages/layout.ts +7 -0
  97. package/dist/pages/review-scrapbook-drawer.d.ts +7 -0
  98. package/dist/pages/review-scrapbook-drawer.d.ts.map +1 -1
  99. package/dist/pages/review-scrapbook-drawer.js +45 -6
  100. package/dist/pages/review-scrapbook-drawer.js.map +1 -1
  101. package/dist/pages/review-scrapbook-drawer.ts +50 -6
  102. package/dist/pages/review.d.ts.map +1 -1
  103. package/dist/pages/review.js +168 -41
  104. package/dist/pages/review.js.map +1 -1
  105. package/dist/pages/review.ts +192 -41
  106. package/dist/pages/scrapbook.d.ts +7 -14
  107. package/dist/pages/scrapbook.d.ts.map +1 -1
  108. package/dist/pages/scrapbook.js +548 -192
  109. package/dist/pages/scrapbook.js.map +1 -1
  110. package/dist/pages/scrapbook.ts +588 -221
  111. package/dist/pages/shortform-review.d.ts +32 -0
  112. package/dist/pages/shortform-review.d.ts.map +1 -0
  113. package/dist/pages/shortform-review.js +270 -0
  114. package/dist/pages/shortform-review.js.map +1 -0
  115. package/dist/pages/shortform-review.ts +342 -0
  116. package/dist/pages/shortform.js +1 -1
  117. package/dist/pages/shortform.js.map +1 -1
  118. package/dist/pages/shortform.ts +1 -1
  119. package/dist/routes/api.d.ts +8 -0
  120. package/dist/routes/api.d.ts.map +1 -1
  121. package/dist/routes/api.js +115 -0
  122. package/dist/routes/api.js.map +1 -1
  123. package/dist/routes/entry-annotation-body.d.ts +26 -0
  124. package/dist/routes/entry-annotation-body.d.ts.map +1 -0
  125. package/dist/routes/entry-annotation-body.js +152 -0
  126. package/dist/routes/entry-annotation-body.js.map +1 -0
  127. package/dist/server.d.ts +1 -1
  128. package/dist/server.d.ts.map +1 -1
  129. package/dist/server.js +56 -196
  130. package/dist/server.js.map +1 -1
  131. package/package.json +4 -4
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Marginalia column + stow chevron + edge pull tab for the entry-keyed
3
+ * press-check surface (Phase 34a — T10).
4
+ *
5
+ * Relocated from `pages/review.ts`. Per `.claude/rules/affordance-placement.md`,
6
+ * the toggle for "show / hide the margin-notes column" lives ON the
7
+ * marginalia component:
8
+ *
9
+ * - `.er-marginalia-stow` chevron INSIDE the marginalia head — visible
10
+ * only when marginalia is visible (it's inside `.er-marginalia`,
11
+ * which is `display: none` when stowed).
12
+ * - `.er-marginalia-tab` pull tab on the right edge of the viewport,
13
+ * visible only when stowed (CSS rule `body[data-marginalia="hidden"]
14
+ * .er-marginalia-tab { display: block }`).
15
+ *
16
+ * Both affordances + Shift+M dispatch through the same client-side
17
+ * `toggleMarginalia` handler. Mirrors the outline-drawer's pull-tab
18
+ * pattern so the project's affordance vocabulary stays consistent.
19
+ *
20
+ * The marginalia composer + saved-mark list are populated by
21
+ * `entry-review-client.ts` after page load — the server emits the
22
+ * shell + the empty composer; the client fetches annotations from
23
+ * `/api/dev/editorial-review/entry/<uuid>/annotations` and renders.
24
+ */
25
+ import { html, unsafe } from "../html.js";
26
+ export function renderMarginaliaTab() {
27
+ return unsafe(html `
28
+ <button class="er-marginalia-tab" data-action="toggle-marginalia" type="button" aria-pressed="true" aria-label="Show margin notes (Shift+M)" title="Show margin notes (Shift+M)">
29
+ <span class="er-marginalia-tab-glyph" aria-hidden="true">‹</span>
30
+ <span class="er-marginalia-tab-label">Notes</span>
31
+ </button>`);
32
+ }
33
+ export function renderMarginalia() {
34
+ return unsafe(html `
35
+ <aside class="er-marginalia" data-comments-sidebar aria-label="Margin notes">
36
+ <p class="er-marginalia-head">
37
+ <button class="er-marginalia-stow" data-action="toggle-marginalia" type="button" aria-pressed="false" aria-label="Hide margin notes (Shift+M)" title="Hide margin notes (Shift+M)">
38
+ <span aria-hidden="true">›</span>
39
+ </button>
40
+ <span class="er-marginalia-head-label">Margin notes</span>
41
+ </p>
42
+ <p class="er-marginalia-empty" data-sidebar-empty>Select text in the draft to leave a <em>margin note</em>.</p>
43
+ <section class="er-marginalia-composer" data-comment-composer hidden aria-label="New margin note">
44
+ <p class="er-marginalia-composer-head">New mark</p>
45
+ <div class="er-marginalia-composer-quote" data-composer-quote></div>
46
+ <label class="er-marginalia-composer-label" for="comment-category">Mark as</label>
47
+ <select id="comment-category" class="er-marginalia-composer-select" data-comment-category>
48
+ <option value="other" selected>other</option>
49
+ <option value="voice-drift">voice-drift</option>
50
+ <option value="missing-receipt">missing-receipt</option>
51
+ <option value="tutorial-framing">tutorial-framing</option>
52
+ <option value="saas-vocabulary">saas-vocabulary</option>
53
+ <option value="fake-authority">fake-authority</option>
54
+ <option value="structural">structural</option>
55
+ </select>
56
+ <label class="er-marginalia-composer-label" for="comment-text">Note</label>
57
+ <textarea id="comment-text" class="er-marginalia-composer-textarea" data-comment-text rows="4"
58
+ placeholder="What needs attention here?"></textarea>
59
+ <div class="er-marginalia-composer-actions">
60
+ <button type="button" class="er-btn er-btn-small" data-action="cancel-comment">Cancel</button>
61
+ <button type="button" class="er-btn er-btn-small er-btn-primary" data-action="submit-comment">Leave mark</button>
62
+ </div>
63
+ </section>
64
+ <ol class="er-marginalia-list" data-sidebar-list></ol>
65
+ </aside>`);
66
+ }
67
+ //# sourceMappingURL=marginalia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marginalia.js","sourceRoot":"","sources":["../../../src/pages/entry-review/marginalia.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,IAAI,CAAA;;;;cAIN,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aA+BP,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 404 shell for the entry-keyed press-check surface (Phase 34a Layer 2).
3
+ *
4
+ * Carries the folio chrome so the cross-page nav stays consistent with
5
+ * every other surface (folio-cross-page.test.ts asserts every reachable
6
+ * URL renders the er-folio strip).
7
+ */
8
+ export declare function renderEntryNotFound(entryId: string, reason: string): string;
9
+ //# sourceMappingURL=not-found.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/not-found.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAsB3E"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 404 shell for the entry-keyed press-check surface (Phase 34a Layer 2).
3
+ *
4
+ * Carries the folio chrome so the cross-page nav stays consistent with
5
+ * every other surface (folio-cross-page.test.ts asserts every reachable
6
+ * URL renders the er-folio strip).
7
+ */
8
+ import { html, unsafe } from "../html.js";
9
+ import { layout } from "../layout.js";
10
+ import { renderEditorialFolio } from "../chrome.js";
11
+ export function renderEntryNotFound(entryId, reason) {
12
+ const folio = renderEditorialFolio('longform', `longform · ${entryId}`);
13
+ const body = html `
14
+ <div data-review-ui="entry-review-missing" class="er-review-shell">
15
+ ${unsafe(folio.__raw)}
16
+ <main class="er-entry-shell er-entry-shell--missing">
17
+ <h1>Entry not found</h1>
18
+ <p>No sidecar matched <code>${entryId}</code>.</p>
19
+ <p class="er-entry-detail">${reason}</p>
20
+ <p><a href="/dev/editorial-studio">Back to the studio</a></p>
21
+ </main>
22
+ </div>`;
23
+ return layout({
24
+ title: 'Entry not found — dev',
25
+ cssHrefs: [
26
+ '/static/css/editorial-review.css',
27
+ '/static/css/editorial-nav.css',
28
+ '/static/css/entry-review.css',
29
+ ],
30
+ bodyHtml: body,
31
+ scriptModules: [],
32
+ });
33
+ }
34
+ //# sourceMappingURL=not-found.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found.js","sourceRoot":"","sources":["../../../src/pages/entry-review/not-found.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,MAAc;IACjE,MAAM,KAAK,GAAG,oBAAoB,CAAC,UAAU,EAAE,cAAc,OAAO,EAAE,CAAC,CAAC;IACxE,MAAM,IAAI,GAAG,IAAI,CAAA;;QAEX,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;;;sCAGW,OAAO;qCACR,MAAM;;;WAGhC,CAAC;IACV,OAAO,MAAM,CAAC;QACZ,KAAK,EAAE,uBAAuB;QAC9B,QAAQ,EAAE;YACR,kCAAkC;YAClC,+BAA+B;YAC/B,8BAA8B;SAC/B;QACD,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,EAAE;KAClB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Outline drawer for the entry-keyed press-check surface (Phase 34a — T9).
3
+ *
4
+ * Relocated from `pages/review.ts:renderOutlineDrawer`. Conditional render
5
+ * when the entry's body markdown carries a `## Outline` section (extracted
6
+ * via `splitOutline`). The pull-tab on the left edge mirrors the marginalia
7
+ * tab pattern on the right edge; the drawer is read-only and links to
8
+ * `/deskwork:iterate --kind outline` for editing.
9
+ */
10
+ import { type RawHtml } from '../html.ts';
11
+ export declare function renderOutlineDrawer(outlineHtml: string): RawHtml;
12
+ //# sourceMappingURL=outline-drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline-drawer.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/outline-drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAgBhE"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Outline drawer for the entry-keyed press-check surface (Phase 34a — T9).
3
+ *
4
+ * Relocated from `pages/review.ts:renderOutlineDrawer`. Conditional render
5
+ * when the entry's body markdown carries a `## Outline` section (extracted
6
+ * via `splitOutline`). The pull-tab on the left edge mirrors the marginalia
7
+ * tab pattern on the right edge; the drawer is read-only and links to
8
+ * `/deskwork:iterate --kind outline` for editing.
9
+ */
10
+ import { html, unsafe } from "../html.js";
11
+ export function renderOutlineDrawer(outlineHtml) {
12
+ const hidden = outlineHtml ? '' : ' hidden';
13
+ return unsafe(html `
14
+ <button class="er-outline-tab" data-outline-tab type="button" aria-label="Show outline"${unsafe(hidden)}>
15
+ <span class="er-outline-tab-label">Outline</span>
16
+ </button>
17
+ <aside class="er-outline-drawer" data-outline-drawer aria-label="Outline reference" hidden>
18
+ <header class="er-outline-drawer-head">
19
+ <span class="er-outline-drawer-kicker">Briefing sheet</span>
20
+ <button type="button" class="er-outline-drawer-close" data-outline-close aria-label="Close outline (O or Esc)">×</button>
21
+ </header>
22
+ <div class="er-outline-drawer-body" data-outline-drawer-body>${unsafe(outlineHtml)}</div>
23
+ <footer class="er-outline-drawer-foot">
24
+ <span>Read-only · edit via <code>/deskwork:iterate --kind outline</code></span>
25
+ </footer>
26
+ </aside>`);
27
+ }
28
+ //# sourceMappingURL=outline-drawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline-drawer.js","sourceRoot":"","sources":["../../../src/pages/entry-review/outline-drawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,mBAAmB,CAAC,WAAmB;IACrD,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAA;6FACyE,MAAM,CAAC,MAAM,CAAC;;;;;;;;qEAQtC,MAAM,CAAC,WAAW,CAAC;;;;aAI3E,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Keyboard shortcuts overlay for the entry-keyed press-check surface
3
+ * (Phase 34a — T13 helper).
4
+ *
5
+ * Relocated from `pages/review.ts:renderShortcutsOverlay`. Triggered by
6
+ * `?` (or Shift+/) and the strip's `?` button. Mirrors the destructive-
7
+ * shortcut UX from the legacy surface verbatim — bare-letter double-tap
8
+ * with no Cmd/Ctrl modifier (#108). On the entry-keyed surface, `r r`
9
+ * (reject) is shown for completeness but the underlying button is
10
+ * disabled until reject semantics land — see issue #173.
11
+ */
12
+ import { type RawHtml } from '../html.ts';
13
+ export declare function renderShortcutsOverlay(): RawHtml;
14
+ //# sourceMappingURL=shortcuts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAgB,sBAAsB,IAAI,OAAO,CAsBhD"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Keyboard shortcuts overlay for the entry-keyed press-check surface
3
+ * (Phase 34a — T13 helper).
4
+ *
5
+ * Relocated from `pages/review.ts:renderShortcutsOverlay`. Triggered by
6
+ * `?` (or Shift+/) and the strip's `?` button. Mirrors the destructive-
7
+ * shortcut UX from the legacy surface verbatim — bare-letter double-tap
8
+ * with no Cmd/Ctrl modifier (#108). On the entry-keyed surface, `r r`
9
+ * (reject) is shown for completeness but the underlying button is
10
+ * disabled until reject semantics land — see issue #173.
11
+ */
12
+ import { html, unsafe } from "../html.js";
13
+ export function renderShortcutsOverlay() {
14
+ return unsafe(html `
15
+ <div class="er-shortcuts" data-shortcuts-overlay hidden role="dialog" aria-modal="true" aria-label="Keyboard shortcuts">
16
+ <div class="er-shortcuts-backdrop" data-shortcuts-backdrop></div>
17
+ <div class="er-shortcuts-panel">
18
+ <h2>Keyboard</h2>
19
+ <dl>
20
+ <dt><kbd>e</kbd> / dbl-click</dt><dd>toggle edit mode</dd>
21
+ <dt>select text</dt><dd>leave a margin note</dd>
22
+ <dt><kbd>⌘</kbd><kbd>↵</kbd> / <kbd>ctrl</kbd><kbd>↵</kbd></dt><dd>save margin note (in composer)</dd>
23
+ <dt><kbd>a</kbd> <kbd>a</kbd></dt><dd>approve <em>— press twice within 500ms; first press arms, second fires</em></dd>
24
+ <dt><kbd>i</kbd> <kbd>i</kbd></dt><dd>iterate <em>— press twice within 500ms</em></dd>
25
+ <dt><kbd>r</kbd> <kbd>r</kbd></dt><dd>reject <em>— pending design (#173)</em></dd>
26
+ <dt><kbd>j</kbd> / <kbd>k</kbd></dt><dd>next / previous margin note</dd>
27
+ <dt><kbd>shift</kbd><kbd>F</kbd></dt><dd>focus mode <em>(edit mode only)</em></dd>
28
+ <dt><kbd>shift</kbd><kbd>M</kbd></dt><dd>show / hide margin notes column <em>— or click the chevron in the head when visible, or the pull tab on the right edge when stowed</em></dd>
29
+ <dt><kbd>?</kbd></dt><dd>this panel</dd>
30
+ <dt><kbd>esc</kbd></dt><dd>close / cancel composer</dd>
31
+ </dl>
32
+ <p class="er-shortcuts-footer">Press <kbd>?</kbd> anytime.</p>
33
+ </div>
34
+ </div>`);
35
+ }
36
+ //# sourceMappingURL=shortcuts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shortcuts.js","sourceRoot":"","sources":["../../../src/pages/entry-review/shortcuts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,sBAAsB;IACpC,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;WAoBT,CAAC,CAAC;AACb,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Version strip for the entry-keyed press-check surface (Phase 34a — T6).
3
+ *
4
+ * Renders one chip per recorded iteration of this entry. Clicking a chip
5
+ * navigates to `?v=<n>` against the current URL — the renderer then
6
+ * shows the historical markdown captured in the journal at that version.
7
+ *
8
+ * Differs from the legacy workflow-keyed strip:
9
+ * - Source of truth is `listEntryIterations(projectRoot, entryId)`, not
10
+ * `readVersions(workflowId)`.
11
+ * - Iteration "version" numbers are per-stage, so a given entry can
12
+ * legitimately have v1 in Outlining and v1 in Drafting. The chip
13
+ * label includes the stage prefix when more than one stage is
14
+ * represented to avoid an ambiguous "v1 / v1" sequence.
15
+ * - The "current" chip is whichever iteration matches the entry's
16
+ * current stage + iteration count from the sidecar
17
+ * (`entry.iterationByStage[entry.currentStage]`).
18
+ */
19
+ import type { IterationListing } from '@deskwork/core/iterate/history';
20
+ import type { Entry } from '@deskwork/core/schema/entry';
21
+ import { type RawHtml } from '../html.ts';
22
+ interface VersionStripOptions {
23
+ readonly iterations: readonly IterationListing[];
24
+ readonly entry: Entry;
25
+ /** When set, this (version, stage) pair's chip is highlighted as
26
+ * active (historical view). Stage qualification is required because
27
+ * per-stage iteration counters can collide (e.g. Ideas v1 + Drafting v1). */
28
+ readonly historicalVersion: number | null;
29
+ readonly historicalStage: string | null;
30
+ }
31
+ export declare function renderVersionsStrip(opts: VersionStripOptions): RawHtml;
32
+ export {};
33
+ //# sourceMappingURL=version-strip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-strip.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/version-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,UAAU,mBAAmB;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACjD,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB;;kFAE8E;IAC9E,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC;AAsCD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAgCtE"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Version strip for the entry-keyed press-check surface (Phase 34a — T6).
3
+ *
4
+ * Renders one chip per recorded iteration of this entry. Clicking a chip
5
+ * navigates to `?v=<n>` against the current URL — the renderer then
6
+ * shows the historical markdown captured in the journal at that version.
7
+ *
8
+ * Differs from the legacy workflow-keyed strip:
9
+ * - Source of truth is `listEntryIterations(projectRoot, entryId)`, not
10
+ * `readVersions(workflowId)`.
11
+ * - Iteration "version" numbers are per-stage, so a given entry can
12
+ * legitimately have v1 in Outlining and v1 in Drafting. The chip
13
+ * label includes the stage prefix when more than one stage is
14
+ * represented to avoid an ambiguous "v1 / v1" sequence.
15
+ * - The "current" chip is whichever iteration matches the entry's
16
+ * current stage + iteration count from the sidecar
17
+ * (`entry.iterationByStage[entry.currentStage]`).
18
+ */
19
+ import { html, unsafe } from "../html.js";
20
+ function currentStageVersion(entry) {
21
+ const v = entry.iterationByStage[entry.currentStage];
22
+ return typeof v === 'number' ? v : null;
23
+ }
24
+ function uniqueStages(iterations) {
25
+ const out = new Set();
26
+ for (const it of iterations)
27
+ out.add(it.stage);
28
+ return out;
29
+ }
30
+ /**
31
+ * Determine which iteration the on-disk artifact corresponds to. The
32
+ * preferred signal is `entry.iterationByStage[entry.currentStage]` —
33
+ * the sidecar's per-stage iteration counter. When the current stage
34
+ * has no recorded iterations (typical for Final / Published entries
35
+ * whose history was recorded under Drafting), fall back to the most
36
+ * recent iteration overall — that's the closest match for "what's on
37
+ * disk right now."
38
+ */
39
+ function activeIteration(iterations, entry) {
40
+ if (iterations.length === 0)
41
+ return null;
42
+ const stageVersion = currentStageVersion(entry);
43
+ if (stageVersion !== null) {
44
+ const exact = iterations.find((it) => it.stage === entry.currentStage && it.versionNumber === stageVersion);
45
+ if (exact !== undefined)
46
+ return exact;
47
+ }
48
+ // Fall back to the latest iteration (iterations are time-ordered).
49
+ return iterations[iterations.length - 1] ?? null;
50
+ }
51
+ export function renderVersionsStrip(opts) {
52
+ const { iterations, entry, historicalVersion, historicalStage } = opts;
53
+ if (iterations.length === 0)
54
+ return unsafe('');
55
+ const stagesSeen = uniqueStages(iterations);
56
+ const showStage = stagesSeen.size > 1;
57
+ const active = activeIteration(iterations, entry);
58
+ const links = iterations.map((it) => {
59
+ // A chip is the active historical chip only when BOTH version
60
+ // number and stage match. Without stage qualification, Ideas v1
61
+ // and Drafting v1 would both light up.
62
+ const isHistorical = historicalVersion !== null &&
63
+ it.versionNumber === historicalVersion &&
64
+ historicalStage !== null &&
65
+ it.stage === historicalStage;
66
+ const isActive = isHistorical ||
67
+ (historicalVersion === null && active !== null &&
68
+ it.stage === active.stage && it.versionNumber === active.versionNumber);
69
+ const label = showStage
70
+ ? `${it.stage[0]}·v${it.versionNumber}`
71
+ : `v${it.versionNumber}`;
72
+ // URL carries both ?v= and ?stage= so the loader can disambiguate
73
+ // when the same version number appears under multiple stages.
74
+ const href = `?v=${it.versionNumber}&stage=${encodeURIComponent(it.stage)}`;
75
+ const cls = isActive ? 'active' : '';
76
+ const title = `${it.stage} version ${it.versionNumber} (${it.timestamp})`;
77
+ return html `<a href="${href}" class="${cls}" title="${title}">${label}</a>`;
78
+ }).join('');
79
+ return unsafe(html `<span class="er-strip-versions">${unsafe(links)}</span>`);
80
+ }
81
+ //# sourceMappingURL=version-strip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-strip.js","sourceRoot":"","sources":["../../../src/pages/entry-review/version-strip.ts"],"names":[],"mappings":"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"}
@@ -1,25 +1,10 @@
1
1
  /**
2
- * Entry-uuid keyed review surface — `/dev/editorial-review/entry/:entryId`.
2
+ * Entry-keyed press-check surface — `/dev/editorial-review/entry/:entryId`.
3
3
  *
4
- * Pipeline-redesign Task 35. The legacy `/dev/editorial-review/:slug`
5
- * (and its `:id` UUID variant) routes are workflow-uuid + calendar-entry
6
- * keyed. This sibling route is keyed by the *entry uuid* (the sidecar
7
- * id), uses the eight-stage entry model (Task 33/34), and renders the
8
- * minimal affordance set returned by `getAffordances(entry)`.
9
- *
10
- * The two surfaces coexist during the migration window. Once the
11
- * workflow-keyed routes are retired, this becomes the canonical review
12
- * surface; until then, the dashboard's per-row "review" links continue
13
- * to point at the legacy route.
14
- *
15
- * Rendering is intentionally minimal — the goal of Task 35 is the route
16
- * shape + affordance plumbing, not a fully-styled UI. Styling will land
17
- * once the affordance set stabilizes against real entries.
4
+ * The implementation lives in the `entry-review/` directory (one
5
+ * module per chrome component, each under the 500-line cap). This
6
+ * file re-exports the public render function so the existing
7
+ * `server.ts` import keeps working.
18
8
  */
19
- interface EntryReviewResult {
20
- status: 200 | 404;
21
- html: string;
22
- }
23
- export declare function renderEntryReviewPage(projectRoot: string, entryId: string): Promise<EntryReviewResult>;
24
- export {};
9
+ export { renderEntryReviewPage, type EntryReviewQuery, type EntryReviewResult, type EntryReviewIndexGetter, } from './entry-review/index.ts';
25
10
  //# sourceMappingURL=entry-review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-review.d.ts","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AA+IH,UAAU,iBAAiB;IACzB,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAgB5B"}
1
+ {"version":3,"file":"entry-review.d.ts","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,qBAAqB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,GAC5B,MAAM,yBAAyB,CAAC"}
@@ -1,148 +1,10 @@
1
1
  /**
2
- * Entry-uuid keyed review surface — `/dev/editorial-review/entry/:entryId`.
2
+ * Entry-keyed press-check surface — `/dev/editorial-review/entry/:entryId`.
3
3
  *
4
- * Pipeline-redesign Task 35. The legacy `/dev/editorial-review/:slug`
5
- * (and its `:id` UUID variant) routes are workflow-uuid + calendar-entry
6
- * keyed. This sibling route is keyed by the *entry uuid* (the sidecar
7
- * id), uses the eight-stage entry model (Task 33/34), and renders the
8
- * minimal affordance set returned by `getAffordances(entry)`.
9
- *
10
- * The two surfaces coexist during the migration window. Once the
11
- * workflow-keyed routes are retired, this becomes the canonical review
12
- * surface; until then, the dashboard's per-row "review" links continue
13
- * to point at the legacy route.
14
- *
15
- * Rendering is intentionally minimal — the goal of Task 35 is the route
16
- * shape + affordance plumbing, not a fully-styled UI. Styling will land
17
- * once the affordance set stabilizes against real entries.
4
+ * The implementation lives in the `entry-review/` directory (one
5
+ * module per chrome component, each under the 500-line cap). This
6
+ * file re-exports the public render function so the existing
7
+ * `server.ts` import keeps working.
18
8
  */
19
- import { resolveEntry } from "../lib/entry-resolver.js";
20
- import { getAffordances } from "../lib/stage-affordances.js";
21
- import { html, unsafe } from "./html.js";
22
- import { layout } from "./layout.js";
23
- const STAGE_PICKER_OPTIONS = [
24
- 'Ideas',
25
- 'Planned',
26
- 'Outlining',
27
- 'Drafting',
28
- 'Final',
29
- ];
30
- const CONTROL_LABELS = {
31
- save: 'Save',
32
- iterate: 'Iterate',
33
- approve: 'Approve',
34
- reject: 'Reject',
35
- 'historical-stage-dropdown': 'Historical stage',
36
- 'view-only': 'Read-only',
37
- 'fork-placeholder': 'Fork (coming)',
38
- 'induct-to': 'Induct to',
39
- };
40
- function renderControl(control, entry) {
41
- const label = CONTROL_LABELS[control] ?? control;
42
- if (control === 'induct-to') {
43
- const options = STAGE_PICKER_OPTIONS.map((s) => unsafe(html `<option value="${s}">${s}</option>`));
44
- return unsafe(html `
45
- <label class="er-entry-control er-entry-control--induct">
46
- <span class="er-entry-control-label">${label}</span>
47
- <select name="induct-to" data-entry-uuid="${entry.uuid}">
48
- ${options}
49
- </select>
50
- </label>`);
51
- }
52
- if (control === 'historical-stage-dropdown') {
53
- const stages = Object.keys(entry.iterationByStage);
54
- if (stages.length === 0) {
55
- return unsafe('');
56
- }
57
- const options = stages.map((s) => unsafe(html `<option value="${s}">${s}</option>`));
58
- return unsafe(html `
59
- <label class="er-entry-control er-entry-control--history">
60
- <span class="er-entry-control-label">${label}</span>
61
- <select name="history-stage" data-entry-uuid="${entry.uuid}">
62
- ${options}
63
- </select>
64
- </label>`);
65
- }
66
- if (control === 'view-only') {
67
- return unsafe(html `<span class="er-entry-control er-entry-control--readonly">${label}</span>`);
68
- }
69
- if (control === 'fork-placeholder') {
70
- return unsafe(html `<button class="er-entry-control er-entry-control--button" type="button" disabled data-control="fork">${label}</button>`);
71
- }
72
- return unsafe(html `<button class="er-entry-control er-entry-control--button" type="button" data-control="${control}" data-entry-uuid="${entry.uuid}">${label}</button>`);
73
- }
74
- function renderControls(entry, affordances) {
75
- const buttons = affordances.controls.map((c) => renderControl(c, entry));
76
- const className = affordances.mutable
77
- ? 'er-entry-controls er-entry-controls--mutable'
78
- : 'er-entry-controls er-entry-controls--readonly';
79
- return unsafe(html `<nav class="${className}" aria-label="Entry controls">${buttons}</nav>`);
80
- }
81
- function renderArtifact(body, mutable) {
82
- if (mutable) {
83
- return unsafe(html `
84
- <textarea class="er-entry-body" name="body" rows="24" data-mutable="true">${body}</textarea>`);
85
- }
86
- return unsafe(html `
87
- <pre class="er-entry-body er-entry-body--readonly" data-mutable="false">${body}</pre>`);
88
- }
89
- function renderEntryReview(entry, artifactBody, artifactPath, affordances) {
90
- const stageBadge = unsafe(html `<span class="er-entry-stage" data-stage="${entry.currentStage}">${entry.currentStage}</span>`);
91
- const priorBadge = entry.priorStage
92
- ? unsafe(html `<span class="er-entry-prior-stage">paused from ${entry.priorStage}</span>`)
93
- : '';
94
- const body = html `
95
- <main class="er-entry-shell" data-entry-uuid="${entry.uuid}">
96
- <header class="er-entry-head">
97
- <p class="er-entry-kicker">Editorial Review · entry</p>
98
- <h1 class="er-entry-title">${entry.title}</h1>
99
- <p class="er-entry-meta">
100
- ${stageBadge}
101
- ${priorBadge}
102
- <code class="er-entry-uuid">${entry.uuid}</code>
103
- </p>
104
- <p class="er-entry-artifact-path"><code>${artifactPath}</code></p>
105
- </header>
106
- ${renderControls(entry, affordances)}
107
- <section class="er-entry-artifact">
108
- ${renderArtifact(artifactBody, affordances.mutable)}
109
- </section>
110
- </main>`;
111
- return layout({
112
- title: `${entry.title} — entry review — dev`,
113
- cssHrefs: ['/static/css/editorial-review.css'],
114
- bodyAttrs: 'data-review-ui="entry-review"',
115
- bodyHtml: body,
116
- scriptModules: ['entry-review-client'],
117
- });
118
- }
119
- function renderNotFound(entryId, reason) {
120
- const body = html `
121
- <main class="er-entry-shell er-entry-shell--missing">
122
- <h1>Entry not found</h1>
123
- <p>No sidecar matched <code>${entryId}</code>.</p>
124
- <p class="er-entry-detail">${reason}</p>
125
- <p><a href="/dev/editorial-studio">Back to the studio</a></p>
126
- </main>`;
127
- return layout({
128
- title: 'Entry not found — dev',
129
- cssHrefs: ['/static/css/editorial-review.css'],
130
- bodyAttrs: 'data-review-ui="entry-review-missing"',
131
- bodyHtml: body,
132
- scriptModules: [],
133
- });
134
- }
135
- export async function renderEntryReviewPage(projectRoot, entryId) {
136
- let resolved;
137
- try {
138
- resolved = await resolveEntry(projectRoot, entryId);
139
- }
140
- catch (err) {
141
- const reason = err instanceof Error ? err.message : String(err);
142
- return { status: 404, html: renderNotFound(entryId, reason) };
143
- }
144
- const affordances = getAffordances(resolved.entry);
145
- const html = renderEntryReview(resolved.entry, resolved.artifactBody, resolved.artifactPath, affordances);
146
- return { status: 200, html };
147
- }
9
+ export { renderEntryReviewPage, } from "./entry-review/index.js";
148
10
  //# sourceMappingURL=entry-review.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-review.js","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entry-review.js","sourceRoot":"","sources":["../../src/pages/entry-review.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,qBAAqB,GAItB,MAAM,yBAAyB,CAAC"}