@annotorious/core 3.0.0-rc.3 → 3.0.0-rc.31

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 (94) hide show
  1. package/dist/annotorious-core.es.js +799 -0
  2. package/dist/annotorious-core.es.js.map +1 -0
  3. package/{src/index.ts → dist/index.d.ts} +1 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/lifecycle/Lifecycle.d.ts +11 -0
  6. package/dist/lifecycle/Lifecycle.d.ts.map +1 -0
  7. package/dist/lifecycle/LifecycleEvents.d.ts +13 -0
  8. package/dist/lifecycle/LifecycleEvents.d.ts.map +1 -0
  9. package/dist/lifecycle/index.d.ts +3 -0
  10. package/dist/lifecycle/index.d.ts.map +1 -0
  11. package/dist/model/Annotation.d.ts +34 -0
  12. package/dist/model/Annotation.d.ts.map +1 -0
  13. package/dist/model/AnnotationState.d.ts +8 -0
  14. package/dist/model/AnnotationState.d.ts.map +1 -0
  15. package/dist/model/Annotator.d.ts +67 -0
  16. package/dist/model/Annotator.d.ts.map +1 -0
  17. package/dist/model/DrawingStyle.d.ts +17 -0
  18. package/dist/model/DrawingStyle.d.ts.map +1 -0
  19. package/dist/model/Filter.d.ts +4 -0
  20. package/dist/model/Filter.d.ts.map +1 -0
  21. package/dist/model/FormatAdapter.d.ts +16 -0
  22. package/dist/model/FormatAdapter.d.ts.map +1 -0
  23. package/dist/model/User.d.ts +11 -0
  24. package/dist/model/User.d.ts.map +1 -0
  25. package/dist/model/W3CAnnotation.d.ts +43 -0
  26. package/dist/model/W3CAnnotation.d.ts.map +1 -0
  27. package/{src/model/index.ts → dist/model/index.d.ts} +3 -1
  28. package/dist/model/index.d.ts.map +1 -0
  29. package/dist/presence/Appearance.d.ts +6 -0
  30. package/dist/presence/Appearance.d.ts.map +1 -0
  31. package/dist/presence/AppearanceProvider.d.ts +17 -0
  32. package/dist/presence/AppearanceProvider.d.ts.map +1 -0
  33. package/dist/presence/ColorPalette.d.ts +3 -0
  34. package/dist/presence/ColorPalette.d.ts.map +1 -0
  35. package/dist/presence/PresenceEvents.d.ts +7 -0
  36. package/dist/presence/PresenceEvents.d.ts.map +1 -0
  37. package/dist/presence/PresenceProvider.d.ts +6 -0
  38. package/dist/presence/PresenceProvider.d.ts.map +1 -0
  39. package/dist/presence/PresenceState.d.ts +19 -0
  40. package/dist/presence/PresenceState.d.ts.map +1 -0
  41. package/dist/presence/PresentUser.d.ts +8 -0
  42. package/dist/presence/PresentUser.d.ts.map +1 -0
  43. package/{src/presence/index.ts → dist/presence/index.d.ts} +2 -1
  44. package/dist/presence/index.d.ts.map +1 -0
  45. package/dist/state/Hover.d.ts +10 -0
  46. package/dist/state/Hover.d.ts.map +1 -0
  47. package/dist/state/Selection.d.ts +34 -0
  48. package/dist/state/Selection.d.ts.map +1 -0
  49. package/dist/state/Store.d.ts +35 -0
  50. package/dist/state/Store.d.ts.map +1 -0
  51. package/dist/state/StoreObserver.d.ts +58 -0
  52. package/dist/state/StoreObserver.d.ts.map +1 -0
  53. package/dist/state/SvelteStore.d.ts +23 -0
  54. package/dist/state/SvelteStore.d.ts.map +1 -0
  55. package/dist/state/UndoStack.d.ts +19 -0
  56. package/dist/state/UndoStack.d.ts.map +1 -0
  57. package/dist/state/Viewport.d.ts +6 -0
  58. package/dist/state/Viewport.d.ts.map +1 -0
  59. package/{src/state/index.ts → dist/state/index.d.ts} +2 -1
  60. package/dist/state/index.d.ts.map +1 -0
  61. package/dist/utils/annotationUtils.d.ts +12 -0
  62. package/dist/utils/annotationUtils.d.ts.map +1 -0
  63. package/dist/utils/diffAnnotations.d.ts +5 -0
  64. package/dist/utils/diffAnnotations.d.ts.map +1 -0
  65. package/{src/utils/index.ts → dist/utils/index.d.ts} +1 -1
  66. package/dist/utils/index.d.ts.map +1 -0
  67. package/package.json +20 -17
  68. package/src/lifecycle/Lifecycle.ts +0 -197
  69. package/src/lifecycle/LifecycleEvents.ts +0 -21
  70. package/src/lifecycle/index.ts +0 -2
  71. package/src/model/Annotation.ts +0 -73
  72. package/src/model/Annotator.ts +0 -161
  73. package/src/model/DrawingStyle.ts +0 -19
  74. package/src/model/Filter.ts +0 -3
  75. package/src/model/FormatAdapter.ts +0 -36
  76. package/src/model/User.ts +0 -19
  77. package/src/model/W3CAnnotation.ts +0 -118
  78. package/src/presence/Appearance.ts +0 -9
  79. package/src/presence/AppearanceProvider.ts +0 -53
  80. package/src/presence/ColorPalette.ts +0 -14
  81. package/src/presence/PresenceEvents.ts +0 -9
  82. package/src/presence/PresenceProvider.ts +0 -7
  83. package/src/presence/PresenceState.ts +0 -145
  84. package/src/presence/PresentUser.ts +0 -10
  85. package/src/state/Hover.ts +0 -34
  86. package/src/state/Selection.ts +0 -113
  87. package/src/state/Store.ts +0 -344
  88. package/src/state/StoreObserver.ts +0 -194
  89. package/src/state/SvelteStore.ts +0 -54
  90. package/src/state/UndoStack.ts +0 -112
  91. package/src/state/Viewport.ts +0 -14
  92. package/src/utils/annotationUtils.ts +0 -33
  93. package/src/utils/diffAnnotations.ts +0 -39
  94. package/src/vite-env.d.ts +0 -1
@@ -1,53 +0,0 @@
1
- import type { User } from '../model';
2
- import type { Appearance } from './Appearance';
3
- import type { PresentUser } from './PresentUser';
4
- import { DEFAULT_PALETTE } from './ColorPalette';
5
-
6
- export interface AppearanceProvider {
7
-
8
- addUser(presenceKey: string, user: User): Appearance;
9
-
10
- removeUser(user: PresentUser): void;
11
-
12
- }
13
-
14
- export const defaultColorProvider = () => {
15
-
16
- const unassignedColors = [...DEFAULT_PALETTE];
17
-
18
- const assignRandomColor = () => {
19
- const rnd = Math.floor(Math.random() * unassignedColors.length);
20
- const color = unassignedColors[rnd];
21
-
22
- unassignedColors.splice(rnd, 1);
23
-
24
- return color;
25
- }
26
-
27
- const releaseColor = (color: string) =>
28
- unassignedColors.push(color);
29
-
30
- return { assignRandomColor, releaseColor };
31
-
32
- }
33
-
34
- export const createDefaultAppearenceProvider = () => {
35
-
36
- const colorProvider = defaultColorProvider();
37
-
38
- const addUser = (presenceKey: string, user: User): Appearance => {
39
- const color = colorProvider.assignRandomColor();
40
-
41
- return {
42
- label: user.name || user.id,
43
- avatar: user.avatar,
44
- color
45
- };
46
- }
47
-
48
- const removeUser = (user: PresentUser) =>
49
- colorProvider.releaseColor(user.appearance.color);
50
-
51
- return { addUser, removeUser }
52
-
53
- }
@@ -1,14 +0,0 @@
1
- // SEABORN_BRIGHT
2
- export const DEFAULT_PALETTE: Palette = [
3
- '#ff7c00', // orange
4
- '#1ac938', // green
5
- '#e8000b', // red
6
- '#8b2be2', // purple
7
- '#9f4800', // brown
8
- '#f14cc1', // pink
9
- '#ffc400', // khaki
10
- '#00d7ff', // cyan
11
- '#023eff' // blue
12
- ];
13
-
14
- export type Palette = string[];
@@ -1,9 +0,0 @@
1
- import type { PresentUser } from './PresentUser';
2
-
3
- export interface PresenceEvents {
4
-
5
- presence: (users: PresentUser[]) => void;
6
-
7
- selectionChange: (from: PresentUser, selection: string[] | null) => void;
8
-
9
- }
@@ -1,7 +0,0 @@
1
- import type { PresenceEvents } from './PresenceEvents';
2
-
3
- export interface PresenceProvider {
4
-
5
- on<E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]): void;
6
-
7
- }
@@ -1,145 +0,0 @@
1
- import { nanoid } from 'nanoid';
2
- import { createNanoEvents, type Unsubscribe } from 'nanoevents';
3
- import type { User } from '../model';
4
- import type { PresentUser } from './PresentUser';
5
- import type { PresenceEvents } from './PresenceEvents';
6
- import { createDefaultAppearenceProvider } from './AppearanceProvider';
7
- import type { AppearanceProvider } from './AppearanceProvider';
8
-
9
- export interface PresenceState {
10
-
11
- // Get users currently present to this room
12
- getPresentUsers(): PresentUser[];
13
-
14
- // Notify of a given present user's activity on the given annotations
15
- notifyActivity(presenceKey: string, annotationIds: string[]): void;
16
-
17
- // Add a listener for the given presence event
18
- on<E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]): Unsubscribe;
19
-
20
- // Initial sync - which users are present under which keys
21
- syncUsers(state: { presenceKey: string, user: User }[]): void;
22
-
23
- // Update the selection state for the given prresent user
24
- updateSelection(presenceKey: string, selection: string[] | null): void;
25
-
26
- }
27
-
28
- const isListEqual = (listA: any[], listB: any[]) =>
29
- listA.every(a => listA.includes(a)) && listB.every(b => listA.includes(b));
30
-
31
- // This client's presence key
32
- export const PRESENCE_KEY = nanoid();
33
-
34
- export const createPresenceState = (
35
- appearanceProvider: AppearanceProvider = createDefaultAppearenceProvider()
36
- ): PresenceState => {
37
-
38
- const emitter = createNanoEvents<PresenceEvents>();
39
-
40
- const presentUsers = new Map<string, PresentUser>();
41
-
42
- const selectionStates = new Map<string, string[]>();
43
-
44
- const addUser = (presenceKey: string, user: User) => {
45
- if (presentUsers.has(presenceKey)) {
46
- console.warn('Attempt to add user that is already present', presenceKey, user);
47
- return;
48
- }
49
-
50
- const appearance = appearanceProvider.addUser(presenceKey, user);
51
-
52
- presentUsers.set(presenceKey, {
53
- ...user,
54
- presenceKey,
55
- appearance
56
- });
57
- }
58
-
59
- const removeUser = (presenceKey: string) => {
60
- const user = presentUsers.get(presenceKey);
61
- if (!user) {
62
- console.warn('Attempt to remove user that is not present', presenceKey);
63
- return;
64
- }
65
-
66
- appearanceProvider.removeUser(user);
67
-
68
- presentUsers.delete(presenceKey);
69
- }
70
-
71
- const syncUsers = (state: { presenceKey: string, user: User }[]) => {
72
- // const keys = new Set(others.map(s => s.presenceKey));
73
- const keys = new Set(state.map(s => s.presenceKey));
74
-
75
- // These users need to be added to the presentUsers list
76
- // const toAdd = others.filter(({ presenceKey }) => !presentUsers.has(presenceKey));
77
- const toAdd = state.filter(({ presenceKey }) => !presentUsers.has(presenceKey));
78
-
79
- // These users need to be dropped from the list
80
- const toRemove = Array.from(presentUsers.values()).filter(presentUser =>
81
- !keys.has(presentUser.presenceKey));
82
-
83
- toAdd.forEach(({ presenceKey, user }) => addUser(presenceKey, user));
84
-
85
- toRemove.forEach(user => {
86
- const { presenceKey } = user;
87
-
88
- // If this user has a selection, fire deselect event
89
- if (selectionStates.has(presenceKey))
90
- emitter.emit('selectionChange', user, null);
91
-
92
- removeUser(presenceKey)
93
- });
94
-
95
- if (toAdd.length > 0 || toRemove.length > 0)
96
- emitter.emit('presence', getPresentUsers());
97
- }
98
-
99
- const notifyActivity = (presenceKey: string, annotationIds: string[]) => {
100
- const user = presentUsers.get(presenceKey);
101
-
102
- if (!user) {
103
- console.warn('Activity notification from user that is not present');
104
- return;
105
- }
106
-
107
- const currentSelection = selectionStates.get(presenceKey);
108
-
109
- // Was there a selection change we might have missed?
110
- if (!currentSelection || !isListEqual(currentSelection, annotationIds)) {
111
- selectionStates.set(presenceKey, annotationIds);
112
- emitter.emit('selectionChange', user, annotationIds);
113
- }
114
- }
115
-
116
- const updateSelection = (presenceKey: string, selection: string[] | null) => {
117
- const from = presentUsers.get(presenceKey);
118
- if (!from) {
119
- console.warn('Selection change for user that is not present', presenceKey);
120
- return;
121
- }
122
-
123
- if (selection)
124
- selectionStates.set(presenceKey, selection);
125
- else
126
- selectionStates.delete(presenceKey);
127
-
128
- emitter.emit('selectionChange', from, selection);
129
- }
130
-
131
- const getPresentUsers = () =>
132
- [...Array.from(presentUsers.values())];
133
-
134
- const on = <E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]) =>
135
- emitter.on(event, callback);
136
-
137
- return {
138
- getPresentUsers,
139
- notifyActivity,
140
- on,
141
- syncUsers,
142
- updateSelection
143
- }
144
-
145
- }
@@ -1,10 +0,0 @@
1
- import type { User } from '../model';
2
- import type { Appearance } from './Appearance';
3
-
4
- export interface PresentUser extends User {
5
-
6
- presenceKey: string;
7
-
8
- appearance: Appearance
9
-
10
- }
@@ -1,34 +0,0 @@
1
- import { writable } from 'svelte/store';
2
- import type { Annotation } from '../model';
3
- import type { Store } from './Store';
4
-
5
- export type HoverState<T extends Annotation> = ReturnType<typeof createHoverState<T>>;
6
-
7
- export const createHoverState = <T extends Annotation>(store: Store<T>) => {
8
-
9
- const { subscribe, set } = writable<string>(null);
10
-
11
- let currentHover: string = null;
12
-
13
- subscribe(updated => currentHover = updated);
14
-
15
- // Track store delete and update events
16
- store.observe(( { changes }) => {
17
- if (currentHover) {
18
- const isDeleted = changes.deleted.some(a => a.id === currentHover);
19
- if (isDeleted)
20
- set(null);
21
-
22
- const updated = changes.updated.find(({ oldValue }) => oldValue.id === currentHover);
23
- if (updated)
24
- set(updated.newValue.id);
25
- }
26
- });
27
-
28
- return {
29
- get current() { return currentHover },
30
- subscribe,
31
- set
32
- };
33
-
34
- }
@@ -1,113 +0,0 @@
1
- import { writable } from 'svelte/store';
2
- import type { Annotation } from '../model';
3
- import type { Store } from './Store';
4
-
5
- export type Selection = {
6
-
7
- selected: { id: string, editable?: boolean }[],
8
-
9
- pointerEvent?: PointerEvent;
10
-
11
- }
12
-
13
- export type SelectionState<T extends Annotation> = ReturnType<typeof createSelectionState<T>>;
14
-
15
- export enum PointerSelectAction {
16
-
17
- EDIT = 'EDIT', // Make annotation target(s) editable on pointer select
18
-
19
- SELECT = 'SELECT', // Just select, but don't make editable
20
-
21
- NONE = 'NONE' // Click won't select - annotation is completely inert
22
-
23
- }
24
-
25
- const EMPTY: Selection = { selected: [] };
26
-
27
- export const createSelectionState = <T extends Annotation>(
28
- store: Store<T>,
29
- selectAction: PointerSelectAction | ((a: Annotation) => PointerSelectAction) = PointerSelectAction.EDIT
30
- ) => {
31
- const { subscribe, set } = writable<Selection>(EMPTY);
32
-
33
- let currentSelection: Selection = EMPTY;
34
-
35
- subscribe(updated => currentSelection = updated);
36
-
37
- const clear = () => set(EMPTY);
38
-
39
- const isEmpty = () => currentSelection.selected?.length === 0;
40
-
41
- const isSelected = (annotationOrId: T | string) => {
42
- if (currentSelection.selected.length === 0)
43
- return false;
44
-
45
- const id = typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;
46
- return currentSelection.selected.some(i => i.id === id);
47
- }
48
-
49
- // TODO enable CTRL select
50
- const clickSelect = (id: string, pointerEvent: PointerEvent) => {
51
- const annotation = store.getAnnotation(id);
52
- if (annotation) {
53
- const action = onPointerSelect(annotation, selectAction);
54
- if (action === PointerSelectAction.EDIT)
55
- set({ selected: [{ id, editable: true }], pointerEvent });
56
- else if (action === PointerSelectAction.SELECT)
57
- set({ selected: [{ id }], pointerEvent });
58
- else
59
- set({ selected: [], pointerEvent });
60
- } else {
61
- console.warn('Invalid selection: ' + id);
62
- }
63
- }
64
-
65
- const setSelected = (idOrIds: string | string[], editable: boolean = true) => {
66
- const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];
67
-
68
- // Remove invalid
69
- const annotations =
70
- ids.map(id => store.getAnnotation(id)).filter(a => a);
71
-
72
- set({ selected: annotations.map(({ id }) => ({ id, editable })) });
73
-
74
- if (annotations.length !== ids.length)
75
- console.warn('Invalid selection', idOrIds);
76
- }
77
-
78
- const removeFromSelection = (ids: string[]) => {
79
- if (currentSelection.selected.length === 0)
80
- return false;
81
-
82
- const { selected } = currentSelection;
83
-
84
- // Checks which of the given annotations are actually in the selection
85
- const toRemove = selected.filter(({ id }) => ids.includes(id))
86
-
87
- if (toRemove.length > 0)
88
- set({ selected: selected.filter(({ id }) => !ids.includes(id)) });
89
- }
90
-
91
- // Track store delete and update events
92
- store.observe(({ changes }) =>
93
- removeFromSelection(changes.deleted.map(a => a.id)));
94
-
95
- return {
96
- clear,
97
- clickSelect,
98
- get selected() { return currentSelection ? [...currentSelection.selected ] : null},
99
- get pointerEvent() { return currentSelection ? currentSelection.pointerEvent : null },
100
- isEmpty,
101
- isSelected,
102
- setSelected,
103
- subscribe
104
- };
105
-
106
- }
107
-
108
- export const onPointerSelect = (
109
- annotation: Annotation,
110
- action?: PointerSelectAction | ((a: Annotation) => PointerSelectAction)
111
- ): PointerSelectAction => (typeof action === 'function') ?
112
- (action(annotation) || PointerSelectAction.EDIT) :
113
- (action || PointerSelectAction.EDIT);