@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
@@ -0,0 +1,271 @@
1
+ import { assertNever, mergeBadge } from './roles.js';
2
+ /** Node animation kinds. */
3
+ export const NA_NONE = 0;
4
+ /** Both states visible: colors / rings / halos crossfade, label slides, ring flashes, badge ticks in. */
5
+ export const NA_FADE = 1;
6
+ /** Shrinks to 0.6·r while its fill drains into a dashed ghost, which lingers, then fades. */
7
+ export const NA_REMOVE = 2;
8
+ /** Pops in (scale 0 → 1.08 → 1, back-out), then its label fades in. */
9
+ export const NA_ADD = 3;
10
+ /** Merge source: travels on a gentle arc into its target, fades on arrival. */
11
+ export const NA_TRAVEL = 4;
12
+ /** Split target: emerges from its source and travels out to its position. */
13
+ export const NA_EMERGE = 5;
14
+ /** Edge animation kinds. */
15
+ export const EA_NONE = 0;
16
+ /** Grows from the existing endpoint (`progress` 0 → 1). */
17
+ export const EA_GROW = 1;
18
+ /** Retracts toward the surviving endpoint (`progress` 1 → 0). */
19
+ export const EA_RETRACT = 2;
20
+ /** The changed end swings around the shared endpoint from the old to the new node. */
21
+ export const EA_SWING = 3;
22
+ /** Carried by a merge: rides the travelling source (before form), then is the after form. */
23
+ export const EA_FOLLOW_MERGE = 4;
24
+ /** Carried by a split: rides the emerging target (after form). */
25
+ export const EA_FOLLOW_SPLIT = 5;
26
+ /** Same geometry, new label / predicate: label swaps, stroke flashes. */
27
+ export const EA_FADE = 6;
28
+ /** Geometry changes with no shared endpoint or no mover: crossfade old form → new form. */
29
+ export const EA_SWAP = 7;
30
+ /** Timings in transform-phase fractions. */
31
+ export const CHOREO = {
32
+ retract: [0, 0.4],
33
+ removeShrink: [0.25, 0.55],
34
+ /** The ghost lingers until 60% of the window (u = (0.6 − 0.18) / 0.64), then fades. */
35
+ removeGhostFade: [0.65625, 1],
36
+ splitSourceShrink: [0.6, 0.8],
37
+ splitSourceFade: [0.8, 1],
38
+ growFromExisting: [0, 0.45],
39
+ pop: [0.35, 0.75],
40
+ popAfterArrival: [0.55, 0.85],
41
+ growBetweenNew: [0.6, 0.9],
42
+ growAfterArrival: [0.7, 0.95],
43
+ growOther: [0.35, 0.85],
44
+ labelFadeIn: 0.15,
45
+ travelStagger: 0.15,
46
+ travel: 0.55,
47
+ arrivalFade: 0.12,
48
+ mergeTargetFade: [0.55, 0.85],
49
+ mergeFlash: [0.7, 1],
50
+ splitStart: 0.05,
51
+ splitSourceStay: [0.6, 0.9],
52
+ modifyFade: [0.3, 0.7],
53
+ modifyFlash: [0.4, 0.8],
54
+ labelOut: [0.1, 0.5],
55
+ labelIn: [0.3, 0.7],
56
+ /** px the old label rises while fading / the new label rises from. */
57
+ labelSlide: 6,
58
+ badgeTick: 0.6,
59
+ swing: [0.1, 0.8],
60
+ ghostFade: [0.3, 1],
61
+ pivotFade: [0.8, 1],
62
+ edgeFade: [0.2, 0.7],
63
+ swap: [0.2, 0.8],
64
+ /** Bend of travel arcs and merge / split arrows. */
65
+ arc: 0.25,
66
+ };
67
+ function staggered(j, n, start) {
68
+ const s = start + (n > 1 ? (CHOREO.travelStagger * j) / (n - 1) : CHOREO.travelStagger / 2);
69
+ return [s, s + CHOREO.travel];
70
+ }
71
+ /** Plan every element's replay animation. O(N + E). */
72
+ export function choreograph(scene, nodeStyles, edgeStyles) {
73
+ const N = scene.nodes.length;
74
+ const M = scene.edges.length;
75
+ const H = scene.hunks.length;
76
+ const c = {
77
+ nKind: new Uint8Array(N),
78
+ nA: new Float64Array(N),
79
+ nB: new Float64Array(N),
80
+ nC: new Float64Array(N),
81
+ nFlashA: new Float64Array(N).fill(-1),
82
+ nFlashB: new Float64Array(N).fill(-1),
83
+ nLabelSwap: new Uint8Array(N),
84
+ nBadgeAt: new Float64Array(N).fill(2),
85
+ nArrivals: new Array(N).fill(null),
86
+ nBadgeSteps: new Array(N).fill(null),
87
+ nPulse: new Uint8Array(N),
88
+ hPulseContext: new Uint8Array(H),
89
+ eKind: new Uint8Array(M),
90
+ eA: new Float64Array(M),
91
+ eB: new Float64Array(M),
92
+ eFromTarget: new Uint8Array(M),
93
+ ePivot: new Int32Array(M).fill(-1),
94
+ };
95
+ const nArrivals = c.nArrivals;
96
+ const nBadgeSteps = c.nBadgeSteps;
97
+ const set = (i, kind, a, b, extra = 0) => {
98
+ c.nKind[i] = kind;
99
+ c.nA[i] = a;
100
+ c.nB[i] = b;
101
+ c.nC[i] = extra;
102
+ };
103
+ const flash = (i, ab) => {
104
+ c.nFlashA[i] = ab[0];
105
+ c.nFlashB[i] = ab[1];
106
+ };
107
+ for (const hunk of scene.hunks) {
108
+ const kind = hunk.kind;
109
+ const before = (i) => nodeStyles[i][1];
110
+ const after = (i) => nodeStyles[i][2];
111
+ // Travelling participants first (they define arrival times).
112
+ const sources = hunk.nodes.filter((i) => scene.nodes[i]?.role === 'merge-source');
113
+ sources.forEach((i, j) => {
114
+ const node = scene.nodes[i];
115
+ const [a, b] = staggered(j, sources.length, 0);
116
+ if (node?.flow !== undefined && !node.presentAfter)
117
+ set(i, NA_TRAVEL, a, b);
118
+ else if (!after(i).hidden)
119
+ set(i, NA_FADE, a, b);
120
+ else
121
+ set(i, NA_REMOVE, CHOREO.removeShrink[0], CHOREO.removeShrink[1], CHOREO.removeGhostFade[0]);
122
+ });
123
+ const targets = hunk.nodes.filter((i) => scene.nodes[i]?.role === 'split-target' &&
124
+ scene.nodes[i]?.flow !== undefined &&
125
+ before(i).hidden);
126
+ targets.forEach((i, j) => {
127
+ const [a, b] = staggered(j, targets.length, CHOREO.splitStart);
128
+ set(i, NA_EMERGE, a, b);
129
+ });
130
+ let anyBefore = false;
131
+ for (const i of hunk.nodes) {
132
+ const node = scene.nodes[i];
133
+ if (node === undefined)
134
+ continue;
135
+ const B = before(i);
136
+ const A = after(i);
137
+ if (!B.hidden) {
138
+ anyBefore = true;
139
+ c.nPulse[i] = 1;
140
+ }
141
+ if (c.nKind[i] !== NA_NONE)
142
+ continue;
143
+ if (B.hidden && A.hidden)
144
+ continue;
145
+ if (B.hidden) {
146
+ const [a, b] = kind === 'merge' ? CHOREO.popAfterArrival : CHOREO.pop;
147
+ set(i, NA_ADD, a, b, Math.min(1, b - 0.05));
148
+ }
149
+ else if (A.hidden) {
150
+ if (kind === 'split') {
151
+ set(i, NA_REMOVE, CHOREO.splitSourceShrink[0], CHOREO.splitSourceShrink[1], CHOREO.splitSourceFade[0]);
152
+ }
153
+ else {
154
+ set(i, NA_REMOVE, CHOREO.removeShrink[0], CHOREO.removeShrink[1], CHOREO.removeGhostFade[0]);
155
+ }
156
+ }
157
+ else if (node.role === 'merge-target') {
158
+ set(i, NA_FADE, CHOREO.mergeTargetFade[0], CHOREO.mergeTargetFade[1]);
159
+ flash(i, CHOREO.mergeFlash);
160
+ }
161
+ else if (node.role === 'split-source') {
162
+ set(i, NA_FADE, CHOREO.splitSourceStay[0], CHOREO.splitSourceStay[1]);
163
+ flash(i, CHOREO.mergeFlash);
164
+ }
165
+ else {
166
+ set(i, NA_FADE, CHOREO.modifyFade[0], CHOREO.modifyFade[1]);
167
+ if (A.ring !== null)
168
+ flash(i, CHOREO.modifyFlash);
169
+ }
170
+ if (c.nKind[i] === NA_FADE) {
171
+ c.nLabelSwap[i] = B.labelBefore && !A.labelBefore && node.labelBefore !== undefined ? 1 : 0;
172
+ if (A.badge && !B.badge && node.badge !== undefined)
173
+ c.nBadgeAt[i] = CHOREO.badgeTick;
174
+ }
175
+ }
176
+ if (!anyBefore)
177
+ c.hPulseContext[hunk.index] = 1;
178
+ // Merge targets count their arrivals up: ⊕ 1, ⊕ 2, …, then the final badge.
179
+ if (kind === 'merge') {
180
+ for (const i of hunk.nodes) {
181
+ const node = scene.nodes[i];
182
+ if (node?.role !== 'merge-target' || node.badge === undefined)
183
+ continue;
184
+ const times = sources
185
+ .filter((s) => scene.nodes[s]?.flow === i)
186
+ .map((s) => c.nB[s])
187
+ .sort((a, b) => a - b);
188
+ if (times.length === 0)
189
+ times.push(CHOREO.mergeFlash[0]);
190
+ nArrivals[i] = Float64Array.from(times);
191
+ nBadgeSteps[i] = times.map((_, k) => k === times.length - 1 ? node.badge : mergeBadge(k + 1));
192
+ }
193
+ }
194
+ const appears = (i) => scene.nodes[i]?.hunk === hunk.index && (c.nKind[i] === NA_ADD || c.nKind[i] === NA_EMERGE);
195
+ const leaves = (i) => scene.nodes[i]?.hunk === hunk.index && (c.nKind[i] === NA_REMOVE || c.nKind[i] === NA_TRAVEL);
196
+ const edge = (j, kind2, ab, fromTarget = false, pivot = -1) => {
197
+ c.eKind[j] = kind2;
198
+ c.eA[j] = ab[0];
199
+ c.eB[j] = ab[1];
200
+ c.eFromTarget[j] = fromTarget ? 1 : 0;
201
+ c.ePivot[j] = pivot;
202
+ };
203
+ for (const j of hunk.edges) {
204
+ const e = scene.edges[j];
205
+ if (e === undefined)
206
+ continue;
207
+ const styles = edgeStyles[j];
208
+ const B = styles[1];
209
+ const A = styles[2];
210
+ switch (e.role) {
211
+ case 'added': {
212
+ // Grow from the endpoint that already exists; between two new nodes, after they pop;
213
+ // in merges / splits, once the travellers have arrived.
214
+ const sNew = appears(e.s);
215
+ const tNew = appears(e.t);
216
+ const timing = sNew && tNew
217
+ ? CHOREO.growBetweenNew
218
+ : kind === 'add' && (sNew || tNew)
219
+ ? CHOREO.growFromExisting
220
+ : kind === 'merge' || kind === 'split'
221
+ ? CHOREO.growAfterArrival
222
+ : CHOREO.growOther;
223
+ edge(j, EA_GROW, timing, sNew && !tNew);
224
+ break;
225
+ }
226
+ case 'removed':
227
+ edge(j, EA_RETRACT, CHOREO.retract, leaves(e.s) && !leaves(e.t));
228
+ break;
229
+ case 'collapsed':
230
+ case 'carried': {
231
+ if (kind === 'split' && e.role === 'carried') {
232
+ const mover = c.nKind[e.s] === NA_EMERGE ? e.s : c.nKind[e.t] === NA_EMERGE ? e.t : -1;
233
+ if (mover >= 0)
234
+ edge(j, EA_FOLLOW_SPLIT, [c.nA[mover], c.nB[mover]], false, mover);
235
+ else
236
+ edge(j, EA_SWAP, CHOREO.swap);
237
+ break;
238
+ }
239
+ const mover = c.nKind[e.sb] === NA_TRAVEL ? e.sb : c.nKind[e.tb] === NA_TRAVEL ? e.tb : -1;
240
+ if (mover >= 0)
241
+ edge(j, EA_FOLLOW_MERGE, [c.nA[mover], c.nB[mover]], false, mover);
242
+ else if (e.role === 'collapsed')
243
+ edge(j, EA_RETRACT, CHOREO.retract, leaves(e.s) && !leaves(e.t));
244
+ else
245
+ edge(j, EA_SWAP, CHOREO.swap);
246
+ break;
247
+ }
248
+ case 'retarget': {
249
+ const pivot = e.s === e.sb && e.t !== e.tb ? e.s : e.t === e.tb && e.s !== e.sb ? e.t : -1;
250
+ if (pivot >= 0)
251
+ edge(j, EA_SWING, CHOREO.swing, false, pivot);
252
+ else
253
+ edge(j, EA_SWAP, CHOREO.swap);
254
+ break;
255
+ }
256
+ case 'modified':
257
+ edge(j, EA_FADE, CHOREO.edgeFade);
258
+ break;
259
+ case 'unchanged':
260
+ break;
261
+ default:
262
+ assertNever(e.role);
263
+ }
264
+ // Safety net for unusual style combinations (e.g. an edge hidden in both versions).
265
+ if (B.hidden && A.hidden)
266
+ c.eKind[j] = EA_NONE;
267
+ }
268
+ }
269
+ return c;
270
+ }
271
+ //# sourceMappingURL=choreography.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"choreography.js","sourceRoot":"","sources":["../src/choreography.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /** sRGB color with straight (non-premultiplied) alpha. Channels 0–255, alpha 0–1. */
2
+ export interface Rgba {
3
+ readonly r: number;
4
+ readonly g: number;
5
+ readonly b: number;
6
+ readonly a: number;
7
+ }
8
+ /** Parse `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()`, `rgba()` and `transparent`. */
9
+ export declare function parseColor(css: string): Rgba;
10
+ /** Source-over compositing of `fg` onto `bg` (both may be translucent). */
11
+ export declare function composite(fg: Rgba, bg: Rgba): Rgba;
12
+ /** WCAG 2.x relative luminance of an opaque color. */
13
+ export declare function relativeLuminance(c: Rgba): number;
14
+ /**
15
+ * WCAG 2.x contrast ratio in [1, 21]. A translucent foreground is composited over the
16
+ * background first; a translucent background is composited over white (the initial CSS
17
+ * canvas), since what lies beneath it is unknown.
18
+ */
19
+ export declare function contrastRatio(foreground: string, background: string): number;
20
+ /** `#rrggbb` when opaque, else `rgba(r, g, b, a)` (alpha rounded to 3 decimals). */
21
+ export declare function formatColor(c: Rgba): string;
22
+ /** Interpolate in sRGB with premultiplied alpha (no dark fringes when fading to transparent). */
23
+ export declare function mixRgba(a: Rgba, b: Rgba, t: number): Rgba;
24
+ /** `a` → `b` at `t` ∈ [0, 1]. */
25
+ export declare function mix(a: string, b: string, t: number): string;
26
+ /** The same color with its alpha replaced. */
27
+ export declare function withAlpha(color: string, alpha: number): string;
28
+ /** Move a color toward the gray of equal luma by `amount` ∈ [0, 1] (alpha kept). */
29
+ export declare function desaturate(color: string, amount: number): string;
30
+ /** Precomputed interpolation `from` → `to` for allocation-free animation. */
31
+ export type ColorRamp = readonly string[];
32
+ /** Number of steps in a ramp: smooth to the eye over the ≤ 1 s transitions it is used for. */
33
+ export declare const RAMP_STEPS = 33;
34
+ export declare function colorRamp(from: string, to: string, steps?: number): ColorRamp;
35
+ /** Sample a ramp at `t` ∈ [0, 1]. Allocation-free. */
36
+ export declare function rampAt(ramp: ColorRamp, t: number): string;
37
+ /** Memoizes ramps by endpoint pair so equal transitions share one array. */
38
+ export declare class RampCache {
39
+ private readonly cache;
40
+ get(from: string, to: string): ColorRamp;
41
+ }
42
+ //# sourceMappingURL=color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AASA,qFAAqF;AACrF,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB;AAqDD,0FAA0F;AAC1F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAO5C;AAED,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,IAAI,CAKlD;AAOD,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAEjD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAO5E;AAOD,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAM3C;AAED,iGAAiG;AACjG,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAMzD;AAED,iCAAiC;AACjC,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,8CAA8C;AAC9C,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUhE;AAED,6EAA6E;AAC7E,MAAM,MAAM,SAAS,GAAG,SAAS,MAAM,EAAE,CAAC;AAE1C,8FAA8F;AAC9F,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,GAAE,MAAmB,GAAG,SAAS,CASzF;AAED,sDAAsD;AACtD,wBAAgB,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAIzD;AAED,4EAA4E;AAC5E,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEtD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAQvC;CACF"}
package/dist/color.js ADDED
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Color math for the design tokens: parsing, alpha compositing, WCAG contrast and
3
+ * derived colors (mixes, desaturation, precomputed ramps for animation).
4
+ *
5
+ * Everything here allocates; it runs when tokens or a resolver are built. Hot paths
6
+ * (the resolver at 60 fps) only index into precomputed `ColorRamp`s.
7
+ */
8
+ import { KgdiffError } from '@kgdiff/core';
9
+ const WHITE = { r: 255, g: 255, b: 255, a: 1 };
10
+ const clamp = (v, lo, hi) => Math.min(hi, Math.max(lo, v));
11
+ function invalid(css, why) {
12
+ throw new KgdiffError('invalid-input', `Unsupported color ${JSON.stringify(css)}: ${why}. Use #rgb, #rgba, #rrggbb, #rrggbbaa, rgb() or rgba().`, { color: css });
13
+ }
14
+ function parseHex(css, hex) {
15
+ if (!/^[0-9a-f]+$/i.test(hex))
16
+ invalid(css, 'not a hex color');
17
+ const short = hex.length === 3 || hex.length === 4;
18
+ if (!short && hex.length !== 6 && hex.length !== 8)
19
+ invalid(css, 'hex colors have 3, 4, 6 or 8 digits');
20
+ const channel = (i) => short
21
+ ? Number.parseInt(hex.charAt(i) + hex.charAt(i), 16)
22
+ : Number.parseInt(hex.slice(2 * i, 2 * i + 2), 16);
23
+ const hasAlpha = hex.length === 4 || hex.length === 8;
24
+ return { r: channel(0), g: channel(1), b: channel(2), a: hasAlpha ? channel(3) / 255 : 1 };
25
+ }
26
+ function parseChannel(css, token, scale) {
27
+ const percent = token.endsWith('%');
28
+ const value = Number(percent ? token.slice(0, -1) : token);
29
+ if (token === '' || !Number.isFinite(value))
30
+ invalid(css, `bad component "${token}"`);
31
+ return clamp(percent ? (value / 100) * scale : value, 0, scale);
32
+ }
33
+ function parseFunctional(css, body) {
34
+ // Both `rgb(1, 2, 3, 0.5)` and `rgb(1 2 3 / 50%)`.
35
+ const [channels = '', alphaPart, extra] = body.split('/');
36
+ if (extra !== undefined)
37
+ invalid(css, 'more than one "/"');
38
+ const parts = channels
39
+ .split(/[\s,]+/)
40
+ .map((s) => s.trim())
41
+ .filter((s) => s !== '');
42
+ if (alphaPart !== undefined)
43
+ parts.push(alphaPart.trim());
44
+ if (parts.length !== 3 && parts.length !== 4)
45
+ invalid(css, 'expected 3 or 4 components');
46
+ const [r = '', g = '', b = '', a] = parts;
47
+ return {
48
+ r: parseChannel(css, r, 255),
49
+ g: parseChannel(css, g, 255),
50
+ b: parseChannel(css, b, 255),
51
+ a: a === undefined ? 1 : parseChannel(css, a, 1),
52
+ };
53
+ }
54
+ /** Parse `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, `rgb()`, `rgba()` and `transparent`. */
55
+ export function parseColor(css) {
56
+ const s = css.trim().toLowerCase();
57
+ if (s.startsWith('#'))
58
+ return parseHex(css, s.slice(1));
59
+ if (s === 'transparent')
60
+ return { r: 0, g: 0, b: 0, a: 0 };
61
+ const m = /^rgba?\((.*)\)$/.exec(s);
62
+ if (m)
63
+ return parseFunctional(css, m[1] ?? '');
64
+ return invalid(css, 'unknown syntax');
65
+ }
66
+ /** Source-over compositing of `fg` onto `bg` (both may be translucent). */
67
+ export function composite(fg, bg) {
68
+ const a = fg.a + bg.a * (1 - fg.a);
69
+ if (a === 0)
70
+ return { r: 0, g: 0, b: 0, a: 0 };
71
+ const ch = (f, b) => (f * fg.a + b * bg.a * (1 - fg.a)) / a;
72
+ return { r: ch(fg.r, bg.r), g: ch(fg.g, bg.g), b: ch(fg.b, bg.b), a };
73
+ }
74
+ const linear = (c) => {
75
+ const s = c / 255;
76
+ return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4;
77
+ };
78
+ /** WCAG 2.x relative luminance of an opaque color. */
79
+ export function relativeLuminance(c) {
80
+ return 0.2126 * linear(c.r) + 0.7152 * linear(c.g) + 0.0722 * linear(c.b);
81
+ }
82
+ /**
83
+ * WCAG 2.x contrast ratio in [1, 21]. A translucent foreground is composited over the
84
+ * background first; a translucent background is composited over white (the initial CSS
85
+ * canvas), since what lies beneath it is unknown.
86
+ */
87
+ export function contrastRatio(foreground, background) {
88
+ let bg = parseColor(background);
89
+ if (bg.a < 1)
90
+ bg = composite(bg, WHITE);
91
+ const fg = composite(parseColor(foreground), bg);
92
+ const l1 = relativeLuminance(fg);
93
+ const l2 = relativeLuminance(bg);
94
+ return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05);
95
+ }
96
+ const hex2 = (v) => Math.round(clamp(v, 0, 255))
97
+ .toString(16)
98
+ .padStart(2, '0');
99
+ /** `#rrggbb` when opaque, else `rgba(r, g, b, a)` (alpha rounded to 3 decimals). */
100
+ export function formatColor(c) {
101
+ if (c.a >= 1)
102
+ return `#${hex2(c.r)}${hex2(c.g)}${hex2(c.b)}`.toUpperCase();
103
+ const r = Math.round(clamp(c.r, 0, 255));
104
+ const g = Math.round(clamp(c.g, 0, 255));
105
+ const b = Math.round(clamp(c.b, 0, 255));
106
+ return `rgba(${r}, ${g}, ${b}, ${Math.round(clamp(c.a, 0, 1) * 1000) / 1000})`;
107
+ }
108
+ /** Interpolate in sRGB with premultiplied alpha (no dark fringes when fading to transparent). */
109
+ export function mixRgba(a, b, t) {
110
+ const u = clamp(t, 0, 1);
111
+ const alpha = a.a + (b.a - a.a) * u;
112
+ if (alpha === 0)
113
+ return { r: 0, g: 0, b: 0, a: 0 };
114
+ const ch = (x, y) => (x * a.a * (1 - u) + y * b.a * u) / alpha;
115
+ return { r: ch(a.r, b.r), g: ch(a.g, b.g), b: ch(a.b, b.b), a: alpha };
116
+ }
117
+ /** `a` → `b` at `t` ∈ [0, 1]. */
118
+ export function mix(a, b, t) {
119
+ return formatColor(mixRgba(parseColor(a), parseColor(b), t));
120
+ }
121
+ /** The same color with its alpha replaced. */
122
+ export function withAlpha(color, alpha) {
123
+ return formatColor({ ...parseColor(color), a: clamp(alpha, 0, 1) });
124
+ }
125
+ /** Move a color toward the gray of equal luma by `amount` ∈ [0, 1] (alpha kept). */
126
+ export function desaturate(color, amount) {
127
+ const c = parseColor(color);
128
+ const gray = 0.2126 * c.r + 0.7152 * c.g + 0.0722 * c.b;
129
+ const u = clamp(amount, 0, 1);
130
+ return formatColor({
131
+ r: c.r + (gray - c.r) * u,
132
+ g: c.g + (gray - c.g) * u,
133
+ b: c.b + (gray - c.b) * u,
134
+ a: c.a,
135
+ });
136
+ }
137
+ /** Number of steps in a ramp: smooth to the eye over the ≤ 1 s transitions it is used for. */
138
+ export const RAMP_STEPS = 33;
139
+ export function colorRamp(from, to, steps = RAMP_STEPS) {
140
+ const a = parseColor(from);
141
+ const b = parseColor(to);
142
+ const out = [];
143
+ for (let i = 0; i < steps; i++)
144
+ out.push(formatColor(mixRgba(a, b, i / (steps - 1))));
145
+ // Exact endpoints: animations must settle on the very token strings.
146
+ out[0] = from;
147
+ out[steps - 1] = to;
148
+ return Object.freeze(out);
149
+ }
150
+ /** Sample a ramp at `t` ∈ [0, 1]. Allocation-free. */
151
+ export function rampAt(ramp, t) {
152
+ const n = ramp.length - 1;
153
+ const i = t <= 0 ? 0 : t >= 1 ? n : Math.round(t * n);
154
+ return ramp[i];
155
+ }
156
+ /** Memoizes ramps by endpoint pair so equal transitions share one array. */
157
+ export class RampCache {
158
+ cache = new Map();
159
+ get(from, to) {
160
+ const key = `${from}\u0000${to}`;
161
+ let ramp = this.cache.get(key);
162
+ if (ramp === undefined) {
163
+ ramp = colorRamp(from, to);
164
+ this.cache.set(key, ramp);
165
+ }
166
+ return ramp;
167
+ }
168
+ }
169
+ //# sourceMappingURL=color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"color.js","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Numeric constants of the visual language (docs/visual-language.md §Geometry, §Typography,
3
+ * §Level of detail, §Replay choreography). One place so every module agrees.
4
+ */
5
+ /** Stroke widths in screen px (constant under zoom). */
6
+ export declare const STROKE: {
7
+ readonly neutralEdge: 1;
8
+ readonly changedEdge: 1.75;
9
+ readonly selectedEdge: 2.5;
10
+ readonly node: 1.25;
11
+ readonly hoveredNode: 2;
12
+ readonly ring: 1.5;
13
+ /** Gap between the node boundary and its ring, px. */
14
+ readonly ringGap: 3.5;
15
+ readonly glyph: 1.5;
16
+ readonly suggestion: 1.25;
17
+ /** Diameter of a pivot dot, px. */
18
+ readonly pivot: 5;
19
+ };
20
+ /** Dash patterns, px. Frozen so they can be shared by every visual without copying. */
21
+ export declare const DASH_GHOST: readonly number[];
22
+ export declare const DASH_EDGE: readonly number[];
23
+ export declare const DASH_DOTTED: readonly number[];
24
+ export declare const HALO: {
25
+ /** Dark themes: radial glow radius as a multiple of r. */
26
+ readonly glowScale: 2.6;
27
+ readonly glowAlpha: 0.32;
28
+ /** Light themes: offset ring; `radius` is r and renderers draw the ring 5 px outside it, 2 px wide. */
29
+ readonly ringAlpha: 0.35;
30
+ readonly ringOffset: 5;
31
+ readonly ringWidth: 2;
32
+ };
33
+ /** Label typography in px. */
34
+ export declare const LABEL: {
35
+ readonly size: 12;
36
+ readonly oldSize: 11;
37
+ readonly edgeSize: 10.5;
38
+ /** Gap between the node's bottom and its label, px (`offset = r·k + 5 px`). */
39
+ readonly offset: 5;
40
+ /** Secondary label sits this much lower than the primary one. */
41
+ readonly secondaryGap: 14;
42
+ /** Line box used for bounds estimation (font size × line height). */
43
+ readonly lineHeight: 1.3;
44
+ };
45
+ /**
46
+ * Level-of-detail thresholds (camera zoom). Label thresholds are permissive on purpose: the
47
+ * renderer's greedy collision culling decides what fits, so the overview of a small graph is
48
+ * not a field of anonymous dots.
49
+ */
50
+ export declare const LOD: {
51
+ readonly changedLabel: 0.35;
52
+ readonly neutralLabel: 0.5;
53
+ readonly importantNeutralLabel: 0.35;
54
+ readonly importantThreshold: 0.7;
55
+ /** Scenes with at most this many visible nodes (after focus) use the small-scene thresholds. */
56
+ readonly smallScene: 300;
57
+ readonly smallChangedLabel: 0.2;
58
+ readonly smallNeutralLabel: 0.25;
59
+ readonly edgeLabel: 1.1;
60
+ readonly badge: 1.2;
61
+ /** Renderers draw arrowheads on edges with `arrow: false` from this zoom on. */
62
+ readonly arrow: 1.2;
63
+ };
64
+ /** Parallel edges between one pair curve with ±k·this (k = 1, 2, …). */
65
+ export declare const PARALLEL_CURVATURE = 0.18;
66
+ /** Alpha levels of the selection spotlight, the replay spotlight, filters and focus. */
67
+ export declare const EMPHASIS: {
68
+ readonly selectedContext: 0.7;
69
+ readonly selectedRest: 0.18;
70
+ readonly replayContext: 0.7;
71
+ readonly replayRest: 0.3;
72
+ readonly filtered: 0.4;
73
+ readonly focusContext: 0.55;
74
+ readonly ghostEdge: 0.45;
75
+ readonly collapsedEdge: 0.5;
76
+ };
77
+ /** Replay window phases as fractions of the window (spotlight / transform / settle). */
78
+ export declare const PHASE: {
79
+ readonly spotlightEnd: 0.18;
80
+ readonly settleStart: 0.82;
81
+ };
82
+ /** Replay timeline (docs/algorithms.md §10). */
83
+ export declare const TIMELINE: {
84
+ readonly pace: 1100;
85
+ readonly chapterThreshold: 40;
86
+ readonly gap: 160;
87
+ readonly maxStagger: 0.35;
88
+ };
89
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wDAAwD;AACxD,eAAO,MAAM,MAAM;aACjB,WAAW,EAAE,CAAC;aACd,WAAW,EAAE,IAAI;aACjB,YAAY,EAAE,GAAG;aACjB,IAAI,EAAE,IAAI;aACV,WAAW,EAAE,CAAC;aACd,IAAI,EAAE,GAAG;IACT,sDAAsD;aACtD,OAAO,EAAE,GAAG;aACZ,KAAK,EAAE,GAAG;aACV,UAAU,EAAE,IAAI;IAChB,mCAAmC;aACnC,KAAK,EAAE,CAAC;CACA,CAAC;AAEX,uFAAuF;AACvF,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAA4B,CAAC;AACrE,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAA0B,CAAC;AAClE,eAAO,MAAM,WAAW,EAAE,SAAS,MAAM,EAA0B,CAAC;AAEpE,eAAO,MAAM,IAAI;IACf,0DAA0D;aAC1D,SAAS,EAAE,GAAG;aACd,SAAS,EAAE,IAAI;IACf,uGAAuG;aACvG,SAAS,EAAE,IAAI;aACf,UAAU,EAAE,CAAC;aACb,SAAS,EAAE,CAAC;CACJ,CAAC;AAEX,8BAA8B;AAC9B,eAAO,MAAM,KAAK;aAChB,IAAI,EAAE,EAAE;aACR,OAAO,EAAE,EAAE;aACX,QAAQ,EAAE,IAAI;IACd,+EAA+E;aAC/E,MAAM,EAAE,CAAC;IACT,iEAAiE;aACjE,YAAY,EAAE,EAAE;IAChB,qEAAqE;aACrE,UAAU,EAAE,GAAG;CACP,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,GAAG;aACd,YAAY,EAAE,IAAI;aAClB,YAAY,EAAE,GAAG;aACjB,qBAAqB,EAAE,IAAI;aAC3B,kBAAkB,EAAE,GAAG;IACvB,gGAAgG;aAChG,UAAU,EAAE,GAAG;aACf,iBAAiB,EAAE,GAAG;aACtB,iBAAiB,EAAE,IAAI;aACvB,SAAS,EAAE,GAAG;aACd,KAAK,EAAE,GAAG;IACV,gFAAgF;aAChF,KAAK,EAAE,GAAG;CACF,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAEvC,wFAAwF;AACxF,eAAO,MAAM,QAAQ;aACnB,eAAe,EAAE,GAAG;aACpB,YAAY,EAAE,IAAI;aAClB,aAAa,EAAE,GAAG;aAClB,UAAU,EAAE,GAAG;aACf,QAAQ,EAAE,GAAG;aACb,YAAY,EAAE,IAAI;aAClB,SAAS,EAAE,IAAI;aACf,aAAa,EAAE,GAAG;CACV,CAAC;AAEX,wFAAwF;AACxF,eAAO,MAAM,KAAK;aAChB,YAAY,EAAE,IAAI;aAClB,WAAW,EAAE,IAAI;CACT,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,QAAQ;aACnB,IAAI,EAAE,IAAI;aACV,gBAAgB,EAAE,EAAE;aACpB,GAAG,EAAE,GAAG;aACR,UAAU,EAAE,IAAI;CACR,CAAC"}