@otfdashkit/ui-native 0.1.3 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/skia.mjs DELETED
@@ -1,310 +0,0 @@
1
- // src/patterns/Shockwave/Shockwave.tsx
2
- import {
3
- createContext,
4
- memo,
5
- useCallback,
6
- useContext,
7
- useEffect,
8
- useMemo,
9
- useRef,
10
- useState
11
- } from "react";
12
- import { StyleSheet, View } from "react-native";
13
- import {
14
- Canvas,
15
- Fill,
16
- ImageShader,
17
- Shader,
18
- Skia
19
- } from "@shopify/react-native-skia";
20
- import {
21
- Easing,
22
- useDerivedValue,
23
- useSharedValue,
24
- withTiming
25
- } from "react-native-reanimated";
26
- import { scheduleOnRN } from "react-native-worklets";
27
-
28
- // src/patterns/Shockwave/conf.ts
29
- var SHOCKWAVE_DEFAULTS = {
30
- WIDTH: 320,
31
- HEIGHT: 320,
32
- DURATION: 900,
33
- SHOCK_STRENGTH: 0.12,
34
- LENSING_SPREAD: 0.2
35
- };
36
-
37
- // src/patterns/Shockwave/shader.ts
38
- var SHOCKWAVE_SHADER_SOURCE = `
39
- uniform float2 iResolution;
40
- uniform float iTime;
41
- uniform float2 iMouse;
42
- uniform float uShockStrength;
43
- uniform float uLensingSpread;
44
- uniform shader iChannel0;
45
- uniform shader iChannel1;
46
-
47
- half4 main(float2 fragCoord) {
48
- float2 uv = fragCoord / iResolution;
49
- float2 origin = iMouse / iResolution;
50
-
51
- float t = clamp(iTime, 0.0, 1.0);
52
- float radius = sqrt(2.0) * t;
53
- float circle = radius - distance(origin, uv);
54
- float factor = uShockStrength
55
- * sin(t * 3.14159265)
56
- * pow(clamp(1.0 - abs(circle), 0.0, 1.0), 20.0);
57
-
58
- float2 delta = origin - uv;
59
- float2 dir = delta / (length(delta) + 1e-6);
60
-
61
- float2 d0 = (uLensingSpread) * factor * dir * iResolution;
62
- float2 d1 = (uLensingSpread * 1.2) * factor * dir * iResolution;
63
- float2 d2 = (uLensingSpread * 1.5) * factor * dir * iResolution;
64
-
65
- half4 a = half4(
66
- iChannel0.eval(fragCoord + d0).r,
67
- iChannel0.eval(fragCoord + d1).g,
68
- iChannel0.eval(fragCoord + d2).b,
69
- 1.0
70
- );
71
- half4 b = half4(
72
- iChannel1.eval(fragCoord + d0).r,
73
- iChannel1.eval(fragCoord + d1).g,
74
- iChannel1.eval(fragCoord + d2).b,
75
- 1.0
76
- );
77
-
78
- half mixT = half(clamp(t + circle * 5.0, 0.0, 1.0));
79
- return mix(a, b, mixT);
80
- }
81
- `;
82
-
83
- // src/patterns/Shockwave/utils.ts
84
- import { Platform } from "react-native";
85
- import { makeImageFromView } from "@shopify/react-native-skia";
86
- var webNoopCallback = () => Promise.resolve(null);
87
- async function snapshotPair(fromRef, toRef, prev, next) {
88
- const callback = Platform.OS === "web" ? webNoopCallback : null;
89
- const fromImg = await makeImageFromView(
90
- fromRef,
91
- callback
92
- );
93
- const toImg = await makeImageFromView(
94
- toRef,
95
- callback
96
- );
97
- if (!fromImg || !toImg) return null;
98
- const fromSnapshot = prev === "from" ? fromImg : toImg;
99
- const toSnapshot = next === "from" ? fromImg : toImg;
100
- return { from: fromSnapshot, to: toSnapshot };
101
- }
102
-
103
- // src/patterns/Shockwave/Shockwave.tsx
104
- import { jsx, jsxs } from "react/jsx-runtime";
105
- var useShockwaveShader = () => {
106
- const [shader, setShader] = useState(null);
107
- useEffect(() => {
108
- let cancelled = false;
109
- let attempts = 0;
110
- let timer = null;
111
- const tryCompile = () => {
112
- if (cancelled) return;
113
- try {
114
- if (Skia?.RuntimeEffect?.Make) {
115
- const compiled = Skia.RuntimeEffect.Make(SHOCKWAVE_SHADER_SOURCE);
116
- if (compiled) {
117
- setShader(compiled);
118
- return;
119
- }
120
- }
121
- } catch {
122
- }
123
- attempts += 1;
124
- if (attempts < 30) {
125
- timer = setTimeout(tryCompile, 80);
126
- }
127
- };
128
- tryCompile();
129
- return () => {
130
- cancelled = true;
131
- if (timer !== null) clearTimeout(timer);
132
- };
133
- }, []);
134
- return shader;
135
- };
136
- var ShockwaveContext = createContext(null);
137
- var useShockwaveContext = () => {
138
- const ctx = useContext(ShockwaveContext);
139
- if (!ctx) {
140
- throw new Error(
141
- "<Shockwave.Transition.From> / <Shockwave.Transition.To> must be rendered inside <Shockwave>"
142
- );
143
- }
144
- return ctx;
145
- };
146
- var OFFSCREEN_OFFSET = 1e5;
147
- var From = memo(function From2({ children, style }) {
148
- const { fromRef, activeValue, isTransitioning } = useShockwaveContext();
149
- const isActive = activeValue === "from";
150
- return /* @__PURE__ */ jsx(
151
- View,
152
- {
153
- ref: fromRef,
154
- collapsable: false,
155
- pointerEvents: isActive && !isTransitioning ? "auto" : "none",
156
- style: [
157
- StyleSheet.absoluteFill,
158
- {
159
- zIndex: isActive ? 2 : 1,
160
- transform: [{ translateX: isActive ? 0 : OFFSCREEN_OFFSET }]
161
- },
162
- style
163
- ],
164
- children
165
- }
166
- );
167
- });
168
- var To = memo(function To2({ children, style }) {
169
- const { toRef, activeValue, isTransitioning } = useShockwaveContext();
170
- const isActive = activeValue === "to";
171
- return /* @__PURE__ */ jsx(
172
- View,
173
- {
174
- ref: toRef,
175
- collapsable: false,
176
- pointerEvents: isActive && !isTransitioning ? "auto" : "none",
177
- style: [
178
- StyleSheet.absoluteFill,
179
- {
180
- zIndex: isActive ? 2 : 1,
181
- transform: [{ translateX: isActive ? 0 : OFFSCREEN_OFFSET }]
182
- },
183
- style
184
- ],
185
- children
186
- }
187
- );
188
- });
189
- var Transition = { From, To };
190
- var ShockwaveRoot = memo(function ShockwaveRoot2({
191
- value,
192
- width = SHOCKWAVE_DEFAULTS.WIDTH,
193
- height = SHOCKWAVE_DEFAULTS.HEIGHT,
194
- duration = SHOCKWAVE_DEFAULTS.DURATION,
195
- origin,
196
- shockStrength = SHOCKWAVE_DEFAULTS.SHOCK_STRENGTH,
197
- lensingSpread = SHOCKWAVE_DEFAULTS.LENSING_SPREAD,
198
- style,
199
- children,
200
- onTransitionEnd
201
- }) {
202
- const fromRef = useRef(null);
203
- const toRef = useRef(null);
204
- const prevValueRef = useRef(value);
205
- const shader = useShockwaveShader();
206
- const [activeValue, setActiveValue] = useState(value);
207
- const [snapshots, setSnapshots] = useState(null);
208
- const progress = useSharedValue(0);
209
- const finishTransition = useCallback(
210
- (next) => {
211
- setActiveValue(next);
212
- setSnapshots(null);
213
- onTransitionEnd?.(next);
214
- },
215
- [onTransitionEnd]
216
- );
217
- useEffect(() => {
218
- if (value === prevValueRef.current) return;
219
- const prev = prevValueRef.current;
220
- const next = value;
221
- prevValueRef.current = value;
222
- let cancelled = false;
223
- void (async () => {
224
- const pair = await snapshotPair(
225
- fromRef,
226
- toRef,
227
- prev,
228
- next
229
- );
230
- if (cancelled) return;
231
- if (!pair) {
232
- setActiveValue(next);
233
- return;
234
- }
235
- setSnapshots(pair);
236
- progress.value = 0;
237
- progress.value = withTiming(
238
- 1,
239
- { duration, easing: Easing.linear },
240
- (done) => {
241
- if (done) scheduleOnRN(finishTransition, next);
242
- }
243
- );
244
- })();
245
- return () => {
246
- cancelled = true;
247
- };
248
- }, [value, duration, finishTransition, progress]);
249
- const ox = origin?.x ?? width / 2;
250
- const oy = origin?.y ?? height / 2;
251
- const uniforms = useDerivedValue(() => ({
252
- iResolution: [width, height],
253
- iTime: progress.value,
254
- iMouse: [ox, oy],
255
- uShockStrength: shockStrength,
256
- uLensingSpread: lensingSpread
257
- }));
258
- const ctxValue = useMemo(
259
- () => ({
260
- fromRef,
261
- toRef,
262
- activeValue,
263
- isTransitioning: snapshots !== null
264
- }),
265
- [activeValue, snapshots]
266
- );
267
- return /* @__PURE__ */ jsxs(View, { style: [styles.wrapper, { width, height }, style], children: [
268
- /* @__PURE__ */ jsx(ShockwaveContext.Provider, { value: ctxValue, children }),
269
- snapshots && shader ? /* @__PURE__ */ jsx(
270
- Canvas,
271
- {
272
- style: [StyleSheet.absoluteFill, styles.canvasOverlay],
273
- pointerEvents: "none",
274
- children: /* @__PURE__ */ jsx(Fill, { children: /* @__PURE__ */ jsxs(Shader, { source: shader, uniforms, children: [
275
- /* @__PURE__ */ jsx(
276
- ImageShader,
277
- {
278
- image: snapshots.from,
279
- fit: "cover",
280
- rect: { x: 0, y: 0, width, height }
281
- }
282
- ),
283
- /* @__PURE__ */ jsx(
284
- ImageShader,
285
- {
286
- image: snapshots.to,
287
- fit: "cover",
288
- rect: { x: 0, y: 0, width, height }
289
- }
290
- )
291
- ] }) })
292
- }
293
- ) : null
294
- ] });
295
- });
296
- var styles = StyleSheet.create({
297
- wrapper: {
298
- position: "relative",
299
- overflow: "hidden",
300
- backgroundColor: "transparent"
301
- },
302
- canvasOverlay: {
303
- zIndex: 3
304
- }
305
- });
306
- var Shockwave = Object.assign(ShockwaveRoot, { Transition });
307
- export {
308
- Shockwave
309
- };
310
- //# sourceMappingURL=skia.mjs.map
package/dist/skia.mjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/patterns/Shockwave/Shockwave.tsx","../src/patterns/Shockwave/conf.ts","../src/patterns/Shockwave/shader.ts","../src/patterns/Shockwave/utils.ts"],"sourcesContent":["import {\n createContext,\n memo,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from 'react'\nimport { StyleSheet, View } from 'react-native'\nimport {\n Canvas,\n Fill,\n ImageShader,\n Shader,\n Skia,\n type SkImage,\n type Uniforms,\n} from '@shopify/react-native-skia'\nimport {\n Easing,\n useDerivedValue,\n useSharedValue,\n withTiming,\n} from 'react-native-reanimated'\nimport { scheduleOnRN } from 'react-native-worklets'\n\nimport { SHOCKWAVE_DEFAULTS } from './conf'\nimport { SHOCKWAVE_SHADER_SOURCE } from './shader'\nimport { snapshotPair } from './utils'\nimport type {\n ShockwaveContextValue,\n ShockwaveProps,\n ShockwaveSlotProps,\n ShockwaveValue,\n} from './types'\n\n// Lazy shader compile. Web Skia loads asynchronously (CanvasKit WASM), so\n// `Skia.RuntimeEffect` is undefined at module-load time on the web platform.\n// Compile inside the component via useMemo, after the host has had a chance\n// to call LoadSkiaWeb() / mount <WithSkiaWeb>.\ntype RuntimeEffect = ReturnType<typeof Skia.RuntimeEffect.Make>\n\nconst useShockwaveShader = (): RuntimeEffect | null => {\n const [shader, setShader] = useState<RuntimeEffect | null>(null)\n\n useEffect(() => {\n let cancelled = false\n let attempts = 0\n let timer: ReturnType<typeof setTimeout> | null = null\n const tryCompile = () => {\n if (cancelled) return\n try {\n if (Skia?.RuntimeEffect?.Make) {\n const compiled = Skia.RuntimeEffect.Make(SHOCKWAVE_SHADER_SOURCE)\n if (compiled) {\n setShader(compiled)\n return\n }\n }\n } catch {\n // CanvasKit not ready yet on web — retry\n }\n attempts += 1\n if (attempts < 30) {\n timer = setTimeout(tryCompile, 80)\n }\n }\n tryCompile()\n return () => {\n cancelled = true\n if (timer !== null) clearTimeout(timer)\n }\n }, [])\n\n return shader\n}\n\nconst ShockwaveContext = createContext<ShockwaveContextValue | null>(null)\n\nconst useShockwaveContext = (): ShockwaveContextValue => {\n const ctx = useContext(ShockwaveContext)\n if (!ctx) {\n throw new Error(\n '<Shockwave.Transition.From> / <Shockwave.Transition.To> must be rendered inside <Shockwave>',\n )\n }\n return ctx\n}\n\n// Off-screen translation used to keep the inactive slot mounted (so we can\n// snapshot it the moment a transition starts) without it eating taps or\n// painting visibly. Bigger than any plausible viewport — pulled from the\n// reacticx reference.\nconst OFFSCREEN_OFFSET = 100000\n\nconst From = memo<ShockwaveSlotProps>(function From({ children, style }) {\n const { fromRef, activeValue, isTransitioning } = useShockwaveContext()\n const isActive = activeValue === 'from'\n return (\n <View\n // RN's ref type wants `Ref<View>` but our useRef is typed `View | null`\n // (so the context API stays nullable). Same instance, narrower view.\n ref={fromRef as RefObject<View>}\n collapsable={false}\n pointerEvents={isActive && !isTransitioning ? 'auto' : 'none'}\n style={[\n StyleSheet.absoluteFill,\n {\n zIndex: isActive ? 2 : 1,\n transform: [{ translateX: isActive ? 0 : OFFSCREEN_OFFSET }],\n },\n style,\n ]}\n >\n {children}\n </View>\n )\n})\n\nconst To = memo<ShockwaveSlotProps>(function To({ children, style }) {\n const { toRef, activeValue, isTransitioning } = useShockwaveContext()\n const isActive = activeValue === 'to'\n return (\n <View\n // See <From> for rationale.\n ref={toRef as RefObject<View>}\n collapsable={false}\n pointerEvents={isActive && !isTransitioning ? 'auto' : 'none'}\n style={[\n StyleSheet.absoluteFill,\n {\n zIndex: isActive ? 2 : 1,\n transform: [{ translateX: isActive ? 0 : OFFSCREEN_OFFSET }],\n },\n style,\n ]}\n >\n {children}\n </View>\n )\n})\n\nconst Transition = { From, To } as const\n\nconst ShockwaveRoot = memo<ShockwaveProps>(function ShockwaveRoot({\n value,\n width = SHOCKWAVE_DEFAULTS.WIDTH,\n height = SHOCKWAVE_DEFAULTS.HEIGHT,\n duration = SHOCKWAVE_DEFAULTS.DURATION,\n origin,\n shockStrength = SHOCKWAVE_DEFAULTS.SHOCK_STRENGTH,\n lensingSpread = SHOCKWAVE_DEFAULTS.LENSING_SPREAD,\n style,\n children,\n onTransitionEnd,\n}: ShockwaveProps) {\n const fromRef = useRef<View | null>(null)\n const toRef = useRef<View | null>(null)\n const prevValueRef = useRef<ShockwaveValue>(value)\n const shader = useShockwaveShader()\n\n const [activeValue, setActiveValue] = useState<ShockwaveValue>(value)\n const [snapshots, setSnapshots] = useState<{\n from: SkImage\n to: SkImage\n } | null>(null)\n\n const progress = useSharedValue<number>(0)\n\n const finishTransition = useCallback(\n (next: ShockwaveValue) => {\n setActiveValue(next)\n setSnapshots(null)\n onTransitionEnd?.(next)\n },\n [onTransitionEnd],\n )\n\n useEffect(() => {\n if (value === prevValueRef.current) return\n const prev = prevValueRef.current\n const next = value\n prevValueRef.current = value\n\n let cancelled = false\n void (async () => {\n const pair = await snapshotPair(\n fromRef as RefObject<View>,\n toRef as RefObject<View>,\n prev,\n next,\n )\n if (cancelled) return\n if (!pair) {\n setActiveValue(next)\n return\n }\n setSnapshots(pair)\n progress.value = 0\n progress.value = withTiming(\n 1,\n { duration, easing: Easing.linear },\n (done) => {\n if (done) scheduleOnRN(finishTransition, next)\n },\n )\n })()\n\n return () => {\n cancelled = true\n }\n }, [value, duration, finishTransition, progress])\n\n const ox = origin?.x ?? width / 2\n const oy = origin?.y ?? height / 2\n\n const uniforms = useDerivedValue<Uniforms>(() => ({\n iResolution: [width, height],\n iTime: progress.value,\n iMouse: [ox, oy],\n uShockStrength: shockStrength,\n uLensingSpread: lensingSpread,\n }))\n\n const ctxValue = useMemo<ShockwaveContextValue>(\n () => ({\n fromRef,\n toRef,\n activeValue,\n isTransitioning: snapshots !== null,\n }),\n [activeValue, snapshots],\n )\n\n return (\n <View style={[styles.wrapper, { width, height }, style]}>\n <ShockwaveContext.Provider value={ctxValue}>\n {children}\n </ShockwaveContext.Provider>\n {snapshots && shader ? (\n <Canvas\n style={[StyleSheet.absoluteFill, styles.canvasOverlay]}\n pointerEvents=\"none\"\n >\n <Fill>\n <Shader source={shader} uniforms={uniforms}>\n <ImageShader\n image={snapshots.from}\n fit=\"cover\"\n rect={{ x: 0, y: 0, width, height }}\n />\n <ImageShader\n image={snapshots.to}\n fit=\"cover\"\n rect={{ x: 0, y: 0, width, height }}\n />\n </Shader>\n </Fill>\n </Canvas>\n ) : null}\n </View>\n )\n})\n\nconst styles = StyleSheet.create({\n wrapper: {\n position: 'relative',\n overflow: 'hidden',\n backgroundColor: 'transparent',\n },\n canvasOverlay: {\n zIndex: 3,\n },\n})\n\n/**\n * Shockwave — Skia-shader transition between two views.\n *\n * Wrap two children in `<Shockwave.Transition.From>` and\n * `<Shockwave.Transition.To>`, then flip `value` to play the wave.\n *\n * @example\n * ```tsx\n * const [v, setV] = useState<'from' | 'to'>('from')\n *\n * <Shockwave value={v} width={320} height={420}>\n * <Shockwave.Transition.From>\n * <ProductCardA />\n * </Shockwave.Transition.From>\n * <Shockwave.Transition.To>\n * <ProductCardB />\n * </Shockwave.Transition.To>\n * </Shockwave>\n *\n * <Button onPress={() => setV(v === 'from' ? 'to' : 'from')}>Swap</Button>\n * ```\n *\n * Adapted from `rit3zh/reacticx` (MIT) — same shader + slot pattern,\n * repackaged for the OTF SDK with stricter types and JSDoc.\n */\nexport const Shockwave = Object.assign(ShockwaveRoot, { Transition })\n\nexport type {\n ShockwaveProps,\n ShockwaveSlotProps,\n ShockwaveContextValue,\n ShockwaveOrigin,\n ShockwaveValue,\n} from './types'\n","// Defaults tuned for OTF — soft enough to feel premium, fast enough to land\n// inside a single tap interaction. Override per-instance via props.\nexport const SHOCKWAVE_DEFAULTS = {\n WIDTH: 320,\n HEIGHT: 320,\n DURATION: 900,\n SHOCK_STRENGTH: 0.12,\n LENSING_SPREAD: 0.2,\n} as const\n","// Skia SkSL shader. Produces a circular shockwave from `iMouse`, displaces\n// the source image along the radial direction with chromatic aberration\n// (per-channel offset for an analog-lens feel), then crossfades from\n// snapshot A → snapshot B as the wave passes over each pixel.\n//\n// Uniforms set per-frame from the host component. Don't edit unless you\n// know what you're doing — the shockStrength / lensingSpread tuning is\n// surface-area for users via the public Shockwave props.\nexport const SHOCKWAVE_SHADER_SOURCE = `\nuniform float2 iResolution;\nuniform float iTime;\nuniform float2 iMouse;\nuniform float uShockStrength;\nuniform float uLensingSpread;\nuniform shader iChannel0;\nuniform shader iChannel1;\n\nhalf4 main(float2 fragCoord) {\n float2 uv = fragCoord / iResolution;\n float2 origin = iMouse / iResolution;\n\n float t = clamp(iTime, 0.0, 1.0);\n float radius = sqrt(2.0) * t;\n float circle = radius - distance(origin, uv);\n float factor = uShockStrength\n * sin(t * 3.14159265)\n * pow(clamp(1.0 - abs(circle), 0.0, 1.0), 20.0);\n\n float2 delta = origin - uv;\n float2 dir = delta / (length(delta) + 1e-6);\n\n float2 d0 = (uLensingSpread) * factor * dir * iResolution;\n float2 d1 = (uLensingSpread * 1.2) * factor * dir * iResolution;\n float2 d2 = (uLensingSpread * 1.5) * factor * dir * iResolution;\n\n half4 a = half4(\n iChannel0.eval(fragCoord + d0).r,\n iChannel0.eval(fragCoord + d1).g,\n iChannel0.eval(fragCoord + d2).b,\n 1.0\n );\n half4 b = half4(\n iChannel1.eval(fragCoord + d0).r,\n iChannel1.eval(fragCoord + d1).g,\n iChannel1.eval(fragCoord + d2).b,\n 1.0\n );\n\n half mixT = half(clamp(t + circle * 5.0, 0.0, 1.0));\n return mix(a, b, mixT);\n}\n`\n","import type { RefObject } from 'react'\nimport { Platform, type View } from 'react-native'\nimport { makeImageFromView, type SkImage } from '@shopify/react-native-skia'\nimport type { ShockwaveValue } from './types'\n\n// Skia's `makeImageFromView` is native-only. On web it requires a callback\n// that returns a SkImage from a DOM snapshot — we don't ship one, so this\n// component gracefully no-ops on web and the showcase routes the user to\n// the OTF preview app QR instead.\nconst webNoopCallback = () => Promise.resolve<SkImage | null>(null)\n\n/**\n * Snapshots both slot views as Skia images. Returns the pair labelled\n * by previous / next active value so the shader can read them as\n * iChannel0 (current) and iChannel1 (target). Returns null if either\n * snapshot fails — caller should fall back to an instant swap.\n */\nexport async function snapshotPair(\n fromRef: RefObject<View>,\n toRef: RefObject<View>,\n prev: ShockwaveValue,\n next: ShockwaveValue,\n): Promise<{ from: SkImage; to: SkImage } | null> {\n const callback = Platform.OS === 'web' ? webNoopCallback : null\n const fromImg = await makeImageFromView(\n fromRef as RefObject<View>,\n callback,\n )\n const toImg = await makeImageFromView(\n toRef as RefObject<View>,\n callback,\n )\n if (!fromImg || !toImg) return null\n const fromSnapshot = prev === 'from' ? fromImg : toImg\n const toSnapshot = next === 'from' ? fromImg : toImg\n return { from: fromSnapshot, to: toSnapshot }\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,YAAY,YAAY;AACjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAoB;;;ACzBtB,IAAM,qBAAqB;AAAA,EAChC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;;;ACAO,IAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACPvC,SAAS,gBAA2B;AACpC,SAAS,yBAAuC;AAOhD,IAAM,kBAAkB,MAAM,QAAQ,QAAwB,IAAI;AAQlE,eAAsB,aACpB,SACA,OACA,MACA,MACgD;AAChD,QAAM,WAAW,SAAS,OAAO,QAAQ,kBAAkB;AAC3D,QAAM,UAAU,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,EACF;AACA,QAAM,QAAQ,MAAM;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACA,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO;AAC/B,QAAM,eAAe,SAAS,SAAS,UAAU;AACjD,QAAM,aAAa,SAAS,SAAS,UAAU;AAC/C,SAAO,EAAE,MAAM,cAAc,IAAI,WAAW;AAC9C;;;AHkEI,cAkJQ,YAlJR;AAzDJ,IAAM,qBAAqB,MAA4B;AACrD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAA+B,IAAI;AAE/D,YAAU,MAAM;AACd,QAAI,YAAY;AAChB,QAAI,WAAW;AACf,QAAI,QAA8C;AAClD,UAAM,aAAa,MAAM;AACvB,UAAI,UAAW;AACf,UAAI;AACF,YAAI,MAAM,eAAe,MAAM;AAC7B,gBAAM,WAAW,KAAK,cAAc,KAAK,uBAAuB;AAChE,cAAI,UAAU;AACZ,sBAAU,QAAQ;AAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF,QAAQ;AAAA,MAER;AACA,kBAAY;AACZ,UAAI,WAAW,IAAI;AACjB,gBAAQ,WAAW,YAAY,EAAE;AAAA,MACnC;AAAA,IACF;AACA,eAAW;AACX,WAAO,MAAM;AACX,kBAAY;AACZ,UAAI,UAAU,KAAM,cAAa,KAAK;AAAA,IACxC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,SAAO;AACT;AAEA,IAAM,mBAAmB,cAA4C,IAAI;AAEzE,IAAM,sBAAsB,MAA6B;AACvD,QAAM,MAAM,WAAW,gBAAgB;AACvC,MAAI,CAAC,KAAK;AACR,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMA,IAAM,mBAAmB;AAEzB,IAAM,OAAO,KAAyB,SAASA,MAAK,EAAE,UAAU,MAAM,GAAG;AACvE,QAAM,EAAE,SAAS,aAAa,gBAAgB,IAAI,oBAAoB;AACtE,QAAM,WAAW,gBAAgB;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MAGC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,eAAe,YAAY,CAAC,kBAAkB,SAAS;AAAA,MACvD,OAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,UACE,QAAQ,WAAW,IAAI;AAAA,UACvB,WAAW,CAAC,EAAE,YAAY,WAAW,IAAI,iBAAiB,CAAC;AAAA,QAC7D;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,IAAM,KAAK,KAAyB,SAASC,IAAG,EAAE,UAAU,MAAM,GAAG;AACnE,QAAM,EAAE,OAAO,aAAa,gBAAgB,IAAI,oBAAoB;AACpE,QAAM,WAAW,gBAAgB;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MAEC,KAAK;AAAA,MACL,aAAa;AAAA,MACb,eAAe,YAAY,CAAC,kBAAkB,SAAS;AAAA,MACvD,OAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,UACE,QAAQ,WAAW,IAAI;AAAA,UACvB,WAAW,CAAC,EAAE,YAAY,WAAW,IAAI,iBAAiB,CAAC;AAAA,QAC7D;AAAA,QACA;AAAA,MACF;AAAA,MAEC;AAAA;AAAA,EACH;AAEJ,CAAC;AAED,IAAM,aAAa,EAAE,MAAM,GAAG;AAE9B,IAAM,gBAAgB,KAAqB,SAASC,eAAc;AAAA,EAChE;AAAA,EACA,QAAQ,mBAAmB;AAAA,EAC3B,SAAS,mBAAmB;AAAA,EAC5B,WAAW,mBAAmB;AAAA,EAC9B;AAAA,EACA,gBAAgB,mBAAmB;AAAA,EACnC,gBAAgB,mBAAmB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,UAAU,OAAoB,IAAI;AACxC,QAAM,QAAQ,OAAoB,IAAI;AACtC,QAAM,eAAe,OAAuB,KAAK;AACjD,QAAM,SAAS,mBAAmB;AAElC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAyB,KAAK;AACpE,QAAM,CAAC,WAAW,YAAY,IAAI,SAGxB,IAAI;AAEd,QAAM,WAAW,eAAuB,CAAC;AAEzC,QAAM,mBAAmB;AAAA,IACvB,CAAC,SAAyB;AACxB,qBAAe,IAAI;AACnB,mBAAa,IAAI;AACjB,wBAAkB,IAAI;AAAA,IACxB;AAAA,IACA,CAAC,eAAe;AAAA,EAClB;AAEA,YAAU,MAAM;AACd,QAAI,UAAU,aAAa,QAAS;AACpC,UAAM,OAAO,aAAa;AAC1B,UAAM,OAAO;AACb,iBAAa,UAAU;AAEvB,QAAI,YAAY;AAChB,UAAM,YAAY;AAChB,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,UAAI,UAAW;AACf,UAAI,CAAC,MAAM;AACT,uBAAe,IAAI;AACnB;AAAA,MACF;AACA,mBAAa,IAAI;AACjB,eAAS,QAAQ;AACjB,eAAS,QAAQ;AAAA,QACf;AAAA,QACA,EAAE,UAAU,QAAQ,OAAO,OAAO;AAAA,QAClC,CAAC,SAAS;AACR,cAAI,KAAM,cAAa,kBAAkB,IAAI;AAAA,QAC/C;AAAA,MACF;AAAA,IACF,GAAG;AAEH,WAAO,MAAM;AACX,kBAAY;AAAA,IACd;AAAA,EACF,GAAG,CAAC,OAAO,UAAU,kBAAkB,QAAQ,CAAC;AAEhD,QAAM,KAAK,QAAQ,KAAK,QAAQ;AAChC,QAAM,KAAK,QAAQ,KAAK,SAAS;AAEjC,QAAM,WAAW,gBAA0B,OAAO;AAAA,IAChD,aAAa,CAAC,OAAO,MAAM;AAAA,IAC3B,OAAO,SAAS;AAAA,IAChB,QAAQ,CAAC,IAAI,EAAE;AAAA,IACf,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,EAClB,EAAE;AAEF,QAAM,WAAW;AAAA,IACf,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,cAAc;AAAA,IACjC;AAAA,IACA,CAAC,aAAa,SAAS;AAAA,EACzB;AAEA,SACE,qBAAC,QAAK,OAAO,CAAC,OAAO,SAAS,EAAE,OAAO,OAAO,GAAG,KAAK,GACpD;AAAA,wBAAC,iBAAiB,UAAjB,EAA0B,OAAO,UAC/B,UACH;AAAA,IACC,aAAa,SACZ;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,CAAC,WAAW,cAAc,OAAO,aAAa;AAAA,QACrD,eAAc;AAAA,QAEd,8BAAC,QACC,+BAAC,UAAO,QAAQ,QAAQ,UACtB;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,UAAU;AAAA,cACjB,KAAI;AAAA,cACJ,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO;AAAA;AAAA,UACpC;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,OAAO,UAAU;AAAA,cACjB,KAAI;AAAA,cACJ,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,OAAO,OAAO;AAAA;AAAA,UACpC;AAAA,WACF,GACF;AAAA;AAAA,IACF,IACE;AAAA,KACN;AAEJ,CAAC;AAED,IAAM,SAAS,WAAW,OAAO;AAAA,EAC/B,SAAS;AAAA,IACP,UAAU;AAAA,IACV,UAAU;AAAA,IACV,iBAAiB;AAAA,EACnB;AAAA,EACA,eAAe;AAAA,IACb,QAAQ;AAAA,EACV;AACF,CAAC;AA2BM,IAAM,YAAY,OAAO,OAAO,eAAe,EAAE,WAAW,CAAC;","names":["From","To","ShockwaveRoot"]}