deepspace 0.10.1 → 0.10.2
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/CHANGELOG.md +8 -0
- package/dist/chunk-T7V4GUIN.js +1638 -0
- package/dist/chunk-T7V4GUIN.js.map +1 -0
- package/dist/cli.js +731 -324
- package/dist/cli.js.map +1 -1
- package/dist/documentation-client-core.d.ts +18 -0
- package/dist/documentation-client-core.js +395 -0
- package/dist/documentation-client-core.js.map +1 -0
- package/dist/documentation-default-renderer.cjs +124 -0
- package/dist/documentation-react.d.ts +2 -0
- package/dist/documentation-react.js +35 -0
- package/dist/documentation-react.js.map +1 -0
- package/dist/documentation-runtime.js +71 -0
- package/dist/documentation-server-core.d.ts +11 -0
- package/dist/documentation-server-core.js +48 -0
- package/dist/documentation-server-core.js.map +1 -0
- package/dist/documentation.d.ts +366 -0
- package/dist/documentation.js +3953 -0
- package/dist/documentation.js.map +1 -0
- package/dist/feature-installer.js +145 -0
- package/dist/feature-installer.js.map +1 -1
- package/dist/index.d.ts +177 -1
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -1
- package/dist/public-BGRX_Cjd.d.ts +234 -0
- package/dist/schema.d.ts +186 -0
- package/dist/schema.js +610 -0
- package/dist/schema.js.map +1 -0
- package/dist/server.d.ts +83 -4
- package/dist/server.js +296 -1
- package/dist/server.js.map +1 -1
- package/dist/testing.d.ts +5 -8
- package/dist/testing.js +48 -14
- package/dist/testing.js.map +1 -1
- package/dist/worker.d.ts +249 -5
- package/dist/worker.js +1438 -19
- package/dist/worker.js.map +1 -1
- package/features/admin-page/src/admin-schema.ts +1 -1
- package/features/ai-chat/feature.json +2 -2
- package/features/ai-chat/src/ChatPanel.tsx +6 -11
- package/features/ai-chat/src/ai-chat-schema.ts +1 -2
- package/features/canvas/src/canvas-schema.ts +1 -1
- package/features/documentation/content/index.mdx +14 -0
- package/features/documentation/content/quickstart.mdx +12 -0
- package/features/documentation/documentation.json +18 -0
- package/features/documentation/feature.json +68 -0
- package/features/{docs → documents}/feature.json +27 -27
- package/features/{docs/src/DocsEditorPage.tsx → documents/src/DocumentsEditorPage.tsx} +74 -74
- package/features/{docs/src/DocsListPage.tsx → documents/src/DocumentsListPage.tsx} +102 -102
- package/features/{docs/src/DocsOutlinePanel.tsx → documents/src/DocumentsOutlinePanel.tsx} +9 -9
- package/features/{docs/src/DocsPresence.tsx → documents/src/DocumentsPresence.tsx} +18 -18
- package/features/{docs → documents}/src/InviteDialog.tsx +21 -21
- package/features/{docs → documents}/src/LibrarySidebar.tsx +25 -25
- package/features/documents/src/__tests__/documents-presence-access.test.ts +71 -0
- package/features/{docs/src/docs-library-types.ts → documents/src/documents-library-types.ts} +3 -3
- package/features/{docs/src/docs-schema.ts → documents/src/documents-schema.ts} +6 -6
- package/features/{docs/src/docs-ui.css → documents/src/documents-ui.css} +89 -89
- package/features/{docs → documents}/src/editor/DocEditorSurface.tsx +11 -11
- package/features/{docs/src/editor/DocsTiptapToolbar.tsx → documents/src/editor/DocumentsTiptapToolbar.tsx} +21 -21
- package/features/{docs → documents}/src/editor/useDocEditor.ts +4 -4
- package/features/{docs/src/use-docs-presence-access.ts → documents/src/use-documents-presence-access.ts} +51 -51
- package/features/file-attachments/src/attachments-schema.ts +1 -1
- package/features/items/src/items-schema.ts +1 -1
- package/features/leaderboard/src/leaderboard-schema.ts +1 -1
- package/features/messaging/src/ChatMultiPage.tsx +1 -1
- package/features/messaging/src/ChatPage.tsx +1 -1
- package/features/messaging/src/messaging-schema.ts +2 -2
- package/features/tasks/src/tasks-schema.ts +1 -1
- package/features/testing/src/test-schema.ts +2 -2
- package/package.json +26 -1
- package/features/docs/src/__tests__/docs-presence-access.test.ts +0 -71
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* DocumentsEditorPage — Tiptap + Yjs collaborative document editor.
|
|
3
3
|
*
|
|
4
4
|
* Replaces the previous contenteditable + HTML-in-Y.Text approach with
|
|
5
5
|
* ProseMirror-via-Tiptap bound to a Y.XmlFragment. Remote keystrokes are
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* caret is migrated through concurrent edits by PM's position mapping,
|
|
8
8
|
* and remote cursors are painted by `@tiptap/extension-collaboration-caret`.
|
|
9
9
|
*
|
|
10
|
-
* Legacy
|
|
10
|
+
* Legacy documents created with the old editor stored HTML in Y.Text('content').
|
|
11
11
|
* On first open by an editor/owner we migrate that into the new XmlFragment
|
|
12
12
|
* via `editor.commands.setContent(html)` and clear the legacy field. The
|
|
13
13
|
* migration is a single Yjs transaction so all peers converge.
|
|
@@ -21,20 +21,20 @@ import { Badge } from '@/components/ui'
|
|
|
21
21
|
import { type Editor, useEditorState } from '@tiptap/react'
|
|
22
22
|
import { useDocEditor } from './editor/useDocEditor'
|
|
23
23
|
import { DocEditorSurface, PAGE_HEIGHT_PX, PAGE_WIDTH_PX } from './editor/DocEditorSurface'
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
24
|
+
import { DocumentsTiptapToolbar } from './editor/DocumentsTiptapToolbar'
|
|
25
|
+
import { DocumentsOutlinePanel, DOCUMENT_OUTLINE_WIDTH_PX, type OutlineEntry } from './DocumentsOutlinePanel'
|
|
26
|
+
import { DocumentsPresence } from './DocumentsPresence'
|
|
27
27
|
import { InviteDialog } from './InviteDialog'
|
|
28
|
-
import type {
|
|
28
|
+
import type { DocumentsDocumentFields } from './documents-library-types'
|
|
29
29
|
import {
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
useDocumentsEditorPresence,
|
|
31
|
+
useDocumentsPresenceAccess,
|
|
32
32
|
type AccessChangeKind,
|
|
33
|
-
} from './use-
|
|
34
|
-
import './
|
|
33
|
+
} from './use-documents-presence-access'
|
|
34
|
+
import './documents-ui.css'
|
|
35
35
|
|
|
36
|
-
const CANVAS_ZOOM_KEY = 'deepspace-
|
|
37
|
-
const OUTLINE_OPEN_KEY = 'deepspace-
|
|
36
|
+
const CANVAS_ZOOM_KEY = 'deepspace-documents-editor-canvas-zoom'
|
|
37
|
+
const OUTLINE_OPEN_KEY = 'deepspace-documents-editor-outline-open'
|
|
38
38
|
const KEYBOARD_ZOOM_STEP = 0.1
|
|
39
39
|
const DOC_NOT_FOUND_GRACE_MS = 450
|
|
40
40
|
|
|
@@ -77,7 +77,7 @@ function InlineTitle({
|
|
|
77
77
|
return (
|
|
78
78
|
<h1
|
|
79
79
|
className="min-w-0 flex-1 cursor-text truncate rounded px-1 text-lg font-semibold tracking-tight transition-colors hover:bg-black/[0.04] dark:hover:bg-white/[0.06]"
|
|
80
|
-
style={{ color: 'var(--
|
|
80
|
+
style={{ color: 'var(--documents-el-text)' }}
|
|
81
81
|
onClick={() => canEdit && setEditing(true)}
|
|
82
82
|
title={canEdit ? 'Click to rename' : undefined}
|
|
83
83
|
>
|
|
@@ -101,9 +101,9 @@ function InlineTitle({
|
|
|
101
101
|
}}
|
|
102
102
|
className="min-w-0 flex-1 rounded border px-2 py-0.5 text-lg font-semibold outline-none focus-visible:ring-2 focus-visible:ring-ring/35"
|
|
103
103
|
style={{
|
|
104
|
-
borderColor: 'var(--
|
|
105
|
-
backgroundColor: 'var(--
|
|
106
|
-
color: 'var(--
|
|
104
|
+
borderColor: 'var(--documents-el-line)',
|
|
105
|
+
backgroundColor: 'var(--documents-el-bg)',
|
|
106
|
+
color: 'var(--documents-el-text)',
|
|
107
107
|
}}
|
|
108
108
|
/>
|
|
109
109
|
)
|
|
@@ -156,34 +156,34 @@ function AccessChangedOverlay({
|
|
|
156
156
|
<div
|
|
157
157
|
role="alertdialog"
|
|
158
158
|
aria-modal="true"
|
|
159
|
-
aria-labelledby="
|
|
159
|
+
aria-labelledby="documents-access-change-title"
|
|
160
160
|
className="absolute inset-0 z-[80] flex items-center justify-center px-4"
|
|
161
|
-
style={{ backgroundColor: 'color-mix(in srgb, var(--
|
|
161
|
+
style={{ backgroundColor: 'color-mix(in srgb, var(--documents-el-bg) 78%, transparent)' }}
|
|
162
162
|
>
|
|
163
163
|
<div
|
|
164
164
|
className="w-full max-w-sm rounded-xl border p-6 shadow-xl backdrop-blur"
|
|
165
165
|
style={{
|
|
166
|
-
borderColor: 'var(--
|
|
167
|
-
backgroundColor: 'var(--
|
|
168
|
-
color: 'var(--
|
|
166
|
+
borderColor: 'var(--documents-el-line)',
|
|
167
|
+
backgroundColor: 'var(--documents-el-surface)',
|
|
168
|
+
color: 'var(--documents-el-text)',
|
|
169
169
|
}}
|
|
170
170
|
>
|
|
171
171
|
<div className="flex items-start gap-3">
|
|
172
172
|
<span
|
|
173
173
|
className="mt-0.5 inline-flex h-9 w-9 shrink-0 items-center justify-center rounded-full"
|
|
174
174
|
style={{
|
|
175
|
-
backgroundColor: 'color-mix(in srgb, var(--
|
|
176
|
-
color: 'var(--
|
|
175
|
+
backgroundColor: 'color-mix(in srgb, var(--documents-el-accent) 14%, transparent)',
|
|
176
|
+
color: 'var(--documents-el-accent)',
|
|
177
177
|
}}
|
|
178
178
|
aria-hidden
|
|
179
179
|
>
|
|
180
180
|
<AlertTriangle className="h-4 w-4" strokeWidth={2} />
|
|
181
181
|
</span>
|
|
182
182
|
<div className="min-w-0 flex-1">
|
|
183
|
-
<h2 id="
|
|
183
|
+
<h2 id="documents-access-change-title" className="text-base font-semibold tracking-tight">
|
|
184
184
|
{title}
|
|
185
185
|
</h2>
|
|
186
|
-
<p className="mt-1.5 text-sm" style={{ color: 'var(--
|
|
186
|
+
<p className="mt-1.5 text-sm" style={{ color: 'var(--documents-el-muted)' }}>
|
|
187
187
|
{body}
|
|
188
188
|
</p>
|
|
189
189
|
</div>
|
|
@@ -193,9 +193,9 @@ function AccessChangedOverlay({
|
|
|
193
193
|
type="button"
|
|
194
194
|
autoFocus
|
|
195
195
|
onClick={onRefresh}
|
|
196
|
-
data-testid="
|
|
196
|
+
data-testid="documents-access-refresh"
|
|
197
197
|
className="inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium text-white transition-opacity hover:opacity-90"
|
|
198
|
-
style={{ backgroundColor: 'var(--
|
|
198
|
+
style={{ backgroundColor: 'var(--documents-el-accent)' }}
|
|
199
199
|
>
|
|
200
200
|
<RefreshCw className="h-3.5 w-3.5" strokeWidth={2.25} />
|
|
201
201
|
Refresh
|
|
@@ -214,21 +214,21 @@ function AccessChangedOverlay({
|
|
|
214
214
|
* swap is invisible. No `animate-pulse` skeleton bars: those used to flash
|
|
215
215
|
* for a single frame on fast loads, which read as a "flicker".
|
|
216
216
|
*/
|
|
217
|
-
function
|
|
217
|
+
function DocumentsEditorLoadingSurface({ label = 'Opening document...' }: { label?: string }) {
|
|
218
218
|
return (
|
|
219
|
-
<div className="
|
|
220
|
-
<div className="
|
|
219
|
+
<div className="documents-paged-editor-canvas h-full min-h-0 w-full flex-1 overflow-y-auto overflow-x-hidden overscroll-y-contain print:block print:!h-auto print:!overflow-visible print:!bg-white">
|
|
220
|
+
<div className="documents-paged-inner pointer-events-auto mx-auto w-full max-w-full px-2 py-3 sm:px-3 sm:py-4 md:py-5">
|
|
221
221
|
<div
|
|
222
|
-
className="
|
|
222
|
+
className="documents-paged-page-frame relative mx-auto"
|
|
223
223
|
style={{ width: `${PAGE_WIDTH_PX / 96}in`, maxWidth: '100%' }}
|
|
224
224
|
aria-busy="true"
|
|
225
225
|
aria-label={label}
|
|
226
226
|
>
|
|
227
227
|
<div
|
|
228
|
-
className="
|
|
228
|
+
className="documents-paged-page-stack relative"
|
|
229
229
|
style={{ minHeight: `${PAGE_HEIGHT_PX}px` }}
|
|
230
230
|
>
|
|
231
|
-
<div className="
|
|
231
|
+
<div className="documents-paged-page-face documents-editor-paper pointer-events-none absolute left-0 top-0 h-[11in] w-full rounded-sm print:static print:h-auto print:shadow-none print:border-0" />
|
|
232
232
|
</div>
|
|
233
233
|
</div>
|
|
234
234
|
</div>
|
|
@@ -269,12 +269,12 @@ function useOutlineEntries(editor: Editor | null): OutlineEntry[] {
|
|
|
269
269
|
)
|
|
270
270
|
}
|
|
271
271
|
|
|
272
|
-
export default function
|
|
272
|
+
export default function DocumentsEditorPage() {
|
|
273
273
|
const { docId } = useParams<{ docId: string }>()
|
|
274
274
|
const navigate = useNavigate()
|
|
275
275
|
const { user } = useUser()
|
|
276
276
|
|
|
277
|
-
const { records: documents, status } = useQuery<
|
|
277
|
+
const { records: documents, status } = useQuery<DocumentsDocumentFields>('documents', {
|
|
278
278
|
orderBy: 'createdAt',
|
|
279
279
|
orderDir: 'desc',
|
|
280
280
|
})
|
|
@@ -284,7 +284,7 @@ export default function DocsEditorPage() {
|
|
|
284
284
|
[documents, docId],
|
|
285
285
|
)
|
|
286
286
|
|
|
287
|
-
const { put } = useMutations<
|
|
287
|
+
const { put } = useMutations<DocumentsDocumentFields>('documents')
|
|
288
288
|
|
|
289
289
|
/**
|
|
290
290
|
* `'content'` is kept as the field name only so legacy-doc migration can
|
|
@@ -301,7 +301,7 @@ export default function DocsEditorPage() {
|
|
|
301
301
|
awareness,
|
|
302
302
|
} = useYjsRoom(docId ?? 'noop', 'content')
|
|
303
303
|
|
|
304
|
-
const presenceAccess =
|
|
304
|
+
const presenceAccess = useDocumentsPresenceAccess({
|
|
305
305
|
docId,
|
|
306
306
|
document: selectedDoc,
|
|
307
307
|
user,
|
|
@@ -419,7 +419,7 @@ export default function DocsEditorPage() {
|
|
|
419
419
|
})
|
|
420
420
|
}, [editor, synced, effectiveCanWrite, doc, legacyText])
|
|
421
421
|
|
|
422
|
-
const { participants: presenceParticipants, typingNames } =
|
|
422
|
+
const { participants: presenceParticipants, typingNames } = useDocumentsEditorPresence({
|
|
423
423
|
editor,
|
|
424
424
|
document: selectedDoc,
|
|
425
425
|
user,
|
|
@@ -474,21 +474,21 @@ export default function DocsEditorPage() {
|
|
|
474
474
|
|
|
475
475
|
return (
|
|
476
476
|
<div
|
|
477
|
-
className="
|
|
478
|
-
style={{ backgroundColor: 'var(--
|
|
477
|
+
className="documents-feature-scope flex h-full flex-col overflow-hidden print:h-auto print:overflow-visible"
|
|
478
|
+
style={{ backgroundColor: 'var(--documents-el-bg)', color: 'var(--documents-el-text)' }}
|
|
479
479
|
>
|
|
480
480
|
<header
|
|
481
481
|
className="relative z-10 flex shrink-0 flex-wrap items-center gap-2 border-b px-3 py-3 backdrop-blur-sm print:hidden sm:gap-3 sm:px-4"
|
|
482
482
|
style={{
|
|
483
|
-
borderColor: 'var(--
|
|
484
|
-
backgroundColor: 'color-mix(in srgb, var(--
|
|
483
|
+
borderColor: 'var(--documents-el-line)',
|
|
484
|
+
backgroundColor: 'color-mix(in srgb, var(--documents-el-surface) 92%, transparent)',
|
|
485
485
|
}}
|
|
486
486
|
>
|
|
487
487
|
<button
|
|
488
488
|
type="button"
|
|
489
|
-
onClick={() => navigate('/
|
|
489
|
+
onClick={() => navigate('/documents')}
|
|
490
490
|
className="rounded-lg p-1.5 transition-colors hover:bg-black/[0.04] dark:hover:bg-white/[0.06]"
|
|
491
|
-
style={{ color: 'var(--
|
|
491
|
+
style={{ color: 'var(--documents-el-muted)' }}
|
|
492
492
|
title="Back to documents"
|
|
493
493
|
>
|
|
494
494
|
<ArrowLeft className="h-4 w-4" strokeWidth={2} />
|
|
@@ -496,7 +496,7 @@ export default function DocsEditorPage() {
|
|
|
496
496
|
|
|
497
497
|
<InlineTitle title={docTitle} canEdit={isOwner ?? false} onSave={handleTitleSave} />
|
|
498
498
|
|
|
499
|
-
<
|
|
499
|
+
<DocumentsPresence participants={presenceParticipants} typingNames={typingNames} />
|
|
500
500
|
|
|
501
501
|
<div className="flex shrink-0 items-center gap-3">
|
|
502
502
|
{isOwner ? (
|
|
@@ -505,8 +505,8 @@ export default function DocsEditorPage() {
|
|
|
505
505
|
onClick={() => setInviteOpen(true)}
|
|
506
506
|
className="inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium transition-colors hover:bg-black/[0.04] dark:hover:bg-white/[0.06]"
|
|
507
507
|
style={{
|
|
508
|
-
borderColor: 'var(--
|
|
509
|
-
color: 'var(--
|
|
508
|
+
borderColor: 'var(--documents-el-line)',
|
|
509
|
+
color: 'var(--documents-el-muted)',
|
|
510
510
|
backgroundColor: 'transparent',
|
|
511
511
|
}}
|
|
512
512
|
title="Share this document"
|
|
@@ -517,7 +517,7 @@ export default function DocsEditorPage() {
|
|
|
517
517
|
) : effectiveRole === 'editor' || effectiveRole === 'viewer' ? (
|
|
518
518
|
<span
|
|
519
519
|
className="inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-xs font-medium"
|
|
520
|
-
style={{ borderColor: 'var(--
|
|
520
|
+
style={{ borderColor: 'var(--documents-el-line)', color: 'var(--documents-el-muted)' }}
|
|
521
521
|
>
|
|
522
522
|
{effectiveRole === 'editor' ? 'Shared editor' : 'Shared viewer'}
|
|
523
523
|
</span>
|
|
@@ -525,7 +525,7 @@ export default function DocsEditorPage() {
|
|
|
525
525
|
{synced ? (
|
|
526
526
|
<span
|
|
527
527
|
className="flex items-center gap-1.5 text-xs tabular-nums"
|
|
528
|
-
style={{ color: 'var(--
|
|
528
|
+
style={{ color: 'var(--documents-el-muted)' }}
|
|
529
529
|
>
|
|
530
530
|
<span className="h-1.5 w-1.5 rounded-full bg-emerald-500" aria-hidden />
|
|
531
531
|
Synced
|
|
@@ -533,7 +533,7 @@ export default function DocsEditorPage() {
|
|
|
533
533
|
) : (
|
|
534
534
|
<span
|
|
535
535
|
className="flex items-center gap-1.5 text-xs tabular-nums"
|
|
536
|
-
style={{ color: 'var(--
|
|
536
|
+
style={{ color: 'var(--documents-el-muted)' }}
|
|
537
537
|
>
|
|
538
538
|
<span className="h-1.5 w-1.5 animate-pulse rounded-full bg-amber-500" aria-hidden />
|
|
539
539
|
Connecting…
|
|
@@ -557,9 +557,9 @@ export default function DocsEditorPage() {
|
|
|
557
557
|
<div
|
|
558
558
|
className="relative z-10 flex shrink-0 items-center gap-2 border-b px-4 py-2 text-sm print:hidden"
|
|
559
559
|
style={{
|
|
560
|
-
borderColor: 'var(--
|
|
561
|
-
backgroundColor: 'color-mix(in srgb, var(--
|
|
562
|
-
color: 'var(--
|
|
560
|
+
borderColor: 'var(--documents-el-line)',
|
|
561
|
+
backgroundColor: 'color-mix(in srgb, var(--documents-el-muted) 12%, transparent)',
|
|
562
|
+
color: 'var(--documents-el-muted)',
|
|
563
563
|
}}
|
|
564
564
|
>
|
|
565
565
|
{effectiveRole === 'viewer'
|
|
@@ -568,7 +568,7 @@ export default function DocsEditorPage() {
|
|
|
568
568
|
</div>
|
|
569
569
|
) : null}
|
|
570
570
|
|
|
571
|
-
<
|
|
571
|
+
<DocumentsTiptapToolbar
|
|
572
572
|
editor={editor}
|
|
573
573
|
disabled={!synced || !effectiveCanWrite}
|
|
574
574
|
canvasZoom={canvasZoom}
|
|
@@ -577,7 +577,7 @@ export default function DocsEditorPage() {
|
|
|
577
577
|
|
|
578
578
|
<div className="relative flex min-h-0 flex-1 flex-col print:block">
|
|
579
579
|
{outlineOpen ? (
|
|
580
|
-
<
|
|
580
|
+
<DocumentsOutlinePanel entries={outlineEntries} onJumpTo={jumpToHeading} />
|
|
581
581
|
) : null}
|
|
582
582
|
|
|
583
583
|
<button
|
|
@@ -588,11 +588,11 @@ export default function DocsEditorPage() {
|
|
|
588
588
|
style={{
|
|
589
589
|
top: 12,
|
|
590
590
|
left: outlineOpen ? DOCUMENT_OUTLINE_WIDTH_PX + 10 : 12,
|
|
591
|
-
borderColor: 'color-mix(in srgb, var(--
|
|
592
|
-
backgroundColor: 'color-mix(in srgb, var(--
|
|
593
|
-
color: 'var(--
|
|
591
|
+
borderColor: 'color-mix(in srgb, var(--documents-el-line) 85%, transparent)',
|
|
592
|
+
backgroundColor: 'color-mix(in srgb, var(--documents-el-surface) 92%, transparent)',
|
|
593
|
+
color: 'var(--documents-el-muted)',
|
|
594
594
|
}}
|
|
595
|
-
className={`absolute z-[36] flex h-9 w-9 items-center justify-center rounded-full border shadow-md backdrop-blur-md transition-[left,box-shadow,color] duration-200 ease-out hover:bg-black/[0.06] hover:text-[color:var(--
|
|
595
|
+
className={`absolute z-[36] flex h-9 w-9 items-center justify-center rounded-full border shadow-md backdrop-blur-md transition-[left,box-shadow,color] duration-200 ease-out hover:bg-black/[0.06] hover:text-[color:var(--documents-el-text)] hover:shadow-lg print:hidden dark:border-white/12 dark:hover:bg-white/[0.08] ${outlineOpen ? 'text-[color:var(--documents-el-text)]' : ''}`}
|
|
596
596
|
>
|
|
597
597
|
<ListIcon className="h-4 w-4" strokeWidth={2} />
|
|
598
598
|
</button>
|
|
@@ -606,15 +606,15 @@ export default function DocsEditorPage() {
|
|
|
606
606
|
}}
|
|
607
607
|
>
|
|
608
608
|
{docMissing ? (
|
|
609
|
-
<div className="
|
|
610
|
-
<p className="text-sm" style={{ color: 'var(--
|
|
609
|
+
<div className="documents-paged-editor-canvas flex h-full min-h-0 w-full flex-1 flex-col items-center justify-center gap-4 px-6">
|
|
610
|
+
<p className="text-sm" style={{ color: 'var(--documents-el-muted)' }}>
|
|
611
611
|
This document is private. Ask the owner for an invite.
|
|
612
612
|
</p>
|
|
613
613
|
<button
|
|
614
614
|
type="button"
|
|
615
|
-
onClick={() => navigate('/
|
|
615
|
+
onClick={() => navigate('/documents')}
|
|
616
616
|
className="rounded-lg px-4 py-2 text-sm font-medium text-white transition-opacity hover:opacity-90"
|
|
617
|
-
style={{ backgroundColor: 'var(--
|
|
617
|
+
style={{ backgroundColor: 'var(--documents-el-accent)' }}
|
|
618
618
|
>
|
|
619
619
|
Back to documents
|
|
620
620
|
</button>
|
|
@@ -622,7 +622,7 @@ export default function DocsEditorPage() {
|
|
|
622
622
|
) : editor && !docResolutionPending ? (
|
|
623
623
|
<DocEditorSurface editor={editor} />
|
|
624
624
|
) : (
|
|
625
|
-
<
|
|
625
|
+
<DocumentsEditorLoadingSurface
|
|
626
626
|
label={isLoading ? 'Opening document...' : 'Resolving document...'}
|
|
627
627
|
/>
|
|
628
628
|
)}
|
|
@@ -669,20 +669,20 @@ export function ErrorBoundary() {
|
|
|
669
669
|
|
|
670
670
|
return (
|
|
671
671
|
<div
|
|
672
|
-
data-testid="
|
|
673
|
-
className="
|
|
674
|
-
style={{ backgroundColor: 'var(--
|
|
672
|
+
data-testid="documents-route-error"
|
|
673
|
+
className="documents-feature-scope flex h-full flex-col items-center justify-center px-6 text-center"
|
|
674
|
+
style={{ backgroundColor: 'var(--documents-el-bg)', color: 'var(--documents-el-text)' }}
|
|
675
675
|
>
|
|
676
676
|
<div
|
|
677
677
|
className="w-full max-w-md rounded-xl border p-6 shadow-md"
|
|
678
|
-
style={{ borderColor: 'var(--
|
|
678
|
+
style={{ borderColor: 'var(--documents-el-line)', backgroundColor: 'var(--documents-el-surface)' }}
|
|
679
679
|
>
|
|
680
680
|
<div className="mb-3 flex items-center justify-center">
|
|
681
681
|
<span
|
|
682
682
|
className="inline-flex h-10 w-10 items-center justify-center rounded-full"
|
|
683
683
|
style={{
|
|
684
|
-
backgroundColor: 'color-mix(in srgb, var(--
|
|
685
|
-
color: 'var(--
|
|
684
|
+
backgroundColor: 'color-mix(in srgb, var(--documents-el-accent) 14%, transparent)',
|
|
685
|
+
color: 'var(--documents-el-accent)',
|
|
686
686
|
}}
|
|
687
687
|
aria-hidden
|
|
688
688
|
>
|
|
@@ -690,12 +690,12 @@ export function ErrorBoundary() {
|
|
|
690
690
|
</span>
|
|
691
691
|
</div>
|
|
692
692
|
<h1 className="text-base font-semibold tracking-tight">This document needs to reload</h1>
|
|
693
|
-
<p className="mx-auto mt-1.5 max-w-xs text-sm" style={{ color: 'var(--
|
|
693
|
+
<p className="mx-auto mt-1.5 max-w-xs text-sm" style={{ color: 'var(--documents-el-muted)' }}>
|
|
694
694
|
Your access to this document just changed. Refresh to load the latest version.
|
|
695
695
|
</p>
|
|
696
696
|
<p
|
|
697
697
|
className="mx-auto mt-3 max-w-xs truncate text-xs"
|
|
698
|
-
style={{ color: 'var(--
|
|
698
|
+
style={{ color: 'var(--documents-el-muted)' }}
|
|
699
699
|
title={message}
|
|
700
700
|
>
|
|
701
701
|
{message}
|
|
@@ -705,9 +705,9 @@ export function ErrorBoundary() {
|
|
|
705
705
|
type="button"
|
|
706
706
|
autoFocus
|
|
707
707
|
onClick={() => window.location.reload()}
|
|
708
|
-
data-testid="
|
|
708
|
+
data-testid="documents-route-error-refresh"
|
|
709
709
|
className="inline-flex items-center gap-1.5 rounded-lg px-3.5 py-1.5 text-sm font-medium text-white transition-opacity hover:opacity-90"
|
|
710
|
-
style={{ backgroundColor: 'var(--
|
|
710
|
+
style={{ backgroundColor: 'var(--documents-el-accent)' }}
|
|
711
711
|
>
|
|
712
712
|
<RefreshCw className="h-3.5 w-3.5" strokeWidth={2.25} />
|
|
713
713
|
Refresh
|