@w100n/documents 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +335 -139
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +525 -176
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +6 -4
- package/dist/index.d.ts +6 -4
- package/dist/index.js +355 -138
- package/dist/index.js.map +1 -1
- package/dist/memory.cjs +2 -1
- package/dist/memory.cjs.map +1 -1
- package/dist/memory.d.cts +2 -1
- package/dist/memory.d.ts +2 -1
- package/dist/memory.js +2 -1
- package/dist/memory.js.map +1 -1
- package/dist/{types-CEKIyBKE.d.cts → types-DshXPnWA.d.cts} +5 -1
- package/dist/{types-CEKIyBKE.d.ts → types-DshXPnWA.d.ts} +5 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/DocumentsWorkspace.tsx","../src/text.ts","../src/useLoad.ts","../src/viewers/DocxView.tsx","../src/viewers/headings.ts","../src/viewers/MarkdownView.tsx","../src/viewers/PdfView.tsx","../src/viewers/SlidesView.tsx"],"sourcesContent":["import { useState, type ReactNode } from 'react';\nimport { ChevronDown, FileSpreadsheet, FileText, FileType, Files, History, Info, ListTree, PanelLeftClose, PanelLeftOpen, Presentation, RotateCcw, Search, type LucideIcon } from 'lucide-react';\nimport { kinds, matches } from './kinds';\nimport { texts } from './text';\nimport type { DocumentKind, DocumentsHost, Language, Place } from './types';\nimport { useLoad } from './useLoad';\nimport DocxView from './viewers/DocxView';\nimport type { Heading } from './viewers/headings';\nimport MarkdownView from './viewers/MarkdownView';\nimport PdfView from './viewers/PdfView';\nimport SlidesView from './viewers/SlidesView';\nimport './styles.css';\n\nconst icons: Record<DocumentKind, LucideIcon> = { docx: FileText, markdown: FileType, pdf: Files, sheet: FileSpreadsheet, slides: Presentation };\n\ntype Tab = 'outline' | 'versions' | 'details';\n\nexport function DocumentsWorkspace({ host, language = 'en', theme = 'light', place, onPlace, start, end }: {\n host: DocumentsHost; language?: Language; theme?: 'light' | 'dark'; place?: Place; onPlace?: (place: Place) => void; start?: ReactNode; end?: ReactNode;\n}) {\n const t = texts[language];\n const [own, setOwn] = useState<Place>({ spaceId: null, documentId: null });\n const here = place ?? own;\n const go = (next: Place) => { setOwn(next); onPlace?.(next); };\n const [query, setQuery] = useState('');\n const [kind, setKind] = useState<DocumentKind | 'all'>('all');\n const [listOpen, setListOpen] = useState(true);\n const [picking, setPicking] = useState(false);\n const [tab, setTab] = useState<Tab>('outline');\n const [outline, setOutline] = useState<Heading[]>([]);\n const [version, setVersion] = useState<{ documentId: string | null; id: string | null }>({ documentId: null, id: null });\n const versionId = version.documentId === here.documentId ? version.id : null;\n const [restoring, setRestoring] = useState<'idle' | 'busy' | 'failed'>('idle');\n\n const spaces = useLoad(signal => host.spaces({ signal }), [host]);\n const spaceId = here.spaceId ?? spaces.data?.[0]?.id ?? null;\n const space = spaces.data?.find(item => item.id === spaceId);\n const list = useLoad(signal => spaceId ? host.documents(spaceId, { signal }) : Promise.resolve([]), [host, spaceId]);\n const doc = useLoad(signal => here.documentId ? host.document(here.documentId, { signal }) : Promise.resolve(null), [host, here.documentId]);\n const versions = useLoad(signal => here.documentId ? host.versions(here.documentId, { signal }) : Promise.resolve([]), [host, here.documentId]);\n const content = useLoad(signal => here.documentId ? host.content(here.documentId, versionId, { signal }) : Promise.resolve(null), [host, here.documentId, versionId]);\n\n const shown = (list.data ?? []).filter(item => matches(item, query, kind));\n const date = (iso: string) => new Intl.DateTimeFormat(language, { day: 'numeric', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(iso));\n const size = (bytes: number) => bytes < 1024 ? `${bytes} B` : bytes < 1048576 ? `${(bytes / 1024).toFixed(0)} KB` : `${(bytes / 1048576).toFixed(1)} MB`;\n const failed = (retry: () => void) => <div className=\"w100n-docs-note\">{t.failed}<button type=\"button\" onClick={retry}>{t.retry}</button></div>;\n const open = (documentId: string) => { setOutline([]); setTab('outline'); go({ spaceId, documentId }); };\n const restore = async (documentId: string, versionId: string) => {\n setRestoring('busy');\n try {\n await host.restore!(documentId, versionId);\n } catch {\n setRestoring('failed');\n return;\n }\n setRestoring('idle');\n setVersion({ documentId, id: null });\n versions.retry();\n doc.retry();\n list.retry();\n };\n\n let stage: ReactNode = <div className=\"w100n-docs-empty\"><FileText aria-hidden />{t.pick}</div>;\n if (here.documentId) {\n if (doc.error || content.error) stage = failed(() => { doc.retry(); content.retry(); });\n else if (!doc.data || !content.data) stage = <div className=\"w100n-docs-empty\">{t.loading}</div>;\n else if (doc.data.kind === 'markdown') stage = <MarkdownView bytes={content.data} onOutline={setOutline} />;\n else if (doc.data.kind === 'docx') stage = <DocxView bytes={content.data} onOutline={setOutline} failed={t.failed} />;\n else if (doc.data.kind === 'pdf') stage = <PdfView bytes={content.data} worker={host.pdfWorker} onOutline={setOutline} failed={t.failed} />;\n else if (doc.data.kind === 'slides') stage = <SlidesView bytes={content.data} title={doc.data.name} />;\n else stage = <div className=\"w100n-docs-empty\">{t.unsupported}</div>;\n }\n\n const panelTabs: [Tab, LucideIcon, string][] = [['outline', ListTree, t.outline], ['versions', History, t.versions], ['details', Info, t.details]];\n return <div className=\"w100n-docs\" data-theme={theme}>\n <header className=\"w100n-docs-bar w100n-docs-island\">\n {start}\n <button type=\"button\" className=\"w100n-docs-icon\" onClick={() => setListOpen(!listOpen)} aria-label={listOpen ? t.closeList : t.openList} title={listOpen ? t.closeList : t.openList}>\n {listOpen ? <PanelLeftClose /> : <PanelLeftOpen />}\n </button>\n <strong className=\"w100n-docs-title\">{doc.data?.name ?? t.documents}</strong>\n {doc.data && <span className=\"w100n-docs-badge\" data-kind={doc.data.kind}>{t.kinds[doc.data.kind]}</span>}\n {versionId && <span className=\"w100n-docs-badge\">{versions.data?.find(v => v.id === versionId) && date(versions.data.find(v => v.id === versionId)!.createdAt)}</span>}\n {versionId && here.documentId && host.restore && doc.data?.rights.edit && <button type=\"button\" className=\"w100n-docs-action\" disabled={restoring === 'busy'} onClick={() => void restore(here.documentId!, versionId)}>\n <RotateCcw aria-hidden />{t.restore}\n </button>}\n {restoring === 'failed' && <span className=\"w100n-docs-muted\">{t.restoreFailed}</span>}\n {end && <div className=\"w100n-docs-end\">{end}</div>}\n </header>\n <div className=\"w100n-docs-body\">\n {listOpen && <aside className=\"w100n-docs-list w100n-docs-island\" aria-label={t.documents}>\n <div className=\"w100n-docs-picker\">\n <button type=\"button\" className=\"w100n-docs-field\" aria-haspopup=\"listbox\" aria-expanded={picking} onClick={() => setPicking(!picking)}>\n <span className=\"w100n-docs-dot\" style={{ background: space?.color ?? undefined }} />{space?.name ?? t.space}<ChevronDown aria-hidden />\n </button>\n {picking && <ul role=\"listbox\" className=\"w100n-docs-menu\">{(spaces.data ?? []).map(item => <li key={item.id}>\n <button type=\"button\" role=\"option\" aria-selected={item.id === spaceId} onClick={() => { setPicking(false); go({ spaceId: item.id, documentId: null }); }}>\n <span className=\"w100n-docs-dot\" style={{ background: item.color ?? undefined }} />{item.name}\n </button></li>)}</ul>}\n </div>\n <label className=\"w100n-docs-field w100n-docs-search\"><Search aria-hidden /><input value={query} onChange={event => setQuery(event.target.value)} placeholder={t.search} aria-label={t.search} /></label>\n <div className=\"w100n-docs-chips\" role=\"group\">{(['all', ...kinds] as const).map(item => <button key={item} type=\"button\" aria-pressed={kind === item} onClick={() => setKind(item)}>{item === 'all' ? t.all : t.kinds[item]}</button>)}</div>\n <div className=\"w100n-docs-cards\">\n {list.error && failed(list.retry)}\n {list.loading && !list.data && <p className=\"w100n-docs-muted\">{t.loading}</p>}\n {list.data && !shown.length && <p className=\"w100n-docs-muted\">{list.data.length ? t.nothing : t.empty}</p>}\n {shown.map(item => {\n const Icon = icons[item.kind];\n return <button key={item.id} type=\"button\" className=\"w100n-docs-card\" aria-current={item.id === here.documentId} onClick={() => open(item.id)}>\n {item.thumbnailUrl ? <img src={item.thumbnailUrl} alt=\"\" className=\"w100n-docs-thumb\" /> : <span className=\"w100n-docs-thumb\" data-kind={item.kind}><Icon aria-hidden /></span>}\n <span className=\"w100n-docs-card-text\"><b>{item.name}</b><small>{t.kinds[item.kind]} · {date(item.updatedAt)}</small></span>\n </button>;\n })}\n </div>\n </aside>}\n <main className=\"w100n-docs-stage\">{stage}</main>\n {doc.data && <aside className=\"w100n-docs-panel w100n-docs-island\">\n <div className=\"w100n-docs-tabs\" role=\"tablist\">{panelTabs.map(([key, Icon, label]) =>\n <button key={key} type=\"button\" role=\"tab\" aria-selected={tab === key} onClick={() => setTab(key)}><Icon aria-hidden />{label}</button>)}</div>\n {tab === 'outline' && (outline.length ? <nav className=\"w100n-docs-outline\">{outline.map(item =>\n <button key={item.id} type=\"button\" data-level={item.level} onClick={() => document.getElementById(item.id)?.scrollIntoView({ behavior: 'smooth', block: 'start' })}>{item.text}</button>)}</nav>\n : <p className=\"w100n-docs-muted\">{t.noOutline}</p>)}\n {tab === 'versions' && <div className=\"w100n-docs-versions\">\n {versions.error && failed(versions.retry)}\n {(versions.data ?? []).map(item => <button key={item.id} type=\"button\" aria-pressed={(versionId ?? 'current') === item.id || (!versionId && item.current)}\n onClick={() => { setRestoring('idle'); setVersion({ documentId: here.documentId, id: item.current ? null : item.id }); }}>\n <b>{date(item.createdAt)}{item.current && <span className=\"w100n-docs-badge\">{t.current}</span>}</b>\n <small>{[item.author?.name, size(item.size), item.note].filter(Boolean).join(' · ')}</small>\n </button>)}\n </div>}\n {tab === 'details' && <dl className=\"w100n-docs-details\">\n <dt>{t.kind}</dt><dd>{t.kinds[doc.data.kind]}</dd>\n <dt>{t.size}</dt><dd>{size(doc.data.size)}</dd>\n <dt>{t.updated}</dt><dd>{date(doc.data.updatedAt)}</dd>\n {doc.data.updatedBy && <><dt>{t.by}</dt><dd>{doc.data.updatedBy.name}</dd></>}\n <dt>{t.rights}</dt><dd>{[doc.data.rights.view && t.view, doc.data.rights.comment && t.comment, doc.data.rights.edit && t.edit].filter(Boolean).join(', ')}</dd>\n </dl>}\n </aside>}\n </div>\n </div>;\n}\n","import type { DocumentKind, Language } from './types';\n\nconst en = {\n documents: 'Documents', search: 'Search documents', all: 'All', empty: 'No documents here yet', nothing: 'Nothing matches the search',\n space: 'Project', pick: 'Choose a document on the left', closeList: 'Hide the list', openList: 'Show the list',\n outline: 'Outline', versions: 'Versions', details: 'Details', noOutline: 'This document has no headings', current: 'Current',\n size: 'Size', updated: 'Updated', by: 'By', kind: 'Format', rights: 'You can', view: 'View', comment: 'Comment', edit: 'Edit',\n failed: 'Could not load', retry: 'Try again', loading: 'Loading', sheet: 'Sheet', unsupported: 'This file cannot be shown yet',\n restore: 'Restore this version', restoreFailed: 'Could not restore',\n kinds: { docx: 'DOCX', markdown: 'Markdown', pdf: 'PDF', sheet: 'Sheets', slides: 'Slides' } satisfies Record<DocumentKind, string>,\n};\n\nexport type Text = typeof en;\n\nconst pl: Text = {\n documents: 'Dokumenty', search: 'Szukaj dokumentów', all: 'Wszystkie', empty: 'Nie ma tu jeszcze dokumentów', nothing: 'Nic nie pasuje do wyszukiwania',\n space: 'Projekt', pick: 'Wybierz dokument po lewej', closeList: 'Ukryj listę', openList: 'Pokaż listę',\n outline: 'Spis treści', versions: 'Wersje', details: 'Szczegóły', noOutline: 'Ten dokument nie ma nagłówków', current: 'Bieżąca',\n size: 'Rozmiar', updated: 'Zmieniono', by: 'Autor', kind: 'Format', rights: 'Możesz', view: 'Oglądać', comment: 'Komentować', edit: 'Edytować',\n failed: 'Nie udało się wczytać', retry: 'Spróbuj ponownie', loading: 'Wczytywanie', sheet: 'Arkusz', unsupported: 'Tego pliku nie da się jeszcze pokazać',\n restore: 'Przywróć tę wersję', restoreFailed: 'Nie udało się przywrócić',\n kinds: { docx: 'DOCX', markdown: 'Markdown', pdf: 'PDF', sheet: 'Arkusze', slides: 'Slajdy' },\n};\n\nconst uk: Text = {\n documents: 'Документи', search: 'Пошук документів', all: 'Усі', empty: 'Тут ще немає документів', nothing: 'Нічого не знайдено',\n space: 'Проєкт', pick: 'Виберіть документ ліворуч', closeList: 'Сховати список', openList: 'Показати список',\n outline: 'Зміст', versions: 'Версії', details: 'Деталі', noOutline: 'У документі немає заголовків', current: 'Поточна',\n size: 'Розмір', updated: 'Змінено', by: 'Автор', kind: 'Формат', rights: 'Ви можете', view: 'Дивитися', comment: 'Коментувати', edit: 'Правити',\n failed: 'Не вдалося завантажити', retry: 'Спробувати ще', loading: 'Завантаження', sheet: 'Аркуш', unsupported: 'Цей файл поки не показується',\n restore: 'Відновити цю версію', restoreFailed: 'Не вдалося відновити',\n kinds: { docx: 'DOCX', markdown: 'Markdown', pdf: 'PDF', sheet: 'Таблиці', slides: 'Слайди' },\n};\n\nexport const texts: Record<Language, Text> = { en, pl, uk };\n","import { useEffect, useState } from 'react';\n\nexport type Loaded<T> = { data: T | null; error: Error | null; loading: boolean; retry: () => void };\n\nexport function useLoad<T>(load: (signal: AbortSignal) => Promise<T>, key: unknown[]): Loaded<T> {\n const [state, setState] = useState<{ data: T | null; error: Error | null; loading: boolean }>({ data: null, error: null, loading: true });\n const [attempt, setAttempt] = useState(0);\n useEffect(() => {\n const controller = new AbortController();\n setState(current => ({ ...current, loading: true, error: null }));\n load(controller.signal).then(\n data => { if (!controller.signal.aborted) setState({ data, error: null, loading: false }); },\n error => { if (!controller.signal.aborted) setState({ data: null, error: error instanceof Error ? error : new Error(String(error)), loading: false }); },\n );\n return () => controller.abort();\n }, [...key, attempt]);\n return { ...state, retry: () => setAttempt(n => n + 1) };\n}\n","import { useLayoutEffect, useRef, useState } from 'react';\nimport { collect, type Heading } from './headings';\n\nexport default function DocxView({ bytes, onOutline, failed }: { bytes: ArrayBuffer; onOutline: (headings: Heading[]) => void; failed: string }) {\n const box = useRef<HTMLDivElement>(null);\n const [error, setError] = useState(false);\n useLayoutEffect(() => {\n let live = true;\n let width = 0;\n const root = box.current!;\n const fit = () => {\n const wrapper = root.querySelector<HTMLElement>('.w100n-docx-wrapper');\n if (wrapper && width) wrapper.style.zoom = String(Math.min(1, root.clientWidth / width));\n };\n const watch = new ResizeObserver(fit);\n root.replaceChildren();\n setError(false);\n import('docx-preview')\n .then(({ renderAsync }) => renderAsync(bytes, root, undefined, { inWrapper: true, className: 'w100n-docx', ignoreLastRenderedPageBreak: true }))\n .then(() => {\n if (!live) return;\n width = Math.max(0, ...[...root.querySelectorAll<HTMLElement>('section.w100n-docx')].map(page => page.offsetWidth));\n fit();\n watch.observe(root);\n onOutline(collect(root, '[class*=\"heading\"]', el => Number(/heading(\\d)/i.exec(el.className)?.[1] ?? 1)));\n })\n .catch(() => { if (live) setError(true); });\n return () => { live = false; watch.disconnect(); };\n }, [bytes, onOutline]);\n return <>{error && <p className=\"w100n-docs-note\">{failed}</p>}<div ref={box} className=\"w100n-docs-docx\" /></>;\n}\n","export type Heading = { id: string; level: number; text: string };\n\nlet last = 0;\n\nexport function collect(root: HTMLElement, selector: string, level: (el: Element) => number = el => Number(el.tagName.slice(1))): Heading[] {\n return [...root.querySelectorAll(selector)].flatMap(el => {\n const text = el.textContent?.trim() ?? '';\n if (!text) return [];\n if (!el.id) el.id = `w100n-docs-h${++last}`;\n return [{ id: el.id, level: Math.min(3, Math.max(1, level(el) || 1)), text }];\n });\n}\n","import DOMPurify from 'dompurify';\nimport { marked } from 'marked';\nimport { useLayoutEffect, useRef } from 'react';\nimport { collect, type Heading } from './headings';\n\nexport default function MarkdownView({ bytes, onOutline }: { bytes: ArrayBuffer; onOutline: (headings: Heading[]) => void }) {\n const box = useRef<HTMLElement>(null);\n useLayoutEffect(() => {\n const root = box.current!;\n root.innerHTML = DOMPurify.sanitize(marked.parse(new TextDecoder().decode(bytes), { async: false }));\n onOutline(collect(root, 'h1, h2, h3'));\n }, [bytes, onOutline]);\n return <article ref={box} className=\"w100n-docs-page w100n-docs-prose\" />;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { Heading } from './headings';\n\ntype Outline = { title: string; dest: string | unknown[] | null; items: Outline[] };\n\nlet last = 0;\n\nexport default function PdfView({ bytes, worker, onOutline, failed }: { bytes: ArrayBuffer; worker?: () => Worker; onOutline: (headings: Heading[]) => void; failed: string }) {\n const box = useRef<HTMLDivElement>(null);\n const [error, setError] = useState(false);\n useEffect(() => {\n const root = box.current!;\n const prefix = `w100n-docs-p${++last}`;\n let stop = false;\n let close = () => {};\n root.replaceChildren();\n setError(false);\n (async () => {\n const pdfjs = await import('pdfjs-dist');\n if (worker) pdfjs.GlobalWorkerOptions.workerPort ??= worker();\n const task = pdfjs.getDocument({ data: new Uint8Array(bytes.slice(0)) });\n close = () => { void task.destroy(); };\n const pdf = await task.promise;\n const width = Math.max(320, root.clientWidth - 48);\n for (let n = 1; n <= pdf.numPages && !stop; n++) {\n const page = await pdf.getPage(n);\n const scale = Math.min(2, width / page.getViewport({ scale: 1 }).width);\n const viewport = page.getViewport({ scale: scale * window.devicePixelRatio });\n const canvas = document.createElement('canvas');\n canvas.id = `${prefix}-${n}`;\n canvas.className = 'w100n-docs-sheet';\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n canvas.style.width = `${viewport.width / window.devicePixelRatio}px`;\n root.append(canvas);\n await page.render({ canvas, canvasContext: canvas.getContext('2d')!, viewport }).promise;\n }\n const flat = async (items: Outline[], level: number): Promise<Heading[]> => (await Promise.all(items.map(async item => {\n const dest = typeof item.dest === 'string' ? await pdf.getDestination(item.dest) : item.dest;\n const ref = Array.isArray(dest) ? dest[0] : null;\n const index = ref && typeof ref === 'object' ? await pdf.getPageIndex(ref as never) : null;\n const here = index === null ? [] : [{ id: `${prefix}-${index + 1}`, level, text: item.title }];\n return [...here, ...(level < 3 ? await flat(item.items ?? [], level + 1) : [])];\n }))).flat();\n if (!stop) onOutline(await flat(((await pdf.getOutline()) ?? []) as Outline[], 1));\n })().catch(() => { if (!stop) setError(true); });\n return () => { stop = true; close(); };\n }, [bytes, worker, onOutline]);\n return <>{error && <p className=\"w100n-docs-note\">{failed}</p>}<div ref={box} className=\"w100n-docs-pdf\" /></>;\n}\n","export default function SlidesView({ bytes, title }: { bytes: ArrayBuffer; title: string }) {\n return <iframe className=\"w100n-docs-slides\" sandbox=\"allow-scripts\" title={title} srcDoc={new TextDecoder().decode(bytes)} />;\n}\n"],"mappings":"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","names":["useState","useState","useState","useLayoutEffect","useRef","jsx","useRef","useLayoutEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","last","jsx","Fragment","jsx","jsxs","useState","versionId"]}
|
|
1
|
+
{"version":3,"sources":["../src/DocumentsWorkspace.tsx","../src/text.ts","../src/Thumb.tsx","../src/preview.ts","../src/useLoad.ts","../src/viewers/DocxView.tsx","../src/viewers/headings.ts","../src/viewers/MarkdownView.tsx","../src/viewers/PdfView.tsx","../src/viewers/SlidesView.tsx"],"sourcesContent":["import { useLayoutEffect, useRef, useState, type ReactNode } from 'react';\nimport {\n Check, ChevronDown, ChevronRight, FileSpreadsheet, FileText, FileType, Files, History, Info, LayoutGrid, ListTree, Maximize2, Minus, PanelLeftOpen,\n PanelRightOpen, Plus, Presentation, RotateCcw, Search, X, type LucideIcon,\n} from 'lucide-react';\nimport { kinds, matches } from './kinds';\nimport { texts } from './text';\nimport Thumb from './Thumb';\nimport type { DocumentFile, DocumentKind, DocumentsHost, DocumentSummary, Language, Place } from './types';\nimport { useLoad } from './useLoad';\nimport DocxView from './viewers/DocxView';\nimport type { Heading } from './viewers/headings';\nimport MarkdownView from './viewers/MarkdownView';\nimport PdfView from './viewers/PdfView';\nimport SlidesView from './viewers/SlidesView';\nimport './styles.css';\n\nconst icons: Record<DocumentKind, LucideIcon> = { docx: FileText, markdown: FileType, pdf: Files, sheet: FileSpreadsheet, slides: Presentation };\n\ntype Tab = 'outline' | 'versions' | 'details';\n\nexport function DocumentsWorkspace({ host, language = 'en', theme = 'light', place, onPlace, start, end, aside, actions }: {\n host: DocumentsHost; language?: Language; theme?: 'light' | 'dark'; place?: Place; onPlace?: (place: Place) => void; start?: ReactNode; end?: ReactNode;\n aside?: (doc: DocumentFile) => ReactNode; actions?: (doc: DocumentFile) => ReactNode;\n}) {\n const t = texts[language];\n const [own, setOwn] = useState<Place>({ spaceId: null, documentId: null });\n const here = place ?? own;\n const go = (next: Place) => { setOwn(next); onPlace?.(next); };\n const [query, setQuery] = useState('');\n const [kind, setKind] = useState<DocumentKind | 'all'>('all');\n const [listOpen, setListOpen] = useState(true);\n const [panelOpen, setPanelOpen] = useState(true);\n const root = useRef<HTMLDivElement>(null);\n const narrow = () => root.current !== null && getComputedStyle(root.current).getPropertyValue('--docs-narrow').trim() === '1';\n useLayoutEffect(() => {\n if (here.documentId && narrow()) setListOpen(false);\n }, []);\n const [picking, setPicking] = useState(false);\n const [tab, setTab] = useState<Tab>('outline');\n const [zoom, setZoom] = useState(100);\n const [outline, setOutline] = useState<Heading[]>([]);\n const [version, setVersion] = useState<{ documentId: string | null; id: string | null }>({ documentId: null, id: null });\n const versionId = version.documentId === here.documentId ? version.id : null;\n const [restoring, setRestoring] = useState<'idle' | 'busy' | 'failed'>('idle');\n\n const spaces = useLoad(signal => host.spaces({ signal }), [host]);\n const single = spaces.data?.length === 1 ? spaces.data[0].id : null;\n const spaceId = here.spaceId ?? single;\n const space = spaces.data?.find(item => item.id === spaceId);\n const list = useLoad<DocumentSummary[]>(async signal => {\n if (spaceId) return host.documents(spaceId, { signal });\n if (host.everything) return host.everything({ signal });\n const all = await host.spaces({ signal });\n return (await Promise.all(all.map(item => host.documents(item.id, { signal })))).flat();\n }, [host, spaceId]);\n const doc = useLoad(signal => here.documentId ? host.document(here.documentId, { signal }) : Promise.resolve(null), [host, here.documentId]);\n const versions = useLoad(signal => here.documentId ? host.versions(here.documentId, { signal }) : Promise.resolve([]), [host, here.documentId]);\n const content = useLoad(signal => here.documentId ? host.content(here.documentId, versionId, { signal }) : Promise.resolve(null), [host, here.documentId, versionId]);\n\n const all = list.data ?? [];\n const shown = all.filter(item => matches(item, query, kind));\n const present = kinds.filter(item => all.some(doc => doc.kind === item));\n const folders = spaceId ? [...new Set(['', ...shown.map(item => item.folder ?? '')])].filter(folder => shown.some(item => (item.folder ?? '') === folder)) : [''];\n const names = new Map((spaces.data ?? []).map(item => [item.id, item.name]));\n const counts = new Map<string, number>();\n for (const item of all) counts.set(item.spaceId, (counts.get(item.spaceId) ?? 0) + 1);\n const groups = [...new Set((spaces.data ?? []).map(item => item.group ?? ''))];\n const date = (iso: string) => new Intl.DateTimeFormat(language, { day: 'numeric', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' }).format(new Date(iso));\n const ago = (iso: string) => {\n const minutes = Math.round((Date.parse(iso) - Date.now()) / 60000);\n const rtf = new Intl.RelativeTimeFormat(language, { numeric: 'auto', style: 'short' });\n if (Math.abs(minutes) < 60) return rtf.format(minutes, 'minute');\n if (Math.abs(minutes) < 1440) return rtf.format(Math.round(minutes / 60), 'hour');\n if (Math.abs(minutes) < 43200) return rtf.format(Math.round(minutes / 1440), 'day');\n return new Intl.DateTimeFormat(language, { day: 'numeric', month: 'short', year: 'numeric' }).format(new Date(iso));\n };\n const size = (bytes: number) => bytes < 1024 ? `${bytes} B` : bytes < 1048576 ? `${(bytes / 1024).toFixed(0)} KB` : `${(bytes / 1048576).toFixed(1)} MB`;\n const failed = (retry: () => void) => <div className=\"w100n-docs-note\">{t.failed}<button type=\"button\" onClick={retry}>{t.retry}</button></div>;\n const open = (item: DocumentSummary) => {\n setOutline([]);\n setTab('outline');\n go({ spaceId: here.spaceId, documentId: item.id });\n if (narrow()) setListOpen(false);\n };\n const pick = (next: string | null) => {\n setPicking(false);\n setKind('all');\n go({ spaceId: next, documentId: null });\n };\n const restore = async (documentId: string, versionId: string) => {\n setRestoring('busy');\n try {\n await host.restore!(documentId, versionId);\n } catch {\n setRestoring('failed');\n return;\n }\n setRestoring('idle');\n setVersion({ documentId, id: null });\n versions.retry();\n doc.retry();\n list.retry();\n };\n\n let stage: ReactNode = <div className=\"w100n-docs-empty\"><FileText aria-hidden />{t.pick}</div>;\n if (here.documentId) {\n if (doc.error || content.error) stage = failed(() => { doc.retry(); content.retry(); });\n else if (!doc.data || !content.data) stage = <div className=\"w100n-docs-empty\">{t.loading}</div>;\n else if (doc.data.kind === 'markdown') stage = <MarkdownView bytes={content.data} onOutline={setOutline} />;\n else if (doc.data.kind === 'docx') stage = <DocxView bytes={content.data} onOutline={setOutline} failed={t.failed} />;\n else if (doc.data.kind === 'pdf') stage = <PdfView bytes={content.data} worker={host.pdfWorker} onOutline={setOutline} failed={t.failed} />;\n else if (doc.data.kind === 'slides') stage = <SlidesView bytes={content.data} title={doc.data.name} />;\n else stage = <div className=\"w100n-docs-empty\">{t.unsupported}</div>;\n }\n const Kind = doc.data ? icons[doc.data.kind] : FileText;\n const crumbs = doc.data ? [names.get(doc.data.spaceId), doc.data.folder].filter(Boolean) : space ? [space.name] : [];\n\n const panelTabs: [Tab, LucideIcon, string][] = [['outline', ListTree, t.outline], ['versions', History, t.versions], ['details', Info, t.details]];\n return <div ref={root} className=\"w100n-docs\" data-theme={theme}>\n <header className=\"w100n-docs-bar\">\n {start}\n <span className=\"w100n-docs-tile\" data-kind={doc.data?.kind}><Kind aria-hidden /></span>\n <div className=\"w100n-docs-heading\">\n <strong className=\"w100n-docs-title\">{doc.data?.name ?? t.documents}</strong>\n {crumbs.length > 0 && <span className=\"w100n-docs-crumbs\">{crumbs.map((item, i) => <span key={i}>{i > 0 && <ChevronRight aria-hidden />}{item}</span>)}</span>}\n </div>\n {doc.data && <span className=\"w100n-docs-badge\" data-kind={doc.data.kind}>{t.kinds[doc.data.kind]}</span>}\n {versionId && <span className=\"w100n-docs-badge\">{versions.data?.find(v => v.id === versionId) && date(versions.data.find(v => v.id === versionId)!.createdAt)}</span>}\n {versionId && here.documentId && host.restore && doc.data?.rights.edit && <button type=\"button\" className=\"w100n-docs-action\" disabled={restoring === 'busy'} onClick={() => void restore(here.documentId!, versionId)}>\n <RotateCcw aria-hidden />{t.restore}\n </button>}\n {restoring === 'failed' && <span className=\"w100n-docs-muted\">{t.restoreFailed}</span>}\n {doc.data && !versionId && actions?.(doc.data)}\n {end && <div className=\"w100n-docs-end\">{end}</div>}\n </header>\n <div className=\"w100n-docs-body\">\n {listOpen ? <aside className=\"w100n-docs-side w100n-docs-list\" aria-label={t.documents}>\n <div className=\"w100n-docs-head\">\n <div className=\"w100n-docs-row\">\n <p className=\"w100n-docs-caption\"><Files aria-hidden />{t.documents}<span>{all.length}</span></p>\n <button type=\"button\" className=\"w100n-docs-close\" onClick={() => setListOpen(false)} aria-label={t.closeList} title={t.closeList}><X aria-hidden /></button>\n </div>\n {(spaces.data?.length ?? 0) > 1 && <div className=\"w100n-docs-picker\">\n <button type=\"button\" className=\"w100n-docs-field\" aria-haspopup=\"listbox\" aria-expanded={picking} onClick={() => setPicking(!picking)}>\n {space ? <span className=\"w100n-docs-dot\" style={{ background: space.color ?? undefined }} /> : <span className=\"w100n-docs-all\"><LayoutGrid aria-hidden /></span>}\n <b>{space?.name ?? t.allProjects}</b>{!space && <span className=\"w100n-docs-count\">{all.length}</span>}<ChevronDown aria-hidden />\n </button>\n {picking && <div role=\"listbox\" className=\"w100n-docs-menu\">\n <button type=\"button\" role=\"option\" aria-selected={!spaceId} onClick={() => pick(null)}>\n <span className=\"w100n-docs-all\"><LayoutGrid aria-hidden /></span><b>{t.allProjects}</b>{!spaceId && <Check aria-hidden />}\n </button>\n {groups.map(group => <div key={group} role=\"group\" aria-label={group || undefined}>\n {group && <p className=\"w100n-docs-menu-caption\">{group}</p>}\n {(spaces.data ?? []).filter(item => (item.group ?? '') === group).map(item => <button key={item.id} type=\"button\" role=\"option\" aria-selected={item.id === spaceId} onClick={() => pick(item.id)}>\n <span className=\"w100n-docs-dot\" style={{ background: item.color ?? undefined }} /><b>{item.name}</b>\n {!spaceId && counts.get(item.id) ? <span className=\"w100n-docs-count\">{counts.get(item.id)}</span> : null}{item.id === spaceId && <Check aria-hidden />}\n </button>)}\n </div>)}\n </div>}\n </div>}\n <label className=\"w100n-docs-field w100n-docs-search\"><Search aria-hidden /><input value={query} onChange={event => setQuery(event.target.value)} placeholder={t.search} aria-label={t.search} /></label>\n {present.length > 1 && <div className=\"w100n-docs-chips\" role=\"group\">{(['all', ...present] as const).map(item => <button key={item} type=\"button\" aria-pressed={kind === item} onClick={() => setKind(item)}>\n {item === 'all' ? t.all : t.kinds[item]}<span aria-hidden>{item === 'all' ? all.length : all.filter(doc => doc.kind === item).length}</span>\n </button>)}</div>}\n </div>\n <div className=\"w100n-docs-cards\">\n {list.error && failed(list.retry)}\n {list.loading && !list.data && <p className=\"w100n-docs-muted\">{t.loading}</p>}\n {list.data && !shown.length && <p className=\"w100n-docs-muted\">{all.length ? t.nothing : t.empty}</p>}\n {folders.map(folder => <div key={folder} className=\"w100n-docs-folder\" role=\"group\" aria-label={folder || t.loose}>\n {folders.length > 1 && <p className=\"w100n-docs-group\">{folder || t.loose}</p>}\n <div className=\"w100n-docs-grid\">{shown.filter(item => !spaceId || (item.folder ?? '') === folder).map(item =>\n <button key={item.id} type=\"button\" className=\"w100n-docs-card\" aria-current={item.id === here.documentId} onClick={() => open(item)} title={item.name}>\n <Thumb host={host} item={item} label={t.kinds[item.kind]} />\n <span className=\"w100n-docs-card-text\"><b>{item.name}</b><small>{[!spaceId && names.get(item.spaceId), ago(item.updatedAt)].filter(Boolean).join(' · ')}</small></span>\n </button>)}</div>\n </div>)}\n </div>\n </aside> : <button type=\"button\" className=\"w100n-docs-reopen\" onClick={() => setListOpen(true)} aria-label={t.openList} title={t.openList}><PanelLeftOpen aria-hidden /></button>}\n <main className=\"w100n-docs-stage\">\n {doc.data && <div className=\"w100n-docs-zoom\" role=\"group\">\n <button type=\"button\" onClick={() => setZoom(Math.max(50, zoom - 10))} aria-label={t.zoomOut} title={t.zoomOut}><Minus aria-hidden /></button>\n <span>{zoom}%</span>\n <button type=\"button\" onClick={() => setZoom(Math.min(200, zoom + 10))} aria-label={t.zoomIn} title={t.zoomIn}><Plus aria-hidden /></button>\n <button type=\"button\" onClick={() => setZoom(100)} aria-label={t.fit} title={t.fit}><Maximize2 aria-hidden /></button>\n </div>}\n {doc.data && !panelOpen && <button type=\"button\" className=\"w100n-docs-reopen w100n-docs-reopen-right\" onClick={() => setPanelOpen(true)} aria-label={t.openPanel} title={t.openPanel}><PanelRightOpen aria-hidden /></button>}\n <div className=\"w100n-docs-scroll\"><div className=\"w100n-docs-zoomed\" style={{ zoom: zoom / 100 }}>{stage}</div></div>\n </main>\n {doc.data && panelOpen && <aside className=\"w100n-docs-side w100n-docs-panel\" aria-label={t.details}>\n <div className=\"w100n-docs-head\">\n <div className=\"w100n-docs-row\">\n <div className=\"w100n-docs-tabs\" role=\"tablist\">{panelTabs.map(([key, Icon, label]) =>\n <button key={key} type=\"button\" role=\"tab\" aria-selected={tab === key} onClick={() => setTab(key)}><Icon aria-hidden />{label}</button>)}</div>\n <button type=\"button\" className=\"w100n-docs-close\" onClick={() => setPanelOpen(false)} aria-label={t.closePanel} title={t.closePanel}><X aria-hidden /></button>\n </div>\n </div>\n <div className=\"w100n-docs-panel-body\">\n {tab === 'outline' && (outline.length ? <nav className=\"w100n-docs-outline\">{outline.map(item =>\n <button key={item.id} type=\"button\" data-level={item.level} onClick={() => document.getElementById(item.id)?.scrollIntoView({ behavior: 'smooth', block: 'start' })}>{item.text}</button>)}</nav>\n : <p className=\"w100n-docs-muted\">{t.noOutline}</p>)}\n {tab === 'versions' && <div className=\"w100n-docs-versions\">\n {versions.error && failed(versions.retry)}\n {(versions.data ?? []).map(item => <button key={item.id} type=\"button\" aria-pressed={(versionId ?? 'current') === item.id || (!versionId && item.current)}\n onClick={() => { setRestoring('idle'); setVersion({ documentId: here.documentId, id: item.current ? null : item.id }); }}>\n <b>{date(item.createdAt)}{item.current && <span className=\"w100n-docs-badge\">{t.current}</span>}</b>\n <small>{[item.author?.name, size(item.size), item.note].filter(Boolean).join(' · ')}</small>\n </button>)}\n </div>}\n {tab === 'details' && <dl className=\"w100n-docs-details\">\n <dt>{t.kind}</dt><dd>{t.kinds[doc.data.kind]}</dd>\n <dt>{t.size}</dt><dd>{size(doc.data.size)}</dd>\n <dt>{t.updated}</dt><dd>{date(doc.data.updatedAt)}</dd>\n {doc.data.updatedBy && <><dt>{t.by}</dt><dd>{doc.data.updatedBy.name}</dd></>}\n <dt>{t.rights}</dt><dd>{[doc.data.rights.view && t.view, doc.data.rights.comment && t.comment, doc.data.rights.edit && t.edit].filter(Boolean).join(', ')}</dd>\n </dl>}\n {aside?.(doc.data)}\n </div>\n </aside>}\n </div>\n </div>;\n}\n","import type { DocumentKind, Language } from './types';\n\nconst en = {\n documents: 'Documents', loose: 'Without a folder', search: 'Search documents', all: 'All', empty: 'No documents here yet', nothing: 'Nothing matches the search',\n space: 'Project', pick: 'Choose a document on the left', closeList: 'Hide the list', openList: 'Show the list',\n outline: 'Outline', versions: 'Versions', details: 'Details', noOutline: 'This document has no headings', current: 'Current',\n size: 'Size', updated: 'Updated', by: 'By', kind: 'Format', rights: 'You can', view: 'View', comment: 'Comment', edit: 'Edit',\n failed: 'Could not load', retry: 'Try again', loading: 'Loading', sheet: 'Sheet', unsupported: 'This file cannot be shown yet',\n restore: 'Restore this version', restoreFailed: 'Could not restore',\n allProjects: 'All projects', closePanel: 'Hide the panel', openPanel: 'Show the panel', zoomIn: 'Zoom in', zoomOut: 'Zoom out', fit: 'Actual size',\n kinds: { docx: 'DOCX', markdown: 'Markdown', pdf: 'PDF', sheet: 'Sheets', slides: 'Slides' } satisfies Record<DocumentKind, string>,\n};\n\nexport type Text = typeof en;\n\nconst pl: Text = {\n documents: 'Dokumenty', loose: 'Bez folderu', search: 'Szukaj dokumentów', all: 'Wszystkie', empty: 'Nie ma tu jeszcze dokumentów', nothing: 'Nic nie pasuje do wyszukiwania',\n space: 'Projekt', pick: 'Wybierz dokument po lewej', closeList: 'Ukryj listę', openList: 'Pokaż listę',\n outline: 'Spis treści', versions: 'Wersje', details: 'Szczegóły', noOutline: 'Ten dokument nie ma nagłówków', current: 'Bieżąca',\n size: 'Rozmiar', updated: 'Zmieniono', by: 'Autor', kind: 'Format', rights: 'Możesz', view: 'Oglądać', comment: 'Komentować', edit: 'Edytować',\n failed: 'Nie udało się wczytać', retry: 'Spróbuj ponownie', loading: 'Wczytywanie', sheet: 'Arkusz', unsupported: 'Tego pliku nie da się jeszcze pokazać',\n restore: 'Przywróć tę wersję', restoreFailed: 'Nie udało się przywrócić',\n allProjects: 'Wszystkie projekty', closePanel: 'Ukryj panel', openPanel: 'Pokaż panel', zoomIn: 'Powiększ', zoomOut: 'Pomniejsz', fit: 'Rzeczywisty rozmiar',\n kinds: { docx: 'DOCX', markdown: 'Markdown', pdf: 'PDF', sheet: 'Arkusze', slides: 'Slajdy' },\n};\n\nconst uk: Text = {\n documents: 'Документи', loose: 'Без теки', search: 'Пошук документів', all: 'Усі', empty: 'Тут ще немає документів', nothing: 'Нічого не знайдено',\n space: 'Проєкт', pick: 'Виберіть документ ліворуч', closeList: 'Сховати список', openList: 'Показати список',\n outline: 'Зміст', versions: 'Версії', details: 'Деталі', noOutline: 'У документі немає заголовків', current: 'Поточна',\n size: 'Розмір', updated: 'Змінено', by: 'Автор', kind: 'Формат', rights: 'Ви можете', view: 'Дивитися', comment: 'Коментувати', edit: 'Правити',\n failed: 'Не вдалося завантажити', retry: 'Спробувати ще', loading: 'Завантаження', sheet: 'Аркуш', unsupported: 'Цей файл поки не показується',\n restore: 'Відновити цю версію', restoreFailed: 'Не вдалося відновити',\n allProjects: 'Усі проєкти', closePanel: 'Сховати панель', openPanel: 'Показати панель', zoomIn: 'Збільшити', zoomOut: 'Зменшити', fit: 'Справжній розмір',\n kinds: { docx: 'DOCX', markdown: 'Markdown', pdf: 'PDF', sheet: 'Таблиці', slides: 'Слайди' },\n};\n\nexport const texts: Record<Language, Text> = { en, pl, uk };\n","import { useEffect, useRef, useState } from 'react';\nimport { preview, type Preview } from './preview';\nimport type { DocumentsHost, DocumentSummary } from './types';\n\nexport default function Thumb({ host, item, label }: { host: DocumentsHost; item: DocumentSummary; label: string }) {\n const box = useRef<HTMLSpanElement>(null);\n const [seen, setSeen] = useState(false);\n const [shot, setShot] = useState<Preview | null>(null);\n useEffect(() => {\n if (item.thumbnailUrl || item.excerpt || typeof IntersectionObserver === 'undefined') return;\n const watch = new IntersectionObserver(entries => { if (entries.some(entry => entry.isIntersecting)) setSeen(true); }, { rootMargin: '200px' });\n watch.observe(box.current!);\n return () => watch.disconnect();\n }, [item.thumbnailUrl, item.excerpt]);\n useEffect(() => {\n if (!seen) return;\n let live = true;\n void preview(host, item).then(found => { if (live) setShot(found); });\n return () => { live = false; };\n }, [seen, host, item.id, item.updatedAt]);\n const text = item.excerpt ?? shot?.text ?? '';\n const lines = text.split('\\n').filter(line => !line.trim().startsWith('```')).map(line => line.replace(/^#+\\s*/, '').replace(/[*_`>|]/g, '').trim()).filter(Boolean);\n const image = item.thumbnailUrl ?? shot?.image;\n return <span ref={box} className=\"w100n-docs-thumb\" data-kind={item.kind}>\n {image ? <img src={image} alt=\"\" />\n : <span className=\"w100n-docs-paper\" aria-hidden>{lines.length ? <><b>{lines[0]}</b>{lines.slice(1, 14).join(' ')}</> : <><i /><i /><i /><i /><i /></>}</span>}\n <span className=\"w100n-docs-kind\" data-kind={item.kind}>{label}</span>\n </span>;\n}\n","import type { DocumentsHost, DocumentSummary } from './types';\n\nexport type Preview = { text?: string; image?: string };\n\nconst cache = new Map<string, Promise<Preview | null>>();\nconst waiting: (() => void)[] = [];\nlet running = 0;\n\nasync function turn<T>(work: () => Promise<T>): Promise<T> {\n if (running >= 2) await new Promise<void>(go => waiting.push(go));\n running++;\n try {\n return await work();\n } finally {\n running--;\n waiting.shift()?.();\n }\n}\n\nasync function make(host: DocumentsHost, doc: DocumentSummary): Promise<Preview | null> {\n if (doc.size > 3_000_000 || !['markdown', 'docx', 'pdf'].includes(doc.kind)) return null;\n return turn(async () => {\n const bytes = await host.content(doc.id, null);\n if (doc.kind === 'markdown') return { text: new TextDecoder().decode(bytes.slice(0, 2400)) };\n if (doc.kind === 'docx') {\n const { renderAsync } = await import('docx-preview');\n const box = document.createElement('div');\n await renderAsync(bytes, box, undefined, { inWrapper: false, ignoreLastRenderedPageBreak: true });\n return { text: [...box.querySelectorAll('p, h1, h2, h3, li')].map(node => node.textContent?.trim()).filter(Boolean).join('\\n').slice(0, 800) };\n }\n const pdfjs = await import('pdfjs-dist');\n if (host.pdfWorker) pdfjs.GlobalWorkerOptions.workerPort ??= host.pdfWorker();\n const task = pdfjs.getDocument({ data: new Uint8Array(bytes.slice(0)) });\n const pdf = await task.promise;\n const page = await pdf.getPage(1);\n const viewport = page.getViewport({ scale: 320 / page.getViewport({ scale: 1 }).width });\n const canvas = document.createElement('canvas');\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n await page.render({ canvas, canvasContext: canvas.getContext('2d')!, viewport }).promise;\n void task.destroy();\n return { image: canvas.toDataURL('image/png') };\n });\n}\n\nexport function preview(host: DocumentsHost, doc: DocumentSummary): Promise<Preview | null> {\n const key = `${doc.id}:${doc.updatedAt}`;\n let found = cache.get(key);\n if (!found) {\n found = make(host, doc).catch(() => null);\n cache.set(key, found);\n }\n return found;\n}\n","import { useEffect, useState } from 'react';\n\nexport type Loaded<T> = { data: T | null; error: Error | null; loading: boolean; retry: () => void };\n\nexport function useLoad<T>(load: (signal: AbortSignal) => Promise<T>, key: unknown[]): Loaded<T> {\n const [state, setState] = useState<{ data: T | null; error: Error | null; loading: boolean }>({ data: null, error: null, loading: true });\n const [attempt, setAttempt] = useState(0);\n useEffect(() => {\n const controller = new AbortController();\n setState(current => ({ ...current, loading: true, error: null }));\n load(controller.signal).then(\n data => { if (!controller.signal.aborted) setState({ data, error: null, loading: false }); },\n error => { if (!controller.signal.aborted) setState({ data: null, error: error instanceof Error ? error : new Error(String(error)), loading: false }); },\n );\n return () => controller.abort();\n }, [...key, attempt]);\n return { ...state, retry: () => setAttempt(n => n + 1) };\n}\n","import { useLayoutEffect, useRef, useState } from 'react';\nimport { collect, type Heading } from './headings';\n\nexport default function DocxView({ bytes, onOutline, failed }: { bytes: ArrayBuffer; onOutline: (headings: Heading[]) => void; failed: string }) {\n const box = useRef<HTMLDivElement>(null);\n const [error, setError] = useState(false);\n useLayoutEffect(() => {\n let live = true;\n let width = 0;\n const root = box.current!;\n const fit = () => {\n const wrapper = root.querySelector<HTMLElement>('.w100n-docx-wrapper');\n if (wrapper && width) wrapper.style.zoom = String(Math.min(1, root.clientWidth / width));\n };\n const watch = new ResizeObserver(fit);\n root.replaceChildren();\n setError(false);\n import('docx-preview')\n .then(({ renderAsync }) => renderAsync(bytes, root, undefined, { inWrapper: true, className: 'w100n-docx', ignoreLastRenderedPageBreak: true }))\n .then(() => {\n if (!live) return;\n width = Math.max(0, ...[...root.querySelectorAll<HTMLElement>('section.w100n-docx')].map(page => page.offsetWidth));\n fit();\n watch.observe(root);\n onOutline(collect(root, '[class*=\"heading\"]', el => Number(/heading(\\d)/i.exec(el.className)?.[1] ?? 1)));\n })\n .catch(() => { if (live) setError(true); });\n return () => { live = false; watch.disconnect(); };\n }, [bytes, onOutline]);\n return <>{error && <p className=\"w100n-docs-note\">{failed}</p>}<div ref={box} className=\"w100n-docs-docx\" /></>;\n}\n","export type Heading = { id: string; level: number; text: string };\n\nlet last = 0;\n\nexport function collect(root: HTMLElement, selector: string, level: (el: Element) => number = el => Number(el.tagName.slice(1))): Heading[] {\n return [...root.querySelectorAll(selector)].flatMap(el => {\n const text = el.textContent?.trim() ?? '';\n if (!text) return [];\n if (!el.id) el.id = `w100n-docs-h${++last}`;\n return [{ id: el.id, level: Math.min(3, Math.max(1, level(el) || 1)), text }];\n });\n}\n","import DOMPurify from 'dompurify';\nimport { marked } from 'marked';\nimport { useLayoutEffect, useRef } from 'react';\nimport { collect, type Heading } from './headings';\n\nexport default function MarkdownView({ bytes, onOutline }: { bytes: ArrayBuffer; onOutline: (headings: Heading[]) => void }) {\n const box = useRef<HTMLElement>(null);\n useLayoutEffect(() => {\n const root = box.current!;\n root.innerHTML = DOMPurify.sanitize(marked.parse(new TextDecoder().decode(bytes), { async: false }));\n onOutline(collect(root, 'h1, h2, h3'));\n }, [bytes, onOutline]);\n return <article ref={box} className=\"w100n-docs-page w100n-docs-prose\" />;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { Heading } from './headings';\n\ntype Outline = { title: string; dest: string | unknown[] | null; items: Outline[] };\n\nlet last = 0;\n\nexport default function PdfView({ bytes, worker, onOutline, failed }: { bytes: ArrayBuffer; worker?: () => Worker; onOutline: (headings: Heading[]) => void; failed: string }) {\n const box = useRef<HTMLDivElement>(null);\n const [error, setError] = useState(false);\n useEffect(() => {\n const root = box.current!;\n const prefix = `w100n-docs-p${++last}`;\n let stop = false;\n let close = () => {};\n root.replaceChildren();\n setError(false);\n (async () => {\n const pdfjs = await import('pdfjs-dist');\n if (worker) pdfjs.GlobalWorkerOptions.workerPort ??= worker();\n const task = pdfjs.getDocument({ data: new Uint8Array(bytes.slice(0)) });\n close = () => { void task.destroy(); };\n const pdf = await task.promise;\n const width = Math.max(320, root.clientWidth - 48);\n for (let n = 1; n <= pdf.numPages && !stop; n++) {\n const page = await pdf.getPage(n);\n const scale = Math.min(2, width / page.getViewport({ scale: 1 }).width);\n const viewport = page.getViewport({ scale: scale * window.devicePixelRatio });\n const canvas = document.createElement('canvas');\n canvas.id = `${prefix}-${n}`;\n canvas.className = 'w100n-docs-sheet';\n canvas.width = viewport.width;\n canvas.height = viewport.height;\n canvas.style.width = `${viewport.width / window.devicePixelRatio}px`;\n root.append(canvas);\n await page.render({ canvas, canvasContext: canvas.getContext('2d')!, viewport }).promise;\n }\n const flat = async (items: Outline[], level: number): Promise<Heading[]> => (await Promise.all(items.map(async item => {\n const dest = typeof item.dest === 'string' ? await pdf.getDestination(item.dest) : item.dest;\n const ref = Array.isArray(dest) ? dest[0] : null;\n const index = ref && typeof ref === 'object' ? await pdf.getPageIndex(ref as never) : null;\n const here = index === null ? [] : [{ id: `${prefix}-${index + 1}`, level, text: item.title }];\n return [...here, ...(level < 3 ? await flat(item.items ?? [], level + 1) : [])];\n }))).flat();\n if (!stop) onOutline(await flat(((await pdf.getOutline()) ?? []) as Outline[], 1));\n })().catch(() => { if (!stop) setError(true); });\n return () => { stop = true; close(); };\n }, [bytes, worker, onOutline]);\n return <>{error && <p className=\"w100n-docs-note\">{failed}</p>}<div ref={box} className=\"w100n-docs-pdf\" /></>;\n}\n","export default function SlidesView({ bytes, title }: { bytes: ArrayBuffer; title: string }) {\n return <iframe className=\"w100n-docs-slides\" sandbox=\"allow-scripts\" title={title} srcDoc={new TextDecoder().decode(bytes)} />;\n}\n"],"mappings":"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","names":["useLayoutEffect","useRef","useState","useEffect","useState","useRef","useState","Fragment","jsx","jsxs","useRef","useState","useLayoutEffect","useRef","jsx","useRef","useLayoutEffect","useEffect","useRef","useState","Fragment","jsx","jsxs","last","jsx","Fragment","jsx","jsxs","useState","useRef","useLayoutEffect","all","doc","versionId"]}
|
package/dist/memory.cjs
CHANGED
|
@@ -64,7 +64,8 @@ function memoryHost({ me, spaces, files }) {
|
|
|
64
64
|
kind: kindOf(file.name),
|
|
65
65
|
size: encode(file.bytes).byteLength,
|
|
66
66
|
updatedAt: file.updatedAt ?? "2026-10-19T09:00:00Z",
|
|
67
|
-
updatedBy: me
|
|
67
|
+
updatedBy: me,
|
|
68
|
+
folder: file.folder ?? null
|
|
68
69
|
});
|
|
69
70
|
return {
|
|
70
71
|
me,
|
package/dist/memory.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory.ts","../src/kinds.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { DocumentsHost, Person, Rights, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n bytes: Bytes;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n};\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files }: { me: Person; spaces: Space[]; files: MemoryFile[] }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me,\n });\n return {\n me,\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights } }),\n versions: async id => {\n const file = find(id);\n return [\n { id: 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n file.versions = [{ id: `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes }, ...(file.versions ?? [])];\n file.bytes = old.bytes;\n file.updatedAt = new Date().toISOString();\n },\n };\n}\n","import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string, kind: DocumentKind | 'all') {\n const words = query.toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n return (kind === 'all' || doc.kind === kind) && words.every(word => doc.name.toLocaleLowerCase().includes(word));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,IAAM,cAA4C;AAAA,EAChD,MAAM;AAAA,EAAQ,IAAI;AAAA,EAAY,UAAU;AAAA,EAAY,KAAK;AAAA,EAAO,MAAM;AAAA,EAAS,KAAK;AAAA,EAAS,MAAM;AAAA,EAAU,KAAK;AACpH;AAEA,IAAM,SAAuC;AAAA,EAC3C,2EAA2E;AAAA,EAC3E,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,qEAAqE;AAAA,EACrE,YAAY;AAAA,EACZ,aAAa;AACf;AAIO,SAAS,OAAO,MAAc,UAA+C;AAClF,QAAM,YAAY,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI,EAAG,YAAY,IAAI;AAC9E,SAAO,YAAY,SAAS,MAAM,WAAW,OAAO,SAAS,MAAM,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,WAAc;AACnH;;;
|
|
1
|
+
{"version":3,"sources":["../src/memory.ts","../src/kinds.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { DocumentsHost, Person, Rights, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n folder?: string;\n bytes: Bytes;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n};\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files }: { me: Person; spaces: Space[]; files: MemoryFile[] }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me, folder: file.folder ?? null,\n });\n return {\n me,\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights } }),\n versions: async id => {\n const file = find(id);\n return [\n { id: 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n file.versions = [{ id: `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes }, ...(file.versions ?? [])];\n file.bytes = old.bytes;\n file.updatedAt = new Date().toISOString();\n },\n };\n}\n","import type { DocumentKind } from './types';\n\nconst byExtension: Record<string, DocumentKind> = {\n docx: 'docx', md: 'markdown', markdown: 'markdown', pdf: 'pdf', xlsx: 'sheet', csv: 'sheet', html: 'slides', htm: 'slides',\n};\n\nconst byMime: Record<string, DocumentKind> = {\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',\n 'text/markdown': 'markdown',\n 'application/pdf': 'pdf',\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'sheet',\n 'text/csv': 'sheet',\n 'text/html': 'slides',\n};\n\nexport const kinds: DocumentKind[] = ['docx', 'markdown', 'pdf', 'sheet', 'slides'];\n\nexport function kindOf(name: string, mimeType?: string | null): DocumentKind | null {\n const extension = name.includes('.') ? name.split('.').pop()!.toLowerCase() : '';\n return byExtension[extension] ?? (mimeType ? byMime[mimeType.split(';')[0].trim().toLowerCase()] : undefined) ?? null;\n}\n\nexport function matches(doc: { name: string; kind: DocumentKind }, query: string, kind: DocumentKind | 'all') {\n const words = query.toLocaleLowerCase().split(/\\s+/).filter(Boolean);\n return (kind === 'all' || doc.kind === kind) && words.every(word => doc.name.toLocaleLowerCase().includes(word));\n}\n"],"mappings":"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","names":[]}
|
package/dist/memory.d.cts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { R as Rights, e as Person, S as Space, D as DocumentsHost } from './types-
|
|
1
|
+
import { R as Rights, e as Person, S as Space, D as DocumentsHost } from './types-DshXPnWA.cjs';
|
|
2
2
|
|
|
3
3
|
type Bytes = ArrayBuffer | string;
|
|
4
4
|
type MemoryFile = {
|
|
5
5
|
id: string;
|
|
6
6
|
spaceId: string;
|
|
7
7
|
name: string;
|
|
8
|
+
folder?: string;
|
|
8
9
|
bytes: Bytes;
|
|
9
10
|
updatedAt?: string;
|
|
10
11
|
rights?: Partial<Rights>;
|
package/dist/memory.d.ts
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { R as Rights, e as Person, S as Space, D as DocumentsHost } from './types-
|
|
1
|
+
import { R as Rights, e as Person, S as Space, D as DocumentsHost } from './types-DshXPnWA.js';
|
|
2
2
|
|
|
3
3
|
type Bytes = ArrayBuffer | string;
|
|
4
4
|
type MemoryFile = {
|
|
5
5
|
id: string;
|
|
6
6
|
spaceId: string;
|
|
7
7
|
name: string;
|
|
8
|
+
folder?: string;
|
|
8
9
|
bytes: Bytes;
|
|
9
10
|
updatedAt?: string;
|
|
10
11
|
rights?: Partial<Rights>;
|
package/dist/memory.js
CHANGED
|
@@ -18,7 +18,8 @@ function memoryHost({ me, spaces, files }) {
|
|
|
18
18
|
kind: kindOf(file.name),
|
|
19
19
|
size: encode(file.bytes).byteLength,
|
|
20
20
|
updatedAt: file.updatedAt ?? "2026-10-19T09:00:00Z",
|
|
21
|
-
updatedBy: me
|
|
21
|
+
updatedBy: me,
|
|
22
|
+
folder: file.folder ?? null
|
|
22
23
|
});
|
|
23
24
|
return {
|
|
24
25
|
me,
|
package/dist/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/memory.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { DocumentsHost, Person, Rights, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n bytes: Bytes;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n};\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files }: { me: Person; spaces: Space[]; files: MemoryFile[] }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me,\n });\n return {\n me,\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights } }),\n versions: async id => {\n const file = find(id);\n return [\n { id: 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n file.versions = [{ id: `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes }, ...(file.versions ?? [])];\n file.bytes = old.bytes;\n file.updatedAt = new Date().toISOString();\n },\n };\n}\n"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/memory.ts"],"sourcesContent":["import { kindOf } from './kinds';\nimport type { DocumentsHost, Person, Rights, Space } from './types';\n\ntype Bytes = ArrayBuffer | string;\n\nexport type MemoryFile = {\n id: string;\n spaceId: string;\n name: string;\n folder?: string;\n bytes: Bytes;\n updatedAt?: string;\n rights?: Partial<Rights>;\n versions?: { id: string; createdAt: string; bytes: Bytes; note?: string }[];\n};\n\nconst encode = (bytes: Bytes) => typeof bytes === 'string' ? new TextEncoder().encode(bytes).buffer as ArrayBuffer : bytes;\n\nexport function memoryHost({ me, spaces, files }: { me: Person; spaces: Space[]; files: MemoryFile[] }): DocumentsHost {\n const find = (id: string) => {\n const file = files.find(item => item.id === id);\n if (!file) throw new Error('document not found');\n return file;\n };\n const summary = (file: MemoryFile) => ({\n id: file.id, spaceId: file.spaceId, name: file.name, kind: kindOf(file.name)!, size: encode(file.bytes).byteLength,\n updatedAt: file.updatedAt ?? '2026-10-19T09:00:00Z', updatedBy: me, folder: file.folder ?? null,\n });\n return {\n me,\n spaces: async () => spaces,\n documents: async spaceId => files.filter(file => file.spaceId === spaceId && kindOf(file.name)).map(summary),\n document: async id => ({ ...summary(find(id)), rights: { view: true, comment: true, edit: true, ...find(id).rights } }),\n versions: async id => {\n const file = find(id);\n return [\n { id: 'current', createdAt: summary(file).updatedAt, size: summary(file).size, author: me, current: true },\n ...(file.versions ?? []).map(v => ({ id: v.id, createdAt: v.createdAt, size: encode(v.bytes).byteLength, author: me, note: v.note ?? null, current: false })),\n ];\n },\n content: async (id, versionId) => {\n const file = find(id);\n const old = versionId && versionId !== 'current' ? file.versions?.find(v => v.id === versionId) : undefined;\n return encode(old ? old.bytes : file.bytes);\n },\n restore: async (id, versionId) => {\n const file = find(id);\n const old = file.versions?.find(v => v.id === versionId);\n if (!old) throw new Error('version not found');\n file.versions = [{ id: `v${(file.versions?.length ?? 0) + 1}`, createdAt: file.updatedAt ?? '2026-10-19T09:00:00Z', bytes: file.bytes }, ...(file.versions ?? [])];\n file.bytes = old.bytes;\n file.updatedAt = new Date().toISOString();\n },\n };\n}\n"],"mappings":";;;;;;AAgBA,IAAM,SAAS,CAAC,UAAiB,OAAO,UAAU,WAAW,IAAI,YAAY,EAAE,OAAO,KAAK,EAAE,SAAwB;AAE9G,SAAS,WAAW,EAAE,IAAI,QAAQ,MAAM,GAAwE;AACrH,QAAM,OAAO,CAAC,OAAe;AAC3B,UAAM,OAAO,MAAM,KAAK,UAAQ,KAAK,OAAO,EAAE;AAC9C,QAAI,CAAC,KAAM,OAAM,IAAI,MAAM,oBAAoB;AAC/C,WAAO;AAAA,EACT;AACA,QAAM,UAAU,CAAC,UAAsB;AAAA,IACrC,IAAI,KAAK;AAAA,IAAI,SAAS,KAAK;AAAA,IAAS,MAAM,KAAK;AAAA,IAAM,MAAM,OAAO,KAAK,IAAI;AAAA,IAAI,MAAM,OAAO,KAAK,KAAK,EAAE;AAAA,IACxG,WAAW,KAAK,aAAa;AAAA,IAAwB,WAAW;AAAA,IAAI,QAAQ,KAAK,UAAU;AAAA,EAC7F;AACA,SAAO;AAAA,IACL;AAAA,IACA,QAAQ,YAAY;AAAA,IACpB,WAAW,OAAM,YAAW,MAAM,OAAO,UAAQ,KAAK,YAAY,WAAW,OAAO,KAAK,IAAI,CAAC,EAAE,IAAI,OAAO;AAAA,IAC3G,UAAU,OAAM,QAAO,EAAE,GAAG,QAAQ,KAAK,EAAE,CAAC,GAAG,QAAQ,EAAE,MAAM,MAAM,SAAS,MAAM,MAAM,MAAM,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE;AAAA,IACrH,UAAU,OAAM,OAAM;AACpB,YAAM,OAAO,KAAK,EAAE;AACpB,aAAO;AAAA,QACL,EAAE,IAAI,WAAW,WAAW,QAAQ,IAAI,EAAE,WAAW,MAAM,QAAQ,IAAI,EAAE,MAAM,QAAQ,IAAI,SAAS,KAAK;AAAA,QACzG,IAAI,KAAK,YAAY,CAAC,GAAG,IAAI,QAAM,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,WAAW,MAAM,OAAO,EAAE,KAAK,EAAE,YAAY,QAAQ,IAAI,MAAM,EAAE,QAAQ,MAAM,SAAS,MAAM,EAAE;AAAA,MAC9J;AAAA,IACF;AAAA,IACA,SAAS,OAAO,IAAI,cAAc;AAChC,YAAM,OAAO,KAAK,EAAE;AACpB,YAAM,MAAM,aAAa,cAAc,YAAY,KAAK,UAAU,KAAK,OAAK,EAAE,OAAO,SAAS,IAAI;AAClG,aAAO,OAAO,MAAM,IAAI,QAAQ,KAAK,KAAK;AAAA,IAC5C;AAAA,IACA,SAAS,OAAO,IAAI,cAAc;AAChC,YAAM,OAAO,KAAK,EAAE;AACpB,YAAM,MAAM,KAAK,UAAU,KAAK,OAAK,EAAE,OAAO,SAAS;AACvD,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,mBAAmB;AAC7C,WAAK,WAAW,CAAC,EAAE,IAAI,KAAK,KAAK,UAAU,UAAU,KAAK,CAAC,IAAI,WAAW,KAAK,aAAa,wBAAwB,OAAO,KAAK,MAAM,GAAG,GAAI,KAAK,YAAY,CAAC,CAAE;AACjK,WAAK,QAAQ,IAAI;AACjB,WAAK,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,IAC1C;AAAA,EACF;AACF;","names":[]}
|
|
@@ -9,6 +9,7 @@ type Space = {
|
|
|
9
9
|
id: string;
|
|
10
10
|
name: string;
|
|
11
11
|
color?: string | null;
|
|
12
|
+
group?: string | null;
|
|
12
13
|
};
|
|
13
14
|
type Rights = {
|
|
14
15
|
view: boolean;
|
|
@@ -24,6 +25,8 @@ type DocumentSummary = {
|
|
|
24
25
|
updatedAt: string;
|
|
25
26
|
updatedBy?: Person | null;
|
|
26
27
|
thumbnailUrl?: string | null;
|
|
28
|
+
excerpt?: string | null;
|
|
29
|
+
folder?: string | null;
|
|
27
30
|
};
|
|
28
31
|
type DocumentFile = DocumentSummary & {
|
|
29
32
|
rights: Rights;
|
|
@@ -45,6 +48,7 @@ interface DocumentsHost {
|
|
|
45
48
|
pdfWorker?: () => Worker;
|
|
46
49
|
spaces(opts?: Fetch): Promise<Space[]>;
|
|
47
50
|
documents(spaceId: string, opts?: Fetch): Promise<DocumentSummary[]>;
|
|
51
|
+
everything?(opts?: Fetch): Promise<DocumentSummary[]>;
|
|
48
52
|
document(id: string, opts?: Fetch): Promise<DocumentFile>;
|
|
49
53
|
versions(id: string, opts?: Fetch): Promise<DocumentVersion[]>;
|
|
50
54
|
content(id: string, versionId?: string | null, opts?: Fetch): Promise<ArrayBuffer>;
|
|
@@ -55,4 +59,4 @@ type Place = {
|
|
|
55
59
|
documentId: string | null;
|
|
56
60
|
};
|
|
57
61
|
|
|
58
|
-
export type { DocumentsHost as D, Fetch as F, Language as L, Place as P, Rights as R, Space as S,
|
|
62
|
+
export type { DocumentsHost as D, Fetch as F, Language as L, Place as P, Rights as R, Space as S, DocumentFile as a, DocumentKind as b, DocumentSummary as c, DocumentVersion as d, Person as e };
|
|
@@ -9,6 +9,7 @@ type Space = {
|
|
|
9
9
|
id: string;
|
|
10
10
|
name: string;
|
|
11
11
|
color?: string | null;
|
|
12
|
+
group?: string | null;
|
|
12
13
|
};
|
|
13
14
|
type Rights = {
|
|
14
15
|
view: boolean;
|
|
@@ -24,6 +25,8 @@ type DocumentSummary = {
|
|
|
24
25
|
updatedAt: string;
|
|
25
26
|
updatedBy?: Person | null;
|
|
26
27
|
thumbnailUrl?: string | null;
|
|
28
|
+
excerpt?: string | null;
|
|
29
|
+
folder?: string | null;
|
|
27
30
|
};
|
|
28
31
|
type DocumentFile = DocumentSummary & {
|
|
29
32
|
rights: Rights;
|
|
@@ -45,6 +48,7 @@ interface DocumentsHost {
|
|
|
45
48
|
pdfWorker?: () => Worker;
|
|
46
49
|
spaces(opts?: Fetch): Promise<Space[]>;
|
|
47
50
|
documents(spaceId: string, opts?: Fetch): Promise<DocumentSummary[]>;
|
|
51
|
+
everything?(opts?: Fetch): Promise<DocumentSummary[]>;
|
|
48
52
|
document(id: string, opts?: Fetch): Promise<DocumentFile>;
|
|
49
53
|
versions(id: string, opts?: Fetch): Promise<DocumentVersion[]>;
|
|
50
54
|
content(id: string, versionId?: string | null, opts?: Fetch): Promise<ArrayBuffer>;
|
|
@@ -55,4 +59,4 @@ type Place = {
|
|
|
55
59
|
documentId: string | null;
|
|
56
60
|
};
|
|
57
61
|
|
|
58
|
-
export type { DocumentsHost as D, Fetch as F, Language as L, Place as P, Rights as R, Space as S,
|
|
62
|
+
export type { DocumentsHost as D, Fetch as F, Language as L, Place as P, Rights as R, Space as S, DocumentFile as a, DocumentKind as b, DocumentSummary as c, DocumentVersion as d, Person as e };
|