@kgdiff/viewer 0.4.0 → 0.5.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.
Files changed (84) hide show
  1. package/dist/context.d.ts +42 -0
  2. package/dist/context.d.ts.map +1 -0
  3. package/dist/context.js +87 -0
  4. package/dist/context.js.map +1 -0
  5. package/dist/controller.d.ts +26 -185
  6. package/dist/controller.d.ts.map +1 -1
  7. package/dist/controller.js +45 -1155
  8. package/dist/controller.js.map +1 -1
  9. package/dist/element.d.ts +6 -3
  10. package/dist/element.d.ts.map +1 -1
  11. package/dist/element.js +49 -229
  12. package/dist/element.js.map +1 -1
  13. package/dist/index.d.ts +3 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/pipeline.d.ts.map +1 -1
  17. package/dist/pipeline.js +3 -2
  18. package/dist/pipeline.js.map +1 -1
  19. package/dist/root.d.ts +54 -0
  20. package/dist/root.d.ts.map +1 -0
  21. package/dist/root.js +265 -0
  22. package/dist/root.js.map +1 -0
  23. package/dist/schedule.d.ts +22 -0
  24. package/dist/schedule.d.ts.map +1 -0
  25. package/dist/schedule.js +41 -0
  26. package/dist/schedule.js.map +1 -0
  27. package/dist/session.d.ts +253 -0
  28. package/dist/session.d.ts.map +1 -0
  29. package/dist/session.js +1239 -0
  30. package/dist/session.js.map +1 -0
  31. package/dist/standalone/kgdiff-viewer-compute.js +1 -1
  32. package/dist/standalone/kgdiff-viewer.js +4 -4
  33. package/dist/styles.d.ts +13 -6
  34. package/dist/styles.d.ts.map +1 -1
  35. package/dist/styles.js +217 -248
  36. package/dist/styles.js.map +1 -1
  37. package/dist/theme.d.ts +25 -0
  38. package/dist/theme.d.ts.map +1 -0
  39. package/dist/theme.js +149 -0
  40. package/dist/theme.js.map +1 -0
  41. package/dist/ui/change-list.d.ts +18 -0
  42. package/dist/ui/change-list.d.ts.map +1 -0
  43. package/dist/ui/change-list.js +331 -0
  44. package/dist/ui/change-list.js.map +1 -0
  45. package/dist/ui/context.d.ts +19 -5
  46. package/dist/ui/context.d.ts.map +1 -1
  47. package/dist/ui/context.js.map +1 -1
  48. package/dist/ui/filters.d.ts +9 -0
  49. package/dist/ui/filters.d.ts.map +1 -0
  50. package/dist/ui/filters.js +68 -0
  51. package/dist/ui/filters.js.map +1 -0
  52. package/dist/ui/header.js +2 -2
  53. package/dist/ui/header.js.map +1 -1
  54. package/dist/ui/search.d.ts +13 -0
  55. package/dist/ui/search.d.ts.map +1 -0
  56. package/dist/ui/search.js +191 -0
  57. package/dist/ui/search.js.map +1 -0
  58. package/dist/ui/sidebar.d.ts +8 -16
  59. package/dist/ui/sidebar.d.ts.map +1 -1
  60. package/dist/ui/sidebar.js +15 -539
  61. package/dist/ui/sidebar.js.map +1 -1
  62. package/dist/ui/stage.js +1 -1
  63. package/dist/ui/stage.js.map +1 -1
  64. package/dist/ui/swatch.js +1 -1
  65. package/dist/ui/swatch.js.map +1 -1
  66. package/package.json +6 -6
  67. package/src/context.ts +106 -0
  68. package/src/controller.ts +70 -1257
  69. package/src/element.ts +52 -243
  70. package/src/index.ts +3 -1
  71. package/src/pipeline.ts +4 -1
  72. package/src/root.ts +308 -0
  73. package/src/schedule.ts +43 -0
  74. package/src/session.ts +1386 -0
  75. package/src/styles.ts +225 -253
  76. package/src/theme.ts +167 -0
  77. package/src/ui/change-list.ts +401 -0
  78. package/src/ui/context.ts +21 -5
  79. package/src/ui/filters.ts +79 -0
  80. package/src/ui/header.ts +2 -2
  81. package/src/ui/search.ts +220 -0
  82. package/src/ui/sidebar.ts +28 -668
  83. package/src/ui/stage.ts +1 -1
  84. package/src/ui/swatch.ts +1 -1
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Frames (RFC 0001 §1, Scheduling).
3
+ *
4
+ * The session's frame loop runs on animation frames only (`requestFrame`). It pauses where the
5
+ * browser pauses them, so a looping replay in a background tab costs nothing, and under load it
6
+ * never draws a frame that is not presented.
7
+ *
8
+ * One-off work that must not wait forever races a frame against a timer (`frameOrTimeout`):
9
+ * the loading steps and the change list's window. A hidden embedding container (an inactive
10
+ * tab panel, a collapsed notebook output, a background pane) can pause animation frames without
11
+ * the page reporting itself hidden; with frames alone, loading stalled there.
12
+ */
13
+ /** One-off work waits at most this long for a frame (ms). */
14
+ export const FRAME_TIMEOUT = 32;
15
+ /** The next animation frame (0, and no call, where there are none). */
16
+ export function requestFrame(cb) {
17
+ return typeof requestAnimationFrame === 'function' ? requestAnimationFrame(cb) : 0;
18
+ }
19
+ export function cancelFrame(id) {
20
+ if (typeof cancelAnimationFrame === 'function')
21
+ cancelAnimationFrame(id);
22
+ }
23
+ /** Call `cb` once: on the next animation frame, or after `FRAME_TIMEOUT` ms if none came. */
24
+ export function frameOrTimeout(cb) {
25
+ let done = false;
26
+ const run = () => {
27
+ if (done)
28
+ return;
29
+ done = true;
30
+ cancelFrame(raf);
31
+ clearTimeout(timer);
32
+ cb();
33
+ };
34
+ const timer = setTimeout(run, FRAME_TIMEOUT);
35
+ const raf = requestFrame(run);
36
+ }
37
+ /** Resolve once the browser had a chance to paint (between loading steps). */
38
+ export function nextPaint() {
39
+ return new Promise((resolve) => frameOrTimeout(() => setTimeout(resolve, 0)));
40
+ }
41
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAEhC,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,EAA0B;IACrD,OAAO,OAAO,qBAAqB,KAAK,UAAU,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,IAAI,OAAO,oBAAoB,KAAK,UAAU;QAAE,oBAAoB,CAAC,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,6FAA6F;AAC7F,MAAM,UAAU,cAAc,CAAC,EAAc;IAC3C,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,GAAG,GAAG,GAAS,EAAE;QACrB,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,WAAW,CAAC,GAAG,CAAC,CAAC;QACjB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,EAAE,EAAE,CAAC;IACP,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,SAAS;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,CAAC"}
@@ -0,0 +1,253 @@
1
+ /**
2
+ * The diff session (RFC 0001 §1): everything about one loaded diff that does not depend on how
3
+ * it is drawn.
4
+ *
5
+ * - load pipeline with progress steps (sources or a precomputed report);
6
+ * - view (mode × scope), selection (with an animated spotlight `emphasis`), hover, family
7
+ * filters, the node search query and its hits, review progress;
8
+ * - the `changes` scope's focus with expandable collapsed groups (`extendLayout` + scene rebuild);
9
+ * - replay clock and loop, swipe position, theme / palette / locale (rebuilding the scene when
10
+ * they change), and the events reported to the host.
11
+ *
12
+ * No DOM, no renderer: the views that draw the session (`SessionView`: the canvas with its
13
+ * camera, framing and minimap) are told what to draw and what to bring into view. One frame loop
14
+ * advances the replay clock and the emphasis and lets the views draw; it sleeps when idle.
15
+ * Listeners subscribe to topic notifications (batched per microtask) and read public fields.
16
+ */
17
+ import type { DiffResult, DiffStats, Locale, Rect, UnionId } from '@kgdiff/core';
18
+ import type { LayoutResult } from '@kgdiff/layout';
19
+ import { type ChangeFamily, type FocusState, type Layer, type PaletteName, type Scene, type Theme, type ThemeName, type ViewState, type VisualResolver } from '@kgdiff/scene';
20
+ import type { LoadOptions, ReportPayload, ReviewState, ThemePreference, ViewerMode, ViewerScope } from './index.js';
21
+ import { type ListModel } from './list-model.js';
22
+ import { type LoadedDiff, type LoadStep } from './pipeline.js';
23
+ import { LEGACY_CHANGES_MODE } from './prefs.js';
24
+ import { ReplayClock } from './replay.js';
25
+ import { type StorageLike } from './review-store.js';
26
+ import { type SearchHit } from './search.js';
27
+ export type Status = 'idle' | 'loading' | 'ready' | 'error';
28
+ export type Topic = 'status' | 'data' | 'mode' | 'selection' | 'filters' | 'search' | 'review' | 'replay' | 'hover' | 'theme' | 'locale' | 'focus' | 'swipe' | 'overview';
29
+ /** Every topic: a full render. */
30
+ export declare const ALL_TOPICS: ReadonlySet<Topic>;
31
+ /** What the session reports (`<kgdiff-viewer>` turns these into events and announcements). */
32
+ export interface SessionHost {
33
+ ready(stats: DiffStats): void;
34
+ select(hunk: string | null, node: string | null): void;
35
+ mode(mode: ViewerMode, scope: ViewerScope): void;
36
+ review(hunk: string, reviewed: boolean, progress: ReviewState): void;
37
+ error(error: Error): void;
38
+ announce(text: string): void;
39
+ /** Playback reached the end of the replay; `loop`: it starts again after the loop delay. */
40
+ replayEnd(loop: boolean): void;
41
+ }
42
+ export interface SessionDeps {
43
+ readonly now: () => number;
44
+ readonly requestFrame: (cb: (time: number) => void) => number;
45
+ readonly cancelFrame: (id: number) => void;
46
+ /** Resolves once the browser had a chance to paint (between loading steps). */
47
+ readonly yieldToPaint: () => Promise<void>;
48
+ readonly storage: StorageLike | null;
49
+ /**
50
+ * The theme to draw with, given the built-in one for the current theme and palette. A root
51
+ * builds it from its computed CSS tokens (the theme's source of truth); without it the
52
+ * built-in theme is used as it is.
53
+ */
54
+ readonly theme?: (base: Theme) => Theme;
55
+ }
56
+ /**
57
+ * A view of the session: something that draws it (the canvas, with its camera, framing and
58
+ * minimap). The session tells its views what changed and what to bring into view; how they
59
+ * draw and frame it is theirs.
60
+ */
61
+ export interface SessionView {
62
+ /** Draw the session's current state (from the frame loop, when something changed). */
63
+ draw(now: number): void;
64
+ /** The scene was rebuilt, or the theme changed without a scene. */
65
+ sceneChanged(): void;
66
+ /** A new diff was installed: frame it once laid out. */
67
+ installed(): void;
68
+ /** What is drawn changed (mode, scope, focus, filters). */
69
+ drawnChanged(): void;
70
+ /** Bring `bounds` (world coordinates) into view. */
71
+ show(bounds: Rect): void;
72
+ /** Replay follows `bounds`: bring it into view unless it mostly is, or the user steered. */
73
+ follow(bounds: Rect): void;
74
+ /** A looping replay started again. */
75
+ looped(): void;
76
+ /** The world region in view, or null before layout. */
77
+ viewport(): Rect | null;
78
+ }
79
+ export type Preference = 'mode' | 'scope' | 'theme' | 'palette' | 'locale';
80
+ /** Search hits kept for a query. */
81
+ export declare const SEARCH_LIMIT = 50;
82
+ export declare class DiffSession {
83
+ #private;
84
+ status: Status;
85
+ /** Steps of the current load, in order; `step` is the running one. */
86
+ steps: LoadStep[];
87
+ step: LoadStep | null;
88
+ error: Error | null;
89
+ data: LoadedDiff | null;
90
+ layout: LayoutResult | null;
91
+ scene: Scene | null;
92
+ resolver: VisualResolver | null;
93
+ list: ListModel;
94
+ mode: ViewerMode;
95
+ scope: ViewerScope;
96
+ themePreference: ThemePreference;
97
+ palette: PaletteName;
98
+ locale: Locale;
99
+ systemDark: boolean;
100
+ reducedMotion: boolean;
101
+ /** Preferences set explicitly by the embedder (a report's `view` does not override them). */
102
+ readonly explicit: Set<Preference>;
103
+ selectedHunk: number;
104
+ selectedNode: number;
105
+ /** An edge emphasized from the detail panel (drawn as hovered). */
106
+ pinnedEdge: number;
107
+ hoverNode: number;
108
+ hoverEdge: number;
109
+ hoverGroup: number;
110
+ readonly families: Set<ChangeFamily>;
111
+ /** The node search as typed; while it is not blank, `hits` replace the change list. */
112
+ query: string;
113
+ hits: readonly SearchHit[];
114
+ hops: number;
115
+ readonly expanded: Set<string>;
116
+ focus: FocusState | null;
117
+ clock: ReplayClock | null;
118
+ split: number;
119
+ emphasis: number;
120
+ constructor(host: SessionHost, deps: SessionDeps);
121
+ subscribe(listener: (topics: ReadonlySet<Topic>) => void): () => void;
122
+ /** @internal Queue a notification (views report what they derive, e.g. `overview`). */
123
+ notify(...topics: Topic[]): void;
124
+ /** Deliver pending notifications now (also used by tests). */
125
+ flush(): void;
126
+ /** Draw on `view` from now on; returns the function that stops it. */
127
+ addView(view: SessionView): () => void;
128
+ get themeName(): ThemeName;
129
+ /** The theme to draw with: the built-in one for theme and palette, as the root's CSS says. */
130
+ get theme(): Theme;
131
+ get diff(): DiffResult | null;
132
+ get hunkCount(): number;
133
+ isReviewed(hunkId: string): boolean;
134
+ reviewState(): ReviewState;
135
+ search(query: string, limit?: number): SearchHit[];
136
+ /** Search the nodes for `query`; delivered at once, so the results follow every keystroke. */
137
+ setQuery(query: string): void;
138
+ load(options: LoadOptions): Promise<void>;
139
+ loadPayload(payload: ReportPayload): Promise<void>;
140
+ /** Show an error state (bad payload, failed load). */
141
+ fail(error: Error): void;
142
+ destroy(): void;
143
+ /** Redraw on the next frame. */
144
+ invalidate(): void;
145
+ /** @internal Drop the pending frame (the views are gone); `invalidate` wakes the loop. */
146
+ sleep(): void;
147
+ /** What a view draws for `layer` now. */
148
+ viewState(layer: Layer): ViewState;
149
+ /** Whether the scope is fixed to `changes` (the layout covers only the changes). */
150
+ get scopeLocked(): boolean;
151
+ /** Switch how the versions are compared. The legacy `changes` means overlay + `changes` scope. */
152
+ setMode(value: ViewerMode | typeof LEGACY_CHANGES_MODE): void;
153
+ /** Show the whole graph or only the changes, in any mode. */
154
+ setScope(value: ViewerScope): void;
155
+ /** Toggle the `changes` scope (key `4`); says why when the scope is locked. */
156
+ toggleScope(): void;
157
+ /** Set mode and scope together (one notification, one `kgdiff-mode` event). */
158
+ setView(mode: ViewerMode, scope: ViewerScope): void;
159
+ selectHunkById(id: string | null, options?: {
160
+ fly?: boolean;
161
+ }): void;
162
+ /**
163
+ * Select hunk `h` (scene index; -1 clears). `node` focuses one of its nodes in the detail
164
+ * panel. `fly` (default true) brings it into view. In replay, seeks to the end of its window.
165
+ */
166
+ selectHunk(h: number, options?: {
167
+ fly?: boolean;
168
+ node?: number;
169
+ }): void;
170
+ /** Select a node: its hunk when it has one, else the node itself. */
171
+ selectNode(i: number, options?: {
172
+ fly?: boolean;
173
+ }): void;
174
+ clearSelection(): void;
175
+ next(): void;
176
+ prev(): void;
177
+ first(): void;
178
+ last(): void;
179
+ /** Emphasize an edge (from the detail panel) and fly to it. */
180
+ pinEdge(j: number): void;
181
+ setHover(node: number, edge: number, group: number): void;
182
+ /** Clear hover state (pointer left the canvas). */
183
+ clearHover(): void;
184
+ /** Where the current selection is (world coordinates), or null. */
185
+ selectionBounds(): Rect | null;
186
+ flyToHunk(h: number): void;
187
+ flyToNode(i: number): void;
188
+ flyToSelection(): void;
189
+ toggleFamily(family: ChangeFamily): void;
190
+ /** Replace the family filter (empty = all). Setting the current set again clears it. */
191
+ setFamilies(families: readonly ChangeFamily[]): void;
192
+ setHops(hops: number): void;
193
+ /**
194
+ * Expand collapsed group `index` of the current focus: its in-scene members become visible
195
+ * and, for a `changes`-scoped layout, the neighbours left out of the layout are placed with
196
+ * `extendLayout` (nothing already placed moves) and the scene is rebuilt.
197
+ */
198
+ expandGroup(index: number): void;
199
+ /**
200
+ * The collapsed group nearest the selection (else the view center), or -1. Groups that can
201
+ * be expanded at least partly come first.
202
+ */
203
+ nearestGroup(): number;
204
+ /** Expand the group nearest the selection (keyboard `e`); announces what happened. */
205
+ expandNearest(): void;
206
+ /**
207
+ * Whether collapsed group `index` can be expanded completely: always, unless some members lie
208
+ * outside a `changes`-scoped layout and the layout engine is known to be unavailable
209
+ * (standalone report without the compute add-on).
210
+ */
211
+ canExpand(index: number): boolean;
212
+ /** Bring a union node into the scene and the focus (search results), then select it. */
213
+ revealNode(id: UnionId): Promise<void>;
214
+ play(): void;
215
+ /** Pause; a looping replay stays paused (until `play`, a new diff or loop turned on again). */
216
+ pause(): void;
217
+ togglePlay(): void;
218
+ /**
219
+ * Play the replay over and over: `delay` ms after it ends it starts again; null plays it
220
+ * once. Turning the loop on starts a replay that is shown but not playing.
221
+ */
222
+ setLoop(delay: number | null): void;
223
+ get loopDelay(): number | null;
224
+ /**
225
+ * Hold playback while the pointer rests on the graph (`pause-on-hover`): a playing replay
226
+ * pauses and continues on release; a pending loop restart waits for the release, then the
227
+ * full loop delay.
228
+ */
229
+ hold(held: boolean): void;
230
+ seek(t: number): void;
231
+ stepReplay(direction: 1 | -1): void;
232
+ restart(): void;
233
+ cycleSpeed(): void;
234
+ setSpeed(speed: number): void;
235
+ setSplit(split: number): void;
236
+ setReviewed(hunkId: string, reviewed: boolean): void;
237
+ /** Another tab changed review progress (`storage` event): re-read it. */
238
+ syncReview(key: string | null): void;
239
+ toggleReviewed(hunkId?: string): void;
240
+ /**
241
+ * @internal Read the theme again (`SessionDeps.theme`: the root's CSS tokens changed, e.g.
242
+ * the host overrode one); redraws only when the result changed.
243
+ */
244
+ refreshTheme(): void;
245
+ setThemePreference(pref: ThemePreference): void;
246
+ setPalette(palette: PaletteName): void;
247
+ setLocale(locale: Locale): void;
248
+ setSystemDark(dark: boolean): void;
249
+ setReducedMotion(reduced: boolean): void;
250
+ }
251
+ /** Pad a small rect so a node is shown with its neighbourhood. */
252
+ export declare function padRect(r: Rect, min?: number, ratio?: number): Rect;
253
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}