@deskwork/studio 0.17.1 → 0.19.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 (51) hide show
  1. package/dist/pages/dashboard/affordances.d.ts +19 -24
  2. package/dist/pages/dashboard/affordances.d.ts.map +1 -1
  3. package/dist/pages/dashboard/affordances.js +52 -41
  4. package/dist/pages/dashboard/affordances.js.map +1 -1
  5. package/dist/pages/dashboard/affordances.ts +56 -45
  6. package/dist/pages/dashboard/header.d.ts +9 -3
  7. package/dist/pages/dashboard/header.d.ts.map +1 -1
  8. package/dist/pages/dashboard/header.js +10 -30
  9. package/dist/pages/dashboard/header.js.map +1 -1
  10. package/dist/pages/dashboard/header.ts +10 -32
  11. package/dist/pages/dashboard/section.d.ts +42 -15
  12. package/dist/pages/dashboard/section.d.ts.map +1 -1
  13. package/dist/pages/dashboard/section.js +118 -49
  14. package/dist/pages/dashboard/section.js.map +1 -1
  15. package/dist/pages/dashboard/section.ts +120 -53
  16. package/dist/pages/dashboard.d.ts +23 -17
  17. package/dist/pages/dashboard.d.ts.map +1 -1
  18. package/dist/pages/dashboard.js +105 -25
  19. package/dist/pages/dashboard.js.map +1 -1
  20. package/dist/pages/dashboard.ts +107 -26
  21. package/dist/pages/entry-review/decision-strip.d.ts.map +1 -1
  22. package/dist/pages/entry-review/decision-strip.js +4 -0
  23. package/dist/pages/entry-review/decision-strip.js.map +1 -1
  24. package/dist/pages/entry-review/edit-toolbar.d.ts +1 -1
  25. package/dist/pages/entry-review/edit-toolbar.d.ts.map +1 -1
  26. package/dist/pages/entry-review/edit-toolbar.js +9 -1
  27. package/dist/pages/entry-review/edit-toolbar.js.map +1 -1
  28. package/dist/pages/entry-review/index.d.ts.map +1 -1
  29. package/dist/pages/entry-review/index.js +14 -4
  30. package/dist/pages/entry-review/index.js.map +1 -1
  31. package/dist/pages/entry-review/mobile-bar.d.ts +62 -0
  32. package/dist/pages/entry-review/mobile-bar.d.ts.map +1 -0
  33. package/dist/pages/entry-review/mobile-bar.js +155 -0
  34. package/dist/pages/entry-review/mobile-bar.js.map +1 -0
  35. package/dist/pages/entry-review/outline-drawer.d.ts +17 -7
  36. package/dist/pages/entry-review/outline-drawer.d.ts.map +1 -1
  37. package/dist/pages/entry-review/outline-drawer.js +58 -14
  38. package/dist/pages/entry-review/outline-drawer.js.map +1 -1
  39. package/dist/pages/help.js +1 -1
  40. package/dist/pages/help.ts +1 -1
  41. package/dist/pages/index.d.ts +8 -6
  42. package/dist/pages/index.d.ts.map +1 -1
  43. package/dist/pages/index.js +16 -14
  44. package/dist/pages/index.js.map +1 -1
  45. package/dist/pages/index.ts +16 -14
  46. package/dist/pages/layout.js +1 -1
  47. package/dist/pages/layout.ts +1 -1
  48. package/dist/server.d.ts.map +1 -1
  49. package/dist/server.js +12 -1
  50. package/dist/server.js.map +1 -1
  51. package/package.json +2 -2
@@ -1,28 +1,34 @@
1
1
  /**
2
2
  * Studio dashboard page — `/dev/editorial-studio`.
3
3
  *
4
- * Pipeline-redesign Task 34. The dashboard renders eight stage
5
- * sections — Ideas PlannedOutliningDrafting Final
6
- * Published, plus Blocked and Cancelled — backed by sidecar reads
7
- * under `<projectRoot>/.deskwork/entries/*.json`. Each row carries
8
- * the entry's iteration count for its current stage and a
9
- * reviewState badge so an operator can see at a glance where each
10
- * entry sits without opening it.
4
+ * The dashboard renders eight stage sections — Ideas → Planned →
5
+ * OutliningDraftingFinalPublished, plus Blocked and
6
+ * Cancelled — backed by sidecar reads under
7
+ * `<projectRoot>/.deskwork/entries/*.json`, with a Distribution
8
+ * placeholder pinned at the end. Each row carries the entry's slug,
9
+ * title, updated-at timestamp, and stage-gated verb buttons that
10
+ * clipboard-copy `/deskwork:<verb> <slug>` (THESIS Consequence 2 —
11
+ * the studio routes commands; skills do the work). On phone (≤600px)
12
+ * each stage section is collapsed by default and fronted by a tile
13
+ * (see Compact-1 in DESIGN-STANDARDS.md); on desktop everything is
14
+ * expanded with the existing `<h2 class="er-section-head">` heading
15
+ * carrying the stage name.
11
16
  *
12
- * Replaces the legacy calendar.md + workflow store rendering. The
13
- * scaffold (folio, masthead, filter strip, layout) is preserved so
14
- * existing CSS keeps working.
17
+ * Per DESKWORK-STATE-MACHINE.md (Commandment III), reviewState is
18
+ * RETIRED. Rows do NOT carry per-stage iteration counts or
19
+ * reviewState badges; that legacy "at-a-glance" surfacing was
20
+ * removed in v0.19.
15
21
  *
16
22
  * The renderer's data flow:
17
23
  * 1. loadDashboardData reads every sidecar and groups by stage.
18
- * 2. Each of the eight stages renders via `renderStageSection`.
19
- * 3. The Distribution placeholder pins beneath the stage sections.
24
+ * 2. Each stage renders via `renderStageSection`.
25
+ * 3. The Distribution placeholder renders below the stage sections.
26
+ * 4. The mobile-only Compose chrome (FAB + slide-up sheet) renders
27
+ * at the page tail; CSS hides it on desktop.
20
28
  *
21
- * The legacy export `renderDashboard` stays server.ts wires it as
22
- * the page handler. The `getIndex` parameter is preserved for
23
- * signature compatibility with the override resolver in server.ts;
24
- * the new dashboard does not currently consume it (sidecars are the
25
- * data source, not the on-disk content tree).
29
+ * `getIndex` is preserved for signature compatibility with the
30
+ * override resolver in server.ts; the dashboard does not consume it
31
+ * (sidecars are the data source, not the on-disk content tree).
26
32
  */
27
33
  import { html, unsafe } from "./html.js";
28
34
  import { layout } from "./layout.js";
@@ -30,7 +36,6 @@ import { renderEditorialFolio } from "./chrome.js";
30
36
  import { loadDashboardData, DASHBOARD_STAGE_ORDER } from "./dashboard/data.js";
31
37
  import { renderStageSection, renderDistributionPlaceholder, } from "./dashboard/section.js";
32
38
  import { renderHeader, renderFilterStrip } from "./dashboard/header.js";
33
- import { renderPressQueue } from "./dashboard/press-queue.js";
34
39
  /**
35
40
  * Render the studio dashboard. Async because sidecar reads hit disk;
36
41
  * the route handler in server.ts awaits the result before sending it.
@@ -45,19 +50,20 @@ export async function renderDashboard(ctx, getIndex) {
45
50
  const bucket = data.byStage.get(stage) ?? [];
46
51
  return renderStageSection(stage, bucket, defaultSite).__raw;
47
52
  }).join('\n');
53
+ // The press queue (right-rail on desktop) was removed in v0.19
54
+ // per DESKWORK-STATE-MACHINE.md Commandment III — its primary
55
+ // purpose was surfacing review-state, which is RETIRED. The
56
+ // archive entry at docs/studio-design/ACCEPTED/2026-05-09-press-queue-removed/
57
+ // captures the rationale.
48
58
  const body = html `
49
59
  ${renderEditorialFolio('dashboard', 'press-check')}
50
60
  ${renderHeader(data, ctx.projectRoot, now)}
51
61
  <main class="er-container">
52
62
  ${renderFilterStrip()}
53
- <div class="er-layout">
54
- <div>
55
- ${unsafe(stageSections)}
56
- ${renderDistributionPlaceholder()}
57
- </div>
58
- ${renderPressQueue(data.entries, defaultSite, now)}
59
- </div>
63
+ ${unsafe(stageSections)}
64
+ ${renderDistributionPlaceholder()}
60
65
  </main>
66
+ ${renderComposeChrome()}
61
67
  <div class="er-toast" data-toast hidden></div>
62
68
  <div class="er-poll-indicator" data-poll>auto-refresh · 10s</div>`;
63
69
  return layout({
@@ -66,10 +72,84 @@ export async function renderDashboard(ctx, getIndex) {
66
72
  '/static/css/editorial-review.css',
67
73
  '/static/css/editorial-nav.css',
68
74
  '/static/css/editorial-studio.css',
75
+ '/static/css/dashboard-mobile.css',
69
76
  ],
70
77
  bodyAttrs: 'data-review-ui="studio"',
71
78
  bodyHtml: body,
72
79
  scriptModules: ['editorial-studio-client'],
73
80
  });
74
81
  }
82
+ /**
83
+ * Mobile-only Compose chrome — a floating "+ Compose" chip at bottom-right
84
+ * and a slide-up sheet listing creation verbs. The chip and sheet are
85
+ * `display: none` on desktop (see dashboard-mobile.css); on phone the
86
+ * chip is the operator's primary path to /deskwork:add, /deskwork:ingest,
87
+ * and /deskwork:shortform-start.
88
+ *
89
+ * Each verb card is a `<button data-compose-verb data-copy="...">`. The
90
+ * client-side controller in `dashboard/compose-chip.ts` handles the
91
+ * clipboard write via copyOrShowFallback (THESIS Consequence 2 — agent
92
+ * does the work; the studio routes intent). We deliberately do NOT use
93
+ * the existing `.er-copy-btn` class on these buttons because that class
94
+ * triggers a textContent swap on success, which would clobber the rich
95
+ * verb-card markup; the compose-chip controller handles feedback via a
96
+ * `.is-copied` class instead.
97
+ */
98
+ function renderComposeChrome() {
99
+ return unsafe(html `
100
+ <button class="er-compose-fab" data-compose-fab type="button" aria-controls="er-compose-sheet" aria-expanded="false">
101
+ <span class="er-compose-fab-glyph" aria-hidden="true">+</span>
102
+ <span class="er-compose-fab-label">Compose</span>
103
+ </button>
104
+ <section
105
+ class="er-compose-sheet"
106
+ id="er-compose-sheet"
107
+ data-compose-sheet
108
+ hidden
109
+ role="dialog"
110
+ aria-modal="false"
111
+ aria-label="Compose creation verbs"
112
+ >
113
+ <div class="er-compose-scrim" data-compose-scrim></div>
114
+ <div class="er-compose-panel">
115
+ <button class="er-compose-handle" data-compose-handle type="button" aria-label="Drag to dismiss compose sheet">
116
+ <span class="er-compose-handle-bar" aria-hidden="true"></span>
117
+ </button>
118
+ <header class="er-compose-head">
119
+ <span class="er-compose-kicker">+ Compose · creation verbs</span>
120
+ <span class="er-compose-meta">tap copies the command</span>
121
+ <button class="er-compose-close" data-compose-close type="button" aria-label="Close compose sheet">×</button>
122
+ </header>
123
+ <div class="er-compose-body">
124
+ <button class="er-compose-verb" data-compose-verb data-copy="/deskwork:add" type="button">
125
+ <span class="er-compose-verb-head">
126
+ <span class="er-compose-verb-glyph" aria-hidden="true">+</span>
127
+ <span class="er-compose-verb-name">New idea</span>
128
+ <span class="er-compose-verb-cmd">/deskwork:add</span>
129
+ </span>
130
+ <span class="er-compose-verb-desc">Capture a new pitch as an Ideas-stage entry. Scaffolds an idea.md with sidecar; the agent picks up from there.</span>
131
+ <span class="er-compose-verb-foot">tap → clipboard · paste in Claude Code</span>
132
+ </button>
133
+ <button class="er-compose-verb" data-compose-verb data-copy="/deskwork:ingest" type="button">
134
+ <span class="er-compose-verb-head">
135
+ <span class="er-compose-verb-glyph" aria-hidden="true">⤓</span>
136
+ <span class="er-compose-verb-name">Ingest existing</span>
137
+ <span class="er-compose-verb-cmd">/deskwork:ingest</span>
138
+ </span>
139
+ <span class="er-compose-verb-desc">Backfill markdown that already exists on disk. Walks files / globs, derives slug + state + date, and (after dry-run) writes calendar rows.</span>
140
+ <span class="er-compose-verb-foot">tap → clipboard · paste in Claude Code</span>
141
+ </button>
142
+ <button class="er-compose-verb" data-compose-verb data-copy="/deskwork:shortform-start" type="button">
143
+ <span class="er-compose-verb-head">
144
+ <span class="er-compose-verb-glyph" aria-hidden="true">⊜</span>
145
+ <span class="er-compose-verb-name">Shortform start</span>
146
+ <span class="er-compose-verb-cmd">/deskwork:shortform-start</span>
147
+ </span>
148
+ <span class="er-compose-verb-desc">Start a LinkedIn / Reddit / YouTube / Instagram draft for a Published or Drafting entry. Same review pipeline as longform.</span>
149
+ <span class="er-compose-verb-foot">tap → clipboard · paste in Claude Code</span>
150
+ </button>
151
+ </div>
152
+ </div>
153
+ </section>`);
154
+ }
75
155
  //# sourceMappingURL=dashboard.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAW9D;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkB,EAClB,QAA+B;IAE/B,iEAAiE;IACjE,KAAK,QAAQ,CAAC;IAEd,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAE7C,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;IAC3C,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,IAAI,CAAA;IACf,oBAAoB,CAAC,WAAW,EAAE,aAAa,CAAC;IAChD,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;;MAEtC,iBAAiB,EAAE;;;UAGf,MAAM,CAAC,aAAa,CAAC;UACrB,6BAA6B,EAAE;;QAEjC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC;;;;oEAIY,CAAC;IAEnE,OAAO,MAAM,CAAC;QACZ,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE;YACR,kCAAkC;YAClC,+BAA+B;YAC/B,kCAAkC;SACnC;QACD,SAAS,EAAE,yBAAyB;QACpC,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,CAAC,yBAAyB,CAAC;KAC3C,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/pages/dashboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAGH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAgB,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAWxE;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAkB,EAClB,QAA+B;IAE/B,iEAAiE;IACjE,KAAK,QAAQ,CAAC;IAEd,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAE7C,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC;IAC3C,MAAM,aAAa,GAAG,qBAAqB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACxD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC;IAC9D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,+DAA+D;IAC/D,8DAA8D;IAC9D,4DAA4D;IAC5D,+EAA+E;IAC/E,0BAA0B;IAC1B,MAAM,IAAI,GAAG,IAAI,CAAA;IACf,oBAAoB,CAAC,WAAW,EAAE,aAAa,CAAC;IAChD,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC;;MAEtC,iBAAiB,EAAE;MACnB,MAAM,CAAC,aAAa,CAAC;MACrB,6BAA6B,EAAE;;IAEjC,mBAAmB,EAAE;;oEAE2C,CAAC;IAEnE,OAAO,MAAM,CAAC;QACZ,KAAK,EAAE,mBAAmB;QAC1B,QAAQ,EAAE;YACR,kCAAkC;YAClC,+BAA+B;YAC/B,kCAAkC;YAClC,kCAAkC;SACnC;QACD,SAAS,EAAE,yBAAyB;QACpC,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,CAAC,yBAAyB,CAAC;KAC3C,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,mBAAmB;IAC1B,OAAO,MAAM,CAAC,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAsDP,CAAC,CAAC;AACf,CAAC"}
@@ -1,32 +1,38 @@
1
1
  /**
2
2
  * Studio dashboard page — `/dev/editorial-studio`.
3
3
  *
4
- * Pipeline-redesign Task 34. The dashboard renders eight stage
5
- * sections — Ideas PlannedOutliningDrafting Final
6
- * Published, plus Blocked and Cancelled — backed by sidecar reads
7
- * under `<projectRoot>/.deskwork/entries/*.json`. Each row carries
8
- * the entry's iteration count for its current stage and a
9
- * reviewState badge so an operator can see at a glance where each
10
- * entry sits without opening it.
4
+ * The dashboard renders eight stage sections — Ideas → Planned →
5
+ * OutliningDraftingFinalPublished, plus Blocked and
6
+ * Cancelled — backed by sidecar reads under
7
+ * `<projectRoot>/.deskwork/entries/*.json`, with a Distribution
8
+ * placeholder pinned at the end. Each row carries the entry's slug,
9
+ * title, updated-at timestamp, and stage-gated verb buttons that
10
+ * clipboard-copy `/deskwork:<verb> <slug>` (THESIS Consequence 2 —
11
+ * the studio routes commands; skills do the work). On phone (≤600px)
12
+ * each stage section is collapsed by default and fronted by a tile
13
+ * (see Compact-1 in DESIGN-STANDARDS.md); on desktop everything is
14
+ * expanded with the existing `<h2 class="er-section-head">` heading
15
+ * carrying the stage name.
11
16
  *
12
- * Replaces the legacy calendar.md + workflow store rendering. The
13
- * scaffold (folio, masthead, filter strip, layout) is preserved so
14
- * existing CSS keeps working.
17
+ * Per DESKWORK-STATE-MACHINE.md (Commandment III), reviewState is
18
+ * RETIRED. Rows do NOT carry per-stage iteration counts or
19
+ * reviewState badges; that legacy "at-a-glance" surfacing was
20
+ * removed in v0.19.
15
21
  *
16
22
  * The renderer's data flow:
17
23
  * 1. loadDashboardData reads every sidecar and groups by stage.
18
- * 2. Each of the eight stages renders via `renderStageSection`.
19
- * 3. The Distribution placeholder pins beneath the stage sections.
24
+ * 2. Each stage renders via `renderStageSection`.
25
+ * 3. The Distribution placeholder renders below the stage sections.
26
+ * 4. The mobile-only Compose chrome (FAB + slide-up sheet) renders
27
+ * at the page tail; CSS hides it on desktop.
20
28
  *
21
- * The legacy export `renderDashboard` stays server.ts wires it as
22
- * the page handler. The `getIndex` parameter is preserved for
23
- * signature compatibility with the override resolver in server.ts;
24
- * the new dashboard does not currently consume it (sidecars are the
25
- * data source, not the on-disk content tree).
29
+ * `getIndex` is preserved for signature compatibility with the
30
+ * override resolver in server.ts; the dashboard does not consume it
31
+ * (sidecars are the data source, not the on-disk content tree).
26
32
  */
27
33
 
28
34
  import type { StudioContext } from '../routes/api.ts';
29
- import { html, unsafe } from './html.ts';
35
+ import { html, unsafe, type RawHtml } from './html.ts';
30
36
  import { layout } from './layout.ts';
31
37
  import { renderEditorialFolio } from './chrome.ts';
32
38
  import { loadDashboardData, DASHBOARD_STAGE_ORDER } from './dashboard/data.ts';
@@ -35,7 +41,6 @@ import {
35
41
  renderDistributionPlaceholder,
36
42
  } from './dashboard/section.ts';
37
43
  import { renderHeader, renderFilterStrip } from './dashboard/header.ts';
38
- import { renderPressQueue } from './dashboard/press-queue.ts';
39
44
  import type { ContentIndex } from '@deskwork/core/content-index';
40
45
 
41
46
  /**
@@ -66,19 +71,20 @@ export async function renderDashboard(
66
71
  return renderStageSection(stage, bucket, defaultSite).__raw;
67
72
  }).join('\n');
68
73
 
74
+ // The press queue (right-rail on desktop) was removed in v0.19
75
+ // per DESKWORK-STATE-MACHINE.md Commandment III — its primary
76
+ // purpose was surfacing review-state, which is RETIRED. The
77
+ // archive entry at docs/studio-design/ACCEPTED/2026-05-09-press-queue-removed/
78
+ // captures the rationale.
69
79
  const body = html`
70
80
  ${renderEditorialFolio('dashboard', 'press-check')}
71
81
  ${renderHeader(data, ctx.projectRoot, now)}
72
82
  <main class="er-container">
73
83
  ${renderFilterStrip()}
74
- <div class="er-layout">
75
- <div>
76
- ${unsafe(stageSections)}
77
- ${renderDistributionPlaceholder()}
78
- </div>
79
- ${renderPressQueue(data.entries, defaultSite, now)}
80
- </div>
84
+ ${unsafe(stageSections)}
85
+ ${renderDistributionPlaceholder()}
81
86
  </main>
87
+ ${renderComposeChrome()}
82
88
  <div class="er-toast" data-toast hidden></div>
83
89
  <div class="er-poll-indicator" data-poll>auto-refresh · 10s</div>`;
84
90
 
@@ -88,9 +94,84 @@ export async function renderDashboard(
88
94
  '/static/css/editorial-review.css',
89
95
  '/static/css/editorial-nav.css',
90
96
  '/static/css/editorial-studio.css',
97
+ '/static/css/dashboard-mobile.css',
91
98
  ],
92
99
  bodyAttrs: 'data-review-ui="studio"',
93
100
  bodyHtml: body,
94
101
  scriptModules: ['editorial-studio-client'],
95
102
  });
96
103
  }
104
+
105
+ /**
106
+ * Mobile-only Compose chrome — a floating "+ Compose" chip at bottom-right
107
+ * and a slide-up sheet listing creation verbs. The chip and sheet are
108
+ * `display: none` on desktop (see dashboard-mobile.css); on phone the
109
+ * chip is the operator's primary path to /deskwork:add, /deskwork:ingest,
110
+ * and /deskwork:shortform-start.
111
+ *
112
+ * Each verb card is a `<button data-compose-verb data-copy="...">`. The
113
+ * client-side controller in `dashboard/compose-chip.ts` handles the
114
+ * clipboard write via copyOrShowFallback (THESIS Consequence 2 — agent
115
+ * does the work; the studio routes intent). We deliberately do NOT use
116
+ * the existing `.er-copy-btn` class on these buttons because that class
117
+ * triggers a textContent swap on success, which would clobber the rich
118
+ * verb-card markup; the compose-chip controller handles feedback via a
119
+ * `.is-copied` class instead.
120
+ */
121
+ function renderComposeChrome(): RawHtml {
122
+ return unsafe(html`
123
+ <button class="er-compose-fab" data-compose-fab type="button" aria-controls="er-compose-sheet" aria-expanded="false">
124
+ <span class="er-compose-fab-glyph" aria-hidden="true">+</span>
125
+ <span class="er-compose-fab-label">Compose</span>
126
+ </button>
127
+ <section
128
+ class="er-compose-sheet"
129
+ id="er-compose-sheet"
130
+ data-compose-sheet
131
+ hidden
132
+ role="dialog"
133
+ aria-modal="false"
134
+ aria-label="Compose creation verbs"
135
+ >
136
+ <div class="er-compose-scrim" data-compose-scrim></div>
137
+ <div class="er-compose-panel">
138
+ <button class="er-compose-handle" data-compose-handle type="button" aria-label="Drag to dismiss compose sheet">
139
+ <span class="er-compose-handle-bar" aria-hidden="true"></span>
140
+ </button>
141
+ <header class="er-compose-head">
142
+ <span class="er-compose-kicker">+ Compose · creation verbs</span>
143
+ <span class="er-compose-meta">tap copies the command</span>
144
+ <button class="er-compose-close" data-compose-close type="button" aria-label="Close compose sheet">×</button>
145
+ </header>
146
+ <div class="er-compose-body">
147
+ <button class="er-compose-verb" data-compose-verb data-copy="/deskwork:add" type="button">
148
+ <span class="er-compose-verb-head">
149
+ <span class="er-compose-verb-glyph" aria-hidden="true">+</span>
150
+ <span class="er-compose-verb-name">New idea</span>
151
+ <span class="er-compose-verb-cmd">/deskwork:add</span>
152
+ </span>
153
+ <span class="er-compose-verb-desc">Capture a new pitch as an Ideas-stage entry. Scaffolds an idea.md with sidecar; the agent picks up from there.</span>
154
+ <span class="er-compose-verb-foot">tap → clipboard · paste in Claude Code</span>
155
+ </button>
156
+ <button class="er-compose-verb" data-compose-verb data-copy="/deskwork:ingest" type="button">
157
+ <span class="er-compose-verb-head">
158
+ <span class="er-compose-verb-glyph" aria-hidden="true">⤓</span>
159
+ <span class="er-compose-verb-name">Ingest existing</span>
160
+ <span class="er-compose-verb-cmd">/deskwork:ingest</span>
161
+ </span>
162
+ <span class="er-compose-verb-desc">Backfill markdown that already exists on disk. Walks files / globs, derives slug + state + date, and (after dry-run) writes calendar rows.</span>
163
+ <span class="er-compose-verb-foot">tap → clipboard · paste in Claude Code</span>
164
+ </button>
165
+ <button class="er-compose-verb" data-compose-verb data-copy="/deskwork:shortform-start" type="button">
166
+ <span class="er-compose-verb-head">
167
+ <span class="er-compose-verb-glyph" aria-hidden="true">⊜</span>
168
+ <span class="er-compose-verb-name">Shortform start</span>
169
+ <span class="er-compose-verb-cmd">/deskwork:shortform-start</span>
170
+ </span>
171
+ <span class="er-compose-verb-desc">Start a LinkedIn / Reddit / YouTube / Instagram draft for a Published or Drafting entry. Same review pipeline as longform.</span>
172
+ <span class="er-compose-verb-foot">tap → clipboard · paste in Claude Code</span>
173
+ </button>
174
+ </div>
175
+ </div>
176
+ </section>`);
177
+ }
@@ -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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"}
@@ -15,5 +15,5 @@
15
15
  * stays with `/deskwork:iterate`; Save and Iterate are orthogonal.
16
16
  */
17
17
  import { type RawHtml } from '../html.ts';
18
- export declare function renderEditToolbar(outlineHasContent: boolean): RawHtml;
18
+ export declare function renderEditToolbar(outlineHasContent: boolean, entryLabel: string): RawHtml;
19
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;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,YAAY,CAAC;AAExD,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"}
@@ -15,7 +15,7 @@
15
15
  * stays with `/deskwork:iterate`; Save and Iterate are orthogonal.
16
16
  */
17
17
  import { html, unsafe } from "../html.js";
18
- export function renderEditToolbar(outlineHasContent) {
18
+ export function renderEditToolbar(outlineHasContent, entryLabel) {
19
19
  const outlineBtnAttrs = outlineHasContent ? '' : ' hidden';
20
20
  // #175 Phase 34b — every button carries a tooltip naming what it
21
21
  // does + the keyboard shortcut where one exists. The mode tabs
@@ -23,8 +23,16 @@ export function renderEditToolbar(outlineHasContent) {
23
23
  // operator who hadn't memorized them got nothing on hover. The
24
24
  // trailing `?` button opens the existing shortcuts overlay so the
25
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.
26
33
  return unsafe(html `
27
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>
28
36
  <div class="er-edit-modes" role="tablist" aria-label="Editor mode">
29
37
  <button class="er-edit-mode-btn" data-edit-view="source" type="button" aria-pressed="true" title="Edit markdown source only">Source</button>
30
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>
@@ -1 +1 @@
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,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;;;;;;;WAOpK,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":"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"}
@@ -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"}