@kgdiff/scene 0.0.0-stage → 0.2.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -2
  3. package/dist/build.d.ts +23 -0
  4. package/dist/build.d.ts.map +1 -0
  5. package/dist/build.js +407 -0
  6. package/dist/build.js.map +1 -0
  7. package/dist/choreography.d.ts +98 -0
  8. package/dist/choreography.d.ts.map +1 -0
  9. package/dist/choreography.js +271 -0
  10. package/dist/choreography.js.map +1 -0
  11. package/dist/color.d.ts +42 -0
  12. package/dist/color.d.ts.map +1 -0
  13. package/dist/color.js +169 -0
  14. package/dist/color.js.map +1 -0
  15. package/dist/constants.d.ts +89 -0
  16. package/dist/constants.d.ts.map +1 -0
  17. package/dist/constants.js +89 -0
  18. package/dist/constants.js.map +1 -0
  19. package/dist/easing.d.ts +28 -0
  20. package/dist/easing.d.ts.map +1 -0
  21. package/dist/easing.js +103 -0
  22. package/dist/easing.js.map +1 -0
  23. package/dist/focus.d.ts +45 -0
  24. package/dist/focus.d.ts.map +1 -0
  25. package/dist/focus.js +317 -0
  26. package/dist/focus.js.map +1 -0
  27. package/dist/frame.d.ts +13 -0
  28. package/dist/frame.d.ts.map +1 -0
  29. package/dist/frame.js +32 -0
  30. package/dist/frame.js.map +1 -0
  31. package/dist/geometry.d.ts +61 -0
  32. package/dist/geometry.d.ts.map +1 -0
  33. package/dist/geometry.js +122 -0
  34. package/dist/geometry.js.map +1 -0
  35. package/dist/index.d.ts +16 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +16 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/resolver.d.ts +9 -0
  40. package/dist/resolver.d.ts.map +1 -0
  41. package/dist/resolver.js +1621 -0
  42. package/dist/resolver.js.map +1 -0
  43. package/dist/roles.d.ts +46 -0
  44. package/dist/roles.d.ts.map +1 -0
  45. package/dist/roles.js +197 -0
  46. package/dist/roles.js.map +1 -0
  47. package/dist/styles.d.ts +116 -0
  48. package/dist/styles.d.ts.map +1 -0
  49. package/dist/styles.js +391 -0
  50. package/dist/styles.js.map +1 -0
  51. package/dist/theme.d.ts +14 -0
  52. package/dist/theme.d.ts.map +1 -0
  53. package/dist/theme.js +154 -0
  54. package/dist/theme.js.map +1 -0
  55. package/dist/timeline.d.ts +69 -0
  56. package/dist/timeline.d.ts.map +1 -0
  57. package/dist/timeline.js +362 -0
  58. package/dist/timeline.js.map +1 -0
  59. package/dist/types.d.ts +493 -0
  60. package/dist/types.d.ts.map +1 -0
  61. package/dist/types.js +2 -0
  62. package/dist/types.js.map +1 -0
  63. package/dist/view.d.ts +11 -0
  64. package/dist/view.d.ts.map +1 -0
  65. package/dist/view.js +22 -0
  66. package/dist/view.js.map +1 -0
  67. package/package.json +46 -3
  68. package/src/build.ts +450 -0
  69. package/src/choreography.ts +342 -0
  70. package/src/color.ts +194 -0
  71. package/src/constants.ts +97 -0
  72. package/src/easing.ts +104 -0
  73. package/src/focus.ts +335 -0
  74. package/src/frame.ts +37 -0
  75. package/src/geometry.ts +162 -0
  76. package/src/index.ts +15 -0
  77. package/src/resolver.ts +1710 -0
  78. package/src/roles.ts +203 -0
  79. package/src/styles.ts +513 -0
  80. package/src/theme.ts +185 -0
  81. package/src/timeline.ts +391 -0
  82. package/src/types.ts +544 -0
  83. package/src/view.ts +27 -0
package/dist/styles.js ADDED
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Static encodings: the "Layer encodings" table of docs/visual-language.md as precomputed,
3
+ * shared style records per element and layer (`union`, `before`, `after`). The resolver copies
4
+ * these into frame visuals and only animates elements inside active replay windows.
5
+ */
6
+ import { desaturate, RampCache } from './color.js';
7
+ import { DASH_EDGE, DASH_GHOST, EMPHASIS, HALO, STROKE } from './constants.js';
8
+ import { assertNever } from './roles.js';
9
+ // ─── Family codes ───────────────────────────────────────────────────────────
10
+ export const F_ADDED = 0;
11
+ export const F_REMOVED = 1;
12
+ export const F_CONTENT = 2;
13
+ export const F_STRUCTURE = 3;
14
+ export const F_IDENTITY = 4;
15
+ export const F_NEUTRAL = 5;
16
+ export const FAMILY_BY_CODE = [
17
+ 'added',
18
+ 'removed',
19
+ 'content',
20
+ 'structure',
21
+ 'identity',
22
+ 'neutral',
23
+ ];
24
+ export function familyCode(f) {
25
+ switch (f) {
26
+ case 'added':
27
+ return F_ADDED;
28
+ case 'removed':
29
+ return F_REMOVED;
30
+ case 'content':
31
+ return F_CONTENT;
32
+ case 'structure':
33
+ return F_STRUCTURE;
34
+ case 'identity':
35
+ return F_IDENTITY;
36
+ case 'neutral':
37
+ return F_NEUTRAL;
38
+ default:
39
+ return assertNever(f);
40
+ }
41
+ }
42
+ const tokenCache = new WeakMap();
43
+ export function tokensFor(theme) {
44
+ const cached = tokenCache.get(theme);
45
+ if (cached !== undefined)
46
+ return cached;
47
+ const fam = theme.family;
48
+ const order = [fam.added, fam.removed, fam.content, fam.structure, fam.identity];
49
+ const tokens = {
50
+ theme,
51
+ base: [...order.map((f) => f.base), theme.neutral.node],
52
+ strong: [...order.map((f) => f.strong), theme.neutral.nodeStroke],
53
+ text: [...order.map((f) => f.text), theme.neutral.label],
54
+ soft: [...order.map((f) => f.soft), theme.surface.raised],
55
+ edge: [...order.map((f) => f.base), theme.neutral.edge],
56
+ // "content-colored, desaturated": keeps the amber family hint but reads as retired.
57
+ deprecatedFill: desaturate(fam.content.base, 0.6),
58
+ deprecatedStroke: desaturate(fam.content.strong, 0.6),
59
+ background: theme.canvas.background,
60
+ primary: theme.text.primary,
61
+ secondary: theme.text.secondary,
62
+ muted: theme.text.muted,
63
+ neutralLabel: theme.neutral.label,
64
+ accent: theme.accent.base,
65
+ glow: theme.glow,
66
+ haloScale: theme.glow ? HALO.glowScale : 1,
67
+ haloAlpha: theme.glow ? HALO.glowAlpha : HALO.ringAlpha,
68
+ weightRegular: theme.font.weightRegular,
69
+ weightStrong: theme.font.weightStrong,
70
+ ramps: new RampCache(),
71
+ };
72
+ tokenCache.set(theme, tokens);
73
+ return tokens;
74
+ }
75
+ /** Rebuild a node style as one literal in fixed field order: every style shares one map. */
76
+ function nodeStyle(o) {
77
+ return Object.freeze({
78
+ hidden: o.hidden,
79
+ family: o.family,
80
+ fill: o.fill,
81
+ stroke: o.stroke,
82
+ dash: o.dash,
83
+ ring: o.ring,
84
+ halo: o.halo,
85
+ labelBefore: o.labelBefore,
86
+ labelColor: o.labelColor,
87
+ labelWeight: o.labelWeight,
88
+ strike: o.strike,
89
+ changed: o.changed,
90
+ secondary: o.secondary,
91
+ badge: o.badge,
92
+ z: o.z,
93
+ });
94
+ }
95
+ export const HIDDEN_NODE = nodeStyle({
96
+ hidden: true,
97
+ family: F_NEUTRAL,
98
+ fill: null,
99
+ stroke: null,
100
+ dash: null,
101
+ ring: null,
102
+ halo: null,
103
+ labelBefore: false,
104
+ labelColor: '',
105
+ labelWeight: 400,
106
+ strike: false,
107
+ changed: false,
108
+ secondary: false,
109
+ badge: false,
110
+ z: 0,
111
+ });
112
+ // ─── Edge styles ────────────────────────────────────────────────────────────
113
+ /** Edge label sources. */
114
+ export const EL_NONE = 0;
115
+ export const EL_CURRENT = 1;
116
+ export const EL_BEFORE = 2;
117
+ /** `old → new` (union layer of a relabeled edge). */
118
+ export const EL_UNION = 3;
119
+ /** Rebuild an edge style as one literal in fixed field order: every style shares one map. */
120
+ function edgeStyle(o) {
121
+ return Object.freeze({
122
+ hidden: o.hidden,
123
+ family: o.family,
124
+ before: o.before,
125
+ color: o.color,
126
+ width: o.width,
127
+ alpha: o.alpha,
128
+ dash: o.dash,
129
+ arrow: o.arrow,
130
+ label: o.label,
131
+ labelColor: o.labelColor,
132
+ strike: o.strike,
133
+ changed: o.changed,
134
+ z: o.z,
135
+ });
136
+ }
137
+ export const HIDDEN_EDGE = edgeStyle({
138
+ hidden: true,
139
+ family: F_NEUTRAL,
140
+ before: false,
141
+ color: '',
142
+ width: 0,
143
+ alpha: 0,
144
+ dash: null,
145
+ arrow: false,
146
+ label: EL_NONE,
147
+ labelColor: '',
148
+ strike: false,
149
+ changed: false,
150
+ z: 0,
151
+ });
152
+ /** Memoized style records: equal looks share one frozen object. */
153
+ export class StyleBook {
154
+ tokens;
155
+ nodes = new Map();
156
+ edges = new Map();
157
+ constructor(tokens) {
158
+ this.tokens = tokens;
159
+ }
160
+ node(look, family, o = {}) {
161
+ const key = `${look}|${family}|${o.labelBefore ? 1 : 0}${o.strike ? 1 : 0}${o.secondary ? 1 : 0}${o.badge ? 1 : 0}`;
162
+ let style = this.nodes.get(key);
163
+ if (style === undefined) {
164
+ style = nodeStyle(this.makeNode(look, family, o));
165
+ this.nodes.set(key, style);
166
+ }
167
+ return style;
168
+ }
169
+ makeNode(look, family, o) {
170
+ const t = this.tokens;
171
+ const common = {
172
+ hidden: false,
173
+ family,
174
+ dash: null,
175
+ ring: null,
176
+ halo: null,
177
+ labelBefore: o.labelBefore ?? false,
178
+ labelColor: t.primary,
179
+ labelWeight: t.weightStrong,
180
+ strike: o.strike ?? false,
181
+ changed: true,
182
+ secondary: o.secondary ?? false,
183
+ badge: o.badge ?? false,
184
+ z: 2,
185
+ };
186
+ switch (look) {
187
+ case 'neutral':
188
+ return {
189
+ ...common,
190
+ family: F_NEUTRAL,
191
+ fill: t.base[F_NEUTRAL],
192
+ stroke: t.strong[F_NEUTRAL],
193
+ labelColor: t.neutralLabel,
194
+ labelWeight: t.weightRegular,
195
+ changed: false,
196
+ z: 0,
197
+ };
198
+ case 'solid':
199
+ return { ...common, fill: t.base[family], stroke: t.strong[family] };
200
+ case 'added':
201
+ return {
202
+ ...common,
203
+ fill: t.base[family],
204
+ stroke: t.strong[family],
205
+ halo: t.base[family],
206
+ };
207
+ case 'ringed':
208
+ return {
209
+ ...common,
210
+ fill: t.base[family],
211
+ stroke: t.strong[family],
212
+ ring: t.base[family],
213
+ };
214
+ case 'ringHalo':
215
+ return {
216
+ ...common,
217
+ fill: t.base[family],
218
+ stroke: t.strong[family],
219
+ ring: t.base[family],
220
+ halo: t.base[family],
221
+ };
222
+ case 'ghost':
223
+ return { ...common, fill: null, stroke: t.base[family], dash: DASH_GHOST, z: 1 };
224
+ case 'deprecated':
225
+ return {
226
+ ...common,
227
+ family: F_CONTENT,
228
+ fill: t.deprecatedFill,
229
+ stroke: t.deprecatedStroke,
230
+ ring: t.deprecatedFill,
231
+ strike: true,
232
+ };
233
+ default:
234
+ return assertNever(look);
235
+ }
236
+ }
237
+ edge(look, family, before, label, strike = false) {
238
+ const key = `${look}|${family}|${before ? 1 : 0}|${label}|${strike ? 1 : 0}`;
239
+ let style = this.edges.get(key);
240
+ if (style === undefined) {
241
+ style = edgeStyle(this.makeEdge(look, family, before, label, strike));
242
+ this.edges.set(key, style);
243
+ }
244
+ return style;
245
+ }
246
+ makeEdge(look, family, before, label, strike) {
247
+ const t = this.tokens;
248
+ const changed = {
249
+ hidden: false,
250
+ family,
251
+ before,
252
+ color: t.edge[family],
253
+ width: STROKE.changedEdge,
254
+ alpha: 1,
255
+ dash: null,
256
+ arrow: true,
257
+ label,
258
+ labelColor: t.text[family],
259
+ strike,
260
+ changed: true,
261
+ z: 2,
262
+ };
263
+ switch (look) {
264
+ case 'neutral':
265
+ return {
266
+ ...changed,
267
+ family: F_NEUTRAL,
268
+ color: t.edge[F_NEUTRAL],
269
+ width: STROKE.neutralEdge,
270
+ labelColor: t.neutralLabel,
271
+ changed: false,
272
+ z: 0,
273
+ };
274
+ case 'solid':
275
+ return changed;
276
+ case 'dashed':
277
+ return { ...changed, dash: DASH_EDGE, z: 1 };
278
+ case 'collapsed':
279
+ return { ...changed, dash: DASH_EDGE, alpha: EMPHASIS.collapsedEdge, z: 1 };
280
+ default:
281
+ return assertNever(look);
282
+ }
283
+ }
284
+ }
285
+ /** [union, before, after] styles of a node (docs/visual-language.md §Layer encodings). */
286
+ export function nodeLayerStyles(book, n) {
287
+ const fam = familyCode(n.family);
288
+ const renamed = n.labelBefore !== undefined;
289
+ switch (n.role) {
290
+ case 'unchanged': {
291
+ const s = book.node('neutral', F_NEUTRAL);
292
+ return [s, s, s];
293
+ }
294
+ case 'added': {
295
+ const s = book.node('added', F_ADDED, { badge: true });
296
+ return [s, HIDDEN_NODE, s];
297
+ }
298
+ case 'removed':
299
+ return [
300
+ book.node('ghost', F_REMOVED, { strike: true, badge: true }),
301
+ book.node('solid', F_REMOVED),
302
+ HIDDEN_NODE,
303
+ ];
304
+ case 'modified':
305
+ return [
306
+ book.node('ringed', fam, { secondary: renamed, badge: true }),
307
+ book.node('ringed', fam, { labelBefore: true }),
308
+ book.node('ringed', fam, { badge: true }),
309
+ ];
310
+ case 'deprecated':
311
+ return [
312
+ book.node('deprecated', F_CONTENT, { secondary: renamed, badge: true }),
313
+ book.node('ringed', F_CONTENT, { labelBefore: true }),
314
+ book.node('deprecated', F_CONTENT, { badge: true }),
315
+ ];
316
+ case 'merge-source':
317
+ return [
318
+ book.node('ghost', F_IDENTITY, { strike: true }),
319
+ book.node('solid', F_IDENTITY, { labelBefore: true }),
320
+ n.presentAfter ? book.node('deprecated', F_CONTENT) : HIDDEN_NODE,
321
+ ];
322
+ case 'merge-target':
323
+ case 'split-target': {
324
+ // Before: "neutral or own facet" (`familyBefore`).
325
+ const own = familyCode(n.familyBefore);
326
+ const before = !n.presentBefore
327
+ ? HIDDEN_NODE
328
+ : own === F_NEUTRAL
329
+ ? book.node('neutral', F_NEUTRAL)
330
+ : book.node('ringed', own, { labelBefore: true });
331
+ return [
332
+ book.node('ringHalo', F_IDENTITY, { secondary: renamed, badge: true }),
333
+ before,
334
+ book.node('ringHalo', F_IDENTITY, { badge: true }),
335
+ ];
336
+ }
337
+ case 'split-source':
338
+ return [
339
+ n.presentAfter
340
+ ? book.node('ringHalo', F_IDENTITY, { secondary: renamed, badge: true })
341
+ : book.node('ghost', F_IDENTITY, { strike: true }),
342
+ book.node('solid', F_IDENTITY, { labelBefore: true }),
343
+ n.presentAfter ? book.node('ringHalo', F_IDENTITY, { badge: true }) : HIDDEN_NODE,
344
+ ];
345
+ default:
346
+ return assertNever(n.role);
347
+ }
348
+ }
349
+ /** [union, before, after] styles of an edge (docs/visual-language.md §Layer encodings). */
350
+ export function edgeLayerStyles(book, e) {
351
+ const fam = familyCode(e.family);
352
+ const relabeled = e.labelBefore !== undefined;
353
+ switch (e.role) {
354
+ case 'unchanged': {
355
+ const s = book.edge('neutral', F_NEUTRAL, false, EL_NONE);
356
+ return [s, s, s];
357
+ }
358
+ case 'added': {
359
+ const s = book.edge('solid', F_ADDED, false, EL_CURRENT);
360
+ return [s, HIDDEN_EDGE, s];
361
+ }
362
+ case 'removed':
363
+ return [
364
+ book.edge('dashed', F_REMOVED, false, EL_CURRENT, true),
365
+ book.edge('solid', F_REMOVED, false, EL_CURRENT),
366
+ HIDDEN_EDGE,
367
+ ];
368
+ case 'modified':
369
+ return [
370
+ book.edge('solid', fam, false, relabeled ? EL_UNION : EL_CURRENT),
371
+ book.edge('solid', fam, false, EL_BEFORE),
372
+ book.edge('solid', fam, false, EL_CURRENT),
373
+ ];
374
+ case 'retarget':
375
+ case 'carried':
376
+ return [
377
+ book.edge('solid', fam, false, relabeled ? EL_UNION : EL_CURRENT),
378
+ book.edge('solid', fam, true, EL_BEFORE),
379
+ book.edge('solid', fam, false, EL_CURRENT),
380
+ ];
381
+ case 'collapsed':
382
+ return [
383
+ book.edge('collapsed', F_IDENTITY, false, EL_CURRENT, true),
384
+ book.edge('solid', F_IDENTITY, false, EL_CURRENT),
385
+ HIDDEN_EDGE,
386
+ ];
387
+ default:
388
+ return assertNever(e.role);
389
+ }
390
+ }
391
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../src/styles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { PaletteName, Theme, ThemeName } from './types.js';
2
+ export declare const FONT_FAMILY: string;
3
+ export declare const FONT_MONO = "\"JetBrains Mono\", \"SF Mono\", ui-monospace, Menlo, Consolas, monospace";
4
+ export declare const THEME_NAMES: readonly ThemeName[];
5
+ export declare const PALETTE_NAMES: readonly PaletteName[];
6
+ /**
7
+ * Design tokens for a theme / palette pair (docs/visual-language.md §Color).
8
+ * Returns a deeply frozen, cached object: the same pair always yields the same instance,
9
+ * so it can key caches.
10
+ *
11
+ * @throws KgdiffError(`invalid-input`) for an unknown theme or palette name.
12
+ */
13
+ export declare function getTheme(name: ThemeName, palette?: PaletteName): Theme;
14
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAA8B,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5F,eAAO,MAAM,WAAW,QAE4D,CAAC;AACrF,eAAO,MAAM,SAAS,8EAA0E,CAAC;AA6IjG,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAAsB,CAAC;AACnE,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAA8B,CAAC;AAE/E;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,GAAE,WAAuB,GAAG,KAAK,CAoBjF"}
package/dist/theme.js ADDED
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Design tokens (docs/visual-language.md §Color tokens, §Typography, motion).
3
+ *
4
+ * Four frozen themes: dark ("night") / light ("paper") × default / colorblind palette.
5
+ * Contrast requirements are asserted by `test/theme.test.ts`.
6
+ */
7
+ import { KgdiffError } from '@kgdiff/core';
8
+ import { withAlpha } from './color.js';
9
+ export const FONT_FAMILY = 'Inter, "SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", ' +
10
+ '"Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", system-ui, sans-serif';
11
+ export const FONT_MONO = '"JetBrains Mono", "SF Mono", ui-monospace, Menlo, Consolas, monospace';
12
+ const MOTION = { fast: 120, base: 220, slow: 420, easing: [0.2, 0, 0, 1] };
13
+ const FONT = {
14
+ family: FONT_FAMILY,
15
+ mono: FONT_MONO,
16
+ size: 12,
17
+ weightRegular: 400,
18
+ weightStrong: 600,
19
+ };
20
+ const DARK_FAMILIES = {
21
+ added: { base: '#34D399', strong: '#6EE7B7', soft: 'rgba(52,211,153,0.16)', text: '#6EE7B7' },
22
+ removed: { base: '#F87171', strong: '#FCA5A5', soft: 'rgba(248,113,113,0.15)', text: '#FCA5A5' },
23
+ content: { base: '#FBBF24', strong: '#FCD34D', soft: 'rgba(251,191,36,0.15)', text: '#FCD34D' },
24
+ structure: { base: '#38BDF8', strong: '#7DD3FC', soft: 'rgba(56,189,248,0.15)', text: '#7DD3FC' },
25
+ identity: { base: '#A78BFA', strong: '#C4B5FD', soft: 'rgba(167,139,250,0.17)', text: '#C4B5FD' },
26
+ };
27
+ const LIGHT_FAMILIES = {
28
+ // text: spec #15803D measures 4.20:1 over its soft tint on the canvas (badges); one step
29
+ // darker, same hue → 4.54:1.
30
+ added: { base: '#16A34A', strong: '#15803D', soft: 'rgba(22,163,74,0.11)', text: '#147A3A' },
31
+ removed: { base: '#DC2626', strong: '#B91C1C', soft: 'rgba(220,38,38,0.09)', text: '#B91C1C' },
32
+ // Spec value #D97706 measures 2.998:1 on #F7F8FA (needs ≥ 3:1); one step darker passes (3.06:1)
33
+ // and is visually indistinguishable. The soft tint keeps the original hue.
34
+ content: { base: '#D87506', strong: '#B45309', soft: 'rgba(217,119,6,0.11)', text: '#92400E' },
35
+ structure: { base: '#0284C7', strong: '#0369A1', soft: 'rgba(2,132,199,0.10)', text: '#075985' },
36
+ identity: { base: '#7C3AED', strong: '#6D28D9', soft: 'rgba(124,58,237,0.10)', text: '#5B21B6' },
37
+ };
38
+ /**
39
+ * Okabe–Ito based palette (spec gives base / text). Derived tokens follow the default palette's
40
+ * pattern: dark `strong` = `text` (as in every default dark family); light `strong` = the sRGB
41
+ * midpoint of base and text (between mark and text, like content / structure / identity);
42
+ * `soft` = base at the default palette's per-family tint alpha.
43
+ */
44
+ function okabeIto(base, soft) {
45
+ const make = (f) => {
46
+ const [b, text, strong] = base[f];
47
+ return { base: b, strong, soft: withAlpha(b, soft[f]), text };
48
+ };
49
+ return {
50
+ added: make('added'),
51
+ removed: make('removed'),
52
+ content: make('content'),
53
+ structure: make('structure'),
54
+ identity: make('identity'),
55
+ };
56
+ }
57
+ const DARK_SOFT = { added: 0.16, removed: 0.15, content: 0.15, structure: 0.15, identity: 0.17 };
58
+ const LIGHT_SOFT = { added: 0.11, removed: 0.09, content: 0.11, structure: 0.1, identity: 0.1 };
59
+ const DARK_COLORBLIND = okabeIto({
60
+ added: ['#56B4E9', '#8FD0F5', '#8FD0F5'],
61
+ removed: ['#E69F00', '#F5C45C', '#F5C45C'],
62
+ content: ['#F0E442', '#F5EC85', '#F5EC85'],
63
+ structure: ['#009E73', '#3CC79E', '#3CC79E'],
64
+ identity: ['#CC79A7', '#E0A6C6', '#E0A6C6'],
65
+ }, DARK_SOFT);
66
+ const LIGHT_COLORBLIND = okabeIto({
67
+ added: ['#0072B2', '#005A8C', '#00669F'],
68
+ removed: ['#D55E00', '#A84A00', '#BF5400'],
69
+ content: ['#9A8700', '#6E6100', '#847400'],
70
+ structure: ['#00805C', '#006248', '#007152'],
71
+ identity: ['#A3477F', '#83335F', '#933D6F'],
72
+ }, LIGHT_SOFT);
73
+ function dark(palette) {
74
+ return {
75
+ name: 'dark',
76
+ palette,
77
+ canvas: { background: '#0B0E14', grid: 'rgba(148, 163, 184, 0.07)' },
78
+ surface: {
79
+ panel: '#11151D',
80
+ raised: '#171C26',
81
+ overlay: 'rgba(17, 21, 29, 0.78)',
82
+ border: 'rgba(255,255,255,0.07)',
83
+ borderStrong: 'rgba(255,255,255,0.13)',
84
+ controlBorder: '#5E687C',
85
+ shadow: '0 8px 32px rgba(0,0,0,0.45), 0 1px 0 rgba(255,255,255,0.04) inset',
86
+ },
87
+ // muted: spec #737D8F measures 4.11:1 on raised; same hue, lighter → ≥ 4.5:1 everywhere.
88
+ text: { primary: '#E7EBF3', secondary: '#A6AFBF', muted: '#7A8495' },
89
+ accent: { base: '#7C9CFF', strong: '#A3BAFF', soft: 'rgba(124,156,255,0.16)', text: '#A9BEFF' },
90
+ neutral: { node: '#4B5568', nodeStroke: '#5E687C', edge: '#323A4A', label: '#8B94A6' },
91
+ family: palette === 'colorblind' ? DARK_COLORBLIND : DARK_FAMILIES,
92
+ glow: true,
93
+ font: FONT,
94
+ motion: MOTION,
95
+ };
96
+ }
97
+ function light(palette) {
98
+ return {
99
+ name: 'light',
100
+ palette,
101
+ canvas: { background: '#F7F8FA', grid: 'rgba(15, 23, 42, 0.07)' },
102
+ surface: {
103
+ panel: '#FFFFFF',
104
+ raised: '#FFFFFF',
105
+ overlay: 'rgba(255, 255, 255, 0.82)',
106
+ border: 'rgba(15,23,42,0.08)',
107
+ borderStrong: 'rgba(15,23,42,0.15)',
108
+ controlBorder: '#8690A3',
109
+ shadow: '0 8px 28px rgba(15,23,42,0.10), 0 1px 2px rgba(15,23,42,0.06)',
110
+ },
111
+ // muted: spec #7B8597 measures 3.50:1 on the canvas; same hue, darker → ≥ 4.5:1 everywhere.
112
+ text: { primary: '#0F172A', secondary: '#475569', muted: '#687284' },
113
+ accent: { base: '#3B5BDB', strong: '#2F49B5', soft: 'rgba(59,91,219,0.10)', text: '#2F49B5' },
114
+ neutral: { node: '#A7B0BF', nodeStroke: '#8C96A8', edge: '#D3D9E2', label: '#5F6B7D' },
115
+ family: palette === 'colorblind' ? LIGHT_COLORBLIND : LIGHT_FAMILIES,
116
+ glow: false,
117
+ font: FONT,
118
+ motion: MOTION,
119
+ };
120
+ }
121
+ function deepFreeze(value) {
122
+ if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {
123
+ Object.freeze(value);
124
+ for (const v of Object.values(value))
125
+ deepFreeze(v);
126
+ }
127
+ return value;
128
+ }
129
+ const cache = new Map();
130
+ export const THEME_NAMES = ['dark', 'light'];
131
+ export const PALETTE_NAMES = ['default', 'colorblind'];
132
+ /**
133
+ * Design tokens for a theme / palette pair (docs/visual-language.md §Color).
134
+ * Returns a deeply frozen, cached object: the same pair always yields the same instance,
135
+ * so it can key caches.
136
+ *
137
+ * @throws KgdiffError(`invalid-input`) for an unknown theme or palette name.
138
+ */
139
+ export function getTheme(name, palette = 'default') {
140
+ if (!THEME_NAMES.includes(name)) {
141
+ throw new KgdiffError('invalid-input', `Unknown theme "${String(name)}" (expected "dark" or "light").`);
142
+ }
143
+ if (!PALETTE_NAMES.includes(palette)) {
144
+ throw new KgdiffError('invalid-input', `Unknown palette "${String(palette)}" (expected "default" or "colorblind").`);
145
+ }
146
+ const key = `${name}/${palette}`;
147
+ let theme = cache.get(key);
148
+ if (theme === undefined) {
149
+ theme = deepFreeze(name === 'dark' ? dark(palette) : light(palette));
150
+ cache.set(key, theme);
151
+ }
152
+ return theme;
153
+ }
154
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../src/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,MAAM,CAAC,MAAM,WAAW,GACtB,sFAAsF;IACtF,kFAAkF,CAAC;AACrF,MAAM,CAAC,MAAM,SAAS,GAAG,uEAAuE,CAAC;AAEjG,MAAM,MAAM,GAAoB,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;AAC5F,MAAM,IAAI,GAAkB;IAC1B,MAAM,EAAE,WAAW;IACnB,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,EAAE;IACR,aAAa,EAAE,GAAG;IAClB,YAAY,EAAE,GAAG;CAClB,CAAC;AAIF,MAAM,aAAa,GAAgB;IACjC,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC7F,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,EAAE;IAChG,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC/F,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE;IACjG,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,EAAE;CAClG,CAAC;AAEF,MAAM,cAAc,GAAgB;IAClC,yFAAyF;IACzF,6BAA6B;IAC7B,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC5F,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC9F,gGAAgG;IAChG,2EAA2E;IAC3E,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;IAC9F,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;IAChG,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE,SAAS,EAAE;CACjG,CAAC;AAEF;;;;;GAKG;AACH,SAAS,QAAQ,CACf,IAAiF,EACjF,IAA4C;IAE5C,MAAM,IAAI,GAAG,CAAC,CAAe,EAAgB,EAAE;QAC7C,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAChE,CAAC,CAAC;IACF,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC;QACpB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;QACxB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC;QACxB,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC;QAC5B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;KAC3B,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AACjG,MAAM,UAAU,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAEhG,MAAM,eAAe,GAAG,QAAQ,CAC9B;IACE,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IACxC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAC1C,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAC1C,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAC5C,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;CAC5C,EACD,SAAS,CACV,CAAC;AAEF,MAAM,gBAAgB,GAAG,QAAQ,CAC/B;IACE,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IACxC,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAC1C,OAAO,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAC1C,SAAS,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;IAC5C,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;CAC5C,EACD,UAAU,CACX,CAAC;AAEF,SAAS,IAAI,CAAC,OAAoB;IAChC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO;QACP,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,2BAA2B,EAAE;QACpE,OAAO,EAAE;YACP,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,wBAAwB;YACjC,MAAM,EAAE,wBAAwB;YAChC,YAAY,EAAE,wBAAwB;YACtC,aAAa,EAAE,SAAS;YACxB,MAAM,EAAE,mEAAmE;SAC5E;QACD,yFAAyF;QACzF,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;QACpE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC/F,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;QACtF,MAAM,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa;QAClE,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAED,SAAS,KAAK,CAAC,OAAoB;IACjC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO;QACP,MAAM,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,wBAAwB,EAAE;QACjE,OAAO,EAAE;YACP,KAAK,EAAE,SAAS;YAChB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,2BAA2B;YACpC,MAAM,EAAE,qBAAqB;YAC7B,YAAY,EAAE,qBAAqB;YACnC,aAAa,EAAE,SAAS;YACxB,MAAM,EAAE,+DAA+D;SACxE;QACD,4FAA4F;QAC5F,IAAI,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;QACpE,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,sBAAsB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7F,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;QACtF,MAAM,EAAE,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc;QACpE,IAAI,EAAE,KAAK;QACX,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAM;KACf,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAI,KAAQ;IAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;AAEvC,MAAM,CAAC,MAAM,WAAW,GAAyB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAe,EAAE,OAAO,GAAgB,SAAS;IACxE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,WAAW,CACnB,eAAe,EACf,kBAAkB,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAChE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,WAAW,CACnB,eAAe,EACf,oBAAoB,MAAM,CAAC,OAAO,CAAC,yCAAyC,CAC7E,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IACjC,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,UAAU,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Review / replay order and the replay timeline (docs/algorithms.md §10).
3
+ */
4
+ import type { HunkKind, Rect, ReplayPhase } from '@kgdiff/core';
5
+ import type { Timeline } from './types.js';
6
+ export declare const PHASE_ORDER: readonly ReplayPhase[];
7
+ export interface TourHunk {
8
+ readonly phase: ReplayPhase;
9
+ /** Changed nodes + edges. */
10
+ readonly size: number;
11
+ /** Default review order from core (tie-breaker). */
12
+ readonly order: number;
13
+ /** Anchor position. */
14
+ readonly x: number;
15
+ readonly y: number;
16
+ /** Indices (into the same array) of hunks that must come first (core `Hunk.requires`). */
17
+ readonly requires: readonly number[];
18
+ }
19
+ /**
20
+ * Order hunks as a short spatial tour (docs/algorithms.md §10) that respects `requires`:
21
+ *
22
+ * - Only *ready* hunks (every requirement already placed) are candidates.
23
+ * - Phase is a preference, not a barrier: the candidates are the ready hunks of the earliest
24
+ * phase that has any, so a hunk may follow a later-phase hunk it requires.
25
+ * - The very first hunk is the largest candidate; every next one is the candidate nearest the
26
+ * previous anchor (greedy nearest neighbour), which also starts each phase near where the
27
+ * previous one ended.
28
+ * - Ties are broken by the default `order`. Unknown or self requirements are ignored; a cycle
29
+ * (never produced by core) is broken by releasing its lowest-`order` hunk.
30
+ *
31
+ * Returns indices into `hunks`. ~O((H + R) √H) worst case, near-linear typically.
32
+ */
33
+ export declare function tourOrder(hunks: readonly TourHunk[]): number[];
34
+ /**
35
+ * Chapter of each hunk (hunks in a requirement-respecting order, e.g. the tour) for `chapters`
36
+ * mode: one chapter per phase present, in replay order; a hunk that requires a hunk of a later
37
+ * chapter moves to that chapter (the earliest chapter not before any requirement). O(H + R).
38
+ */
39
+ export declare function chapterPlan(hunks: readonly {
40
+ readonly phase: ReplayPhase;
41
+ readonly requires: readonly number[];
42
+ }[]): Int32Array;
43
+ /** Play time of one hunk in `hunks` mode: `pace · kindFactor · clamp(√size, 1, 2.2)`. */
44
+ export declare function hunkDuration(kind: HunkKind, size: number, pace: number): number;
45
+ /** Length of a chapter of `n` hunks in `chapters` mode: `pace · clamp(1.2 + log₂ n, 1.2, 4)`. */
46
+ export declare function chapterDuration(n: number, pace: number): number;
47
+ export interface TimelineHunk {
48
+ readonly kind: HunkKind;
49
+ readonly phase: ReplayPhase;
50
+ readonly size: number;
51
+ readonly bounds: Rect;
52
+ /** Indices (into the same array) of hunks that must play first. */
53
+ readonly requires: readonly number[];
54
+ }
55
+ export declare const timelineMode: (hunkCount: number, chapterThreshold: number) => Timeline['mode'];
56
+ /**
57
+ * Replay schedule for hunks already in play order (docs/algorithms.md §10). The order must
58
+ * respect `requires` (the tour does; in `chapters` mode, stable-sort the tour by `chapterPlan`).
59
+ *
60
+ * - `hunks` mode (≤ `chapterThreshold` hunks): one hunk at a time, 160 ms apart, so every hunk
61
+ * starts after its requirements end. Chapters are the consecutive runs of one phase, reported
62
+ * for scrubber grouping.
63
+ * - `chapters` mode: one chapter per `chapterPlan` value, of length
64
+ * `pace · clamp(1.2 + log₂ n, 1.2, 4)`; its hunks play together, staggered in play order over
65
+ * `35% · (n − 1) / n` of the chapter, so a hunk requiring another of its chapter starts later.
66
+ * A chapter's `phase` is the phase it was planned for. Chapters are 160 ms apart.
67
+ */
68
+ export declare function buildTimeline(hunks: readonly TimelineHunk[], pace: number, chapterThreshold: number): Timeline;
69
+ //# sourceMappingURL=timeline.d.ts.map