annotation-kit 0.0.0-stage → 0.1.1
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/LICENSE +21 -0
- package/NOTICE +75 -0
- package/README.md +114 -2
- package/README.zh-CN.md +112 -0
- package/dist/annotation-kit.css +157 -0
- package/dist/chunks/references-ukB-tSle.js +1126 -0
- package/dist/chunks/references-ukB-tSle.js.map +1 -0
- package/dist/electron/element-context.cjs +72 -0
- package/dist/electron/guest-preload.cjs +327 -0
- package/dist/electron.js +394 -0
- package/dist/electron.js.map +1 -0
- package/dist/index.js +910 -0
- package/dist/index.js.map +1 -0
- package/dist/react.js +2282 -0
- package/dist/react.js.map +1 -0
- package/dist/styles.d.ts +2 -0
- package/dist/types/address.d.ts +53 -0
- package/dist/types/address.d.ts.map +1 -0
- package/dist/types/client/Workbench.d.ts +11 -0
- package/dist/types/client/Workbench.d.ts.map +1 -0
- package/dist/types/client/composer/PacketPreview.d.ts +12 -0
- package/dist/types/client/composer/PacketPreview.d.ts.map +1 -0
- package/dist/types/client/composer/ReferenceCard.d.ts +12 -0
- package/dist/types/client/composer/ReferenceCard.d.ts.map +1 -0
- package/dist/types/client/composer/attachments.d.ts +10 -0
- package/dist/types/client/composer/attachments.d.ts.map +1 -0
- package/dist/types/client/composer/commit.d.ts +4 -0
- package/dist/types/client/composer/commit.d.ts.map +1 -0
- package/dist/types/client/composer/packets.d.ts +53 -0
- package/dist/types/client/composer/packets.d.ts.map +1 -0
- package/dist/types/client/composer/reference-presentation.d.ts +4 -0
- package/dist/types/client/composer/reference-presentation.d.ts.map +1 -0
- package/dist/types/client/error-copy.d.ts +69 -0
- package/dist/types/client/error-copy.d.ts.map +1 -0
- package/dist/types/client/errors.d.ts +10 -0
- package/dist/types/client/errors.d.ts.map +1 -0
- package/dist/types/client/files/FileSelectionAction.d.ts +7 -0
- package/dist/types/client/files/FileSelectionAction.d.ts.map +1 -0
- package/dist/types/client/files/SelectionCard.d.ts +14 -0
- package/dist/types/client/files/SelectionCard.d.ts.map +1 -0
- package/dist/types/client/files/document-workflow.d.ts +34 -0
- package/dist/types/client/files/document-workflow.d.ts.map +1 -0
- package/dist/types/client/files/pages/DocumentChrome.d.ts +30 -0
- package/dist/types/client/files/pages/DocumentChrome.d.ts.map +1 -0
- package/dist/types/client/files/pages/PageSelectionAction.d.ts +7 -0
- package/dist/types/client/files/pages/PageSelectionAction.d.ts.map +1 -0
- package/dist/types/client/files/pages/batches.d.ts +21 -0
- package/dist/types/client/files/pages/batches.d.ts.map +1 -0
- package/dist/types/client/files/pages/geometry.d.ts +16 -0
- package/dist/types/client/files/pages/geometry.d.ts.map +1 -0
- package/dist/types/client/files/pages/image-store.d.ts +8 -0
- package/dist/types/client/files/pages/image-store.d.ts.map +1 -0
- package/dist/types/client/files/pages/images.d.ts +41 -0
- package/dist/types/client/files/pages/images.d.ts.map +1 -0
- package/dist/types/client/files/pages/interaction.d.ts +55 -0
- package/dist/types/client/files/pages/interaction.d.ts.map +1 -0
- package/dist/types/client/files/pages/selection.d.ts +25 -0
- package/dist/types/client/files/pages/selection.d.ts.map +1 -0
- package/dist/types/client/files/pages/snapshot.d.ts +31 -0
- package/dist/types/client/files/pages/snapshot.d.ts.map +1 -0
- package/dist/types/client/files/references.d.ts +80 -0
- package/dist/types/client/files/references.d.ts.map +1 -0
- package/dist/types/client/files/selection.d.ts +11 -0
- package/dist/types/client/files/selection.d.ts.map +1 -0
- package/dist/types/client/files/sheets/SheetRecovery.d.ts +12 -0
- package/dist/types/client/files/sheets/SheetRecovery.d.ts.map +1 -0
- package/dist/types/client/files/sheets/SheetSurface.d.ts +27 -0
- package/dist/types/client/files/sheets/SheetSurface.d.ts.map +1 -0
- package/dist/types/client/files/sheets/geometry.d.ts +30 -0
- package/dist/types/client/files/sheets/geometry.d.ts.map +1 -0
- package/dist/types/client/files/sheets/navigation.d.ts +4 -0
- package/dist/types/client/files/sheets/navigation.d.ts.map +1 -0
- package/dist/types/client/files/sheets/snapshot.d.ts +45 -0
- package/dist/types/client/files/sheets/snapshot.d.ts.map +1 -0
- package/dist/types/client/locales.d.ts +148 -0
- package/dist/types/client/locales.d.ts.map +1 -0
- package/dist/types/client/messages/SentAnnotations.d.ts +18 -0
- package/dist/types/client/messages/SentAnnotations.d.ts.map +1 -0
- package/dist/types/client/messages/presentation.d.ts +39 -0
- package/dist/types/client/messages/presentation.d.ts.map +1 -0
- package/dist/types/client/model.d.ts +68 -0
- package/dist/types/client/model.d.ts.map +1 -0
- package/dist/types/client/quoted-context.d.ts +3 -0
- package/dist/types/client/quoted-context.d.ts.map +1 -0
- package/dist/types/client/responses/ResponseCard.d.ts +12 -0
- package/dist/types/client/responses/ResponseCard.d.ts.map +1 -0
- package/dist/types/client/responses/ResponseOverlay.d.ts +7 -0
- package/dist/types/client/responses/ResponseOverlay.d.ts.map +1 -0
- package/dist/types/client/responses/composer.d.ts +11 -0
- package/dist/types/client/responses/composer.d.ts.map +1 -0
- package/dist/types/client/responses/controller.d.ts +39 -0
- package/dist/types/client/responses/controller.d.ts.map +1 -0
- package/dist/types/client/responses/references.d.ts +62 -0
- package/dist/types/client/responses/references.d.ts.map +1 -0
- package/dist/types/client/responses/selection.d.ts +43 -0
- package/dist/types/client/responses/selection.d.ts.map +1 -0
- package/dist/types/electron/bridge.d.mts +45 -0
- package/dist/types/electron/bridge.d.mts.map +1 -0
- package/dist/types/electron/build-preload.d.mts +4 -0
- package/dist/types/electron/build-preload.d.mts.map +1 -0
- package/dist/types/electron/element-context.d.cts +7 -0
- package/dist/types/electron/element-context.d.cts.map +1 -0
- package/dist/types/electron/guest-preload.d.cts +2 -0
- package/dist/types/electron/guest-preload.d.cts.map +1 -0
- package/dist/types/electron/index.d.ts +5 -0
- package/dist/types/electron/index.d.ts.map +1 -0
- package/dist/types/host-contracts.d.ts +104 -0
- package/dist/types/host-contracts.d.ts.map +1 -0
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/react.d.ts +14 -0
- package/dist/types/react.d.ts.map +1 -0
- package/dist/types/shared/desktop.d.ts +75 -0
- package/dist/types/shared/desktop.d.ts.map +1 -0
- package/dist/types/shared/surface.d.ts +11 -0
- package/dist/types/shared/surface.d.ts.map +1 -0
- package/dist/types/ui/icons.d.ts +11 -0
- package/dist/types/ui/icons.d.ts.map +1 -0
- package/dist/types/ui/regions.d.ts +28 -0
- package/dist/types/ui/regions.d.ts.map +1 -0
- package/package.json +83 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sources":["../src/ui/icons.tsx","../src/client/Workbench.tsx","../src/client/composer/PacketPreview.tsx","../src/client/composer/ReferenceCard.tsx","../src/client/files/SelectionCard.tsx","../src/ui/regions.tsx","../src/client/files/pages/DocumentChrome.tsx","../src/client/files/pages/PageSelectionAction.tsx","../src/client/files/sheets/SheetRecovery.tsx","../src/client/responses/ResponseCard.tsx","../src/client/responses/ResponseOverlay.tsx","../src/client/files/FileSelectionAction.tsx","../src/client/files/sheets/SheetSurface.tsx","../src/client/messages/SentAnnotations.tsx"],"sourcesContent":["import type { SVGProps } from 'react'\ntype IconProps = SVGProps<SVGSVGElement>\nfunction icon(path: string, filled = false) {\n return function Icon({ width = 18, height = 18, ...props }: IconProps) {\n return <svg width={width} height={height} viewBox=\"0 0 24 24\" fill={filled ? 'currentColor' : 'none'} stroke={filled ? 'none' : 'currentColor'} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}><path d={path} /></svg>\n }\n}\nexport const Chat = icon('M20 11.5a8 8 0 0 1-8 8H5l-3 3v-11a9 9 0 0 1 18 0Z')\nexport const ChatFilled = icon('M12 2a10 10 0 0 0-10 10v10l4-3h6a8.5 8.5 0 1 0 0-17Z', true)\nexport const X = icon('m6 6 12 12M18 6 6 18')\nexport const Trash = icon('M3 6h18M9 6V3h6v3M5 6l1 15h12l1-15M10 10v7M14 10v7')\nexport const Pencil = icon('m15 4 5 5M4 20l5-1L21 7a2 2 0 0 0-5-5L4 14v6Z')\nexport const EditPencil = Pencil\nexport const SettingsSlider = icon('M4 7h5m4 0h7M4 17h9m4 0h3M9 4v6m8 4v6')\n","import { annotationErrorText } from './errors.ts'\nimport { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Chat, ChatFilled, X, SettingsSlider, Trash } from '../ui/icons.tsx'\nimport type { PropsLocale } from '../host-contracts.ts'\nimport type { BrowserSurfaceHandle } from '../shared/surface.ts'\nimport type { AnnotationsModel } from './model.ts'\nimport css from './Annotations.module.css'\n\nexport interface AnnotationProps extends PropsLocale<'annotations'> {\n readonly surface: BrowserSurfaceHandle\n readonly model: AnnotationsModel\n}\n\nexport function AnnotationButton({ surface, model, t }: AnnotationProps) {\n const state = useSyncExternalStore(model.subscribe, model.getSnapshot)\n const active = state.drafts[surface.id]?.active ?? false\n return <button type=\"button\" className={css.annotate} aria-label={t('annotate')} aria-pressed={active}\n disabled={!active && (!model.available(surface) || !model.hasTarget())}\n title={active ? t('close') : t('pick')} onClick={() => { void model.toggle(surface) }}>\n <Chat width={18} height={18} />{t('annotate')}\n </button>\n}\n\n/** Trusted renderer overlay: no browser panel, no guest access to the comment. */\nexport function AnnotationOverlay({ surface, model, t }: AnnotationProps) {\n const state = useSyncExternalStore(model.subscribe, model.getSnapshot)\n const draft = state.drafts[surface.id]\n const selection = draft?.active ? draft.selection : undefined\n const [bounds, setBounds] = useState<DOMRect>()\n const [adjusting, setAdjusting] = useState(false)\n const form = useRef<HTMLFormElement>(null)\n const input = useRef<HTMLTextAreaElement>(null)\n useLayoutEffect(() => {\n if (!draft?.active) return\n const viewport = document.getElementById(surface.viewportId)\n if (!viewport) return\n const measure = () => setBounds(viewport.getBoundingClientRect())\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(viewport)\n window.addEventListener('resize', measure)\n window.addEventListener('scroll', measure, true)\n return () => { observer.disconnect(); window.removeEventListener('resize', measure); window.removeEventListener('scroll', measure, true) }\n }, [draft?.active, surface.viewportId])\n useEffect(() => {\n setAdjusting(false)\n if (selection) input.current?.focus()\n }, [selection])\n useLayoutEffect(() => {\n if (!input.current) return\n input.current.style.height = '24px'\n input.current.style.height = `${Math.min(144, input.current.scrollHeight)}px`\n }, [draft?.comment, selection])\n useEffect(() => {\n if (!draft?.active) return\n const dismiss = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.isComposing) return\n event.preventDefault()\n if (selection) model.cancel(surface.id)\n else void model.toggle(surface)\n }\n const outside = (event: PointerEvent) => {\n if (selection && event.target instanceof Node && !form.current?.contains(event.target)) model.cancel(surface.id)\n }\n window.addEventListener('keydown', dismiss)\n window.addEventListener('pointerdown', outside)\n return () => { window.removeEventListener('keydown', dismiss); window.removeEventListener('pointerdown', outside) }\n }, [draft?.active, selection, surface, model])\n if (!draft?.active || !bounds || bounds.width < 1 || bounds.height < 1) return null\n const controls = model.controls()\n const markers = controls?.entries.filter(entry => entry.surfaceId === surface.id && model.markerVisible(entry.id)).map(entry => {\n const point = entry.selection.anchor ?? { x: entry.selection.rect.x + 16, y: entry.selection.rect.y }\n return <button type=\"button\" key={entry.id} className={css.savedMarker} aria-label={`${t('packet.edit')} ${entry.id}`}\n style={{ left: bounds.left + point.x - 14, top: bounds.top + point.y - 28 }} onClick={() => controls.edit(entry.id)}>\n <ChatFilled width={34} height={34} /><span>{entry.id}</span>\n </button>\n })\n const toolbar = controls?.count ? <div className={css.toolbar} style={{ left: bounds.left + bounds.width / 2, top: bounds.bottom - 70 }}>\n <button type=\"button\" onClick={controls.review}>{t('annotating')} · {controls.count}</button>\n <button type=\"button\" aria-label={t('packet.remove')} title={t('packet.remove')} onClick={controls.clear}><Trash width={18} height={18} /></button>\n <button type=\"button\" className={css.send} onClick={controls.send}>{t('send')}</button>\n <button type=\"button\" aria-label={t('close')} title={t('close')} onClick={() => { void model.toggle(surface) }}><X width={18} height={18} /></button>\n </div> : null\n if (!selection) return createPortal(<>{markers}{toolbar}{draft.error && <div role=\"alert\" className={css.notice}\n style={{ left: bounds.left + 12, top: bounds.top + 12 }}>{annotationErrorText(draft.error, t)}</div>}</>, document.body)\n const anchor = selection.anchor ?? { x: selection.rect.x + Math.min(32, selection.rect.width / 2), y: selection.rect.y }\n const x = bounds.left + anchor.x * bounds.width / selection.viewport.width\n const y = bounds.top + anchor.y * bounds.height / selection.viewport.height\n const width = Math.min(296, bounds.width - 24)\n const beside = x + width + 40 <= bounds.right - 12\n const left = beside ? x + 28 : Math.max(bounds.left + 12, Math.min(x - width / 2, bounds.right - width - 12))\n const expanded = draft.comment.length > 0\n const estimatedHeight = Math.max(56, (input.current?.scrollHeight ?? 24) + 32) + (expanded ? 44 : 0) + (draft.error ? 56 : 0)\n const top = Math.max(bounds.top + 12, Math.min(beside ? y - 40 : y + 16, bounds.bottom - estimatedHeight - 12))\n return createPortal(<>\n {markers}\n {toolbar}\n {draft.editing && <div className={css.outline} style={{ left: bounds.left + selection.rect.x, top: bounds.top + selection.rect.y,\n width: selection.rect.width, height: selection.rect.height }} />}\n {!draft.editing && <span className={css.marker} style={{ left: x - 16, top: y - 28 }} aria-hidden=\"true\"><ChatFilled width={34} height={34} /></span>}\n <form ref={form} className={css.comment} style={{ left, top, width }} data-aione-annotation-comment\n aria-label={t('comment')} onSubmit={event => { event.preventDefault(); void model.save(surface) }}>\n <div className={css.commentRow}>\n <button type=\"button\" className={css.icon} aria-label={t('adjust')} title={t('adjust')}\n aria-expanded={adjusting} disabled={draft.saving} onClick={() => setAdjusting(value => !value)}>\n <SettingsSlider width={16} height={16} />\n </button>\n <textarea ref={input} rows={1} value={draft.comment} placeholder={t('placeholder')} aria-label={t('comment')}\n disabled={draft.saving} onChange={event => model.setComment(surface.id, event.currentTarget.value)}\n onKeyDown={event => {\n if (event.key === 'Enter' && !event.shiftKey && !event.nativeEvent.isComposing) {\n event.preventDefault(); void model.save(surface)\n }\n }} />\n </div>\n {expanded && <div className={css.actions}>\n {draft.editing && <button type=\"button\" className={`${css.icon} ${css.delete}`} aria-label={t('packet.remove')}\n disabled={draft.saving} onClick={() => { controls?.remove(draft.editing!.entry.id); model.cancel(surface.id) }}>\n <Trash width={18} height={18} />\n </button>}\n <button type=\"button\" className={css.cancel} disabled={draft.saving} onClick={() => model.cancel(surface.id)}>{t('cancel')}</button>\n <button type=\"submit\" className={css.save} aria-label={t('save')}\n disabled={draft.saving || !draft.comment.trim() || !model.hasTarget()}>{draft.saving ? t('adding') : t('save')}</button>\n </div>}\n {draft.error && <div className={css.error} role=\"alert\">{annotationErrorText(draft.error, t)}</div>}\n {adjusting && <div className={css.adjust}>\n <button type=\"button\" onClick={() => { model.cancel(surface.id); void model.setMode(surface, 'element') }}>{t('element')}</button>\n <button type=\"button\" onClick={() => { model.cancel(surface.id); void model.setMode(surface, 'region') }}>{t('region')}</button>\n <button type=\"button\" onClick={() => model.cancel(surface.id)}><X width={16} height={16} />{t('cancel')}</button>\n </div>}\n </form>\n </>, document.body)\n}\n","import { useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { Chat, EditPencil, Trash, X } from '../../ui/icons.tsx'\nimport type { PropsLocale } from '../../host-contracts.ts'\nimport type { InputActions, InputState } from '../../host-contracts.ts'\nimport type { SessionId } from '../../host-contracts.ts'\nimport { AnnotationPackets, ANNOTATION_SOURCE, packetSpan, type AnnotationEntry } from './packets.ts'\nimport css from './PacketPreview.module.css'\n\nexport function PacketPreview({ packets, sessionId, input, actions, t, editAnnotation }: PropsLocale<'annotations'> & {\n packets: AnnotationPackets\n sessionId: SessionId\n input: InputState\n actions: InputActions\n editAnnotation: (entry: AnnotationEntry, commit: (comment: string) => void) => boolean\n}) {\n useSyncExternalStore(packets.subscribe, packets.getSnapshot)\n const [open, setOpen] = useState(false)\n const [editing, setEditing] = useState<string>()\n const [comment, setComment] = useState('')\n const host = useRef<HTMLDivElement>(null)\n const active = [...new Set(input.occurrences.filter(item => item.source === ANNOTATION_SOURCE).map(item => item.ref))]\n .flatMap(id => { const packet = packets.get(id); return packet?.sessionId === sessionId ? [packet] : [] })\n const count = active.reduce((sum, packet) => sum + packet.entries.length, 0)\n const editable = input.phase === 'plain'\n useEffect(() => { if (packets.opened?.sessionId === sessionId) setOpen(true) }, [packets.opened, sessionId])\n useEffect(() => {\n if (!open) return\n const outside = (event: PointerEvent) => { if (event.target instanceof Node && !host.current?.contains(event.target)) setOpen(false) }\n const escape = (event: KeyboardEvent) => { if (event.key === 'Escape') setOpen(false) }\n window.addEventListener('pointerdown', outside)\n window.addEventListener('keydown', escape)\n return () => { window.removeEventListener('pointerdown', outside); window.removeEventListener('keydown', escape) }\n }, [open])\n if (!count) return null\n const label = `${count} ${count === 1 ? t('packet.one') : t('packet.many')}`\n // The current flow creates one packet per comment, preserving editor undo.\n const remove = (id: string) => { const span = packetSpan(input, id); if (span) actions.insertText('', span) }\n return <div ref={host} className={css.host} data-aione-annotation-package>\n <div className={css.chip}>\n <button type=\"button\" className={css.open} aria-expanded={open} aria-label={label} onClick={() => setOpen(value => !value)}>\n <Chat width={16} height={16} /><span>{label}</span>\n </button>\n <button type=\"button\" className={css.removeAll} aria-label={t('packet.removeAll')} disabled={!editable}\n onClick={() => {\n for (const packet of [...active].reverse()) {\n const span = packetSpan(input, packet.id)\n if (span) actions.insertText('', { ...span, draftRev: actions.captureInsertion().draftRev })\n }\n }}><X width={14} height={14} /></button>\n </div>\n {open && <section className={css.packet} data-aione-annotation-packet aria-label={t('packet.title')}>\n {active.flatMap(packet => packet.entries.map((entry, index) => <article key={`${packet.id}:${entry.id}`} className={css.entry}>\n <div className={css.heading}>\n <button type=\"button\" className={css.thumbnail} title={t('packet.screenshot')}\n onClick={() => { setEditing(editing === `image:${packet.id}` ? undefined : `image:${packet.id}`) }}>\n <img src={packet.previews[index]} alt={`${t('packet.screenshot')} #${entry.id}`} />\n </button>\n <code title={entry.selection.selector ?? entry.selection.url}>{entry.selection.element?.role ?? entry.selection.element?.tagName ?? entry.selection.kind}</code>\n <span className={css.spacer} />\n <button type=\"button\" className={css.icon} aria-label={t('packet.edit')} disabled={!editable}\n onClick={() => {\n if (editAnnotation(entry, value => packets.edit(packet.id, index, value))) { setOpen(false); return }\n setEditing(packet.id); setComment(entry.comment)\n }}><EditPencil width={18} height={18} /></button>\n <button type=\"button\" className={css.icon} aria-label={t('packet.remove')} disabled={!editable}\n onClick={() => remove(packet.id)}><Trash width={18} height={18} /></button>\n </div>\n {editing === `image:${packet.id}` && <img className={css.image} src={packet.previews[index]} alt={t('packet.screenshot')} />}\n {editing === packet.id ? <form onSubmit={event => {\n event.preventDefault(); packets.edit(packet.id, index, comment); setEditing(undefined)\n }}>\n <textarea autoFocus aria-label={t('comment')} value={comment} onChange={event => setComment(event.currentTarget.value)} />\n <div className={css.actions}><button type=\"button\" onClick={() => setEditing(undefined)}>{t('cancel')}</button>\n <button type=\"submit\" disabled={!comment.trim()}>{t('packet.done')}</button></div>\n </form> : <p className={css.text}>{entry.comment}</p>}\n </article>))}\n <button type=\"button\" className={css.dismiss} aria-label={t('packet.done')} onClick={() => setOpen(false)}><X width={16} height={16} /></button>\n </section>}\n </div>\n}\n","import { useEffect, useId, useLayoutEffect, useRef, useState, type ReactNode } from 'react'\nimport { Chat, X } from '../../ui/icons.tsx'\nimport css from '../files/SelectionCard.module.css'\n\n/** Shared compact attachment/disclosure behavior for immutable reference snapshots. */\nexport function ReferenceCard({ label, children, draft = false, initiallyOpen = false, onClear, clearLabel, kind }: {\n readonly label: string\n readonly children: ReactNode | (() => ReactNode)\n readonly draft?: boolean\n readonly initiallyOpen?: boolean\n readonly onClear?: () => void\n readonly clearLabel: string\n readonly kind: 'file' | 'response'\n}) {\n const [pinned, setPinned] = useState(initiallyOpen)\n const [hovered, setHovered] = useState(false)\n const host = useRef<HTMLDivElement>(null)\n const trigger = useRef<HTMLButtonElement>(null)\n const closeTimer = useRef<ReturnType<typeof setTimeout>>()\n const panelId = useId()\n const open = pinned || hovered\n useEffect(() => () => clearTimeout(closeTimer.current), [])\n useLayoutEffect(() => {\n const node = host.current\n if (!draft || !open || !node) return\n const measure = () => {\n let top = 0\n for (let parent = node.parentElement; parent; parent = parent.parentElement) {\n if (/(auto|scroll|hidden|clip)/u.test(getComputedStyle(parent).overflowY)) top = Math.max(top, parent.getBoundingClientRect().top)\n }\n node.style.setProperty('--file-selection-space', `${Math.max(80, node.getBoundingClientRect().top - top - 8)}px`)\n }\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(node.closest('[data-composer-card]') ?? node)\n window.addEventListener('resize', measure)\n window.addEventListener('scroll', measure, true)\n return () => { observer.disconnect(); window.removeEventListener('resize', measure); window.removeEventListener('scroll', measure, true) }\n }, [draft, open])\n useEffect(() => {\n if (!open) return\n const close = () => { setPinned(false); setHovered(false); clearTimeout(closeTimer.current) }\n const outside = (event: PointerEvent) => { if (event.target instanceof Node && !host.current?.contains(event.target)) close() }\n const escape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.isComposing) return\n if (host.current?.contains(document.activeElement)) trigger.current?.focus()\n close()\n }\n window.addEventListener('pointerdown', outside)\n window.addEventListener('keydown', escape)\n return () => { window.removeEventListener('pointerdown', outside); window.removeEventListener('keydown', escape) }\n }, [open])\n return <div ref={host} className={draft ? css.draft : css.sent}\n data-file-selection-card={kind === 'file' ? (draft ? 'draft' : 'sent') : undefined}\n data-response-annotation-card={kind === 'response' ? (draft ? 'draft' : 'sent') : undefined}\n onPointerEnter={() => { if (draft) { clearTimeout(closeTimer.current); setHovered(true) } }}\n onPointerLeave={() => { closeTimer.current = setTimeout(() => setHovered(false), 160) }}>\n <div className={css.chip}>\n <button ref={trigger} type=\"button\" className={css.summary} aria-expanded={open} aria-controls={panelId}\n onClick={() => { setPinned(!pinned); setHovered(false) }}><Chat width={16} height={16} /><span>{label}</span></button>\n {onClear && <button type=\"button\" className={css.removeAll} aria-label={clearLabel} onClick={onClear}><X width={14} height={14} /></button>}\n </div>\n {open && <section id={panelId} className={draft ? css.popover : css.details} aria-label={label}\n onFocusCapture={() => setPinned(true)}>{typeof children === 'function' ? children() : children}</section>}\n </div>\n}\n","import { useState, type ReactNode } from 'react'\nimport { X } from '../../ui/icons.tsx'\nimport { ReferenceCard } from '../composer/ReferenceCard.tsx'\nimport type { PropsLocale } from '../../host-contracts.ts'\nimport { fileLabel, filePath, type FileSnapshot } from './references.ts'\nimport { columnName } from './sheets/snapshot.ts'\nimport css from './SelectionCard.module.css'\n\nexport function SelectionCard({ items, draft = false, initiallyOpen = false, onRemove, onClear, onOpen, renderImage, renderText = text => text, t }: PropsLocale<'annotations'> & {\n items: readonly FileSnapshot[]\n draft?: boolean\n initiallyOpen?: boolean\n onRemove?: (index: number) => void\n onClear?: () => void\n onOpen?: (item: FileSnapshot) => void | Promise<void>\n renderImage?: (item: FileSnapshot) => ReactNode\n renderText?: (text: string) => ReactNode\n}) {\n const [openFailed, setOpenFailed] = useState(false)\n if (!items.length) return null\n const annotated = items.every(item => item.version !== 1 && item.comment)\n const label = `${items.length} ${annotated ? (items.length === 1 ? t('page.one') : t('page.many')) : (items.length === 1 ? t('file.one') : t('file.many'))}`\n return <ReferenceCard kind=\"file\" draft={draft} initiallyOpen={initiallyOpen} label={label} onClear={onClear} clearLabel={t('file.removeAll')}>\n {() => <>\n {items.map((item, index) => <article className={css.entry} key={`${item.id}:${index}`}>\n <div className={css.heading}>\n {onOpen ? <button type=\"button\" className={css.source} title={`${t('file.openSource')}: ${filePath(item)}`}\n onClick={async () => {\n try { await onOpen(item); setOpenFailed(false) } catch { setOpenFailed(true) }\n }}>{fileLabel(item)}</button> : <span className={css.source} title={filePath(item)}>{fileLabel(item)}</span>}\n {onRemove && <button type=\"button\" className={css.remove} aria-label={`${t('file.remove')} ${index + 1}`}\n onClick={() => onRemove(index)}><X width={14} height={14} /></button>}\n </div>\n {item.kind === 'markdown' && <span className={css.hint}>{t('file.sourceBlock')}</span>}\n {item.version !== 1 && item.comment && <p className={css.quote}>{renderText(item.comment)}</p>}\n {item.version === 3 ? <div className={css.tableScroll}><table className={css.cells} aria-label={item.a1}>\n <thead><tr><th>{t('sheet.cell')}</th><th>{t('sheet.value')}</th>{item.cells.some(cell => cell.formula) && <th>{t('sheet.formula')}</th>}</tr></thead>\n <tbody>{item.cells.map(cell => <tr key={`${cell.row}:${cell.column}`}>\n <td>{columnName(cell.column)}{cell.row + 1}</td><td title={draft ? `${t('sheet.raw')}: ${JSON.stringify(cell.raw)}${cell.format ? ` (${cell.format})` : ''}` : undefined}>\n {cell.display ? renderText(cell.display) : <span className={css.hint}>{t('sheet.empty')}</span>}\n {cell.raw !== null && String(cell.raw) !== cell.display && <small>{t('sheet.raw')}: {renderText(String(cell.raw))}</small>}\n </td>{item.cells.some(value => value.formula) && <td>{cell.formula && renderText(cell.formula)}</td>}\n </tr>)}</tbody>\n </table></div> : item.text && <blockquote className={css.quote}>{renderText(item.text)}</blockquote>}\n {item.version === 2 && item.image && renderImage?.(item)}\n </article>)}\n {openFailed && <p role=\"alert\" className={css.hint}>{t('file.openFailed')}</p>}\n </>}\n </ReferenceCard>\n}\n","import { createContext, forwardRef, useContext, type CSSProperties, type HTMLAttributes, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport css from './regions.module.css'\n\nexport type WindowOverlayStyle = Omit<CSSProperties, 'position' | 'inset' | 'pointerEvents'> & {\n readonly position?: never\n readonly inset?: never\n readonly pointerEvents?: never\n readonly WebkitAppRegion?: never\n readonly appRegion?: never\n}\nexport type WindowOverlayProps = Omit<HTMLAttributes<HTMLDivElement>, 'style'> & { readonly style?: WindowOverlayStyle }\nconst DefaultOverlay = forwardRef<HTMLDivElement, WindowOverlayProps>(function DefaultOverlay({ children, className, style, ...props }, ref) {\n if (typeof document === 'undefined') return null\n return createPortal(<div {...props} ref={ref} style={style} className={`${css.overlay}${className ? ` ${className}` : ''}`} data-annotation-window-overlay>{children}</div>, document.body)\n})\nconst defaultRegions = {\n Overlay: DefaultOverlay,\n interactiveWindowRegion: Object.freeze({ 'data-annotation-window-interactive': '' }) as Record<string, string>,\n}\nexport interface AnnotationUiRegions {\n readonly Overlay: typeof DefaultOverlay\n readonly interactiveWindowRegion: Readonly<Record<string, string>>\n}\nconst Regions = createContext<AnnotationUiRegions>(defaultRegions)\nexport function AnnotationUiProvider({ value, children }: { readonly value: AnnotationUiRegions; readonly children: ReactNode }) {\n return <Regions.Provider value={value}>{children}</Regions.Provider>\n}\nexport function useInteractiveWindowRegion() { return useContext(Regions).interactiveWindowRegion }\nexport const WindowOverlay = forwardRef<HTMLDivElement, WindowOverlayProps>(function WindowOverlay(props, ref) {\n const { Overlay } = useContext(Regions)\n return <Overlay {...props} ref={ref} />\n})\n","import { useLayoutEffect, useRef, useState, type CSSProperties, type RefObject } from 'react'\nimport { Trash } from '../../../ui/icons.tsx'\nimport { useInteractiveWindowRegion } from '../../../ui/regions.tsx'\nimport type { PropsLocale } from '../../../host-contracts.ts'\nimport css from './PageSelectionAction.module.css'\n\ntype Translate = PropsLocale<'annotations'>['t']\nexport function RequestIcon() {\n return <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\">\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3M16 3h3a2 2 0 0 1 2 2v3M3 16v3a2 2 0 0 0 2 2h3M14 10l7 5-4 1-1 5z\" />\n </svg>\n}\nexport function CommentEditor({ t, style, input, comment, setComment, busy, saved, direct, save, cancel, remove, optional = false }: {\n t: Translate; style: CSSProperties; input: RefObject<HTMLTextAreaElement>; comment: string; setComment: (value: string) => void\n busy: boolean; saved: boolean; direct?: boolean; save: () => void; cancel: () => void; remove: () => void\n optional?: boolean\n}) {\n const interactiveWindowRegion = useInteractiveWindowRegion()\n useLayoutEffect(() => { input.current?.focus() }, [])\n useLayoutEffect(() => {\n if (!input.current) return\n input.current.style.height = '24px'\n input.current.style.height = `${Math.min(144, input.current.scrollHeight)}px`\n }, [comment])\n return <form {...interactiveWindowRegion} className={`${css.comment} ${saved ? css.expanded : ''}`} style={style} data-page-comment\n onSubmit={e => { e.preventDefault(); save() }}>\n <div className={css.row}><textarea ref={input} rows={1} maxLength={8192} value={comment} disabled={busy}\n aria-label={t(optional ? 'response.placeholder' : direct ? 'page.changes' : 'page.placeholder')} placeholder={t(optional ? 'response.placeholder' : direct ? 'page.changes' : 'page.placeholder')}\n onChange={e => setComment(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter' && !e.shiftKey && !e.nativeEvent.isComposing && e.keyCode !== 229) { e.preventDefault(); save() } }} />\n {!saved && (!optional || comment.length > 0) && <button type=\"submit\" className={css.confirm} aria-label={t(optional ? 'response.save' : direct ? 'page.submit' : 'page.comment')} disabled={busy || !comment.trim()}>\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 20 20\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.7\"><path d={direct ? 'M10 16V4m-5 5 5-5 5 5' : 'm5 10 3 3 7-8'} /></svg>\n </button>}\n </div>\n {saved && <div className={css.actions}>\n <button type=\"button\" className={css.delete} aria-label={t('page.delete')} disabled={busy} onClick={remove}><Trash width={18} height={18} /></button>\n <button type=\"button\" disabled={busy} onClick={cancel}>{t('page.cancel')}</button>\n <button type=\"submit\" className={css.save} disabled={busy || (!optional && !comment.trim())}>{t('page.save')}</button>\n </div>}\n </form>\n}\n\nexport function BatchControls({ t, bounds, count, busy, sendDisabled, cancel, send, review }: {\n t: Translate; bounds: DOMRect; count: number; busy: boolean; sendDisabled: boolean; cancel: () => void; send: () => void\n review?: () => void\n}) {\n const interactiveWindowRegion = useInteractiveWindowRegion()\n const [offset, setOffset] = useState({ x: 0, y: 0 })\n const bar = useRef<HTMLDivElement>(null)\n const drag = useRef<{ pointer: number; x: number; y: number; offset: typeof offset }>()\n const room = Math.max(0, (bounds.width - (bar.current?.offsetWidth ?? 320)) / 2 - 12)\n return <div {...interactiveWindowRegion} ref={bar} className={css.batch} style={{ left: bounds.left + bounds.width / 2 + Math.max(-room, Math.min(room, offset.x)),\n top: bounds.bottom - 52 + Math.max(100 - bounds.height, Math.min(0, offset.y)), maxWidth: bounds.width - 24 }} data-page-batch>\n <span className={css.grip} aria-hidden=\"true\" onPointerDown={e => {\n if (e.button !== 0) return\n e.preventDefault(); e.currentTarget.setPointerCapture(e.pointerId)\n drag.current = { pointer: e.pointerId, x: e.clientX, y: e.clientY, offset }\n }} onPointerMove={e => {\n const start = drag.current\n if (!start || start.pointer !== e.pointerId) return\n setOffset({ x: Math.max(-room, Math.min(room, start.offset.x + e.clientX - start.x)),\n y: Math.max(100 - bounds.height, Math.min(0, start.offset.y + e.clientY - start.y)) })\n }} onPointerUp={() => { drag.current = undefined }} onLostPointerCapture={() => { drag.current = undefined }}>⠿</span>\n {review && count ? <button type=\"button\" className={css.count} onClick={review}>{count} {t(count === 1 ? 'page.one' : 'page.many')}</button>\n : <span className={css.count}>{count ? `${count} ${t(count === 1 ? 'page.one' : 'page.many')}` : t('page.pick')}</span>}\n <button type=\"button\" disabled={busy} onClick={cancel}>{t('page.cancel')}</button>\n {!!count && <button type=\"button\" className={css.send} disabled={busy || sendDisabled} onClick={send}>{t(busy ? 'page.sending' : 'page.send')}</button>}\n </div>\n}\n","import { annotationFailure, annotationErrorText, type AnnotationFailure } from '../../errors.ts'\nimport { useEffect, useLayoutEffect, useReducer, useRef, useState, useSyncExternalStore } from 'react'\nimport { WindowOverlay, useInteractiveWindowRegion } from '../../../ui/regions.tsx'\nimport { RequestIcon, CommentEditor, BatchControls } from './DocumentChrome.tsx'\nimport type { PropsLocale } from '../../../host-contracts.ts'\nimport { DocumentWorkflow, type DocumentAnnotationBridge } from '../document-workflow.ts'\nimport { capturePageRegion, pageRegion, readPageText } from './selection.ts'\nimport { PageBatches } from './batches.ts'\nimport { enclosing, pageBounds, projectAnchors, rangeAnchors, type Anchor, type Box } from './geometry.ts'\nimport type { PageRect, PageSnapshot } from './snapshot.ts'\nimport css from './PageSelectionAction.module.css'\nimport { pageInteraction } from './interaction.ts'\n\ninterface Pick {\n source?: Node\n value: { text: string; startPage: number; endPage: number } | { canvas: HTMLCanvasElement; region: PageRect; page: number }\n anchors: readonly Anchor[]\n bounds: Box\n}\ntype EditorPick = Pick & ({ intent: 'batch'; saved?: PageSnapshot } | { intent: 'presentation-request'; saved?: never })\nconst requestPick = (pick: Pick, presentation: boolean): EditorPick => presentation\n ? { ...pick, intent: 'presentation-request' } : { ...pick, intent: 'batch' }\nexport function pageActionComponent(bridge: DocumentAnnotationBridge, batches = new PageBatches()) {\n const workflow = new DocumentWorkflow(bridge, batches)\n return function PageSelectionAction({ absolutePath, t }: PropsLocale<'annotations'> & { absolutePath: string }) {\n const interactiveWindowRegion = useInteractiveWindowRegion()\n const mount = useRef<HTMLSpanElement>(null), chrome = useRef<HTMLDivElement>(null), input = useRef<HTMLTextAreaElement>(null)\n const pending = useRef<AbortController>(), operationId = useRef(0)\n const [preview, setPreview] = useState<HTMLElement>(), [bounds, setBounds] = useState<DOMRect>()\n const [session, setSession] = useState(bridge.targetKey()), [mode, setMode] = useState(false)\n const [interaction, dispatch] = useReducer(pageInteraction<Pick, EditorPick>, { phase: 'idle', error: '' })\n const current = useRef(interaction); current.current = interaction\n const menu = interaction.phase === 'selected' ? interaction.selection : undefined\n const editor = 'draft' in interaction ? interaction.draft : undefined\n const comment = 'comment' in interaction ? interaction.comment ?? '' : ''\n const busy = interaction.phase === 'submitting', error = interaction.error\n const liveEditor = () => 'draft' in current.current ? current.current.draft : undefined\n const liveMenu = () => current.current.phase === 'selected' ? current.current.selection : undefined\n const setComment = (value: string) => dispatch({ type: 'comment', value })\n const [outline, setOutline] = useState<Box>()\n const [, geometry] = useState(0)\n useSyncExternalStore(batches.subscribe, batches.getSnapshot)\n const supported = /\\.(pdf|docx?|pptx?)$/iu.test(absolutePath)\n const kind = /\\.pdf$/iu.test(absolutePath) ? 'pdf' : 'office', presentation = /\\.pptx?$/iu.test(absolutePath)\n const address = preview?.dataset.textpreviewUrl ?? ''\n const scope = { session: session ?? '', address }\n let items: readonly PageSnapshot[] = []\n let restoreError: AnnotationFailure = ''\n try { if (session && address) items = batches.read(session, address).filter((item): item is PageSnapshot => item.version === 2) } catch (e) { restoreError = annotationFailure(e) }\n const select = (selection?: Pick) => dispatch({ type: 'select', selection })\n const cancelEditor = () => { pending.current?.abort(); dispatch({ type: 'cancel' }); setOutline(undefined) }\n const begin = (draft: EditorPick) => {\n if (draft.intent === 'presentation-request' && !workflow.canSend) return\n dispatch({ type: 'edit', draft, comment: draft.saved?.comment ?? '' })\n window.getSelection()?.removeAllRanges()\n }\n useLayoutEffect(() => { setPreview(mount.current?.closest<HTMLElement>('[data-textpreview-url]') ?? undefined) }, [absolutePath])\n useEffect(() => bridge.subscribe(() => setSession(bridge.targetKey())), [])\n useEffect(() => { cancelEditor(); setMode(false); return () => { pending.current?.abort() } }, [session, address])\n useLayoutEffect(() => {\n if (!preview) return\n const measure = () => { setBounds(preview.getBoundingClientRect()); geometry(n => n + 1) }\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(preview)\n // PDF canvases may arrive after the preview container has reached its final size.\n const pages = new MutationObserver(measure)\n pages.observe(preview, { childList: true, subtree: true, attributes: true, attributeFilter: ['width', 'height'] })\n window.addEventListener('resize', measure); window.addEventListener('scroll', measure, true)\n return () => { observer.disconnect(); pages.disconnect(); window.removeEventListener('resize', measure); window.removeEventListener('scroll', measure, true) }\n }, [preview])\n useLayoutEffect(() => { if (editor) input.current?.focus() }, [editor])\n useLayoutEffect(() => {\n if (!input.current) return\n input.current.style.height = '24px'\n input.current.style.height = `${Math.min(144, input.current.scrollHeight)}px`\n }, [comment, editor])\n useEffect(() => {\n if (!preview || !supported) return\n let drag: { pointer: number; start: { x: number; y: number }; canvas: HTMLCanvasElement; page: number; element: Element } | undefined\n const captureText = () => {\n if (mode || liveEditor()) return\n const selection = window.getSelection(), range = selection?.rangeCount ? selection.getRangeAt(0) : undefined\n const value = range && readPageText(range, preview)\n if (!range || !value) { select(); return }\n select({ value, source: range.startContainer, anchors: rangeAnchors(range, preview), bounds: range.getBoundingClientRect() })\n }\n const start = (event: PointerEvent) => {\n if (!mode || busy || event.button !== 0 || !(event.target instanceof Element)) return\n const page = event.target.closest<HTMLElement>('[data-pdf-page]'), canvas = page?.querySelector('canvas')\n if (!canvas || !preview.contains(canvas) || !canvas.width || !canvas.height) return\n const box = canvas.getBoundingClientRect()\n if (event.clientX < box.left || event.clientX > box.right || event.clientY < box.top || event.clientY > box.bottom) return\n event.preventDefault(); event.stopPropagation(); cancelEditor(); window.getSelection()?.removeAllRanges()\n drag = { pointer: event.pointerId, start: { x: event.clientX, y: event.clientY }, canvas, page: Number(page!.dataset.pdfPage), element: event.target }\n preview.setPointerCapture(event.pointerId)\n }\n const move = (event: PointerEvent) => {\n if (!drag || event.pointerId !== drag.pointer) return\n const rect = pageRegion(drag.start, { x: event.clientX, y: event.clientY }, drag.canvas.getBoundingClientRect())\n setOutline(rect ? projectAnchors([{ page: drag.page, rect }], preview)[0] : undefined)\n }\n const end = (event: PointerEvent) => {\n if (!drag || event.pointerId !== drag.pointer) return\n const active = drag; drag = undefined\n if (preview.hasPointerCapture(event.pointerId)) preview.releasePointerCapture(event.pointerId)\n const region = pageRegion(active.start, { x: event.clientX, y: event.clientY }, active.canvas.getBoundingClientRect())\n setOutline(undefined)\n if (region) {\n const anchors = [{ page: active.page, rect: region }], box = projectAnchors(anchors, preview)[0]\n if (box) begin({ intent: 'batch', source: active.canvas, anchors, bounds: box, value: { canvas: active.canvas, region, page: active.page } })\n } else {\n // These are rendered PDF text targets, not inferred Office object identities.\n const span = active.element.closest('[data-pdf-text] span')\n if (!span) return\n const range = document.createRange(); range.selectNodeContents(span)\n const value = readPageText(range, preview)\n if (value) begin({ intent: 'batch', source: span, anchors: rangeAnchors(range, preview), bounds: span.getBoundingClientRect(), value })\n }\n }\n const keyboard = (event: KeyboardEvent) => {\n if (event.isComposing) return\n if (event.key === 'Escape') {\n if (liveEditor() || liveMenu()) { event.preventDefault(); cancelEditor() }\n else setMode(false)\n }\n const selected = liveMenu()\n if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key.toLowerCase() === 'x' && selected) {\n event.preventDefault(); begin(requestPick(selected, presentation))\n }\n }\n const outside = (event: PointerEvent) => {\n if (!(event.target instanceof Node) || chrome.current?.contains(event.target) || mount.current?.contains(event.target)) return\n if (liveEditor() && !busy) cancelEditor()\n if (!preview.contains(event.target)) select()\n }\n const mutations = new MutationObserver(records => {\n const source = liveEditor()?.source ?? liveMenu()?.source\n const page = (source instanceof Element ? source : source?.parentElement)?.closest('[data-pdf-page]')\n if (source && (!source.isConnected || records.some(r => page?.contains(r.target) && (r.type !== 'childList'\n || [...r.addedNodes, ...r.removedNodes].some(node => !(node instanceof Element && node.classList.contains('endOfContent'))))))) cancelEditor()\n if (drag && !drag.canvas.isConnected) { drag = undefined; setOutline(undefined) }\n })\n mutations.observe(preview, { subtree: true, childList: true, characterData: true, attributes: true, attributeFilter: ['width', 'height'] })\n if (mode) preview.dataset.pageRegionSelecting = 'true'\n const cancelDrag = () => { drag = undefined; setOutline(undefined) }\n document.addEventListener('selectionchange', captureText); preview.addEventListener('pointerdown', start, true)\n window.addEventListener('pointermove', move); window.addEventListener('pointerup', end)\n window.addEventListener('pointercancel', cancelDrag); window.addEventListener('scroll', cancelDrag, true)\n window.addEventListener('keydown', keyboard); window.addEventListener('pointerdown', outside)\n return () => {\n mutations.disconnect(); delete preview.dataset.pageRegionSelecting\n document.removeEventListener('selectionchange', captureText); preview.removeEventListener('pointerdown', start, true)\n window.removeEventListener('pointermove', move); window.removeEventListener('pointerup', end)\n window.removeEventListener('pointercancel', cancelDrag); window.removeEventListener('scroll', cancelDrag, true)\n window.removeEventListener('keydown', keyboard); window.removeEventListener('pointerdown', outside)\n }\n }, [preview, supported, mode, busy])\n if (!supported) return null\n const save = async () => {\n if (!editor || !session || !comment.trim() || busy || pending.current && !pending.current.signal.aborted || (editor.source && !editor.source.isConnected)) return\n const controller = new AbortController(); pending.current?.abort(); pending.current = controller\n const token = ++operationId.current\n dispatch({ type: 'start', operation: 'commit', token })\n try {\n let snapshot = editor.saved, image: File | undefined\n if (!snapshot) {\n const id = crypto.randomUUID()\n if ('canvas' in editor.value) {\n const capture = await capturePageRegion(editor.value.canvas, editor.value.region, id, controller.signal)\n image = capture.file\n snapshot = { version: 2, id, address, kind, text: '', startPage: editor.value.page, endPage: editor.value.page,\n anchors: editor.anchors, region: editor.value.region, image: capture.image }\n } else snapshot = { version: 2, id, address, kind, ...editor.value, anchors: editor.anchors }\n }\n snapshot = { ...snapshot, comment: comment.trim() }\n if (editor.intent === 'presentation-request') {\n await workflow.commit(scope, { kind: 'presentation-request', snapshot }, controller.signal)\n } else await workflow.commit(scope, { kind: 'batch', snapshot, image }, controller.signal)\n if (!controller.signal.aborted) { dispatch({ type: 'complete', token }); setOutline(undefined) }\n } catch (e) { if (!controller.signal.aborted) dispatch({ type: 'fail', token, error: annotationFailure(e) }) }\n finally { if (pending.current === controller) pending.current = undefined }\n }\n const remove = async (ids: readonly string[]) => {\n if (!session || busy || pending.current && !pending.current.signal.aborted) return\n const controller = new AbortController(), token = ++operationId.current\n pending.current = controller; dispatch({ type: 'start', operation: 'batch-remove', token })\n try { await workflow.remove(scope, ids, controller.signal); if (!controller.signal.aborted) dispatch({ type: 'complete', token }) }\n catch (e) { if (!controller.signal.aborted) dispatch({ type: 'fail', token, error: annotationFailure(e) }) }\n finally { if (pending.current === controller) pending.current = undefined }\n }\n const send = async () => {\n if (!session || !items.length || busy || pending.current && !pending.current.signal.aborted || editor || !workflow.canSend) return\n const controller = new AbortController(), token = ++operationId.current\n pending.current = controller; dispatch({ type: 'start', operation: 'batch-send', token })\n try {\n await workflow.send(scope, controller.signal)\n if (!controller.signal.aborted) { setMode(false); dispatch({ type: 'complete', token }) }\n } catch (e) { if (!controller.signal.aborted) dispatch({ type: 'fail', token, error: annotationFailure(e) }) }\n finally { if (pending.current === controller) pending.current = undefined }\n }\n const openSaved = (item: PageSnapshot) => {\n if (busy || !preview) return\n const anchors = item.anchors ?? (item.region ? [{ page: item.startPage, rect: item.region }] : [])\n const box = enclosing(projectAnchors(anchors, preview)) ?? pageBounds(preview, item.startPage)\n if (box) begin({ intent: 'batch', saved: item, anchors, bounds: box, value: item })\n }\n const editorBoxes = editor && preview ? projectAnchors(editor.anchors, preview) : []\n const editorBox = enclosing(editorBoxes) ?? editor?.bounds\n const width = Math.min(296, (bounds?.width ?? 320) - 24)\n const beside = editorBox && bounds && editorBox.right + width + 24 < bounds.right\n const left = editorBox && bounds ? Math.max(bounds.left + 12, Math.min(beside ? editorBox.right + 18 : editorBox.right - width, bounds.right - width - 12)) : 0\n const top = editorBox && bounds ? Math.max(bounds.top + 48, Math.min(beside ? editorBox.top - 24 : editorBox.bottom + 8,\n bounds.bottom - (editor?.saved ? 160 : Math.max(64, (input.current?.scrollHeight ?? 24) + 40)))) : 0\n const visible = (box: Box) => bounds && box.bottom > bounds.top + 40 && box.top < bounds.bottom && box.right > bounds.left && box.left < bounds.right\n return <span {...interactiveWindowRegion} ref={mount} className={css.control}>\n <button type=\"button\" className={css.toggle} data-page-region-toggle aria-pressed={mode} disabled={!session || busy}\n onClick={() => { cancelEditor(); setMode(!mode) }}><RequestIcon />{t('page.request')}</button>\n {preview && bounds && <WindowOverlay ref={chrome} className={css.chrome} data-document-annotations\n style={{ clipPath: `inset(${bounds.top + 40}px ${Math.max(0, window.innerWidth - bounds.right)}px ${Math.max(0, window.innerHeight - bounds.bottom)}px ${bounds.left}px)` }}>\n {items.map(item => {\n if (item.id === editor?.saved?.id) return null\n const boxes = projectAnchors(item.anchors ?? [], preview), box = enclosing(boxes)\n return box && visible(box) ? <div key={item.id}>{boxes.filter(visible).map((b, i) => <div key={i} className={css.outline} style={b} />)}\n <button {...interactiveWindowRegion} type=\"button\" className={css.marker} aria-label={`${t('page.edit')} ${items.indexOf(item) + 1}`}\n style={{ left: Math.min(box.right - 13, bounds.right - 30), top: Math.max(bounds.top + 44, box.top - 13) }} onClick={() => openSaved(item)} />\n </div> : null\n })}\n {outline && <div className={css.outline} style={outline} />}\n {menu && !editor && visible(menu.bounds) && <button {...interactiveWindowRegion} type=\"button\" className={css.ask} data-page-ask\n disabled={presentation && !workflow.canSend}\n style={{ left: Math.max(bounds.left + 8, Math.min(menu.bounds.right, bounds.right - 230)), top: Math.min(menu.bounds.bottom + 8, bounds.bottom - 44) }}\n onPointerDown={e => e.preventDefault()} onClick={() => begin(requestPick(menu, presentation))}>\n {presentation ? <><RequestIcon />{t('page.request')}</> : <>{t('page.ask')}<kbd>Ctrl Shift X</kbd></>}\n </button>}\n {editor && editorBox && visible(editorBox) && <>\n {(editorBoxes.length ? editorBoxes : [editorBox]).filter(visible).map((box, i) => <div key={i} className={css.outline} style={{ ...box, borderStyle: editor.intent === 'presentation-request' ? 'solid' : undefined }} />)}\n {editor.intent === 'batch' && <span className={css.marker} style={{ left: Math.min(editorBox.right - 13, bounds.right - 30), top: Math.max(bounds.top + 44, editorBox.top - 13) }} />}\n <CommentEditor key={editor.saved?.id ?? 'new'} t={t} style={{ left, top, width }} input={input}\n comment={comment} setComment={setComment} busy={busy} saved={!!editor.saved} direct={editor.intent === 'presentation-request'}\n save={() => void save()} cancel={cancelEditor} remove={() => void remove([editor.saved!.id])} />\n </>}\n {(mode || items.length > 0) && <BatchControls key={`${session}:${address}`} t={t} bounds={bounds}\n count={items.length} busy={busy} sendDisabled={!!editor || !workflow.canSend}\n cancel={() => { void remove(items.map(item => item.id)).then(() => setMode(false)) }} send={() => void send()} />}\n {(error || restoreError) && <div {...interactiveWindowRegion} className={css.error} role=\"alert\" style={{ left: bounds.left + 12, bottom: window.innerHeight - bounds.bottom + 60, maxWidth: bounds.width - 24 }}>{annotationErrorText(error || restoreError, t)}</div>}\n {!workflow.canSend && (mode || items.length > 0 || menu) && <div role=\"status\" className={css.error}\n style={{ left: bounds.left + 12, bottom: window.innerHeight - bounds.bottom + 60, maxWidth: bounds.width - 24 }}>{t('page.senderUnavailable')}</div>}\n </WindowOverlay>}\n </span>\n }\n}\n","import { annotationFailure, annotationErrorText, type AnnotationFailure } from '../../errors.ts'\nimport { useEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { WindowOverlay, useInteractiveWindowRegion } from '../../../ui/regions.tsx'\nimport type { PropsLocale } from '../../../host-contracts.ts'\nimport { parseFileAddress } from '../../../address.ts'\nimport { DocumentWorkflow, type DocumentAnnotationBridge } from '../document-workflow.ts'\nimport { PageBatches } from '../pages/batches.ts'\nimport { BatchControls } from '../pages/DocumentChrome.tsx'\nimport { SelectionCard } from '../SelectionCard.tsx'\nimport type { SpreadsheetSnapshot } from './snapshot.ts'\nimport css from '../pages/PageSelectionAction.module.css'\n\nexport function failedSheetPreview(root: ParentNode) {\n for (const host of root.querySelectorAll<HTMLElement>('[data-textpreview-url]')) {\n const address = host.dataset.textpreviewUrl!\n if (!/\\.(xlsx|csv)$/iu.test(parseFileAddress(address)?.path ?? '') || host.querySelector('[data-annotation-sheet]')) continue\n if (host.querySelector('[data-textpreview-failed], [data-sheet-load-error]')) return { host, address }\n }\n}\n\n/** The session overlay outlives a failed document body. Its UI stays inside that preview. */\nexport function sheetRecoveryComponent(bridge: DocumentAnnotationBridge, batches: PageBatches) {\n const workflow = new DocumentWorkflow(bridge, batches)\n return function SheetRecovery({ sessionId, t }: PropsLocale<'annotations'> & { sessionId: string }) {\n const interactiveWindowRegion = useInteractiveWindowRegion()\n const [target, setTarget] = useState<ReturnType<typeof failedSheetPreview>>()\n const [bounds, setBounds] = useState<DOMRect>(), [busy, setBusy] = useState(false), [error, setError] = useState<AnnotationFailure>('')\n const pending = useRef<AbortController>()\n useSyncExternalStore(batches.subscribe, batches.getSnapshot)\n useEffect(() => {\n let frame: number | undefined\n const scan = () => {\n frame = undefined\n const next = bridge.targetKey() === sessionId ? failedSheetPreview(document) : undefined\n setTarget(previous => previous?.host === next?.host && previous?.address === next?.address ? previous : next)\n }\n const schedule = () => { if (frame === undefined) frame = requestAnimationFrame(scan) }\n const observer = new MutationObserver(schedule)\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['data-textpreview-url', 'data-textpreview-failed'] })\n const unsubscribe = bridge.subscribe(schedule)\n scan()\n return () => { observer.disconnect(); unsubscribe(); if (frame !== undefined) cancelAnimationFrame(frame) }\n }, [sessionId])\n useEffect(() => {\n setError(''); setBusy(false)\n if (!target) return\n const measure = () => setBounds(target.host.getBoundingClientRect())\n const observer = new ResizeObserver(measure)\n observer.observe(target.host); measure()\n window.addEventListener('resize', measure)\n return () => { observer.disconnect(); window.removeEventListener('resize', measure); pending.current?.abort() }\n }, [target, sessionId])\n if (!target || !bounds || bounds.width === 0) return null\n let items: readonly SpreadsheetSnapshot[]\n try { items = batches.read(sessionId, target.address).filter((s): s is SpreadsheetSnapshot => s.version === 3) }\n catch { return null }\n if (!items.length) return null\n const run = async (send: boolean, ids = items.map(item => item.id)) => {\n if (busy || pending.current && !pending.current.signal.aborted) return\n const controller = new AbortController(); pending.current = controller; setBusy(true); setError('')\n try {\n if (send) {\n await workflow.send({ session: sessionId, address: target.address }, controller.signal)\n } else await workflow.remove({ session: sessionId, address: target.address }, ids, controller.signal)\n } catch (e) { if (!controller.signal.aborted) setError(annotationFailure(e)) }\n finally { if (pending.current === controller) { pending.current = undefined; if (!controller.signal.aborted) setBusy(false) } }\n }\n return <WindowOverlay className={css.chrome} data-sheet-recovery>\n <div {...interactiveWindowRegion} className={css.snapshotReview} style={{ left: bounds.left + 12, top: bounds.top + 58, width: bounds.width - 24, maxHeight: bounds.height - 125 }}>\n <p>{t('sheet.unavailable')}</p>\n {!workflow.canSend && <p role=\"status\">{t('page.senderUnavailable')}</p>}\n <SelectionCard t={t} items={items} initiallyOpen onRemove={busy ? undefined : index => void run(false, [items[index]!.id])} />\n {error && <p role=\"alert\">{annotationErrorText(error, t)}</p>}\n </div>\n <BatchControls t={t} bounds={bounds} count={items.length} busy={busy} sendDisabled={!workflow.canSend}\n cancel={() => void run(false)} send={() => void run(true)} />\n </WindowOverlay>\n }\n}\n","import { useState, type ReactNode } from 'react'\nimport { Pencil, Trash } from '../../ui/icons.tsx'\nimport type { PropsLocale } from '../../host-contracts.ts'\nimport { ReferenceCard } from '../composer/ReferenceCard.tsx'\nimport { annotationErrorText, annotationFailure, type AnnotationFailure } from '../errors.ts'\nimport type { ResponseAnnotationSnapshot } from './references.ts'\nimport css from '../files/SelectionCard.module.css'\n\nexport function ResponseCard({ items, draft = false, t, onOpen, onRemove, onClear, renderText = text => text }: PropsLocale<'annotations'> & {\n readonly items: readonly ResponseAnnotationSnapshot[]\n readonly draft?: boolean\n readonly onOpen?: (snapshot: ResponseAnnotationSnapshot, edit: boolean, trigger?: HTMLElement) => void | Promise<void>\n readonly onRemove?: (snapshot: ResponseAnnotationSnapshot) => void\n readonly onClear?: () => void\n readonly renderText?: (text: string) => ReactNode\n}) {\n const [failure, setFailure] = useState<AnnotationFailure>()\n const run = async (action: () => void | Promise<void>) => {\n try { await action(); setFailure(undefined) } catch (error) { setFailure(annotationFailure(error)) }\n }\n if (!items.length) return null\n return <ReferenceCard kind=\"response\" draft={draft} label={`${items.length} ${t(items.length === 1 ? 'packet.one' : 'packet.many')}`}\n clearLabel={t('packet.removeAll')} onClear={onClear ? () => { void run(onClear) } : undefined}>\n {items.map((snapshot, index) => <article className={css.entry} key={`${snapshot.id}:${index}`}>\n <div className={css.heading}>\n {onOpen ? <button type=\"button\" className={css.source} title={t('response.source')}\n onClick={event => { const trigger = event.currentTarget; void run(() => onOpen(snapshot, false, trigger)) }}>\n {index + 1}. {t('response.location')}\n </button> : <span className={css.source}>{index + 1}. {t('response.location')}</span>}\n {draft && onOpen && <button type=\"button\" className={css.remove} aria-label={`${t('response.edit')} ${index + 1}`}\n onClick={event => { const trigger = event.currentTarget; void run(() => onOpen(snapshot, true, trigger)) }}><Pencil width={14} height={14} /></button>}\n {onRemove && <button type=\"button\" className={css.remove} aria-label={`${t('page.delete')} ${index + 1}`}\n onClick={() => { void run(() => onRemove(snapshot)) }}><Trash width={14} height={14} /></button>}\n </div>\n <blockquote className={css.quote} aria-label={t('response.selected')}>{renderText(snapshot.text)}</blockquote>\n {snapshot.comment && <p className={css.quote}>{renderText(snapshot.comment)}</p>}\n </article>)}\n {failure && <p role=\"alert\" className={css.hint}>{annotationErrorText(failure, t)}</p>}\n </ReferenceCard>\n}\n","import { useEffect, useLayoutEffect, useRef, useState, useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { WindowOverlay, useInteractiveWindowRegion } from '../../ui/regions.tsx'\nimport type { PropsLocale } from '../../host-contracts.ts'\nimport { CommentEditor } from '../files/pages/DocumentChrome.tsx'\nimport { annotationErrorText, annotationFailure } from '../errors.ts'\nimport type { ResponseController } from './controller.ts'\nimport chrome from '../files/pages/PageSelectionAction.module.css'\nimport css from './responses.module.css'\n\nfunction viewport(root: HTMLElement): DOMRect {\n const frame = root.closest<HTMLElement>('[data-conversation-scroll]')\n if (frame) return frame.getBoundingClientRect()\n for (let parent = root.parentElement; parent; parent = parent.parentElement) {\n if (/(auto|scroll)/u.test(getComputedStyle(parent).overflowY)) return parent.getBoundingClientRect()\n }\n return (root.closest<HTMLElement>('[data-chat-flow]') ?? root).getBoundingClientRect()\n}\nconst boxes = (ranges: readonly Range[]): DOMRect[] => ranges.flatMap(range => Array.from(range.getClientRects())).filter(rect => rect.width > 0 && rect.height > 0)\n\nexport function ResponseOverlay({ controller, sessionId, t }: PropsLocale<'annotations'> & { readonly controller: ResponseController; readonly sessionId: string }) {\n const interactiveWindowRegion = useInteractiveWindowRegion()\n useSyncExternalStore(controller.subscribe, controller.getSnapshot)\n const [layout, setLayout] = useState(0)\n const [comment, setComment] = useState('')\n const input = useRef<HTMLTextAreaElement>(null)\n const addButton = useRef<HTMLButtonElement>(null)\n const [addSize, setAddSize] = useState({ width: 0, height: 0 })\n const overlay = useRef<HTMLDivElement>(null)\n const observedEditors = useRef(new Set<string>())\n useEffect(() => controller.composer.subscribe(() => { setLayout(value => value + 1) }), [controller])\n const active = controller.composer.targetKey() === sessionId\n const editor = active && controller.editor?.snapshot.sessionId === sessionId ? controller.editor : undefined\n const candidate = active ? controller.candidate : undefined\n const items = active ? controller.composer.responses?.read(sessionId) ?? [] : []\n const source = [...controller.surfaces].find(surface => surface.source.sessionId === sessionId)?.root\n const frameRoot = source?.closest('[data-chat-flow]') ?? source\n useLayoutEffect(() => { setComment(editor?.snapshot.comment ?? '') }, [editor])\n useLayoutEffect(() => {\n const button = addButton.current\n if (!button) return\n const measure = () => {\n const { width, height } = button.getBoundingClientRect()\n setAddSize(previous => previous.width === width && previous.height === height ? previous : { width, height })\n }\n measure()\n const observer = new ResizeObserver(measure)\n observer.observe(button)\n return () => observer.disconnect()\n }, [candidate, editor, t])\n useLayoutEffect(() => {\n if (!active) return\n const observer = new ResizeObserver(() => setLayout(value => value + 1))\n if (frameRoot) observer.observe(frameRoot)\n if (input.current?.form) observer.observe(input.current.form)\n return () => observer.disconnect()\n }, [active, frameRoot, editor])\n useEffect(() => {\n if (!active) return\n let frame = 0\n const measure = () => { cancelAnimationFrame(frame); frame = requestAnimationFrame(() => setLayout(value => value + 1)) }\n const select = () => {\n if (overlay.current?.contains(document.activeElement)) return\n controller.select(sessionId)\n }\n const keyup = (event: KeyboardEvent) => { if (!event.isComposing && event.key.startsWith('Arrow')) select() }\n const outside = (event: PointerEvent) => {\n if (event.target instanceof Node && !overlay.current?.contains(event.target)) {\n if (controller.editor) controller.dismiss()\n else if (controller.selectedId) controller.dismiss()\n }\n }\n const keydown = (event: KeyboardEvent) => {\n if (event.key === 'Tab' && !event.shiftKey && controller.candidate && !controller.editor\n && !overlay.current?.contains(document.activeElement)) {\n const add = overlay.current?.querySelector<HTMLButtonElement>('[data-response-add]')\n if (add) { event.preventDefault(); add.focus(); return }\n }\n if (event.key !== 'Escape' || event.isComposing || (!controller.editor && !controller.candidate && !controller.selectedId)) return\n event.preventDefault()\n controller.dismiss(true)\n }\n document.addEventListener('selectionchange', select)\n document.addEventListener('pointerup', select)\n document.addEventListener('keyup', keyup)\n document.addEventListener('keydown', keydown)\n document.addEventListener('pointerdown', outside)\n window.addEventListener('scroll', measure, true)\n window.addEventListener('resize', measure)\n return () => {\n cancelAnimationFrame(frame)\n document.removeEventListener('selectionchange', select); document.removeEventListener('pointerup', select)\n document.removeEventListener('keyup', keyup); document.removeEventListener('keydown', keydown); document.removeEventListener('pointerdown', outside)\n window.removeEventListener('scroll', measure, true); window.removeEventListener('resize', measure)\n controller.dismiss()\n }\n }, [active, controller, sessionId])\n // An undo, removal or successful send must also remove its editor/highlight.\n useEffect(() => {\n if (!editor) return\n if (items.some(item => item.id === editor.snapshot.id)) observedEditors.current.add(editor.snapshot.id)\n else if (observedEditors.current.has(editor.snapshot.id) && !controller.busy) controller.dismiss()\n }, [controller, editor, items])\n if (!active) return null\n const fallback = document.querySelector<HTMLElement>('[data-chat-flow]')\n if (!source && !fallback) return null\n const bounds = viewport(source ?? fallback!)\n if (bounds.width < 1 || bounds.height < 1) return null\n const visible = (box: DOMRect) => box.bottom > bounds.top && box.top < bounds.bottom && box.right > bounds.left && box.left < bounds.right\n const entries = items.map(snapshot => {\n const ranges = controller.ranges(snapshot)\n const root = ranges[0]?.startContainer.parentElement?.closest<HTMLElement>('[data-response-source]')\n return { snapshot, rects: boxes(ranges), root }\n })\n const selectedRanges = controller.selected ? controller.ranges(controller.selected) : []\n const selectedRoot = selectedRanges[0]?.startContainer.parentElement?.closest<HTMLElement>('[data-response-source]')\n const readonlySelection = controller.selected && !items.some(item => item.id === controller.selectedId) && !editor\n ? boxes(selectedRanges).filter(visible) : []\n const pick = candidate && boxes(candidate.ranges).filter(visible).at(-1)\n const editing = editor && (entries.find(entry => entry.snapshot.id === editor.snapshot.id)?.rects.filter(visible).at(-1)\n ?? new DOMRect(bounds.left + bounds.width / 2, bounds.bottom - 30, 0, 0))\n const panelWidth = Math.max(100, Math.min(296, bounds.width - 16))\n const panelHeight = input.current?.form?.getBoundingClientRect().height || (editor?.initial ? 46 : 128)\n const position = (box: DOMRect, width: number, height: number) => ({ width,\n left: Math.max(bounds.left + 8, Math.min(box.right - width, bounds.right - width - 8)),\n top: Math.max(bounds.top + 8, Math.min(box.top - height - 12 >= bounds.top ? box.top - height - 12 : box.bottom + 10, bounds.bottom - height - 8)) })\n return <WindowOverlay ref={overlay} className={`${chrome.chrome} ${css.overlay}`} data-response-annotation-ui data-layout-revision={layout}\n style={{ clipPath: `inset(${Math.max(0, bounds.top)}px ${Math.max(0, window.innerWidth - bounds.right)}px ${Math.max(0, window.innerHeight - bounds.bottom)}px ${Math.max(0, bounds.left)}px)` }}>\n {selectedRoot && createPortal(<div data-response-annotation-ui className={css.markers}>\n {readonlySelection.map((rect, index) => <span key={`source:${index}`} className={css.highlight}\n style={{ left: rect.left - selectedRoot.getBoundingClientRect().left, top: rect.top - selectedRoot.getBoundingClientRect().top, width: rect.width, height: rect.height }} />)}\n </div>, selectedRoot)}\n {entries.map(({ snapshot, rects, root }, index) => {\n const visibleRects = rects.filter(visible)\n const end = visibleRects.at(-1)\n if (!end || !root) return null\n const origin = root.getBoundingClientRect()\n return createPortal(<div data-response-annotation-ui className={css.markers}>\n {controller.selectedId === snapshot.id && visibleRects.map((rect, boxIndex) => <span key={boxIndex} className={css.highlight}\n style={{ left: rect.left - origin.left, top: rect.top - origin.top, width: rect.width, height: rect.height }} />)}\n <button {...interactiveWindowRegion} type=\"button\" className={`${chrome.marker} ${css.marker}`} aria-label={`${t('response.edit')} ${index + 1}`}\n style={{ left: Math.max(bounds.left + 2, Math.min(end.right + 4, bounds.right - 22)) - origin.left, top: Math.max(bounds.top + 2, end.top + end.height / 2 - 10) - origin.top }}\n onClick={event => { void controller.open(snapshot, true, event.currentTarget).catch(error => { controller.failure = annotationFailure(error); controller.changed() }) }}>{index + 1}</button>\n </div>, root, snapshot.id)\n })}\n {pick && !editor && <button {...interactiveWindowRegion} ref={addButton} type=\"button\" className={`${chrome.ask} ${css.ask}`} data-response-add\n style={{ ...position(pick, addSize.width || 80, addSize.height || 28), width: 'max-content', maxWidth: bounds.width - 16 }} disabled={controller.busy}\n onPointerDown={event => event.preventDefault()} onClick={() => { void controller.add() }}>{t('response.add')}</button>}\n {editor && editing && <CommentEditor key={`${editor.snapshot.id}:${editor.initial}`} optional t={t} input={input}\n style={position(editing, panelWidth, panelHeight)} comment={comment} setComment={setComment} saved={!editor.initial} busy={controller.busy}\n save={() => controller.save(comment)} cancel={() => controller.dismiss(true)} remove={() => controller.remove()} />}\n {controller.failure && <div {...interactiveWindowRegion} role=\"alert\" className={chrome.error}\n style={{ left: bounds.left + 12, top: bounds.bottom - 70, maxWidth: bounds.width - 24 }}>{annotationErrorText(controller.failure, t)}</div>}\n </WindowOverlay>\n}\n","import { annotationFailure, annotationErrorText, type AnnotationFailure } from '../errors.ts'\nimport { useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { Chat } from '../../ui/icons.tsx'\nimport type { PropsLocale, FileActionProps } from '../../host-contracts.ts'\nimport type { ComposerBridge } from '../../host-contracts.ts'\nimport { readFileSelection, type FileKind, type FileSelection } from './selection.ts'\nimport css from './FileSelectionAction.module.css'\nimport type { FileSnapshot } from './references.ts'\n\ntype ActionProps = FileActionProps & PropsLocale<'annotations'>\n\nfunction sourceRoot(preview: HTMLElement, kind: FileKind): HTMLElement | null {\n const selector = kind === 'code' ? '[data-code-preview]'\n : kind === 'text' ? '[data-textpreview-plain]'\n : '[data-annotation-markdown-source] [data-document-markdown]'\n return preview.querySelector<HTMLElement>(selector)\n}\n\ntype SelectionAnchor = { selection: FileSelection; left: number; top: number; above: boolean; target: string | undefined }\n\nexport function actionComponent(kind: FileKind, bridge: ComposerBridge) {\n return function FileSelectionAction({ content, useTabInfo, t }: ActionProps) {\n const { tab } = useTabInfo()\n const mount = useRef<HTMLSpanElement>(null)\n const popup = useRef<HTMLDivElement>(null)\n const pending = useRef<AbortController | null>(null)\n const mounted = useRef(false)\n const [selected, setSelected] = useState<SelectionAnchor>()\n const [target, setTarget] = useState(bridge.hasTarget())\n const [busy, setBusy] = useState(false)\n const [error, setError] = useState<AnnotationFailure>('')\n const source = content.kind === 'text' ? content.text : undefined\n const eof = content.kind === 'text' ? content.eof : false\n useEffect(() => {\n let previous = bridge.targetKey()\n return bridge.subscribe(() => {\n setTarget(bridge.hasTarget())\n if (previous !== bridge.targetKey()) {\n previous = bridge.targetKey()\n pending.current?.abort()\n setSelected(undefined)\n }\n })\n }, [])\n useEffect(() => {\n mounted.current = true\n return () => {\n mounted.current = false\n pending.current?.abort()\n pending.current = null\n }\n }, [])\n useEffect(() => {\n pending.current?.abort()\n pending.current = null\n setBusy(false)\n setSelected(undefined)\n setError('')\n const preview = mount.current?.closest<HTMLElement>('[data-textpreview-url]')\n if (preview === undefined || preview === null || source === undefined) return\n const capture = (): void => {\n const selection = window.getSelection()\n const body = sourceRoot(preview, kind)\n if (body === null || selection === null || selection.rangeCount === 0) {\n setSelected(undefined)\n return\n }\n const range = selection.getRangeAt(0)\n const value = readFileSelection(range, body, kind)\n if (!value) { setSelected(undefined); return }\n const bounds = preview.getBoundingClientRect()\n const rect = range.getBoundingClientRect()\n if (rect.bottom < bounds.top || rect.top > bounds.bottom || rect.right < bounds.left || rect.left > bounds.right) {\n setSelected(undefined)\n return\n }\n const width = popup.current?.offsetWidth || 140\n const above = kind === 'markdown' ? rect.top - bounds.top > 48 : rect.bottom + 48 > bounds.bottom\n setSelected({ selection: value, target: bridge.targetKey(), above,\n left: Math.max(bounds.left + 8, Math.min(rect.left, Math.min(bounds.right, window.innerWidth) - width - 8)),\n top: above ? Math.max(bounds.top + 48, rect.top - 8) : Math.min(bounds.bottom - 48, rect.bottom + 8),\n })\n }\n const escape = (event: KeyboardEvent): void => {\n if (event.key === 'Escape') {\n pending.current?.abort()\n setSelected(undefined)\n const native = window.getSelection()\n if (native?.anchorNode && preview.contains(native.anchorNode)) native.removeAllRanges()\n }\n }\n const outside = (event: PointerEvent): void => {\n if (event.target instanceof Node && !preview.contains(event.target) && !popup.current?.contains(event.target)) setSelected(undefined)\n }\n document.addEventListener('selectionchange', capture)\n preview.addEventListener('pointerup', capture)\n window.addEventListener('scroll', capture, true)\n window.addEventListener('resize', capture)\n window.addEventListener('keydown', escape)\n window.addEventListener('pointerdown', outside)\n return () => {\n document.removeEventListener('selectionchange', capture)\n preview.removeEventListener('pointerup', capture)\n window.removeEventListener('scroll', capture, true)\n window.removeEventListener('resize', capture)\n window.removeEventListener('keydown', escape)\n window.removeEventListener('pointerdown', outside)\n pending.current?.abort()\n pending.current = null\n }\n }, [tab.id, tab.contentId, source, eof, kind])\n if (content.kind !== 'text') return null\n const add = async (): Promise<void> => {\n if (selected === undefined || busy) return\n const selection: FileSnapshot = { ...selected.selection, version: 1, id: crypto.randomUUID(), address: tab.contentId, kind }\n const controller = new AbortController()\n pending.current?.abort()\n pending.current = controller\n setBusy(true)\n setError('')\n try {\n await bridge.add({ text: '', fileSelection: selection, signal: controller.signal, expectedTarget: selected.target })\n if (mounted.current && !controller.signal.aborted) {\n setSelected(undefined)\n const native = window.getSelection()\n const preview = mount.current?.closest('[data-textpreview-url]')\n if (native?.anchorNode && preview?.contains(native.anchorNode)) native.removeAllRanges()\n }\n } catch (failure) {\n if (mounted.current && !controller.signal.aborted) {\n setError(annotationFailure(failure))\n }\n } finally {\n if (pending.current === controller) {\n pending.current = null\n if (mounted.current) setBusy(false)\n }\n }\n }\n return <><span ref={mount} hidden />{selected && createPortal(<div ref={popup} className={css.action}\n style={{ left: selected.left, top: selected.top, transform: selected.above ? 'translateY(-100%)' : undefined }}\n data-file-selection-popover>\n <button type=\"button\" className={css.button} data-annotation-file-add\n disabled={!target || busy}\n title={target ? t('file.addTitle') : t('file.openSession')}\n onPointerDown={event => event.preventDefault()}\n onClick={() => { void add() }}>\n <Chat width={16} height={16} />{busy ? t('file.adding') : t('file.add')}\n </button>\n {error !== '' && <span className={css.error} role=\"alert\">{annotationErrorText(error, t)}</span>}\n </div>, document.body)}</>\n }\n}\n","import { AnnotationError, annotationFailure, annotationErrorText, type AnnotationFailure } from '../../errors.ts'\nimport { startTransition, useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react'\nimport { createPortal } from 'react-dom'\nimport { WindowOverlay, useInteractiveWindowRegion } from '../../../ui/regions.tsx'\nimport type { Hooks, Selection } from '@fortune-sheet/core'\nimport type { PropsLocale } from '../../../host-contracts.ts'\nimport type { WorkbookInstance, Workbook as WorkbookComponent } from '@fortune-sheet/react'\nimport type { Sheet } from '@fortune-sheet/core'\nimport type { ComponentType, PropsWithoutRef, Ref, ComponentProps } from 'react'\nimport { DocumentWorkflow, type DocumentAnnotationBridge } from '../document-workflow.ts'\nimport { fileReference } from '../references.ts'\nimport { PageBatches } from '../pages/batches.ts'\nimport { BatchControls, CommentEditor, RequestIcon } from '../pages/DocumentChrome.tsx'\nimport css from '../pages/PageSelectionAction.module.css'\nimport { PaintedCells } from './geometry.ts'\nimport { readRange, spreadsheetSnapshot, type SpreadsheetSnapshot, type SheetRange } from './snapshot.ts'\nimport { registerSpreadsheet } from './navigation.ts'\nimport { SelectionCard } from '../SelectionCard.tsx'\n\ntype Translate = PropsLocale<'annotations'>['t']\ntype WorkbookProps = ComponentProps<typeof WorkbookComponent>\nconst copyMenu = ['copy']\nconst emptyMenu: string[] = []\n\nexport function SheetSurface({ resourceAddress: address, format, value, bridge, at: t, batches, t: excelT, Workbook, bodyCss, workbookCss = '' }: {\n resourceAddress: string; t: PropsLocale<string>['t']; Workbook: ComponentType<PropsWithoutRef<WorkbookProps> & { ref?: Ref<WorkbookInstance> }>;\n bodyCss: Record<string, string>; workbookCss?: string;\n format: 'xlsx' | 'csv'; value: { sheets: Sheet[]; unsupportedFeatures: string[] }; bridge: DocumentAnnotationBridge; at: Translate; batches: PageBatches\n}) {\n const interactiveWindowRegion = useInteractiveWindowRegion()\n const workflow = useMemo(() => new DocumentWorkflow(bridge, batches), [bridge, batches])\n const mount = useRef<HTMLElement>(null), workbookHost = useRef<HTMLDivElement>(null), api = useRef<WorkbookInstance>(null)\n const input = useRef<HTMLTextAreaElement>(null), chrome = useRef<HTMLDivElement>(null)\n const [toolbar, setToolbar] = useState<Element | null>(null), [bounds, setBounds] = useState<DOMRect>()\n const [session, setSession] = useState(bridge.targetKey()), [mode, setMode] = useState(false)\n const [activeSheet, setActiveSheet] = useState(String(value.sheets.find(s => s.status === 1)?.id ?? value.sheets[0]!.id))\n const [selection, setSelection] = useState<SheetRange>(), [menu, setMenu] = useState(false)\n const [review, setReview] = useState(false)\n const [editor, setEditor] = useState<{ snapshot: SpreadsheetSnapshot; saved: boolean }>(), [comment, setComment] = useState('')\n const [editorHeight, setEditorHeight] = useState(0)\n const [error, setError] = useState<AnnotationFailure>(''), [busy, setBusy] = useState(false)\n const [capture, setCapture] = useState<{ revision: number; action: 'begin' | 'menu'; session: string | undefined; address: string }>()\n const captureRevision = useRef(0)\n const pending = useRef<AbortController>(), gesture = useRef(false), frame = useRef<number>()\n const selectionFrame = useRef<number>()\n const painted = useRef(new PaintedCells()), [, repaint] = useState(0)\n const current = useRef({ mode, busy, editor, session, activeSheet })\n current.current = { mode, busy, editor, session, activeSheet }\n const selectionRef = useRef<Selection>()\n useSyncExternalStore(batches.subscribe, batches.getSnapshot)\n let items: readonly SpreadsheetSnapshot[] = []\n let restoreError: AnnotationFailure = ''\n try { if (session) items = batches.read(session, address).filter((s): s is SpreadsheetSnapshot => s.version === 3) } catch (e) { restoreError = annotationFailure(e) }\n const close = () => { captureRevision.current++; gesture.current = false; setEditor(undefined); setMenu(false); setReview(false); setComment(''); setError(''); workbookHost.current?.focus({ preventScroll: true }) }\n const requestCapture = (action: 'begin' | 'menu') => {\n const request = { revision: ++captureRevision.current, action, session: current.current.session, address }\n // FortuneSheet queues its mousemove selection in React. A transition commits\n // after those input/default-priority updates, unlike a pre-paint RAF callback.\n startTransition(() => setCapture(request))\n }\n const requestCaptureRef = useRef(requestCapture); requestCaptureRef.current = requestCapture\n const begin = (saved?: SpreadsheetSnapshot) => {\n captureRevision.current++\n if (!api.current || current.current.busy) return\n try {\n const selections = api.current.getSelection()\n const selected = selections?.[0] ?? selectionRef.current\n if (!saved && (selections?.length !== 1 || !selected)) throw new AnnotationError('error.separateRanges')\n const range = selected && readRange(selected)\n if (!saved && (!range || (range.row[1] - range.row[0] + 1) * (range.column[1] - range.column[0] + 1) > 4096)) throw new AnnotationError('error.selectionTooLarge')\n const snapshot = saved ?? spreadsheetSnapshot(address, format, api.current.getSheet(), selected!, api.current.getCellsByRange(selected!))\n fileReference(snapshot)\n setEditor({ snapshot, saved: !!saved }); setComment(snapshot.comment ?? ''); setMenu(false); setError('')\n } catch (e) { setError(annotationFailure(e)) }\n }\n const beginRef = useRef(begin); beginRef.current = begin\n useEffect(() => {\n if (!capture || capture.revision !== captureRevision.current || capture.session !== session || capture.address !== address) return\n captureRevision.current++\n if (current.current.busy) return\n if (capture.action === 'begin') beginRef.current()\n else setMenu(true)\n }, [capture, session, address])\n const hooks = useMemo<Hooks>(() => ({\n beforeRenderCellArea: () => {\n if (frame.current === undefined) {\n painted.current.clear()\n frame.current = requestAnimationFrame(() => { frame.current = undefined; repaint(n => n + 1) })\n }\n return true\n },\n afterRenderCell: (_cell, info, ctx) => painted.current.record(info, ctx),\n afterRenderColumnHeaderCell: (_label, index, left, width, height, ctx) => painted.current.column(index, left, width, ctx, height),\n afterRenderRowHeaderCell: (_label, index, top, width, height, ctx) => painted.current.row(index, top, height, ctx, width),\n afterSelectionChange: (sheetId, selected) => {\n selectionRef.current = selected\n const next = readRange(selected)\n if (selectionFrame.current !== undefined) cancelAnimationFrame(selectionFrame.current)\n // FortuneSheet emits this from its own commit. Publish after that commit finishes.\n selectionFrame.current = requestAnimationFrame(() => {\n selectionFrame.current = undefined\n setSelection(previous => JSON.stringify(previous) === JSON.stringify(next) ? previous : next)\n setActiveSheet(sheetId)\n })\n },\n afterActivateSheet: () => { captureRevision.current++; setMenu(false); setEditor(undefined) },\n }), [])\n useEffect(() => bridge.subscribe(() => setSession(bridge.targetKey())), [])\n useEffect(() => {\n close(); setBusy(false); setMode(false)\n return () => pending.current?.abort()\n }, [session, address])\n useLayoutEffect(() => {\n const form = input.current?.closest('form')\n if (!editor || !form) { setEditorHeight(0); return }\n const measure = () => setEditorHeight(form.getBoundingClientRect().height)\n const observer = new ResizeObserver(measure)\n observer.observe(form); measure()\n return () => observer.disconnect()\n }, [editor?.snapshot.id, editor?.saved])\n useLayoutEffect(() => {\n const preview = mount.current?.closest<HTMLElement>('[data-textpreview-url]')\n if (!preview || !workbookHost.current) return\n setToolbar(preview.querySelector('[data-sheet-annotation-toolbar]'))\n const measure = () => { setBounds(mount.current!.getBoundingClientRect()); window.dispatchEvent(new Event('resize')) }\n const observer = new ResizeObserver(measure)\n observer.observe(workbookHost.current); measure()\n const scroll = () => { setBounds(mount.current!.getBoundingClientRect()) }\n window.addEventListener('scroll', scroll, true)\n return () => { observer.disconnect(); window.removeEventListener('scroll', scroll, true) }\n }, [])\n useEffect(() => {\n const down = (e: PointerEvent) => {\n if (chrome.current?.contains(e.target as Node)) return\n captureRevision.current++\n gesture.current = false\n if (!mount.current?.contains(e.target as Node)) { setMenu(false); if (!current.current.busy) setEditor(undefined); return }\n gesture.current = e.button === 0 && (e.target as Element).closest('.fortune-cell-area') !== null\n if (gesture.current && !current.current.busy) { setEditor(undefined); setMenu(false) }\n }\n const up = () => {\n if (!gesture.current) return\n gesture.current = false\n requestCaptureRef.current(current.current.mode ? 'begin' : 'menu')\n }\n const cancel = () => { gesture.current = false; captureRevision.current++ }\n const key = (e: KeyboardEvent) => {\n const within = mount.current?.closest('[data-textpreview-url]')?.contains(document.activeElement) || chrome.current?.contains(document.activeElement)\n if (!within) return\n if (e.key === 'Escape') { e.preventDefault(); if (!current.current.busy) { if (!current.current.editor) setMode(false); close() } }\n if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key.toLowerCase() === 'x' && !current.current.editor) {\n e.preventDefault(); e.stopPropagation(); requestCaptureRef.current('begin')\n }\n }\n document.addEventListener('pointerdown', down, true); document.addEventListener('pointerup', up)\n document.addEventListener('pointercancel', cancel)\n window.addEventListener('keydown', key, true)\n return () => { document.removeEventListener('pointerdown', down, true); document.removeEventListener('pointerup', up); window.removeEventListener('keydown', key, true)\n document.removeEventListener('pointercancel', cancel); cancel()\n if (frame.current !== undefined) cancelAnimationFrame(frame.current)\n if (selectionFrame.current !== undefined) cancelAnimationFrame(selectionFrame.current)\n pending.current?.abort() }\n }, [])\n useEffect(() => registerSpreadsheet(address, snapshot => {\n const workbook = api.current\n if (!workbook) throw new AnnotationError('error.sheetNotReady')\n const sheet = workbook.getAllSheets().find(s => String(s.id) === snapshot.sheet.id && s.name === snapshot.sheet.name)\n ?? workbook.getAllSheets().find(s => s.name === snapshot.sheet.name)\n if (!sheet || sheet.hide) throw new AnnotationError('error.sheetUnavailable')\n workbook.activateSheet({ id: sheet.id })\n requestAnimationFrame(() => { workbook.setSelection([snapshot.range], { id: sheet.id }); workbook.scroll({ targetRow: snapshot.range.row[0], targetColumn: snapshot.range.column[0] }) })\n }), [address])\n const run = async (operation: (signal: AbortSignal) => Promise<void>) => {\n if (busy || pending.current && !pending.current.signal.aborted || !session) return\n const controller = new AbortController(); pending.current = controller; setBusy(true); setError('')\n try { await operation(controller.signal); if (!controller.signal.aborted) close() }\n catch (e) { if (!controller.signal.aborted) setError(annotationFailure(e)) }\n finally { if (pending.current === controller) { pending.current = undefined; if (!controller.signal.aborted) setBusy(false) } }\n }\n const scope = { session: session ?? '', address }\n const save = () => { if (editor && comment.trim()) void run(signal => workflow.commit(scope, { kind: 'batch', snapshot: { ...editor.snapshot, comment: comment.trim() } }, signal)) }\n const remove = (ids: readonly string[]) => run(signal => workflow.remove(scope, ids, signal))\n const send = () => run(async signal => {\n await workflow.send(scope, signal)\n setMode(false)\n })\n const frozen = value.sheets.find(s => String(s.id) === activeSheet)?.frozen\n const editorBox = bounds && editor && editor.snapshot.sheet.id === activeSheet ? painted.current.range(editor.snapshot.range, bounds, frozen) : undefined\n const selectedBox = bounds && selection && painted.current.range(selection, bounds, frozen)\n const width = Math.min(296, (bounds?.width ?? 320) - 24)\n const left = editorBox && bounds ? Math.max(bounds.left + 12, Math.min(editorBox.right - width, bounds.right - width - 12)) : 0\n const height = editorHeight || (editor?.saved ? 148 : 56)\n const preferredTop = editorBox ? (editor?.saved ? editorBox.top - 28 : editorBox.bottom - 4) : 0\n const top = editorBox && bounds ? Math.max(bounds.top + 12, Math.min(\n preferredTop + height <= bounds.bottom - 12 ? preferredTop : editorBox.top - height - 8,\n bounds.bottom - height - 12,\n )) : 0\n const hasFormulas = value.sheets.some(s => s.celldata?.some(c => c.v?.f))\n return <section ref={mount} className={bodyCss.body} data-excel-preview data-annotation-sheet={address} aria-label={excelT('title')}>\n <style>{workbookCss}</style>\n {value.unsupportedFeatures.length > 0 && <div className={bodyCss.notice} role=\"note\">{excelT('unsupportedNotice', { features: value.unsupportedFeatures.map(f => excelT(f)).join(excelT('featureSeparator')) })}</div>}\n <div ref={workbookHost} className={`${bodyCss.workbook} ${hasFormulas ? bodyCss.withFormulaWarning : ''}`} tabIndex={-1} style={{ outline: 'none' }}>\n {hasFormulas && <button className={bodyCss.formulaWarning} type=\"button\" title={excelT('formulaWarning')} aria-label={excelT('formulaWarning')}>ⓘ</button>}\n <Workbook ref={api} data={value.sheets} hooks={hooks} lang={excelT('language')} rowHeaderWidth={46} columnHeaderHeight={20}\n allowEdit={false} showToolbar={false} showFormulaBar showSheetTabs forceCalculation={false}\n cellContextMenu={copyMenu} headerContextMenu={emptyMenu} sheetTabContextMenu={emptyMenu} filterContextMenu={emptyMenu} />\n </div>\n {toolbar && createPortal(<button {...interactiveWindowRegion} type=\"button\" className={css.toggle} aria-pressed={mode} disabled={!session || busy} data-sheet-request-edits\n onClick={() => { close(); setMode(!mode) }}><RequestIcon />{t('page.request')}</button>, toolbar)}\n {bounds && <WindowOverlay ref={chrome} className={css.chrome} data-document-annotations data-sheet-annotations\n style={{ clipPath: `inset(${Math.max(0, bounds.top)}px ${Math.max(0, window.innerWidth - bounds.right)}px ${Math.max(0, window.innerHeight - bounds.bottom)}px ${Math.max(0, bounds.left)}px)` }}>\n {items.filter(s => s.sheet.id === activeSheet && s.id !== editor?.snapshot.id).map((item, i) => {\n const box = painted.current.range(item.range, bounds, frozen)\n return box && <div key={item.id}><div className={css.outline} style={box} data-sheet-range={item.a1} />\n <button {...interactiveWindowRegion} type=\"button\" className={css.marker} aria-label={`${t('page.edit')} ${i + 1}`} style={{ left: Math.min(box.right - 13, bounds.right - 30), top: Math.max(bounds.top + 4, box.top - 13) }}\n onClick={() => begin(item)} disabled={busy} /></div>\n })}\n {menu && selectedBox && !editor && <button {...interactiveWindowRegion} type=\"button\" className={css.ask} data-sheet-ask\n style={{ left: Math.max(bounds.left + 8, Math.min(selectedBox.left, bounds.right - 235)), top: Math.min(selectedBox.bottom + 8, bounds.bottom - 50) }}\n onPointerDown={e => e.preventDefault()} onClick={() => requestCapture('begin')}>{t('page.ask')}<kbd>Ctrl Shift X</kbd></button>}\n {editor && editorBox && <><div className={css.outline} style={editorBox} data-sheet-range={editor.snapshot.a1} />\n <span className={css.marker} style={{ left: Math.min(editorBox.right - 13, bounds.right - 30), top: Math.max(bounds.top + 4, editorBox.top - 13) }} />\n <CommentEditor key={editor.snapshot.id} t={t} style={{ left, top, width }} input={input} comment={comment} setComment={setComment}\n busy={busy} saved={editor.saved} save={save} cancel={close} remove={() => void remove([editor.snapshot.id])} /></>}\n {(mode || items.length > 0) && <BatchControls key={session} t={t} bounds={bounds} count={items.length} busy={busy} sendDisabled={!!editor || !workflow.canSend}\n review={() => { setEditor(undefined); setReview(!review) }}\n cancel={() => { void remove(items.map(s => s.id)).then(() => setMode(false)) }} send={() => void send()} />}\n {review && <div {...interactiveWindowRegion} className={css.snapshotReview} style={{ left: bounds.left + 12, top: bounds.top + 12, width: bounds.width - 24, maxHeight: bounds.height - 90 }}>\n <SelectionCard t={t} items={items} initiallyOpen onRemove={busy ? undefined : index => void remove([items[index]!.id])} />\n </div>}\n {(error || restoreError) && <div {...interactiveWindowRegion} className={css.error} role=\"alert\" style={{ left: bounds.left + 12, top: bounds.top + 40, maxWidth: bounds.width - 24 }}>{annotationErrorText(error || restoreError, t)}</div>}\n {!workflow.canSend && (mode || items.length > 0) && <div role=\"status\" className={css.error}\n style={{ left: bounds.left + 12, top: bounds.top + 40, maxWidth: bounds.width - 24 }}>{t('page.senderUnavailable')}</div>}\n </WindowOverlay>}\n </section>\n}\n","import { useState } from 'react'\nimport { Chat } from '../../ui/icons.tsx'\nimport type { ReactNode } from 'react'\nimport type { PropsLocale } from '../../host-contracts.ts'\nimport { readAnnotation } from './presentation.ts'\nimport css from './SentAnnotations.module.css'\nimport { readSentFile, type FileSnapshot } from '../files/references.ts'\nimport { SelectionCard } from '../files/SelectionCard.tsx'\nimport { readSentResponse, type ResponseAnnotationSnapshot } from '../responses/references.ts'\nimport { ResponseCard } from '../responses/ResponseCard.tsx'\n\nexport interface SentAnnotationsProps<C, A> extends PropsLocale<'annotations'> {\n content: readonly C[]\n attachments: readonly A[]\n fallback: ReactNode\n renderDefault(content: readonly C[], attachments: readonly A[]): ReactNode\n renderText(text: string): ReactNode\n imageName(attachment: A): string | undefined\n renderImage(attachment: A): ReactNode\n openFile?: (snapshot: FileSnapshot) => void | Promise<void>\n openResponse?: (snapshot: ResponseAnnotationSnapshot) => void | Promise<void>\n}\n\n/** Annotation metadata is a display hint, never HTML, a URL to fetch, or model instructions. */\nexport function SentAnnotations<C, A>({ content, attachments, fallback, renderDefault, renderImage, renderText, imageName, t, openFile, openResponse }: SentAnnotationsProps<C, A>) {\n const [expanded, setExpanded] = useState(false)\n const packets = content.flatMap(block => { const packet = readAnnotation(block); return packet ? [packet] : [] })\n const files = content.flatMap(block => { const snapshot = readSentFile(block); return snapshot ? [snapshot] : [] })\n const responses = content.flatMap(block => { const snapshot = readSentResponse(block); return snapshot ? [snapshot] : [] })\n if (packets.length === 0 && files.length === 0 && responses.length === 0) return fallback\n const entries = packets.flatMap(packet => packet.presentation.data.entries)\n const owned = new Set<A>()\n const rows = entries.map(entry => {\n const matching = attachments.filter(attachment => imageName(attachment) === entry.screenshot)\n // Never conceal an ambiguous ordinary attachment with the same filename.\n const image = matching.length === 1 ? matching[0] : undefined\n if (image) owned.add(image)\n return { entry, image }\n })\n const fileImages = new Map<string, A>()\n for (const snapshot of files) {\n if (snapshot.version !== 2 || !snapshot.image) continue\n const matching = attachments.filter(attachment => imageName(attachment) === snapshot.image!.name)\n const image = matching.length === 1 ? matching[0] : undefined\n if (image) { owned.add(image); fileImages.set(snapshot.id, image) }\n }\n const remaining = content.filter(block => !readAnnotation(block) && !readSentFile(block) && !readSentResponse(block))\n .filter(block => !(typeof block === 'object' && block !== null && 'type' in block && block.type === 'text'\n && 'text' in block && typeof block.text === 'string' && !block.text.trim()))\n const ordinaryAttachments = attachments.filter(attachment => !owned.has(attachment))\n return <>\n {renderDefault(remaining, ordinaryAttachments)}\n <ResponseCard items={responses} t={t} onOpen={openResponse} renderText={renderText} />\n <SelectionCard items={files} t={t} onOpen={openFile} renderText={renderText} renderImage={snapshot => {\n const image = fileImages.get(snapshot.id)\n return image ? renderImage(image) : <span>{t('page.imageMissing')}</span>\n }} />\n {packets.length > 0 && <section className={css.card} data-annotation-message>\n <button type=\"button\" className={css.summary} aria-expanded={expanded} onClick={() => setExpanded(!expanded)}>\n <Chat width={18} height={18} />\n <span>{entries.length} {entries.length === 1 ? t('packet.one') : t('packet.many')}</span>\n <span className={css.toggle}>{expanded ? t('message.collapse') : t('message.expand')}</span>\n </button>\n {rows.map(({ entry, image }, index) => <div className={css.entry} key={index}>\n <div className={css.context}><span className={css.number}>{index + 1}</span><span>{renderText(entry.title || entry.url)}</span></div>\n <p className={css.comment} data-expanded={expanded || undefined}>{renderText(entry.comment || t('packet.title'))}</p>\n {expanded && <div className={css.detail}>\n <span className={css.url}>{renderText(entry.url)}</span>\n <code>{renderText(entry.target)}</code>\n {image && renderImage(image)}\n </div>}\n </div>)}\n {expanded && <details className={css.evidence}>\n <summary>{t('message.evidence')}</summary>\n <pre>{renderText(packets.map(packet => packet.text).join('\\n\\n'))}</pre>\n </details>}\n </section>}\n </>\n}\n"],"names":["icon","css","draft","viewport","dismiss","markers","entry","toolbar","expanded","actions","open","comment","host","packet","count","remove","text","DefaultOverlay","WindowOverlay","save","cancel","send","chrome","error","outline","source","image","boxes","action","overlay","button","left","width","height","top"],"mappings":"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"}
|
package/dist/styles.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `dsh-resource://file/…` address grammar: how a file is named across the
|
|
3
|
+
* Sidebar and the resource model, built and parsed without touching a
|
|
4
|
+
* filesystem.
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* A file resource address, in one of two scopes.
|
|
9
|
+
*
|
|
10
|
+
* Every resource address is `dsh-resource://<type>/…`, the URI host naming the
|
|
11
|
+
* resource protocol; for `file` the path opens with the scope:
|
|
12
|
+
*
|
|
13
|
+
* - `dsh-resource://file/session/<sessionId>/<path>` names a file by its path,
|
|
14
|
+
* relative to that Session's workspace root or absolute; the
|
|
15
|
+
* Host resolves it against the root it holds for the Session.
|
|
16
|
+
* - `dsh-resource://file/absolute/<path>` names a file by its absolute path with
|
|
17
|
+
* the leading `/` dropped (`dsh-resource://file/absolute/home/ys/notes.txt`;
|
|
18
|
+
* Windows `dsh-resource://file/absolute/C:/x/y.txt`; a UNC path keeps an empty
|
|
19
|
+
* first segment, `dsh-resource://file/absolute//server/share/x.txt`). It carries
|
|
20
|
+
* no Session.
|
|
21
|
+
*
|
|
22
|
+
* Every id and path segment is component-encoded, so a name carrying `#`, `?`,
|
|
23
|
+
* or a space survives the round trip; `:` stays literal so a drive letter reads
|
|
24
|
+
* as written.
|
|
25
|
+
*/
|
|
26
|
+
export type FileAddress = {
|
|
27
|
+
readonly scope: 'session';
|
|
28
|
+
/** The Session whose Host workspace resolves the path. */
|
|
29
|
+
readonly sessionId: string;
|
|
30
|
+
/** Absolute or workspace-relative `/`-separated path; empty for the workspace root itself. */
|
|
31
|
+
readonly path: string;
|
|
32
|
+
} | {
|
|
33
|
+
readonly scope: 'absolute';
|
|
34
|
+
/** Absolute `/`-separated path: `/a/b` on POSIX, `C:/a/b` for a Windows drive, `//server/share/a` for a UNC path. */
|
|
35
|
+
readonly path: string;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Build the address of a file read through one Session.
|
|
39
|
+
* @param sessionId - the Session whose Host workspace resolves the path.
|
|
40
|
+
* @param path - absolute or workspace-relative path; backslashes are normalized to `/`, and leading `./` prefixes are dropped.
|
|
41
|
+
* @returns the `dsh-resource://file/session/<sessionId>/<path>` address.
|
|
42
|
+
*/
|
|
43
|
+
export declare function sessionFileAddress(sessionId: string, path: string): string;
|
|
44
|
+
/**
|
|
45
|
+
* Build the address of a file by its absolute path.
|
|
46
|
+
* @param path - absolute path; backslashes are normalized to `/` and the leading `/` is dropped,
|
|
47
|
+
* except that a UNC path (`\\server\share`) keeps one empty first segment.
|
|
48
|
+
* @returns the `dsh-resource://file/absolute/<path>` address.
|
|
49
|
+
*/
|
|
50
|
+
export declare function absoluteFileAddress(path: string): string;
|
|
51
|
+
/** Resolve a host URI without reading its source file. */
|
|
52
|
+
export declare function parseFileAddress(address: string): FileAddress | undefined;
|
|
53
|
+
//# sourceMappingURL=address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/address.ts"],"names":[],"mappings":"AACA;;;;;GAKG;AAEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,WAAW,GACnB;IACA,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,GACC;IACA,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;IAC1B,qHAAqH;IACrH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB,CAAA;AAoBH;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1E;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKxD;AAiCD,0DAA0D;AAC1D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAQzE"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PropsLocale } from '../host-contracts.ts';
|
|
2
|
+
import type { BrowserSurfaceHandle } from '../shared/surface.ts';
|
|
3
|
+
import type { AnnotationsModel } from './model.ts';
|
|
4
|
+
export interface AnnotationProps extends PropsLocale<'annotations'> {
|
|
5
|
+
readonly surface: BrowserSurfaceHandle;
|
|
6
|
+
readonly model: AnnotationsModel;
|
|
7
|
+
}
|
|
8
|
+
export declare function AnnotationButton({ surface, model, t }: AnnotationProps): import("react").JSX.Element;
|
|
9
|
+
/** Trusted renderer overlay: no browser panel, no guest access to the comment. */
|
|
10
|
+
export declare function AnnotationOverlay({ surface, model, t }: AnnotationProps): import("react").ReactPortal | null;
|
|
11
|
+
//# sourceMappingURL=Workbench.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Workbench.d.ts","sourceRoot":"","sources":["../../../src/client/Workbench.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAGlD,MAAM,WAAW,eAAgB,SAAQ,WAAW,CAAC,aAAa,CAAC;IACjE,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAA;IACtC,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;CACjC;AAED,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,eAAe,+BAQtE;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,eAAe,sCA4GvE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PropsLocale } from '../../host-contracts.ts';
|
|
2
|
+
import type { InputActions, InputState } from '../../host-contracts.ts';
|
|
3
|
+
import type { SessionId } from '../../host-contracts.ts';
|
|
4
|
+
import { AnnotationPackets, type AnnotationEntry } from './packets.ts';
|
|
5
|
+
export declare function PacketPreview({ packets, sessionId, input, actions, t, editAnnotation }: PropsLocale<'annotations'> & {
|
|
6
|
+
packets: AnnotationPackets;
|
|
7
|
+
sessionId: SessionId;
|
|
8
|
+
input: InputState;
|
|
9
|
+
actions: InputActions;
|
|
10
|
+
editAnnotation: (entry: AnnotationEntry, commit: (comment: string) => void) => boolean;
|
|
11
|
+
}): import("react").JSX.Element | null;
|
|
12
|
+
//# sourceMappingURL=PacketPreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PacketPreview.d.ts","sourceRoot":"","sources":["../../../../src/client/composer/PacketPreview.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,iBAAiB,EAAiC,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAGrG,wBAAgB,aAAa,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,WAAW,CAAC,aAAa,CAAC,GAAG;IACpH,OAAO,EAAE,iBAAiB,CAAA;IAC1B,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,EAAE,UAAU,CAAA;IACjB,OAAO,EAAE,YAAY,CAAA;IACrB,cAAc,EAAE,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,KAAK,OAAO,CAAA;CACvF,sCAiEA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/** Shared compact attachment/disclosure behavior for immutable reference snapshots. */
|
|
3
|
+
export declare function ReferenceCard({ label, children, draft, initiallyOpen, onClear, clearLabel, kind }: {
|
|
4
|
+
readonly label: string;
|
|
5
|
+
readonly children: ReactNode | (() => ReactNode);
|
|
6
|
+
readonly draft?: boolean;
|
|
7
|
+
readonly initiallyOpen?: boolean;
|
|
8
|
+
readonly onClear?: () => void;
|
|
9
|
+
readonly clearLabel: string;
|
|
10
|
+
readonly kind: 'file' | 'response';
|
|
11
|
+
}): import("react").JSX.Element;
|
|
12
|
+
//# sourceMappingURL=ReferenceCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReferenceCard.d.ts","sourceRoot":"","sources":["../../../../src/client/composer/ReferenceCard.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuD,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI3F,uFAAuF;AACvF,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAa,EAAE,aAAqB,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE;IAClH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,CAAA;IAChD,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAA;CACnC,+BAoDA"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SessionId } from '../../host-contracts.ts';
|
|
2
|
+
import type { ComposerAttachment, DraftAttachmentId } from '../../host-contracts.ts';
|
|
3
|
+
export interface DraftFactory {
|
|
4
|
+
createDrafts(sessionId: SessionId, files: readonly File[]): readonly ComposerAttachment[];
|
|
5
|
+
releaseDraftAttachment(id: DraftAttachmentId): void;
|
|
6
|
+
resolveDraftAttachments(ids: readonly DraftAttachmentId[]): readonly ComposerAttachment[];
|
|
7
|
+
}
|
|
8
|
+
export declare function draftFactory(value: unknown): DraftFactory;
|
|
9
|
+
export declare function imageDrafts(factory: DraftFactory, id: SessionId, images: readonly File[]): readonly DraftAttachmentId[];
|
|
10
|
+
//# sourceMappingURL=attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../../../src/client/composer/attachments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAEpF,MAAM,WAAW,YAAY;IAC3B,YAAY,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,kBAAkB,EAAE,CAAA;IACzF,sBAAsB,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACnD,uBAAuB,CAAC,GAAG,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,kBAAkB,EAAE,CAAA;CAC1F;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,YAAY,CASzD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,EAAE,GAAG,SAAS,iBAAiB,EAAE,CASvH"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DraftAttachmentId, InputActions } from '../../host-contracts.ts';
|
|
2
|
+
/** Admission is synchronous: neither a new selection nor a model switch can interleave. */
|
|
3
|
+
export declare function commitToComposer(actions: InputActions, text: string, ids: readonly DraftAttachmentId[], current: () => boolean, release: (id: DraftAttachmentId) => void, insert?: (span: ReturnType<InputActions['captureInsertion']>) => boolean): void;
|
|
4
|
+
//# sourceMappingURL=commit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../../../src/client/composer/commit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAE9E,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,YAAY,EACrB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,SAAS,iBAAiB,EAAE,EACjC,OAAO,EAAE,MAAM,OAAO,EACtB,OAAO,EAAE,CAAC,EAAE,EAAE,iBAAiB,KAAK,IAAI,EACxC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,KAAK,OAAO,GACvE,IAAI,CAeN"}
|