Skip to content

Commit e18c6b3

Browse files
author
Mingze
authored
feat(highlight): Change cursor when hovering over text (#547)
* feat(highlight): Change cursor when hovering over text * feat(highlight): Address feedbacks * feat(highlight): Add tests
1 parent 0222d0b commit e18c6b3

File tree

5 files changed

+49
-4
lines changed

5 files changed

+49
-4
lines changed

src/document/DocumentAnnotator.scss

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
@import '../highlight/HighlightCreator';
2+
13
.bp-doc {
24
.ba-Layer {
35
position: absolute;
@@ -7,4 +9,10 @@
79
width: 100%;
810
pointer-events: none;
911
}
12+
13+
&.ba-is-highlighting {
14+
.textLayer > span {
15+
@include ba-HighlightCreator-cursor;
16+
}
17+
}
1018
}

src/document/DocumentAnnotator.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import BaseAnnotator from '../common/BaseAnnotator';
1+
import BaseAnnotator, { Options } from '../common/BaseAnnotator';
22
import BaseManager from '../common/BaseManager';
33
import { centerRegion, isRegion, RegionManager } from '../region';
4+
import { Event } from '../@types';
45
import { getAnnotation } from '../store/annotations';
56
import { HighlightManager } from '../highlight';
7+
import { Mode } from '../store';
68
import { scrollToLocation } from '../utils/scroll';
79
import './DocumentAnnotator.scss';
810

@@ -11,6 +13,12 @@ export default class DocumentAnnotator extends BaseAnnotator {
1113

1214
managers: Map<number, Set<BaseManager>> = new Map();
1315

16+
constructor(options: Options) {
17+
super(options);
18+
19+
this.addListener(Event.ANNOTATIONS_MODE_CHANGE, this.handleChangeMode);
20+
}
21+
1422
getAnnotatedElement(): HTMLElement | null | undefined {
1523
return this.containerEl?.querySelector('.bp-doc');
1624
}
@@ -57,6 +65,18 @@ export default class DocumentAnnotator extends BaseAnnotator {
5765
return this.annotatedEl ? Array.from(this.annotatedEl.querySelectorAll('.page')) : [];
5866
}
5967

68+
handleChangeMode = ({ mode }: { mode: Mode }): void => {
69+
if (!this.annotatedEl) {
70+
return;
71+
}
72+
73+
if (mode === Mode.HIGHLIGHT) {
74+
this.annotatedEl.classList.add('ba-is-highlighting');
75+
} else {
76+
this.annotatedEl.classList.remove('ba-is-highlighting');
77+
}
78+
};
79+
6080
render(): void {
6181
this.getPages()
6282
.filter(({ dataset }) => dataset.loaded && dataset.pageNumber)

src/document/__tests__/DocumentAnnotator-test.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import BaseManager from '../../common/BaseManager';
22
import DocumentAnnotator from '../DocumentAnnotator';
33
import RegionManager from '../../region/RegionManager';
4-
import { Annotation } from '../../@types';
4+
import { Annotation, Event } from '../../@types';
55
import { annotations as regions } from '../../region/__mocks__/data';
66
import { fetchAnnotationsAction } from '../../store';
77
import { scrollToLocation } from '../../utils/scroll';
@@ -66,6 +66,23 @@ describe('DocumentAnnotator', () => {
6666
}
6767
});
6868

69+
describe('event handlers', () => {
70+
beforeEach(() => {
71+
annotator.annotatedEl = container.querySelector('.bp-doc') as HTMLElement;
72+
73+
jest.spyOn(annotator.annotatedEl.classList, 'add');
74+
jest.spyOn(annotator.annotatedEl.classList, 'remove');
75+
});
76+
77+
test('should add/remove highlight class', () => {
78+
annotator.emit(Event.ANNOTATIONS_MODE_CHANGE, { mode: 'highlight' });
79+
expect(annotator.annotatedEl?.classList.add).toHaveBeenCalledWith('ba-is-highlighting');
80+
81+
annotator.emit(Event.ANNOTATIONS_MODE_CHANGE, { mode: 'region' });
82+
expect(annotator.annotatedEl?.classList.remove).toHaveBeenCalledWith('ba-is-highlighting');
83+
});
84+
});
85+
6986
describe('getPageManagers()', () => {
7087
test('should create new managers given a new page element', () => {
7188
const managers = annotator.getPageManagers(getPage());

src/highlight/HighlightAnnotations.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
position: absolute;
33
top: 0;
44
left: 0;
5+
display: none;
56
width: 100%;
67
height: 100%;
7-
pointer-events: auto;
88
}

src/highlight/HighlightCreator.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ $text_cursor_32: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABz
22
$text_cursor_32_2x: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAQKADAAQAAAABAAAAQAAAAABlmWCKAAADvElEQVR4Ae2ZzUsbQRTA37a1BSkVhNjEg400h2ouQiWpaFIpftGmxP4FQqs9RLykiIj0JD3YIgVvFnvrUYppUq0kSk9Wi0URcrNgtGCKFyW9JKHZvrfNVjTJmt3R3bSdBy+zO/ve7rzfvJnMzgJw4QQ4AU6AE+AEOAFOgBPgBDgBToAT4AQ4AU5AJQFRFGtQw6hJ1JOEbMi2RuVjStc8G9BJgR+/Hi6ViATWhmBkSbzHxVuNjXBwcKB4u4qKClheXSWblCAIlxSNdbp4Tqfn/LuPKTQEbthsImkBKZkhcBoZ8Ai7N4KaKqKbyYZsyackhBkAjuVt1HYa06hKc8qXbMRtWMYKZIZSdQIvLqP2oSo9RxVYZgAqnnYTbS+qsD9uehkrnKivUCMIwXLcQMv5BS1Oan3SqZT4xO8XPi4uQjqdVusu2ZtMJnA4nTA4NCReNZvvYOUbhNCGSSdqumHWSZcMCMzMCOH5ec3BU1v39vbgfSgEXo9H+B6PU9AEoZeusYguAOLxOEsbj/jSWuPF2Jg8BzBPproMgSMR5Dmx1taCr78f6urrwVJdDVtbWzA1OQkf5ubyWAN8XlmR6+3ygdZSlwxQapzL7YZAMAj3vV4wVVWBmMmA3W6HlxMT0NHVldeVhkNWaGJkEsMBrK+twbtAAAZ8PqDldEtTE7ydnpaC6u3rYwquGGfDASQSCXg6MgKR8O/FYTKZhLnZWant1222YmJgsimJOYAisGGw7tZWuGa1ghWVpLy8XCrP8sdwAJWVldJ4p//4TCYjxmIxIYVZoJcYPgSej49LC5yN9fWNZqdTuNvRAc9GR/WKHwwH0NDQIAW7EInE9vf3pePmlhbdABg+BKLRqJQBvoGB23X490cTX7XF8hMJUOfIC54zA2J4BowMD8OnpSUK8IrL5YKvm5vwwOs9HwoGhfjubt7Aab2QlR/ygdbS8Az4trMDD3t6cto/6Pfn1MkVDodDPozKB1pLXTLAbDZrbV+OH+0r0hth9sLrHAOVFboA8HZ3i+2dnVBWVqayeYfm9Dp8z+OBQChEr8M0NyyiTh1alMgRvqNLcsKeoGymtVxAx1PZENElA7J9Q1tixewbFupKmvDoNfAxKm2E5J8hC3kXqGeeBLEn6CsPjUU3qtKWF22J/dkUxQC28dxwOY0MoODbUJWClwMlG7JlnrzkG7KWzAsNzAD+ZYi1F/5qf8wA+tqrVkrmyxAzfIz8//48zkyQ34AT4AQ4AU6AE+AEOAFOgBPgBDgBToAT4AT0JvAL80N/mFc/WlQAAAAASUVORK5CYII=';
33
$text_cursor_32_3x: 'data:image/png;base64,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';
44

5-
.ba-HighlightCreator {
5+
@mixin ba-HighlightCreator-cursor {
66
cursor: url($text_cursor_32) 16 16, text; /* Legacy */
77
cursor: image-set(url($text_cursor_32) 1x, url($text_cursor_32_2x) 2x, url($text_cursor_32_3x) 3x) 16 16, text; /* Webkit */ /* stylelint-disable-line */
88
}

0 commit comments

Comments
 (0)