@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 +8 -7
- package/src/web/components/AuthorDocumentPanel.tsx +6 -6
- package/src/web/components/AuthorGridOverlay.tsx +1 -1
- package/src/web/components/AuthorMediaView.tsx +2 -2
- package/src/web/components/AuthorPanel.tsx +8 -8
- package/src/web/components/AuthorRegionDrafts.tsx +11 -11
- package/src/web/components/AuthorRequestLog.tsx +15 -15
- package/src/web/components/AuthorStructuredView.tsx +4 -4
- package/src/web/components/AuthorTextView.tsx +1 -1
- package/src/web/components/AuthorToolPalette.tsx +4 -4
- package/src/web/components/AuthorVideoControls.tsx +4 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-author",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
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-
|
|
78
|
-
"@agimon-ai/doompi-
|
|
79
|
-
"@agimon-ai/doompi-web-
|
|
80
|
-
"@agimon-ai/doompi-web-security": "0.0.1-alpha.
|
|
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.
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
160
|
+
<span className="text-base text-doom-dim">Video feedback</span>
|
|
161
161
|
) : (
|
|
162
162
|
<Button
|
|
163
|
-
className="min-h-11 px-4 text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
38
|
-
<p className="text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
29
|
-
<p className="text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
64
|
+
{error ? <output className="block text-base text-doom-red">{error}</output> : null}
|
|
65
65
|
{workspace.regions.length > 0 ? (
|
|
66
|
-
<h3 className="text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
76
|
-
<p className="mt-2 flex items-center gap-2 truncate text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
157
|
+
<h3 className="text-2xs font-bold tracking-widest text-doom-faint">AUTHORING</h3>
|
|
158
158
|
{latest === undefined ? (
|
|
159
|
-
<p className="text-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|