@agimon-ai/doompi-author 0.0.1-alpha.3 → 0.0.1-alpha.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-author",
3
- "version": "0.0.1-alpha.3",
3
+ "version": "0.0.1-alpha.6",
4
4
  "description": "Visual steering workspace for focused document review and bounded authoring",
5
5
  "keywords": [
6
6
  "ai",
@@ -35,7 +35,8 @@
35
35
  "llms.txt",
36
36
  "README.md",
37
37
  "LICENSE",
38
- "package.json"
38
+ "package.json",
39
+ "!src/web/**/*.stories.tsx"
39
40
  ],
40
41
  "type": "module",
41
42
  "main": "./dist/index.cjs",
@@ -74,10 +75,10 @@
74
75
  "saxes": "6.0.0",
75
76
  "yauzl": "3.4.0",
76
77
  "yazl": "3.3.1",
77
- "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.64",
78
- "@agimon-ai/doompi-web-components": "0.0.1-alpha.24",
79
- "@agimon-ai/doompi-web-contracts": "0.0.1-alpha.27",
80
- "@agimon-ai/doompi-web-security": "0.0.1-alpha.26"
78
+ "@agimon-ai/doompi-web-contracts": "0.0.1-alpha.30",
79
+ "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.67",
80
+ "@agimon-ai/doompi-web-components": "0.0.1-alpha.27",
81
+ "@agimon-ai/doompi-web-security": "0.0.1-alpha.29"
81
82
  },
82
83
  "devDependencies": {
83
84
  "@earendil-works/pi-coding-agent": "0.85.1",
@@ -94,7 +95,7 @@
94
95
  "tsdown": "0.23.0",
95
96
  "typescript": "7.0.2",
96
97
  "vitest": "5.0.0",
97
- "@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.61"
98
+ "@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.64"
98
99
  },
99
100
  "peerDependencies": {
100
101
  "@earendil-works/pi-coding-agent": "0.85.1"
@@ -53,7 +53,7 @@ export function AuthorDocumentPanel(props: AuthorDocumentPanelProps) {
53
53
  return <fallback.panel {...props} />;
54
54
  }
55
55
  return (
56
- <p data-testid="author-mode-inactive" className="p-3 text-xs text-doom-dim">
56
+ <p data-testid="author-mode-inactive" className="p-3 text-sm text-doom-dim">
57
57
  No file viewer is available for this path.
58
58
  </p>
59
59
  );
@@ -114,7 +114,7 @@ function ActiveAuthorDocumentPanel({ path, sessionId, statuses }: AuthorDocument
114
114
  };
115
115
  }, [kind, path, sessionId]);
116
116
  if (document === undefined || sessionId === null) {
117
- return <p className="p-4 text-[11px] text-doom-faint">{status ?? 'Loading document...'}</p>;
117
+ return <p className="p-4 text-sm text-doom-faint">{status ?? 'Loading document...'}</p>;
118
118
  }
119
119
 
120
120
  const save = async (): Promise<void> => {
@@ -145,7 +145,7 @@ function ActiveAuthorDocumentPanel({ path, sessionId, statuses }: AuthorDocument
145
145
  return (
146
146
  <section data-testid="author-document" className="flex min-h-0 flex-1 flex-col">
147
147
  <header className="flex items-center gap-2 border-b border-doom-border px-4 py-2">
148
- <strong className="min-w-0 flex-1 truncate text-sm text-doom-hi">{document.title ?? document.path}</strong>
148
+ <strong className="min-w-0 flex-1 truncate text-base text-doom-hi">{document.title ?? document.path}</strong>
149
149
  {document.kind === 'markdown' ? (
150
150
  <Button
151
151
  size="xs"
@@ -157,10 +157,10 @@ function ActiveAuthorDocumentPanel({ path, sessionId, statuses }: AuthorDocument
157
157
  </Button>
158
158
  ) : null}
159
159
  {document.kind === 'video' ? (
160
- <span className="text-sm text-doom-dim">Video feedback</span>
160
+ <span className="text-base text-doom-dim">Video feedback</span>
161
161
  ) : (
162
162
  <Button
163
- className="min-h-11 px-4 text-sm"
163
+ className="min-h-11 px-4 text-base"
164
164
  variant="outline"
165
165
  data-testid="author-save"
166
166
  disabled={document.revisions.length === 0 || document.savingVersion !== undefined}
@@ -170,7 +170,7 @@ function ActiveAuthorDocumentPanel({ path, sessionId, statuses }: AuthorDocument
170
170
  </Button>
171
171
  )}
172
172
  </header>
173
- {status === undefined ? null : <output className="px-4 py-1 text-[10px] text-doom-faint">{status}</output>}
173
+ {status === undefined ? null : <output className="px-4 py-1 text-xs text-doom-faint">{status}</output>}
174
174
  <div className="relative flex min-h-0 flex-1 overflow-hidden">
175
175
  {document.kind === 'text' || document.kind === 'markdown' ? (
176
176
  textPanel
@@ -69,7 +69,7 @@ export function AuthorGridOverlay({
69
69
  const row = Math.floor(index / AUTHOR_GRID_SIZE);
70
70
  return (
71
71
  <div key={index} className="relative border border-doom-red/25">
72
- <span className="absolute left-1 top-0.5 rounded bg-doom-deep/80 px-1 text-[8px] font-bold text-doom-red">
72
+ <span className="absolute left-1 top-0.5 rounded bg-doom-deep/80 px-1 text-2xs font-bold text-doom-red">
73
73
  {AUTHOR_GRID_COLUMNS[column]}
74
74
  {row + 1}
75
75
  </span>
@@ -279,7 +279,7 @@ export function AuthorMediaView({
279
279
  height: `${String(rect.height * 100)}%`,
280
280
  }}
281
281
  >
282
- <span className="absolute -left-2 -top-2 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-[9px] font-bold text-doom-deep">
282
+ <span className="absolute -left-2 -top-2 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-2xs font-bold text-doom-deep">
283
283
  {ordinal}
284
284
  </span>
285
285
  </div>,
@@ -350,7 +350,7 @@ export function AuthorMediaView({
350
350
  }}
351
351
  />
352
352
  ) : null}
353
- {error ? <output className="text-sm text-doom-red">{error}</output> : null}
353
+ {error ? <output className="text-base text-doom-red">{error}</output> : null}
354
354
  </div>
355
355
  );
356
356
  }
@@ -34,12 +34,12 @@ export function AuthorPanel({ sessionId, activeMinorModes, submitCapture, status
34
34
  <section data-testid="author-panel" className="flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto p-3">
35
35
  {sessionId !== null && workspace !== undefined && focused !== undefined ? (
36
36
  <>
37
- <h2 className="text-sm font-semibold text-doom-text">Annotations</h2>
38
- <p className="text-sm leading-normal text-doom-dim sm:text-xs">
37
+ <h2 className="text-base font-semibold text-doom-text">Annotations</h2>
38
+ <p className="text-base leading-normal text-doom-dim sm:text-sm">
39
39
  Select a region, add a comment, then submit here. Requests queue while the agent is working.
40
40
  </p>
41
41
  {focused.kind === 'video' ? (
42
- <p className="text-sm text-doom-dim sm:text-xs">
42
+ <p className="text-base text-doom-dim sm:text-sm">
43
43
  Annotations reference video frames. They do not save changes to the source video.
44
44
  </p>
45
45
  ) : null}
@@ -47,7 +47,7 @@ export function AuthorPanel({ sessionId, activeMinorModes, submitCapture, status
47
47
  {autonomousVoiceGridVisible(statuses) && grid !== undefined ? (
48
48
  <div
49
49
  data-testid="author-grid-snapshot"
50
- className="rounded border border-doom-red/40 bg-doom-red/5 p-2 text-sm text-doom-dim"
50
+ className="rounded border border-doom-red/40 bg-doom-red/5 p-2 text-base text-doom-dim"
51
51
  >
52
52
  <strong className="text-doom-red">VOICE GRID A1–H8</strong>
53
53
  <p className="mt-1 truncate">token {grid.geometryToken}</p>
@@ -57,7 +57,7 @@ export function AuthorPanel({ sessionId, activeMinorModes, submitCapture, status
57
57
  {workspace.regions.length > 0 ? (
58
58
  <div className="space-y-1.5 border-b border-doom-border-soft pb-3">
59
59
  <Button
60
- className="min-h-11 min-w-11 w-full text-sm [@media(pointer:fine)]:min-h-8 sm:text-xs"
60
+ className="min-h-11 min-w-11 w-full text-base [@media(pointer:fine)]:min-h-8 sm:text-sm"
61
61
  variant="outline"
62
62
  data-testid="author-attach-capture"
63
63
  disabled={capturing || workspace.candidate !== undefined || submitCapture === undefined}
@@ -87,16 +87,16 @@ export function AuthorPanel({ sessionId, activeMinorModes, submitCapture, status
87
87
  : `Submit ${workspace.regions.length} annotation${workspace.regions.length === 1 ? '' : 's'}`}
88
88
  </Button>
89
89
  {workspace.candidate ? (
90
- <p className="text-sm text-doom-dim sm:text-xs">
90
+ <p className="text-base text-doom-dim sm:text-sm">
91
91
  Add or discard the current selection before submitting.
92
92
  </p>
93
93
  ) : null}
94
94
  </div>
95
95
  ) : null}
96
96
  {submitCapture === undefined ? (
97
- <output className="text-xs text-doom-red">Submission unavailable. Reload to update the app.</output>
97
+ <output className="text-sm text-doom-red">Submission unavailable. Reload to update the app.</output>
98
98
  ) : null}
99
- {captureStatus ? <output className="block text-xs text-doom-dim">{captureStatus}</output> : null}
99
+ {captureStatus ? <output className="block text-sm text-doom-dim">{captureStatus}</output> : null}
100
100
  </>
101
101
  ) : null}
102
102
  <AuthorRequestLog requests={workspace?.requests ?? []} />
@@ -25,10 +25,10 @@ export function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string
25
25
  <section className="space-y-2" data-testid="author-region-drafts">
26
26
  {workspace.candidate ? (
27
27
  <>
28
- <h3 className="text-sm font-semibold text-doom-text">Current selection</h3>
29
- <p className="text-sm text-doom-dim sm:text-xs">Add a comment to keep this selection as an unsent draft.</p>
28
+ <h3 className="text-base font-semibold text-doom-text">Current selection</h3>
29
+ <p className="text-base text-doom-dim sm:text-sm">Add a comment to keep this selection as an unsent draft.</p>
30
30
  {workspace.candidate.anchor.kind === 'video-time-rect' ? (
31
- <p className="text-sm text-doom-dim sm:text-xs">
31
+ <p className="text-base text-doom-dim sm:text-sm">
32
32
  Frame at {workspace.candidate.anchor.timeSeconds.toFixed(3)}s
33
33
  </p>
34
34
  ) : null}
@@ -38,10 +38,10 @@ export function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string
38
38
  onChange={(event) => setComment(event.target.value)}
39
39
  placeholder="What should change here?"
40
40
  rows={3}
41
- className="min-h-11 w-full resize-y rounded border border-doom-border bg-doom-deep p-2 text-base leading-normal text-doom-text focus:border-doom-red focus:outline-none sm:text-xs"
41
+ className="min-h-11 w-full resize-y rounded border border-doom-border bg-doom-deep p-2 text-lg leading-normal text-doom-text focus:border-doom-red focus:outline-none sm:text-sm"
42
42
  />
43
43
  <Button
44
- className="min-h-11 min-w-11 text-sm [@media(pointer:fine)]:min-h-8 sm:text-xs"
44
+ className="min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm"
45
45
  variant="outline"
46
46
  onClick={add}
47
47
  disabled={!workspace.candidate || !comment.trim() || workspace.regions.length >= 16}
@@ -50,7 +50,7 @@ export function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string
50
50
  </Button>
51
51
  <Button
52
52
  variant="ghost"
53
- className="min-h-11 min-w-11 text-sm [@media(pointer:fine)]:min-h-8 sm:text-xs"
53
+ className="min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm"
54
54
  onClick={() => {
55
55
  setAuthorRegionCandidate(sessionId, undefined);
56
56
  setComment('');
@@ -61,15 +61,15 @@ export function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string
61
61
  </Button>
62
62
  </>
63
63
  ) : null}
64
- {error ? <output className="block text-sm text-doom-red">{error}</output> : null}
64
+ {error ? <output className="block text-base text-doom-red">{error}</output> : null}
65
65
  {workspace.regions.length > 0 ? (
66
- <h3 className="text-sm font-semibold text-doom-text">Unsent drafts ({workspace.regions.length})</h3>
66
+ <h3 className="text-base font-semibold text-doom-text">Unsent drafts ({workspace.regions.length})</h3>
67
67
  ) : null}
68
68
  <ol className="space-y-2">
69
69
  {workspace.regions.map((region, index) => (
70
70
  <li
71
71
  key={region.id}
72
- className="rounded border border-doom-border bg-doom-panel p-2 text-sm leading-normal text-doom-text sm:text-xs"
72
+ className="rounded border border-doom-border bg-doom-panel p-2 text-base leading-normal text-doom-text sm:text-sm"
73
73
  >
74
74
  <span>
75
75
  ({index + 1}) {region.comment}
@@ -77,7 +77,7 @@ export function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string
77
77
  {region.anchor.kind === 'video-time-rect' ? (
78
78
  <Button
79
79
  variant="outline"
80
- className="min-h-11 min-w-11 text-sm [@media(pointer:fine)]:min-h-8 sm:text-xs"
80
+ className="min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm"
81
81
  disabled={workspace.candidate !== undefined}
82
82
  onClick={() => {
83
83
  if (region.anchor.kind === 'video-time-rect') seekAuthorVideo(sessionId, region.anchor.timeSeconds);
@@ -87,7 +87,7 @@ export function AuthorRegionDrafts({ sessionId, workspace }: { sessionId: string
87
87
  </Button>
88
88
  ) : null}
89
89
  <Button
90
- className="min-h-11 min-w-11 text-sm [@media(pointer:fine)]:min-h-8 sm:text-xs"
90
+ className="min-h-11 min-w-11 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm"
91
91
  variant="ghost"
92
92
  aria-label={`Remove region ${index + 1}`}
93
93
  onClick={() => removeAuthorRegion(sessionId, region.id)}
@@ -72,8 +72,8 @@ function RequestRecord({ request, prominent = false }: { request: AuthorRequestR
72
72
  return (
73
73
  <article data-testid={prominent ? 'author-active-request' : undefined} className="space-y-3">
74
74
  <header className="border-b border-doom-border-soft pb-3">
75
- <p className="text-[9px] font-bold tracking-[0.18em] text-doom-faint">DOCUMENT CONTEXT</p>
76
- <p className="mt-2 flex items-center gap-2 truncate text-[13px] font-bold text-doom-hi">
75
+ <p className="text-2xs font-bold tracking-widest text-doom-faint">DOCUMENT CONTEXT</p>
76
+ <p className="mt-2 flex items-center gap-2 truncate text-base font-bold text-doom-hi">
77
77
  <span aria-hidden className="text-doom-magenta">
78
78
  ↗
79
79
  </span>
@@ -85,16 +85,16 @@ function RequestRecord({ request, prominent = false }: { request: AuthorRequestR
85
85
  <ol className="space-y-3">
86
86
  {request.regions.map((region, index) => (
87
87
  <li key={region.id} className="space-y-2">
88
- <p className="font-mono text-[9px] font-bold uppercase tracking-[0.14em] text-doom-yellow">
88
+ <p className="font-mono text-2xs font-bold uppercase tracking-wider text-doom-yellow">
89
89
  WHERE · {request.regions.length > 1 ? `${index + 1} · ` : ''}
90
90
  {documentName(request.documentPath)} / {anchorLabel(region.anchor)} · rev {request.revision}
91
91
  </p>
92
92
  {region.quote ? (
93
- <blockquote className="line-clamp-3 text-[11px] italic leading-relaxed text-doom-text">
93
+ <blockquote className="line-clamp-3 text-sm italic leading-relaxed text-doom-text">
94
94
  “{region.quote}”
95
95
  </blockquote>
96
96
  ) : null}
97
- <p className="text-[10px] leading-relaxed text-doom-dim">{region.comment}</p>
97
+ <p className="text-xs leading-relaxed text-doom-dim">{region.comment}</p>
98
98
  </li>
99
99
  ))}
100
100
  </ol>
@@ -104,7 +104,7 @@ function RequestRecord({ request, prominent = false }: { request: AuthorRequestR
104
104
  data-testid={prominent ? 'author-operation-card' : undefined}
105
105
  className={`rounded border p-3 ${STATUS_STYLES[request.status]}`}
106
106
  >
107
- <p className="font-mono text-[10px] font-bold tracking-[0.14em]">
107
+ <p className="font-mono text-xs font-bold tracking-wider">
108
108
  ●{' '}
109
109
  {request.status === 'CHANGING'
110
110
  ? 'WORKING'
@@ -114,12 +114,12 @@ function RequestRecord({ request, prominent = false }: { request: AuthorRequestR
114
114
  ? 'ERROR'
115
115
  : request.status}
116
116
  </p>
117
- <p className="mt-2 text-[12px] leading-relaxed text-doom-hi">
117
+ <p className="mt-2 text-sm leading-relaxed text-doom-hi">
118
118
  {request.currentOperation || STATUS_LABELS[request.status]}
119
119
  </p>
120
- {request.error ? <p className="mt-2 text-[10px] leading-relaxed text-doom-red">{request.error}</p> : null}
120
+ {request.error ? <p className="mt-2 text-xs leading-relaxed text-doom-red">{request.error}</p> : null}
121
121
  {request.before !== undefined || request.after !== undefined ? (
122
- <details className="mt-2 border-t border-current/20 pt-2 text-[10px] text-doom-dim">
122
+ <details className="mt-2 border-t border-current/20 pt-2 text-xs text-doom-dim">
123
123
  <summary className="cursor-pointer select-none">change preview</summary>
124
124
  {request.before !== undefined ? (
125
125
  <pre className="mt-2 max-h-28 overflow-auto whitespace-pre-wrap break-words font-mono">
@@ -136,15 +136,15 @@ function RequestRecord({ request, prominent = false }: { request: AuthorRequestR
136
136
  </section>
137
137
 
138
138
  <section className="space-y-2">
139
- <p className="text-[9px] font-bold tracking-[0.18em] text-doom-faint">REQUEST · HOW TO CHANGE</p>
139
+ <p className="text-2xs font-bold tracking-widest text-doom-faint">REQUEST · HOW TO CHANGE</p>
140
140
  <div className="rounded border border-doom-border bg-doom-deep p-3">
141
- <p className="whitespace-pre-wrap text-[11px] leading-relaxed text-doom-text">
141
+ <p className="whitespace-pre-wrap text-sm leading-relaxed text-doom-text">
142
142
  {instruction || 'No additional instruction.'}
143
143
  </p>
144
144
  </div>
145
145
  </section>
146
146
 
147
- <footer className="font-mono text-[9px] text-doom-dim">{progressLabel(request)}</footer>
147
+ <footer className="font-mono text-2xs text-doom-dim">{progressLabel(request)}</footer>
148
148
  </article>
149
149
  );
150
150
  }
@@ -154,15 +154,15 @@ export function AuthorRequestLog({ requests }: { requests: readonly AuthorReques
154
154
  const earlier = requests.slice(0, -1).toReversed();
155
155
  return (
156
156
  <section data-testid="author-request-history" className="space-y-3">
157
- <h3 className="text-[9px] font-bold tracking-[0.18em] text-doom-faint">AUTHORING</h3>
157
+ <h3 className="text-2xs font-bold tracking-widest text-doom-faint">AUTHORING</h3>
158
158
  {latest === undefined ? (
159
- <p className="text-[11px] leading-relaxed text-doom-dim">No requests or changes yet.</p>
159
+ <p className="text-sm leading-relaxed text-doom-dim">No requests or changes yet.</p>
160
160
  ) : (
161
161
  <RequestRecord request={latest} prominent />
162
162
  )}
163
163
  {earlier.length > 0 ? (
164
164
  <details className="border-t border-doom-border-soft pt-3" data-testid="author-earlier-requests">
165
- <summary className="cursor-pointer select-none text-[9px] font-bold tracking-[0.14em] text-doom-faint">
165
+ <summary className="cursor-pointer select-none text-2xs font-bold tracking-wider text-doom-faint">
166
166
  EARLIER REQUESTS ({earlier.length})
167
167
  </summary>
168
168
  <ol className="mt-3 space-y-5">
@@ -65,10 +65,10 @@ export function AuthorStructuredView({
65
65
  }
66
66
  return (
67
67
  <div data-testid="author-structured" className="min-h-0 flex-1 space-y-3 overflow-auto p-4">
68
- {!cells ? <p className="text-[10px] text-doom-faint">Slide text view, not a layout-faithful rendering.</p> : null}
68
+ {!cells ? <p className="text-xs text-doom-faint">Slide text view, not a layout-faithful rendering.</p> : null}
69
69
  {[...groups].map(([location, fragments]) => (
70
70
  <section key={location} className="space-y-1">
71
- <h3 className="text-[10px] text-doom-faint">{location}</h3>
71
+ <h3 className="text-xs text-doom-faint">{location}</h3>
72
72
  <div className={cells ? 'flex gap-1' : 'space-y-2'}>
73
73
  {fragments.map((fragment) => (
74
74
  <div
@@ -78,7 +78,7 @@ export function AuthorStructuredView({
78
78
  className={`${cells ? 'w-40 shrink-0' : ''} relative rounded ${displayedByFragment.has(fragment.id) ? 'ring-1 ring-doom-yellow' : ''}`}
79
79
  >
80
80
  {displayedByFragment.has(fragment.id) ? (
81
- <span className="absolute -left-1 -top-1 z-10 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-[9px] font-bold text-doom-deep">
81
+ <span className="absolute -left-1 -top-1 z-10 flex h-4 min-w-4 items-center justify-center rounded-full bg-doom-yellow px-1 text-2xs font-bold text-doom-deep">
82
82
  {displayedByFragment.get(fragment.id)}
83
83
  </span>
84
84
  ) : null}
@@ -108,7 +108,7 @@ export function AuthorStructuredView({
108
108
  aria-label={fragment.location}
109
109
  value={fragment.text}
110
110
  readOnly={fragment.readOnly === true}
111
- className="w-full rounded border border-doom-border bg-doom-deep p-2 text-[11px] text-doom-text"
111
+ className="w-full rounded border border-doom-border bg-doom-deep p-2 text-sm text-doom-text"
112
112
  onChange={(event) => reviseAuthorFragment(sessionId, document.path, fragment.id, event.target.value)}
113
113
  />
114
114
  </div>
@@ -59,7 +59,7 @@ export function AuthorTextView({
59
59
  return (
60
60
  <div ref={host} className="flex min-h-0 flex-1 flex-col">
61
61
  {preview ? (
62
- <div data-testid="author-markdown" className="min-h-0 flex-1 overflow-auto p-4 text-[12px] text-doom-text">
62
+ <div data-testid="author-markdown" className="min-h-0 flex-1 overflow-auto p-4 text-sm text-doom-text">
63
63
  <Markdown text={document.content ?? ''} />
64
64
  </div>
65
65
  ) : (
@@ -72,7 +72,7 @@ export function AuthorToolPalette({
72
72
  ];
73
73
  return (
74
74
  <section data-testid="author-tool-palette" className="space-y-2 border-b border-doom-border-soft pb-3">
75
- <div className="flex justify-between text-xs text-doom-dim">
75
+ <div className="flex justify-between text-sm text-doom-dim">
76
76
  <h3 className="font-bold tracking-widest">TOOLS</h3>
77
77
  <span>focused tab</span>
78
78
  </div>
@@ -85,19 +85,19 @@ export function AuthorToolPalette({
85
85
  aria-label={tool.label === 'Region' ? 'mark region' : tool.label}
86
86
  aria-pressed={tool.active}
87
87
  onClick={tool.action}
88
- className={`min-h-11 min-w-11 gap-1.5 rounded border text-sm [@media(pointer:fine)]:min-h-8 sm:text-xs ${tool.active ? 'border-doom-red bg-doom-red/10 text-doom-red hover:bg-doom-red/15' : 'border-doom-border bg-doom-panel text-doom-dim'}`}
88
+ className={`min-h-11 min-w-11 gap-1.5 rounded border text-base [@media(pointer:fine)]:min-h-8 sm:text-sm ${tool.active ? 'border-doom-red bg-doom-red/10 text-doom-red hover:bg-doom-red/15' : 'border-doom-border bg-doom-panel text-doom-dim'}`}
89
89
  >
90
90
  <span aria-hidden="true">{tool.glyph}</span>
91
91
  {tool.label}
92
92
  </Button>
93
93
  ))}
94
94
  </div>
95
- <p className="text-sm leading-normal text-doom-dim sm:text-xs">
95
+ <p className="text-base leading-normal text-doom-dim sm:text-sm">
96
96
  {activeTool === 'mark'
97
97
  ? 'Drag over the document to mark a region.'
98
98
  : 'Choose Region to mark an area for a comment.'}
99
99
  </p>
100
- {error ? <output className="block text-sm text-doom-red">{error}</output> : null}
100
+ {error ? <output className="block text-base text-doom-red">{error}</output> : null}
101
101
  </section>
102
102
  );
103
103
  }
@@ -27,14 +27,14 @@ export function AuthorVideoControls({
27
27
  const duration = playback.duration;
28
28
  const invalid =
29
29
  seconds.trim() === '' || !Number.isFinite(Number(seconds)) || Number(seconds) < 0 || Number(seconds) > duration;
30
- const buttonClass = 'min-h-11 px-3 text-sm [@media(pointer:fine)]:min-h-8 sm:text-xs';
30
+ const buttonClass = 'min-h-11 px-3 text-base [@media(pointer:fine)]:min-h-8 sm:text-sm';
31
31
  return (
32
32
  <section
33
33
  aria-label="Video annotation controls"
34
- className="mt-2 space-y-2 rounded border border-doom-border bg-doom-panel p-2.5 text-sm text-doom-text sm:text-xs"
34
+ className="mt-2 space-y-2 rounded border border-doom-border bg-doom-panel p-2.5 text-base text-doom-text sm:text-sm"
35
35
  >
36
36
  <div className="flex flex-wrap items-center justify-between gap-3">
37
- <output aria-label="Playback position" className="font-mono text-sm tabular-nums">
37
+ <output aria-label="Playback position" className="font-mono text-base tabular-nums">
38
38
  {videoTimeLabel(playback.currentTime)} / {videoTimeLabel(duration)}
39
39
  </output>
40
40
  <span className="text-doom-dim">
@@ -99,7 +99,7 @@ export function AuthorVideoControls({
99
99
  onChange={(event) => setSeconds(event.target.value)}
100
100
  disabled={locked || duration <= 0}
101
101
  placeholder="1.250"
102
- className="h-11 w-24 rounded border border-doom-border bg-doom-deep px-2 text-base [@media(pointer:fine)]:h-8 sm:text-xs"
102
+ className="h-11 w-24 rounded border border-doom-border bg-doom-deep px-2 text-lg [@media(pointer:fine)]:h-8 sm:text-sm"
103
103
  />
104
104
  <Button type="submit" className={buttonClass} disabled={locked || duration <= 0 || invalid}>
105
105
  Go