@deskwork/studio 0.9.8 → 0.10.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.
@@ -145,25 +145,25 @@ function renderTracksSection(): RawHtml {
145
145
  <p class="eh-track-title">Longform</p>
146
146
  <p class="eh-track-sub">Blog posts · dispatches</p>
147
147
  <ol class="eh-track-steps">
148
- <li>Capture the idea.<code>/editorial-add "Title"</code></li>
149
- <li>Promote and set keywords.<code>/editorial-plan &lt;slug&gt;</code></li>
150
- <li>Scaffold the draft file.<code>/editorial-draft &lt;slug&gt;</code><span class="note">or click "scaffold" in the studio.</span></li>
148
+ <li>Capture the idea.<code>/deskwork:add "Title"</code></li>
149
+ <li>Promote and set keywords.<code>/deskwork:plan &lt;slug&gt;</code></li>
150
+ <li>Scaffold the draft file.<code>/deskwork:draft &lt;slug&gt;</code><span class="note">or click "scaffold" in the studio.</span></li>
151
151
  <li>Write the prose. No skill; this is the human doing the work.</li>
152
- <li>Open a review workflow.<code>/editorial-draft-review &lt;slug&gt;</code></li>
153
- <li>Annotate in the browser, then iterate.<code>/editorial-iterate</code></li>
154
- <li>Approve — writes to the destination file.<code>/editorial-approve</code></li>
155
- <li>Mark published. Then commit + push by hand.<code>/editorial-publish &lt;slug&gt;</code></li>
152
+ <li>Open a review workflow.<code>/deskwork:review-start &lt;slug&gt;</code></li>
153
+ <li>Annotate in the browser, then iterate.<code>/deskwork:iterate</code></li>
154
+ <li>Approve — writes to the destination file.<code>/deskwork:approve</code></li>
155
+ <li>Mark published. Then commit + push by hand.<code>/deskwork:publish &lt;slug&gt;</code></li>
156
156
  </ol>
157
157
  </div>
158
158
  <div class="eh-track">
159
159
  <p class="eh-track-title">Shortform</p>
160
160
  <p class="eh-track-sub">Social copy · cross-posts</p>
161
161
  <ol class="eh-track-steps">
162
- <li>Draft per platform.<code>/editorial-shortform-draft &lt;slug&gt; &lt;platform&gt;</code><span class="note">Reddit, YouTube, LinkedIn, newsletter.</span></li>
162
+ <li>Draft per platform.<code>/deskwork:shortform-start &lt;slug&gt; &lt;platform&gt;</code><span class="note">Reddit, YouTube, LinkedIn, newsletter.</span></li>
163
163
  <li>Review the same way as longform (same page, shortform mode).<span class="note">/dev/editorial-review-shortform</span></li>
164
- <li>Iterate or approve as with longform.<code>/editorial-iterate · /editorial-approve</code></li>
164
+ <li>Iterate or approve as with longform.<code>/deskwork:iterate · /deskwork:approve</code></li>
165
165
  <li>Post the copy yourself to the platform.</li>
166
- <li>Record the distribution.<code>/editorial-distribute &lt;slug&gt; &lt;platform&gt; &lt;url&gt;</code></li>
166
+ <li>Record the distribution.<code>/deskwork:distribute &lt;slug&gt; &lt;platform&gt; &lt;url&gt;</code></li>
167
167
  </ol>
168
168
  </div>
169
169
  <div class="eh-track">
@@ -235,11 +235,11 @@ function renderStudioSection(): RawHtml {
235
235
  <h4>Calendar panels</h4>
236
236
  <p>Five columns: <em>Ideas · Planned · Drafting · Review · Published</em>. Each row shows slug, title, stage-specific metadata (keywords for Planned; dates for Published), a file-present dot, and the active review workflow stamp when one exists.</p>
237
237
  <h4>Next-move column</h4>
238
- <p>Per row, the studio surfaces either a copy-to-clipboard command (for cognitive work that lives in Claude Code) or a one-click button (for mechanical transitions). <code>scaffold →</code> calls <code>/editorial-draft</code>. <code>publish →</code> calls <code>/editorial-publish</code>.</p>
238
+ <p>Per row, the studio surfaces either a copy-to-clipboard command (for cognitive work that lives in Claude Code) or a one-click button (for mechanical transitions). <code>scaffold →</code> calls <code>/deskwork:draft</code>. <code>publish →</code> calls <code>/deskwork:publish</code>.</p>
239
239
  <h4>Shortform coverage matrix</h4>
240
- <p>For each <em>Published</em> blog, a row of platform cells (reddit, linkedin, youtube, instagram). Shaded cells are covered by a DistributionRecord; empty cells surface the exact <code>/editorial-shortform-draft</code> command to copy.</p>
240
+ <p>For each <em>Published</em> blog, a row of platform cells (reddit, linkedin, youtube, instagram). Shaded cells are covered by a DistributionRecord; empty cells surface the exact <code>/deskwork:shortform-start</code> command to copy.</p>
241
241
  <h4>Voice-drift signal</h4>
242
- <p>A small panel on the right, backed by <code>/editorial-review-report</code>. Names the two voice-skill categories that are producing the most operator corrections. Shows once you have at least five terminal workflows on record.</p>
242
+ <p>A small panel on the right, backed by <code>/deskwork:review-report</code>. Names the two voice-skill categories that are producing the most operator corrections. Shows once you have at least five terminal workflows on record.</p>
243
243
  </div>
244
244
  <div class="eh-panel">
245
245
  <p class="eh-panel-head">Secondary surfaces</p>
@@ -250,7 +250,7 @@ function renderStudioSection(): RawHtml {
250
250
  <h4>Keyboard</h4>
251
251
  <p>In the studio: <kbd>1</kbd>–<kbd>5</kbd> jump to stage columns. In a longform review: <kbd>e</kbd> / double-click toggles edit mode; <kbd>a</kbd> approves; <kbd>i</kbd> iterates; <kbd>r</kbd> rejects; <kbd>j</kbd>/<kbd>k</kbd> step through margin notes; <kbd>?</kbd> shows a full shortcuts overlay.</p>
252
252
  <h4>Polling</h4>
253
- <p>Both routes poll every 8–10 seconds when idle. If the agent runs <code>/editorial-iterate</code> in Claude Code, a new draft version shows up in the browser without a reload.</p>
253
+ <p>Both routes poll every 8–10 seconds when idle. If the agent runs <code>/deskwork:iterate</code> in Claude Code, a new draft version shows up in the browser without a reload.</p>
254
254
  </div>
255
255
  </div>
256
256
  </section>`);
@@ -260,17 +260,17 @@ const RUNTHROUGH_STEPS: ReadonlyArray<{ title: string; op: string; body: RawHtml
260
260
  {
261
261
  title: 'Capture an idea',
262
262
  op: 'terminal',
263
- body: unsafe('<p>You have a title in mind. Run <code>/editorial-add "Your Title"</code>. A row lands in <em>Ideas</em>. Slug is generated; calendar is committed-able.</p>'),
263
+ body: unsafe('<p>You have a title in mind. Run <code>/deskwork:add "Your Title"</code>. A row lands in <em>Ideas</em>. Slug is generated; calendar is committed-able.</p>'),
264
264
  },
265
265
  {
266
266
  title: 'Promote to Planned',
267
267
  op: 'terminal',
268
- body: unsafe('<p>The idea has shape. Run <code>/editorial-plan &lt;slug&gt;</code>. You are prompted for target keywords and topic tags; they land on the calendar row. The studio\'s Planned column now shows it with a tag strip.</p>'),
268
+ body: unsafe('<p>The idea has shape. Run <code>/deskwork:plan &lt;slug&gt;</code>. You are prompted for target keywords and topic tags; they land on the calendar row. The studio\'s Planned column now shows it with a tag strip.</p>'),
269
269
  },
270
270
  {
271
271
  title: 'Scaffold the draft',
272
272
  op: 'studio or terminal',
273
- body: unsafe('<p>Click the <code>scaffold →</code> button on the row, or run <code>/editorial-draft --site &lt;site&gt; &lt;slug&gt;</code>. The blog file appears with frontmatter filled in, and the entry moves to <em>Drafting</em>.</p>'),
273
+ body: unsafe('<p>Click the <code>scaffold →</code> button on the row, or run <code>/deskwork:draft --site &lt;site&gt; &lt;slug&gt;</code>. The blog file appears with frontmatter filled in, and the entry moves to <em>Drafting</em>.</p>'),
274
274
  },
275
275
  {
276
276
  title: 'Write the prose',
@@ -280,7 +280,7 @@ const RUNTHROUGH_STEPS: ReadonlyArray<{ title: string; op: string; body: RawHtml
280
280
  {
281
281
  title: 'Open the review workflow',
282
282
  op: 'terminal',
283
- body: unsafe('<p><code>/editorial-draft-review &lt;slug&gt;</code> prints the dev URL: <code>/dev/editorial-review/&lt;slug&gt;</code>. The draft renders inside the review chrome. State: <em>open</em>.</p>'),
283
+ body: unsafe('<p><code>/deskwork:review-start &lt;slug&gt;</code> prints the dev URL: <code>/dev/editorial-review/&lt;workflow-id&gt;</code>. The draft renders inside the review chrome. State: <em>open</em>.</p>'),
284
284
  },
285
285
  {
286
286
  title: 'Annotate in the browser',
@@ -290,12 +290,12 @@ const RUNTHROUGH_STEPS: ReadonlyArray<{ title: string; op: string; body: RawHtml
290
290
  {
291
291
  title: 'Iterate',
292
292
  op: 'browser then terminal',
293
- body: unsafe('<p>Click <em>Iterate</em>. State becomes <em>iterating</em>. Back in Claude Code, run <code>/editorial-iterate</code>. The agent revises using the site voice skill, writes v2 to the journal, flips back to <em>in-review</em>. Polling surfaces v2 in the browser without a reload.</p>'),
293
+ body: unsafe('<p>Click <em>Iterate</em>. State becomes <em>iterating</em>. Back in Claude Code, run <code>/deskwork:iterate</code>. The agent revises using the site voice skill, writes v2 to the journal, flips back to <em>in-review</em>. Polling surfaces v2 in the browser without a reload.</p>'),
294
294
  },
295
295
  {
296
296
  title: 'Approve and write',
297
297
  op: 'browser then terminal',
298
- body: unsafe('<p>Click <em>Approve</em>. State becomes <em>approved</em>. Run <code>/editorial-approve</code>. The approved version is written to the blog file on disk; state becomes <em>applied</em>.</p>'),
298
+ body: unsafe('<p>Click <em>Approve</em>. State becomes <em>approved</em>. Run <code>/deskwork:approve</code>. The approved version is written to the blog file on disk; state becomes <em>applied</em>.</p>'),
299
299
  },
300
300
  {
301
301
  title: 'Commit by hand',
@@ -305,17 +305,17 @@ const RUNTHROUGH_STEPS: ReadonlyArray<{ title: string; op: string; body: RawHtml
305
305
  {
306
306
  title: 'Mark published',
307
307
  op: 'studio or terminal',
308
- body: unsafe('<p>Click <code>publish →</code> on the Drafting or Review row, or run <code>/editorial-publish &lt;slug&gt;</code>. The entry moves to <em>Published</em>; today\'s date is stamped as <code>datePublished</code>.</p>'),
308
+ body: unsafe('<p>Click <code>publish →</code> on the Drafting or Review row, or run <code>/deskwork:publish &lt;slug&gt;</code>. The entry moves to <em>Published</em>; today\'s date is stamped as <code>datePublished</code>.</p>'),
309
309
  },
310
310
  {
311
311
  title: 'Cross-post',
312
312
  op: 'terminal × platform',
313
- body: unsafe('<p>For each platform worth posting to: <code>/editorial-shortform-draft &lt;slug&gt; &lt;platform&gt;</code>. Review it exactly like a longform workflow. Approve, then post it yourself. Record the URL with <code>/editorial-distribute &lt;slug&gt; &lt;platform&gt; &lt;url&gt;</code>.</p>'),
313
+ body: unsafe('<p>For each platform worth posting to: <code>/deskwork:shortform-start &lt;slug&gt; &lt;platform&gt;</code>. Review it exactly like a longform workflow. Approve, then post it yourself. Record the URL with <code>/deskwork:distribute &lt;slug&gt; &lt;platform&gt; &lt;url&gt;</code>.</p>'),
314
314
  },
315
315
  {
316
316
  title: 'Reconcile and reflect',
317
317
  op: 'cadence',
318
- body: unsafe('<p><code>/editorial-reddit-sync</code> to pull external state; <code>/editorial-social-review</code> to see the coverage matrix; <code>/editorial-review-report</code> to see which voice-skill principles are drifting. Feed the observations back into the voice skills. The cycle compounds.</p>'),
318
+ body: unsafe('<p><code>/deskwork:review-report</code> shows which voice-skill principles are drifting. Feed the observations back into the voice skills. The cycle compounds.</p>'),
319
319
  },
320
320
  ];
321
321
 
@@ -410,8 +410,8 @@ function renderReferenceSection(): RawHtml {
410
410
  <h4>First-run tripwires</h4>
411
411
  <dl>
412
412
  <dt>404 on /dev/*</dt><dd>the dev routes only run when <code>deskwork-studio</code> is up. Start it: <code>npx tsx packages/studio/src/server.ts</code>.</dd>
413
- <dt>no galley to review</dt><dd>start one with <code>/editorial-draft-review --site &lt;site&gt; &lt;slug&gt;</code>.</dd>
414
- <dt>iterate doesn't trigger</dt><dd>the agent has to run <code>/editorial-iterate</code>. The browser button just marks the workflow; Claude does the writing.</dd>
413
+ <dt>no galley to review</dt><dd>start one with <code>/deskwork:review-start --site &lt;site&gt; &lt;slug&gt;</code>.</dd>
414
+ <dt>iterate doesn't trigger</dt><dd>the agent has to run <code>/deskwork:iterate</code>. The browser button just marks the workflow; Claude does the writing.</dd>
415
415
  </dl>
416
416
  </div>
417
417
  </div>
@@ -17,5 +17,5 @@
17
17
  * Read-only — links to existing routes only. No editing capability here.
18
18
  */
19
19
  import type { StudioContext } from '../routes/api.ts';
20
- export declare function renderStudioIndex(_ctx: StudioContext): string;
20
+ export declare function renderStudioIndex(ctx: StudioContext): string;
21
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAoKtD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CA6B7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA8NtD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CA8B5D"}
@@ -16,92 +16,137 @@
16
16
  *
17
17
  * Read-only — links to existing routes only. No editing capability here.
18
18
  */
19
+ import { readWorkflows } from '@deskwork/core/review/pipeline';
19
20
  import { html, unsafe } from "./html.js";
20
21
  import { layout } from "./layout.js";
21
22
  import { renderEditorialFolio } from "./chrome.js";
22
- const SECTIONS = [
23
- {
24
- ornament: '¶',
25
- name: 'Pipeline',
26
- count: 'i. 1 surface',
27
- entries: [
28
- {
29
- numeral: 'I',
30
- titleHtml: 'Dashboard',
31
- titleText: 'Dashboard',
32
- route: '/dev/editorial-studio',
33
- desc: 'Press-check. The calendar across all sites; awaiting press; recent proofs; voice-drift signal.',
34
- },
35
- ],
36
- },
37
- {
38
- ornament: '¶',
39
- name: 'Review desk',
40
- count: 'ii.–iii. — 2 surfaces',
41
- entries: [
42
- {
43
- numeral: 'II',
44
- titleHtml: 'Shortform reviews',
45
- titleText: 'Shortform reviews',
46
- route: '/dev/editorial-review-shortform',
47
- desc: 'Cross-platform copy desk. Reddit, LinkedIn, YouTube, Instagram galley slips, one per platform.',
48
- },
49
- {
50
- numeral: 'III',
51
- titleHtml: 'Longform reviews',
52
- titleText: 'Longform reviews',
53
- route: '/dev/editorial-review/<slug>',
54
- template: { prefix: '/dev/editorial-review/', placeholder: '<slug>' },
55
- desc: 'Per-entry margin notes, decisions, iterate flow.',
56
- hint: 'entry-by-entry',
57
- postHint: 'Reach via the Dashboard or Content view; each review is opened against a specific slug.',
58
- },
59
- ],
60
- },
61
- {
62
- ornament: '',
63
- name: 'Browse',
64
- count: 'iv.–v. — 2 surfaces',
65
- entries: [
66
- {
67
- numeral: 'IV',
68
- titleHtml: 'Content view',
69
- titleText: 'Content view',
70
- route: '/dev/content',
71
- desc: 'The shape of the work. A drillable tree of nodes; click any to read its head matter and browse its scrapbook.',
72
- },
73
- {
74
- numeral: 'V',
75
- titleHtml: 'Scrapbook',
76
- titleText: 'Scrapbook',
77
- route: '/dev/scrapbook/<site>/<path>',
78
- template: { prefix: '/dev/scrapbook/', placeholder: '<site>/<path>' },
79
- desc: 'Research, receipts, working notes. Addressed by hierarchical path; secret items appear in their own section.',
80
- hint: 'path-addressed',
81
- postHint: "Reach via the Content view's per-node drawer, or address directly.",
82
- },
83
- ],
84
- },
85
- {
86
- ornament: '¶',
87
- name: 'Reference',
88
- count: 'vi. 1 surface',
89
- entries: [
90
- {
91
- numeral: 'VI',
92
- titleHtml: "The Compositor's <em>Manual</em>",
93
- titleText: "The Compositor's Manual",
94
- route: '/dev/editorial-help',
95
- desc: 'The workflow, the skill catalogue, the names of the things — read once, return when the work asks.',
96
- },
97
- ],
98
- },
99
- ];
23
+ /**
24
+ * Pick the workflow that should be the default Longform-reviews target —
25
+ * the most-recent open longform workflow (in-review or open). Returns
26
+ * null when no candidate exists; the caller falls back to the dashboard's
27
+ * Review section anchor.
28
+ */
29
+ function pickDefaultLongformWorkflow(workflows) {
30
+ const candidates = workflows
31
+ .filter((w) => w.contentKind === 'longform')
32
+ .filter((w) => w.state === 'in-review' || w.state === 'open')
33
+ .slice()
34
+ .sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
35
+ return candidates[0] ?? null;
36
+ }
37
+ function buildSections(ctx) {
38
+ const workflows = (() => {
39
+ try {
40
+ return readWorkflows(ctx.projectRoot, ctx.config);
41
+ }
42
+ catch {
43
+ return [];
44
+ }
45
+ })();
46
+ const longformDefault = pickDefaultLongformWorkflow(workflows);
47
+ // Issue #107: III links to the most-recent in-review longform when
48
+ // one exists, else falls back to the dashboard's Review section
49
+ // anchor (`#stage-review`, mounted in sub-phase D). The visual
50
+ // template hint stays alongside the link so adopters still see the
51
+ // URL shape — `<slug>` placeholder shown in red-pencil italic.
52
+ const longformLinkHref = longformDefault !== null
53
+ ? `/dev/editorial-review/${longformDefault.id}`
54
+ : '/dev/editorial-studio#stage-review';
55
+ return [
56
+ {
57
+ ornament: '',
58
+ name: 'Pipeline',
59
+ count: 'i. — 1 surface',
60
+ entries: [
61
+ {
62
+ numeral: 'I',
63
+ titleHtml: 'Dashboard',
64
+ titleText: 'Dashboard',
65
+ route: '/dev/editorial-studio',
66
+ desc: 'Press-check. The calendar across all sites; awaiting press; recent proofs; voice-drift signal.',
67
+ },
68
+ ],
69
+ },
70
+ {
71
+ ornament: '',
72
+ name: 'Review desk',
73
+ count: 'ii.–iii. — 2 surfaces',
74
+ entries: [
75
+ {
76
+ numeral: 'II',
77
+ titleHtml: 'Shortform reviews',
78
+ titleText: 'Shortform reviews',
79
+ route: '/dev/editorial-review-shortform',
80
+ desc: 'Cross-platform copy desk. Reddit, LinkedIn, YouTube, Instagram galley slips, one per platform.',
81
+ },
82
+ {
83
+ numeral: 'III',
84
+ titleHtml: 'Longform reviews',
85
+ titleText: 'Longform reviews',
86
+ route: '/dev/editorial-review/<slug>',
87
+ linkHref: longformLinkHref,
88
+ template: { prefix: '/dev/editorial-review/', placeholder: '<slug>' },
89
+ desc: 'Per-entry margin notes, decisions, iterate flow.',
90
+ hint: 'entry-by-entry',
91
+ postHint: longformDefault !== null
92
+ ? `Defaults to the most-recent in-review longform (${longformDefault.slug}). Or reach via the Dashboard or Content view.`
93
+ : 'Defaults to the dashboard\'s Review section. Open a longform workflow to populate the per-entry deep-link.',
94
+ },
95
+ ],
96
+ },
97
+ {
98
+ ornament: '¶',
99
+ name: 'Browse',
100
+ count: 'iv.–v. — 2 surfaces',
101
+ entries: [
102
+ {
103
+ numeral: 'IV',
104
+ titleHtml: 'Content view',
105
+ titleText: 'Content view',
106
+ route: '/dev/content',
107
+ desc: 'The shape of the work. A drillable tree of nodes; click any to read its head matter and browse its scrapbook.',
108
+ },
109
+ {
110
+ numeral: 'V',
111
+ titleHtml: 'Scrapbook',
112
+ titleText: 'Scrapbook',
113
+ route: '/dev/scrapbook/<site>/<path>',
114
+ // Issue #107: scrapbook is reached by drilling into a content
115
+ // node. Default link points at the content view; the URL
116
+ // template hint stays so adopters see the addressing shape.
117
+ linkHref: '/dev/content',
118
+ template: { prefix: '/dev/scrapbook/', placeholder: '<site>/<path>' },
119
+ desc: 'Research, receipts, working notes. Addressed by hierarchical path; secret items appear in their own section.',
120
+ hint: 'path-addressed',
121
+ postHint: "Reach via the Content view's per-node drawer, or address directly.",
122
+ },
123
+ ],
124
+ },
125
+ {
126
+ ornament: '¶',
127
+ name: 'Reference',
128
+ count: 'vi. — 1 surface',
129
+ entries: [
130
+ {
131
+ numeral: 'VI',
132
+ titleHtml: "The Compositor's <em>Manual</em>",
133
+ titleText: "The Compositor's Manual",
134
+ route: '/dev/editorial-help',
135
+ desc: 'The workflow, the skill catalogue, the names of the things — read once, return when the work asks.',
136
+ },
137
+ ],
138
+ },
139
+ ];
140
+ }
100
141
  function renderEntryTitle(entry) {
101
- if (entry.template) {
142
+ // Explicit linkHref wins. Otherwise: non-templated entries link to
143
+ // their route; templated entries with no fallback render as plain
144
+ // text (the route is templated, can't be linked verbatim).
145
+ const href = entry.linkHref ?? (entry.template ? null : entry.route);
146
+ if (href === null) {
102
147
  return html `<span class="er-toc-entry__title">${unsafe(entry.titleHtml)}</span>`;
103
148
  }
104
- return html `<a class="er-toc-entry__title" href="${entry.route}">${unsafe(entry.titleHtml)}</a>`;
149
+ return html `<a class="er-toc-entry__title" href="${href}">${unsafe(entry.titleHtml)}</a>`;
105
150
  }
106
151
  function renderEntryRoute(entry) {
107
152
  if (entry.template) {
@@ -142,7 +187,8 @@ function renderSection(section) {
142
187
  </ol>
143
188
  </section>`);
144
189
  }
145
- export function renderStudioIndex(_ctx) {
190
+ export function renderStudioIndex(ctx) {
191
+ const sections = buildSections(ctx);
146
192
  const body = html `
147
193
  ${renderEditorialFolio('index', 'index of the press')}
148
194
  <main class="er-toc-page">
@@ -154,9 +200,9 @@ export function renderStudioIndex(_ctx) {
154
200
  Begin where the work is.
155
201
  </p>
156
202
  </header>
157
- ${SECTIONS.map(renderSection)}
203
+ ${sections.map(renderSection)}
158
204
  <footer class="er-toc-colophon">
159
- Pressed in the deskwork studio. Loopback only.<br>
205
+ Pressed in the deskwork studio.<br>
160
206
  <span class="er-toc-colophon__rule"></span>
161
207
  </footer>
162
208
  </main>`;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"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"}