@kgdiff/viewer 0.2.0 → 0.4.0
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/README.md +48 -6
- package/dist/controller.d.ts +63 -14
- package/dist/controller.d.ts.map +1 -1
- package/dist/controller.js +308 -54
- package/dist/controller.js.map +1 -1
- package/dist/element.d.ts +17 -4
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +199 -26
- package/dist/element.js.map +1 -1
- package/dist/framing.d.ts +20 -1
- package/dist/framing.d.ts.map +1 -1
- package/dist/framing.js +49 -0
- package/dist/framing.js.map +1 -1
- package/dist/hash-sync.d.ts +4 -2
- package/dist/hash-sync.d.ts.map +1 -1
- package/dist/hash-sync.js +21 -5
- package/dist/hash-sync.js.map +1 -1
- package/dist/i18n.d.ts +7 -7
- package/dist/i18n.d.ts.map +1 -1
- package/dist/i18n.js +14 -14
- package/dist/i18n.js.map +1 -1
- package/dist/index.d.ts +66 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/keyboard.d.ts +6 -4
- package/dist/keyboard.d.ts.map +1 -1
- package/dist/keyboard.js +6 -5
- package/dist/keyboard.js.map +1 -1
- package/dist/prefs.d.ts +13 -1
- package/dist/prefs.d.ts.map +1 -1
- package/dist/prefs.js +30 -3
- package/dist/prefs.js.map +1 -1
- package/dist/standalone/kgdiff-viewer.js +4 -4
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +84 -61
- package/dist/styles.js.map +1 -1
- package/dist/ui/context.d.ts +2 -0
- package/dist/ui/context.d.ts.map +1 -1
- package/dist/ui/context.js.map +1 -1
- package/dist/ui/dock.d.ts +17 -0
- package/dist/ui/dock.d.ts.map +1 -0
- package/dist/ui/dock.js +151 -0
- package/dist/ui/dock.js.map +1 -0
- package/dist/ui/header.d.ts +7 -2
- package/dist/ui/header.d.ts.map +1 -1
- package/dist/ui/header.js +24 -133
- package/dist/ui/header.js.map +1 -1
- package/dist/ui/popovers.d.ts.map +1 -1
- package/dist/ui/popovers.js +3 -2
- package/dist/ui/popovers.js.map +1 -1
- package/dist/ui/sidebar.d.ts.map +1 -1
- package/dist/ui/sidebar.js +2 -1
- package/dist/ui/sidebar.js.map +1 -1
- package/dist/ui/stage.d.ts +8 -0
- package/dist/ui/stage.d.ts.map +1 -1
- package/dist/ui/stage.js +66 -93
- package/dist/ui/stage.js.map +1 -1
- package/dist/ui/swatch.d.ts +7 -0
- package/dist/ui/swatch.d.ts.map +1 -0
- package/dist/ui/swatch.js +26 -0
- package/dist/ui/swatch.js.map +1 -0
- package/package.json +6 -6
- package/src/controller.ts +332 -56
- package/src/element.ts +220 -29
- package/src/framing.ts +65 -1
- package/src/hash-sync.ts +20 -6
- package/src/i18n.ts +15 -14
- package/src/index.ts +65 -7
- package/src/keyboard.ts +12 -6
- package/src/prefs.ts +45 -5
- package/src/styles.ts +84 -61
- package/src/ui/context.ts +2 -0
- package/src/ui/dock.ts +198 -0
- package/src/ui/header.ts +38 -168
- package/src/ui/popovers.ts +3 -2
- package/src/ui/sidebar.ts +2 -1
- package/src/ui/stage.ts +88 -112
- package/src/ui/swatch.ts +31 -0
package/README.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# @kgdiff/viewer
|
|
2
2
|
|
|
3
|
-
`<kgdiff-viewer>`, a framework-agnostic web component for reviewing graph diffs.
|
|
4
|
-
(Overlay, Swipe, Replay
|
|
3
|
+
`<kgdiff-viewer>`, a framework-agnostic web component for reviewing graph diffs. Three ways to
|
|
4
|
+
compare (Overlay, Swipe, Replay), each with or without Changes only, a searchable change list, a detail panel with
|
|
5
5
|
character-level diffs, review progress, deep links, keyboard shortcuts, light and dark themes, and
|
|
6
6
|
an English and Chinese UI.
|
|
7
7
|
|
|
@@ -37,10 +37,52 @@ ESM only. Runs in evergreen browsers.
|
|
|
37
37
|
self-contained script that defines the element and shows embedded payloads. The optional
|
|
38
38
|
`@kgdiff/viewer/standalone/compute` add-on brings the diff engine and force layout for `load()`.
|
|
39
39
|
|
|
40
|
-
Attributes: `mode` (`overlay` | `swipe` | `replay` | `changes`), `theme`,
|
|
41
|
-
`sidebar`, `sync-hash`, `global-shortcuts
|
|
42
|
-
`
|
|
43
|
-
`
|
|
40
|
+
Attributes: `mode` (`overlay` | `swipe` | `replay`), `scope` (`all` | `changes`), `theme`,
|
|
41
|
+
`palette`, `locale`, `sidebar`, `sync-hash`, `global-shortcuts`, `header`, `chrome`, `legend`,
|
|
42
|
+
`loop`, `loop-delay`, `pause-on-hover`. The legacy `mode="changes"` still works: it means
|
|
43
|
+
`overlay` with `scope="changes"`. Methods: `load`, `selectHunk`, `next`, `prev`, `play`, `pause`, `fit`,
|
|
44
|
+
`exportDelta`, `reviewState`, `setReviewed`. Events: `kgdiff-ready`, `kgdiff-select`,
|
|
45
|
+
`kgdiff-mode`, `kgdiff-review`, `kgdiff-error`, `kgdiff-replay-end`.
|
|
46
|
+
|
|
47
|
+
## Embed a small looping replay
|
|
48
|
+
|
|
49
|
+
To show a graph's changes as a small strip on another page, leave the review UI out and let the
|
|
50
|
+
replay loop:
|
|
51
|
+
|
|
52
|
+
```html
|
|
53
|
+
<kgdiff-viewer mode="replay" chrome="none" loop style="height: 320px"></kgdiff-viewer>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
| Attribute (property) | Values | Default |
|
|
57
|
+
| --------------------------------- | ------------------------------ | ------------------------------------------------ |
|
|
58
|
+
| `chrome` (`chrome`) | `full`, `none` | `full` |
|
|
59
|
+
| `legend` (`legend`) | `auto`, `full`, `mini`, `none` | `auto`: `full`, or `mini` with `chrome="none"` |
|
|
60
|
+
| `loop` (`loop`) | boolean | off |
|
|
61
|
+
| `loop-delay` (`loopDelay`) | ms between the end and restart | `1200` |
|
|
62
|
+
| `pause-on-hover` (`pauseOnHover`) | `false` to keep playing | on: a looping replay pauses under a mouse or pen |
|
|
63
|
+
|
|
64
|
+
- `chrome="none"` shows the graph alone: no title, actions (theme, help, sidebar button), view
|
|
65
|
+
dock (with its step caption, playback bar and finished card), change list, zoom buttons,
|
|
66
|
+
minimap or legend card. The hover tooltip stays, and the legend becomes one line with the families this
|
|
67
|
+
diff has, then unchanged. Clicks and keyboard shortcuts do nothing. The minimum height drops
|
|
68
|
+
from 420px to 120px. The view stays fitted: when the canvas is resized (unless the user
|
|
69
|
+
panned or zoomed since) and at the start of every loop. Labels are never cut at the edge: one
|
|
70
|
+
pushed from its spot by a neighbour moves inside the canvas or is left out (the tooltip
|
|
71
|
+
still names it).
|
|
72
|
+
- `loop` plays the replay by itself (in `replay` mode) and starts it again `loop-delay` ms after
|
|
73
|
+
it ends. `pause()` stops it until `play()`; a new diff starts it again.
|
|
74
|
+
- `kgdiff-replay-end` fires each time playback reaches the end, with `detail.loop` telling
|
|
75
|
+
whether it will start again. Set `loop = false` or call `pause()` in the listener to stop
|
|
76
|
+
there.
|
|
77
|
+
- `fit({ padding })` fits the graph with its labels into view, keeping `padding` px around them
|
|
78
|
+
(default 24, kept for the later automatic fits); `fit({ animate: false })` jumps.
|
|
79
|
+
|
|
80
|
+
```js
|
|
81
|
+
let rounds = 0;
|
|
82
|
+
viewer.addEventListener('kgdiff-replay-end', (event) => {
|
|
83
|
+
if (event.detail.loop && ++rounds === 3) viewer.loop = false; // three rounds, then stop
|
|
84
|
+
});
|
|
85
|
+
```
|
|
44
86
|
|
|
45
87
|
## Learn more
|
|
46
88
|
|
package/dist/controller.d.ts
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* Viewer state and orchestration, independent of the UI:
|
|
3
3
|
*
|
|
4
4
|
* - load pipeline with progress steps (sources or a precomputed report);
|
|
5
|
-
* - mode, selection (with an animated spotlight `emphasis`), family filters,
|
|
6
|
-
*
|
|
5
|
+
* - view (mode × scope), selection (with an animated spotlight `emphasis`), family filters,
|
|
6
|
+
* review progress;
|
|
7
|
+
* - the `changes` scope's focus with expandable collapsed groups (`extendLayout` + scene rebuild);
|
|
7
8
|
* - replay clock driven by one requestAnimationFrame loop that sleeps when idle, with a camera
|
|
8
9
|
* that follows the playing hunk / chapter unless the user moved it in the last 2 s;
|
|
9
10
|
* - swipe position, hover, theme / palette / locale (rebuilding the scene when they change).
|
|
@@ -12,24 +13,32 @@
|
|
|
12
13
|
*/
|
|
13
14
|
import type { DiffResult, DiffStats, Locale, Rect, UnionId } from '@kgdiff/core';
|
|
14
15
|
import type { LayoutResult } from '@kgdiff/layout';
|
|
15
|
-
import type
|
|
16
|
+
import { type Camera } from '@kgdiff/renderer';
|
|
16
17
|
import { type ChangeFamily, type FocusState, type PaletteName, type Scene, type Theme, type ThemeName, type VisualResolver } from '@kgdiff/scene';
|
|
17
18
|
import { type ChromeLayout } from './framing.js';
|
|
18
|
-
import type { LoadOptions, ReportPayload, ReviewState, ThemePreference, ViewerMode } from './index.js';
|
|
19
|
+
import type { LoadOptions, ReportPayload, ReviewState, ThemePreference, ViewerMode, ViewerScope } from './index.js';
|
|
19
20
|
import { type ListModel } from './list-model.js';
|
|
20
21
|
import { type LoadedDiff, type LoadStep } from './pipeline.js';
|
|
22
|
+
import { LEGACY_CHANGES_MODE } from './prefs.js';
|
|
21
23
|
import { ReplayClock } from './replay.js';
|
|
22
24
|
import { type StorageLike } from './review-store.js';
|
|
23
25
|
import { type SearchHit } from './search.js';
|
|
24
26
|
export type Status = 'idle' | 'loading' | 'ready' | 'error';
|
|
25
|
-
export type Topic = 'status' | 'data' | 'mode' | 'selection' | 'filters' | 'review' | 'replay' | 'hover' | 'theme' | 'locale' | 'focus' | 'swipe';
|
|
27
|
+
export type Topic = 'status' | 'data' | 'mode' | 'selection' | 'filters' | 'review' | 'replay' | 'hover' | 'theme' | 'locale' | 'focus' | 'swipe' | 'overview';
|
|
26
28
|
export interface ControllerHost {
|
|
27
29
|
ready(stats: DiffStats): void;
|
|
28
30
|
select(hunk: string | null, node: string | null): void;
|
|
29
|
-
mode(mode: ViewerMode): void;
|
|
31
|
+
mode(mode: ViewerMode, scope: ViewerScope): void;
|
|
30
32
|
review(hunk: string, reviewed: boolean, progress: ReviewState): void;
|
|
31
33
|
error(error: Error): void;
|
|
32
34
|
announce(text: string): void;
|
|
35
|
+
/** Playback reached the end of the replay; `loop`: it starts again after the loop delay. */
|
|
36
|
+
replayEnd(loop: boolean): void;
|
|
37
|
+
}
|
|
38
|
+
export interface FitOptions {
|
|
39
|
+
readonly animate?: boolean;
|
|
40
|
+
/** Room around the content, px (default `FRAME_PADDING`); kept for later automatic fits. */
|
|
41
|
+
readonly padding?: number;
|
|
33
42
|
}
|
|
34
43
|
export interface ControllerDeps {
|
|
35
44
|
readonly now: () => number;
|
|
@@ -39,7 +48,7 @@ export interface ControllerDeps {
|
|
|
39
48
|
readonly yieldToPaint: () => Promise<void>;
|
|
40
49
|
readonly storage: StorageLike | null;
|
|
41
50
|
}
|
|
42
|
-
export type Preference = 'mode' | 'theme' | 'palette' | 'locale';
|
|
51
|
+
export type Preference = 'mode' | 'scope' | 'theme' | 'palette' | 'locale';
|
|
43
52
|
/** Camera follow is suppressed this long after the user moved the camera (ms). */
|
|
44
53
|
export declare const USER_CAMERA_GRACE = 2000;
|
|
45
54
|
/** The camera follows when less than this share of the target bounds is in view. */
|
|
@@ -48,6 +57,8 @@ export declare const FOLLOW_COVERAGE = 0.7;
|
|
|
48
57
|
export declare const FLY_MAX_ZOOM = 1.8;
|
|
49
58
|
/** Fitting everything never zooms in further (the renderer's default). */
|
|
50
59
|
export declare const FIT_MAX_ZOOM = 2.5;
|
|
60
|
+
/** Everything counts as in view (the minimap hides) from this share of the content bounds on. */
|
|
61
|
+
export declare const OVERVIEW_COVERAGE = 0.98;
|
|
51
62
|
/** Share of `bounds` inside `view`, in [0, 1]. */
|
|
52
63
|
export declare function coverage(bounds: Rect, view: Rect): number;
|
|
53
64
|
export declare class ViewerController {
|
|
@@ -63,6 +74,7 @@ export declare class ViewerController {
|
|
|
63
74
|
resolver: VisualResolver | null;
|
|
64
75
|
list: ListModel;
|
|
65
76
|
mode: ViewerMode;
|
|
77
|
+
scope: ViewerScope;
|
|
66
78
|
themePreference: ThemePreference;
|
|
67
79
|
palette: PaletteName;
|
|
68
80
|
locale: Locale;
|
|
@@ -84,6 +96,15 @@ export declare class ViewerController {
|
|
|
84
96
|
clock: ReplayClock | null;
|
|
85
97
|
split: number;
|
|
86
98
|
emphasis: number;
|
|
99
|
+
/**
|
|
100
|
+
* Keep the view fitted (embeds without controls): fit again when the canvas is resized unless
|
|
101
|
+
* the user moved the camera since, and at the start of every loop.
|
|
102
|
+
*/
|
|
103
|
+
autoFit: boolean;
|
|
104
|
+
/** Canvas clicks select (and double clicks fly); off for embeds without controls. */
|
|
105
|
+
selectOnClick: boolean;
|
|
106
|
+
/** The whole content is in view (the minimap has nothing to add). */
|
|
107
|
+
overview: boolean;
|
|
87
108
|
constructor(host: ControllerHost, deps: ControllerDeps);
|
|
88
109
|
subscribe(listener: (topics: ReadonlySet<Topic>) => void): () => void;
|
|
89
110
|
/** Deliver pending notifications now (also used by tests). */
|
|
@@ -108,7 +129,15 @@ export declare class ViewerController {
|
|
|
108
129
|
* Every fit and flight frames its target in the free part of the canvas (`framing.ts`).
|
|
109
130
|
*/
|
|
110
131
|
setChrome(provider: (() => ChromeLayout) | null): void;
|
|
111
|
-
/**
|
|
132
|
+
/**
|
|
133
|
+
* Keep labels whole inside the canvas (embeds without camera controls): a label pushed from
|
|
134
|
+
* its spot by a neighbour moves inside or is left out, never cut at the edge.
|
|
135
|
+
*/
|
|
136
|
+
setLabelsInside(inside: boolean): void;
|
|
137
|
+
/**
|
|
138
|
+
* The canvas was laid out or resized: run the initial fit a new diff is waiting for, or (with
|
|
139
|
+
* `autoFit`) fit again unless the user moved the camera since the last fit.
|
|
140
|
+
*/
|
|
112
141
|
layoutChanged(): void;
|
|
113
142
|
/** The user panned / zoomed: suspend replay camera follow for `USER_CAMERA_GRACE`. */
|
|
114
143
|
noteUserCamera(): void;
|
|
@@ -116,7 +145,16 @@ export declare class ViewerController {
|
|
|
116
145
|
invalidate(): void;
|
|
117
146
|
/** Resolve the current view and hand it to the renderer (and the minimap). */
|
|
118
147
|
draw(now?: number): void;
|
|
119
|
-
|
|
148
|
+
/** Whether the scope is fixed to `changes` (the layout covers only the changes). */
|
|
149
|
+
get scopeLocked(): boolean;
|
|
150
|
+
/** Switch how the versions are compared. The legacy `changes` means overlay + `changes` scope. */
|
|
151
|
+
setMode(value: ViewerMode | typeof LEGACY_CHANGES_MODE): void;
|
|
152
|
+
/** Show the whole graph or only the changes, in any mode. */
|
|
153
|
+
setScope(value: ViewerScope): void;
|
|
154
|
+
/** Toggle the `changes` scope (key `4`); says why when the scope is locked. */
|
|
155
|
+
toggleScope(): void;
|
|
156
|
+
/** Set mode and scope together (one notification, one `kgdiff-mode` event). */
|
|
157
|
+
setView(mode: ViewerMode, scope: ViewerScope): void;
|
|
120
158
|
selectHunkById(id: string | null, options?: {
|
|
121
159
|
fly?: boolean;
|
|
122
160
|
}): void;
|
|
@@ -143,12 +181,10 @@ export declare class ViewerController {
|
|
|
143
181
|
flyToNode(i: number): void;
|
|
144
182
|
flyToSelection(): void;
|
|
145
183
|
/**
|
|
146
|
-
* Fit everything visible (the focus in changes-only mode) into the free part
|
|
147
|
-
* Before the canvas is laid out it falls back to the renderer's own fit.
|
|
184
|
+
* Fit everything visible (the focus in changes-only mode), labels included, into the free part
|
|
185
|
+
* of the canvas. Before the canvas is laid out it falls back to the renderer's own fit.
|
|
148
186
|
*/
|
|
149
|
-
fit(options?:
|
|
150
|
-
readonly animate?: boolean;
|
|
151
|
-
}): Promise<void>;
|
|
187
|
+
fit(options?: FitOptions): Promise<void>;
|
|
152
188
|
zoom(direction: 1 | -1): void;
|
|
153
189
|
/** Clear hover state (pointer left the canvas). */
|
|
154
190
|
clearHover(): void;
|
|
@@ -178,8 +214,21 @@ export declare class ViewerController {
|
|
|
178
214
|
/** Bring a union node into the scene and the focus (search results), then select it. */
|
|
179
215
|
revealNode(id: UnionId): Promise<void>;
|
|
180
216
|
play(): void;
|
|
217
|
+
/** Pause; a looping replay stays paused (until `play`, a new diff or loop turned on again). */
|
|
181
218
|
pause(): void;
|
|
182
219
|
togglePlay(): void;
|
|
220
|
+
/**
|
|
221
|
+
* Play the replay over and over: `delay` ms after it ends it starts again; null plays it
|
|
222
|
+
* once. Turning the loop on starts a replay that is shown but not playing.
|
|
223
|
+
*/
|
|
224
|
+
setLoop(delay: number | null): void;
|
|
225
|
+
get loopDelay(): number | null;
|
|
226
|
+
/**
|
|
227
|
+
* Hold playback while the pointer rests on the graph (`pause-on-hover`): a playing replay
|
|
228
|
+
* pauses and continues on release; a pending loop restart waits for the release, then the
|
|
229
|
+
* full loop delay.
|
|
230
|
+
*/
|
|
231
|
+
hold(held: boolean): void;
|
|
183
232
|
seek(t: number): void;
|
|
184
233
|
stepReplay(direction: 1 | -1): void;
|
|
185
234
|
restart(): void;
|
package/dist/controller.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../src/controller.ts"],"names":[],"mappings":"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"}
|