@annotorious/core 3.0.0-rc.3 → 3.0.0-rc.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/annotorious-core.es.js +784 -0
- package/dist/annotorious-core.es.js.map +1 -0
- package/{src/index.ts → dist/index.d.ts} +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/lifecycle/Lifecycle.d.ts +11 -0
- package/dist/lifecycle/Lifecycle.d.ts.map +1 -0
- package/dist/lifecycle/LifecycleEvents.d.ts +13 -0
- package/dist/lifecycle/LifecycleEvents.d.ts.map +1 -0
- package/dist/lifecycle/index.d.ts +3 -0
- package/dist/lifecycle/index.d.ts.map +1 -0
- package/dist/model/Annotation.d.ts +34 -0
- package/dist/model/Annotation.d.ts.map +1 -0
- package/dist/model/AnnotationState.d.ts +8 -0
- package/dist/model/AnnotationState.d.ts.map +1 -0
- package/dist/model/Annotator.d.ts +65 -0
- package/dist/model/Annotator.d.ts.map +1 -0
- package/dist/model/DrawingStyle.d.ts +17 -0
- package/dist/model/DrawingStyle.d.ts.map +1 -0
- package/dist/model/Filter.d.ts +4 -0
- package/dist/model/Filter.d.ts.map +1 -0
- package/dist/model/FormatAdapter.d.ts +16 -0
- package/dist/model/FormatAdapter.d.ts.map +1 -0
- package/dist/model/User.d.ts +11 -0
- package/dist/model/User.d.ts.map +1 -0
- package/dist/model/W3CAnnotation.d.ts +43 -0
- package/dist/model/W3CAnnotation.d.ts.map +1 -0
- package/{src/model/index.ts → dist/model/index.d.ts} +3 -1
- package/dist/model/index.d.ts.map +1 -0
- package/dist/presence/Appearance.d.ts +6 -0
- package/dist/presence/Appearance.d.ts.map +1 -0
- package/dist/presence/AppearanceProvider.d.ts +17 -0
- package/dist/presence/AppearanceProvider.d.ts.map +1 -0
- package/dist/presence/ColorPalette.d.ts +3 -0
- package/dist/presence/ColorPalette.d.ts.map +1 -0
- package/dist/presence/PresenceEvents.d.ts +7 -0
- package/dist/presence/PresenceEvents.d.ts.map +1 -0
- package/dist/presence/PresenceProvider.d.ts +6 -0
- package/dist/presence/PresenceProvider.d.ts.map +1 -0
- package/dist/presence/PresenceState.d.ts +19 -0
- package/dist/presence/PresenceState.d.ts.map +1 -0
- package/dist/presence/PresentUser.d.ts +8 -0
- package/dist/presence/PresentUser.d.ts.map +1 -0
- package/{src/presence/index.ts → dist/presence/index.d.ts} +2 -1
- package/dist/presence/index.d.ts.map +1 -0
- package/dist/state/Hover.d.ts +10 -0
- package/dist/state/Hover.d.ts.map +1 -0
- package/dist/state/Selection.d.ts +31 -0
- package/dist/state/Selection.d.ts.map +1 -0
- package/dist/state/Store.d.ts +35 -0
- package/dist/state/Store.d.ts.map +1 -0
- package/dist/state/StoreObserver.d.ts +58 -0
- package/dist/state/StoreObserver.d.ts.map +1 -0
- package/dist/state/SvelteStore.d.ts +23 -0
- package/dist/state/SvelteStore.d.ts.map +1 -0
- package/dist/state/UndoStack.d.ts +19 -0
- package/dist/state/UndoStack.d.ts.map +1 -0
- package/dist/state/Viewport.d.ts +6 -0
- package/dist/state/Viewport.d.ts.map +1 -0
- package/{src/state/index.ts → dist/state/index.d.ts} +2 -1
- package/dist/state/index.d.ts.map +1 -0
- package/dist/utils/annotationUtils.d.ts +12 -0
- package/dist/utils/annotationUtils.d.ts.map +1 -0
- package/dist/utils/diffAnnotations.d.ts +5 -0
- package/dist/utils/diffAnnotations.d.ts.map +1 -0
- package/{src/utils/index.ts → dist/utils/index.d.ts} +1 -1
- package/dist/utils/index.d.ts.map +1 -0
- package/package.json +20 -17
- package/src/lifecycle/Lifecycle.ts +0 -197
- package/src/lifecycle/LifecycleEvents.ts +0 -21
- package/src/lifecycle/index.ts +0 -2
- package/src/model/Annotation.ts +0 -73
- package/src/model/Annotator.ts +0 -161
- package/src/model/DrawingStyle.ts +0 -19
- package/src/model/Filter.ts +0 -3
- package/src/model/FormatAdapter.ts +0 -36
- package/src/model/User.ts +0 -19
- package/src/model/W3CAnnotation.ts +0 -118
- package/src/presence/Appearance.ts +0 -9
- package/src/presence/AppearanceProvider.ts +0 -53
- package/src/presence/ColorPalette.ts +0 -14
- package/src/presence/PresenceEvents.ts +0 -9
- package/src/presence/PresenceProvider.ts +0 -7
- package/src/presence/PresenceState.ts +0 -145
- package/src/presence/PresentUser.ts +0 -10
- package/src/state/Hover.ts +0 -34
- package/src/state/Selection.ts +0 -113
- package/src/state/Store.ts +0 -344
- package/src/state/StoreObserver.ts +0 -194
- package/src/state/SvelteStore.ts +0 -54
- package/src/state/UndoStack.ts +0 -112
- package/src/state/Viewport.ts +0 -14
- package/src/utils/annotationUtils.ts +0 -33
- package/src/utils/diffAnnotations.ts +0 -39
- package/src/vite-env.d.ts +0 -1
package/src/state/SvelteStore.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { Annotation, Annotator, AnnotatorState } from '../model';
|
|
2
|
-
import type { Store } from './Store';
|
|
3
|
-
import type { StoreChangeEvent } from './StoreObserver';
|
|
4
|
-
|
|
5
|
-
type Subscriber<T extends Annotation> = (annotation: T[]) => void;
|
|
6
|
-
|
|
7
|
-
export interface SvelteStore<T extends Annotation> extends Store<T> {
|
|
8
|
-
|
|
9
|
-
subscribe(onChange: Subscriber<T>): void;
|
|
10
|
-
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface SvelteAnnotatorState<T extends Annotation> extends AnnotatorState<T> {
|
|
14
|
-
|
|
15
|
-
store: SvelteStore<T>
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface SvelteAnnotator<T extends Annotation> extends Annotator<T> {
|
|
20
|
-
|
|
21
|
-
state: SvelteAnnotatorState<T>
|
|
22
|
-
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* A simple wrapper around the event-based store implementation
|
|
27
|
-
* that adds a Svelte shim, for use with the reactive '$' notation.
|
|
28
|
-
* Other frameworks might not actually need this. But it's pretty
|
|
29
|
-
* convenient for everyone using Svelte, as well as for the
|
|
30
|
-
* basic (Svelte-based) Annotorious standard implementation.
|
|
31
|
-
*/
|
|
32
|
-
export const toSvelteStore = <T extends Annotation>(store: Store<T>): SvelteStore<T> => {
|
|
33
|
-
|
|
34
|
-
const subscribe = (onChange: Subscriber<T>) => {
|
|
35
|
-
|
|
36
|
-
// Register a store observer on behalf of the subscriber
|
|
37
|
-
const shim = (event: StoreChangeEvent<T>) => onChange(event.state);
|
|
38
|
-
store.observe(shim);
|
|
39
|
-
|
|
40
|
-
// Immediately call the subscriber function with the
|
|
41
|
-
// current store value, according to the Svelte contract.
|
|
42
|
-
// https://stackoverflow.com/questions/68220955/how-does-svelte-unsubscribe-actually-work
|
|
43
|
-
onChange(store.all());
|
|
44
|
-
|
|
45
|
-
// Return the unsubscribe function
|
|
46
|
-
return () => store.unobserve(shim);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
...store,
|
|
51
|
-
subscribe
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
}
|
package/src/state/UndoStack.ts
DELETED
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
import type { Annotation } from '../model';
|
|
2
|
-
import type { Store } from './Store';
|
|
3
|
-
import { Origin } from './StoreObserver';
|
|
4
|
-
import { mergeChanges, type ChangeSet, type StoreChangeEvent, type Update } from './StoreObserver';
|
|
5
|
-
|
|
6
|
-
// Duration with fast successive changes get merged
|
|
7
|
-
// with the last event in the stack, rather than getting stacked
|
|
8
|
-
// as a new undo/redo step.
|
|
9
|
-
const DEBOUNCE = 250;
|
|
10
|
-
|
|
11
|
-
export interface UndoStack {
|
|
12
|
-
|
|
13
|
-
destroy(): void;
|
|
14
|
-
|
|
15
|
-
undo(): void;
|
|
16
|
-
|
|
17
|
-
redo(): void;
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const createUndoStack = <T extends Annotation>(store: Store<T>): UndoStack => {
|
|
22
|
-
|
|
23
|
-
const changeStack: ChangeSet<T>[] = [];
|
|
24
|
-
|
|
25
|
-
let pointer = -1;
|
|
26
|
-
|
|
27
|
-
let muteEvents = false;
|
|
28
|
-
|
|
29
|
-
let lastEvent = 0;
|
|
30
|
-
|
|
31
|
-
const onChange = (event: StoreChangeEvent<T>) => {
|
|
32
|
-
if (!muteEvents) {
|
|
33
|
-
const { changes } = event;
|
|
34
|
-
|
|
35
|
-
const now = performance.now();
|
|
36
|
-
|
|
37
|
-
if (now - lastEvent > DEBOUNCE) {
|
|
38
|
-
// Put this change on the stack...
|
|
39
|
-
changeStack.splice(pointer + 1);
|
|
40
|
-
changeStack.push(changes);
|
|
41
|
-
|
|
42
|
-
// ...and update the pointer
|
|
43
|
-
pointer = changeStack.length - 1;
|
|
44
|
-
} else {
|
|
45
|
-
// Merge this change with the last in the stack
|
|
46
|
-
const last = changeStack.length - 1;
|
|
47
|
-
changeStack[last] = mergeChanges(changeStack[last], changes);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
lastEvent = now;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
muteEvents = false;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
store.observe(onChange, { origin: Origin.LOCAL });
|
|
57
|
-
|
|
58
|
-
const undoCreated = (created: T[]) =>
|
|
59
|
-
created?.length > 0 && store.bulkDeleteAnnotation(created);
|
|
60
|
-
|
|
61
|
-
const redoCreated = (created: T[]) =>
|
|
62
|
-
created?.length > 0 && store.bulkAddAnnotation(created, false);
|
|
63
|
-
|
|
64
|
-
const undoUpdated = (updated: Update<T>[]) =>
|
|
65
|
-
updated?.length > 0 && store.bulkUpdateAnnotation(updated.map(({ oldValue }) => oldValue));
|
|
66
|
-
|
|
67
|
-
const redoUpdated = (updated: Update<T>[]) =>
|
|
68
|
-
updated?.length > 0 && store.bulkUpdateAnnotation(updated.map(({ newValue }) => newValue));
|
|
69
|
-
|
|
70
|
-
const undoDeleted = (deleted: T[]) =>
|
|
71
|
-
deleted?.length > 0 && store.bulkAddAnnotation(deleted, false);
|
|
72
|
-
|
|
73
|
-
const redoDeleted = (deleted: T[]) =>
|
|
74
|
-
deleted?.length > 0 && store.bulkDeleteAnnotation(deleted);
|
|
75
|
-
|
|
76
|
-
const undo = () => {
|
|
77
|
-
if (pointer > -1) {
|
|
78
|
-
muteEvents = true;
|
|
79
|
-
|
|
80
|
-
const { created, updated, deleted} = changeStack[pointer];
|
|
81
|
-
|
|
82
|
-
undoCreated(created);
|
|
83
|
-
undoUpdated(updated);
|
|
84
|
-
undoDeleted(deleted);
|
|
85
|
-
|
|
86
|
-
pointer -= 1;
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
const redo = () => {
|
|
91
|
-
if (changeStack.length - 1 > pointer) {
|
|
92
|
-
muteEvents = true;
|
|
93
|
-
|
|
94
|
-
const { created, updated, deleted } = changeStack[pointer + 1];
|
|
95
|
-
|
|
96
|
-
redoCreated(created);
|
|
97
|
-
redoUpdated(updated);
|
|
98
|
-
redoDeleted(deleted);
|
|
99
|
-
|
|
100
|
-
pointer += 1;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const destroy = () => store.unobserve(onChange);
|
|
105
|
-
|
|
106
|
-
return {
|
|
107
|
-
destroy,
|
|
108
|
-
redo,
|
|
109
|
-
undo
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
}
|
package/src/state/Viewport.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { writable } from 'svelte/store';
|
|
2
|
-
|
|
3
|
-
export type ViewportState = ReturnType<typeof createViewportState>;
|
|
4
|
-
|
|
5
|
-
export const createViewportState = () => {
|
|
6
|
-
|
|
7
|
-
const { subscribe, set } = writable<string[]>([]);
|
|
8
|
-
|
|
9
|
-
return {
|
|
10
|
-
subscribe,
|
|
11
|
-
set
|
|
12
|
-
};
|
|
13
|
-
|
|
14
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
-
import type { Annotation, AnnotationBody, User } from '../model';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Returns all users listed as creators or updaters in any parts of this
|
|
6
|
-
* annotation.
|
|
7
|
-
*/
|
|
8
|
-
export const getContributors = (annotation: Annotation): User[] => {
|
|
9
|
-
const { creator, updatedBy } = annotation.target;
|
|
10
|
-
|
|
11
|
-
const bodyCollaborators = annotation.bodies.reduce((users, body) => (
|
|
12
|
-
[...users, body.creator, body.updatedBy]
|
|
13
|
-
), [] as User[]);
|
|
14
|
-
|
|
15
|
-
return [
|
|
16
|
-
creator,
|
|
17
|
-
updatedBy,
|
|
18
|
-
...bodyCollaborators
|
|
19
|
-
].filter(u => u); // Remove undefined
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export const createBody = (
|
|
23
|
-
annotation: Annotation,
|
|
24
|
-
payload: { [key: string]: any },
|
|
25
|
-
created?: Date,
|
|
26
|
-
creator?: User
|
|
27
|
-
): AnnotationBody => ({
|
|
28
|
-
id: uuidv4(),
|
|
29
|
-
annotation: annotation.id,
|
|
30
|
-
created: created || new Date(),
|
|
31
|
-
creator,
|
|
32
|
-
...payload
|
|
33
|
-
});
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { dequal } from 'dequal/lite';
|
|
2
|
-
import type { Update } from '../state';
|
|
3
|
-
import type { Annotation } from '../model';
|
|
4
|
-
|
|
5
|
-
const getAddedBodies = (oldValue: Annotation, newValue: Annotation) => {
|
|
6
|
-
const oldBodyIds = new Set(oldValue.bodies.map(b => b.id));
|
|
7
|
-
return newValue.bodies.filter(b => !oldBodyIds.has(b.id));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const getRemovedBodies = (oldValue: Annotation, newValue: Annotation) => {
|
|
11
|
-
const newBodyIds = new Set(newValue.bodies.map(b => b.id));
|
|
12
|
-
return oldValue.bodies.filter(b => !newBodyIds.has(b.id));
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const getChangedBodies = (oldValue: Annotation, newValue: Annotation) =>
|
|
16
|
-
newValue.bodies
|
|
17
|
-
.map(newBody => {
|
|
18
|
-
const oldBody = oldValue.bodies.find(b => b.id === newBody.id);
|
|
19
|
-
return { newBody, oldBody: oldBody && !dequal(oldBody, newBody) ? oldBody : undefined }
|
|
20
|
-
})
|
|
21
|
-
.filter(({ oldBody }) => oldBody);
|
|
22
|
-
|
|
23
|
-
const hasTargetChanged = (oldValue: Annotation, newValue: Annotation) =>
|
|
24
|
-
!dequal(oldValue.target, newValue.target);
|
|
25
|
-
|
|
26
|
-
export const diffAnnotations = <T extends Annotation = Annotation>(oldValue: T, newValue: T): Update<T> => {
|
|
27
|
-
const bodiesCreated = getAddedBodies(oldValue, newValue);
|
|
28
|
-
const bodiesDeleted = getRemovedBodies(oldValue, newValue);
|
|
29
|
-
const bodiesUpdated = getChangedBodies(oldValue, newValue);
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
oldValue,
|
|
33
|
-
newValue,
|
|
34
|
-
bodiesCreated: bodiesCreated.length > 0 ? bodiesCreated : undefined,
|
|
35
|
-
bodiesDeleted: bodiesDeleted.length > 0 ? bodiesDeleted : undefined,
|
|
36
|
-
bodiesUpdated: bodiesUpdated.length > 0 ? bodiesUpdated : undefined,
|
|
37
|
-
targetUpdated: hasTargetChanged(oldValue, newValue) ? { oldTarget: oldValue.target, newTarget: newValue.target } : undefined
|
|
38
|
-
}
|
|
39
|
-
}
|
package/src/vite-env.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/// <reference types="vite/client" />
|