@semiont/react-ui 0.5.10 → 0.5.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +1 -1
  2. package/dist/{PdfAnnotationCanvas.client-P37SXBWQ.js → PdfAnnotationCanvas.client-75GY2EDR.js} +15 -6
  3. package/dist/PdfAnnotationCanvas.client-75GY2EDR.js.map +1 -0
  4. package/dist/{chunk-5LFFAVDI.js → chunk-PFUXQPWJ.js} +96 -96
  5. package/dist/{chunk-5LFFAVDI.js.map → chunk-PFUXQPWJ.js.map} +1 -1
  6. package/dist/{chunk-O2MD7TGE.js → chunk-VXASXU4K.js} +10 -2
  7. package/dist/chunk-VXASXU4K.js.map +1 -0
  8. package/dist/index.css +150 -112
  9. package/dist/index.css.map +1 -1
  10. package/dist/index.d.ts +334 -48
  11. package/dist/index.js +2494 -2201
  12. package/dist/index.js.map +1 -1
  13. package/dist/test-utils.d.ts +5 -1
  14. package/dist/test-utils.js +10 -4
  15. package/dist/test-utils.js.map +1 -1
  16. package/package.json +7 -7
  17. package/src/components/ResourceTagsInline.tsx +94 -11
  18. package/src/components/StatusDisplay.css +36 -0
  19. package/src/components/__tests__/ResourceTagsInline.test.tsx +101 -3
  20. package/src/components/annotation/AnnotateToolbar.tsx +53 -28
  21. package/src/components/annotation/__tests__/AnnotateToolbar.display.test.tsx +76 -0
  22. package/src/components/annotation/__tests__/AnnotateToolbar.test.tsx +124 -360
  23. package/src/components/image-annotation/AnnotationOverlay.tsx +6 -6
  24. package/src/components/image-annotation/SvgDrawingCanvas.tsx +17 -5
  25. package/src/components/image-annotation/__tests__/AnnotationOverlay.click.test.tsx +137 -0
  26. package/src/components/image-annotation/__tests__/SvgDrawingCanvas.click.test.tsx +108 -0
  27. package/src/components/pdf-annotation/PdfAnnotationCanvas.tsx +17 -4
  28. package/src/components/pdf-annotation/__tests__/PdfAnnotationCanvas.test.tsx +143 -7
  29. package/src/components/resource/AnnotateView.tsx +59 -38
  30. package/src/components/resource/BrowseView.tsx +172 -138
  31. package/src/components/resource/ResourceViewer.tsx +123 -130
  32. package/src/components/resource/__tests__/AnnotateView.embeddable.test.tsx +55 -0
  33. package/src/components/resource/__tests__/BrowseView.embeddable.test.tsx +49 -0
  34. package/src/components/resource/__tests__/BrowseView.links.test.tsx +60 -0
  35. package/src/components/resource/__tests__/BrowseView.overlay-async.test.tsx +113 -0
  36. package/src/components/resource/__tests__/BrowseView.reference-hover.test.tsx +161 -0
  37. package/src/components/resource/__tests__/BrowseView.registry.test.tsx +43 -0
  38. package/src/components/resource/__tests__/BrowseView.test.tsx +133 -53
  39. package/src/components/resource/__tests__/ResourceViewer.embeddable.test.tsx +102 -0
  40. package/src/components/resource/__tests__/ResourceViewer.mode-switch.test.tsx +12 -7
  41. package/src/components/resource/__tests__/ResourceViewer.toolbar-opt-out.test.tsx +135 -0
  42. package/src/components/resource/__tests__/ResourceViewer.toolbar-prefs.test.tsx +200 -0
  43. package/src/components/resource/__tests__/browse-renderers.dispatch.test.tsx +113 -0
  44. package/src/components/resource/__tests__/browse-renderers.test.tsx +34 -0
  45. package/src/components/resource/__tests__/inline-embedding.test.tsx +81 -0
  46. package/src/components/resource/__tests__/media-completeness.test.tsx +88 -0
  47. package/src/components/resource/browse-renderers.tsx +85 -0
  48. package/src/components/resource/panels/AssessmentEntry.tsx +5 -4
  49. package/src/components/resource/panels/AssessmentPanel.tsx +12 -5
  50. package/src/components/resource/panels/AssistSection.tsx +4 -3
  51. package/src/components/resource/panels/CommentEntry.tsx +5 -4
  52. package/src/components/resource/panels/CommentsPanel.tsx +12 -5
  53. package/src/components/resource/panels/HighlightEntry.tsx +5 -4
  54. package/src/components/resource/panels/HighlightPanel.tsx +12 -5
  55. package/src/components/resource/panels/ReferenceEntry.tsx +9 -10
  56. package/src/components/resource/panels/ReferencesPanel.tsx +15 -6
  57. package/src/components/resource/panels/ResourceInfoPanel.tsx +4 -3
  58. package/src/components/resource/panels/TagEntry.tsx +5 -3
  59. package/src/components/resource/panels/TaggingPanel.tsx +11 -4
  60. package/src/components/resource/panels/UnifiedAnnotationsPanel.tsx +15 -2
  61. package/src/components/resource/panels/__tests__/AssessmentEntry.test.tsx +28 -20
  62. package/src/components/resource/panels/__tests__/AssessmentPanel.test.tsx +39 -28
  63. package/src/components/resource/panels/__tests__/AssistSection.test.tsx +46 -17
  64. package/src/components/resource/panels/__tests__/CommentEntry.test.tsx +65 -57
  65. package/src/components/resource/panels/__tests__/CommentsPanel.test.tsx +54 -24
  66. package/src/components/resource/panels/__tests__/HighlightEntry.test.tsx +27 -17
  67. package/src/components/resource/panels/__tests__/HighlightPanel.annotationProgress.test.tsx +23 -17
  68. package/src/components/resource/panels/__tests__/ReferenceEntry.test.tsx +48 -77
  69. package/src/components/resource/panels/__tests__/ReferencesPanel.headless.test.tsx +87 -0
  70. package/src/components/resource/panels/__tests__/ReferencesPanel.observable-flow.test.tsx +15 -9
  71. package/src/components/resource/panels/__tests__/ReferencesPanel.test.tsx +78 -59
  72. package/src/components/resource/panels/__tests__/ResourceInfoPanel.test.tsx +11 -4
  73. package/src/components/resource/panels/__tests__/TagEntry.test.tsx +33 -19
  74. package/src/components/resource/panels/__tests__/TaggingPanel.test.tsx +16 -7
  75. package/src/components/toolbar/Toolbar.css +14 -0
  76. package/src/features/resource-viewer/__tests__/ResourceViewerPage.test.tsx +7 -17
  77. package/src/features/resource-viewer/components/ResourceViewerPage.tsx +43 -17
  78. package/src/features/resource-viewer/state/resource-viewer-page-state-unit.ts +2 -14
  79. package/src/styles/features/resource-viewer.css +19 -0
  80. package/dist/PdfAnnotationCanvas.client-P37SXBWQ.js.map +0 -1
  81. package/dist/chunk-O2MD7TGE.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -2,11 +2,11 @@ import * as _semiont_react_ui from '@semiont/react-ui';
2
2
  import { Annotation, ResourceId, Selector, components, ResourceDescriptor, ValidationResult, StateUnit, GatheredContext, EventMap, AnnotationId, AnchorStrategy, AnchorConfidence, StoredEventLike, ConnectionState, BackendDownload, ProgressEvent, AccessToken } from '@semiont/core';
3
3
  export { Annotation } from '@semiont/core';
4
4
  import * as React$1 from 'react';
5
- import React__default, { ComponentType, ReactNode, KeyboardEvent as KeyboardEvent$1, Component, ErrorInfo, Ref } from 'react';
5
+ import React__default, { ComponentType, ReactNode, KeyboardEvent as KeyboardEvent$1, Component, ErrorInfo, MouseEvent, Ref } from 'react';
6
6
  import * as _codemirror_state from '@codemirror/state';
7
7
  import { HighlightStyle } from '@codemirror/language';
8
8
  import { WidgetType } from '@codemirror/view';
9
- import { SemiontBrowser, SessionStorage, SessionFactory, SemiontSession, OpenResource, TagSchema, UploadProgress, SemiontClient, BeckonStateUnit, MarkStateUnit, GatherStateUnit, YieldStateUnit, ReferencedByEntry } from '@semiont/sdk';
9
+ import { SemiontClient, SemiontSession, SemiontBrowser, SessionStorage, SessionFactory, OpenResource, TagSchema, UploadProgress, BeckonStateUnit, MarkStateUnit, GatherStateUnit, YieldStateUnit, ReferencedByEntry } from '@semiont/sdk';
10
10
  export { BeckonStateUnit, GatherStateUnit, GenerateDocumentOptions, HOVER_DELAY_MS, HoverHandlers, MarkStateUnit, MatchStateUnit, PendingAnnotation, SearchPipeline, SearchPipelineOptions, SearchState, TagSchema, YieldStateUnit, createBeckonStateUnit, createGatherStateUnit, createHoverHandlers, createMarkStateUnit, createMatchStateUnit, createSearchPipeline, createYieldStateUnit } from '@semiont/sdk';
11
11
  import { Observable } from 'rxjs';
12
12
 
@@ -359,26 +359,38 @@ declare function hideWidgetPreview(container: HTMLElement): void;
359
359
  type SelectionMotivation = 'linking' | 'highlighting' | 'assessing' | 'commenting' | 'tagging';
360
360
  type ClickAction = 'detail' | 'follow' | 'jsonld' | 'deleting';
361
361
  type ShapeType = 'rectangle' | 'circle' | 'polygon';
362
+ /** The bar's composable controls, in fixed render order. */
363
+ type ToolbarPart = 'clickAction' | 'mode' | 'selection' | 'shape';
362
364
  interface AnnotateToolbarProps {
363
365
  selectedMotivation: SelectionMotivation | null;
364
366
  selectedClick: ClickAction;
365
- showSelectionGroup?: boolean;
366
367
  showDeleteButton?: boolean;
367
- showShapeGroup?: boolean;
368
368
  selectedShape?: ShapeType;
369
369
  mediaType?: string | null;
370
370
  annotateMode: boolean;
371
371
  annotators: Record<string, Annotator>;
372
+ /**
373
+ * Which controls to render (composition over CSS hiding). Default: all four.
374
+ * Order is fixed (click, mode, selection, shape); shape stays media-gated.
375
+ */
376
+ parts?: ToolbarPart[];
377
+ /**
378
+ * Purely presentational: each control reports the chosen value via its
379
+ * callback; the owner (viewer instance or host) applies it. The bar holds no
380
+ * pref state, emits no bus events, and touches no storage.
381
+ */
382
+ onModeChange?: (mode: boolean) => void;
383
+ onClickActionChange?: (action: ClickAction) => void;
384
+ onSelectionChange?: (motivation: SelectionMotivation | null) => void;
385
+ onShapeChange?: (shape: ShapeType) => void;
386
+ compact?: boolean;
372
387
  }
373
388
  /**
374
- * Toolbar for annotation controls with mode, selection, click, and shape options
375
- *
376
- * @emits mark:selection-changed - Selection motivation changed. Payload: { motivation: SelectionMotivation | null }
377
- * @emits mark:click-changed - Click action mode changed. Payload: { action: ClickAction }
378
- * @emits mark:shape-changed - Drawing shape changed. Payload: { shape: ShapeType }
379
- * @emits mark:mode-toggled - View mode toggled between browse and annotate. Payload: undefined
389
+ * Toolbar for annotation controls with mode, selection, click, and shape options.
390
+ * Purely presentational (TOOLBAR-PREFS-AS-PROPS): renders the given values for the
391
+ * given `parts` and reports choices via the on*Change callbacks no bus, no storage.
380
392
  */
381
- declare function AnnotateToolbar({ selectedMotivation, selectedClick, showSelectionGroup, showDeleteButton, showShapeGroup, selectedShape, mediaType, annotateMode, annotators }: AnnotateToolbarProps): React__default.JSX.Element;
393
+ declare function AnnotateToolbar({ selectedMotivation, selectedClick, showDeleteButton, selectedShape, mediaType, annotateMode, annotators, parts, onModeChange, onClickActionChange, onSelectionChange, onShapeChange, compact, }: AnnotateToolbarProps): React__default.JSX.Element;
382
394
 
383
395
  /**
384
396
  * Media Type Shape Support
@@ -392,10 +404,17 @@ declare function AnnotateToolbar({ selectedMotivation, selectedClick, showSelect
392
404
  */
393
405
  type SelectorType = 'fragment' | 'svg' | 'text';
394
406
  /**
395
- * Get supported annotation shapes for a given media type
407
+ * Get supported annotation shapes for a given media type.
408
+ *
409
+ * This set is the host-facing CONTRACT for "which shapes can this medium
410
+ * draw" — gate shape UI on it directly.
396
411
  *
397
- * PDF: Only rectangles (FragmentSelector with RFC 3778 viewrect)
398
- * Images: All shapes (SvgSelector supports rect, circle, polygon)
412
+ * PDF: only rectangles (FragmentSelector with RFC 3778 viewrect).
413
+ * Images: all shapes (SvgSelector supports rect, circle, polygon).
414
+ * Everything else — including text media and absent/unknown types — supports
415
+ * NONE: those anchor by character offsets (TextPositionSelector /
416
+ * TextQuoteSelector), and no selector can carry a shape. Mirrors
417
+ * `getSelectorType`'s 'text' fallback.
399
418
  *
400
419
  * @param mediaType - MIME type of the resource (e.g., 'application/pdf', 'image/png')
401
420
  * @returns Array of supported shape types for annotation
@@ -840,8 +859,16 @@ declare function useLocalStorage<T>(key: string, initialValue: T): [T, (value: T
840
859
  interface UseResourceContentResult {
841
860
  content: string;
842
861
  loading: boolean;
862
+ error: Error | null;
843
863
  }
844
- declare function useResourceContent(rUri: ResourceId, resource: ResourceDescriptor, enabled?: boolean): UseResourceContentResult;
864
+ /**
865
+ * Fetch + decode a resource's primary representation from a bare client — the
866
+ * content sibling of `useResourceLoader`/`useMediaToken` (bring-your-own-client;
867
+ * `null` → idle). Headless: errors are RETURNED, never toasted — the host
868
+ * decides chrome (the Browser page toasts; an embedded host may render inline
869
+ * or ignore). `enabled=false` fetches nothing (the binary/media-token path).
870
+ */
871
+ declare function useResourceContent(client: SemiontClient | null, rUri: ResourceId, resource: ResourceDescriptor, enabled?: boolean): UseResourceContentResult;
845
872
 
846
873
  interface ResourceGatherOptions {
847
874
  depth?: number;
@@ -865,6 +892,104 @@ interface UseResourceGatherResult {
865
892
  */
866
893
  declare function useResourceGather(): UseResourceGatherResult;
867
894
 
895
+ interface UseResourceLoaderResult {
896
+ resource: ResourceDescriptor | undefined;
897
+ annotations: AnnotationsCollection;
898
+ loading: boolean;
899
+ error: Error | null;
900
+ }
901
+ /**
902
+ * Load a resource + its annotations from a bare client — no page, no composite
903
+ * state unit, no providers. The lightweight alternative to `ResourceViewerPage`
904
+ * for a bring-your-own-session host; feed the result straight into `<ResourceViewer>`.
905
+ *
906
+ * `loading` is true until BOTH the resource and its annotation list have first
907
+ * emitted; `annotations` is bucketed via the shared `groupAnnotations`. A null
908
+ * client subscribes to nothing (stays loading) and re-subscribes when one arrives.
909
+ */
910
+ declare function useResourceLoader(client: SemiontClient | null, resourceId: ResourceId): UseResourceLoaderResult;
911
+
912
+ interface UseMediaTokenResult {
913
+ token: string | undefined;
914
+ loading: boolean;
915
+ }
916
+ /**
917
+ * Mint (and periodically refresh) a short-lived authed media token for a
918
+ * resource — the query param that makes `<img>` / PDF URLs load. Takes the
919
+ * client explicitly (not `useSemiont()`), so a bring-your-own-session host can
920
+ * use it with a bare session; the batteries-included page passes `session.client`.
921
+ */
922
+ declare function useMediaToken(client: SemiontClient | null, id: ResourceId): UseMediaTokenResult;
923
+
924
+ /**
925
+ * Subscribe to session-scoped bus events on an explicit `SemiontSession` — the
926
+ * provider-free counterpart to `useEventSubscriptions`. The embeddable viewer
927
+ * path takes its session as a prop (bring-your-own-session), so it can't reach
928
+ * the app-scoped `SemiontBrowser` bus; every channel it needs (`mark:*`,
929
+ * `browse:click`) is session-scoped anyway and reaches it via `session.subscribe`.
930
+ *
931
+ * Same stable-handler / stable-key semantics as `useEventSubscriptions`:
932
+ * handlers may change every render without re-subscribing; re-subscription
933
+ * happens only when the set of channel names or the session changes. A null
934
+ * session subscribes to nothing, and cleanly re-subscribes when one arrives.
935
+ */
936
+ declare function useSessionEventSubscriptions(session: SemiontSession | null, subscriptions: {
937
+ [K in keyof EventMap]?: (payload: EventMap[K]) => void;
938
+ }): void;
939
+
940
+ interface ToolbarPrefs {
941
+ annotateMode: boolean;
942
+ setAnnotateMode: (mode: boolean) => void;
943
+ clickAction: ClickAction;
944
+ setClickAction: (action: ClickAction) => void;
945
+ selectionMotivation: SelectionMotivation | null;
946
+ setSelectionMotivation: (motivation: SelectionMotivation | null) => void;
947
+ shape: ShapeType;
948
+ setShape: (shape: ShapeType) => void;
949
+ }
950
+ /**
951
+ * The POLICY layer for toolbar preferences (TOOLBAR-PREFS-AS-PROPS): one shared,
952
+ * localStorage-persisted prefs state — the Semiont Browser's global-toolbar UX,
953
+ * relocated from inside the components to a visible page-layer hook. Feed the
954
+ * returned values/setters to every viewer you compose (as its controlled props)
955
+ * and they stay in lockstep and survive remounts. The components themselves hold
956
+ * no persistence and no cross-instance sync; this hook is the one legitimate home
957
+ * for both. Keys are the historical ones, so existing users' prefs carry over.
958
+ *
959
+ * `selectorType` scopes the SHAPE pref exactly as before: per selector type
960
+ * (persisted only for 'svg'; 'fragment' is always rectangle).
961
+ */
962
+ declare function useToolbarPrefs(selectorType?: SelectorType): ToolbarPrefs;
963
+
964
+ /**
965
+ * A claimed `mark:requested` — the typed event payload (selector + motivation +
966
+ * source), re-exported rather than a parallel shape.
967
+ */
968
+ type PendingCreation = EventMap['mark:requested'];
969
+ /**
970
+ * The consuming half of the viewer's capture/policy split (HEADLESS-CREATION-SEAM).
971
+ *
972
+ * The viewer captures gestures and emits source-scoped `mark:requested`; this
973
+ * hook claims them for ONE viewer: an event is claimed iff
974
+ * `enabled && event.source === resourceId` — N mounted hooks on one session each
975
+ * claim only their own (the multi-mount contract MARK-REQUESTED-RESOURCE-SCOPE
976
+ * created). A new request for the same resource REPLACES an unresolved pending
977
+ * (the user reselected; the stale pending is abandoned).
978
+ *
979
+ * Headless by contract: no creation call, no UI, no toast in here — resolution
980
+ * (chooser flows, body forms, `mark.annotation`) is host policy. Session-first
981
+ * like every subscribing primitive (`session.subscribe` is the sanctioned
982
+ * generic-channel path); `null` → inert.
983
+ *
984
+ * @param session Session whose bus carries this viewer's events; null → inert.
985
+ * @param resourceId Claim only events whose `source` is this resource.
986
+ * @param enabled The host's annotate-mode gate — browse-mode viewers never claim.
987
+ */
988
+ declare function usePendingCreation(session: SemiontSession | null, resourceId: ResourceId, enabled: boolean): {
989
+ pending: PendingCreation | null;
990
+ clearPending: () => void;
991
+ };
992
+
868
993
  interface SemiontProviderProps {
869
994
  /** Inject a fully-constructed browser (tests, embedded hosts that build their own). Omit to use the default. */
870
995
  browser?: SemiontBrowser;
@@ -1305,10 +1430,23 @@ interface ResourceTagsInlineProps {
1305
1430
  resourceId: string;
1306
1431
  tags: string[];
1307
1432
  isEditing: boolean;
1433
+ /**
1434
+ * Commit: called ONCE per edit with the FULL new tag set (the host diffs —
1435
+ * its SDK call takes `(current, updated)`). Awaited; the editor renders
1436
+ * inert while the returned promise is pending.
1437
+ */
1308
1438
  onUpdate: (tags: string[]) => Promise<void>;
1309
1439
  disabled?: boolean;
1440
+ /**
1441
+ * The KB's registered entity types — the CONTROLLED VOCABULARY, host-supplied
1442
+ * (the component is session-less; hosts fetch via `browse.entityTypes()`).
1443
+ * Adds are a picker constrained to it: no free-text minting. Without it the
1444
+ * editor is REMOVAL-ONLY (it cannot offer valid candidates). Removal is never
1445
+ * vocabulary-gated — stale/unregistered tags must stay removable.
1446
+ */
1447
+ vocabulary?: string[];
1310
1448
  }
1311
- declare function ResourceTagsInline({ tags }: ResourceTagsInlineProps): React$1.JSX.Element | null;
1449
+ declare function ResourceTagsInline({ tags, isEditing, onUpdate, disabled, vocabulary, }: ResourceTagsInlineProps): React$1.JSX.Element | null;
1312
1450
 
1313
1451
  type ToastType = 'success' | 'error' | 'info' | 'warning';
1314
1452
  interface ToastMessage {
@@ -1418,6 +1556,8 @@ declare function AnnotationOverlay({ annotations, imageWidth, imageHeight, displ
1418
1556
  type DrawingMode = 'rectangle' | 'polygon' | 'circle' | 'freeform' | null;
1419
1557
  interface SvgDrawingCanvasProps {
1420
1558
  imageUrl: string;
1559
+ /** The '@id' of the annotated resource — stamped as `source` on mark:requested (multi-viewer routing). */
1560
+ resourceUri: string;
1421
1561
  existingAnnotations?: Annotation[];
1422
1562
  drawingMode: DrawingMode;
1423
1563
  selectedMotivation?: SelectionMotivation | null;
@@ -1432,7 +1572,7 @@ interface SvgDrawingCanvasProps {
1432
1572
  * @emits browse:click - Annotation clicked on canvas. Payload: { annotationId: string, motivation: Motivation }
1433
1573
  * @emits mark:requested - New annotation drawn on canvas. Payload: { selector: SvgSelector, motivation: SelectionMotivation }
1434
1574
  */
1435
- declare function SvgDrawingCanvas({ imageUrl, existingAnnotations, drawingMode, selectedMotivation, session, hoveredAnnotationId, selectedAnnotationId }: SvgDrawingCanvasProps): React__default.JSX.Element;
1575
+ declare function SvgDrawingCanvas({ imageUrl, resourceUri, existingAnnotations, drawingMode, selectedMotivation, session, hoveredAnnotationId, selectedAnnotationId }: SvgDrawingCanvasProps): React__default.JSX.Element;
1436
1576
 
1437
1577
  interface KeyboardShortcutsHelpModalProps {
1438
1578
  isOpen: boolean;
@@ -1467,7 +1607,8 @@ declare function SessionExpiredModal(): React$1.JSX.Element;
1467
1607
  interface Props$8 {
1468
1608
  content: string;
1469
1609
  mimeType?: string;
1470
- resourceUri?: string;
1610
+ /** The '@id' of the shown resource — stamped as `source` on mark:requested (multi-viewer routing). */
1611
+ resourceUri: string;
1471
1612
  annotations: AnnotationsCollection;
1472
1613
  uiState: AnnotationUIState;
1473
1614
  onUIStateChange?: (state: Partial<AnnotationUIState>) => void;
@@ -1478,17 +1619,22 @@ interface Props$8 {
1478
1619
  showLineNumbers?: boolean;
1479
1620
  hoverDelayMs?: number;
1480
1621
  annotateMode: boolean;
1622
+ /** Session for the shown resource — its client emits mark:* / mark.request; its bus feeds toolbar + beckon events. */
1623
+ session: SemiontSession | null;
1624
+ /** Recently-created annotation ids to sparkle (host-provided; was ResourceAnnotationsContext). */
1625
+ newAnnotationIds?: Set<string>;
1626
+ /** The bar's Mode control reports the chosen mode here (the owner applies it). */
1627
+ onModeChange?: (mode: boolean) => void;
1628
+ /** Render the built-in bar (default). false → no bar; selection capture and drawing stay live. */
1629
+ showToolbar?: boolean;
1481
1630
  }
1482
1631
  /**
1483
1632
  * View component for annotating resources with text selection and drawing
1484
1633
  *
1485
1634
  * @emits mark:requested - User requested to create annotation. Payload: { selector: Selector | Selector[], motivation: SelectionMotivation }
1486
- * @subscribes mark:selection-changed - Toolbar selection changed. Payload: { motivation: string | null }
1487
- * @subscribes mark:click-changed - Toolbar click action changed. Payload: { action: string }
1488
- * @subscribes mark:shape-changed - Toolbar shape changed. Payload: { shape: string }
1489
1635
  * @subscribes beckon:hover - Annotation hovered. Payload: { annotationId: string | null }
1490
1636
  */
1491
- declare function AnnotateView({ content, mimeType, resourceUri, annotations, uiState, onUIStateChange, enableWidgets, getTargetResourceName, generatingReferenceId, showLineNumbers, hoverDelayMs, annotateMode }: Props$8): React$1.JSX.Element;
1637
+ declare function AnnotateView({ content, mimeType, resourceUri, annotations, uiState, onUIStateChange, enableWidgets, getTargetResourceName, generatingReferenceId, showLineNumbers, hoverDelayMs, annotateMode, session, newAnnotationIds, onModeChange, showToolbar, }: Props$8): React$1.JSX.Element;
1492
1638
 
1493
1639
  interface Props$7 {
1494
1640
  rUri: ResourceId;
@@ -1500,6 +1646,36 @@ interface Props$7 {
1500
1646
  }
1501
1647
  declare function AnnotationHistory({ rUri, hoveredAnnotationId, onEventHover, onEventClick, Link, routes }: Props$7): React__default.JSX.Element | null;
1502
1648
 
1649
+ /**
1650
+ * Common props for a read-only ("browse") media renderer. `content` is decoded
1651
+ * text for the text renderer, or a media URL for the image / PDF renderers.
1652
+ * A consumer can implement this interface to swap in a custom renderer.
1653
+ */
1654
+ interface MediaRendererProps {
1655
+ content: string;
1656
+ mimeType: string;
1657
+ resourceUri: string;
1658
+ annotations: Annotation[];
1659
+ /**
1660
+ * Session for interaction routing inside annotation-bearing renderers — the
1661
+ * canvases emit clicks/hover via `session.client.browse/beckon`. Absent/null
1662
+ * → the annotations still PAINT, but are inert (paint-only). Threaded by
1663
+ * BrowseView's dispatch; custom renderers may ignore it.
1664
+ */
1665
+ session?: SemiontSession | null;
1666
+ }
1667
+ /** Read-only media dispatch, keyed by the registry render mode. */
1668
+ type BrowseMediaRenderers = Partial<Record<string, ComponentType<MediaRendererProps>>>;
1669
+ declare function TextBrowseRenderer({ content }: MediaRendererProps): React$1.JSX.Element;
1670
+ declare function ImageBrowseRenderer({ content, resourceUri, annotations, session }: MediaRendererProps): React$1.JSX.Element;
1671
+ declare function PdfBrowseRenderer({ content, resourceUri, annotations, session }: MediaRendererProps): React$1.JSX.Element;
1672
+ /**
1673
+ * Default read-only media renderers. `BrowseView` merges a caller's `renderers`
1674
+ * override on top of these, so a host can swap one renderer (e.g. its own PDF
1675
+ * viewer) or add a mode without forking the view.
1676
+ */
1677
+ declare const defaultBrowseRenderers: Record<'text' | 'image' | 'pdf', ComponentType<MediaRendererProps>>;
1678
+
1503
1679
  interface Props$6 {
1504
1680
  content: string;
1505
1681
  mimeType: string;
@@ -1509,6 +1685,36 @@ interface Props$6 {
1509
1685
  selectedClick?: ClickAction;
1510
1686
  annotateMode: boolean;
1511
1687
  hoverDelayMs?: number;
1688
+ /** Session for the shown resource — emits browse:click / beckon:hover; its bus feeds beckon events. */
1689
+ session: SemiontSession | null;
1690
+ /** Recently-created annotation ids to sparkle (host-provided; was ResourceAnnotationsContext). */
1691
+ newAnnotationIds?: Set<string>;
1692
+ /** Override the read-only media renderers (render mode → renderer); merged over the defaults. */
1693
+ renderers?: BrowseMediaRenderers;
1694
+ /** A content link (`<a href>` in the rendered content) was clicked. The viewer preventDefaults and
1695
+ * delegates; it never navigates on its own. Omit → the click is still blocked (nothing happens). */
1696
+ onLinkClick?: (link: {
1697
+ href: string;
1698
+ event: MouseEvent;
1699
+ }) => void;
1700
+ /** A RESOLVED reference span is hovered: fires after the dwell AND the referent's cached descriptor
1701
+ * resolves; `null` on leave (only if a hover fired — stubs stay silent). Host renders its own preview. */
1702
+ onReferenceHover?: (hover: ReferenceHover | null) => void;
1703
+ /** Inline display variant: auto-height to content, no inner scroll container, no pane chrome —
1704
+ * drops into a chat bubble / card / list item. Default: fill-the-pane (unchanged). */
1705
+ inline?: boolean;
1706
+ /** The bar's Mode control reports the chosen mode here (the owner applies it). */
1707
+ onModeChange?: (mode: boolean) => void;
1708
+ /** The bar's Click control reports the chosen action here (the owner applies it). */
1709
+ onClickActionChange?: (action: ClickAction) => void;
1710
+ /** Render the built-in bar (default). false → no bar; all other seams stay live. */
1711
+ showToolbar?: boolean;
1712
+ }
1713
+ /** Payload for `onReferenceHover` — the hovered linking annotation, its resolved referent, and where the span is. */
1714
+ interface ReferenceHover {
1715
+ annotation: Annotation;
1716
+ referent: ResourceDescriptor;
1717
+ anchorRect: DOMRect;
1512
1718
  }
1513
1719
  /**
1514
1720
  * View component for browsing annotated resources in read-only mode.
@@ -1523,7 +1729,7 @@ interface Props$6 {
1523
1729
  * @subscribes beckon:hover - Highlight annotation on hover. Payload: { annotationId: string | null }
1524
1730
  * @subscribes beckon:focus - Scroll to and highlight annotation. Payload: { annotationId: string }
1525
1731
  */
1526
- declare const BrowseView: React$1.MemoExoticComponent<({ content, mimeType, resourceUri, annotations, selectedClick, annotateMode, hoverDelayMs }: Props$6) => React$1.JSX.Element>;
1732
+ declare const BrowseView: React$1.MemoExoticComponent<({ content, mimeType, resourceUri, annotations, selectedClick, onModeChange, onClickActionChange, showToolbar, annotateMode, hoverDelayMs, session, newAnnotationIds, renderers, onLinkClick, onReferenceHover, inline, }: Props$6) => React$1.JSX.Element>;
1527
1733
 
1528
1734
  type TranslateFn$4 = (key: string, params?: Record<string, string | number>) => string;
1529
1735
  interface Props$5 {
@@ -1548,9 +1754,11 @@ declare function HistoryEvent({ event, annotations, allEvents, isRelated, t, Lin
1548
1754
  * - Automatically invalidates cache when annotations change
1549
1755
  * - No manual refetch needed - events handle cache invalidation
1550
1756
  *
1551
- * Requirements:
1552
- * - Must be wrapped in SemiontProvider (which owns the session's event bus)
1553
- * - Must be wrapped in CacheContext (provides cache manager)
1757
+ * Bring-your-own-session: the `session` (SemiontSession) and the host's
1758
+ * navigation / panel callbacks come in as props no SemiontProvider required.
1759
+ * Every event it subscribes to is session-scoped (mark:*, browse:click) and
1760
+ * reaches it via `session.subscribe`. Translations fall back to built-in English
1761
+ * when no TranslationProvider is mounted; caching flows through `session.client.browse.*`.
1554
1762
  *
1555
1763
  * Event flow:
1556
1764
  * make-meaning → EventLog → SSE → EventBus → ResourceViewer → Cache invalidation
@@ -1563,33 +1771,72 @@ interface Props$4 {
1563
1771
  content: string;
1564
1772
  };
1565
1773
  annotations: AnnotationsCollection;
1774
+ /** Session for the shown resource — its client mutates/invalidates, its bus feeds annotation events. */
1775
+ session: SemiontSession | null;
1776
+ /** Host-owned navigation: a resolved reference was followed. Omit for a view with no follow behavior. */
1777
+ onOpenResource?: (resourceId: string) => void;
1778
+ /** Host-owned panel control (annotation clicks open a panel). Omit for hosts without side panels. */
1779
+ onOpenPanel?: (event: EventMap['panel:open']) => void;
1780
+ /** A content link in the rendered content was clicked — the viewer preventDefaults and delegates; it never navigates on its own. */
1781
+ onLinkClick?: (link: {
1782
+ href: string;
1783
+ event: React__default.MouseEvent;
1784
+ }) => void;
1785
+ /** A resolved reference span is hovered (after dwell + referent descriptor resolve); `null` on leave. Host renders its own preview. */
1786
+ onReferenceHover?: (hover: ReferenceHover | null) => void;
1787
+ /** Inline display variant: auto-height, no inner scroll, no pane chrome (browse path). Default: fill-the-pane. */
1788
+ inline?: boolean;
1789
+ /** Recently-created annotation ids to sparkle (threaded to the browse/annotate subtree). */
1790
+ newAnnotationIds?: Set<string>;
1566
1791
  generatingReferenceId?: string | null;
1567
1792
  showLineNumbers?: boolean;
1568
1793
  hoverDelayMs?: number;
1569
1794
  hoveredAnnotationId?: string | null;
1795
+ /**
1796
+ * Toolbar preferences as controlled props (TOOLBAR-PREFS-AS-PROPS). Supply a value
1797
+ * to own that pref: the instance renders it and reports intents via the callback —
1798
+ * it never self-mutates, never persists, never listens to other instances. Omit for
1799
+ * a plain uncontrolled default (false / 'detail' / 'linking' / 'rectangle').
1800
+ * Hosts wanting the shared+persisted Browser UX compose `useToolbarPrefs()`.
1801
+ */
1802
+ annotateMode?: boolean;
1803
+ onAnnotateModeChange?: (mode: boolean) => void;
1804
+ clickAction?: ClickAction;
1805
+ onClickActionChange?: (action: ClickAction) => void;
1806
+ selectionMotivation?: SelectionMotivation | null;
1807
+ onSelectionMotivationChange?: (motivation: SelectionMotivation | null) => void;
1808
+ shape?: ShapeType;
1809
+ onShapeChange?: (shape: ShapeType) => void;
1810
+ /**
1811
+ * Render the built-in AnnotateToolbar (default true — today's behavior,
1812
+ * byte-identical). `false` → no bar at any internal site (browse + every
1813
+ * annotate render mode), while every seam stays live: annotate-mode selection
1814
+ * capture, image/pdf drawing, `mark.request` emission, and the controlled
1815
+ * props. Tier-2 hosts compose their own controls from the controlled props;
1816
+ * this makes that opt-out a contract instead of a CSS override.
1817
+ */
1818
+ showToolbar?: boolean;
1570
1819
  }
1571
1820
  /**
1572
1821
  * @emits mark:delete - User requested to delete annotation. Payload: { annotationId: string }
1573
1822
  * @emits panel:open - Request to open panel with annotation. Payload: { panel: string, scrollToAnnotationId?: string, motivation?: Motivation }
1574
1823
  *
1575
- * @subscribes mark:mode-toggled - Toggles between browse and annotate mode. Payload: { mode: 'browse' | 'annotate' }
1576
1824
  * @subscribes mark:added - New annotation was added. Payload: { annotation: Annotation }
1577
1825
  * @subscribes mark:removed - Annotation was removed. Payload: { annotationId: string }
1578
1826
  * @subscribes mark:body-updated - Annotation was updated. Payload: { annotation: Annotation }
1579
- * @subscribes mark:selection-changed - Text selection tool changed. Payload: { selection: boolean }
1580
- * @subscribes mark:click-changed - Click annotation tool changed. Payload: { click: 'detail' | 'scroll' | null }
1581
- * @subscribes mark:shape-changed - Drawing shape changed. Payload: { shape: string }
1582
1827
  * @subscribes browse:click - User clicked on annotation. Payload: { annotationId: string }
1583
1828
  */
1584
- declare function ResourceViewer({ resource, annotations, generatingReferenceId, showLineNumbers, hoverDelayMs, hoveredAnnotationId: hoveredAnnotationIdProp }: Props$4): React__default.JSX.Element;
1829
+ declare function ResourceViewer({ resource, annotations, session, onOpenResource, onOpenPanel, onLinkClick, onReferenceHover, inline, newAnnotationIds, generatingReferenceId, showLineNumbers, hoverDelayMs, hoveredAnnotationId: hoveredAnnotationIdProp, annotateMode: annotateModeProp, onAnnotateModeChange, clickAction: clickActionProp, onClickActionChange, selectionMotivation: selectionMotivationProp, onSelectionMotivationChange, shape: shapeProp, onShapeChange, showToolbar, }: Props$4): React__default.JSX.Element;
1585
1830
 
1586
1831
  interface AssessmentEntryProps {
1832
+ /** Session for interaction routing (browse.click etc.); the panel threads it. */
1833
+ session: SemiontSession | null;
1587
1834
  assessment: Annotation;
1588
1835
  isFocused: boolean;
1589
1836
  isHovered?: boolean;
1590
1837
  ref?: Ref<HTMLDivElement>;
1591
1838
  }
1592
- declare function AssessmentEntry({ assessment, isFocused, isHovered, ref, }: AssessmentEntryProps): React$1.JSX.Element;
1839
+ declare function AssessmentEntry({ session, assessment, isFocused, isHovered, ref, }: AssessmentEntryProps): React$1.JSX.Element;
1593
1840
 
1594
1841
  type Motivation$5 = components['schemas']['Motivation'];
1595
1842
  type JobProgress$6 = components['schemas']['JobProgress'];
@@ -1598,6 +1845,10 @@ interface PendingAnnotation$5 {
1598
1845
  motivation: Motivation$5;
1599
1846
  }
1600
1847
  interface AssessmentPanelProps {
1848
+ /** Session carrying the client and event bus; null renders inert. */
1849
+ session: SemiontSession | null;
1850
+ /** The '@id' of the panel's resource — stamped as `source` on mark:submit (multi-viewer routing). */
1851
+ resourceId: string;
1601
1852
  annotations: Annotation[];
1602
1853
  pendingAnnotation: PendingAnnotation$5 | null;
1603
1854
  isAssisting?: boolean;
@@ -1617,7 +1868,7 @@ interface AssessmentPanelProps {
1617
1868
  * @emits mark:cancel-pending - Cancel pending assessment annotation. Payload: undefined
1618
1869
  * @subscribes browse:click - Annotation clicked. Payload: { annotationId: string }
1619
1870
  */
1620
- declare function AssessmentPanel({ annotations, pendingAnnotation, isAssisting, progress, locale, sourceLanguage, annotateMode, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, }: AssessmentPanelProps): React$1.JSX.Element;
1871
+ declare function AssessmentPanel({ session, resourceId, annotations, pendingAnnotation, isAssisting, progress, locale, sourceLanguage, annotateMode, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, }: AssessmentPanelProps): React$1.JSX.Element;
1621
1872
 
1622
1873
  interface Props$3 {
1623
1874
  /**
@@ -1645,13 +1896,15 @@ interface Props$3 {
1645
1896
  declare function CollaborationPanel({ state, eventCount, lastEventTimestamp, knowledgeBaseName }: Props$3): React$1.JSX.Element;
1646
1897
 
1647
1898
  interface CommentEntryProps {
1899
+ /** Session for interaction routing (browse.click etc.); the panel threads it. */
1900
+ session: SemiontSession | null;
1648
1901
  comment: Annotation;
1649
1902
  isFocused: boolean;
1650
1903
  isHovered?: boolean;
1651
1904
  annotateMode?: boolean;
1652
1905
  ref?: Ref<HTMLDivElement>;
1653
1906
  }
1654
- declare function CommentEntry({ comment, isFocused, isHovered, annotateMode, ref, }: CommentEntryProps): React$1.JSX.Element;
1907
+ declare function CommentEntry({ session, comment, isFocused, isHovered, annotateMode, ref, }: CommentEntryProps): React$1.JSX.Element;
1655
1908
 
1656
1909
  type Motivation$4 = components['schemas']['Motivation'];
1657
1910
  type JobProgress$5 = components['schemas']['JobProgress'];
@@ -1660,6 +1913,10 @@ interface PendingAnnotation$4 {
1660
1913
  motivation: Motivation$4;
1661
1914
  }
1662
1915
  interface CommentsPanelProps {
1916
+ /** Session carrying the client and event bus; null renders inert. */
1917
+ session: SemiontSession | null;
1918
+ /** The '@id' of the panel's resource — stamped as `source` on mark:submit (multi-viewer routing). */
1919
+ resourceId: string;
1663
1920
  annotations: Annotation[];
1664
1921
  pendingAnnotation: PendingAnnotation$4 | null;
1665
1922
  annotateMode?: boolean;
@@ -1679,10 +1936,12 @@ interface CommentsPanelProps {
1679
1936
  * @emits mark:cancel-pending - Cancel pending comment annotation. Payload: undefined
1680
1937
  * @subscribes browse:click - Annotation clicked. Payload: { annotationId: string }
1681
1938
  */
1682
- declare function CommentsPanel({ annotations, pendingAnnotation, annotateMode, isAssisting, progress, locale, sourceLanguage, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, }: CommentsPanelProps): React$1.JSX.Element;
1939
+ declare function CommentsPanel({ session, resourceId, annotations, pendingAnnotation, annotateMode, isAssisting, progress, locale, sourceLanguage, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, }: CommentsPanelProps): React$1.JSX.Element;
1683
1940
 
1684
1941
  type JobProgress$4 = components['schemas']['JobProgress'];
1685
1942
  interface AssistSectionProps {
1943
+ /** Session carrying the client and event bus; null renders inert. */
1944
+ session: SemiontSession | null;
1686
1945
  annotationType: 'highlight' | 'assessment' | 'comment';
1687
1946
  isAssisting: boolean;
1688
1947
  /** User UI locale — written into the annotation body's `language` field for comment/assessment. */
@@ -1703,15 +1962,17 @@ interface AssistSectionProps {
1703
1962
  * @emits mark:assist-request - Start assist for annotation type. Payload: { motivation: Motivation, options: { instructions?: string, tone?: string, density?: number } }
1704
1963
  * @emits mark:progress-dismiss - Dismiss the annotation progress display
1705
1964
  */
1706
- declare function AssistSection({ annotationType, isAssisting, locale, sourceLanguage, progress, }: AssistSectionProps): React$1.JSX.Element;
1965
+ declare function AssistSection({ session, annotationType, isAssisting, locale, sourceLanguage, progress, }: AssistSectionProps): React$1.JSX.Element;
1707
1966
 
1708
1967
  interface HighlightEntryProps {
1968
+ /** Session for interaction routing (browse.click etc.); the panel threads it. */
1969
+ session: SemiontSession | null;
1709
1970
  highlight: Annotation;
1710
1971
  isFocused: boolean;
1711
1972
  isHovered?: boolean;
1712
1973
  ref?: Ref<HTMLDivElement>;
1713
1974
  }
1714
- declare function HighlightEntry({ highlight, isFocused, isHovered, ref, }: HighlightEntryProps): React$1.JSX.Element;
1975
+ declare function HighlightEntry({ session, highlight, isFocused, isHovered, ref, }: HighlightEntryProps): React$1.JSX.Element;
1715
1976
 
1716
1977
  type Motivation$3 = components['schemas']['Motivation'];
1717
1978
  type JobProgress$3 = components['schemas']['JobProgress'];
@@ -1720,6 +1981,10 @@ interface PendingAnnotation$3 {
1720
1981
  motivation: Motivation$3;
1721
1982
  }
1722
1983
  interface HighlightPanelProps {
1984
+ /** Session carrying the client and event bus; null renders inert. */
1985
+ session: SemiontSession | null;
1986
+ /** The '@id' of the panel's resource — stamped as `source` on mark:submit (multi-viewer routing). */
1987
+ resourceId: string;
1723
1988
  annotations: Annotation[];
1724
1989
  pendingAnnotation: PendingAnnotation$3 | null;
1725
1990
  isAssisting?: boolean;
@@ -1737,7 +2002,7 @@ interface HighlightPanelProps {
1737
2002
  * @emits mark:create - Create new highlight annotation (auto-triggered). Payload: { motivation: 'highlighting', selector: Selector | Selector[], body: Body[] }
1738
2003
  * @subscribes browse:click - Annotation clicked. Payload: { annotationId: string }
1739
2004
  */
1740
- declare function HighlightPanel({ annotations, pendingAnnotation, isAssisting, progress, annotateMode, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, sourceLanguage, }: HighlightPanelProps): React$1.JSX.Element;
2005
+ declare function HighlightPanel({ session, resourceId, annotations, pendingAnnotation, isAssisting, progress, annotateMode, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, sourceLanguage, }: HighlightPanelProps): React$1.JSX.Element;
1741
2006
 
1742
2007
  interface Props$2 {
1743
2008
  resourceId: ResourceId;
@@ -1765,15 +2030,18 @@ interface PanelHeaderProps {
1765
2030
  declare function PanelHeader({ count, title }: PanelHeaderProps): React$1.JSX.Element;
1766
2031
 
1767
2032
  interface ReferenceEntryProps {
2033
+ /** Session for interaction routing (browse.click etc.); the panel threads it. */
2034
+ session: SemiontSession | null;
1768
2035
  reference: Annotation;
1769
2036
  isFocused: boolean;
1770
2037
  isHovered?: boolean;
1771
- routes: RouteBuilder;
2038
+ /** Host-owned navigation: called with the resolved resource id when the entry's link opens. */
2039
+ onOpenResource?: (resourceId: string) => void;
1772
2040
  annotateMode?: boolean;
1773
2041
  isGenerating?: boolean;
1774
2042
  ref?: Ref<HTMLDivElement>;
1775
2043
  }
1776
- declare function ReferenceEntry({ reference, isFocused, isHovered, routes, annotateMode, isGenerating, ref, }: ReferenceEntryProps): React$1.JSX.Element;
2044
+ declare function ReferenceEntry({ session, reference, isFocused, isHovered, onOpenResource, annotateMode, isGenerating, ref, }: ReferenceEntryProps): React$1.JSX.Element;
1777
2045
 
1778
2046
  type JobProgress$2 = components['schemas']['JobProgress'];
1779
2047
 
@@ -1784,6 +2052,12 @@ interface PendingAnnotation$2 {
1784
2052
  motivation: Motivation$2;
1785
2053
  }
1786
2054
  interface Props$1 {
2055
+ /** Session carrying the client and event bus; null renders inert. */
2056
+ session: SemiontSession | null;
2057
+ /** Host-owned navigation: called with the resolved resource id when a reference entry opens. */
2058
+ onOpenResource?: (resourceId: string) => void;
2059
+ /** The '@id' of the panel's resource — stamped as `source` on mark:submit (multi-viewer routing). */
2060
+ resourceId: string;
1787
2061
  annotations?: Annotation[];
1788
2062
  isAssisting: boolean;
1789
2063
  progress: JobProgress$2 | null;
@@ -1811,10 +2085,12 @@ interface Props$1 {
1811
2085
  * @emits mark:cancel-pending - Cancel pending reference annotation. Payload: undefined
1812
2086
  * @subscribes browse:click - Annotation clicked. Payload: { annotationId: string }
1813
2087
  */
1814
- declare function ReferencesPanel({ annotations, isAssisting, progress, annotateMode, Link, routes, allEntityTypes, generatingReferenceId, referencedBy, referencedByLoading, pendingAnnotation, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, locale, sourceLanguage, }: Props$1): React__default.JSX.Element;
2088
+ declare function ReferencesPanel({ session, onOpenResource, resourceId, annotations, isAssisting, progress, annotateMode, Link, routes, allEntityTypes, generatingReferenceId, referencedBy, referencedByLoading, pendingAnnotation, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, locale, sourceLanguage, }: Props$1): React__default.JSX.Element;
1815
2089
 
1816
2090
  type Agent = components['schemas']['Agent'];
1817
2091
  interface Props {
2092
+ /** Session carrying the client and event bus; null renders inert. */
2093
+ session: SemiontSession | null;
1818
2094
  resourceId: string;
1819
2095
  documentEntityTypes: string[];
1820
2096
  documentLocale?: string | undefined;
@@ -1841,7 +2117,7 @@ interface Props {
1841
2117
  * @emits mark:unarchive - Unarchive this resource
1842
2118
  * @emits mark:archive - Archive this resource
1843
2119
  */
1844
- declare function ResourceInfoPanel({ resourceId, documentEntityTypes, documentLocale, primaryMediaType, primaryByteSize, storageUri, isArchived, dateCreated, dateModified, wasAttributedTo, wasDerivedFrom, generator, onGenerate, }: Props): React$1.JSX.Element;
2120
+ declare function ResourceInfoPanel({ session, resourceId, documentEntityTypes, documentLocale, primaryMediaType, primaryByteSize, storageUri, isArchived, dateCreated, dateModified, wasAttributedTo, wasDerivedFrom, generator, onGenerate, }: Props): React$1.JSX.Element;
1845
2121
 
1846
2122
  interface StatisticsPanelProps {
1847
2123
  highlights: Annotation[];
@@ -1853,12 +2129,14 @@ interface StatisticsPanelProps {
1853
2129
  declare function StatisticsPanel({ highlights, comments, assessments, references, tags }: StatisticsPanelProps): React$1.JSX.Element;
1854
2130
 
1855
2131
  interface TagEntryProps {
2132
+ /** Session for interaction routing (browse.click, tag schemas); the panel threads it. */
2133
+ session: SemiontSession | null;
1856
2134
  tag: Annotation;
1857
2135
  isFocused: boolean;
1858
2136
  isHovered?: boolean;
1859
2137
  ref?: Ref<HTMLDivElement>;
1860
2138
  }
1861
- declare function TagEntry({ tag, isFocused, isHovered, ref, }: TagEntryProps): React$1.JSX.Element;
2139
+ declare function TagEntry({ session, tag, isFocused, isHovered, ref, }: TagEntryProps): React$1.JSX.Element;
1862
2140
 
1863
2141
  type Motivation$1 = components['schemas']['Motivation'];
1864
2142
  type JobProgress$1 = components['schemas']['JobProgress'];
@@ -1867,6 +2145,10 @@ interface PendingAnnotation$1 {
1867
2145
  motivation: Motivation$1;
1868
2146
  }
1869
2147
  interface TaggingPanelProps {
2148
+ /** Session carrying the client and event bus; null renders inert. */
2149
+ session: SemiontSession | null;
2150
+ /** The '@id' of the panel's resource — stamped as `source` on mark:submit (multi-viewer routing). */
2151
+ resourceId: string;
1870
2152
  annotations: Annotation[];
1871
2153
  annotateMode?: boolean;
1872
2154
  isAssisting?: boolean;
@@ -1888,7 +2170,7 @@ interface TaggingPanelProps {
1888
2170
  * @emits mark:create - Create new tag annotation. Payload: { motivation: 'tagging', selector: Selector | Selector[], body: Body[] }
1889
2171
  * @subscribes browse:click - Annotation clicked. Payload: { annotationId: string }
1890
2172
  */
1891
- declare function TaggingPanel({ annotations, annotateMode, isAssisting, progress, pendingAnnotation, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, locale, sourceLanguage, }: TaggingPanelProps): React$1.JSX.Element;
2173
+ declare function TaggingPanel({ session, resourceId, annotations, annotateMode, isAssisting, progress, pendingAnnotation, scrollToAnnotationId, onScrollCompleted, hoveredAnnotationId, locale, sourceLanguage, }: TaggingPanelProps): React$1.JSX.Element;
1892
2174
 
1893
2175
  type JobProgress = components['schemas']['JobProgress'];
1894
2176
 
@@ -1908,6 +2190,10 @@ interface PendingAnnotation {
1908
2190
  * - All operations managed via event bus (no callback props)
1909
2191
  */
1910
2192
  interface UnifiedAnnotationsPanelProps {
2193
+ /** Session carrying the client and event bus; null renders inert. */
2194
+ session: SemiontSession | null;
2195
+ /** Host-owned navigation: called with the resolved resource id when a reference entry opens. */
2196
+ onOpenResource?: (resourceId: string) => void;
1911
2197
  annotations: Annotation[];
1912
2198
  annotators: Record<string, Annotator>;
1913
2199
  annotateMode?: boolean;
@@ -1918,7 +2204,7 @@ interface UnifiedAnnotationsPanelProps {
1918
2204
  generatingReferenceId?: string | null;
1919
2205
  referencedBy?: any[];
1920
2206
  referencedByLoading?: boolean;
1921
- resourceId?: string;
2207
+ resourceId: string;
1922
2208
  initialTab?: TabKey;
1923
2209
  initialTabGeneration?: number;
1924
2210
  scrollToAnnotationId?: string | null;
@@ -3698,7 +3984,7 @@ interface HoverEmitterProps {
3698
3984
  onMouseEnter: () => void;
3699
3985
  onMouseLeave: () => void;
3700
3986
  }
3701
- declare function useHoverEmitter(annotationId: AnnotationId, hoverDelayMs?: number): HoverEmitterProps;
3987
+ declare function useHoverEmitter(session: SemiontSession | null, annotationId: AnnotationId, hoverDelayMs?: number): HoverEmitterProps;
3702
3988
 
3703
3989
  interface SessionStateUnit extends StateUnit {
3704
3990
  isLoggingOut$: Observable<boolean>;
@@ -3840,5 +4126,5 @@ declare function useShellStateUnit(): ShellStateUnit;
3840
4126
  */
3841
4127
  declare function useObservable<T>(obs$: Observable<T> | null | undefined): T | undefined;
3842
4128
 
3843
- export { ANNOTATORS, AVAILABLE_LOCALES, AdminDevOpsPage, AdminExchangePage, AdminSecurityPage, AdminUsersPage, AnnotateReferencesProgressWidget, AnnotateToolbar, AnnotateView, AnnotationHistory, AnnotationOverlay, AnnotationProvider, AssessmentEntry, AssessmentPanel, AssistSection, AsyncErrorBoundary, AuthErrorDisplay, BrowseView, Button, ButtonGroup, COMMON_PANELS, CodeMirrorRenderer, CollaborationPanel, CollapsibleResourceNavigation, CommentEntry, CommentsPanel, ComposeLoadingState, EntityTagsPage, EntityTypeBadges, ErrorBoundary, ExportCard, Footer, HighlightEntry, HighlightPanel, HistoryEvent, ImageURLSchema, ImageViewer, ImportCard, ImportProgress, JsonLdPanel, JsonLdView, KeyboardShortcutsHelpModal, LeftSidebar, LinkedDataPage, LiveRegionProvider, NavigationMenu, OAuthUserSchema, ObservableLink, PageLayout, PanelHeader, PermissionDeniedModal, PopupContainer, PopupHeader, ProtectedErrorBoundary, RESOURCE_PANELS, RecentDocumentsPage, ReferenceEntry, ReferenceResolutionWidget, ReferenceWizardModal, ReferencesPanel, ResizeHandle, ResourceAnnotationsProvider, ResourceCard, ResourceComposePage, ResourceDiscoveryPage, ResourceErrorState, ResourceGenerateModal, ResourceInfoPanel, ResourceLoadingState, ResourceSearchModal, ResourceTagsInline, ResourceViewer, ResourceViewerPage, SearchModal, SelectedTextDisplay, SemiontBranding, SemiontFavicon, SemiontProvider, SessionExpiredModal, SessionExpiryBanner, SessionTimer, SettingsPanel, SignInForm, SignUpForm, SimpleNavigation, SkipLinks, SortableResourceTab, StatisticsPanel, StatusDisplay, SvgDrawingCanvas, TagEntry, TagSchemasPage, TaggingPanel, ThemeProvider, ToastContainer, ToastProvider, Toolbar, TranslationProvider, UnifiedAnnotationsPanel, UnifiedHeader, UploadProgressBar, UserMenuSkeleton, WebBrowserStorage, WelcomePage, applyHighlights, buildSourceToRenderedMap, buildTextNodeIndex, buttonStyles, clearHighlights, createAdminSecurityStateUnit, createAdminUsersStateUnit, createComposePageStateUnit, createDiscoverStateUnit, createEntityTagsStateUnit, createExchangeStateUnit, createResourceLoaderStateUnit, createResourceViewerPageStateUnit, createSessionStateUnit, createShellStateUnit, createWelcomeStateUnit, cssVariables, faviconPaths, formatTime, generateCSSVariables, getResourceIcon, getSelectedShapeForSelectorType, getSelectorType, getShortcutDisplay, getSupportedShapes, hideWidgetPreview, isShapeSupported, jsonLightHighlightStyle, jsonLightTheme, resolveAnnotationRanges, sanitizeImageURL, saveSelectedShapeForSelectorType, setPdfWorkerSrc, showWidgetPreview, supportsDetection, toOverlayAnnotations, tokens, useAnnotationManager, useDebounce, useDebouncedCallback, useDocumentAnnouncements, useDoubleKeyPress, useDropdown, useEventSubscription, useEventSubscriptions, useFormAnnouncements, useHoverDelay, useHoverEmitter, useIsTyping, useKeyboardShortcuts, useLanguageChangeAnnouncements, useLineNumbers, useLiveRegion, useLoadingState, useLocalStorage, useObservable, useObservableExternalNavigation, useObservableRouter, usePanelWidth, usePreloadTranslations, useResourceAnnotations, useResourceContent, useResourceGather, useResourceLoadingAnnouncements, useRovingTabIndex, useSearchAnnouncements, useSemiont, useSessionExpiry, useShellStateUnit, useStateUnit, useTheme, useToast, useTranslations };
3844
- export type { AdminDevOpsPageProps, AdminExchangePageProps, AdminExchangePageTranslations, AdminSecurityPageProps, AdminSecurityStateUnit, AdminUser, AdminUserStats, AdminUsersPageProps, AdminUsersStateUnit, AnnotationConfig, AnnotationCreationHandler, AnnotationGroups, AnnotationHandlers, AnnotationManager, AnnotationProviderProps, AnnotationUIState, AnnotationsCollection, Annotator, AuthErrorDisplayProps, AvailableLocale, BorderRadiusToken, ButtonGroupProps, ButtonProps, ClickAction, CloneData, CollapsibleResourceNavigationProps, ColorToken, ComposeLoadingStateProps, ComposeMode, ComposePageStateUnit, ComposeParams, CreateAnnotationParams, CreateConfig, DeleteAnnotationParams, DetectionConfig, DevOpsFeature, DiscoverStateUnit, DrawingMode, EntityTagsPageProps, EntityTagsStateUnit, ExchangeStateUnit, ExportCardProps, ExportCardTranslations, HoverEmitterProps, ImportCardProps, ImportCardTranslations, ImportPreview, ImportProgressProps, ImportProgressTranslations, JobProgressWidgetTranslations, KeyboardShortcut, LinkComponentProps, LinkedDataPageProps, LinkedDataPageTranslations, Motivation$8 as Motivation, NavigationItem, NavigationMenuHelper, NavigationProps, OAuthProvider, OAuthUser, ObservableLinkProps, OverlayAnnotation, RecentDocumentsPageProps, ReferenceData, ReferenceWizardModalProps, ResolvedTheme, ResourceCardProps, ResourceComposePageProps, ResourceDiscoveryPageProps, ResourceErrorStateProps, ResourceGatherOptions, ResourceGenerateModalProps, ResourceGenerateModalTranslations, ResourceLoaderStateUnit, ResourceSearchModalProps, ResourceViewerPageProps, ResourceViewerPageStateUnit, RouteBuilder, SaveResourceParams$1 as SaveResourceParams, SearchModalProps, SelectionMotivation, SelectorType, SemiontProviderProps, SemiontResource$1 as SemiontResource, SessionStateUnit, ShadowToken, ShapeType, ShellStateUnit, ShellStateUnitOptions, SignInFormProps, SignUpFormProps, SimpleNavigationItem, SimpleNavigationProps, SortableResourceTabProps, SpacingToken, TagSchemasPageProps, TextSegment, TextSelection, Theme, ToastMessage, ToastType, ToolbarPanelType, TransitionToken, TranslationManager, TranslationProviderProps, TypographyToken, UICreateAnnotationParams, UploadProgressBarProps, UseResourceContentResult, UseResourceGatherResult, WelcomePageProps, WelcomeStateUnit, WizardState };
4129
+ export { ANNOTATORS, AVAILABLE_LOCALES, AdminDevOpsPage, AdminExchangePage, AdminSecurityPage, AdminUsersPage, AnnotateReferencesProgressWidget, AnnotateToolbar, AnnotateView, AnnotationHistory, AnnotationOverlay, AnnotationProvider, AssessmentEntry, AssessmentPanel, AssistSection, AsyncErrorBoundary, AuthErrorDisplay, BrowseView, Button, ButtonGroup, COMMON_PANELS, CodeMirrorRenderer, CollaborationPanel, CollapsibleResourceNavigation, CommentEntry, CommentsPanel, ComposeLoadingState, EntityTagsPage, EntityTypeBadges, ErrorBoundary, ExportCard, Footer, HighlightEntry, HighlightPanel, HistoryEvent, ImageBrowseRenderer, ImageURLSchema, ImageViewer, ImportCard, ImportProgress, JsonLdPanel, JsonLdView, KeyboardShortcutsHelpModal, LeftSidebar, LinkedDataPage, LiveRegionProvider, NavigationMenu, OAuthUserSchema, ObservableLink, PageLayout, PanelHeader, PdfBrowseRenderer, PermissionDeniedModal, PopupContainer, PopupHeader, ProtectedErrorBoundary, RESOURCE_PANELS, RecentDocumentsPage, ReferenceEntry, ReferenceResolutionWidget, ReferenceWizardModal, ReferencesPanel, ResizeHandle, ResourceAnnotationsProvider, ResourceCard, ResourceComposePage, ResourceDiscoveryPage, ResourceErrorState, ResourceGenerateModal, ResourceInfoPanel, ResourceLoadingState, ResourceSearchModal, ResourceTagsInline, ResourceViewer, ResourceViewerPage, SearchModal, SelectedTextDisplay, SemiontBranding, SemiontFavicon, SemiontProvider, SessionExpiredModal, SessionExpiryBanner, SessionTimer, SettingsPanel, SignInForm, SignUpForm, SimpleNavigation, SkipLinks, SortableResourceTab, StatisticsPanel, StatusDisplay, SvgDrawingCanvas, TagEntry, TagSchemasPage, TaggingPanel, TextBrowseRenderer, ThemeProvider, ToastContainer, ToastProvider, Toolbar, TranslationProvider, UnifiedAnnotationsPanel, UnifiedHeader, UploadProgressBar, UserMenuSkeleton, WebBrowserStorage, WelcomePage, applyHighlights, buildSourceToRenderedMap, buildTextNodeIndex, buttonStyles, clearHighlights, createAdminSecurityStateUnit, createAdminUsersStateUnit, createComposePageStateUnit, createDiscoverStateUnit, createEntityTagsStateUnit, createExchangeStateUnit, createResourceLoaderStateUnit, createResourceViewerPageStateUnit, createSessionStateUnit, createShellStateUnit, createWelcomeStateUnit, cssVariables, defaultBrowseRenderers, faviconPaths, formatTime, generateCSSVariables, getResourceIcon, getSelectedShapeForSelectorType, getSelectorType, getShortcutDisplay, getSupportedShapes, hideWidgetPreview, isShapeSupported, jsonLightHighlightStyle, jsonLightTheme, resolveAnnotationRanges, sanitizeImageURL, saveSelectedShapeForSelectorType, setPdfWorkerSrc, showWidgetPreview, supportsDetection, toOverlayAnnotations, tokens, useAnnotationManager, useDebounce, useDebouncedCallback, useDocumentAnnouncements, useDoubleKeyPress, useDropdown, useEventSubscription, useEventSubscriptions, useFormAnnouncements, useHoverDelay, useHoverEmitter, useIsTyping, useKeyboardShortcuts, useLanguageChangeAnnouncements, useLineNumbers, useLiveRegion, useLoadingState, useLocalStorage, useMediaToken, useObservable, useObservableExternalNavigation, useObservableRouter, usePanelWidth, usePendingCreation, usePreloadTranslations, useResourceAnnotations, useResourceContent, useResourceGather, useResourceLoader, useResourceLoadingAnnouncements, useRovingTabIndex, useSearchAnnouncements, useSemiont, useSessionEventSubscriptions, useSessionExpiry, useShellStateUnit, useStateUnit, useTheme, useToast, useToolbarPrefs, useTranslations };
4130
+ export type { AdminDevOpsPageProps, AdminExchangePageProps, AdminExchangePageTranslations, AdminSecurityPageProps, AdminSecurityStateUnit, AdminUser, AdminUserStats, AdminUsersPageProps, AdminUsersStateUnit, AnnotationConfig, AnnotationCreationHandler, AnnotationGroups, AnnotationHandlers, AnnotationManager, AnnotationProviderProps, AnnotationUIState, AnnotationsCollection, Annotator, AuthErrorDisplayProps, AvailableLocale, BorderRadiusToken, BrowseMediaRenderers, ButtonGroupProps, ButtonProps, ClickAction, CloneData, CollapsibleResourceNavigationProps, ColorToken, ComposeLoadingStateProps, ComposeMode, ComposePageStateUnit, ComposeParams, CreateAnnotationParams, CreateConfig, DeleteAnnotationParams, DetectionConfig, DevOpsFeature, DiscoverStateUnit, DrawingMode, EntityTagsPageProps, EntityTagsStateUnit, ExchangeStateUnit, ExportCardProps, ExportCardTranslations, HoverEmitterProps, ImportCardProps, ImportCardTranslations, ImportPreview, ImportProgressProps, ImportProgressTranslations, JobProgressWidgetTranslations, KeyboardShortcut, LinkComponentProps, LinkedDataPageProps, LinkedDataPageTranslations, MediaRendererProps, Motivation$8 as Motivation, NavigationItem, NavigationMenuHelper, NavigationProps, OAuthProvider, OAuthUser, ObservableLinkProps, OverlayAnnotation, PendingCreation, RecentDocumentsPageProps, ReferenceData, ReferenceHover, ReferenceWizardModalProps, ResolvedTheme, ResourceCardProps, ResourceComposePageProps, ResourceDiscoveryPageProps, ResourceErrorStateProps, ResourceGatherOptions, ResourceGenerateModalProps, ResourceGenerateModalTranslations, ResourceLoaderStateUnit, ResourceSearchModalProps, ResourceViewerPageProps, ResourceViewerPageStateUnit, RouteBuilder, SaveResourceParams$1 as SaveResourceParams, SearchModalProps, SelectionMotivation, SelectorType, SemiontProviderProps, SemiontResource$1 as SemiontResource, SessionStateUnit, ShadowToken, ShapeType, ShellStateUnit, ShellStateUnitOptions, SignInFormProps, SignUpFormProps, SimpleNavigationItem, SimpleNavigationProps, SortableResourceTabProps, SpacingToken, TagSchemasPageProps, TextSegment, TextSelection, Theme, ToastMessage, ToastType, ToolbarPanelType, ToolbarPart, ToolbarPrefs, TransitionToken, TranslationManager, TranslationProviderProps, TypographyToken, UICreateAnnotationParams, UploadProgressBarProps, UseMediaTokenResult, UseResourceContentResult, UseResourceGatherResult, UseResourceLoaderResult, WelcomePageProps, WelcomeStateUnit, WizardState };