1- import { createAnonymousGuest , createLifecyleObserver , createBaseAnnotator , DrawingStyle , Filter , createUndoStack } from '@annotorious/core' ;
1+ import { createAnonymousGuest , createLifecyleObserver , createBaseAnnotator , Filter , createUndoStack } from '@annotorious/core' ;
22import type { Annotator , User , PresenceProvider } from '@annotorious/core' ;
3- import { createCanvasHighlightRenderer , createCSSHighlightRenderer } from './highlight' ;
3+ import { createCanvasRenderer , createHighlightsRenderer , createSpansRenderer , type HighlightStyleExpression } from './highlight' ;
44import { createPresencePainter } from './presence' ;
55import { scrollIntoView } from './api' ;
66import { TextAnnotationStore , TextAnnotatorState , createTextAnnotatorState } from './state' ;
77import type { TextAnnotation } from './model' ;
8- import type { TextAnnotatorOptions } from './TextAnnotatorOptions' ;
8+ import type { RendererType , TextAnnotatorOptions } from './TextAnnotatorOptions' ;
99import { SelectionHandler } from './SelectionHandler' ;
1010
1111import './TextAnnotator.css' ;
1212
13+
14+ const USE_DEFAULT_RENDERER : RendererType = 'SPANS' ;
15+
1316export interface TextAnnotator < E extends unknown = TextAnnotation > extends Annotator < TextAnnotation , E > {
1417
1518 element : HTMLElement ;
1619
20+ setStyle ( style : HighlightStyleExpression | undefined ) : void ;
21+
1722 // Returns true if successful (or false if the annotation is not currently rendered)
1823 scrollIntoView ( annotation : TextAnnotation ) : boolean ;
1924
@@ -42,20 +47,26 @@ export const createTextAnnotator = <E extends unknown = TextAnnotation>(
4247
4348 let currentUser : User = createAnonymousGuest ( ) ;
4449
45- // Switch on CSS Custom Highlight rendering, if requested in the init
46- // opts and API is available in this browser
47- // @ts -ignore
48- const useExperimentalCSSRenderer = opts . experimentalCSSRenderer && Boolean ( CSS . highlights ) ;
50+ // Use selected renderer, or fall back to default. If CSS_HIGHLIGHT is
51+ // requested, check if CSS Custom Highlights are supported, and fall
52+ // back to default renderer if not.
53+ const useRenderer : RendererType =
54+ opts . renderer === 'CSS_HIGHLIGHTS'
55+ ? Boolean ( CSS . highlights ) ? 'CSS_HIGHLIGHTS' : USE_DEFAULT_RENDERER
56+ : opts . renderer || USE_DEFAULT_RENDERER ;
4957
50- if ( useExperimentalCSSRenderer )
51- console . log ( 'Using experimental CSS Custom Highlight API renderer' ) ;
58+ const highlightRenderer =
59+ useRenderer === 'SPANS' ? createSpansRenderer ( container , state , viewport ) :
60+ useRenderer === 'CSS_HIGHLIGHTS' ? createHighlightsRenderer ( container , state , viewport ) :
61+ useRenderer === 'CANVAS' ? createCanvasRenderer ( container , state , viewport ) : undefined ;
5262
53- const highlightRenderer = useExperimentalCSSRenderer
54- ? createCSSHighlightRenderer ( container , state , viewport )
55- : createCanvasHighlightRenderer ( container , state , viewport ) ;
63+ if ( ! highlightRenderer )
64+ throw `Unknown renderer implementation: ${ useRenderer } ` ;
5665
66+ console . debug ( `Using ${ useRenderer } renderer` ) ;
67+
5768 if ( opts . style )
58- highlightRenderer . setDrawingStyle ( opts . style ) ;
69+ highlightRenderer . setStyle ( opts . style ) ;
5970
6071 const selectionHandler = SelectionHandler ( container , state , opts . offsetReferenceSelector ) ;
6172
@@ -73,8 +84,8 @@ export const createTextAnnotator = <E extends unknown = TextAnnotation>(
7384 const setFilter = ( filter ?: Filter ) =>
7485 highlightRenderer . setFilter ( filter ) ;
7586
76- const setStyle = ( drawingStyle : DrawingStyle | ( ( annotation : TextAnnotation ) => DrawingStyle ) | undefined ) =>
77- highlightRenderer . setDrawingStyle ( drawingStyle ) ;
87+ const setStyle = ( style : HighlightStyleExpression | undefined ) =>
88+ highlightRenderer . setStyle ( style ) ;
7889
7990 const setUser = ( user : User ) => {
8091 currentUser = user ;
@@ -84,7 +95,7 @@ export const createTextAnnotator = <E extends unknown = TextAnnotation>(
8495 const setPresenceProvider = ( provider : PresenceProvider ) => {
8596 if ( provider ) {
8697 highlightRenderer . setPainter ( createPresencePainter ( container , provider , opts . presence ) ) ;
87- provider . on ( 'selectionChange' , ( ) => highlightRenderer . refresh ( ) ) ;
98+ provider . on ( 'selectionChange' , ( ) => highlightRenderer . redraw ( ) ) ;
8899 }
89100 }
90101
@@ -96,6 +107,9 @@ export const createTextAnnotator = <E extends unknown = TextAnnotation>(
96107 }
97108 }
98109
110+ const setVisible = ( visible : boolean ) =>
111+ highlightRenderer . setVisible ( visible ) ;
112+
99113 const destroy = ( ) => {
100114 highlightRenderer . destroy ( ) ;
101115 selectionHandler . destroy ( ) ;
@@ -114,6 +128,7 @@ export const createTextAnnotator = <E extends unknown = TextAnnotation>(
114128 setUser,
115129 setSelected,
116130 setPresenceProvider,
131+ setVisible,
117132 on : lifecycle . on ,
118133 off : lifecycle . off ,
119134 scrollIntoView : scrollIntoView ( container , store ) ,
0 commit comments