claude-exode-mcp 7.5.7 → 7.5.8

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 (173) hide show
  1. package/MCP_DOCUMENTATION.md +1 -0
  2. package/SKILL.md +10 -0
  3. package/examples/aurum-product-page.exode +3208 -0
  4. package/examples/bell-ring-icon.exode +1 -0
  5. package/examples/drift-kinetic-type.exode +770 -0
  6. package/examples/earbuds-product.exode +214 -0
  7. package/examples/energy-flow.exode +1736 -0
  8. package/examples/flux-hero.exode +223 -0
  9. package/examples/gooey-toggle.exode +214 -0
  10. package/examples/gravity-well.exode +3113 -0
  11. package/examples/heart-icon.exode +1 -0
  12. package/examples/hologram-temple.exode +8100 -0
  13. package/examples/jarful-app.exode +1 -0
  14. package/examples/kip-character-rig.exode +1 -0
  15. package/examples/low-tide-tilt.exode +2216 -0
  16. package/examples/manifest.json +352 -0
  17. package/examples/swipe-stack-carousel.exode +4048 -0
  18. package/examples/tokyo-neon-weather.exode +470 -0
  19. package/examples/typographic-collapse.exode +1578 -0
  20. package/examples/void-product-ad.exode +1269 -0
  21. package/examples/wire-globe-card.exode +580 -0
  22. package/index.d.ts +41 -1
  23. package/index.js +2553 -2407
  24. package/package.json +4 -2
  25. package/render-runtime/exode-runtime.js +20 -20
  26. package/skills/creative-motion/SKILL.md +10 -0
  27. package/skills/creative-motion/recipes/character-rig.js +104 -0
  28. package/skills/creative-motion/recipes/dashboard.js +120 -0
  29. package/skills/creative-motion/recipes/game-arcade.js +203 -0
  30. package/skills/creative-motion/recipes/hero-physics.js +65 -0
  31. package/skills/creative-motion/recipes/pricing.js +88 -0
  32. package/skills/creative-motion/recipes/title-sequence.js +62 -0
  33. package/skills/creative-motion/references/apps.md +37 -0
  34. package/skills/creative-motion/references/gotchas.md +80 -0
  35. package/skills/creative-motion/references/native-layers.md +60 -0
  36. package/skills/creative-motion/references/quality.md +54 -0
  37. package/src/__tests__/buildKit.test.ts +127 -0
  38. package/src/__tests__/effectKnobs.test.ts +162 -0
  39. package/src/__tests__/nativeLayers.test.ts +178 -0
  40. package/src/buildKit.d.ts +301 -0
  41. package/src/buildKit.d.ts.map +1 -0
  42. package/src/buildKit.js +559 -0
  43. package/src/buildKit.js.map +1 -0
  44. package/src/buildKit.ts +520 -0
  45. package/src/compiler.d.ts +4 -0
  46. package/src/compiler.d.ts.map +1 -1
  47. package/src/compiler.js +21 -45
  48. package/src/compiler.js.map +1 -1
  49. package/src/compiler.ts +22 -51
  50. package/src/critique.d.ts +8 -0
  51. package/src/critique.d.ts.map +1 -0
  52. package/src/critique.js +348 -0
  53. package/src/critique.js.map +1 -0
  54. package/src/critique.ts +239 -0
  55. package/src/effectKnobs.d.ts +72 -0
  56. package/src/effectKnobs.d.ts.map +1 -0
  57. package/src/effectKnobs.js +541 -0
  58. package/src/effectKnobs.js.map +1 -0
  59. package/src/effectKnobs.ts +445 -0
  60. package/src/effectOptimizer.d.ts +18 -0
  61. package/src/effectOptimizer.d.ts.map +1 -0
  62. package/src/effectOptimizer.js +125 -0
  63. package/src/effectOptimizer.js.map +1 -0
  64. package/src/effectOptimizer.ts +104 -0
  65. package/src/engine/layout.js +1 -1
  66. package/src/engine/layout.js.map +1 -1
  67. package/src/engine/layout.ts +1 -1
  68. package/src/examples.d.ts +30 -0
  69. package/src/examples.d.ts.map +1 -0
  70. package/src/examples.js +168 -0
  71. package/src/examples.js.map +1 -0
  72. package/src/examples.ts +151 -0
  73. package/src/handlers/artboardHandlers.d.ts.map +1 -1
  74. package/src/handlers/artboardHandlers.js +45 -10
  75. package/src/handlers/artboardHandlers.js.map +1 -1
  76. package/src/handlers/artboardHandlers.ts +43 -12
  77. package/src/handlers/buildHandlers.d.ts +2 -0
  78. package/src/handlers/buildHandlers.d.ts.map +1 -0
  79. package/src/handlers/buildHandlers.js +86 -0
  80. package/src/handlers/buildHandlers.js.map +1 -0
  81. package/src/handlers/buildHandlers.ts +76 -0
  82. package/src/handlers/compilerHandlers.d.ts.map +1 -1
  83. package/src/handlers/compilerHandlers.js +32 -2
  84. package/src/handlers/compilerHandlers.js.map +1 -1
  85. package/src/handlers/compilerHandlers.ts +31 -2
  86. package/src/handlers/exampleHandlers.d.ts +2 -0
  87. package/src/handlers/exampleHandlers.d.ts.map +1 -0
  88. package/src/handlers/exampleHandlers.js +81 -0
  89. package/src/handlers/exampleHandlers.js.map +1 -0
  90. package/src/handlers/exampleHandlers.ts +76 -0
  91. package/src/handlers/renderHandlers.d.ts.map +1 -1
  92. package/src/handlers/renderHandlers.js +100 -2
  93. package/src/handlers/renderHandlers.js.map +1 -1
  94. package/src/handlers/renderHandlers.ts +90 -2
  95. package/src/handlers/scaffoldHandlers.d.ts.map +1 -1
  96. package/src/handlers/scaffoldHandlers.js +3 -0
  97. package/src/handlers/scaffoldHandlers.js.map +1 -1
  98. package/src/handlers/scaffoldHandlers.ts +2 -0
  99. package/src/handlers/widgetHandlers.js +1 -1
  100. package/src/handlers/widgetHandlers.js.map +1 -1
  101. package/src/handlers/widgetHandlers.ts +1 -1
  102. package/src/lottie/convert.d.ts +16 -0
  103. package/src/lottie/convert.d.ts.map +1 -0
  104. package/src/lottie/convert.js +1225 -0
  105. package/src/lottie/convert.js.map +1 -0
  106. package/src/lottie/convert.ts +1134 -0
  107. package/src/lottie/evaluate.d.ts +48 -0
  108. package/src/lottie/evaluate.d.ts.map +1 -0
  109. package/src/lottie/evaluate.js +174 -0
  110. package/src/lottie/evaluate.js.map +1 -0
  111. package/src/lottie/evaluate.ts +184 -0
  112. package/src/nativeLayers.d.ts +76 -0
  113. package/src/nativeLayers.d.ts.map +1 -0
  114. package/src/nativeLayers.js +404 -0
  115. package/src/nativeLayers.js.map +1 -0
  116. package/src/nativeLayers.ts +339 -0
  117. package/src/render/motionBrief.d.ts.map +1 -1
  118. package/src/render/motionBrief.js +4 -0
  119. package/src/render/motionBrief.js.map +1 -1
  120. package/src/render/motionBrief.ts +4 -0
  121. package/src/render/videoRenderer.d.ts.map +1 -1
  122. package/src/render/videoRenderer.js +5 -2
  123. package/src/render/videoRenderer.js.map +1 -1
  124. package/src/render/videoRenderer.ts +5 -2
  125. package/src/rive/convert.d.ts +17 -0
  126. package/src/rive/convert.d.ts.map +1 -0
  127. package/src/rive/convert.js +1779 -0
  128. package/src/rive/convert.js.map +1 -0
  129. package/src/rive/convert.ts +1492 -0
  130. package/src/rive/font.d.ts +13 -0
  131. package/src/rive/font.d.ts.map +1 -0
  132. package/src/rive/font.js +154 -0
  133. package/src/rive/font.js.map +1 -0
  134. package/src/rive/font.ts +132 -0
  135. package/src/rive/layout.d.ts +20 -0
  136. package/src/rive/layout.d.ts.map +1 -0
  137. package/src/rive/layout.js +145 -0
  138. package/src/rive/layout.js.map +1 -0
  139. package/src/rive/layout.ts +140 -0
  140. package/src/rive/reader.d.ts +32 -0
  141. package/src/rive/reader.d.ts.map +1 -0
  142. package/src/rive/reader.js +172 -0
  143. package/src/rive/reader.js.map +1 -0
  144. package/src/rive/reader.ts +160 -0
  145. package/src/rive/schema.generated.d.ts +9 -0
  146. package/src/rive/schema.generated.d.ts.map +1 -0
  147. package/src/rive/schema.generated.js +13 -0
  148. package/src/rive/schema.generated.js.map +1 -0
  149. package/src/rive/schema.generated.ts +13 -0
  150. package/src/schema.d.ts +5 -0
  151. package/src/schema.d.ts.map +1 -1
  152. package/src/schema.js +5 -0
  153. package/src/schema.js.map +1 -1
  154. package/src/schema.ts +6 -0
  155. package/src/serverInstructions.d.ts +2 -0
  156. package/src/serverInstructions.d.ts.map +1 -0
  157. package/src/serverInstructions.js +22 -0
  158. package/src/serverInstructions.js.map +1 -0
  159. package/src/serverInstructions.ts +21 -0
  160. package/src/sseServer.d.ts +2 -0
  161. package/src/sseServer.d.ts.map +1 -0
  162. package/src/sseServer.js +165 -0
  163. package/src/sseServer.js.map +1 -0
  164. package/src/sseServer.ts +189 -0
  165. package/src/utils.d.ts.map +1 -1
  166. package/src/utils.js +23 -1
  167. package/src/utils.js.map +1 -1
  168. package/src/utils.ts +13 -1
  169. package/src/widgets.d.ts +26 -0
  170. package/src/widgets.d.ts.map +1 -1
  171. package/src/widgets.js +89 -45
  172. package/src/widgets.js.map +1 -1
  173. package/src/widgets.ts +88 -45
@@ -0,0 +1,140 @@
1
+ // @ts-nocheck
2
+ // GENERATED by scripts/sync-lottie-converter.mjs from editor/src/utils/rive. Edit there, then re-run.
3
+ // A small flexbox pass for Rive layouts (the runtime uses Yoga). It covers what
4
+ // layout files mostly use: row / column (and reversed), gaps, padding, margins,
5
+ // the 3x3 alignment grid with space-between, and fixed / fill / hug sizing in
6
+ // points or percent. Wrap, grid and absolute insets beyond left/top are not solved.
7
+
8
+ import { isA, type RivObject } from './reader.js';
9
+
10
+ export interface LayoutBox { x: number; y: number; w: number; h: number }
11
+
12
+ interface Scene { byIndex: (RivObject | null)[]; children: Map<number, RivObject[]> }
13
+
14
+ /** Layout children: layouts, layout nested artboards, and text (sized to its own box). */
15
+ const participates = (o: RivObject) => o.type === 'LayoutComponent' || o.type === 'NestedArtboardLayout' || o.type === 'Text';
16
+
17
+ /** Solve every layout under the artboard; boxes are relative to the parent layout's top-left. */
18
+ export function solveLayouts(s: Scene, artboard: RivObject, measure: (o: RivObject) => { w: number; h: number }): Map<number, LayoutBox> {
19
+ const out = new Map<number, LayoutBox>();
20
+ const style = (o: RivObject) => (o.props.styleId !== undefined ? s.byIndex[o.props.styleId] : null)?.props || {};
21
+ // Text takes part only inside a layout box, not directly on the artboard.
22
+ const kids = (o: RivObject) => (s.children.get(o.index) || []).filter(participates).filter(k => !(k.type === 'Text' && o.index === 0)).filter(k => (style(k).displayValue ?? 0) !== 1);
23
+ const val = (v: number | undefined, units: number | undefined, base: number) => ((units ?? 1) === 2 ? ((v || 0) / 100) * base : v || 0);
24
+ const isRow = (st: any) => (st.flexDirectionValue ?? 2) >= 2;
25
+ const pad = (st: any, w: number, h: number) => ({
26
+ l: val(st.paddingLeft, st.paddingLeftUnitsValue, w), r: val(st.paddingRight, st.paddingRightUnitsValue, w),
27
+ t: val(st.paddingTop, st.paddingTopUnitsValue, h), b: val(st.paddingBottom, st.paddingBottomUnitsValue, h),
28
+ });
29
+ const margin = (st: any, w: number, h: number) => ({
30
+ l: val(st.marginLeft, st.marginLeftUnitsValue, w), r: val(st.marginRight, st.marginRightUnitsValue, w),
31
+ t: val(st.marginTop, st.marginTopUnitsValue, h), b: val(st.marginBottom, st.marginBottomUnitsValue, h),
32
+ });
33
+ const clamp = (v: number, st: any, axis: 'w' | 'h', base: number) => {
34
+ const mn = axis === 'w' ? st.minWidth : st.minHeight, mx = axis === 'w' ? st.maxWidth : st.maxHeight;
35
+ const mnu = axis === 'w' ? st.minWidthUnitsValue : st.minHeightUnitsValue, mxu = axis === 'w' ? st.maxWidthUnitsValue : st.maxHeightUnitsValue;
36
+ if (mnu) v = Math.max(v, val(mn, mnu, base));
37
+ if (mxu) v = Math.min(v, val(mx, mxu, base));
38
+ return v;
39
+ };
40
+ const scaleType = (o: RivObject, axis: 'w' | 'h') => { const st = style(o); return (axis === 'w' ? st.layoutWidthScaleType : st.layoutHeightScaleType) ?? 0; };
41
+
42
+ /** Size a node gets before fill: fixed or hugged (fill reports its hug size). */
43
+ const baseSize = (o: RivObject, axis: 'w' | 'h', parentW: number, parentH: number): number => {
44
+ const st = style(o);
45
+ if (o.type === 'Text') { const n = measure(o); return axis === 'w' ? n.w : n.h; }
46
+ if (o.type === 'NestedArtboardLayout') {
47
+ const v = axis === 'w' ? o.props.instanceWidth : o.props.instanceHeight;
48
+ const n = measure(o);
49
+ return v !== undefined && v >= 0 ? val(v, axis === 'w' ? o.props.instanceWidthUnitsValue : o.props.instanceHeightUnitsValue, axis === 'w' ? parentW : parentH) : axis === 'w' ? n.w : n.h;
50
+ }
51
+ const t = scaleType(o, axis);
52
+ const base = axis === 'w' ? parentW : parentH;
53
+ if (t === 0 && (axis === 'w' ? st.widthUnitsValue ?? 1 : st.heightUnitsValue ?? 1) !== 3) {
54
+ return clamp(val(axis === 'w' ? o.props.width : o.props.height, axis === 'w' ? st.widthUnitsValue : st.heightUnitsValue, base), st, axis, base);
55
+ }
56
+ return clamp(hug(o, axis), st, axis, base);
57
+ };
58
+ /** Content size along an axis from the children (plus padding). */
59
+ const hug = (o: RivObject, axis: 'w' | 'h'): number => {
60
+ const st = style(o), row = isRow(st), p = pad(st, 0, 0);
61
+ const ks = kids(o).filter(k => (style(k).positionTypeValue ?? 1) !== 2);
62
+ const sizes = ks.map(k => { const m = margin(style(k), 0, 0); return baseSize(k, axis, 0, 0) + (axis === 'w' ? m.l + m.r : m.t + m.b); });
63
+ const along = (axis === 'w') === row;
64
+ const gap = row ? st.gapHorizontal || 0 : st.gapVertical || 0;
65
+ const inner = along ? sizes.reduce((a, b) => a + b, 0) + gap * Math.max(0, ks.length - 1) : Math.max(0, ...sizes);
66
+ return inner + (axis === 'w' ? p.l + p.r : p.t + p.b);
67
+ };
68
+
69
+ const place = (o: RivObject, w: number, h: number) => {
70
+ const st = style(o), row = isRow(st);
71
+ // Right-to-left (direction 2, inherited) flips a row's main axis.
72
+ const rtl = dir(o) === 2;
73
+ const reverse = ((st.flexDirectionValue ?? 2) % 2 === 1) !== (row && rtl);
74
+ const p = pad(st, w, h);
75
+ const iw = Math.max(0, w - p.l - p.r), ih = Math.max(0, h - p.t - p.b);
76
+ const all = kids(o);
77
+ const flow = all.filter(k => (style(k).positionTypeValue ?? 1) !== 2);
78
+ const mainLen = row ? iw : ih, crossLen = row ? ih : iw;
79
+ const gap = row ? st.gapHorizontal || 0 : st.gapVertical || 0;
80
+ const items = flow.map(k => {
81
+ const ks = style(k), m = margin(ks, iw, ih);
82
+ const mm = row ? m.l + m.r : m.t + m.b, cm = row ? m.t + m.b : m.l + m.r;
83
+ const mainAxis = row ? 'w' : 'h', crossAxis = row ? 'h' : 'w';
84
+ const fillMain = k.type === 'LayoutComponent' && scaleType(k, mainAxis) === 1;
85
+ const fillCross = k.type === 'LayoutComponent' && scaleType(k, crossAxis) === 1;
86
+ return { k, m, mm, cm, fillMain, main: fillMain ? 0 : baseSize(k, mainAxis, iw, ih), cross: fillCross ? crossLen - cm : baseSize(k, crossAxis, iw, ih) };
87
+ });
88
+ const used = items.reduce((a, it) => a + it.main + it.mm, 0) + gap * Math.max(0, items.length - 1);
89
+ const fills = items.filter(it => it.fillMain);
90
+ const free = mainLen - used;
91
+ if (fills.length) for (const it of fills) it.main = Math.max(0, free / fills.length);
92
+ const rest = fills.length ? 0 : Math.max(0, free);
93
+ // 3x3 alignment grid: column = horizontal position, row = vertical position.
94
+ const a = st.layoutAlignmentType ?? 0;
95
+ let hPos = a >= 9 ? a - 9 : a % 3;
96
+ const vPos = a >= 9 ? 0 : Math.floor(a / 3);
97
+ if (rtl && !row) hPos = 2 - hPos; // a row mirrors its main axis below; a column's cross axis is horizontal
98
+ const mainPos = row ? hPos : vPos, crossPos = row ? vPos : hPos;
99
+ const between = a >= 9 && items.length > 1;
100
+ let cursor = between ? 0 : (rest * mainPos) / 2;
101
+ const step = between ? free / (items.length - 1) : 0;
102
+ if (a >= 9 && items.length === 1) cursor = (rest * (a - 9)) / 2;
103
+ // Reversed main axis: lay out in order from the far end (mirrored positions).
104
+ for (const it of items) {
105
+ const start = cursor + (row ? it.m.l : it.m.t);
106
+ const crossOff = ((crossLen - it.cross - it.cm) * (a >= 9 ? a - 9 : crossPos)) / 2 + (row ? it.m.t : it.m.l);
107
+ const mainStart = reverse ? mainLen - start - it.main : start;
108
+ const box: LayoutBox = row
109
+ ? { x: p.l + mainStart, y: p.t + crossOff, w: it.main, h: it.cross }
110
+ : { x: p.l + crossOff, y: p.t + mainStart, w: it.cross, h: it.main };
111
+ out.set(it.k.index, box);
112
+ cursor += it.main + it.mm + gap + step;
113
+ }
114
+ for (const k of all.filter(k => (style(k).positionTypeValue ?? 1) === 2)) {
115
+ const ks = style(k);
116
+ const kw = baseSize(k, 'w', iw, ih), kh = baseSize(k, 'h', iw, ih);
117
+ out.set(k.index, { x: val(ks.positionLeft, ks.positionLeftUnitsValue, w), y: val(ks.positionTop, ks.positionTopUnitsValue, h), w: kw, h: kh });
118
+ }
119
+ for (const k of all) { const b = out.get(k.index); if (b && k.type === 'LayoutComponent') place(k, b.w, b.h); }
120
+ };
121
+ const dirCache = new Map<number, number>();
122
+ const dir = (o: RivObject): number => {
123
+ if (dirCache.has(o.index)) return dirCache.get(o.index)!;
124
+ const d = style(o).directionValue ?? 0;
125
+ const par = o.index === 0 ? null : s.byIndex[o.props.parentId ?? 0];
126
+ const v = d || (par ? dir(par) : 1);
127
+ dirCache.set(o.index, v);
128
+ return v;
129
+ };
130
+ // An artboard that hugs takes its content size.
131
+ const ast = style(artboard);
132
+ const W = (ast.layoutWidthScaleType ?? 0) === 2 ? hug(artboard, 'w') : artboard.props.width || 0;
133
+ const H = (ast.layoutHeightScaleType ?? 0) === 2 ? hug(artboard, 'h') : artboard.props.height || 0;
134
+ out.set(0, { x: 0, y: 0, w: W, h: H });
135
+ place(artboard, W, H);
136
+ return out;
137
+ }
138
+
139
+ export const isLayoutParticipant = participates;
140
+ export const isLayout = (o: RivObject | null | undefined) => !!o && isA(o.type, 'LayoutComponent');
@@ -0,0 +1,32 @@
1
+ export interface RivObject {
2
+ type: string;
3
+ typeKey: number;
4
+ props: Record<string, any>;
5
+ /** Index in its artboard's object list, or -1 if it takes none. */
6
+ index: number;
7
+ }
8
+ export interface RivArtboard {
9
+ artboard: RivObject;
10
+ /** Index -> object (components, interpolators). */
11
+ slots: (RivObject | null)[];
12
+ /** All objects of this artboard in stream order (animations, keyframes, state machines too). */
13
+ stream: RivObject[];
14
+ }
15
+ export interface RivFile {
16
+ major: number;
17
+ minor: number;
18
+ fileId: number;
19
+ artboards: RivArtboard[];
20
+ /** File-level assets in stream order, each with its embedded bytes when present. */
21
+ assets: {
22
+ asset: RivObject;
23
+ bytes?: Uint8Array;
24
+ }[];
25
+ unknownTypes: Set<number>;
26
+ }
27
+ /** Is class `name` (or a subclass of) `base`? */
28
+ export declare function isA(name: string, base: string): boolean;
29
+ export declare function readRiv(data: ArrayBuffer | Uint8Array): RivFile;
30
+ /** ARGB uint32 -> [#rrggbb, alpha 0..1]. */
31
+ export declare const argb: (c: number) => [string, number];
32
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["reader.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,mDAAmD;IACnD,KAAK,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,EAAE,CAAC;IAC5B,gGAAgG;IAChG,MAAM,EAAE,SAAS,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,oFAAoF;IACpF,MAAM,EAAE;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,UAAU,CAAA;KAAE,EAAE,CAAC;IACnD,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7B;AAwBD,iDAAiD;AACjD,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQvD;AAoBD,wBAAgB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CA0D/D;AAED,4CAA4C;AAC5C,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,CAAC,MAAM,EAAE,MAAM,CAI/C,CAAC"}
@@ -0,0 +1,172 @@
1
+ // @ts-nocheck
2
+ // GENERATED by scripts/sync-lottie-converter.mjs from editor/src/utils/rive. Edit there, then re-run.
3
+ // .riv (Rive runtime file) reader.
4
+ //
5
+ // Format, as read by rive-runtime (file.cpp / runtime_header.hpp):
6
+ // "RIVE" | varuint major | varuint minor | varuint fileId
7
+ // | property table of contents: varuint keys until 0, then 2-bit field
8
+ // types packed into uint32s (for properties this reader may not know)
9
+ // | objects: varuint typeKey, then (varuint propertyKey, value)* until key 0.
10
+ // Values: uint/id varuint, int zig-zag varuint, double float32, color uint32,
11
+ // bool one byte, string/bytes varuint length + data.
12
+ // Inside an artboard, every Component, keyframe interpolator and user input
13
+ // takes the next index of the artboard's object list (the artboard is 0);
14
+ // parentId, objectId and interpolatorId refer to those indices.
15
+ import { CLASS_PROPS, PARENTS, PROPS, TYPES } from './schema.generated.js';
16
+ const FIELD_BY_TOC = ['uint', 'string', 'double', 'color'];
17
+ class Reader {
18
+ bytes;
19
+ pos = 0;
20
+ view;
21
+ constructor(bytes) {
22
+ this.bytes = bytes;
23
+ this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
24
+ }
25
+ get done() { return this.pos >= this.bytes.length; }
26
+ byte() { if (this.pos >= this.bytes.length)
27
+ throw new Error('Unexpected end of .riv data'); return this.bytes[this.pos++]; }
28
+ varuint() {
29
+ let result = 0, shift = 1, b;
30
+ do {
31
+ b = this.byte();
32
+ result += (b & 0x7f) * shift;
33
+ shift *= 128;
34
+ } while (b & 0x80);
35
+ return result;
36
+ }
37
+ int() { const u = this.varuint(); return (u % 2) ? -(u + 1) / 2 : u / 2; }
38
+ float32() { const v = this.view.getFloat32(this.pos, true); this.pos += 4; return v; }
39
+ uint32() { const v = this.view.getUint32(this.pos, true); this.pos += 4; return v; }
40
+ raw(n) { const v = this.bytes.subarray(this.pos, this.pos + n); this.pos += n; return v; }
41
+ string() { const n = this.varuint(); return new TextDecoder().decode(this.raw(n)); }
42
+ bytesField() { const n = this.varuint(); return this.raw(n).slice(); }
43
+ }
44
+ const ancestry = new Map();
45
+ /** Is class `name` (or a subclass of) `base`? */
46
+ export function isA(name, base) {
47
+ let set = ancestry.get(name);
48
+ if (!set) {
49
+ set = new Set();
50
+ for (let n = name, guard = 0; n && guard < 40; n = PARENTS[n], guard++)
51
+ set.add(n);
52
+ ancestry.set(name, set);
53
+ }
54
+ return set.has(base);
55
+ }
56
+ /** Schema defaults of every property a class declares or inherits. */
57
+ const defaultsCache = new Map();
58
+ function defaultsOf(name) {
59
+ let d = defaultsCache.get(name);
60
+ if (d)
61
+ return d;
62
+ d = {};
63
+ const chain = [];
64
+ for (let n = name, g = 0; n && g < 40; n = PARENTS[n], g++)
65
+ chain.unshift(n);
66
+ for (const cls of chain)
67
+ for (const key of CLASS_PROPS[cls] || []) {
68
+ const p = PROPS[key];
69
+ if (p && p.length > 2)
70
+ d[p[0]] = p[2];
71
+ }
72
+ defaultsCache.set(name, d);
73
+ return d;
74
+ }
75
+ const claimsSlot = (type) => type !== 'Artboard' && (isA(type, 'Component') || isA(type, 'KeyFrameInterpolator') || isA(type, 'UserInput'));
76
+ export function readRiv(data) {
77
+ const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
78
+ const r = new Reader(bytes);
79
+ const magic = String.fromCharCode(r.byte(), r.byte(), r.byte(), r.byte());
80
+ if (magic !== 'RIVE')
81
+ throw new Error('Not a Rive runtime file (.riv): missing RIVE header');
82
+ const major = r.varuint(), minor = r.varuint(), fileId = r.varuint();
83
+ if (major !== 7)
84
+ throw new Error(`Unsupported .riv major version ${major} (expected 7)`);
85
+ const tocKeys = [];
86
+ for (let k = r.varuint(); k !== 0; k = r.varuint())
87
+ tocKeys.push(k);
88
+ const tocField = new Map();
89
+ let word = 0, bit = 8;
90
+ for (const k of tocKeys) {
91
+ if (bit === 8) {
92
+ word = r.uint32();
93
+ bit = 0;
94
+ }
95
+ tocField.set(k, FIELD_BY_TOC[(word >>> bit) & 3]);
96
+ bit += 2;
97
+ }
98
+ const file = { major, minor, fileId, artboards: [], assets: [], unknownTypes: new Set() };
99
+ let current = null;
100
+ while (!r.done) {
101
+ const typeKey = r.varuint();
102
+ const t = TYPES[typeKey];
103
+ const type = t ? t[0] : `Unknown${typeKey}`;
104
+ if (!t)
105
+ file.unknownTypes.add(typeKey);
106
+ const props = t ? { ...defaultsOf(type) } : {};
107
+ for (let key = r.varuint(); key !== 0; key = r.varuint()) {
108
+ const p = PROPS[key];
109
+ const field = p ? p[1] : tocField.get(key);
110
+ if (!field)
111
+ throw new Error(`Unknown property ${key} (not in the file's table of contents)`);
112
+ let v;
113
+ switch (field) {
114
+ case 'uint':
115
+ v = r.varuint();
116
+ break;
117
+ case 'int':
118
+ v = r.int();
119
+ break;
120
+ case 'double':
121
+ v = r.float32();
122
+ break;
123
+ case 'color':
124
+ v = r.uint32();
125
+ break;
126
+ case 'bool':
127
+ v = r.byte() === 1;
128
+ break;
129
+ case 'string':
130
+ v = r.string();
131
+ break;
132
+ case 'bytes':
133
+ v = r.bytesField();
134
+ break;
135
+ default: v = r.varuint();
136
+ }
137
+ props[p ? p[0] : `p${key}`] = v;
138
+ }
139
+ const obj = { type, typeKey, props, index: -1 };
140
+ if (type === 'Artboard') {
141
+ obj.index = 0;
142
+ current = { artboard: obj, slots: [obj], stream: [obj] };
143
+ file.artboards.push(current);
144
+ continue;
145
+ }
146
+ if (isA(type, 'FileAsset')) {
147
+ file.assets.push({ asset: obj });
148
+ continue;
149
+ }
150
+ if (type === 'FileAssetContents') {
151
+ const a = file.assets[file.assets.length - 1];
152
+ if (a)
153
+ a.bytes = props.bytes;
154
+ continue;
155
+ }
156
+ if (!current)
157
+ continue; // Backboard and other file-level objects
158
+ if (t && claimsSlot(type)) {
159
+ obj.index = current.slots.length;
160
+ current.slots.push(obj);
161
+ }
162
+ current.stream.push(obj);
163
+ }
164
+ return file;
165
+ }
166
+ /** ARGB uint32 -> [#rrggbb, alpha 0..1]. */
167
+ export const argb = (c) => {
168
+ const a = ((c >>> 24) & 255) / 255;
169
+ const hex = (n) => n.toString(16).padStart(2, '0');
170
+ return [`#${hex((c >>> 16) & 255)}${hex((c >>> 8) & 255)}${hex(c & 255)}`, Math.round(a * 1000) / 1000];
171
+ };
172
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["reader.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,sGAAsG;AACtG,mCAAmC;AACnC,EAAE;AACF,mEAAmE;AACnE,4DAA4D;AAC5D,yEAAyE;AACzE,0EAA0E;AAC1E,gFAAgF;AAChF,8EAA8E;AAC9E,qDAAqD;AACrD,4EAA4E;AAC5E,0EAA0E;AAC1E,gEAAgE;AAEhE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AA4B3E,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAE3D,MAAM,MAAM;IAGY;IAFpB,GAAG,GAAG,CAAC,CAAC;IACA,IAAI,CAAW;IACvB,YAAoB,KAAiB;QAAjB,UAAK,GAAL,KAAK,CAAY;QAAI,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IAAC,CAAC;IACtH,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5H,OAAO;QACH,IAAI,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAS,CAAC;QACrC,GAAG,CAAC;YAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC;YAAC,KAAK,IAAI,GAAG,CAAC;QAAC,CAAC,QAAQ,CAAC,GAAG,IAAI,EAAE;QACrF,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpF,GAAG,CAAC,CAAS,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAClG,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,UAAU,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;CACzE;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;AAChD,iDAAiD;AACjD,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,IAAY;IAC1C,IAAI,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,GAAG,EAAE,CAAC;QACP,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;QAChB,KAAK,IAAI,CAAC,GAAuB,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,sEAAsE;AACtE,MAAM,aAAa,GAAG,IAAI,GAAG,EAA+B,CAAC;AAC7D,SAAS,UAAU,CAAC,IAAY;IAC5B,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAChB,CAAC,GAAG,EAAE,CAAC;IACP,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAuB,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACjG,KAAK,MAAM,GAAG,IAAI,KAAK;QAAE,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACD,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACb,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,sBAAsB,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;AAEpJ,MAAM,UAAU,OAAO,CAAC,IAA8B;IAClD,MAAM,KAAK,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1E,IAAI,KAAK,KAAK,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACrE,IAAI,KAAK,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,eAAe,CAAC,CAAC;IAEzF,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,IAAI,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;IACtB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtB,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC;YAAC,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;YAAC,GAAG,GAAG,CAAC,CAAC;QAAC,CAAC;QAC9C,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAClD,GAAG,IAAI,CAAC,CAAC;IACb,CAAC;IAED,MAAM,IAAI,GAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;IACnG,IAAI,OAAO,GAAuB,IAAI,CAAC;IAEvC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,OAAO,EAAE,CAAC;QAC5C,IAAI,CAAC,CAAC;YAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,KAAK,GAAwB,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,KAAK,IAAI,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YACrB,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,wCAAwC,CAAC,CAAC;YAC7F,IAAI,CAAM,CAAC;YACX,QAAQ,KAAK,EAAE,CAAC;gBACZ,KAAK,MAAM;oBAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;oBAAC,MAAM;gBACpC,KAAK,KAAK;oBAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBAAC,MAAM;gBAC/B,KAAK,QAAQ;oBAAE,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;oBAAC,MAAM;gBACtC,KAAK,OAAO;oBAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM;gBACpC,KAAK,MAAM;oBAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;oBAAC,MAAM;gBACvC,KAAK,QAAQ;oBAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;oBAAC,MAAM;gBACrC,KAAK,OAAO;oBAAE,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC;oBAAC,MAAM;gBACxC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;YAC7B,CAAC;YACD,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,GAAG,GAAc,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;QAC3D,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACtB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;YACd,OAAO,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,SAAS;QACb,CAAC;QACD,IAAI,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QAC3E,IAAI,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC;gBAAE,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAAC,SAAS;QAAC,CAAC;QAC5H,IAAI,CAAC,OAAO;YAAE,SAAS,CAAC,yCAAyC;QACjE,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAC,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QACzF,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,4CAA4C;AAC5C,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAoB,EAAE;IAChD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC5G,CAAC,CAAC"}
@@ -0,0 +1,160 @@
1
+ // @ts-nocheck
2
+ // GENERATED by scripts/sync-lottie-converter.mjs from editor/src/utils/rive. Edit there, then re-run.
3
+ // .riv (Rive runtime file) reader.
4
+ //
5
+ // Format, as read by rive-runtime (file.cpp / runtime_header.hpp):
6
+ // "RIVE" | varuint major | varuint minor | varuint fileId
7
+ // | property table of contents: varuint keys until 0, then 2-bit field
8
+ // types packed into uint32s (for properties this reader may not know)
9
+ // | objects: varuint typeKey, then (varuint propertyKey, value)* until key 0.
10
+ // Values: uint/id varuint, int zig-zag varuint, double float32, color uint32,
11
+ // bool one byte, string/bytes varuint length + data.
12
+ // Inside an artboard, every Component, keyframe interpolator and user input
13
+ // takes the next index of the artboard's object list (the artboard is 0);
14
+ // parentId, objectId and interpolatorId refer to those indices.
15
+
16
+ import { CLASS_PROPS, PARENTS, PROPS, TYPES } from './schema.generated.js';
17
+
18
+ export interface RivObject {
19
+ type: string;
20
+ typeKey: number;
21
+ props: Record<string, any>;
22
+ /** Index in its artboard's object list, or -1 if it takes none. */
23
+ index: number;
24
+ }
25
+
26
+ export interface RivArtboard {
27
+ artboard: RivObject;
28
+ /** Index -> object (components, interpolators). */
29
+ slots: (RivObject | null)[];
30
+ /** All objects of this artboard in stream order (animations, keyframes, state machines too). */
31
+ stream: RivObject[];
32
+ }
33
+
34
+ export interface RivFile {
35
+ major: number;
36
+ minor: number;
37
+ fileId: number;
38
+ artboards: RivArtboard[];
39
+ /** File-level assets in stream order, each with its embedded bytes when present. */
40
+ assets: { asset: RivObject; bytes?: Uint8Array }[];
41
+ unknownTypes: Set<number>;
42
+ }
43
+
44
+ const FIELD_BY_TOC = ['uint', 'string', 'double', 'color'];
45
+
46
+ class Reader {
47
+ pos = 0;
48
+ private view: DataView;
49
+ constructor(private bytes: Uint8Array) { this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength); }
50
+ get done() { return this.pos >= this.bytes.length; }
51
+ byte() { if (this.pos >= this.bytes.length) throw new Error('Unexpected end of .riv data'); return this.bytes[this.pos++]; }
52
+ varuint(): number {
53
+ let result = 0, shift = 1, b: number;
54
+ do { b = this.byte(); result += (b & 0x7f) * shift; shift *= 128; } while (b & 0x80);
55
+ return result;
56
+ }
57
+ int() { const u = this.varuint(); return (u % 2) ? -(u + 1) / 2 : u / 2; }
58
+ float32() { const v = this.view.getFloat32(this.pos, true); this.pos += 4; return v; }
59
+ uint32() { const v = this.view.getUint32(this.pos, true); this.pos += 4; return v; }
60
+ raw(n: number) { const v = this.bytes.subarray(this.pos, this.pos + n); this.pos += n; return v; }
61
+ string() { const n = this.varuint(); return new TextDecoder().decode(this.raw(n)); }
62
+ bytesField() { const n = this.varuint(); return this.raw(n).slice(); }
63
+ }
64
+
65
+ const ancestry = new Map<string, Set<string>>();
66
+ /** Is class `name` (or a subclass of) `base`? */
67
+ export function isA(name: string, base: string): boolean {
68
+ let set = ancestry.get(name);
69
+ if (!set) {
70
+ set = new Set();
71
+ for (let n: string | undefined = name, guard = 0; n && guard < 40; n = PARENTS[n], guard++) set.add(n);
72
+ ancestry.set(name, set);
73
+ }
74
+ return set.has(base);
75
+ }
76
+
77
+ /** Schema defaults of every property a class declares or inherits. */
78
+ const defaultsCache = new Map<string, Record<string, any>>();
79
+ function defaultsOf(name: string): Record<string, any> {
80
+ let d = defaultsCache.get(name);
81
+ if (d) return d;
82
+ d = {};
83
+ const chain: string[] = [];
84
+ for (let n: string | undefined = name, g = 0; n && g < 40; n = PARENTS[n], g++) chain.unshift(n);
85
+ for (const cls of chain) for (const key of CLASS_PROPS[cls] || []) {
86
+ const p = PROPS[key];
87
+ if (p && p.length > 2) d[p[0]] = p[2];
88
+ }
89
+ defaultsCache.set(name, d);
90
+ return d;
91
+ }
92
+
93
+ const claimsSlot = (type: string) => type !== 'Artboard' && (isA(type, 'Component') || isA(type, 'KeyFrameInterpolator') || isA(type, 'UserInput'));
94
+
95
+ export function readRiv(data: ArrayBuffer | Uint8Array): RivFile {
96
+ const bytes = data instanceof Uint8Array ? data : new Uint8Array(data);
97
+ const r = new Reader(bytes);
98
+ const magic = String.fromCharCode(r.byte(), r.byte(), r.byte(), r.byte());
99
+ if (magic !== 'RIVE') throw new Error('Not a Rive runtime file (.riv): missing RIVE header');
100
+ const major = r.varuint(), minor = r.varuint(), fileId = r.varuint();
101
+ if (major !== 7) throw new Error(`Unsupported .riv major version ${major} (expected 7)`);
102
+
103
+ const tocKeys: number[] = [];
104
+ for (let k = r.varuint(); k !== 0; k = r.varuint()) tocKeys.push(k);
105
+ const tocField = new Map<number, string>();
106
+ let word = 0, bit = 8;
107
+ for (const k of tocKeys) {
108
+ if (bit === 8) { word = r.uint32(); bit = 0; }
109
+ tocField.set(k, FIELD_BY_TOC[(word >>> bit) & 3]);
110
+ bit += 2;
111
+ }
112
+
113
+ const file: RivFile = { major, minor, fileId, artboards: [], assets: [], unknownTypes: new Set() };
114
+ let current: RivArtboard | null = null;
115
+
116
+ while (!r.done) {
117
+ const typeKey = r.varuint();
118
+ const t = TYPES[typeKey];
119
+ const type = t ? t[0] : `Unknown${typeKey}`;
120
+ if (!t) file.unknownTypes.add(typeKey);
121
+ const props: Record<string, any> = t ? { ...defaultsOf(type) } : {};
122
+ for (let key = r.varuint(); key !== 0; key = r.varuint()) {
123
+ const p = PROPS[key];
124
+ const field = p ? p[1] : tocField.get(key);
125
+ if (!field) throw new Error(`Unknown property ${key} (not in the file's table of contents)`);
126
+ let v: any;
127
+ switch (field) {
128
+ case 'uint': v = r.varuint(); break;
129
+ case 'int': v = r.int(); break;
130
+ case 'double': v = r.float32(); break;
131
+ case 'color': v = r.uint32(); break;
132
+ case 'bool': v = r.byte() === 1; break;
133
+ case 'string': v = r.string(); break;
134
+ case 'bytes': v = r.bytesField(); break;
135
+ default: v = r.varuint();
136
+ }
137
+ props[p ? p[0] : `p${key}`] = v;
138
+ }
139
+ const obj: RivObject = { type, typeKey, props, index: -1 };
140
+ if (type === 'Artboard') {
141
+ obj.index = 0;
142
+ current = { artboard: obj, slots: [obj], stream: [obj] };
143
+ file.artboards.push(current);
144
+ continue;
145
+ }
146
+ if (isA(type, 'FileAsset')) { file.assets.push({ asset: obj }); continue; }
147
+ if (type === 'FileAssetContents') { const a = file.assets[file.assets.length - 1]; if (a) a.bytes = props.bytes; continue; }
148
+ if (!current) continue; // Backboard and other file-level objects
149
+ if (t && claimsSlot(type)) { obj.index = current.slots.length; current.slots.push(obj); }
150
+ current.stream.push(obj);
151
+ }
152
+ return file;
153
+ }
154
+
155
+ /** ARGB uint32 -> [#rrggbb, alpha 0..1]. */
156
+ export const argb = (c: number): [string, number] => {
157
+ const a = ((c >>> 24) & 255) / 255;
158
+ const hex = (n: number) => n.toString(16).padStart(2, '0');
159
+ return [`#${hex((c >>> 16) & 255)}${hex((c >>> 8) & 255)}${hex(c & 255)}`, Math.round(a * 1000) / 1000];
160
+ };
@@ -0,0 +1,9 @@
1
+ /** typeKey -> [class name, parent class]. */
2
+ export declare const TYPES: Record<number, [string, string]>;
3
+ /** class -> parent class (abstract classes included). */
4
+ export declare const PARENTS: Record<string, string>;
5
+ /** propertyKey -> [name, field type, default]. */
6
+ export declare const PROPS: Record<number, [string, string, (number | string | boolean)?]>;
7
+ /** class -> property keys it declares (not inherited). */
8
+ export declare const CLASS_PROPS: Record<string, number[]>;
9
+ //# sourceMappingURL=schema.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.generated.d.ts","sourceRoot":"","sources":["schema.generated.ts"],"names":[],"mappings":"AAKA,6CAA6C;AAC7C,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAowgB,CAAC;AACxzgB,yDAAyD;AACzD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAmgb,CAAC;AAC/ib,kDAAkD;AAClD,eAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAA05oB,CAAC;AAC5+oB,0DAA0D;AAC1D,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAovV,CAAC"}