@deskwork/studio 0.17.0 → 0.18.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 (40) hide show
  1. package/dist/lib/entry-resolver.d.ts +30 -0
  2. package/dist/lib/entry-resolver.d.ts.map +1 -1
  3. package/dist/lib/entry-resolver.js +37 -2
  4. package/dist/lib/entry-resolver.js.map +1 -1
  5. package/dist/pages/dashboard/affordances.d.ts.map +1 -1
  6. package/dist/pages/dashboard/affordances.js +15 -5
  7. package/dist/pages/dashboard/affordances.js.map +1 -1
  8. package/dist/pages/dashboard/affordances.ts +15 -5
  9. package/dist/pages/dashboard/header.js +1 -1
  10. package/dist/pages/dashboard/header.ts +1 -1
  11. package/dist/pages/dashboard/section.d.ts.map +1 -1
  12. package/dist/pages/dashboard/section.js +23 -3
  13. package/dist/pages/dashboard/section.js.map +1 -1
  14. package/dist/pages/dashboard/section.ts +24 -3
  15. package/dist/pages/entry-review/decision-strip.d.ts.map +1 -1
  16. package/dist/pages/entry-review/decision-strip.js +4 -0
  17. package/dist/pages/entry-review/decision-strip.js.map +1 -1
  18. package/dist/pages/entry-review/edit-toolbar.d.ts +7 -8
  19. package/dist/pages/entry-review/edit-toolbar.d.ts.map +1 -1
  20. package/dist/pages/entry-review/edit-toolbar.js +16 -11
  21. package/dist/pages/entry-review/edit-toolbar.js.map +1 -1
  22. package/dist/pages/entry-review/index.d.ts.map +1 -1
  23. package/dist/pages/entry-review/index.js +14 -4
  24. package/dist/pages/entry-review/index.js.map +1 -1
  25. package/dist/pages/entry-review/mobile-bar.d.ts +62 -0
  26. package/dist/pages/entry-review/mobile-bar.d.ts.map +1 -0
  27. package/dist/pages/entry-review/mobile-bar.js +155 -0
  28. package/dist/pages/entry-review/mobile-bar.js.map +1 -0
  29. package/dist/pages/entry-review/outline-drawer.d.ts +17 -7
  30. package/dist/pages/entry-review/outline-drawer.d.ts.map +1 -1
  31. package/dist/pages/entry-review/outline-drawer.js +58 -14
  32. package/dist/pages/entry-review/outline-drawer.js.map +1 -1
  33. package/dist/pages/layout.js +1 -1
  34. package/dist/pages/layout.ts +1 -1
  35. package/dist/routes/api.d.ts.map +1 -1
  36. package/dist/routes/api.js +63 -0
  37. package/dist/routes/api.js.map +1 -1
  38. package/dist/server.js +1 -1
  39. package/dist/server.js.map +1 -1
  40. package/package.json +2 -2
@@ -30,6 +30,36 @@ interface ResolveResult {
30
30
  artifactBody: string;
31
31
  artifactPath: string;
32
32
  }
33
+ /**
34
+ * Resolve the canonical document path for an entry. Used by both the
35
+ * read path (`resolveEntry`) and the write path (the Save route's
36
+ * `writeEntryBody`) so both surfaces address the same file.
37
+ *
38
+ * Exported so the Save route (#174) can resolve the write target with
39
+ * the SAME rules the read path uses; duplicating the resolution
40
+ * silently couples the surfaces to two different code paths and lets
41
+ * them drift.
42
+ */
43
+ export declare function resolveIndexPath(projectRoot: string, entry: Entry): string;
33
44
  export declare function resolveEntry(projectRoot: string, uuid: string): Promise<ResolveResult>;
45
+ /**
46
+ * Atomically write `markdown` to the entry's canonical document path.
47
+ *
48
+ * Implements the Save semantics from issue #174 — the studio is the
49
+ * dumb file-write surface for in-browser edits. State-machine work
50
+ * (versioning, journal records, in-review flips) belongs to
51
+ * `/deskwork:iterate`, NOT to this function. Save and Iterate are
52
+ * orthogonal: an operator can Save many times before pinning a version.
53
+ *
54
+ * Atomic-write pattern (write-tmp + rename) mirrors `writeSidecar` and
55
+ * the snapshot helper. PID is embedded in the tmp filename so two
56
+ * concurrent writers don't clobber each other's tmp state.
57
+ *
58
+ * Returns the absolute path written so the caller can surface it to
59
+ * the operator (the Save route uses this for the response body).
60
+ */
61
+ export declare function writeEntryBody(projectRoot: string, uuid: string, markdown: string): Promise<{
62
+ writtenPath: string;
63
+ }>;
34
64
  export {};
35
65
  //# sourceMappingURL=entry-resolver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEzD,UAAU,aAAa;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAqBD,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAK5F"}
1
+ {"version":3,"file":"entry-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEzD,UAAU,aAAa;IACrB,KAAK,EAAE,KAAK,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,CAiB1E;AAED,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAK5F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAQlC"}
@@ -24,12 +24,22 @@
24
24
  * plan.md, Outlining → outline.md, Drafting/Final/Published →
25
25
  * index.md). That routing has been retired — see Issue #222.
26
26
  */
27
- import { readFile } from 'node:fs/promises';
27
+ import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
28
28
  import { existsSync } from 'node:fs';
29
29
  import { basename, dirname, join } from 'node:path';
30
30
  import { readSidecar } from '@deskwork/core/sidecar';
31
31
  import { getContentDir } from '@deskwork/core/config';
32
- function resolveIndexPath(projectRoot, entry) {
32
+ /**
33
+ * Resolve the canonical document path for an entry. Used by both the
34
+ * read path (`resolveEntry`) and the write path (the Save route's
35
+ * `writeEntryBody`) so both surfaces address the same file.
36
+ *
37
+ * Exported so the Save route (#174) can resolve the write target with
38
+ * the SAME rules the read path uses; duplicating the resolution
39
+ * silently couples the surfaces to two different code paths and lets
40
+ * them drift.
41
+ */
42
+ export function resolveIndexPath(projectRoot, entry) {
33
43
  if (entry.artifactPath) {
34
44
  const absArtifact = join(projectRoot, entry.artifactPath);
35
45
  // Strip the scrapbook segment for legacy `<dir>/scrapbook/<file>.md`
@@ -53,4 +63,29 @@ export async function resolveEntry(projectRoot, uuid) {
53
63
  const artifactBody = await readFile(artifactPath, 'utf8');
54
64
  return { entry, artifactBody, artifactPath };
55
65
  }
66
+ /**
67
+ * Atomically write `markdown` to the entry's canonical document path.
68
+ *
69
+ * Implements the Save semantics from issue #174 — the studio is the
70
+ * dumb file-write surface for in-browser edits. State-machine work
71
+ * (versioning, journal records, in-review flips) belongs to
72
+ * `/deskwork:iterate`, NOT to this function. Save and Iterate are
73
+ * orthogonal: an operator can Save many times before pinning a version.
74
+ *
75
+ * Atomic-write pattern (write-tmp + rename) mirrors `writeSidecar` and
76
+ * the snapshot helper. PID is embedded in the tmp filename so two
77
+ * concurrent writers don't clobber each other's tmp state.
78
+ *
79
+ * Returns the absolute path written so the caller can surface it to
80
+ * the operator (the Save route uses this for the response body).
81
+ */
82
+ export async function writeEntryBody(projectRoot, uuid, markdown) {
83
+ const entry = await readSidecar(projectRoot, uuid);
84
+ const writtenPath = resolveIndexPath(projectRoot, entry);
85
+ await mkdir(dirname(writtenPath), { recursive: true });
86
+ const tmpPath = `${writtenPath}.${process.pid}.tmp`;
87
+ await writeFile(tmpPath, markdown);
88
+ await rename(tmpPath, writtenPath);
89
+ return { writtenPath };
90
+ }
56
91
  //# sourceMappingURL=entry-resolver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-resolver.js","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAStD,SAAS,gBAAgB,CAAC,WAAmB,EAAE,KAAY;IACzD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1D,qEAAqE;QACrE,yDAAyD;QACzD,MAAM,GAAG,GACP,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,WAAW;YAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACxC,kEAAkE;QAClE,kEAAkE;QAClE,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAY;IAClE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC/C,CAAC"}
1
+ {"version":3,"file":"entry-resolver.js","sourceRoot":"","sources":["../../src/lib/entry-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAStD;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,KAAY;IAChE,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;QAC1D,qEAAqE;QACrE,yDAAyD;QACzD,MAAM,GAAG,GACP,QAAQ,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,KAAK,WAAW;YAC5C,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;YAC/B,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACxC,kEAAkE;QAClE,kEAAkE;QAClE,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAC5C,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,IAAY;IAClE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC/C,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,WAAmB,EACnB,IAAY,EACZ,QAAgB;IAEhB,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,GAAG,WAAW,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IACpD,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnC,MAAM,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IACnC,OAAO,EAAE,WAAW,EAAE,CAAC;AACzB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"affordances.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAS,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAQ7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAK9E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE7D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAkD3E"}
1
+ {"version":3,"file":"affordances.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,KAAK,EAAE,KAAK,EAAS,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAQ7E;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,GAAG,OAAO,CAK9E;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE7D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CA4D3E"}
@@ -83,11 +83,21 @@ export function renderRowActions(entry, defaultSite) {
83
83
  data-copy="/deskwork:iterate ${entry.slug}"
84
84
  title="operator clicked Iterate — run the iterate skill in Claude Code">iterate →</button>`);
85
85
  }
86
- if (entry.reviewState === 'approved') {
87
- buttons.push(html `<button class="er-btn er-btn-small er-btn-approve er-copy-btn" type="button"
88
- data-copy="/deskwork:approve ${entry.slug}"
89
- title="approved graduate to the next stage">approve →</button>`);
90
- }
86
+ // Approve (#244) unconditional on active-pipeline rows. Mirrors
87
+ // the review-surface decision strip (Approve is always visible
88
+ // there); the dashboard previously gated this button on
89
+ // `reviewState === 'approved'`, which is a transient state most
90
+ // rows never carry, leaving the button effectively invisible. The
91
+ // operator should be able to advance any active-pipeline entry
92
+ // from the dashboard without first opening the review surface.
93
+ buttons.push(html `<button class="er-btn er-btn-small er-btn-approve er-copy-btn" type="button"
94
+ data-copy="/deskwork:approve ${entry.slug}"
95
+ title="advance this entry to the next stage">approve →</button>`);
96
+ // Cancel (#242) — pull this entry off-pipeline. Same clipboard
97
+ // routing as approve / iterate; the skill mutates sidecar + journal.
98
+ buttons.push(html `<button class="er-btn er-btn-small er-btn-reject er-copy-btn" type="button"
99
+ data-copy="/deskwork:cancel ${entry.slug}"
100
+ title="pull this entry off-pipeline (Cancelled). Reversible via /deskwork:induct.">cancel ⊘</button>`);
91
101
  }
92
102
  else if (stage === 'Published') {
93
103
  buttons.push(html `<a class="er-btn er-btn-small" href="${reviewLink}"
@@ -1 +1 @@
1
- {"version":3,"file":"affordances.js","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"affordances.js","sourceRoot":"","sources":["../../../src/pages/dashboard/affordances.ts"],"names":[],"mappings":"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"}
@@ -90,11 +90,21 @@ export function renderRowActions(entry: Entry, defaultSite: string): RawHtml {
90
90
  data-copy="/deskwork:iterate ${entry.slug}"
91
91
  title="operator clicked Iterate — run the iterate skill in Claude Code">iterate →</button>`);
92
92
  }
93
- if (entry.reviewState === 'approved') {
94
- buttons.push(html`<button class="er-btn er-btn-small er-btn-approve er-copy-btn" type="button"
95
- data-copy="/deskwork:approve ${entry.slug}"
96
- title="approved graduate to the next stage">approve →</button>`);
97
- }
93
+ // Approve (#244) unconditional on active-pipeline rows. Mirrors
94
+ // the review-surface decision strip (Approve is always visible
95
+ // there); the dashboard previously gated this button on
96
+ // `reviewState === 'approved'`, which is a transient state most
97
+ // rows never carry, leaving the button effectively invisible. The
98
+ // operator should be able to advance any active-pipeline entry
99
+ // from the dashboard without first opening the review surface.
100
+ buttons.push(html`<button class="er-btn er-btn-small er-btn-approve er-copy-btn" type="button"
101
+ data-copy="/deskwork:approve ${entry.slug}"
102
+ title="advance this entry to the next stage">approve →</button>`);
103
+ // Cancel (#242) — pull this entry off-pipeline. Same clipboard
104
+ // routing as approve / iterate; the skill mutates sidecar + journal.
105
+ buttons.push(html`<button class="er-btn er-btn-small er-btn-reject er-copy-btn" type="button"
106
+ data-copy="/deskwork:cancel ${entry.slug}"
107
+ title="pull this entry off-pipeline (Cancelled). Reversible via /deskwork:induct.">cancel ⊘</button>`);
98
108
  } else if (stage === 'Published') {
99
109
  buttons.push(html`<a class="er-btn er-btn-small" href="${reviewLink}"
100
110
  title="read-only review surface for the published entry">view →</a>`);
@@ -34,7 +34,7 @@ export function renderHeader(data, projectRoot, now) {
34
34
  const issueNum = String(data.entries.length).padStart(2, '0');
35
35
  const issueDate = `${now.getDate()} ${MONTH_NAMES[now.getMonth()]} ${now.getFullYear()}`;
36
36
  return unsafe(html `
37
- <header class="er-pagehead er-pagehead--centered">
37
+ <header class="er-pagehead er-pagehead--centered er-pagehead--dashboard">
38
38
  <p class="er-pagehead__kicker">
39
39
  Vol. ${volume} &middot; № ${issueNum}
40
40
  </p>
@@ -42,7 +42,7 @@ export function renderHeader(
42
42
  const issueNum = String(data.entries.length).padStart(2, '0');
43
43
  const issueDate = `${now.getDate()} ${MONTH_NAMES[now.getMonth()]} ${now.getFullYear()}`;
44
44
  return unsafe(html`
45
- <header class="er-pagehead er-pagehead--centered">
45
+ <header class="er-pagehead er-pagehead--centered er-pagehead--dashboard">
46
46
  <p class="er-pagehead__kicker">
47
47
  Vol. ${volume} &middot; № ${issueNum}
48
48
  </p>
@@ -1 +1 @@
1
- {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AA6BhE;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAgCnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,SAAS,KAAK,EAAE,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CA0BT;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAWvD"}
1
+ {"version":3,"file":"section.d.ts","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AA6BhE;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CA8BnF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,SAAS,KAAK,EAAE,EACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CA0BT;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,IAAI,OAAO,CAWvD"}
@@ -63,9 +63,7 @@ export function renderRow(entry, index, defaultSite) {
63
63
  <time class="er-calendar-meta er-calendar-meta-updated" data-format="date"
64
64
  datetime="${entry.updatedAt}" title="${entry.updatedAt}">${formatDate(entry.updatedAt)}</time>
65
65
  </div>
66
- <span class="er-calendar-status"><a href="${reviewLink}"
67
- title="open the review surface for ${entry.slug}"
68
- class="er-stamp-link">${renderReviewStateBadge(entry.reviewState)}</a></span>
66
+ ${renderStatusCell(entry, reviewLink)}
69
67
  ${renderRowActions(entry, defaultSite)}
70
68
  </div>
71
69
  </div>`);
@@ -127,4 +125,26 @@ function formatDate(iso) {
127
125
  // <span title="...">.
128
126
  return iso.slice(0, 10);
129
127
  }
128
+ /**
129
+ * Render the status column for one row.
130
+ *
131
+ * #243 — when the entry has no reviewState, render an EMPTY span (no
132
+ * `<a>`, no em-dash placeholder, no stamp box). Operators were reading
133
+ * the previous box-with-em-dash as a button-like action; the slug-link
134
+ * in the row body already routes to the review surface, so the badge
135
+ * slot only carries information when there's a real reviewState.
136
+ *
137
+ * Grid alignment is preserved because CSS Grid auto-sizes columns from
138
+ * the widest cell — empty cells leave their slot blank without breaking
139
+ * sibling alignment.
140
+ */
141
+ function renderStatusCell(entry, reviewLink) {
142
+ if (entry.reviewState === undefined) {
143
+ return unsafe('<span class="er-calendar-status" aria-hidden="true"></span>');
144
+ }
145
+ return unsafe(html `
146
+ <span class="er-calendar-status"><a href="${reviewLink}"
147
+ title="open the review surface for ${entry.slug}"
148
+ class="er-stamp-link">${renderReviewStateBadge(entry.reviewState)}</a></span>`);
149
+ }
130
150
  //# sourceMappingURL=section.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"section.js","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"section.js","sourceRoot":"","sources":["../../../src/pages/dashboard/section.ts"],"names":[],"mappings":"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"}
@@ -74,9 +74,7 @@ export function renderRow(entry: Entry, index: number, defaultSite: string): Raw
74
74
  <time class="er-calendar-meta er-calendar-meta-updated" data-format="date"
75
75
  datetime="${entry.updatedAt}" title="${entry.updatedAt}">${formatDate(entry.updatedAt)}</time>
76
76
  </div>
77
- <span class="er-calendar-status"><a href="${reviewLink}"
78
- title="open the review surface for ${entry.slug}"
79
- class="er-stamp-link">${renderReviewStateBadge(entry.reviewState)}</a></span>
77
+ ${renderStatusCell(entry, reviewLink)}
80
78
  ${renderRowActions(entry, defaultSite)}
81
79
  </div>
82
80
  </div>`);
@@ -147,3 +145,26 @@ function formatDate(iso: string): string {
147
145
  // <span title="...">.
148
146
  return iso.slice(0, 10);
149
147
  }
148
+
149
+ /**
150
+ * Render the status column for one row.
151
+ *
152
+ * #243 — when the entry has no reviewState, render an EMPTY span (no
153
+ * `<a>`, no em-dash placeholder, no stamp box). Operators were reading
154
+ * the previous box-with-em-dash as a button-like action; the slug-link
155
+ * in the row body already routes to the review surface, so the badge
156
+ * slot only carries information when there's a real reviewState.
157
+ *
158
+ * Grid alignment is preserved because CSS Grid auto-sizes columns from
159
+ * the widest cell — empty cells leave their slot blank without breaking
160
+ * sibling alignment.
161
+ */
162
+ function renderStatusCell(entry: Entry, reviewLink: string): RawHtml {
163
+ if (entry.reviewState === undefined) {
164
+ return unsafe('<span class="er-calendar-status" aria-hidden="true"></span>');
165
+ }
166
+ return unsafe(html`
167
+ <span class="er-calendar-status"><a href="${reviewLink}"
168
+ title="open the review surface for ${entry.slug}"
169
+ class="er-stamp-link">${renderReviewStateBadge(entry.reviewState)}</a></span>`);
170
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"decision-strip.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAiKxD,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC;;yDAEqD;IACrD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAMvE"}
1
+ {"version":3,"file":"decision-strip.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAwKxD,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC;;yDAEqD;IACrD,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAMvE"}
@@ -101,6 +101,10 @@ function renderMutableButtons({ entry, historical }) {
101
101
  buttons.push(shortcutChipWrap(html `<button class="er-btn er-btn-small" data-action="iterate" data-entry-uuid="${entry.uuid}" type="button"${unsafe(histDisabled)}${unsafe(histTitle)}>Iterate</button>`, 'i'));
102
102
  // Reject — DISABLED pending the design decision in #173.
103
103
  buttons.push(shortcutChipWrap(html `<button class="er-btn er-btn-small er-btn-reject" data-action="reject" data-entry-uuid="${entry.uuid}" type="button" disabled title="${REJECT_TOOLTIP}" aria-disabled="true">Reject</button>`, 'r'));
104
+ // Cancel (#242) — pull the entry off-pipeline. Routes through
105
+ // `/deskwork:cancel <slug>` like Approve/Iterate (THESIS Consequence 2);
106
+ // the skill mutates sidecar + journal. Same gravity / styling as Reject.
107
+ buttons.push(html `<button class="er-btn er-btn-small er-btn-reject" data-action="cancel" data-entry-uuid="${entry.uuid}" data-entry-slug="${entry.slug}" type="button"${unsafe(histDisabled)}${unsafe(histTitle || ' title="Pull this entry off-pipeline (Cancelled). Reversible via /deskwork:induct."')}>Cancel ⊘</button>`);
104
108
  // Historical-stage dropdown — only useful when more than one stage
105
109
  // has recorded iterations for this entry. The renderer returns an
106
110
  // empty string when there are none; keep it conditional here so the
@@ -1 +1 @@
1
- {"version":3,"file":"decision-strip.js","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decision-strip.js","sourceRoot":"","sources":["../../../src/pages/entry-review/decision-strip.ts"],"names":[],"mappings":"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"}
@@ -7,14 +7,13 @@
7
7
  * Outline / Focus / Save / Cancel actions. Consumes the existing
8
8
  * `editorial-review.css` rules unchanged.
9
9
  *
10
- * Save semantics: the entry-keyed model's `iterateEntry` reads on-disk
11
- * content, not a request body, so the legacy edit-in-browser-then-save
12
- * flow has no entry-keyed equivalent. The Save button is rendered
13
- * `disabled` with a tooltip pointing at issue #174 (operator decision
14
- * needed on the save shape). Edit mode itself still works — the source
15
- * pane and the rendered preview pane are functional — only the Save
16
- * action is intentionally inert pending the design decision.
10
+ * Save semantics (#174): the Save button is a DUMB file-write affordance.
11
+ * Click POST the editor's current text to the
12
+ * `PUT /api/dev/editorial-review/entry/:entryId/body` route write to
13
+ * the entry's canonical `index.md` on disk in place. No version bump,
14
+ * no journal record, no state-machine mutation. State-machine work
15
+ * stays with `/deskwork:iterate`; Save and Iterate are orthogonal.
17
16
  */
18
17
  import { type RawHtml } from '../html.ts';
19
- export declare function renderEditToolbar(outlineHasContent: boolean): RawHtml;
18
+ export declare function renderEditToolbar(outlineHasContent: boolean, entryLabel: string): RawHtml;
20
19
  //# sourceMappingURL=edit-toolbar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"edit-toolbar.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/edit-toolbar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAOxD,wBAAgB,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,GAAG,OAAO,CAwBrE"}
1
+ {"version":3,"file":"edit-toolbar.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/edit-toolbar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAgB,iBAAiB,CAC/B,iBAAiB,EAAE,OAAO,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAgCT"}
@@ -7,18 +7,15 @@
7
7
  * Outline / Focus / Save / Cancel actions. Consumes the existing
8
8
  * `editorial-review.css` rules unchanged.
9
9
  *
10
- * Save semantics: the entry-keyed model's `iterateEntry` reads on-disk
11
- * content, not a request body, so the legacy edit-in-browser-then-save
12
- * flow has no entry-keyed equivalent. The Save button is rendered
13
- * `disabled` with a tooltip pointing at issue #174 (operator decision
14
- * needed on the save shape). Edit mode itself still works — the source
15
- * pane and the rendered preview pane are functional — only the Save
16
- * action is intentionally inert pending the design decision.
10
+ * Save semantics (#174): the Save button is a DUMB file-write affordance.
11
+ * Click POST the editor's current text to the
12
+ * `PUT /api/dev/editorial-review/entry/:entryId/body` route write to
13
+ * the entry's canonical `index.md` on disk in place. No version bump,
14
+ * no journal record, no state-machine mutation. State-machine work
15
+ * stays with `/deskwork:iterate`; Save and Iterate are orthogonal.
17
16
  */
18
17
  import { html, unsafe } from "../html.js";
19
- const SAVE_ISSUE_URL = 'https://github.com/audiocontrol-org/deskwork/issues/174';
20
- const SAVE_TOOLTIP = `Save semantics for the entry-keyed surface are pending design — see ${SAVE_ISSUE_URL}`;
21
- export function renderEditToolbar(outlineHasContent) {
18
+ export function renderEditToolbar(outlineHasContent, entryLabel) {
22
19
  const outlineBtnAttrs = outlineHasContent ? '' : ' hidden';
23
20
  // #175 Phase 34b — every button carries a tooltip naming what it
24
21
  // does + the keyboard shortcut where one exists. The mode tabs
@@ -26,8 +23,16 @@ export function renderEditToolbar(outlineHasContent) {
26
23
  // operator who hadn't memorized them got nothing on hover. The
27
24
  // trailing `?` button opens the existing shortcuts overlay so the
28
25
  // full keyboard reference is one click away from the toolbar.
26
+ //
27
+ // #241 — `entryLabel` is the entry's slug or title; rendered inside
28
+ // a dedicated `.er-edit-entry-label` span. Hidden on desktop (the
29
+ // surrounding strip + folio already convey what's being edited);
30
+ // shown on phone where the rest of the page chrome is hidden in
31
+ // edit mode and the operator needs an in-toolbar reminder of which
32
+ // document the editor is bound to.
29
33
  return unsafe(html `
30
34
  <div class="er-edit-toolbar" data-edit-toolbar hidden>
35
+ <span class="er-edit-entry-label" data-edit-entry-label title="${entryLabel}">${entryLabel}</span>
31
36
  <div class="er-edit-modes" role="tablist" aria-label="Editor mode">
32
37
  <button class="er-edit-mode-btn" data-edit-view="source" type="button" aria-pressed="true" title="Edit markdown source only">Source</button>
33
38
  <button class="er-edit-mode-btn" data-edit-view="split" type="button" aria-pressed="false" title="Source on the left, rendered preview on the right">Split</button>
@@ -36,7 +41,7 @@ export function renderEditToolbar(outlineHasContent) {
36
41
  <div class="er-edit-actions">
37
42
  <button class="er-btn er-btn-small" data-action="outline-drawer" type="button" title="Show the outline for reference (O)" aria-pressed="false"${unsafe(outlineBtnAttrs)}>Outline ↗</button>
38
43
  <button class="er-btn er-btn-small" data-action="focus-mode" type="button" title="Distraction-free full-viewport canvas (Shift+F)" aria-pressed="false">Focus ⛶</button>
39
- <button class="er-btn er-btn-primary" data-action="save-version" type="button" disabled aria-disabled="true" title="${SAVE_TOOLTIP}">Save as new version</button>
44
+ <button class="er-btn er-btn-primary" data-action="save-version" type="button" title="Save the current text to disk (Cmd/Ctrl+S)">Save</button>
40
45
  <button class="er-btn" data-action="cancel-edit" type="button" title="Discard unsaved edits and exit edit mode">Cancel</button>
41
46
  <button class="er-btn er-btn-small" data-action="shortcuts" type="button" aria-label="Show keyboard shortcuts" title="Show all keyboard shortcuts (?)">?</button>
42
47
  <span class="er-edit-hint" data-edit-hint></span>
@@ -1 +1 @@
1
- {"version":3,"file":"edit-toolbar.js","sourceRoot":"","sources":["../../../src/pages/entry-review/edit-toolbar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,cAAc,GAClB,yDAAyD,CAAC;AAC5D,MAAM,YAAY,GAChB,uEAAuE,cAAc,EAAE,CAAC;AAE1F,MAAM,UAAU,iBAAiB,CAAC,iBAA0B;IAC1D,MAAM,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,iEAAiE;IACjE,+DAA+D;IAC/D,8DAA8D;IAC9D,+DAA+D;IAC/D,kEAAkE;IAClE,8DAA8D;IAC9D,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;;;;wJAQoI,MAAM,CAAC,eAAe,CAAC;;8HAEjD,YAAY;;;;;WAK/H,CAAC,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"edit-toolbar.js","sourceRoot":"","sources":["../../../src/pages/entry-review/edit-toolbar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAExD,MAAM,UAAU,iBAAiB,CAC/B,iBAA0B,EAC1B,UAAkB;IAElB,MAAM,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,iEAAiE;IACjE,+DAA+D;IAC/D,8DAA8D;IAC9D,+DAA+D;IAC/D,kEAAkE;IAClE,8DAA8D;IAC9D,EAAE;IACF,oEAAoE;IACpE,kEAAkE;IAClE,iEAAiE;IACjE,gEAAgE;IAChE,mEAAmE;IACnE,mCAAmC;IACnC,OAAO,MAAM,CAAC,IAAI,CAAA;;uEAEmD,UAAU,KAAK,UAAU;;;;;;;wJAOwD,MAAM,CAAC,eAAe,CAAC;;;;;;;WAOpK,CAAC,CAAC;AACb,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAMjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAezD,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B;oDACgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;mDAG+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAqGD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,gBAAqB,EAC5B,QAAQ,CAAC,EAAE,sBAAsB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CA0H5B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAMjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAgBzD,MAAM,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAC/B;oDACgD;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC;;;mDAG+C;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AA2GD;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,aAAa,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,gBAAqB,EAC5B,QAAQ,CAAC,EAAE,sBAAsB,GAChC,OAAO,CAAC,iBAAiB,CAAC,CA8H5B"}
@@ -27,6 +27,7 @@
27
27
  import { existsSync } from 'node:fs';
28
28
  import { parseDraftFrontmatter, renderMarkdownToHtml, } from '@deskwork/core/review/render';
29
29
  import { splitOutline } from '@deskwork/core/outline-split';
30
+ import { extractToc } from '@deskwork/core/review/toc';
30
31
  import { resolveCalendarPath } from '@deskwork/core/paths';
31
32
  import { readCalendar } from '@deskwork/core/calendar';
32
33
  import { findEntryById } from '@deskwork/core/calendar-mutations';
@@ -41,6 +42,7 @@ import { renderEditToolbar } from "./edit-toolbar.js";
41
42
  import { renderEditPanes } from "./edit-panes.js";
42
43
  import { renderOutlineDrawer } from "./outline-drawer.js";
43
44
  import { renderMarginalia, renderMarginaliaTab } from "./marginalia.js";
45
+ import { renderMobileBar, renderMobileSheet, renderStripModeSegment, renderStripEditExit } from "./mobile-bar.js";
44
46
  import { renderDecisionStrip } from "./decision-strip.js";
45
47
  import { renderShortcutsOverlay } from "./shortcuts.js";
46
48
  import { renderEntryNotFound } from "./not-found.js";
@@ -70,7 +72,11 @@ async function prepareRender(markdown, renderCtx) {
70
72
  const outlineHtml = split.outline
71
73
  ? await renderMarkdownToHtml(split.outline, renderCtx)
72
74
  : '';
73
- return { fm, bodyHtml: renderedHtml, outlineHtml };
75
+ // #244 extract TOC from the rendered body's headings. The renderer
76
+ // ran rehype-slug so every h2/h3/h4 carries an `id` attribute; the
77
+ // extractor reads the `id` + visible text into a flat list.
78
+ const tocEntries = extractToc(renderedHtml);
79
+ return { fm, bodyHtml: renderedHtml, outlineHtml, tocEntries };
74
80
  }
75
81
  function buildState(data) {
76
82
  const stage = data.entry.currentStage;
@@ -122,7 +128,7 @@ export async function renderEntryReviewPage(ctx, entryId, query = {}, getIndex)
122
128
  const reason = err instanceof Error ? err.message : String(err);
123
129
  return { status: 404, html: renderEntryNotFound(entryId, reason) };
124
130
  }
125
- const { fm, bodyHtml, outlineHtml } = await prepareRender(data.markdown, {
131
+ const { fm, bodyHtml, outlineHtml, tocEntries } = await prepareRender(data.markdown, {
126
132
  entryId: data.entry.uuid,
127
133
  site: data.site,
128
134
  });
@@ -186,16 +192,20 @@ export async function renderEntryReviewPage(ctx, entryId, query = {}, getIndex)
186
192
  <span class="er-strip-hint">select text to <span class="er-gloss" data-term="marginalia" tabindex="0" role="button" aria-describedby="glossary-marginalia">mark</span> · double-click to edit · <kbd>?</kbd> for shortcuts</span>
187
193
  </span>
188
194
  ${decisionStrip}
195
+ ${renderStripModeSegment()}
196
+ ${renderStripEditExit()}
189
197
  </div>
190
198
  </div>
191
- ${renderEditToolbar(outlineHtml.length > 0)}
199
+ ${renderEditToolbar(outlineHtml.length > 0, titleField)}
192
200
  <article class="er-page" data-entry-uuid="${data.entry.uuid}">
193
201
  ${unsafe(pageGrid)}
194
202
  </article>
195
203
  ${renderMarginaliaTab()}
196
204
  <button class="er-pencil-btn" data-add-comment-btn hidden type="button">Mark</button>
197
- ${renderOutlineDrawer(outlineHtml)}
205
+ ${renderOutlineDrawer(outlineHtml, tocEntries)}
198
206
  ${scrapbookDrawer}
207
+ ${renderMobileBar()}
208
+ ${renderMobileSheet()}
199
209
  <div class="er-toast" data-toast hidden></div>
200
210
  ${renderShortcutsOverlay()}
201
211
  <div class="er-poll-indicator" data-poll>auto-refresh · 8s</div>
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pages/entry-review/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAiB,MAAM,2BAA2B,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAElE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAEhE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAgB,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAwB,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAClH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA2BrD,SAAS,WAAW,CAAC,CAAU;IAC7B,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,aAAa,CAC1B,QAAgB,EAChB,SAA4C;IAE5C,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC;IAE9B,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAEnE,+DAA+D;IAC/D,MAAM,WAAW,GAAG,WAAW,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW;QACzB,CAAC,CAAC,8BAA8B,UAAU,CAAC,WAAW,CAAC,MAAM;QAC7D,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,YAAY,GAChB,OAAO,IAAI,OAAO,IAAI,CAAC;QACrB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QACxE,CAAC,CAAC,OAAO,GAAG,QAAQ,CAAC;IAEzB,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO;QAC/B,CAAC,CAAC,MAAM,oBAAoB,CAAC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC;QACtD,CAAC,CAAC,EAAE,CAAC;IAEP,qEAAqE;IACrE,mEAAmE;IACnE,4DAA4D;IAC5D,MAAM,UAAU,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;IAE5C,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACjE,CAAC;AAoBD,SAAS,UAAU,CAAC,IAAqB;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;IACtC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;IAClE,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;QACxB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,KAAK;QACnB,cAAc;QACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI;KACrC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,yBAAyB,CAChC,GAAkB,EAClB,IAAY,EACZ,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,mBAAmB,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,OAAO,IAAI,CAAC;QAC3C,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1C,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAkB,EAClB,OAAe,EACf,QAA0B,EAAE,EAC5B,QAAiC;IAEjC,IAAI,IAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE;YAC7C,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI;YAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,IAAI;SAC3B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;IACrE,CAAC;IAED,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE;QACnF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;QACxB,IAAI,EAAE,IAAI,CAAC,IAAI;KAChB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,UAAU,GAAG,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAExE,kEAAkE;IAClE,qEAAqE;IACrE,uDAAuD;IACvD,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI;QAC7C,CAAC,CAAC,IAAI,CAAC,aAAa;QACpB,CAAC,CAAC,yBAAyB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/D,+DAA+D;IAC/D,8DAA8D;IAC9D,8DAA8D;IAC9D,MAAM,UAAU,GAAG,cAAc,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;IAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,UAAU;QACrC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAA,0FAA0F,IAAI,CAAC,UAAU,CAAC,aAAa,SAAS,CAAC;QAC9I,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAEf,mEAAmE;IACnE,+DAA+D;IAC/D,qEAAqE;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAA;;;;8EAIuD,MAAM,CAAC,QAAQ,CAAC;UACpF,eAAe,EAAE;;;QAGnB,gBAAgB,EAAE;WACf,CAAC;IAEV,MAAM,eAAe,GAAY,qBAAqB,CACpD,GAAG,EACH,IAAI,CAAC,IAAI,EACT,WAAW,EACX,IAAI,CAAC,KAAK,CAAC,IAAI,EACf,WAAW,CACZ,CAAC;IAEF,MAAM,YAAY,GAAG,mBAAmB,CAAC;QACvC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,iBAAiB,EAAE,IAAI,CAAC,UAAU,EAAE,aAAa,IAAI,IAAI;QACzD,eAAe,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,IAAI;KAChD,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,mBAAmB,CAAC;QACxC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW;QACX,UAAU,EAAE,IAAI,CAAC,UAAU,KAAK,IAAI;KACrC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,IAAI,CAAA;;QAEX,oBAAoB,CAAC,UAAU,EAAE,UAAU,CAAC;;;;0CAIV,KAAK,CAAC,QAAQ,CAAC,UAAU,KAAK,CAAC,cAAc,IAAI,GAAG;wCACtD,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;YAC1D,YAAY;;0DAEkC,UAAU,CAAC,WAAW,EAAE,kCAAkC,UAAU;gBAC9G,UAAU;;cAEZ,eAAe;;;YAGjB,aAAa;YACb,sBAAsB,EAAE;YACxB,mBAAmB,EAAE;;;QAGzB,iBAAiB,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,UAAU,CAAC;kDACX,IAAI,CAAC,KAAK,CAAC,IAAI;UACvD,MAAM,CAAC,QAAQ,CAAC;;QAElB,mBAAmB,EAAE;;QAErB,mBAAmB,CAAC,WAAW,EAAE,UAAU,CAAC;QAC5C,eAAe;QACf,eAAe,EAAE;QACjB,iBAAiB,EAAE;;QAEnB,sBAAsB,EAAE;;WAErB,CAAC;IAEV,OAAO;QACL,MAAM,EAAE,GAAG;QACX,IAAI,EAAE,MAAM,CAAC;YACX,KAAK,EAAE,GAAG,UAAU,WAAW;YAC/B,QAAQ,EAAE;gBACR,kCAAkC;gBAClC,+BAA+B;gBAC/B,8BAA8B;gBAC9B,6BAA6B;gBAC7B,iCAAiC;gBACjC,2BAA2B;aAC5B;YACD,SAAS,EAAE,+BAA+B;YAC1C,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YACzD,aAAa,EAAE,CAAC,qBAAqB,CAAC;SACvC,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Mobile bottom-bar + sheet host for the entry-keyed review surface.
3
+ *
4
+ * Renders a 3-tab bottom bar and a sheet host that slides up from the
5
+ * viewport bottom. Visible only at <48rem (phone widths) — see
6
+ * editorial-review.css. Above that the bar and sheet are display:none
7
+ * and the desktop layout (in-flow marginalia column, outline-drawer
8
+ * overlay, decision strip in the top strip) carries the surface.
9
+ *
10
+ * Design references:
11
+ * - Review tabs: plugins/deskwork-studio/public/mockups/mobile-1-bottom-sheet.html
12
+ * - Editor tabs: plugins/deskwork-studio/public/mockups/editor-2-press-check-tabbar.html
13
+ *
14
+ * The bar carries SIX tab buttons; CSS shows three or four at a time
15
+ * keyed off `body[data-edit-mode="editing"]`:
16
+ * - Review mode: Outline · Notes · Scrapbook · Actions (4-column grid)
17
+ * - Edit mode: Format · Notes · Save (3-column grid)
18
+ * The Notes tab is shared between modes (review notes the operator
19
+ * leaves carry across into edit). The bar's data-mode attribute is
20
+ * also flipped by the client so additional state-dependent styles
21
+ * (Save dirty glow, etc.) can key off it. The Scrapbook tab uses a
22
+ * grid glyph (▦) and a kraft-tone count badge to distinguish it
23
+ * from the red-pencil Notes badge — folio is "context for the
24
+ * entry," not an action peer of decisions.
25
+ *
26
+ * The sheet has five content slots (outline / notes / actions /
27
+ * scrapbook / format).
28
+ * The client controller (`entry-review/mobile-sheet-bar.ts`) populates
29
+ * each at first open. Slot sources:
30
+ * - outline: clone of `.er-outline-drawer-body`
31
+ * - notes: actual `[data-sidebar-list]` element MOVED in on phone
32
+ * (preserves event listeners; see mobile-sheet-bar.ts)
33
+ * - actions: rendered fresh from the decision verbs
34
+ * - format: the press-check key grid rendered server-side below
35
+ *
36
+ * The Save tab is NOT a sheet — it triggers the existing
37
+ * `[data-action="save-version"]` handler directly (the one allowed
38
+ * file mutation per THESIS Consequence 2).
39
+ */
40
+ import { type RawHtml } from '../html.ts';
41
+ export declare function renderMobileBar(): RawHtml;
42
+ export declare function renderMobileSheet(): RawHtml;
43
+ /**
44
+ * Phone-only Source/Preview pill rendered into the top strip when in
45
+ * edit mode. Uses the same `data-edit-view` attribute as the desktop
46
+ * edit toolbar so `editModeBtns` (queried via that attribute in
47
+ * entry-review-client.ts) auto-binds clicks. CSS reveals it only on
48
+ * phone + edit mode; the desktop edit toolbar is hidden in that
49
+ * combination.
50
+ */
51
+ export declare function renderStripModeSegment(): RawHtml;
52
+ /**
53
+ * Phone-only "✕ Done" exit affordance in the strip. Visible only when
54
+ * editing on phone (CSS-gated). Click dispatches into the existing
55
+ * toggle-edit handler — preserves the confirmDiscard prompt when the
56
+ * buffer is dirty, immediate exit when clean. Sits alongside the
57
+ * existing back-link (which continues to navigate home regardless of
58
+ * mode) so the operator always has both "leave editor" and "leave
59
+ * page" affordances available.
60
+ */
61
+ export declare function renderStripEditExit(): RawHtml;
62
+ //# sourceMappingURL=mobile-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mobile-bar.d.ts","sourceRoot":"","sources":["../../../src/pages/entry-review/mobile-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAgB,eAAe,IAAI,OAAO,CA8BzC;AA2BD,wBAAgB,iBAAiB,IAAI,OAAO,CA2B3C;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAMhD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C"}