@mappoh/nova 0.1.16 → 0.2.1
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/README.md +46 -0
- package/dist/accordion/accordion.d.ts +39 -0
- package/dist/accordion/accordion.d.ts.map +1 -0
- package/dist/accordion/accordion.js +203 -0
- package/dist/accordion/accordion.js.map +1 -0
- package/dist/accordion/index.d.ts +3 -0
- package/dist/accordion/index.d.ts.map +1 -0
- package/dist/accordion/index.js +2 -0
- package/dist/accordion/index.js.map +1 -0
- package/dist/breadcrumb/breadcrumb.d.ts +37 -0
- package/dist/breadcrumb/breadcrumb.d.ts.map +1 -0
- package/dist/breadcrumb/breadcrumb.js +139 -0
- package/dist/breadcrumb/breadcrumb.js.map +1 -0
- package/dist/breadcrumb/index.d.ts +3 -0
- package/dist/breadcrumb/index.d.ts.map +1 -0
- package/dist/breadcrumb/index.js +2 -0
- package/dist/breadcrumb/index.js.map +1 -0
- package/dist/canvas/noise-wasm.d.ts +30 -0
- package/dist/canvas/noise-wasm.d.ts.map +1 -0
- package/dist/canvas/noise-wasm.js +82 -0
- package/dist/canvas/noise-wasm.js.map +1 -0
- package/dist/canvas/physics-wasm.d.ts +48 -0
- package/dist/canvas/physics-wasm.d.ts.map +1 -0
- package/dist/canvas/physics-wasm.js +66 -0
- package/dist/canvas/physics-wasm.js.map +1 -0
- package/dist/carousel/carousel.d.ts +51 -0
- package/dist/carousel/carousel.d.ts.map +1 -0
- package/dist/carousel/carousel.js +236 -0
- package/dist/carousel/carousel.js.map +1 -0
- package/dist/carousel/index.d.ts +3 -0
- package/dist/carousel/index.d.ts.map +1 -0
- package/dist/carousel/index.js +2 -0
- package/dist/carousel/index.js.map +1 -0
- package/dist/clipboard/clipboard.d.ts +15 -0
- package/dist/clipboard/clipboard.d.ts.map +1 -0
- package/dist/clipboard/clipboard.js +76 -0
- package/dist/clipboard/clipboard.js.map +1 -0
- package/dist/clipboard/index.d.ts +2 -0
- package/dist/clipboard/index.d.ts.map +1 -0
- package/dist/clipboard/index.js +2 -0
- package/dist/clipboard/index.js.map +1 -0
- package/dist/component/diff-wasm.d.ts +35 -0
- package/dist/component/diff-wasm.d.ts.map +1 -0
- package/dist/component/diff-wasm.js +52 -0
- package/dist/component/diff-wasm.js.map +1 -0
- package/dist/component/template.d.ts.map +1 -1
- package/dist/component/template.js +16 -5
- package/dist/component/template.js.map +1 -1
- package/dist/forms/wasm-validators.d.ts +60 -0
- package/dist/forms/wasm-validators.d.ts.map +1 -0
- package/dist/forms/wasm-validators.js +121 -0
- package/dist/forms/wasm-validators.js.map +1 -0
- package/dist/image/wasm.d.ts +47 -0
- package/dist/image/wasm.d.ts.map +1 -0
- package/dist/image/wasm.js +133 -0
- package/dist/image/wasm.js.map +1 -0
- package/dist/infinite-scroll/index.d.ts +3 -0
- package/dist/infinite-scroll/index.d.ts.map +1 -0
- package/dist/infinite-scroll/index.js +2 -0
- package/dist/infinite-scroll/index.js.map +1 -0
- package/dist/infinite-scroll/infinite-scroll.d.ts +33 -0
- package/dist/infinite-scroll/infinite-scroll.d.ts.map +1 -0
- package/dist/infinite-scroll/infinite-scroll.js +94 -0
- package/dist/infinite-scroll/infinite-scroll.js.map +1 -0
- package/dist/markdown/index.d.ts +2 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +2 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/markdown.d.ts +14 -0
- package/dist/markdown/markdown.d.ts.map +1 -0
- package/dist/markdown/markdown.js +194 -0
- package/dist/markdown/markdown.js.map +1 -0
- package/dist/markdown/wasm.d.ts +11 -0
- package/dist/markdown/wasm.d.ts.map +1 -0
- package/dist/markdown/wasm.js +28 -0
- package/dist/markdown/wasm.js.map +1 -0
- package/dist/modal/modal.d.ts.map +1 -1
- package/dist/modal/modal.js +11 -1
- package/dist/modal/modal.js.map +1 -1
- package/dist/popover/index.d.ts +3 -0
- package/dist/popover/index.d.ts.map +1 -0
- package/dist/popover/index.js +2 -0
- package/dist/popover/index.js.map +1 -0
- package/dist/popover/popover.d.ts +56 -0
- package/dist/popover/popover.d.ts.map +1 -0
- package/dist/popover/popover.js +242 -0
- package/dist/popover/popover.js.map +1 -0
- package/dist/progress/index.d.ts +3 -0
- package/dist/progress/index.d.ts.map +1 -0
- package/dist/progress/index.js +2 -0
- package/dist/progress/index.js.map +1 -0
- package/dist/progress/progress.d.ts +39 -0
- package/dist/progress/progress.d.ts.map +1 -0
- package/dist/progress/progress.js +172 -0
- package/dist/progress/progress.js.map +1 -0
- package/dist/search/wasm.d.ts +2 -2
- package/dist/search/wasm.d.ts.map +1 -1
- package/dist/search/wasm.js +2 -3
- package/dist/search/wasm.js.map +1 -1
- package/dist/security/wasm-crypto.d.ts +53 -0
- package/dist/security/wasm-crypto.d.ts.map +1 -0
- package/dist/security/wasm-crypto.js +84 -0
- package/dist/security/wasm-crypto.js.map +1 -0
- package/dist/stepper/index.d.ts +3 -0
- package/dist/stepper/index.d.ts.map +1 -0
- package/dist/stepper/index.js +2 -0
- package/dist/stepper/index.js.map +1 -0
- package/dist/stepper/stepper.d.ts +49 -0
- package/dist/stepper/stepper.d.ts.map +1 -0
- package/dist/stepper/stepper.js +173 -0
- package/dist/stepper/stepper.js.map +1 -0
- package/dist/virtual-list/index.d.ts +3 -0
- package/dist/virtual-list/index.d.ts.map +1 -0
- package/dist/virtual-list/index.js +2 -0
- package/dist/virtual-list/index.js.map +1 -0
- package/dist/virtual-list/virtual-list.d.ts +37 -0
- package/dist/virtual-list/virtual-list.d.ts.map +1 -0
- package/dist/virtual-list/virtual-list.js +190 -0
- package/dist/virtual-list/virtual-list.js.map +1 -0
- package/package.json +80 -2
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Physics WASM Accelerator
|
|
3
|
+
*
|
|
4
|
+
* Optional WASM-accelerated 2D particle physics compiled from Rust.
|
|
5
|
+
* Provides a World class with Verlet integration, boundary collisions,
|
|
6
|
+
* and particle-particle collisions (spatial hashing for large counts).
|
|
7
|
+
*/
|
|
8
|
+
export interface PhysicsConfig {
|
|
9
|
+
gravity?: {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
};
|
|
13
|
+
friction?: number;
|
|
14
|
+
restitution?: number;
|
|
15
|
+
bounds: {
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export interface PhysicsWorldInstance {
|
|
21
|
+
/** Add particles. positions/velocities are [x,y,x,y,...], radii is [r,r,...]. */
|
|
22
|
+
addParticles(positions: number[], velocities: number[], radii: number[]): void;
|
|
23
|
+
/** Step the simulation by dt seconds. Returns flat positions [x,y,x,y,...]. */
|
|
24
|
+
step(dt: number): Float32Array | null;
|
|
25
|
+
/** Update gravity. */
|
|
26
|
+
setGravity(x: number, y: number): void;
|
|
27
|
+
/** Update bounds. */
|
|
28
|
+
setBounds(w: number, h: number): void;
|
|
29
|
+
/** Get the particle count. */
|
|
30
|
+
readonly count: number;
|
|
31
|
+
/** Clear all particles. */
|
|
32
|
+
clear(): void;
|
|
33
|
+
/** Destroy the WASM world and free memory. */
|
|
34
|
+
destroy(): void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Initialize the WASM physics module.
|
|
38
|
+
* Call once at app startup. Safe to call multiple times.
|
|
39
|
+
*/
|
|
40
|
+
export declare function initWasm(): Promise<void>;
|
|
41
|
+
/** Check if the WASM physics module is loaded. */
|
|
42
|
+
export declare function isReady(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Create a WASM-accelerated physics world.
|
|
45
|
+
* Returns null if WASM is not loaded.
|
|
46
|
+
*/
|
|
47
|
+
export declare function createPhysicsWorld(config: PhysicsConfig): PhysicsWorldInstance | null;
|
|
48
|
+
//# sourceMappingURL=physics-wasm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-wasm.d.ts","sourceRoot":"","sources":["../../src/canvas/physics-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAoBH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,MAAM,WAAW,oBAAoB;IACnC,iFAAiF;IACjF,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC/E,+EAA+E;IAC/E,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAAC;IACtC,sBAAsB;IACtB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,qBAAqB;IACrB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,8BAA8B;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,2BAA2B;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,8CAA8C;IAC9C,OAAO,IAAI,IAAI,CAAC;CACjB;AAKD;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAW9C;AAED,kDAAkD;AAClD,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,oBAAoB,GAAG,IAAI,CA0CrF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Physics WASM Accelerator
|
|
3
|
+
*
|
|
4
|
+
* Optional WASM-accelerated 2D particle physics compiled from Rust.
|
|
5
|
+
* Provides a World class with Verlet integration, boundary collisions,
|
|
6
|
+
* and particle-particle collisions (spatial hashing for large counts).
|
|
7
|
+
*/
|
|
8
|
+
let wasmModule = null;
|
|
9
|
+
let initPromise = null;
|
|
10
|
+
/**
|
|
11
|
+
* Initialize the WASM physics module.
|
|
12
|
+
* Call once at app startup. Safe to call multiple times.
|
|
13
|
+
*/
|
|
14
|
+
export async function initWasm() {
|
|
15
|
+
if (wasmModule)
|
|
16
|
+
return;
|
|
17
|
+
if (initPromise)
|
|
18
|
+
return initPromise;
|
|
19
|
+
initPromise = (async () => {
|
|
20
|
+
// @ts-ignore — wasm-bindgen generated glue
|
|
21
|
+
const mod = await import('./wasm/physics/nova_physics_wasm.js');
|
|
22
|
+
wasmModule = mod;
|
|
23
|
+
})();
|
|
24
|
+
return initPromise;
|
|
25
|
+
}
|
|
26
|
+
/** Check if the WASM physics module is loaded. */
|
|
27
|
+
export function isReady() {
|
|
28
|
+
return wasmModule !== null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a WASM-accelerated physics world.
|
|
32
|
+
* Returns null if WASM is not loaded.
|
|
33
|
+
*/
|
|
34
|
+
export function createPhysicsWorld(config) {
|
|
35
|
+
if (!wasmModule)
|
|
36
|
+
return null;
|
|
37
|
+
const gx = config.gravity?.x ?? 0;
|
|
38
|
+
const gy = config.gravity?.y ?? 9.8;
|
|
39
|
+
const friction = config.friction ?? 0.01;
|
|
40
|
+
const restitution = config.restitution ?? 0.8;
|
|
41
|
+
const world = new wasmModule.World(gx, gy, friction, restitution, config.bounds.width, config.bounds.height);
|
|
42
|
+
return {
|
|
43
|
+
addParticles(positions, velocities, radii) {
|
|
44
|
+
world.addParticles(new Float32Array(positions), new Float32Array(velocities), new Float32Array(radii));
|
|
45
|
+
},
|
|
46
|
+
step(dt) {
|
|
47
|
+
return world.step(dt);
|
|
48
|
+
},
|
|
49
|
+
setGravity(x, y) {
|
|
50
|
+
world.setGravity(x, y);
|
|
51
|
+
},
|
|
52
|
+
setBounds(w, h) {
|
|
53
|
+
world.setBounds(w, h);
|
|
54
|
+
},
|
|
55
|
+
get count() {
|
|
56
|
+
return world.count;
|
|
57
|
+
},
|
|
58
|
+
clear() {
|
|
59
|
+
world.clear();
|
|
60
|
+
},
|
|
61
|
+
destroy() {
|
|
62
|
+
world.free();
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=physics-wasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"physics-wasm.js","sourceRoot":"","sources":["../../src/canvas/physics-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4CH,IAAI,UAAU,GAAuB,IAAI,CAAC;AAC1C,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ;IAC5B,IAAI,UAAU;QAAE,OAAO;IACvB,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC;IAEpC,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,2CAA2C;QAC3C,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;QAChE,UAAU,GAAG,GAA6B,CAAC;IAC7C,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,OAAO;IACrB,OAAO,UAAU,KAAK,IAAI,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAE7B,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC,IAAI,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,GAAG,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE7G,OAAO;QACL,YAAY,CAAC,SAAmB,EAAE,UAAoB,EAAE,KAAe;YACrE,KAAK,CAAC,YAAY,CAChB,IAAI,YAAY,CAAC,SAAS,CAAC,EAC3B,IAAI,YAAY,CAAC,UAAU,CAAC,EAC5B,IAAI,YAAY,CAAC,KAAK,CAAC,CACxB,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,EAAU;YACb,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,CAAC;QAED,UAAU,CAAC,CAAS,EAAE,CAAS;YAC7B,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC;QAED,SAAS,CAAC,CAAS,EAAE,CAAS;YAC5B,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,KAAK;YACP,OAAO,KAAK,CAAC,KAAK,CAAC;QACrB,CAAC;QAED,KAAK;YACH,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAED,OAAO;YACL,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Carousel
|
|
3
|
+
*
|
|
4
|
+
* CSS scroll-snap-based slide carousel with auto-play,
|
|
5
|
+
* dot indicators, arrows, pointer drag, and ARIA.
|
|
6
|
+
*/
|
|
7
|
+
export interface CarouselOptions {
|
|
8
|
+
/** Container element holding the slides */
|
|
9
|
+
container: HTMLElement;
|
|
10
|
+
/** Enable auto-advance. Default: false */
|
|
11
|
+
autoPlay?: boolean;
|
|
12
|
+
/** Auto-play interval in ms. Default: 5000 */
|
|
13
|
+
interval?: number;
|
|
14
|
+
/** Loop back to start when reaching the end. Default: true */
|
|
15
|
+
loop?: boolean;
|
|
16
|
+
/** Show dot indicators. Default: true */
|
|
17
|
+
dots?: boolean;
|
|
18
|
+
/** Show prev/next arrow buttons. Default: true */
|
|
19
|
+
arrows?: boolean;
|
|
20
|
+
/** Gap between slides in px. Default: 0 */
|
|
21
|
+
gap?: number;
|
|
22
|
+
/** Number of slides visible at once. Default: 1 */
|
|
23
|
+
slidesPerView?: number;
|
|
24
|
+
/** Enable drag/swipe interaction. Default: true */
|
|
25
|
+
draggable?: boolean;
|
|
26
|
+
/** Pause auto-play on hover. Default: true */
|
|
27
|
+
pauseOnHover?: boolean;
|
|
28
|
+
/** Callback when the active slide changes */
|
|
29
|
+
onChange?: (index: number) => void;
|
|
30
|
+
}
|
|
31
|
+
export interface CarouselInstance {
|
|
32
|
+
/** Advance to the next slide */
|
|
33
|
+
next(): void;
|
|
34
|
+
/** Go to the previous slide */
|
|
35
|
+
prev(): void;
|
|
36
|
+
/** Jump to a specific slide */
|
|
37
|
+
goTo(index: number): void;
|
|
38
|
+
/** Pause auto-play */
|
|
39
|
+
pause(): void;
|
|
40
|
+
/** Resume auto-play */
|
|
41
|
+
resume(): void;
|
|
42
|
+
/** Current slide index */
|
|
43
|
+
readonly currentIndex: number;
|
|
44
|
+
/** Total number of slides */
|
|
45
|
+
readonly slideCount: number;
|
|
46
|
+
/** Clean up listeners, DOM elements, and timers */
|
|
47
|
+
destroy(): void;
|
|
48
|
+
}
|
|
49
|
+
/** Create a carousel/slider. */
|
|
50
|
+
export declare function createCarousel(options: CarouselOptions): CarouselInstance;
|
|
51
|
+
//# sourceMappingURL=carousel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel.d.ts","sourceRoot":"","sources":["../../src/carousel/carousel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,SAAS,EAAE,WAAW,CAAC;IACvB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yCAAyC;IACzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,kDAAkD;IAClD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,gBAAgB;IAC/B,gCAAgC;IAChC,IAAI,IAAI,IAAI,CAAC;IACb,+BAA+B;IAC/B,IAAI,IAAI,IAAI,CAAC;IACb,+BAA+B;IAC/B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,sBAAsB;IACtB,KAAK,IAAI,IAAI,CAAC;IACd,uBAAuB;IACvB,MAAM,IAAI,IAAI,CAAC;IACf,0BAA0B;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,6BAA6B;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,mDAAmD;IACnD,OAAO,IAAI,IAAI,CAAC;CACjB;AAwBD,gCAAgC;AAChC,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,gBAAgB,CA2OzE"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Carousel
|
|
3
|
+
*
|
|
4
|
+
* CSS scroll-snap-based slide carousel with auto-play,
|
|
5
|
+
* dot indicators, arrows, pointer drag, and ARIA.
|
|
6
|
+
*/
|
|
7
|
+
const STYLE_ID = 'nova-carousel-styles';
|
|
8
|
+
function injectStyles() {
|
|
9
|
+
if (document.getElementById(STYLE_ID))
|
|
10
|
+
return;
|
|
11
|
+
const s = document.createElement('style');
|
|
12
|
+
s.id = STYLE_ID;
|
|
13
|
+
s.textContent = `
|
|
14
|
+
.nova-carousel{position:relative;overflow:hidden}
|
|
15
|
+
.nova-carousel-track{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}
|
|
16
|
+
.nova-carousel-track::-webkit-scrollbar{display:none}
|
|
17
|
+
.nova-carousel-track>*{scroll-snap-align:start;flex-shrink:0}
|
|
18
|
+
.nova-carousel-arrow{position:absolute;top:50%;transform:translateY(-50%);z-index:2;width:2.5rem;height:2.5rem;border-radius:50%;border:1px solid var(--color-border,rgba(255,255,255,0.12));background:var(--color-bg-elevated,rgba(18,18,18,0.85));color:var(--color-text,rgba(255,255,255,0.87));display:flex;align-items:center;justify-content:center;cursor:pointer;transition:opacity 0.2s,background 0.2s;opacity:0.8;font-size:1.125rem;line-height:1;padding:0}
|
|
19
|
+
.nova-carousel-arrow:hover{opacity:1;background:var(--color-bg-hover,rgba(255,255,255,0.06))}
|
|
20
|
+
.nova-carousel-arrow--prev{left:0.75rem}
|
|
21
|
+
.nova-carousel-arrow--next{right:0.75rem}
|
|
22
|
+
.nova-carousel-dots{display:flex;justify-content:center;gap:0.5rem;padding:0.75rem 0}
|
|
23
|
+
.nova-carousel-dot{width:8px;height:8px;border-radius:50%;border:none;padding:0;background:var(--color-border,rgba(255,255,255,0.2));cursor:pointer;transition:background 0.2s,transform 0.2s}
|
|
24
|
+
.nova-carousel-dot--active{background:var(--color-accent,#a78bfa);transform:scale(1.25)}
|
|
25
|
+
`;
|
|
26
|
+
document.head.appendChild(s);
|
|
27
|
+
}
|
|
28
|
+
/** Create a carousel/slider. */
|
|
29
|
+
export function createCarousel(options) {
|
|
30
|
+
const { container, autoPlay = false, interval = 5000, loop = true, dots = true, arrows = true, gap = 0, slidesPerView = 1, draggable = true, pauseOnHover = true, onChange, } = options;
|
|
31
|
+
let destroyed = false;
|
|
32
|
+
let current = 0;
|
|
33
|
+
let autoTimer;
|
|
34
|
+
let paused = false;
|
|
35
|
+
injectStyles();
|
|
36
|
+
const listeners = [];
|
|
37
|
+
function on(target, evt, fn, opts) {
|
|
38
|
+
target.addEventListener(evt, fn, opts);
|
|
39
|
+
listeners.push([target, evt, fn, opts]);
|
|
40
|
+
}
|
|
41
|
+
// --- Wrapper setup ---
|
|
42
|
+
container.classList.add('nova-carousel');
|
|
43
|
+
container.setAttribute('role', 'region');
|
|
44
|
+
container.setAttribute('aria-roledescription', 'carousel');
|
|
45
|
+
// Track: wrap existing children
|
|
46
|
+
const track = document.createElement('div');
|
|
47
|
+
track.className = 'nova-carousel-track';
|
|
48
|
+
track.style.gap = gap ? `${gap}px` : '';
|
|
49
|
+
const slides = Array.from(container.children);
|
|
50
|
+
for (const slide of slides) {
|
|
51
|
+
slide.setAttribute('role', 'group');
|
|
52
|
+
slide.setAttribute('aria-roledescription', 'slide');
|
|
53
|
+
slide.style.minWidth = `calc(${100 / slidesPerView}% - ${gap * (slidesPerView - 1) / slidesPerView}px)`;
|
|
54
|
+
track.appendChild(slide);
|
|
55
|
+
}
|
|
56
|
+
container.appendChild(track);
|
|
57
|
+
const total = slides.length;
|
|
58
|
+
// --- Dots ---
|
|
59
|
+
let dotsContainer = null;
|
|
60
|
+
const dotEls = [];
|
|
61
|
+
if (dots && total > 1) {
|
|
62
|
+
dotsContainer = document.createElement('div');
|
|
63
|
+
dotsContainer.className = 'nova-carousel-dots';
|
|
64
|
+
dotsContainer.setAttribute('role', 'tablist');
|
|
65
|
+
for (let i = 0; i < total; i++) {
|
|
66
|
+
const dot = document.createElement('button');
|
|
67
|
+
dot.className = 'nova-carousel-dot';
|
|
68
|
+
dot.setAttribute('role', 'tab');
|
|
69
|
+
dot.setAttribute('aria-label', `Slide ${i + 1}`);
|
|
70
|
+
on(dot, 'click', () => goTo(i));
|
|
71
|
+
dotsContainer.appendChild(dot);
|
|
72
|
+
dotEls.push(dot);
|
|
73
|
+
}
|
|
74
|
+
container.appendChild(dotsContainer);
|
|
75
|
+
}
|
|
76
|
+
// --- Arrows ---
|
|
77
|
+
let prevBtn = null;
|
|
78
|
+
let nextBtn = null;
|
|
79
|
+
if (arrows && total > 1) {
|
|
80
|
+
prevBtn = document.createElement('button');
|
|
81
|
+
prevBtn.className = 'nova-carousel-arrow nova-carousel-arrow--prev';
|
|
82
|
+
prevBtn.setAttribute('aria-label', 'Previous slide');
|
|
83
|
+
prevBtn.textContent = '\u2039';
|
|
84
|
+
on(prevBtn, 'click', () => prev());
|
|
85
|
+
container.appendChild(prevBtn);
|
|
86
|
+
nextBtn = document.createElement('button');
|
|
87
|
+
nextBtn.className = 'nova-carousel-arrow nova-carousel-arrow--next';
|
|
88
|
+
nextBtn.setAttribute('aria-label', 'Next slide');
|
|
89
|
+
nextBtn.textContent = '\u203A';
|
|
90
|
+
on(nextBtn, 'click', () => next());
|
|
91
|
+
container.appendChild(nextBtn);
|
|
92
|
+
}
|
|
93
|
+
// --- Navigation ---
|
|
94
|
+
function goTo(index) {
|
|
95
|
+
if (destroyed || total === 0)
|
|
96
|
+
return;
|
|
97
|
+
if (loop) {
|
|
98
|
+
current = ((index % total) + total) % total;
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
current = Math.max(0, Math.min(total - 1, index));
|
|
102
|
+
}
|
|
103
|
+
const slideWidth = slides[0].offsetWidth + gap;
|
|
104
|
+
track.scrollTo({ left: current * slideWidth, behavior: 'smooth' });
|
|
105
|
+
updateIndicators();
|
|
106
|
+
onChange?.(current);
|
|
107
|
+
}
|
|
108
|
+
function next() { goTo(current + 1); }
|
|
109
|
+
function prev() { goTo(current - 1); }
|
|
110
|
+
function updateIndicators() {
|
|
111
|
+
for (let i = 0; i < dotEls.length; i++) {
|
|
112
|
+
dotEls[i].classList.toggle('nova-carousel-dot--active', i === current);
|
|
113
|
+
dotEls[i].setAttribute('aria-selected', String(i === current));
|
|
114
|
+
}
|
|
115
|
+
for (let i = 0; i < slides.length; i++) {
|
|
116
|
+
slides[i].setAttribute('aria-hidden', String(i !== current));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// --- Scroll-based index detection ---
|
|
120
|
+
let scrollRaf;
|
|
121
|
+
on(track, 'scroll', () => {
|
|
122
|
+
if (scrollRaf)
|
|
123
|
+
cancelAnimationFrame(scrollRaf);
|
|
124
|
+
scrollRaf = requestAnimationFrame(() => {
|
|
125
|
+
if (total === 0)
|
|
126
|
+
return;
|
|
127
|
+
const slideWidth = slides[0].offsetWidth + gap;
|
|
128
|
+
const newIndex = Math.round(track.scrollLeft / slideWidth);
|
|
129
|
+
if (newIndex !== current && newIndex >= 0 && newIndex < total) {
|
|
130
|
+
current = newIndex;
|
|
131
|
+
updateIndicators();
|
|
132
|
+
onChange?.(current);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}, { passive: true });
|
|
136
|
+
// --- Pointer drag ---
|
|
137
|
+
if (draggable && total > 1) {
|
|
138
|
+
let startX = 0;
|
|
139
|
+
let startScroll = 0;
|
|
140
|
+
let isDragging = false;
|
|
141
|
+
on(track, 'pointerdown', ((e) => {
|
|
142
|
+
if (e.button !== 0)
|
|
143
|
+
return;
|
|
144
|
+
isDragging = true;
|
|
145
|
+
startX = e.clientX;
|
|
146
|
+
startScroll = track.scrollLeft;
|
|
147
|
+
track.style.scrollSnapType = 'none';
|
|
148
|
+
track.style.cursor = 'grabbing';
|
|
149
|
+
track.setPointerCapture(e.pointerId);
|
|
150
|
+
}));
|
|
151
|
+
on(track, 'pointermove', ((e) => {
|
|
152
|
+
if (!isDragging)
|
|
153
|
+
return;
|
|
154
|
+
const dx = e.clientX - startX;
|
|
155
|
+
track.scrollLeft = startScroll - dx;
|
|
156
|
+
}));
|
|
157
|
+
on(track, 'pointerup', ((e) => {
|
|
158
|
+
if (!isDragging)
|
|
159
|
+
return;
|
|
160
|
+
isDragging = false;
|
|
161
|
+
track.style.scrollSnapType = 'x mandatory';
|
|
162
|
+
track.style.cursor = '';
|
|
163
|
+
track.releasePointerCapture(e.pointerId);
|
|
164
|
+
// Snap to nearest
|
|
165
|
+
const slideWidth = slides[0].offsetWidth + gap;
|
|
166
|
+
const nearest = Math.round(track.scrollLeft / slideWidth);
|
|
167
|
+
goTo(nearest);
|
|
168
|
+
}));
|
|
169
|
+
}
|
|
170
|
+
// --- Auto-play ---
|
|
171
|
+
function startAutoPlay() {
|
|
172
|
+
stopAutoPlay();
|
|
173
|
+
if (!autoPlay || total <= 1)
|
|
174
|
+
return;
|
|
175
|
+
autoTimer = setInterval(() => {
|
|
176
|
+
if (!paused)
|
|
177
|
+
next();
|
|
178
|
+
}, interval);
|
|
179
|
+
}
|
|
180
|
+
function stopAutoPlay() {
|
|
181
|
+
if (autoTimer !== undefined) {
|
|
182
|
+
clearInterval(autoTimer);
|
|
183
|
+
autoTimer = undefined;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (pauseOnHover) {
|
|
187
|
+
on(container, 'mouseenter', () => { paused = true; });
|
|
188
|
+
on(container, 'mouseleave', () => { paused = false; });
|
|
189
|
+
}
|
|
190
|
+
// --- Keyboard ---
|
|
191
|
+
on(container, 'keydown', ((e) => {
|
|
192
|
+
if (e.key === 'ArrowLeft') {
|
|
193
|
+
e.preventDefault();
|
|
194
|
+
prev();
|
|
195
|
+
}
|
|
196
|
+
else if (e.key === 'ArrowRight') {
|
|
197
|
+
e.preventDefault();
|
|
198
|
+
next();
|
|
199
|
+
}
|
|
200
|
+
}));
|
|
201
|
+
// --- Init ---
|
|
202
|
+
updateIndicators();
|
|
203
|
+
if (autoPlay)
|
|
204
|
+
startAutoPlay();
|
|
205
|
+
return {
|
|
206
|
+
next,
|
|
207
|
+
prev,
|
|
208
|
+
goTo,
|
|
209
|
+
pause() { paused = true; stopAutoPlay(); },
|
|
210
|
+
resume() { paused = false; startAutoPlay(); },
|
|
211
|
+
get currentIndex() { return current; },
|
|
212
|
+
get slideCount() { return total; },
|
|
213
|
+
destroy() {
|
|
214
|
+
if (destroyed)
|
|
215
|
+
return;
|
|
216
|
+
destroyed = true;
|
|
217
|
+
stopAutoPlay();
|
|
218
|
+
if (scrollRaf)
|
|
219
|
+
cancelAnimationFrame(scrollRaf);
|
|
220
|
+
for (const [t, e, fn, opts] of listeners)
|
|
221
|
+
t.removeEventListener(e, fn, opts);
|
|
222
|
+
if (dotsContainer)
|
|
223
|
+
dotsContainer.remove();
|
|
224
|
+
if (prevBtn)
|
|
225
|
+
prevBtn.remove();
|
|
226
|
+
if (nextBtn)
|
|
227
|
+
nextBtn.remove();
|
|
228
|
+
// Unwrap slides back into container
|
|
229
|
+
while (track.firstChild)
|
|
230
|
+
container.appendChild(track.firstChild);
|
|
231
|
+
track.remove();
|
|
232
|
+
container.classList.remove('nova-carousel');
|
|
233
|
+
},
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=carousel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carousel.js","sourceRoot":"","sources":["../../src/carousel/carousel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/carousel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/carousel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Clipboard
|
|
3
|
+
*
|
|
4
|
+
* Clipboard API wrappers for reading and writing text/HTML
|
|
5
|
+
* with legacy fallback for older browsers.
|
|
6
|
+
*/
|
|
7
|
+
/** Copy plain text to the clipboard. */
|
|
8
|
+
export declare function copyText(text: string): Promise<boolean>;
|
|
9
|
+
/** Copy HTML content to the clipboard. Falls back to plain text copy. */
|
|
10
|
+
export declare function copyHtml(html: string): Promise<boolean>;
|
|
11
|
+
/** Read plain text from the clipboard. */
|
|
12
|
+
export declare function readText(): Promise<string>;
|
|
13
|
+
/** Read HTML from the clipboard. Falls back to readText. */
|
|
14
|
+
export declare function readHtml(): Promise<string>;
|
|
15
|
+
//# sourceMappingURL=clipboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.d.ts","sourceRoot":"","sources":["../../src/clipboard/clipboard.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,wCAAwC;AACxC,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU7D;AAED,yEAAyE;AACzE,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY7D;AAED,0CAA0C;AAC1C,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAKhD;AAED,4DAA4D;AAC5D,wBAAsB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAahD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Clipboard
|
|
3
|
+
*
|
|
4
|
+
* Clipboard API wrappers for reading and writing text/HTML
|
|
5
|
+
* with legacy fallback for older browsers.
|
|
6
|
+
*/
|
|
7
|
+
/** Copy plain text to the clipboard. */
|
|
8
|
+
export async function copyText(text) {
|
|
9
|
+
if (navigator.clipboard?.writeText) {
|
|
10
|
+
try {
|
|
11
|
+
await navigator.clipboard.writeText(text);
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
return fallbackCopy(text);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return fallbackCopy(text);
|
|
19
|
+
}
|
|
20
|
+
/** Copy HTML content to the clipboard. Falls back to plain text copy. */
|
|
21
|
+
export async function copyHtml(html) {
|
|
22
|
+
if (navigator.clipboard?.write) {
|
|
23
|
+
try {
|
|
24
|
+
const blob = new Blob([html], { type: 'text/html' });
|
|
25
|
+
const item = new ClipboardItem({ 'text/html': blob });
|
|
26
|
+
await navigator.clipboard.write([item]);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return fallbackCopy(html);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return fallbackCopy(html);
|
|
34
|
+
}
|
|
35
|
+
/** Read plain text from the clipboard. */
|
|
36
|
+
export async function readText() {
|
|
37
|
+
if (navigator.clipboard?.readText) {
|
|
38
|
+
return navigator.clipboard.readText();
|
|
39
|
+
}
|
|
40
|
+
return '';
|
|
41
|
+
}
|
|
42
|
+
/** Read HTML from the clipboard. Falls back to readText. */
|
|
43
|
+
export async function readHtml() {
|
|
44
|
+
if (navigator.clipboard?.read) {
|
|
45
|
+
try {
|
|
46
|
+
const items = await navigator.clipboard.read();
|
|
47
|
+
for (const item of items) {
|
|
48
|
+
if (item.types.includes('text/html')) {
|
|
49
|
+
const blob = await item.getType('text/html');
|
|
50
|
+
return blob.text();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
catch { /* fall through */ }
|
|
55
|
+
}
|
|
56
|
+
return readText();
|
|
57
|
+
}
|
|
58
|
+
// --- Fallback ---
|
|
59
|
+
function fallbackCopy(text) {
|
|
60
|
+
const textarea = document.createElement('textarea');
|
|
61
|
+
textarea.value = text;
|
|
62
|
+
textarea.style.position = 'fixed';
|
|
63
|
+
textarea.style.left = '-9999px';
|
|
64
|
+
textarea.style.top = '-9999px';
|
|
65
|
+
textarea.style.opacity = '0';
|
|
66
|
+
document.body.appendChild(textarea);
|
|
67
|
+
textarea.select();
|
|
68
|
+
let success = false;
|
|
69
|
+
try {
|
|
70
|
+
success = document.execCommand('copy');
|
|
71
|
+
}
|
|
72
|
+
catch { /* ignore */ }
|
|
73
|
+
document.body.removeChild(textarea);
|
|
74
|
+
return success;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=clipboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../../src/clipboard/clipboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clipboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/clipboard/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Diff WASM Accelerator
|
|
3
|
+
*
|
|
4
|
+
* Optional WASM-accelerated list diffing compiled from Rust.
|
|
5
|
+
* Uses LIS (Longest Increasing Subsequence) for optimal
|
|
6
|
+
* keyed list reconciliation, producing minimal DOM operations.
|
|
7
|
+
*/
|
|
8
|
+
export interface DiffOp {
|
|
9
|
+
op: 'insert' | 'remove' | 'move';
|
|
10
|
+
index: number;
|
|
11
|
+
to?: number;
|
|
12
|
+
key?: string;
|
|
13
|
+
}
|
|
14
|
+
type DiffEngine = (oldKeys: string[], newKeys: string[]) => DiffOp[];
|
|
15
|
+
/**
|
|
16
|
+
* Register a custom diff engine. Called internally by initWasm().
|
|
17
|
+
* Can also be used to register a non-WASM diff engine.
|
|
18
|
+
*/
|
|
19
|
+
export declare function setDiffEngine(engine: DiffEngine): void;
|
|
20
|
+
/** Get the current diff engine, or null if none registered. */
|
|
21
|
+
export declare function getDiffEngine(): DiffEngine | null;
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the WASM diff module and register it as the diff engine.
|
|
24
|
+
* Call once at app startup. Safe to call multiple times.
|
|
25
|
+
*/
|
|
26
|
+
export declare function initWasm(): Promise<void>;
|
|
27
|
+
/** Check if the WASM diff module is loaded. */
|
|
28
|
+
export declare function isReady(): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Compute the minimal diff operations to transform oldKeys into newKeys.
|
|
31
|
+
* Uses WASM if loaded, otherwise returns null.
|
|
32
|
+
*/
|
|
33
|
+
export declare function computeDiff(oldKeys: string[], newKeys: string[]): DiffOp[] | null;
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=diff-wasm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-wasm.d.ts","sourceRoot":"","sources":["../../src/component/diff-wasm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,KAAK,UAAU,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;AAUrE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAEtD;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,IAAI,UAAU,GAAG,IAAI,CAEjD;AAED;;;GAGG;AACH,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAa9C;AAED,+CAA+C;AAC/C,wBAAgB,OAAO,IAAI,OAAO,CAEjC;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAGjF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nova Engine — Diff WASM Accelerator
|
|
3
|
+
*
|
|
4
|
+
* Optional WASM-accelerated list diffing compiled from Rust.
|
|
5
|
+
* Uses LIS (Longest Increasing Subsequence) for optimal
|
|
6
|
+
* keyed list reconciliation, producing minimal DOM operations.
|
|
7
|
+
*/
|
|
8
|
+
let wasm = null;
|
|
9
|
+
let initPromise = null;
|
|
10
|
+
let _diffEngine = null;
|
|
11
|
+
/**
|
|
12
|
+
* Register a custom diff engine. Called internally by initWasm().
|
|
13
|
+
* Can also be used to register a non-WASM diff engine.
|
|
14
|
+
*/
|
|
15
|
+
export function setDiffEngine(engine) {
|
|
16
|
+
_diffEngine = engine;
|
|
17
|
+
}
|
|
18
|
+
/** Get the current diff engine, or null if none registered. */
|
|
19
|
+
export function getDiffEngine() {
|
|
20
|
+
return _diffEngine;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Initialize the WASM diff module and register it as the diff engine.
|
|
24
|
+
* Call once at app startup. Safe to call multiple times.
|
|
25
|
+
*/
|
|
26
|
+
export async function initWasm() {
|
|
27
|
+
if (wasm)
|
|
28
|
+
return;
|
|
29
|
+
if (initPromise)
|
|
30
|
+
return initPromise;
|
|
31
|
+
initPromise = (async () => {
|
|
32
|
+
// @ts-ignore — wasm-bindgen generated glue
|
|
33
|
+
const mod = await import('./wasm/diff/nova_diff_wasm.js');
|
|
34
|
+
wasm = mod;
|
|
35
|
+
setDiffEngine((oldKeys, newKeys) => wasm.computeDiff(oldKeys, newKeys));
|
|
36
|
+
})();
|
|
37
|
+
return initPromise;
|
|
38
|
+
}
|
|
39
|
+
/** Check if the WASM diff module is loaded. */
|
|
40
|
+
export function isReady() {
|
|
41
|
+
return wasm !== null;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Compute the minimal diff operations to transform oldKeys into newKeys.
|
|
45
|
+
* Uses WASM if loaded, otherwise returns null.
|
|
46
|
+
*/
|
|
47
|
+
export function computeDiff(oldKeys, newKeys) {
|
|
48
|
+
if (!wasm)
|
|
49
|
+
return null;
|
|
50
|
+
return wasm.computeDiff(oldKeys, newKeys);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=diff-wasm.js.map
|