deepspace 0.10.1 → 0.10.3

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.
Files changed (75) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/chunk-ZJ43EK3N.js +1751 -0
  3. package/dist/chunk-ZJ43EK3N.js.map +1 -0
  4. package/dist/cli.js +848 -650
  5. package/dist/cli.js.map +1 -1
  6. package/dist/documentation-client-core.d.ts +18 -0
  7. package/dist/documentation-client-core.js +395 -0
  8. package/dist/documentation-client-core.js.map +1 -0
  9. package/dist/documentation-default-renderer.cjs +124 -0
  10. package/dist/documentation-react.d.ts +2 -0
  11. package/dist/documentation-react.js +35 -0
  12. package/dist/documentation-react.js.map +1 -0
  13. package/dist/documentation-runtime.js +71 -0
  14. package/dist/documentation-server-core.d.ts +11 -0
  15. package/dist/documentation-server-core.js +48 -0
  16. package/dist/documentation-server-core.js.map +1 -0
  17. package/dist/documentation.d.ts +367 -0
  18. package/dist/documentation.js +4122 -0
  19. package/dist/documentation.js.map +1 -0
  20. package/dist/feature-installer.js +145 -0
  21. package/dist/feature-installer.js.map +1 -1
  22. package/dist/fonts/geist-mono-OFL.txt +93 -0
  23. package/dist/fonts/geist-mono-variable.woff2 +0 -0
  24. package/dist/fonts/inter-OFL.txt +92 -0
  25. package/dist/fonts/inter-variable.woff2 +0 -0
  26. package/dist/index.d.ts +177 -1
  27. package/dist/index.js +133 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/public-BGRX_Cjd.d.ts +234 -0
  30. package/dist/schema.d.ts +186 -0
  31. package/dist/schema.js +610 -0
  32. package/dist/schema.js.map +1 -0
  33. package/dist/server.d.ts +83 -4
  34. package/dist/server.js +296 -1
  35. package/dist/server.js.map +1 -1
  36. package/dist/testing.d.ts +5 -8
  37. package/dist/testing.js +48 -14
  38. package/dist/testing.js.map +1 -1
  39. package/dist/worker.d.ts +249 -5
  40. package/dist/worker.js +1438 -19
  41. package/dist/worker.js.map +1 -1
  42. package/features/admin-page/src/admin-schema.ts +1 -1
  43. package/features/ai-chat/feature.json +2 -2
  44. package/features/ai-chat/src/ChatPanel.tsx +6 -11
  45. package/features/ai-chat/src/ai-chat-schema.ts +1 -2
  46. package/features/canvas/src/canvas-schema.ts +1 -1
  47. package/features/documentation/content/index.mdx +14 -0
  48. package/features/documentation/content/quickstart.mdx +12 -0
  49. package/features/documentation/documentation.json +18 -0
  50. package/features/documentation/feature.json +68 -0
  51. package/features/{docs → documents}/feature.json +27 -27
  52. package/features/{docs/src/DocsEditorPage.tsx → documents/src/DocumentsEditorPage.tsx} +74 -74
  53. package/features/{docs/src/DocsListPage.tsx → documents/src/DocumentsListPage.tsx} +102 -102
  54. package/features/{docs/src/DocsOutlinePanel.tsx → documents/src/DocumentsOutlinePanel.tsx} +9 -9
  55. package/features/{docs/src/DocsPresence.tsx → documents/src/DocumentsPresence.tsx} +18 -18
  56. package/features/{docs → documents}/src/InviteDialog.tsx +21 -21
  57. package/features/{docs → documents}/src/LibrarySidebar.tsx +25 -25
  58. package/features/documents/src/__tests__/documents-presence-access.test.ts +71 -0
  59. package/features/{docs/src/docs-library-types.ts → documents/src/documents-library-types.ts} +3 -3
  60. package/features/{docs/src/docs-schema.ts → documents/src/documents-schema.ts} +6 -6
  61. package/features/{docs/src/docs-ui.css → documents/src/documents-ui.css} +89 -89
  62. package/features/{docs → documents}/src/editor/DocEditorSurface.tsx +11 -11
  63. package/features/{docs/src/editor/DocsTiptapToolbar.tsx → documents/src/editor/DocumentsTiptapToolbar.tsx} +21 -21
  64. package/features/{docs → documents}/src/editor/useDocEditor.ts +4 -4
  65. package/features/{docs/src/use-docs-presence-access.ts → documents/src/use-documents-presence-access.ts} +51 -51
  66. package/features/file-attachments/src/attachments-schema.ts +1 -1
  67. package/features/items/src/items-schema.ts +1 -1
  68. package/features/leaderboard/src/leaderboard-schema.ts +1 -1
  69. package/features/messaging/src/ChatMultiPage.tsx +1 -1
  70. package/features/messaging/src/ChatPage.tsx +1 -1
  71. package/features/messaging/src/messaging-schema.ts +2 -2
  72. package/features/tasks/src/tasks-schema.ts +1 -1
  73. package/features/testing/src/test-schema.ts +2 -2
  74. package/package.json +26 -1
  75. package/features/docs/src/__tests__/docs-presence-access.test.ts +0 -71
@@ -1,5 +1,5 @@
1
1
  /**
2
- * DocsEditorPage — Tiptap + Yjs collaborative document editor.
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 docs created with the old editor stored HTML in Y.Text('content').
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 { DocsTiptapToolbar } from './editor/DocsTiptapToolbar'
25
- import { DocsOutlinePanel, DOCUMENT_OUTLINE_WIDTH_PX, type OutlineEntry } from './DocsOutlinePanel'
26
- import { DocsPresence } from './DocsPresence'
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 { DocsDocumentFields } from './docs-library-types'
28
+ import type { DocumentsDocumentFields } from './documents-library-types'
29
29
  import {
30
- useDocsEditorPresence,
31
- useDocsPresenceAccess,
30
+ useDocumentsEditorPresence,
31
+ useDocumentsPresenceAccess,
32
32
  type AccessChangeKind,
33
- } from './use-docs-presence-access'
34
- import './docs-ui.css'
33
+ } from './use-documents-presence-access'
34
+ import './documents-ui.css'
35
35
 
36
- const CANVAS_ZOOM_KEY = 'deepspace-docs-editor-canvas-zoom'
37
- const OUTLINE_OPEN_KEY = 'deepspace-docs-editor-outline-open'
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(--docs-el-text)' }}
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(--docs-el-line)',
105
- backgroundColor: 'var(--docs-el-bg)',
106
- color: 'var(--docs-el-text)',
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="docs-access-change-title"
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(--docs-el-bg) 78%, transparent)' }}
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(--docs-el-line)',
167
- backgroundColor: 'var(--docs-el-surface)',
168
- color: 'var(--docs-el-text)',
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(--docs-el-accent) 14%, transparent)',
176
- color: 'var(--docs-el-accent)',
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="docs-access-change-title" className="text-base font-semibold tracking-tight">
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(--docs-el-muted)' }}>
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="docs-access-refresh"
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(--docs-el-accent)' }}
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 DocsEditorLoadingSurface({ label = 'Opening document...' }: { label?: string }) {
217
+ function DocumentsEditorLoadingSurface({ label = 'Opening document...' }: { label?: string }) {
218
218
  return (
219
- <div className="docs-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="docs-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">
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="docs-paged-page-frame relative mx-auto"
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="docs-paged-page-stack relative"
228
+ className="documents-paged-page-stack relative"
229
229
  style={{ minHeight: `${PAGE_HEIGHT_PX}px` }}
230
230
  >
231
- <div className="docs-paged-page-face docs-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" />
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 DocsEditorPage() {
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<DocsDocumentFields>('documents', {
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<DocsDocumentFields>('documents')
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 = useDocsPresenceAccess({
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 } = useDocsEditorPresence({
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="docs-feature-scope flex h-full flex-col overflow-hidden print:h-auto print:overflow-visible"
478
- style={{ backgroundColor: 'var(--docs-el-bg)', color: 'var(--docs-el-text)' }}
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(--docs-el-line)',
484
- backgroundColor: 'color-mix(in srgb, var(--docs-el-surface) 92%, transparent)',
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('/docs')}
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(--docs-el-muted)' }}
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
- <DocsPresence participants={presenceParticipants} typingNames={typingNames} />
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(--docs-el-line)',
509
- color: 'var(--docs-el-muted)',
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(--docs-el-line)', color: 'var(--docs-el-muted)' }}
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(--docs-el-muted)' }}
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(--docs-el-muted)' }}
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(--docs-el-line)',
561
- backgroundColor: 'color-mix(in srgb, var(--docs-el-muted) 12%, transparent)',
562
- color: 'var(--docs-el-muted)',
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
- <DocsTiptapToolbar
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
- <DocsOutlinePanel entries={outlineEntries} onJumpTo={jumpToHeading} />
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(--docs-el-line) 85%, transparent)',
592
- backgroundColor: 'color-mix(in srgb, var(--docs-el-surface) 92%, transparent)',
593
- color: 'var(--docs-el-muted)',
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(--docs-el-text)] hover:shadow-lg print:hidden dark:border-white/12 dark:hover:bg-white/[0.08] ${outlineOpen ? 'text-[color:var(--docs-el-text)]' : ''}`}
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="docs-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(--docs-el-muted)' }}>
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('/docs')}
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(--docs-el-accent)' }}
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
- <DocsEditorLoadingSurface
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="docs-route-error"
673
- className="docs-feature-scope flex h-full flex-col items-center justify-center px-6 text-center"
674
- style={{ backgroundColor: 'var(--docs-el-bg)', color: 'var(--docs-el-text)' }}
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(--docs-el-line)', backgroundColor: 'var(--docs-el-surface)' }}
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(--docs-el-accent) 14%, transparent)',
685
- color: 'var(--docs-el-accent)',
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(--docs-el-muted)' }}>
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(--docs-el-muted)' }}
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="docs-route-error-refresh"
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(--docs-el-accent)' }}
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