zx-kit 0.28.0 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  > **A Speccy-flavoured fantasy toolkit for tiny TypeScript browser games.**
4
4
  > Inspired by the ZX Spectrum — not an emulator, not a hardware clone.
5
5
 
6
- Spectrum-palette canvas rendering. ROM bitmap font. AY-3-8912 three-channel audio. Beeper SFX. Tile maps. Free-roaming sprites. Collision detection. Saves. Camera. Scene manager. Particle pool. Dithered lighting. Zero dependencies. TypeScript-first.
6
+ Spectrum-palette canvas rendering. ROM bitmap font. AY-3-8912 three-channel audio. Beeper SFX. Tile maps. Free-roaming sprites. Collision detection. Saves. Camera. Scene manager. Particle pool. Dithered lighting. Offscreen layer cache. Zero dependencies. TypeScript-first.
7
7
 
8
8
  [![npm](https://img.shields.io/npm/v/zx-kit)](https://www.npmjs.com/package/zx-kit)
9
9
  [![license](https://img.shields.io/npm/l/zx-kit)](LICENSE)
@@ -27,6 +27,7 @@ zx-kit captures that aesthetic in TypeScript. You get the Spectrum's palette, RO
27
27
  - **Authentic 15-color palette** — normal and bright variants, palette-enforced at compile time via the `SpectrumColor` type
28
28
  - **Canvas renderer** — pixel-perfect scaled rendering, sprite flipping, text drawing, CRT scanline overlay, animated border flashing
29
29
  - **Tile map engine** — scrollable maps, O(1) id-index, smart seasonal background swapping, solid-tile collision queries
30
+ - **Offscreen layer cache** — render a static or rarely-changing layer (tile map, CRT overlay) once to an offscreen canvas and blit it each frame; `dirty`-flag invalidation turns thousands of per-pixel `fillRect`s into a single `drawImage`
30
31
  - **Free-roaming sprites** — position, velocity, gravity, `flipX` caching, transparent or opaque background
31
32
  - **Three-tier collision** — AABB overlap tests, generic rect-vs-tile wall resolution (any sprite size), and pixel-precise mask overlap with O(pixels) sorted-merge intersection — no allocations per frame
32
33
  - **Keyboard and gamepad input** — configurable key-repeat, transparent gamepad polling, single-consume action flags, instant state reset on phase transitions
@@ -589,6 +590,7 @@ requestAnimationFrame(loop)
589
590
  | [`font.ts`](#fontts--rom-bitmap-font) | 96-character ROM font, raw bitmap access |
590
591
  | [`i18n.ts`](#i18nts--runtime-locale-selection) | Type-safe runtime locale selection for translated string packs |
591
592
  | [`lighting.ts`](#lightingts--dithered-cave-darkness) | Dithered cave darkness: pre-baked level tiles + dirty-cell buffer, one blit/frame (no per-frame putImageData) |
593
+ | [`cache.ts`](#cachets--offscreen-layer-cache) | Offscreen layer cache: render a static layer once, blit each frame, `dirty`-flag invalidation |
592
594
  | [`music.ts`](#musicts--note-name-ay-music) | Write AY music by note name (`A5`, `C#4`) and loop it for background tracks |
593
595
 
594
596
  ---
@@ -2740,6 +2742,56 @@ track.stop()
2740
2742
 
2741
2743
  ---
2742
2744
 
2745
+ ## `cache.ts` — Offscreen Layer Cache
2746
+
2747
+ `drawBitmap`, `drawSprite` and `drawTileMapAt` paint **one `fillRect` per lit
2748
+ pixel** — perfect for a moving sprite, but lethal for a full-screen layer redrawn
2749
+ every frame (a scrolling tile map can be thousands of `fillRect`s per frame). The
2750
+ cure is to render that layer **once** to an offscreen canvas, then blit it with a
2751
+ single `drawImage`.
2752
+
2753
+ A `LayerCache` is an offscreen canvas plus a `dirty` flag. `refreshLayer` re-runs
2754
+ your draw callback **only while the cache is dirty**, then clears the flag; call
2755
+ `invalidateLayer` whenever the layer's contents change (a tile edited, a level
2756
+ reset) to force exactly one re-render. Headless-safe: with no `document` the
2757
+ canvas is `null`, the draw is skipped, and nothing throws.
2758
+
2759
+ ### `createLayerCache(width, height): LayerCache`
2760
+
2761
+ Creates an offscreen cache of the given pixel size, starting `dirty`. Image
2762
+ smoothing is disabled for crisp ZX output. Create once; reuse across frames.
2763
+ Throws if `width`/`height` is not a positive number.
2764
+
2765
+ ### `invalidateLayer(layer): void`
2766
+
2767
+ Marks the cache stale so the next `refreshLayer` re-renders it.
2768
+
2769
+ ### `refreshLayer(layer, render): HTMLCanvasElement | null`
2770
+
2771
+ Runs `render(offscreenCtx)` only if the cache is dirty (the context is cleared
2772
+ first), then clears the flag and returns the offscreen canvas to blit (or `null`
2773
+ when headless). Blitting is yours: a `drawImage` source window for a scrolling
2774
+ camera, or `drawImage(canvas, 0, 0)` for a static overlay.
2775
+
2776
+ ```ts
2777
+ // Cache a whole tile map; blit a moving camera window each frame.
2778
+ const world = tileMapWorldSize(map)
2779
+ const tiles = createLayerCache(world.width, world.height) // once
2780
+
2781
+ // game loop:
2782
+ refreshLayer(tiles, (lctx) => drawTileMapAt(lctx, map, 0, 0, world.width, world.height))
2783
+ if (tiles.canvas) ctx.drawImage(tiles.canvas, camX, camY, 256, 192, 0, 0, 256, 192)
2784
+
2785
+ // when a tile changes (a platform crumbles, the level resets):
2786
+ invalidateLayer(tiles)
2787
+ ```
2788
+
2789
+ > Pairs naturally with `tilescroll` / `tilemap`: cache the static geometry and
2790
+ > invalidate only on the rare tile change. The same primitive caches any static
2791
+ > overlay — e.g. `refreshLayer(overlay, (c) => drawScanlines(c))`.
2792
+
2793
+ ---
2794
+
2743
2795
  ## Architecture
2744
2796
 
2745
2797
  ### Module structure
@@ -0,0 +1,68 @@
1
+ /**
2
+ * @module cache
3
+ *
4
+ * **Offscreen layer cache** — render a static (or rarely-changing) layer to an
5
+ * offscreen canvas **once**, then blit it every frame with a single `drawImage`
6
+ * instead of re-rasterising it. This is the antidote to the per-pixel `fillRect`
7
+ * cost of {@link "renderer" | drawBitmap} / {@link "tilescroll" | drawTileMapAt}
8
+ * when they are used for a full-screen layer on every frame.
9
+ *
10
+ * The cache is **dirty-driven**: {@link refreshLayer} re-runs your draw callback
11
+ * only while the cache is `dirty`, then clears the flag. Call
12
+ * {@link invalidateLayer} whenever the layer's contents change (a tile edited, a
13
+ * palette swap, a level reset) to force exactly one re-render next frame.
14
+ *
15
+ * Headless-safe: with no `document` (Node / SSR / tests) the canvas is `null`,
16
+ * `refreshLayer` skips the draw and returns `null`, and nothing throws — mirrors
17
+ * the {@link "lighting" | lighting} module's degrade-gracefully behaviour.
18
+ *
19
+ * @example Cache a whole tile map, blit a moving camera window each frame
20
+ * ```ts
21
+ * const world = tileMapWorldSize(map)
22
+ * const tiles = createLayerCache(world.width, world.height) // once
23
+ * // game loop:
24
+ * refreshLayer(tiles, (lctx) => drawTileMapAt(lctx, map, 0, 0, world.width, world.height))
25
+ * if (tiles.canvas) ctx.drawImage(tiles.canvas, camX, camY, viewW, viewH, 0, 0, viewW, viewH)
26
+ * // when a tile changes (e.g. a platform crumbles or the level resets):
27
+ * invalidateLayer(tiles)
28
+ * ```
29
+ *
30
+ * @example Cache a static overlay — drawn once, blitted forever
31
+ * ```ts
32
+ * const overlay = createLayerCache(canvas.width, canvas.height)
33
+ * refreshLayer(overlay, (lctx) => drawScanlines(lctx))
34
+ * if (overlay.canvas) ctx.drawImage(overlay.canvas, 0, 0)
35
+ * ```
36
+ */
37
+ /** An offscreen canvas plus a dirty flag. `canvas` is `null` when headless. */
38
+ export interface LayerCache {
39
+ /** Width of the cached layer in pixels. */
40
+ readonly width: number;
41
+ /** Height of the cached layer in pixels. */
42
+ readonly height: number;
43
+ /** The offscreen canvas to blit, or `null` with no `document` (headless). */
44
+ readonly canvas: HTMLCanvasElement | null;
45
+ /** When `true`, the next {@link refreshLayer} re-runs the draw callback. */
46
+ dirty: boolean;
47
+ }
48
+ /**
49
+ * Creates an offscreen layer cache of the given pixel size. Starts `dirty`, so
50
+ * the first {@link refreshLayer} renders it. Image smoothing is disabled on the
51
+ * offscreen context for crisp ZX output. Create once and reuse across frames.
52
+ *
53
+ * @throws if `width` or `height` is not a positive finite number.
54
+ */
55
+ export declare function createLayerCache(width: number, height: number): LayerCache;
56
+ /** Marks the cache stale so the next {@link refreshLayer} re-renders it. */
57
+ export declare function invalidateLayer(layer: LayerCache): void;
58
+ /**
59
+ * Re-renders the cache via `render` **only if it is dirty**, then clears the
60
+ * dirty flag. `render` receives the offscreen 2D context (already cleared) and
61
+ * should draw the whole layer in layer-local coordinates (top-left = `0,0`).
62
+ * Returns the offscreen canvas to blit (or `null` when headless).
63
+ *
64
+ * Blitting is the caller's job: use a `drawImage` source window for a scrolling
65
+ * camera, or `drawImage(canvas, 0, 0)` for a static overlay.
66
+ */
67
+ export declare function refreshLayer(layer: LayerCache, render: (ctx: CanvasRenderingContext2D) => void): HTMLCanvasElement | null;
68
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,+EAA+E;AAC/E,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,6EAA6E;IAC7E,QAAQ,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAA;IACzC,4EAA4E;IAC5E,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAa1E;AAED,4EAA4E;AAC5E,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAEvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,CAAC,GAAG,EAAE,wBAAwB,KAAK,IAAI,GAC9C,iBAAiB,GAAG,IAAI,CAW1B"}
package/dist/cache.js ADDED
@@ -0,0 +1,84 @@
1
+ /**
2
+ * @module cache
3
+ *
4
+ * **Offscreen layer cache** — render a static (or rarely-changing) layer to an
5
+ * offscreen canvas **once**, then blit it every frame with a single `drawImage`
6
+ * instead of re-rasterising it. This is the antidote to the per-pixel `fillRect`
7
+ * cost of {@link "renderer" | drawBitmap} / {@link "tilescroll" | drawTileMapAt}
8
+ * when they are used for a full-screen layer on every frame.
9
+ *
10
+ * The cache is **dirty-driven**: {@link refreshLayer} re-runs your draw callback
11
+ * only while the cache is `dirty`, then clears the flag. Call
12
+ * {@link invalidateLayer} whenever the layer's contents change (a tile edited, a
13
+ * palette swap, a level reset) to force exactly one re-render next frame.
14
+ *
15
+ * Headless-safe: with no `document` (Node / SSR / tests) the canvas is `null`,
16
+ * `refreshLayer` skips the draw and returns `null`, and nothing throws — mirrors
17
+ * the {@link "lighting" | lighting} module's degrade-gracefully behaviour.
18
+ *
19
+ * @example Cache a whole tile map, blit a moving camera window each frame
20
+ * ```ts
21
+ * const world = tileMapWorldSize(map)
22
+ * const tiles = createLayerCache(world.width, world.height) // once
23
+ * // game loop:
24
+ * refreshLayer(tiles, (lctx) => drawTileMapAt(lctx, map, 0, 0, world.width, world.height))
25
+ * if (tiles.canvas) ctx.drawImage(tiles.canvas, camX, camY, viewW, viewH, 0, 0, viewW, viewH)
26
+ * // when a tile changes (e.g. a platform crumbles or the level resets):
27
+ * invalidateLayer(tiles)
28
+ * ```
29
+ *
30
+ * @example Cache a static overlay — drawn once, blitted forever
31
+ * ```ts
32
+ * const overlay = createLayerCache(canvas.width, canvas.height)
33
+ * refreshLayer(overlay, (lctx) => drawScanlines(lctx))
34
+ * if (overlay.canvas) ctx.drawImage(overlay.canvas, 0, 0)
35
+ * ```
36
+ */
37
+ /**
38
+ * Creates an offscreen layer cache of the given pixel size. Starts `dirty`, so
39
+ * the first {@link refreshLayer} renders it. Image smoothing is disabled on the
40
+ * offscreen context for crisp ZX output. Create once and reuse across frames.
41
+ *
42
+ * @throws if `width` or `height` is not a positive finite number.
43
+ */
44
+ export function createLayerCache(width, height) {
45
+ if (!Number.isFinite(width) || width <= 0 || !Number.isFinite(height) || height <= 0) {
46
+ throw new Error(`createLayerCache: width and height must be positive, got ${width}×${height}`);
47
+ }
48
+ let canvas = null;
49
+ if (typeof document !== 'undefined') {
50
+ canvas = document.createElement('canvas');
51
+ canvas.width = width;
52
+ canvas.height = height;
53
+ const ctx = canvas.getContext('2d');
54
+ if (ctx)
55
+ ctx.imageSmoothingEnabled = false;
56
+ }
57
+ return { width, height, canvas, dirty: true };
58
+ }
59
+ /** Marks the cache stale so the next {@link refreshLayer} re-renders it. */
60
+ export function invalidateLayer(layer) {
61
+ layer.dirty = true;
62
+ }
63
+ /**
64
+ * Re-renders the cache via `render` **only if it is dirty**, then clears the
65
+ * dirty flag. `render` receives the offscreen 2D context (already cleared) and
66
+ * should draw the whole layer in layer-local coordinates (top-left = `0,0`).
67
+ * Returns the offscreen canvas to blit (or `null` when headless).
68
+ *
69
+ * Blitting is the caller's job: use a `drawImage` source window for a scrolling
70
+ * camera, or `drawImage(canvas, 0, 0)` for a static overlay.
71
+ */
72
+ export function refreshLayer(layer, render) {
73
+ if (layer.dirty) {
74
+ layer.dirty = false;
75
+ const ctx = layer.canvas ? layer.canvas.getContext('2d') : null;
76
+ if (ctx) {
77
+ ctx.clearRect(0, 0, layer.width, layer.height);
78
+ ctx.imageSmoothingEnabled = false;
79
+ render(ctx);
80
+ }
81
+ }
82
+ return layer.canvas;
83
+ }
84
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAcH;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,MAAc;IAC5D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,4DAA4D,KAAK,IAAI,MAAM,EAAE,CAAC,CAAA;IAChG,CAAC;IACD,IAAI,MAAM,GAA6B,IAAI,CAAA;IAC3C,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;QACzC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAA;QACpB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;QACtB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,GAAG;YAAE,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAA;IAC5C,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAC/C,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,KAAK,CAAC,KAAK,GAAG,IAAI,CAAA;AACpB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAiB,EACjB,MAA+C;IAE/C,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,KAAK,CAAC,KAAK,GAAG,KAAK,CAAA;QACnB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC/D,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAA;YAC9C,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAA;YACjC,MAAM,CAAC,GAAG,CAAC,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAA;AACrB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -17,5 +17,6 @@ export * from './scene.js';
17
17
  export * from './save.js';
18
18
  export * from './i18n.js';
19
19
  export * from './lighting.js';
20
+ export * from './cache.js';
20
21
  export * from './music.js';
21
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
package/dist/index.js CHANGED
@@ -17,5 +17,6 @@ export * from './scene.js';
17
17
  export * from './save.js';
18
18
  export * from './i18n.js';
19
19
  export * from './lighting.js';
20
+ export * from './cache.js';
20
21
  export * from './music.js';
21
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA;AAC1B,cAAc,SAAS,CAAA;AACvB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,YAAY,CAAA;AAC1B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zx-kit",
3
- "version": "0.28.0",
3
+ "version": "0.29.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/zrebec/zx-kit.git"