@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.
- package/dist/pages/dashboard/affordances.d.ts +19 -24
- package/dist/pages/dashboard/affordances.d.ts.map +1 -1
- package/dist/pages/dashboard/affordances.js +52 -41
- package/dist/pages/dashboard/affordances.js.map +1 -1
- package/dist/pages/dashboard/affordances.ts +56 -45
- package/dist/pages/dashboard/header.d.ts +9 -3
- package/dist/pages/dashboard/header.d.ts.map +1 -1
- package/dist/pages/dashboard/header.js +10 -30
- package/dist/pages/dashboard/header.js.map +1 -1
- package/dist/pages/dashboard/header.ts +10 -32
- package/dist/pages/dashboard/section.d.ts +42 -15
- package/dist/pages/dashboard/section.d.ts.map +1 -1
- package/dist/pages/dashboard/section.js +118 -49
- package/dist/pages/dashboard/section.js.map +1 -1
- package/dist/pages/dashboard/section.ts +120 -53
- package/dist/pages/dashboard.d.ts +23 -17
- package/dist/pages/dashboard.d.ts.map +1 -1
- package/dist/pages/dashboard.js +105 -25
- package/dist/pages/dashboard.js.map +1 -1
- package/dist/pages/dashboard.ts +107 -26
- package/dist/pages/entry-review/decision-strip.d.ts.map +1 -1
- package/dist/pages/entry-review/decision-strip.js +4 -0
- package/dist/pages/entry-review/decision-strip.js.map +1 -1
- package/dist/pages/entry-review/edit-toolbar.d.ts +1 -1
- package/dist/pages/entry-review/edit-toolbar.d.ts.map +1 -1
- package/dist/pages/entry-review/edit-toolbar.js +9 -1
- package/dist/pages/entry-review/edit-toolbar.js.map +1 -1
- package/dist/pages/entry-review/index.d.ts.map +1 -1
- package/dist/pages/entry-review/index.js +14 -4
- package/dist/pages/entry-review/index.js.map +1 -1
- package/dist/pages/entry-review/mobile-bar.d.ts +62 -0
- package/dist/pages/entry-review/mobile-bar.d.ts.map +1 -0
- package/dist/pages/entry-review/mobile-bar.js +155 -0
- package/dist/pages/entry-review/mobile-bar.js.map +1 -0
- package/dist/pages/entry-review/outline-drawer.d.ts +17 -7
- package/dist/pages/entry-review/outline-drawer.d.ts.map +1 -1
- package/dist/pages/entry-review/outline-drawer.js +58 -14
- package/dist/pages/entry-review/outline-drawer.js.map +1 -1
- package/dist/pages/help.js +1 -1
- package/dist/pages/help.ts +1 -1
- package/dist/pages/index.d.ts +8 -6
- package/dist/pages/index.d.ts.map +1 -1
- package/dist/pages/index.js +16 -14
- package/dist/pages/index.js.map +1 -1
- package/dist/pages/index.ts +16 -14
- package/dist/pages/layout.js +1 -1
- package/dist/pages/layout.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +12 -1
- package/dist/server.js.map +1 -1
- package/package.json +2 -2
package/dist/pages/dashboard.js
CHANGED
|
@@ -1,28 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Studio dashboard page — `/dev/editorial-studio`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* The dashboard renders eight stage sections — Ideas → Planned →
|
|
5
|
+
* Outlining → Drafting → Final → Published, 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
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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
|
|
19
|
-
* 3. The Distribution placeholder
|
|
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
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
-
|
|
54
|
-
|
|
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
|
|
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"}
|
package/dist/pages/dashboard.ts
CHANGED
|
@@ -1,32 +1,38 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Studio dashboard page — `/dev/editorial-studio`.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
4
|
+
* The dashboard renders eight stage sections — Ideas → Planned →
|
|
5
|
+
* Outlining → Drafting → Final → Published, 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
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
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
|
|
19
|
-
* 3. The Distribution placeholder
|
|
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
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
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
|
-
|
|
75
|
-
|
|
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;
|
|
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,
|
|
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,
|
|
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;
|
|
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
|
-
|
|
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":"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;
|
|
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"}
|